WorkTimeBacklogStateDto
Поля
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
userId | number | да | — |
isSoftBlocked | boolean | да | У юзера есть незаполненные рабочие дни старше grace-периода. Письмо HeadOffice летит один раз на переходе false → true, повторные сохранения в том же состоянии email не триггерят (anti-spam через persisted-флаги). Гейт backlogReason срабатывает только на back-dated записях (startedAt < сегодня (UTC)). Сегодняшние записи проходят без коммента — флаг используется фронтом для UI-баннера и для preset'а поля «Причина» на форме при выборе прошлой даты. |
isHardBlocked | boolean | да | Сохранение собственных записей запрещено (400 work-time-entry-backlog-hard-block). Разблокировка только через HeadOffice (POST WorkTimeEntries с enteredBy != userId) — он добивает пропущенные дни за заблокированного менеджера. |
earliestMissingDate | string | null | да | Самый ранний незаполненный рабочий день в окне оценки. Для UI-баннера и подстановки в текст письма HeadOffice. null, когда пропусков нет. |
lastEvaluatedAt | string | null | да | Когда последний раз пересчитывалось состояние. ISO 8601 UTC. null, если для юзера ни разу не было события-триггера и daily scheduler ещё не пробежал по нему — в этом случае состояние подаётся как clean-slate. |
Пример
json
{
"userId": 0,
"isSoftBlocked": false,
"isHardBlocked": false,
"earliestMissingDate": "2026-05-05T08:00:00Z",
"lastEvaluatedAt": "2026-05-05T08:00:00Z"
}