Организация
Назначение
Структура бизнеса: корпорации, юрлица, подразделения, контрагенты, места приготовления, настройки списания. Фундаментальный контекст — все остальные модули зависят от организационных сущностей.
7 контроллеров, ~25 эндпоинтов.
Сценарии
Настройка корпорации
Актор: Владелец / Администратор
Корпорация — верхний уровень иерархии (сеть ресторанов или отдельное заведение).
Настройки:
| Настройка | Зачем | Где используется |
|---|---|---|
| Часовой пояс (IANA timezone) | Корректный расчёт дат | Кассовые смены, отчёты, явки |
| Время начала учётного дня | Ночные операции (после полуночи до этого времени) → предыдущий день | Кассовые смены, отчёты |
| Метод списания | FIFO или средняя стоимость | Складской учёт |
| Предварительная блокировка | Предупреждение при работе с документами закрытого периода | Все документы |
| Окончательная блокировка | Запрет создания/изменения документов до этой даты | Все документы |
| Стратегия времени документа | Какое время подставлять для каждого типа документа (текущее / начало дня / конец дня) | Складские, бухгалтерские документы |
Бизнес-правила:
- Предварительная блокировка ≤ окончательная
- Timezone — валидный IANA (например,
Europe/Moscow)
Outbox-события:
core.company.office.corporation.updated— при изменении настроек; публикуется через outbox в общий топикoffice.events
Юрлица
Актор: Владелец / Бухгалтер
Юрлицо — организация для документооборота (накладные, платежи, акты).
Операции: CRUD + назначение должностных лиц (директор, главбух, технолог) из списка сотрудников.
Бизнес-правила:
- ИНН с контрольной суммой: 10 цифр (юрлицо), 12 (ИП)
- КПП — 9 цифр, БИК — 9 цифр, расчётный счёт — 20 цифр
- ИНН уникален в корпорации
- Нельзя удалить юрлицо с подразделениями
Доменное событие: legal-entity-changed
Подразделения
Актор: Управляющий / Владелец
Подразделение — локация или функциональная единица.
Типы:
- WAREHOUSE (склад) — хранение товара → накладные, инвентаризации, остатки
- KITCHEN (кухня) — место приготовления → привязка к номенклатуре
- HALL (зал) — место обслуживания гостей
- OUTLET (торговая точка) — продажи, привязка POS-терминалов
Операции: CRUD, иерархия (parent → children), дерево подразделений, мягкое удаление/восстановление.
Бизнес-правила:
- Код уникален в рамках юрлица
- Нельзя создать циклическую иерархию
- Нельзя удалить подразделение с дочерними или привязанными сотрудниками
Доменное событие: subdivision-changed
Настройка списания
Актор: Управляющий
Определяет: из какого склада списывать товар при продаже в данном подразделении для данного места приготовления.
Пример:
| Подразделение | Место приготовления | Склад списания |
|---|---|---|
| Основной зал | Кухня | Кухонный склад |
| Основной зал | Бар | Барный склад |
Бизнес-правила:
- Склад — подразделение типа WAREHOUSE в том же юрлице
- Пара (подразделение, место приготовления) уникальна
Контрагенты
Актор: Менеджер закупок / Бухгалтер
Внешняя организация или физлицо для документооборота.
Роли (может быть несколько): поставщик, клиент, сотрудник, гость.
Операции: CRUD, юрлица контрагента (с реквизитами), мягкое удаление.
Бизнес-правила:
- Минимум одна роль
- ИНН с контрольной суммой
- Название уникально в корпорации
- Нельзя удалить контрагента, используемого в активных документах
Доменное событие: counterparty-changed
Места приготовления
Актор: Управляющий
Абстракция производственной зоны (кухня, бар, кондитерская). Используется для настройки списания и привязки номенклатуры.
Нельзя удалить, если используется в настройках списания или привязано к номенклатуре (проверка через ACL к модулю Меню).
Доменное событие: preparation-place-changed
Связи с другими контекстами
| Направление | Что | Зачем |
|---|---|---|
| Организация → Склад | Подразделения, даты блокировки | Принадлежность складов, запрет документов в закрытых периодах |
| Организация → Бухгалтерия | Даты блокировки, timezone | Запрет проводок в закрытых периодах |
| Организация → POS | Timezone, учётный день | Расчёт учётной даты смены |
| Организация → Меню | Даты блокировки | Запрет изменения цен в закрытых периодах |
| Организация → Отчётность | Timezone, учётный день | Группировка выручки по дням |
| Организация ← Меню (через ACL) | Количество номенклатуры | Проверка перед удалением места приготовления |
Синхронизация с POS
При изменении любой организационной сущности — событие в Kafka для обновления POS-терминалов.
Сущности
| Сущность | Описание |
|---|---|
| Корпорация | Корневая сущность. Timezone, учётный день, метод списания, даты блокировки |
| Юрлицо | ИНН, КПП, ОГРН, адрес, банковские реквизиты. Тип: ООО или ИП |
| Подразделение | Тип (склад/кухня/зал/точка), иерархия, мягкое удаление |
| Контрагент | Роли (поставщик/клиент/сотрудник/гость), мягкое удаление |
| Юрлицо контрагента | Реквизиты конкретного юрлица контрагента |
| Место приготовления | Абстракция производственной зоны |
| Настройка списания | Связь: подразделение + место приготовления → склад |
| Настройка времени документа | Стратегия для каждого типа документа |