Франшизы

Источник требований

BR 1.4.4 §3, §7, §8

Франшиза — tenant системы. Каждая франшиза — это изолированный набор данных (ЮЛ, ТТ, сотрудники, каталог, склад) под единым franchise_id. В одной инсталляции ERP может быть произвольное количество франшиз (multi-tenant).

В MVP UI для CRUD франшиз нет — управление вручную через SQL при bootstrap. Эта спека описывает свойства франшизы как сущности и связанное UI-поведение.


Сущность франшизы

ПолеОбязательностьОписание
idАвтогенерацияUUID, используется всем остальным как franchise_id
nameОбязательноБренд/название сети
typeОбязательноcorporate | individual — см. ниже
created_atАвтогенерация

Поле type: corporate vs individual

(Введено в BR 1.4.4 §3)

typeПоведение
corporateПолноценная франшиза с иерархией: одно главное ЮЛ (type=franchise) + произвольное число ЮЛ партнёров (type=franchisee). В меню видны разделы «Юр. лица», «Партнёры». Можно создавать партнёров через UI
individualИП-режим: одно главное ЮЛ (type=franchise), партнёров нет. Раздел «Юр. лица» скрыт в меню. На дашборде нет виджета ЮЛ. API: попытка создать ЮЛ type=franchisee403 FRANCHISE_TYPE_INDIVIDUAL

Default при создании новой франшизы: corporate. При миграции существующей единственной франшизы: corporate.

Что не меняется между типами

  • Раздел «Торговые точки» — есть у обоих (у ИП тоже несколько ТТ на одном ЮЛ)
  • Форма создания сотрудника — одинаковая (ЮЛ в ней не упоминается)
  • Каталог, Склад, Роли, Сотрудники — без изменений

Переключение типа

(MVP) Только вручную через SQL. Отдельной UI-операции нет.

UPDATE franchises SET type = 'corporate' WHERE id = '...';

При переключении individual → corporate уже существующее главное ЮЛ type=franchise сохраняется; появляется возможность создавать партнёров.

При переключении corporate → individual с уже созданными партнёрами — поведение не определено MVP. Рекомендуется предварительно удалить/архивировать всех партнёров.

Смена типа после старта — вне MVP

UI-переключение типа — отдельная BR в будущем. См. BR 1.4.4 §открытый вопрос 5.


Bootstrap новой франшизы

(Введено в BR 1.4.4 §8)

В MVP автоматической регистрации через UI нет. Когда клиент подписывает договор, администратор системы вручную выполняет шаги (SQL или admin-скрипт).

Шаги bootstrap

  1. Создать запись в franchises
    • Имя
    • Тип: corporate или individual (обсуждается с клиентом)
  2. Создать главное ЮЛ в legal_entities
    • type = 'franchise'
    • is_primary = true
    • Реквизиты со слов клиента
  3. Создать системную роль «Администратор» в roles для этой франшизы (полный набор permissions, system=true)
  4. Создать сотрудника-владельца в employees
    • Email (указан клиентом)
    • Временный пароль (сгенерировать и передать клиенту)
  5. Связать ЮЛ и сотрудника: legal_entities.owner_user_id = {id сотрудника}
  6. Назначить сотруднику системную роль в employee_roles

После bootstrap:

  • Владелец входит в админку по email+паролю
  • Его scope = вся франшиза (правило owner_user_id в главном ЮЛ, см. Ролевая модель)
  • Он меняет временный пароль и начинает работу

Автоматическая регистрация (будущее)

Публичная форма регистрации бренда — отдельная BR.


Скрытие разделов при type=individual

(Введено в BR 1.4.4 §7)

Фронт (Admin Web) получает franchise.type из /auth/me и в PermissionContext. На основе типа:

Элемент UIcorporateindividual
Пункт меню «Юр. лица»ВиденСкрыт
Виджет «Юр. лица» на дашбордеВиденСкрыт
Кнопка «Создать партнёра» / «Добавить ЮЛ Франчайзи»ДоступнаСкрыта
Роуты /admin/legal-entities/*ДоступныВозвращают 404 или редирект на главную

На бэке:

  • POST /legal-entities с type=franchisee при franchises.type=individual403 FRANCHISE_TYPE_INDIVIDUAL
  • POST /legal-entities с type=franchise при уже существующем главном ЮЛ → 409 PRIMARY_LE_EXISTS (независимо от типа франшизы)

Связи с другими модулями


Ссылки