BR 1.9: Техкарты (рецептуры)

Зависит от:

Контекст

Техкарта (технологическая карта / рецептура) — описание состава блюда: какие ингредиенты, в каком количестве, с какими потерями при обработке. Используется для:

  1. Автоматического списания ингредиентов со склада при продаже блюда
  2. Расчёта себестоимости блюда (ингредиенты × их закупочные цены)
  3. Прогноза остатков (“на сколько порций хватит муки”)
  4. Нормативных документов (ТТК, калькуляционная карта — требования Роспотребнадзора)

Из drawio (блок wh_techcards):

  • Создаёт и редактирует только Франшиза
  • Привязка ингредиентов к блюду
  • Авто-списание ингредиентов при продаже
  • Авто-расчёт себестоимости блюда
  • Нормы расхода на 1 порцию

Фронт: Админка Франшизы (erp-admin). Сервис: Warehouse Service (:3008).


Почему Warehouse Service, а не Catalog Service

Техкарта — bridge entity между каталогом (продукт) и складом (ингредиенты). Но основные потребители — складские операции:

ПотребительЗачем нужна техкарта
Авто-списание при продажеWarehouse списывает ингредиенты по рецепту
Расчёт себестоимостиWarehouse знает закупочные цены ингредиентов
Прогноз остатковWarehouse знает остатки + расход по рецепту
Авторекомендация заказаWarehouse анализирует расход + остатки

Catalog Service знает только о товаре (название, цена). Warehouse знает о составе и ингредиентах. Техкарта ссылается на product_id из Catalog Service как FK.

Модель как в iiko: рецептура привязана к номенклатуре, но используется складом.


Что нужно

1. Сущность “Техкарта”

Привязка:

  • Техкарта создаётся для товара типа dish (блюдо) из каталога
  • Товары типа good (продукт) не имеют техкарт — списание 1:1
  • Техкарта привязана к версии товара (product_id + product_version). Изменение техкарты → создаётся новая версия товара в каталоге (BR 1.7)

Поля техкарты:

  • Товар (product_id → Catalog Service, конкретная версия)
  • Название (обычно совпадает с товаром, но может отличаться для вариантов)
  • Выход готового блюда (вес/объём готовой порции)
  • Технология приготовления (текстовое описание, шаги)
  • Статус: active / inactive

КБЖУ (ГОСТ 31987-2012, пищевая и энергетическая ценность):

  • Калории (ккал на 100г) — nullable
  • Белки (г на 100г) — nullable
  • Жиры (г на 100г) — nullable
  • Углеводы (г на 100г) — nullable

Показатели качества (ГОСТ 31987-2012, органолептические):

  • Внешний вид — текст, nullable
  • Цвет — текст, nullable
  • Вкус и запах — текст, nullable
  • Консистенция — текст, nullable

Условия хранения и подачи:

  • Температура подачи — текст, nullable (например “65-75°C”)
  • Срок годности — текст, nullable (например “24 часа”)
  • Условия хранения — текст, nullable (например “при t +2..+6°C”)

2. Ингредиенты техкарты (RecipeItems)

Каждая строка рецепта:

  • Ингредиент (складская позиция или полуфабрикат)
  • Масса брутто (до обработки)
  • Масса нетто (после обработки)
  • Процент потерь при холодной обработке
  • Процент потерь при горячей обработке

Себестоимость рассчитывается автоматически: ∑(нетто × цена_закупки_ингредиента).

3. Техкарты per-modifier (по размерам)

Модель как в iiko:

Size-модификаторы (обязательный выбор: 25/30/35 см):

  • Каждый размер = отдельная техкарта (или вариант техкарты)
  • Пицца 25 см: 200г теста, 100г соуса, 150г сыра
  • Пицца 35 см: 350г теста, 180г соуса, 250г сыра
  • При продаже “Маргарита 30 см” → списание по техкарте 30 см

Добавки-модификаторы (необязательные: доп. сыр, халапеньо):

  • Каждая добавка может иметь свою мини-рецептуру
  • “Доп. сыр”: 50г моцареллы за 1 шт → клиент заказал 2x → списать 100г
  • Добавки без рецептуры → не списываются (например “Без лука”)

По ГОСТ 31987-2012: каждый вариант блюда с существенно разным составом = отдельная ТТК.

4. Составные продукты (полуфабрикаты)

Поддержка вложенных рецептур:

Пицца Маргарита 30 см (техкарта)
├── Тесто для пиццы (полуфабрикат → своя техкарта)
│     ├── Мука — 150г
│     ├── Вода — 80мл
│     ├── Дрожжи — 5г
│     └── Соль — 3г
├── Соус томатный (полуфабрикат → своя техкарта)
│     ├── Томаты — 100г
│     └── Базилик — 5г
└── Моцарелла — 150г (сырьё, без техкарты)
  • Полуфабрикат = товар типа dish со своей техкартой
  • Техкарта пиццы ссылается на полуфабрикат как ингредиент
  • При списании система “разворачивает” цепочку до сырья: пицца → тесто → мука, вода, дрожжи
  • Глубина вложенности не ограничена

5. Нормативные документы (ГОСТ 31987-2012)

Система должна поддерживать генерацию/хранение данных для трёх типов документов:

ДокументЧто хранит системаГенерация
ТТК (технико-технологическая карта)Состав, нормы, технология, выход, КБЖУЭкспорт в PDF (Phase 2)
ТК (технологическая карта)Шаги приготовленияТекстовое поле в техкарте
Калькуляционная картаИнгредиенты × цены = себестоимостьАвторасчёт

На MVP

Хранение всех данных ТТК: состав, нормы, технология, выход, КБЖУ, показатели качества, условия хранения. Генерация PDF — Phase 2.


Ролевой доступ

РольЧто может
ФраншизаCRUD всех техкарт. Только франшиза создаёт и редактирует рецептуры
ФранчайзиПросмотр техкарт товаров из своего меню
Менеджер ТТПросмотр техкарт
КассирНет доступа (авто-списание при продаже — автоматическое)

Структура фронта (Админка Франшизы)

(Обновлено с учётом BR 1.8.1)

Техкарта — таб в конструкторе товара, а не отдельный раздел в sidebar.

Карточка товара (/catalog/products/:id):
  Табы: [Информация] [Модификаторы] [Техкарта] [Версии]
                                      ↑ этот таб

Sidebar не меняется. Техкарта привязана к версии товара, поэтому логично управлять ей в конструкторе товара рядом с модификаторами.

Таб “Техкарта” в конструкторе товара

  • Шапка: выход готового блюда, статус техкарты, себестоимость (авторасчёт)
  • Таблица ингредиентов: строки с полями: ингредиент (select из складских позиций + полуфабрикатов), брутто, нетто, % потерь
  • “Добавить ингредиент” — поиск по складским позициям (ингредиенты type=ingredient из каталога)
  • Себестоимость — рассчитывается автоматически в реальном времени
  • Технология приготовления — текстовое поле (rich text или plain)
  • Варианты по размерам — если у версии товара есть size-модификатор (из product_version_modifiers), вкладки/табы per-size
  • Таб виден только для товаров типа dish (блюда), для good — скрыт
  • Доступ: Franchise — CRUD, Franchisee/Manager — read-only

Что НЕ входит (отложено)

  • Генерация PDF для ТТК — Phase 2
  • Расчёт КБЖУ — включено в MVP (ручной ввод, автоматический расчёт — Phase 2)
  • Авто-стоп-лист по остаткам (зависит от складских остатков) — BR 1.11
  • Авторекомендация заказа ингредиентов — отдельная BR (склад)
  • Импорт техкарт из Excel — Phase 2

Решения по открытым вопросам

  1. Ингредиенты как сущность — единый каталог с типом ingredient, не отдельный справочник. Warehouse ссылается на product_id. (Решение: ADR-009)

  2. Единицы измерения при рецептуре — справочник конвертации единиц. Товар в каталоге может быть в “порциях”, а в техкарте ингредиенты указываются в граммах/мл. Система хранит таблицу конвертации: unit_conversion: { product_id, from_unit, to_unit, factor }. Пример: “Моцарелла” — 1 упаковка = 250г, factor=250. При создании техкарты франшиза указывает количество в базовых единицах (г, мл, шт), система конвертирует при необходимости.

  3. Версионность техкарт — техкарта привязана к версии товара (product_id + product_version). Изменение техкарты → новая версия товара. (Решение: привязка к версии, как модификаторы в BR 1.8.1)

  4. Себестоимость — средневзвешенная (Weighted Average), стандарт общепита, как в iiko. (Решение: ADR-010)

Зависимости

  • BR 1.7 — товары (product_id для привязки техкарты)
  • BR 1.8 — модификаторы (per-size рецептуры, мини-рецептуры добавок)
  • BR 1.8.1 — конструктор товара (техкарта = таб в конструкторе, модификаторы на уровне версии)
  • Warehouse Service (:3008) — основной сервис, ингредиенты = складские позиции
  • Catalog Service (:3004) — ссылки на товары, модификаторы, ингредиенты (type=ingredient)

Ссылки