Ресурсное планирование · Архитектура и дополнение

Редакция 13.10.2026 по NEW-01–09, эталон прототипа 5213150. H — календарь минус объединённые отпуск/больничный, P=FTE×H, N=ΣH. Формулы приняты; spec и архитектура утверждены 15.10.2026, живые подключения ждут ответов на вопросы. Расчётный контракт · Матрица NEW.

C4 L1: контекст

architecture.md · схема предлагаемого рабочего сервиса

Исходник 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: контейнеры

architecture.md · схема предлагаемого рабочего сервиса

Исходник 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: глубокие модули

architecture.md · схема предлагаемого рабочего сервиса

Исходник 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

Модель хранения и транзакции

architecture.md · схема предлагаемого рабочего сервиса

Исходник 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

data-flows.md · схема предлагаемого рабочего сервиса

Исходник 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

data-flows.md · схема предлагаемого рабочего сервиса

Исходник 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 Лоции

data-flows.md · схема предлагаемого рабочего сервиса

Исходник 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. Календарь, отпуск, больничный и расходные ставки

data-flows.md · схема предлагаемого рабочего сервиса

Исходник 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

data-flows.md · схема предлагаемого рабочего сервиса

Исходник 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

data-flows.md · схема предлагаемого рабочего сервиса

Исходник 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

data-flows.md · схема предлагаемого рабочего сервиса

Исходник 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 по каждому активному назначению

Жизненные циклы

spec.md · схема предлагаемого рабочего сервиса

Исходник Mermaid
stateDiagram-v2
  [*] --> pending: create или change
  pending --> approved: РМ согласует
  pending --> returned: РМ возвращает с причиной
  pending --> rejected: РМ отклоняет с причиной
  returned --> [*]: новая исправленная заявка с другим ID
  rejected --> [*]
  approved --> [*]: решение неизменно

Документы и решения

Анализ и исторические пометки