new-site/site/public/order/fcc-499q/index.html
justin 0fc318cb38 Add 499-Q intake page, 499-Q handler, and 499-A discontinuance handler
499-Q Quarterly Filing:
- Intake page at /order/fcc-499q with simplified revenue form
  (4 fields: carrier's carrier inter/intra, end-user inter/intra)
- Zero-revenue confirmation checkbox
- Handler creates admin todo with filing details + sends client email
- Registers as fcc-499q in SERVICE_HANDLERS

499-A Discontinuance:
- Handler creates admin todo with step-by-step USAC instructions
  (file zero-revenue 499-A, request account closure, confirm CPNI/RMD)
- Sends client confirmation email explaining the process
- Compliance checker CTA: when user selects "No — cancel registration"
  in the 499-A toggle, shows discontinuance option ($299) instead of
  standard filing
- Order page maps form_499a_disc to fcc-499a-discontinuance slug

Compliance checker intelligence:
- 499-A toggle tracks _499aVariant (null/zero/discontinuance)
- CTA adapts: revenue=standard 499-A, zero=zero-revenue, cancel=discontinuance
- Reset clears variant flag

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-03 02:34:18 -05:00

235 lines
10 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FCC Form 499-Q Quarterly Filing — Performance West Inc.</title>
<script>
window.__PW_API = (function() {
var h = window.location.hostname;
if (h === "localhost" || h === "127.0.0.1") return "http://" + h + ":3001";
if (h === "dev.performancewest.net") return "https://api.dev.performancewest.net";
return "https://api.performancewest.net";
})();
</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:'Inter',system-ui,sans-serif;color:#1f2937;background:#f9fafb;line-height:1.6}
.wrap{max-width:640px;margin:0 auto;padding:2rem 1.25rem 4rem}
h1{font-size:1.5rem;font-weight:700;color:#111827;margin-bottom:.25rem}
.subtitle{font-size:.88rem;color:#6b7280;margin-bottom:1.5rem}
.card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:1.25rem;margin-bottom:1rem}
.card h2{font-size:1rem;font-weight:700;color:#1e3a5f;margin-bottom:.75rem}
.label{display:block;font-size:.82rem;font-weight:600;color:#374151;margin-bottom:.3rem;margin-top:.75rem}
input[type=text],input[type=number]{width:100%;padding:.5rem .7rem;border:1px solid #d1d5db;border-radius:8px;font-size:.88rem}
input:focus{outline:none;border-color:#1e3a5f;box-shadow:0 0 0 2px rgba(30,58,95,.15)}
.btn{display:inline-flex;align-items:center;justify-content:center;padding:.65rem 1.5rem;border-radius:8px;font-weight:600;font-size:.92rem;cursor:pointer;border:none;transition:all .15s;font-family:inherit}
.btn-primary{background:#1e3a5f;color:#fff}.btn-primary:hover{background:#162e4d}
.btn-primary:disabled{opacity:.5;cursor:not-allowed}
.info{padding:.6rem .85rem;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px;font-size:.82rem;color:#1e40af;margin-bottom:1rem}
.revenue-row{display:flex;gap:.5rem;align-items:center;margin-bottom:.4rem}
.revenue-row label{flex:1;font-size:.84rem;color:#374151}
.revenue-row input{flex:0 0 140px}
.err{color:#dc2626;font-size:.82rem;margin-top:.5rem;display:none}
.success{background:#f0fdf4;border:2px solid #22c55e;border-radius:12px;padding:1.5rem;text-align:center}
.success h2{color:#166534}
</style>
</head>
<body>
<div class="wrap">
<h1>FCC Form 499-Q — Quarterly Filing</h1>
<p class="subtitle">Report your projected quarterly USF contributions based on actual telecom revenue for the prior quarter.</p>
<div id="loading" class="info">Loading order details...</div>
<div id="form-section" class="hidden">
<div class="card">
<h2 id="quarter-title">Quarterly Revenue</h2>
<p class="info" id="period-info"></p>
<p style="font-size:.84rem;color:#6b7280;margin-bottom:.75rem">Enter your actual telecom revenue for the reporting period. All amounts in US dollars. Enter 0 for lines that don't apply.</p>
<div id="revenue-fields">
<label class="label">Carrier's Carrier / Wholesale Revenue</label>
<div class="revenue-row">
<label>Interstate & International</label>
<input type="number" id="rev-cc-inter" value="0" min="0" step="0.01">
</div>
<div class="revenue-row">
<label>Intrastate</label>
<input type="number" id="rev-cc-intra" value="0" min="0" step="0.01">
</div>
<label class="label" style="margin-top:1rem">End-User Revenue</label>
<div class="revenue-row">
<label>Interstate & International</label>
<input type="number" id="rev-eu-inter" value="0" min="0" step="0.01">
</div>
<div class="revenue-row">
<label>Intrastate</label>
<input type="number" id="rev-eu-intra" value="0" min="0" step="0.01">
</div>
<label class="label" style="margin-top:1rem">Total Revenue (auto-calculated)</label>
<div style="font-size:1.1rem;font-weight:700;color:#1e3a5f;padding:.5rem 0" id="total-rev">$0.00</div>
</div>
<label style="display:flex;align-items:flex-start;gap:.5rem;padding:.5rem;margin-top:.75rem;border:1px solid #e5e7eb;border-radius:8px;cursor:pointer;font-size:.78rem;color:#6b7280;line-height:1.5">
<input type="checkbox" id="zero-confirm" style="margin-top:2px;accent-color:#1e3a5f">
<span id="zero-label" class="hidden">I confirm that this entity had <strong>$0 telecom revenue</strong> during this quarter.</span>
<span id="nonzero-label">I certify that the revenue figures above are accurate to the best of my knowledge.</span>
</label>
<div style="margin-top:1rem;text-align:right">
<button class="btn btn-primary" id="btn-submit" disabled>Submit 499-Q Filing</button>
</div>
<p class="err" id="submit-err"></p>
</div>
</div>
<div id="success-section" class="hidden">
<div class="success">
<h2>499-Q Filing Submitted</h2>
<p style="color:#166534;margin-top:.5rem" id="success-msg"></p>
</div>
</div>
<div id="error-section" class="hidden">
<div class="card" style="border-color:#fca5a5;background:#fef2f2">
<h2 style="color:#991b1b">Error</h2>
<p style="color:#7f1d1d" id="error-msg"></p>
</div>
</div>
</div>
<script>
(function() {
var API = window.__PW_API;
var params = new URLSearchParams(window.location.search);
var orderNumber = params.get("order");
if (!orderNumber) {
document.getElementById("loading").classList.add("hidden");
document.getElementById("error-section").classList.remove("hidden");
document.getElementById("error-msg").textContent = "No order number provided. Please use the link from your reminder email.";
return;
}
// Load order details
fetch(API + "/api/v1/compliance-orders/" + orderNumber)
.then(function(r) { return r.json(); })
.then(function(data) {
document.getElementById("loading").classList.add("hidden");
if (data.error) {
document.getElementById("error-section").classList.remove("hidden");
document.getElementById("error-msg").textContent = data.error;
return;
}
var intake = data.intake_data || {};
if (intake.intake_completed) {
document.getElementById("success-section").classList.remove("hidden");
document.getElementById("success-msg").textContent =
"This quarterly filing has already been submitted. You'll receive a confirmation email when it's processed.";
return;
}
var quarter = intake.quarter || "Q?";
var dueDate = intake.due_date || "TBD";
var periodEnd = intake.period_end_date || "";
var entityName = intake.entity_name || data.customer_name || "";
document.getElementById("quarter-title").textContent =
quarter + " Quarterly Revenue — " + entityName;
document.getElementById("period-info").innerHTML =
"<strong>Filing:</strong> " + quarter + " (due " + dueDate + ")" +
(periodEnd ? " · <strong>Period ending:</strong> " + periodEnd : "") +
(intake.filer_id_499 ? " · <strong>Filer ID:</strong> " + intake.filer_id_499 : "");
document.getElementById("form-section").classList.remove("hidden");
})
.catch(function() {
document.getElementById("loading").classList.add("hidden");
document.getElementById("error-section").classList.remove("hidden");
document.getElementById("error-msg").textContent = "Could not load order details. Please try again.";
});
// Revenue calculation
var fields = ["rev-cc-inter", "rev-cc-intra", "rev-eu-inter", "rev-eu-intra"];
fields.forEach(function(id) {
document.getElementById(id).addEventListener("input", updateTotal);
});
function getTotal() {
var total = 0;
fields.forEach(function(id) { total += parseFloat(document.getElementById(id).value) || 0; });
return total;
}
function updateTotal() {
var total = getTotal();
document.getElementById("total-rev").textContent = "$" + total.toFixed(2);
// Show zero confirmation if all fields are 0
var isZero = total === 0;
document.getElementById("zero-label").classList.toggle("hidden", !isZero);
document.getElementById("nonzero-label").classList.toggle("hidden", isZero);
}
document.getElementById("zero-confirm").addEventListener("change", function() {
document.getElementById("btn-submit").disabled = !this.checked;
});
// Submit
document.getElementById("btn-submit").addEventListener("click", async function() {
var btn = this;
var errEl = document.getElementById("submit-err");
errEl.style.display = "none";
if (!document.getElementById("zero-confirm").checked) {
errEl.textContent = "Please confirm the revenue figures.";
errEl.style.display = "block";
return;
}
btn.disabled = true;
btn.textContent = "Submitting...";
try {
var resp = await fetch(API + "/api/v1/compliance-orders/" + orderNumber + "/intake", {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
intake_data: {
intake_completed: true,
completed_at: new Date().toISOString(),
revenue: {
carriers_carrier_interstate: parseFloat(document.getElementById("rev-cc-inter").value) || 0,
carriers_carrier_intrastate: parseFloat(document.getElementById("rev-cc-intra").value) || 0,
end_user_interstate: parseFloat(document.getElementById("rev-eu-inter").value) || 0,
end_user_intrastate: parseFloat(document.getElementById("rev-eu-intra").value) || 0,
total: getTotal(),
},
},
}),
});
var result = await resp.json();
if (!resp.ok) throw new Error(result.error || "Submission failed");
document.getElementById("form-section").classList.add("hidden");
document.getElementById("success-section").classList.remove("hidden");
document.getElementById("success-msg").textContent =
"Your quarterly revenue data has been submitted. We'll file the 499-Q with USAC and send you a confirmation email.";
} catch (err) {
errEl.textContent = err.message || "Something went wrong.";
errEl.style.display = "block";
btn.disabled = false;
btn.textContent = "Submit 499-Q Filing";
}
});
})();
</script>
</body>
</html>