Add MCS-150 intake form for biennial update orders
Collects all fields needed for FMCSA Form MCS-150: - Legal name, DBA, DOT#, MC# - Principal business address - Entity type, carrier operation, interstate/intrastate - Fleet info (power units, drivers, annual miles) - 29 cargo type checkboxes - Authorized signer name and title Filed via fax to FMCSA at 202-366-3477 (VitalPBX). Previously was review-only with no data collection. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
b5cf4151ca
commit
d2b42cd4b8
3 changed files with 319 additions and 1 deletions
|
|
@ -39,6 +39,7 @@ import DCAgentStep from "./steps/DCAgentStep.astro";
|
|||
import CPNIStep from "./steps/CPNIStep.astro";
|
||||
import CDRPeriodStep from "./steps/CDRPeriodStep.astro";
|
||||
import OCNStep from "./steps/OCNStep.astro";
|
||||
import MCS150Step from "./steps/MCS150Step.astro";
|
||||
import ClassificationWizard from "./steps/ClassificationWizard.astro";
|
||||
import ReviewStep from "./steps/ReviewStep.astro";
|
||||
import PaymentStep from "./steps/PaymentStep.astro";
|
||||
|
|
@ -118,6 +119,7 @@ const STEP_LABELS: Record<string, string> = {
|
|||
{steps.includes("cpni_questions") && <div data-step="cpni_questions" hidden><CPNIStep /></div>}
|
||||
{steps.includes("cdr_period") && <div data-step="cdr_period" hidden><CDRPeriodStep /></div>}
|
||||
{steps.includes("ocn") && <div data-step="ocn" hidden><OCNStep /></div>}
|
||||
{steps.includes("mcs150") && <div data-step="mcs150" hidden><MCS150Step /></div>}
|
||||
{steps.includes("classification") && <div data-step="classification" hidden><ClassificationWizard /></div>}
|
||||
{steps.includes("review") && <div data-step="review" hidden><ReviewStep service_slug={service_slug} /></div>}
|
||||
{steps.includes("payment") && <div data-step="payment" hidden><PaymentStep service_slug={service_slug} /></div>}
|
||||
|
|
|
|||
315
site/src/components/intake/steps/MCS150Step.astro
Normal file
315
site/src/components/intake/steps/MCS150Step.astro
Normal file
|
|
@ -0,0 +1,315 @@
|
|||
---
|
||||
// MCS-150 Biennial Update intake — collects all fields needed for the form.
|
||||
---
|
||||
|
||||
<div class="pw-step" data-slug="mcs150-update">
|
||||
<h2>MCS-150 Update Information</h2>
|
||||
<p class="pw-help">
|
||||
Provide your current company information. We will prepare and fax your MCS-150 biennial update to FMCSA on your behalf.
|
||||
</p>
|
||||
|
||||
<div class="pw-form-grid">
|
||||
<h3>Company Information</h3>
|
||||
|
||||
<div class="pw-row">
|
||||
<label class="pw-field">
|
||||
<span>Legal Entity Name <em>*</em></span>
|
||||
<input type="text" id="mcs-legal-name" required placeholder="As it appears on incorporation documents" />
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="pw-row">
|
||||
<label class="pw-field">
|
||||
<span>DBA / Trade Name</span>
|
||||
<input type="text" id="mcs-dba" placeholder="If different from legal name" />
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="pw-row-2">
|
||||
<label class="pw-field">
|
||||
<span>USDOT Number <em>*</em></span>
|
||||
<input type="text" id="mcs-dot" required placeholder="e.g. 1234567" />
|
||||
</label>
|
||||
<label class="pw-field">
|
||||
<span>MC/MX/FF Number</span>
|
||||
<input type="text" id="mcs-mc" placeholder="e.g. MC-123456" />
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<h3>Principal Business Address</h3>
|
||||
|
||||
<div class="pw-row">
|
||||
<label class="pw-field">
|
||||
<span>Street Address <em>*</em></span>
|
||||
<input type="text" id="mcs-street" required placeholder="123 Main St" />
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="pw-row-3">
|
||||
<label class="pw-field">
|
||||
<span>City <em>*</em></span>
|
||||
<input type="text" id="mcs-city" required />
|
||||
</label>
|
||||
<label class="pw-field">
|
||||
<span>State <em>*</em></span>
|
||||
<select id="mcs-state" required>
|
||||
<option value="">--</option>
|
||||
<option value="AL">AL</option><option value="AK">AK</option><option value="AZ">AZ</option><option value="AR">AR</option>
|
||||
<option value="CA">CA</option><option value="CO">CO</option><option value="CT">CT</option><option value="DE">DE</option>
|
||||
<option value="FL">FL</option><option value="GA">GA</option><option value="HI">HI</option><option value="ID">ID</option>
|
||||
<option value="IL">IL</option><option value="IN">IN</option><option value="IA">IA</option><option value="KS">KS</option>
|
||||
<option value="KY">KY</option><option value="LA">LA</option><option value="ME">ME</option><option value="MD">MD</option>
|
||||
<option value="MA">MA</option><option value="MI">MI</option><option value="MN">MN</option><option value="MS">MS</option>
|
||||
<option value="MO">MO</option><option value="MT">MT</option><option value="NE">NE</option><option value="NV">NV</option>
|
||||
<option value="NH">NH</option><option value="NJ">NJ</option><option value="NM">NM</option><option value="NY">NY</option>
|
||||
<option value="NC">NC</option><option value="ND">ND</option><option value="OH">OH</option><option value="OK">OK</option>
|
||||
<option value="OR">OR</option><option value="PA">PA</option><option value="RI">RI</option><option value="SC">SC</option>
|
||||
<option value="SD">SD</option><option value="TN">TN</option><option value="TX">TX</option><option value="UT">UT</option>
|
||||
<option value="VT">VT</option><option value="VA">VA</option><option value="WA">WA</option><option value="WV">WV</option>
|
||||
<option value="WI">WI</option><option value="WY">WY</option><option value="DC">DC</option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="pw-field">
|
||||
<span>ZIP <em>*</em></span>
|
||||
<input type="text" id="mcs-zip" required maxlength="10" placeholder="12345" />
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="pw-row">
|
||||
<label class="pw-field">
|
||||
<span>Phone <em>*</em></span>
|
||||
<input type="tel" id="mcs-phone" required placeholder="(555) 123-4567" />
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<h3>Entity & Operations</h3>
|
||||
|
||||
<div class="pw-row-2">
|
||||
<label class="pw-field">
|
||||
<span>Entity Type <em>*</em></span>
|
||||
<select id="mcs-entity-type" required>
|
||||
<option value="">Select...</option>
|
||||
<option value="sole_proprietorship">Sole Proprietorship</option>
|
||||
<option value="partnership">Partnership</option>
|
||||
<option value="corporation">Corporation</option>
|
||||
<option value="llc">LLC</option>
|
||||
<option value="other">Other</option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="pw-field">
|
||||
<span>Carrier Operation <em>*</em></span>
|
||||
<select id="mcs-carrier-op" required>
|
||||
<option value="">Select...</option>
|
||||
<option value="authorized_for_hire">Authorized For-Hire</option>
|
||||
<option value="exempt_for_hire">Exempt For-Hire</option>
|
||||
<option value="private_property">Private (Property)</option>
|
||||
<option value="private_passengers">Private (Passengers)</option>
|
||||
<option value="us_mail">U.S. Mail</option>
|
||||
<option value="federal_government">Federal Government</option>
|
||||
<option value="state_government">State Government</option>
|
||||
<option value="local_government">Local Government</option>
|
||||
<option value="indian_tribe">Indian Tribe</option>
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="pw-row-2">
|
||||
<label class="pw-field">
|
||||
<span>Interstate / Intrastate <em>*</em></span>
|
||||
<select id="mcs-interstate" required>
|
||||
<option value="">Select...</option>
|
||||
<option value="interstate">Interstate (across state lines)</option>
|
||||
<option value="intrastate_hazmat">Intrastate — Hazmat only</option>
|
||||
<option value="intrastate_non_hazmat">Intrastate — Non-hazmat</option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="pw-field">
|
||||
<span>Hazmat? <em>*</em></span>
|
||||
<select id="mcs-hazmat" required>
|
||||
<option value="">Select...</option>
|
||||
<option value="no">No</option>
|
||||
<option value="yes">Yes</option>
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<h3>Fleet Information</h3>
|
||||
|
||||
<div class="pw-row-3">
|
||||
<label class="pw-field">
|
||||
<span>Power Units (trucks) <em>*</em></span>
|
||||
<input type="number" id="mcs-power-units" required min="0" placeholder="e.g. 5" />
|
||||
</label>
|
||||
<label class="pw-field">
|
||||
<span>Drivers <em>*</em></span>
|
||||
<input type="number" id="mcs-drivers" required min="0" placeholder="e.g. 6" />
|
||||
</label>
|
||||
<label class="pw-field">
|
||||
<span>Annual Miles</span>
|
||||
<input type="number" id="mcs-miles" min="0" placeholder="e.g. 250000" />
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<h3>Cargo Types (check all that apply)</h3>
|
||||
|
||||
<div class="pw-cargo-grid">
|
||||
<label><input type="checkbox" id="mcs-cargo-general" /> General Freight</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-household" /> Household Goods</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-metal" /> Metal/Sheets/Coils</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-motor-vehicles" /> Motor Vehicles</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-drivetow" /> Drive/Tow Away</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-logs" /> Logs/Poles/Lumber</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-building-materials" /> Building Materials</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-mobile-homes" /> Mobile Homes</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-machinery" /> Machinery/Large Objects</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-fresh-produce" /> Fresh Produce</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-liquids" /> Liquids/Gases</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-intermodal" /> Intermodal Containers</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-passengers" /> Passengers</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-oilfield" /> Oilfield Equipment</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-livestock" /> Livestock</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-grain" /> Grain/Feed/Hay</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-coal" /> Coal/Coke</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-meat" /> Meat</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-garbage" /> Garbage/Refuse</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-chemicals" /> Chemicals</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-commodities-dry" /> Commodities Dry Bulk</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-refrigerated" /> Refrigerated Food</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-beverages" /> Beverages</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-paper" /> Paper Products</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-utilities" /> Utility</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-farm-supplies" /> Farm Supplies</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-construction" /> Construction</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-water-well" /> Water Well</label>
|
||||
<label><input type="checkbox" id="mcs-cargo-other" /> Other</label>
|
||||
</div>
|
||||
|
||||
<h3>Authorized Signer</h3>
|
||||
|
||||
<div class="pw-row-2">
|
||||
<label class="pw-field">
|
||||
<span>Full Name <em>*</em></span>
|
||||
<input type="text" id="mcs-signer-name" required placeholder="Name of owner or officer" />
|
||||
</label>
|
||||
<label class="pw-field">
|
||||
<span>Title <em>*</em></span>
|
||||
<input type="text" id="mcs-signer-title" required placeholder="e.g. Owner, President, Member" />
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="pw-mcs150-errors" class="pw-err" hidden></div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.pw-step h2 { margin: 0 0 0.5rem; color: #1a2744; }
|
||||
.pw-step h3 { color: #1a2744; margin: 1.25rem 0 0.5rem; font-size: 0.95rem; border-bottom: 1px solid #e2e8f0; padding-bottom: 0.3rem; }
|
||||
.pw-help { color: #64748b; font-size: 0.9rem; margin-bottom: 1rem; }
|
||||
.pw-form-grid { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 1rem 1.25rem; }
|
||||
.pw-row, .pw-row-2, .pw-row-3 { margin-bottom: 0.75rem; }
|
||||
.pw-row-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; }
|
||||
.pw-row-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 0.75rem; }
|
||||
.pw-field { display: flex; flex-direction: column; gap: 0.2rem; }
|
||||
.pw-field span { font-size: 0.8rem; font-weight: 600; color: #374151; }
|
||||
.pw-field em { color: #dc2626; font-style: normal; }
|
||||
.pw-field input, .pw-field select { padding: 0.5rem; border: 1px solid #d1d5db; border-radius: 6px; font-size: 0.85rem; }
|
||||
.pw-field input:focus, .pw-field select:focus { outline: none; border-color: #f97316; box-shadow: 0 0 0 2px rgba(249,115,22,0.2); }
|
||||
.pw-cargo-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 0.3rem 1rem; font-size: 0.85rem; color: #374151; }
|
||||
.pw-cargo-grid label { display: flex; align-items: center; gap: 0.4rem; cursor: pointer; }
|
||||
.pw-err { color: #b91c1c; margin-top: 0.75rem; font-size: 0.9rem; background: #fee2e2; padding: 0.5rem 0.75rem; border-radius: 6px; }
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.pw-row-2, .pw-row-3 { grid-template-columns: 1fr; }
|
||||
.pw-cargo-grid { grid-template-columns: 1fr 1fr; }
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
// Hydrate from PWIntake state
|
||||
window.addEventListener("pw:step-shown", (evt: any) => {
|
||||
if (evt.detail.step !== "mcs150") return;
|
||||
const s = (window as any).PWIntake.get();
|
||||
const d = s.intake_data || {};
|
||||
const fields: Record<string, string> = {
|
||||
"mcs-legal-name": d.legal_name || s.entity?.legal_name || "",
|
||||
"mcs-dba": d.dba_name || s.entity?.dba_name || "",
|
||||
"mcs-dot": d.dot_number || "",
|
||||
"mcs-mc": d.mc_number || "",
|
||||
"mcs-street": d.address_street || "",
|
||||
"mcs-city": d.address_city || "",
|
||||
"mcs-state": d.address_state || "",
|
||||
"mcs-zip": d.address_zip || "",
|
||||
"mcs-phone": d.phone || "",
|
||||
"mcs-entity-type": d.entity_type || "",
|
||||
"mcs-carrier-op": d.carrier_operation || "",
|
||||
"mcs-interstate": d.interstate_intrastate || "",
|
||||
"mcs-hazmat": d.hazmat || "",
|
||||
"mcs-power-units": d.power_units || "",
|
||||
"mcs-drivers": d.drivers || "",
|
||||
"mcs-miles": d.annual_miles || "",
|
||||
"mcs-signer-name": d.signer_name || "",
|
||||
"mcs-signer-title": d.signer_title || "",
|
||||
};
|
||||
for (const [id, val] of Object.entries(fields)) {
|
||||
const el = document.getElementById(id) as HTMLInputElement | HTMLSelectElement;
|
||||
if (el && val) el.value = val;
|
||||
}
|
||||
});
|
||||
|
||||
// Save to PWIntake on step-next
|
||||
window.addEventListener("pw:step-next", (evt: any) => {
|
||||
const PW = (window as any).PWIntake;
|
||||
if (PW.steps[PW.get().step_index] !== "mcs150") return;
|
||||
|
||||
const errDiv = document.getElementById("pw-mcs150-errors") as HTMLDivElement;
|
||||
errDiv.hidden = true;
|
||||
|
||||
// Validate required fields
|
||||
const required = ["mcs-legal-name", "mcs-dot", "mcs-street", "mcs-city", "mcs-state", "mcs-zip",
|
||||
"mcs-phone", "mcs-entity-type", "mcs-carrier-op", "mcs-interstate", "mcs-hazmat",
|
||||
"mcs-power-units", "mcs-drivers", "mcs-signer-name", "mcs-signer-title"];
|
||||
const missing: string[] = [];
|
||||
for (const id of required) {
|
||||
const el = document.getElementById(id) as HTMLInputElement;
|
||||
if (!el || !el.value.trim()) missing.push(el?.parentElement?.querySelector("span")?.textContent || id);
|
||||
}
|
||||
if (missing.length) {
|
||||
evt.preventDefault();
|
||||
errDiv.hidden = false;
|
||||
errDiv.textContent = "Please fill in: " + missing.join(", ");
|
||||
return;
|
||||
}
|
||||
|
||||
// Collect cargo types
|
||||
const cargoTypes: string[] = [];
|
||||
document.querySelectorAll<HTMLInputElement>("[id^='mcs-cargo-']").forEach(cb => {
|
||||
if (cb.checked) cargoTypes.push(cb.id.replace("mcs-cargo-", ""));
|
||||
});
|
||||
|
||||
const val = (id: string) => (document.getElementById(id) as HTMLInputElement)?.value?.trim() || "";
|
||||
const state = PW.get();
|
||||
const intake = {
|
||||
...state.intake_data,
|
||||
legal_name: val("mcs-legal-name"),
|
||||
dba_name: val("mcs-dba"),
|
||||
dot_number: val("mcs-dot"),
|
||||
mc_number: val("mcs-mc"),
|
||||
address_street: val("mcs-street"),
|
||||
address_city: val("mcs-city"),
|
||||
address_state: val("mcs-state"),
|
||||
address_zip: val("mcs-zip"),
|
||||
phone: val("mcs-phone"),
|
||||
entity_type: val("mcs-entity-type"),
|
||||
carrier_operation: val("mcs-carrier-op"),
|
||||
interstate_intrastate: val("mcs-interstate"),
|
||||
hazmat: val("mcs-hazmat"),
|
||||
power_units: val("mcs-power-units"),
|
||||
drivers: val("mcs-drivers"),
|
||||
annual_miles: val("mcs-miles"),
|
||||
cargo_types: cargoTypes,
|
||||
signer_name: val("mcs-signer-name"),
|
||||
signer_title: val("mcs-signer-title"),
|
||||
};
|
||||
PW.set({ ...state, intake_data: intake });
|
||||
});
|
||||
</script>
|
||||
|
|
@ -35,6 +35,7 @@ export type IntakeStep =
|
|||
| "cpni_questions" // NEW: CPNI certification questionnaire (sec 5-9)
|
||||
| "cdr_period"
|
||||
| "ocn"
|
||||
| "mcs150" // MCS-150 biennial update form fields
|
||||
| "review"
|
||||
| "payment";
|
||||
|
||||
|
|
@ -104,7 +105,7 @@ export const INTAKE_MANIFEST: Record<string, IntakeStep[]> = {
|
|||
// ── DOT / FMCSA Motor Carrier Services ──────────────────────────
|
||||
// Review-only intake: DOT#, name, email already collected at checkout.
|
||||
// Admin handles the filing using the info from the order.
|
||||
"mcs150-update": ["review"],
|
||||
"mcs150-update": ["mcs150", "review"],
|
||||
"boc3-filing": ["review"],
|
||||
"ucr-registration": ["review"],
|
||||
"dot-registration": ["review"],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue