36 lines
1.9 KiB
MySQL
36 lines
1.9 KiB
MySQL
|
|
-- 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);
|