# 🏗️ Манифест Модульной Архитектуры v2.6 (Enterprise Edition)

## 1. Принцип «Черного Ящика» (Slice Isolation)

* **Запрет**: Прямые импорты между фичами.
* **Связь**: Только через **Shared EventEmitter** на бэкенде и **SocketService** на фронтенде.
* **Reactivity**: Если Фича А меняет данные, она эмитит событие. Фича Б обязана уметь «патчить» свой стор на лету или перезагружать данные, не заставляя юзера жать F5.

## 2. Инфраструктурный фундамент (Shared Core)

* **BaseServiceFactory** (base.service.ts): CRUD-мозги системы.
* **Repository Cache Pattern**: Репозитории на фронте имеют кэш (30 сек), чтобы не «долбить» сервер дублирующими запросами при переключении табов.
* **Naming**: Суффикс `Table` для всех Drizzle-объектов.

## 3. Контрактная Строгость (Contract-First)

* **Transport Separation**: Схемы БД (внутренние) != Схемы API (публичные DTO). Мы никогда не отдаем структуру таблицы наружу «как есть».
* **Runtime Validation**: Клиент обязан делать `z.parse(apiResponse)` перед записью в Store. Лучше показать «Ошибка данных», чем упасть в `undefined is not a function`.

## 4. Защита и Трассируемость (Observability)

* **Action Audit**: Каждое изменение в Pinia логируется: `Кто | Что нажал | Что отправил`. В ERP это единственный способ найти, кто случайно выписал гостя из номера.
* **Transaction Guard**: Все изменения в БД — только в транзакциях с пробросом `tx`.
* **XSS Protection**: Запрет на `v-html` без `DOMPurify`.

## 5. Производительность (Performance)

* **Chunk Isolation**: Каждая фича (Employees, Inventory, Rooms) грузится лениво (`dynamic import`). Юзер не должен качать мегабайты кода «Склада», если он просто пришел отметить уборку.
* **Optimistic UI**: Фронтенд обновляется мгновенно, но при ошибке от сервера обязан сделать **Rollback** к предыдущему состоянию.

## 6. Политика «Бесшовной Синхронизации» (Reactivity Strategy)

* **Smart Merge (Патчинг)**: Сторы обязаны реализовывать метод `patchIncomingData(newData)`.
* **Правило**: При получении события от другой фичи мы обновляем только **целевые поля** в существующих объектах.
* **Запрет**: Полный `refetch` всей коллекции запрещен, если у пользователя есть несохраненные изменения (флаг `isDirty`) или активный ввод. Это сохраняет фильтры, положение скролла и черновики.
* При написании Smart Merge обязательно использовать Immer (или встроенную в Pinia логику $patch с deep: true). Писать ручной спред оператор { ...oldItem, ...newItem } для глубоких объектов (которыми, скорее всего, являются Employees/Rooms) — это путь к потере реактивности и глюкам. Immer гарантирует, что мутация будет безопасной.

## 7. Контрактная совместимость и Валидация

* **Interceptor Layer Validation**: Мы не размазываем `z.parse()` по сторам. Валидация контракта API живет в **Axios Response Interceptor**.
* **Процесс**: Данные приходят -> Интерсептор прогоняет их через Zod-схему DTO -> В случае успеха данные летят в репозиторий.
* **Fail-fast**: Если формат данных битый, интерсептор выбрасывает `ValidationError`, и данные **никогда** не попадают в стейт, предотвращая «отравление» фронтенда некорректными типами.

## 8. Борьба с «Взрывом Событий» (Event Management)

* **Batching & Debouncing**: Если сервер присылает пачку однотипных событий (например, при архивации 100 задач), фронтенд обязан их сгруппировать.
* **Socket Queue**: Реализовать очередь (Buffer), которая накапливает события в течение 50–100 мс и отдает их в стор одним массивом. Это предотвращает 100 ре-рендеров Vue-компонентов в секунду и зависание браузера.

## 9. Трассируемость и Observability

* **Action Audit**: Каждое изменение стейта в Pinia логируется плагином. Мы всегда знаем: `Кто | Какой Action | С каким Payload | Timestamp`.
* **Rollback Logic**: При использовании Optimistic UI, если фоновый запрос упал, система делает автоматический откат (Undo) к сохраненному снимку состояния (Snapshot), который делается перед началом экшена.
