axe/internal/db/migrations/0015_recurring_annual.sql

36 lines
1.9 KiB
MySQL
Raw Normal View History

2026-10-18 19:07:25 +00:00
-- 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);