From b2231007b6ce8f112acdd96c5f76c431dd701004 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 19 Mar 2026 14:47:22 -0700 Subject: [PATCH 1/4] IO-3515 Bill OCR Feedback. --- bodyshop_translations.babel | 819 ++++++++++++++++++ .../bill-ai-feedback.component.jsx | 104 +++ .../bill-enter-ai-scan.component.jsx | 5 +- .../bill-enter-modal.container.jsx | 9 +- client/src/translations/en_us/common.json | 51 +- client/src/translations/es/common.json | 51 +- client/src/translations/fr/common.json | 51 +- localstack/init/10-bootstrap.sh | 0 server/ai/bill-ai-feedback.js | 72 ++ server/ai/bill-ocr/bill-ocr.js | 6 +- server/email/sendemail.js | 3 +- server/routes/aiRoutes.js | 11 +- 12 files changed, 1103 insertions(+), 79 deletions(-) create mode 100644 client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx mode change 100644 => 100755 localstack/init/10-bootstrap.sh create mode 100644 server/ai/bill-ai-feedback.js diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index cfb312ab1..2449aeb52 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -2696,6 +2696,27 @@ + + oem_partno + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + quantity false @@ -3684,6 +3705,48 @@ + + feedback_placeholder + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + feedback_prompt + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + generic_failure false @@ -3831,6 +3894,27 @@ + + submit_feedback + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + @@ -8641,6 +8725,27 @@ + + manual-line + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + partsqueue false @@ -17816,6 +17921,468 @@ labels + + banner_message + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + banner_status_connected + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + banner_status_disconnected + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + clear_logs + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + collapse_all + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + color_json + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + copied + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + copy + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + copy_request + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + copy_response + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + details + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + expand_all + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + hide_details + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + log_level + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + plain_json + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + provider_cdk + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + provider_dms + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + provider_fortellis + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + provider_pbs + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + provider_reynolds + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + reconnect + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + reconnected_export_service + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + refreshallocations false @@ -17837,6 +18404,153 @@ + + request_xml + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + response_xml + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + rr_validation_message + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + rr_validation_notice_description + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + rr_validation_notice_title + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + transport_ws + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + transport_wss + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + @@ -20590,6 +21304,27 @@ + + done + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + download false @@ -23009,6 +23744,27 @@ + + validationerror + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + view false @@ -23423,6 +24179,27 @@ validation + + array + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + dateRangeExceeded false @@ -57452,6 +58229,27 @@ + + work_in_progress_labour_summary + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + work_in_progress_payables false @@ -57473,6 +58271,27 @@ + + work_in_progress_payables_summary + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + diff --git a/client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx b/client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx new file mode 100644 index 000000000..0693937b1 --- /dev/null +++ b/client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx @@ -0,0 +1,104 @@ +import { DislikeOutlined, LikeOutlined } from "@ant-design/icons"; +import { Button, Form, Input, Radio, Space } from "antd"; +import axios from "axios"; +import { useState } from "react"; +import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; +import { useTranslation } from "react-i18next"; + +function BillAiFeedback({ billForm, rawAIData }) { + const { t } = useTranslation(); + const [form] = Form.useForm(); + const [submitting, setSubmitting] = useState(false); + const notification = useNotification(); + + //Need to sanitize becuase we pass as form data to include the attachment. + const sanitizeBillFormValues = (value) => { + const seen = new WeakSet(); + return JSON.stringify( + value, + (key, v) => { + if (key === "originFileObj") return undefined; + if (key === "thumbUrl") return undefined; + if (key === "preview") return undefined; + if (typeof v === "function") return undefined; + if (v && typeof v === "object") { + if (seen.has(v)) return "[Circular]"; + seen.add(v); + } + return v; + }, + 0 + ); + }; + + const getAttachmentFromBillFormUpload = () => { + const uploads = billForm?.getFieldValue?.("upload") || []; + const files = uploads.map((u) => u?.originFileObj).filter(Boolean); + + return ( + files.find((f) => f?.type === "application/pdf") || + files.find((f) => isString(f?.name) && f.name.toLowerCase().endsWith(".pdf")) || + files[0] || + null + ); + }; + + const submitFeedback = async ({ rating, comments }) => { + setSubmitting(true); + try { + const billFormValues = billForm.getFieldsValue(true); + + const formData = new FormData(); + formData.append("rating", rating); + formData.append("comments", comments || ""); + formData.append("billFormValues", sanitizeBillFormValues(billFormValues)); + formData.append("rawAIData", sanitizeBillFormValues(rawAIData)); + + const attachmentFile = getAttachmentFromBillFormUpload(); + if (attachmentFile) { + formData.append("billPdf", attachmentFile, attachmentFile.name || "bill.pdf"); + } + + await axios.post("/ai/bill-feedback", formData); + + notification.success({ + title: "Thanks — feedback submitted" + }); + form.resetFields(); + } catch (error) { + notification.error({ + title: "Failed to submit feedback", + description: error?.response?.data?.message || error?.message + }); + } finally { + setSubmitting(false); + } + }; + + const isString = (v) => typeof v === "string"; + + return ( +
+ + + + + + + + + + + + + + + + + +
+ ); +} +export default BillAiFeedback; diff --git a/client/src/components/bill-enter-ai-scan/bill-enter-ai-scan.component.jsx b/client/src/components/bill-enter-ai-scan/bill-enter-ai-scan.component.jsx index 453895b59..f4f9362d6 100644 --- a/client/src/components/bill-enter-ai-scan/bill-enter-ai-scan.component.jsx +++ b/client/src/components/bill-enter-ai-scan/bill-enter-ai-scan.component.jsx @@ -23,7 +23,8 @@ function BillEnterAiScan({ fileInputRef, scanLoading, setScanLoading, - setIsAiScan + setIsAiScan, + setRawAIData }) { const notification = useNotification(); const { t } = useTranslation(); @@ -57,6 +58,7 @@ function BillEnterAiScan({ } setScanLoading(false); + setRawAIData(data.data); // Update form with the extracted data if (data?.data?.billForm) { form.setFieldsValue(data.data.billForm); @@ -147,6 +149,7 @@ function BillEnterAiScan({ setScanLoading(false); form.setFieldsValue(data.data.billForm); + setRawAIData(data.data); await form.validateFields(["billlines"], { recursive: true }); notification.success({ diff --git a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx index a73b19663..734b401a6 100644 --- a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx +++ b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx @@ -28,6 +28,7 @@ import { CalculateBillTotal } from "../bill-form/bill-form.totals.utility"; import { handleUpload as handleLocalUpload } from "../documents-local-upload/documents-local-upload.utility"; import { handleUpload as handleUploadToImageProxy } from "../documents-upload-imgproxy/documents-upload-imgproxy.utility"; import { handleUpload } from "../documents-upload/documents-upload.utility"; +import BillAiFeedback from "../bill-ai-feedback/bill-ai-feedback.component.jsx"; const mapStateToProps = createStructuredSelector({ billEnterModal: selectBillEnterModal, @@ -53,6 +54,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, const [loading, setLoading] = useState(false); const [scanLoading, setScanLoading] = useState(false); const [isAiScan, setIsAiScan] = useState(false); + const [rawAIData, setRawAIData] = useState(null); const client = useApolloClient(); const [generateLabel, setGenerateLabel] = useLocalStorage("enter_bill_generate_label", false); const notification = useNotification(); @@ -387,6 +389,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, billlines: [] }); setIsAiScan(false); + setRawAIData(null); // form.resetFields(); } else { toggleModalVisible(); @@ -404,6 +407,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, } setScanLoading(false); setIsAiScan(false); + setRawAIData(null); toggleModalVisible(); } }; @@ -429,6 +433,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, } setScanLoading(false); setIsAiScan(false); + setRawAIData(null); } }, [billEnterModal.open, form, formValues]); @@ -456,6 +461,7 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, scanLoading={scanLoading} setScanLoading={setScanLoading} setIsAiScan={setIsAiScan} + setRawAIData={setRawAIData} /> )} @@ -471,7 +477,8 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, setLoading(false); }} footer={ - + + {isAiScan && } setGenerateLabel(e.target.checked)}> {t("bills.labels.generatepartslabel")} diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index e216b9cd5..a24453ae0 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -231,13 +231,16 @@ "overall": "Overall" }, "disclaimer_title": "AI Scan Beta Disclaimer", + "feedback_placeholder": "Tell us what worked, what didn't, and what could be better.", + "feedback_prompt": "Was this AI scan helpful?", "generic_failure": "Failed to process invoice.", "multipage": "The is a multi-page document. Processing will take a few moments.", "processing": "Analyzing Bill", "scan": "AI Bill Scanner", "scancomplete": "AI Scan Complete", "scanfailed": "AI Scan Failed", - "scanstarted": "AI Scan Started" + "scanstarted": "AI Scan Started", + "submit_feedback": "Submit Feedback" }, "bill_lines": "Bill Lines", "bill_total": "Bill Total Amount", @@ -1075,36 +1078,36 @@ "earlyrorequired.message": "This job requires an early Repair Order to be created before posting to Reynolds. Please use the admin panel to create the early RO first." }, "labels": { - "refreshallocations": "Refresh to see DMS Allocations.", - "provider_reynolds": "Reynolds", - "provider_fortellis": "Fortellis", - "provider_cdk": "CDK", - "provider_pbs": "PBS", - "provider_dms": "DMS", - "transport_wss": "(WSS)", - "transport_ws": "(WS)", + "banner_message": "Posting to {{provider}} | {{transport}} | {{status}}", "banner_status_connected": "Connected", "banner_status_disconnected": "Disconnected", - "banner_message": "Posting to {{provider}} | {{transport}} | {{status}}", - "reconnected_export_service": "Reconnected to {{provider}} Export Service", - "rr_validation_message": "Repair Order created in Reynolds. Complete validation in Reynolds, then click Finished/Close to finalize.", - "rr_validation_notice_title": "Reynolds RO created", - "rr_validation_notice_description": "Complete validation in Reynolds, then click Finished/Close to finalize and mark this export complete.", - "color_json": "Color JSON", - "plain_json": "Plain JSON", - "collapse_all": "Collapse All", - "expand_all": "Expand All", - "log_level": "Log Level", "clear_logs": "Clear Logs", - "reconnect": "Reconnect", - "details": "Details", - "hide_details": "Hide details", - "copy": "Copy", + "collapse_all": "Collapse All", + "color_json": "Color JSON", "copied": "Copied", + "copy": "Copy", "copy_request": "Copy Request", "copy_response": "Copy Response", + "details": "Details", + "expand_all": "Expand All", + "hide_details": "Hide details", + "log_level": "Log Level", + "plain_json": "Plain JSON", + "provider_cdk": "CDK", + "provider_dms": "DMS", + "provider_fortellis": "Fortellis", + "provider_pbs": "PBS", + "provider_reynolds": "Reynolds", + "reconnect": "Reconnect", + "reconnected_export_service": "Reconnected to {{provider}} Export Service", + "refreshallocations": "Refresh to see DMS Allocations.", "request_xml": "Request XML", - "response_xml": "Response XML" + "response_xml": "Response XML", + "rr_validation_message": "Repair Order created in Reynolds. Complete validation in Reynolds, then click Finished/Close to finalize.", + "rr_validation_notice_description": "Complete validation in Reynolds, then click Finished/Close to finalize and mark this export complete.", + "rr_validation_notice_title": "Reynolds RO created", + "transport_ws": "(WS)", + "transport_wss": "(WSS)" } }, "documents": { diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 50b336d37..f16ca40e5 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -231,13 +231,16 @@ "overall": "" }, "disclaimer_title": "", + "feedback_placeholder": "", + "feedback_prompt": "", "generic_failure": "", "multipage": "", "processing": "", "scan": "", "scancomplete": "", "scanfailed": "", - "scanstarted": "" + "scanstarted": "", + "submit_feedback": "" }, "bill_lines": "", "bill_total": "", @@ -1075,36 +1078,36 @@ "earlyrorequired.message": "" }, "labels": { - "refreshallocations": "", - "provider_reynolds": "", - "provider_fortellis": "", - "provider_cdk": "", - "provider_pbs": "", - "provider_dms": "", - "transport_wss": "", - "transport_ws": "", + "banner_message": "", "banner_status_connected": "", "banner_status_disconnected": "", - "banner_message": "", - "reconnected_export_service": "", - "rr_validation_message": "", - "rr_validation_notice_title": "", - "rr_validation_notice_description": "", - "color_json": "", - "plain_json": "", - "collapse_all": "", - "expand_all": "", - "log_level": "", "clear_logs": "", - "reconnect": "", - "details": "", - "hide_details": "", - "copy": "", + "collapse_all": "", + "color_json": "", "copied": "", + "copy": "", "copy_request": "", "copy_response": "", + "details": "", + "expand_all": "", + "hide_details": "", + "log_level": "", + "plain_json": "", + "provider_cdk": "", + "provider_dms": "", + "provider_fortellis": "", + "provider_pbs": "", + "provider_reynolds": "", + "reconnect": "", + "reconnected_export_service": "", + "refreshallocations": "", "request_xml": "", - "response_xml": "" + "response_xml": "", + "rr_validation_message": "", + "rr_validation_notice_description": "", + "rr_validation_notice_title": "", + "transport_ws": "", + "transport_wss": "" } }, "documents": { diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 727d689f8..8004d5e6b 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -231,13 +231,16 @@ "overall": "" }, "disclaimer_title": "", + "feedback_placeholder": "", + "feedback_prompt": "", "generic_failure": "", "multipage": "", "processing": "", "scan": "", "scancomplete": "", "scanfailed": "", - "scanstarted": "" + "scanstarted": "", + "submit_feedback": "" }, "bill_lines": "", "bill_total": "", @@ -1075,36 +1078,36 @@ "earlyrorequired.message": "" }, "labels": { - "refreshallocations": "", - "provider_reynolds": "", - "provider_fortellis": "", - "provider_cdk": "", - "provider_pbs": "", - "provider_dms": "", - "transport_wss": "", - "transport_ws": "", + "banner_message": "", "banner_status_connected": "", "banner_status_disconnected": "", - "banner_message": "", - "reconnected_export_service": "", - "rr_validation_message": "", - "rr_validation_notice_title": "", - "rr_validation_notice_description": "", - "color_json": "", - "plain_json": "", - "collapse_all": "", - "expand_all": "", - "log_level": "", "clear_logs": "", - "reconnect": "", - "details": "", - "hide_details": "", - "copy": "", + "collapse_all": "", + "color_json": "", "copied": "", + "copy": "", "copy_request": "", "copy_response": "", + "details": "", + "expand_all": "", + "hide_details": "", + "log_level": "", + "plain_json": "", + "provider_cdk": "", + "provider_dms": "", + "provider_fortellis": "", + "provider_pbs": "", + "provider_reynolds": "", + "reconnect": "", + "reconnected_export_service": "", + "refreshallocations": "", "request_xml": "", - "response_xml": "" + "response_xml": "", + "rr_validation_message": "", + "rr_validation_notice_description": "", + "rr_validation_notice_title": "", + "transport_ws": "", + "transport_wss": "" } }, "documents": { diff --git a/localstack/init/10-bootstrap.sh b/localstack/init/10-bootstrap.sh old mode 100644 new mode 100755 diff --git a/server/ai/bill-ai-feedback.js b/server/ai/bill-ai-feedback.js new file mode 100644 index 000000000..e136c60f4 --- /dev/null +++ b/server/ai/bill-ai-feedback.js @@ -0,0 +1,72 @@ +const { isString } = require("lodash"); +const { sendServerEmail } = require("../email/sendemail"); +const logger = require("../utils/logger"); +const { raw } = require("express"); + +const SUPPORT_EMAIL = "patrick@imexsystems.ca"; + +const safeJsonParse = (maybeJson) => { + if (!isString(maybeJson)) return null; + try { + return JSON.parse(maybeJson); + } catch { + return null; + } +}; + + +const handleBillAiFeedback = async (req, res) => { + try { + const rating = req.body?.rating; + const comments = isString(req.body?.comments) ? req.body?.comments?.trim() : ""; + + const billFormValues = safeJsonParse(req.body?.billFormValues); + const rawAIData = safeJsonParse(req.body?.rawAIData); + + const jobid = billFormValues?.jobid || billFormValues?.jobId || "unknown"; + const subject = `Bill AI Feedback (${rating === "up" ? "+" : "-"}) jobid=${jobid}`; + + const text = [ + `User: ${req?.user?.email || "unknown"}`, + `Rating: ${rating}`, + comments ? `Comments: ${comments}` : "Comments: (none)", + "", + "Form Values (User):", + JSON.stringify(billFormValues, null, 4), + "", + "Raw AI Data:", + JSON.stringify(rawAIData, null, 4) + ] + .filter(Boolean) + .join("\n"); + + const attachments = []; + if (req.file?.buffer) { + attachments.push({ + filename: req.file.originalname || `bill-${jobid}.pdf`, + content: req.file.buffer, + contentType: req.file.mimetype || "application/pdf" + }); + } + + await sendServerEmail({ + to: [SUPPORT_EMAIL], + subject, + type: "text", + text, + attachments + }); + + return res.json({ success: true }); + } catch (error) { + logger.log("bill-ai-feedback-error", "ERROR", req?.user?.email, null, { + message: error?.message, + stack: error?.stack + }); + return res.status(500).json({ message: "Failed to submit feedback" }); + } +}; + +module.exports = { + handleBillAiFeedback +}; diff --git a/server/ai/bill-ocr/bill-ocr.js b/server/ai/bill-ocr/bill-ocr.js index 26e77033a..6c1101207 100644 --- a/server/ai/bill-ocr/bill-ocr.js +++ b/server/ai/bill-ocr/bill-ocr.js @@ -212,7 +212,8 @@ async function processSinglePageDocument(pdfBuffer) { return { ...processedData, - originalTextractResponse: result + //Removed as this is a large object that provides minimal value to send to client. + // originalTextractResponse: result }; } @@ -392,7 +393,8 @@ async function handleTextractNotification(message) { status: 'COMPLETED', data: { ...processedData, - originalTextractResponse: originalResponse + //Removed as this is a large object that provides minimal value to send to client. + // originalTextractResponse: originalResponse }, completedAt: new Date().toISOString() } diff --git a/server/email/sendemail.js b/server/email/sendemail.js index e39a2093c..bcef44c0a 100644 --- a/server/email/sendemail.js +++ b/server/email/sendemail.js @@ -44,7 +44,7 @@ const logEmail = async (req, email) => { } }; -const sendServerEmail = async ({ subject, text, to = [] }) => { +const sendServerEmail = async ({ subject, text, to = [], attachments }) => { if (process.env.NODE_ENV === undefined) return; try { @@ -57,6 +57,7 @@ const sendServerEmail = async ({ subject, text, to = [] }) => { to: ["support@imexsystems.ca", ...to], subject: subject, text: text, + attachments: attachments, ses: { // optional extra arguments for SendRawEmail Tags: [ diff --git a/server/routes/aiRoutes.js b/server/routes/aiRoutes.js index f06125718..b92b1b69d 100644 --- a/server/routes/aiRoutes.js +++ b/server/routes/aiRoutes.js @@ -4,9 +4,14 @@ const multer = require("multer"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware"); const { handleBillOcr, handleBillOcrStatus } = require("../ai/bill-ocr/bill-ocr"); +const { handleBillAiFeedback } = require("../ai/bill-ai-feedback"); -// Configure multer for form data parsing -const upload = multer(); +// Configure multer for form data parsing (memory storage) +const upload = multer({ + limits: { + fileSize: 5 * 1024 * 1024 // 5MB + } +}); router.use(validateFirebaseIdTokenMiddleware); router.use(withUserGraphQLClientMiddleware); @@ -14,4 +19,6 @@ router.use(withUserGraphQLClientMiddleware); router.post("/bill-ocr", upload.single('billScan'), handleBillOcr); router.get("/bill-ocr/status/:textractJobId", handleBillOcrStatus); +router.post("/bill-feedback", upload.single("billPdf"), handleBillAiFeedback); + module.exports = router; From 5812d53efc4bf3069f155f11ba782a4726df68e9 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 19 Mar 2026 14:54:40 -0700 Subject: [PATCH 2/4] IO-3515 Improved feedback layout. --- .../bill-ai-feedback.component.jsx | 20 +++++--- .../bill-enter-modal.container.jsx | 49 +++++++++++-------- 2 files changed, 41 insertions(+), 28 deletions(-) diff --git a/client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx b/client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx index 0693937b1..d0e5c591f 100644 --- a/client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx +++ b/client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx @@ -79,7 +79,7 @@ function BillAiFeedback({ billForm, rawAIData }) { return (
- + @@ -91,12 +91,18 @@ function BillAiFeedback({ billForm, rawAIData }) { - - - - + + + + + + ); diff --git a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx index 734b401a6..e4236e354 100644 --- a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx +++ b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx @@ -1,6 +1,6 @@ import { useApolloClient, useMutation } from "@apollo/client/react"; import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; -import { Button, Checkbox, Form, Modal, Space } from "antd"; +import { Button, Checkbox, Divider, Form, Modal, Space } from "antd"; import _ from "lodash"; import { useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -477,27 +477,34 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, setLoading(false); }} footer={ - - {isAiScan && } - setGenerateLabel(e.target.checked)}> - {t("bills.labels.generatepartslabel")} - - - - {billEnterModal.context && billEnterModal.context.id ? null : ( - + + {isAiScan && ( + <> + + + )} + + setGenerateLabel(e.target.checked)}> + {t("bills.labels.generatepartslabel")} + + + + {billEnterModal.context && billEnterModal.context.id ? null : ( + + )} + } destroyOnHidden From 51fca7a63caabdbe388251f27d479a4dd3690b8d Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Fri, 20 Mar 2026 09:13:01 -0700 Subject: [PATCH 3/4] IO-3515 Add shopname to bill ai feedback. --- .../bill-ai-feedback/bill-ai-feedback.component.jsx | 12 ++++++++++-- server/ai/bill-ai-feedback.js | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx b/client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx index d0e5c591f..820eb3e9e 100644 --- a/client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx +++ b/client/src/components/bill-ai-feedback/bill-ai-feedback.component.jsx @@ -4,8 +4,15 @@ import axios from "axios"; import { useState } from "react"; import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { selectBodyshop } from "../../redux/user/user.selectors.js"; +import { createStructuredSelector } from "reselect"; -function BillAiFeedback({ billForm, rawAIData }) { +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop +}); + +function BillAiFeedback({ billForm, rawAIData, bodyshop }) { const { t } = useTranslation(); const [form] = Form.useForm(); const [submitting, setSubmitting] = useState(false); @@ -53,6 +60,7 @@ function BillAiFeedback({ billForm, rawAIData }) { formData.append("comments", comments || ""); formData.append("billFormValues", sanitizeBillFormValues(billFormValues)); formData.append("rawAIData", sanitizeBillFormValues(rawAIData)); + formData.append("shopname", bodyshop?.shopname || ""); const attachmentFile = getAttachmentFromBillFormUpload(); if (attachmentFile) { @@ -107,4 +115,4 @@ function BillAiFeedback({ billForm, rawAIData }) { ); } -export default BillAiFeedback; +export default connect(mapStateToProps, null)(BillAiFeedback); diff --git a/server/ai/bill-ai-feedback.js b/server/ai/bill-ai-feedback.js index e136c60f4..25f969771 100644 --- a/server/ai/bill-ai-feedback.js +++ b/server/ai/bill-ai-feedback.js @@ -24,7 +24,8 @@ const handleBillAiFeedback = async (req, res) => { const rawAIData = safeJsonParse(req.body?.rawAIData); const jobid = billFormValues?.jobid || billFormValues?.jobId || "unknown"; - const subject = `Bill AI Feedback (${rating === "up" ? "+" : "-"}) jobid=${jobid}`; + const shopname = req.body?.shopname || "unknown"; + const subject = `Bill AI Feedback (${rating === "up" ? "+" : "-"}) Shop=${shopname} jobid=${jobid}`; const text = [ `User: ${req?.user?.email || "unknown"}`, From 0622696650486f81d2d675951156bf581c1830ff Mon Sep 17 00:00:00 2001 From: Dave Date: Fri, 20 Mar 2026 14:55:08 -0400 Subject: [PATCH 4/4] Fix RR --- server/rr/lib/index.cjs | 2 +- server/rr/lib/index.mjs | 2 +- server/rr/rr-job-export.js | 36 ++++++++++++++++++++++++------------ server/rr/rr-job-helpers.js | 11 +++++++---- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/server/rr/lib/index.cjs b/server/rr/lib/index.cjs index 9b9e3100d..e3792b978 100644 --- a/server/rr/lib/index.cjs +++ b/server/rr/lib/index.cjs @@ -1 +1 @@ -"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o({routing:e={},sender:o={},creationDateTime:a,bodId:t}={}){const d={Sender:{Component:o.component??"Rome",Task:o.task??"CU",ReferenceId:o.referenceId??"Query",CreatorNameCode:o.creator??"RCI",SenderNameCode:o.senderName??"RCI"},CreationDateTime:a??(new Date).toISOString().replace(/\.\d{3}Z$/,"Z"),BODId:t??B.v4(),Destination:{DestinationNameCode:"RR",DealerNumber:e.dealerNumber||"",StoreNumber:e.storeNumber||"",AreaNumber:e.areaNumber||""}},r={bod:"{{#BODId}}{{BODId}}{{/BODId}}",creation:"{{CreationDateTime}}",sender:"\n \n {{Sender.Component}}\n {{Sender.Task}}\n {{#Sender.ReferenceId}}{{Sender.ReferenceId}}{{/Sender.ReferenceId}}\n {{#Sender.CreatorNameCode}}{{Sender.CreatorNameCode}}{{/Sender.CreatorNameCode}}\n {{#Sender.SenderNameCode}}{{Sender.SenderNameCode}}{{/Sender.SenderNameCode}}\n ".trim(),dest:"\n \n {{Destination.DestinationNameCode}}\n {{#Destination.DealerNumber}}{{Destination.DealerNumber}}{{/Destination.DealerNumber}}\n {{#Destination.StoreNumber}}{{Destination.StoreNumber}}{{/Destination.StoreNumber}}\n {{#Destination.AreaNumber}}{{Destination.AreaNumber}}{{/Destination.AreaNumber}}\n ".trim()},i=`\n${["bod","creation","sender","dest"].map(e=>r[e]).join("\n")}\n`;return U.default.render(i,d).trim()}function a(e,o=2){const a=" ".repeat(o);return String(e).split("\n").map(e=>e.length?a+e:e).join("\n")}function t(e){return String(e??"").replace(/&/g,"&").replace(//g,">")}function d(e,o){if(null==e)return null;if(Array.isArray(e)){for(const a of e){const e=d(a,o);if(null!=e)return e}return null}if("object"!=typeof e)return null;for(const[a,t]of Object.entries(e)){if(o(a,t))return t;const e=d(t,o);if(null!=e)return e}return null}function r(e,o,a=[]){if(null==e)return a;if(Array.isArray(e)){for(const t of e)r(t,o,a);return a}if("object"!=typeof e)return a;for(const[t,d]of Object.entries(e))o(t,d)&&a.push(d),r(d,o,a);return a}function i(e){return null==e?[]:Array.isArray(e)?e:[e]}function s(e,o){if(e&&"object"==typeof e)return function(e){if(null!=e)return"string"==typeof e||"number"==typeof e||"boolean"==typeof e?String(e):"object"==typeof e&&"#text"in e?String(e["#text"]):void 0}(e[o])}function l(e,o){const a=s(e,o);if(q(a))return a;const t=function(e,o){if(e&&"object"==typeof e)return e.$&&q(e.$[o])?e.$[o]:q(e[`@_${o}`])?e[`@_${o}`]:q(e[`@${o}`])?e[`@${o}`]:e._attributes&&q(e._attributes[o])?e._attributes[o]:e.attributes&&q(e.attributes[o])?e.attributes[o]:void 0}(e,o);return q(t)?t:void 0}function n(e,o){if(e&&"object"==typeof e)return null!=e[`@_${o}`]?e[`@_${o}`]:void 0}function c(e){if(null!=e){if("string"==typeof e)return e;if("number"==typeof e)return String(e);if("object"==typeof e){if(null!=e._)return String(e._);if(null!=e["#text"])return String(e["#text"]);if(null!=e.text)return String(e.text)}}}function p(e){return r(e,e=>/(GenTransStatus|TransStatus)$/i.test(e)).flatMap(i)[0]}function y(e){if(e)return{status:(n(e,"Status")||e.Status||c(e)||"").toString().trim()||void 0,statusCode:(n(e,"StatusCode")||e.StatusCode||"").toString().trim()||void 0,message:e.Message&&c(e.Message)||e.GenTransStatus&&c(e.GenTransStatus)||e.TransStatus&&c(e.TransStatus)||c(e)||void 0}}function u(e){if(e)return{status:(n(e,"Status")||e.Status||c(e)||"").toString().trim()||void 0,date:(n(e,"Date")||e.Date||"").toString().trim()||void 0,time:(n(e,"Time")||e.Time||"").toString().trim()||void 0,outsdRoNo:(n(e,"OutsdRoNo")||e.OutsdRoNo||"").toString().trim()||void 0,dmsRoNo:(n(e,"DMSRoNo")||e.DMSRoNo||"").toString().trim()||void 0,errorMessage:(n(e,"ErrorMessage")||e.ErrorMessage||"").toString().trim()||void 0}}function m(e){const o=e?.rey_RomeCustServVehCombRes??e?.rey_RomeCustServVehCombReq??e?.rey_RomeCustServVehComb??e??{};return i(o?.CustServVehComb??o?.CustServVehCombRes??o?.CustServVehCombReq??o).map(e=>{const o=e?.NameContactId??void 0,a=o?.NameId??void 0,t=a?.IndName?$(a.IndName):void 0,d=a?.BusName?$(a.BusName):void 0,r=o&&{NameId:a&&{...$(a)||{},...t?{IndName:t}:{},...d?{BusName:d}:{}},Address:i(o?.Address).map(e=>$(e)||{}),ContactOptions:i(o?.ContactOptions).map(e=>$(e)||{}),Phone:i(o?.Phone).map(e=>$(e)||{}),Email:i(o?.Email).map(e=>$(e)||{})},s=i(e?.ServVehicle).map(e=>{const o=e?.Vehicle,a=o?.VehicleDetail,t=o&&{...$(o)||{},...a?{VehicleDetail:$(a)||{}}:{}},d=e?.VehicleServInfo,r=d?.VehExtWarranty,s=d?.Advisor,l=s?.ContactInfo;let n;s&&(n={...$(s)||{},...l?{ContactInfo:$(l)||{}}:{}});const c=d&&{...$(d)||{},...r?{VehExtWarranty:$(r)||{}}:{},...n?{Advisor:n}:{},...d?.VehServComments?{VehServComments:i(d.VehServComments).map(e=>X(e)).filter(e=>null!=e&&""!==String(e).trim())}:{}};return{...t?{Vehicle:t}:{},...c?{VehicleServInfo:c}:{}}}),l=i(e?.Message).map(e=>{const o=X(e);return{...$(e)||{},...null!=o&&""!==String(o).trim()?{Text:o}:{}}}).filter(e=>Object.keys(e).length>0),n={};return r&&(n.NameContactId=r),s.length&&(n.ServVehicle=s),l.length&&(n.Message=l),n})}function T(e,o){if(null!=e)return String("string"==typeof e||"number"==typeof e?e:e[o]||"")}function C(e){return String(e??"").trim()||void 0}function R(e,...o){if(e)for(const a of o){if(e.$&&null!=e.$[a])return e.$[a];if(null!=e[`@_${a}`])return e[`@_${a}`];if(null!=e[a]&&"object"!=typeof e[a])return e[a]}}function g(e){const o=function(e){const o=d(e,e=>"rey_RomeCustomerResponse"===e||e.endsWith(":rey_RomeCustomerResponse"));return o?r(o,e=>"TransStatus"===e||e.endsWith(":TransStatus")).flatMap(i)[0]:void console.log("No rey_RomeCustomerResponse found in root")}(e);if(!o)return{dmsRecKey:void 0};const a=R(o,"DMSRecKey");return{dmsRecKey:null!=a?String(a):void 0,status:R(o,"Status"),statusCode:R(o,"StatusCode")}}function N(e){if(null==e)return;const o=String(e).toUpperCase().replace(/[^A-Z0-9 ]+/g,"");if(!o)throw new J(`Invalid string: ${e}. Must contain A-Z, 0-9, or space`);return o}function b(e){return e?String(e).toUpperCase():void 0}function S(e={}){const o=b(e.ibFlag)||(e.firstName?"I":"B");if("I"!==o&&"B"!==o)throw new J("ibFlag must be 'I' or 'B'");const a=e.lastName||e.customerName;if(!a)throw new J("lastName or customerName required");if("I"===o&&!e.firstName)throw new J("firstName required when ibFlag='I'");const t=b(e.customerType);if(t&&!["R","W","I"].includes(t))throw new J("customerType must be 'R', 'W', 'I', Retail, Wholesale, or Internal");const d=(e.addresses||[]).map(e=>{const o={Type:b(e.type)||"P",Addr1:e.line1?String(e.line1):void 0,Addr2:e.line2?String(e.line2):void 0,City:e.city?String(e.city):void 0,State:e.state?String(e.state):void 0,Zip:e.postalCode?String(e.postalCode):void 0,County:e.county?String(e.county):void 0,Country:e.country?String(e.country):void 0};if(!o.Addr1)throw new J("Address requires line1");return o}),r=(e.phones||[]).map(e=>{const o={Type:b(e.type)||"H",Num:e.number?String(e.number):void 0,Ext:e.extension?String(e.extension):void 0};if(!o.Num)throw new J("Phone requires number");return o}),i=e.emails?.[0]?.address?{MailTo:String(e.emails[0].address)}:void 0,s=e.personal,l=s?{Gender:b(s.gender),OtherName:N(s.otherName),AnniversaryDate:s.anniversaryDate?String(s.anniversaryDate):void 0,EmployerName:N(s.employerName),EmployerPhone:s.employerPhone?String(s.employerPhone):void 0,Occupation:N(s.occupation),OptOut:s.optOut?String(s.optOut):void 0,OptOutUse:s.optOutUse?String(s.optOutUse):void 0,BirthDates:(s.birthDates||[]).map(e=>({Type:b(e.type)||"P",date:e.date?String(e.date):void 0})).filter(e=>e.date),SSNs:(s.ssns||[]).map(e=>({Type:b(e.type)||"P",ssn:e.ssn?String(e.ssn):void 0})).filter(e=>e.ssn),DriverInfo:s.driver?[{Type:b(s.driver.type)||"P",LicNum:s.driver.licenseNumber?String(s.driver.licenseNumber):void 0,LicState:s.driver.licenseState?String(s.driver.licenseState):void 0,LicExpDate:s.driver.licenseExpDate?String(s.driver.licenseExpDate):void 0}].filter(e=>e.LicNum):void 0,CustChildren:(s.children||[]).map(e=>({ChildName:N(e.name)})).filter(e=>e.ChildName)}:void 0,n=e.dms,c=n?{TaxExemptNum:n.taxExemptNum?String(n.taxExemptNum):void 0,SalesTerritory:n.salesTerritory?String(n.salesTerritory):void 0,DeliveryRoute:n.deliveryRoute?String(n.deliveryRoute):void 0,SalesmanNum:n.salesmanNum?String(n.salesmanNum):void 0,LastContactMethod:n.lastContactMethod?String(n.lastContactMethod):void 0,Followups:(n.followups||[]).map(e=>({Type:b(e.type),Value:b(e.value)})).filter(e=>e.Type&&e.Value)}:void 0;return{custCateg:t||"R",createdBy:e.createdBy?String(e.createdBy):void 0,contactInfo:{IBFlag:o,LastName:N(a),FirstName:N(e.firstName),MidName:N(e.midName),Salut:N(e.salut),Suffix:N(e.suffix),Addresses:d,Phones:r,Email:i},custPersonal:l,dmsCustInfo:c}}function f(e){const o=d(e,e=>"rey_RomeServVehicleInsertResponse"===e||e.endsWith(":rey_RomeServVehicleInsertResponse"))||e,a=d(o,e=>"GenTransStatus"===e||e.endsWith(":GenTransStatus"));return{status:a?l(a,"Status"):void 0,statusCode:a?l(a,"StatusCode"):void 0}}function h(e){if(!e)return;let o;if(e instanceof Date)o=e;else if("string"==typeof e){const a=e.trim();if(/^\d{1,2}\/\d{1,2}\/\d{4}$/.test(a))return a;if(/^\d{4}-\d{2}-\d{2}/.test(a)){const[e,t,d]=a.split("T")[0].split("-");o=new Date(Number(e),Number(t)-1,Number(d))}else o=new Date(a)}else o=new Date(e);if(isNaN(o?.getTime()))throw new J(`Invalid date provided: ${e}`);return`${String(o.getMonth()+1).padStart(2,"0")}/${String(o.getDate()).padStart(2,"0")}/${o.getFullYear()}`}function x(e,o){const a=Array.isArray(o)?o.map(e=>e.toLowerCase()):[String(o).toLowerCase()],t=[e];for(;t.length;){const e=t.pop();if(ee(e))for(const o of Object.keys(e)){const d=e[o],r=z(o).toLowerCase();if(a.includes(r))return d;if(ee(d))t.push(d);else if(Array.isArray(d))for(const e of d)ee(e)&&t.push(e)}}}function P(e,o){if(e&&ee(e)){if(null!=e.$?.[o])return e.$[o];if(null!=e[`@${o}`])return e[`@${o}`];if(null!=e[`@_${o}`])return e[`@_${o}`]}}function A(e){if(null!=e){if("string"==typeof e)return e;if("number"==typeof e)return String(e);if(ee(e)){if(null!=e._)return String(e._);if(null!=e["#text"])return String(e["#text"]);if(null!=e.text)return String(e.text)}}}function F(e){const o=x(e,["CreateBSMRepairOrderResp","UpdateBSMRepairOrderResp"])||e,a=x(o,"RoRecordStatus")||{};return{status:P(a,"Status")||A(x(a,"Status")),date:P(a,"Date")||A(x(a,"Date")),time:P(a,"Time")||A(x(a,"Time")),outsdRoNo:P(a,"OutsdRoNo")||A(x(a,"OutsdRoNo")),dmsRoNo:P(a,"DMSRoNo")||A(x(a,"DMSRoNo")),errorMessage:P(a,"ErrorMessage")||A(x(a,"ErrorMessage"))}}function v(e={},a={}){const t=function(e){if(!e)throw new Error("department is required (S, P, B, SERVICE, PARTS, BODY)");const o=String(e).trim().toUpperCase();if("S"===o||"P"===o||"B"===o)return o;if("SERVICE"===o)return"S";if("PART"===o||"PARTS"===o)return"P";if("BODY"===o||"BODYSHOP"===o||"BODY SHOP"===o)return"B";throw new Error(`Invalid department: ${e}. Must be S, P, B, SERVICE, PARTS, BODY, BODYSHOP, or BODY SHOP`)}(e.department),d=e.advisorNumber?String(e.advisorNumber).trim():void 0,r=o({routing:a.routing,sender:a?.envelope?.sender,creationDateTime:a?.envelope?.creationDateTime,bodId:a?.envelope?.bodId});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n \n\n',{ApplicationArea:r,DepartmentType:t,AdvisorNumber:d}),routing:a.routing,envelope:a.envelope,xsdFilename:"rey_RomeGetAdvisorsReq.xsd",elementName:"rey_RomeGetAdvisorsReq",postParse:e=>function(e,o={}){const a=o?.department;var t;return(e=>{const o=e?.Advisor;return o?Array.isArray(o)?o:[o]:[]})((t=e,t?.rey_RomeGetAdvisorsResp??t??{})).map(e=>({advisorId:oe(e,"AdvisorNumber"),firstName:oe(e,"FirstName"),lastName:oe(e,"LastName"),department:a}))}(e,{department:t})}}function M(e){return null==e?void 0:String(e)}function O(e,o){if(e)return null!=e[o]?"object"!=typeof e[o]?M(e[o]):M(e[o]["#text"]):null!=e[`@_${o}`]?M(e[`@_${o}`]):void 0}function I(e){const o=e?.meta?.statusBlocks?.transaction?.message;if(o)return String(o);return String((e?.meta?.status?.Message??e?.meta?.status?.message)||e?.message||"")}function V(e,o){return Math.min(1e4,e*Math.pow(2,o))}function D(e){return e+Math.floor(250*Math.random())}function w(e){return new Promise(o=>setTimeout(o,e))}function E(e){return/lock|in use|record.*busy/i.test(String(e||""))}function k(e,o="****"){if(!e||"string"!=typeof e)return e;let a=e;return a=a.replace(/(]*>)([^<]*)(<\/wsse:Username>)/gi,`$1${o}$3`),a=a.replace(/(]*>)([^<]*)(<\/wsse:Password>)/gi,`$1${o}$3`),a}Object.defineProperty(exports,"__esModule",{value:!0});const L=require("mustache"),B=require("uuid"),G=require("xmlbuilder2"),H=require("axios"),W=require("fast-xml-parser"),U=e(L),K=e(H);class Z extends Error{constructor(e,o={}){super(e),this.name="RRTransportError",this.meta=o}}class Y extends Error{constructor(e,o={}){super(e),this.name="RRVendorStatusError",this.meta=o,this.retryable=!!o.retryable}}class J extends Error{constructor(e,o={}){super(e),this.name="RRValidationError",this.meta=o}}const _=Object.freeze({__proto__:null,RRTransportError:Z,RRVendorStatusError:Y,RRValidationError:J}),j={info:(...e)=>console.log("[rr-rome]",...e),warn:(...e)=>console.warn("[rr-rome]",...e),error:(...e)=>console.error("[rr-rome]",...e),debug:(...e)=>{process.env.RR_DEBUG&&console.log("[rr-rome][debug]",...e)}},q=e=>null!=e&&""!==String(e).trim(),Q=new W.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",parseAttributeValue:!1,parseTagValue:!1,isArray:e=>["Advisor"].includes(e)}),$=e=>{if(!e||"object"!=typeof e)return;const o={};for(const[a,t]of Object.entries(e))a.startsWith("@_")&&(o[a.slice(2)]=t);return Object.keys(o).length?o:void 0},X=e=>{if(null!=e)return"string"==typeof e?e:e["#text"]},z=e=>{if("string"!=typeof e)return"";let o=e.includes("}")?e.split("}").pop():e;return o=o.includes(":")?o.split(":").pop():o,o.startsWith("rey_")&&(o=o.slice(4)),o},ee=e=>e&&"object"==typeof e&&!Array.isArray(e),oe=(e,o)=>((e,o)=>e?.[`@_${o}`])(e,o)??s(e,o),ae=[{code:"A1",display:"Anker Craft"},{code:"A2",display:"Autocar"},{code:"A3",display:"Angler"},{code:"A4",display:"Automotive Rebuilders"},{code:"A5",display:"Alphenite"},{code:"A6",display:"Aerbus"},{code:"A7",display:"Aerolite"},{code:"A8",display:"American Star"},{code:"A9",display:"Aristocrat"},{code:"AA",display:"Alumalite"},{code:"AB",display:"Aurora"},{code:"AC",display:"Acura"},{code:"ACG",display:"American Custom Golf Cars"},{code:"ACP",display:"Keystone"},{code:"ACS",display:"Access (motor home)"},{code:"AD",display:"Aro"},{code:"AD6",display:"Anderson 6 Ton Trailer"},{code:"ADL",display:"Admiral (motor home)"},{code:"ADM",display:"Adam Trailers"},{code:"ADT",display:"Advantage Trailer"},{code:"ADV",display:"Adventurous"},{code:"ADY",display:"Adly"},{code:"AE",display:"Aeromat"},{code:"AF",display:"Alfa"},{code:"AG",display:"AM General"},{code:"AH",display:"American Coach"},{code:"AI",display:"Airstream"},{code:"AJ",display:"Aljo"},{code:"AK",display:"Arrow"},{code:"AL",display:"Allegro"},{code:"ALB",display:"Albemarle"},{code:"ALI",display:"Alliance RV"},{code:"ALO",display:"Aoha (boat)"},{code:"ALS",display:"Alumascape (travel trailer)"},{code:"ALU",display:"Aluma (trailer)"},{code:"AM",display:"American Motors"},{code:"AMC",display:"Ameri-Camp (trailer)"},{code:"AN",display:"American by Cobra"},{code:"AO",display:"Apollo"},{code:"AP",display:"Alphine Light"},{code:"APP",display:"Appalachian"},{code:"AQ",display:"Augusta (airplane)"},{code:"AR",display:"Alfa Romeo"},{code:"ARG",display:"Argo"},{code:"AS",display:"Aston Martin"},{code:"ASP",display:"Aspect (motor home)"},{code:"ASV",display:"ASV"},{code:"AT",display:"Arctic Cat (ATV)"},{code:"AU",display:"Audi"},{code:"AUG",display:"Augusta (RV)"},{code:"AUW",display:"Autowares"},{code:"AV",display:"Avanti"},{code:"AVN",display:"Adventurer (motor home)"},{code:"AW",display:"Atwood"},{code:"AX",display:"Airex"},{code:"AY",display:"American Flyer"},{code:"AZ",display:"Avion"},{code:"AZU",display:"AZURE (boats)"},{code:"AZZ",display:"Avalanche"},{code:"B1",display:"Starcraft Motor Home"},{code:"B2",display:"Bicycle"},{code:"B3",display:"Big Foot"},{code:"B4",display:"Brockway Truck"},{code:"B5",display:"Beaver"},{code:"B6",display:"Shelby"},{code:"B7",display:"American Eagle"},{code:"B8",display:"Bluebird (bus)"},{code:"B9",display:"Budd Trailer"},{code:"BA",display:"Baron"},{code:"BAC",display:"Briggs Automotive Company"},{code:"BAY",display:"Bayridge"},{code:"BB",display:"Southland Rebuilders"},{code:"BBR",display:"Big Bear (motorcycle)"},{code:"BC",display:"BMW Motorcycles"},{code:"BCR",display:"Braxton Creek"},{code:"BCT",display:"Back Country"},{code:"BD",display:"Snowbird"},{code:"BE",display:"Bentley"},{code:"BEE",display:"Bee (trailer)"},{code:"BF",display:"BMW Sav"},{code:"BFE",display:"Bedford"},{code:"BG",display:"Bering Truck"},{code:"BGC",display:"Big Country (RV)"},{code:"BGH",display:"Big Horn (RV)"},{code:"BGM",display:"Barnes Distribution General Motors Dealer Equipment (GMDE)"},{code:"BGS",display:"Big Sky"},{code:"BH",display:"Boston Whaler"},{code:"BIN",display:"Bintelli"},{code:"BJ",display:"Baja"},{code:"BK",display:"Baretta (boat)"},{code:"BKN",display:"Bricklin"},{code:"BKS",display:"Black Series"},{code:"BL",display:"Bolens"},{code:"BLD",display:"Black Diamond (travel trailer)"},{code:"BLI",display:"Blizzard Manufacturing"},{code:"BLR",display:"Black Rock"},{code:"BLZ",display:"Blazer"},{code:"BM",display:"BMW"},{code:"BMC",display:"Belmont Machine (trailer)"},{code:"BN",display:"Bonnavilla"},{code:"BNC",display:"Bennche ATV"},{code:"BO",display:"Bounder"},{code:"BOB",display:"Bobcat"},{code:"BOL",display:"Bollinger Motors"},{code:"BOS",display:"Boss Hoss (motorcycle)"},{code:"BP",display:"BrightDrop"},{code:"BQ",display:"Bear Trailer"},{code:"BR",display:"Basstream"},{code:"BRK",display:"Brinkley RV"},{code:"BRS",display:"Branson"},{code:"BRU",display:"Brutus"},{code:"BRY",display:"Bryant Boats"},{code:"BS",display:"Bass Tracker"},{code:"BSP",display:"Boss Snow Plows"},{code:"BT",display:"Bertone"},{code:"BTK",display:"Buick Truck (truck)"},{code:"BU",display:"Buick"},{code:"BUG",display:"Bugatti (automobile)"},{code:"BV",display:"Beaver Coach"},{code:"BVO",display:"Bravo (electric vehicle)"},{code:"BW",display:"Bowman"},{code:"BX",display:"Boulton (power boat)"},{code:"BY",display:"Bayliner"},{code:"BZ",display:"Automate"},{code:"BZZ",display:"Berkshire"},{code:"C1",display:"Colt"},{code:"C2",display:"Companion"},{code:"C3",display:"Crestliner Boat"},{code:"C4",display:"Cobra"},{code:"C5",display:"Cordova"},{code:"C6",display:"Cruise Air"},{code:"C7",display:"Chief"},{code:"C8",display:"Challenger"},{code:"C9",display:"Conquest"},{code:"CA",display:"Caterpillar"},{code:"CAL",display:"Carrlite (Camper)"},{code:"CAM",display:"C&M"},{code:"CAZ",display:"Cazador"},{code:"CB",display:"Chalet Pop"},{code:"CC",display:"Citation"},{code:"CCI",display:"Cruise Car Inc."},{code:"CCL",display:"CT Coachworks LLC (RV)"},{code:"CD",display:"Cadillac"},{code:"CDA",display:"Coda"},{code:"CDR",display:"Crusader"},{code:"CE",display:"Chateau"},{code:"CEN",display:"Centurian"},{code:"CF",display:"Capri"},{code:"CFM",display:"CFMOTO"},{code:"CG",display:"Camplight"},{code:"CGM",display:"Campagna Motors"},{code:"CH",display:"Chrysler"},{code:"CHA",display:"Chariot (RV)"},{code:"CHI",display:"Chironex"},{code:"CIT",display:"Citroen"},{code:"CJ",display:"Coronado"},{code:"CJA",display:"CJAY"},{code:"CK",display:"Chinook"},{code:"CKM",display:"Checkmate"},{code:"CL",display:"Chilton Trailers"},{code:"CM",display:"Coachment"},{code:"CMR",display:"Cimarron"},{code:"CMT",display:"CM Trailers"},{code:"CN",display:"Catalina"},{code:"CNA",display:"CAN-AM (ATV)"},{code:"CNC",display:"C&C (horse trailer)"},{code:"CNQ",display:"Chongquing"},{code:"CO",display:"Coleman"},{code:"CP",display:"Champion"},{code:"CPN",display:"Capone (motorcycle)"},{code:"CQ",display:"Curtis Industries"},{code:"CR",display:"Cavalier Motor Home"},{code:"CRC",display:"Cricket Cart"},{code:"CRD",display:"Carado RV"},{code:"CRS",display:"Creek Side"},{code:"CRU",display:"Cruiser RV"},{code:"CRV",display:"Carver (boat)"},{code:"CS",display:"Circle J"},{code:"CSE",display:"Case"},{code:"CT",display:"Chevrolet Truck"},{code:"CTR",display:"Citecar"},{code:"CU",display:"Cummins"},{code:"CV",display:"Chevrolet"},{code:"CW",display:"Chevrolet"},{code:"CX",display:"Chapparal"},{code:"CY",display:"Celebrity"},{code:"CYA",display:"Cyclone (RV)"},{code:"CYC",display:"Cyclone"},{code:"CZ",display:"Chris Craft"},{code:"CZY",display:"Cozy Traveler"},{code:"D1",display:"Dorsey Trailer"},{code:"D2",display:"Conestoga"},{code:"D3",display:"Dreamer (5th wheel trailer)"},{code:"D4",display:"Diplomat (RV)"},{code:"D5",display:"Daewoo"},{code:"D6",display:"Ducati (motorcycle)"},{code:"D7",display:"Desperado"},{code:"D8",display:"Donzi"},{code:"D9",display:"Surf Side"},{code:"DA",display:"Daihatsu"},{code:"DAL",display:"Dallara"},{code:"DB",display:"Dazon (scooter)"},{code:"DC",display:"Cherokee"},{code:"DCM",display:"Dixie Chopper (motorcycle)"},{code:"DD",display:"Detroit Diesel"},{code:"DE",display:"Delorean"},{code:"DF",display:"Desert Fox (RV)"},{code:"DFN",display:"Defender"},{code:"DG",display:"SDG (scooter)"},{code:"DH",display:"Dynasty"},{code:"DI",display:"Discovery"},{code:"DIA",display:"Diamondback"},{code:"DIS",display:"Discover Canada"},{code:"DIV",display:"Dively"},{code:"DJ",display:"Doubletree (trailer)"},{code:"DK",display:"Duracraft (boat)"},{code:"DL",display:"Dolphin"},{code:"DLT",display:"Delta (Utility and Horse trailer)"},{code:"DM",display:"Damon"},{code:"DN",display:"Dunes Trailer"},{code:"DO",display:"Dodge"},{code:"DP",display:"Dutch Pop"},{code:"DQ",display:"Double Tree (RV)"},{code:"DR",display:"Dutch Star"},{code:"DRX",display:"Duruxx"},{code:"DS",display:"Datsun"},{code:"DT",display:"Dodge Truck"},{code:"DTM",display:"De Tomaso"},{code:"DTR",display:"Dump Trailer"},{code:"DU",display:"Dutchmen"},{code:"DUR",display:"Duroboat (boat)"},{code:"DV",display:"Dodge Van"},{code:"DW",display:"Sundowner (trailer)"},{code:"DX",display:"Dynamax"},{code:"DY",display:"Daybreak"},{code:"DYM",display:"Dymac (electric vehicle)"},{code:"DYQ",display:"Dynaquest (motor home)"},{code:"DZ",display:"Century"},{code:"E1",display:"Exiss (trailer)"},{code:"E2",display:"Bumble Bee"},{code:"E3",display:"American Trailer"},{code:"E4",display:"Clenet"},{code:"E5",display:"Coyote"},{code:"E6",display:"E-Ton"},{code:"E7",display:"Excursion (RV)"},{code:"E8",display:"Everest (RV)"},{code:"E9",display:"Chateausport"},{code:"EA",display:"Eagle"},{code:"EAR",display:"Earthbound RV"},{code:"EB",display:"Electric Bicycle"},{code:"EBB",display:"Ebbtide"},{code:"EC",display:"Executive"},{code:"ECH",display:"ECHO (ATV/util trailer)"},{code:"ECO",display:"Eco"},{code:"ED",display:"Emerald (boat)"},{code:"EDG",display:"Edge"},{code:"EE",display:"Excell (cargo trailer)"},{code:"EEE",display:"Triple E"},{code:"EF",display:"Georgetown"},{code:"EG",display:"EV Global Motors"},{code:"EGO",display:"EGO"},{code:"EH",display:"Easy Hauler"},{code:"EI",display:"express (boat)"},{code:"EJ",display:"E-Z-Go (golf cart)"},{code:"EK",display:"Elkhorn"},{code:"EL",display:"Eldorado"},{code:"ELA",display:"Electra (RV)"},{code:"ELM",display:"ELectric Last Mile Solutions Inc."},{code:"ELS",display:"Elite Suite (travel trailer)"},{code:"EM",display:"Monon"},{code:"EM",display:"Ember RV"},{code:"EN",display:"Encounter (RV)"},{code:"ENC",display:"Encore RV"},{code:"ENT",display:"Entegra RV"},{code:"ENU",display:"Endura RV"},{code:"EO",display:"Aerostar (RV)"},{code:"EP",display:"Expedition"},{code:"EPC",display:"Epic"},{code:"EQ",display:"Elite Trailer"},{code:"EQS",display:"Equispirit"},{code:"ER",display:"Raven"},{code:"ES",display:"Establishment"},{code:"ESP",display:"Eurospeed"},{code:"ET",display:"Eagle Trailer"},{code:"ETW",display:"East to West"},{code:"EU",display:"Ultra Sport"},{code:"EV",display:"Evinrude"},{code:"EVG",display:"Evergreen RV"},{code:"EVL",display:"Evolution RV"},{code:"EW",display:"EV Warrior"},{code:"EX",display:"Excalibur"},{code:"EXP",display:"Explorer (motor home)"},{code:"EY",display:"Windsong"},{code:"EZ",display:"EZ Loader"},{code:"EZG",display:"EZ GO"},{code:"EZL",display:"Ezloader (trailer)"},{code:"EZZ",display:"Elipse"},{code:"F1",display:"Flair"},{code:"F2",display:"Fold Down"},{code:"F3",display:"Flagstaff"},{code:"F4",display:"Four Seasons"},{code:"F5",display:"Fishrite"},{code:"F6",display:"4-Star (trailer)"},{code:"F7",display:"Formula"},{code:"F8",display:"Fountain"},{code:"F9",display:"Fisher"},{code:"FA",display:"Falcon"},{code:"FB",display:"Fireball (RV)"},{code:"FBC",display:"Fibro Concept"},{code:"FC",display:"Ford Commerical"},{code:"FD",display:"Ford HD Truck"},{code:"FE",display:"Ferrari"},{code:"FED",display:"Federal"},{code:"FF",display:"Fruehauf Trailer"},{code:"FG",display:"Firan (RV)"},{code:"FH",display:"Featherlite (trailer)"},{code:"FI",display:"Fiat"},{code:"FIS",display:"Fisker"},{code:"FJ",display:"Fred Jones"},{code:"FK",display:"Fifth Avenue (RV)"},{code:"FL",display:"Fleetwood (RV)"},{code:"FLO",display:"Floe (trailer)"},{code:"FM",display:"Fiberform"},{code:"FN",display:"Fan"},{code:"FNL",display:"Finish Line"},{code:"FNM",display:"Funmover"},{code:"FO",display:"Ford"},{code:"FOP",display:"Ford of Puerto Rico"},{code:"FOR",display:"Forester (motor home)"},{code:"FOX",display:"Fox Mountain RV"},{code:"FP",display:"Ford Racing Technologies"},{code:"FQ",display:"Forest River (trailer)"},{code:"FR",display:"Freightliner"},{code:"FS",display:"Fiesta"},{code:"FT",display:"Ford Truck"},{code:"FU",display:"Frontier (RV)"},{code:"FUR",display:"Fusion"},{code:"FUS",display:"Fuso"},{code:"FUT",display:"Futura"},{code:"FV",display:"Forest River"},{code:"FW",display:"Ford Wind"},{code:"FX",display:"Four Winns"},{code:"FY",display:"Felling (trailer)"},{code:"FZ",display:"Foretravel (RV)"},{code:"G1",display:"Gindy Trailer"},{code:"G2",display:"Glastron"},{code:"G3",display:"Brown Trailer"},{code:"G4",display:"Bass Cat"},{code:"G5",display:"Generation"},{code:"G6",display:"Morgan Trailers"},{code:"G7",display:"Glacier Bay"},{code:"G8",display:"Global Electric Motorcars"},{code:"G9",display:"Capacity"},{code:"GA",display:"Great Dane Trailer"},{code:"GAR",display:"Garia"},{code:"GB",display:"Georgie Boy (RV)"},{code:"GC",display:"GMC"},{code:"GCH",display:"Grech RV"},{code:"GCI",display:"Greenkraft Inc."},{code:"GD",display:"GPD - East"},{code:"GE",display:"Geo"},{code:"GEC",display:"General Coach"},{code:"GEN",display:"Hyundai"},{code:"GES",display:"Genesis Supreme RV"},{code:"GF",display:"Glendale"},{code:"GG",display:"Cameo Carriage (RV)"},{code:"GH",display:"Macgregor (sailboat)"},{code:"GI",display:"Carriage (RV)"},{code:"GJ",display:"Stellar (travel trailer)"},{code:"GJN",display:"Grand Junction"},{code:"GK",display:"Gekko"},{code:"GL",display:"Gambler"},{code:"GN",display:"Generac"},{code:"GO",display:"Grumman"},{code:"GOR",display:"Gorilla"},{code:"GP",display:"GPD - West"},{code:"GQ",display:"Trailerman (trailer)"},{code:"GR",display:"Gravely"},{code:"GRD",display:"Grand Design RV"},{code:"GS",display:"Gulfstream"},{code:"GST",display:"Grandsport (motor home)"},{code:"GT",display:"Geo Truck"},{code:"GU",display:"Malaguti (motorcycle)"},{code:"GV",display:"Godfrey (boat)"},{code:"GW",display:"White GMC Truck"},{code:"GX",display:"Great West"},{code:"GY",display:"Gindy Trailer"},{code:"GZ",display:"Gazelle"},{code:"H1",display:"Hurricane"},{code:"H2",display:"Honey"},{code:"H3",display:"Heil Trailer"},{code:"H4",display:"Coach House (RV)"},{code:"H5",display:"Harney Coachworks"},{code:"H6",display:"Hawk"},{code:"H7",display:"Hydrocat"},{code:"H8",display:"Haulmark (RV)"},{code:"H9",display:"Holmes (trailer)"},{code:"HA",display:"Hi-Light"},{code:"HAT",display:"Honda ATV"},{code:"HAU",display:"Haulin Trailer"},{code:"HB",display:"Husaberg"},{code:"HBU",display:"Hitch Buddy (towing unit)"},{code:"HC",display:"Hornet"},{code:"HD",display:"Harley Davidson"},{code:"HDO",display:"Hideout"},{code:"HE",display:"Hummer"},{code:"HF",display:"Harney Co. Operations"},{code:"HG",display:"Heritage"},{code:"HH",display:"Hino"},{code:"HHT",display:"H&H Trailer"},{code:"HI",display:"Hilo"},{code:"HJ",display:"New Holland (tractor)"},{code:"HK",display:"Hitckhiker"},{code:"HL",display:"Honda"},{code:"HLR",display:"Haul Rite"},{code:"HM",display:"Honda Motorcycle"},{code:"HMD",display:"Homemade"},{code:"HMS",display:"Homestead"},{code:"HMV",display:"Honda Multipurpose Utility Vehicle"},{code:"HN",display:"Honda Motorcycle"},{code:"HO",display:"Honda"},{code:"HOL",display:"Holland Trailer"},{code:"HOS",display:"Hoosier"},{code:"HP",display:"Honda"},{code:"HQ",display:"Hy-Line (trailer)"},{code:"HR",display:"Holiday Rambler"},{code:"HRG",display:"Highland Ridge"},{code:"HS",display:"Hydra-Sport Boats"},{code:"HSN",display:"Hisun"},{code:"HT",display:"Honda Truck"},{code:"HTG",display:"Hartland Greystone"},{code:"HTI",display:"Hitachi"},{code:"HU",display:"Husqvarna"},{code:"HUL",display:"Hull"},{code:"HV",display:"Hummer (GM Vehicle)"},{code:"HW",display:"Hawker (airplane)"},{code:"HWN",display:"Huawin"},{code:"HX",display:"Hewes (boat)"},{code:"HY",display:"Hyundai"},{code:"HYM",display:"Hymer"},{code:"HYO",display:"Hyosung Motors"},{code:"HYP",display:"Hyundai of Puerto Rico (automobile)"},{code:"HZ",display:"Horizon"},{code:"I2",display:"Clark Industrial Truck"},{code:"I3",display:"Royal International (RV)"},{code:"I4",display:"Mida Motorhome (RV)"},{code:"I5",display:"Independence (motorcycle)"},{code:"I6",display:"Sportsmaster"},{code:"I7",display:"Extreme Mega Lite (RV)"},{code:"I8",display:"Legends"},{code:"I9",display:"Pilgrim Lite (RV)"},{code:"IA",display:"Itasca"},{code:"IB",display:"Big Dog"},{code:"IC",display:"Camper"},{code:"ICA",display:"ICAMP (trailer)"},{code:"ICN",display:"Icon"},{code:"ID",display:"Indian"},{code:"IE",display:"Interstate Trailer"},{code:"IF",display:"Itasca-C"},{code:"IG",display:"Itasca-Diesel"},{code:"IH",display:"American Iron Horse"},{code:"IJ",display:"Italjet USA"},{code:"IK",display:"Innsbruck (RV)"},{code:"IL",display:"International"},{code:"IM",display:"Impulse"},{code:"IMT",display:"Iron Mountain"},{code:"IN",display:"Infiniti"},{code:"INT",display:"InTech"},{code:"INV",display:"INV1"},{code:"IO",display:"Isata (motor home)"},{code:"IP",display:"International Powersports"},{code:"IQ",display:"Sceptor (RV)"},{code:"IR",display:"Invader"},{code:"IRH",display:"Iron Horse (boat)"},{code:"IS",display:"Isuzu"},{code:"ISP",display:"Imperial Supplies"},{code:"IT",display:"Isuzu Truck"},{code:"IU",display:"Skamper Ultra (RV)"},{code:"IV",display:"Iveco"},{code:"IW",display:"W-W (trailer)"},{code:"IX",display:"Maxlite (RV)"},{code:"IY",display:"Infinity (motor home)"},{code:"IZ",display:"Zepplin (RV)"},{code:"J1",display:"Johnson (boat)"},{code:"J2",display:"Charger"},{code:"J3",display:"Charmac"},{code:"J4",display:"Jazz (motor home)"},{code:"J5",display:"Jet Trailer"},{code:"J6",display:"Tiffin (RV)"},{code:"J7",display:"JV Manufacturing (trailer)"},{code:"J8",display:"Rebel (RV)"},{code:"J9",display:"Estate (RV)"},{code:"JA",display:"Jaguar"},{code:"JB",display:"Jamboree"},{code:"JC",display:"Jetcraft"},{code:"JCL",display:"JCL"},{code:"JD",display:"John Deere"},{code:"JE",display:"Jeep"},{code:"JF",display:"Forklift (Forklift, generic)"},{code:"JG",display:"Tail-Gator (RV)"},{code:"JH",display:"Jensen-HL"},{code:"JI",display:"J.I. Case"},{code:"JJ",display:"Attitude (RV)"},{code:"JK",display:"Timberlodge (RV)"},{code:"JL",display:"Javelin"},{code:"JM",display:"Jamee"},{code:"JN",display:"Tuscany (RV)"},{code:"JNP",display:"Johnnypag (motorcycle)"},{code:"JO",display:"Sandstorm (RV)"},{code:"JP",display:"Jag (scooter)"},{code:"JQ",display:"QianJiang (scooter)"},{code:"JR",display:"Jerrdan"},{code:"JRN",display:"Journey (motor home)"},{code:"JS",display:"S&S Campers"},{code:"JT",display:"Jeep Truck"},{code:"JU",display:"Trailrider (RV)"},{code:"JV",display:"JVS (ATV)"},{code:"JW",display:"Willy (Jeep Vehicle)"},{code:"JX",display:"Extreme RV (RV)"},{code:"JY",display:"Jayco"},{code:"K-Z",display:"K-Z (trailer)"},{code:"K1",display:"Kia"},{code:"K2",display:"Kidron Trailer"},{code:"K3",display:"Kountry Comfort"},{code:"K4",display:"KTM"},{code:"K5",display:"Kountry Star"},{code:"K6",display:"Kenner"},{code:"K7",display:"Key West"},{code:"K8",display:"Kasea (minibikes)"},{code:"K9",display:"TM"},{code:"KA",display:"Kawasaki"},{code:"KAK",display:"K&K (trailer)"},{code:"KAL",display:"Kalmar Ottawa"},{code:"KAR",display:"Karma"},{code:"KAY",display:"Kayo"},{code:"KB",display:"Kubota (tractor)"},{code:"KC",display:"Cato"},{code:"KD",display:"Kodiak"},{code:"KDK",display:"Kaddy Kruiser"},{code:"KDN",display:"Kendon"},{code:"KE",display:"Skeeter"},{code:"KEV",display:"Kia EV"},{code:"KEY",display:"Keystone Autoway"},{code:"KF",display:"Kiefer (trailer)"},{code:"KG",display:"Kar Products"},{code:"KH",display:"Kachina"},{code:"KI",display:"Kit"},{code:"KIM",display:"Kimble (trailer)"},{code:"KIO",display:"Kioti"},{code:"KJ",display:"Cajun"},{code:"KK",display:"Carrera Boots"},{code:"KL",display:"Kymco (motor scooter)"},{code:"KM",display:"Komfort"},{code:"KMS",display:"Komatsu"},{code:"KMW",display:"Kimball Midwest"},{code:"KN",display:"Kountry Aire"},{code:"KND",display:"Kandi"},{code:"KNP",display:"Knapheide"},{code:"KO",display:"Koremoto (motorcycle)"},{code:"KOE",display:"Koenigsegg"},{code:"KP",display:"Composite"},{code:"KQ",display:"KZ Inc. (RV)"},{code:"KR",display:"King of the Road"},{code:"KRI",display:"Kristi (trailer)"},{code:"KRY",display:"Krystal (motor home)"},{code:"KS",display:"Kwikee Step"},{code:"KT",display:"Karavan Trailers"},{code:"KU",display:"Kent Automotive (parts master)"},{code:"KV",display:"Knight (RV)"},{code:"KW",display:"Kenworth/Peterbilt"},{code:"KWK",display:"Kwik Load"},{code:"KX",display:"Cross Country (RV)"},{code:"KY",display:"Keystone"},{code:"KYN",display:"Keystone Northpark"},{code:"KYV",display:"Keystone Vantage"},{code:"KZ",display:"Kells (sailboat)"},{code:"L1",display:"Lake Raider (RV)"},{code:"L2",display:"Load Trailer"},{code:"L3",display:"Limited"},{code:"L4",display:"Lincoln Truck"},{code:"L5",display:"Laredo"},{code:"L6",display:"Landau (boat)"},{code:"L7",display:"Laforza"},{code:"L8",display:"Lexington (motor home)"},{code:"L9",display:"Leprechaun (RV)"},{code:"LA",display:"Lancia"},{code:"LB",display:"Lawn Boy"},{code:"LBT",display:"Lambretta"},{code:"LBX",display:"Link Belt Excavators"},{code:"LC",display:"Collins (RV)"},{code:"LD",display:"Lazy Days"},{code:"LE",display:"Lexus"},{code:"LF",display:"Laforze"},{code:"LG",display:"Cross Lander (Brazil car)"},{code:"LGC",display:"Logan Coach"},{code:"LH",display:"Shore Land'r"},{code:"LI",display:"Lincoln"},{code:"LIB",display:"Liberty Outdoors"},{code:"LID",display:"Lider"},{code:"LJ",display:"Loadrite (trailer)"},{code:"LK",display:"Lufkin"},{code:"LKA",display:"Lakota"},{code:"LL",display:"Lear (airplane)"},{code:"LM",display:"Lamborghini"},{code:"LN",display:"Lance"},{code:"LND",display:"Landini"},{code:"LNH",display:"Linhai"},{code:"LNM",display:"LandMark RV"},{code:"LO",display:"Lotus"},{code:"LP",display:"Lawson Products (factory master)"},{code:"LQ",display:"Qvale"},{code:"LR",display:"Land Rover"},{code:"LRV",display:"Lifestyle Luxury RV"},{code:"LS",display:"Larson"},{code:"LSF",display:"Leisure Freedom"},{code:"LST",display:"LS Tractor"},{code:"LT",display:"Leland Trailers"},{code:"LTG",display:"Little Guy"},{code:"LTR",display:"Little River"},{code:"LU",display:"Lund"},{code:"LUC",display:"LUCID"},{code:"LV",display:"Leisure Van"},{code:"LW",display:"Lowe"},{code:"LX",display:"Las Brisas"},{code:"LY",display:"Layton"},{code:"LZ",display:"Lifan (motorcycle scooter)"},{code:"M1",display:"Moutainaire"},{code:"M2",display:"Mastercraft"},{code:"M3",display:"Mirage"},{code:"M4",display:"Marmon"},{code:"M5",display:"Monterey"},{code:"M6",display:"Mako"},{code:"M7",display:"Montana"},{code:"M8",display:"Mercedes Light Truck"},{code:"M9",display:"Malibu"},{code:"MA",display:"Mazda"},{code:"MAC",display:"Maclander"},{code:"MAD",display:"Midwest Automotive Design"},{code:"MAF",display:"Massey Ferguson (tractor/truck)"},{code:"MAG",display:"MAG (truck & van)"},{code:"MAH",display:"Mahindra"},{code:"MAR",display:"Marada (boat)"},{code:"MAS",display:"MASEA (scooter)"},{code:"MAY",display:"May (trailer)"},{code:"MB",display:"Mercedes-Benz"},{code:"MBG",display:"Modbug"},{code:"MBI",display:"Mobi"},{code:"MBS",display:"MB Sport"},{code:"MC",display:"McCulloch"},{code:"MCI",display:"Motor Coach Industries"},{code:"MCL",display:"McLaren"},{code:"MCT",display:"Mac Trailer"},{code:"MD",display:"Magirus-Deutz"},{code:"ME",display:"Mercury Truck"},{code:"MET",display:"Metropolitan"},{code:"MF",display:"Marlette"},{code:"MFM",display:"Misfit Motorcycles"},{code:"MG",display:"MG"},{code:"MGC",display:"Magic"},{code:"MH",display:"Mitsubishi Truck"},{code:"MI",display:"Mitsubishi"},{code:"MIE",display:"Miles Electric (auto)"},{code:"MJ",display:"Mobile Travel"},{code:"MK",display:"Mack Truck"},{code:"MKE",display:"Moke"},{code:"ML",display:"Mcclane"},{code:"MM",display:"Maxim"},{code:"MMR",display:"Motor Morini"},{code:"MN",display:"Montego"},{code:"MNG",display:"Mengdeli"},{code:"MNR",display:"Mountaineer"},{code:"MNT",display:"Mintaro"},{code:"MO",display:"Monaco"},{code:"MOK",display:"Moke International"},{code:"MP",display:"Markson Products"},{code:"MPR",display:"Mazda of Puerto Rico (auto)"},{code:"MQ",display:"Max"},{code:"MR",display:"Mercury"},{code:"MRL",display:"Marlon"},{code:"MS",display:"Maserati"},{code:"MSR",display:"Marshell"},{code:"MSV",display:"Mercedes Benz Van"},{code:"MT",display:"Mercedes Truck"},{code:"MTF",display:"Motofino"},{code:"MU",display:"Merkur"},{code:"MUL",display:"Mullen"},{code:"MV",display:"Mountain View"},{code:"MV1",display:"MV1"},{code:"MVA",display:"Monte Vista"},{code:"MVP",display:"MVP RV"},{code:"MW",display:"Mariah"},{code:"MX",display:"Mallard"},{code:"MXT",display:"Maxey Trailer"},{code:"MY",display:"Midas"},{code:"MYE",display:"Myers Motors (electric scooter)"},{code:"MZ",display:"Mazda Truck"},{code:"N1",display:"Country Coach (RV)"},{code:"N2",display:"Northland"},{code:"N3",display:"New Vision"},{code:"N4",display:"Newell"},{code:"N5",display:"Northern Lite"},{code:"N6",display:"Nash (RV)"},{code:"N7",display:"Northstar"},{code:"N8",display:"Alpen Coach"},{code:"N9",display:"Nitro"},{code:"NA",display:"Navistar Intl MPV"},{code:"NB",display:"MB Cruiser (RV)"},{code:"NBL",display:"Noble"},{code:"NC",display:"Motorcycle Stuff"},{code:"NCR",display:"Nucamp RV"},{code:"NCV",display:"Nissan Commercial Vehicles"},{code:"NCY",display:"North Country"},{code:"ND",display:"Nissan Diesel"},{code:"NE",display:"Neptune (RV)"},{code:"NEX",display:"Nexus RV"},{code:"NF",display:"Nitrous (RV)"},{code:"NFL",display:"New Flyer"},{code:"NG",display:"Twist - N - Go (moped)"},{code:"NH",display:"Nissan Hawaii"},{code:"NHL",display:"Nitrous Hyperlite (RV)"},{code:"NI",display:"Nissan"},{code:"NJ",display:"NRG (trailer)"},{code:"NK",display:"CornPro (trailer)"},{code:"NL",display:"National"},{code:"NLV",display:"Next Level (travel trailer)"},{code:"NM",display:"Newmar"},{code:"NML",display:"Ness Motorcycles LLC"},{code:"NN",display:"Caribbean (RV)"},{code:"NO",display:"Nomad"},{code:"NP",display:"Sandpiper"},{code:"NQ",display:"Nissan"},{code:"NR",display:"Northwood"},{code:"NRT",display:"Nortek Boats"},{code:"NS",display:"Nissan Truck"},{code:"NT",display:"Navistar Intl Truck"},{code:"NTM",display:"Norton Motorcyles"},{code:"NTR",display:"North Trail (snowmobile trailer)"},{code:"NU",display:"Newmans (trailer)"},{code:"NV",display:"VR1 (RV)"},{code:"NVN",display:"Navion"},{code:"NW",display:"Nuwa"},{code:"NX",display:"Exiss (trailer)"},{code:"NY",display:"Nicky"},{code:"NZ",display:"WVZZI (motorcycle)"},{code:"O1",display:"Contender (boat)"},{code:"O2",display:"SOA (RV)"},{code:"O3",display:"Clipper (RV)"},{code:"O4",display:"Motorrad (motorcycle)"},{code:"O5",display:"PGO (moped)"},{code:"O6",display:"Host (camper)"},{code:"O7",display:"Land Roamer (RV)"},{code:"O8",display:"Motocross (motorcycle)"},{code:"O9",display:"Aliner (RV)"},{code:"OA",display:"Catalina SOA (RV)"},{code:"OAS",display:"Oasis"},{code:"OB",display:"Brougham"},{code:"OC",display:"Columbus Motor Home"},{code:"OD",display:"Odyssey"},{code:"ODE",display:"Odes"},{code:"OE",display:"Eclipse Trailer (RV)"},{code:"OF",display:"Cypress (RV)"},{code:"OG",display:"Goshen (Truck Chassis)"},{code:"OH",display:"Honda Watercraft (watercraft)"},{code:"OI",display:"Optima (trailer)"},{code:"OK",display:"Hyundai Tire"},{code:"OL",display:"Oldsmobile"},{code:"OLK",display:"Outlook (motor home)"},{code:"OLW",display:"Outlaw (RV)"},{code:"OM",display:"Outboard Marine Corporation"},{code:"OME",display:"Omega"},{code:"ON",display:"Onan"},{code:"OP",display:"Opel"},{code:"OPE",display:"Open Range (RV)"},{code:"OPR",display:"Outpost (RV)"},{code:"OQ",display:"Lem USA (dirt bike)"},{code:"OR",display:"Open Road"},{code:"ORV",display:"Outdoor RV"},{code:"OS",display:"Oshkosh Truck"},{code:"OT",display:"Oldsmobile Truck"},{code:"OU",display:"Outback (RV)"},{code:"OUT",display:"Outcast (trailer)"},{code:"OV",display:"Lapalma Diesel (RV)"},{code:"OW",display:"Owens"},{code:"OX",display:"MotoX (motorcycle manuf.)"},{code:"OY",display:"Bad Boy (ATV)"},{code:"OZ",display:"Doolittle (trailer)"},{code:"P1",display:"Park Model"},{code:"P2",display:"Pinnacle"},{code:"P3",display:"Phantom"},{code:"P4",display:"Polini (motorcycle)"},{code:"P5",display:"Pioneeer (RV)"},{code:"P6",display:"American Performance Cycle (motorcycle)"},{code:"P7",display:"Procraft Bass Boat"},{code:"P8",display:"Playcraft (boat)"},{code:"P9",display:"Panzer (motorcycle)"},{code:"PA",display:"Pace Arrow"},{code:"PAC",display:"Pacifica (RV)"},{code:"PAG",display:"Pagani"},{code:"PAL",display:"Palomino"},{code:"PB",display:"Peterbilt"},{code:"PC",display:"Pace American"},{code:"PCE",display:"Peace"},{code:"PCT",display:"Princecraft"},{code:"PCW",display:"Pacific Coachworks"},{code:"PD",display:"Progressive Dynamic"},{code:"PDM",display:"Paradigm"},{code:"PE",display:"Peugeot"},{code:"PEV",display:"Pure EV"},{code:"PF",display:"Peak"},{code:"PFS",display:"Profusion"},{code:"PG",display:"Pug"},{code:"PH",display:"Phasar"},{code:"PHG",display:"Power House Genset"},{code:"PI",display:"Pininfarina"},{code:"PIT",display:"Pitster Pro"},{code:"PJ",display:"Pilgrim"},{code:"PJT",display:"PJ Trailers"},{code:"PK",display:"Pontiac Truck"},{code:"PKD",display:"Packard (automobile)"},{code:"PL",display:"Plymouth"},{code:"PLT",display:"Platinum Trailers"},{code:"PM",display:"Palamino"},{code:"PN",display:"Pontiac"},{code:"PNT",display:"Pontoon (boat)"},{code:"PNV",display:"Pronovost"},{code:"PO",display:"Porsche"},{code:"POG",display:"Polaris (GEM)"},{code:"POL",display:"Polestar"},{code:"POS",display:"Polaris (Snowmobile)"},{code:"PP",display:"Patriot Racing (monster trucks)"},{code:"PQ",display:"Parker (car)"},{code:"PR",display:"Prowler"},{code:"PRC",display:"Pierce Manufacturing (truck)"},{code:"PRE",display:"Prevost (motor home)"},{code:"PRL",display:"Presidential (travel trailer)"},{code:"PRQ",display:"PowerQuest"},{code:"PS",display:"Polaris"},{code:"PSI",display:"Peterson Industries"},{code:"PSP",display:"Passport (RV)"},{code:"PT",display:"Plymouth Truck"},{code:"PTM",display:"Primetime RV"},{code:"PU",display:"Pursuit"},{code:"PV",display:"Pace Vision"},{code:"PW",display:"Pleasure Way"},{code:"PWR",display:"Powerline (hauling trailer)"},{code:"PX",display:"Phoenix (RV)"},{code:"PXU",display:"Phoenix USA RV"},{code:"PY",display:"Piaggio (scooter)"},{code:"PZ",display:"Panoz"},{code:"QIY",display:"QIYE"},{code:"QLK",display:"Qlink Motor"},{code:"QS",display:"Quicksilver"},{code:"R1",display:"Radco"},{code:"R2",display:"Stingray"},{code:"R3",display:"Rollsair"},{code:"R4",display:"Coast RV"},{code:"R5",display:"Sunrader"},{code:"R6",display:"RC Willet (RV)"},{code:"R7",display:"Renegade"},{code:"R8",display:"Regal"},{code:"R9",display:"Rinker"},{code:"RA",display:"Rallye"},{code:"RAM",display:"RAM"},{code:"RB",display:"Caribou"},{code:"RC",display:"RR Custom Coach Works"},{code:"RCT",display:"Raycraft"},{code:"RD",display:"Red Max"},{code:"RDC",display:"Road Clipper (trailer)"},{code:"RDV",display:"Ridge View"},{code:"RDW",display:"Redwood"},{code:"RE",display:"Renault"},{code:"REI",display:"Reinell"},{code:"REL",display:"Redline (trailer)"},{code:"REM",display:"Remeq"},{code:"REV",display:"REV Renegade LLC"},{code:"RF",display:"Refuge"},{code:"RG",display:"Ranger"},{code:"RGY",display:"Regency"},{code:"RH",display:"Robinhood"},{code:"RI",display:"Rialta"},{code:"RIV",display:"Rivian"},{code:"RJ",display:"R-Vision"},{code:"RK",display:"Road King"},{code:"RL",display:"Read Screen-All"},{code:"RM",display:"Richmond Boats"},{code:"RN",display:"Residency"},{code:"RNT",display:"Ruff and Tuff (electric vehicle)"},{code:"RO",display:"Ranger Rover"},{code:"ROD",display:"Roadster"},{code:"ROK",display:"ROKETA (motorcycle)"},{code:"RP",display:"Revolution (RV)"},{code:"RPD",display:"R POD"},{code:"RQ",display:"Riata"},{code:"RR",display:"Rolls Royce"},{code:"RS",display:"Storm"},{code:"RSD",display:"Residence"},{code:"RSN",display:"Rossion"},{code:"RT",display:"Roadtrek"},{code:"RTR",display:"Retreat"},{code:"RTT",display:"Riverside"},{code:"RU",display:"Spectrum"},{code:"RUE",display:"Ruesch"},{code:"RV",display:"Recreational Vehicle"},{code:"RW",display:"Rockwood"},{code:"RX",display:"Rexhall"},{code:"RY",display:"Rexair RXA"},{code:"RZ",display:"Rendezvous"},{code:"RZR",display:"Razor (RV)"},{code:"S0",display:"Snow Brothers"},{code:"S1",display:"Suncrest"},{code:"S2",display:"S2 Yachts"},{code:"S3",display:"Salem"},{code:"S4",display:"Sierra"},{code:"S5",display:"Starcraft"},{code:"S6",display:"Seven Seas"},{code:"S7",display:"Shur Flo"},{code:"S8",display:"Sealand"},{code:"S9",display:"Sunchaser"},{code:"SA",display:"Saab"},{code:"SAN",display:"Sanger"},{code:"SAV",display:"Savoy (travel trailer)"},{code:"SB",display:"Sebring"},{code:"SC",display:"Sportscoach"},{code:"SCE",display:"Sceptor (RV)"},{code:"SCH",display:"Schwinn (scooter)"},{code:"SD",display:"Seabreeze"},{code:"SDN",display:"Sundance (RV)"},{code:"SE",display:"Sea-Doo"},{code:"SEA",display:"Seavee"},{code:"SEB",display:"Sea Boss (boat)"},{code:"SEF",display:"Sea Fox"},{code:"SEP",display:"Sea Pro"},{code:"SES",display:"Seaswirl (boat)"},{code:"SF",display:"Safari"},{code:"SG",display:"Silver Eagle"},{code:"SH",display:"Stihl"},{code:"SHL",display:"Show Hauler (RV)"},{code:"SI",display:"Simplicity"},{code:"SJ",display:"Sea Ray"},{code:"SJS",display:"Shejang Jmstar Shenke"},{code:"SK",display:"Ski-Doo"},{code:"SKE",display:"Skeuter (electric scooter)"},{code:"SL",display:"Sterling"},{code:"SLA",display:"Solera"},{code:"SLD",display:"Shorelander (trailer)"},{code:"SLK",display:"Sleek"},{code:"SM",display:"Suzuki"},{code:"SMC",display:"SmartCar (electric veh)"},{code:"SN",display:"Snapper"},{code:"SNU",display:"Saturn US"},{code:"SNV",display:"Sun Valley"},{code:"SO",display:"Sportsmen"},{code:"SP",display:"Suzuki MPV"},{code:"SPC",display:"Sport Chassis"},{code:"SPF",display:"Superperformance"},{code:"SPK",display:"SPYKER (sports car)"},{code:"SQ",display:"Sea Nymph"},{code:"SR",display:"Saturn"},{code:"SRS",display:"Sunray Smokey RV"},{code:"SRV",display:"Snowriver"},{code:"SS",display:"Shasta"},{code:"SSA",display:"Suckerpunch Sallys (motorcycle)"},{code:"SSR",display:"Sightseer (motor home)"},{code:"SST",display:"Slingshot"},{code:"ST",display:"Suzuki Truck"},{code:"STO",display:"Storyteller Overland"},{code:"STP",display:"Sampede (motorcycle)"},{code:"SU",display:"Subaru"},{code:"SV",display:"Sunline"},{code:"SVD",display:"Silverado"},{code:"SVL",display:"Sliver Lite (RV trailer)"},{code:"SW",display:"Southwind"},{code:"SX",display:"Starfire"},{code:"SY",display:"Skyline"},{code:"SYM",display:"SYM"},{code:"SYO",display:"Sanyo"},{code:"SZ",display:"Suzuki Motorcycle"},{code:"SZP",display:"Suzuki of Puerto Rico"},{code:"SZZ",display:"Shadow Trailer"},{code:"T1",display:"Trailmobile Trailer"},{code:"T2",display:"Trans2"},{code:"T3",display:"Tie Down"},{code:"T4",display:"Tour Master"},{code:"T5",display:"Sylvan"},{code:"T6",display:"Travel Supreme"},{code:"T7",display:"Travel Express"},{code:"T8",display:"Trade Winds"},{code:"T9",display:"Tango Boats"},{code:"TA",display:"Tiara"},{code:"TAB",display:"Tab (RV)"},{code:"TAI",display:"Taiwan (motorcycle)"},{code:"TAT",display:"Tamarack Trail"},{code:"TB",display:"Toro"},{code:"TC",display:"Travelcraft"},{code:"TD",display:"Tracker Evinrude"},{code:"TDC",display:"Tidecraft"},{code:"TE",display:"Teton"},{code:"TES",display:"Tesla"},{code:"TF",display:"Travelaire"},{code:"TFM",display:"Three Feathers Manufacturing"},{code:"TG",display:"Tioga"},{code:"TGB",display:"Taiwan Golden Bee (motorcycle)"},{code:"TH",display:"Theurer Trailer"},{code:"THR",display:"Thor Motor Coach"},{code:"TI",display:"Thor Industry"},{code:"TIG",display:"TIGE (boat)"},{code:"TIR",display:"Timber Ridge"},{code:"TJ",display:"Trail-Lite (RV)"},{code:"TJN",display:"Trojan (boat)"},{code:"TJP",display:"TJ Powersports"},{code:"TK",display:"Cadillac Truck"},{code:"TK3",display:"Take 3"},{code:"TL",display:"Tropi-Cal"},{code:"TM",display:"Travel Master"},{code:"TMC",display:"Tomcar"},{code:"TMG",display:"TMG Group"},{code:"TMS",display:"Thomas"},{code:"TMT",display:"Trailmaster (trailer)"},{code:"TN",display:"Tracker Marine"},{code:"TNG",display:"TNG"},{code:"TNK",display:"Tank (motorcycle)"},{code:"TO",display:"Toyota"},{code:"TOM",display:"Tomberlin (motor home)"},{code:"TOU",display:"Tour (motor home)"},{code:"TP",display:"Tropica"},{code:"TPT",display:"TransSport (trailer)"},{code:"TQ",display:"Tahoe Lite (GM Vehicle)"},{code:"TR",display:"Triumph"},{code:"TRA",display:"Trailer"},{code:"TRW",display:"Trail West"},{code:"TRX",display:"T-REX"},{code:"TS",display:"Tigershark"},{code:"TT",display:"Toyota Truck"},{code:"TTD",display:"Tennessee Tandem (trailer)"},{code:"TU",display:"Tradewinds"},{code:"TUN",display:"Tundra (RV)"},{code:"TV",display:"Transvan"},{code:"TW",display:"Towlt"},{code:"TX",display:"Texson"},{code:"TY",display:"Terry"},{code:"TZ",display:"Titan"},{code:"TZI",display:"Tiziani"},{code:"U1",display:"USA Motorhome"},{code:"U2",display:"Ural"},{code:"U3",display:"Ultrastar"},{code:"U4",display:"Caroline Skiff (RV)"},{code:"U5",display:"Sugar Sands"},{code:"U6",display:"Cub Cadet"},{code:"U7",display:"American Cruiser (RV)"},{code:"U8",display:"Alumaweld"},{code:"U9",display:"Toyota Marine (boat)"},{code:"UA",display:"UD"},{code:"UB",display:"Club Car (by Ingersoll Rand)"},{code:"UC",display:"Sunstar (boat)"},{code:"UD",display:"Universal Datsun"},{code:"UE",display:"Elite Motor Homes (RV)"},{code:"UF",display:"Wildcat (RV)"},{code:"UG",display:"Universal Manufacturing"},{code:"UH",display:"Heartland (Fifth Wheel)"},{code:"UI",display:"Cirrus (travel trailer)"},{code:"UJ",display:"Baxley (travel trailer)"},{code:"UK",display:"Tuckrucky"},{code:"UL",display:"Ultra"},{code:"UM",display:"Utility Master"},{code:"UN",display:"Sunrise"},{code:"UNI",display:"United Trailer"},{code:"UNM",display:"United Motors"},{code:"UO",display:"US Cargo (trailer)"},{code:"UP",display:"Parts Unlimited"},{code:"UQ",display:"Valencia (RV)"},{code:"UR",display:"Surveyor"},{code:"US",display:"Sunstream"},{code:"UT",display:"UMC Truck"},{code:"UU",display:"Sunrunner"},{code:"UV",display:"Suntracker"},{code:"UW",display:"Sunvoyager"},{code:"UX",display:"Sidekicks"},{code:"UY",display:"Sooner"},{code:"UZ",display:"Suite"},{code:"V1",display:"Caravell"},{code:"V2",display:"Sunsport (RV)"},{code:"V3",display:"Correctcraft (ski boat)"},{code:"V4",display:"Sutphen (racing boat)"},{code:"V5",display:"Bimota (motorcycle)"},{code:"V6",display:"Apache"},{code:"V7",display:"Alaskan (RV)"},{code:"V8",display:"Carrilite (RV)"},{code:"V9",display:"Ram-Lin"},{code:"VA",display:"Savanna"},{code:"VAL",display:"Valley (trailer)"},{code:"VB",display:"Vagabond"},{code:"VC",display:"Cushman"},{code:"VD",display:"Bounder Diesel"},{code:"VDH",display:"Vanderhall"},{code:"VE",display:"Vectra"},{code:"VEC",display:"Vectrix (electric vehicle)"},{code:"VEN",display:"Venture (boat)"},{code:"VF",display:"Golden Falcon"},{code:"VFS",display:"Vinfast"},{code:"VG",display:"Avenger"},{code:"VH",display:"Austin Healey"},{code:"VHP",display:"Vehicle Production Group (VPG)"},{code:"VI",display:"Vision"},{code:"VIE",display:"View (motor home)"},{code:"VIV",display:"Viva (motorcycle)"},{code:"VJ",display:"Arrow Voyager"},{code:"VK",display:"Viking"},{code:"VL",display:"Verilight"},{code:"VM",display:"Victory"},{code:"VN",display:"Spartan"},{code:"VNG",display:"Vanguard (trailer)"},{code:"VO",display:"Volvo"},{code:"VP",display:"Viper"},{code:"VPG",display:"VHPG"},{code:"VQ",display:"Coral (boat)"},{code:"VR",display:"Roseair"},{code:"VRV",display:"Vanleigh RV"},{code:"VS",display:"Seaview"},{code:"VT",display:"Volvo Truck"},{code:"VTG",display:"Vantage"},{code:"VTM",display:"Vista (motor home)"},{code:"VU",display:"Seacraft"},{code:"VV",display:"VIP (boats)"},{code:"VW",display:"Volkswagen"},{code:"VX",display:"Vespa (scooter)"},{code:"VY",display:"Voyager"},{code:"VYE",display:"Voyage (motor home)"},{code:"VZ",display:"Vogue"},{code:"W1",display:"Western Star Trucks"},{code:"W2",display:"Washbash Trailer"},{code:"W3",display:"Cascade"},{code:"W4",display:"California Motorcycle"},{code:"W5",display:"Western Recreational (RV)"},{code:"W6",display:"Weekender"},{code:"W7",display:"Windsport (RV)"},{code:"W8",display:"American White Water"},{code:"W9",display:"Weekend Warrior"},{code:"WA",display:"Wrangler"},{code:"WAA",display:"Wuxi Angell Autocycle"},{code:"WB",display:"Wet Bikes"},{code:"WC",display:"Wells Cargo"},{code:"WCC",display:"West Coast Choppers"},{code:"WD",display:"Wildwood"},{code:"WE",display:"Westport"},{code:"WF",display:"Star Flyte (RV)"},{code:"WFP",display:"Wolf Pack"},{code:"WG",display:"Wurth West (factory master)"},{code:"WGN",display:"Wagoneer"},{code:"WH",display:"White"},{code:"WHE",display:"Wheego"},{code:"WI",display:"Winnebago"},{code:"WIL",display:"Wildfire (scooter)"},{code:"WIN",display:"Winnebago of Indiana, LLC"},{code:"WIR",display:"Wind River"},{code:"WJ",display:"Wet Jets"},{code:"WK",display:"Crow (boat)"},{code:"WL",display:"Wellcraft"},{code:"WM",display:"Wanderer Trail"},{code:"WN",display:"Wilderness"},{code:"WNC",display:"Winner's Circle"},{code:"WO",display:"Walker (trailer)"},{code:"WP",display:"Honda Power Equipment"},{code:"WQ",display:"Timber Wolf (trailer)"},{code:"WR",display:"Windjammer"},{code:"WS",display:"Western Star"},{code:"WSF",display:"Westfalia"},{code:"WSP",display:"Western Snow Plows"},{code:"WT",display:"Volkswagen Truck"},{code:"WU",display:"Winzer"},{code:"WV",display:"Worldwide Volkswagen"},{code:"WW",display:"Blue Water"},{code:"WWR",display:"Warrior"},{code:"WX",display:"Watercraft"},{code:"WY",display:"Kings Highway (RV)"},{code:"WZ",display:"Whizzer"},{code:"XA",display:"Acura Service Center"},{code:"XG",display:"Genesis/Hyundai"},{code:"XH",display:"Honda Service Senter"},{code:"XI",display:"Ineos"},{code:"XLR",display:"XLR"},{code:"XWF",display:"X Wolf"},{code:"Y1",display:"Arctic Cat (Snowmobile)"},{code:"Y2",display:"American Clipper"},{code:"Y3",display:"Stoughton"},{code:"Y4",display:"Stoughton Trailer"},{code:"Y5",display:"Utility Trailer"},{code:"Y6",display:"Summerwind"},{code:"Y7",display:"Snugtop"},{code:"Y8",display:"Cigarette"},{code:"Y9",display:"Triton"},{code:"YA",display:"Yamaha"},{code:"YB",display:"Skamper"},{code:"YC",display:"Scenic Cruiser"},{code:"YD",display:"Shadow Cruiser"},{code:"YE",display:"Studebaker"},{code:"YF",display:"Sportscraft"},{code:"YG",display:"Bombardier"},{code:"YH",display:"Sea Hunt"},{code:"YI",display:"Timpte"},{code:"YJ",display:"Mobile Scout (RV)"},{code:"YK",display:"Workhorse"},{code:"YL",display:"Yacht Club Trailer"},{code:"YM",display:"Commander (boat)"},{code:"YN",display:"Aquatron"},{code:"YO",display:"Aero"},{code:"YP",display:"Banda (scooter)"},{code:"YQ",display:"Tab (trailer)"},{code:"YR",display:"Robin"},{code:"YS",display:"Yellowstone"},{code:"YT",display:"Tracker"},{code:"YU",display:"Yugo"},{code:"YV",display:"Twin Vee"},{code:"YW",display:"World Cat"},{code:"YX",display:"Mountain High Coachworks"},{code:"YY",display:"SS"},{code:"YZ",display:"Transcraft"},{code:"Z1",display:"Craig Catamaran"},{code:"Z2",display:"Sportsmobile"},{code:"Z3",display:"Crown Line"},{code:"Z4",display:"Ski Centurion"},{code:"Z5",display:"Aro (Automobile)"},{code:"Z6",display:"Alpha Gold (5th wheel trailer)"},{code:"Z7",display:"Cobalt"},{code:"Z8",display:"Supra"},{code:"Z9",display:"Skamper Lite (trailer)"},{code:"ZA",display:"Stealth"},{code:"ZAA",display:"DeSoto"},{code:"ZAP",display:"Zap (electric scooter)"},{code:"ZB",display:"Mercury"},{code:"ZC",display:"Smoker Craft"},{code:"ZD",display:"Springdale"},{code:"ZE",display:"Alpine Coach"},{code:"ZEN",display:"ZENN (cars)"},{code:"ZF",display:"Monark"},{code:"ZG",display:"Harriskayot"},{code:"ZGR",display:"Zinger"},{code:"ZH",display:"Seahwak"},{code:"ZI",display:"Zimmer"},{code:"ZJ",display:"Cedar Creek"},{code:"ZK",display:"Kenworth"},{code:"ZL",display:"Marlin (motor home)"},{code:"ZM",display:"Zieman (trailer)"},{code:"ZN",display:"Sprinter"},{code:"ZNG",display:"Zingo (motorcycle)"},{code:"ZNS",display:"Zongshen"},{code:"ZO",display:"Tahoe (GM Vehicle)"},{code:"ZOM",display:"Zoom"},{code:"ZP",display:"Campion"},{code:"ZQ",display:"Aztec"},{code:"ZR",display:"Cardinal"},{code:"ZRO",display:"Zero Motorcyles"},{code:"ZS",display:"Steiner"},{code:"ZT",display:"Concourse"},{code:"ZU",display:"Ski Supreme"},{code:"ZV",display:"Miscellaneous"},{code:"ZW",display:"Miscellaneous W"},{code:"ZX",display:"Miscellaneous X"},{code:"ZY",display:"Miscellaneous Y"},{code:"ZZ",display:"Other Make"},{code:"ZZA",display:"Autumn Ridge"},{code:"ZZL",display:"DRV Luxury Suites"},{code:"ZZS",display:"Shockwave Toy Hauler"},{code:"ZZV",display:"VIA"},{code:"ZZX",display:"Four Winds"},{code:"ZZY",display:"TOPO"},{code:"ZZZ",display:"Alpine"}],te=(e="")=>String(e).toLowerCase().replace(/[^a-z0-9]+/g," ").trim(),de=e=>{if(!e)return null;const o=te(e);return o.includes("truck")?"truck":o.includes("van")?"van":o.includes("rv")||o.includes("motor home")||o.includes("motorhome")||o.includes("coach")?"rv":o.includes("trailer")||o.includes("5th wheel")||o.includes("fifth wheel")?"trailer":o.includes("scooter")?"scooter":o.includes("motorcycle")||o.includes("bike")?"motorcycle":o.includes("atv")?"atv":o.includes("snowmobile")?"snowmobile":o.includes("boat")||o.includes("watercraft")?"boat":o},re=ae.map(e=>{const{base:o,typeHint:a}=(e=>{const o=e.match(/^(.+?)\s*\((.+)\)\s*$/);return o?{base:te(o[1]),typeHint:o[2]}:{base:te(e),typeHint:null}})(e.display);return{...e,_base:o,_normType:de(a)}}),ie=new Map;for(const e of re){const o=ie.get(e._base)||[];o.push(e),ie.set(e._base,o)}const se=e=>{const o=te(e);if(!o)return null;const a=ie.get(o);if(a&&a.length)return(e=>{if(!e||!e.length)return null;let o=e.find(e=>!e._normType);return o||(o=e.find(e=>"rv"===e._normType),o||e[0])})(a);let t=null;for(const e of re){const a=e._base;if(a===o)return e;(a.startsWith(o)||o.startsWith(a))&&(!t||a.length{if(!e)return null;const a=te(e),t=te(o),d=o?((e,o)=>{const a=te(e),t=te(o);return a&&t&&le.find(e=>{const o=[e.make,...e.makeAlt||[]].filter(Boolean).some(e=>te(e)===a),d=te(e.type)===t;return o&&d})||null})(e,o):null;if(d){const e=ce(d.code);if(e)return e}if(t){const e=le.find(e=>te(e.make)===a&&te(e.type)===t);if(e)return ce(e.code)}if(t){const a=se(`${e} ${o}`);if(a)return a;const t=se(`${o} ${e}`);if(t)return t}return se(e)},ce=e=>{if(!e)return null;const o=e.toUpperCase();return re.find(e=>e.code===o)||null};exports.ENTRIES=re,exports.RAW_ENTRIES=ae,exports.RRClient=class{constructor(e){if(!e?.baseUrl)throw new Error("RRClient requires baseUrl");if(!e?.username)throw new Error("RRClient requires username");if(!e?.password)throw new Error("RRClient requires password");this.cfg={wssePasswordType:"Text",timeoutMs:3e4,logger:j,retries:{max:3},...e},this.mask={password:!0}}async _send(e){const{starXml:o,routing:d,envelope:s,postParse:l}=e,m=this.cfg.logger||j,{bodId:T,creationDateTime:C,sender:R}=function(e){return{bodId:e?.bodId||B.v4(),creationDateTime:e?.creationDateTime||new Date,sender:e?.sender||{}}}(s),g=function({username:e,password:o,wssePasswordType:d="Text",starContentXml:r,normalize:i=!0,normalizeOptions:s}={}){const l=function(e){return`\n \n \n \n${a(e,10)}\n \n \n \n `.trim()}(r),n=`\n \n \n${a(function(e,o,a){const d="Digest"===a?' Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"':' Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"';return`\n \n \n ${t(e)}\n ${t(o)}\n \n \n `.trim()}(e,o,d),8)}\n \n \n${a(l,8)}\n \n \n `.trim();return i?function(e,{prettyPrint:o=!0}={}){if(!e||"string"!=typeof e)return e;try{return G.create(e).end({prettyPrint:o,width:0,indent:" ",newline:"\n"}).trim()}catch(o){return String(e).trim()}}(n,s):n}({username:this.cfg.username,password:this.cfg.password,wssePasswordType:this.cfg.wssePasswordType||"Text",routing:d,sender:R,creationDateTime:(b=C,"string"==typeof b?b:(b instanceof Date?b:new Date).toISOString().replace(/\.\d{3}Z$/,"Z")),bodId:T,starContentXml:o}),N=k(g);var b;"1"===process.env.RR_DUMP_ENVELOPE&&console.log(`[rr] Soap envelope about to send (${e?.elementName}): \n`+N+"\n");const S=async()=>{const o=await async function({baseUrl:e,envelopeXml:o,timeoutMs:a=3e4,logger:t}){try{const t=await K.default.post(e,o,{timeout:a,headers:{"Content-Type":"text/xml; charset=utf-8",SOAPAction:"http://www.starstandards.org/webservices/2005/10/transport/ProcessMessage"},responseType:"text",validateStatus:()=>!0});if(t.status>=200&&t.status<300)return String(t.data??"");throw new Z(`HTTP ${t.status}: ${function(e){const o=String(e??"");return o.length>1024?o.slice(0,1024)+"…":o}(t.data)}`,{status:t.status,body:t.data})}catch(e){if(K.default.isAxiosError(e))throw new Z(`Network error: ${e.message}`,{cause:e});throw e}}({baseUrl:this.cfg.baseUrl,envelopeXml:g,timeoutMs:this.cfg.timeoutMs,logger:m}),a=function(e){const o=Q.parse(e),a=o?.Envelope||o?.["soapenv:Envelope"]||o,t=a?.Body||a?.["soapenv:Body"]||a?.["S:Body"]||a?.["soap:Body"],d=t?.ProcessMessageResponse||t?.["ns2:ProcessMessageResponse"]||t?.["trans:ProcessMessageResponse"]||t,r=d?.payload||d?.["ns2:payload"]||d;return r?.content||r?.["ns2:content"]||r}(o),t=k(o),d=function(e){const o=p(e),a=r(e,e=>/RoRecordStatus$/i.test(e)).flatMap(i)[0];return{transaction:y(o),roRecord:u(a)}}(a),s=function(e){const o=String("ApplicationArea").toLowerCase(),a=[e];for(;a.length;){const e=a.pop();if(e&&"object"==typeof e)for(const[t,d]of Object.entries(e)){if(t.toLowerCase().endsWith(o))return d;d&&"object"==typeof d&&a.push(d)}}}(a),{status:T,norm:C}=function(e){const o=p(e)||r(e,e=>/Status$/i.test(e)).flatMap(i)[0]||{},a=(n(o,"Status")||o.Status||"").toString().trim();let t=(n(o,"StatusCode")||o.StatusCode||"").toString().trim();const d=o.Message&&c(o.Message)||c(o)||"";!t&&/success/i.test(a)&&(t="0");const s=Number(t);let l="FAIL";return/success/i.test(a)||0===s?l="SUCCESS":2!==s&&213!==s||(l="NO_MATCH"),{status:{Status:a,StatusCode:t,Message:d},norm:{kind:l,code:Number.isFinite(s)?s:void 0,message:d}}}(a);if("1"===process.env.RR_DUMP_STATUS&&(console.log("[rr] Status blocks:"),console.dir(d,{depth:null,colors:!0})),"1"===process.env.RR_DUMP_APPLICATION&&(console.log("[rr] ApplicationArea:"),console.dir(s,{depth:null,colors:!0})),"FAIL"===C.kind){const e=T?.StatusCode;throw new Y(`Vendor status failure: ${e??""} ${T?.Message||T?.["#text"]||""}`.trim(),{status:T,reqXml:N,requestXml:N,resXml:t})}const R={success:"SUCCESS"===C.kind||"NO_MATCH"===C.kind,statusBlocks:d,applicationArea:s,xml:{request:N,response:t},parsed:a};if("function"==typeof l)try{R.data=l(a)}catch(e){m?.warn?.(`postParse failed: ${e?.message||e}`)}return"1"===process.env.RR_DUMP_XML&&console.log(`[rr] Full response XML (${e?.elementName}):\n`+t+"\n"),R?.data&&"1"===process.env.RR_DUMP_DATA&&(console.log(`[rr] Parsed response data (${e?.elementName}):\n`),console.dir(R.data,{depth:null,colors:!0})),R};try{return await async function(e,{max:o=3,logger:a}){let t,d=0;for(;d=o)break;const i=D(V(400,d));a?.warn?.(`Retrying attempt ${d}/${o} in ${i}ms: ${e.message}`),await w(i)}throw t}(S,{max:this.cfg.retries?.max??3,logger:m})}catch(e){if(e instanceof Z||e instanceof Y)throw e;throw new Z(`Unexpected error: ${e?.message||e}`,{cause:e})}}async combinedSearch(e,a){return this._send(function(e={},a={}){if(!e||"object"!=typeof e)throw new J("combinedSearch requires a query object");const t=function(e){if(!e)return"";const o=String(e).trim().toLowerCase();return"telephone"===o?"phone":"lic"===o||"plate"===o?"license":"vin"===o||"partvin"===o?"vin":"name"===o?"name":"namerecid"===o||"custid"===o?"nameRecId":"stkno"===o||"stock"===o?"stkNo":o}(e.kind),d={MaxRecs:Math.min(Number(e.maxResults||e.maxRecs||50),50)};if("phone"===t){const o=T(e.phone,"phone");if(!o)throw new J("combinedSearch phone value missing");d.Phone=o}else if("license"===t){const o=T(e.license,"license");if(!o)throw new J("combinedSearch license value missing");d.LicenseNum=o}else if("vin"===t){const o=T(e.vin,"vin");if(!o)throw new J("combinedSearch vin value missing");d.PartVIN=o}else if("name"===t){const o=e.name;if("string"==typeof o){const e=o.trim();if(!e)throw new J("combinedSearch name string is empty");d.LName=e}else{if(!o||"object"!=typeof o)throw new J("combinedSearch name requires { fname/lname/mname } object or a last-name string");{const e=C(o.fname),a=C(o.mname),t=C(o.lname),r=!e&&!a&&!t&&C(o.name);if(e||a||t)d.FullName={FName:e,MName:a,LName:t};else{if(!r)throw new J("combinedSearch name requires string last name, or object with any of { fname, lname, mname }");d.LName=r}}}}else if("nameRecId"===t){const o=T(e.nameRecId??e.custId,"custId");if(!o)throw new J("combinedSearch nameRecId value missing");d.NameRecId=o}else{if("stkNo"!==t)throw new J(`Unsupported CombinedSearch kind: ${e.kind}`);{const o=T(e.stkNo??e.stock,"stkNo");if(!o)throw new J("combinedSearch stkNo value missing");d.StkNo=o}}if(1!==[d.Phone,d.LicenseNum,d.PartVIN,d.LName,d.FullName,d.NameRecId,d.StkNo].filter(Boolean).length)throw new J("combinedSearch requires exactly one search criterion");const r=C(e.make),i=C(e.model),s=C(e.year);(r||i||s)&&(d.VehData={MakePfx:r,Model:i,Year:s});const l=o({routing:a.routing,sender:{component:"Rome",task:"CVC",referenceId:"Query",creator:"RCI",senderName:"RCI"},order:"creation-bod-sender-destination"});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n {{#Phone}}{{/Phone}}\n {{#PartVIN}}{{/PartVIN}}\n {{#LicenseNum}}{{/LicenseNum}}\n {{#LName}}{{/LName}}\n {{#FullName}}\n \n {{/FullName}}\n {{#NameRecId}}{{/NameRecId}}\n {{#StkNo}}{{/StkNo}}\n \n {{#VehData}}\n \n {{/VehData}}\n \n\n',{ApplicationArea:l,...d}),routing:a.routing,envelope:a.envelope,elementName:"rey_RomeCustServVehCombReq",xsdFilename:"rey_RomeCustServVehCombReq.xsd",postParse:m}}(e,a))}async insertCustomer(e,a){return this._send(function(e,a){if(!a?.routing?.dealerNumber)throw new J("routing.dealerNumber required");const t=S(e),d=o({routing:a.routing,sender:{component:"Rome",task:"CU",referenceId:"Insert"},order:"sender-creation-bod-destination"});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n {{#C.contactInfo.Addresses}}\n \n {{/C.contactInfo.Addresses}}\n {{#C.contactInfo.Phones}}\n \n {{/C.contactInfo.Phones}}\n {{#C.contactInfo.Email}}\n \n {{/C.contactInfo.Email}}\n \n {{#C.custPersonal}}\n \n {{#BirthDates}}\n \n {{/BirthDates}}\n {{#SSNs}}\n \n {{/SSNs}}\n {{#DriverInfo}}\n \n {{/DriverInfo}}\n {{#CustChildren}}\n \n {{/CustChildren}}\n \n {{/C.custPersonal}}\n {{#C.dmsCustInfo}}\n \n {{#Followups}}\n \n {{/Followups}}\n \n {{/C.dmsCustInfo}}\n \n\n',{ApplicationArea:d,C:t}),routing:a.routing,envelope:a.envelope,postParse:g,xsdFilename:"rey_RomeCustomerInsertReq.xsd",elementName:"rey_RomeCustomerInsertReq"}}(e,a))}async updateCustomer(e,a){return this._send(function(e,a){if(!a?.routing?.dealerNumber)throw new J("routing.dealerNumber required");if(!e.nameRecId)throw new J("nameRecId or customerId required");const t=b(e.ibFlag);if("I"!==t&&"B"!==t)throw new J("ibFlag required ('I' or 'B')");const d=S(e);d.contactInfo.NameRecId=String(e.nameRecId);const r=o({routing:a.routing,sender:{component:"Rome",task:"CU",referenceId:"Update"},order:"sender-creation-bod-destination"});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n {{#C.contactInfo.Addresses}}\n \n {{/C.contactInfo.Addresses}}\n {{#C.contactInfo.Phones}}\n \n {{/C.contactInfo.Phones}}\n {{#C.contactInfo.Email}}\n \n {{/C.contactInfo.Email}}\n \n {{#C.custPersonal}}\n \n {{#BirthDates}}\n \n {{/BirthDates}}\n {{#SSNs}}\n \n {{/SSNs}}\n {{#DriverInfo}}\n \n {{/DriverInfo}}\n {{#CustChildren}}\n \n {{/CustChildren}}\n \n {{/C.custPersonal}}\n {{#C.dmsCustInfo}}\n \n {{#Followups}}\n \n {{/Followups}}\n \n {{/C.dmsCustInfo}}\n \n\n',{ApplicationArea:r,C:d}),routing:a.routing,envelope:a.envelope,postParse:g,xsdFilename:"rey_RomeCustomerUpdateReq.xsd",elementName:"rey_RomeCustomerUpdateReq"}}(e,a))}async insertServiceVehicle(e,a){return this._send(function(e={},a={}){if(!a?.routing?.dealerNumber)throw new J("routing.dealerNumber is required");const t=o({routing:a.routing,sender:a?.envelope?.sender??{component:"Rome",task:"SV",referenceId:"Insert"},creationDateTime:a?.envelope?.creationDateTime,bodId:a?.envelope?.bodId}),d=function(e={}){const o=e.vin;if(!o)throw new J("insertServiceVehicle: vin is required");const a=e.vehicleServInfo?.customerNo;if(!a)throw new J("insertServiceVehicle: vehicleServInfo.customerNo (or customerNo) is required");return{VIN:String(o).toUpperCase(),VehicleMake:e.vehicleMake||e.make,VehicleYear:String(e.year).slice(-2),MdlNo:e.mdlNo||e.modelCode||"P",ModelDesc:e.modelDesc,Carline:e.carline,ExtClrDesc:e.extClrDesc,AccentClr:e.accentClr,Aircond:e.aircond??"Y",Pwrstr:e.pwrstr??"Y",Transm:e.transm??"A",Turbo:e.turbo?"Y":"N",EngineConfig:e.engineConfig,Trim:e.trim,LicNo:e.licNo,StockID:e.stockId,CustomerNo:String(a),vehicleServInfo:{salesmanNo:e.vehicleServInfo?.salesmanNo,inServiceDate:e.vehicleServInfo?.inServiceDate?h(e.vehicleServInfo?.inServiceDate):void 0,mileage:e.vehicleServInfo?.mileage,teamCode:e.vehicleServInfo?.teamCode,productionDate:e?.productionDate?h(e.productionDate):void 0,modelMaintCode:e.modelMaintCode,vehExtWarranty:(()=>{const o=e.vehicleServInfo?.vehExtWarranty;if(!o)return;const a={contractNumber:o.contractNumber,expirationDate:o?.expirationDate?h(o.expirationDate):void 0,expirationMileage:o.expirationMileage};return Object.values(a).some(e=>null!=e&&""!==e)?a:void 0})(),advisor:(()=>{const o=e.vehicleServInfo?.advisor,a=o?.contactInfo?.nameRecId;return a?{contactInfo:{nameRecId:String(a)}}:void 0})()}}}(e);return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n\n \n \n \n\n \n {{#V.vehicleServInfo.vehExtWarranty}}\n \n {{/V.vehicleServInfo.vehExtWarranty}}\n\n {{#V.vehicleServInfo.advisor}}\n \n \n \n {{/V.vehicleServInfo.advisor}}\n \n\n',{ApplicationArea:t,V:d}),routing:a.routing,envelope:a.envelope,postParse:f,xsdFilename:"rey_RomeServVehicleInsertReq.xsd",elementName:"rey_RomeServVehicleInsertReq"}}(e,a))}async getAdvisors(e,o){return this._send(v(e,o))}async createRepairOrder(e,a){return this._send(function(e={},a={}){if(!a?.routing?.dealerNumber)throw new J("routing.dealerNumber required");if(!e?.customerNo)throw new J("customerNo (CustNo) required");if(!e?.departmentType)throw new J("departmentType (DeptType) required");if(!e?.vin)throw new J("vin (Vin) required");if(!e?.outsdRoNo)throw new J("outsdRoNo required");const t={customerNo:e.customerNo,advisorNo:e.advisorNo,tagNo:e.tagNo,outsdRoNo:e.outsdRoNo,departmentType:e.departmentType,vin:e.vin,mileageIn:e.mileageIn,roComment:e.roComment,estimate:e.estimate?{parts:e.estimate.parts,labor:e.estimate.labor,total:e.estimate.total}:void 0,tax:e.tax?{payType:e.tax.payType,taxCode:e.tax.taxCode,txblGrossAmt:e.tax.txblGrossAmt,grossTaxAmt:e.tax.grossTaxAmt}:void 0,rolabor:e.rolabor?{ops:e.rolabor.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,custPayTypeFlag:e.custPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrPayTypeFlag:e.warrPayTypeFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrPayTypeFlag:e.intrPayTypeFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,vlrCode:e.vlrCode,bill:e.bill?{payType:e.bill.payType,jobTotalHrs:e.bill.jobTotalHrs,billTime:e.bill.billTime,billRate:e.bill.billRate}:void 0,ccc:e.ccc?{cause:e.ccc.cause,complaint:e.ccc.complaint,correction:e.ccc.correction}:void 0,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,totalAmt:e.amount.totalAmt}:void 0}))}:void 0,ropart:e.ropart?{jobs:e.ropart.jobs?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({partNo:e.partNo,partNoDesc:e.partNoDesc,qtyOrd:e.partQty,sale:e.sale,cost:e.cost,addDeleteFlag:e.addDeleteFlag}))}))}:void 0,rogg:e.rogg?{roNo:e.rogg.roNo,ops:e.rogg.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({breakOut:e.breakOut,itemType:e.itemType,itemDesc:e.itemDesc,custQty:e.custQty,warrQty:e.warrQty,intrQty:e.intrQty,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,dlrCost:e.amount.dlrCost}:void 0}))}))}:void 0,romisc:e.romisc?{roNo:e.romisc.roNo,ops:e.romisc.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({miscCode:e.miscCode,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,codeAmt:e.codeAmt}))}))}:void 0};if(t.tax?.payType&&!["All","Cust","Intr","Warr"].includes(t.tax.payType))throw new J("tax.payType must be one of: All, Cust, Intr, Warr");if(t.rolabor?.ops?.some(e=>e.custTxblNtxblFlag&&!["T","N"].includes(e.custTxblNtxblFlag)||e.warrTxblNtxblFlag&&!["T","N"].includes(e.warrTxblNtxblFlag)||e.intrTxblNtxblFlag&&!["T","N"].includes(e.intrTxblNtxblFlag)))throw new J("Taxable flags (CustTxblNTxblFlag, WarrTxblNTxblFlag, IntrTxblNTxblFlag) must be 'T' or 'N'");if(t.rogg?.ops?.some(e=>e.lines?.some(e=>e.itemType&&!["G","P","S","F"].includes(e.itemType))))throw new J("rogg.ops.lines.itemType must be one of: G, P, S, F");const d={...a?.envelope||{},sender:{component:a?.envelope?.sender?.component??"Rome",task:a?.envelope?.sender?.task??"BSMRO",referenceId:a?.envelope?.sender?.referenceId??"Insert",creatorNameCode:a?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:a?.envelope?.sender?.senderNameCode??"RCI"}},r=o({routing:a.routing,sender:d.sender,creationDateTime:d.creationDateTime,bodId:d.bodId});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n {{#RO.roComment}}\n \n {{/RO.roComment}}\n\n {{#RO.estimate}}\n \n {{/RO.estimate}}\n\n {{#RO.tax}}\n \n {{/RO.tax}}\n \n\n {{#RO.rolabor}}\n \n {{#RO.rolabor.ops}}\n \n {{#bill}}\n \n {{/bill}}\n\n {{#ccc}}\n \n {{/ccc}}\n\n {{#amount}}\n \n {{/amount}}\n \n {{/RO.rolabor.ops}}\n \n {{/RO.rolabor}}\n\n {{#RO.ropart}}\n \n {{#RO.ropart.jobs}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.ropart.jobs}}\n \n {{/RO.ropart}}\n\n {{#RO.rogg}}\n \n {{#RO.rogg.ops}}\n \n {{#lines}}\n \n {{#amount}}\n \n {{/amount}}\n \n {{/lines}}\n \n {{/RO.rogg.ops}}\n \n {{/RO.rogg}}\n\n {{#RO.romisc}}\n \n {{#RO.romisc.ops}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.romisc.ops}}\n \n {{/RO.romisc}}\n \n\n',{ApplicationArea:r,RO:t}),routing:a.routing,envelope:d,postParse:F,xsdFilename:"rey_RomeCreateBSMRepairOrderReq.xsd"}}(e,a))}async updateRepairOrder(e,a){return this._send(function(e={},a={}){if(!a?.routing?.dealerNumber)throw new J("routing.dealerNumber required");if(!e?.finalUpdate)throw new J("finalUpdate (FinalUpdate) required");if(!["Y","N"].includes(e.finalUpdate))throw new J("finalUpdate must be 'Y' or 'N'");if(!e?.outsdRoNo)throw new J(" outsdRoNo");const t={finalUpdate:e.finalUpdate||"N",roNo:e.roNo,customerNo:e.customerNo,tagNo:e.tagNo,outsdRoNo:e.outsdRoNo,departmentType:e.departmentType,vin:e.vin,mileageIn:e.mileageIn,mileageOut:e.mileageOut,roComment:e.roComment,estimate:e.estimate?{estimateType:e.estimate.estimateType}:void 0,tax:e.tax?{payType:e.tax.payType,taxCode:e.tax.taxCode,txblGrossAmt:e.tax.txblGrossAmt,grossTaxAmt:e.tax.grossTaxAmt}:void 0,rolabor:e.rolabor?{ops:e.rolabor.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,custPayTypeFlag:e.custPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrPayTypeFlag:e.warrPayTypeFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrPayTypeFlag:e.intrPayTypeFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,vlrCode:e.vlrCode,bill:e.bill?{payType:e.bill.payType,jobTotalHrs:e.bill.jobTotalHrs,billTime:e.bill.billTime,billRate:e.bill.billRate}:void 0,ccc:e.ccc?{cause:e.ccc.cause,complaint:e.ccc.complaint,correction:e.ccc.correction}:void 0,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice}:void 0}))}:void 0,ropart:e.ropart?{jobs:e.ropart.jobs?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({partNo:e.partNo,partNoDesc:e.partNoDesc,qtyOrd:e.partQty,sale:e.sale,cost:e.cost,addDeleteFlag:e.addDeleteFlag}))}))}:void 0,rogg:e.rogg?{roNo:e.rogg.roNo,ops:e.rogg.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({breakOut:e.breakOut,itemType:e.itemType,itemDesc:e.itemDesc,custQty:e.custQty,warrQty:e.warrQty,intrQty:e.intrQty,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,dlrCost:e.amount.dlrCost}:void 0}))}))}:void 0,romisc:e.romisc?{roNo:e.romisc.roNo,ops:e.romisc.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({miscCode:e.miscCode,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,codeAmt:e.codeAmt}))}))}:void 0};if(t.tax?.payType&&!["All","Cust","Intr","Warr"].includes(t.tax.payType))throw new J("tax.payType must be one of: All, Cust, Intr, Warr");if(t.rolabor?.ops?.some(e=>e.custTxblNtxblFlag&&!["T","N"].includes(e.custTxblNtxblFlag)||e.warrTxblNtxblFlag&&!["T","N"].includes(e.warrTxblNtxblFlag)||e.intrTxblNtxblFlag&&!["T","N"].includes(e.intrTxblNtxblFlag)))throw new J("Taxable flags (CustTxblNTxblFlag, WarrTxblNTxblFlag, IntrTxblNTxblFlag) must be 'T' or 'N'");if(t.rogg?.ops?.some(e=>e.lines?.some(e=>e.itemType&&!["G","P","S","F"].includes(e.itemType))))throw new J("rogg.ops.lines.itemType must be one of: G, P, S, F");const d={...a?.envelope||{},sender:{component:a?.envelope?.sender?.component??"Rome",task:a?.envelope?.sender?.task??"BSMRO",referenceId:a?.envelope?.sender?.referenceId??"Update",creatorNameCode:a?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:a?.envelope?.sender?.senderNameCode??"RCI"}},r=o({routing:a.routing,sender:d.sender,creationDateTime:d.creationDateTime,bodId:d.bodId});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n {{#RO.roComment}}\n \n {{/RO.roComment}}\n\n {{#RO.estimate}}\n \n {{/RO.estimate}}\n\n {{#RO.tax}}\n \n {{/RO.tax}}\n \n\n {{#RO.rolabor}}\n \n {{#RO.rolabor.ops}}\n \n {{#bill}}\n \n {{/bill}}\n\n {{#ccc}}\n \n {{/ccc}}\n\n {{#amount}}\n \n {{/amount}}\n \n {{/RO.rolabor.ops}}\n \n {{/RO.rolabor}}\n\n {{#RO.ropart}}\n \n {{#RO.ropart.jobs}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.ropart.jobs}}\n \n {{/RO.ropart}}\n\n {{#RO.rogg}}\n \n {{#RO.rogg.ops}}\n \n {{#lines}}\n \n {{#amount}}\n \n {{/amount}}\n \n {{/lines}}\n \n {{/RO.rogg.ops}}\n \n {{/RO.rogg}}\n\n {{#RO.romisc}}\n \n {{#RO.romisc.ops}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.romisc.ops}}\n \n {{/RO.romisc}}\n \n\n',{ApplicationArea:r,RO:t}),routing:a.routing,envelope:d,postParse:F,xsdFilename:"rey_RomeUpdateBSMRepairOrderReq.xsd",elementName:"rey_RomeUpdateBSMRepairOrderReq"}}(e,a))}async getParts(e,a){return this._send(function(e={},a={}){const t=e.roNumber?String(e.roNumber).trim():void 0;if(!t)throw new J("getParts: roNumber required");const d=o({routing:a.routing,sender:{component:"Rome",task:"RCT",referenceId:"Query",creator:"RCI",senderName:"RCI"}});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n\n',{ApplicationArea:d,RoNumber:t}),routing:a.routing,envelope:a.envelope,xsdFilename:"rey_RomeGetPartsReq.xsd",elementName:"rey_RomeGetPartsReq",postParse:e=>function(e){return e?.rey_RomeGetPartsResp?.RoParts?.map(e=>({partNumber:O(e,"PartNumber"),partDescription:O(e,"PartDescription"),quantityOrdered:O(e,"QuantityOrdered"),quantityShipped:O(e,"QuantityShipped"),price:O(e,"Price"),cost:O(e,"Cost"),processedFlag:O(e,"ProcessedFlag"),addOrDelete:O(e,"AddOrDelete")}))||[]}(e)}}(e,a))}},exports.errors=_,exports.getEntryByCode=ce,exports.lookupByMake=se,exports.lookupByMakeAndType=ne,exports.lookupVehicleMake=(e,o)=>{if(!e)return null;if("string"==typeof e){const a=e;return o?ne(a,o):se(a)}if("object"==typeof e){const{make:o,type:a}=e;return o?a?ne(o,a):se(o):null}return null}; +"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o({routing:e={},sender:o={},creationDateTime:a,bodId:t}={}){const d={Sender:{Component:o.component??"Rome",Task:o.task??"CU",ReferenceId:o.referenceId??"Query",CreatorNameCode:o.creator??"RCI",SenderNameCode:o.senderName??"RCI"},CreationDateTime:a??(new Date).toISOString().replace(/\.\d{3}Z$/,"Z"),BODId:t??B.v4(),Destination:{DestinationNameCode:"RR",DealerNumber:e.dealerNumber||"",StoreNumber:e.storeNumber||"",AreaNumber:e.areaNumber||""}},r={bod:"{{#BODId}}{{BODId}}{{/BODId}}",creation:"{{CreationDateTime}}",sender:"\n \n {{Sender.Component}}\n {{Sender.Task}}\n {{#Sender.ReferenceId}}{{Sender.ReferenceId}}{{/Sender.ReferenceId}}\n {{#Sender.CreatorNameCode}}{{Sender.CreatorNameCode}}{{/Sender.CreatorNameCode}}\n {{#Sender.SenderNameCode}}{{Sender.SenderNameCode}}{{/Sender.SenderNameCode}}\n ".trim(),dest:"\n \n {{Destination.DestinationNameCode}}\n {{#Destination.DealerNumber}}{{Destination.DealerNumber}}{{/Destination.DealerNumber}}\n {{#Destination.StoreNumber}}{{Destination.StoreNumber}}{{/Destination.StoreNumber}}\n {{#Destination.AreaNumber}}{{Destination.AreaNumber}}{{/Destination.AreaNumber}}\n ".trim()},i=`\n${["bod","creation","sender","dest"].map(e=>r[e]).join("\n")}\n`;return U.default.render(i,d).trim()}function a(e,o=2){const a=" ".repeat(o);return String(e).split("\n").map(e=>e.length?a+e:e).join("\n")}function t(e){return String(e??"").replace(/&/g,"&").replace(//g,">")}function d(e,o){if(null==e)return null;if(Array.isArray(e)){for(const a of e){const e=d(a,o);if(null!=e)return e}return null}if("object"!=typeof e)return null;for(const[a,t]of Object.entries(e)){if(o(a,t))return t;const e=d(t,o);if(null!=e)return e}return null}function r(e,o,a=[]){if(null==e)return a;if(Array.isArray(e)){for(const t of e)r(t,o,a);return a}if("object"!=typeof e)return a;for(const[t,d]of Object.entries(e))o(t,d)&&a.push(d),r(d,o,a);return a}function i(e){return null==e?[]:Array.isArray(e)?e:[e]}function s(e,o){if(e&&"object"==typeof e)return function(e){if(null!=e)return"string"==typeof e||"number"==typeof e||"boolean"==typeof e?String(e):"object"==typeof e&&"#text"in e?String(e["#text"]):void 0}(e[o])}function l(e,o){const a=s(e,o);if(q(a))return a;const t=function(e,o){if(e&&"object"==typeof e)return e.$&&q(e.$[o])?e.$[o]:q(e[`@_${o}`])?e[`@_${o}`]:q(e[`@${o}`])?e[`@${o}`]:e._attributes&&q(e._attributes[o])?e._attributes[o]:e.attributes&&q(e.attributes[o])?e.attributes[o]:void 0}(e,o);return q(t)?t:void 0}function n(e,o){if(e&&"object"==typeof e)return null!=e[`@_${o}`]?e[`@_${o}`]:void 0}function c(e){if(null!=e){if("string"==typeof e)return e;if("number"==typeof e)return String(e);if("object"==typeof e){if(null!=e._)return String(e._);if(null!=e["#text"])return String(e["#text"]);if(null!=e.text)return String(e.text)}}}function p(e){return r(e,e=>/(GenTransStatus|TransStatus)$/i.test(e)).flatMap(i)[0]}function y(e){if(e)return{status:(n(e,"Status")||e.Status||c(e)||"").toString().trim()||void 0,statusCode:(n(e,"StatusCode")||e.StatusCode||"").toString().trim()||void 0,message:e.Message&&c(e.Message)||e.GenTransStatus&&c(e.GenTransStatus)||e.TransStatus&&c(e.TransStatus)||c(e)||void 0}}function u(e){if(e)return{status:(n(e,"Status")||e.Status||c(e)||"").toString().trim()||void 0,date:(n(e,"Date")||e.Date||"").toString().trim()||void 0,time:(n(e,"Time")||e.Time||"").toString().trim()||void 0,outsdRoNo:(n(e,"OutsdRoNo")||e.OutsdRoNo||"").toString().trim()||void 0,dmsRoNo:(n(e,"DMSRoNo")||e.DMSRoNo||"").toString().trim()||void 0,errorMessage:(n(e,"ErrorMessage")||e.ErrorMessage||"").toString().trim()||void 0}}function m(e){const o=e?.rey_RomeCustServVehCombRes??e?.rey_RomeCustServVehCombReq??e?.rey_RomeCustServVehComb??e??{};return i(o?.CustServVehComb??o?.CustServVehCombRes??o?.CustServVehCombReq??o).map(e=>{const o=e?.NameContactId??void 0,a=o?.NameId??void 0,t=a?.IndName?$(a.IndName):void 0,d=a?.BusName?$(a.BusName):void 0,r=o&&{NameId:a&&{...$(a)||{},...t?{IndName:t}:{},...d?{BusName:d}:{}},Address:i(o?.Address).map(e=>$(e)||{}),ContactOptions:i(o?.ContactOptions).map(e=>$(e)||{}),Phone:i(o?.Phone).map(e=>$(e)||{}),Email:i(o?.Email).map(e=>$(e)||{})},s=i(e?.ServVehicle).map(e=>{const o=e?.Vehicle,a=o?.VehicleDetail,t=o&&{...$(o)||{},...a?{VehicleDetail:$(a)||{}}:{}},d=e?.VehicleServInfo,r=d?.VehExtWarranty,s=d?.Advisor,l=s?.ContactInfo;let n;s&&(n={...$(s)||{},...l?{ContactInfo:$(l)||{}}:{}});const c=d&&{...$(d)||{},...r?{VehExtWarranty:$(r)||{}}:{},...n?{Advisor:n}:{},...d?.VehServComments?{VehServComments:i(d.VehServComments).map(e=>X(e)).filter(e=>null!=e&&""!==String(e).trim())}:{}};return{...t?{Vehicle:t}:{},...c?{VehicleServInfo:c}:{}}}),l=i(e?.Message).map(e=>{const o=X(e);return{...$(e)||{},...null!=o&&""!==String(o).trim()?{Text:o}:{}}}).filter(e=>Object.keys(e).length>0),n={};return r&&(n.NameContactId=r),s.length&&(n.ServVehicle=s),l.length&&(n.Message=l),n})}function T(e,o){if(null!=e)return String("string"==typeof e||"number"==typeof e?e:e[o]||"")}function C(e){return String(e??"").trim()||void 0}function R(e,...o){if(e)for(const a of o){if(e.$&&null!=e.$[a])return e.$[a];if(null!=e[`@_${a}`])return e[`@_${a}`];if(null!=e[a]&&"object"!=typeof e[a])return e[a]}}function g(e){const o=function(e){const o=d(e,e=>"rey_RomeCustomerResponse"===e||e.endsWith(":rey_RomeCustomerResponse"));return o?r(o,e=>"TransStatus"===e||e.endsWith(":TransStatus")).flatMap(i)[0]:void console.log("No rey_RomeCustomerResponse found in root")}(e);if(!o)return{dmsRecKey:void 0};const a=R(o,"DMSRecKey");return{dmsRecKey:null!=a?String(a):void 0,status:R(o,"Status"),statusCode:R(o,"StatusCode")}}function N(e){if(null==e)return;const o=String(e).toUpperCase().replace(/[^A-Z0-9 ]+/g,"");if(!o)throw new J(`Invalid string: ${e}. Must contain A-Z, 0-9, or space`);return o}function b(e){return e?String(e).toUpperCase():void 0}function S(e={}){const o=b(e.ibFlag)||(e.firstName?"I":"B");if("I"!==o&&"B"!==o)throw new J("ibFlag must be 'I' or 'B'");const a=e.lastName||e.customerName;if(!a)throw new J("lastName or customerName required");if("I"===o&&!e.firstName)throw new J("firstName required when ibFlag='I'");const t=b(e.customerType),d="RETAIL"===t?"R":"WHOLESALE"===t?"W":"INTERNAL"===t?"I":t;if(d&&!["R","W","I"].includes(d))throw new J("customerType must be 'R', 'W', 'I', Retail, Wholesale, or Internal");const r=(e.addresses||[]).map(e=>{const o={Type:b(e.type)||"P",Addr1:e.line1?String(e.line1):void 0,Addr2:e.line2?String(e.line2):void 0,City:e.city?String(e.city):void 0,State:e.state?String(e.state):void 0,Zip:e.postalCode?String(e.postalCode):void 0,County:e.county?String(e.county):void 0,Country:e.country?String(e.country):void 0};if(!o.Addr1)throw new J("Address requires line1");return o}),i=(e.phones||[]).map(e=>{const o={Type:b(e.type)||"H",Num:e.number?String(e.number):void 0,Ext:e.extension?String(e.extension):void 0};if(!o.Num)throw new J("Phone requires number");return o}),s=e.emails?.[0]?.address?{MailTo:String(e.emails[0].address)}:void 0,l=e.personal,n=l?{Gender:b(l.gender),OtherName:N(l.otherName),AnniversaryDate:l.anniversaryDate?String(l.anniversaryDate):void 0,EmployerName:N(l.employerName),EmployerPhone:l.employerPhone?String(l.employerPhone):void 0,Occupation:N(l.occupation),OptOut:l.optOut?String(l.optOut):void 0,OptOutUse:l.optOutUse?String(l.optOutUse):void 0,BirthDates:(l.birthDates||[]).map(e=>({Type:b(e.type)||"P",date:e.date?String(e.date):void 0})).filter(e=>e.date),SSNs:(l.ssns||[]).map(e=>({Type:b(e.type)||"P",ssn:e.ssn?String(e.ssn):void 0})).filter(e=>e.ssn),DriverInfo:l.driver?[{Type:b(l.driver.type)||"P",LicNum:l.driver.licenseNumber?String(l.driver.licenseNumber):void 0,LicState:l.driver.licenseState?String(l.driver.licenseState):void 0,LicExpDate:l.driver.licenseExpDate?String(l.driver.licenseExpDate):void 0}].filter(e=>e.LicNum):void 0,CustChildren:(l.children||[]).map(e=>({ChildName:N(e.name)})).filter(e=>e.ChildName)}:void 0,c=e.dms,p=c?{TaxExemptNum:c.taxExemptNum?String(c.taxExemptNum):void 0,SalesTerritory:c.salesTerritory?String(c.salesTerritory):void 0,DeliveryRoute:c.deliveryRoute?String(c.deliveryRoute):void 0,SalesmanNum:c.salesmanNum?String(c.salesmanNum):void 0,LastContactMethod:c.lastContactMethod?String(c.lastContactMethod):void 0,Followups:(c.followups||[]).map(e=>({Type:b(e.type),Value:b(e.value)})).filter(e=>e.Type&&e.Value)}:void 0;return{custCateg:d||"R",createdBy:e.createdBy?String(e.createdBy):void 0,contactInfo:{IBFlag:o,LastName:N(a),FirstName:N(e.firstName),MidName:N(e.midName),Salut:N(e.salut),Suffix:N(e.suffix),Addresses:r,Phones:i,Email:s},custPersonal:n,dmsCustInfo:p}}function f(e){const o=d(e,e=>"rey_RomeServVehicleInsertResponse"===e||e.endsWith(":rey_RomeServVehicleInsertResponse"))||e,a=d(o,e=>"GenTransStatus"===e||e.endsWith(":GenTransStatus"));return{status:a?l(a,"Status"):void 0,statusCode:a?l(a,"StatusCode"):void 0}}function h(e){if(!e)return;let o;if(e instanceof Date)o=e;else if("string"==typeof e){const a=e.trim();if(/^\d{1,2}\/\d{1,2}\/\d{4}$/.test(a))return a;if(/^\d{4}-\d{2}-\d{2}/.test(a)){const[e,t,d]=a.split("T")[0].split("-");o=new Date(Number(e),Number(t)-1,Number(d))}else o=new Date(a)}else o=new Date(e);if(isNaN(o?.getTime()))throw new J(`Invalid date provided: ${e}`);return`${String(o.getMonth()+1).padStart(2,"0")}/${String(o.getDate()).padStart(2,"0")}/${o.getFullYear()}`}function x(e,o){const a=Array.isArray(o)?o.map(e=>e.toLowerCase()):[String(o).toLowerCase()],t=[e];for(;t.length;){const e=t.pop();if(ee(e))for(const o of Object.keys(e)){const d=e[o],r=z(o).toLowerCase();if(a.includes(r))return d;if(ee(d))t.push(d);else if(Array.isArray(d))for(const e of d)ee(e)&&t.push(e)}}}function A(e,o){if(e&&ee(e)){if(null!=e.$?.[o])return e.$[o];if(null!=e[`@${o}`])return e[`@${o}`];if(null!=e[`@_${o}`])return e[`@_${o}`]}}function P(e){if(null!=e){if("string"==typeof e)return e;if("number"==typeof e)return String(e);if(ee(e)){if(null!=e._)return String(e._);if(null!=e["#text"])return String(e["#text"]);if(null!=e.text)return String(e.text)}}}function F(e){const o=x(e,["CreateBSMRepairOrderResp","UpdateBSMRepairOrderResp"])||e,a=x(o,"RoRecordStatus")||{};return{status:A(a,"Status")||P(x(a,"Status")),date:A(a,"Date")||P(x(a,"Date")),time:A(a,"Time")||P(x(a,"Time")),outsdRoNo:A(a,"OutsdRoNo")||P(x(a,"OutsdRoNo")),dmsRoNo:A(a,"DMSRoNo")||P(x(a,"DMSRoNo")),errorMessage:A(a,"ErrorMessage")||P(x(a,"ErrorMessage"))}}function v(e={},a={}){const t=function(e){if(!e)throw new Error("department is required (S, P, B, SERVICE, PARTS, BODY)");const o=String(e).trim().toUpperCase();if("S"===o||"P"===o||"B"===o)return o;if("SERVICE"===o)return"S";if("PART"===o||"PARTS"===o)return"P";if("BODY"===o||"BODYSHOP"===o||"BODY SHOP"===o)return"B";throw new Error(`Invalid department: ${e}. Must be S, P, B, SERVICE, PARTS, BODY, BODYSHOP, or BODY SHOP`)}(e.department),d=e.advisorNumber?String(e.advisorNumber).trim():void 0,r=o({routing:a.routing,sender:a?.envelope?.sender,creationDateTime:a?.envelope?.creationDateTime,bodId:a?.envelope?.bodId});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n \n\n',{ApplicationArea:r,DepartmentType:t,AdvisorNumber:d}),routing:a.routing,envelope:a.envelope,xsdFilename:"rey_RomeGetAdvisorsReq.xsd",elementName:"rey_RomeGetAdvisorsReq",postParse:e=>function(e,o={}){const a=o?.department;var t;return(e=>{const o=e?.Advisor;return o?Array.isArray(o)?o:[o]:[]})((t=e,t?.rey_RomeGetAdvisorsResp??t??{})).map(e=>({advisorId:oe(e,"AdvisorNumber"),firstName:oe(e,"FirstName"),lastName:oe(e,"LastName"),department:a}))}(e,{department:t})}}function M(e){return null==e?void 0:String(e)}function O(e,o){if(e)return null!=e[o]?"object"!=typeof e[o]?M(e[o]):M(e[o]["#text"]):null!=e[`@_${o}`]?M(e[`@_${o}`]):void 0}function I(e){const o=e?.meta?.statusBlocks?.transaction?.message;if(o)return String(o);return String((e?.meta?.status?.Message??e?.meta?.status?.message)||e?.message||"")}function V(e,o){return Math.min(1e4,e*Math.pow(2,o))}function D(e){return e+Math.floor(250*Math.random())}function w(e){return new Promise(o=>setTimeout(o,e))}function E(e){return/lock|in use|record.*busy/i.test(String(e||""))}function L(e,o="****"){if(!e||"string"!=typeof e)return e;let a=e;return a=a.replace(/(]*>)([^<]*)(<\/wsse:Username>)/gi,`$1${o}$3`),a=a.replace(/(]*>)([^<]*)(<\/wsse:Password>)/gi,`$1${o}$3`),a}Object.defineProperty(exports,"__esModule",{value:!0});const k=require("mustache"),B=require("uuid"),G=require("xmlbuilder2"),H=require("axios"),W=require("fast-xml-parser"),U=e(k),K=e(H);class Z extends Error{constructor(e,o={}){super(e),this.name="RRTransportError",this.meta=o}}class Y extends Error{constructor(e,o={}){super(e),this.name="RRVendorStatusError",this.meta=o,this.retryable=!!o.retryable}}class J extends Error{constructor(e,o={}){super(e),this.name="RRValidationError",this.meta=o}}const _=Object.freeze({__proto__:null,RRTransportError:Z,RRVendorStatusError:Y,RRValidationError:J}),j={info:(...e)=>console.log("[rr-rome]",...e),warn:(...e)=>console.warn("[rr-rome]",...e),error:(...e)=>console.error("[rr-rome]",...e),debug:(...e)=>{process.env.RR_DEBUG&&console.log("[rr-rome][debug]",...e)}},q=e=>null!=e&&""!==String(e).trim(),Q=new W.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",parseAttributeValue:!1,parseTagValue:!1,isArray:e=>["Advisor"].includes(e)}),$=e=>{if(!e||"object"!=typeof e)return;const o={};for(const[a,t]of Object.entries(e))a.startsWith("@_")&&(o[a.slice(2)]=t);return Object.keys(o).length?o:void 0},X=e=>{if(null!=e)return"string"==typeof e?e:e["#text"]},z=e=>{if("string"!=typeof e)return"";let o=e.includes("}")?e.split("}").pop():e;return o=o.includes(":")?o.split(":").pop():o,o.startsWith("rey_")&&(o=o.slice(4)),o},ee=e=>e&&"object"==typeof e&&!Array.isArray(e),oe=(e,o)=>((e,o)=>e?.[`@_${o}`])(e,o)??s(e,o),ae=[{code:"A1",display:"Anker Craft"},{code:"A2",display:"Autocar"},{code:"A3",display:"Angler"},{code:"A4",display:"Automotive Rebuilders"},{code:"A5",display:"Alphenite"},{code:"A6",display:"Aerbus"},{code:"A7",display:"Aerolite"},{code:"A8",display:"American Star"},{code:"A9",display:"Aristocrat"},{code:"AA",display:"Alumalite"},{code:"AB",display:"Aurora"},{code:"AC",display:"Acura"},{code:"ACG",display:"American Custom Golf Cars"},{code:"ACP",display:"Keystone"},{code:"ACS",display:"Access (motor home)"},{code:"AD",display:"Aro"},{code:"AD6",display:"Anderson 6 Ton Trailer"},{code:"ADL",display:"Admiral (motor home)"},{code:"ADM",display:"Adam Trailers"},{code:"ADT",display:"Advantage Trailer"},{code:"ADV",display:"Adventurous"},{code:"ADY",display:"Adly"},{code:"AE",display:"Aeromat"},{code:"AF",display:"Alfa"},{code:"AG",display:"AM General"},{code:"AH",display:"American Coach"},{code:"AI",display:"Airstream"},{code:"AJ",display:"Aljo"},{code:"AK",display:"Arrow"},{code:"AL",display:"Allegro"},{code:"ALB",display:"Albemarle"},{code:"ALI",display:"Alliance RV"},{code:"ALO",display:"Aoha (boat)"},{code:"ALS",display:"Alumascape (travel trailer)"},{code:"ALU",display:"Aluma (trailer)"},{code:"AM",display:"American Motors"},{code:"AMC",display:"Ameri-Camp (trailer)"},{code:"AN",display:"American by Cobra"},{code:"AO",display:"Apollo"},{code:"AP",display:"Alphine Light"},{code:"APP",display:"Appalachian"},{code:"AQ",display:"Augusta (airplane)"},{code:"AR",display:"Alfa Romeo"},{code:"ARG",display:"Argo"},{code:"AS",display:"Aston Martin"},{code:"ASP",display:"Aspect (motor home)"},{code:"ASV",display:"ASV"},{code:"AT",display:"Arctic Cat (ATV)"},{code:"AU",display:"Audi"},{code:"AUG",display:"Augusta (RV)"},{code:"AUW",display:"Autowares"},{code:"AV",display:"Avanti"},{code:"AVN",display:"Adventurer (motor home)"},{code:"AW",display:"Atwood"},{code:"AX",display:"Airex"},{code:"AY",display:"American Flyer"},{code:"AZ",display:"Avion"},{code:"AZU",display:"AZURE (boats)"},{code:"AZZ",display:"Avalanche"},{code:"B1",display:"Starcraft Motor Home"},{code:"B2",display:"Bicycle"},{code:"B3",display:"Big Foot"},{code:"B4",display:"Brockway Truck"},{code:"B5",display:"Beaver"},{code:"B6",display:"Shelby"},{code:"B7",display:"American Eagle"},{code:"B8",display:"Bluebird (bus)"},{code:"B9",display:"Budd Trailer"},{code:"BA",display:"Baron"},{code:"BAC",display:"Briggs Automotive Company"},{code:"BAY",display:"Bayridge"},{code:"BB",display:"Southland Rebuilders"},{code:"BBR",display:"Big Bear (motorcycle)"},{code:"BC",display:"BMW Motorcycles"},{code:"BCR",display:"Braxton Creek"},{code:"BCT",display:"Back Country"},{code:"BD",display:"Snowbird"},{code:"BE",display:"Bentley"},{code:"BEE",display:"Bee (trailer)"},{code:"BF",display:"BMW Sav"},{code:"BFE",display:"Bedford"},{code:"BG",display:"Bering Truck"},{code:"BGC",display:"Big Country (RV)"},{code:"BGH",display:"Big Horn (RV)"},{code:"BGM",display:"Barnes Distribution General Motors Dealer Equipment (GMDE)"},{code:"BGS",display:"Big Sky"},{code:"BH",display:"Boston Whaler"},{code:"BIN",display:"Bintelli"},{code:"BJ",display:"Baja"},{code:"BK",display:"Baretta (boat)"},{code:"BKN",display:"Bricklin"},{code:"BKS",display:"Black Series"},{code:"BL",display:"Bolens"},{code:"BLD",display:"Black Diamond (travel trailer)"},{code:"BLI",display:"Blizzard Manufacturing"},{code:"BLR",display:"Black Rock"},{code:"BLZ",display:"Blazer"},{code:"BM",display:"BMW"},{code:"BMC",display:"Belmont Machine (trailer)"},{code:"BN",display:"Bonnavilla"},{code:"BNC",display:"Bennche ATV"},{code:"BO",display:"Bounder"},{code:"BOB",display:"Bobcat"},{code:"BOL",display:"Bollinger Motors"},{code:"BOS",display:"Boss Hoss (motorcycle)"},{code:"BP",display:"BrightDrop"},{code:"BQ",display:"Bear Trailer"},{code:"BR",display:"Basstream"},{code:"BRK",display:"Brinkley RV"},{code:"BRS",display:"Branson"},{code:"BRU",display:"Brutus"},{code:"BRY",display:"Bryant Boats"},{code:"BS",display:"Bass Tracker"},{code:"BSP",display:"Boss Snow Plows"},{code:"BT",display:"Bertone"},{code:"BTK",display:"Buick Truck (truck)"},{code:"BU",display:"Buick"},{code:"BUG",display:"Bugatti (automobile)"},{code:"BV",display:"Beaver Coach"},{code:"BVO",display:"Bravo (electric vehicle)"},{code:"BW",display:"Bowman"},{code:"BX",display:"Boulton (power boat)"},{code:"BY",display:"Bayliner"},{code:"BZ",display:"Automate"},{code:"BZZ",display:"Berkshire"},{code:"C1",display:"Colt"},{code:"C2",display:"Companion"},{code:"C3",display:"Crestliner Boat"},{code:"C4",display:"Cobra"},{code:"C5",display:"Cordova"},{code:"C6",display:"Cruise Air"},{code:"C7",display:"Chief"},{code:"C8",display:"Challenger"},{code:"C9",display:"Conquest"},{code:"CA",display:"Caterpillar"},{code:"CAL",display:"Carrlite (Camper)"},{code:"CAM",display:"C&M"},{code:"CAZ",display:"Cazador"},{code:"CB",display:"Chalet Pop"},{code:"CC",display:"Citation"},{code:"CCI",display:"Cruise Car Inc."},{code:"CCL",display:"CT Coachworks LLC (RV)"},{code:"CD",display:"Cadillac"},{code:"CDA",display:"Coda"},{code:"CDR",display:"Crusader"},{code:"CE",display:"Chateau"},{code:"CEN",display:"Centurian"},{code:"CF",display:"Capri"},{code:"CFM",display:"CFMOTO"},{code:"CG",display:"Camplight"},{code:"CGM",display:"Campagna Motors"},{code:"CH",display:"Chrysler"},{code:"CHA",display:"Chariot (RV)"},{code:"CHI",display:"Chironex"},{code:"CIT",display:"Citroen"},{code:"CJ",display:"Coronado"},{code:"CJA",display:"CJAY"},{code:"CK",display:"Chinook"},{code:"CKM",display:"Checkmate"},{code:"CL",display:"Chilton Trailers"},{code:"CM",display:"Coachment"},{code:"CMR",display:"Cimarron"},{code:"CMT",display:"CM Trailers"},{code:"CN",display:"Catalina"},{code:"CNA",display:"CAN-AM (ATV)"},{code:"CNC",display:"C&C (horse trailer)"},{code:"CNQ",display:"Chongquing"},{code:"CO",display:"Coleman"},{code:"CP",display:"Champion"},{code:"CPN",display:"Capone (motorcycle)"},{code:"CQ",display:"Curtis Industries"},{code:"CR",display:"Cavalier Motor Home"},{code:"CRC",display:"Cricket Cart"},{code:"CRD",display:"Carado RV"},{code:"CRS",display:"Creek Side"},{code:"CRU",display:"Cruiser RV"},{code:"CRV",display:"Carver (boat)"},{code:"CS",display:"Circle J"},{code:"CSE",display:"Case"},{code:"CT",display:"Chevrolet Truck"},{code:"CTR",display:"Citecar"},{code:"CU",display:"Cummins"},{code:"CV",display:"Chevrolet"},{code:"CW",display:"Chevrolet"},{code:"CX",display:"Chapparal"},{code:"CY",display:"Celebrity"},{code:"CYA",display:"Cyclone (RV)"},{code:"CYC",display:"Cyclone"},{code:"CZ",display:"Chris Craft"},{code:"CZY",display:"Cozy Traveler"},{code:"D1",display:"Dorsey Trailer"},{code:"D2",display:"Conestoga"},{code:"D3",display:"Dreamer (5th wheel trailer)"},{code:"D4",display:"Diplomat (RV)"},{code:"D5",display:"Daewoo"},{code:"D6",display:"Ducati (motorcycle)"},{code:"D7",display:"Desperado"},{code:"D8",display:"Donzi"},{code:"D9",display:"Surf Side"},{code:"DA",display:"Daihatsu"},{code:"DAL",display:"Dallara"},{code:"DB",display:"Dazon (scooter)"},{code:"DC",display:"Cherokee"},{code:"DCM",display:"Dixie Chopper (motorcycle)"},{code:"DD",display:"Detroit Diesel"},{code:"DE",display:"Delorean"},{code:"DF",display:"Desert Fox (RV)"},{code:"DFN",display:"Defender"},{code:"DG",display:"SDG (scooter)"},{code:"DH",display:"Dynasty"},{code:"DI",display:"Discovery"},{code:"DIA",display:"Diamondback"},{code:"DIS",display:"Discover Canada"},{code:"DIV",display:"Dively"},{code:"DJ",display:"Doubletree (trailer)"},{code:"DK",display:"Duracraft (boat)"},{code:"DL",display:"Dolphin"},{code:"DLT",display:"Delta (Utility and Horse trailer)"},{code:"DM",display:"Damon"},{code:"DN",display:"Dunes Trailer"},{code:"DO",display:"Dodge"},{code:"DP",display:"Dutch Pop"},{code:"DQ",display:"Double Tree (RV)"},{code:"DR",display:"Dutch Star"},{code:"DRX",display:"Duruxx"},{code:"DS",display:"Datsun"},{code:"DT",display:"Dodge Truck"},{code:"DTM",display:"De Tomaso"},{code:"DTR",display:"Dump Trailer"},{code:"DU",display:"Dutchmen"},{code:"DUR",display:"Duroboat (boat)"},{code:"DV",display:"Dodge Van"},{code:"DW",display:"Sundowner (trailer)"},{code:"DX",display:"Dynamax"},{code:"DY",display:"Daybreak"},{code:"DYM",display:"Dymac (electric vehicle)"},{code:"DYQ",display:"Dynaquest (motor home)"},{code:"DZ",display:"Century"},{code:"E1",display:"Exiss (trailer)"},{code:"E2",display:"Bumble Bee"},{code:"E3",display:"American Trailer"},{code:"E4",display:"Clenet"},{code:"E5",display:"Coyote"},{code:"E6",display:"E-Ton"},{code:"E7",display:"Excursion (RV)"},{code:"E8",display:"Everest (RV)"},{code:"E9",display:"Chateausport"},{code:"EA",display:"Eagle"},{code:"EAR",display:"Earthbound RV"},{code:"EB",display:"Electric Bicycle"},{code:"EBB",display:"Ebbtide"},{code:"EC",display:"Executive"},{code:"ECH",display:"ECHO (ATV/util trailer)"},{code:"ECO",display:"Eco"},{code:"ED",display:"Emerald (boat)"},{code:"EDG",display:"Edge"},{code:"EE",display:"Excell (cargo trailer)"},{code:"EEE",display:"Triple E"},{code:"EF",display:"Georgetown"},{code:"EG",display:"EV Global Motors"},{code:"EGO",display:"EGO"},{code:"EH",display:"Easy Hauler"},{code:"EI",display:"express (boat)"},{code:"EJ",display:"E-Z-Go (golf cart)"},{code:"EK",display:"Elkhorn"},{code:"EL",display:"Eldorado"},{code:"ELA",display:"Electra (RV)"},{code:"ELM",display:"ELectric Last Mile Solutions Inc."},{code:"ELS",display:"Elite Suite (travel trailer)"},{code:"EM",display:"Monon"},{code:"EM",display:"Ember RV"},{code:"EN",display:"Encounter (RV)"},{code:"ENC",display:"Encore RV"},{code:"ENT",display:"Entegra RV"},{code:"ENU",display:"Endura RV"},{code:"EO",display:"Aerostar (RV)"},{code:"EP",display:"Expedition"},{code:"EPC",display:"Epic"},{code:"EQ",display:"Elite Trailer"},{code:"EQS",display:"Equispirit"},{code:"ER",display:"Raven"},{code:"ES",display:"Establishment"},{code:"ESP",display:"Eurospeed"},{code:"ET",display:"Eagle Trailer"},{code:"ETW",display:"East to West"},{code:"EU",display:"Ultra Sport"},{code:"EV",display:"Evinrude"},{code:"EVG",display:"Evergreen RV"},{code:"EVL",display:"Evolution RV"},{code:"EW",display:"EV Warrior"},{code:"EX",display:"Excalibur"},{code:"EXP",display:"Explorer (motor home)"},{code:"EY",display:"Windsong"},{code:"EZ",display:"EZ Loader"},{code:"EZG",display:"EZ GO"},{code:"EZL",display:"Ezloader (trailer)"},{code:"EZZ",display:"Elipse"},{code:"F1",display:"Flair"},{code:"F2",display:"Fold Down"},{code:"F3",display:"Flagstaff"},{code:"F4",display:"Four Seasons"},{code:"F5",display:"Fishrite"},{code:"F6",display:"4-Star (trailer)"},{code:"F7",display:"Formula"},{code:"F8",display:"Fountain"},{code:"F9",display:"Fisher"},{code:"FA",display:"Falcon"},{code:"FB",display:"Fireball (RV)"},{code:"FBC",display:"Fibro Concept"},{code:"FC",display:"Ford Commerical"},{code:"FD",display:"Ford HD Truck"},{code:"FE",display:"Ferrari"},{code:"FED",display:"Federal"},{code:"FF",display:"Fruehauf Trailer"},{code:"FG",display:"Firan (RV)"},{code:"FH",display:"Featherlite (trailer)"},{code:"FI",display:"Fiat"},{code:"FIS",display:"Fisker"},{code:"FJ",display:"Fred Jones"},{code:"FK",display:"Fifth Avenue (RV)"},{code:"FL",display:"Fleetwood (RV)"},{code:"FLO",display:"Floe (trailer)"},{code:"FM",display:"Fiberform"},{code:"FN",display:"Fan"},{code:"FNL",display:"Finish Line"},{code:"FNM",display:"Funmover"},{code:"FO",display:"Ford"},{code:"FOP",display:"Ford of Puerto Rico"},{code:"FOR",display:"Forester (motor home)"},{code:"FOX",display:"Fox Mountain RV"},{code:"FP",display:"Ford Racing Technologies"},{code:"FQ",display:"Forest River (trailer)"},{code:"FR",display:"Freightliner"},{code:"FS",display:"Fiesta"},{code:"FT",display:"Ford Truck"},{code:"FU",display:"Frontier (RV)"},{code:"FUR",display:"Fusion"},{code:"FUS",display:"Fuso"},{code:"FUT",display:"Futura"},{code:"FV",display:"Forest River"},{code:"FW",display:"Ford Wind"},{code:"FX",display:"Four Winns"},{code:"FY",display:"Felling (trailer)"},{code:"FZ",display:"Foretravel (RV)"},{code:"G1",display:"Gindy Trailer"},{code:"G2",display:"Glastron"},{code:"G3",display:"Brown Trailer"},{code:"G4",display:"Bass Cat"},{code:"G5",display:"Generation"},{code:"G6",display:"Morgan Trailers"},{code:"G7",display:"Glacier Bay"},{code:"G8",display:"Global Electric Motorcars"},{code:"G9",display:"Capacity"},{code:"GA",display:"Great Dane Trailer"},{code:"GAR",display:"Garia"},{code:"GB",display:"Georgie Boy (RV)"},{code:"GC",display:"GMC"},{code:"GCH",display:"Grech RV"},{code:"GCI",display:"Greenkraft Inc."},{code:"GD",display:"GPD - East"},{code:"GE",display:"Geo"},{code:"GEC",display:"General Coach"},{code:"GEN",display:"Hyundai"},{code:"GES",display:"Genesis Supreme RV"},{code:"GF",display:"Glendale"},{code:"GG",display:"Cameo Carriage (RV)"},{code:"GH",display:"Macgregor (sailboat)"},{code:"GI",display:"Carriage (RV)"},{code:"GJ",display:"Stellar (travel trailer)"},{code:"GJN",display:"Grand Junction"},{code:"GK",display:"Gekko"},{code:"GL",display:"Gambler"},{code:"GN",display:"Generac"},{code:"GO",display:"Grumman"},{code:"GOR",display:"Gorilla"},{code:"GP",display:"GPD - West"},{code:"GQ",display:"Trailerman (trailer)"},{code:"GR",display:"Gravely"},{code:"GRD",display:"Grand Design RV"},{code:"GS",display:"Gulfstream"},{code:"GST",display:"Grandsport (motor home)"},{code:"GT",display:"Geo Truck"},{code:"GU",display:"Malaguti (motorcycle)"},{code:"GV",display:"Godfrey (boat)"},{code:"GW",display:"White GMC Truck"},{code:"GX",display:"Great West"},{code:"GY",display:"Gindy Trailer"},{code:"GZ",display:"Gazelle"},{code:"H1",display:"Hurricane"},{code:"H2",display:"Honey"},{code:"H3",display:"Heil Trailer"},{code:"H4",display:"Coach House (RV)"},{code:"H5",display:"Harney Coachworks"},{code:"H6",display:"Hawk"},{code:"H7",display:"Hydrocat"},{code:"H8",display:"Haulmark (RV)"},{code:"H9",display:"Holmes (trailer)"},{code:"HA",display:"Hi-Light"},{code:"HAT",display:"Honda ATV"},{code:"HAU",display:"Haulin Trailer"},{code:"HB",display:"Husaberg"},{code:"HBU",display:"Hitch Buddy (towing unit)"},{code:"HC",display:"Hornet"},{code:"HD",display:"Harley Davidson"},{code:"HDO",display:"Hideout"},{code:"HE",display:"Hummer"},{code:"HF",display:"Harney Co. Operations"},{code:"HG",display:"Heritage"},{code:"HH",display:"Hino"},{code:"HHT",display:"H&H Trailer"},{code:"HI",display:"Hilo"},{code:"HJ",display:"New Holland (tractor)"},{code:"HK",display:"Hitckhiker"},{code:"HL",display:"Honda"},{code:"HLR",display:"Haul Rite"},{code:"HM",display:"Honda Motorcycle"},{code:"HMD",display:"Homemade"},{code:"HMS",display:"Homestead"},{code:"HMV",display:"Honda Multipurpose Utility Vehicle"},{code:"HN",display:"Honda Motorcycle"},{code:"HO",display:"Honda"},{code:"HOL",display:"Holland Trailer"},{code:"HOS",display:"Hoosier"},{code:"HP",display:"Honda"},{code:"HQ",display:"Hy-Line (trailer)"},{code:"HR",display:"Holiday Rambler"},{code:"HRG",display:"Highland Ridge"},{code:"HS",display:"Hydra-Sport Boats"},{code:"HSN",display:"Hisun"},{code:"HT",display:"Honda Truck"},{code:"HTG",display:"Hartland Greystone"},{code:"HTI",display:"Hitachi"},{code:"HU",display:"Husqvarna"},{code:"HUL",display:"Hull"},{code:"HV",display:"Hummer (GM Vehicle)"},{code:"HW",display:"Hawker (airplane)"},{code:"HWN",display:"Huawin"},{code:"HX",display:"Hewes (boat)"},{code:"HY",display:"Hyundai"},{code:"HYM",display:"Hymer"},{code:"HYO",display:"Hyosung Motors"},{code:"HYP",display:"Hyundai of Puerto Rico (automobile)"},{code:"HZ",display:"Horizon"},{code:"I2",display:"Clark Industrial Truck"},{code:"I3",display:"Royal International (RV)"},{code:"I4",display:"Mida Motorhome (RV)"},{code:"I5",display:"Independence (motorcycle)"},{code:"I6",display:"Sportsmaster"},{code:"I7",display:"Extreme Mega Lite (RV)"},{code:"I8",display:"Legends"},{code:"I9",display:"Pilgrim Lite (RV)"},{code:"IA",display:"Itasca"},{code:"IB",display:"Big Dog"},{code:"IC",display:"Camper"},{code:"ICA",display:"ICAMP (trailer)"},{code:"ICN",display:"Icon"},{code:"ID",display:"Indian"},{code:"IE",display:"Interstate Trailer"},{code:"IF",display:"Itasca-C"},{code:"IG",display:"Itasca-Diesel"},{code:"IH",display:"American Iron Horse"},{code:"IJ",display:"Italjet USA"},{code:"IK",display:"Innsbruck (RV)"},{code:"IL",display:"International"},{code:"IM",display:"Impulse"},{code:"IMT",display:"Iron Mountain"},{code:"IN",display:"Infiniti"},{code:"INT",display:"InTech"},{code:"INV",display:"INV1"},{code:"IO",display:"Isata (motor home)"},{code:"IP",display:"International Powersports"},{code:"IQ",display:"Sceptor (RV)"},{code:"IR",display:"Invader"},{code:"IRH",display:"Iron Horse (boat)"},{code:"IS",display:"Isuzu"},{code:"ISP",display:"Imperial Supplies"},{code:"IT",display:"Isuzu Truck"},{code:"IU",display:"Skamper Ultra (RV)"},{code:"IV",display:"Iveco"},{code:"IW",display:"W-W (trailer)"},{code:"IX",display:"Maxlite (RV)"},{code:"IY",display:"Infinity (motor home)"},{code:"IZ",display:"Zepplin (RV)"},{code:"J1",display:"Johnson (boat)"},{code:"J2",display:"Charger"},{code:"J3",display:"Charmac"},{code:"J4",display:"Jazz (motor home)"},{code:"J5",display:"Jet Trailer"},{code:"J6",display:"Tiffin (RV)"},{code:"J7",display:"JV Manufacturing (trailer)"},{code:"J8",display:"Rebel (RV)"},{code:"J9",display:"Estate (RV)"},{code:"JA",display:"Jaguar"},{code:"JB",display:"Jamboree"},{code:"JC",display:"Jetcraft"},{code:"JCL",display:"JCL"},{code:"JD",display:"John Deere"},{code:"JE",display:"Jeep"},{code:"JF",display:"Forklift (Forklift, generic)"},{code:"JG",display:"Tail-Gator (RV)"},{code:"JH",display:"Jensen-HL"},{code:"JI",display:"J.I. Case"},{code:"JJ",display:"Attitude (RV)"},{code:"JK",display:"Timberlodge (RV)"},{code:"JL",display:"Javelin"},{code:"JM",display:"Jamee"},{code:"JN",display:"Tuscany (RV)"},{code:"JNP",display:"Johnnypag (motorcycle)"},{code:"JO",display:"Sandstorm (RV)"},{code:"JP",display:"Jag (scooter)"},{code:"JQ",display:"QianJiang (scooter)"},{code:"JR",display:"Jerrdan"},{code:"JRN",display:"Journey (motor home)"},{code:"JS",display:"S&S Campers"},{code:"JT",display:"Jeep Truck"},{code:"JU",display:"Trailrider (RV)"},{code:"JV",display:"JVS (ATV)"},{code:"JW",display:"Willy (Jeep Vehicle)"},{code:"JX",display:"Extreme RV (RV)"},{code:"JY",display:"Jayco"},{code:"K-Z",display:"K-Z (trailer)"},{code:"K1",display:"Kia"},{code:"K2",display:"Kidron Trailer"},{code:"K3",display:"Kountry Comfort"},{code:"K4",display:"KTM"},{code:"K5",display:"Kountry Star"},{code:"K6",display:"Kenner"},{code:"K7",display:"Key West"},{code:"K8",display:"Kasea (minibikes)"},{code:"K9",display:"TM"},{code:"KA",display:"Kawasaki"},{code:"KAK",display:"K&K (trailer)"},{code:"KAL",display:"Kalmar Ottawa"},{code:"KAR",display:"Karma"},{code:"KAY",display:"Kayo"},{code:"KB",display:"Kubota (tractor)"},{code:"KC",display:"Cato"},{code:"KD",display:"Kodiak"},{code:"KDK",display:"Kaddy Kruiser"},{code:"KDN",display:"Kendon"},{code:"KE",display:"Skeeter"},{code:"KEV",display:"Kia EV"},{code:"KEY",display:"Keystone Autoway"},{code:"KF",display:"Kiefer (trailer)"},{code:"KG",display:"Kar Products"},{code:"KH",display:"Kachina"},{code:"KI",display:"Kit"},{code:"KIM",display:"Kimble (trailer)"},{code:"KIO",display:"Kioti"},{code:"KJ",display:"Cajun"},{code:"KK",display:"Carrera Boots"},{code:"KL",display:"Kymco (motor scooter)"},{code:"KM",display:"Komfort"},{code:"KMS",display:"Komatsu"},{code:"KMW",display:"Kimball Midwest"},{code:"KN",display:"Kountry Aire"},{code:"KND",display:"Kandi"},{code:"KNP",display:"Knapheide"},{code:"KO",display:"Koremoto (motorcycle)"},{code:"KOE",display:"Koenigsegg"},{code:"KP",display:"Composite"},{code:"KQ",display:"KZ Inc. (RV)"},{code:"KR",display:"King of the Road"},{code:"KRI",display:"Kristi (trailer)"},{code:"KRY",display:"Krystal (motor home)"},{code:"KS",display:"Kwikee Step"},{code:"KT",display:"Karavan Trailers"},{code:"KU",display:"Kent Automotive (parts master)"},{code:"KV",display:"Knight (RV)"},{code:"KW",display:"Kenworth/Peterbilt"},{code:"KWK",display:"Kwik Load"},{code:"KX",display:"Cross Country (RV)"},{code:"KY",display:"Keystone"},{code:"KYN",display:"Keystone Northpark"},{code:"KYV",display:"Keystone Vantage"},{code:"KZ",display:"Kells (sailboat)"},{code:"L1",display:"Lake Raider (RV)"},{code:"L2",display:"Load Trailer"},{code:"L3",display:"Limited"},{code:"L4",display:"Lincoln Truck"},{code:"L5",display:"Laredo"},{code:"L6",display:"Landau (boat)"},{code:"L7",display:"Laforza"},{code:"L8",display:"Lexington (motor home)"},{code:"L9",display:"Leprechaun (RV)"},{code:"LA",display:"Lancia"},{code:"LB",display:"Lawn Boy"},{code:"LBT",display:"Lambretta"},{code:"LBX",display:"Link Belt Excavators"},{code:"LC",display:"Collins (RV)"},{code:"LD",display:"Lazy Days"},{code:"LE",display:"Lexus"},{code:"LF",display:"Laforze"},{code:"LG",display:"Cross Lander (Brazil car)"},{code:"LGC",display:"Logan Coach"},{code:"LH",display:"Shore Land'r"},{code:"LI",display:"Lincoln"},{code:"LIB",display:"Liberty Outdoors"},{code:"LID",display:"Lider"},{code:"LJ",display:"Loadrite (trailer)"},{code:"LK",display:"Lufkin"},{code:"LKA",display:"Lakota"},{code:"LL",display:"Lear (airplane)"},{code:"LM",display:"Lamborghini"},{code:"LN",display:"Lance"},{code:"LND",display:"Landini"},{code:"LNH",display:"Linhai"},{code:"LNM",display:"LandMark RV"},{code:"LO",display:"Lotus"},{code:"LP",display:"Lawson Products (factory master)"},{code:"LQ",display:"Qvale"},{code:"LR",display:"Land Rover"},{code:"LRV",display:"Lifestyle Luxury RV"},{code:"LS",display:"Larson"},{code:"LSF",display:"Leisure Freedom"},{code:"LST",display:"LS Tractor"},{code:"LT",display:"Leland Trailers"},{code:"LTG",display:"Little Guy"},{code:"LTR",display:"Little River"},{code:"LU",display:"Lund"},{code:"LUC",display:"LUCID"},{code:"LV",display:"Leisure Van"},{code:"LW",display:"Lowe"},{code:"LX",display:"Las Brisas"},{code:"LY",display:"Layton"},{code:"LZ",display:"Lifan (motorcycle scooter)"},{code:"M1",display:"Moutainaire"},{code:"M2",display:"Mastercraft"},{code:"M3",display:"Mirage"},{code:"M4",display:"Marmon"},{code:"M5",display:"Monterey"},{code:"M6",display:"Mako"},{code:"M7",display:"Montana"},{code:"M8",display:"Mercedes Light Truck"},{code:"M9",display:"Malibu"},{code:"MA",display:"Mazda"},{code:"MAC",display:"Maclander"},{code:"MAD",display:"Midwest Automotive Design"},{code:"MAF",display:"Massey Ferguson (tractor/truck)"},{code:"MAG",display:"MAG (truck & van)"},{code:"MAH",display:"Mahindra"},{code:"MAR",display:"Marada (boat)"},{code:"MAS",display:"MASEA (scooter)"},{code:"MAY",display:"May (trailer)"},{code:"MB",display:"Mercedes-Benz"},{code:"MBG",display:"Modbug"},{code:"MBI",display:"Mobi"},{code:"MBS",display:"MB Sport"},{code:"MC",display:"McCulloch"},{code:"MCI",display:"Motor Coach Industries"},{code:"MCL",display:"McLaren"},{code:"MCT",display:"Mac Trailer"},{code:"MD",display:"Magirus-Deutz"},{code:"ME",display:"Mercury Truck"},{code:"MET",display:"Metropolitan"},{code:"MF",display:"Marlette"},{code:"MFM",display:"Misfit Motorcycles"},{code:"MG",display:"MG"},{code:"MGC",display:"Magic"},{code:"MH",display:"Mitsubishi Truck"},{code:"MI",display:"Mitsubishi"},{code:"MIE",display:"Miles Electric (auto)"},{code:"MJ",display:"Mobile Travel"},{code:"MK",display:"Mack Truck"},{code:"MKE",display:"Moke"},{code:"ML",display:"Mcclane"},{code:"MM",display:"Maxim"},{code:"MMR",display:"Motor Morini"},{code:"MN",display:"Montego"},{code:"MNG",display:"Mengdeli"},{code:"MNR",display:"Mountaineer"},{code:"MNT",display:"Mintaro"},{code:"MO",display:"Monaco"},{code:"MOK",display:"Moke International"},{code:"MP",display:"Markson Products"},{code:"MPR",display:"Mazda of Puerto Rico (auto)"},{code:"MQ",display:"Max"},{code:"MR",display:"Mercury"},{code:"MRL",display:"Marlon"},{code:"MS",display:"Maserati"},{code:"MSR",display:"Marshell"},{code:"MSV",display:"Mercedes Benz Van"},{code:"MT",display:"Mercedes Truck"},{code:"MTF",display:"Motofino"},{code:"MU",display:"Merkur"},{code:"MUL",display:"Mullen"},{code:"MV",display:"Mountain View"},{code:"MV1",display:"MV1"},{code:"MVA",display:"Monte Vista"},{code:"MVP",display:"MVP RV"},{code:"MW",display:"Mariah"},{code:"MX",display:"Mallard"},{code:"MXT",display:"Maxey Trailer"},{code:"MY",display:"Midas"},{code:"MYE",display:"Myers Motors (electric scooter)"},{code:"MZ",display:"Mazda Truck"},{code:"N1",display:"Country Coach (RV)"},{code:"N2",display:"Northland"},{code:"N3",display:"New Vision"},{code:"N4",display:"Newell"},{code:"N5",display:"Northern Lite"},{code:"N6",display:"Nash (RV)"},{code:"N7",display:"Northstar"},{code:"N8",display:"Alpen Coach"},{code:"N9",display:"Nitro"},{code:"NA",display:"Navistar Intl MPV"},{code:"NB",display:"MB Cruiser (RV)"},{code:"NBL",display:"Noble"},{code:"NC",display:"Motorcycle Stuff"},{code:"NCR",display:"Nucamp RV"},{code:"NCV",display:"Nissan Commercial Vehicles"},{code:"NCY",display:"North Country"},{code:"ND",display:"Nissan Diesel"},{code:"NE",display:"Neptune (RV)"},{code:"NEX",display:"Nexus RV"},{code:"NF",display:"Nitrous (RV)"},{code:"NFL",display:"New Flyer"},{code:"NG",display:"Twist - N - Go (moped)"},{code:"NH",display:"Nissan Hawaii"},{code:"NHL",display:"Nitrous Hyperlite (RV)"},{code:"NI",display:"Nissan"},{code:"NJ",display:"NRG (trailer)"},{code:"NK",display:"CornPro (trailer)"},{code:"NL",display:"National"},{code:"NLV",display:"Next Level (travel trailer)"},{code:"NM",display:"Newmar"},{code:"NML",display:"Ness Motorcycles LLC"},{code:"NN",display:"Caribbean (RV)"},{code:"NO",display:"Nomad"},{code:"NP",display:"Sandpiper"},{code:"NQ",display:"Nissan"},{code:"NR",display:"Northwood"},{code:"NRT",display:"Nortek Boats"},{code:"NS",display:"Nissan Truck"},{code:"NT",display:"Navistar Intl Truck"},{code:"NTM",display:"Norton Motorcyles"},{code:"NTR",display:"North Trail (snowmobile trailer)"},{code:"NU",display:"Newmans (trailer)"},{code:"NV",display:"VR1 (RV)"},{code:"NVN",display:"Navion"},{code:"NW",display:"Nuwa"},{code:"NX",display:"Exiss (trailer)"},{code:"NY",display:"Nicky"},{code:"NZ",display:"WVZZI (motorcycle)"},{code:"O1",display:"Contender (boat)"},{code:"O2",display:"SOA (RV)"},{code:"O3",display:"Clipper (RV)"},{code:"O4",display:"Motorrad (motorcycle)"},{code:"O5",display:"PGO (moped)"},{code:"O6",display:"Host (camper)"},{code:"O7",display:"Land Roamer (RV)"},{code:"O8",display:"Motocross (motorcycle)"},{code:"O9",display:"Aliner (RV)"},{code:"OA",display:"Catalina SOA (RV)"},{code:"OAS",display:"Oasis"},{code:"OB",display:"Brougham"},{code:"OC",display:"Columbus Motor Home"},{code:"OD",display:"Odyssey"},{code:"ODE",display:"Odes"},{code:"OE",display:"Eclipse Trailer (RV)"},{code:"OF",display:"Cypress (RV)"},{code:"OG",display:"Goshen (Truck Chassis)"},{code:"OH",display:"Honda Watercraft (watercraft)"},{code:"OI",display:"Optima (trailer)"},{code:"OK",display:"Hyundai Tire"},{code:"OL",display:"Oldsmobile"},{code:"OLK",display:"Outlook (motor home)"},{code:"OLW",display:"Outlaw (RV)"},{code:"OM",display:"Outboard Marine Corporation"},{code:"OME",display:"Omega"},{code:"ON",display:"Onan"},{code:"OP",display:"Opel"},{code:"OPE",display:"Open Range (RV)"},{code:"OPR",display:"Outpost (RV)"},{code:"OQ",display:"Lem USA (dirt bike)"},{code:"OR",display:"Open Road"},{code:"ORV",display:"Outdoor RV"},{code:"OS",display:"Oshkosh Truck"},{code:"OT",display:"Oldsmobile Truck"},{code:"OU",display:"Outback (RV)"},{code:"OUT",display:"Outcast (trailer)"},{code:"OV",display:"Lapalma Diesel (RV)"},{code:"OW",display:"Owens"},{code:"OX",display:"MotoX (motorcycle manuf.)"},{code:"OY",display:"Bad Boy (ATV)"},{code:"OZ",display:"Doolittle (trailer)"},{code:"P1",display:"Park Model"},{code:"P2",display:"Pinnacle"},{code:"P3",display:"Phantom"},{code:"P4",display:"Polini (motorcycle)"},{code:"P5",display:"Pioneeer (RV)"},{code:"P6",display:"American Performance Cycle (motorcycle)"},{code:"P7",display:"Procraft Bass Boat"},{code:"P8",display:"Playcraft (boat)"},{code:"P9",display:"Panzer (motorcycle)"},{code:"PA",display:"Pace Arrow"},{code:"PAC",display:"Pacifica (RV)"},{code:"PAG",display:"Pagani"},{code:"PAL",display:"Palomino"},{code:"PB",display:"Peterbilt"},{code:"PC",display:"Pace American"},{code:"PCE",display:"Peace"},{code:"PCT",display:"Princecraft"},{code:"PCW",display:"Pacific Coachworks"},{code:"PD",display:"Progressive Dynamic"},{code:"PDM",display:"Paradigm"},{code:"PE",display:"Peugeot"},{code:"PEV",display:"Pure EV"},{code:"PF",display:"Peak"},{code:"PFS",display:"Profusion"},{code:"PG",display:"Pug"},{code:"PH",display:"Phasar"},{code:"PHG",display:"Power House Genset"},{code:"PI",display:"Pininfarina"},{code:"PIT",display:"Pitster Pro"},{code:"PJ",display:"Pilgrim"},{code:"PJT",display:"PJ Trailers"},{code:"PK",display:"Pontiac Truck"},{code:"PKD",display:"Packard (automobile)"},{code:"PL",display:"Plymouth"},{code:"PLT",display:"Platinum Trailers"},{code:"PM",display:"Palamino"},{code:"PN",display:"Pontiac"},{code:"PNT",display:"Pontoon (boat)"},{code:"PNV",display:"Pronovost"},{code:"PO",display:"Porsche"},{code:"POG",display:"Polaris (GEM)"},{code:"POL",display:"Polestar"},{code:"POS",display:"Polaris (Snowmobile)"},{code:"PP",display:"Patriot Racing (monster trucks)"},{code:"PQ",display:"Parker (car)"},{code:"PR",display:"Prowler"},{code:"PRC",display:"Pierce Manufacturing (truck)"},{code:"PRE",display:"Prevost (motor home)"},{code:"PRL",display:"Presidential (travel trailer)"},{code:"PRQ",display:"PowerQuest"},{code:"PS",display:"Polaris"},{code:"PSI",display:"Peterson Industries"},{code:"PSP",display:"Passport (RV)"},{code:"PT",display:"Plymouth Truck"},{code:"PTM",display:"Primetime RV"},{code:"PU",display:"Pursuit"},{code:"PV",display:"Pace Vision"},{code:"PW",display:"Pleasure Way"},{code:"PWR",display:"Powerline (hauling trailer)"},{code:"PX",display:"Phoenix (RV)"},{code:"PXU",display:"Phoenix USA RV"},{code:"PY",display:"Piaggio (scooter)"},{code:"PZ",display:"Panoz"},{code:"QIY",display:"QIYE"},{code:"QLK",display:"Qlink Motor"},{code:"QS",display:"Quicksilver"},{code:"R1",display:"Radco"},{code:"R2",display:"Stingray"},{code:"R3",display:"Rollsair"},{code:"R4",display:"Coast RV"},{code:"R5",display:"Sunrader"},{code:"R6",display:"RC Willet (RV)"},{code:"R7",display:"Renegade"},{code:"R8",display:"Regal"},{code:"R9",display:"Rinker"},{code:"RA",display:"Rallye"},{code:"RAM",display:"RAM"},{code:"RB",display:"Caribou"},{code:"RC",display:"RR Custom Coach Works"},{code:"RCT",display:"Raycraft"},{code:"RD",display:"Red Max"},{code:"RDC",display:"Road Clipper (trailer)"},{code:"RDV",display:"Ridge View"},{code:"RDW",display:"Redwood"},{code:"RE",display:"Renault"},{code:"REI",display:"Reinell"},{code:"REL",display:"Redline (trailer)"},{code:"REM",display:"Remeq"},{code:"REV",display:"REV Renegade LLC"},{code:"RF",display:"Refuge"},{code:"RG",display:"Ranger"},{code:"RGY",display:"Regency"},{code:"RH",display:"Robinhood"},{code:"RI",display:"Rialta"},{code:"RIV",display:"Rivian"},{code:"RJ",display:"R-Vision"},{code:"RK",display:"Road King"},{code:"RL",display:"Read Screen-All"},{code:"RM",display:"Richmond Boats"},{code:"RN",display:"Residency"},{code:"RNT",display:"Ruff and Tuff (electric vehicle)"},{code:"RO",display:"Ranger Rover"},{code:"ROD",display:"Roadster"},{code:"ROK",display:"ROKETA (motorcycle)"},{code:"RP",display:"Revolution (RV)"},{code:"RPD",display:"R POD"},{code:"RQ",display:"Riata"},{code:"RR",display:"Rolls Royce"},{code:"RS",display:"Storm"},{code:"RSD",display:"Residence"},{code:"RSN",display:"Rossion"},{code:"RT",display:"Roadtrek"},{code:"RTR",display:"Retreat"},{code:"RTT",display:"Riverside"},{code:"RU",display:"Spectrum"},{code:"RUE",display:"Ruesch"},{code:"RV",display:"Recreational Vehicle"},{code:"RW",display:"Rockwood"},{code:"RX",display:"Rexhall"},{code:"RY",display:"Rexair RXA"},{code:"RZ",display:"Rendezvous"},{code:"RZR",display:"Razor (RV)"},{code:"S0",display:"Snow Brothers"},{code:"S1",display:"Suncrest"},{code:"S2",display:"S2 Yachts"},{code:"S3",display:"Salem"},{code:"S4",display:"Sierra"},{code:"S5",display:"Starcraft"},{code:"S6",display:"Seven Seas"},{code:"S7",display:"Shur Flo"},{code:"S8",display:"Sealand"},{code:"S9",display:"Sunchaser"},{code:"SA",display:"Saab"},{code:"SAN",display:"Sanger"},{code:"SAV",display:"Savoy (travel trailer)"},{code:"SB",display:"Sebring"},{code:"SC",display:"Sportscoach"},{code:"SCE",display:"Sceptor (RV)"},{code:"SCH",display:"Schwinn (scooter)"},{code:"SD",display:"Seabreeze"},{code:"SDN",display:"Sundance (RV)"},{code:"SE",display:"Sea-Doo"},{code:"SEA",display:"Seavee"},{code:"SEB",display:"Sea Boss (boat)"},{code:"SEF",display:"Sea Fox"},{code:"SEP",display:"Sea Pro"},{code:"SES",display:"Seaswirl (boat)"},{code:"SF",display:"Safari"},{code:"SG",display:"Silver Eagle"},{code:"SH",display:"Stihl"},{code:"SHL",display:"Show Hauler (RV)"},{code:"SI",display:"Simplicity"},{code:"SJ",display:"Sea Ray"},{code:"SJS",display:"Shejang Jmstar Shenke"},{code:"SK",display:"Ski-Doo"},{code:"SKE",display:"Skeuter (electric scooter)"},{code:"SL",display:"Sterling"},{code:"SLA",display:"Solera"},{code:"SLD",display:"Shorelander (trailer)"},{code:"SLK",display:"Sleek"},{code:"SM",display:"Suzuki"},{code:"SMC",display:"SmartCar (electric veh)"},{code:"SN",display:"Snapper"},{code:"SNU",display:"Saturn US"},{code:"SNV",display:"Sun Valley"},{code:"SO",display:"Sportsmen"},{code:"SP",display:"Suzuki MPV"},{code:"SPC",display:"Sport Chassis"},{code:"SPF",display:"Superperformance"},{code:"SPK",display:"SPYKER (sports car)"},{code:"SQ",display:"Sea Nymph"},{code:"SR",display:"Saturn"},{code:"SRS",display:"Sunray Smokey RV"},{code:"SRV",display:"Snowriver"},{code:"SS",display:"Shasta"},{code:"SSA",display:"Suckerpunch Sallys (motorcycle)"},{code:"SSR",display:"Sightseer (motor home)"},{code:"SST",display:"Slingshot"},{code:"ST",display:"Suzuki Truck"},{code:"STO",display:"Storyteller Overland"},{code:"STP",display:"Sampede (motorcycle)"},{code:"SU",display:"Subaru"},{code:"SV",display:"Sunline"},{code:"SVD",display:"Silverado"},{code:"SVL",display:"Sliver Lite (RV trailer)"},{code:"SW",display:"Southwind"},{code:"SX",display:"Starfire"},{code:"SY",display:"Skyline"},{code:"SYM",display:"SYM"},{code:"SYO",display:"Sanyo"},{code:"SZ",display:"Suzuki Motorcycle"},{code:"SZP",display:"Suzuki of Puerto Rico"},{code:"SZZ",display:"Shadow Trailer"},{code:"T1",display:"Trailmobile Trailer"},{code:"T2",display:"Trans2"},{code:"T3",display:"Tie Down"},{code:"T4",display:"Tour Master"},{code:"T5",display:"Sylvan"},{code:"T6",display:"Travel Supreme"},{code:"T7",display:"Travel Express"},{code:"T8",display:"Trade Winds"},{code:"T9",display:"Tango Boats"},{code:"TA",display:"Tiara"},{code:"TAB",display:"Tab (RV)"},{code:"TAI",display:"Taiwan (motorcycle)"},{code:"TAT",display:"Tamarack Trail"},{code:"TB",display:"Toro"},{code:"TC",display:"Travelcraft"},{code:"TD",display:"Tracker Evinrude"},{code:"TDC",display:"Tidecraft"},{code:"TE",display:"Teton"},{code:"TES",display:"Tesla"},{code:"TF",display:"Travelaire"},{code:"TFM",display:"Three Feathers Manufacturing"},{code:"TG",display:"Tioga"},{code:"TGB",display:"Taiwan Golden Bee (motorcycle)"},{code:"TH",display:"Theurer Trailer"},{code:"THR",display:"Thor Motor Coach"},{code:"TI",display:"Thor Industry"},{code:"TIG",display:"TIGE (boat)"},{code:"TIR",display:"Timber Ridge"},{code:"TJ",display:"Trail-Lite (RV)"},{code:"TJN",display:"Trojan (boat)"},{code:"TJP",display:"TJ Powersports"},{code:"TK",display:"Cadillac Truck"},{code:"TK3",display:"Take 3"},{code:"TL",display:"Tropi-Cal"},{code:"TM",display:"Travel Master"},{code:"TMC",display:"Tomcar"},{code:"TMG",display:"TMG Group"},{code:"TMS",display:"Thomas"},{code:"TMT",display:"Trailmaster (trailer)"},{code:"TN",display:"Tracker Marine"},{code:"TNG",display:"TNG"},{code:"TNK",display:"Tank (motorcycle)"},{code:"TO",display:"Toyota"},{code:"TOM",display:"Tomberlin (motor home)"},{code:"TOU",display:"Tour (motor home)"},{code:"TP",display:"Tropica"},{code:"TPT",display:"TransSport (trailer)"},{code:"TQ",display:"Tahoe Lite (GM Vehicle)"},{code:"TR",display:"Triumph"},{code:"TRA",display:"Trailer"},{code:"TRW",display:"Trail West"},{code:"TRX",display:"T-REX"},{code:"TS",display:"Tigershark"},{code:"TT",display:"Toyota Truck"},{code:"TTD",display:"Tennessee Tandem (trailer)"},{code:"TU",display:"Tradewinds"},{code:"TUN",display:"Tundra (RV)"},{code:"TV",display:"Transvan"},{code:"TW",display:"Towlt"},{code:"TX",display:"Texson"},{code:"TY",display:"Terry"},{code:"TZ",display:"Titan"},{code:"TZI",display:"Tiziani"},{code:"U1",display:"USA Motorhome"},{code:"U2",display:"Ural"},{code:"U3",display:"Ultrastar"},{code:"U4",display:"Caroline Skiff (RV)"},{code:"U5",display:"Sugar Sands"},{code:"U6",display:"Cub Cadet"},{code:"U7",display:"American Cruiser (RV)"},{code:"U8",display:"Alumaweld"},{code:"U9",display:"Toyota Marine (boat)"},{code:"UA",display:"UD"},{code:"UB",display:"Club Car (by Ingersoll Rand)"},{code:"UC",display:"Sunstar (boat)"},{code:"UD",display:"Universal Datsun"},{code:"UE",display:"Elite Motor Homes (RV)"},{code:"UF",display:"Wildcat (RV)"},{code:"UG",display:"Universal Manufacturing"},{code:"UH",display:"Heartland (Fifth Wheel)"},{code:"UI",display:"Cirrus (travel trailer)"},{code:"UJ",display:"Baxley (travel trailer)"},{code:"UK",display:"Tuckrucky"},{code:"UL",display:"Ultra"},{code:"UM",display:"Utility Master"},{code:"UN",display:"Sunrise"},{code:"UNI",display:"United Trailer"},{code:"UNM",display:"United Motors"},{code:"UO",display:"US Cargo (trailer)"},{code:"UP",display:"Parts Unlimited"},{code:"UQ",display:"Valencia (RV)"},{code:"UR",display:"Surveyor"},{code:"US",display:"Sunstream"},{code:"UT",display:"UMC Truck"},{code:"UU",display:"Sunrunner"},{code:"UV",display:"Suntracker"},{code:"UW",display:"Sunvoyager"},{code:"UX",display:"Sidekicks"},{code:"UY",display:"Sooner"},{code:"UZ",display:"Suite"},{code:"V1",display:"Caravell"},{code:"V2",display:"Sunsport (RV)"},{code:"V3",display:"Correctcraft (ski boat)"},{code:"V4",display:"Sutphen (racing boat)"},{code:"V5",display:"Bimota (motorcycle)"},{code:"V6",display:"Apache"},{code:"V7",display:"Alaskan (RV)"},{code:"V8",display:"Carrilite (RV)"},{code:"V9",display:"Ram-Lin"},{code:"VA",display:"Savanna"},{code:"VAL",display:"Valley (trailer)"},{code:"VB",display:"Vagabond"},{code:"VC",display:"Cushman"},{code:"VD",display:"Bounder Diesel"},{code:"VDH",display:"Vanderhall"},{code:"VE",display:"Vectra"},{code:"VEC",display:"Vectrix (electric vehicle)"},{code:"VEN",display:"Venture (boat)"},{code:"VF",display:"Golden Falcon"},{code:"VFS",display:"Vinfast"},{code:"VG",display:"Avenger"},{code:"VH",display:"Austin Healey"},{code:"VHP",display:"Vehicle Production Group (VPG)"},{code:"VI",display:"Vision"},{code:"VIE",display:"View (motor home)"},{code:"VIV",display:"Viva (motorcycle)"},{code:"VJ",display:"Arrow Voyager"},{code:"VK",display:"Viking"},{code:"VL",display:"Verilight"},{code:"VM",display:"Victory"},{code:"VN",display:"Spartan"},{code:"VNG",display:"Vanguard (trailer)"},{code:"VO",display:"Volvo"},{code:"VP",display:"Viper"},{code:"VPG",display:"VHPG"},{code:"VQ",display:"Coral (boat)"},{code:"VR",display:"Roseair"},{code:"VRV",display:"Vanleigh RV"},{code:"VS",display:"Seaview"},{code:"VT",display:"Volvo Truck"},{code:"VTG",display:"Vantage"},{code:"VTM",display:"Vista (motor home)"},{code:"VU",display:"Seacraft"},{code:"VV",display:"VIP (boats)"},{code:"VW",display:"Volkswagen"},{code:"VX",display:"Vespa (scooter)"},{code:"VY",display:"Voyager"},{code:"VYE",display:"Voyage (motor home)"},{code:"VZ",display:"Vogue"},{code:"W1",display:"Western Star Trucks"},{code:"W2",display:"Washbash Trailer"},{code:"W3",display:"Cascade"},{code:"W4",display:"California Motorcycle"},{code:"W5",display:"Western Recreational (RV)"},{code:"W6",display:"Weekender"},{code:"W7",display:"Windsport (RV)"},{code:"W8",display:"American White Water"},{code:"W9",display:"Weekend Warrior"},{code:"WA",display:"Wrangler"},{code:"WAA",display:"Wuxi Angell Autocycle"},{code:"WB",display:"Wet Bikes"},{code:"WC",display:"Wells Cargo"},{code:"WCC",display:"West Coast Choppers"},{code:"WD",display:"Wildwood"},{code:"WE",display:"Westport"},{code:"WF",display:"Star Flyte (RV)"},{code:"WFP",display:"Wolf Pack"},{code:"WG",display:"Wurth West (factory master)"},{code:"WGN",display:"Wagoneer"},{code:"WH",display:"White"},{code:"WHE",display:"Wheego"},{code:"WI",display:"Winnebago"},{code:"WIL",display:"Wildfire (scooter)"},{code:"WIN",display:"Winnebago of Indiana, LLC"},{code:"WIR",display:"Wind River"},{code:"WJ",display:"Wet Jets"},{code:"WK",display:"Crow (boat)"},{code:"WL",display:"Wellcraft"},{code:"WM",display:"Wanderer Trail"},{code:"WN",display:"Wilderness"},{code:"WNC",display:"Winner's Circle"},{code:"WO",display:"Walker (trailer)"},{code:"WP",display:"Honda Power Equipment"},{code:"WQ",display:"Timber Wolf (trailer)"},{code:"WR",display:"Windjammer"},{code:"WS",display:"Western Star"},{code:"WSF",display:"Westfalia"},{code:"WSP",display:"Western Snow Plows"},{code:"WT",display:"Volkswagen Truck"},{code:"WU",display:"Winzer"},{code:"WV",display:"Worldwide Volkswagen"},{code:"WW",display:"Blue Water"},{code:"WWR",display:"Warrior"},{code:"WX",display:"Watercraft"},{code:"WY",display:"Kings Highway (RV)"},{code:"WZ",display:"Whizzer"},{code:"XA",display:"Acura Service Center"},{code:"XG",display:"Genesis/Hyundai"},{code:"XH",display:"Honda Service Senter"},{code:"XI",display:"Ineos"},{code:"XLR",display:"XLR"},{code:"XWF",display:"X Wolf"},{code:"Y1",display:"Arctic Cat (Snowmobile)"},{code:"Y2",display:"American Clipper"},{code:"Y3",display:"Stoughton"},{code:"Y4",display:"Stoughton Trailer"},{code:"Y5",display:"Utility Trailer"},{code:"Y6",display:"Summerwind"},{code:"Y7",display:"Snugtop"},{code:"Y8",display:"Cigarette"},{code:"Y9",display:"Triton"},{code:"YA",display:"Yamaha"},{code:"YB",display:"Skamper"},{code:"YC",display:"Scenic Cruiser"},{code:"YD",display:"Shadow Cruiser"},{code:"YE",display:"Studebaker"},{code:"YF",display:"Sportscraft"},{code:"YG",display:"Bombardier"},{code:"YH",display:"Sea Hunt"},{code:"YI",display:"Timpte"},{code:"YJ",display:"Mobile Scout (RV)"},{code:"YK",display:"Workhorse"},{code:"YL",display:"Yacht Club Trailer"},{code:"YM",display:"Commander (boat)"},{code:"YN",display:"Aquatron"},{code:"YO",display:"Aero"},{code:"YP",display:"Banda (scooter)"},{code:"YQ",display:"Tab (trailer)"},{code:"YR",display:"Robin"},{code:"YS",display:"Yellowstone"},{code:"YT",display:"Tracker"},{code:"YU",display:"Yugo"},{code:"YV",display:"Twin Vee"},{code:"YW",display:"World Cat"},{code:"YX",display:"Mountain High Coachworks"},{code:"YY",display:"SS"},{code:"YZ",display:"Transcraft"},{code:"Z1",display:"Craig Catamaran"},{code:"Z2",display:"Sportsmobile"},{code:"Z3",display:"Crown Line"},{code:"Z4",display:"Ski Centurion"},{code:"Z5",display:"Aro (Automobile)"},{code:"Z6",display:"Alpha Gold (5th wheel trailer)"},{code:"Z7",display:"Cobalt"},{code:"Z8",display:"Supra"},{code:"Z9",display:"Skamper Lite (trailer)"},{code:"ZA",display:"Stealth"},{code:"ZAA",display:"DeSoto"},{code:"ZAP",display:"Zap (electric scooter)"},{code:"ZB",display:"Mercury"},{code:"ZC",display:"Smoker Craft"},{code:"ZD",display:"Springdale"},{code:"ZE",display:"Alpine Coach"},{code:"ZEN",display:"ZENN (cars)"},{code:"ZF",display:"Monark"},{code:"ZG",display:"Harriskayot"},{code:"ZGR",display:"Zinger"},{code:"ZH",display:"Seahwak"},{code:"ZI",display:"Zimmer"},{code:"ZJ",display:"Cedar Creek"},{code:"ZK",display:"Kenworth"},{code:"ZL",display:"Marlin (motor home)"},{code:"ZM",display:"Zieman (trailer)"},{code:"ZN",display:"Sprinter"},{code:"ZNG",display:"Zingo (motorcycle)"},{code:"ZNS",display:"Zongshen"},{code:"ZO",display:"Tahoe (GM Vehicle)"},{code:"ZOM",display:"Zoom"},{code:"ZP",display:"Campion"},{code:"ZQ",display:"Aztec"},{code:"ZR",display:"Cardinal"},{code:"ZRO",display:"Zero Motorcyles"},{code:"ZS",display:"Steiner"},{code:"ZT",display:"Concourse"},{code:"ZU",display:"Ski Supreme"},{code:"ZV",display:"Miscellaneous"},{code:"ZW",display:"Miscellaneous W"},{code:"ZX",display:"Miscellaneous X"},{code:"ZY",display:"Miscellaneous Y"},{code:"ZZ",display:"Other Make"},{code:"ZZA",display:"Autumn Ridge"},{code:"ZZL",display:"DRV Luxury Suites"},{code:"ZZS",display:"Shockwave Toy Hauler"},{code:"ZZV",display:"VIA"},{code:"ZZX",display:"Four Winds"},{code:"ZZY",display:"TOPO"},{code:"ZZZ",display:"Alpine"}],te=(e="")=>String(e).toLowerCase().replace(/[^a-z0-9]+/g," ").trim(),de=e=>{if(!e)return null;const o=te(e);return o.includes("truck")?"truck":o.includes("van")?"van":o.includes("rv")||o.includes("motor home")||o.includes("motorhome")||o.includes("coach")?"rv":o.includes("trailer")||o.includes("5th wheel")||o.includes("fifth wheel")?"trailer":o.includes("scooter")?"scooter":o.includes("motorcycle")||o.includes("bike")?"motorcycle":o.includes("atv")?"atv":o.includes("snowmobile")?"snowmobile":o.includes("boat")||o.includes("watercraft")?"boat":o},re=ae.map(e=>{const{base:o,typeHint:a}=(e=>{const o=e.match(/^(.+?)\s*\((.+)\)\s*$/);return o?{base:te(o[1]),typeHint:o[2]}:{base:te(e),typeHint:null}})(e.display);return{...e,_base:o,_normType:de(a)}}),ie=new Map;for(const e of re){const o=ie.get(e._base)||[];o.push(e),ie.set(e._base,o)}const se=e=>{const o=te(e);if(!o)return null;const a=ie.get(o);if(a&&a.length)return(e=>{if(!e||!e.length)return null;let o=e.find(e=>!e._normType);return o||(o=e.find(e=>"rv"===e._normType),o||e[0])})(a);let t=null;for(const e of re){const a=e._base;if(a===o)return e;(a.startsWith(o)||o.startsWith(a))&&(!t||a.length{if(!e)return null;const a=te(e),t=te(o),d=o?((e,o)=>{const a=te(e),t=te(o);return a&&t&&le.find(e=>{const o=[e.make,...e.makeAlt||[]].filter(Boolean).some(e=>te(e)===a),d=te(e.type)===t;return o&&d})||null})(e,o):null;if(d){const e=ce(d.code);if(e)return e}if(t){const e=le.find(e=>te(e.make)===a&&te(e.type)===t);if(e)return ce(e.code)}if(t){const a=se(`${e} ${o}`);if(a)return a;const t=se(`${o} ${e}`);if(t)return t}return se(e)},ce=e=>{if(!e)return null;const o=e.toUpperCase();return re.find(e=>e.code===o)||null};exports.ENTRIES=re,exports.RAW_ENTRIES=ae,exports.RRClient=class{constructor(e){if(!e?.baseUrl)throw new Error("RRClient requires baseUrl");if(!e?.username)throw new Error("RRClient requires username");if(!e?.password)throw new Error("RRClient requires password");this.cfg={wssePasswordType:"Text",timeoutMs:3e4,logger:j,retries:{max:3},...e},this.mask={password:!0}}async _send(e){const{starXml:o,routing:d,envelope:s,postParse:l}=e,m=this.cfg.logger||j,{bodId:T,creationDateTime:C,sender:R}=function(e){return{bodId:e?.bodId||B.v4(),creationDateTime:e?.creationDateTime||new Date,sender:e?.sender||{}}}(s),g=function({username:e,password:o,wssePasswordType:d="Text",starContentXml:r,normalize:i=!0,normalizeOptions:s}={}){const l=function(e){return`\n \n \n \n${a(e,10)}\n \n \n \n `.trim()}(r),n=`\n \n \n${a(function(e,o,a){const d="Digest"===a?' Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"':' Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"';return`\n \n \n ${t(e)}\n ${t(o)}\n \n \n `.trim()}(e,o,d),8)}\n \n \n${a(l,8)}\n \n \n `.trim();return i?function(e,{prettyPrint:o=!0}={}){if(!e||"string"!=typeof e)return e;try{return G.create(e).end({prettyPrint:o,width:0,indent:" ",newline:"\n"}).trim()}catch(o){return String(e).trim()}}(n,s):n}({username:this.cfg.username,password:this.cfg.password,wssePasswordType:this.cfg.wssePasswordType||"Text",routing:d,sender:R,creationDateTime:(b=C,"string"==typeof b?b:(b instanceof Date?b:new Date).toISOString().replace(/\.\d{3}Z$/,"Z")),bodId:T,starContentXml:o}),N=L(g);var b;"1"===process.env.RR_DUMP_ENVELOPE&&console.log(`[rr] Soap envelope about to send (${e?.elementName}): \n`+N+"\n");const S=async()=>{const o=await async function({baseUrl:e,envelopeXml:o,timeoutMs:a=3e4,logger:t}){try{const t=await K.default.post(e,o,{timeout:a,headers:{"Content-Type":"text/xml; charset=utf-8",SOAPAction:"http://www.starstandards.org/webservices/2005/10/transport/ProcessMessage"},responseType:"text",validateStatus:()=>!0});if(t.status>=200&&t.status<300)return String(t.data??"");throw new Z(`HTTP ${t.status}: ${function(e){const o=String(e??"");return o.length>1024?o.slice(0,1024)+"…":o}(t.data)}`,{status:t.status,body:t.data})}catch(e){if(K.default.isAxiosError(e))throw new Z(`Network error: ${e.message}`,{cause:e});throw e}}({baseUrl:this.cfg.baseUrl,envelopeXml:g,timeoutMs:this.cfg.timeoutMs,logger:m}),a=function(e){const o=Q.parse(e),a=o?.Envelope||o?.["soapenv:Envelope"]||o,t=a?.Body||a?.["soapenv:Body"]||a?.["S:Body"]||a?.["soap:Body"],d=t?.ProcessMessageResponse||t?.["ns2:ProcessMessageResponse"]||t?.["trans:ProcessMessageResponse"]||t,r=d?.payload||d?.["ns2:payload"]||d;return r?.content||r?.["ns2:content"]||r}(o),t=L(o),d=function(e){const o=p(e),a=r(e,e=>/RoRecordStatus$/i.test(e)).flatMap(i)[0];return{transaction:y(o),roRecord:u(a)}}(a),s=function(e){const o=String("ApplicationArea").toLowerCase(),a=[e];for(;a.length;){const e=a.pop();if(e&&"object"==typeof e)for(const[t,d]of Object.entries(e)){if(t.toLowerCase().endsWith(o))return d;d&&"object"==typeof d&&a.push(d)}}}(a),{status:T,norm:C}=function(e){const o=p(e)||r(e,e=>/Status$/i.test(e)).flatMap(i)[0]||{},a=(n(o,"Status")||o.Status||"").toString().trim();let t=(n(o,"StatusCode")||o.StatusCode||"").toString().trim();const d=o.Message&&c(o.Message)||c(o)||"";!t&&/success/i.test(a)&&(t="0");const s=Number(t);let l="FAIL";return/success/i.test(a)||0===s?l="SUCCESS":2!==s&&213!==s||(l="NO_MATCH"),{status:{Status:a,StatusCode:t,Message:d},norm:{kind:l,code:Number.isFinite(s)?s:void 0,message:d}}}(a);if("1"===process.env.RR_DUMP_STATUS&&(console.log("[rr] Status blocks:"),console.dir(d,{depth:null,colors:!0})),"1"===process.env.RR_DUMP_APPLICATION&&(console.log("[rr] ApplicationArea:"),console.dir(s,{depth:null,colors:!0})),"FAIL"===C.kind){const e=T?.StatusCode;throw new Y(`Vendor status failure: ${e??""} ${T?.Message||T?.["#text"]||""}`.trim(),{status:T,reqXml:N,requestXml:N,resXml:t})}const R={success:"SUCCESS"===C.kind||"NO_MATCH"===C.kind,statusBlocks:d,applicationArea:s,xml:{request:N,response:t},parsed:a};if("function"==typeof l)try{R.data=l(a)}catch(e){m?.warn?.(`postParse failed: ${e?.message||e}`)}return"1"===process.env.RR_DUMP_XML&&console.log(`[rr] Full response XML (${e?.elementName}):\n`+t+"\n"),R?.data&&"1"===process.env.RR_DUMP_DATA&&(console.log(`[rr] Parsed response data (${e?.elementName}):\n`),console.dir(R.data,{depth:null,colors:!0})),R};try{return await async function(e,{max:o=3,logger:a}){let t,d=0;for(;d=o)break;const i=D(V(400,d));a?.warn?.(`Retrying attempt ${d}/${o} in ${i}ms: ${e.message}`),await w(i)}throw t}(S,{max:this.cfg.retries?.max??3,logger:m})}catch(e){if(e instanceof Z||e instanceof Y)throw e;throw new Z(`Unexpected error: ${e?.message||e}`,{cause:e})}}async combinedSearch(e,a){return this._send(function(e={},a={}){if(!e||"object"!=typeof e)throw new J("combinedSearch requires a query object");const t=function(e){if(!e)return"";const o=String(e).trim().toLowerCase();return"telephone"===o?"phone":"lic"===o||"plate"===o?"license":"vin"===o||"partvin"===o?"vin":"name"===o?"name":"namerecid"===o||"custid"===o?"nameRecId":"stkno"===o||"stock"===o?"stkNo":o}(e.kind),d={MaxRecs:Math.min(Number(e.maxResults||e.maxRecs||50),50)};if("phone"===t){const o=T(e.phone,"phone");if(!o)throw new J("combinedSearch phone value missing");d.Phone=o}else if("license"===t){const o=T(e.license,"license");if(!o)throw new J("combinedSearch license value missing");d.LicenseNum=o}else if("vin"===t){const o=T(e.vin,"vin");if(!o)throw new J("combinedSearch vin value missing");d.PartVIN=o}else if("name"===t){const o=e.name;if("string"==typeof o){const e=o.trim();if(!e)throw new J("combinedSearch name string is empty");d.LName=e}else{if(!o||"object"!=typeof o)throw new J("combinedSearch name requires { fname/lname/mname } object or a last-name string");{const e=C(o.fname),a=C(o.mname),t=C(o.lname),r=!e&&!a&&!t&&C(o.name);if(e||a||t)d.FullName={FName:e,MName:a,LName:t};else{if(!r)throw new J("combinedSearch name requires string last name, or object with any of { fname, lname, mname }");d.LName=r}}}}else if("nameRecId"===t){const o=T(e.nameRecId??e.custId,"custId");if(!o)throw new J("combinedSearch nameRecId value missing");d.NameRecId=o}else{if("stkNo"!==t)throw new J(`Unsupported CombinedSearch kind: ${e.kind}`);{const o=T(e.stkNo??e.stock,"stkNo");if(!o)throw new J("combinedSearch stkNo value missing");d.StkNo=o}}if(1!==[d.Phone,d.LicenseNum,d.PartVIN,d.LName,d.FullName,d.NameRecId,d.StkNo].filter(Boolean).length)throw new J("combinedSearch requires exactly one search criterion");const r=C(e.make),i=C(e.model),s=C(e.year);(r||i||s)&&(d.VehData={MakePfx:r,Model:i,Year:s});const l=o({routing:a.routing,sender:{component:"Rome",task:"CVC",referenceId:"Query",creator:"RCI",senderName:"RCI"},order:"creation-bod-sender-destination"});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n {{#Phone}}{{/Phone}}\n {{#PartVIN}}{{/PartVIN}}\n {{#LicenseNum}}{{/LicenseNum}}\n {{#LName}}{{/LName}}\n {{#FullName}}\n \n {{/FullName}}\n {{#NameRecId}}{{/NameRecId}}\n {{#StkNo}}{{/StkNo}}\n \n {{#VehData}}\n \n {{/VehData}}\n \n\n',{ApplicationArea:l,...d}),routing:a.routing,envelope:a.envelope,elementName:"rey_RomeCustServVehCombReq",xsdFilename:"rey_RomeCustServVehCombReq.xsd",postParse:m}}(e,a))}async insertCustomer(e,a){return this._send(function(e,a){if(!a?.routing?.dealerNumber)throw new J("routing.dealerNumber required");const t=S(e),d=o({routing:a.routing,sender:{component:"Rome",task:"CU",referenceId:"Insert"},order:"sender-creation-bod-destination"});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n {{#C.contactInfo.Addresses}}\n \n {{/C.contactInfo.Addresses}}\n {{#C.contactInfo.Phones}}\n \n {{/C.contactInfo.Phones}}\n {{#C.contactInfo.Email}}\n \n {{/C.contactInfo.Email}}\n \n {{#C.custPersonal}}\n \n {{#BirthDates}}\n \n {{/BirthDates}}\n {{#SSNs}}\n \n {{/SSNs}}\n {{#DriverInfo}}\n \n {{/DriverInfo}}\n {{#CustChildren}}\n \n {{/CustChildren}}\n \n {{/C.custPersonal}}\n {{#C.dmsCustInfo}}\n \n {{#Followups}}\n \n {{/Followups}}\n \n {{/C.dmsCustInfo}}\n \n\n',{ApplicationArea:d,C:t}),routing:a.routing,envelope:a.envelope,postParse:g,xsdFilename:"rey_RomeCustomerInsertReq.xsd",elementName:"rey_RomeCustomerInsertReq"}}(e,a))}async updateCustomer(e,a){return this._send(function(e,a){if(!a?.routing?.dealerNumber)throw new J("routing.dealerNumber required");if(!e.nameRecId)throw new J("nameRecId or customerId required");const t=b(e.ibFlag);if("I"!==t&&"B"!==t)throw new J("ibFlag required ('I' or 'B')");const d=S(e);d.contactInfo.NameRecId=String(e.nameRecId);const r=o({routing:a.routing,sender:{component:"Rome",task:"CU",referenceId:"Update"},order:"sender-creation-bod-destination"});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n {{#C.contactInfo.Addresses}}\n \n {{/C.contactInfo.Addresses}}\n {{#C.contactInfo.Phones}}\n \n {{/C.contactInfo.Phones}}\n {{#C.contactInfo.Email}}\n \n {{/C.contactInfo.Email}}\n \n {{#C.custPersonal}}\n \n {{#BirthDates}}\n \n {{/BirthDates}}\n {{#SSNs}}\n \n {{/SSNs}}\n {{#DriverInfo}}\n \n {{/DriverInfo}}\n {{#CustChildren}}\n \n {{/CustChildren}}\n \n {{/C.custPersonal}}\n {{#C.dmsCustInfo}}\n \n {{#Followups}}\n \n {{/Followups}}\n \n {{/C.dmsCustInfo}}\n \n\n',{ApplicationArea:r,C:d}),routing:a.routing,envelope:a.envelope,postParse:g,xsdFilename:"rey_RomeCustomerUpdateReq.xsd",elementName:"rey_RomeCustomerUpdateReq"}}(e,a))}async insertServiceVehicle(e,a){return this._send(function(e={},a={}){if(!a?.routing?.dealerNumber)throw new J("routing.dealerNumber is required");const t=o({routing:a.routing,sender:a?.envelope?.sender??{component:"Rome",task:"SV",referenceId:"Insert"},creationDateTime:a?.envelope?.creationDateTime,bodId:a?.envelope?.bodId}),d=function(e={}){const o=e.vin;if(!o)throw new J("insertServiceVehicle: vin is required");const a=e.vehicleServInfo?.customerNo;if(!a)throw new J("insertServiceVehicle: vehicleServInfo.customerNo (or customerNo) is required");return{VIN:String(o).toUpperCase(),VehicleMake:e.vehicleMake||e.make,VehicleYear:String(e.year).slice(-2),MdlNo:e.mdlNo||e.modelCode||"P",ModelDesc:e.modelDesc,Carline:e.carline,ExtClrDesc:e.extClrDesc,AccentClr:e.accentClr,Aircond:e.aircond??"Y",Pwrstr:e.pwrstr??"Y",Transm:e.transm??"A",Turbo:e.turbo?"Y":"N",EngineConfig:e.engineConfig,Trim:e.trim,LicNo:e.licNo,StockID:e.stockId,CustomerNo:String(a),vehicleServInfo:{salesmanNo:e.vehicleServInfo?.salesmanNo,inServiceDate:e.vehicleServInfo?.inServiceDate?h(e.vehicleServInfo?.inServiceDate):void 0,mileage:e.vehicleServInfo?.mileage,teamCode:e.vehicleServInfo?.teamCode,productionDate:e?.productionDate?h(e.productionDate):void 0,modelMaintCode:e.modelMaintCode,vehExtWarranty:(()=>{const o=e.vehicleServInfo?.vehExtWarranty;if(!o)return;const a={contractNumber:o.contractNumber,expirationDate:o?.expirationDate?h(o.expirationDate):void 0,expirationMileage:o.expirationMileage};return Object.values(a).some(e=>null!=e&&""!==e)?a:void 0})(),advisor:(()=>{const o=e.vehicleServInfo?.advisor,a=o?.contactInfo?.nameRecId;return a?{contactInfo:{nameRecId:String(a)}}:void 0})()}}}(e);return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n\n \n \n \n\n \n {{#V.vehicleServInfo.vehExtWarranty}}\n \n {{/V.vehicleServInfo.vehExtWarranty}}\n\n {{#V.vehicleServInfo.advisor}}\n \n \n \n {{/V.vehicleServInfo.advisor}}\n \n\n',{ApplicationArea:t,V:d}),routing:a.routing,envelope:a.envelope,postParse:f,xsdFilename:"rey_RomeServVehicleInsertReq.xsd",elementName:"rey_RomeServVehicleInsertReq"}}(e,a))}async getAdvisors(e,o){return this._send(v(e,o))}async createRepairOrder(e,a){return this._send(function(e={},a={}){if(!a?.routing?.dealerNumber)throw new J("routing.dealerNumber required");if(!e?.customerNo)throw new J("customerNo (CustNo) required");if(!e?.departmentType)throw new J("departmentType (DeptType) required");if(!e?.vin)throw new J("vin (Vin) required");if(!e?.outsdRoNo)throw new J("outsdRoNo required");const t={customerNo:e.customerNo,advisorNo:e.advisorNo,tagNo:e.tagNo,outsdRoNo:e.outsdRoNo,departmentType:e.departmentType,vin:e.vin,mileageIn:e.mileageIn,roComment:e.roComment,estimate:e.estimate?{parts:e.estimate.parts,labor:e.estimate.labor,total:e.estimate.total}:void 0,tax:e.tax?{payType:e.tax.payType,taxCode:e.tax.taxCode,txblGrossAmt:e.tax.txblGrossAmt,grossTaxAmt:e.tax.grossTaxAmt}:void 0,rolabor:e.rolabor?{ops:e.rolabor.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,custPayTypeFlag:e.custPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrPayTypeFlag:e.warrPayTypeFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrPayTypeFlag:e.intrPayTypeFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,vlrCode:e.vlrCode,bill:e.bill?{payType:e.bill.payType,jobTotalHrs:e.bill.jobTotalHrs,billTime:e.bill.billTime,billRate:e.bill.billRate}:void 0,ccc:e.ccc?{cause:e.ccc.cause,complaint:e.ccc.complaint,correction:e.ccc.correction}:void 0,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,totalAmt:e.amount.totalAmt}:void 0}))}:void 0,ropart:e.ropart?{jobs:e.ropart.jobs?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({partNo:e.partNo,partNoDesc:e.partNoDesc,qtyOrd:e.partQty,sale:e.sale,cost:e.cost,addDeleteFlag:e.addDeleteFlag}))}))}:void 0,rogg:e.rogg?{roNo:e.rogg.roNo,ops:e.rogg.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({breakOut:e.breakOut,itemType:e.itemType,itemDesc:e.itemDesc,custQty:e.custQty,warrQty:e.warrQty,intrQty:e.intrQty,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,dlrCost:e.amount.dlrCost}:void 0}))}))}:void 0,romisc:e.romisc?{roNo:e.romisc.roNo,ops:e.romisc.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({miscCode:e.miscCode,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,codeAmt:e.codeAmt}))}))}:void 0};if(t.tax?.payType&&!["All","Cust","Intr","Warr"].includes(t.tax.payType))throw new J("tax.payType must be one of: All, Cust, Intr, Warr");if(t.rolabor?.ops?.some(e=>e.custTxblNtxblFlag&&!["T","N"].includes(e.custTxblNtxblFlag)||e.warrTxblNtxblFlag&&!["T","N"].includes(e.warrTxblNtxblFlag)||e.intrTxblNtxblFlag&&!["T","N"].includes(e.intrTxblNtxblFlag)))throw new J("Taxable flags (CustTxblNTxblFlag, WarrTxblNTxblFlag, IntrTxblNTxblFlag) must be 'T' or 'N'");if(t.rogg?.ops?.some(e=>e.lines?.some(e=>e.itemType&&!["G","P","S","F"].includes(e.itemType))))throw new J("rogg.ops.lines.itemType must be one of: G, P, S, F");const d={...a?.envelope||{},sender:{component:a?.envelope?.sender?.component??"Rome",task:a?.envelope?.sender?.task??"BSMRO",referenceId:a?.envelope?.sender?.referenceId??"Insert",creatorNameCode:a?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:a?.envelope?.sender?.senderNameCode??"RCI"}},r=o({routing:a.routing,sender:d.sender,creationDateTime:d.creationDateTime,bodId:d.bodId});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n {{#RO.roComment}}\n \n {{/RO.roComment}}\n\n {{#RO.estimate}}\n \n {{/RO.estimate}}\n\n {{#RO.tax}}\n \n {{/RO.tax}}\n \n\n {{#RO.rolabor}}\n \n {{#RO.rolabor.ops}}\n \n {{#bill}}\n \n {{/bill}}\n\n {{#ccc}}\n \n {{/ccc}}\n\n {{#amount}}\n \n {{/amount}}\n \n {{/RO.rolabor.ops}}\n \n {{/RO.rolabor}}\n\n {{#RO.ropart}}\n \n {{#RO.ropart.jobs}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.ropart.jobs}}\n \n {{/RO.ropart}}\n\n {{#RO.rogg}}\n \n {{#RO.rogg.ops}}\n \n {{#lines}}\n \n {{#amount}}\n \n {{/amount}}\n \n {{/lines}}\n \n {{/RO.rogg.ops}}\n \n {{/RO.rogg}}\n\n {{#RO.romisc}}\n \n {{#RO.romisc.ops}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.romisc.ops}}\n \n {{/RO.romisc}}\n \n\n',{ApplicationArea:r,RO:t}),routing:a.routing,envelope:d,postParse:F,xsdFilename:"rey_RomeCreateBSMRepairOrderReq.xsd"}}(e,a))}async updateRepairOrder(e,a){return this._send(function(e={},a={}){if(!a?.routing?.dealerNumber)throw new J("routing.dealerNumber required");if(!e?.finalUpdate)throw new J("finalUpdate (FinalUpdate) required");if(!["Y","N"].includes(e.finalUpdate))throw new J("finalUpdate must be 'Y' or 'N'");if(!e?.outsdRoNo)throw new J(" outsdRoNo");const t={finalUpdate:e.finalUpdate||"N",roNo:e.roNo,customerNo:e.customerNo,tagNo:e.tagNo,outsdRoNo:e.outsdRoNo,departmentType:e.departmentType,vin:e.vin,mileageIn:e.mileageIn,mileageOut:e.mileageOut,roComment:e.roComment,estimate:e.estimate?{estimateType:e.estimate.estimateType}:void 0,tax:e.tax?{payType:e.tax.payType,taxCode:e.tax.taxCode,txblGrossAmt:e.tax.txblGrossAmt,grossTaxAmt:e.tax.grossTaxAmt}:void 0,rolabor:e.rolabor?{ops:e.rolabor.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,custPayTypeFlag:e.custPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrPayTypeFlag:e.warrPayTypeFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrPayTypeFlag:e.intrPayTypeFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,vlrCode:e.vlrCode,bill:e.bill?{payType:e.bill.payType,jobTotalHrs:e.bill.jobTotalHrs,billTime:e.bill.billTime,billRate:e.bill.billRate}:void 0,ccc:e.ccc?{cause:e.ccc.cause,complaint:e.ccc.complaint,correction:e.ccc.correction}:void 0,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,totalAmt:e.amount.totalAmt}:void 0}))}:void 0,ropart:e.ropart?{jobs:e.ropart.jobs?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({partNo:e.partNo,partNoDesc:e.partNoDesc,qtyOrd:e.partQty,sale:e.sale,cost:e.cost,addDeleteFlag:e.addDeleteFlag}))}))}:void 0,rogg:e.rogg?{roNo:e.rogg.roNo,ops:e.rogg.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({breakOut:e.breakOut,itemType:e.itemType,itemDesc:e.itemDesc,custQty:e.custQty,warrQty:e.warrQty,intrQty:e.intrQty,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,dlrCost:e.amount.dlrCost}:void 0}))}))}:void 0,romisc:e.romisc?{roNo:e.romisc.roNo,ops:e.romisc.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({miscCode:e.miscCode,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,codeAmt:e.codeAmt}))}))}:void 0};if(t.tax?.payType&&!["All","Cust","Intr","Warr"].includes(t.tax.payType))throw new J("tax.payType must be one of: All, Cust, Intr, Warr");if(t.rolabor?.ops?.some(e=>e.custTxblNtxblFlag&&!["T","N"].includes(e.custTxblNtxblFlag)||e.warrTxblNtxblFlag&&!["T","N"].includes(e.warrTxblNtxblFlag)||e.intrTxblNtxblFlag&&!["T","N"].includes(e.intrTxblNtxblFlag)))throw new J("Taxable flags (CustTxblNTxblFlag, WarrTxblNTxblFlag, IntrTxblNTxblFlag) must be 'T' or 'N'");if(t.rogg?.ops?.some(e=>e.lines?.some(e=>e.itemType&&!["G","P","S","F"].includes(e.itemType))))throw new J("rogg.ops.lines.itemType must be one of: G, P, S, F");const d={...a?.envelope||{},sender:{component:a?.envelope?.sender?.component??"Rome",task:a?.envelope?.sender?.task??"BSMRO",referenceId:a?.envelope?.sender?.referenceId??"Update",creatorNameCode:a?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:a?.envelope?.sender?.senderNameCode??"RCI"}},r=o({routing:a.routing,sender:d.sender,creationDateTime:d.creationDateTime,bodId:d.bodId});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n {{#RO.roComment}}\n \n {{/RO.roComment}}\n\n {{#RO.estimate}}\n \n {{/RO.estimate}}\n\n {{#RO.tax}}\n \n {{/RO.tax}}\n \n\n {{#RO.rolabor}}\n \n {{#RO.rolabor.ops}}\n \n {{#bill}}\n \n {{/bill}}\n\n {{#ccc}}\n \n {{/ccc}}\n\n {{#amount}}\n \n {{/amount}}\n \n {{/RO.rolabor.ops}}\n \n {{/RO.rolabor}}\n\n {{#RO.ropart}}\n \n {{#RO.ropart.jobs}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.ropart.jobs}}\n \n {{/RO.ropart}}\n\n {{#RO.rogg}}\n \n {{#RO.rogg.ops}}\n \n {{#lines}}\n \n {{#amount}}\n \n {{/amount}}\n \n {{/lines}}\n \n {{/RO.rogg.ops}}\n \n {{/RO.rogg}}\n\n {{#RO.romisc}}\n \n {{#RO.romisc.ops}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.romisc.ops}}\n \n {{/RO.romisc}}\n \n\n',{ApplicationArea:r,RO:t}),routing:a.routing,envelope:d,postParse:F,xsdFilename:"rey_RomeUpdateBSMRepairOrderReq.xsd",elementName:"rey_RomeUpdateBSMRepairOrderReq"}}(e,a))}async getParts(e,a){return this._send(function(e={},a={}){const t=e.roNumber?String(e.roNumber).trim():void 0;if(!t)throw new J("getParts: roNumber required");const d=o({routing:a.routing,sender:{component:"Rome",task:"RCT",referenceId:"Query",creator:"RCI",senderName:"RCI"}});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n\n',{ApplicationArea:d,RoNumber:t}),routing:a.routing,envelope:a.envelope,xsdFilename:"rey_RomeGetPartsReq.xsd",elementName:"rey_RomeGetPartsReq",postParse:e=>function(e){return e?.rey_RomeGetPartsResp?.RoParts?.map(e=>({partNumber:O(e,"PartNumber"),partDescription:O(e,"PartDescription"),quantityOrdered:O(e,"QuantityOrdered"),quantityShipped:O(e,"QuantityShipped"),price:O(e,"Price"),cost:O(e,"Cost"),processedFlag:O(e,"ProcessedFlag"),addOrDelete:O(e,"AddOrDelete")}))||[]}(e)}}(e,a))}},exports.errors=_,exports.getEntryByCode=ce,exports.lookupByMake=se,exports.lookupByMakeAndType=ne,exports.lookupVehicleMake=(e,o)=>{if(!e)return null;if("string"==typeof e){const a=e;return o?ne(a,o):se(a)}if("object"==typeof e){const{make:o,type:a}=e;return o?a?ne(o,a):se(o):null}return null}; diff --git a/server/rr/lib/index.mjs b/server/rr/lib/index.mjs index e5aa1c5f6..a7fa4431e 100644 --- a/server/rr/lib/index.mjs +++ b/server/rr/lib/index.mjs @@ -1 +1 @@ -function e({routing:e={},sender:o={},creationDateTime:a,bodId:t}={}){const d={Sender:{Component:o.component??"Rome",Task:o.task??"CU",ReferenceId:o.referenceId??"Query",CreatorNameCode:o.creator??"RCI",SenderNameCode:o.senderName??"RCI"},CreationDateTime:a??(new Date).toISOString().replace(/\.\d{3}Z$/,"Z"),BODId:t??k(),Destination:{DestinationNameCode:"RR",DealerNumber:e.dealerNumber||"",StoreNumber:e.storeNumber||"",AreaNumber:e.areaNumber||""}},r={bod:"{{#BODId}}{{BODId}}{{/BODId}}",creation:"{{CreationDateTime}}",sender:"\n \n {{Sender.Component}}\n {{Sender.Task}}\n {{#Sender.ReferenceId}}{{Sender.ReferenceId}}{{/Sender.ReferenceId}}\n {{#Sender.CreatorNameCode}}{{Sender.CreatorNameCode}}{{/Sender.CreatorNameCode}}\n {{#Sender.SenderNameCode}}{{Sender.SenderNameCode}}{{/Sender.SenderNameCode}}\n ".trim(),dest:"\n \n {{Destination.DestinationNameCode}}\n {{#Destination.DealerNumber}}{{Destination.DealerNumber}}{{/Destination.DealerNumber}}\n {{#Destination.StoreNumber}}{{Destination.StoreNumber}}{{/Destination.StoreNumber}}\n {{#Destination.AreaNumber}}{{Destination.AreaNumber}}{{/Destination.AreaNumber}}\n ".trim()},i=`\n${["bod","creation","sender","dest"].map(e=>r[e]).join("\n")}\n`;return L.render(i,d).trim()}function o(e,o=2){const a=" ".repeat(o);return String(e).split("\n").map(e=>e.length?a+e:e).join("\n")}function a(e){return String(e??"").replace(/&/g,"&").replace(//g,">")}function t(e,o){if(null==e)return null;if(Array.isArray(e)){for(const a of e){const e=t(a,o);if(null!=e)return e}return null}if("object"!=typeof e)return null;for(const[a,d]of Object.entries(e)){if(o(a,d))return d;const e=t(d,o);if(null!=e)return e}return null}function d(e,o,a=[]){if(null==e)return a;if(Array.isArray(e)){for(const t of e)d(t,o,a);return a}if("object"!=typeof e)return a;for(const[t,r]of Object.entries(e))o(t,r)&&a.push(r),d(r,o,a);return a}function r(e){return null==e?[]:Array.isArray(e)?e:[e]}function i(e,o){if(e&&"object"==typeof e)return function(e){if(null!=e)return"string"==typeof e||"number"==typeof e||"boolean"==typeof e?String(e):"object"==typeof e&&"#text"in e?String(e["#text"]):void 0}(e[o])}function s(e,o){const a=i(e,o);if(J(a))return a;const t=function(e,o){if(e&&"object"==typeof e)return e.$&&J(e.$[o])?e.$[o]:J(e[`@_${o}`])?e[`@_${o}`]:J(e[`@${o}`])?e[`@${o}`]:e._attributes&&J(e._attributes[o])?e._attributes[o]:e.attributes&&J(e.attributes[o])?e.attributes[o]:void 0}(e,o);return J(t)?t:void 0}function l(e,o){if(e&&"object"==typeof e)return null!=e[`@_${o}`]?e[`@_${o}`]:void 0}function n(e){if(null!=e){if("string"==typeof e)return e;if("number"==typeof e)return String(e);if("object"==typeof e){if(null!=e._)return String(e._);if(null!=e["#text"])return String(e["#text"]);if(null!=e.text)return String(e.text)}}}function c(e){return d(e,e=>/(GenTransStatus|TransStatus)$/i.test(e)).flatMap(r)[0]}function p(e){if(e)return{status:(l(e,"Status")||e.Status||n(e)||"").toString().trim()||void 0,statusCode:(l(e,"StatusCode")||e.StatusCode||"").toString().trim()||void 0,message:e.Message&&n(e.Message)||e.GenTransStatus&&n(e.GenTransStatus)||e.TransStatus&&n(e.TransStatus)||n(e)||void 0}}function y(e){if(e)return{status:(l(e,"Status")||e.Status||n(e)||"").toString().trim()||void 0,date:(l(e,"Date")||e.Date||"").toString().trim()||void 0,time:(l(e,"Time")||e.Time||"").toString().trim()||void 0,outsdRoNo:(l(e,"OutsdRoNo")||e.OutsdRoNo||"").toString().trim()||void 0,dmsRoNo:(l(e,"DMSRoNo")||e.DMSRoNo||"").toString().trim()||void 0,errorMessage:(l(e,"ErrorMessage")||e.ErrorMessage||"").toString().trim()||void 0}}function u(e){const o=e?.rey_RomeCustServVehCombRes??e?.rey_RomeCustServVehCombReq??e?.rey_RomeCustServVehComb??e??{};return r(o?.CustServVehComb??o?.CustServVehCombRes??o?.CustServVehCombReq??o).map(e=>{const o=e?.NameContactId??void 0,a=o?.NameId??void 0,t=a?.IndName?j(a.IndName):void 0,d=a?.BusName?j(a.BusName):void 0,i=o&&{NameId:a&&{...j(a)||{},...t?{IndName:t}:{},...d?{BusName:d}:{}},Address:r(o?.Address).map(e=>j(e)||{}),ContactOptions:r(o?.ContactOptions).map(e=>j(e)||{}),Phone:r(o?.Phone).map(e=>j(e)||{}),Email:r(o?.Email).map(e=>j(e)||{})},s=r(e?.ServVehicle).map(e=>{const o=e?.Vehicle,a=o?.VehicleDetail,t=o&&{...j(o)||{},...a?{VehicleDetail:j(a)||{}}:{}},d=e?.VehicleServInfo,i=d?.VehExtWarranty,s=d?.Advisor,l=s?.ContactInfo;let n;s&&(n={...j(s)||{},...l?{ContactInfo:j(l)||{}}:{}});const c=d&&{...j(d)||{},...i?{VehExtWarranty:j(i)||{}}:{},...n?{Advisor:n}:{},...d?.VehServComments?{VehServComments:r(d.VehServComments).map(e=>Q(e)).filter(e=>null!=e&&""!==String(e).trim())}:{}};return{...t?{Vehicle:t}:{},...c?{VehicleServInfo:c}:{}}}),l=r(e?.Message).map(e=>{const o=Q(e);return{...j(e)||{},...null!=o&&""!==String(o).trim()?{Text:o}:{}}}).filter(e=>Object.keys(e).length>0),n={};return i&&(n.NameContactId=i),s.length&&(n.ServVehicle=s),l.length&&(n.Message=l),n})}function m(e,o){if(null!=e)return String("string"==typeof e||"number"==typeof e?e:e[o]||"")}function T(e){return String(e??"").trim()||void 0}function C(e,...o){if(e)for(const a of o){if(e.$&&null!=e.$[a])return e.$[a];if(null!=e[`@_${a}`])return e[`@_${a}`];if(null!=e[a]&&"object"!=typeof e[a])return e[a]}}function R(e){const o=function(e){const o=t(e,e=>"rey_RomeCustomerResponse"===e||e.endsWith(":rey_RomeCustomerResponse"));return o?d(o,e=>"TransStatus"===e||e.endsWith(":TransStatus")).flatMap(r)[0]:void console.log("No rey_RomeCustomerResponse found in root")}(e);if(!o)return{dmsRecKey:void 0};const a=C(o,"DMSRecKey");return{dmsRecKey:null!=a?String(a):void 0,status:C(o,"Status"),statusCode:C(o,"StatusCode")}}function g(e){if(null==e)return;const o=String(e).toUpperCase().replace(/[^A-Z0-9 ]+/g,"");if(!o)throw new K(`Invalid string: ${e}. Must contain A-Z, 0-9, or space`);return o}function N(e){return e?String(e).toUpperCase():void 0}function b(e={}){const o=N(e.ibFlag)||(e.firstName?"I":"B");if("I"!==o&&"B"!==o)throw new K("ibFlag must be 'I' or 'B'");const a=e.lastName||e.customerName;if(!a)throw new K("lastName or customerName required");if("I"===o&&!e.firstName)throw new K("firstName required when ibFlag='I'");const t=N(e.customerType);if(t&&!["R","W","I"].includes(t))throw new K("customerType must be 'R', 'W', 'I', Retail, Wholesale, or Internal");const d=(e.addresses||[]).map(e=>{const o={Type:N(e.type)||"P",Addr1:e.line1?String(e.line1):void 0,Addr2:e.line2?String(e.line2):void 0,City:e.city?String(e.city):void 0,State:e.state?String(e.state):void 0,Zip:e.postalCode?String(e.postalCode):void 0,County:e.county?String(e.county):void 0,Country:e.country?String(e.country):void 0};if(!o.Addr1)throw new K("Address requires line1");return o}),r=(e.phones||[]).map(e=>{const o={Type:N(e.type)||"H",Num:e.number?String(e.number):void 0,Ext:e.extension?String(e.extension):void 0};if(!o.Num)throw new K("Phone requires number");return o}),i=e.emails?.[0]?.address?{MailTo:String(e.emails[0].address)}:void 0,s=e.personal,l=s?{Gender:N(s.gender),OtherName:g(s.otherName),AnniversaryDate:s.anniversaryDate?String(s.anniversaryDate):void 0,EmployerName:g(s.employerName),EmployerPhone:s.employerPhone?String(s.employerPhone):void 0,Occupation:g(s.occupation),OptOut:s.optOut?String(s.optOut):void 0,OptOutUse:s.optOutUse?String(s.optOutUse):void 0,BirthDates:(s.birthDates||[]).map(e=>({Type:N(e.type)||"P",date:e.date?String(e.date):void 0})).filter(e=>e.date),SSNs:(s.ssns||[]).map(e=>({Type:N(e.type)||"P",ssn:e.ssn?String(e.ssn):void 0})).filter(e=>e.ssn),DriverInfo:s.driver?[{Type:N(s.driver.type)||"P",LicNum:s.driver.licenseNumber?String(s.driver.licenseNumber):void 0,LicState:s.driver.licenseState?String(s.driver.licenseState):void 0,LicExpDate:s.driver.licenseExpDate?String(s.driver.licenseExpDate):void 0}].filter(e=>e.LicNum):void 0,CustChildren:(s.children||[]).map(e=>({ChildName:g(e.name)})).filter(e=>e.ChildName)}:void 0,n=e.dms,c=n?{TaxExemptNum:n.taxExemptNum?String(n.taxExemptNum):void 0,SalesTerritory:n.salesTerritory?String(n.salesTerritory):void 0,DeliveryRoute:n.deliveryRoute?String(n.deliveryRoute):void 0,SalesmanNum:n.salesmanNum?String(n.salesmanNum):void 0,LastContactMethod:n.lastContactMethod?String(n.lastContactMethod):void 0,Followups:(n.followups||[]).map(e=>({Type:N(e.type),Value:N(e.value)})).filter(e=>e.Type&&e.Value)}:void 0;return{custCateg:t||"R",createdBy:e.createdBy?String(e.createdBy):void 0,contactInfo:{IBFlag:o,LastName:g(a),FirstName:g(e.firstName),MidName:g(e.midName),Salut:g(e.salut),Suffix:g(e.suffix),Addresses:d,Phones:r,Email:i},custPersonal:l,dmsCustInfo:c}}function S(e){const o=t(e,e=>"rey_RomeServVehicleInsertResponse"===e||e.endsWith(":rey_RomeServVehicleInsertResponse"))||e,a=t(o,e=>"GenTransStatus"===e||e.endsWith(":GenTransStatus"));return{status:a?s(a,"Status"):void 0,statusCode:a?s(a,"StatusCode"):void 0}}function f(e){if(!e)return;let o;if(e instanceof Date)o=e;else if("string"==typeof e){const a=e.trim();if(/^\d{1,2}\/\d{1,2}\/\d{4}$/.test(a))return a;if(/^\d{4}-\d{2}-\d{2}/.test(a)){const[e,t,d]=a.split("T")[0].split("-");o=new Date(Number(e),Number(t)-1,Number(d))}else o=new Date(a)}else o=new Date(e);if(isNaN(o?.getTime()))throw new K(`Invalid date provided: ${e}`);return`${String(o.getMonth()+1).padStart(2,"0")}/${String(o.getDate()).padStart(2,"0")}/${o.getFullYear()}`}function h(e,o){const a=Array.isArray(o)?o.map(e=>e.toLowerCase()):[String(o).toLowerCase()],t=[e];for(;t.length;){const e=t.pop();if($(e))for(const o of Object.keys(e)){const d=e[o],r=q(o).toLowerCase();if(a.includes(r))return d;if($(d))t.push(d);else if(Array.isArray(d))for(const e of d)$(e)&&t.push(e)}}}function x(e,o){if(e&&$(e)){if(null!=e.$?.[o])return e.$[o];if(null!=e[`@${o}`])return e[`@${o}`];if(null!=e[`@_${o}`])return e[`@_${o}`]}}function P(e){if(null!=e){if("string"==typeof e)return e;if("number"==typeof e)return String(e);if($(e)){if(null!=e._)return String(e._);if(null!=e["#text"])return String(e["#text"]);if(null!=e.text)return String(e.text)}}}function A(e){const o=h(e,["CreateBSMRepairOrderResp","UpdateBSMRepairOrderResp"])||e,a=h(o,"RoRecordStatus")||{};return{status:x(a,"Status")||P(h(a,"Status")),date:x(a,"Date")||P(h(a,"Date")),time:x(a,"Time")||P(h(a,"Time")),outsdRoNo:x(a,"OutsdRoNo")||P(h(a,"OutsdRoNo")),dmsRoNo:x(a,"DMSRoNo")||P(h(a,"DMSRoNo")),errorMessage:x(a,"ErrorMessage")||P(h(a,"ErrorMessage"))}}function F(o={},a={}){const t=function(e){if(!e)throw new Error("department is required (S, P, B, SERVICE, PARTS, BODY)");const o=String(e).trim().toUpperCase();if("S"===o||"P"===o||"B"===o)return o;if("SERVICE"===o)return"S";if("PART"===o||"PARTS"===o)return"P";if("BODY"===o||"BODYSHOP"===o||"BODY SHOP"===o)return"B";throw new Error(`Invalid department: ${e}. Must be S, P, B, SERVICE, PARTS, BODY, BODYSHOP, or BODY SHOP`)}(o.department),d=o.advisorNumber?String(o.advisorNumber).trim():void 0,r=e({routing:a.routing,sender:a?.envelope?.sender,creationDateTime:a?.envelope?.creationDateTime,bodId:a?.envelope?.bodId});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n \n\n',{ApplicationArea:r,DepartmentType:t,AdvisorNumber:d}),routing:a.routing,envelope:a.envelope,xsdFilename:"rey_RomeGetAdvisorsReq.xsd",elementName:"rey_RomeGetAdvisorsReq",postParse:e=>function(e,o={}){const a=o?.department;var t;return(e=>{const o=e?.Advisor;return o?Array.isArray(o)?o:[o]:[]})((t=e,t?.rey_RomeGetAdvisorsResp??t??{})).map(e=>({advisorId:X(e,"AdvisorNumber"),firstName:X(e,"FirstName"),lastName:X(e,"LastName"),department:a}))}(e,{department:t})}}function v(e){return null==e?void 0:String(e)}function M(e,o){if(e)return null!=e[o]?"object"!=typeof e[o]?v(e[o]):v(e[o]["#text"]):null!=e[`@_${o}`]?v(e[`@_${o}`]):void 0}function O(e){const o=e?.meta?.statusBlocks?.transaction?.message;if(o)return String(o);return String((e?.meta?.status?.Message??e?.meta?.status?.message)||e?.message||"")}function I(e,o){return Math.min(1e4,e*Math.pow(2,o))}function V(e){return e+Math.floor(250*Math.random())}function D(e){return new Promise(o=>setTimeout(o,e))}function w(e){return/lock|in use|record.*busy/i.test(String(e||""))}function E(e,o="****"){if(!e||"string"!=typeof e)return e;let a=e;return a=a.replace(/(]*>)([^<]*)(<\/wsse:Username>)/gi,`$1${o}$3`),a=a.replace(/(]*>)([^<]*)(<\/wsse:Password>)/gi,`$1${o}$3`),a}import L from"mustache";import{v4 as k}from"uuid";import{create as B}from"xmlbuilder2";import G from"axios";import{XMLParser as H}from"fast-xml-parser";class W extends Error{constructor(e,o={}){super(e),this.name="RRTransportError",this.meta=o}}class U extends Error{constructor(e,o={}){super(e),this.name="RRVendorStatusError",this.meta=o,this.retryable=!!o.retryable}}class K extends Error{constructor(e,o={}){super(e),this.name="RRValidationError",this.meta=o}}const Z=Object.freeze({__proto__:null,RRTransportError:W,RRVendorStatusError:U,RRValidationError:K}),Y={info:(...e)=>console.log("[rr-rome]",...e),warn:(...e)=>console.warn("[rr-rome]",...e),error:(...e)=>console.error("[rr-rome]",...e),debug:(...e)=>{process.env.RR_DEBUG&&console.log("[rr-rome][debug]",...e)}},J=e=>null!=e&&""!==String(e).trim(),_=new H({ignoreAttributes:!1,attributeNamePrefix:"@_",parseAttributeValue:!1,parseTagValue:!1,isArray:e=>["Advisor"].includes(e)}),j=e=>{if(!e||"object"!=typeof e)return;const o={};for(const[a,t]of Object.entries(e))a.startsWith("@_")&&(o[a.slice(2)]=t);return Object.keys(o).length?o:void 0},Q=e=>{if(null!=e)return"string"==typeof e?e:e["#text"]},q=e=>{if("string"!=typeof e)return"";let o=e.includes("}")?e.split("}").pop():e;return o=o.includes(":")?o.split(":").pop():o,o.startsWith("rey_")&&(o=o.slice(4)),o},$=e=>e&&"object"==typeof e&&!Array.isArray(e),X=(e,o)=>((e,o)=>e?.[`@_${o}`])(e,o)??i(e,o);class z{constructor(e){if(!e?.baseUrl)throw new Error("RRClient requires baseUrl");if(!e?.username)throw new Error("RRClient requires username");if(!e?.password)throw new Error("RRClient requires password");this.cfg={wssePasswordType:"Text",timeoutMs:3e4,logger:Y,retries:{max:3},...e},this.mask={password:!0}}async _send(e){const{starXml:t,routing:i,envelope:s,postParse:u}=e,m=this.cfg.logger||Y,{bodId:T,creationDateTime:C,sender:R}=function(e){return{bodId:e?.bodId||k(),creationDateTime:e?.creationDateTime||new Date,sender:e?.sender||{}}}(s),g=function({username:e,password:t,wssePasswordType:d="Text",starContentXml:r,normalize:i=!0,normalizeOptions:s}={}){const l=function(e){return`\n \n \n \n${o(e,10)}\n \n \n \n `.trim()}(r),n=`\n \n \n${o(function(e,o,t){const d="Digest"===t?' Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"':' Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"';return`\n \n \n ${a(e)}\n ${a(o)}\n \n \n `.trim()}(e,t,d),8)}\n \n \n${o(l,8)}\n \n \n `.trim();return i?function(e,{prettyPrint:o=!0}={}){if(!e||"string"!=typeof e)return e;try{return B(e).end({prettyPrint:o,width:0,indent:" ",newline:"\n"}).trim()}catch(o){return String(e).trim()}}(n,s):n}({username:this.cfg.username,password:this.cfg.password,wssePasswordType:this.cfg.wssePasswordType||"Text",routing:i,sender:R,creationDateTime:(b=C,"string"==typeof b?b:(b instanceof Date?b:new Date).toISOString().replace(/\.\d{3}Z$/,"Z")),bodId:T,starContentXml:t}),N=E(g);var b;"1"===process.env.RR_DUMP_ENVELOPE&&console.log(`[rr] Soap envelope about to send (${e?.elementName}): \n`+N+"\n");const S=async()=>{const o=await async function({baseUrl:e,envelopeXml:o,timeoutMs:a=3e4,logger:t}){try{const t=await G.post(e,o,{timeout:a,headers:{"Content-Type":"text/xml; charset=utf-8",SOAPAction:"http://www.starstandards.org/webservices/2005/10/transport/ProcessMessage"},responseType:"text",validateStatus:()=>!0});if(t.status>=200&&t.status<300)return String(t.data??"");throw new W(`HTTP ${t.status}: ${function(e){const o=String(e??"");return o.length>1024?o.slice(0,1024)+"…":o}(t.data)}`,{status:t.status,body:t.data})}catch(e){if(G.isAxiosError(e))throw new W(`Network error: ${e.message}`,{cause:e});throw e}}({baseUrl:this.cfg.baseUrl,envelopeXml:g,timeoutMs:this.cfg.timeoutMs,logger:m}),a=function(e){const o=_.parse(e),a=o?.Envelope||o?.["soapenv:Envelope"]||o,t=a?.Body||a?.["soapenv:Body"]||a?.["S:Body"]||a?.["soap:Body"],d=t?.ProcessMessageResponse||t?.["ns2:ProcessMessageResponse"]||t?.["trans:ProcessMessageResponse"]||t,r=d?.payload||d?.["ns2:payload"]||d;return r?.content||r?.["ns2:content"]||r}(o),t=E(o),i=function(e){const o=c(e),a=d(e,e=>/RoRecordStatus$/i.test(e)).flatMap(r)[0];return{transaction:p(o),roRecord:y(a)}}(a),s=function(e){const o=String("ApplicationArea").toLowerCase(),a=[e];for(;a.length;){const e=a.pop();if(e&&"object"==typeof e)for(const[t,d]of Object.entries(e)){if(t.toLowerCase().endsWith(o))return d;d&&"object"==typeof d&&a.push(d)}}}(a),{status:T,norm:C}=function(e){const o=c(e)||d(e,e=>/Status$/i.test(e)).flatMap(r)[0]||{},a=(l(o,"Status")||o.Status||"").toString().trim();let t=(l(o,"StatusCode")||o.StatusCode||"").toString().trim();const i=o.Message&&n(o.Message)||n(o)||"";!t&&/success/i.test(a)&&(t="0");const s=Number(t);let p="FAIL";return/success/i.test(a)||0===s?p="SUCCESS":2!==s&&213!==s||(p="NO_MATCH"),{status:{Status:a,StatusCode:t,Message:i},norm:{kind:p,code:Number.isFinite(s)?s:void 0,message:i}}}(a);if("1"===process.env.RR_DUMP_STATUS&&(console.log("[rr] Status blocks:"),console.dir(i,{depth:null,colors:!0})),"1"===process.env.RR_DUMP_APPLICATION&&(console.log("[rr] ApplicationArea:"),console.dir(s,{depth:null,colors:!0})),"FAIL"===C.kind){const e=T?.StatusCode;throw new U(`Vendor status failure: ${e??""} ${T?.Message||T?.["#text"]||""}`.trim(),{status:T,reqXml:N,requestXml:N,resXml:t})}const R={success:"SUCCESS"===C.kind||"NO_MATCH"===C.kind,statusBlocks:i,applicationArea:s,xml:{request:N,response:t},parsed:a};if("function"==typeof u)try{R.data=u(a)}catch(e){m?.warn?.(`postParse failed: ${e?.message||e}`)}return"1"===process.env.RR_DUMP_XML&&console.log(`[rr] Full response XML (${e?.elementName}):\n`+t+"\n"),R?.data&&"1"===process.env.RR_DUMP_DATA&&(console.log(`[rr] Parsed response data (${e?.elementName}):\n`),console.dir(R.data,{depth:null,colors:!0})),R};try{return await async function(e,{max:o=3,logger:a}){let t,d=0;for(;d=o)break;const i=V(I(400,d));a?.warn?.(`Retrying attempt ${d}/${o} in ${i}ms: ${e.message}`),await D(i)}throw t}(S,{max:this.cfg.retries?.max??3,logger:m})}catch(e){if(e instanceof W||e instanceof U)throw e;throw new W(`Unexpected error: ${e?.message||e}`,{cause:e})}}async combinedSearch(o,a){return this._send(function(o={},a={}){if(!o||"object"!=typeof o)throw new K("combinedSearch requires a query object");const t=function(e){if(!e)return"";const o=String(e).trim().toLowerCase();return"telephone"===o?"phone":"lic"===o||"plate"===o?"license":"vin"===o||"partvin"===o?"vin":"name"===o?"name":"namerecid"===o||"custid"===o?"nameRecId":"stkno"===o||"stock"===o?"stkNo":o}(o.kind),d={MaxRecs:Math.min(Number(o.maxResults||o.maxRecs||50),50)};if("phone"===t){const e=m(o.phone,"phone");if(!e)throw new K("combinedSearch phone value missing");d.Phone=e}else if("license"===t){const e=m(o.license,"license");if(!e)throw new K("combinedSearch license value missing");d.LicenseNum=e}else if("vin"===t){const e=m(o.vin,"vin");if(!e)throw new K("combinedSearch vin value missing");d.PartVIN=e}else if("name"===t){const e=o.name;if("string"==typeof e){const o=e.trim();if(!o)throw new K("combinedSearch name string is empty");d.LName=o}else{if(!e||"object"!=typeof e)throw new K("combinedSearch name requires { fname/lname/mname } object or a last-name string");{const o=T(e.fname),a=T(e.mname),t=T(e.lname),r=!o&&!a&&!t&&T(e.name);if(o||a||t)d.FullName={FName:o,MName:a,LName:t};else{if(!r)throw new K("combinedSearch name requires string last name, or object with any of { fname, lname, mname }");d.LName=r}}}}else if("nameRecId"===t){const e=m(o.nameRecId??o.custId,"custId");if(!e)throw new K("combinedSearch nameRecId value missing");d.NameRecId=e}else{if("stkNo"!==t)throw new K(`Unsupported CombinedSearch kind: ${o.kind}`);{const e=m(o.stkNo??o.stock,"stkNo");if(!e)throw new K("combinedSearch stkNo value missing");d.StkNo=e}}if(1!==[d.Phone,d.LicenseNum,d.PartVIN,d.LName,d.FullName,d.NameRecId,d.StkNo].filter(Boolean).length)throw new K("combinedSearch requires exactly one search criterion");const r=T(o.make),i=T(o.model),s=T(o.year);(r||i||s)&&(d.VehData={MakePfx:r,Model:i,Year:s});const l=e({routing:a.routing,sender:{component:"Rome",task:"CVC",referenceId:"Query",creator:"RCI",senderName:"RCI"},order:"creation-bod-sender-destination"});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n {{#Phone}}{{/Phone}}\n {{#PartVIN}}{{/PartVIN}}\n {{#LicenseNum}}{{/LicenseNum}}\n {{#LName}}{{/LName}}\n {{#FullName}}\n \n {{/FullName}}\n {{#NameRecId}}{{/NameRecId}}\n {{#StkNo}}{{/StkNo}}\n \n {{#VehData}}\n \n {{/VehData}}\n \n\n',{ApplicationArea:l,...d}),routing:a.routing,envelope:a.envelope,elementName:"rey_RomeCustServVehCombReq",xsdFilename:"rey_RomeCustServVehCombReq.xsd",postParse:u}}(o,a))}async insertCustomer(o,a){return this._send(function(o,a){if(!a?.routing?.dealerNumber)throw new K("routing.dealerNumber required");const t=b(o),d=e({routing:a.routing,sender:{component:"Rome",task:"CU",referenceId:"Insert"},order:"sender-creation-bod-destination"});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n {{#C.contactInfo.Addresses}}\n \n {{/C.contactInfo.Addresses}}\n {{#C.contactInfo.Phones}}\n \n {{/C.contactInfo.Phones}}\n {{#C.contactInfo.Email}}\n \n {{/C.contactInfo.Email}}\n \n {{#C.custPersonal}}\n \n {{#BirthDates}}\n \n {{/BirthDates}}\n {{#SSNs}}\n \n {{/SSNs}}\n {{#DriverInfo}}\n \n {{/DriverInfo}}\n {{#CustChildren}}\n \n {{/CustChildren}}\n \n {{/C.custPersonal}}\n {{#C.dmsCustInfo}}\n \n {{#Followups}}\n \n {{/Followups}}\n \n {{/C.dmsCustInfo}}\n \n\n',{ApplicationArea:d,C:t}),routing:a.routing,envelope:a.envelope,postParse:R,xsdFilename:"rey_RomeCustomerInsertReq.xsd",elementName:"rey_RomeCustomerInsertReq"}}(o,a))}async updateCustomer(o,a){return this._send(function(o,a){if(!a?.routing?.dealerNumber)throw new K("routing.dealerNumber required");if(!o.nameRecId)throw new K("nameRecId or customerId required");const t=N(o.ibFlag);if("I"!==t&&"B"!==t)throw new K("ibFlag required ('I' or 'B')");const d=b(o);d.contactInfo.NameRecId=String(o.nameRecId);const r=e({routing:a.routing,sender:{component:"Rome",task:"CU",referenceId:"Update"},order:"sender-creation-bod-destination"});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n {{#C.contactInfo.Addresses}}\n \n {{/C.contactInfo.Addresses}}\n {{#C.contactInfo.Phones}}\n \n {{/C.contactInfo.Phones}}\n {{#C.contactInfo.Email}}\n \n {{/C.contactInfo.Email}}\n \n {{#C.custPersonal}}\n \n {{#BirthDates}}\n \n {{/BirthDates}}\n {{#SSNs}}\n \n {{/SSNs}}\n {{#DriverInfo}}\n \n {{/DriverInfo}}\n {{#CustChildren}}\n \n {{/CustChildren}}\n \n {{/C.custPersonal}}\n {{#C.dmsCustInfo}}\n \n {{#Followups}}\n \n {{/Followups}}\n \n {{/C.dmsCustInfo}}\n \n\n',{ApplicationArea:r,C:d}),routing:a.routing,envelope:a.envelope,postParse:R,xsdFilename:"rey_RomeCustomerUpdateReq.xsd",elementName:"rey_RomeCustomerUpdateReq"}}(o,a))}async insertServiceVehicle(o,a){return this._send(function(o={},a={}){if(!a?.routing?.dealerNumber)throw new K("routing.dealerNumber is required");const t=e({routing:a.routing,sender:a?.envelope?.sender??{component:"Rome",task:"SV",referenceId:"Insert"},creationDateTime:a?.envelope?.creationDateTime,bodId:a?.envelope?.bodId}),d=function(e={}){const o=e.vin;if(!o)throw new K("insertServiceVehicle: vin is required");const a=e.vehicleServInfo?.customerNo;if(!a)throw new K("insertServiceVehicle: vehicleServInfo.customerNo (or customerNo) is required");return{VIN:String(o).toUpperCase(),VehicleMake:e.vehicleMake||e.make,VehicleYear:String(e.year).slice(-2),MdlNo:e.mdlNo||e.modelCode||"P",ModelDesc:e.modelDesc,Carline:e.carline,ExtClrDesc:e.extClrDesc,AccentClr:e.accentClr,Aircond:e.aircond??"Y",Pwrstr:e.pwrstr??"Y",Transm:e.transm??"A",Turbo:e.turbo?"Y":"N",EngineConfig:e.engineConfig,Trim:e.trim,LicNo:e.licNo,StockID:e.stockId,CustomerNo:String(a),vehicleServInfo:{salesmanNo:e.vehicleServInfo?.salesmanNo,inServiceDate:e.vehicleServInfo?.inServiceDate?f(e.vehicleServInfo?.inServiceDate):void 0,mileage:e.vehicleServInfo?.mileage,teamCode:e.vehicleServInfo?.teamCode,productionDate:e?.productionDate?f(e.productionDate):void 0,modelMaintCode:e.modelMaintCode,vehExtWarranty:(()=>{const o=e.vehicleServInfo?.vehExtWarranty;if(!o)return;const a={contractNumber:o.contractNumber,expirationDate:o?.expirationDate?f(o.expirationDate):void 0,expirationMileage:o.expirationMileage};return Object.values(a).some(e=>null!=e&&""!==e)?a:void 0})(),advisor:(()=>{const o=e.vehicleServInfo?.advisor,a=o?.contactInfo?.nameRecId;return a?{contactInfo:{nameRecId:String(a)}}:void 0})()}}}(o);return{starXml:L.render('\n\n {{{ApplicationArea}}}\n\n \n \n \n\n \n {{#V.vehicleServInfo.vehExtWarranty}}\n \n {{/V.vehicleServInfo.vehExtWarranty}}\n\n {{#V.vehicleServInfo.advisor}}\n \n \n \n {{/V.vehicleServInfo.advisor}}\n \n\n',{ApplicationArea:t,V:d}),routing:a.routing,envelope:a.envelope,postParse:S,xsdFilename:"rey_RomeServVehicleInsertReq.xsd",elementName:"rey_RomeServVehicleInsertReq"}}(o,a))}async getAdvisors(e,o){return this._send(F(e,o))}async createRepairOrder(o,a){return this._send(function(o={},a={}){if(!a?.routing?.dealerNumber)throw new K("routing.dealerNumber required");if(!o?.customerNo)throw new K("customerNo (CustNo) required");if(!o?.departmentType)throw new K("departmentType (DeptType) required");if(!o?.vin)throw new K("vin (Vin) required");if(!o?.outsdRoNo)throw new K("outsdRoNo required");const t={customerNo:o.customerNo,advisorNo:o.advisorNo,tagNo:o.tagNo,outsdRoNo:o.outsdRoNo,departmentType:o.departmentType,vin:o.vin,mileageIn:o.mileageIn,roComment:o.roComment,estimate:o.estimate?{parts:o.estimate.parts,labor:o.estimate.labor,total:o.estimate.total}:void 0,tax:o.tax?{payType:o.tax.payType,taxCode:o.tax.taxCode,txblGrossAmt:o.tax.txblGrossAmt,grossTaxAmt:o.tax.grossTaxAmt}:void 0,rolabor:o.rolabor?{ops:o.rolabor.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,custPayTypeFlag:e.custPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrPayTypeFlag:e.warrPayTypeFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrPayTypeFlag:e.intrPayTypeFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,vlrCode:e.vlrCode,bill:e.bill?{payType:e.bill.payType,jobTotalHrs:e.bill.jobTotalHrs,billTime:e.bill.billTime,billRate:e.bill.billRate}:void 0,ccc:e.ccc?{cause:e.ccc.cause,complaint:e.ccc.complaint,correction:e.ccc.correction}:void 0,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,totalAmt:e.amount.totalAmt}:void 0}))}:void 0,ropart:o.ropart?{jobs:o.ropart.jobs?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({partNo:e.partNo,partNoDesc:e.partNoDesc,qtyOrd:e.partQty,sale:e.sale,cost:e.cost,addDeleteFlag:e.addDeleteFlag}))}))}:void 0,rogg:o.rogg?{roNo:o.rogg.roNo,ops:o.rogg.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({breakOut:e.breakOut,itemType:e.itemType,itemDesc:e.itemDesc,custQty:e.custQty,warrQty:e.warrQty,intrQty:e.intrQty,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,dlrCost:e.amount.dlrCost}:void 0}))}))}:void 0,romisc:o.romisc?{roNo:o.romisc.roNo,ops:o.romisc.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({miscCode:e.miscCode,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,codeAmt:e.codeAmt}))}))}:void 0};if(t.tax?.payType&&!["All","Cust","Intr","Warr"].includes(t.tax.payType))throw new K("tax.payType must be one of: All, Cust, Intr, Warr");if(t.rolabor?.ops?.some(e=>e.custTxblNtxblFlag&&!["T","N"].includes(e.custTxblNtxblFlag)||e.warrTxblNtxblFlag&&!["T","N"].includes(e.warrTxblNtxblFlag)||e.intrTxblNtxblFlag&&!["T","N"].includes(e.intrTxblNtxblFlag)))throw new K("Taxable flags (CustTxblNTxblFlag, WarrTxblNTxblFlag, IntrTxblNTxblFlag) must be 'T' or 'N'");if(t.rogg?.ops?.some(e=>e.lines?.some(e=>e.itemType&&!["G","P","S","F"].includes(e.itemType))))throw new K("rogg.ops.lines.itemType must be one of: G, P, S, F");const d={...a?.envelope||{},sender:{component:a?.envelope?.sender?.component??"Rome",task:a?.envelope?.sender?.task??"BSMRO",referenceId:a?.envelope?.sender?.referenceId??"Insert",creatorNameCode:a?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:a?.envelope?.sender?.senderNameCode??"RCI"}},r=e({routing:a.routing,sender:d.sender,creationDateTime:d.creationDateTime,bodId:d.bodId});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n {{#RO.roComment}}\n \n {{/RO.roComment}}\n\n {{#RO.estimate}}\n \n {{/RO.estimate}}\n\n {{#RO.tax}}\n \n {{/RO.tax}}\n \n\n {{#RO.rolabor}}\n \n {{#RO.rolabor.ops}}\n \n {{#bill}}\n \n {{/bill}}\n\n {{#ccc}}\n \n {{/ccc}}\n\n {{#amount}}\n \n {{/amount}}\n \n {{/RO.rolabor.ops}}\n \n {{/RO.rolabor}}\n\n {{#RO.ropart}}\n \n {{#RO.ropart.jobs}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.ropart.jobs}}\n \n {{/RO.ropart}}\n\n {{#RO.rogg}}\n \n {{#RO.rogg.ops}}\n \n {{#lines}}\n \n {{#amount}}\n \n {{/amount}}\n \n {{/lines}}\n \n {{/RO.rogg.ops}}\n \n {{/RO.rogg}}\n\n {{#RO.romisc}}\n \n {{#RO.romisc.ops}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.romisc.ops}}\n \n {{/RO.romisc}}\n \n\n',{ApplicationArea:r,RO:t}),routing:a.routing,envelope:d,postParse:A,xsdFilename:"rey_RomeCreateBSMRepairOrderReq.xsd"}}(o,a))}async updateRepairOrder(o,a){return this._send(function(o={},a={}){if(!a?.routing?.dealerNumber)throw new K("routing.dealerNumber required");if(!o?.finalUpdate)throw new K("finalUpdate (FinalUpdate) required");if(!["Y","N"].includes(o.finalUpdate))throw new K("finalUpdate must be 'Y' or 'N'");if(!o?.outsdRoNo)throw new K(" outsdRoNo");const t={finalUpdate:o.finalUpdate||"N",roNo:o.roNo,customerNo:o.customerNo,tagNo:o.tagNo,outsdRoNo:o.outsdRoNo,departmentType:o.departmentType,vin:o.vin,mileageIn:o.mileageIn,mileageOut:o.mileageOut,roComment:o.roComment,estimate:o.estimate?{estimateType:o.estimate.estimateType}:void 0,tax:o.tax?{payType:o.tax.payType,taxCode:o.tax.taxCode,txblGrossAmt:o.tax.txblGrossAmt,grossTaxAmt:o.tax.grossTaxAmt}:void 0,rolabor:o.rolabor?{ops:o.rolabor.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,custPayTypeFlag:e.custPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrPayTypeFlag:e.warrPayTypeFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrPayTypeFlag:e.intrPayTypeFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,vlrCode:e.vlrCode,bill:e.bill?{payType:e.bill.payType,jobTotalHrs:e.bill.jobTotalHrs,billTime:e.bill.billTime,billRate:e.bill.billRate}:void 0,ccc:e.ccc?{cause:e.ccc.cause,complaint:e.ccc.complaint,correction:e.ccc.correction}:void 0,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice}:void 0}))}:void 0,ropart:o.ropart?{jobs:o.ropart.jobs?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({partNo:e.partNo,partNoDesc:e.partNoDesc,qtyOrd:e.partQty,sale:e.sale,cost:e.cost,addDeleteFlag:e.addDeleteFlag}))}))}:void 0,rogg:o.rogg?{roNo:o.rogg.roNo,ops:o.rogg.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({breakOut:e.breakOut,itemType:e.itemType,itemDesc:e.itemDesc,custQty:e.custQty,warrQty:e.warrQty,intrQty:e.intrQty,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,dlrCost:e.amount.dlrCost}:void 0}))}))}:void 0,romisc:o.romisc?{roNo:o.romisc.roNo,ops:o.romisc.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({miscCode:e.miscCode,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,codeAmt:e.codeAmt}))}))}:void 0};if(t.tax?.payType&&!["All","Cust","Intr","Warr"].includes(t.tax.payType))throw new K("tax.payType must be one of: All, Cust, Intr, Warr");if(t.rolabor?.ops?.some(e=>e.custTxblNtxblFlag&&!["T","N"].includes(e.custTxblNtxblFlag)||e.warrTxblNtxblFlag&&!["T","N"].includes(e.warrTxblNtxblFlag)||e.intrTxblNtxblFlag&&!["T","N"].includes(e.intrTxblNtxblFlag)))throw new K("Taxable flags (CustTxblNTxblFlag, WarrTxblNTxblFlag, IntrTxblNTxblFlag) must be 'T' or 'N'");if(t.rogg?.ops?.some(e=>e.lines?.some(e=>e.itemType&&!["G","P","S","F"].includes(e.itemType))))throw new K("rogg.ops.lines.itemType must be one of: G, P, S, F");const d={...a?.envelope||{},sender:{component:a?.envelope?.sender?.component??"Rome",task:a?.envelope?.sender?.task??"BSMRO",referenceId:a?.envelope?.sender?.referenceId??"Update",creatorNameCode:a?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:a?.envelope?.sender?.senderNameCode??"RCI"}},r=e({routing:a.routing,sender:d.sender,creationDateTime:d.creationDateTime,bodId:d.bodId});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n {{#RO.roComment}}\n \n {{/RO.roComment}}\n\n {{#RO.estimate}}\n \n {{/RO.estimate}}\n\n {{#RO.tax}}\n \n {{/RO.tax}}\n \n\n {{#RO.rolabor}}\n \n {{#RO.rolabor.ops}}\n \n {{#bill}}\n \n {{/bill}}\n\n {{#ccc}}\n \n {{/ccc}}\n\n {{#amount}}\n \n {{/amount}}\n \n {{/RO.rolabor.ops}}\n \n {{/RO.rolabor}}\n\n {{#RO.ropart}}\n \n {{#RO.ropart.jobs}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.ropart.jobs}}\n \n {{/RO.ropart}}\n\n {{#RO.rogg}}\n \n {{#RO.rogg.ops}}\n \n {{#lines}}\n \n {{#amount}}\n \n {{/amount}}\n \n {{/lines}}\n \n {{/RO.rogg.ops}}\n \n {{/RO.rogg}}\n\n {{#RO.romisc}}\n \n {{#RO.romisc.ops}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.romisc.ops}}\n \n {{/RO.romisc}}\n \n\n',{ApplicationArea:r,RO:t}),routing:a.routing,envelope:d,postParse:A,xsdFilename:"rey_RomeUpdateBSMRepairOrderReq.xsd",elementName:"rey_RomeUpdateBSMRepairOrderReq"}}(o,a))}async getParts(o,a){return this._send(function(o={},a={}){const t=o.roNumber?String(o.roNumber).trim():void 0;if(!t)throw new K("getParts: roNumber required");const d=e({routing:a.routing,sender:{component:"Rome",task:"RCT",referenceId:"Query",creator:"RCI",senderName:"RCI"}});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n\n',{ApplicationArea:d,RoNumber:t}),routing:a.routing,envelope:a.envelope,xsdFilename:"rey_RomeGetPartsReq.xsd",elementName:"rey_RomeGetPartsReq",postParse:e=>function(e){return e?.rey_RomeGetPartsResp?.RoParts?.map(e=>({partNumber:M(e,"PartNumber"),partDescription:M(e,"PartDescription"),quantityOrdered:M(e,"QuantityOrdered"),quantityShipped:M(e,"QuantityShipped"),price:M(e,"Price"),cost:M(e,"Cost"),processedFlag:M(e,"ProcessedFlag"),addOrDelete:M(e,"AddOrDelete")}))||[]}(e)}}(o,a))}}const ee=[{code:"A1",display:"Anker Craft"},{code:"A2",display:"Autocar"},{code:"A3",display:"Angler"},{code:"A4",display:"Automotive Rebuilders"},{code:"A5",display:"Alphenite"},{code:"A6",display:"Aerbus"},{code:"A7",display:"Aerolite"},{code:"A8",display:"American Star"},{code:"A9",display:"Aristocrat"},{code:"AA",display:"Alumalite"},{code:"AB",display:"Aurora"},{code:"AC",display:"Acura"},{code:"ACG",display:"American Custom Golf Cars"},{code:"ACP",display:"Keystone"},{code:"ACS",display:"Access (motor home)"},{code:"AD",display:"Aro"},{code:"AD6",display:"Anderson 6 Ton Trailer"},{code:"ADL",display:"Admiral (motor home)"},{code:"ADM",display:"Adam Trailers"},{code:"ADT",display:"Advantage Trailer"},{code:"ADV",display:"Adventurous"},{code:"ADY",display:"Adly"},{code:"AE",display:"Aeromat"},{code:"AF",display:"Alfa"},{code:"AG",display:"AM General"},{code:"AH",display:"American Coach"},{code:"AI",display:"Airstream"},{code:"AJ",display:"Aljo"},{code:"AK",display:"Arrow"},{code:"AL",display:"Allegro"},{code:"ALB",display:"Albemarle"},{code:"ALI",display:"Alliance RV"},{code:"ALO",display:"Aoha (boat)"},{code:"ALS",display:"Alumascape (travel trailer)"},{code:"ALU",display:"Aluma (trailer)"},{code:"AM",display:"American Motors"},{code:"AMC",display:"Ameri-Camp (trailer)"},{code:"AN",display:"American by Cobra"},{code:"AO",display:"Apollo"},{code:"AP",display:"Alphine Light"},{code:"APP",display:"Appalachian"},{code:"AQ",display:"Augusta (airplane)"},{code:"AR",display:"Alfa Romeo"},{code:"ARG",display:"Argo"},{code:"AS",display:"Aston Martin"},{code:"ASP",display:"Aspect (motor home)"},{code:"ASV",display:"ASV"},{code:"AT",display:"Arctic Cat (ATV)"},{code:"AU",display:"Audi"},{code:"AUG",display:"Augusta (RV)"},{code:"AUW",display:"Autowares"},{code:"AV",display:"Avanti"},{code:"AVN",display:"Adventurer (motor home)"},{code:"AW",display:"Atwood"},{code:"AX",display:"Airex"},{code:"AY",display:"American Flyer"},{code:"AZ",display:"Avion"},{code:"AZU",display:"AZURE (boats)"},{code:"AZZ",display:"Avalanche"},{code:"B1",display:"Starcraft Motor Home"},{code:"B2",display:"Bicycle"},{code:"B3",display:"Big Foot"},{code:"B4",display:"Brockway Truck"},{code:"B5",display:"Beaver"},{code:"B6",display:"Shelby"},{code:"B7",display:"American Eagle"},{code:"B8",display:"Bluebird (bus)"},{code:"B9",display:"Budd Trailer"},{code:"BA",display:"Baron"},{code:"BAC",display:"Briggs Automotive Company"},{code:"BAY",display:"Bayridge"},{code:"BB",display:"Southland Rebuilders"},{code:"BBR",display:"Big Bear (motorcycle)"},{code:"BC",display:"BMW Motorcycles"},{code:"BCR",display:"Braxton Creek"},{code:"BCT",display:"Back Country"},{code:"BD",display:"Snowbird"},{code:"BE",display:"Bentley"},{code:"BEE",display:"Bee (trailer)"},{code:"BF",display:"BMW Sav"},{code:"BFE",display:"Bedford"},{code:"BG",display:"Bering Truck"},{code:"BGC",display:"Big Country (RV)"},{code:"BGH",display:"Big Horn (RV)"},{code:"BGM",display:"Barnes Distribution General Motors Dealer Equipment (GMDE)"},{code:"BGS",display:"Big Sky"},{code:"BH",display:"Boston Whaler"},{code:"BIN",display:"Bintelli"},{code:"BJ",display:"Baja"},{code:"BK",display:"Baretta (boat)"},{code:"BKN",display:"Bricklin"},{code:"BKS",display:"Black Series"},{code:"BL",display:"Bolens"},{code:"BLD",display:"Black Diamond (travel trailer)"},{code:"BLI",display:"Blizzard Manufacturing"},{code:"BLR",display:"Black Rock"},{code:"BLZ",display:"Blazer"},{code:"BM",display:"BMW"},{code:"BMC",display:"Belmont Machine (trailer)"},{code:"BN",display:"Bonnavilla"},{code:"BNC",display:"Bennche ATV"},{code:"BO",display:"Bounder"},{code:"BOB",display:"Bobcat"},{code:"BOL",display:"Bollinger Motors"},{code:"BOS",display:"Boss Hoss (motorcycle)"},{code:"BP",display:"BrightDrop"},{code:"BQ",display:"Bear Trailer"},{code:"BR",display:"Basstream"},{code:"BRK",display:"Brinkley RV"},{code:"BRS",display:"Branson"},{code:"BRU",display:"Brutus"},{code:"BRY",display:"Bryant Boats"},{code:"BS",display:"Bass Tracker"},{code:"BSP",display:"Boss Snow Plows"},{code:"BT",display:"Bertone"},{code:"BTK",display:"Buick Truck (truck)"},{code:"BU",display:"Buick"},{code:"BUG",display:"Bugatti (automobile)"},{code:"BV",display:"Beaver Coach"},{code:"BVO",display:"Bravo (electric vehicle)"},{code:"BW",display:"Bowman"},{code:"BX",display:"Boulton (power boat)"},{code:"BY",display:"Bayliner"},{code:"BZ",display:"Automate"},{code:"BZZ",display:"Berkshire"},{code:"C1",display:"Colt"},{code:"C2",display:"Companion"},{code:"C3",display:"Crestliner Boat"},{code:"C4",display:"Cobra"},{code:"C5",display:"Cordova"},{code:"C6",display:"Cruise Air"},{code:"C7",display:"Chief"},{code:"C8",display:"Challenger"},{code:"C9",display:"Conquest"},{code:"CA",display:"Caterpillar"},{code:"CAL",display:"Carrlite (Camper)"},{code:"CAM",display:"C&M"},{code:"CAZ",display:"Cazador"},{code:"CB",display:"Chalet Pop"},{code:"CC",display:"Citation"},{code:"CCI",display:"Cruise Car Inc."},{code:"CCL",display:"CT Coachworks LLC (RV)"},{code:"CD",display:"Cadillac"},{code:"CDA",display:"Coda"},{code:"CDR",display:"Crusader"},{code:"CE",display:"Chateau"},{code:"CEN",display:"Centurian"},{code:"CF",display:"Capri"},{code:"CFM",display:"CFMOTO"},{code:"CG",display:"Camplight"},{code:"CGM",display:"Campagna Motors"},{code:"CH",display:"Chrysler"},{code:"CHA",display:"Chariot (RV)"},{code:"CHI",display:"Chironex"},{code:"CIT",display:"Citroen"},{code:"CJ",display:"Coronado"},{code:"CJA",display:"CJAY"},{code:"CK",display:"Chinook"},{code:"CKM",display:"Checkmate"},{code:"CL",display:"Chilton Trailers"},{code:"CM",display:"Coachment"},{code:"CMR",display:"Cimarron"},{code:"CMT",display:"CM Trailers"},{code:"CN",display:"Catalina"},{code:"CNA",display:"CAN-AM (ATV)"},{code:"CNC",display:"C&C (horse trailer)"},{code:"CNQ",display:"Chongquing"},{code:"CO",display:"Coleman"},{code:"CP",display:"Champion"},{code:"CPN",display:"Capone (motorcycle)"},{code:"CQ",display:"Curtis Industries"},{code:"CR",display:"Cavalier Motor Home"},{code:"CRC",display:"Cricket Cart"},{code:"CRD",display:"Carado RV"},{code:"CRS",display:"Creek Side"},{code:"CRU",display:"Cruiser RV"},{code:"CRV",display:"Carver (boat)"},{code:"CS",display:"Circle J"},{code:"CSE",display:"Case"},{code:"CT",display:"Chevrolet Truck"},{code:"CTR",display:"Citecar"},{code:"CU",display:"Cummins"},{code:"CV",display:"Chevrolet"},{code:"CW",display:"Chevrolet"},{code:"CX",display:"Chapparal"},{code:"CY",display:"Celebrity"},{code:"CYA",display:"Cyclone (RV)"},{code:"CYC",display:"Cyclone"},{code:"CZ",display:"Chris Craft"},{code:"CZY",display:"Cozy Traveler"},{code:"D1",display:"Dorsey Trailer"},{code:"D2",display:"Conestoga"},{code:"D3",display:"Dreamer (5th wheel trailer)"},{code:"D4",display:"Diplomat (RV)"},{code:"D5",display:"Daewoo"},{code:"D6",display:"Ducati (motorcycle)"},{code:"D7",display:"Desperado"},{code:"D8",display:"Donzi"},{code:"D9",display:"Surf Side"},{code:"DA",display:"Daihatsu"},{code:"DAL",display:"Dallara"},{code:"DB",display:"Dazon (scooter)"},{code:"DC",display:"Cherokee"},{code:"DCM",display:"Dixie Chopper (motorcycle)"},{code:"DD",display:"Detroit Diesel"},{code:"DE",display:"Delorean"},{code:"DF",display:"Desert Fox (RV)"},{code:"DFN",display:"Defender"},{code:"DG",display:"SDG (scooter)"},{code:"DH",display:"Dynasty"},{code:"DI",display:"Discovery"},{code:"DIA",display:"Diamondback"},{code:"DIS",display:"Discover Canada"},{code:"DIV",display:"Dively"},{code:"DJ",display:"Doubletree (trailer)"},{code:"DK",display:"Duracraft (boat)"},{code:"DL",display:"Dolphin"},{code:"DLT",display:"Delta (Utility and Horse trailer)"},{code:"DM",display:"Damon"},{code:"DN",display:"Dunes Trailer"},{code:"DO",display:"Dodge"},{code:"DP",display:"Dutch Pop"},{code:"DQ",display:"Double Tree (RV)"},{code:"DR",display:"Dutch Star"},{code:"DRX",display:"Duruxx"},{code:"DS",display:"Datsun"},{code:"DT",display:"Dodge Truck"},{code:"DTM",display:"De Tomaso"},{code:"DTR",display:"Dump Trailer"},{code:"DU",display:"Dutchmen"},{code:"DUR",display:"Duroboat (boat)"},{code:"DV",display:"Dodge Van"},{code:"DW",display:"Sundowner (trailer)"},{code:"DX",display:"Dynamax"},{code:"DY",display:"Daybreak"},{code:"DYM",display:"Dymac (electric vehicle)"},{code:"DYQ",display:"Dynaquest (motor home)"},{code:"DZ",display:"Century"},{code:"E1",display:"Exiss (trailer)"},{code:"E2",display:"Bumble Bee"},{code:"E3",display:"American Trailer"},{code:"E4",display:"Clenet"},{code:"E5",display:"Coyote"},{code:"E6",display:"E-Ton"},{code:"E7",display:"Excursion (RV)"},{code:"E8",display:"Everest (RV)"},{code:"E9",display:"Chateausport"},{code:"EA",display:"Eagle"},{code:"EAR",display:"Earthbound RV"},{code:"EB",display:"Electric Bicycle"},{code:"EBB",display:"Ebbtide"},{code:"EC",display:"Executive"},{code:"ECH",display:"ECHO (ATV/util trailer)"},{code:"ECO",display:"Eco"},{code:"ED",display:"Emerald (boat)"},{code:"EDG",display:"Edge"},{code:"EE",display:"Excell (cargo trailer)"},{code:"EEE",display:"Triple E"},{code:"EF",display:"Georgetown"},{code:"EG",display:"EV Global Motors"},{code:"EGO",display:"EGO"},{code:"EH",display:"Easy Hauler"},{code:"EI",display:"express (boat)"},{code:"EJ",display:"E-Z-Go (golf cart)"},{code:"EK",display:"Elkhorn"},{code:"EL",display:"Eldorado"},{code:"ELA",display:"Electra (RV)"},{code:"ELM",display:"ELectric Last Mile Solutions Inc."},{code:"ELS",display:"Elite Suite (travel trailer)"},{code:"EM",display:"Monon"},{code:"EM",display:"Ember RV"},{code:"EN",display:"Encounter (RV)"},{code:"ENC",display:"Encore RV"},{code:"ENT",display:"Entegra RV"},{code:"ENU",display:"Endura RV"},{code:"EO",display:"Aerostar (RV)"},{code:"EP",display:"Expedition"},{code:"EPC",display:"Epic"},{code:"EQ",display:"Elite Trailer"},{code:"EQS",display:"Equispirit"},{code:"ER",display:"Raven"},{code:"ES",display:"Establishment"},{code:"ESP",display:"Eurospeed"},{code:"ET",display:"Eagle Trailer"},{code:"ETW",display:"East to West"},{code:"EU",display:"Ultra Sport"},{code:"EV",display:"Evinrude"},{code:"EVG",display:"Evergreen RV"},{code:"EVL",display:"Evolution RV"},{code:"EW",display:"EV Warrior"},{code:"EX",display:"Excalibur"},{code:"EXP",display:"Explorer (motor home)"},{code:"EY",display:"Windsong"},{code:"EZ",display:"EZ Loader"},{code:"EZG",display:"EZ GO"},{code:"EZL",display:"Ezloader (trailer)"},{code:"EZZ",display:"Elipse"},{code:"F1",display:"Flair"},{code:"F2",display:"Fold Down"},{code:"F3",display:"Flagstaff"},{code:"F4",display:"Four Seasons"},{code:"F5",display:"Fishrite"},{code:"F6",display:"4-Star (trailer)"},{code:"F7",display:"Formula"},{code:"F8",display:"Fountain"},{code:"F9",display:"Fisher"},{code:"FA",display:"Falcon"},{code:"FB",display:"Fireball (RV)"},{code:"FBC",display:"Fibro Concept"},{code:"FC",display:"Ford Commerical"},{code:"FD",display:"Ford HD Truck"},{code:"FE",display:"Ferrari"},{code:"FED",display:"Federal"},{code:"FF",display:"Fruehauf Trailer"},{code:"FG",display:"Firan (RV)"},{code:"FH",display:"Featherlite (trailer)"},{code:"FI",display:"Fiat"},{code:"FIS",display:"Fisker"},{code:"FJ",display:"Fred Jones"},{code:"FK",display:"Fifth Avenue (RV)"},{code:"FL",display:"Fleetwood (RV)"},{code:"FLO",display:"Floe (trailer)"},{code:"FM",display:"Fiberform"},{code:"FN",display:"Fan"},{code:"FNL",display:"Finish Line"},{code:"FNM",display:"Funmover"},{code:"FO",display:"Ford"},{code:"FOP",display:"Ford of Puerto Rico"},{code:"FOR",display:"Forester (motor home)"},{code:"FOX",display:"Fox Mountain RV"},{code:"FP",display:"Ford Racing Technologies"},{code:"FQ",display:"Forest River (trailer)"},{code:"FR",display:"Freightliner"},{code:"FS",display:"Fiesta"},{code:"FT",display:"Ford Truck"},{code:"FU",display:"Frontier (RV)"},{code:"FUR",display:"Fusion"},{code:"FUS",display:"Fuso"},{code:"FUT",display:"Futura"},{code:"FV",display:"Forest River"},{code:"FW",display:"Ford Wind"},{code:"FX",display:"Four Winns"},{code:"FY",display:"Felling (trailer)"},{code:"FZ",display:"Foretravel (RV)"},{code:"G1",display:"Gindy Trailer"},{code:"G2",display:"Glastron"},{code:"G3",display:"Brown Trailer"},{code:"G4",display:"Bass Cat"},{code:"G5",display:"Generation"},{code:"G6",display:"Morgan Trailers"},{code:"G7",display:"Glacier Bay"},{code:"G8",display:"Global Electric Motorcars"},{code:"G9",display:"Capacity"},{code:"GA",display:"Great Dane Trailer"},{code:"GAR",display:"Garia"},{code:"GB",display:"Georgie Boy (RV)"},{code:"GC",display:"GMC"},{code:"GCH",display:"Grech RV"},{code:"GCI",display:"Greenkraft Inc."},{code:"GD",display:"GPD - East"},{code:"GE",display:"Geo"},{code:"GEC",display:"General Coach"},{code:"GEN",display:"Hyundai"},{code:"GES",display:"Genesis Supreme RV"},{code:"GF",display:"Glendale"},{code:"GG",display:"Cameo Carriage (RV)"},{code:"GH",display:"Macgregor (sailboat)"},{code:"GI",display:"Carriage (RV)"},{code:"GJ",display:"Stellar (travel trailer)"},{code:"GJN",display:"Grand Junction"},{code:"GK",display:"Gekko"},{code:"GL",display:"Gambler"},{code:"GN",display:"Generac"},{code:"GO",display:"Grumman"},{code:"GOR",display:"Gorilla"},{code:"GP",display:"GPD - West"},{code:"GQ",display:"Trailerman (trailer)"},{code:"GR",display:"Gravely"},{code:"GRD",display:"Grand Design RV"},{code:"GS",display:"Gulfstream"},{code:"GST",display:"Grandsport (motor home)"},{code:"GT",display:"Geo Truck"},{code:"GU",display:"Malaguti (motorcycle)"},{code:"GV",display:"Godfrey (boat)"},{code:"GW",display:"White GMC Truck"},{code:"GX",display:"Great West"},{code:"GY",display:"Gindy Trailer"},{code:"GZ",display:"Gazelle"},{code:"H1",display:"Hurricane"},{code:"H2",display:"Honey"},{code:"H3",display:"Heil Trailer"},{code:"H4",display:"Coach House (RV)"},{code:"H5",display:"Harney Coachworks"},{code:"H6",display:"Hawk"},{code:"H7",display:"Hydrocat"},{code:"H8",display:"Haulmark (RV)"},{code:"H9",display:"Holmes (trailer)"},{code:"HA",display:"Hi-Light"},{code:"HAT",display:"Honda ATV"},{code:"HAU",display:"Haulin Trailer"},{code:"HB",display:"Husaberg"},{code:"HBU",display:"Hitch Buddy (towing unit)"},{code:"HC",display:"Hornet"},{code:"HD",display:"Harley Davidson"},{code:"HDO",display:"Hideout"},{code:"HE",display:"Hummer"},{code:"HF",display:"Harney Co. Operations"},{code:"HG",display:"Heritage"},{code:"HH",display:"Hino"},{code:"HHT",display:"H&H Trailer"},{code:"HI",display:"Hilo"},{code:"HJ",display:"New Holland (tractor)"},{code:"HK",display:"Hitckhiker"},{code:"HL",display:"Honda"},{code:"HLR",display:"Haul Rite"},{code:"HM",display:"Honda Motorcycle"},{code:"HMD",display:"Homemade"},{code:"HMS",display:"Homestead"},{code:"HMV",display:"Honda Multipurpose Utility Vehicle"},{code:"HN",display:"Honda Motorcycle"},{code:"HO",display:"Honda"},{code:"HOL",display:"Holland Trailer"},{code:"HOS",display:"Hoosier"},{code:"HP",display:"Honda"},{code:"HQ",display:"Hy-Line (trailer)"},{code:"HR",display:"Holiday Rambler"},{code:"HRG",display:"Highland Ridge"},{code:"HS",display:"Hydra-Sport Boats"},{code:"HSN",display:"Hisun"},{code:"HT",display:"Honda Truck"},{code:"HTG",display:"Hartland Greystone"},{code:"HTI",display:"Hitachi"},{code:"HU",display:"Husqvarna"},{code:"HUL",display:"Hull"},{code:"HV",display:"Hummer (GM Vehicle)"},{code:"HW",display:"Hawker (airplane)"},{code:"HWN",display:"Huawin"},{code:"HX",display:"Hewes (boat)"},{code:"HY",display:"Hyundai"},{code:"HYM",display:"Hymer"},{code:"HYO",display:"Hyosung Motors"},{code:"HYP",display:"Hyundai of Puerto Rico (automobile)"},{code:"HZ",display:"Horizon"},{code:"I2",display:"Clark Industrial Truck"},{code:"I3",display:"Royal International (RV)"},{code:"I4",display:"Mida Motorhome (RV)"},{code:"I5",display:"Independence (motorcycle)"},{code:"I6",display:"Sportsmaster"},{code:"I7",display:"Extreme Mega Lite (RV)"},{code:"I8",display:"Legends"},{code:"I9",display:"Pilgrim Lite (RV)"},{code:"IA",display:"Itasca"},{code:"IB",display:"Big Dog"},{code:"IC",display:"Camper"},{code:"ICA",display:"ICAMP (trailer)"},{code:"ICN",display:"Icon"},{code:"ID",display:"Indian"},{code:"IE",display:"Interstate Trailer"},{code:"IF",display:"Itasca-C"},{code:"IG",display:"Itasca-Diesel"},{code:"IH",display:"American Iron Horse"},{code:"IJ",display:"Italjet USA"},{code:"IK",display:"Innsbruck (RV)"},{code:"IL",display:"International"},{code:"IM",display:"Impulse"},{code:"IMT",display:"Iron Mountain"},{code:"IN",display:"Infiniti"},{code:"INT",display:"InTech"},{code:"INV",display:"INV1"},{code:"IO",display:"Isata (motor home)"},{code:"IP",display:"International Powersports"},{code:"IQ",display:"Sceptor (RV)"},{code:"IR",display:"Invader"},{code:"IRH",display:"Iron Horse (boat)"},{code:"IS",display:"Isuzu"},{code:"ISP",display:"Imperial Supplies"},{code:"IT",display:"Isuzu Truck"},{code:"IU",display:"Skamper Ultra (RV)"},{code:"IV",display:"Iveco"},{code:"IW",display:"W-W (trailer)"},{code:"IX",display:"Maxlite (RV)"},{code:"IY",display:"Infinity (motor home)"},{code:"IZ",display:"Zepplin (RV)"},{code:"J1",display:"Johnson (boat)"},{code:"J2",display:"Charger"},{code:"J3",display:"Charmac"},{code:"J4",display:"Jazz (motor home)"},{code:"J5",display:"Jet Trailer"},{code:"J6",display:"Tiffin (RV)"},{code:"J7",display:"JV Manufacturing (trailer)"},{code:"J8",display:"Rebel (RV)"},{code:"J9",display:"Estate (RV)"},{code:"JA",display:"Jaguar"},{code:"JB",display:"Jamboree"},{code:"JC",display:"Jetcraft"},{code:"JCL",display:"JCL"},{code:"JD",display:"John Deere"},{code:"JE",display:"Jeep"},{code:"JF",display:"Forklift (Forklift, generic)"},{code:"JG",display:"Tail-Gator (RV)"},{code:"JH",display:"Jensen-HL"},{code:"JI",display:"J.I. Case"},{code:"JJ",display:"Attitude (RV)"},{code:"JK",display:"Timberlodge (RV)"},{code:"JL",display:"Javelin"},{code:"JM",display:"Jamee"},{code:"JN",display:"Tuscany (RV)"},{code:"JNP",display:"Johnnypag (motorcycle)"},{code:"JO",display:"Sandstorm (RV)"},{code:"JP",display:"Jag (scooter)"},{code:"JQ",display:"QianJiang (scooter)"},{code:"JR",display:"Jerrdan"},{code:"JRN",display:"Journey (motor home)"},{code:"JS",display:"S&S Campers"},{code:"JT",display:"Jeep Truck"},{code:"JU",display:"Trailrider (RV)"},{code:"JV",display:"JVS (ATV)"},{code:"JW",display:"Willy (Jeep Vehicle)"},{code:"JX",display:"Extreme RV (RV)"},{code:"JY",display:"Jayco"},{code:"K-Z",display:"K-Z (trailer)"},{code:"K1",display:"Kia"},{code:"K2",display:"Kidron Trailer"},{code:"K3",display:"Kountry Comfort"},{code:"K4",display:"KTM"},{code:"K5",display:"Kountry Star"},{code:"K6",display:"Kenner"},{code:"K7",display:"Key West"},{code:"K8",display:"Kasea (minibikes)"},{code:"K9",display:"TM"},{code:"KA",display:"Kawasaki"},{code:"KAK",display:"K&K (trailer)"},{code:"KAL",display:"Kalmar Ottawa"},{code:"KAR",display:"Karma"},{code:"KAY",display:"Kayo"},{code:"KB",display:"Kubota (tractor)"},{code:"KC",display:"Cato"},{code:"KD",display:"Kodiak"},{code:"KDK",display:"Kaddy Kruiser"},{code:"KDN",display:"Kendon"},{code:"KE",display:"Skeeter"},{code:"KEV",display:"Kia EV"},{code:"KEY",display:"Keystone Autoway"},{code:"KF",display:"Kiefer (trailer)"},{code:"KG",display:"Kar Products"},{code:"KH",display:"Kachina"},{code:"KI",display:"Kit"},{code:"KIM",display:"Kimble (trailer)"},{code:"KIO",display:"Kioti"},{code:"KJ",display:"Cajun"},{code:"KK",display:"Carrera Boots"},{code:"KL",display:"Kymco (motor scooter)"},{code:"KM",display:"Komfort"},{code:"KMS",display:"Komatsu"},{code:"KMW",display:"Kimball Midwest"},{code:"KN",display:"Kountry Aire"},{code:"KND",display:"Kandi"},{code:"KNP",display:"Knapheide"},{code:"KO",display:"Koremoto (motorcycle)"},{code:"KOE",display:"Koenigsegg"},{code:"KP",display:"Composite"},{code:"KQ",display:"KZ Inc. (RV)"},{code:"KR",display:"King of the Road"},{code:"KRI",display:"Kristi (trailer)"},{code:"KRY",display:"Krystal (motor home)"},{code:"KS",display:"Kwikee Step"},{code:"KT",display:"Karavan Trailers"},{code:"KU",display:"Kent Automotive (parts master)"},{code:"KV",display:"Knight (RV)"},{code:"KW",display:"Kenworth/Peterbilt"},{code:"KWK",display:"Kwik Load"},{code:"KX",display:"Cross Country (RV)"},{code:"KY",display:"Keystone"},{code:"KYN",display:"Keystone Northpark"},{code:"KYV",display:"Keystone Vantage"},{code:"KZ",display:"Kells (sailboat)"},{code:"L1",display:"Lake Raider (RV)"},{code:"L2",display:"Load Trailer"},{code:"L3",display:"Limited"},{code:"L4",display:"Lincoln Truck"},{code:"L5",display:"Laredo"},{code:"L6",display:"Landau (boat)"},{code:"L7",display:"Laforza"},{code:"L8",display:"Lexington (motor home)"},{code:"L9",display:"Leprechaun (RV)"},{code:"LA",display:"Lancia"},{code:"LB",display:"Lawn Boy"},{code:"LBT",display:"Lambretta"},{code:"LBX",display:"Link Belt Excavators"},{code:"LC",display:"Collins (RV)"},{code:"LD",display:"Lazy Days"},{code:"LE",display:"Lexus"},{code:"LF",display:"Laforze"},{code:"LG",display:"Cross Lander (Brazil car)"},{code:"LGC",display:"Logan Coach"},{code:"LH",display:"Shore Land'r"},{code:"LI",display:"Lincoln"},{code:"LIB",display:"Liberty Outdoors"},{code:"LID",display:"Lider"},{code:"LJ",display:"Loadrite (trailer)"},{code:"LK",display:"Lufkin"},{code:"LKA",display:"Lakota"},{code:"LL",display:"Lear (airplane)"},{code:"LM",display:"Lamborghini"},{code:"LN",display:"Lance"},{code:"LND",display:"Landini"},{code:"LNH",display:"Linhai"},{code:"LNM",display:"LandMark RV"},{code:"LO",display:"Lotus"},{code:"LP",display:"Lawson Products (factory master)"},{code:"LQ",display:"Qvale"},{code:"LR",display:"Land Rover"},{code:"LRV",display:"Lifestyle Luxury RV"},{code:"LS",display:"Larson"},{code:"LSF",display:"Leisure Freedom"},{code:"LST",display:"LS Tractor"},{code:"LT",display:"Leland Trailers"},{code:"LTG",display:"Little Guy"},{code:"LTR",display:"Little River"},{code:"LU",display:"Lund"},{code:"LUC",display:"LUCID"},{code:"LV",display:"Leisure Van"},{code:"LW",display:"Lowe"},{code:"LX",display:"Las Brisas"},{code:"LY",display:"Layton"},{code:"LZ",display:"Lifan (motorcycle scooter)"},{code:"M1",display:"Moutainaire"},{code:"M2",display:"Mastercraft"},{code:"M3",display:"Mirage"},{code:"M4",display:"Marmon"},{code:"M5",display:"Monterey"},{code:"M6",display:"Mako"},{code:"M7",display:"Montana"},{code:"M8",display:"Mercedes Light Truck"},{code:"M9",display:"Malibu"},{code:"MA",display:"Mazda"},{code:"MAC",display:"Maclander"},{code:"MAD",display:"Midwest Automotive Design"},{code:"MAF",display:"Massey Ferguson (tractor/truck)"},{code:"MAG",display:"MAG (truck & van)"},{code:"MAH",display:"Mahindra"},{code:"MAR",display:"Marada (boat)"},{code:"MAS",display:"MASEA (scooter)"},{code:"MAY",display:"May (trailer)"},{code:"MB",display:"Mercedes-Benz"},{code:"MBG",display:"Modbug"},{code:"MBI",display:"Mobi"},{code:"MBS",display:"MB Sport"},{code:"MC",display:"McCulloch"},{code:"MCI",display:"Motor Coach Industries"},{code:"MCL",display:"McLaren"},{code:"MCT",display:"Mac Trailer"},{code:"MD",display:"Magirus-Deutz"},{code:"ME",display:"Mercury Truck"},{code:"MET",display:"Metropolitan"},{code:"MF",display:"Marlette"},{code:"MFM",display:"Misfit Motorcycles"},{code:"MG",display:"MG"},{code:"MGC",display:"Magic"},{code:"MH",display:"Mitsubishi Truck"},{code:"MI",display:"Mitsubishi"},{code:"MIE",display:"Miles Electric (auto)"},{code:"MJ",display:"Mobile Travel"},{code:"MK",display:"Mack Truck"},{code:"MKE",display:"Moke"},{code:"ML",display:"Mcclane"},{code:"MM",display:"Maxim"},{code:"MMR",display:"Motor Morini"},{code:"MN",display:"Montego"},{code:"MNG",display:"Mengdeli"},{code:"MNR",display:"Mountaineer"},{code:"MNT",display:"Mintaro"},{code:"MO",display:"Monaco"},{code:"MOK",display:"Moke International"},{code:"MP",display:"Markson Products"},{code:"MPR",display:"Mazda of Puerto Rico (auto)"},{code:"MQ",display:"Max"},{code:"MR",display:"Mercury"},{code:"MRL",display:"Marlon"},{code:"MS",display:"Maserati"},{code:"MSR",display:"Marshell"},{code:"MSV",display:"Mercedes Benz Van"},{code:"MT",display:"Mercedes Truck"},{code:"MTF",display:"Motofino"},{code:"MU",display:"Merkur"},{code:"MUL",display:"Mullen"},{code:"MV",display:"Mountain View"},{code:"MV1",display:"MV1"},{code:"MVA",display:"Monte Vista"},{code:"MVP",display:"MVP RV"},{code:"MW",display:"Mariah"},{code:"MX",display:"Mallard"},{code:"MXT",display:"Maxey Trailer"},{code:"MY",display:"Midas"},{code:"MYE",display:"Myers Motors (electric scooter)"},{code:"MZ",display:"Mazda Truck"},{code:"N1",display:"Country Coach (RV)"},{code:"N2",display:"Northland"},{code:"N3",display:"New Vision"},{code:"N4",display:"Newell"},{code:"N5",display:"Northern Lite"},{code:"N6",display:"Nash (RV)"},{code:"N7",display:"Northstar"},{code:"N8",display:"Alpen Coach"},{code:"N9",display:"Nitro"},{code:"NA",display:"Navistar Intl MPV"},{code:"NB",display:"MB Cruiser (RV)"},{code:"NBL",display:"Noble"},{code:"NC",display:"Motorcycle Stuff"},{code:"NCR",display:"Nucamp RV"},{code:"NCV",display:"Nissan Commercial Vehicles"},{code:"NCY",display:"North Country"},{code:"ND",display:"Nissan Diesel"},{code:"NE",display:"Neptune (RV)"},{code:"NEX",display:"Nexus RV"},{code:"NF",display:"Nitrous (RV)"},{code:"NFL",display:"New Flyer"},{code:"NG",display:"Twist - N - Go (moped)"},{code:"NH",display:"Nissan Hawaii"},{code:"NHL",display:"Nitrous Hyperlite (RV)"},{code:"NI",display:"Nissan"},{code:"NJ",display:"NRG (trailer)"},{code:"NK",display:"CornPro (trailer)"},{code:"NL",display:"National"},{code:"NLV",display:"Next Level (travel trailer)"},{code:"NM",display:"Newmar"},{code:"NML",display:"Ness Motorcycles LLC"},{code:"NN",display:"Caribbean (RV)"},{code:"NO",display:"Nomad"},{code:"NP",display:"Sandpiper"},{code:"NQ",display:"Nissan"},{code:"NR",display:"Northwood"},{code:"NRT",display:"Nortek Boats"},{code:"NS",display:"Nissan Truck"},{code:"NT",display:"Navistar Intl Truck"},{code:"NTM",display:"Norton Motorcyles"},{code:"NTR",display:"North Trail (snowmobile trailer)"},{code:"NU",display:"Newmans (trailer)"},{code:"NV",display:"VR1 (RV)"},{code:"NVN",display:"Navion"},{code:"NW",display:"Nuwa"},{code:"NX",display:"Exiss (trailer)"},{code:"NY",display:"Nicky"},{code:"NZ",display:"WVZZI (motorcycle)"},{code:"O1",display:"Contender (boat)"},{code:"O2",display:"SOA (RV)"},{code:"O3",display:"Clipper (RV)"},{code:"O4",display:"Motorrad (motorcycle)"},{code:"O5",display:"PGO (moped)"},{code:"O6",display:"Host (camper)"},{code:"O7",display:"Land Roamer (RV)"},{code:"O8",display:"Motocross (motorcycle)"},{code:"O9",display:"Aliner (RV)"},{code:"OA",display:"Catalina SOA (RV)"},{code:"OAS",display:"Oasis"},{code:"OB",display:"Brougham"},{code:"OC",display:"Columbus Motor Home"},{code:"OD",display:"Odyssey"},{code:"ODE",display:"Odes"},{code:"OE",display:"Eclipse Trailer (RV)"},{code:"OF",display:"Cypress (RV)"},{code:"OG",display:"Goshen (Truck Chassis)"},{code:"OH",display:"Honda Watercraft (watercraft)"},{code:"OI",display:"Optima (trailer)"},{code:"OK",display:"Hyundai Tire"},{code:"OL",display:"Oldsmobile"},{code:"OLK",display:"Outlook (motor home)"},{code:"OLW",display:"Outlaw (RV)"},{code:"OM",display:"Outboard Marine Corporation"},{code:"OME",display:"Omega"},{code:"ON",display:"Onan"},{code:"OP",display:"Opel"},{code:"OPE",display:"Open Range (RV)"},{code:"OPR",display:"Outpost (RV)"},{code:"OQ",display:"Lem USA (dirt bike)"},{code:"OR",display:"Open Road"},{code:"ORV",display:"Outdoor RV"},{code:"OS",display:"Oshkosh Truck"},{code:"OT",display:"Oldsmobile Truck"},{code:"OU",display:"Outback (RV)"},{code:"OUT",display:"Outcast (trailer)"},{code:"OV",display:"Lapalma Diesel (RV)"},{code:"OW",display:"Owens"},{code:"OX",display:"MotoX (motorcycle manuf.)"},{code:"OY",display:"Bad Boy (ATV)"},{code:"OZ",display:"Doolittle (trailer)"},{code:"P1",display:"Park Model"},{code:"P2",display:"Pinnacle"},{code:"P3",display:"Phantom"},{code:"P4",display:"Polini (motorcycle)"},{code:"P5",display:"Pioneeer (RV)"},{code:"P6",display:"American Performance Cycle (motorcycle)"},{code:"P7",display:"Procraft Bass Boat"},{code:"P8",display:"Playcraft (boat)"},{code:"P9",display:"Panzer (motorcycle)"},{code:"PA",display:"Pace Arrow"},{code:"PAC",display:"Pacifica (RV)"},{code:"PAG",display:"Pagani"},{code:"PAL",display:"Palomino"},{code:"PB",display:"Peterbilt"},{code:"PC",display:"Pace American"},{code:"PCE",display:"Peace"},{code:"PCT",display:"Princecraft"},{code:"PCW",display:"Pacific Coachworks"},{code:"PD",display:"Progressive Dynamic"},{code:"PDM",display:"Paradigm"},{code:"PE",display:"Peugeot"},{code:"PEV",display:"Pure EV"},{code:"PF",display:"Peak"},{code:"PFS",display:"Profusion"},{code:"PG",display:"Pug"},{code:"PH",display:"Phasar"},{code:"PHG",display:"Power House Genset"},{code:"PI",display:"Pininfarina"},{code:"PIT",display:"Pitster Pro"},{code:"PJ",display:"Pilgrim"},{code:"PJT",display:"PJ Trailers"},{code:"PK",display:"Pontiac Truck"},{code:"PKD",display:"Packard (automobile)"},{code:"PL",display:"Plymouth"},{code:"PLT",display:"Platinum Trailers"},{code:"PM",display:"Palamino"},{code:"PN",display:"Pontiac"},{code:"PNT",display:"Pontoon (boat)"},{code:"PNV",display:"Pronovost"},{code:"PO",display:"Porsche"},{code:"POG",display:"Polaris (GEM)"},{code:"POL",display:"Polestar"},{code:"POS",display:"Polaris (Snowmobile)"},{code:"PP",display:"Patriot Racing (monster trucks)"},{code:"PQ",display:"Parker (car)"},{code:"PR",display:"Prowler"},{code:"PRC",display:"Pierce Manufacturing (truck)"},{code:"PRE",display:"Prevost (motor home)"},{code:"PRL",display:"Presidential (travel trailer)"},{code:"PRQ",display:"PowerQuest"},{code:"PS",display:"Polaris"},{code:"PSI",display:"Peterson Industries"},{code:"PSP",display:"Passport (RV)"},{code:"PT",display:"Plymouth Truck"},{code:"PTM",display:"Primetime RV"},{code:"PU",display:"Pursuit"},{code:"PV",display:"Pace Vision"},{code:"PW",display:"Pleasure Way"},{code:"PWR",display:"Powerline (hauling trailer)"},{code:"PX",display:"Phoenix (RV)"},{code:"PXU",display:"Phoenix USA RV"},{code:"PY",display:"Piaggio (scooter)"},{code:"PZ",display:"Panoz"},{code:"QIY",display:"QIYE"},{code:"QLK",display:"Qlink Motor"},{code:"QS",display:"Quicksilver"},{code:"R1",display:"Radco"},{code:"R2",display:"Stingray"},{code:"R3",display:"Rollsair"},{code:"R4",display:"Coast RV"},{code:"R5",display:"Sunrader"},{code:"R6",display:"RC Willet (RV)"},{code:"R7",display:"Renegade"},{code:"R8",display:"Regal"},{code:"R9",display:"Rinker"},{code:"RA",display:"Rallye"},{code:"RAM",display:"RAM"},{code:"RB",display:"Caribou"},{code:"RC",display:"RR Custom Coach Works"},{code:"RCT",display:"Raycraft"},{code:"RD",display:"Red Max"},{code:"RDC",display:"Road Clipper (trailer)"},{code:"RDV",display:"Ridge View"},{code:"RDW",display:"Redwood"},{code:"RE",display:"Renault"},{code:"REI",display:"Reinell"},{code:"REL",display:"Redline (trailer)"},{code:"REM",display:"Remeq"},{code:"REV",display:"REV Renegade LLC"},{code:"RF",display:"Refuge"},{code:"RG",display:"Ranger"},{code:"RGY",display:"Regency"},{code:"RH",display:"Robinhood"},{code:"RI",display:"Rialta"},{code:"RIV",display:"Rivian"},{code:"RJ",display:"R-Vision"},{code:"RK",display:"Road King"},{code:"RL",display:"Read Screen-All"},{code:"RM",display:"Richmond Boats"},{code:"RN",display:"Residency"},{code:"RNT",display:"Ruff and Tuff (electric vehicle)"},{code:"RO",display:"Ranger Rover"},{code:"ROD",display:"Roadster"},{code:"ROK",display:"ROKETA (motorcycle)"},{code:"RP",display:"Revolution (RV)"},{code:"RPD",display:"R POD"},{code:"RQ",display:"Riata"},{code:"RR",display:"Rolls Royce"},{code:"RS",display:"Storm"},{code:"RSD",display:"Residence"},{code:"RSN",display:"Rossion"},{code:"RT",display:"Roadtrek"},{code:"RTR",display:"Retreat"},{code:"RTT",display:"Riverside"},{code:"RU",display:"Spectrum"},{code:"RUE",display:"Ruesch"},{code:"RV",display:"Recreational Vehicle"},{code:"RW",display:"Rockwood"},{code:"RX",display:"Rexhall"},{code:"RY",display:"Rexair RXA"},{code:"RZ",display:"Rendezvous"},{code:"RZR",display:"Razor (RV)"},{code:"S0",display:"Snow Brothers"},{code:"S1",display:"Suncrest"},{code:"S2",display:"S2 Yachts"},{code:"S3",display:"Salem"},{code:"S4",display:"Sierra"},{code:"S5",display:"Starcraft"},{code:"S6",display:"Seven Seas"},{code:"S7",display:"Shur Flo"},{code:"S8",display:"Sealand"},{code:"S9",display:"Sunchaser"},{code:"SA",display:"Saab"},{code:"SAN",display:"Sanger"},{code:"SAV",display:"Savoy (travel trailer)"},{code:"SB",display:"Sebring"},{code:"SC",display:"Sportscoach"},{code:"SCE",display:"Sceptor (RV)"},{code:"SCH",display:"Schwinn (scooter)"},{code:"SD",display:"Seabreeze"},{code:"SDN",display:"Sundance (RV)"},{code:"SE",display:"Sea-Doo"},{code:"SEA",display:"Seavee"},{code:"SEB",display:"Sea Boss (boat)"},{code:"SEF",display:"Sea Fox"},{code:"SEP",display:"Sea Pro"},{code:"SES",display:"Seaswirl (boat)"},{code:"SF",display:"Safari"},{code:"SG",display:"Silver Eagle"},{code:"SH",display:"Stihl"},{code:"SHL",display:"Show Hauler (RV)"},{code:"SI",display:"Simplicity"},{code:"SJ",display:"Sea Ray"},{code:"SJS",display:"Shejang Jmstar Shenke"},{code:"SK",display:"Ski-Doo"},{code:"SKE",display:"Skeuter (electric scooter)"},{code:"SL",display:"Sterling"},{code:"SLA",display:"Solera"},{code:"SLD",display:"Shorelander (trailer)"},{code:"SLK",display:"Sleek"},{code:"SM",display:"Suzuki"},{code:"SMC",display:"SmartCar (electric veh)"},{code:"SN",display:"Snapper"},{code:"SNU",display:"Saturn US"},{code:"SNV",display:"Sun Valley"},{code:"SO",display:"Sportsmen"},{code:"SP",display:"Suzuki MPV"},{code:"SPC",display:"Sport Chassis"},{code:"SPF",display:"Superperformance"},{code:"SPK",display:"SPYKER (sports car)"},{code:"SQ",display:"Sea Nymph"},{code:"SR",display:"Saturn"},{code:"SRS",display:"Sunray Smokey RV"},{code:"SRV",display:"Snowriver"},{code:"SS",display:"Shasta"},{code:"SSA",display:"Suckerpunch Sallys (motorcycle)"},{code:"SSR",display:"Sightseer (motor home)"},{code:"SST",display:"Slingshot"},{code:"ST",display:"Suzuki Truck"},{code:"STO",display:"Storyteller Overland"},{code:"STP",display:"Sampede (motorcycle)"},{code:"SU",display:"Subaru"},{code:"SV",display:"Sunline"},{code:"SVD",display:"Silverado"},{code:"SVL",display:"Sliver Lite (RV trailer)"},{code:"SW",display:"Southwind"},{code:"SX",display:"Starfire"},{code:"SY",display:"Skyline"},{code:"SYM",display:"SYM"},{code:"SYO",display:"Sanyo"},{code:"SZ",display:"Suzuki Motorcycle"},{code:"SZP",display:"Suzuki of Puerto Rico"},{code:"SZZ",display:"Shadow Trailer"},{code:"T1",display:"Trailmobile Trailer"},{code:"T2",display:"Trans2"},{code:"T3",display:"Tie Down"},{code:"T4",display:"Tour Master"},{code:"T5",display:"Sylvan"},{code:"T6",display:"Travel Supreme"},{code:"T7",display:"Travel Express"},{code:"T8",display:"Trade Winds"},{code:"T9",display:"Tango Boats"},{code:"TA",display:"Tiara"},{code:"TAB",display:"Tab (RV)"},{code:"TAI",display:"Taiwan (motorcycle)"},{code:"TAT",display:"Tamarack Trail"},{code:"TB",display:"Toro"},{code:"TC",display:"Travelcraft"},{code:"TD",display:"Tracker Evinrude"},{code:"TDC",display:"Tidecraft"},{code:"TE",display:"Teton"},{code:"TES",display:"Tesla"},{code:"TF",display:"Travelaire"},{code:"TFM",display:"Three Feathers Manufacturing"},{code:"TG",display:"Tioga"},{code:"TGB",display:"Taiwan Golden Bee (motorcycle)"},{code:"TH",display:"Theurer Trailer"},{code:"THR",display:"Thor Motor Coach"},{code:"TI",display:"Thor Industry"},{code:"TIG",display:"TIGE (boat)"},{code:"TIR",display:"Timber Ridge"},{code:"TJ",display:"Trail-Lite (RV)"},{code:"TJN",display:"Trojan (boat)"},{code:"TJP",display:"TJ Powersports"},{code:"TK",display:"Cadillac Truck"},{code:"TK3",display:"Take 3"},{code:"TL",display:"Tropi-Cal"},{code:"TM",display:"Travel Master"},{code:"TMC",display:"Tomcar"},{code:"TMG",display:"TMG Group"},{code:"TMS",display:"Thomas"},{code:"TMT",display:"Trailmaster (trailer)"},{code:"TN",display:"Tracker Marine"},{code:"TNG",display:"TNG"},{code:"TNK",display:"Tank (motorcycle)"},{code:"TO",display:"Toyota"},{code:"TOM",display:"Tomberlin (motor home)"},{code:"TOU",display:"Tour (motor home)"},{code:"TP",display:"Tropica"},{code:"TPT",display:"TransSport (trailer)"},{code:"TQ",display:"Tahoe Lite (GM Vehicle)"},{code:"TR",display:"Triumph"},{code:"TRA",display:"Trailer"},{code:"TRW",display:"Trail West"},{code:"TRX",display:"T-REX"},{code:"TS",display:"Tigershark"},{code:"TT",display:"Toyota Truck"},{code:"TTD",display:"Tennessee Tandem (trailer)"},{code:"TU",display:"Tradewinds"},{code:"TUN",display:"Tundra (RV)"},{code:"TV",display:"Transvan"},{code:"TW",display:"Towlt"},{code:"TX",display:"Texson"},{code:"TY",display:"Terry"},{code:"TZ",display:"Titan"},{code:"TZI",display:"Tiziani"},{code:"U1",display:"USA Motorhome"},{code:"U2",display:"Ural"},{code:"U3",display:"Ultrastar"},{code:"U4",display:"Caroline Skiff (RV)"},{code:"U5",display:"Sugar Sands"},{code:"U6",display:"Cub Cadet"},{code:"U7",display:"American Cruiser (RV)"},{code:"U8",display:"Alumaweld"},{code:"U9",display:"Toyota Marine (boat)"},{code:"UA",display:"UD"},{code:"UB",display:"Club Car (by Ingersoll Rand)"},{code:"UC",display:"Sunstar (boat)"},{code:"UD",display:"Universal Datsun"},{code:"UE",display:"Elite Motor Homes (RV)"},{code:"UF",display:"Wildcat (RV)"},{code:"UG",display:"Universal Manufacturing"},{code:"UH",display:"Heartland (Fifth Wheel)"},{code:"UI",display:"Cirrus (travel trailer)"},{code:"UJ",display:"Baxley (travel trailer)"},{code:"UK",display:"Tuckrucky"},{code:"UL",display:"Ultra"},{code:"UM",display:"Utility Master"},{code:"UN",display:"Sunrise"},{code:"UNI",display:"United Trailer"},{code:"UNM",display:"United Motors"},{code:"UO",display:"US Cargo (trailer)"},{code:"UP",display:"Parts Unlimited"},{code:"UQ",display:"Valencia (RV)"},{code:"UR",display:"Surveyor"},{code:"US",display:"Sunstream"},{code:"UT",display:"UMC Truck"},{code:"UU",display:"Sunrunner"},{code:"UV",display:"Suntracker"},{code:"UW",display:"Sunvoyager"},{code:"UX",display:"Sidekicks"},{code:"UY",display:"Sooner"},{code:"UZ",display:"Suite"},{code:"V1",display:"Caravell"},{code:"V2",display:"Sunsport (RV)"},{code:"V3",display:"Correctcraft (ski boat)"},{code:"V4",display:"Sutphen (racing boat)"},{code:"V5",display:"Bimota (motorcycle)"},{code:"V6",display:"Apache"},{code:"V7",display:"Alaskan (RV)"},{code:"V8",display:"Carrilite (RV)"},{code:"V9",display:"Ram-Lin"},{code:"VA",display:"Savanna"},{code:"VAL",display:"Valley (trailer)"},{code:"VB",display:"Vagabond"},{code:"VC",display:"Cushman"},{code:"VD",display:"Bounder Diesel"},{code:"VDH",display:"Vanderhall"},{code:"VE",display:"Vectra"},{code:"VEC",display:"Vectrix (electric vehicle)"},{code:"VEN",display:"Venture (boat)"},{code:"VF",display:"Golden Falcon"},{code:"VFS",display:"Vinfast"},{code:"VG",display:"Avenger"},{code:"VH",display:"Austin Healey"},{code:"VHP",display:"Vehicle Production Group (VPG)"},{code:"VI",display:"Vision"},{code:"VIE",display:"View (motor home)"},{code:"VIV",display:"Viva (motorcycle)"},{code:"VJ",display:"Arrow Voyager"},{code:"VK",display:"Viking"},{code:"VL",display:"Verilight"},{code:"VM",display:"Victory"},{code:"VN",display:"Spartan"},{code:"VNG",display:"Vanguard (trailer)"},{code:"VO",display:"Volvo"},{code:"VP",display:"Viper"},{code:"VPG",display:"VHPG"},{code:"VQ",display:"Coral (boat)"},{code:"VR",display:"Roseair"},{code:"VRV",display:"Vanleigh RV"},{code:"VS",display:"Seaview"},{code:"VT",display:"Volvo Truck"},{code:"VTG",display:"Vantage"},{code:"VTM",display:"Vista (motor home)"},{code:"VU",display:"Seacraft"},{code:"VV",display:"VIP (boats)"},{code:"VW",display:"Volkswagen"},{code:"VX",display:"Vespa (scooter)"},{code:"VY",display:"Voyager"},{code:"VYE",display:"Voyage (motor home)"},{code:"VZ",display:"Vogue"},{code:"W1",display:"Western Star Trucks"},{code:"W2",display:"Washbash Trailer"},{code:"W3",display:"Cascade"},{code:"W4",display:"California Motorcycle"},{code:"W5",display:"Western Recreational (RV)"},{code:"W6",display:"Weekender"},{code:"W7",display:"Windsport (RV)"},{code:"W8",display:"American White Water"},{code:"W9",display:"Weekend Warrior"},{code:"WA",display:"Wrangler"},{code:"WAA",display:"Wuxi Angell Autocycle"},{code:"WB",display:"Wet Bikes"},{code:"WC",display:"Wells Cargo"},{code:"WCC",display:"West Coast Choppers"},{code:"WD",display:"Wildwood"},{code:"WE",display:"Westport"},{code:"WF",display:"Star Flyte (RV)"},{code:"WFP",display:"Wolf Pack"},{code:"WG",display:"Wurth West (factory master)"},{code:"WGN",display:"Wagoneer"},{code:"WH",display:"White"},{code:"WHE",display:"Wheego"},{code:"WI",display:"Winnebago"},{code:"WIL",display:"Wildfire (scooter)"},{code:"WIN",display:"Winnebago of Indiana, LLC"},{code:"WIR",display:"Wind River"},{code:"WJ",display:"Wet Jets"},{code:"WK",display:"Crow (boat)"},{code:"WL",display:"Wellcraft"},{code:"WM",display:"Wanderer Trail"},{code:"WN",display:"Wilderness"},{code:"WNC",display:"Winner's Circle"},{code:"WO",display:"Walker (trailer)"},{code:"WP",display:"Honda Power Equipment"},{code:"WQ",display:"Timber Wolf (trailer)"},{code:"WR",display:"Windjammer"},{code:"WS",display:"Western Star"},{code:"WSF",display:"Westfalia"},{code:"WSP",display:"Western Snow Plows"},{code:"WT",display:"Volkswagen Truck"},{code:"WU",display:"Winzer"},{code:"WV",display:"Worldwide Volkswagen"},{code:"WW",display:"Blue Water"},{code:"WWR",display:"Warrior"},{code:"WX",display:"Watercraft"},{code:"WY",display:"Kings Highway (RV)"},{code:"WZ",display:"Whizzer"},{code:"XA",display:"Acura Service Center"},{code:"XG",display:"Genesis/Hyundai"},{code:"XH",display:"Honda Service Senter"},{code:"XI",display:"Ineos"},{code:"XLR",display:"XLR"},{code:"XWF",display:"X Wolf"},{code:"Y1",display:"Arctic Cat (Snowmobile)"},{code:"Y2",display:"American Clipper"},{code:"Y3",display:"Stoughton"},{code:"Y4",display:"Stoughton Trailer"},{code:"Y5",display:"Utility Trailer"},{code:"Y6",display:"Summerwind"},{code:"Y7",display:"Snugtop"},{code:"Y8",display:"Cigarette"},{code:"Y9",display:"Triton"},{code:"YA",display:"Yamaha"},{code:"YB",display:"Skamper"},{code:"YC",display:"Scenic Cruiser"},{code:"YD",display:"Shadow Cruiser"},{code:"YE",display:"Studebaker"},{code:"YF",display:"Sportscraft"},{code:"YG",display:"Bombardier"},{code:"YH",display:"Sea Hunt"},{code:"YI",display:"Timpte"},{code:"YJ",display:"Mobile Scout (RV)"},{code:"YK",display:"Workhorse"},{code:"YL",display:"Yacht Club Trailer"},{code:"YM",display:"Commander (boat)"},{code:"YN",display:"Aquatron"},{code:"YO",display:"Aero"},{code:"YP",display:"Banda (scooter)"},{code:"YQ",display:"Tab (trailer)"},{code:"YR",display:"Robin"},{code:"YS",display:"Yellowstone"},{code:"YT",display:"Tracker"},{code:"YU",display:"Yugo"},{code:"YV",display:"Twin Vee"},{code:"YW",display:"World Cat"},{code:"YX",display:"Mountain High Coachworks"},{code:"YY",display:"SS"},{code:"YZ",display:"Transcraft"},{code:"Z1",display:"Craig Catamaran"},{code:"Z2",display:"Sportsmobile"},{code:"Z3",display:"Crown Line"},{code:"Z4",display:"Ski Centurion"},{code:"Z5",display:"Aro (Automobile)"},{code:"Z6",display:"Alpha Gold (5th wheel trailer)"},{code:"Z7",display:"Cobalt"},{code:"Z8",display:"Supra"},{code:"Z9",display:"Skamper Lite (trailer)"},{code:"ZA",display:"Stealth"},{code:"ZAA",display:"DeSoto"},{code:"ZAP",display:"Zap (electric scooter)"},{code:"ZB",display:"Mercury"},{code:"ZC",display:"Smoker Craft"},{code:"ZD",display:"Springdale"},{code:"ZE",display:"Alpine Coach"},{code:"ZEN",display:"ZENN (cars)"},{code:"ZF",display:"Monark"},{code:"ZG",display:"Harriskayot"},{code:"ZGR",display:"Zinger"},{code:"ZH",display:"Seahwak"},{code:"ZI",display:"Zimmer"},{code:"ZJ",display:"Cedar Creek"},{code:"ZK",display:"Kenworth"},{code:"ZL",display:"Marlin (motor home)"},{code:"ZM",display:"Zieman (trailer)"},{code:"ZN",display:"Sprinter"},{code:"ZNG",display:"Zingo (motorcycle)"},{code:"ZNS",display:"Zongshen"},{code:"ZO",display:"Tahoe (GM Vehicle)"},{code:"ZOM",display:"Zoom"},{code:"ZP",display:"Campion"},{code:"ZQ",display:"Aztec"},{code:"ZR",display:"Cardinal"},{code:"ZRO",display:"Zero Motorcyles"},{code:"ZS",display:"Steiner"},{code:"ZT",display:"Concourse"},{code:"ZU",display:"Ski Supreme"},{code:"ZV",display:"Miscellaneous"},{code:"ZW",display:"Miscellaneous W"},{code:"ZX",display:"Miscellaneous X"},{code:"ZY",display:"Miscellaneous Y"},{code:"ZZ",display:"Other Make"},{code:"ZZA",display:"Autumn Ridge"},{code:"ZZL",display:"DRV Luxury Suites"},{code:"ZZS",display:"Shockwave Toy Hauler"},{code:"ZZV",display:"VIA"},{code:"ZZX",display:"Four Winds"},{code:"ZZY",display:"TOPO"},{code:"ZZZ",display:"Alpine"}],oe=(e="")=>String(e).toLowerCase().replace(/[^a-z0-9]+/g," ").trim(),ae=e=>{if(!e)return null;const o=oe(e);return o.includes("truck")?"truck":o.includes("van")?"van":o.includes("rv")||o.includes("motor home")||o.includes("motorhome")||o.includes("coach")?"rv":o.includes("trailer")||o.includes("5th wheel")||o.includes("fifth wheel")?"trailer":o.includes("scooter")?"scooter":o.includes("motorcycle")||o.includes("bike")?"motorcycle":o.includes("atv")?"atv":o.includes("snowmobile")?"snowmobile":o.includes("boat")||o.includes("watercraft")?"boat":o},te=ee.map(e=>{const{base:o,typeHint:a}=(e=>{const o=e.match(/^(.+?)\s*\((.+)\)\s*$/);return o?{base:oe(o[1]),typeHint:o[2]}:{base:oe(e),typeHint:null}})(e.display);return{...e,_base:o,_normType:ae(a)}}),de=new Map;for(const e of te){const o=de.get(e._base)||[];o.push(e),de.set(e._base,o)}const re=e=>{const o=oe(e);if(!o)return null;const a=de.get(o);if(a&&a.length)return(e=>{if(!e||!e.length)return null;let o=e.find(e=>!e._normType);return o||(o=e.find(e=>"rv"===e._normType),o||e[0])})(a);let t=null;for(const e of te){const a=e._base;if(a===o)return e;(a.startsWith(o)||o.startsWith(a))&&(!t||a.length{if(!e)return null;const a=oe(e),t=oe(o),d=o?((e,o)=>{const a=oe(e),t=oe(o);return a&&t&&ie.find(e=>{const o=[e.make,...e.makeAlt||[]].filter(Boolean).some(e=>oe(e)===a),d=oe(e.type)===t;return o&&d})||null})(e,o):null;if(d){const e=ne(d.code);if(e)return e}if(t){const e=ie.find(e=>oe(e.make)===a&&oe(e.type)===t);if(e)return ne(e.code)}if(t){const a=re(`${e} ${o}`);if(a)return a;const t=re(`${o} ${e}`);if(t)return t}return re(e)},le=(e,o)=>{if(!e)return null;if("string"==typeof e){const a=e;return o?se(a,o):re(a)}if("object"==typeof e){const{make:o,type:a}=e;return o?a?se(o,a):re(o):null}return null},ne=e=>{if(!e)return null;const o=e.toUpperCase();return te.find(e=>e.code===o)||null};export{te as ENTRIES,ee as RAW_ENTRIES,z as RRClient,Z as errors,ne as getEntryByCode,re as lookupByMake,se as lookupByMakeAndType,le as lookupVehicleMake}; +function e({routing:e={},sender:o={},creationDateTime:a,bodId:t}={}){const d={Sender:{Component:o.component??"Rome",Task:o.task??"CU",ReferenceId:o.referenceId??"Query",CreatorNameCode:o.creator??"RCI",SenderNameCode:o.senderName??"RCI"},CreationDateTime:a??(new Date).toISOString().replace(/\.\d{3}Z$/,"Z"),BODId:t??k(),Destination:{DestinationNameCode:"RR",DealerNumber:e.dealerNumber||"",StoreNumber:e.storeNumber||"",AreaNumber:e.areaNumber||""}},r={bod:"{{#BODId}}{{BODId}}{{/BODId}}",creation:"{{CreationDateTime}}",sender:"\n \n {{Sender.Component}}\n {{Sender.Task}}\n {{#Sender.ReferenceId}}{{Sender.ReferenceId}}{{/Sender.ReferenceId}}\n {{#Sender.CreatorNameCode}}{{Sender.CreatorNameCode}}{{/Sender.CreatorNameCode}}\n {{#Sender.SenderNameCode}}{{Sender.SenderNameCode}}{{/Sender.SenderNameCode}}\n ".trim(),dest:"\n \n {{Destination.DestinationNameCode}}\n {{#Destination.DealerNumber}}{{Destination.DealerNumber}}{{/Destination.DealerNumber}}\n {{#Destination.StoreNumber}}{{Destination.StoreNumber}}{{/Destination.StoreNumber}}\n {{#Destination.AreaNumber}}{{Destination.AreaNumber}}{{/Destination.AreaNumber}}\n ".trim()},i=`\n${["bod","creation","sender","dest"].map(e=>r[e]).join("\n")}\n`;return L.render(i,d).trim()}function o(e,o=2){const a=" ".repeat(o);return String(e).split("\n").map(e=>e.length?a+e:e).join("\n")}function a(e){return String(e??"").replace(/&/g,"&").replace(//g,">")}function t(e,o){if(null==e)return null;if(Array.isArray(e)){for(const a of e){const e=t(a,o);if(null!=e)return e}return null}if("object"!=typeof e)return null;for(const[a,d]of Object.entries(e)){if(o(a,d))return d;const e=t(d,o);if(null!=e)return e}return null}function d(e,o,a=[]){if(null==e)return a;if(Array.isArray(e)){for(const t of e)d(t,o,a);return a}if("object"!=typeof e)return a;for(const[t,r]of Object.entries(e))o(t,r)&&a.push(r),d(r,o,a);return a}function r(e){return null==e?[]:Array.isArray(e)?e:[e]}function i(e,o){if(e&&"object"==typeof e)return function(e){if(null!=e)return"string"==typeof e||"number"==typeof e||"boolean"==typeof e?String(e):"object"==typeof e&&"#text"in e?String(e["#text"]):void 0}(e[o])}function s(e,o){const a=i(e,o);if(J(a))return a;const t=function(e,o){if(e&&"object"==typeof e)return e.$&&J(e.$[o])?e.$[o]:J(e[`@_${o}`])?e[`@_${o}`]:J(e[`@${o}`])?e[`@${o}`]:e._attributes&&J(e._attributes[o])?e._attributes[o]:e.attributes&&J(e.attributes[o])?e.attributes[o]:void 0}(e,o);return J(t)?t:void 0}function l(e,o){if(e&&"object"==typeof e)return null!=e[`@_${o}`]?e[`@_${o}`]:void 0}function n(e){if(null!=e){if("string"==typeof e)return e;if("number"==typeof e)return String(e);if("object"==typeof e){if(null!=e._)return String(e._);if(null!=e["#text"])return String(e["#text"]);if(null!=e.text)return String(e.text)}}}function c(e){return d(e,e=>/(GenTransStatus|TransStatus)$/i.test(e)).flatMap(r)[0]}function p(e){if(e)return{status:(l(e,"Status")||e.Status||n(e)||"").toString().trim()||void 0,statusCode:(l(e,"StatusCode")||e.StatusCode||"").toString().trim()||void 0,message:e.Message&&n(e.Message)||e.GenTransStatus&&n(e.GenTransStatus)||e.TransStatus&&n(e.TransStatus)||n(e)||void 0}}function y(e){if(e)return{status:(l(e,"Status")||e.Status||n(e)||"").toString().trim()||void 0,date:(l(e,"Date")||e.Date||"").toString().trim()||void 0,time:(l(e,"Time")||e.Time||"").toString().trim()||void 0,outsdRoNo:(l(e,"OutsdRoNo")||e.OutsdRoNo||"").toString().trim()||void 0,dmsRoNo:(l(e,"DMSRoNo")||e.DMSRoNo||"").toString().trim()||void 0,errorMessage:(l(e,"ErrorMessage")||e.ErrorMessage||"").toString().trim()||void 0}}function u(e){const o=e?.rey_RomeCustServVehCombRes??e?.rey_RomeCustServVehCombReq??e?.rey_RomeCustServVehComb??e??{};return r(o?.CustServVehComb??o?.CustServVehCombRes??o?.CustServVehCombReq??o).map(e=>{const o=e?.NameContactId??void 0,a=o?.NameId??void 0,t=a?.IndName?j(a.IndName):void 0,d=a?.BusName?j(a.BusName):void 0,i=o&&{NameId:a&&{...j(a)||{},...t?{IndName:t}:{},...d?{BusName:d}:{}},Address:r(o?.Address).map(e=>j(e)||{}),ContactOptions:r(o?.ContactOptions).map(e=>j(e)||{}),Phone:r(o?.Phone).map(e=>j(e)||{}),Email:r(o?.Email).map(e=>j(e)||{})},s=r(e?.ServVehicle).map(e=>{const o=e?.Vehicle,a=o?.VehicleDetail,t=o&&{...j(o)||{},...a?{VehicleDetail:j(a)||{}}:{}},d=e?.VehicleServInfo,i=d?.VehExtWarranty,s=d?.Advisor,l=s?.ContactInfo;let n;s&&(n={...j(s)||{},...l?{ContactInfo:j(l)||{}}:{}});const c=d&&{...j(d)||{},...i?{VehExtWarranty:j(i)||{}}:{},...n?{Advisor:n}:{},...d?.VehServComments?{VehServComments:r(d.VehServComments).map(e=>Q(e)).filter(e=>null!=e&&""!==String(e).trim())}:{}};return{...t?{Vehicle:t}:{},...c?{VehicleServInfo:c}:{}}}),l=r(e?.Message).map(e=>{const o=Q(e);return{...j(e)||{},...null!=o&&""!==String(o).trim()?{Text:o}:{}}}).filter(e=>Object.keys(e).length>0),n={};return i&&(n.NameContactId=i),s.length&&(n.ServVehicle=s),l.length&&(n.Message=l),n})}function m(e,o){if(null!=e)return String("string"==typeof e||"number"==typeof e?e:e[o]||"")}function T(e){return String(e??"").trim()||void 0}function C(e,...o){if(e)for(const a of o){if(e.$&&null!=e.$[a])return e.$[a];if(null!=e[`@_${a}`])return e[`@_${a}`];if(null!=e[a]&&"object"!=typeof e[a])return e[a]}}function R(e){const o=function(e){const o=t(e,e=>"rey_RomeCustomerResponse"===e||e.endsWith(":rey_RomeCustomerResponse"));return o?d(o,e=>"TransStatus"===e||e.endsWith(":TransStatus")).flatMap(r)[0]:void console.log("No rey_RomeCustomerResponse found in root")}(e);if(!o)return{dmsRecKey:void 0};const a=C(o,"DMSRecKey");return{dmsRecKey:null!=a?String(a):void 0,status:C(o,"Status"),statusCode:C(o,"StatusCode")}}function g(e){if(null==e)return;const o=String(e).toUpperCase().replace(/[^A-Z0-9 ]+/g,"");if(!o)throw new K(`Invalid string: ${e}. Must contain A-Z, 0-9, or space`);return o}function N(e){return e?String(e).toUpperCase():void 0}function b(e={}){const o=N(e.ibFlag)||(e.firstName?"I":"B");if("I"!==o&&"B"!==o)throw new K("ibFlag must be 'I' or 'B'");const a=e.lastName||e.customerName;if(!a)throw new K("lastName or customerName required");if("I"===o&&!e.firstName)throw new K("firstName required when ibFlag='I'");const t=N(e.customerType),d="RETAIL"===t?"R":"WHOLESALE"===t?"W":"INTERNAL"===t?"I":t;if(d&&!["R","W","I"].includes(d))throw new K("customerType must be 'R', 'W', 'I', Retail, Wholesale, or Internal");const r=(e.addresses||[]).map(e=>{const o={Type:N(e.type)||"P",Addr1:e.line1?String(e.line1):void 0,Addr2:e.line2?String(e.line2):void 0,City:e.city?String(e.city):void 0,State:e.state?String(e.state):void 0,Zip:e.postalCode?String(e.postalCode):void 0,County:e.county?String(e.county):void 0,Country:e.country?String(e.country):void 0};if(!o.Addr1)throw new K("Address requires line1");return o}),i=(e.phones||[]).map(e=>{const o={Type:N(e.type)||"H",Num:e.number?String(e.number):void 0,Ext:e.extension?String(e.extension):void 0};if(!o.Num)throw new K("Phone requires number");return o}),s=e.emails?.[0]?.address?{MailTo:String(e.emails[0].address)}:void 0,l=e.personal,n=l?{Gender:N(l.gender),OtherName:g(l.otherName),AnniversaryDate:l.anniversaryDate?String(l.anniversaryDate):void 0,EmployerName:g(l.employerName),EmployerPhone:l.employerPhone?String(l.employerPhone):void 0,Occupation:g(l.occupation),OptOut:l.optOut?String(l.optOut):void 0,OptOutUse:l.optOutUse?String(l.optOutUse):void 0,BirthDates:(l.birthDates||[]).map(e=>({Type:N(e.type)||"P",date:e.date?String(e.date):void 0})).filter(e=>e.date),SSNs:(l.ssns||[]).map(e=>({Type:N(e.type)||"P",ssn:e.ssn?String(e.ssn):void 0})).filter(e=>e.ssn),DriverInfo:l.driver?[{Type:N(l.driver.type)||"P",LicNum:l.driver.licenseNumber?String(l.driver.licenseNumber):void 0,LicState:l.driver.licenseState?String(l.driver.licenseState):void 0,LicExpDate:l.driver.licenseExpDate?String(l.driver.licenseExpDate):void 0}].filter(e=>e.LicNum):void 0,CustChildren:(l.children||[]).map(e=>({ChildName:g(e.name)})).filter(e=>e.ChildName)}:void 0,c=e.dms,p=c?{TaxExemptNum:c.taxExemptNum?String(c.taxExemptNum):void 0,SalesTerritory:c.salesTerritory?String(c.salesTerritory):void 0,DeliveryRoute:c.deliveryRoute?String(c.deliveryRoute):void 0,SalesmanNum:c.salesmanNum?String(c.salesmanNum):void 0,LastContactMethod:c.lastContactMethod?String(c.lastContactMethod):void 0,Followups:(c.followups||[]).map(e=>({Type:N(e.type),Value:N(e.value)})).filter(e=>e.Type&&e.Value)}:void 0;return{custCateg:d||"R",createdBy:e.createdBy?String(e.createdBy):void 0,contactInfo:{IBFlag:o,LastName:g(a),FirstName:g(e.firstName),MidName:g(e.midName),Salut:g(e.salut),Suffix:g(e.suffix),Addresses:r,Phones:i,Email:s},custPersonal:n,dmsCustInfo:p}}function S(e){const o=t(e,e=>"rey_RomeServVehicleInsertResponse"===e||e.endsWith(":rey_RomeServVehicleInsertResponse"))||e,a=t(o,e=>"GenTransStatus"===e||e.endsWith(":GenTransStatus"));return{status:a?s(a,"Status"):void 0,statusCode:a?s(a,"StatusCode"):void 0}}function f(e){if(!e)return;let o;if(e instanceof Date)o=e;else if("string"==typeof e){const a=e.trim();if(/^\d{1,2}\/\d{1,2}\/\d{4}$/.test(a))return a;if(/^\d{4}-\d{2}-\d{2}/.test(a)){const[e,t,d]=a.split("T")[0].split("-");o=new Date(Number(e),Number(t)-1,Number(d))}else o=new Date(a)}else o=new Date(e);if(isNaN(o?.getTime()))throw new K(`Invalid date provided: ${e}`);return`${String(o.getMonth()+1).padStart(2,"0")}/${String(o.getDate()).padStart(2,"0")}/${o.getFullYear()}`}function h(e,o){const a=Array.isArray(o)?o.map(e=>e.toLowerCase()):[String(o).toLowerCase()],t=[e];for(;t.length;){const e=t.pop();if($(e))for(const o of Object.keys(e)){const d=e[o],r=q(o).toLowerCase();if(a.includes(r))return d;if($(d))t.push(d);else if(Array.isArray(d))for(const e of d)$(e)&&t.push(e)}}}function x(e,o){if(e&&$(e)){if(null!=e.$?.[o])return e.$[o];if(null!=e[`@${o}`])return e[`@${o}`];if(null!=e[`@_${o}`])return e[`@_${o}`]}}function A(e){if(null!=e){if("string"==typeof e)return e;if("number"==typeof e)return String(e);if($(e)){if(null!=e._)return String(e._);if(null!=e["#text"])return String(e["#text"]);if(null!=e.text)return String(e.text)}}}function P(e){const o=h(e,["CreateBSMRepairOrderResp","UpdateBSMRepairOrderResp"])||e,a=h(o,"RoRecordStatus")||{};return{status:x(a,"Status")||A(h(a,"Status")),date:x(a,"Date")||A(h(a,"Date")),time:x(a,"Time")||A(h(a,"Time")),outsdRoNo:x(a,"OutsdRoNo")||A(h(a,"OutsdRoNo")),dmsRoNo:x(a,"DMSRoNo")||A(h(a,"DMSRoNo")),errorMessage:x(a,"ErrorMessage")||A(h(a,"ErrorMessage"))}}function F(o={},a={}){const t=function(e){if(!e)throw new Error("department is required (S, P, B, SERVICE, PARTS, BODY)");const o=String(e).trim().toUpperCase();if("S"===o||"P"===o||"B"===o)return o;if("SERVICE"===o)return"S";if("PART"===o||"PARTS"===o)return"P";if("BODY"===o||"BODYSHOP"===o||"BODY SHOP"===o)return"B";throw new Error(`Invalid department: ${e}. Must be S, P, B, SERVICE, PARTS, BODY, BODYSHOP, or BODY SHOP`)}(o.department),d=o.advisorNumber?String(o.advisorNumber).trim():void 0,r=e({routing:a.routing,sender:a?.envelope?.sender,creationDateTime:a?.envelope?.creationDateTime,bodId:a?.envelope?.bodId});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n \n\n',{ApplicationArea:r,DepartmentType:t,AdvisorNumber:d}),routing:a.routing,envelope:a.envelope,xsdFilename:"rey_RomeGetAdvisorsReq.xsd",elementName:"rey_RomeGetAdvisorsReq",postParse:e=>function(e,o={}){const a=o?.department;var t;return(e=>{const o=e?.Advisor;return o?Array.isArray(o)?o:[o]:[]})((t=e,t?.rey_RomeGetAdvisorsResp??t??{})).map(e=>({advisorId:X(e,"AdvisorNumber"),firstName:X(e,"FirstName"),lastName:X(e,"LastName"),department:a}))}(e,{department:t})}}function v(e){return null==e?void 0:String(e)}function M(e,o){if(e)return null!=e[o]?"object"!=typeof e[o]?v(e[o]):v(e[o]["#text"]):null!=e[`@_${o}`]?v(e[`@_${o}`]):void 0}function O(e){const o=e?.meta?.statusBlocks?.transaction?.message;if(o)return String(o);return String((e?.meta?.status?.Message??e?.meta?.status?.message)||e?.message||"")}function I(e,o){return Math.min(1e4,e*Math.pow(2,o))}function V(e){return e+Math.floor(250*Math.random())}function D(e){return new Promise(o=>setTimeout(o,e))}function w(e){return/lock|in use|record.*busy/i.test(String(e||""))}function E(e,o="****"){if(!e||"string"!=typeof e)return e;let a=e;return a=a.replace(/(]*>)([^<]*)(<\/wsse:Username>)/gi,`$1${o}$3`),a=a.replace(/(]*>)([^<]*)(<\/wsse:Password>)/gi,`$1${o}$3`),a}import L from"mustache";import{v4 as k}from"uuid";import{create as B}from"xmlbuilder2";import G from"axios";import{XMLParser as H}from"fast-xml-parser";class W extends Error{constructor(e,o={}){super(e),this.name="RRTransportError",this.meta=o}}class U extends Error{constructor(e,o={}){super(e),this.name="RRVendorStatusError",this.meta=o,this.retryable=!!o.retryable}}class K extends Error{constructor(e,o={}){super(e),this.name="RRValidationError",this.meta=o}}const Z=Object.freeze({__proto__:null,RRTransportError:W,RRVendorStatusError:U,RRValidationError:K}),Y={info:(...e)=>console.log("[rr-rome]",...e),warn:(...e)=>console.warn("[rr-rome]",...e),error:(...e)=>console.error("[rr-rome]",...e),debug:(...e)=>{process.env.RR_DEBUG&&console.log("[rr-rome][debug]",...e)}},J=e=>null!=e&&""!==String(e).trim(),_=new H({ignoreAttributes:!1,attributeNamePrefix:"@_",parseAttributeValue:!1,parseTagValue:!1,isArray:e=>["Advisor"].includes(e)}),j=e=>{if(!e||"object"!=typeof e)return;const o={};for(const[a,t]of Object.entries(e))a.startsWith("@_")&&(o[a.slice(2)]=t);return Object.keys(o).length?o:void 0},Q=e=>{if(null!=e)return"string"==typeof e?e:e["#text"]},q=e=>{if("string"!=typeof e)return"";let o=e.includes("}")?e.split("}").pop():e;return o=o.includes(":")?o.split(":").pop():o,o.startsWith("rey_")&&(o=o.slice(4)),o},$=e=>e&&"object"==typeof e&&!Array.isArray(e),X=(e,o)=>((e,o)=>e?.[`@_${o}`])(e,o)??i(e,o);class z{constructor(e){if(!e?.baseUrl)throw new Error("RRClient requires baseUrl");if(!e?.username)throw new Error("RRClient requires username");if(!e?.password)throw new Error("RRClient requires password");this.cfg={wssePasswordType:"Text",timeoutMs:3e4,logger:Y,retries:{max:3},...e},this.mask={password:!0}}async _send(e){const{starXml:t,routing:i,envelope:s,postParse:u}=e,m=this.cfg.logger||Y,{bodId:T,creationDateTime:C,sender:R}=function(e){return{bodId:e?.bodId||k(),creationDateTime:e?.creationDateTime||new Date,sender:e?.sender||{}}}(s),g=function({username:e,password:t,wssePasswordType:d="Text",starContentXml:r,normalize:i=!0,normalizeOptions:s}={}){const l=function(e){return`\n \n \n \n${o(e,10)}\n \n \n \n `.trim()}(r),n=`\n \n \n${o(function(e,o,t){const d="Digest"===t?' Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"':' Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"';return`\n \n \n ${a(e)}\n ${a(o)}\n \n \n `.trim()}(e,t,d),8)}\n \n \n${o(l,8)}\n \n \n `.trim();return i?function(e,{prettyPrint:o=!0}={}){if(!e||"string"!=typeof e)return e;try{return B(e).end({prettyPrint:o,width:0,indent:" ",newline:"\n"}).trim()}catch(o){return String(e).trim()}}(n,s):n}({username:this.cfg.username,password:this.cfg.password,wssePasswordType:this.cfg.wssePasswordType||"Text",routing:i,sender:R,creationDateTime:(b=C,"string"==typeof b?b:(b instanceof Date?b:new Date).toISOString().replace(/\.\d{3}Z$/,"Z")),bodId:T,starContentXml:t}),N=E(g);var b;"1"===process.env.RR_DUMP_ENVELOPE&&console.log(`[rr] Soap envelope about to send (${e?.elementName}): \n`+N+"\n");const S=async()=>{const o=await async function({baseUrl:e,envelopeXml:o,timeoutMs:a=3e4,logger:t}){try{const t=await G.post(e,o,{timeout:a,headers:{"Content-Type":"text/xml; charset=utf-8",SOAPAction:"http://www.starstandards.org/webservices/2005/10/transport/ProcessMessage"},responseType:"text",validateStatus:()=>!0});if(t.status>=200&&t.status<300)return String(t.data??"");throw new W(`HTTP ${t.status}: ${function(e){const o=String(e??"");return o.length>1024?o.slice(0,1024)+"…":o}(t.data)}`,{status:t.status,body:t.data})}catch(e){if(G.isAxiosError(e))throw new W(`Network error: ${e.message}`,{cause:e});throw e}}({baseUrl:this.cfg.baseUrl,envelopeXml:g,timeoutMs:this.cfg.timeoutMs,logger:m}),a=function(e){const o=_.parse(e),a=o?.Envelope||o?.["soapenv:Envelope"]||o,t=a?.Body||a?.["soapenv:Body"]||a?.["S:Body"]||a?.["soap:Body"],d=t?.ProcessMessageResponse||t?.["ns2:ProcessMessageResponse"]||t?.["trans:ProcessMessageResponse"]||t,r=d?.payload||d?.["ns2:payload"]||d;return r?.content||r?.["ns2:content"]||r}(o),t=E(o),i=function(e){const o=c(e),a=d(e,e=>/RoRecordStatus$/i.test(e)).flatMap(r)[0];return{transaction:p(o),roRecord:y(a)}}(a),s=function(e){const o=String("ApplicationArea").toLowerCase(),a=[e];for(;a.length;){const e=a.pop();if(e&&"object"==typeof e)for(const[t,d]of Object.entries(e)){if(t.toLowerCase().endsWith(o))return d;d&&"object"==typeof d&&a.push(d)}}}(a),{status:T,norm:C}=function(e){const o=c(e)||d(e,e=>/Status$/i.test(e)).flatMap(r)[0]||{},a=(l(o,"Status")||o.Status||"").toString().trim();let t=(l(o,"StatusCode")||o.StatusCode||"").toString().trim();const i=o.Message&&n(o.Message)||n(o)||"";!t&&/success/i.test(a)&&(t="0");const s=Number(t);let p="FAIL";return/success/i.test(a)||0===s?p="SUCCESS":2!==s&&213!==s||(p="NO_MATCH"),{status:{Status:a,StatusCode:t,Message:i},norm:{kind:p,code:Number.isFinite(s)?s:void 0,message:i}}}(a);if("1"===process.env.RR_DUMP_STATUS&&(console.log("[rr] Status blocks:"),console.dir(i,{depth:null,colors:!0})),"1"===process.env.RR_DUMP_APPLICATION&&(console.log("[rr] ApplicationArea:"),console.dir(s,{depth:null,colors:!0})),"FAIL"===C.kind){const e=T?.StatusCode;throw new U(`Vendor status failure: ${e??""} ${T?.Message||T?.["#text"]||""}`.trim(),{status:T,reqXml:N,requestXml:N,resXml:t})}const R={success:"SUCCESS"===C.kind||"NO_MATCH"===C.kind,statusBlocks:i,applicationArea:s,xml:{request:N,response:t},parsed:a};if("function"==typeof u)try{R.data=u(a)}catch(e){m?.warn?.(`postParse failed: ${e?.message||e}`)}return"1"===process.env.RR_DUMP_XML&&console.log(`[rr] Full response XML (${e?.elementName}):\n`+t+"\n"),R?.data&&"1"===process.env.RR_DUMP_DATA&&(console.log(`[rr] Parsed response data (${e?.elementName}):\n`),console.dir(R.data,{depth:null,colors:!0})),R};try{return await async function(e,{max:o=3,logger:a}){let t,d=0;for(;d=o)break;const i=V(I(400,d));a?.warn?.(`Retrying attempt ${d}/${o} in ${i}ms: ${e.message}`),await D(i)}throw t}(S,{max:this.cfg.retries?.max??3,logger:m})}catch(e){if(e instanceof W||e instanceof U)throw e;throw new W(`Unexpected error: ${e?.message||e}`,{cause:e})}}async combinedSearch(o,a){return this._send(function(o={},a={}){if(!o||"object"!=typeof o)throw new K("combinedSearch requires a query object");const t=function(e){if(!e)return"";const o=String(e).trim().toLowerCase();return"telephone"===o?"phone":"lic"===o||"plate"===o?"license":"vin"===o||"partvin"===o?"vin":"name"===o?"name":"namerecid"===o||"custid"===o?"nameRecId":"stkno"===o||"stock"===o?"stkNo":o}(o.kind),d={MaxRecs:Math.min(Number(o.maxResults||o.maxRecs||50),50)};if("phone"===t){const e=m(o.phone,"phone");if(!e)throw new K("combinedSearch phone value missing");d.Phone=e}else if("license"===t){const e=m(o.license,"license");if(!e)throw new K("combinedSearch license value missing");d.LicenseNum=e}else if("vin"===t){const e=m(o.vin,"vin");if(!e)throw new K("combinedSearch vin value missing");d.PartVIN=e}else if("name"===t){const e=o.name;if("string"==typeof e){const o=e.trim();if(!o)throw new K("combinedSearch name string is empty");d.LName=o}else{if(!e||"object"!=typeof e)throw new K("combinedSearch name requires { fname/lname/mname } object or a last-name string");{const o=T(e.fname),a=T(e.mname),t=T(e.lname),r=!o&&!a&&!t&&T(e.name);if(o||a||t)d.FullName={FName:o,MName:a,LName:t};else{if(!r)throw new K("combinedSearch name requires string last name, or object with any of { fname, lname, mname }");d.LName=r}}}}else if("nameRecId"===t){const e=m(o.nameRecId??o.custId,"custId");if(!e)throw new K("combinedSearch nameRecId value missing");d.NameRecId=e}else{if("stkNo"!==t)throw new K(`Unsupported CombinedSearch kind: ${o.kind}`);{const e=m(o.stkNo??o.stock,"stkNo");if(!e)throw new K("combinedSearch stkNo value missing");d.StkNo=e}}if(1!==[d.Phone,d.LicenseNum,d.PartVIN,d.LName,d.FullName,d.NameRecId,d.StkNo].filter(Boolean).length)throw new K("combinedSearch requires exactly one search criterion");const r=T(o.make),i=T(o.model),s=T(o.year);(r||i||s)&&(d.VehData={MakePfx:r,Model:i,Year:s});const l=e({routing:a.routing,sender:{component:"Rome",task:"CVC",referenceId:"Query",creator:"RCI",senderName:"RCI"},order:"creation-bod-sender-destination"});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n {{#Phone}}{{/Phone}}\n {{#PartVIN}}{{/PartVIN}}\n {{#LicenseNum}}{{/LicenseNum}}\n {{#LName}}{{/LName}}\n {{#FullName}}\n \n {{/FullName}}\n {{#NameRecId}}{{/NameRecId}}\n {{#StkNo}}{{/StkNo}}\n \n {{#VehData}}\n \n {{/VehData}}\n \n\n',{ApplicationArea:l,...d}),routing:a.routing,envelope:a.envelope,elementName:"rey_RomeCustServVehCombReq",xsdFilename:"rey_RomeCustServVehCombReq.xsd",postParse:u}}(o,a))}async insertCustomer(o,a){return this._send(function(o,a){if(!a?.routing?.dealerNumber)throw new K("routing.dealerNumber required");const t=b(o),d=e({routing:a.routing,sender:{component:"Rome",task:"CU",referenceId:"Insert"},order:"sender-creation-bod-destination"});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n {{#C.contactInfo.Addresses}}\n \n {{/C.contactInfo.Addresses}}\n {{#C.contactInfo.Phones}}\n \n {{/C.contactInfo.Phones}}\n {{#C.contactInfo.Email}}\n \n {{/C.contactInfo.Email}}\n \n {{#C.custPersonal}}\n \n {{#BirthDates}}\n \n {{/BirthDates}}\n {{#SSNs}}\n \n {{/SSNs}}\n {{#DriverInfo}}\n \n {{/DriverInfo}}\n {{#CustChildren}}\n \n {{/CustChildren}}\n \n {{/C.custPersonal}}\n {{#C.dmsCustInfo}}\n \n {{#Followups}}\n \n {{/Followups}}\n \n {{/C.dmsCustInfo}}\n \n\n',{ApplicationArea:d,C:t}),routing:a.routing,envelope:a.envelope,postParse:R,xsdFilename:"rey_RomeCustomerInsertReq.xsd",elementName:"rey_RomeCustomerInsertReq"}}(o,a))}async updateCustomer(o,a){return this._send(function(o,a){if(!a?.routing?.dealerNumber)throw new K("routing.dealerNumber required");if(!o.nameRecId)throw new K("nameRecId or customerId required");const t=N(o.ibFlag);if("I"!==t&&"B"!==t)throw new K("ibFlag required ('I' or 'B')");const d=b(o);d.contactInfo.NameRecId=String(o.nameRecId);const r=e({routing:a.routing,sender:{component:"Rome",task:"CU",referenceId:"Update"},order:"sender-creation-bod-destination"});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n {{#C.contactInfo.Addresses}}\n \n {{/C.contactInfo.Addresses}}\n {{#C.contactInfo.Phones}}\n \n {{/C.contactInfo.Phones}}\n {{#C.contactInfo.Email}}\n \n {{/C.contactInfo.Email}}\n \n {{#C.custPersonal}}\n \n {{#BirthDates}}\n \n {{/BirthDates}}\n {{#SSNs}}\n \n {{/SSNs}}\n {{#DriverInfo}}\n \n {{/DriverInfo}}\n {{#CustChildren}}\n \n {{/CustChildren}}\n \n {{/C.custPersonal}}\n {{#C.dmsCustInfo}}\n \n {{#Followups}}\n \n {{/Followups}}\n \n {{/C.dmsCustInfo}}\n \n\n',{ApplicationArea:r,C:d}),routing:a.routing,envelope:a.envelope,postParse:R,xsdFilename:"rey_RomeCustomerUpdateReq.xsd",elementName:"rey_RomeCustomerUpdateReq"}}(o,a))}async insertServiceVehicle(o,a){return this._send(function(o={},a={}){if(!a?.routing?.dealerNumber)throw new K("routing.dealerNumber is required");const t=e({routing:a.routing,sender:a?.envelope?.sender??{component:"Rome",task:"SV",referenceId:"Insert"},creationDateTime:a?.envelope?.creationDateTime,bodId:a?.envelope?.bodId}),d=function(e={}){const o=e.vin;if(!o)throw new K("insertServiceVehicle: vin is required");const a=e.vehicleServInfo?.customerNo;if(!a)throw new K("insertServiceVehicle: vehicleServInfo.customerNo (or customerNo) is required");return{VIN:String(o).toUpperCase(),VehicleMake:e.vehicleMake||e.make,VehicleYear:String(e.year).slice(-2),MdlNo:e.mdlNo||e.modelCode||"P",ModelDesc:e.modelDesc,Carline:e.carline,ExtClrDesc:e.extClrDesc,AccentClr:e.accentClr,Aircond:e.aircond??"Y",Pwrstr:e.pwrstr??"Y",Transm:e.transm??"A",Turbo:e.turbo?"Y":"N",EngineConfig:e.engineConfig,Trim:e.trim,LicNo:e.licNo,StockID:e.stockId,CustomerNo:String(a),vehicleServInfo:{salesmanNo:e.vehicleServInfo?.salesmanNo,inServiceDate:e.vehicleServInfo?.inServiceDate?f(e.vehicleServInfo?.inServiceDate):void 0,mileage:e.vehicleServInfo?.mileage,teamCode:e.vehicleServInfo?.teamCode,productionDate:e?.productionDate?f(e.productionDate):void 0,modelMaintCode:e.modelMaintCode,vehExtWarranty:(()=>{const o=e.vehicleServInfo?.vehExtWarranty;if(!o)return;const a={contractNumber:o.contractNumber,expirationDate:o?.expirationDate?f(o.expirationDate):void 0,expirationMileage:o.expirationMileage};return Object.values(a).some(e=>null!=e&&""!==e)?a:void 0})(),advisor:(()=>{const o=e.vehicleServInfo?.advisor,a=o?.contactInfo?.nameRecId;return a?{contactInfo:{nameRecId:String(a)}}:void 0})()}}}(o);return{starXml:L.render('\n\n {{{ApplicationArea}}}\n\n \n \n \n\n \n {{#V.vehicleServInfo.vehExtWarranty}}\n \n {{/V.vehicleServInfo.vehExtWarranty}}\n\n {{#V.vehicleServInfo.advisor}}\n \n \n \n {{/V.vehicleServInfo.advisor}}\n \n\n',{ApplicationArea:t,V:d}),routing:a.routing,envelope:a.envelope,postParse:S,xsdFilename:"rey_RomeServVehicleInsertReq.xsd",elementName:"rey_RomeServVehicleInsertReq"}}(o,a))}async getAdvisors(e,o){return this._send(F(e,o))}async createRepairOrder(o,a){return this._send(function(o={},a={}){if(!a?.routing?.dealerNumber)throw new K("routing.dealerNumber required");if(!o?.customerNo)throw new K("customerNo (CustNo) required");if(!o?.departmentType)throw new K("departmentType (DeptType) required");if(!o?.vin)throw new K("vin (Vin) required");if(!o?.outsdRoNo)throw new K("outsdRoNo required");const t={customerNo:o.customerNo,advisorNo:o.advisorNo,tagNo:o.tagNo,outsdRoNo:o.outsdRoNo,departmentType:o.departmentType,vin:o.vin,mileageIn:o.mileageIn,roComment:o.roComment,estimate:o.estimate?{parts:o.estimate.parts,labor:o.estimate.labor,total:o.estimate.total}:void 0,tax:o.tax?{payType:o.tax.payType,taxCode:o.tax.taxCode,txblGrossAmt:o.tax.txblGrossAmt,grossTaxAmt:o.tax.grossTaxAmt}:void 0,rolabor:o.rolabor?{ops:o.rolabor.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,custPayTypeFlag:e.custPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrPayTypeFlag:e.warrPayTypeFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrPayTypeFlag:e.intrPayTypeFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,vlrCode:e.vlrCode,bill:e.bill?{payType:e.bill.payType,jobTotalHrs:e.bill.jobTotalHrs,billTime:e.bill.billTime,billRate:e.bill.billRate}:void 0,ccc:e.ccc?{cause:e.ccc.cause,complaint:e.ccc.complaint,correction:e.ccc.correction}:void 0,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,totalAmt:e.amount.totalAmt}:void 0}))}:void 0,ropart:o.ropart?{jobs:o.ropart.jobs?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({partNo:e.partNo,partNoDesc:e.partNoDesc,qtyOrd:e.partQty,sale:e.sale,cost:e.cost,addDeleteFlag:e.addDeleteFlag}))}))}:void 0,rogg:o.rogg?{roNo:o.rogg.roNo,ops:o.rogg.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({breakOut:e.breakOut,itemType:e.itemType,itemDesc:e.itemDesc,custQty:e.custQty,warrQty:e.warrQty,intrQty:e.intrQty,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,dlrCost:e.amount.dlrCost}:void 0}))}))}:void 0,romisc:o.romisc?{roNo:o.romisc.roNo,ops:o.romisc.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({miscCode:e.miscCode,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,codeAmt:e.codeAmt}))}))}:void 0};if(t.tax?.payType&&!["All","Cust","Intr","Warr"].includes(t.tax.payType))throw new K("tax.payType must be one of: All, Cust, Intr, Warr");if(t.rolabor?.ops?.some(e=>e.custTxblNtxblFlag&&!["T","N"].includes(e.custTxblNtxblFlag)||e.warrTxblNtxblFlag&&!["T","N"].includes(e.warrTxblNtxblFlag)||e.intrTxblNtxblFlag&&!["T","N"].includes(e.intrTxblNtxblFlag)))throw new K("Taxable flags (CustTxblNTxblFlag, WarrTxblNTxblFlag, IntrTxblNTxblFlag) must be 'T' or 'N'");if(t.rogg?.ops?.some(e=>e.lines?.some(e=>e.itemType&&!["G","P","S","F"].includes(e.itemType))))throw new K("rogg.ops.lines.itemType must be one of: G, P, S, F");const d={...a?.envelope||{},sender:{component:a?.envelope?.sender?.component??"Rome",task:a?.envelope?.sender?.task??"BSMRO",referenceId:a?.envelope?.sender?.referenceId??"Insert",creatorNameCode:a?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:a?.envelope?.sender?.senderNameCode??"RCI"}},r=e({routing:a.routing,sender:d.sender,creationDateTime:d.creationDateTime,bodId:d.bodId});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n {{#RO.roComment}}\n \n {{/RO.roComment}}\n\n {{#RO.estimate}}\n \n {{/RO.estimate}}\n\n {{#RO.tax}}\n \n {{/RO.tax}}\n \n\n {{#RO.rolabor}}\n \n {{#RO.rolabor.ops}}\n \n {{#bill}}\n \n {{/bill}}\n\n {{#ccc}}\n \n {{/ccc}}\n\n {{#amount}}\n \n {{/amount}}\n \n {{/RO.rolabor.ops}}\n \n {{/RO.rolabor}}\n\n {{#RO.ropart}}\n \n {{#RO.ropart.jobs}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.ropart.jobs}}\n \n {{/RO.ropart}}\n\n {{#RO.rogg}}\n \n {{#RO.rogg.ops}}\n \n {{#lines}}\n \n {{#amount}}\n \n {{/amount}}\n \n {{/lines}}\n \n {{/RO.rogg.ops}}\n \n {{/RO.rogg}}\n\n {{#RO.romisc}}\n \n {{#RO.romisc.ops}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.romisc.ops}}\n \n {{/RO.romisc}}\n \n\n',{ApplicationArea:r,RO:t}),routing:a.routing,envelope:d,postParse:P,xsdFilename:"rey_RomeCreateBSMRepairOrderReq.xsd"}}(o,a))}async updateRepairOrder(o,a){return this._send(function(o={},a={}){if(!a?.routing?.dealerNumber)throw new K("routing.dealerNumber required");if(!o?.finalUpdate)throw new K("finalUpdate (FinalUpdate) required");if(!["Y","N"].includes(o.finalUpdate))throw new K("finalUpdate must be 'Y' or 'N'");if(!o?.outsdRoNo)throw new K(" outsdRoNo");const t={finalUpdate:o.finalUpdate||"N",roNo:o.roNo,customerNo:o.customerNo,tagNo:o.tagNo,outsdRoNo:o.outsdRoNo,departmentType:o.departmentType,vin:o.vin,mileageIn:o.mileageIn,mileageOut:o.mileageOut,roComment:o.roComment,estimate:o.estimate?{estimateType:o.estimate.estimateType}:void 0,tax:o.tax?{payType:o.tax.payType,taxCode:o.tax.taxCode,txblGrossAmt:o.tax.txblGrossAmt,grossTaxAmt:o.tax.grossTaxAmt}:void 0,rolabor:o.rolabor?{ops:o.rolabor.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,custPayTypeFlag:e.custPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrPayTypeFlag:e.warrPayTypeFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrPayTypeFlag:e.intrPayTypeFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,vlrCode:e.vlrCode,bill:e.bill?{payType:e.bill.payType,jobTotalHrs:e.bill.jobTotalHrs,billTime:e.bill.billTime,billRate:e.bill.billRate}:void 0,ccc:e.ccc?{cause:e.ccc.cause,complaint:e.ccc.complaint,correction:e.ccc.correction}:void 0,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,totalAmt:e.amount.totalAmt}:void 0}))}:void 0,ropart:o.ropart?{jobs:o.ropart.jobs?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({partNo:e.partNo,partNoDesc:e.partNoDesc,qtyOrd:e.partQty,sale:e.sale,cost:e.cost,addDeleteFlag:e.addDeleteFlag}))}))}:void 0,rogg:o.rogg?{roNo:o.rogg.roNo,ops:o.rogg.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({breakOut:e.breakOut,itemType:e.itemType,itemDesc:e.itemDesc,custQty:e.custQty,warrQty:e.warrQty,intrQty:e.intrQty,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,amount:e.amount?{payType:e.amount.payType,amtType:e.amount.amtType,custPrice:e.amount.custPrice,dlrCost:e.amount.dlrCost}:void 0}))}))}:void 0,romisc:o.romisc?{roNo:o.romisc.roNo,ops:o.romisc.ops?.map(e=>({opCode:e.opCode,jobNo:e.jobNo,lines:e.lines?.map(e=>({miscCode:e.miscCode,custPayTypeFlag:e.custPayTypeFlag,warrPayTypeFlag:e.warrPayTypeFlag,intrPayTypeFlag:e.intrPayTypeFlag,custTxblNtxblFlag:e.custTxblNtxblFlag,warrTxblNtxblFlag:e.warrTxblNtxblFlag,intrTxblNtxblFlag:e.intrTxblNtxblFlag,codeAmt:e.codeAmt}))}))}:void 0};if(t.tax?.payType&&!["All","Cust","Intr","Warr"].includes(t.tax.payType))throw new K("tax.payType must be one of: All, Cust, Intr, Warr");if(t.rolabor?.ops?.some(e=>e.custTxblNtxblFlag&&!["T","N"].includes(e.custTxblNtxblFlag)||e.warrTxblNtxblFlag&&!["T","N"].includes(e.warrTxblNtxblFlag)||e.intrTxblNtxblFlag&&!["T","N"].includes(e.intrTxblNtxblFlag)))throw new K("Taxable flags (CustTxblNTxblFlag, WarrTxblNTxblFlag, IntrTxblNTxblFlag) must be 'T' or 'N'");if(t.rogg?.ops?.some(e=>e.lines?.some(e=>e.itemType&&!["G","P","S","F"].includes(e.itemType))))throw new K("rogg.ops.lines.itemType must be one of: G, P, S, F");const d={...a?.envelope||{},sender:{component:a?.envelope?.sender?.component??"Rome",task:a?.envelope?.sender?.task??"BSMRO",referenceId:a?.envelope?.sender?.referenceId??"Update",creatorNameCode:a?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:a?.envelope?.sender?.senderNameCode??"RCI"}},r=e({routing:a.routing,sender:d.sender,creationDateTime:d.creationDateTime,bodId:d.bodId});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n \n {{#RO.roComment}}\n \n {{/RO.roComment}}\n\n {{#RO.estimate}}\n \n {{/RO.estimate}}\n\n {{#RO.tax}}\n \n {{/RO.tax}}\n \n\n {{#RO.rolabor}}\n \n {{#RO.rolabor.ops}}\n \n {{#bill}}\n \n {{/bill}}\n\n {{#ccc}}\n \n {{/ccc}}\n\n {{#amount}}\n \n {{/amount}}\n \n {{/RO.rolabor.ops}}\n \n {{/RO.rolabor}}\n\n {{#RO.ropart}}\n \n {{#RO.ropart.jobs}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.ropart.jobs}}\n \n {{/RO.ropart}}\n\n {{#RO.rogg}}\n \n {{#RO.rogg.ops}}\n \n {{#lines}}\n \n {{#amount}}\n \n {{/amount}}\n \n {{/lines}}\n \n {{/RO.rogg.ops}}\n \n {{/RO.rogg}}\n\n {{#RO.romisc}}\n \n {{#RO.romisc.ops}}\n \n {{#lines}}\n \n {{/lines}}\n \n {{/RO.romisc.ops}}\n \n {{/RO.romisc}}\n \n\n',{ApplicationArea:r,RO:t}),routing:a.routing,envelope:d,postParse:P,xsdFilename:"rey_RomeUpdateBSMRepairOrderReq.xsd",elementName:"rey_RomeUpdateBSMRepairOrderReq"}}(o,a))}async getParts(o,a){return this._send(function(o={},a={}){const t=o.roNumber?String(o.roNumber).trim():void 0;if(!t)throw new K("getParts: roNumber required");const d=e({routing:a.routing,sender:{component:"Rome",task:"RCT",referenceId:"Query",creator:"RCI",senderName:"RCI"}});return{starXml:L.render('\n\n {{{ApplicationArea}}}\n \n\n',{ApplicationArea:d,RoNumber:t}),routing:a.routing,envelope:a.envelope,xsdFilename:"rey_RomeGetPartsReq.xsd",elementName:"rey_RomeGetPartsReq",postParse:e=>function(e){return e?.rey_RomeGetPartsResp?.RoParts?.map(e=>({partNumber:M(e,"PartNumber"),partDescription:M(e,"PartDescription"),quantityOrdered:M(e,"QuantityOrdered"),quantityShipped:M(e,"QuantityShipped"),price:M(e,"Price"),cost:M(e,"Cost"),processedFlag:M(e,"ProcessedFlag"),addOrDelete:M(e,"AddOrDelete")}))||[]}(e)}}(o,a))}}const ee=[{code:"A1",display:"Anker Craft"},{code:"A2",display:"Autocar"},{code:"A3",display:"Angler"},{code:"A4",display:"Automotive Rebuilders"},{code:"A5",display:"Alphenite"},{code:"A6",display:"Aerbus"},{code:"A7",display:"Aerolite"},{code:"A8",display:"American Star"},{code:"A9",display:"Aristocrat"},{code:"AA",display:"Alumalite"},{code:"AB",display:"Aurora"},{code:"AC",display:"Acura"},{code:"ACG",display:"American Custom Golf Cars"},{code:"ACP",display:"Keystone"},{code:"ACS",display:"Access (motor home)"},{code:"AD",display:"Aro"},{code:"AD6",display:"Anderson 6 Ton Trailer"},{code:"ADL",display:"Admiral (motor home)"},{code:"ADM",display:"Adam Trailers"},{code:"ADT",display:"Advantage Trailer"},{code:"ADV",display:"Adventurous"},{code:"ADY",display:"Adly"},{code:"AE",display:"Aeromat"},{code:"AF",display:"Alfa"},{code:"AG",display:"AM General"},{code:"AH",display:"American Coach"},{code:"AI",display:"Airstream"},{code:"AJ",display:"Aljo"},{code:"AK",display:"Arrow"},{code:"AL",display:"Allegro"},{code:"ALB",display:"Albemarle"},{code:"ALI",display:"Alliance RV"},{code:"ALO",display:"Aoha (boat)"},{code:"ALS",display:"Alumascape (travel trailer)"},{code:"ALU",display:"Aluma (trailer)"},{code:"AM",display:"American Motors"},{code:"AMC",display:"Ameri-Camp (trailer)"},{code:"AN",display:"American by Cobra"},{code:"AO",display:"Apollo"},{code:"AP",display:"Alphine Light"},{code:"APP",display:"Appalachian"},{code:"AQ",display:"Augusta (airplane)"},{code:"AR",display:"Alfa Romeo"},{code:"ARG",display:"Argo"},{code:"AS",display:"Aston Martin"},{code:"ASP",display:"Aspect (motor home)"},{code:"ASV",display:"ASV"},{code:"AT",display:"Arctic Cat (ATV)"},{code:"AU",display:"Audi"},{code:"AUG",display:"Augusta (RV)"},{code:"AUW",display:"Autowares"},{code:"AV",display:"Avanti"},{code:"AVN",display:"Adventurer (motor home)"},{code:"AW",display:"Atwood"},{code:"AX",display:"Airex"},{code:"AY",display:"American Flyer"},{code:"AZ",display:"Avion"},{code:"AZU",display:"AZURE (boats)"},{code:"AZZ",display:"Avalanche"},{code:"B1",display:"Starcraft Motor Home"},{code:"B2",display:"Bicycle"},{code:"B3",display:"Big Foot"},{code:"B4",display:"Brockway Truck"},{code:"B5",display:"Beaver"},{code:"B6",display:"Shelby"},{code:"B7",display:"American Eagle"},{code:"B8",display:"Bluebird (bus)"},{code:"B9",display:"Budd Trailer"},{code:"BA",display:"Baron"},{code:"BAC",display:"Briggs Automotive Company"},{code:"BAY",display:"Bayridge"},{code:"BB",display:"Southland Rebuilders"},{code:"BBR",display:"Big Bear (motorcycle)"},{code:"BC",display:"BMW Motorcycles"},{code:"BCR",display:"Braxton Creek"},{code:"BCT",display:"Back Country"},{code:"BD",display:"Snowbird"},{code:"BE",display:"Bentley"},{code:"BEE",display:"Bee (trailer)"},{code:"BF",display:"BMW Sav"},{code:"BFE",display:"Bedford"},{code:"BG",display:"Bering Truck"},{code:"BGC",display:"Big Country (RV)"},{code:"BGH",display:"Big Horn (RV)"},{code:"BGM",display:"Barnes Distribution General Motors Dealer Equipment (GMDE)"},{code:"BGS",display:"Big Sky"},{code:"BH",display:"Boston Whaler"},{code:"BIN",display:"Bintelli"},{code:"BJ",display:"Baja"},{code:"BK",display:"Baretta (boat)"},{code:"BKN",display:"Bricklin"},{code:"BKS",display:"Black Series"},{code:"BL",display:"Bolens"},{code:"BLD",display:"Black Diamond (travel trailer)"},{code:"BLI",display:"Blizzard Manufacturing"},{code:"BLR",display:"Black Rock"},{code:"BLZ",display:"Blazer"},{code:"BM",display:"BMW"},{code:"BMC",display:"Belmont Machine (trailer)"},{code:"BN",display:"Bonnavilla"},{code:"BNC",display:"Bennche ATV"},{code:"BO",display:"Bounder"},{code:"BOB",display:"Bobcat"},{code:"BOL",display:"Bollinger Motors"},{code:"BOS",display:"Boss Hoss (motorcycle)"},{code:"BP",display:"BrightDrop"},{code:"BQ",display:"Bear Trailer"},{code:"BR",display:"Basstream"},{code:"BRK",display:"Brinkley RV"},{code:"BRS",display:"Branson"},{code:"BRU",display:"Brutus"},{code:"BRY",display:"Bryant Boats"},{code:"BS",display:"Bass Tracker"},{code:"BSP",display:"Boss Snow Plows"},{code:"BT",display:"Bertone"},{code:"BTK",display:"Buick Truck (truck)"},{code:"BU",display:"Buick"},{code:"BUG",display:"Bugatti (automobile)"},{code:"BV",display:"Beaver Coach"},{code:"BVO",display:"Bravo (electric vehicle)"},{code:"BW",display:"Bowman"},{code:"BX",display:"Boulton (power boat)"},{code:"BY",display:"Bayliner"},{code:"BZ",display:"Automate"},{code:"BZZ",display:"Berkshire"},{code:"C1",display:"Colt"},{code:"C2",display:"Companion"},{code:"C3",display:"Crestliner Boat"},{code:"C4",display:"Cobra"},{code:"C5",display:"Cordova"},{code:"C6",display:"Cruise Air"},{code:"C7",display:"Chief"},{code:"C8",display:"Challenger"},{code:"C9",display:"Conquest"},{code:"CA",display:"Caterpillar"},{code:"CAL",display:"Carrlite (Camper)"},{code:"CAM",display:"C&M"},{code:"CAZ",display:"Cazador"},{code:"CB",display:"Chalet Pop"},{code:"CC",display:"Citation"},{code:"CCI",display:"Cruise Car Inc."},{code:"CCL",display:"CT Coachworks LLC (RV)"},{code:"CD",display:"Cadillac"},{code:"CDA",display:"Coda"},{code:"CDR",display:"Crusader"},{code:"CE",display:"Chateau"},{code:"CEN",display:"Centurian"},{code:"CF",display:"Capri"},{code:"CFM",display:"CFMOTO"},{code:"CG",display:"Camplight"},{code:"CGM",display:"Campagna Motors"},{code:"CH",display:"Chrysler"},{code:"CHA",display:"Chariot (RV)"},{code:"CHI",display:"Chironex"},{code:"CIT",display:"Citroen"},{code:"CJ",display:"Coronado"},{code:"CJA",display:"CJAY"},{code:"CK",display:"Chinook"},{code:"CKM",display:"Checkmate"},{code:"CL",display:"Chilton Trailers"},{code:"CM",display:"Coachment"},{code:"CMR",display:"Cimarron"},{code:"CMT",display:"CM Trailers"},{code:"CN",display:"Catalina"},{code:"CNA",display:"CAN-AM (ATV)"},{code:"CNC",display:"C&C (horse trailer)"},{code:"CNQ",display:"Chongquing"},{code:"CO",display:"Coleman"},{code:"CP",display:"Champion"},{code:"CPN",display:"Capone (motorcycle)"},{code:"CQ",display:"Curtis Industries"},{code:"CR",display:"Cavalier Motor Home"},{code:"CRC",display:"Cricket Cart"},{code:"CRD",display:"Carado RV"},{code:"CRS",display:"Creek Side"},{code:"CRU",display:"Cruiser RV"},{code:"CRV",display:"Carver (boat)"},{code:"CS",display:"Circle J"},{code:"CSE",display:"Case"},{code:"CT",display:"Chevrolet Truck"},{code:"CTR",display:"Citecar"},{code:"CU",display:"Cummins"},{code:"CV",display:"Chevrolet"},{code:"CW",display:"Chevrolet"},{code:"CX",display:"Chapparal"},{code:"CY",display:"Celebrity"},{code:"CYA",display:"Cyclone (RV)"},{code:"CYC",display:"Cyclone"},{code:"CZ",display:"Chris Craft"},{code:"CZY",display:"Cozy Traveler"},{code:"D1",display:"Dorsey Trailer"},{code:"D2",display:"Conestoga"},{code:"D3",display:"Dreamer (5th wheel trailer)"},{code:"D4",display:"Diplomat (RV)"},{code:"D5",display:"Daewoo"},{code:"D6",display:"Ducati (motorcycle)"},{code:"D7",display:"Desperado"},{code:"D8",display:"Donzi"},{code:"D9",display:"Surf Side"},{code:"DA",display:"Daihatsu"},{code:"DAL",display:"Dallara"},{code:"DB",display:"Dazon (scooter)"},{code:"DC",display:"Cherokee"},{code:"DCM",display:"Dixie Chopper (motorcycle)"},{code:"DD",display:"Detroit Diesel"},{code:"DE",display:"Delorean"},{code:"DF",display:"Desert Fox (RV)"},{code:"DFN",display:"Defender"},{code:"DG",display:"SDG (scooter)"},{code:"DH",display:"Dynasty"},{code:"DI",display:"Discovery"},{code:"DIA",display:"Diamondback"},{code:"DIS",display:"Discover Canada"},{code:"DIV",display:"Dively"},{code:"DJ",display:"Doubletree (trailer)"},{code:"DK",display:"Duracraft (boat)"},{code:"DL",display:"Dolphin"},{code:"DLT",display:"Delta (Utility and Horse trailer)"},{code:"DM",display:"Damon"},{code:"DN",display:"Dunes Trailer"},{code:"DO",display:"Dodge"},{code:"DP",display:"Dutch Pop"},{code:"DQ",display:"Double Tree (RV)"},{code:"DR",display:"Dutch Star"},{code:"DRX",display:"Duruxx"},{code:"DS",display:"Datsun"},{code:"DT",display:"Dodge Truck"},{code:"DTM",display:"De Tomaso"},{code:"DTR",display:"Dump Trailer"},{code:"DU",display:"Dutchmen"},{code:"DUR",display:"Duroboat (boat)"},{code:"DV",display:"Dodge Van"},{code:"DW",display:"Sundowner (trailer)"},{code:"DX",display:"Dynamax"},{code:"DY",display:"Daybreak"},{code:"DYM",display:"Dymac (electric vehicle)"},{code:"DYQ",display:"Dynaquest (motor home)"},{code:"DZ",display:"Century"},{code:"E1",display:"Exiss (trailer)"},{code:"E2",display:"Bumble Bee"},{code:"E3",display:"American Trailer"},{code:"E4",display:"Clenet"},{code:"E5",display:"Coyote"},{code:"E6",display:"E-Ton"},{code:"E7",display:"Excursion (RV)"},{code:"E8",display:"Everest (RV)"},{code:"E9",display:"Chateausport"},{code:"EA",display:"Eagle"},{code:"EAR",display:"Earthbound RV"},{code:"EB",display:"Electric Bicycle"},{code:"EBB",display:"Ebbtide"},{code:"EC",display:"Executive"},{code:"ECH",display:"ECHO (ATV/util trailer)"},{code:"ECO",display:"Eco"},{code:"ED",display:"Emerald (boat)"},{code:"EDG",display:"Edge"},{code:"EE",display:"Excell (cargo trailer)"},{code:"EEE",display:"Triple E"},{code:"EF",display:"Georgetown"},{code:"EG",display:"EV Global Motors"},{code:"EGO",display:"EGO"},{code:"EH",display:"Easy Hauler"},{code:"EI",display:"express (boat)"},{code:"EJ",display:"E-Z-Go (golf cart)"},{code:"EK",display:"Elkhorn"},{code:"EL",display:"Eldorado"},{code:"ELA",display:"Electra (RV)"},{code:"ELM",display:"ELectric Last Mile Solutions Inc."},{code:"ELS",display:"Elite Suite (travel trailer)"},{code:"EM",display:"Monon"},{code:"EM",display:"Ember RV"},{code:"EN",display:"Encounter (RV)"},{code:"ENC",display:"Encore RV"},{code:"ENT",display:"Entegra RV"},{code:"ENU",display:"Endura RV"},{code:"EO",display:"Aerostar (RV)"},{code:"EP",display:"Expedition"},{code:"EPC",display:"Epic"},{code:"EQ",display:"Elite Trailer"},{code:"EQS",display:"Equispirit"},{code:"ER",display:"Raven"},{code:"ES",display:"Establishment"},{code:"ESP",display:"Eurospeed"},{code:"ET",display:"Eagle Trailer"},{code:"ETW",display:"East to West"},{code:"EU",display:"Ultra Sport"},{code:"EV",display:"Evinrude"},{code:"EVG",display:"Evergreen RV"},{code:"EVL",display:"Evolution RV"},{code:"EW",display:"EV Warrior"},{code:"EX",display:"Excalibur"},{code:"EXP",display:"Explorer (motor home)"},{code:"EY",display:"Windsong"},{code:"EZ",display:"EZ Loader"},{code:"EZG",display:"EZ GO"},{code:"EZL",display:"Ezloader (trailer)"},{code:"EZZ",display:"Elipse"},{code:"F1",display:"Flair"},{code:"F2",display:"Fold Down"},{code:"F3",display:"Flagstaff"},{code:"F4",display:"Four Seasons"},{code:"F5",display:"Fishrite"},{code:"F6",display:"4-Star (trailer)"},{code:"F7",display:"Formula"},{code:"F8",display:"Fountain"},{code:"F9",display:"Fisher"},{code:"FA",display:"Falcon"},{code:"FB",display:"Fireball (RV)"},{code:"FBC",display:"Fibro Concept"},{code:"FC",display:"Ford Commerical"},{code:"FD",display:"Ford HD Truck"},{code:"FE",display:"Ferrari"},{code:"FED",display:"Federal"},{code:"FF",display:"Fruehauf Trailer"},{code:"FG",display:"Firan (RV)"},{code:"FH",display:"Featherlite (trailer)"},{code:"FI",display:"Fiat"},{code:"FIS",display:"Fisker"},{code:"FJ",display:"Fred Jones"},{code:"FK",display:"Fifth Avenue (RV)"},{code:"FL",display:"Fleetwood (RV)"},{code:"FLO",display:"Floe (trailer)"},{code:"FM",display:"Fiberform"},{code:"FN",display:"Fan"},{code:"FNL",display:"Finish Line"},{code:"FNM",display:"Funmover"},{code:"FO",display:"Ford"},{code:"FOP",display:"Ford of Puerto Rico"},{code:"FOR",display:"Forester (motor home)"},{code:"FOX",display:"Fox Mountain RV"},{code:"FP",display:"Ford Racing Technologies"},{code:"FQ",display:"Forest River (trailer)"},{code:"FR",display:"Freightliner"},{code:"FS",display:"Fiesta"},{code:"FT",display:"Ford Truck"},{code:"FU",display:"Frontier (RV)"},{code:"FUR",display:"Fusion"},{code:"FUS",display:"Fuso"},{code:"FUT",display:"Futura"},{code:"FV",display:"Forest River"},{code:"FW",display:"Ford Wind"},{code:"FX",display:"Four Winns"},{code:"FY",display:"Felling (trailer)"},{code:"FZ",display:"Foretravel (RV)"},{code:"G1",display:"Gindy Trailer"},{code:"G2",display:"Glastron"},{code:"G3",display:"Brown Trailer"},{code:"G4",display:"Bass Cat"},{code:"G5",display:"Generation"},{code:"G6",display:"Morgan Trailers"},{code:"G7",display:"Glacier Bay"},{code:"G8",display:"Global Electric Motorcars"},{code:"G9",display:"Capacity"},{code:"GA",display:"Great Dane Trailer"},{code:"GAR",display:"Garia"},{code:"GB",display:"Georgie Boy (RV)"},{code:"GC",display:"GMC"},{code:"GCH",display:"Grech RV"},{code:"GCI",display:"Greenkraft Inc."},{code:"GD",display:"GPD - East"},{code:"GE",display:"Geo"},{code:"GEC",display:"General Coach"},{code:"GEN",display:"Hyundai"},{code:"GES",display:"Genesis Supreme RV"},{code:"GF",display:"Glendale"},{code:"GG",display:"Cameo Carriage (RV)"},{code:"GH",display:"Macgregor (sailboat)"},{code:"GI",display:"Carriage (RV)"},{code:"GJ",display:"Stellar (travel trailer)"},{code:"GJN",display:"Grand Junction"},{code:"GK",display:"Gekko"},{code:"GL",display:"Gambler"},{code:"GN",display:"Generac"},{code:"GO",display:"Grumman"},{code:"GOR",display:"Gorilla"},{code:"GP",display:"GPD - West"},{code:"GQ",display:"Trailerman (trailer)"},{code:"GR",display:"Gravely"},{code:"GRD",display:"Grand Design RV"},{code:"GS",display:"Gulfstream"},{code:"GST",display:"Grandsport (motor home)"},{code:"GT",display:"Geo Truck"},{code:"GU",display:"Malaguti (motorcycle)"},{code:"GV",display:"Godfrey (boat)"},{code:"GW",display:"White GMC Truck"},{code:"GX",display:"Great West"},{code:"GY",display:"Gindy Trailer"},{code:"GZ",display:"Gazelle"},{code:"H1",display:"Hurricane"},{code:"H2",display:"Honey"},{code:"H3",display:"Heil Trailer"},{code:"H4",display:"Coach House (RV)"},{code:"H5",display:"Harney Coachworks"},{code:"H6",display:"Hawk"},{code:"H7",display:"Hydrocat"},{code:"H8",display:"Haulmark (RV)"},{code:"H9",display:"Holmes (trailer)"},{code:"HA",display:"Hi-Light"},{code:"HAT",display:"Honda ATV"},{code:"HAU",display:"Haulin Trailer"},{code:"HB",display:"Husaberg"},{code:"HBU",display:"Hitch Buddy (towing unit)"},{code:"HC",display:"Hornet"},{code:"HD",display:"Harley Davidson"},{code:"HDO",display:"Hideout"},{code:"HE",display:"Hummer"},{code:"HF",display:"Harney Co. Operations"},{code:"HG",display:"Heritage"},{code:"HH",display:"Hino"},{code:"HHT",display:"H&H Trailer"},{code:"HI",display:"Hilo"},{code:"HJ",display:"New Holland (tractor)"},{code:"HK",display:"Hitckhiker"},{code:"HL",display:"Honda"},{code:"HLR",display:"Haul Rite"},{code:"HM",display:"Honda Motorcycle"},{code:"HMD",display:"Homemade"},{code:"HMS",display:"Homestead"},{code:"HMV",display:"Honda Multipurpose Utility Vehicle"},{code:"HN",display:"Honda Motorcycle"},{code:"HO",display:"Honda"},{code:"HOL",display:"Holland Trailer"},{code:"HOS",display:"Hoosier"},{code:"HP",display:"Honda"},{code:"HQ",display:"Hy-Line (trailer)"},{code:"HR",display:"Holiday Rambler"},{code:"HRG",display:"Highland Ridge"},{code:"HS",display:"Hydra-Sport Boats"},{code:"HSN",display:"Hisun"},{code:"HT",display:"Honda Truck"},{code:"HTG",display:"Hartland Greystone"},{code:"HTI",display:"Hitachi"},{code:"HU",display:"Husqvarna"},{code:"HUL",display:"Hull"},{code:"HV",display:"Hummer (GM Vehicle)"},{code:"HW",display:"Hawker (airplane)"},{code:"HWN",display:"Huawin"},{code:"HX",display:"Hewes (boat)"},{code:"HY",display:"Hyundai"},{code:"HYM",display:"Hymer"},{code:"HYO",display:"Hyosung Motors"},{code:"HYP",display:"Hyundai of Puerto Rico (automobile)"},{code:"HZ",display:"Horizon"},{code:"I2",display:"Clark Industrial Truck"},{code:"I3",display:"Royal International (RV)"},{code:"I4",display:"Mida Motorhome (RV)"},{code:"I5",display:"Independence (motorcycle)"},{code:"I6",display:"Sportsmaster"},{code:"I7",display:"Extreme Mega Lite (RV)"},{code:"I8",display:"Legends"},{code:"I9",display:"Pilgrim Lite (RV)"},{code:"IA",display:"Itasca"},{code:"IB",display:"Big Dog"},{code:"IC",display:"Camper"},{code:"ICA",display:"ICAMP (trailer)"},{code:"ICN",display:"Icon"},{code:"ID",display:"Indian"},{code:"IE",display:"Interstate Trailer"},{code:"IF",display:"Itasca-C"},{code:"IG",display:"Itasca-Diesel"},{code:"IH",display:"American Iron Horse"},{code:"IJ",display:"Italjet USA"},{code:"IK",display:"Innsbruck (RV)"},{code:"IL",display:"International"},{code:"IM",display:"Impulse"},{code:"IMT",display:"Iron Mountain"},{code:"IN",display:"Infiniti"},{code:"INT",display:"InTech"},{code:"INV",display:"INV1"},{code:"IO",display:"Isata (motor home)"},{code:"IP",display:"International Powersports"},{code:"IQ",display:"Sceptor (RV)"},{code:"IR",display:"Invader"},{code:"IRH",display:"Iron Horse (boat)"},{code:"IS",display:"Isuzu"},{code:"ISP",display:"Imperial Supplies"},{code:"IT",display:"Isuzu Truck"},{code:"IU",display:"Skamper Ultra (RV)"},{code:"IV",display:"Iveco"},{code:"IW",display:"W-W (trailer)"},{code:"IX",display:"Maxlite (RV)"},{code:"IY",display:"Infinity (motor home)"},{code:"IZ",display:"Zepplin (RV)"},{code:"J1",display:"Johnson (boat)"},{code:"J2",display:"Charger"},{code:"J3",display:"Charmac"},{code:"J4",display:"Jazz (motor home)"},{code:"J5",display:"Jet Trailer"},{code:"J6",display:"Tiffin (RV)"},{code:"J7",display:"JV Manufacturing (trailer)"},{code:"J8",display:"Rebel (RV)"},{code:"J9",display:"Estate (RV)"},{code:"JA",display:"Jaguar"},{code:"JB",display:"Jamboree"},{code:"JC",display:"Jetcraft"},{code:"JCL",display:"JCL"},{code:"JD",display:"John Deere"},{code:"JE",display:"Jeep"},{code:"JF",display:"Forklift (Forklift, generic)"},{code:"JG",display:"Tail-Gator (RV)"},{code:"JH",display:"Jensen-HL"},{code:"JI",display:"J.I. Case"},{code:"JJ",display:"Attitude (RV)"},{code:"JK",display:"Timberlodge (RV)"},{code:"JL",display:"Javelin"},{code:"JM",display:"Jamee"},{code:"JN",display:"Tuscany (RV)"},{code:"JNP",display:"Johnnypag (motorcycle)"},{code:"JO",display:"Sandstorm (RV)"},{code:"JP",display:"Jag (scooter)"},{code:"JQ",display:"QianJiang (scooter)"},{code:"JR",display:"Jerrdan"},{code:"JRN",display:"Journey (motor home)"},{code:"JS",display:"S&S Campers"},{code:"JT",display:"Jeep Truck"},{code:"JU",display:"Trailrider (RV)"},{code:"JV",display:"JVS (ATV)"},{code:"JW",display:"Willy (Jeep Vehicle)"},{code:"JX",display:"Extreme RV (RV)"},{code:"JY",display:"Jayco"},{code:"K-Z",display:"K-Z (trailer)"},{code:"K1",display:"Kia"},{code:"K2",display:"Kidron Trailer"},{code:"K3",display:"Kountry Comfort"},{code:"K4",display:"KTM"},{code:"K5",display:"Kountry Star"},{code:"K6",display:"Kenner"},{code:"K7",display:"Key West"},{code:"K8",display:"Kasea (minibikes)"},{code:"K9",display:"TM"},{code:"KA",display:"Kawasaki"},{code:"KAK",display:"K&K (trailer)"},{code:"KAL",display:"Kalmar Ottawa"},{code:"KAR",display:"Karma"},{code:"KAY",display:"Kayo"},{code:"KB",display:"Kubota (tractor)"},{code:"KC",display:"Cato"},{code:"KD",display:"Kodiak"},{code:"KDK",display:"Kaddy Kruiser"},{code:"KDN",display:"Kendon"},{code:"KE",display:"Skeeter"},{code:"KEV",display:"Kia EV"},{code:"KEY",display:"Keystone Autoway"},{code:"KF",display:"Kiefer (trailer)"},{code:"KG",display:"Kar Products"},{code:"KH",display:"Kachina"},{code:"KI",display:"Kit"},{code:"KIM",display:"Kimble (trailer)"},{code:"KIO",display:"Kioti"},{code:"KJ",display:"Cajun"},{code:"KK",display:"Carrera Boots"},{code:"KL",display:"Kymco (motor scooter)"},{code:"KM",display:"Komfort"},{code:"KMS",display:"Komatsu"},{code:"KMW",display:"Kimball Midwest"},{code:"KN",display:"Kountry Aire"},{code:"KND",display:"Kandi"},{code:"KNP",display:"Knapheide"},{code:"KO",display:"Koremoto (motorcycle)"},{code:"KOE",display:"Koenigsegg"},{code:"KP",display:"Composite"},{code:"KQ",display:"KZ Inc. (RV)"},{code:"KR",display:"King of the Road"},{code:"KRI",display:"Kristi (trailer)"},{code:"KRY",display:"Krystal (motor home)"},{code:"KS",display:"Kwikee Step"},{code:"KT",display:"Karavan Trailers"},{code:"KU",display:"Kent Automotive (parts master)"},{code:"KV",display:"Knight (RV)"},{code:"KW",display:"Kenworth/Peterbilt"},{code:"KWK",display:"Kwik Load"},{code:"KX",display:"Cross Country (RV)"},{code:"KY",display:"Keystone"},{code:"KYN",display:"Keystone Northpark"},{code:"KYV",display:"Keystone Vantage"},{code:"KZ",display:"Kells (sailboat)"},{code:"L1",display:"Lake Raider (RV)"},{code:"L2",display:"Load Trailer"},{code:"L3",display:"Limited"},{code:"L4",display:"Lincoln Truck"},{code:"L5",display:"Laredo"},{code:"L6",display:"Landau (boat)"},{code:"L7",display:"Laforza"},{code:"L8",display:"Lexington (motor home)"},{code:"L9",display:"Leprechaun (RV)"},{code:"LA",display:"Lancia"},{code:"LB",display:"Lawn Boy"},{code:"LBT",display:"Lambretta"},{code:"LBX",display:"Link Belt Excavators"},{code:"LC",display:"Collins (RV)"},{code:"LD",display:"Lazy Days"},{code:"LE",display:"Lexus"},{code:"LF",display:"Laforze"},{code:"LG",display:"Cross Lander (Brazil car)"},{code:"LGC",display:"Logan Coach"},{code:"LH",display:"Shore Land'r"},{code:"LI",display:"Lincoln"},{code:"LIB",display:"Liberty Outdoors"},{code:"LID",display:"Lider"},{code:"LJ",display:"Loadrite (trailer)"},{code:"LK",display:"Lufkin"},{code:"LKA",display:"Lakota"},{code:"LL",display:"Lear (airplane)"},{code:"LM",display:"Lamborghini"},{code:"LN",display:"Lance"},{code:"LND",display:"Landini"},{code:"LNH",display:"Linhai"},{code:"LNM",display:"LandMark RV"},{code:"LO",display:"Lotus"},{code:"LP",display:"Lawson Products (factory master)"},{code:"LQ",display:"Qvale"},{code:"LR",display:"Land Rover"},{code:"LRV",display:"Lifestyle Luxury RV"},{code:"LS",display:"Larson"},{code:"LSF",display:"Leisure Freedom"},{code:"LST",display:"LS Tractor"},{code:"LT",display:"Leland Trailers"},{code:"LTG",display:"Little Guy"},{code:"LTR",display:"Little River"},{code:"LU",display:"Lund"},{code:"LUC",display:"LUCID"},{code:"LV",display:"Leisure Van"},{code:"LW",display:"Lowe"},{code:"LX",display:"Las Brisas"},{code:"LY",display:"Layton"},{code:"LZ",display:"Lifan (motorcycle scooter)"},{code:"M1",display:"Moutainaire"},{code:"M2",display:"Mastercraft"},{code:"M3",display:"Mirage"},{code:"M4",display:"Marmon"},{code:"M5",display:"Monterey"},{code:"M6",display:"Mako"},{code:"M7",display:"Montana"},{code:"M8",display:"Mercedes Light Truck"},{code:"M9",display:"Malibu"},{code:"MA",display:"Mazda"},{code:"MAC",display:"Maclander"},{code:"MAD",display:"Midwest Automotive Design"},{code:"MAF",display:"Massey Ferguson (tractor/truck)"},{code:"MAG",display:"MAG (truck & van)"},{code:"MAH",display:"Mahindra"},{code:"MAR",display:"Marada (boat)"},{code:"MAS",display:"MASEA (scooter)"},{code:"MAY",display:"May (trailer)"},{code:"MB",display:"Mercedes-Benz"},{code:"MBG",display:"Modbug"},{code:"MBI",display:"Mobi"},{code:"MBS",display:"MB Sport"},{code:"MC",display:"McCulloch"},{code:"MCI",display:"Motor Coach Industries"},{code:"MCL",display:"McLaren"},{code:"MCT",display:"Mac Trailer"},{code:"MD",display:"Magirus-Deutz"},{code:"ME",display:"Mercury Truck"},{code:"MET",display:"Metropolitan"},{code:"MF",display:"Marlette"},{code:"MFM",display:"Misfit Motorcycles"},{code:"MG",display:"MG"},{code:"MGC",display:"Magic"},{code:"MH",display:"Mitsubishi Truck"},{code:"MI",display:"Mitsubishi"},{code:"MIE",display:"Miles Electric (auto)"},{code:"MJ",display:"Mobile Travel"},{code:"MK",display:"Mack Truck"},{code:"MKE",display:"Moke"},{code:"ML",display:"Mcclane"},{code:"MM",display:"Maxim"},{code:"MMR",display:"Motor Morini"},{code:"MN",display:"Montego"},{code:"MNG",display:"Mengdeli"},{code:"MNR",display:"Mountaineer"},{code:"MNT",display:"Mintaro"},{code:"MO",display:"Monaco"},{code:"MOK",display:"Moke International"},{code:"MP",display:"Markson Products"},{code:"MPR",display:"Mazda of Puerto Rico (auto)"},{code:"MQ",display:"Max"},{code:"MR",display:"Mercury"},{code:"MRL",display:"Marlon"},{code:"MS",display:"Maserati"},{code:"MSR",display:"Marshell"},{code:"MSV",display:"Mercedes Benz Van"},{code:"MT",display:"Mercedes Truck"},{code:"MTF",display:"Motofino"},{code:"MU",display:"Merkur"},{code:"MUL",display:"Mullen"},{code:"MV",display:"Mountain View"},{code:"MV1",display:"MV1"},{code:"MVA",display:"Monte Vista"},{code:"MVP",display:"MVP RV"},{code:"MW",display:"Mariah"},{code:"MX",display:"Mallard"},{code:"MXT",display:"Maxey Trailer"},{code:"MY",display:"Midas"},{code:"MYE",display:"Myers Motors (electric scooter)"},{code:"MZ",display:"Mazda Truck"},{code:"N1",display:"Country Coach (RV)"},{code:"N2",display:"Northland"},{code:"N3",display:"New Vision"},{code:"N4",display:"Newell"},{code:"N5",display:"Northern Lite"},{code:"N6",display:"Nash (RV)"},{code:"N7",display:"Northstar"},{code:"N8",display:"Alpen Coach"},{code:"N9",display:"Nitro"},{code:"NA",display:"Navistar Intl MPV"},{code:"NB",display:"MB Cruiser (RV)"},{code:"NBL",display:"Noble"},{code:"NC",display:"Motorcycle Stuff"},{code:"NCR",display:"Nucamp RV"},{code:"NCV",display:"Nissan Commercial Vehicles"},{code:"NCY",display:"North Country"},{code:"ND",display:"Nissan Diesel"},{code:"NE",display:"Neptune (RV)"},{code:"NEX",display:"Nexus RV"},{code:"NF",display:"Nitrous (RV)"},{code:"NFL",display:"New Flyer"},{code:"NG",display:"Twist - N - Go (moped)"},{code:"NH",display:"Nissan Hawaii"},{code:"NHL",display:"Nitrous Hyperlite (RV)"},{code:"NI",display:"Nissan"},{code:"NJ",display:"NRG (trailer)"},{code:"NK",display:"CornPro (trailer)"},{code:"NL",display:"National"},{code:"NLV",display:"Next Level (travel trailer)"},{code:"NM",display:"Newmar"},{code:"NML",display:"Ness Motorcycles LLC"},{code:"NN",display:"Caribbean (RV)"},{code:"NO",display:"Nomad"},{code:"NP",display:"Sandpiper"},{code:"NQ",display:"Nissan"},{code:"NR",display:"Northwood"},{code:"NRT",display:"Nortek Boats"},{code:"NS",display:"Nissan Truck"},{code:"NT",display:"Navistar Intl Truck"},{code:"NTM",display:"Norton Motorcyles"},{code:"NTR",display:"North Trail (snowmobile trailer)"},{code:"NU",display:"Newmans (trailer)"},{code:"NV",display:"VR1 (RV)"},{code:"NVN",display:"Navion"},{code:"NW",display:"Nuwa"},{code:"NX",display:"Exiss (trailer)"},{code:"NY",display:"Nicky"},{code:"NZ",display:"WVZZI (motorcycle)"},{code:"O1",display:"Contender (boat)"},{code:"O2",display:"SOA (RV)"},{code:"O3",display:"Clipper (RV)"},{code:"O4",display:"Motorrad (motorcycle)"},{code:"O5",display:"PGO (moped)"},{code:"O6",display:"Host (camper)"},{code:"O7",display:"Land Roamer (RV)"},{code:"O8",display:"Motocross (motorcycle)"},{code:"O9",display:"Aliner (RV)"},{code:"OA",display:"Catalina SOA (RV)"},{code:"OAS",display:"Oasis"},{code:"OB",display:"Brougham"},{code:"OC",display:"Columbus Motor Home"},{code:"OD",display:"Odyssey"},{code:"ODE",display:"Odes"},{code:"OE",display:"Eclipse Trailer (RV)"},{code:"OF",display:"Cypress (RV)"},{code:"OG",display:"Goshen (Truck Chassis)"},{code:"OH",display:"Honda Watercraft (watercraft)"},{code:"OI",display:"Optima (trailer)"},{code:"OK",display:"Hyundai Tire"},{code:"OL",display:"Oldsmobile"},{code:"OLK",display:"Outlook (motor home)"},{code:"OLW",display:"Outlaw (RV)"},{code:"OM",display:"Outboard Marine Corporation"},{code:"OME",display:"Omega"},{code:"ON",display:"Onan"},{code:"OP",display:"Opel"},{code:"OPE",display:"Open Range (RV)"},{code:"OPR",display:"Outpost (RV)"},{code:"OQ",display:"Lem USA (dirt bike)"},{code:"OR",display:"Open Road"},{code:"ORV",display:"Outdoor RV"},{code:"OS",display:"Oshkosh Truck"},{code:"OT",display:"Oldsmobile Truck"},{code:"OU",display:"Outback (RV)"},{code:"OUT",display:"Outcast (trailer)"},{code:"OV",display:"Lapalma Diesel (RV)"},{code:"OW",display:"Owens"},{code:"OX",display:"MotoX (motorcycle manuf.)"},{code:"OY",display:"Bad Boy (ATV)"},{code:"OZ",display:"Doolittle (trailer)"},{code:"P1",display:"Park Model"},{code:"P2",display:"Pinnacle"},{code:"P3",display:"Phantom"},{code:"P4",display:"Polini (motorcycle)"},{code:"P5",display:"Pioneeer (RV)"},{code:"P6",display:"American Performance Cycle (motorcycle)"},{code:"P7",display:"Procraft Bass Boat"},{code:"P8",display:"Playcraft (boat)"},{code:"P9",display:"Panzer (motorcycle)"},{code:"PA",display:"Pace Arrow"},{code:"PAC",display:"Pacifica (RV)"},{code:"PAG",display:"Pagani"},{code:"PAL",display:"Palomino"},{code:"PB",display:"Peterbilt"},{code:"PC",display:"Pace American"},{code:"PCE",display:"Peace"},{code:"PCT",display:"Princecraft"},{code:"PCW",display:"Pacific Coachworks"},{code:"PD",display:"Progressive Dynamic"},{code:"PDM",display:"Paradigm"},{code:"PE",display:"Peugeot"},{code:"PEV",display:"Pure EV"},{code:"PF",display:"Peak"},{code:"PFS",display:"Profusion"},{code:"PG",display:"Pug"},{code:"PH",display:"Phasar"},{code:"PHG",display:"Power House Genset"},{code:"PI",display:"Pininfarina"},{code:"PIT",display:"Pitster Pro"},{code:"PJ",display:"Pilgrim"},{code:"PJT",display:"PJ Trailers"},{code:"PK",display:"Pontiac Truck"},{code:"PKD",display:"Packard (automobile)"},{code:"PL",display:"Plymouth"},{code:"PLT",display:"Platinum Trailers"},{code:"PM",display:"Palamino"},{code:"PN",display:"Pontiac"},{code:"PNT",display:"Pontoon (boat)"},{code:"PNV",display:"Pronovost"},{code:"PO",display:"Porsche"},{code:"POG",display:"Polaris (GEM)"},{code:"POL",display:"Polestar"},{code:"POS",display:"Polaris (Snowmobile)"},{code:"PP",display:"Patriot Racing (monster trucks)"},{code:"PQ",display:"Parker (car)"},{code:"PR",display:"Prowler"},{code:"PRC",display:"Pierce Manufacturing (truck)"},{code:"PRE",display:"Prevost (motor home)"},{code:"PRL",display:"Presidential (travel trailer)"},{code:"PRQ",display:"PowerQuest"},{code:"PS",display:"Polaris"},{code:"PSI",display:"Peterson Industries"},{code:"PSP",display:"Passport (RV)"},{code:"PT",display:"Plymouth Truck"},{code:"PTM",display:"Primetime RV"},{code:"PU",display:"Pursuit"},{code:"PV",display:"Pace Vision"},{code:"PW",display:"Pleasure Way"},{code:"PWR",display:"Powerline (hauling trailer)"},{code:"PX",display:"Phoenix (RV)"},{code:"PXU",display:"Phoenix USA RV"},{code:"PY",display:"Piaggio (scooter)"},{code:"PZ",display:"Panoz"},{code:"QIY",display:"QIYE"},{code:"QLK",display:"Qlink Motor"},{code:"QS",display:"Quicksilver"},{code:"R1",display:"Radco"},{code:"R2",display:"Stingray"},{code:"R3",display:"Rollsair"},{code:"R4",display:"Coast RV"},{code:"R5",display:"Sunrader"},{code:"R6",display:"RC Willet (RV)"},{code:"R7",display:"Renegade"},{code:"R8",display:"Regal"},{code:"R9",display:"Rinker"},{code:"RA",display:"Rallye"},{code:"RAM",display:"RAM"},{code:"RB",display:"Caribou"},{code:"RC",display:"RR Custom Coach Works"},{code:"RCT",display:"Raycraft"},{code:"RD",display:"Red Max"},{code:"RDC",display:"Road Clipper (trailer)"},{code:"RDV",display:"Ridge View"},{code:"RDW",display:"Redwood"},{code:"RE",display:"Renault"},{code:"REI",display:"Reinell"},{code:"REL",display:"Redline (trailer)"},{code:"REM",display:"Remeq"},{code:"REV",display:"REV Renegade LLC"},{code:"RF",display:"Refuge"},{code:"RG",display:"Ranger"},{code:"RGY",display:"Regency"},{code:"RH",display:"Robinhood"},{code:"RI",display:"Rialta"},{code:"RIV",display:"Rivian"},{code:"RJ",display:"R-Vision"},{code:"RK",display:"Road King"},{code:"RL",display:"Read Screen-All"},{code:"RM",display:"Richmond Boats"},{code:"RN",display:"Residency"},{code:"RNT",display:"Ruff and Tuff (electric vehicle)"},{code:"RO",display:"Ranger Rover"},{code:"ROD",display:"Roadster"},{code:"ROK",display:"ROKETA (motorcycle)"},{code:"RP",display:"Revolution (RV)"},{code:"RPD",display:"R POD"},{code:"RQ",display:"Riata"},{code:"RR",display:"Rolls Royce"},{code:"RS",display:"Storm"},{code:"RSD",display:"Residence"},{code:"RSN",display:"Rossion"},{code:"RT",display:"Roadtrek"},{code:"RTR",display:"Retreat"},{code:"RTT",display:"Riverside"},{code:"RU",display:"Spectrum"},{code:"RUE",display:"Ruesch"},{code:"RV",display:"Recreational Vehicle"},{code:"RW",display:"Rockwood"},{code:"RX",display:"Rexhall"},{code:"RY",display:"Rexair RXA"},{code:"RZ",display:"Rendezvous"},{code:"RZR",display:"Razor (RV)"},{code:"S0",display:"Snow Brothers"},{code:"S1",display:"Suncrest"},{code:"S2",display:"S2 Yachts"},{code:"S3",display:"Salem"},{code:"S4",display:"Sierra"},{code:"S5",display:"Starcraft"},{code:"S6",display:"Seven Seas"},{code:"S7",display:"Shur Flo"},{code:"S8",display:"Sealand"},{code:"S9",display:"Sunchaser"},{code:"SA",display:"Saab"},{code:"SAN",display:"Sanger"},{code:"SAV",display:"Savoy (travel trailer)"},{code:"SB",display:"Sebring"},{code:"SC",display:"Sportscoach"},{code:"SCE",display:"Sceptor (RV)"},{code:"SCH",display:"Schwinn (scooter)"},{code:"SD",display:"Seabreeze"},{code:"SDN",display:"Sundance (RV)"},{code:"SE",display:"Sea-Doo"},{code:"SEA",display:"Seavee"},{code:"SEB",display:"Sea Boss (boat)"},{code:"SEF",display:"Sea Fox"},{code:"SEP",display:"Sea Pro"},{code:"SES",display:"Seaswirl (boat)"},{code:"SF",display:"Safari"},{code:"SG",display:"Silver Eagle"},{code:"SH",display:"Stihl"},{code:"SHL",display:"Show Hauler (RV)"},{code:"SI",display:"Simplicity"},{code:"SJ",display:"Sea Ray"},{code:"SJS",display:"Shejang Jmstar Shenke"},{code:"SK",display:"Ski-Doo"},{code:"SKE",display:"Skeuter (electric scooter)"},{code:"SL",display:"Sterling"},{code:"SLA",display:"Solera"},{code:"SLD",display:"Shorelander (trailer)"},{code:"SLK",display:"Sleek"},{code:"SM",display:"Suzuki"},{code:"SMC",display:"SmartCar (electric veh)"},{code:"SN",display:"Snapper"},{code:"SNU",display:"Saturn US"},{code:"SNV",display:"Sun Valley"},{code:"SO",display:"Sportsmen"},{code:"SP",display:"Suzuki MPV"},{code:"SPC",display:"Sport Chassis"},{code:"SPF",display:"Superperformance"},{code:"SPK",display:"SPYKER (sports car)"},{code:"SQ",display:"Sea Nymph"},{code:"SR",display:"Saturn"},{code:"SRS",display:"Sunray Smokey RV"},{code:"SRV",display:"Snowriver"},{code:"SS",display:"Shasta"},{code:"SSA",display:"Suckerpunch Sallys (motorcycle)"},{code:"SSR",display:"Sightseer (motor home)"},{code:"SST",display:"Slingshot"},{code:"ST",display:"Suzuki Truck"},{code:"STO",display:"Storyteller Overland"},{code:"STP",display:"Sampede (motorcycle)"},{code:"SU",display:"Subaru"},{code:"SV",display:"Sunline"},{code:"SVD",display:"Silverado"},{code:"SVL",display:"Sliver Lite (RV trailer)"},{code:"SW",display:"Southwind"},{code:"SX",display:"Starfire"},{code:"SY",display:"Skyline"},{code:"SYM",display:"SYM"},{code:"SYO",display:"Sanyo"},{code:"SZ",display:"Suzuki Motorcycle"},{code:"SZP",display:"Suzuki of Puerto Rico"},{code:"SZZ",display:"Shadow Trailer"},{code:"T1",display:"Trailmobile Trailer"},{code:"T2",display:"Trans2"},{code:"T3",display:"Tie Down"},{code:"T4",display:"Tour Master"},{code:"T5",display:"Sylvan"},{code:"T6",display:"Travel Supreme"},{code:"T7",display:"Travel Express"},{code:"T8",display:"Trade Winds"},{code:"T9",display:"Tango Boats"},{code:"TA",display:"Tiara"},{code:"TAB",display:"Tab (RV)"},{code:"TAI",display:"Taiwan (motorcycle)"},{code:"TAT",display:"Tamarack Trail"},{code:"TB",display:"Toro"},{code:"TC",display:"Travelcraft"},{code:"TD",display:"Tracker Evinrude"},{code:"TDC",display:"Tidecraft"},{code:"TE",display:"Teton"},{code:"TES",display:"Tesla"},{code:"TF",display:"Travelaire"},{code:"TFM",display:"Three Feathers Manufacturing"},{code:"TG",display:"Tioga"},{code:"TGB",display:"Taiwan Golden Bee (motorcycle)"},{code:"TH",display:"Theurer Trailer"},{code:"THR",display:"Thor Motor Coach"},{code:"TI",display:"Thor Industry"},{code:"TIG",display:"TIGE (boat)"},{code:"TIR",display:"Timber Ridge"},{code:"TJ",display:"Trail-Lite (RV)"},{code:"TJN",display:"Trojan (boat)"},{code:"TJP",display:"TJ Powersports"},{code:"TK",display:"Cadillac Truck"},{code:"TK3",display:"Take 3"},{code:"TL",display:"Tropi-Cal"},{code:"TM",display:"Travel Master"},{code:"TMC",display:"Tomcar"},{code:"TMG",display:"TMG Group"},{code:"TMS",display:"Thomas"},{code:"TMT",display:"Trailmaster (trailer)"},{code:"TN",display:"Tracker Marine"},{code:"TNG",display:"TNG"},{code:"TNK",display:"Tank (motorcycle)"},{code:"TO",display:"Toyota"},{code:"TOM",display:"Tomberlin (motor home)"},{code:"TOU",display:"Tour (motor home)"},{code:"TP",display:"Tropica"},{code:"TPT",display:"TransSport (trailer)"},{code:"TQ",display:"Tahoe Lite (GM Vehicle)"},{code:"TR",display:"Triumph"},{code:"TRA",display:"Trailer"},{code:"TRW",display:"Trail West"},{code:"TRX",display:"T-REX"},{code:"TS",display:"Tigershark"},{code:"TT",display:"Toyota Truck"},{code:"TTD",display:"Tennessee Tandem (trailer)"},{code:"TU",display:"Tradewinds"},{code:"TUN",display:"Tundra (RV)"},{code:"TV",display:"Transvan"},{code:"TW",display:"Towlt"},{code:"TX",display:"Texson"},{code:"TY",display:"Terry"},{code:"TZ",display:"Titan"},{code:"TZI",display:"Tiziani"},{code:"U1",display:"USA Motorhome"},{code:"U2",display:"Ural"},{code:"U3",display:"Ultrastar"},{code:"U4",display:"Caroline Skiff (RV)"},{code:"U5",display:"Sugar Sands"},{code:"U6",display:"Cub Cadet"},{code:"U7",display:"American Cruiser (RV)"},{code:"U8",display:"Alumaweld"},{code:"U9",display:"Toyota Marine (boat)"},{code:"UA",display:"UD"},{code:"UB",display:"Club Car (by Ingersoll Rand)"},{code:"UC",display:"Sunstar (boat)"},{code:"UD",display:"Universal Datsun"},{code:"UE",display:"Elite Motor Homes (RV)"},{code:"UF",display:"Wildcat (RV)"},{code:"UG",display:"Universal Manufacturing"},{code:"UH",display:"Heartland (Fifth Wheel)"},{code:"UI",display:"Cirrus (travel trailer)"},{code:"UJ",display:"Baxley (travel trailer)"},{code:"UK",display:"Tuckrucky"},{code:"UL",display:"Ultra"},{code:"UM",display:"Utility Master"},{code:"UN",display:"Sunrise"},{code:"UNI",display:"United Trailer"},{code:"UNM",display:"United Motors"},{code:"UO",display:"US Cargo (trailer)"},{code:"UP",display:"Parts Unlimited"},{code:"UQ",display:"Valencia (RV)"},{code:"UR",display:"Surveyor"},{code:"US",display:"Sunstream"},{code:"UT",display:"UMC Truck"},{code:"UU",display:"Sunrunner"},{code:"UV",display:"Suntracker"},{code:"UW",display:"Sunvoyager"},{code:"UX",display:"Sidekicks"},{code:"UY",display:"Sooner"},{code:"UZ",display:"Suite"},{code:"V1",display:"Caravell"},{code:"V2",display:"Sunsport (RV)"},{code:"V3",display:"Correctcraft (ski boat)"},{code:"V4",display:"Sutphen (racing boat)"},{code:"V5",display:"Bimota (motorcycle)"},{code:"V6",display:"Apache"},{code:"V7",display:"Alaskan (RV)"},{code:"V8",display:"Carrilite (RV)"},{code:"V9",display:"Ram-Lin"},{code:"VA",display:"Savanna"},{code:"VAL",display:"Valley (trailer)"},{code:"VB",display:"Vagabond"},{code:"VC",display:"Cushman"},{code:"VD",display:"Bounder Diesel"},{code:"VDH",display:"Vanderhall"},{code:"VE",display:"Vectra"},{code:"VEC",display:"Vectrix (electric vehicle)"},{code:"VEN",display:"Venture (boat)"},{code:"VF",display:"Golden Falcon"},{code:"VFS",display:"Vinfast"},{code:"VG",display:"Avenger"},{code:"VH",display:"Austin Healey"},{code:"VHP",display:"Vehicle Production Group (VPG)"},{code:"VI",display:"Vision"},{code:"VIE",display:"View (motor home)"},{code:"VIV",display:"Viva (motorcycle)"},{code:"VJ",display:"Arrow Voyager"},{code:"VK",display:"Viking"},{code:"VL",display:"Verilight"},{code:"VM",display:"Victory"},{code:"VN",display:"Spartan"},{code:"VNG",display:"Vanguard (trailer)"},{code:"VO",display:"Volvo"},{code:"VP",display:"Viper"},{code:"VPG",display:"VHPG"},{code:"VQ",display:"Coral (boat)"},{code:"VR",display:"Roseair"},{code:"VRV",display:"Vanleigh RV"},{code:"VS",display:"Seaview"},{code:"VT",display:"Volvo Truck"},{code:"VTG",display:"Vantage"},{code:"VTM",display:"Vista (motor home)"},{code:"VU",display:"Seacraft"},{code:"VV",display:"VIP (boats)"},{code:"VW",display:"Volkswagen"},{code:"VX",display:"Vespa (scooter)"},{code:"VY",display:"Voyager"},{code:"VYE",display:"Voyage (motor home)"},{code:"VZ",display:"Vogue"},{code:"W1",display:"Western Star Trucks"},{code:"W2",display:"Washbash Trailer"},{code:"W3",display:"Cascade"},{code:"W4",display:"California Motorcycle"},{code:"W5",display:"Western Recreational (RV)"},{code:"W6",display:"Weekender"},{code:"W7",display:"Windsport (RV)"},{code:"W8",display:"American White Water"},{code:"W9",display:"Weekend Warrior"},{code:"WA",display:"Wrangler"},{code:"WAA",display:"Wuxi Angell Autocycle"},{code:"WB",display:"Wet Bikes"},{code:"WC",display:"Wells Cargo"},{code:"WCC",display:"West Coast Choppers"},{code:"WD",display:"Wildwood"},{code:"WE",display:"Westport"},{code:"WF",display:"Star Flyte (RV)"},{code:"WFP",display:"Wolf Pack"},{code:"WG",display:"Wurth West (factory master)"},{code:"WGN",display:"Wagoneer"},{code:"WH",display:"White"},{code:"WHE",display:"Wheego"},{code:"WI",display:"Winnebago"},{code:"WIL",display:"Wildfire (scooter)"},{code:"WIN",display:"Winnebago of Indiana, LLC"},{code:"WIR",display:"Wind River"},{code:"WJ",display:"Wet Jets"},{code:"WK",display:"Crow (boat)"},{code:"WL",display:"Wellcraft"},{code:"WM",display:"Wanderer Trail"},{code:"WN",display:"Wilderness"},{code:"WNC",display:"Winner's Circle"},{code:"WO",display:"Walker (trailer)"},{code:"WP",display:"Honda Power Equipment"},{code:"WQ",display:"Timber Wolf (trailer)"},{code:"WR",display:"Windjammer"},{code:"WS",display:"Western Star"},{code:"WSF",display:"Westfalia"},{code:"WSP",display:"Western Snow Plows"},{code:"WT",display:"Volkswagen Truck"},{code:"WU",display:"Winzer"},{code:"WV",display:"Worldwide Volkswagen"},{code:"WW",display:"Blue Water"},{code:"WWR",display:"Warrior"},{code:"WX",display:"Watercraft"},{code:"WY",display:"Kings Highway (RV)"},{code:"WZ",display:"Whizzer"},{code:"XA",display:"Acura Service Center"},{code:"XG",display:"Genesis/Hyundai"},{code:"XH",display:"Honda Service Senter"},{code:"XI",display:"Ineos"},{code:"XLR",display:"XLR"},{code:"XWF",display:"X Wolf"},{code:"Y1",display:"Arctic Cat (Snowmobile)"},{code:"Y2",display:"American Clipper"},{code:"Y3",display:"Stoughton"},{code:"Y4",display:"Stoughton Trailer"},{code:"Y5",display:"Utility Trailer"},{code:"Y6",display:"Summerwind"},{code:"Y7",display:"Snugtop"},{code:"Y8",display:"Cigarette"},{code:"Y9",display:"Triton"},{code:"YA",display:"Yamaha"},{code:"YB",display:"Skamper"},{code:"YC",display:"Scenic Cruiser"},{code:"YD",display:"Shadow Cruiser"},{code:"YE",display:"Studebaker"},{code:"YF",display:"Sportscraft"},{code:"YG",display:"Bombardier"},{code:"YH",display:"Sea Hunt"},{code:"YI",display:"Timpte"},{code:"YJ",display:"Mobile Scout (RV)"},{code:"YK",display:"Workhorse"},{code:"YL",display:"Yacht Club Trailer"},{code:"YM",display:"Commander (boat)"},{code:"YN",display:"Aquatron"},{code:"YO",display:"Aero"},{code:"YP",display:"Banda (scooter)"},{code:"YQ",display:"Tab (trailer)"},{code:"YR",display:"Robin"},{code:"YS",display:"Yellowstone"},{code:"YT",display:"Tracker"},{code:"YU",display:"Yugo"},{code:"YV",display:"Twin Vee"},{code:"YW",display:"World Cat"},{code:"YX",display:"Mountain High Coachworks"},{code:"YY",display:"SS"},{code:"YZ",display:"Transcraft"},{code:"Z1",display:"Craig Catamaran"},{code:"Z2",display:"Sportsmobile"},{code:"Z3",display:"Crown Line"},{code:"Z4",display:"Ski Centurion"},{code:"Z5",display:"Aro (Automobile)"},{code:"Z6",display:"Alpha Gold (5th wheel trailer)"},{code:"Z7",display:"Cobalt"},{code:"Z8",display:"Supra"},{code:"Z9",display:"Skamper Lite (trailer)"},{code:"ZA",display:"Stealth"},{code:"ZAA",display:"DeSoto"},{code:"ZAP",display:"Zap (electric scooter)"},{code:"ZB",display:"Mercury"},{code:"ZC",display:"Smoker Craft"},{code:"ZD",display:"Springdale"},{code:"ZE",display:"Alpine Coach"},{code:"ZEN",display:"ZENN (cars)"},{code:"ZF",display:"Monark"},{code:"ZG",display:"Harriskayot"},{code:"ZGR",display:"Zinger"},{code:"ZH",display:"Seahwak"},{code:"ZI",display:"Zimmer"},{code:"ZJ",display:"Cedar Creek"},{code:"ZK",display:"Kenworth"},{code:"ZL",display:"Marlin (motor home)"},{code:"ZM",display:"Zieman (trailer)"},{code:"ZN",display:"Sprinter"},{code:"ZNG",display:"Zingo (motorcycle)"},{code:"ZNS",display:"Zongshen"},{code:"ZO",display:"Tahoe (GM Vehicle)"},{code:"ZOM",display:"Zoom"},{code:"ZP",display:"Campion"},{code:"ZQ",display:"Aztec"},{code:"ZR",display:"Cardinal"},{code:"ZRO",display:"Zero Motorcyles"},{code:"ZS",display:"Steiner"},{code:"ZT",display:"Concourse"},{code:"ZU",display:"Ski Supreme"},{code:"ZV",display:"Miscellaneous"},{code:"ZW",display:"Miscellaneous W"},{code:"ZX",display:"Miscellaneous X"},{code:"ZY",display:"Miscellaneous Y"},{code:"ZZ",display:"Other Make"},{code:"ZZA",display:"Autumn Ridge"},{code:"ZZL",display:"DRV Luxury Suites"},{code:"ZZS",display:"Shockwave Toy Hauler"},{code:"ZZV",display:"VIA"},{code:"ZZX",display:"Four Winds"},{code:"ZZY",display:"TOPO"},{code:"ZZZ",display:"Alpine"}],oe=(e="")=>String(e).toLowerCase().replace(/[^a-z0-9]+/g," ").trim(),ae=e=>{if(!e)return null;const o=oe(e);return o.includes("truck")?"truck":o.includes("van")?"van":o.includes("rv")||o.includes("motor home")||o.includes("motorhome")||o.includes("coach")?"rv":o.includes("trailer")||o.includes("5th wheel")||o.includes("fifth wheel")?"trailer":o.includes("scooter")?"scooter":o.includes("motorcycle")||o.includes("bike")?"motorcycle":o.includes("atv")?"atv":o.includes("snowmobile")?"snowmobile":o.includes("boat")||o.includes("watercraft")?"boat":o},te=ee.map(e=>{const{base:o,typeHint:a}=(e=>{const o=e.match(/^(.+?)\s*\((.+)\)\s*$/);return o?{base:oe(o[1]),typeHint:o[2]}:{base:oe(e),typeHint:null}})(e.display);return{...e,_base:o,_normType:ae(a)}}),de=new Map;for(const e of te){const o=de.get(e._base)||[];o.push(e),de.set(e._base,o)}const re=e=>{const o=oe(e);if(!o)return null;const a=de.get(o);if(a&&a.length)return(e=>{if(!e||!e.length)return null;let o=e.find(e=>!e._normType);return o||(o=e.find(e=>"rv"===e._normType),o||e[0])})(a);let t=null;for(const e of te){const a=e._base;if(a===o)return e;(a.startsWith(o)||o.startsWith(a))&&(!t||a.length{if(!e)return null;const a=oe(e),t=oe(o),d=o?((e,o)=>{const a=oe(e),t=oe(o);return a&&t&&ie.find(e=>{const o=[e.make,...e.makeAlt||[]].filter(Boolean).some(e=>oe(e)===a),d=oe(e.type)===t;return o&&d})||null})(e,o):null;if(d){const e=ne(d.code);if(e)return e}if(t){const e=ie.find(e=>oe(e.make)===a&&oe(e.type)===t);if(e)return ne(e.code)}if(t){const a=re(`${e} ${o}`);if(a)return a;const t=re(`${o} ${e}`);if(t)return t}return re(e)},le=(e,o)=>{if(!e)return null;if("string"==typeof e){const a=e;return o?se(a,o):re(a)}if("object"==typeof e){const{make:o,type:a}=e;return o?a?se(o,a):re(o):null}return null},ne=e=>{if(!e)return null;const o=e.toUpperCase();return te.find(e=>e.code===o)||null};export{te as ENTRIES,ee as RAW_ENTRIES,z as RRClient,Z as errors,ne as getEntryByCode,re as lookupByMake,se as lookupByMakeAndType,le as lookupVehicleMake}; diff --git a/server/rr/rr-job-export.js b/server/rr/rr-job-export.js index a5248bcf2..5eefbf19a 100644 --- a/server/rr/rr-job-export.js +++ b/server/rr/rr-job-export.js @@ -205,8 +205,7 @@ const updateRRRepairOrderWithFullData = async (args) => { const { client, opts } = buildClientAndOpts(bodyshop); - // For full data update after early RO, we still use "Insert" referenceId - // because we're inserting the job operations for the first time + // For full data update after early RO, use the RR update route. const finalOpts = { ...opts, envelope: { @@ -214,7 +213,7 @@ const updateRRRepairOrderWithFullData = async (args) => { sender: { ...(opts?.envelope?.sender || {}), task: "BSMRO", - referenceId: "Insert" + referenceId: "Update" } } }; @@ -317,32 +316,45 @@ const updateRRRepairOrderWithFullData = async (args) => { opCode }); - // Add roNo for linking to existing RO + // Update the existing RO created during the early RO step. + payload.finalUpdate = "N"; payload.roNo = String(roNo); payload.outsdRoNo = job?.ro_number || job?.id || undefined; - // Keep rolabor - it's needed to register the job/OpCode accounts in Reynolds - // Without this, Reynolds won't recognize the OpCode when we send rogg operations - // The rolabor section tells Reynolds "these jobs exist" even with minimal data + // RR update rejects placeholder non-labor ROLABOR rows with zero labor prices. + // Keep only the actual labor jobs in ROLABOR and let ROGOG carry parts/extras. + if (payload.rolabor?.ops?.length && payload.rogg?.ops?.length) { + const laborJobNos = new Set( + payload.rogg.ops + .filter((op) => op?.segmentKind === "laborTaxable" || op?.segmentKind === "laborNonTaxable") + .map((op) => String(op.jobNo)) + ); - CreateRRLogEvent(socket, "INFO", "Preparing full data for early RO (using create with roNo)", { + payload.rolabor.ops = payload.rolabor.ops.filter((op) => laborJobNos.has(String(op?.jobNo))); + + if (!payload.rolabor.ops.length) { + delete payload.rolabor; + } + } + + CreateRRLogEvent(socket, "INFO", "Preparing full data update for existing RR RO", { roNo: String(roNo), hasRolabor: !!payload.rolabor, + rolaborCount: payload.rolabor?.ops?.length || 0, hasRogg: !!payload.rogg, payload }); - // Use createRepairOrder (not update) with the roNo to link to the existing early RO - // Reynolds will merge this with the existing RO header - const response = await client.createRepairOrder(payload, finalOpts); + const response = await client.updateRepairOrder(payload, finalOpts); CreateRRLogEvent( socket, "INFO", - "Sending full data for early RO (using create with roNo)", + "RR full data update sent for existing RO", withRRRequestXml(response, { roNo: String(roNo), hasRolabor: !!payload.rolabor, + rolaborCount: payload.rolabor?.ops?.length || 0, hasRogg: !!payload.rogg, payload, response diff --git a/server/rr/rr-job-helpers.js b/server/rr/rr-job-helpers.js index 17666cdec..13ca83fac 100644 --- a/server/rr/rr-job-helpers.js +++ b/server/rr/rr-job-helpers.js @@ -368,8 +368,9 @@ const buildRogogFromAllocations = (allocations, { opCode, payType = "Cust", roNo * * We still keep a 1:1 mapping with GOG ops: each op gets a corresponding * OpCodeLaborInfo entry using the same JobNo and the same tax flag as its - * GOG line. Labor-specific details (hrs/rate) remain zeroed out, and the - * DMS can ignore non-labor ops by virtue of the zero hours/amounts. + * GOG line. Labor-specific hours/rate remain zeroed out, but actual labor + * sale amounts are mirrored into ROLABOR for labor segments so RR receives + * the expected labor pricing on updates. Non-labor ops remain zeroed. * * @param {Object} rogg - result of buildRogogFromAllocations * @param {Object} opts @@ -388,6 +389,8 @@ const buildRolaborFromRogog = (rogg, { payType = "Cust" } = {}) => { const txFlag = firstLine.custTxblNtxblFlag ?? "N"; const linePayType = firstLine.custPayTypeFlag || "C"; + const isLaborSegment = op.segmentKind === "laborTaxable" || op.segmentKind === "laborNonTaxable"; + const laborAmount = isLaborSegment ? String(firstLine?.amount?.custPrice ?? "0") : "0"; return { opCode: op.opCode, @@ -403,8 +406,8 @@ const buildRolaborFromRogog = (rogg, { payType = "Cust" } = {}) => { amount: { payType, amtType: "Job", - custPrice: "0", - totalAmt: "0" + custPrice: laborAmount, + totalAmt: laborAmount } }; });