Поддерживаемые входные форматы

Backend принимает:

  • zip
  • xlsx
  • xls

Для 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:

  1. читает сохраненный исходный файл
  2. повторно парсит его
  3. накладывает ручные корректировки по артикулу
  4. пересоздает строки отчета

Маршруты:

  • POST /api/reports/{report_id}/rebuild
  • POST /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 по нескольким отчетам

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