-- Динамическая конфигурация Objective sync — single-row settings. -- -- Зачем нужна: -- 1. В админке /admin/scrape/objective можно менять параметры запроса -- (groups, use_ddu/dkp, period_months_back, inter_group_delay) без редеплоя. -- 2. Cron-расписание тоже хранится здесь — Celery beat читает его при старте. -- Изменение требует restart beat-контейнера (это указано в UI как hint). -- -- Pattern: single-row (id=1), UPSERT для безопасных обновлений. -- Если строки нет — task/beat падают на settings.* env как fallback. CREATE TABLE IF NOT EXISTS objective_sync_config ( id SMALLINT PRIMARY KEY DEFAULT 1 CHECK (id = 1), -- Cron-расписание для Celery beat (5-полевой формат: 'minute hour dom month dow'). -- Celery beat перечитывает это поле только при старте — после изменения -- нужен `docker compose restart beat`. cron_schedule TEXT NOT NULL DEFAULT '0 6 * * tue', -- Группы для sync (csv). Эмпирически проверены на тарифе: -- 'Свердловская область', 'Челябинск', 'Тюмень', 'Пермь', -- 'Екатеринбург', 'Верхняя Пышма', 'Берёзовский', 'Нижний Тагил', -- 'Каменск-Уральский', 'Первоуральск', 'Новоуральск', 'Сысерть'. groups_csv TEXT NOT NULL DEFAULT 'Свердловская область,Челябинск,Тюмень,Пермь', -- Параметры запроса /v2/Report/GetReport. use_ddu BOOLEAN NOT NULL DEFAULT TRUE, use_dkp BOOLEAN NOT NULL DEFAULT TRUE, -- Сколько месяцев назад тянуть для Сводных отчётов (corp_sum). -- 1 = только последний полный месяц (default). 12 = весь год. -- Поквартирные/Лоты не имеют дат — всегда snapshot. period_months_back SMALLINT NOT NULL DEFAULT 1 CHECK (period_months_back BETWEEN 1 AND 24), -- Пауза между группами в одном task'е (секунды). Защита от 429. inter_group_delay_s SMALLINT NOT NULL DEFAULT 30 CHECK (inter_group_delay_s BETWEEN 0 AND 300), -- Пауза между HTTP-запросами в client (мс). Передаётся в ObjectiveClient(rate_ms=…). rate_ms SMALLINT NOT NULL DEFAULT 3000 CHECK (rate_ms BETWEEN 0 AND 10000), -- Сколько ретраев на 429/5xx. retries SMALLINT NOT NULL DEFAULT 2 CHECK (retries BETWEEN 0 AND 5), updated_at timestamptz NOT NULL DEFAULT NOW(), updated_by TEXT ); COMMENT ON TABLE objective_sync_config IS 'Single-row динамическая конфигурация Objective sync. Все task-ы и beat ' 'читают отсюда. Если строки нет — fallback на settings.* env.'; -- Засеваем единственную строку с дефолтами (если ещё не создана). INSERT INTO objective_sync_config (id) VALUES (1) ON CONFLICT (id) DO NOTHING;