# Словарь предметной области Источник названий показателей — ТЗ v1.7 §1. Имена ниже — единые имена будущих контрактов и кода; UI использует русский термин. `role` без уточнения не применять: ресурсная роль не даёт прав доступа. | Термин | Имя | Значение и границы | | --- | --- | --- | | Заявка | Request | Просьба РП на один Project; содержит ResourceLine, статус pending/approved/returned/rejected, автора и версии. | | Строка ресурса | ResourceLine | Запрошенная ResourceRole, необязательный Employee, одна доходная ставка и MonthPlan. Стабильный lineId заменяет индекс массива. | | Назначение | Assignment | Согласованная строка с employeeId, projectId, managerId, доходной ставкой и снимком расходной; независимый assignmentId, исходный requestId/lineId, версия. | | Изменение назначения | AssignmentChange | Отдельная Request с kind=change: release/reduce/replace, effectiveDate, reason, before и proposed; до решения не влияет на план. | | Руководитель проекта | ProjectManager / pm | Пользователь, которому разрешён проект; request.managerId сохраняет принадлежность заявки конкретному РП. | | Ресурсный менеджер | ResourceManager / rm | Право принимать решения и видеть общий ресурсный план. Не должность, не владелец группы Bitrix. | | Сотрудник | Employee | Единый человек пула со стабильным ID и external identity; деактивация не удаляет историю. | | Пользователь | Principal | Авторизованная личность; связана с Employee через подтверждённый ID, но не через совпадение ФИО/email. | | Роль ресурса | ResourceRole | Шесть ролей seed.js: бизнес-аналитик, системный аналитик, архитектор, Backend, Frontend, тестировщик. Расширение и сопоставление — Q-07. | | Право доступа | AccessGrant | pm/rm и область проектов; отдельное право viewCost для расходных данных. Не импортируется из WORK_POSITION. | | Проект | Project | Стабильный локальный ID, имя, внешняя сущность и ID, закрытие, связи РП. Имя — подпись, не ключ. | | Подразделение | Department | Внешний ID, имя, parentId; несколько принадлежностей сотрудника возможны, основное для отчёта — Q-07. | | План месяца | MonthPlan | month YYYY-MM, fte и необязательные days; явный 0 в days важнее месячного значения. | | Плановая загрузка | plannedFte | Доля полной загрузки, P/H; сумма для группы — FTE, не количество людей. | | Фактическая загрузка | actualFte | Для ручного ввода 0…2; при импорте часов производное A/H; не равна плану по умолчанию. | | Норма часов одного сотрудника H | normHours | Сумма часов календаря месяца; базовый эталон — будни×8. Отпуск сюда повторно не вычитается. | | Плановые часы P | plannedHours | Σ дневной FTE × часов дня по согласованным назначениям. | | Доходная ставка R | incomeRate | Положительные ₽/ч, одна на строку и период. | | Расходная ставка C | costRate | ₽/ч специалиста; при решении сохраняется costRateSnapshot, источник и версия. | | Плановый доход I | plannedIncome | P×R, не подтверждённая выручка. | | Плановый расход | plannedCost | P×C. | | Превышение расходной ставки Δ | costExcess | max(C−R,0); не путать с incomeRate−costRate. | | Средние ставки Rср/Cср | weightedIncomeRate / weightedCostRate | Взвешены плановыми часами, при нуле часов неизвестны. | | Разница ставок / средних ставок | rateDifference / weightedRateDifference | R−C / Rср−Cср. | | Разница плановых сумм | plannedDifference | plannedIncome−plannedCost. | | Превышение планового расхода за период | excessPlannedCost | Δ×ΣP отдельной строки. | | Фактические часы A | actualHours | Работы из Time или отдельно подтверждённого ручного факта; отпуск исключён. | | Норма часов группы N | groupNormHours | Число выбранных сотрудников × H, для накопления — сумма месячных норм при фиксированном составе. | | Часы отпуска V | vacationHours | Employee×month, 0…H, независимо от проекта. Не рабочие часы. | | Норма часов группы без отпусков Nбез | netGroupNormHours | N−V, неизвестна при неполном V. | | Плановая/фактическая утилизация по норме | plannedUtilization / actualUtilization | P/N×100 и A/N×100, индивидуально знаменатель H. | | Плановая/фактическая утилизация без отпусков | plannedNetUtilization / actualNetUtilization | P/Nбез×100 и A/Nбез×100. | | Свободные часы / свободный ресурс | freeHours / freeFte | Σmax(H−P,0) / число людей−ΣplannedFte. | | Доля отпуска | vacationShare | V/N×100. | | Полнота факта | ActualCoverage | Покрытая область людей, проектов, дат и версия источника; отсутствие записи без полного покрытия неизвестно. | | Журнал решений | DecisionLog | Неизменяемые автор, время, действие, before/after и версии; не технический лог приложения. | | Снимок календаря | CalendarVersion | Версионированный набор date→hours; основание расчёта, не личный график сотрудника. | | Сопоставление | ExternalIdentity | Уникальная тройка source + entityType + externalId → localId; email/название не ключ. | ## Единицы и совместимость Дата бизнеса — календарная дата Europe/Moscow; timestamp журнала — UTC instant. День изменения включён в новый период. Статус участия ended вычисляется по Clock, не хранится cron-обновлением. Часы/FTE/ставки — точные десятичные значения; деньги — копейки или decimal. Формулы не округляют промежуточные результаты. Предложение: rates numeric(18,2), FTE numeric(12,8), hours numeric(20,8), денежный результат decimal с округлением до копейки при представлении; утверждение масштаба и округления — Q-11. JSON decimal передаётся строкой, домен не вычисляет деньги через JS float. Неизвестно — `null` плюс причина missing/stale/unmapped, а не 0. По ТЗ §17 пустая выборка обычной утилизации → 0%, но по §26 нулевой знаменатель утилизации по типам → неизвестно; это разные контексты отображения. Адаптация прототипа: RequestItem → Request; Line → ResourceLine; targetId+lineIndex → assignmentId с таблицей соответствий при импорте; имена project/manager → projectId/managerId; `months[].rate` → взвешенная incomeRate. days сохраняется. Демо seed.js остаётся источником сценариев, не справочником рабочего сервиса.