Следующий этап Issue #43: одна кнопка импорта теперь принимает broker.xlsx. Backend на стандартном zlib разбирает текущий формат VTB, сначала импортирует портфель и затем cash-операции, поэтому счёт сразу имеет тип «Брокерский». UI показывает результаты cash, сделок и позиций раздельно.
Следующий этап Issue #43: одна кнопка импорта теперь принимает `broker.xlsx`. Backend на стандартном zlib разбирает текущий формат VTB, сначала импортирует портфель и затем cash-операции, поэтому счёт сразу имеет тип «Брокерский». UI показывает результаты cash, сделок и позиций раздельно.
Проверки: сборки shared/backend/frontend проходят; converter обработал реальный `temp/broker.xlsx` (29 cash-операций, 25 сделок, 2 позиции, closing 9337 коп.).
zipFiles распаковывает все записи ZIP до проверки нужных путей и без общего лимита на распакованный объём. Файл до 15 MiB может содержать много deflate-записей и исчерпать память процесса. Нужен лимит на суммарную распаковку/число записей и распаковывать только необходимые XML.
/api/import/broker сначала коммитит importPortfolio, затем отдельно запускает importStatement. Если cash-импорт вернёт validation error или произойдёт сбой БД, клиент получит ошибку, но portfolio report/сделки уже сохранены. Нужна одна транзакция на оба импорта (либо иной явный механизм компенсации).
Для нового парсера нет запускаемого теста: не покрыты реальный 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 и повторное ревью.
Исправлено: маршрут теперь владеет одной транзакцией, а 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. Других блокирующих регрессий не выявлено.
Финальное независимое ревью полного 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 main2026-08-26 20:59:15 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Следующий этап Issue #43: одна кнопка импорта теперь принимает
broker.xlsx. Backend на стандартном zlib разбирает текущий формат VTB, сначала импортирует портфель и затем cash-операции, поэтому счёт сразу имеет тип «Брокерский». UI показывает результаты cash, сделок и позиций раздельно.Проверки: сборки shared/backend/frontend проходят; converter обработал реальный
temp/broker.xlsx(29 cash-операций, 25 сделок, 2 позиции, closing 9337 коп.).Независимое ревью: найдены блокирующие замечания.
zipFilesраспаковывает все записи ZIP до проверки нужных путей и без общего лимита на распакованный объём. Файл до 15 MiB может содержать много deflate-записей и исчерпать память процесса. Нужен лимит на суммарную распаковку/число записей и распаковывать только необходимые XML./api/import/brokerсначала коммититimportPortfolio, затем отдельно запускаетimportStatement. Если cash-импорт вернёт validation error или произойдёт сбой БД, клиент получит ошибку, но portfolio report/сделки уже сохранены. Нужна одна транзакция на оба импорта (либо иной явный механизм компенсации).Сборки shared/backend/frontend проходят; версии согласованы. После исправлений также нужен changelog для версий 0.11.0/0.12.0/0.6.0 и повторное ревью.
Повторное независимое ревью коммита
12d096b.Исправлено: маршрут теперь владеет одной транзакцией, а
importPortfolio/importStatementкорректно не начинают, не коммитят и не освобождают переданный client; автономныйtest:broker:xlsxдобавлен и проходит.Остался блокер: лимит распаковки можно обойти.
totalSizeскладывает заявленный в central directoryuncompressedSize, но затемinflateRawSyncраспаковывает безmaxOutputLengthи результат не сверяется с заявленным размером. Архив с нулевыми/малыми размерами в central directory и бо́льшими deflate-потоками пройдёт лимит 30 MiB (вплоть до памяти процесса). Нужен лимит по фактически распакованным байтам — передавать оставшийся budget вinflateRawSyncи/или проверятьdata.length, а также тест на этот случай.Также для текущих версий по-прежнему отсутствует changelog. Других блокирующих регрессий не выявлено.
Финальное независимое ревью полного 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.