From a266203c0744baeb6a3c717b0cb55939c4c45401 Mon Sep 17 00:00:00 2001 From: default Date: Fri, 5 Jun 2026 16:44:41 +0000 Subject: [PATCH] synthesized base schema for local dev (60 base tables) Temporary schema derived from migration column references. Provides workable local structure BEFORE the real Supabase pg_dump arrives. When brother removes the Supabase spend cap: 1. pg_dump the real Supabase schema to supabase/captured_schema.sql 2. pg_dump the data to supabase/captured_data.sql 3. Drop everything in public schema 4. Apply the captured schema + data 5. Drop the synthesized file The synthesized schema is NOT for production. --- supabase/synthesized/000_base_schema.sql | 694 +++++++++++++++++++++++ 1 file changed, 694 insertions(+) create mode 100644 supabase/synthesized/000_base_schema.sql diff --git a/supabase/synthesized/000_base_schema.sql b/supabase/synthesized/000_base_schema.sql new file mode 100644 index 0000000..824d9c3 --- /dev/null +++ b/supabase/synthesized/000_base_schema.sql @@ -0,0 +1,694 @@ +-- ===================================================================== +-- SYNTHESIZED BASE SCHEMA - TEMPORARY +-- ===================================================================== +-- This is a synthesized base schema derived from migration column +-- references. It exists to give the local DB a workable structure +-- BEFORE the real Supabase data dump arrives. +-- +-- WHEN the brother removes the Supabase spend cap and the user gets +-- the real pg_dump, this entire file should be DROPPED and replaced +-- with the real schema from the dump. Do NOT rely on this for prod. +-- +-- Pattern: every table has id (UUID PK), created_at, updated_at. +-- Columns confirmed by migrations are added with proper types. +-- For data we don't know about, a payload JSONB column holds it +-- so the dump can be loaded without constraint failures. +-- ===================================================================== + +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; +CREATE EXTENSION IF NOT EXISTS "pgcrypto"; + +-- ============== BRANDS ============== +CREATE TABLE IF NOT EXISTS brands ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + slug TEXT UNIQUE, + name TEXT, + owner_user_id UUID, + stripe_customer_id TEXT, + stripe_subscription_id TEXT, + stripe_subscription_status TEXT DEFAULT 'inactive', + stripe_current_period_end TIMESTAMPTZ, + plan_tier TEXT DEFAULT 'starter', + max_users INT DEFAULT 1, + max_stops_monthly INT DEFAULT 25, + max_products INT DEFAULT 50, + logo_url TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== BRAND SETTINGS ============== +CREATE TABLE IF NOT EXISTS brand_settings ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + hero_tagline TEXT, + hero_image_url TEXT, + about_headline TEXT, + about_subheadline TEXT, + custom_footer_text TEXT, + show_wholesale_link BOOLEAN DEFAULT true, + show_zip_search BOOLEAN DEFAULT true, + show_schedule_pdf BOOLEAN DEFAULT true, + show_text_alerts BOOLEAN DEFAULT false, + schedule_pdf_notes TEXT, + brand_primary_color TEXT DEFAULT '#16a34a', + brand_secondary_color TEXT DEFAULT '#f5f5f4', + brand_bg_color TEXT DEFAULT '#fafaf9', + brand_text_color TEXT DEFAULT '#1c1917', + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== BRAND FEATURES (add-ons) ============== +CREATE TABLE IF NOT EXISTS brand_features ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + feature_key TEXT, + enabled BOOLEAN DEFAULT false, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== PRODUCTS ============== +CREATE TABLE IF NOT EXISTS products ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + name TEXT, + description TEXT, + price NUMERIC(12,2), + image_url TEXT, + is_taxable BOOLEAN DEFAULT true, + is_active BOOLEAN DEFAULT true, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== STOPS ============== +CREATE TABLE IF NOT EXISTS stops ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + address TEXT, + zip TEXT, + city TEXT, + state TEXT, + datetime TIMESTAMPTZ, + cutoff_time TIMESTAMPTZ, + status TEXT DEFAULT 'active', + deleted_at TIMESTAMPTZ, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== ORDERS ============== +CREATE TABLE IF NOT EXISTS orders ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + stop_id UUID, + customer_email TEXT, + customer_name TEXT, + customer_phone TEXT, + customer_address TEXT, + total_amount NUMERIC(12,2), + status TEXT DEFAULT 'pending', + fulfillment_type TEXT, + shipping_status TEXT DEFAULT 'pending', + tracking_number TEXT, + idempotency_key UUID UNIQUE, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== ORDER ITEMS ============== +CREATE TABLE IF NOT EXISTS order_items ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + order_id UUID, + product_id UUID, + quantity INT DEFAULT 1, + price NUMERIC(12,2), + fulfillment TEXT DEFAULT 'pickup', + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== PRODUCT STOPS (junction) ============== +CREATE TABLE IF NOT EXISTS product_stops ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + product_id UUID, + stop_id UUID, + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== CUSTOMERS ============== +CREATE TABLE IF NOT EXISTS customers ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + email TEXT, + name TEXT, + phone TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== ADMIN USERS ============== +CREATE TABLE IF NOT EXISTS admin_users ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID, + brand_id UUID, + email TEXT, + role TEXT, + is_active BOOLEAN DEFAULT true, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== WHOLESALE TABLES ============== +CREATE TABLE IF NOT EXISTS wholesale_settings ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + wholesale_enabled BOOLEAN DEFAULT true, + require_approval BOOLEAN DEFAULT true, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS wholesale_products ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + name TEXT, + description TEXT, + price NUMERIC(12,2), + rc_product_id UUID, + is_active BOOLEAN DEFAULT true, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS wholesale_customers ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + email TEXT, + name TEXT, + phone TEXT, + status TEXT DEFAULT 'pending', + approved_at TIMESTAMPTZ, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS wholesale_orders ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + customer_id UUID, + status TEXT DEFAULT 'pending', + total_amount NUMERIC(12,2), + cart_snapshot JSONB, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS wholesale_order_items ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + wholesale_order_id UUID, + product_id UUID, + customer_id UUID, + quantity INT, + price NUMERIC(12,2), + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS wholesale_deposits ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + customer_id UUID, + order_id UUID, + amount NUMERIC(12,2), + payment_method TEXT, + status TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS wholesale_notifications ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + type TEXT, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS wholesale_customer_product_pricing ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + customer_id UUID, + product_id UUID, + price NUMERIC(12,2), + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS wholesale_sync_log ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== COMMUNICATIONS ============== +CREATE TABLE IF NOT EXISTS communication_campaigns ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + name TEXT, + subject TEXT, + body TEXT, + status TEXT DEFAULT 'draft', + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS communication_templates ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + name TEXT, + subject TEXT, + body TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS communication_contacts ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + email TEXT, + name TEXT, + sms_opt_in BOOLEAN DEFAULT false, + email_opt_in BOOLEAN DEFAULT true, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS communication_message_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + campaign_id UUID, + contact_id UUID, + channel TEXT, + customer_email TEXT, + subject TEXT, + body TEXT, + event_id TEXT, + status TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS communication_segments ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + name TEXT, + definition JSONB, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS communication_settings ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== HARVEST LOTS ============== +CREATE TABLE IF NOT EXISTS harvest_lots ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + product_id UUID, + lot_number TEXT, + quantity_lbs NUMERIC(12,2), + quantity_used_lbs NUMERIC(12,2) DEFAULT 0, + harvest_date DATE, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS harvest_lot_events ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + lot_id UUID, + event_type TEXT, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== WATER LOG ============== +CREATE TABLE IF NOT EXISTS water_users ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + email TEXT, + name TEXT, + pin TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS water_headgates ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + name TEXT, + token TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS water_irrigators ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + name TEXT, + pin TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS water_log_entries ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + headgate_id UUID, + irrigator_id UUID, + logged_by UUID, + gallons NUMERIC(12,2), + started_at TIMESTAMPTZ, + ended_at TIMESTAMPTZ, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS water_admin_settings ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS water_alert_log ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS water_sessions ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== TIME TRACKING ============== +CREATE TABLE IF NOT EXISTS time_tracking_workers ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + name TEXT, + pin TEXT, + is_active BOOLEAN DEFAULT true, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS time_tracking_tasks ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + name TEXT, + description TEXT, + is_active BOOLEAN DEFAULT true, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS time_tracking_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + worker_id UUID, + task_id UUID, + clock_in TIMESTAMPTZ, + clock_out TIMESTAMPTZ, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS time_tracking_settings ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS time_tracking_notification_log ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS worker_time_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + worker_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== REFERRALS ============== +CREATE TABLE IF NOT EXISTS referral_codes ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + code TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS referral_redemptions ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + referral_code_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== PAYMENTS / SETTINGS ============== +CREATE TABLE IF NOT EXISTS payment_settings ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS refunds ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + order_id UUID, + amount NUMERIC(12,2), + reason TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS square_sync_log ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS square_sync_queue ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== API KEYS ============== +CREATE TABLE IF NOT EXISTS api_keys ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + key TEXT, + name TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== ONBOARDING / ACTIVITY ============== +CREATE TABLE IF NOT EXISTS onboarding_progress ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + user_id UUID, + step TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS notification_preferences ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + user_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS user_carts ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + user_email TEXT, + cart JSONB, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS user_activity_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + user_id UUID, + action TEXT, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS admin_action_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + admin_user_id UUID, + action TEXT, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS audit_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + user_id UUID, + action TEXT, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS operational_events ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + event_type TEXT, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== WELCOME / ABANDONED CART ============== +CREATE TABLE IF NOT EXISTS welcome_email_sequence ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS abandoned_cart_recovery ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== CHANGELOGS ============== +CREATE TABLE IF NOT EXISTS changelogs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + title TEXT, + body TEXT, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS changelog_reads ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + changelog_id UUID, + user_id UUID, + read_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== FOUNDER / MISC ============== +CREATE TABLE IF NOT EXISTS founder_pain_log ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + payload JSONB, + created_at TIMESTAMPTZ DEFAULT now() +); + +-- ============== VIEWS (used in some RPCs) ============== +CREATE TABLE IF NOT EXISTS completed_pickups ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS pending_pickups ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS pickup_orders ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS shipping_orders ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + brand_id UUID, + payload JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT now() +); + +-- Done. 65 base tables synthesized.