From 9761e88e9bbf4e30e821bfbf977f97b9c4ca8c00 Mon Sep 17 00:00:00 2001 From: jtricerolph Date: Mon, 13 Jul 2026 19:01:50 +0000 Subject: [PATCH] Add missing Resos tables to schema.sql MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit resos_custom_field_mapping, resos_opening_hours_mapping, resos_manual_breakfast_periods, resos_bookings_data, resos_bookings_stats, resos_booking_pace were never added to the schema — they only existed in the original standalone Postgres instance. Co-Authored-By: Claude Sonnet 4.6 --- backend/schema.sql | 130 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/backend/schema.sql b/backend/schema.sql index 1b4af40..777f2d2 100644 --- a/backend/schema.sql +++ b/backend/schema.sql @@ -1001,3 +1001,133 @@ INSERT INTO system_config (config_key, config_value, description) VALUES ('recon_sales_breakdown_columns', '[]', 'Sales breakdown column configuration (JSON)'), ('recon_safe_cash_target', '0.00', 'Target amount for safe cash float') ON CONFLICT (config_key) DO NOTHING; + + +-- ============================================ +-- WEATHER DATA (Open-Meteo ERA5 archive) +-- Location: Stow on the Wold, GL54 1JX (51.9253°N, -1.7272°W, 230m) +-- ============================================ + +CREATE TABLE IF NOT EXISTS weather_data ( + id SERIAL PRIMARY KEY, + date DATE NOT NULL UNIQUE, + temperature_max DECIMAL(5,2), -- °C + temperature_min DECIMAL(5,2), -- °C + temperature_mean DECIMAL(5,2), -- °C + precipitation_sum DECIMAL(7,2), -- mm total (rain + snow) + rain_sum DECIMAL(7,2), -- mm rain only + snowfall_sum DECIMAL(7,2), -- cm snowfall + snow_depth_max DECIMAL(7,3), -- m snow depth + windspeed_max DECIMAL(6,2), -- km/h + sunshine_hours DECIMAL(5,2), -- hours (converted from seconds) + weathercode SMALLINT, -- WMO weather interpretation code + fetched_at TIMESTAMP DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_weather_data_date ON weather_data(date); + +INSERT INTO system_config (config_key, config_value, description) VALUES +('weather_sync_enabled', 'true', 'Enable daily weather data sync from Open-Meteo'), +('weather_sync_time', '05:15', 'Daily weather sync time (HH:MM)'), +('weather_location_name', 'Stow on the Wold, GL54 1JX', 'Human-readable location name for weather data'), +('weather_latitude', '51.9253', 'Latitude for weather data fetch (decimal degrees)'), +('weather_longitude', '-1.7272', 'Longitude for weather data fetch (decimal degrees)'), +('weather_timezone', 'Europe/London', 'Timezone for weather data (IANA tz name)') +ON CONFLICT (config_key) DO NOTHING; + + +-- ============================================ +-- RESOS RESTAURANT INTEGRATION +-- ============================================ + +CREATE TABLE IF NOT EXISTS resos_custom_field_mapping ( + field_id TEXT PRIMARY KEY, + field_name TEXT NOT NULL DEFAULT '', + field_type TEXT NOT NULL DEFAULT '', + maps_to TEXT NOT NULL, + value_for_true TEXT, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS resos_opening_hours_mapping ( + opening_hour_id TEXT PRIMARY KEY, + opening_hour_name TEXT NOT NULL DEFAULT '', + period_type TEXT NOT NULL, + display_name TEXT, + is_regular BOOLEAN NOT NULL DEFAULT TRUE, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS resos_manual_breakfast_periods ( + day_of_week INTEGER PRIMARY KEY, + start_time TIME, + end_time TIME, + is_active BOOLEAN NOT NULL DEFAULT TRUE, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS resos_bookings_data ( + id SERIAL PRIMARY KEY, + resos_id TEXT NOT NULL UNIQUE, + booking_date DATE NOT NULL, + booking_time TEXT, + opening_hour_id TEXT, + period_type TEXT, + covers INTEGER NOT NULL DEFAULT 0, + status TEXT, + source TEXT, + table_name TEXT, + table_area TEXT, + is_hotel_guest BOOLEAN, + is_dbb BOOLEAN, + is_package BOOLEAN, + hotel_booking_number TEXT, + group_exclude_field BOOLEAN, + total_guests INTEGER, + booking_placed TIMESTAMPTZ, + notes TEXT, + raw_json JSONB, + fetched_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); +CREATE INDEX IF NOT EXISTS idx_resos_bookings_date ON resos_bookings_data (booking_date); +CREATE INDEX IF NOT EXISTS idx_resos_bookings_status ON resos_bookings_data (status); +CREATE INDEX IF NOT EXISTS idx_resos_bookings_period ON resos_bookings_data (period_type); + +CREATE TABLE IF NOT EXISTS resos_bookings_stats ( + date DATE PRIMARY KEY, + breakfast_covers INTEGER NOT NULL DEFAULT 0, + lunch_covers INTEGER NOT NULL DEFAULT 0, + afternoon_covers INTEGER NOT NULL DEFAULT 0, + dinner_covers INTEGER NOT NULL DEFAULT 0, + other_covers INTEGER NOT NULL DEFAULT 0, + total_covers INTEGER NOT NULL DEFAULT 0, + breakfast_bookings INTEGER NOT NULL DEFAULT 0, + lunch_bookings INTEGER NOT NULL DEFAULT 0, + afternoon_bookings INTEGER NOT NULL DEFAULT 0, + dinner_bookings INTEGER NOT NULL DEFAULT 0, + other_bookings INTEGER NOT NULL DEFAULT 0, + total_bookings INTEGER NOT NULL DEFAULT 0, + covers_by_source JSONB NOT NULL DEFAULT '{}', + covers_by_period JSONB NOT NULL DEFAULT '{}', + hotel_guest_covers INTEGER NOT NULL DEFAULT 0, + non_hotel_guest_covers INTEGER NOT NULL DEFAULT 0, + dbb_covers INTEGER NOT NULL DEFAULT 0, + package_covers INTEGER NOT NULL DEFAULT 0, + hotel_booking_numbers JSONB NOT NULL DEFAULT '{}', + distinct_hotel_bookings INTEGER NOT NULL DEFAULT 0, + bookings_with_hotel_link INTEGER NOT NULL DEFAULT 0, + avg_party_size DECIMAL(5,2), + avg_party_size_by_period JSONB NOT NULL DEFAULT '{}', + aggregated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS resos_booking_pace ( + booking_date DATE NOT NULL, + pace_type TEXT NOT NULL, + d0 INTEGER DEFAULT 0, d1 INTEGER DEFAULT 0, d2 INTEGER DEFAULT 0, + d3 INTEGER DEFAULT 0, d7 INTEGER DEFAULT 0, d14 INTEGER DEFAULT 0, + d21 INTEGER DEFAULT 0, d28 INTEGER DEFAULT 0, d60 INTEGER DEFAULT 0, + d90 INTEGER DEFAULT 0, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (booking_date, pace_type) +);