From 37a22cf4746d4d3dee828a1174c3e6eb55bc5611 Mon Sep 17 00:00:00 2001 From: justin Date: Mon, 4 May 2026 09:10:50 -0500 Subject: [PATCH] =?UTF-8?q?Delete=20499-A=20checklist=20generator=20?= =?UTF-8?q?=E2=80=94=20intake=20wizard=20handles=20data=20collection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The checklist was a manual-process artifact that listed what info the client needed to gather. Since all data is now collected through the intake wizard and CDR upload, the checklist is unnecessary. Removed from the 499-A handler's prep packet and deleted the 1,326-line generator file. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../templates/fcc_499a_checklist_generator.py | 1326 ----------------- scripts/workers/services/form_499a.py | 32 - 2 files changed, 1358 deletions(-) delete mode 100644 scripts/document_gen/templates/fcc_499a_checklist_generator.py diff --git a/scripts/document_gen/templates/fcc_499a_checklist_generator.py b/scripts/document_gen/templates/fcc_499a_checklist_generator.py deleted file mode 100644 index 935a9d6..0000000 --- a/scripts/document_gen/templates/fcc_499a_checklist_generator.py +++ /dev/null @@ -1,1326 +0,0 @@ -""" -Generate the FCC Form 499-A Filing Preparation Checklist. - -Produces a pre-filled checklist based on the carrier's classification -(filer type, infrastructure type, service categories, de minimis / LIRE -status, VoIP safe harbor election, and revenue details) that tells the -carrier exactly which parts of the 499-A apply to them and what data to -gather. - -This is NOT a 499-A filing — it's a preparation guide. - -Usage: - from scripts.document_gen.templates.fcc_499a_checklist_generator import ( - generate_499a_checklist, - ) - path = generate_499a_checklist( - entity_name="Falcon Broadband LLC", - frn="0027160886", - filer_type="interconnected_voip", - infra_type="facilities", - service_categories=["interconnected_voip", "long_distance"], - is_deminimis=False, - contribution_factor_pct=35.8, - uses_voip_safe_harbor=True, - output_path="/tmp/499a_checklist.docx", - ) -""" -from __future__ import annotations - -import logging -from datetime import datetime -from pathlib import Path -from typing import Optional - -LOG = logging.getLogger("document_gen.fcc_499a_checklist") - -try: - from docx import Document - from docx.shared import Pt, Inches, RGBColor, Emu - from docx.enum.text import WD_ALIGN_PARAGRAPH - from docx.enum.table import WD_TABLE_ALIGNMENT - from docx.oxml.ns import qn, nsdecls - from docx.oxml import parse_xml -except ImportError: - LOG.warning("python-docx not installed — 499-A checklist generation unavailable") - Document = None - - -# ── Constants ─────────────────────────────────────────────────────── - -NAVY = RGBColor(0x1A, 0x27, 0x44) -DARK_GRAY = RGBColor(0x33, 0x33, 0x33) -MEDIUM_GRAY = RGBColor(0x66, 0x66, 0x66) -LIGHT_GRAY_BG = "F2F4F7" # for info-box shading -WHITE = RGBColor(0xFF, 0xFF, 0xFF) - -CHECK_EMPTY = "\u2610" -CHECK_FILLED = "\u2611" - -# De minimis threshold: $10,000 in combined interstate + international -# end-user telecom revenue. -DE_MINIMIS_THRESHOLD_CENTS = 10_000_00 - -# LIRE threshold: 12% of total end-user telecom revenue from -# international services. -LIRE_THRESHOLD_PCT = 12.0 - - -# ── Service category labels ──────────────────────────────────────── - -_CATEGORY_LABELS = { - "interconnected_voip": "Interconnected VoIP", - "non_interconnected_voip": "Non-Interconnected VoIP", - "local_exchange": "Local Exchange Service", - "long_distance": "Long Distance / Interexchange", - "wireless": "Wireless / CMRS", - "dedicated_line": "Dedicated Line / Private Line", - "resale": "Resale Services", - "other_telecom": "Other Telecommunications Services", - "toll_free": "Toll Free / 8XX Service", - "payphone": "Payphone Service", - "une": "Unbundled Network Elements (UNE)", -} - - -# ── Revenue line mappings by infrastructure type ─────────────────── -# -# Block labels verified against the 2026 Form 499-A (November 2025 release, -# reporting 2025 revenues). The 2025/2026 form structure is identical: -# Block 3 = Carrier's Carrier Revenue (Lines 301–315) — revenues from -# sales to other contributing carriers for resale -# Block 4-A = End-User and Non-Telecom Revenue (Lines 401–418) -# Block 4-B = Total Revenue + Uncollectibles (Lines 419–423) -# Block 5 = Regional percentage breakouts + TRS contribution base -# + reseller exclusions (Lines 501–514) — NOT a revenue bucket -# -# Resale revenue = reseller selling to end-users goes on Block 4-A line 418.x -# (bundled); there is no "Block 5 resale" bucket on the form. - -_REVENUE_LINES = { - "facilities": { - "sections": [ - "Block 3: Carrier\u2019s Carrier Revenue (Lines 301\u2013315)", - "Block 4-A: End-User and Non-Telecom Revenue (Lines 401\u2013418)", - "Block 4-B: Total Revenue and Uncollectible Revenue (Lines 419\u2013423)", - "Block 5: Additional Revenue Breakouts and Regional Percentages (Lines 501\u2013514)", - ], - "description": ( - "As a facilities-based provider, report revenues from sales to " - "other contributing carriers in Block 3 (Lines 301\u2013315), and " - "end-user + non-telecom revenues in Block 4-A (Lines 401\u2013418). " - "Totals and uncollectibles go in Block 4-B. Block 5 is regional " - "percentage breakouts + TRS contribution base \u2014 not a revenue bucket." - ), - }, - "reseller": { - "sections": [ - "Block 4-A: End-User and Non-Telecom Revenue (Lines 401\u2013418)", - "Block 4-B: Total Revenue and Uncollectible Revenue (Lines 419\u2013423)", - "Block 5: Additional Revenue Breakouts and Regional Percentages (Lines 501\u2013514)", - ], - "description": ( - "As a reseller selling to end-users, report all revenues in " - "Block 4-A (Lines 401\u2013418). You may deduct resold service costs " - "(amounts paid to your upstream contributing provider) from gross " - "revenues via Lines 511/513 in Block 5 (reseller exclusions)." - ), - }, - "both": { - "sections": [ - "Block 3: Carrier\u2019s Carrier Revenue (Lines 301\u2013315)", - "Block 4-A: End-User and Non-Telecom Revenue (Lines 401\u2013418)", - "Block 4-B: Total Revenue and Uncollectible Revenue (Lines 419\u2013423)", - "Block 5: Additional Revenue Breakouts and Regional Percentages (Lines 501\u2013514)", - ], - "description": ( - "As a facilities-based provider that also resells, report sales " - "to other contributing carriers in Block 3, and end-user + resold-" - "to-end-user revenues in Block 4-A." - ), - }, -} - - -def generate_499a_checklist( - # Entity identity - entity_name: str, - frn: str = "", - filer_id_499: str = "", - # Block 1 — identifying info beyond legal name - dba_name: str = "", # Line 104 - ein: str = "", # Line 103 - trade_names: list[str] | None = None, # Line 112 - affiliated_filer_name: str = "", # Line 106.1 - affiliated_filer_ein: str = "", # Line 106.2 - management_company_name: str = "", # Line 108 - # Address (Line 109 corporate HQ) - address_street: str = "", - address_city: str = "", - address_state: str = "", - address_zip: str = "", - # Block 2-A — regulatory contact / worksheet correspondence / billing - regulatory_contact_name: str = "Justin Hannah", # Line 203 - regulatory_contact_email: str = "filings@performancewest.net", - regulatory_contact_phone: str = "888-411-0383", - worksheet_office_company: str = "Performance West Inc", # Line 207 - worksheet_office_street: str = "30 N Gould St, Ste N", - worksheet_office_city: str = "Sheridan", - worksheet_office_state: str = "WY", - worksheet_office_zip: str = "82801", - billing_contact_name: str = "", # Line 208 - billing_contact_email: str = "", - itsp_regulatory_fee_email: str = "", # Line 208.1 - # Block 2-B — D.C. Agent (defaults to Northwest Registered Agent) - dc_agent_company: str = "Northwest Registered Agent Service Inc.", - dc_agent_street: str = "1717 N Street NW STE 1", - dc_agent_city: str = "Washington", - dc_agent_state: str = "DC", - dc_agent_zip: str = "20036", - dc_agent_phone: str = "509-768-2249", - dc_agent_email: str = "support@northwestregisteredagent.com", - # Block 2-C — Officers + jurisdictions + first service (Lines 221-228) - officer_1_name: str = "", officer_1_title: str = "Chief Executive Officer", - officer_1_street: str = "", officer_1_city: str = "", - officer_1_state: str = "", officer_1_zip: str = "", - officer_2_name: str = "", officer_2_title: str = "", - officer_2_street: str = "", officer_2_city: str = "", - officer_2_state: str = "", officer_2_zip: str = "", - officer_3_name: str = "", officer_3_title: str = "", - officer_3_street: str = "", officer_3_city: str = "", - officer_3_state: str = "", officer_3_zip: str = "", - jurisdictions_served: list[str] | None = None, # Line 227 - first_telecom_service_year: int = 0, # Line 228 - first_telecom_service_month: int = 0, - first_telecom_service_pre_1999: bool = False, - # Block 6 — exemptions + filing type - exempt_usf: bool = False, # Line 603 - exempt_trs: bool = False, - exempt_nanpa: bool = False, - exempt_lnp: bool = False, - exemption_explanation: str = "", - is_state_local_gov: bool = False, # Line 604 - is_tax_exempt_501c: bool = False, - filing_type: str = "original", # Line 612 - # Alternative Billing Arrangements Worksheet (Page 9, optional) - use_alt_billing: bool = False, - alt_billing_trs: dict | None = None, - alt_billing_nanp: dict | None = None, - alt_billing_lnp: dict | None = None, - alt_billing_fcc: dict | None = None, - # Classification - filer_type: str = "interconnected_voip", - infra_type: str = "facilities", - service_categories: list[str] | None = None, - is_deminimis: bool = False, - is_lire: bool = False, - # Revenue (if known) - total_revenue_cents: int = 0, - interstate_pct: float = 0, - international_pct: float = 0, - last_filing_year: int = 0, - # USF contribution - contribution_factor_pct: float = 0.0, - # VoIP safe harbor - uses_voip_safe_harbor: bool = False, - voip_safe_harbor_pct: float = 64.9, - # Deductions - uncollectible_revenue_cents: int = 0, - resold_service_costs_cents: int = 0, - # Red Light Rule - has_outstanding_fcc_debt: bool = False, - # Output - output_path: str = "/tmp/fcc_499a_checklist.docx", -) -> Optional[str]: - """ - Generate a Form 499-A Filing Preparation Checklist as a DOCX file. - - Returns the output file path on success, None on failure. - """ - if Document is None: - LOG.error("python-docx not installed") - return None - - categories = service_categories or [] - trade_names = trade_names or [] - jurisdictions_served = jurisdictions_served or [] - filing_year = datetime.now().year - today = datetime.now().strftime("%B %d, %Y") - doc = Document() - - # ── Page setup ─────────────────────────────────────────────── - for section in doc.sections: - section.top_margin = Inches(0.8) - section.bottom_margin = Inches(0.8) - section.left_margin = Inches(1.0) - section.right_margin = Inches(1.0) - - # ── Style defaults ─────────────────────────────────────────── - style = doc.styles["Normal"] - style.font.size = Pt(10) - style.font.color.rgb = DARK_GRAY - style.paragraph_format.space_after = Pt(2) - style.paragraph_format.space_before = Pt(0) - - # ── Helpers ────────────────────────────────────────────────── - - def _heading(text: str, level: int = 1) -> None: - p = doc.add_paragraph() - p.paragraph_format.space_before = Pt(14 if level == 1 else 8) - p.paragraph_format.space_after = Pt(4) - run = p.add_run(text) - run.font.size = Pt(14 if level == 1 else 11) - run.bold = True - run.font.color.rgb = NAVY - - def _para(text: str, size: int = 10, bold: bool = False, - color: RGBColor = DARK_GRAY, italic: bool = False, - space_after: int = 2) -> None: - p = doc.add_paragraph() - p.paragraph_format.space_after = Pt(space_after) - run = p.add_run(text) - run.font.size = Pt(size) - run.bold = bold - run.font.color.rgb = color - run.italic = italic - - def _checkbox(text: str, checked: bool = False) -> None: - p = doc.add_paragraph() - p.paragraph_format.space_after = Pt(1) - p.paragraph_format.left_indent = Inches(0.25) - mark = CHECK_FILLED if checked else CHECK_EMPTY - run = p.add_run(f" {mark} {text}") - run.font.size = Pt(10) - run.font.color.rgb = DARK_GRAY - - def _info_box(text: str) -> None: - """Render a light-gray shaded info/guidance box.""" - p = doc.add_paragraph() - p.paragraph_format.space_before = Pt(4) - p.paragraph_format.space_after = Pt(6) - p.paragraph_format.left_indent = Inches(0.25) - p.paragraph_format.right_indent = Inches(0.25) - # Apply shading to the paragraph - shading = parse_xml( - f'' - ) - p.paragraph_format.element.get_or_add_pPr().append(shading) - run = p.add_run(f" {text}") - run.font.size = Pt(9) - run.font.color.rgb = MEDIUM_GRAY - run.italic = True - - def _spacer() -> None: - p = doc.add_paragraph() - p.paragraph_format.space_before = Pt(0) - p.paragraph_format.space_after = Pt(0) - run = p.add_run("") - run.font.size = Pt(4) - - def _add_table(headers: list[str], rows: list[list[str]], - col_widths: list[float] | None = None) -> None: - """Add a formatted table.""" - table = doc.add_table(rows=1 + len(rows), cols=len(headers)) - table.alignment = WD_TABLE_ALIGNMENT.CENTER - table.autofit = True - - # Header row - for i, header in enumerate(headers): - cell = table.rows[0].cells[i] - cell.text = "" - p = cell.paragraphs[0] - run = p.add_run(header) - run.bold = True - run.font.size = Pt(9) - run.font.color.rgb = WHITE - p.alignment = WD_ALIGN_PARAGRAPH.CENTER - shading = parse_xml( - f'' - ) - cell._tc.get_or_add_tcPr().append(shading) - - # Data rows - for r_idx, row_data in enumerate(rows): - for c_idx, cell_text in enumerate(row_data): - cell = table.rows[r_idx + 1].cells[c_idx] - cell.text = "" - p = cell.paragraphs[0] - run = p.add_run(cell_text) - run.font.size = Pt(9) - run.font.color.rgb = DARK_GRAY - # Alternate row shading - if r_idx % 2 == 0: - shading = parse_xml( - f'' - ) - cell._tc.get_or_add_tcPr().append(shading) - - # Set column widths if provided - if col_widths: - for row in table.rows: - for i, width in enumerate(col_widths): - if i < len(row.cells): - row.cells[i].width = Inches(width) - - def _fmt_dollars(cents: int) -> str: - return f"${cents / 100:,.2f}" - - def _add_page_number_footer() -> None: - """Add page numbers to the footer.""" - for section in doc.sections: - footer = section.footer - footer.is_linked_to_previous = False - p = footer.paragraphs[0] if footer.paragraphs else footer.add_paragraph() - p.alignment = WD_ALIGN_PARAGRAPH.CENTER - # Page number field - run = p.add_run() - fld_char_begin = parse_xml( - f'' - ) - run._r.append(fld_char_begin) - run2 = p.add_run() - instr = parse_xml( - f' PAGE ' - ) - run2._r.append(instr) - run3 = p.add_run() - fld_char_end = parse_xml( - f'' - ) - run3._r.append(fld_char_end) - for r in [run, run2, run3]: - r.font.size = Pt(8) - r.font.color.rgb = MEDIUM_GRAY - - # ── Page numbers ───────────────────────────────────────────── - _add_page_number_footer() - - # ── Header / Title Block ───────────────────────────────────── - title_p = doc.add_paragraph() - title_p.alignment = WD_ALIGN_PARAGRAPH.CENTER - title_p.paragraph_format.space_after = Pt(2) - title_run = title_p.add_run("FCC Form 499-A") - title_run.font.size = Pt(18) - title_run.bold = True - title_run.font.color.rgb = NAVY - - subtitle_p = doc.add_paragraph() - subtitle_p.alignment = WD_ALIGN_PARAGRAPH.CENTER - subtitle_p.paragraph_format.space_after = Pt(2) - sub_run = subtitle_p.add_run("Filing Preparation Checklist") - sub_run.font.size = Pt(14) - sub_run.bold = True - sub_run.font.color.rgb = NAVY - - # Confidential subtitle - conf_p = doc.add_paragraph() - conf_p.alignment = WD_ALIGN_PARAGRAPH.CENTER - conf_p.paragraph_format.space_after = Pt(6) - conf_run = conf_p.add_run("CONFIDENTIAL \u2014 FILING PREPARATION") - conf_run.font.size = Pt(9) - conf_run.bold = True - conf_run.font.color.rgb = MEDIUM_GRAY - conf_run.font.all_caps = True - - # Entity name and date - entity_p = doc.add_paragraph() - entity_p.alignment = WD_ALIGN_PARAGRAPH.CENTER - entity_p.paragraph_format.space_after = Pt(1) - er = entity_p.add_run(entity_name) - er.font.size = Pt(13) - er.bold = True - er.font.color.rgb = DARK_GRAY - - date_p = doc.add_paragraph() - date_p.alignment = WD_ALIGN_PARAGRAPH.CENTER - date_p.paragraph_format.space_after = Pt(2) - dr = date_p.add_run(f"Prepared: {today}") - dr.font.size = Pt(10) - dr.font.color.rgb = MEDIUM_GRAY - - _spacer() - - # ── Red Light Rule Warning ─────────────────────────────────── - if has_outstanding_fcc_debt: - warn_p = doc.add_paragraph() - warn_p.paragraph_format.space_before = Pt(6) - warn_p.paragraph_format.space_after = Pt(6) - warn_p.paragraph_format.left_indent = Inches(0.25) - warn_p.paragraph_format.right_indent = Inches(0.25) - shading = parse_xml( - f'' - ) - warn_p.paragraph_format.element.get_or_add_pPr().append(shading) - warn_run = warn_p.add_run( - "\u26a0 RED LIGHT RULE WARNING: This entity has outstanding " - "FCC debt on record. Under the Red Light Rule (47 C.F.R. " - "\u00a7 1.1910), entities with delinquent debts owed to the FCC " - "cannot receive new authorizations, licenses, or other benefits " - "until the debt is resolved. Contact the FCC immediately to " - "arrange payment or a payment plan before filing." - ) - warn_run.font.size = Pt(9) - warn_run.bold = True - warn_run.font.color.rgb = RGBColor(0xB7, 0x1C, 0x1C) - _spacer() - - # ── Introduction ───────────────────────────────────────────── - _para( - "This checklist identifies the sections of FCC Form 499-A that apply " - "to your filing based on your carrier classification. Use it to gather " - "the required data before filing electronically via the USAC E-File " - "system (https://forms.universalservice.org). This is a preparation " - "guide, not a filing submission.", - size=9, - color=MEDIUM_GRAY, - ) - - _info_box( - "E-FILE REQUIREMENT: FCC Form 499-A must be filed electronically " - "through the USAC E-File portal. Paper filings are not accepted. " - "Ensure you have valid E-File credentials before the filing deadline." - ) - - # ── Quick Reference Summary Table ──────────────────────────── - _heading("Quick Reference Summary") - - filer_label = _CATEGORY_LABELS.get(filer_type, filer_type.replace("_", " ").title()) - infra_label = { - "facilities": "Facilities-Based", - "reseller": "Reseller", - "both": "Facilities-Based + Reseller", - }.get(infra_type, infra_type.title()) - - de_minimis_label = "Yes" if is_deminimis else "No" - lire_label = "Yes" if is_lire else "No" - quarterly_required = "No (de minimis exempt)" if is_deminimis else "Yes" - - summary_rows = [ - ["Entity Name", entity_name], - ["FRN", frn or "Not provided"], - ["499 Filer ID", filer_id_499 or "Not provided"], - ["Primary Filer Type", filer_label], - ["Infrastructure Type", infra_label], - ["De Minimis", de_minimis_label], - ["LIRE", lire_label], - ["499-A Due Date", f"April 1, {filing_year}"], - ["499-Q Required", quarterly_required], - ] - if contribution_factor_pct > 0: - summary_rows.append( - ["USF Contribution Factor", f"{contribution_factor_pct:.1f}%"] - ) - if uses_voip_safe_harbor: - summary_rows.append( - ["VoIP Safe Harbor", f"Yes ({voip_safe_harbor_pct:.1f}% interstate)"] - ) - if total_revenue_cents > 0: - summary_rows.append( - ["Total Revenue (Prior Year)", _fmt_dollars(total_revenue_cents)] - ) - - _add_table(["Field", "Value"], summary_rows, col_widths=[2.5, 4.0]) - _spacer() - - # ── Section 1: Filer Identification (Block 1) ──────────────── - _heading("1. Filer Identification (Block 1)") - - _info_box( - "Block 1 of Form 499-A collects basic identifying information. " - "All fields must match your FCC Registration Number (FRN) record " - "in CORES. File via USAC E-File at https://forms.universalservice.org." - ) - - _checkbox(f"Legal Name: {entity_name}", checked=bool(entity_name)) - _checkbox(f"FRN: {frn or '_______________'}", checked=bool(frn)) - _checkbox( - f"499 Filer ID: {filer_id_499 or '_______________'}", - checked=bool(filer_id_499), - ) - - addr = ", ".join( - filter(None, [address_street, address_city, address_state, address_zip]) - ) - _checkbox( - f"Principal Address: {addr or '_______________'}", - checked=bool(addr.strip(", ")), - ) - - # Block 1 identifying lines beyond the legal name - _checkbox(f"IRS EIN (Line 103): {ein or '_______________'}", checked=bool(ein)) - _checkbox(f"DBA name (Line 104): {dba_name or '_______________'}", checked=bool(dba_name)) - _checkbox("Contact Name: _______________", checked=False) - _checkbox("Contact Phone: _______________", checked=False) - _checkbox("Contact Email: _______________", checked=False) - _checkbox("USAC E-File login credentials verified", checked=False) - - # Line 106 — affiliated filer / holding company - if affiliated_filer_name or affiliated_filer_ein: - _checkbox( - f"Affiliated Filer / Holding Company (Line 106.1): {affiliated_filer_name}", - checked=bool(affiliated_filer_name), - ) - _checkbox( - f"Holding Company EIN (Line 106.2): {affiliated_filer_ein}", - checked=bool(affiliated_filer_ein), - ) - else: - _checkbox( - "Line 106: no affiliated filers (check \u201cno affiliates\u201d on form)", - checked=True, - ) - - # Line 108 — management company (optional) - _checkbox( - f"Management Company (Line 108): {management_company_name or 'N/A'}", - checked=True, - ) - - # Line 112 — trade names used in past 3 years - if trade_names: - _para("Trade Names (Line 112) used in past 3 years:", bold=True) - for tn in trade_names: - _checkbox(tn, checked=True) - else: - _checkbox("Trade Names (Line 112): none \u2014 confirm no prior names", checked=False) - _spacer() - - # ── Section 2: Contacts, Agents & Officers (Block 2) ───────── - _heading("2. Contacts, Agents and Officers (Block 2)") - - # 2-A Regulatory contact (Lines 203-206) - _heading("2-A. Regulatory Contact (Lines 203\u2013206)", level=2) - _para( - "The person who completed the Worksheet. Will be the first point " - "of contact for USAC or FCC inquiries. Defaults to Performance " - "West Inc. when we prepare the filing on the carrier's behalf." - ) - _checkbox(f"Name: {regulatory_contact_name}", checked=bool(regulatory_contact_name)) - _checkbox(f"Phone: {regulatory_contact_phone}", checked=bool(regulatory_contact_phone)) - _checkbox(f"Email: {regulatory_contact_email}", checked=bool(regulatory_contact_email)) - - # Line 207 corporate office for future worksheets - _heading("2-A continued. Corporate Office for Future Worksheets (Line 207)", level=2) - ws_addr = ", ".join(filter(None, [ - worksheet_office_street, worksheet_office_city, - f"{worksheet_office_state} {worksheet_office_zip}".strip(), - ])) - _checkbox(f"Attn: {worksheet_office_company}", checked=bool(worksheet_office_company)) - _checkbox(f"Address: {ws_addr}", checked=bool(ws_addr.strip(", "))) - - # Line 208 billing address + 208.1 ITSP regulatory fee email - _heading("2-A continued. Billing Contact (Lines 208 and 208.1)", level=2) - _para( - "USAC sends USF contribution bills to this address. A separate " - "ITSP regulatory fee email (Line 208.1) may differ from Line 208." - ) - _checkbox( - f"Billing contact name: {billing_contact_name or '_______________'}", - checked=bool(billing_contact_name), - ) - _checkbox( - f"Billing contact email: {billing_contact_email or '_______________'}", - checked=bool(billing_contact_email), - ) - _checkbox( - f"ITSP regulatory fee email (Line 208.1): {itsp_regulatory_fee_email or '(same as Line 208)'}", - checked=True, - ) - _spacer() - - # 2-B D.C. Agent for Service of Process (Lines 209-218) - _heading("2-B. D.C. Agent for Service of Process (Lines 209\u2013213)", level=2) - _para( - "All carriers and VoIP providers must designate a D.C. agent for " - "service of process \u2014 required under 47 U.S.C. \u00a7 413. " - "Performance West provides this via Northwest Registered Agent." - ) - dc_addr = ", ".join(filter(None, [ - dc_agent_street, dc_agent_city, f"{dc_agent_state} {dc_agent_zip}".strip(), - ])) - _checkbox(f"D.C. Agent Company: {dc_agent_company}", checked=True) - _checkbox(f"D.C. Agent Address: {dc_addr}", checked=True) - _checkbox(f"D.C. Agent Phone: {dc_agent_phone}", checked=True) - _checkbox(f"D.C. Agent Email: {dc_agent_email}", checked=True) - _info_box( - "IMPORTANT: If the D.C. Agent contact information changes, you " - "must notify USAC within ONE WEEK. Updates after filing go on a " - "revised Block 2 (Line 612 \u201crevised filing with updated registration\u201d)." - ) - _spacer() - - # 2-C Officers + jurisdictions + first service (Lines 221-228) - _heading("2-C. FCC Registration Information (Lines 219\u2013228)", level=2) - _para( - "An \u201cofficer\u201d for purposes of this filing is an occupant " - "of a position listed in the articles of incorporation, articles " - "of formation, or other similar legal document. Officers on Lines " - "221, 223, and 225 must be three DIFFERENT individuals." - ) - - for idx, (n, t, s, c, st, z) in enumerate([ - (officer_1_name, officer_1_title, officer_1_street, officer_1_city, officer_1_state, officer_1_zip), - (officer_2_name, officer_2_title, officer_2_street, officer_2_city, officer_2_state, officer_2_zip), - (officer_3_name, officer_3_title, officer_3_street, officer_3_city, officer_3_state, officer_3_zip), - ], start=1): - line = 221 + (idx - 1) * 2 - label = {1: "CEO / highest-ranking officer", 2: "Second-ranking officer", - 3: "Third-ranking officer"}[idx] - _para(f"Officer {idx} \u2014 {label} (Line {line})", bold=True) - _checkbox(f"Name: {n or '_______________'}", checked=bool(n)) - if t: - _checkbox(f"Title: {t}", checked=True) - oaddr = ", ".join(filter(None, [s, c, f"{st} {z}".strip()])) - _checkbox( - f"Business address (Line {line+1}): {oaddr or 'same as Line 109'}", - checked=bool(oaddr.strip(", ")), - ) - - # Line 227 — jurisdictions - _para("Jurisdictions where service is/will be provided (Line 227):", bold=True) - if jurisdictions_served: - _checkbox(", ".join(sorted(jurisdictions_served)), checked=True) - else: - _checkbox("_________________ (multi-select on the E-File form)", checked=False) - - # Line 228 — first telecom service year/month - _para("Year and month filer first provided service (Line 228):", bold=True) - if first_telecom_service_pre_1999: - _checkbox("Prior to 1/1/1999 (check pre-1999 box)", checked=True) - elif first_telecom_service_year: - mo = f"{first_telecom_service_month:02d}" if first_telecom_service_month else "__" - _checkbox(f"{first_telecom_service_year}-{mo}", checked=True) - else: - _checkbox("YYYY-MM: ______________", checked=False) - _spacer() - - # ── Section 3: Service Categories (Block 1 / Line 105) ─────── - _heading("3. Service Categories (Line 105)") - - _para( - "Check all service categories that apply to your operations. " - "These determine which revenue lines you must complete and which " - "contribution mechanisms apply to you." - ) - - for slug, label in _CATEGORY_LABELS.items(): - _checkbox(label, checked=(slug in categories)) - - _info_box( - "NON-TELECOM REVENUE: Revenue from services that are not " - "telecommunications or interconnected VoIP (e.g., information " - "services, equipment sales, inside wiring, web hosting, managed " - "IT services) should be EXCLUDED from Form 499-A reporting. Only " - "report revenue from services classified as telecommunications " - "under 47 U.S.C. \u00a7 153(50) or interconnected VoIP under " - "47 C.F.R. \u00a7 9.3." - ) - _spacer() - - # ── Section 3: Revenue Reporting (Blocks 3, 4-A, 4-B, 5) ───── - _heading("4. Revenue Reporting (Blocks 3, 4-A, 4-B, 5)") - - rev_info = _REVENUE_LINES.get(infra_type, _REVENUE_LINES["facilities"]) - _para(rev_info["description"]) - _spacer() - - _para("Applicable revenue blocks:", bold=True) - for block in rev_info["sections"]: - _checkbox(block, checked=True) - _spacer() - - # -- Revenue allocation guidance -- - _heading("4a. Revenue Allocation Methodology", level=2) - - _para( - "Revenue must be allocated into three jurisdictional categories. " - "The allocation method must be consistently applied and supportable." - ) - - _info_box( - "REVENUE ALLOCATION: You must categorize all telecommunications " - "revenue as interstate, intrastate, or international. Acceptable " - "methods include: (1) traffic studies based on actual call records, " - "(2) safe harbor percentages (for eligible VoIP providers), or " - "(3) other reasonable and consistently applied methodologies. " - "Document your allocation method \u2014 USAC may request supporting data." - ) - - _checkbox("Interstate revenue identified and allocated", checked=False) - _checkbox("Intrastate revenue identified (informational only \u2014 " - "not assessed for USF but must be reported)", checked=False) - _checkbox("International revenue identified and allocated", checked=False) - _spacer() - - # -- VoIP safe harbor -- - if uses_voip_safe_harbor or filer_type == "interconnected_voip": - _heading("4b. VoIP Safe Harbor Election", level=2) - - if uses_voip_safe_harbor: - _para( - f"{CHECK_FILLED} VoIP Safe Harbor ELECTED \u2014 " - f"{voip_safe_harbor_pct:.1f}% of VoIP revenue will be " - f"treated as interstate/international and subject to USF " - f"contribution.", - bold=True, - ) - else: - _para( - f"{CHECK_EMPTY} VoIP Safe Harbor NOT elected \u2014 a traffic " - f"study or other allocation method will be used to determine " - f"the interstate/international portion of VoIP revenue." - ) - - _info_box( - f"SAFE HARBOR: Interconnected VoIP providers may elect to treat " - f"{voip_safe_harbor_pct:.1f}% of their VoIP revenue as " - f"interstate/international (the FCC safe harbor percentage) " - f"instead of conducting a traffic study. This election is made " - f"on Form 499-A and applies for the full reporting year. Once " - f"elected, it cannot be changed mid-year." - ) - _spacer() - - # -- Carrier's carrier revenue -- - _heading("4c. Carrier\u2019s Carrier Revenue (Block 3)", level=2) - _para( - "If you provide services to other contributing telecommunications " - "carriers for resale (wholesale), report those revenues in Block 3 " - "(Lines 301\u2013315). This includes revenues from interconnection, " - "transport, termination, and other carrier-to-carrier services." - ) - _checkbox("Carrier\u2019s carrier revenue identified (Block 3)", checked=False) - _spacer() - - # -- UNE revenue -- - if "une" in categories or infra_type in ("facilities", "both"): - _heading("4d. Unbundled Network Element (UNE) Revenue", level=2) - _para( - "Revenue from the sale of unbundled network elements to other " - "contributing carriers is reported in Block 3 (Lines 303.1 and " - "304.2). UNE-Platform (UNE-P) combinations that constitute " - "resale are also Block 3 entries." - ) - _checkbox("UNE revenue identified and categorized", checked=False) - _spacer() - - # -- Revenue deductions -- - _heading("4e. Revenue Deductions", level=2) - - _para("The following deductions may be applied to reduce assessable revenue:") - - # Uncollectibles / bad debt - if uncollectible_revenue_cents > 0: - _checkbox( - f"Uncollectible Revenue / Bad Debt Deduction: " - f"{_fmt_dollars(uncollectible_revenue_cents)}", - checked=True, - ) - else: - _checkbox( - "Uncollectible Revenue / Bad Debt Deduction: $_______", - checked=False, - ) - _info_box( - "UNCOLLECTIBLES: You may deduct revenue that has been billed but " - "determined to be uncollectible (bad debt). This must be based on " - "actual write-offs, not estimates. Report the amount on the " - "applicable deduction line. Previously deducted amounts that are " - "later collected must be added back in the year of collection." - ) - - # Resold service costs - if resold_service_costs_cents > 0: - _checkbox( - f"Resold Service Cost Deduction: " - f"{_fmt_dollars(resold_service_costs_cents)}", - checked=True, - ) - else: - _checkbox( - "Resold Service Cost Deduction: $_______", - checked=False, - ) - _info_box( - "RESOLD SERVICES: If you resell another carrier\u2019s services, " - "you may deduct the amounts paid to the underlying carrier for " - "those services to avoid double-assessment. The upstream carrier " - "is responsible for USF contributions on that revenue. Retain " - "invoices from your upstream provider as supporting documentation." - ) - _spacer() - - # -- Revenue summary table (if data provided) -- - if total_revenue_cents > 0: - _heading("4f. Revenue Summary (Prior Year Data)", level=2) - - interstate_cents = int(total_revenue_cents * interstate_pct / 100) - international_cents = int(total_revenue_cents * international_pct / 100) - intrastate_pct = max(0, 100.0 - interstate_pct - international_pct) - intrastate_cents = int(total_revenue_cents * intrastate_pct / 100) - - gross_assessable = interstate_cents + international_cents - net_assessable = max( - 0, - gross_assessable - uncollectible_revenue_cents - resold_service_costs_cents, - ) - - rev_rows = [ - ["Total Reported Revenue", "100.0%", _fmt_dollars(total_revenue_cents)], - ["Interstate Revenue", f"{interstate_pct:.1f}%", _fmt_dollars(interstate_cents)], - ["International Revenue", f"{international_pct:.1f}%", _fmt_dollars(international_cents)], - ["Intrastate Revenue (informational)", f"{intrastate_pct:.1f}%", _fmt_dollars(intrastate_cents)], - ["", "", ""], - ["Gross Assessable (Interstate + Int'l)", "", _fmt_dollars(gross_assessable)], - ] - if uncollectible_revenue_cents > 0: - rev_rows.append( - ["Less: Uncollectibles", "", f"({_fmt_dollars(uncollectible_revenue_cents)})"] - ) - if resold_service_costs_cents > 0: - rev_rows.append( - ["Less: Resold Service Costs", "", f"({_fmt_dollars(resold_service_costs_cents)})"] - ) - rev_rows.append(["Net Assessable Revenue", "", _fmt_dollars(net_assessable)]) - - _add_table( - ["Description", "Percentage", "Amount"], - rev_rows, - col_widths=[3.2, 1.3, 2.0], - ) - - if last_filing_year: - _para( - f"Based on data from filing year {last_filing_year}.", - size=8, - italic=True, - color=MEDIUM_GRAY, - ) - _spacer() - - # ── Section 4: USF Contribution Calculation ────────────────── - _heading("5. USF Contribution Calculation") - - if contribution_factor_pct > 0: - _para( - f"Current USF Contribution Factor: {contribution_factor_pct:.1f}%", - bold=True, - ) - _para( - "The contribution factor is set quarterly by the FCC and applied " - "to your net assessable interstate and international end-user " - "telecommunications revenue to determine your USF contribution " - "obligation." - ) - - if total_revenue_cents > 0: - interstate_cents = int(total_revenue_cents * interstate_pct / 100) - international_cents = int(total_revenue_cents * international_pct / 100) - gross_assessable = interstate_cents + international_cents - net_assessable = max( - 0, - gross_assessable - - uncollectible_revenue_cents - - resold_service_costs_cents, - ) - estimated_contribution = int( - net_assessable * contribution_factor_pct / 100 - ) - - calc_rows = [ - ["Net Assessable Revenue", _fmt_dollars(net_assessable)], - [ - f"Contribution Factor", - f"\u00d7 {contribution_factor_pct:.1f}%", - ], - [ - "Estimated Quarterly USF Contribution", - _fmt_dollars(estimated_contribution), - ], - ] - _add_table( - ["Component", "Value"], - calc_rows, - col_widths=[3.5, 3.0], - ) - _para( - "Note: This is an estimate based on prior-year revenue and the " - "current contribution factor. Actual contributions are calculated " - "quarterly on Form 499-Q using projected revenues.", - size=8, - italic=True, - color=MEDIUM_GRAY, - ) - else: - _para( - "The USF contribution factor was not provided. The factor is set " - "quarterly by the FCC and published in FCC Public Notices. Apply " - "the current factor to your net assessable interstate and " - "international end-user revenue to estimate your contribution." - ) - - _info_box( - "PASS-THROUGH SURCHARGES: Carriers may (but are not required to) " - "recover USF contribution costs from end-user customers via a " - "line-item surcharge on customer bills. If you pass through the " - "USF charge, it must be labeled clearly (e.g., \u201cFederal Universal " - "Service Fund\u201d or \u201cUSF Surcharge\u201d). The pass-through amount is " - "not itself assessable revenue." - ) - _spacer() - - # ── Section 5: De Minimis / LIRE Classification ────────────── - _heading("6. De Minimis / LIRE Classification") - - # De Minimis - _para("De Minimis Carrier Determination:", bold=True) - if is_deminimis: - _para( - f"{CHECK_FILLED} De Minimis: YES \u2014 Your combined interstate " - f"and international end-user telecommunications revenues are " - f"below the $10,000 threshold. You are required to file Form " - f"499-A annually but are EXEMPT from quarterly Form 499-Q " - f"filings and USF contribution payments.", - bold=True, - ) - else: - _para( - f"{CHECK_EMPTY} De Minimis: NO \u2014 You must file both " - f"Form 499-A (annual) and Form 499-Q (quarterly) and make " - f"quarterly USF contribution payments." - ) - - _info_box( - f"DE MINIMIS THRESHOLD: A carrier qualifies as de minimis if its " - f"combined interstate and international end-user telecommunications " - f"revenue is less than $10,000 for the reporting year. De minimis " - f"carriers must still file Form 499-A but are exempt from 499-Q " - f"filings and contribution obligations." - ) - _spacer() - - # LIRE - _para("Limited International Revenue Entity (LIRE) Determination:", bold=True) - if is_lire: - _para( - f"{CHECK_FILLED} LIRE: YES \u2014 Your international revenue is " - f"less than {LIRE_THRESHOLD_PCT:.0f}% of total end-user " - f"telecommunications revenue. Simplified international revenue " - f"reporting applies.", - bold=True, - ) - else: - _para( - f"{CHECK_EMPTY} LIRE: NO \u2014 Your international revenue " - f"equals or exceeds {LIRE_THRESHOLD_PCT:.0f}% of total end-user " - f"telecommunications revenue. Full international revenue detail " - f"is required." - ) - - _info_box( - f"LIRE THRESHOLD: An entity qualifies as a Limited International " - f"Revenue Entity if its international end-user telecommunications " - f"revenue is less than {LIRE_THRESHOLD_PCT:.0f}% of its total " - f"end-user telecommunications revenue. LIRE entities receive " - f"simplified reporting for international revenue categories." - ) - _spacer() - - # ── Section 6: Filing Obligations Summary ──────────────────── - _heading("7. Filing Obligations Summary") - - _para( - "Form 499-A and Form 499-Q are related filings. The 499-A reports " - "actual prior-year revenue, while the 499-Q projects current-quarter " - "revenue for contribution calculation purposes.", - size=9, - color=MEDIUM_GRAY, - ) - _spacer() - - _para("Annual Filing:", bold=True) - _checkbox( - f"Form 499-A (Annual Revenue Report) \u2014 Due April 1, {filing_year}", - checked=True, - ) - _para( - " Reports actual telecommunications revenue for the prior " - "calendar year. Used to true-up contributions.", - size=9, - color=MEDIUM_GRAY, - ) - _spacer() - - _para("Quarterly Filings:", bold=True) - _checkbox( - f"Form 499-Q (Quarterly Revenue Projection) \u2014 " - f"Due Feb 1, May 1, Aug 1, Nov 1", - checked=(not is_deminimis), - ) - _para( - " Projects current-quarter revenue to calculate quarterly USF " - "contribution payments. Based on projected (not actual) revenue.", - size=9, - color=MEDIUM_GRAY, - ) - - _info_box( - "499-A vs 499-Q RELATIONSHIP: The 499-A is an annual report of " - "actual revenue from the prior calendar year. The 499-Q is a " - "quarterly projection of current revenue used to calculate interim " - "USF contributions. When the 499-A is filed, USAC compares actual " - "revenue to projected revenue and calculates a true-up adjustment " - "(credit or additional payment)." - ) - _spacer() - - if not is_deminimis: - quarterly_rows = [ - ["Q1 (Jan\u2013Mar)", f"February 1, {filing_year}"], - ["Q2 (Apr\u2013Jun)", f"May 1, {filing_year}"], - ["Q3 (Jul\u2013Sep)", f"August 1, {filing_year}"], - ["Q4 (Oct\u2013Dec)", f"November 1, {filing_year}"], - ] - _add_table( - ["Quarter", "499-Q Due Date"], - quarterly_rows, - col_widths=[3.0, 3.5], - ) - _spacer() - - if last_filing_year and last_filing_year < filing_year - 1: - _para( - f"\u26a0 WARNING: Last filing year on record is {last_filing_year}. " - f"You may have missed filings for intervening years. Contact USAC " - f"to determine if back-filings are required.", - bold=True, - color=RGBColor(0xB7, 0x1C, 0x1C), - ) - _spacer() - - # ── Section 8: Alternative Billing Arrangements (Page 9) ───── - _heading("8. Alternative Billing Arrangements (Page 9 Worksheet)") - - _para( - "Use the Alternative Billing Arrangements Worksheet (Page 9 of " - "Form 499-A) if any of the four contribution programs \u2014 TRS, " - "NANP, LNP, or the FCC ITSP regulatory fee \u2014 should bill a " - "different contact or address than the one on Line 208. Programs " - "left blank on the worksheet default to Line 208." - ) - - def _alt_block(label: str, program_abbr: str, data: dict | None) -> None: - _heading(f"8.{program_abbr} {label}", level=2) - if not data: - _checkbox( - "Use Line 208 default (no separate billing contact for this program)", - checked=True, - ) - return - for field_label, key in [ - ("First name", "first_name"), ("Last name", "last_name"), - ("Phone", "phone"), ("Extension", "phone_ext"), - ("Fax", "fax"), ("Email", "email"), - ("Address line 1", "address_1"), ("Address line 2", "address_2"), - ("City", "city"), ("State", "state"), ("ZIP", "zip"), - ]: - val = (data or {}).get(key, "") - _checkbox( - f"{field_label}: {val or '_______________'}", - checked=bool(val), - ) - - if use_alt_billing: - _info_box( - "You have elected alternative billing arrangements for at least " - "one program. Complete the fields below for each program that " - "differs from Line 208. Missing data defaults to Line 208." - ) - _alt_block("TRS (Telecommunications Relay Services)", "TRS", alt_billing_trs) - _alt_block("NANP (North American Numbering Plan)", "NANP", alt_billing_nanp) - _alt_block("LNP (Local Number Portability)", "LNP", alt_billing_lnp) - _alt_block("FCC ITSP Regulatory Fees", "FCC", alt_billing_fcc) - else: - _checkbox( - "Alt billing NOT needed \u2014 all programs use the Line 208 contact", - checked=True, - ) - _spacer() - - # ── Section 9: Documents to Gather ─────────────────────────── - _heading("9. Documents to Gather Before Filing") - - _para( - "Collect the following documents and data aligned to the 499-A " - "line items before beginning your filing.", - size=9, - color=MEDIUM_GRAY, - ) - _spacer() - - _para("Identity and Registration:", bold=True) - _checkbox("FCC Registration Number (FRN) confirmation from CORES") - _checkbox("499 Filer ID from prior year filing or USAC assignment letter") - _checkbox("USAC E-File portal login credentials") - _checkbox("Current FCC licenses and authorizations") - _spacer() - - _para("Revenue Documentation (Lines 301\u2013509):", bold=True) - _checkbox("General ledger / revenue reports for the reporting year") - _checkbox("Revenue breakdown: interstate, intrastate, international") - _checkbox("End-user revenue detail by service category (Lines 301\u2013309)") - _checkbox("Carrier\u2019s carrier revenue detail (Lines 401\u2013409)") - if infra_type in ("reseller", "both"): - _checkbox("Resale revenue detail (Lines 501\u2013509)") - _checkbox("Upstream provider invoices for resold service cost deduction") - _checkbox("Revenue from non-telecommunications services (to exclude)") - _checkbox("Bad debt / uncollectible accounts write-off records") - _spacer() - - _para("Allocation and Classification:", bold=True) - _checkbox("Traffic study or jurisdictional allocation methodology documentation") - if uses_voip_safe_harbor: - _checkbox( - f"VoIP safe harbor election documentation " - f"({voip_safe_harbor_pct:.1f}% interstate)", - checked=True, - ) - _checkbox("Service category classification for each revenue stream") - if "une" in categories or infra_type in ("facilities", "both"): - _checkbox("UNE revenue records and categorization") - _spacer() - - _para("Prior Filings and Supporting Data:", bold=True) - _checkbox("Prior year Form 499-A (for comparison and consistency)") - _checkbox("Prior year Form 499-Q filings (all four quarters)") - _checkbox("USAC true-up notices or correspondence") - _checkbox("State PUC/PSC certificates (if CLEC or state-regulated)") - _spacer() - - _para("Interconnection and Wholesale:", bold=True) - _checkbox("Interconnection agreements (if facilities-based)") - _checkbox("Wholesale billing statements and settlement records") - if "international" in " ".join(categories) or international_pct > 0: - _checkbox("International revenue breakdown by country/route") - _checkbox("International settlement records") - _spacer() - - # ── Section 8: Key Deadlines ───────────────────────────────── - _heading("10. Key Deadlines") - - deadline_rows = [ - ["Form 499-A (Annual)", f"April 1, {filing_year}", "Annual actual revenue report"], - ] - if not is_deminimis: - deadline_rows.extend([ - ["Form 499-Q \u2014 Q1", f"February 1, {filing_year}", "Quarterly revenue projection"], - ["Form 499-Q \u2014 Q2", f"May 1, {filing_year}", "Quarterly revenue projection"], - ["Form 499-Q \u2014 Q3", f"August 1, {filing_year}", "Quarterly revenue projection"], - ["Form 499-Q \u2014 Q4", f"November 1, {filing_year}", "Quarterly revenue projection"], - ]) - - _add_table( - ["Filing", "Due Date", "Description"], - deadline_rows, - col_widths=[2.2, 2.0, 2.3], - ) - _spacer() - - _para( - "Late filing penalties: Up to $100,000 per day per violation " - "under 47 U.S.C. \u00a7 503(b). Additional enforcement actions may " - "include license revocation or Red Light holds.", - bold=True, - size=9, - ) - _spacer() - - # ── Section 9: Important Notes ─────────────────────────────── - _heading("11. Important Notes") - - _para("Electronic Filing Requirement:", bold=True) - _para( - "Form 499-A must be filed electronically through the USAC E-File " - "system at https://forms.universalservice.org. Paper filings are " - "not accepted. If you do not have E-File credentials, register at " - "the USAC website well in advance of the filing deadline.", - size=9, - ) - _spacer() - - _para("Red Light Rule (47 C.F.R. \u00a7 1.1910):", bold=True) - _para( - "Entities with delinquent debts owed to the FCC will be placed " - "on \u201cRed Light\u201d status. While on Red Light, the entity cannot " - "receive new or modified authorizations, licenses, or other " - "benefits from the FCC. Outstanding debts must be paid or a " - "payment plan must be established to remove Red Light status.", - size=9, - ) - _spacer() - - _para("Pass-Through Surcharges:", bold=True) - _para( - "Carriers may recover their USF contribution costs by adding a " - "line-item surcharge to customer bills. This surcharge must be " - "clearly labeled (e.g., \u201cFederal Universal Service Fund\u201d). " - "The surcharge amount collected from customers is not itself " - "assessable revenue for USF purposes. Carriers may not charge " - "customers more than the actual USF contribution amount.", - size=9, - ) - _spacer() - - _para("Non-Telecommunications Revenue:", bold=True) - _para( - "Revenue from services that do not constitute telecommunications " - "or interconnected VoIP must be excluded from Form 499-A. This " - "includes: information services, equipment sales and leases, " - "inside wiring installation and maintenance, web hosting, managed " - "IT services, dark fiber leases, and directory advertising. Maintain " - "clear records separating telecom from non-telecom revenue.", - size=9, - ) - _spacer() - - if contribution_factor_pct > 0: - _para("USF Contribution Factor:", bold=True) - _para( - f"The current USF contribution factor is " - f"{contribution_factor_pct:.1f}%. This factor is updated " - f"quarterly by the FCC based on projected USF demand and " - f"projected industry revenue. The factor for each quarter " - f"is announced via FCC Public Notice approximately one month " - f"before the quarter begins. Monitor FCC Public Notices for " - f"factor updates.", - size=9, - ) - _spacer() - - # ── Footer / Disclaimer ────────────────────────────────────── - # Divider line - divider_p = doc.add_paragraph() - divider_p.paragraph_format.space_before = Pt(12) - divider_p.paragraph_format.space_after = Pt(4) - dr = divider_p.add_run("\u2500" * 70) - dr.font.size = Pt(6) - dr.font.color.rgb = MEDIUM_GRAY - - _para( - "This checklist was prepared by Performance West Inc. for " - "informational purposes only. It does not constitute legal or " - "regulatory compliance advice. Consult directly with USAC and " - "the FCC for authoritative filing guidance. Filing requirements " - "may change; verify current rules at https://www.usac.org and " - "https://www.fcc.gov before filing.", - size=8, - italic=True, - color=MEDIUM_GRAY, - ) - - # Save - output = Path(output_path) - output.parent.mkdir(parents=True, exist_ok=True) - doc.save(str(output)) - LOG.info("499-A checklist generated: %s", output) - return str(output) diff --git a/scripts/workers/services/form_499a.py b/scripts/workers/services/form_499a.py index 9a44470..20226c6 100644 --- a/scripts/workers/services/form_499a.py +++ b/scripts/workers/services/form_499a.py @@ -387,38 +387,6 @@ class Form499AHandler(BaseServiceHandler): ) -> list[str]: generated: list[str] = [] - from scripts.document_gen.templates.fcc_499a_checklist_generator import ( - generate_499a_checklist, - ) - checklist_docx = os.path.join( - work_dir, f"fcc_499a_checklist_{order_number}_{date_str}.docx", - ) - checklist = generate_499a_checklist( - entity_name=entity.get("legal_name", ""), - frn=entity.get("frn", ""), - filer_id_499=entity.get("filer_id_499", ""), - address_street=entity.get("address_street", ""), - address_city=entity.get("address_city", ""), - address_state=entity.get("address_state", ""), - address_zip=entity.get("address_zip", ""), - filer_type=entity.get("carrier_category", "interconnected_voip"), - infra_type=entity.get("infra_type", "facilities"), - service_categories=entity.get("service_categories", []) or [], - is_deminimis=entity.get("is_deminimis", False), - is_lire=entity.get("is_lire", False), - total_revenue_cents=entity.get("total_revenue_cents", 0), - interstate_pct=entity.get("interstate_pct", 0), - international_pct=entity.get("international_pct", 0), - last_filing_year=entity.get("last_filing_year", 0), - output_path=checklist_docx, - ) - if checklist: - generated.append(checklist) - try: - generated.append(self._convert_to_pdf(checklist)) - except Exception as exc: - logger.warning("499-A checklist PDF conversion failed: %s", exc) - # Skip revenue workbook for zero-revenue filings if order_data.get("service_slug") != "fcc-499a-zero": try: