new-site/api/migrations/014_relay_deposits.sql
justin f8cd37ac8c Initial commit — Performance West telecom compliance platform
Includes: API (Express/TypeScript), Astro site, Python workers,
document generators, FCC compliance tools, Canada CRTC formation,
Ansible infrastructure, and deployment scripts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 06:54:22 -05:00

62 lines
2.9 KiB
PL/PgSQL

-- 014_relay_deposits.sql
-- Relay deposit detection and filing fee reservation system.
--
-- Flow:
-- relay_deposit_monitor.py watches relay-deposits@performancewest.net via IMAP.
-- When Relay emails "You received $X from FID BKG SVC LLC" (Stripe payout),
-- a row is inserted into relay_deposits.
-- process_pending_filings() then checks filing_fee_reservations to compute
-- available balance and advances FIFO-ordered "Awaiting Funds" orders.
BEGIN;
-- Relay deposit notifications parsed from email
CREATE TABLE IF NOT EXISTS relay_deposits (
id SERIAL PRIMARY KEY,
amount_cents INTEGER NOT NULL, -- deposited amount in cents
sender_name TEXT NOT NULL, -- e.g. "FID BKG SVC LLC" for Stripe
source TEXT NOT NULL DEFAULT 'stripe', -- 'stripe' | 'other'
email_uid TEXT NOT NULL UNIQUE, -- IMAP UID to prevent duplicate processing
email_subject TEXT,
detected_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
processed BOOLEAN NOT NULL DEFAULT FALSE,
processed_at TIMESTAMPTZ
);
CREATE INDEX IF NOT EXISTS idx_relay_deposits_unprocessed
ON relay_deposits (detected_at)
WHERE processed = FALSE;
-- Filing fee reservations — tracks which deposits are committed to which orders
CREATE TABLE IF NOT EXISTS filing_fee_reservations (
id SERIAL PRIMARY KEY,
order_id TEXT NOT NULL, -- e.g. "CRTC-2026-0001" or "FO-2026-0042"
order_type TEXT NOT NULL, -- 'canada_crtc' | 'formation'
amount_cents INTEGER NOT NULL, -- filing fee reserved (BC ~C$350 → USD, US state fee)
-- Status lifecycle: pending → reserved → spent | released
status TEXT NOT NULL DEFAULT 'pending'
CHECK (status IN ('pending', 'reserved', 'spent', 'released')),
relay_deposit_id INTEGER REFERENCES relay_deposits(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
reserved_at TIMESTAMPTZ, -- when workflow advanced to Filing/Incorporation
spent_at TIMESTAMPTZ, -- when Playwright confirmed card charged
released_at TIMESTAMPTZ, -- if filing failed → funds returned to pool
notes TEXT
);
CREATE INDEX IF NOT EXISTS idx_filing_fee_reservations_status
ON filing_fee_reservations (status, created_at);
CREATE INDEX IF NOT EXISTS idx_filing_fee_reservations_order
ON filing_fee_reservations (order_id);
-- Helper view: current available balance in Relay filing account
-- available = sum(deposits) - sum(reserved + spent reservations)
CREATE OR REPLACE VIEW relay_available_balance AS
SELECT
COALESCE((SELECT SUM(amount_cents) FROM relay_deposits), 0)
- COALESCE((SELECT SUM(amount_cents) FROM filing_fee_reservations
WHERE status IN ('reserved', 'spent')), 0)
AS available_cents;
COMMIT;