BR 3.6 — Excel-выгрузка продаж в 1С Общепит

Контекст

Бухгалтер Елена ведёт учёт в 1С Общепит. Сейчас ОРП (Отчёт о розничных продажах) она формирует вручную, сверяя POS-чеки и кассовую ленту. Нужна кнопка «Выгрузить продажи в 1С» которая отдаёт xlsx-файл в формате типового загрузчика 1С Общепит.

Полноценный 1С-адаптер (REST/SOAP интеграция, автоматическая публикация документов) — отдельная будущая BR. Сейчас — минимальный xlsx-прототип, чтобы:

  1. Проверить формат xlsx на пилоте «Кофейня Цифра»
  2. Дать бухгалтеру возможность загружать выгрузки руками вместо ручного составления

Формат xlsx

КолонкаСодержаниеИсточник
A — ДатаDD.MM.YYYYorders.created_at (или paid_at если есть)
B — КодКод номенклатуры 1Сsku_1c опции или товара (см. правило резолва)
C — НаименованиеНазвание из 1Сname_1c или fallback на name
D — КоличествоСумма за деньагрегация по дню+коду
E — ЦенаЦена за единицуunit_price (среднее, если разные — берём первое)
F — СуммаСумма за деньагрегация по дню+коду
G — НДС, %Ставкаиз products.vat_rate

Первая строка — заголовки. Файл: sales-{store_name}-{from}-{to}.xlsx.

Правило резолва кода 1С

Для каждой позиции чека (order_item):

  1. Если в order_item.modifiers есть запись с modifier_option_id у которой в catalog есть sku_1cиспользуем код опции + название опции (виртуальный товар, наиболее частый кейс для cifra)
  2. Иначе — если у products.sku_1c заполнен → используем код товара + название товара (прямая привязка)
  3. Иначе — строка пропускается, в UI показывается «Пропущено N позиций без 1С» со списком ссылок на товары

Параметры выгрузки (попап)

  • Период: «От» / «До» — date picker. По умолчанию: за сегодня (от 00:00 текущего дня до сейчас)
  • ТТ: определяется страницей (store_id из URL)

Группировка

По дню+номенклатуре:

  • Если за один день один и тот же sku_1c продавался N раз — это одна строка с суммированными количеством и суммой
  • Цена в такой строке — unit_price первой попавшейся позиции (если разные — для MVP это пограничный случай, бухгалтер увидит и исправит руками)

Изменения

Backend

Catalog Service — bulk internal endpoint для резолва 1С-атрибутов:

  • POST /api/v1/internal/products/1c-info
  • Request: { product_ids: [uuid], modifier_option_ids: [uuid] }
  • Response: { products: [{id, sku_1c, name_1c, name, vat_rate}], modifier_options: [{id, sku_1c, name_1c, name}] }

Order Service — экспортный сервис + endpoint:

  • POI dependency (poi-ooxml) в pom.xml
  • SalesExportService.exportXlsx(franchiseId, storeId, from, to) → byte[]
  • GET /api/v1/orders/export-1c?store_id={uuid}&from={iso}&to={iso}
  • Response: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, attachment

Admin BFF

  • Proxy /api/v1/admin/orders/export-1c с прозрачной передачей body

Admin Web

  • На странице ТТ (StoreViewPage) — кнопка «Выгрузить продажи в 1С»
  • Модалка с двумя date input (по умолчанию — сегодня) + кнопка «Скачать»
  • При клике fetch с responseType=blobURL.createObjectURL<a download>

Не входит

  • Авто-загрузка xlsx в 1С (нужен 1С-адаптер — отдельная BR)
  • Группировка по часам/сменам
  • Колонки Сертификат, Скидка, Возвраты — пока опускаем
  • Возвраты (refunds) в этой выгрузке — будущая итерация

Ссылки