Files
request-portal/src/webparts/requestPortal/shared/dateUtils.ts
T
gorbenko.pavel 0b7729a6b9 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>
2026-08-26 09:39:10 +05:00

33 lines
1.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
function pad2(n: number): string {
return n < 10 ? `0${n}` : `${n}`;
}
/** Сегодня + n дней в формате YYYY-MM-DD (для min/max у input type=date). */
export function isoDatePlusDays(days: number): string {
const d = new Date();
d.setDate(d.getDate() + days);
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('-');
return y && m && d ? `${d}.${m}.${y}` : iso;
}