-- ============================================================ -- Migration: RMP Master System — Relevant Media Properties LLC -- Timestamp: 20260401120000 -- Covers: Sales, CRM, AdOps, Accounting, Email Distribution -- ADDITIVE ONLY — no existing tables modified -- ============================================================ -- ─── SALES STAFF ───────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_sales_staff ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), full_name text NOT NULL, email text, phone text, status text DEFAULT 'active', terminated_date date, notes text, created_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_sales_staff_status ON public.rmp_sales_staff(status); -- ─── COMMISSION TIERS ───────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_commission_tiers ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), staff_id uuid REFERENCES public.rmp_sales_staff(id) ON DELETE CASCADE, effective_year integer, tier_order integer, threshold_cents integer, rate numeric, created_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_commission_tiers_staff ON public.rmp_commission_tiers(staff_id); CREATE INDEX IF NOT EXISTS idx_rmp_commission_tiers_year ON public.rmp_commission_tiers(effective_year); -- ─── CLIENTS ────────────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_clients ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), company_name text NOT NULL, contact_name text, contact_email text, contact_phone text, billing_address text, notes text, status text DEFAULT 'active', created_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_clients_status ON public.rmp_clients(status); CREATE INDEX IF NOT EXISTS idx_rmp_clients_company ON public.rmp_clients(company_name); -- ─── PRODUCT / SERVICE CATALOG ──────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_products ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), site text NOT NULL, product_type text NOT NULL, name text NOT NULL, description text, dimensions text, standard_price_cents integer, duration_days integer, active boolean DEFAULT true, sort_order integer DEFAULT 0, created_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_products_site ON public.rmp_products(site); CREATE INDEX IF NOT EXISTS idx_rmp_products_active ON public.rmp_products(active); -- ─── ORDERS ─────────────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_orders ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), client_id uuid REFERENCES public.rmp_clients(id), staff_id uuid REFERENCES public.rmp_sales_staff(id), po_number text, internal_order_number text, site text NOT NULL, product_id uuid REFERENCES public.rmp_products(id), ad_unit text, description text, start_date date, end_date date, total_amount_cents integer, currency text DEFAULT 'USD', status text DEFAULT 'active', invoicing_schedule text DEFAULT 'single', next_invoice_date date, notes text, created_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_orders_client ON public.rmp_orders(client_id); CREATE INDEX IF NOT EXISTS idx_rmp_orders_staff ON public.rmp_orders(staff_id); CREATE INDEX IF NOT EXISTS idx_rmp_orders_site ON public.rmp_orders(site); CREATE INDEX IF NOT EXISTS idx_rmp_orders_status ON public.rmp_orders(status); CREATE INDEX IF NOT EXISTS idx_rmp_orders_next_invoice ON public.rmp_orders(next_invoice_date); -- ─── INVOICES ───────────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_invoices ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), order_id uuid REFERENCES public.rmp_orders(id), client_id uuid REFERENCES public.rmp_clients(id), staff_id uuid REFERENCES public.rmp_sales_staff(id), invoice_number text, site text, amount_cents integer, currency text DEFAULT 'USD', status text DEFAULT 'pending', payment_method text, stripe_payment_id text, wire_reference text, notes text, issue_date date, due_date date, paid_date date, is_staff_sale boolean DEFAULT false, created_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_invoices_order ON public.rmp_invoices(order_id); CREATE INDEX IF NOT EXISTS idx_rmp_invoices_client ON public.rmp_invoices(client_id); CREATE INDEX IF NOT EXISTS idx_rmp_invoices_status ON public.rmp_invoices(status); CREATE INDEX IF NOT EXISTS idx_rmp_invoices_due_date ON public.rmp_invoices(due_date); CREATE INDEX IF NOT EXISTS idx_rmp_invoices_site ON public.rmp_invoices(site); -- ─── EXPENSES ───────────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_expenses ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), vendor text, amount_cents integer, currency text DEFAULT 'USD', category text, description text, receipt_url text, receipt_source text, ai_parsed boolean DEFAULT false, reconciled boolean DEFAULT false, bank_transaction_id text, expense_date date, created_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_expenses_date ON public.rmp_expenses(expense_date); CREATE INDEX IF NOT EXISTS idx_rmp_expenses_category ON public.rmp_expenses(category); CREATE INDEX IF NOT EXISTS idx_rmp_expenses_reconciled ON public.rmp_expenses(reconciled); -- ─── BANK TRANSACTIONS ──────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_bank_transactions ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), transaction_date date, description text, amount_cents integer, type text, matched_invoice_id uuid, matched_expense_id uuid, reconciled boolean DEFAULT false, raw_csv_row jsonb, imported_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_bank_tx_date ON public.rmp_bank_transactions(transaction_date); CREATE INDEX IF NOT EXISTS idx_rmp_bank_tx_reconciled ON public.rmp_bank_transactions(reconciled); -- ─── COMMISSIONS ────────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_commissions ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), invoice_id uuid REFERENCES public.rmp_invoices(id), staff_id uuid REFERENCES public.rmp_sales_staff(id), year integer, sale_amount_cents integer, commission_rate numeric, commission_amount_cents integer, ytd_sales_at_time_cents integer, paid boolean DEFAULT false, paid_date date, created_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_commissions_staff ON public.rmp_commissions(staff_id); CREATE INDEX IF NOT EXISTS idx_rmp_commissions_year ON public.rmp_commissions(year); CREATE INDEX IF NOT EXISTS idx_rmp_commissions_paid ON public.rmp_commissions(paid); -- ─── DOCUMENT VAULT ─────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_documents ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), document_type text, title text, year integer, person text, file_url text, notes text, uploaded_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_documents_type ON public.rmp_documents(document_type); CREATE INDEX IF NOT EXISTS idx_rmp_documents_year ON public.rmp_documents(year); -- ─── IO EXTENSIONS ──────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_io_extensions ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), existing_io_id text NOT NULL, order_id uuid REFERENCES public.rmp_orders(id), product_id uuid REFERENCES public.rmp_products(id), staff_id uuid REFERENCES public.rmp_sales_staff(id), client_id uuid REFERENCES public.rmp_clients(id), is_comp boolean DEFAULT false, comp_reason text, is_paid boolean DEFAULT false, flight_status text DEFAULT 'scheduled', start_date date NOT NULL, end_date date, auto_deactivate boolean DEFAULT true, renewal_notice_sent boolean DEFAULT false, renewal_notice_sent_at timestamptz, reactivated_at timestamptz, reactivation_reason text, banner_image_url text, click_through_url text, alt_text text, email_html_url text, email_scheduled_date date, email_sent_at timestamptz, email_list_segment text, page_url text, newsletter_issue_date date, notes text, created_at timestamptz DEFAULT now(), updated_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_io_ext_flight_status ON public.rmp_io_extensions(flight_status); CREATE INDEX IF NOT EXISTS idx_rmp_io_ext_end_date ON public.rmp_io_extensions(end_date); CREATE INDEX IF NOT EXISTS idx_rmp_io_ext_client ON public.rmp_io_extensions(client_id); CREATE INDEX IF NOT EXISTS idx_rmp_io_ext_staff ON public.rmp_io_extensions(staff_id); -- ─── EMAIL SENDING DOMAINS ──────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_email_sending_domains ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), site text NOT NULL, domain text NOT NULL, domain_type text DEFAULT 'subdomain', is_primary boolean DEFAULT false, is_active boolean DEFAULT false, sort_order integer DEFAULT 0, daily_send_limit integer DEFAULT 5000, sends_today integer DEFAULT 0, sends_reset_at date, spf_valid boolean DEFAULT false, spf_checked_at timestamptz, dkim_valid boolean DEFAULT false, dkim_checked_at timestamptz, dmarc_valid boolean DEFAULT false, dmarc_checked_at timestamptz, ptr_valid boolean DEFAULT false, ptr_checked_at timestamptz, mx_valid boolean DEFAULT false, mx_checked_at timestamptz, dns_fully_verified boolean DEFAULT false, blacklisted boolean DEFAULT false, blacklist_details text, blacklist_checked_at timestamptz, health_score integer DEFAULT 0, bypass_verification boolean DEFAULT false, bypass_reason text, bypass_set_by text, bypass_set_at timestamptz, last_used_at timestamptz, notes text, created_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_email_domains_site ON public.rmp_email_sending_domains(site); CREATE INDEX IF NOT EXISTS idx_rmp_email_domains_active ON public.rmp_email_sending_domains(is_active); -- ─── EMAIL SUPPRESSIONS ─────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_email_suppressions ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), site text NOT NULL, email text NOT NULL, suppression_type text NOT NULL, source text, reply_text text, sending_domain text, suppressed_at timestamptz DEFAULT now(), suppressed_by text, notes text, UNIQUE(site, email) ); CREATE INDEX IF NOT EXISTS idx_rmp_suppressions_site ON public.rmp_email_suppressions(site); CREATE INDEX IF NOT EXISTS idx_rmp_suppressions_email ON public.rmp_email_suppressions(email); CREATE INDEX IF NOT EXISTS idx_rmp_suppressions_type ON public.rmp_email_suppressions(suppression_type); -- ─── SUPPRESSION KEYWORDS ───────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_suppression_keywords ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), keyword text NOT NULL, keyword_type text DEFAULT 'unsubscribe', active boolean DEFAULT true, created_at timestamptz DEFAULT now() ); -- ─── EMAIL DNS CHECK LOG ────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_email_dns_log ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), domain_id uuid REFERENCES public.rmp_email_sending_domains(id), check_type text, passed boolean, result_detail text, checked_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_dns_log_domain ON public.rmp_email_dns_log(domain_id); -- ─── EMAIL SEND LOG ─────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_email_send_log ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), site text NOT NULL, sending_domain_id uuid REFERENCES public.rmp_email_sending_domains(id), io_extension_id uuid REFERENCES public.rmp_io_extensions(id), recipient_email text, subject text, send_type text, status text DEFAULT 'queued', suppression_reason text, sent_at timestamptz, opens integer DEFAULT 0, clicks integer DEFAULT 0, bounced boolean DEFAULT false, bounce_type text, spam_complaint boolean DEFAULT false, created_at timestamptz DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_rmp_send_log_site ON public.rmp_email_send_log(site); CREATE INDEX IF NOT EXISTS idx_rmp_send_log_status ON public.rmp_email_send_log(status); CREATE INDEX IF NOT EXISTS idx_rmp_send_log_domain ON public.rmp_email_send_log(sending_domain_id); -- ─── ADOPS NOTIFICATIONS ────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_adops_notifications ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), io_extension_id uuid REFERENCES public.rmp_io_extensions(id), notification_type text, recipient_type text, recipient_email text, recipient_phone text, message text, sent_via text, sent_at timestamptz DEFAULT now(), success boolean DEFAULT true, error_message text ); CREATE INDEX IF NOT EXISTS idx_rmp_adops_notif_io ON public.rmp_adops_notifications(io_extension_id); -- ─── PAYMENT NOTIFICATIONS ──────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.rmp_notifications ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), type text, message text, sent_at timestamptz DEFAULT now(), invoice_id uuid ); -- ─── RLS: ADMIN-ONLY ACCESS FOR ALL RMP TABLES ──────────────────────────────── CREATE OR REPLACE FUNCTION public.rmp_is_admin() RETURNS boolean LANGUAGE sql STABLE SECURITY DEFINER AS $$ SELECT EXISTS ( SELECT 1 FROM public.user_profiles up WHERE up.id = auth.uid() AND up.role IN ('administrator', 'admin') ) $$; CREATE OR REPLACE FUNCTION public.rmp_is_adops_uploader() RETURNS boolean LANGUAGE sql STABLE SECURITY DEFINER AS $$ SELECT EXISTS ( SELECT 1 FROM public.user_profiles up WHERE up.id = auth.uid() AND up.role IN ('administrator', 'admin', 'adops_uploader') ) $$; ALTER TABLE public.rmp_sales_staff ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_commission_tiers ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_clients ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_products ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_orders ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_invoices ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_expenses ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_bank_transactions ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_commissions ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_documents ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_io_extensions ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_email_sending_domains ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_email_suppressions ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_suppression_keywords ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_email_dns_log ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_email_send_log ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_adops_notifications ENABLE ROW LEVEL SECURITY; ALTER TABLE public.rmp_notifications ENABLE ROW LEVEL SECURITY; -- Admin full access policies DROP POLICY IF EXISTS "rmp_admin_sales_staff" ON public.rmp_sales_staff; CREATE POLICY "rmp_admin_sales_staff" ON public.rmp_sales_staff FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_commission_tiers" ON public.rmp_commission_tiers; CREATE POLICY "rmp_admin_commission_tiers" ON public.rmp_commission_tiers FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_clients" ON public.rmp_clients; CREATE POLICY "rmp_admin_clients" ON public.rmp_clients FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_products" ON public.rmp_products; CREATE POLICY "rmp_admin_products" ON public.rmp_products FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_orders" ON public.rmp_orders; CREATE POLICY "rmp_admin_orders" ON public.rmp_orders FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_invoices" ON public.rmp_invoices; CREATE POLICY "rmp_admin_invoices" ON public.rmp_invoices FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_expenses" ON public.rmp_expenses; CREATE POLICY "rmp_admin_expenses" ON public.rmp_expenses FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_bank_tx" ON public.rmp_bank_transactions; CREATE POLICY "rmp_admin_bank_tx" ON public.rmp_bank_transactions FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_commissions" ON public.rmp_commissions; CREATE POLICY "rmp_admin_commissions" ON public.rmp_commissions FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_documents" ON public.rmp_documents; CREATE POLICY "rmp_admin_documents" ON public.rmp_documents FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_adops_io_extensions" ON public.rmp_io_extensions; CREATE POLICY "rmp_adops_io_extensions" ON public.rmp_io_extensions FOR ALL TO authenticated USING (public.rmp_is_adops_uploader()) WITH CHECK (public.rmp_is_adops_uploader()); DROP POLICY IF EXISTS "rmp_admin_email_domains" ON public.rmp_email_sending_domains; CREATE POLICY "rmp_admin_email_domains" ON public.rmp_email_sending_domains FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_suppressions" ON public.rmp_email_suppressions; CREATE POLICY "rmp_admin_suppressions" ON public.rmp_email_suppressions FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_keywords" ON public.rmp_suppression_keywords; CREATE POLICY "rmp_admin_keywords" ON public.rmp_suppression_keywords FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_dns_log" ON public.rmp_email_dns_log; CREATE POLICY "rmp_admin_dns_log" ON public.rmp_email_dns_log FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_send_log" ON public.rmp_email_send_log; CREATE POLICY "rmp_admin_send_log" ON public.rmp_email_send_log FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_adops_notif" ON public.rmp_adops_notifications; CREATE POLICY "rmp_admin_adops_notif" ON public.rmp_adops_notifications FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); DROP POLICY IF EXISTS "rmp_admin_notifications" ON public.rmp_notifications; CREATE POLICY "rmp_admin_notifications" ON public.rmp_notifications FOR ALL TO authenticated USING (public.rmp_is_admin()) WITH CHECK (public.rmp_is_admin()); -- ─── SEED DATA ──────────────────────────────────────────────────────────────── -- Jeff Victor sales staff + commission tiers DO $$ DECLARE jeff_id uuid; BEGIN INSERT INTO public.rmp_sales_staff (full_name, email, status) VALUES ('Jeff Victor', 'jeff.victor@relevantmediaproperties.com', 'active') ON CONFLICT DO NOTHING RETURNING id INTO jeff_id; IF jeff_id IS NOT NULL THEN INSERT INTO public.rmp_commission_tiers (staff_id, effective_year, tier_order, threshold_cents, rate) VALUES (jeff_id, 2026, 1, 10000000, 0.25), (jeff_id, 2026, 2, NULL, 0.30) ON CONFLICT DO NOTHING; END IF; EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'Seed staff error: %', SQLERRM; END $$; -- Suppression keywords INSERT INTO public.rmp_suppression_keywords (keyword, keyword_type) VALUES ('unsubscribe','unsubscribe'),('remove','unsubscribe'),('remove me','unsubscribe'), ('opt out','unsubscribe'),('opt-out','unsubscribe'),('stop','unsubscribe'), ('cancel','unsubscribe'),('do not email','unsubscribe'),('dont email','unsubscribe'), ('don''t email','unsubscribe'),('never email','unsubscribe'), ('take me off','unsubscribe'),('take me off your list','unsubscribe'), ('leave me alone','unsubscribe') ON CONFLICT DO NOTHING; -- Email sending domains INSERT INTO public.rmp_email_sending_domains (site, domain, domain_type, is_primary, sort_order) VALUES ('broadcastbeat', 'news.broadcastbeat.com', 'subdomain', true, 1), ('broadcastbeat', 'mail.broadcastbeat.com', 'subdomain', false, 2), ('broadcastbeat', 'broadcastbeatnews.com', 'sister_domain',false, 3), ('avbeat', 'news.avbeat.com', 'subdomain', true, 1), ('avbeat', 'mail.avbeat.com', 'subdomain', false, 2), ('backlotbeat', 'news.backlotbeat.com', 'subdomain', true, 1), ('backlotbeat', 'mail.backlotbeat.com', 'subdomain', false, 2), ('broadcastengineering', 'news.broadcastengineering.com', 'subdomain', true, 1), ('broadcastengineering', 'mail.broadcastengineering.com', 'subdomain', false, 2) ON CONFLICT DO NOTHING; -- Product catalog seed for all 4 RMP sites DO $$ DECLARE sites text[] := ARRAY['broadcastbeat','avbeat','backlotbeat','broadcastengineering']; s text; all_types text[] := ARRAY[ 'display_banner_300x250','display_banner_728x90','display_banner_300x600', 'display_banner_970x250','newsletter_banner_600x100','dedicated_email_blast', 'newsletter_sponsorship','featured_advertorial','featured_newsletter_story' ]; limited_types text[] := ARRAY[ 'display_banner_300x250','display_banner_728x90','display_banner_300x600', 'display_banner_970x250','newsletter_banner_600x100','dedicated_email_blast', 'featured_advertorial' ]; pt text; dims text; use_types text[]; BEGIN FOREACH s IN ARRAY sites LOOP IF s IN ('backlotbeat','broadcastengineering') THEN use_types := limited_types; ELSE use_types := all_types; END IF; FOREACH pt IN ARRAY use_types LOOP dims := CASE pt WHEN 'display_banner_300x250' THEN '300x250' WHEN 'display_banner_728x90' THEN '728x90' WHEN 'display_banner_300x600' THEN '300x600' WHEN 'display_banner_970x250' THEN '970x250' WHEN 'newsletter_banner_600x100' THEN '600x100' ELSE NULL END; INSERT INTO public.rmp_products (site, product_type, name, dimensions, active) VALUES (s, pt, initcap(replace(pt,'_',' ')), dims, true) ON CONFLICT DO NOTHING; END LOOP; END LOOP; EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'Product seed error: %', SQLERRM; END $$;