diff --git a/api/migrations/075_fcc_carrier_registration.sql b/api/migrations/075_fcc_carrier_registration.sql new file mode 100644 index 0000000..7e9cfc7 --- /dev/null +++ b/api/migrations/075_fcc_carrier_registration.sql @@ -0,0 +1,128 @@ +-- 075_fcc_carrier_registration.sql +-- +-- FCC Carrier / ISP Registration — dedicated order table with +-- CRTC-style multi-step pipeline. Supports optional formation, +-- CORES/FRN, Form 499, state PUC, and compliance filings. + +BEGIN; + +CREATE TABLE IF NOT EXISTS fcc_carrier_registrations ( + id BIGSERIAL PRIMARY KEY, + order_number TEXT NOT NULL UNIQUE, -- FCR-YYYY-XXXXX + + -- Customer + customer_email TEXT NOT NULL, + customer_name TEXT NOT NULL, + customer_phone TEXT, + + -- Entity choice + entity_source TEXT NOT NULL CHECK (entity_source IN ('existing', 'new_formation')), + telecom_entity_id INTEGER, + formation_order_number TEXT, + + -- Entity info (populated from either source) + entity_legal_name TEXT, + entity_type TEXT, + formation_state CHAR(2), + ein TEXT, + frn TEXT, + filer_id_499 TEXT, + + -- Contact / Officer + contact_name TEXT, + contact_email TEXT, + contact_phone TEXT, + contact_title TEXT, + address_street TEXT, + address_city TEXT, + address_state CHAR(2), + address_zip TEXT, + + -- Service wizard answers (JSONB for flexibility) + service_wizard JSONB NOT NULL DEFAULT '{}'::jsonb, + -- e.g. { service_types: ["voice","broadband"], voice_delivery: "reseller", + -- needs_lcr: true, broadband_type: "facilities_based", operating_states: 5 } + + -- Service configuration (derived from wizard + confirmation) + include_formation BOOLEAN NOT NULL DEFAULT FALSE, + include_dc_agent BOOLEAN NOT NULL DEFAULT TRUE, + include_rmd BOOLEAN NOT NULL DEFAULT FALSE, + include_cpni BOOLEAN NOT NULL DEFAULT FALSE, + include_calea BOOLEAN NOT NULL DEFAULT FALSE, + include_bdc BOOLEAN NOT NULL DEFAULT FALSE, + include_stir_shaken BOOLEAN NOT NULL DEFAULT FALSE, + include_ocn BOOLEAN NOT NULL DEFAULT FALSE, + state_puc_states TEXT[] DEFAULT '{}', + + -- Pipeline status + status TEXT NOT NULL DEFAULT 'received' CHECK (status IN ( + 'received', + 'awaiting_formation', + 'formation_complete', + 'cores_registration', + 'form_499_initial', + 'state_registrations', + 'compliance_filings', + 'review', + 'delivered', + 'cancelled' + )), + + -- Pricing (cents) + service_fee_cents INTEGER NOT NULL DEFAULT 129900, + formation_fee_cents INTEGER NOT NULL DEFAULT 0, + state_fee_cents INTEGER NOT NULL DEFAULT 0, + puc_fee_cents INTEGER NOT NULL DEFAULT 0, + addon_fee_cents INTEGER NOT NULL DEFAULT 0, + discount_cents INTEGER NOT NULL DEFAULT 0, + discount_code TEXT, + + -- Payment + payment_status TEXT NOT NULL DEFAULT 'pending_payment' + CHECK (payment_status IN ('pending_payment','paid','refunded','cancelled')), + payment_method TEXT, + stripe_session_id TEXT, + paid_at TIMESTAMPTZ, + + -- ERPNext + erpnext_sales_order TEXT, + + -- Pipeline tracking (idempotency timestamps) + formation_completed_at TIMESTAMPTZ, + cores_completed_at TIMESTAMPTZ, + frn_obtained TEXT, + form_499_completed_at TIMESTAMPTZ, + filer_id_obtained TEXT, + dc_agent_completed_at TIMESTAMPTZ, + state_puc_completed_at TIMESTAMPTZ, + rmd_completed_at TIMESTAMPTZ, + cpni_completed_at TIMESTAMPTZ, + calea_completed_at TIMESTAMPTZ, + bdc_completed_at TIMESTAMPTZ, + stir_shaken_completed_at TIMESTAMPTZ, + ocn_completed_at TIMESTAMPTZ, + + -- Engagement + engagement_accepted_at TIMESTAMPTZ, + engagement_accepted_ip TEXT, + + -- Timestamps + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_fcr_customer_email ON fcc_carrier_registrations(customer_email); +CREATE INDEX IF NOT EXISTS idx_fcr_status ON fcc_carrier_registrations(status) WHERE status NOT IN ('delivered','cancelled'); +CREATE INDEX IF NOT EXISTS idx_fcr_formation ON fcc_carrier_registrations(formation_order_number) WHERE formation_order_number IS NOT NULL; + +-- Updated_at trigger +CREATE OR REPLACE FUNCTION set_updated_at_fcr() RETURNS trigger AS $$ +BEGIN NEW.updated_at = NOW(); RETURN NEW; END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS trg_fcr_updated_at ON fcc_carrier_registrations; +CREATE TRIGGER trg_fcr_updated_at + BEFORE UPDATE ON fcc_carrier_registrations + FOR EACH ROW EXECUTE FUNCTION set_updated_at_fcr(); + +COMMIT; diff --git a/site/public/order/fcc-carrier-registration/index.html b/site/public/order/fcc-carrier-registration/index.html new file mode 100644 index 0000000..0902d01 --- /dev/null +++ b/site/public/order/fcc-carrier-registration/index.html @@ -0,0 +1,754 @@ + + +
+ + + + +Start your telecom carrier or ISP from scratch. We handle all federal and state registrations based on the services you plan to offer.
+ +Tell us what you plan to do and we'll determine exactly which registrations you need.
+ + +What type of service will you offer?
+Select all that apply.
+ + + +How will you deliver voice service?
+ + + + +Will you need any of these?
+Check all that apply. These determine whether you need your own OCN and STIR/SHAKEN certificate.
+ + + + + +How will you provide internet service?
+ + + + +Where will you operate?
+ + + +