Отчеты и обработка файлов
Поддерживаемые входные форматы
Backend принимает:
zipxlsxxls
Для zip текущая реализация ищет внутри первый файл с расширением xlsx.
Извлечение метаданных из имени файла
Backend пытается извлечь:
- номер отчета: выражение
№(\d+) - номер селлера: цифры между
_и расширением файла
Если селлер найден в имени файла, backend автоматически привязывает отчет к существующему селлеру пользователя или создает нового.
Как считается отчет
Парсер читает детализированный отчет WB и агрегирует строки по Артикул поставщика.
Из источника извлекаются:
- продажи
- возвраты
- сумма реализации
- цена продавца
- комиссия WB
- эквайринг
- услуги поверенного
- логистика
- обратная логистика
Поверх агрегатов backend рассчитывает:
- среднюю цену продавца
- комиссию по категории
- НДС
- УСН
- прибыль
- маржу
Себестоимость подтягивается из каталога товаров пользователя. Если товар еще не существует, backend автоматически создает его с cost_price = 0.
Просмотр отчета
Страница /reports/[id] показывает:
- табличный состав строк отчета
- вычисленные значения
- ручные корректировки по допустимым полям
- экспорт XLSX
- повторное формирование отчета
Ручные корректировки
Для строки отчета доступны ручные значения по таким полям, как:
- продажи и возвраты
- комиссия
- логистика
- себестоимость
- налоги
- прибыль
- маржа
Корректировка сохраняется вызовом PUT /api/reports/items/{item_id}/manual-value.
Исходное вычисленное значение при этом не удаляется, а ручное значение хранится отдельно в manual_values.
Переформирование отчета
Переформирование работает только если сохранен source_path исходного файла.
При rebuild backend:
- читает сохраненный исходный файл
- повторно парсит его
- накладывает ручные корректировки по артикулу
- пересоздает строки отчета
Маршруты:
POST /api/reports/{report_id}/rebuildPOST /api/reports/rebuild
Объединение отчетов
Объединение запускается маршрутом POST /api/reports/combine.
Особенности реализации:
- работа выполняется в фоне через
asyncio.create_task - прогресс хранится в памяти процесса backend
- статус запрашивается через
GET /api/reports/combine-status/{job_id} - результат сохраняется как новый отчет с
is_combined = true
Это значит, что после перезапуска backend сведения о незавершенных job-ах теряются.
Экспорт
Поддерживаются три вида выгрузки:
GET /api/reports/{id}/export- XLSX по одному отчетуGET /api/reports/{id}/source- скачать исходный файлPOST /api/reports/summary-export- сводный XLS по нескольким отчетам
Сводный экспорт на текущем этапе заполняет только часть колонок. Несколько полей в шаблоне остаются пустыми.