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: