Includes: API (Express/TypeScript), Astro site, Python workers, document generators, FCC compliance tools, Canada CRTC formation, Ansible infrastructure, and deployment scripts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
302 lines
9.9 KiB
TypeScript
302 lines
9.9 KiB
TypeScript
// Line 105 Category Catalog — FCC Form 499-A Appendix B (2026 edition)
|
|
//
|
|
// The 2026 instructions enumerate 22 Line 105 categories, grouped in this
|
|
// file by how much intake flow each gets:
|
|
// * first_class — dedicated intake step, CPNI/CALEA variant, special
|
|
// revenue-line logic
|
|
// * subtype_of — not a standalone category; marks a CLEC/IXC/Wireless
|
|
// with infra_type=reseller/mvno, or Satellite with a
|
|
// subservice flag. form_499a.py still ticks the box on
|
|
// the form; handler behavior mirrors the parent.
|
|
// * flag_only — we tick the Line 105 box correctly, nothing else
|
|
// special (revenue flows through standard lines)
|
|
// * deprecated — admin ToDo only; we don't support new flows for
|
|
// these categories, too rare to prioritize
|
|
//
|
|
// The catalog drives CategoryStep.astro (ranked multi-select UI) and the
|
|
// handler's form-filling logic.
|
|
|
|
export type Line105Status =
|
|
| "first_class"
|
|
| "subtype_of"
|
|
| "flag_only"
|
|
| "deprecated";
|
|
|
|
export type Line105Grouping =
|
|
| "common" // shown expanded by default
|
|
| "carrier_grade" // collapsed; "expand to see more carrier types"
|
|
| "specialized" // collapsed; satellite / audio-bridging / MSS
|
|
| "rare"; // collapsed; "handled manually" warning
|
|
|
|
export interface Line105Entry {
|
|
id: string; // matches form_499a.py handler enum
|
|
label: string; // UI label
|
|
fcc_box_number: number; // the numbered box on the paper form
|
|
status: Line105Status;
|
|
grouping: Line105Grouping;
|
|
parent?: string; // when status=subtype_of, the parent category id
|
|
tooltip: string; // short plain-English help
|
|
reseller_offered?: boolean; // show "Do you own facilities or resell?" sub-question
|
|
tdm_offered?: boolean; // show "TDM or packet?" under reseller
|
|
mvno_offered?: boolean; // show "Do you own spectrum or are you an MVNO?"
|
|
}
|
|
|
|
export const LINE_105_CATALOG: Line105Entry[] = [
|
|
// ── COMMON (expanded by default) ───────────────────────────────────────
|
|
{
|
|
id: "voip_interconnected",
|
|
label: "Interconnected VoIP provider",
|
|
fcc_box_number: 1,
|
|
status: "first_class",
|
|
grouping: "common",
|
|
tooltip:
|
|
"VoIP service that interconnects with the PSTN and allows customers "
|
|
+ "to make and receive calls to/from ordinary phone numbers. Safe "
|
|
+ "harbor of 64.9% interstate available.",
|
|
},
|
|
{
|
|
id: "voip_non_interconnected",
|
|
label: "Non-interconnected (one-way) VoIP",
|
|
fcc_box_number: 2,
|
|
status: "first_class",
|
|
grouping: "common",
|
|
tooltip:
|
|
"VoIP that only makes OR only receives calls (not both). No safe "
|
|
+ "harbor — requires traffic study or actual billing data.",
|
|
},
|
|
{
|
|
id: "clec",
|
|
label: "Competitive Local Exchange Carrier (CLEC)",
|
|
fcc_box_number: 3,
|
|
status: "first_class",
|
|
grouping: "common",
|
|
tooltip:
|
|
"Competitive local carrier offering wireline telephone service in "
|
|
+ "direct competition with the incumbent (ILEC).",
|
|
reseller_offered: true,
|
|
tdm_offered: true,
|
|
},
|
|
{
|
|
id: "ixc",
|
|
label: "Interexchange Carrier (IXC)",
|
|
fcc_box_number: 7,
|
|
status: "first_class",
|
|
grouping: "common",
|
|
tooltip:
|
|
"Long-distance (toll) carrier. Access-charge collection matters here "
|
|
+ "— originating access and 8YY revenue belong on Line 404.x.",
|
|
reseller_offered: true,
|
|
tdm_offered: true,
|
|
},
|
|
{
|
|
id: "wireless",
|
|
label: "Wireless / Cellular / PCS (CMRS)",
|
|
fcc_box_number: 8,
|
|
status: "first_class",
|
|
grouping: "common",
|
|
tooltip:
|
|
"Commercial Mobile Radio Service — cellular, PCS. Safe harbor of "
|
|
+ "37.1% interstate. MVNOs are a subtype below.",
|
|
mvno_offered: true,
|
|
},
|
|
|
|
// ── CARRIER_GRADE (collapsed) ──────────────────────────────────────────
|
|
{
|
|
id: "ilec",
|
|
label: "Incumbent LEC (ILEC)",
|
|
fcc_box_number: 4,
|
|
status: "flag_only",
|
|
grouping: "carrier_grade",
|
|
tooltip:
|
|
"Historical local exchange carrier. We don't onboard ILECs — select "
|
|
+ "this and our team will reach out.",
|
|
},
|
|
{
|
|
id: "local_reseller",
|
|
label: "Local Reseller (TDM era)",
|
|
fcc_box_number: 5,
|
|
status: "subtype_of",
|
|
parent: "clec",
|
|
grouping: "carrier_grade",
|
|
tooltip:
|
|
"Historical category for carriers that buy wholesale from an ILEC "
|
|
+ "and rebrand. If this describes you, check CLEC above and set "
|
|
+ "infrastructure = reseller.",
|
|
},
|
|
{
|
|
id: "toll_reseller",
|
|
label: "Toll Reseller",
|
|
fcc_box_number: 6,
|
|
status: "subtype_of",
|
|
parent: "ixc",
|
|
grouping: "carrier_grade",
|
|
tooltip:
|
|
"Long-distance reseller buying wholesale minutes. Check IXC above "
|
|
+ "and set infrastructure = reseller.",
|
|
},
|
|
{
|
|
id: "private_line",
|
|
label: "Private Line / Business Data Service",
|
|
fcc_box_number: 11,
|
|
status: "first_class",
|
|
grouping: "carrier_grade",
|
|
tooltip:
|
|
"Dedicated point-to-point circuits (DS-1/DS-3/Ethernet). Includes "
|
|
+ "special-access and BDS services.",
|
|
},
|
|
{
|
|
id: "toll_free",
|
|
label: "Toll-Free (8YY) Service",
|
|
fcc_box_number: 17,
|
|
status: "flag_only",
|
|
grouping: "carrier_grade",
|
|
tooltip:
|
|
"Customer-paid-calling (8YY) service provider. 8YY originating "
|
|
+ "access revenue flows through ICC imports.",
|
|
},
|
|
|
|
// ── SPECIALIZED (collapsed) ─────────────────────────────────────────────
|
|
{
|
|
id: "mvno",
|
|
label: "Mobile Virtual Network Operator (MVNO)",
|
|
fcc_box_number: 9,
|
|
status: "subtype_of",
|
|
parent: "wireless",
|
|
grouping: "specialized",
|
|
tooltip:
|
|
"Wireless service that uses another carrier's network (e.g., buying "
|
|
+ "from T-Mobile / Verizon / AT&T). Check Wireless above and set "
|
|
+ "infrastructure = MVNO.",
|
|
},
|
|
{
|
|
id: "satellite",
|
|
label: "Satellite Service",
|
|
fcc_box_number: 12,
|
|
status: "first_class",
|
|
grouping: "specialized",
|
|
tooltip:
|
|
"Earth-station based satellite service (FSS / BSS). Requires FCC "
|
|
+ "Form 312 earth station license.",
|
|
},
|
|
{
|
|
id: "mobile_satellite",
|
|
label: "Mobile Satellite Service (MSS)",
|
|
fcc_box_number: 21,
|
|
status: "subtype_of",
|
|
parent: "satellite",
|
|
grouping: "specialized",
|
|
tooltip:
|
|
"Mobile satellite (Iridium, Globalstar, Starlink Commercial mobile). "
|
|
+ "Check Satellite above and set service_type=MSS.",
|
|
},
|
|
{
|
|
id: "audio_bridging",
|
|
label: "Audio Bridging / Conferencing Service",
|
|
fcc_box_number: 16,
|
|
status: "first_class",
|
|
grouping: "specialized",
|
|
tooltip:
|
|
"Multi-party audio conferencing provider. FCC clarified in 2021 "
|
|
+ "that bridging in interstate commerce is telecom service.",
|
|
},
|
|
{
|
|
id: "fixed_wireless",
|
|
label: "Fixed Wireless (non-mobile)",
|
|
fcc_box_number: 20,
|
|
status: "subtype_of",
|
|
parent: "clec",
|
|
grouping: "specialized",
|
|
tooltip:
|
|
"Fixed wireless last-mile local service. Check CLEC above and set "
|
|
+ "infrastructure = facilities + wireless_metadata.",
|
|
},
|
|
{
|
|
id: "prepaid_calling_card",
|
|
label: "Prepaid Calling Card",
|
|
fcc_box_number: 10,
|
|
status: "flag_only",
|
|
grouping: "specialized",
|
|
tooltip:
|
|
"Prepaid long-distance cards. Revenue goes on Line 411 with special "
|
|
+ "safe-harbor rules.",
|
|
},
|
|
|
|
// ── RARE / DEPRECATED (collapsed with warning) ─────────────────────────
|
|
{
|
|
id: "payphone",
|
|
label: "Payphone Service Provider (PSP)",
|
|
fcc_box_number: 13,
|
|
status: "deprecated",
|
|
grouping: "rare",
|
|
tooltip:
|
|
"Rare in 2026 — if this describes you, our team will handle manually.",
|
|
},
|
|
{
|
|
id: "osp",
|
|
label: "Operator Service Provider (OSP)",
|
|
fcc_box_number: 14,
|
|
status: "flag_only",
|
|
grouping: "rare",
|
|
tooltip: "Operator-assisted call service provider.",
|
|
},
|
|
{
|
|
id: "shared_tenant",
|
|
label: "Shared Tenant Services",
|
|
fcc_box_number: 15,
|
|
status: "flag_only",
|
|
grouping: "rare",
|
|
tooltip: "Shared tenant telecommunications (e.g., building-wide PBX resale).",
|
|
},
|
|
{
|
|
id: "paging",
|
|
label: "Paging / Messaging",
|
|
fcc_box_number: 18,
|
|
status: "deprecated",
|
|
grouping: "rare",
|
|
tooltip: "Standalone paging — rare in 2026. Our team will handle manually.",
|
|
},
|
|
{
|
|
id: "smr",
|
|
label: "Specialized Mobile Radio (SMR)",
|
|
fcc_box_number: 19,
|
|
status: "deprecated",
|
|
grouping: "rare",
|
|
tooltip: "Specialized mobile radio dispatch. Rare — our team will handle manually.",
|
|
},
|
|
{
|
|
id: "other",
|
|
label: "Other (describe separately)",
|
|
fcc_box_number: 22,
|
|
status: "flag_only",
|
|
grouping: "rare",
|
|
tooltip:
|
|
"Any category not listed above. Our team will follow up for a "
|
|
+ "free-text description required on the form.",
|
|
},
|
|
];
|
|
|
|
// Convenience lookups
|
|
export const LINE_105_BY_ID: Record<string, Line105Entry> = Object.fromEntries(
|
|
LINE_105_CATALOG.map((c) => [c.id, c]),
|
|
);
|
|
|
|
export const LINE_105_GROUPS: Record<Line105Grouping, Line105Entry[]> =
|
|
LINE_105_CATALOG.reduce((acc, entry) => {
|
|
(acc[entry.grouping] ||= []).push(entry);
|
|
return acc;
|
|
}, {} as Record<Line105Grouping, Line105Entry[]>);
|
|
|
|
// Map a category id → the extra Line 105 box that gets auto-ticked because
|
|
// of the infra_type/mvno flag. form_499a.py mirrors this logic.
|
|
export function derivedLine105Boxes(
|
|
categoryId: string,
|
|
infra_type?: string,
|
|
): number[] {
|
|
const boxes: number[] = [];
|
|
if (infra_type === "reseller") {
|
|
if (categoryId === "clec") boxes.push(5); // local_reseller
|
|
if (categoryId === "ixc") boxes.push(6); // toll_reseller
|
|
}
|
|
if (infra_type === "mvno" && categoryId === "wireless") boxes.push(9);
|
|
return boxes;
|
|
}
|