Add missing Resos tables to schema.sql

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 <noreply@anthropic.com>
This commit is contained in:
jtricerolph 2026-07-13 19:01:50 +00:00
parent 7dfaa5a9fb
commit 9761e88e9b

View file

@ -1001,3 +1001,133 @@ INSERT INTO system_config (config_key, config_value, description) VALUES
('recon_sales_breakdown_columns', '[]', 'Sales breakdown column configuration (JSON)'), ('recon_sales_breakdown_columns', '[]', 'Sales breakdown column configuration (JSON)'),
('recon_safe_cash_target', '0.00', 'Target amount for safe cash float') ('recon_safe_cash_target', '0.00', 'Target amount for safe cash float')
ON CONFLICT (config_key) DO NOTHING; 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)
);