feat: департамент в таблице организаций, минимум месяц до увольнения

Заявление на увольнение:

1. Последний рабочий день — минимум через MIN_NOTICE_MONTHS (1) КАЛЕНДАРНЫЙ
   месяц от сегодня (новый isoDatePlusMonths в shared/dateUtils.ts, а не
   приближение через 30 дней — setMonth сам разносит месяцы разной длины).

2. Департамент (Section из Employee/ByEmail) — колонка в OrganizationsTable
   вместо отдельного профильного поля: источник сменился со SharePoint-профиля
   (SPS-Department) на тот же справочник api.tnsu.kz, что уже даёт компанию и
   должность. Заодно убраны отдельные «Должность»/«Структурное подразделение»
   над таблицей — дублировали то, что таблица и так показывает. Редактируется
   по-прежнему только должность ПЕРВОЙ (основной) компании — она и есть
   data.Position, читает её маршрут; должности остальных компаний и
   департамент — информационные. Пустой справочник (сотрудник не найден) —
   таблица не исчезает, а показывает одну строку с прочерками и редактируемой
   должностью, иначе заявление на такого человека нельзя было бы подать.
   Режим просмотра (DismissalView) не тронут — там по-прежнему простые
   read-only поля, без live-запроса к справочнику.

На тенанте: Title колонки Department синхронизирован под «Департамент» —
ТОЛЬКО на списке «Заявление на увольнение», списочным override, а не через
общий столбец сайта. Через -UpdateExistingLists один раз случайно затёрло
Department и на «Обходном листе», и на «Заявке в 1С» (internalName у них общий,
Title разный) — заметил и починил в этой же сессии; см. memory
provisioning-shared-site-columns для деталей на будущее.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
gorbenko.pavel
2026-08-26 09:39:10 +05:00
parent 179999c02a
commit 0b7729a6b9
8 changed files with 195 additions and 109 deletions
@@ -9,6 +9,22 @@ export function isoDatePlusDays(days: number): string {
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;
}
/**
* Сегодня + n КАЛЕНДАРНЫХ месяцев в формате YYYY-MM-DD (для min/max у input
* type=date) — не приближение через 30 дней: `setMonth` сам разносит месяцы
* разной длины (28–31 день) и года на границе декабря/января.
*
* 31 января + 1 месяц → JS даёт 3 марта (переносит лишние дни на следующий
* месяц, а не откатывает до последнего числа) — для месячного уведомления это
* не проблема (крайняя ранняя дата и так сдвигается на несколько дней позже,
* не раньше), но не считать это «ровно через месяц» в общем случае.
*/
export function isoDatePlusMonths(months: number): string {
const d = new Date();
d.setMonth(d.getMonth() + months);
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;
}
/** YYYY-MM-DD → дд.мм.гггг, для текста ошибок валидации. Невалидную строку возвращает как есть. */
export function formatIsoDate(iso: string): string {
const [y, m, d] = iso.split('-');