Add zero-revenue 499-A filing at $179
New service slug fcc-499a-zero for carriers with no telecom revenue: - $179 instead of $499 (no revenue analysis needed) - Minimal intake: entity, officer, filer ID, filing type only - Skips revenue schedules (blocks 3-4), USF calculations (block 5), traffic study upload, and revenue workbook generation - Fills blocks 1-2 and 6 only, all revenue lines left as zero Compliance checker: shows both options (mutually exclusive checkboxes) Order page: maps form_499a_zero to fcc-499a-zero slug Handler: detects slug and skips revenue pipeline DC Agent shown when either 499-A variant is checked Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
5dabac856d
commit
3e04a8fc16
5 changed files with 98 additions and 37 deletions
|
|
@ -777,7 +777,8 @@ import Base from "../../layouts/Base.astro";
|
|||
services.push({ id: "stir_shaken", name: "STIR/SHAKEN Implementation", desc: "", price: 499 });
|
||||
break;
|
||||
case "form_499a":
|
||||
services.push({ id: "form_499a", name: "Form 499-A Filing", desc: "", price: 499 });
|
||||
services.push({ id: "form_499a", name: "Form 499-A Filing", desc: "with revenue", price: 499 });
|
||||
services.push({ id: "form_499a_zero", name: "Form 499-A (Zero Revenue)", desc: "no telecom revenue", price: 179, altOf: "form_499a" });
|
||||
if (s === "red") {
|
||||
services.push({ id: "dc_agent", name: "D.C. Registered Agent", desc: "", price: 99, priceLabel: "$99/yr" });
|
||||
}
|
||||
|
|
@ -813,10 +814,11 @@ import Base from "../../layouts/Base.astro";
|
|||
html += `<div class="space-y-2" id="service-list">`;
|
||||
|
||||
for (const svc of services) {
|
||||
const checked = svc.price > 0 && svc.id !== "stir_shaken" ? "checked" : "";
|
||||
// altOf items start unchecked (they're alternatives to the main item)
|
||||
const checked = svc.price > 0 && svc.id !== "stir_shaken" && !svc.altOf ? "checked" : "";
|
||||
const priceLabel = svc.priceLabel || (svc.price > 0 ? `$${svc.price}` : svc.desc || "included");
|
||||
html += `<label class="flex items-start gap-3 p-3 rounded-lg hover:bg-gray-50 cursor-pointer transition">
|
||||
<input type="checkbox" class="svc-checkbox mt-1 accent-pw-600" data-id="${svc.id}" data-price="${svc.price}" ${checked} />
|
||||
html += `<label class="flex items-start gap-3 p-3 rounded-lg hover:bg-gray-50 cursor-pointer transition" ${svc.altOf ? `data-alt-of="${svc.altOf}"` : ""}>
|
||||
<input type="checkbox" class="svc-checkbox mt-1 accent-pw-600" data-id="${svc.id}" data-price="${svc.price}" ${svc.altOf ? `data-alt-of="${svc.altOf}"` : ""} ${checked} />
|
||||
<div class="flex-1">
|
||||
<span class="font-medium text-gray-900">${svc.name}</span>
|
||||
${svc.desc && svc.price > 0 ? `<span class="text-xs text-gray-500 ml-1">${svc.desc}</span>` : ""}
|
||||
|
|
@ -838,6 +840,27 @@ import Base from "../../layouts/Base.astro";
|
|||
paymentIcons.classList.remove("hidden");
|
||||
reminderCta.classList.add("hidden");
|
||||
|
||||
// Mutual exclusion for alt items (e.g. 499-A vs 499-A Zero Revenue)
|
||||
ctaContent.querySelectorAll(".svc-checkbox[data-alt-of]").forEach((alt) => {
|
||||
alt.addEventListener("change", () => {
|
||||
if (alt.checked) {
|
||||
const main = ctaContent.querySelector(`.svc-checkbox[data-id="${alt.dataset.altOf}"]`);
|
||||
if (main) main.checked = false;
|
||||
updateTotal();
|
||||
}
|
||||
});
|
||||
});
|
||||
ctaContent.querySelectorAll(".svc-checkbox:not([data-alt-of])").forEach((main) => {
|
||||
main.addEventListener("change", () => {
|
||||
if (main.checked) {
|
||||
ctaContent.querySelectorAll(`.svc-checkbox[data-alt-of="${main.dataset.id}"]`).forEach((alt) => {
|
||||
alt.checked = false;
|
||||
});
|
||||
}
|
||||
updateTotal();
|
||||
});
|
||||
});
|
||||
|
||||
// Total calculation
|
||||
function updateTotal() {
|
||||
const boxes = ctaContent.querySelectorAll(".svc-checkbox");
|
||||
|
|
@ -845,8 +868,8 @@ import Base from "../../layouts/Base.astro";
|
|||
let pricedCount = 0;
|
||||
const selectedIds = [];
|
||||
|
||||
// If 499-A is unchecked, hide and uncheck DC Agent
|
||||
const f499Checked = Array.from(boxes).some((cb) => cb.dataset.id === "form_499a" && cb.checked);
|
||||
// If neither 499-A variant is checked, hide and uncheck DC Agent
|
||||
const f499Checked = Array.from(boxes).some((cb) => (cb.dataset.id === "form_499a" || cb.dataset.id === "form_499a_zero") && cb.checked);
|
||||
boxes.forEach((cb) => {
|
||||
if (cb.dataset.id === "dc_agent") {
|
||||
const label = cb.closest("label");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue