Добавить загрузку XLSX-отчёта ВТБ Брокер #46

Merged
admin merged 3 commits from feature/broker-xlsx-upload into main 2026-08-26 20:59:15 +00:00
Collaborator

Следующий этап Issue #43: одна кнопка импорта теперь принимает broker.xlsx. Backend на стандартном zlib разбирает текущий формат VTB, сначала импортирует портфель и затем cash-операции, поэтому счёт сразу имеет тип «Брокерский». UI показывает результаты cash, сделок и позиций раздельно.

Проверки: сборки shared/backend/frontend проходят; converter обработал реальный temp/broker.xlsx (29 cash-операций, 25 сделок, 2 позиции, closing 9337 коп.).

Следующий этап Issue #43: одна кнопка импорта теперь принимает `broker.xlsx`. Backend на стандартном zlib разбирает текущий формат VTB, сначала импортирует портфель и затем cash-операции, поэтому счёт сразу имеет тип «Брокерский». UI показывает результаты cash, сделок и позиций раздельно. Проверки: сборки shared/backend/frontend проходят; converter обработал реальный `temp/broker.xlsx` (29 cash-операций, 25 сделок, 2 позиции, closing 9337 коп.).
agent added 1 commit 2026-08-26 20:36:47 +00:00
Author
Collaborator

Независимое ревью: найдены блокирующие замечания.

  1. zipFiles распаковывает все записи ZIP до проверки нужных путей и без общего лимита на распакованный объём. Файл до 15 MiB может содержать много deflate-записей и исчерпать память процесса. Нужен лимит на суммарную распаковку/число записей и распаковывать только необходимые XML.
  2. /api/import/broker сначала коммитит importPortfolio, затем отдельно запускает importStatement. Если cash-импорт вернёт validation error или произойдёт сбой БД, клиент получит ошибку, но portfolio report/сделки уже сохранены. Нужна одна транзакция на оба импорта (либо иной явный механизм компенсации).
  3. Для нового парсера нет запускаемого теста: не покрыты реальный XLSX, повреждённый ZIP/XML, баланс и идемпотентные sourceId. Это нетривиальная финансовая логика, без проверки PR не готов.

Сборки shared/backend/frontend проходят; версии согласованы. После исправлений также нужен changelog для версий 0.11.0/0.12.0/0.6.0 и повторное ревью.

Независимое ревью: найдены блокирующие замечания. 1. `zipFiles` распаковывает все записи ZIP до проверки нужных путей и без общего лимита на распакованный объём. Файл до 15 MiB может содержать много deflate-записей и исчерпать память процесса. Нужен лимит на суммарную распаковку/число записей и распаковывать только необходимые XML. 2. `/api/import/broker` сначала коммитит `importPortfolio`, затем отдельно запускает `importStatement`. Если cash-импорт вернёт validation error или произойдёт сбой БД, клиент получит ошибку, но portfolio report/сделки уже сохранены. Нужна одна транзакция на оба импорта (либо иной явный механизм компенсации). 3. Для нового парсера нет запускаемого теста: не покрыты реальный XLSX, повреждённый ZIP/XML, баланс и идемпотентные sourceId. Это нетривиальная финансовая логика, без проверки PR не готов. Сборки shared/backend/frontend проходят; версии согласованы. После исправлений также нужен changelog для версий 0.11.0/0.12.0/0.6.0 и повторное ревью.
agent added 1 commit 2026-08-26 20:42:32 +00:00
Author
Collaborator

Повторное независимое ревью коммита 12d096b.

Исправлено: маршрут теперь владеет одной транзакцией, а importPortfolio/importStatement корректно не начинают, не коммитят и не освобождают переданный client; автономный test:broker:xlsx добавлен и проходит.

Остался блокер: лимит распаковки можно обойти. totalSize складывает заявленный в central directory uncompressedSize, но затем inflateRawSync распаковывает без maxOutputLength и результат не сверяется с заявленным размером. Архив с нулевыми/малыми размерами в central directory и бо́льшими deflate-потоками пройдёт лимит 30 MiB (вплоть до памяти процесса). Нужен лимит по фактически распакованным байтам — передавать оставшийся budget в inflateRawSync и/или проверять data.length, а также тест на этот случай.

Также для текущих версий по-прежнему отсутствует changelog. Других блокирующих регрессий не выявлено.

Повторное независимое ревью коммита 12d096b. Исправлено: маршрут теперь владеет одной транзакцией, а `importPortfolio`/`importStatement` корректно не начинают, не коммитят и не освобождают переданный client; автономный `test:broker:xlsx` добавлен и проходит. Остался блокер: лимит распаковки можно обойти. `totalSize` складывает заявленный в central directory `uncompressedSize`, но затем `inflateRawSync` распаковывает без `maxOutputLength` и результат не сверяется с заявленным размером. Архив с нулевыми/малыми размерами в central directory и бо́льшими deflate-потоками пройдёт лимит 30 MiB (вплоть до памяти процесса). Нужен лимит по фактически распакованным байтам — передавать оставшийся budget в `inflateRawSync` и/или проверять `data.length`, а также тест на этот случай. Также для текущих версий по-прежнему отсутствует changelog. Других блокирующих регрессий не выявлено.
agent added 1 commit 2026-08-26 20:45:16 +00:00
Author
Collaborator

Финальное независимое ревью полного PR после ef77322 завершено без блокирующих замечаний.

Предыдущие замечания устранены: лимит применяется к фактическому результату каждого inflateRawSync через оставшийся maxOutputLength и суммируется по content.length, поэтому данные central directory его не обходят; portfolio и cash выполняются в одной внешней транзакции; автономный test:broker:xlsx проходит. Changelog содержит корректную запись для Frontend 0.12.0 / Backend 0.11.0 / Shared 0.6.0 и описывает XLSX-импорт.

Проверил: сборки shared, backend и frontend проходят; реальный temp/broker.xlsx даёт 29 cash-операций, 25 сделок, 2 позиции и closing 9337 коп. PR готов к merge.

Финальное независимое ревью полного PR после ef77322 завершено без блокирующих замечаний. Предыдущие замечания устранены: лимит применяется к фактическому результату каждого `inflateRawSync` через оставшийся `maxOutputLength` и суммируется по `content.length`, поэтому данные central directory его не обходят; portfolio и cash выполняются в одной внешней транзакции; автономный `test:broker:xlsx` проходит. Changelog содержит корректную запись для Frontend 0.12.0 / Backend 0.11.0 / Shared 0.6.0 и описывает XLSX-импорт. Проверил: сборки shared, backend и frontend проходят; реальный `temp/broker.xlsx` даёт 29 cash-операций, 25 сделок, 2 позиции и closing 9337 коп. PR готов к merge.
admin merged commit 1e25a0152a into main 2026-08-26 20:59:15 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/family_budget#46