-- Holidays table (праздничные дни Беларуси) CREATE TABLE IF NOT EXISTS holidays ( id SERIAL PRIMARY KEY, date DATE NOT NULL UNIQUE, name VARCHAR(200) NOT NULL, is_recurring BOOLEAN DEFAULT false, -- повторяется каждый год recurring_month INTEGER, -- месяц для повторяющихся recurring_day INTEGER, -- день для повторяющихся created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Index for fast date lookup CREATE INDEX IF NOT EXISTS idx_holidays_date ON holidays(date); -- Insert Belarus official holidays (recurring) -- Эти праздники повторяются каждый год в одну и ту же дату INSERT INTO holidays (date, name, is_recurring, recurring_month, recurring_day) VALUES ('2025-01-01', 'Новый год', true, 1, 1), ('2025-01-07', 'Рождество (православное)', true, 1, 7), ('2025-03-08', 'День женщин', true, 3, 8), ('2025-05-01', 'Праздник труда', true, 5, 1), ('2025-05-09', 'День Победы', true, 5, 9), ('2025-07-03', 'День Независимости', true, 7, 3), ('2025-11-07', 'День Октябрьской революции', true, 11, 7), ('2025-12-25', 'Рождество (католическое)', true, 12, 25) ON CONFLICT (date) DO NOTHING; -- Радуница (переходящая дата) - нужно добавлять вручную каждый год -- 2025: 29 апреля -- 2026: 21 апреля INSERT INTO holidays (date, name, is_recurring, recurring_month, recurring_day) VALUES ('2025-04-29', 'Радуница', false, NULL, NULL), ('2026-04-21', 'Радуница', false, NULL, NULL) ON CONFLICT (date) DO NOTHING; -- Function to check if a date is a holiday CREATE OR REPLACE FUNCTION is_holiday(check_date DATE) RETURNS BOOLEAN AS $$ BEGIN -- Check exact date match IF EXISTS (SELECT 1 FROM holidays WHERE date = check_date) THEN RETURN TRUE; END IF; -- Check recurring holidays (for future years) IF EXISTS ( SELECT 1 FROM holidays WHERE is_recurring = true AND recurring_month = EXTRACT(MONTH FROM check_date) AND recurring_day = EXTRACT(DAY FROM check_date) ) THEN RETURN TRUE; END IF; RETURN FALSE; END; $$ LANGUAGE plpgsql; -- Function to get schedule type for a date -- Returns: 'weekday', 'saturday', 'sunday', or 'holiday' CREATE OR REPLACE FUNCTION get_schedule_type(check_date DATE) RETURNS VARCHAR(20) AS $$ DECLARE day_of_week INTEGER; BEGIN -- Check if it's a holiday first (holidays use sunday schedule) IF is_holiday(check_date) THEN RETURN 'holiday'; END IF; -- Get day of week (0 = Sunday, 6 = Saturday) day_of_week := EXTRACT(DOW FROM check_date); IF day_of_week = 0 THEN RETURN 'sunday'; ELSIF day_of_week = 6 THEN RETURN 'saturday'; ELSE RETURN 'weekday'; END IF; END; $$ LANGUAGE plpgsql; -- Add sync trigger for holidays CREATE TRIGGER sync_holidays AFTER INSERT OR UPDATE OR DELETE ON holidays FOR EACH ROW EXECUTE FUNCTION log_sync_changes();