C4 L1: контекст
Исходник Mermaid
flowchart LR PM[Руководитель проекта] -->|Заявка, изменение, свои отчёты| S[Сервис ресурсного планирования] RM[Ресурсный менеджер] -->|Решения, общий план| S S -->|Чтение справочников и проектов| B[Сфера / Bitrix24] S -->|Чтение фактических часов| T[Time Лоции] S -->|Чтение календаря и возможных ставок| C[1С] S -->|Вход и проверка личности| I[Bitrix24 OAuth или корпоративный SSO] O[Технический оператор] -->|Состояние синка, восстановление| S K[Контур: проекты, бюджет, P&L, закрытие] -.->|Проекты, черновики заявок, освобождение команды| S S -.->|Лента событий решений и назначений| K
C4 L2: контейнеры
Исходник Mermaid
flowchart TB U[Браузер: standalone-оболочка или хост → микрофронтенд Vue] -->|HTTPS, cookie, общие DTO| A[NestJS API: доступ и модули] A -->|Транзакции и проекции| D[(Postgres)] W[Фоновый worker: Nest application context, те же модули] -->|Задания, lease, checkpoint| D A -->|Ручной запуск: запись задания| D W -->|Порты чтения| E[Bitrix24 / Time / 1С] A -->|Порт идентификации| I[OAuth / SSO] A --> L[Логи, метрики, Sentry] W --> L D --> B[Резервные копии и проверка восстановления]
C4 L3: глубокие модули
Исходник Mermaid
flowchart LR H[HTTP handlers] --> A[Доступ] H --> R[Заявки и согласование] H --> P[Назначения и ресурсный план] H --> V[Отчёты] R --> P R --> C[Расчёты] P --> C V --> C R --> A P --> A V --> A W[Worker / ручной запуск] --> S[Справочники и синк] S --> X[SphereClient / ProjectSource / TimeSource / OneCSource] R --> DB[(Транзакционная БД)] P --> DB V --> DB S --> DB A --> DB
Модель хранения и транзакции
Исходник Mermaid
erDiagram
REQUEST ||--|{ RESOURCE_LINE : contains
REQUEST ||--o{ DECISION_LOG : records
RESOURCE_LINE ||--o{ ASSIGNMENT : creates
ASSIGNMENT ||--|{ ASSIGNMENT_VERSION : versions
ASSIGNMENT ||--o{ ASSIGNMENT_CHANGE : changes
EMPLOYEE ||--o{ ASSIGNMENT : assigned
PROJECT ||--o{ REQUEST : requested
PROJECT ||--o{ PROJECT_MANAGER : grants
EMPLOYEE ||--o{ ACTUAL_ENTRY : worked
PROJECT ||--o{ ACTUAL_ENTRY : measured
CALENDAR_VERSION ||--|{ CALENDAR_DAY : defines
EMPLOYEE ||--o{ ABSENCE_ENTRY : absent
ABSENCE_SNAPSHOT ||--o{ ABSENCE_ENTRY : contains
ABSENCE_SNAPSHOT ||--o{ ABSENCE_COVERAGE : confirms
F1. Сотрудники, подразделения, ресурсные роли — INT 02
Исходник Mermaid
sequenceDiagram participant W as Sync runner participant B as SphereClient participant S as Сфера participant D as БД W->>B: listDepartments / searchUsers B->>S: department.get / user.get, страницы S-->>B: ID, атрибуты, ACTIVE, next B-->>W: Нормализованные записи и полнота W->>D: staging + проверка mapping ролей W->>D: activate snapshot, мягкая деактивация, отзыв сессий Note over W,D: История назначений не удаляется
F2. Проекты и РП — INT 01
Исходник Mermaid
sequenceDiagram participant W as Sync runner participant P as ProjectSource participant B as Сфера participant D as БД W->>P: read(cursor) P->>B: sonet_group.get ИЛИ crm.deal.list ИЛИ crm.item.list B-->>P: ID, название, ответственный, закрытие P-->>W: SourceProject и reference пользователя W->>D: ExternalIdentity + Project + ProjectManager Note over W,D: Нет подтверждённого mapping РП — нет доступа к проекту
F3. Фактические часы из Time Лоции
Исходник Mermaid
sequenceDiagram participant W as Sync runner participant T as TimeSource participant B as SphereClient participant D as БД W->>T: read(window, cursor) T-->>W: entryId, userId, taskId, date, seconds, version W->>B: getTasks(неизвестные taskId) B-->>W: taskId и groupId W->>D: сопоставление сотрудника и проекта, quarantine неизвестных W->>D: upsert entries + coverage + checkpoint Note over W,D: Только полное покрытие позволяет вывести явный ноль
F4. Календарь, отпуск, больничный и расходные ставки
Исходник Mermaid
sequenceDiagram participant W as Sync runner participant C as Calendar / Absence / Rate sources participant D as БД снимков и полноты participant R as Calculations / Requests W->>C: calendar(year), absences(window), costRates C-->>W: Версии, рабочие часы дней, отсутствия и coverage W->>D: validate, stage, activate snapshot R->>D: Календарь, обе записи отсутствий, C и версии R->>R: Объединить даты, вычислить H и P, N как сумму H R->>D: Решение и costRateSnapshot в одной транзакции Note over D,R: Unknown не равен 0, повторного вычета отсутствий нет
F5. Вход и определение роли — NFR 01
Исходник Mermaid
sequenceDiagram participant U as Браузер participant A as Access participant I as Bitrix24 OAuth или SSO participant D as Session и Grants U->>A: начать вход A-->>U: redirect + одноразовый state U->>I: аутентификация I-->>A: callback с code и state A->>I: серверный обмен и проверка личности I-->>A: подтверждённый subject A->>D: найти Principal, active, AccessGrant A-->>U: HttpOnly cookie или отказ доступа U->>A: запрос бизнес API A->>D: проверить сессию, активность и scope
F6. Заявки, назначения и мастер-данные — INT 03, NFR 02
Исходник Mermaid
sequenceDiagram participant U as РП или РМ participant A as Requests participant P as Assignments participant D as БД U->>A: commandId, expectedVersion, действие A->>A: доступ, валидация, idempotency A->>D: BEGIN и блокировки сотрудников A->>D: перечитать заявку, версии, ставки A->>P: applyDecision в той же Tx P->>P: весь дневной план, лимит FTE P->>D: новая версия назначения A->>D: DecisionLog + Request + CommandReceipt A->>D: COMMIT A-->>U: результат или типизированный конфликт Note over A,D: Любая ошибка до COMMIT — полный ROLLBACK
F7. Граница с Контуром — ADR-0007
Исходник Mermaid
sequenceDiagram participant K as Контур participant A as API сервиса participant R as Requests participant D as БД K->>A: POST /request-drafts (проект, строки из плана работ) A-->>K: draftId, ссылка на форму Note over R: РП дорабатывает и отправляет заявку, РМ решает (F6) R->>D: решение + DecisionLog + IntegrationEvent в одной Tx K->>A: GET /events?after=cursor A-->>K: события по seq, nextCursor K->>A: POST /projects/:id/release после приёмки A->>R: pending release по каждому активному назначению
Жизненные циклы
Исходник Mermaid
stateDiagram-v2 [*] --> pending: create или change pending --> approved: РМ согласует pending --> returned: РМ возвращает с причиной pending --> rejected: РМ отклоняет с причиной returned --> [*]: новая исправленная заявка с другим ID rejected --> [*] approved --> [*]: решение неизменно
Документы и решения
- CONTEXT.md · Markdown
- addendum-coverage.md · Markdown
- adr/0001-data-master.md · Markdown
- adr/0002-sync-worker.md · Markdown
- adr/0003-secrets.md · Markdown
- adr/0004-identity-access.md · Markdown
- adr/0005-stack-modules.md · Markdown
- adr/0006-versioned-data.md · Markdown
- adr/0007-contour-context.md · Markdown
- architecture.md · Markdown
- calculation-contract.md · Markdown
- data-flows.md · Markdown
- open-questions.md · Markdown
- spec.md · Markdown
- tasks.md · Markdown
- testing.md · Markdown
- validation.md · Markdown