From 75ea2c5c6f4e27c58a45d479489c86dc752abe4b Mon Sep 17 00:00:00 2001 From: justin Date: Mon, 27 Apr 2026 15:13:18 -0500 Subject: [PATCH] Fix 3 bugs: BDC undo, JSON parse safety, price formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. BDC Yes/No buttons now have "Change answer" undo — clicking Yes or No is reversible without re-running the check 2. intake_data JSON.parse wrapped in try/catch with error logging instead of silently returning empty object 3. All CTA price displays use .toFixed(2) for consistent formatting Co-Authored-By: Claude Opus 4.6 (1M context) --- api/src/routes/checkout.ts | 11 +++- .../pages/tools/fcc-compliance-check.astro | 64 +++++++++++-------- 2 files changed, 49 insertions(+), 26 deletions(-) diff --git a/api/src/routes/checkout.ts b/api/src/routes/checkout.ts index 913d67b..8bb7439 100644 --- a/api/src/routes/checkout.ts +++ b/api/src/routes/checkout.ts @@ -1716,7 +1716,16 @@ async function sendComplianceIntakeEmail( if (!customerEmail) return; const firstName = customerName.split(" ")[0] || customerName; - const intake = orders[0].intake_data ? (typeof orders[0].intake_data === "string" ? JSON.parse(orders[0].intake_data as string) : orders[0].intake_data) as Record : {}; + let intake: Record = {}; + if (orders[0].intake_data) { + try { + intake = typeof orders[0].intake_data === "string" + ? JSON.parse(orders[0].intake_data as string) + : orders[0].intake_data as Record; + } catch (parseErr) { + console.error(`[checkout] intake_data JSON parse failed for ${orderId}:`, parseErr); + } + } const entityName = (intake.entity_name as string) || customerName; const frn = (intake.frn as string) || ""; diff --git a/site/src/pages/tools/fcc-compliance-check.astro b/site/src/pages/tools/fcc-compliance-check.astro index 714cbab..605b7bf 100644 --- a/site/src/pages/tools/fcc-compliance-check.astro +++ b/site/src/pages/tools/fcc-compliance-check.astro @@ -506,27 +506,40 @@ import Base from "../../layouts/Base.astro"; // BDC button handlers if (check.id === "bdc_filing" && status === "unknown") { - card.querySelector(".bdc-yes")?.addEventListener("click", () => { - check.status = "yellow"; - const cy = colorMap.yellow; - card.className = `${cy.bg} ${cy.border} border rounded-xl p-4 flex items-start gap-3`; - card.innerHTML = `
${icons.yellow}
-
-

${check.label || check.id}

- ${check.due_date ? `

Due: ${check.due_date}

` : ""} - ${check.detail ? `

${check.detail}

` : ""} -
`; + function setBdcStatus(newStatus) { + check.status = newStatus; + const c = colorMap[newStatus]; + card.className = `${c.bg} ${c.border} border rounded-xl p-4 flex items-start gap-3`; + if (newStatus === "yellow") { + card.innerHTML = `
${icons.yellow}
+
+

${check.label || check.id}

+

BDC filing required — you provide broadband service.

+ +
`; + } else if (newStatus === "green") { + card.innerHTML = `
${icons.green}
+
+

${check.label || check.id}

+

Not applicable — no broadband service.

+ +
`; + } + // Undo button re-renders the original card with Yes/No + card.querySelector(".bdc-undo")?.addEventListener("click", () => { + check.status = "unknown"; + const cu = colorMap.unknown; + card.className = `${cu.bg} ${cu.border} border rounded-xl p-4 flex items-start gap-3`; + card.innerHTML = inner; + // Re-attach Yes/No handlers + card.querySelector(".bdc-yes")?.addEventListener("click", () => setBdcStatus("yellow")); + card.querySelector(".bdc-no")?.addEventListener("click", () => setBdcStatus("green")); + renderCta(lastData); + }); renderCta(lastData); - }); - card.querySelector(".bdc-no")?.addEventListener("click", () => { - check.status = "green"; - const cg = colorMap.green; - card.className = `${cg.bg} ${cg.border} border rounded-xl p-4 flex items-start gap-3`; - card.innerHTML = `
${icons.green}
-
-

${check.label || check.id}

-
`; - }); + } + card.querySelector(".bdc-yes")?.addEventListener("click", () => setBdcStatus("yellow")); + card.querySelector(".bdc-no")?.addEventListener("click", () => setBdcStatus("green")); } checksContainer.appendChild(card); @@ -645,31 +658,32 @@ import Base from "../../layouts/Base.astro"; const totalRow = document.getElementById("total-row"); let discountHtml = ""; + const fmt = (v) => v.toFixed(2); if (pricedCount >= 2) { const discount = Math.round(total * 0.15); const final_ = total - discount; discountHtml = `
Subtotal - $${total} + $${fmt(total)}
15% bundle discount - -$${discount} + -$${fmt(discount)}
Total - $${final_} + $${fmt(final_)}
`; } else if (pricedCount === 1) { discountHtml = `
Total - $${total} + $${fmt(total)}

Add another service for 15% off

`; } else { discountHtml = `
Total - $${total} + $${fmt(total)}
`; }