fix: show trucking order prices and payment options
This commit is contained in:
parent
d7de818f39
commit
ee07064b0f
28 changed files with 199 additions and 93 deletions
69
site/src/components/OrderPriceBanner.astro
Normal file
69
site/src/components/OrderPriceBanner.astro
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
---
|
||||
import { formatUSD } from "../lib/intake_manifest";
|
||||
|
||||
export interface Props {
|
||||
priceCents?: number;
|
||||
govFeeLabel?: string;
|
||||
note?: string;
|
||||
}
|
||||
|
||||
const { priceCents, govFeeLabel, note } = Astro.props;
|
||||
const hasPrice = typeof priceCents === "number";
|
||||
---
|
||||
|
||||
{hasPrice && (
|
||||
<aside class="pw-price-banner" aria-label="Service price">
|
||||
<div>
|
||||
<p class="pw-price-label">Service fee</p>
|
||||
<p class="pw-price-value">{formatUSD(priceCents!)}</p>
|
||||
</div>
|
||||
<div class="pw-price-copy">
|
||||
{govFeeLabel ? (
|
||||
<p><strong>Pass-through fees:</strong>{" "}{govFeeLabel}. Billed separately at cost.</p>
|
||||
) : (
|
||||
<p>No hidden Performance West service fee. You will review the total before payment.</p>
|
||||
)}
|
||||
{note && <p>{note}</p>}
|
||||
</div>
|
||||
</aside>
|
||||
)}
|
||||
|
||||
<style>
|
||||
.pw-price-banner {
|
||||
display: flex;
|
||||
gap: 1.25rem;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 1rem 1.15rem;
|
||||
margin: 1rem 0 1.5rem;
|
||||
border: 2px solid #fed7aa;
|
||||
border-radius: 14px;
|
||||
background: linear-gradient(135deg, #fff7ed, #ffffff);
|
||||
box-shadow: 0 10px 28px rgba(249, 115, 22, 0.10);
|
||||
}
|
||||
.pw-price-label {
|
||||
margin: 0 0 0.15rem;
|
||||
color: #9a3412;
|
||||
font-size: 0.78rem;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.08em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.pw-price-value {
|
||||
margin: 0;
|
||||
color: #ea580c;
|
||||
font-size: clamp(2rem, 5vw, 3rem);
|
||||
line-height: 1;
|
||||
font-weight: 900;
|
||||
}
|
||||
.pw-price-copy {
|
||||
max-width: 30rem;
|
||||
color: #475569;
|
||||
font-size: 0.95rem;
|
||||
line-height: 1.45;
|
||||
}
|
||||
.pw-price-copy p { margin: 0.2rem 0; }
|
||||
@media (max-width: 640px) {
|
||||
.pw-price-banner { align-items: flex-start; flex-direction: column; }
|
||||
}
|
||||
</style>
|
||||
|
|
@ -621,14 +621,19 @@ const STEP_LABELS: Record<string, string> = {
|
|||
} else if (!valResp.ok) {
|
||||
throw new Error(`Validation HTTP ${valResp.status}`);
|
||||
}
|
||||
// Kick off Stripe Checkout for the new order.
|
||||
const methodSel = document.getElementById("pw-pay-method") as HTMLSelectElement | null;
|
||||
const paymentMethod = methodSel?.value || "card";
|
||||
|
||||
// Kick off checkout for the new order using the method selected on the
|
||||
// Payment step. PayPal and crypto return provider-specific checkout URLs;
|
||||
// card/ACH/Klarna use Stripe Checkout.
|
||||
const checkoutResp = await fetch(`${API}/api/v1/checkout/create-session`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
order_id: newOrderNumber,
|
||||
order_type: "compliance",
|
||||
payment_method: "card",
|
||||
payment_method: paymentMethod,
|
||||
}),
|
||||
});
|
||||
if (!checkoutResp.ok) throw new Error(`Checkout HTTP ${checkoutResp.status}`);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
---
|
||||
// PaymentStep — hand off to the existing Stripe Checkout flow.
|
||||
// PaymentStep — choose a payment method. The Wizard's Finish button creates the
|
||||
// order, validates intake, and starts the selected checkout flow.
|
||||
export interface Props { service_slug: string; }
|
||||
const { service_slug } = Astro.props;
|
||||
import { SERVICE_META, formatUSD } from "../../../lib/intake_manifest";
|
||||
|
|
@ -9,7 +10,8 @@ const meta = SERVICE_META[service_slug];
|
|||
<div class="pw-step" data-slug={service_slug}>
|
||||
<h2>Payment</h2>
|
||||
<p class="pw-help">
|
||||
You'll be redirected to our secure payment processor to complete the order.
|
||||
Choose how you want to pay. You'll be redirected to the matching secure
|
||||
checkout after you click Finish.
|
||||
After payment, the filing handler runs automatically. If admin review is
|
||||
enabled on your account, you'll see the packet in your portal first.
|
||||
</p>
|
||||
|
|
@ -32,8 +34,7 @@ const meta = SERVICE_META[service_slug];
|
|||
<option value="crypto">Cryptocurrency</option>
|
||||
</select>
|
||||
|
||||
<button type="button" id="pw-pay-go" class="pw-btn">Continue to payment →</button>
|
||||
<div id="pw-pay-err" class="pw-err" hidden></div>
|
||||
<p class="pw-method-note">Click <strong>Finish</strong> below to continue with the selected method.</p>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
|
|
@ -43,46 +44,5 @@ const meta = SERVICE_META[service_slug];
|
|||
.pw-total-line { display: flex; justify-content: space-between; padding: 0.25rem 0; font-size: 1rem; }
|
||||
.pw-field { display: block; font-weight: 600; margin: 0.6rem 0 0.2rem; font-size: 0.88rem; }
|
||||
.pw-input { width: 100%; padding: 0.5rem 0.7rem; border: 1px solid #cbd5e1; border-radius: 6px; font-size: 0.93rem; }
|
||||
.pw-btn { padding: 0.75rem 2rem; border: 0; border-radius: 6px; background: #059669; color: #fff; font-weight: 600; cursor: pointer; font-size: 1rem; margin-top: 1.5rem; }
|
||||
.pw-err { color: #b91c1c; margin-top: 0.75rem; font-size: 0.9rem; }
|
||||
.pw-method-note { margin: 0.75rem 0 0; color: #64748b; font-size: 0.9rem; }
|
||||
</style>
|
||||
|
||||
<script>
|
||||
const slugEl = document.querySelector(".pw-step[data-slug]") as HTMLElement | null;
|
||||
const methodSel = document.getElementById("pw-pay-method") as HTMLSelectElement | null;
|
||||
const goBtn = document.getElementById("pw-pay-go") as HTMLButtonElement | null;
|
||||
const err = document.getElementById("pw-pay-err") as HTMLDivElement | null;
|
||||
|
||||
if (slugEl && methodSel && goBtn && err) {
|
||||
const slug = slugEl.getAttribute("data-slug")!;
|
||||
|
||||
goBtn.addEventListener("click", async () => {
|
||||
err.hidden = true;
|
||||
goBtn.disabled = true; goBtn.textContent = "Creating checkout session…";
|
||||
try {
|
||||
const state = (window as any).PWIntake.get();
|
||||
if (!state.order_number) throw new Error("Order was not created; go back to Review.");
|
||||
const resp = await fetch("/api/v1/checkout/create-session", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
order_id: state.order_number,
|
||||
order_type: "compliance",
|
||||
payment_method: methodSel.value,
|
||||
}),
|
||||
});
|
||||
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
|
||||
const { checkout_url } = await resp.json();
|
||||
if (!checkout_url) throw new Error("No checkout URL returned.");
|
||||
// Clear the wizard state, success page handles the rest
|
||||
sessionStorage.removeItem(`pw-intake-${slug}`);
|
||||
window.location.href = checkout_url;
|
||||
} catch (e: any) {
|
||||
err.hidden = false;
|
||||
err.textContent = "Could not start checkout: " + e.message;
|
||||
goBtn.disabled = false;
|
||||
goBtn.textContent = "Continue to payment →";
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -106,43 +106,43 @@ export const INTAKE_MANIFEST: Record<string, IntakeStep[]> = {
|
|||
|
||||
// ── DOT / FMCSA Motor Carrier Services ──────────────────────────
|
||||
// Unified DOT intake form — shows relevant sections based on service.
|
||||
"mcs150-update": ["dot-intake", "review"],
|
||||
"boc3-filing": ["dot-intake", "review"],
|
||||
"ucr-registration": ["dot-intake", "review"],
|
||||
"dot-registration": ["dot-intake", "review"],
|
||||
"mc-authority": ["dot-intake", "review"],
|
||||
"dot-drug-alcohol": ["dot-intake", "review"],
|
||||
"dot-audit-prep": ["dot-intake", "review"],
|
||||
"dot-full-compliance": ["dot-intake", "review"],
|
||||
"mcs150-update": ["dot-intake", "review", "payment"],
|
||||
"boc3-filing": ["dot-intake", "review", "payment"],
|
||||
"ucr-registration": ["dot-intake", "review", "payment"],
|
||||
"dot-registration": ["dot-intake", "review", "payment"],
|
||||
"mc-authority": ["dot-intake", "review", "payment"],
|
||||
"dot-drug-alcohol": ["dot-intake", "review", "payment"],
|
||||
"dot-audit-prep": ["dot-intake", "review", "payment"],
|
||||
"dot-full-compliance": ["dot-intake", "review", "payment"],
|
||||
// These all file an MCS-150 or operating authority with FMCSA → require the
|
||||
// authorized signer's government photo ID (collected in the dot-intake step).
|
||||
"usdot-reactivation": ["dot-intake", "review"],
|
||||
"emergency-temporary-authority": ["dot-intake", "review"],
|
||||
"carrier-closeout": ["dot-intake", "review"],
|
||||
"entity-dissolution": ["dot-intake", "review"],
|
||||
"usdot-reactivation": ["dot-intake", "review", "payment"],
|
||||
"emergency-temporary-authority": ["dot-intake", "review", "payment"],
|
||||
"carrier-closeout": ["dot-intake", "review", "payment"],
|
||||
"entity-dissolution": ["dot-intake", "review", "payment"],
|
||||
|
||||
// ── State-Level Trucking Compliance ─────────────────────────────────
|
||||
// Collected via the dedicated state-trucking intake step.
|
||||
"irp-registration": ["state-trucking", "review"],
|
||||
"ifta-application": ["state-trucking", "review"],
|
||||
"ifta-quarterly": ["state-trucking", "review"],
|
||||
"or-weight-mile-tax": ["state-trucking", "review"],
|
||||
"ny-hut-registration": ["state-trucking", "review"],
|
||||
"ky-kyu-registration": ["state-trucking", "review"],
|
||||
"nm-weight-distance": ["state-trucking", "review"],
|
||||
"ct-highway-use-fee": ["state-trucking", "review"],
|
||||
"ca-mcp-carb": ["state-trucking", "review"],
|
||||
"state-dot-registration":["state-trucking", "review"],
|
||||
"intrastate-authority": ["state-trucking", "review"],
|
||||
"osow-permit": ["state-trucking", "review"],
|
||||
"state-trucking-bundle": ["state-trucking", "review"],
|
||||
"irp-registration": ["state-trucking", "review", "payment"],
|
||||
"ifta-application": ["state-trucking", "review", "payment"],
|
||||
"ifta-quarterly": ["state-trucking", "review", "payment"],
|
||||
"or-weight-mile-tax": ["state-trucking", "review", "payment"],
|
||||
"ny-hut-registration": ["state-trucking", "review", "payment"],
|
||||
"ky-kyu-registration": ["state-trucking", "review", "payment"],
|
||||
"nm-weight-distance": ["state-trucking", "review", "payment"],
|
||||
"ct-highway-use-fee": ["state-trucking", "review", "payment"],
|
||||
"ca-mcp-carb": ["state-trucking", "review", "payment"],
|
||||
"state-dot-registration":["state-trucking", "review", "payment"],
|
||||
"intrastate-authority": ["state-trucking", "review", "payment"],
|
||||
"osow-permit": ["state-trucking", "review", "payment"],
|
||||
"state-trucking-bundle": ["state-trucking", "review", "payment"],
|
||||
|
||||
// ── Hazmat / Emissions ───────────────────────────────────────────────
|
||||
"hazmat-phmsa": ["state-trucking", "review"],
|
||||
"state-emissions": ["state-trucking", "review"],
|
||||
"hazmat-phmsa": ["state-trucking", "review", "payment"],
|
||||
"state-emissions": ["state-trucking", "review", "payment"],
|
||||
|
||||
// ── Entity / Corporate Upgrade ─────────────────────────────────────
|
||||
"entity-upgrade-bundle": ["dot-intake", "review"],
|
||||
"entity-upgrade-bundle": ["dot-intake", "review", "payment"],
|
||||
};
|
||||
|
||||
// Category-gated dynamic steps. The Wizard inserts these after the `category`
|
||||
|
|
@ -156,7 +156,7 @@ export const CATEGORY_GATED_STEPS: Record<string, IntakeStep[]> = {
|
|||
};
|
||||
|
||||
// ── Pricing + human name lookup (mirrors COMPLIANCE_SERVICES server-side)
|
||||
export const SERVICE_META: Record<string, { name: string; price_cents: number }> = {
|
||||
export const SERVICE_META: Record<string, { name: string; price_cents: number; gov_fee_label?: string }> = {
|
||||
"fcc-compliance-checkup": { name: "FCC Carrier Compliance Checkup", price_cents: 79900 },
|
||||
"fcc-499a": { name: "FCC Form 499-A Filing", price_cents: 49900 },
|
||||
"fcc-499a-499q": { name: "FCC Form 499-A + 499-Q Bundle", price_cents: 59900 },
|
||||
|
|
@ -180,29 +180,29 @@ export const SERVICE_META: Record<string, { name: string; price_cents: number }>
|
|||
// DOT / FMCSA
|
||||
"mcs150-update": { name: "MCS-150 Biennial Update", price_cents: 3900 },
|
||||
"boc3-filing": { name: "BOC-3 Process Agent Filing", price_cents: 8900 },
|
||||
"ucr-registration": { name: "UCR Annual Registration", price_cents: 3900 },
|
||||
"ucr-registration": { name: "UCR Annual Registration", price_cents: 3900, gov_fee_label: "UCR registration fee (tier-based, minimum shown)" },
|
||||
"dot-registration": { name: "New USDOT Number Registration", price_cents: 8900 },
|
||||
"mc-authority": { name: "MC Operating Authority Application", price_cents: 19900 },
|
||||
"mc-authority": { name: "MC Operating Authority Application", price_cents: 19900, gov_fee_label: "FMCSA operating authority application fee" },
|
||||
"dot-drug-alcohol": { name: "DOT Drug & Alcohol Compliance Program", price_cents: 14900 },
|
||||
"dot-audit-prep": { name: "New Entrant Safety Audit Preparation", price_cents: 39900 },
|
||||
"dot-full-compliance": { name: "DOT Full Compliance Bundle", price_cents: 39900 },
|
||||
"usdot-reactivation": { name: "USDOT Reactivation", price_cents: 14900 },
|
||||
// State-level trucking
|
||||
"irp-registration": { name: "IRP Registration Assistance", price_cents: 10900 },
|
||||
"ifta-application": { name: "IFTA Application + Decals", price_cents: 10900 },
|
||||
"ifta-quarterly": { name: "IFTA Quarterly Filing", price_cents: 10900 },
|
||||
"or-weight-mile-tax": { name: "Oregon Weight-Mile Tax Setup", price_cents: 10900 },
|
||||
"ny-hut-registration": { name: "NY Highway Use Tax Registration", price_cents: 10900 },
|
||||
"ky-kyu-registration": { name: "KY Weight-Distance Tax Setup", price_cents: 10900 },
|
||||
"nm-weight-distance": { name: "NM Weight-Distance Tax Setup", price_cents: 10900 },
|
||||
"ct-highway-use-fee": { name: "CT Highway Use Fee Setup", price_cents: 10900 },
|
||||
"ca-mcp-carb": { name: "California MCP + CARB Compliance", price_cents: 22900 },
|
||||
"state-dot-registration": { name: "State DOT Registration", price_cents: 10900 },
|
||||
"intrastate-authority": { name: "Intrastate Operating Authority", price_cents: 10900 },
|
||||
"osow-permit": { name: "Oversize/Overweight Permit", price_cents: 10900 },
|
||||
"state-trucking-bundle": { name: "State Compliance Bundle", price_cents: 49900 },
|
||||
"irp-registration": { name: "IRP Registration Assistance", price_cents: 10900, gov_fee_label: "Apportioned IRP registration and plate fees (state, by jurisdictions and weight)" },
|
||||
"ifta-application": { name: "IFTA Application + Decals", price_cents: 10900, gov_fee_label: "IFTA license and decal fees (state)" },
|
||||
"ifta-quarterly": { name: "IFTA Quarterly Filing", price_cents: 10900, gov_fee_label: "IFTA taxes due, based on your mileage" },
|
||||
"or-weight-mile-tax": { name: "Oregon Weight-Mile Tax Setup", price_cents: 10900, gov_fee_label: "Oregon weight-mile tax account and bond/deposit fees (state)" },
|
||||
"ny-hut-registration": { name: "NY Highway Use Tax Registration", price_cents: 10900, gov_fee_label: "NY HUT certificate and decal fees (state)" },
|
||||
"ky-kyu-registration": { name: "KY Weight-Distance Tax Setup", price_cents: 10900, gov_fee_label: "KYU weight-distance account fees (state)" },
|
||||
"nm-weight-distance": { name: "NM Weight-Distance Tax Setup", price_cents: 10900, gov_fee_label: "NM weight-distance permit and account fees (state)" },
|
||||
"ct-highway-use-fee": { name: "CT Highway Use Fee Setup", price_cents: 10900, gov_fee_label: "CT Highway Use Fee registration and usage fees (state)" },
|
||||
"ca-mcp-carb": { name: "California MCP + CARB Compliance", price_cents: 22900, gov_fee_label: "CA MCP permit fee and CARB/Clean Truck Check fees (state, by fleet size)" },
|
||||
"state-dot-registration": { name: "State DOT Registration", price_cents: 10900, gov_fee_label: "State DOT/intrastate registration fee (state)" },
|
||||
"intrastate-authority": { name: "Intrastate Operating Authority", price_cents: 10900, gov_fee_label: "State intrastate authority filing fee" },
|
||||
"osow-permit": { name: "Oversize/Overweight Permit", price_cents: 10900, gov_fee_label: "State oversize/overweight permit fees, per trip/route" },
|
||||
"state-trucking-bundle": { name: "State Compliance Bundle", price_cents: 49900, gov_fee_label: "State registration, decal and tax fees for each included filing" },
|
||||
// Hazmat / emissions
|
||||
"hazmat-phmsa": { name: "PHMSA Hazmat Registration", price_cents: 14900 },
|
||||
"hazmat-phmsa": { name: "PHMSA Hazmat Registration", price_cents: 14900, gov_fee_label: "PHMSA registration fee, by business size" },
|
||||
"state-emissions": { name: "State Clean-Truck / Emissions Compliance", price_cents: 10900 },
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
const slug = "boc3-filing";
|
||||
|
|
@ -17,6 +18,8 @@ const description = "Designate a process agent in all 48 states plus DC.";
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
</main>
|
||||
</Base>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "California Motor Carrier Permit (MCP) plus CARB Clean Truck
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "Connecticut Highway Use Fee registration for heavy multi-un
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
const slug = "dot-audit-prep";
|
||||
|
|
@ -17,6 +18,8 @@ const description = "Prepare for your 18-month FMCSA safety audit.";
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
</main>
|
||||
</Base>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
const slug = "dot-drug-alcohol";
|
||||
|
|
@ -17,6 +18,8 @@ const description = "Consortium enrollment, written policy, and DER designation.
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
</main>
|
||||
</Base>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
const slug = "dot-full-compliance";
|
||||
|
|
@ -17,6 +18,8 @@ const description = "MCS-150 + BOC-3 + UCR + Drug & Alcohol + Audit Prep.";
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
</main>
|
||||
</Base>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
const slug = "dot-registration";
|
||||
|
|
@ -17,6 +18,8 @@ const description = "Register a new USDOT number with FMCSA.";
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
</main>
|
||||
</Base>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "PHMSA hazardous-materials registration for carriers transpo
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "International Fuel Tax Agreement (IFTA) license and decals
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "Quarterly IFTA fuel-tax return preparation and filing throu
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
const slug = "intrastate-authority";
|
||||
|
|
@ -17,6 +18,8 @@ const description = "Intrastate operating authority application for carriers hau
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
</main>
|
||||
</Base>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "Apportioned (IRP) registration for interstate carriers —
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "Kentucky KYU weight-distance tax license for carriers opera
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
const slug = "mc-authority";
|
||||
|
|
@ -17,6 +18,8 @@ const description = "Apply for common or contract carrier operating authority.";
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
</main>
|
||||
</Base>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "FMCSA biennial update of company profile, fleet size, and m
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "New Mexico Weight-Distance Tax permit and account setup.";
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "New York Highway Use Tax (HUT) registration and decal for c
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "Oregon Weight-Mile Tax enrollment and account setup for car
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
const slug = "osow-permit";
|
||||
|
|
@ -17,6 +18,8 @@ const description = "Oversize / Overweight (OS/OW) trip permit acquisition for n
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
</main>
|
||||
</Base>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
const slug = "state-dot-registration";
|
||||
|
|
@ -17,6 +18,8 @@ const description = "Intrastate (state) DOT number registration for carriers ope
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
</main>
|
||||
</Base>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "State clean-truck / emissions compliance (NY, CO, MD, NJ, M
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
const slug = "state-trucking-bundle";
|
||||
|
|
@ -17,6 +18,8 @@ const description = "State Compliance Bundle — IRP, IFTA, state weight-distanc
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
</main>
|
||||
</Base>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "Unified Carrier Registration for interstate carriers.";
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import Base from "../../layouts/Base.astro";
|
||||
import Wizard from "../../components/intake/Wizard.astro";
|
||||
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
|
||||
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
|
||||
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ const description = "Reactivate an inactive or revoked USDOT number and bring yo
|
|||
<p class="pw-desc">{description}</p>
|
||||
</section>
|
||||
|
||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
||||
|
||||
<TruckingValueNotice slug={slug} />
|
||||
|
||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue