36 lines
1.9 KiB
SQL
36 lines
1.9 KiB
SQL
-- 0015_recurring_annual — расписание «ежегодно по дате» вместо интервала.
|
||
--
|
||
-- Зачем: «повторять каждые N месяцев» заменяется на конкретную дату —
|
||
-- день и месяц («15 марта»): правило срабатывает раз в год в эту дату.
|
||
-- Нагляднее для человека и попадает в «Новая заявка» чекбоксом, а не
|
||
-- отдельной секцией в проекте (см. README).
|
||
--
|
||
-- Существующие правила переводятся на день/месяц своего создания —
|
||
-- семантика «первая годовщина после заведения» сохраняется.
|
||
--
|
||
-- Невозможные даты прижимаются к последнему дню месяца при расчёте
|
||
-- срока (29 февраля в невисокосный → 28), здесь — только рамки поля:
|
||
-- день 1..31, месяц 1..12.
|
||
--
|
||
-- Применённый файл не редактировать (checksum в schema_migrations).
|
||
|
||
-- ============ recurring_rules: interval_months → run_month/run_day ============
|
||
|
||
ALTER TABLE recurring_rules
|
||
ADD COLUMN run_month smallint NOT NULL DEFAULT 1,
|
||
ADD COLUMN run_day smallint NOT NULL DEFAULT 1;
|
||
|
||
UPDATE recurring_rules
|
||
SET run_month = EXTRACT(MONTH FROM created_at AT TIME ZONE 'UTC')::smallint,
|
||
run_day = EXTRACT(DAY FROM created_at AT TIME ZONE 'UTC')::smallint;
|
||
|
||
-- CHECK interval_months (interval >= 1) уходит вместе с колонкой.
|
||
ALTER TABLE recurring_rules
|
||
DROP COLUMN interval_months;
|
||
|
||
ALTER TABLE recurring_rules
|
||
ADD CONSTRAINT recurring_rules_run_month_check
|
||
CHECK (run_month BETWEEN 1 AND 12),
|
||
ADD CONSTRAINT recurring_rules_run_day_check
|
||
CHECK (run_day BETWEEN 1 AND 31);
|