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>
116 lines
3.7 KiB
PL/PgSQL
116 lines
3.7 KiB
PL/PgSQL
-- 073_state_puc_registrations.sql
|
|
--
|
|
-- Per-state PUC/PSC registration tracking, one row per state per order.
|
|
-- Follows the foreign_qualification_registrations pattern from migration 066.
|
|
|
|
BEGIN;
|
|
|
|
CREATE TABLE IF NOT EXISTS state_puc_registrations (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
-- Parent order
|
|
compliance_order_id INTEGER REFERENCES compliance_orders(id) ON DELETE SET NULL,
|
|
order_number TEXT NOT NULL,
|
|
|
|
-- Linked carrier
|
|
telecom_entity_id INTEGER,
|
|
state_code CHAR(2) NOT NULL,
|
|
registration_type TEXT NOT NULL, -- 'voip','broadband','clec','bundle'
|
|
entity_legal_name TEXT NOT NULL,
|
|
frn TEXT,
|
|
|
|
-- Provider classification (affects requirements in many states)
|
|
provider_type TEXT CHECK (provider_type IN (
|
|
'facilities_based', 'reseller', 'over_the_top', 'hybrid'
|
|
)),
|
|
|
|
-- Status pipeline
|
|
status TEXT NOT NULL DEFAULT 'received' CHECK (status IN (
|
|
'received', -- paid, queued
|
|
'docs_pending', -- waiting on supporting documents
|
|
'bond_pending', -- waiting on surety bond procurement
|
|
'filing', -- preparing/submitting to state PUC
|
|
'admin_review', -- manual step needed
|
|
'submitted', -- filed, awaiting state approval
|
|
'approved', -- certificate/registration issued
|
|
'rejected',
|
|
'cancelled'
|
|
)),
|
|
|
|
-- Fees (cents)
|
|
state_fee_cents INTEGER NOT NULL DEFAULT 0,
|
|
bond_amount_cents INTEGER NOT NULL DEFAULT 0,
|
|
service_fee_cents INTEGER NOT NULL DEFAULT 0,
|
|
retail_total_cents INTEGER NOT NULL DEFAULT 0,
|
|
|
|
-- Registration details
|
|
puc_registration_number TEXT,
|
|
puc_certificate_number TEXT,
|
|
filed_at TIMESTAMPTZ,
|
|
approved_at TIMESTAMPTZ,
|
|
certificate_minio_path TEXT,
|
|
|
|
-- Bond info
|
|
bond_company TEXT,
|
|
bond_policy_number TEXT,
|
|
bond_expiration_date DATE,
|
|
|
|
-- Tracking
|
|
attempt_count INTEGER NOT NULL DEFAULT 0,
|
|
last_error TEXT,
|
|
admin_todo_id INTEGER,
|
|
notes TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
|
|
UNIQUE (telecom_entity_id, state_code, order_number)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_puc_reg_order_number
|
|
ON state_puc_registrations(order_number);
|
|
CREATE INDEX IF NOT EXISTS idx_puc_reg_state_code
|
|
ON state_puc_registrations(state_code);
|
|
CREATE INDEX IF NOT EXISTS idx_puc_reg_status
|
|
ON state_puc_registrations(status)
|
|
WHERE status NOT IN ('approved','cancelled','rejected');
|
|
CREATE INDEX IF NOT EXISTS idx_puc_reg_telecom_entity
|
|
ON state_puc_registrations(telecom_entity_id)
|
|
WHERE telecom_entity_id IS NOT NULL;
|
|
|
|
-- Updated_at trigger
|
|
CREATE OR REPLACE FUNCTION set_updated_at_puc_reg() RETURNS trigger AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS trg_puc_reg_updated_at ON state_puc_registrations;
|
|
CREATE TRIGGER trg_puc_reg_updated_at
|
|
BEFORE UPDATE ON state_puc_registrations
|
|
FOR EACH ROW EXECUTE FUNCTION set_updated_at_puc_reg();
|
|
|
|
-- Admin pipeline view
|
|
CREATE OR REPLACE VIEW v_puc_registrations_pipeline AS
|
|
SELECT
|
|
pr.id,
|
|
pr.order_number,
|
|
pr.entity_legal_name,
|
|
pr.state_code,
|
|
j.name AS state_name,
|
|
pr.registration_type,
|
|
pr.provider_type,
|
|
pr.status,
|
|
pr.state_fee_cents,
|
|
pr.bond_amount_cents,
|
|
pr.retail_total_cents,
|
|
pr.filed_at,
|
|
pr.approved_at,
|
|
pr.attempt_count,
|
|
pr.last_error,
|
|
pr.created_at
|
|
FROM state_puc_registrations pr
|
|
LEFT JOIN jurisdictions j ON j.code = pr.state_code
|
|
ORDER BY pr.created_at DESC;
|
|
|
|
COMMIT;
|