new-site/api/migrations/067_us_state_compliance_configs.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

99 lines
7.7 KiB
PL/PgSQL

-- 067_us_state_compliance_configs.sql
--
-- Annual report fees, due dates, and franchise tax info for all 51 US
-- jurisdictions. Read by the renewal_worker to create compliance
-- calendar entries for formation clients.
BEGIN;
CREATE TABLE IF NOT EXISTS state_compliance_obligations (
id SERIAL PRIMARY KEY,
state_code CHAR(2) NOT NULL,
obligation_type TEXT NOT NULL CHECK (obligation_type IN (
'annual_report', 'franchise_tax', 'biennial_report',
'business_license', 'registered_agent'
)),
fee_cents INTEGER NOT NULL DEFAULT 0,
fee_notes TEXT, -- "min $50, max $15,000" etc.
frequency TEXT NOT NULL DEFAULT 'annual'
CHECK (frequency IN ('annual', 'biennial', 'quarterly', 'none')),
due_description TEXT, -- "April 15" or "anniversary month"
due_month INTEGER, -- 1-12 if fixed month; NULL if anniversary
due_day INTEGER, -- 1-31 if fixed day
is_anniversary BOOLEAN NOT NULL DEFAULT FALSE, -- due relative to formation date
state_portal_url TEXT,
notes TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE (state_code, obligation_type)
);
-- Seed annual report obligations for all 51 US jurisdictions.
-- Source: docs/annual-report-fees-by-state.md (LLC University + state SOS cross-ref)
INSERT INTO state_compliance_obligations
(state_code, obligation_type, fee_cents, fee_notes, frequency, due_description, due_month, due_day, is_anniversary, notes)
VALUES
('AL', 'annual_report', 5000, 'Min $50, scales with net worth up to $15,000', 'annual', 'April 15', 4, 15, FALSE, 'Called "Business Privilege Tax"'),
('AK', 'biennial_report', 10000, '$100 biennial', 'biennial', 'January 2 of even years', 1, 2, FALSE, NULL),
('AZ', 'annual_report', 0, NULL, 'none', NULL, NULL, NULL, FALSE, 'No annual report required for LLCs'),
('AR', 'franchise_tax', 15000, NULL, 'annual', 'May 1', 5, 1, FALSE, 'Called "Franchise Tax Report"'),
('CA', 'franchise_tax', 80000, '$800 franchise tax minimum', 'annual', 'April 15', 4, 15, FALSE, 'Additional fee if gross revenue > $250k'),
('CA', 'biennial_report', 2000, '$20 biennial Statement of Information', 'biennial', 'Anniversary month', NULL, NULL, TRUE, NULL),
('CO', 'annual_report', 2500, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, 'Due within 5-month window around anniversary'),
('CT', 'annual_report', 8000, NULL, 'annual', 'March 31', 3, 31, FALSE, NULL),
('DC', 'biennial_report', 30000, '$300 biennial', 'biennial', 'April 1', 4, 1, FALSE, NULL),
('DE', 'franchise_tax', 30000, NULL, 'annual', 'June 1', 6, 1, FALSE, '$300/yr LLC franchise tax'),
('FL', 'annual_report', 13875, NULL, 'annual', 'May 1', 5, 1, FALSE, NULL),
('GA', 'annual_report', 6000, NULL, 'annual', 'April 1', 4, 1, FALSE, 'Called "Annual Registration"'),
('HI', 'annual_report', 1500, NULL, 'annual', 'Anniversary quarter', NULL, NULL, TRUE, NULL),
('ID', 'annual_report', 0, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, 'Must file information report but no fee'),
('IL', 'annual_report', 7500, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, NULL),
('IN', 'biennial_report', 3000, '$30 biennial', 'biennial', 'Anniversary month', NULL, NULL, TRUE, NULL),
('IA', 'biennial_report', 3000, '$30 biennial', 'biennial', 'April 1 of odd years', 4, 1, FALSE, NULL),
('KS', 'annual_report', 5000, NULL, 'annual', 'April 15', 4, 15, FALSE, NULL),
('KY', 'annual_report', 1500, NULL, 'annual', 'June 30', 6, 30, FALSE, NULL),
('LA', 'annual_report', 3500, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, NULL),
('ME', 'annual_report', 8500, NULL, 'annual', 'June 1', 6, 1, FALSE, NULL),
('MD', 'annual_report', 30000, NULL, 'annual', 'April 15', 4, 15, FALSE, 'Personal property tax return functions as annual report'),
('MA', 'annual_report', 50000, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, NULL),
('MI', 'annual_report', 2500, NULL, 'annual', 'February 15', 2, 15, FALSE, NULL),
('MN', 'annual_report', 0, NULL, 'annual', 'December 31', 12, 31, FALSE, 'Must file but no fee'),
('MS', 'annual_report', 0, NULL, 'annual', 'April 15', 4, 15, FALSE, 'Must file but no fee'),
('MO', 'annual_report', 0, NULL, 'none', NULL, NULL, NULL, FALSE, 'No annual report required'),
('MT', 'annual_report', 2000, NULL, 'annual', 'April 15', 4, 15, FALSE, NULL),
('NE', 'biennial_report', 1300, '$13 biennial', 'biennial', 'April 1 of odd years', 4, 1, FALSE, NULL),
('NV', 'annual_report', 15000, '$150 Annual List of Members', 'annual', 'Anniversary month', NULL, NULL, TRUE, NULL),
('NV', 'business_license', 20000, '$200 State Business License', 'annual', 'Anniversary month', NULL, NULL, TRUE, 'Separate from Annual List'),
('NH', 'annual_report', 10000, NULL, 'annual', 'April 1', 4, 1, FALSE, NULL),
('NJ', 'annual_report', 7500, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, NULL),
('NM', 'annual_report', 0, NULL, 'none', NULL, NULL, NULL, FALSE, 'No annual report required'),
('NY', 'biennial_report', 900, '$9 biennial', 'biennial', 'Anniversary month', NULL, NULL, TRUE, NULL),
('NC', 'annual_report', 20000, NULL, 'annual', 'April 15', 4, 15, FALSE, NULL),
('ND', 'annual_report', 5000, NULL, 'annual', 'November 15', 11, 15, FALSE, NULL),
('OH', 'annual_report', 0, NULL, 'none', NULL, NULL, NULL, FALSE, 'No annual report required'),
('OK', 'annual_report', 2500, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, 'Called "Annual Certificate"'),
('OR', 'annual_report', 10000, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, NULL),
('PA', 'annual_report', 700, NULL, 'annual', 'September 30', 9, 30, FALSE, 'New requirement starting 2025'),
('RI', 'annual_report', 5000, NULL, 'annual', 'Between February 1 and May 1', 5, 1, FALSE, NULL),
('SC', 'annual_report', 0, NULL, 'none', NULL, NULL, NULL, FALSE, 'No annual report for standard LLCs'),
('SD', 'annual_report', 5500, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, NULL),
('TN', 'annual_report', 30000, 'Min $300 ($300/member, max $3,000)', 'annual', 'Anniversary month', NULL, NULL, TRUE, NULL),
('TX', 'franchise_tax', 0, '$0 for most LLCs (< $2.47M revenue)', 'annual', 'May 15', 5, 15, FALSE, 'Must file Public Information Report regardless'),
('UT', 'annual_report', 1800, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, 'Called "Annual Renewal"'),
('VT', 'annual_report', 4500, NULL, 'annual', 'March 15', 3, 15, FALSE, NULL),
('VA', 'annual_report', 5000, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, 'Called "Annual Registration Fee"'),
('WA', 'annual_report', 6000, NULL, 'annual', 'Anniversary month', NULL, NULL, TRUE, NULL),
('WV', 'annual_report', 2500, NULL, 'annual', 'July 1', 7, 1, FALSE, NULL),
('WI', 'annual_report', 2500, NULL, 'annual', 'Anniversary quarter', NULL, NULL, TRUE, NULL),
('WY', 'annual_report', 6000, 'Min $60, scales with WY assets', 'annual', 'Anniversary month', NULL, NULL, TRUE, NULL)
ON CONFLICT (state_code, obligation_type) DO UPDATE SET
fee_cents = EXCLUDED.fee_cents,
fee_notes = EXCLUDED.fee_notes,
frequency = EXCLUDED.frequency,
due_description = EXCLUDED.due_description,
due_month = EXCLUDED.due_month,
due_day = EXCLUDED.due_day,
is_anniversary = EXCLUDED.is_anniversary,
notes = EXCLUDED.notes;
COMMIT;