|
|
|
@@ -1,694 +0,0 @@
|
|
|
|
|
-- =====================================================================
|
|
|
|
|
-- 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.
|