BR 1.9: Техкарты (рецептуры)
Зависит от:
- BR 1.7 — Каталог (товары)
- BR 1.8 — Модификаторы
- BR 1.8.1 — Конструктор товара
- Warehouse Service (:3008) — техкарты живут здесь
Контекст
Техкарта (технологическая карта / рецептура) — описание состава блюда: какие ингредиенты, в каком количестве, с какими потерями при обработке. Используется для:
- Автоматического списания ингредиентов со склада при продаже блюда
- Расчёта себестоимости блюда (ингредиенты × их закупочные цены)
- Прогноза остатков (“на сколько порций хватит муки”)
- Нормативных документов (ТТК, калькуляционная карта — требования Роспотребнадзора)
Из 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
Решения по открытым вопросам
-
Ингредиенты как сущность — единый каталог с типом
ingredient, не отдельный справочник. Warehouse ссылается наproduct_id. (Решение: ADR-009) -
Единицы измерения при рецептуре — справочник конвертации единиц. Товар в каталоге может быть в “порциях”, а в техкарте ингредиенты указываются в граммах/мл. Система хранит таблицу конвертации:
unit_conversion: { product_id, from_unit, to_unit, factor }. Пример: “Моцарелла” — 1 упаковка = 250г, factor=250. При создании техкарты франшиза указывает количество в базовых единицах (г, мл, шт), система конвертирует при необходимости. -
Версионность техкарт — техкарта привязана к версии товара (
product_id+product_version). Изменение техкарты → новая версия товара. (Решение: привязка к версии, как модификаторы в BR 1.8.1) -
Себестоимость — средневзвешенная (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)