50-state trucking compliance: services, checker, order page, CA landing

- Migration 079: state_trucking_requirements table seeded for all 51 jurisdictions
  (IRP, IFTA, weight-distance taxes, MCP/CARB, intrastate authority, state DOT)
- Migration 080: carrier_operating_states tracking table
- 13 new state trucking services in catalog ($99-$599)
- StateTruckingHandler with state-specific admin todos
- DOT compliance checker: 7 new state-level checks (IRP, IFTA, weight tax,
  MCP/CARB, emissions, intrastate authority, state DOT number)
- New API endpoint: GET /api/v1/dot/state-requirements
- DOT order page: state compliance service cards with auto-preselect
- California trucking landing page (MCP + CARB + IRP + IFTA)
- Fix: DOT checker nav missing Trucking/DOT section
- Fix: All 8 DOT intake pages missing style block (dangling text)
- Fix: DOT confirmation email now says "Order Confirmed" not "Action Required"
- Fix: MCS150/BOC3/StateTrucking handlers missing async process() method
- Fix: StateTruckingHandler connection leak + slug resolution

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
justin 2026-05-29 12:46:33 -05:00
parent c80f3a408a
commit 33da00fd89
21 changed files with 2078 additions and 14 deletions

View file

@ -42,11 +42,14 @@ from datetime import datetime
LOG = logging.getLogger("workers.services.boc3_filing")
# Process agent partner details — update when partnership is established
# Process agent partner details
# NWRA (Northwest Registered Agent) confirmed they no longer offer BOC-3.
# Registered Agents Inc is the replacement vendor (contract pending).
# Wholesale cost: ~$25 or less. Manual fulfillment until API is available.
PROCESS_AGENT_PARTNER = {
"name": "TBD — NWRA or similar",
"contact_email": "",
"api_endpoint": None, # Will be set when partner API is available
"name": "Registered Agents Inc",
"contact_email": "", # Update when contract is executed
"api_endpoint": None, # Will be set when RAI API is available
}
@ -56,6 +59,11 @@ class BOC3FilingHandler:
SERVICE_SLUG = "boc3-filing"
SERVICE_NAME = "BOC-3 Process Agent Filing"
async def process(self, order_data: dict) -> list[str]:
"""Entry point called by job_server. Delegates to handle()."""
order_number = order_data.get("order_number", order_data.get("name", ""))
return self.handle(order_data, order_number)
def handle(self, order_data: dict, order_number: str) -> list[str]:
"""
Process a BOC-3 filing order.