From c3bc29fa9bf5d23d6a5fd513f6e57f35bd5a57ea Mon Sep 17 00:00:00 2001 From: Dave Date: Thu, 20 Nov 2025 14:52:39 -0500 Subject: [PATCH] feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration -Full Flow verified --- server/rr/lib/index.cjs | 2 +- server/rr/lib/index.mjs | 2 +- server/rr/rr-export-logs.js | 25 ++- server/rr/rr-job-export.js | 243 ++++++++++++++----------- server/rr/rr-job-helpers.js | 117 ++---------- server/rr/rr-register-socket-events.js | 35 +++- server/rr/rr-service-vehicles.js | 96 +++++++++- 7 files changed, 298 insertions(+), 222 deletions(-) diff --git a/server/rr/lib/index.cjs b/server/rr/lib/index.cjs index 0ce01ade9..b856a1bef 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 t({routing:e={},sender:t={},creationDateTime:r,bodId:n}={}){const o={Sender:{Component:t.component??"Rome",Task:t.task??"CU",ReferenceId:t.referenceId??"Query",CreatorNameCode:t.creator??"RCI",SenderNameCode:t.senderName??"RCI"},CreationDateTime:r??(new Date).toISOString().replace(/\.\d{3}Z$/,"Z"),BODId:n??_.v4(),Destination:{DestinationNameCode:"RR",DealerNumber:e.dealerNumber||"",StoreNumber:e.storeNumber||"",AreaNumber:e.areaNumber||""}},a={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()},s=`\n${["bod","creation","sender","dest"].map(e=>a[e]).join("\n")}\n`;return U.default.render(s,o).trim()}function r(e,t=2){const r=" ".repeat(t);return String(e).split("\n").map(e=>e.length?r+e:e).join("\n")}function n(e){return String(e??"").replace(/&/g,"&").replace(//g,">")}function o(e,t){if(null==e)return null;if(Array.isArray(e)){for(const r of e){const e=o(r,t);if(null!=e)return e}return null}if("object"!=typeof e)return null;for(const[r,n]of Object.entries(e)){if(t(r,n))return n;const e=o(n,t);if(null!=e)return e}return null}function a(e,t,r=[]){if(null==e)return r;if(Array.isArray(e)){for(const n of e)a(n,t,r);return r}if("object"!=typeof e)return r;for(const[n,o]of Object.entries(e))t(n,o)&&r.push(o),a(o,t,r);return r}function s(e){return null==e?[]:Array.isArray(e)?e:[e]}function i(e,t){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[t])}function l(e,t){const r=i(e,t);if(Y(r))return r;const n=function(e,t){if(e&&"object"==typeof e)return e.$&&Y(e.$[t])?e.$[t]:Y(e[`@_${t}`])?e[`@_${t}`]:Y(e[`@${t}`])?e[`@${t}`]:e._attributes&&Y(e._attributes[t])?e._attributes[t]:e.attributes&&Y(e.attributes[t])?e.attributes[t]:void 0}(e,t);return Y(n)?n:void 0}function c(e,t){if(e&&"object"==typeof e)return null!=e[`@_${t}`]?e[`@_${t}`]:void 0}function m(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 u(e){return a(e,e=>/(GenTransStatus|TransStatus)$/i.test(e)).flatMap(s)[0]}function p(e){if(e)return{status:(c(e,"Status")||e.Status||m(e)||"").toString().trim()||void 0,statusCode:(c(e,"StatusCode")||e.StatusCode||"").toString().trim()||void 0,message:e.Message&&m(e.Message)||e.GenTransStatus&&m(e.GenTransStatus)||e.TransStatus&&m(e.TransStatus)||m(e)||void 0}}function d(e){if(e)return{status:(c(e,"Status")||e.Status||m(e)||"").toString().trim()||void 0,date:(c(e,"Date")||e.Date||"").toString().trim()||void 0,time:(c(e,"Time")||e.Time||"").toString().trim()||void 0,outsdRoNo:(c(e,"OutsdRoNo")||e.OutsdRoNo||"").toString().trim()||void 0,dmsRoNo:(c(e,"DMSRoNo")||e.DMSRoNo||"").toString().trim()||void 0,errorMessage:(c(e,"ErrorMessage")||e.ErrorMessage||"").toString().trim()||void 0}}function y(e){const t=e?.rey_RomeCustServVehCombRes??e?.rey_RomeCustServVehCombReq??e?.rey_RomeCustServVehComb??e??{};return s(t?.CustServVehComb??t?.CustServVehCombRes??t?.CustServVehCombReq??t).map(e=>{const t=e?.NameContactId??void 0,r=t?.NameId??void 0,n=r?.IndName?Z(r.IndName):void 0,o=r?.BusName?Z(r.BusName):void 0,a=t&&{NameId:r&&{...Z(r)||{},...n?{IndName:n}:{},...o?{BusName:o}:{}},Address:s(t?.Address).map(e=>Z(e)||{}),ContactOptions:s(t?.ContactOptions).map(e=>Z(e)||{}),Phone:s(t?.Phone).map(e=>Z(e)||{}),Email:s(t?.Email).map(e=>Z(e)||{})},i=s(e?.ServVehicle).map(e=>{const t=e?.Vehicle,r=t?.VehicleDetail,n=t&&{...Z(t)||{},...r?{VehicleDetail:Z(r)||{}}:{}},o=e?.VehicleServInfo,a=o?.VehExtWarranty,i=o?.Advisor,l=i?.ContactInfo;let c;i&&(c={...Z(i)||{},...l?{ContactInfo:Z(l)||{}}:{}});const m=o&&{...Z(o)||{},...a?{VehExtWarranty:Z(a)||{}}:{},...c?{Advisor:c}:{},...o?.VehServComments?{VehServComments:s(o.VehServComments).map(e=>J(e)).filter(e=>null!=e&&""!==String(e).trim())}:{}};return{...n?{Vehicle:n}:{},...m?{VehicleServInfo:m}:{}}}),l=s(e?.Message).map(e=>{const t=J(e);return{...Z(e)||{},...null!=t&&""!==String(t).trim()?{Text:t}:{}}}).filter(e=>Object.keys(e).length>0),c={};return a&&(c.NameContactId=a),i.length&&(c.ServVehicle=i),l.length&&(c.Message=l),c})}function g(e,t){if(null!=e)return String("string"==typeof e||"number"==typeof e?e:e[t]||"")}function N(e){return String(e??"").trim()||void 0}function T(e,...t){if(e)for(const r of t){if(e.$&&null!=e.$[r])return e.$[r];if(null!=e[`@_${r}`])return e[`@_${r}`];if(null!=e[r]&&"object"!=typeof e[r])return e[r]}}function b(e){const t=function(e){const t=o(e,e=>"rey_RomeCustomerResponse"===e||e.endsWith(":rey_RomeCustomerResponse"));return t?a(t,e=>"TransStatus"===e||e.endsWith(":TransStatus")).flatMap(s)[0]:void console.log("No rey_RomeCustomerResponse found in root")}(e);if(!t)return{dmsRecKey:void 0};const r=T(t,"DMSRecKey");return{dmsRecKey:null!=r?String(r):void 0,status:T(t,"Status"),statusCode:T(t,"StatusCode")}}function C(e){if(null==e)return;const t=String(e).toUpperCase().replace(/[^A-Z0-9 ]+/g,"");if(!t)throw new Q(`Invalid string: ${e}. Must contain A-Z, 0-9, or space`);return t}function x(e){return e?String(e).toUpperCase():void 0}function f(e={}){const t=x(e.ibFlag)||(e.firstName?"I":"B");if("I"!==t&&"B"!==t)throw new Q("ibFlag must be 'I' or 'B'");const r=e.lastName||e.customerName;if(!r)throw new Q("lastName or customerName required");if("I"===t&&!e.firstName)throw new Q("firstName required when ibFlag='I'");const n=x(e.customerType);if(n&&!["R","W","I"].includes(n))throw new Q("customerType must be 'R', 'W', 'I', Retail, Wholesale, or Internal");const o=(e.addresses||[]).map(e=>{const t={Type:x(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(!t.Addr1)throw new Q("Address requires line1");return t}),a=(e.phones||[]).map(e=>{const t={Type:x(e.type)||"H",Num:e.number?String(e.number):void 0,Ext:e.extension?String(e.extension):void 0};if(!t.Num)throw new Q("Phone requires number");return t}),s=e.emails?.[0]?.address?{MailTo:String(e.emails[0].address)}:void 0,i=e.personal,l=i?{Gender:x(i.gender),OtherName:C(i.otherName),AnniversaryDate:i.anniversaryDate?String(i.anniversaryDate):void 0,EmployerName:C(i.employerName),EmployerPhone:i.employerPhone?String(i.employerPhone):void 0,Occupation:C(i.occupation),OptOut:i.optOut?String(i.optOut):void 0,OptOutUse:i.optOutUse?String(i.optOutUse):void 0,BirthDates:(i.birthDates||[]).map(e=>({Type:x(e.type)||"P",date:e.date?String(e.date):void 0})).filter(e=>e.date),SSNs:(i.ssns||[]).map(e=>({Type:x(e.type)||"P",ssn:e.ssn?String(e.ssn):void 0})).filter(e=>e.ssn),DriverInfo:i.driver?[{Type:x(i.driver.type)||"P",LicNum:i.driver.licenseNumber?String(i.driver.licenseNumber):void 0,LicState:i.driver.licenseState?String(i.driver.licenseState):void 0,LicExpDate:i.driver.licenseExpDate?String(i.driver.licenseExpDate):void 0}].filter(e=>e.LicNum):void 0,CustChildren:(i.children||[]).map(e=>({ChildName:C(e.name)})).filter(e=>e.ChildName)}:void 0,c=e.dms,m=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:x(e.type),Value:x(e.value)})).filter(e=>e.Type&&e.Value)}:void 0;return{custCateg:n||"R",createdBy:e.createdBy?String(e.createdBy):void 0,contactInfo:{IBFlag:t,LastName:C(r),FirstName:C(e.firstName),MidName:C(e.midName),Salut:C(e.salut),Suffix:C(e.suffix),Addresses:o,Phones:a,Email:s},custPersonal:l,dmsCustInfo:m}}function R(e){const t=o(e,e=>"rey_RomeServVehicleInsertResponse"===e||e.endsWith(":rey_RomeServVehicleInsertResponse"))||e,r=o(t,e=>"GenTransStatus"===e||e.endsWith(":GenTransStatus"));return{status:r?l(r,"Status"):void 0,statusCode:r?l(r,"StatusCode"):void 0}}function S(e,t){const r=Array.isArray(t)?t.map(e=>e.toLowerCase()):[String(t).toLowerCase()],n=[e];for(;n.length;){const e=n.pop();if(K(e))for(const t of Object.keys(e)){const o=e[t],a=z(t).toLowerCase();if(r.includes(a))return o;if(K(o))n.push(o);else if(Array.isArray(o))for(const e of o)K(e)&&n.push(e)}}}function v(e,t){if(e&&K(e)){if(null!=e.$?.[t])return e.$[t];if(null!=e[`@${t}`])return e[`@${t}`];if(null!=e[`@_${t}`])return e[`@_${t}`]}}function O(e){if(null!=e){if("string"==typeof e)return e;if("number"==typeof e)return String(e);if(K(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 t=S(e,["CreateBSMRepairOrderResp","UpdateBSMRepairOrderResp"])||e,r=S(t,"RoRecordStatus")||{};return{status:v(r,"Status")||O(S(r,"Status")),date:v(r,"Date")||O(S(r,"Date")),time:v(r,"Time")||O(S(r,"Time")),outsdRoNo:v(r,"OutsdRoNo")||O(S(r,"OutsdRoNo")),dmsRoNo:v(r,"DMSRoNo")||O(S(r,"DMSRoNo")),errorMessage:v(r,"ErrorMessage")||O(S(r,"ErrorMessage"))}}function I(e={},r={}){const n=function(e){if(!e)throw new Error("department is required (S, P, B, SERVICE, PARTS, BODY)");const t=String(e).trim().toUpperCase();if("S"===t||"P"===t||"B"===t)return t;if("SERVICE"===t)return"S";if("PART"===t||"PARTS"===t)return"P";if("BODY"===t||"BODYSHOP"===t||"BODY SHOP"===t)return"B";throw new Error(`Invalid department: ${e}. Must be S, P, B, SERVICE, PARTS, BODY, BODYSHOP, or BODY SHOP`)}(e.department),o=e.advisorNumber?String(e.advisorNumber).trim():void 0,a=t({routing:r.routing,sender:r?.envelope?.sender,creationDateTime:r?.envelope?.creationDateTime,bodId:r?.envelope?.bodId});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n \n \n\n',{ApplicationArea:a,DepartmentType:n,AdvisorNumber:o}),routing:r.routing,envelope:r.envelope,xsdFilename:"rey_RomeGetAdvisorsReq.xsd",elementName:"rey_RomeGetAdvisorsReq",postParse:e=>function(e,t={}){const r=t?.department;var n;return(e=>{const t=e?.Advisor;return t?Array.isArray(t)?t:[t]:[]})((n=e,n?.rey_RomeGetAdvisorsResp??n??{})).map(e=>({advisorId:ee(e,"AdvisorNumber"),firstName:ee(e,"FirstName"),lastName:ee(e,"LastName"),department:r}))}(e,{department:n})}}function h(e){return null==e?void 0:String(e)}function w(e,t){if(e)return null!=e[t]?"object"!=typeof e[t]?h(e[t]):h(e[t]["#text"]):null!=e[`@_${t}`]?h(e[`@_${t}`]):void 0}function P(e){const t=e?.meta?.statusBlocks?.transaction?.message;if(t)return String(t);return String((e?.meta?.status?.Message??e?.meta?.status?.message)||e?.message||"")}function D(e,t){return Math.min(1e4,e*Math.pow(2,t))}function A(e){return e+Math.floor(250*Math.random())}function M(e){return new Promise(t=>setTimeout(t,e))}function V(e){return/lock|in use|record.*busy/i.test(String(e||""))}function E(e,t="****"){if(!e||"string"!=typeof e)return e;let r=e;return r=r.replace(/(]*>)([^<]*)(<\/wsse:Username>)/gi,`$1${t}$3`),r=r.replace(/(]*>)([^<]*)(<\/wsse:Password>)/gi,`$1${t}$3`),r}Object.defineProperty(exports,"__esModule",{value:!0});const L=require("mustache"),_=require("uuid"),j=require("xmlbuilder2"),B=require("axios"),q=require("fast-xml-parser"),U=e(L),k=e(B);class $ extends Error{constructor(e,t={}){super(e),this.name="RRTransportError",this.meta=t}}class G extends Error{constructor(e,t={}){super(e),this.name="RRVendorStatusError",this.meta=t,this.retryable=!!t.retryable}}class Q extends Error{constructor(e,t={}){super(e),this.name="RRValidationError",this.meta=t}}const W=Object.freeze({__proto__:null,RRTransportError:$,RRVendorStatusError:G,RRValidationError:Q}),H={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)}},Y=e=>null!=e&&""!==String(e).trim(),X=new q.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",parseAttributeValue:!1,parseTagValue:!1,isArray:e=>["Advisor"].includes(e)}),Z=e=>{if(!e||"object"!=typeof e)return;const t={};for(const[r,n]of Object.entries(e))r.startsWith("@_")&&(t[r.slice(2)]=n);return Object.keys(t).length?t:void 0},J=e=>{if(null!=e)return"string"==typeof e?e:e["#text"]},z=e=>{if("string"!=typeof e)return"";let t=e.includes("}")?e.split("}").pop():e;return t=t.includes(":")?t.split(":").pop():t,t.startsWith("rey_")&&(t=t.slice(4)),t},K=e=>e&&"object"==typeof e&&!Array.isArray(e),ee=(e,t)=>((e,t)=>e?.[`@_${t}`])(e,t)??i(e,t);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:H,retries:{max:3},...e},this.mask={password:!0}}async _send(e){const{starXml:t,routing:o,envelope:i,postParse:l}=e,y=this.cfg.logger||H,{bodId:g,creationDateTime:N,sender:T}=function(e){return{bodId:e?.bodId||_.v4(),creationDateTime:e?.creationDateTime||new Date,sender:e?.sender||{}}}(i),b=function({username:e,password:t,wssePasswordType:o="Text",starContentXml:a,normalize:s=!0,normalizeOptions:i}={}){const l=function(e){return`\n \n \n \n${r(e,10)}\n \n \n \n `.trim()}(a),c=`\n \n \n${r(function(e,t,r){const o="Digest"===r?' 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 ${n(e)}\n ${n(t)}\n \n \n `.trim()}(e,t,o),8)}\n \n \n${r(l,8)}\n \n \n `.trim();return s?function(e,{prettyPrint:t=!0}={}){if(!e||"string"!=typeof e)return e;try{return j.create(e).end({prettyPrint:t,width:0,indent:" ",newline:"\n"}).trim()}catch(t){return String(e).trim()}}(c,i):c}({username:this.cfg.username,password:this.cfg.password,wssePasswordType:this.cfg.wssePasswordType||"Text",routing:o,sender:T,creationDateTime:(x=N,"string"==typeof x?x:(x instanceof Date?x:new Date).toISOString().replace(/\.\d{3}Z$/,"Z")),bodId:g,starContentXml:t}),C=E(b);var x;"1"===process.env.RR_DUMP_ENVELOPE&&console.log(`[rr] Soap envelope about to send (${e?.elementName}): \n`+C+"\n");const f=async()=>{const t=await async function({baseUrl:e,envelopeXml:t,timeoutMs:r=3e4,logger:n}){try{const n=await k.default.post(e,t,{timeout:r,headers:{"Content-Type":"text/xml; charset=utf-8",SOAPAction:"http://www.starstandards.org/webservices/2005/10/transport/ProcessMessage"},responseType:"text",validateStatus:()=>!0});if(n.status>=200&&n.status<300)return String(n.data??"");throw new $(`HTTP ${n.status}: ${function(e){const t=String(e??"");return t.length>1024?t.slice(0,1024)+"…":t}(n.data)}`,{status:n.status,body:n.data})}catch(e){if(k.default.isAxiosError(e))throw new $(`Network error: ${e.message}`,{cause:e});throw e}}({baseUrl:this.cfg.baseUrl,envelopeXml:b,timeoutMs:this.cfg.timeoutMs,logger:y}),r=function(e){const t=X.parse(e),r=t?.Envelope||t?.["soapenv:Envelope"]||t,n=r?.Body||r?.["soapenv:Body"]||r?.["S:Body"]||r?.["soap:Body"],o=n?.ProcessMessageResponse||n?.["ns2:ProcessMessageResponse"]||n?.["trans:ProcessMessageResponse"]||n,a=o?.payload||o?.["ns2:payload"]||o;return a?.content||a?.["ns2:content"]||a}(t),n=E(t),o=function(e){const t=u(e),r=a(e,e=>/RoRecordStatus$/i.test(e)).flatMap(s)[0];return{transaction:p(t),roRecord:d(r)}}(r),i=function(e){const t=String("ApplicationArea").toLowerCase(),r=[e];for(;r.length;){const e=r.pop();if(e&&"object"==typeof e)for(const[n,o]of Object.entries(e)){if(n.toLowerCase().endsWith(t))return o;o&&"object"==typeof o&&r.push(o)}}}(r),{status:g,norm:N}=function(e){const t=u(e)||a(e,e=>/Status$/i.test(e)).flatMap(s)[0]||{},r=(c(t,"Status")||t.Status||"").toString().trim();let n=(c(t,"StatusCode")||t.StatusCode||"").toString().trim();const o=t.Message&&m(t.Message)||m(t)||"";!n&&/success/i.test(r)&&(n="0");const i=Number(n);let l="FAIL";return/success/i.test(r)||0===i?l="SUCCESS":2!==i&&213!==i||(l="NO_MATCH"),{status:{Status:r,StatusCode:n,Message:o},norm:{kind:l,code:Number.isFinite(i)?i:void 0,message:o}}}(r);if("1"===process.env.RR_DUMP_STATUS&&(console.log("[rr] Status blocks:"),console.dir(o,{depth:null,colors:!0})),"1"===process.env.RR_DUMP_APPLICATION&&(console.log("[rr] ApplicationArea:"),console.dir(i,{depth:null,colors:!0})),"FAIL"===N.kind){const e=g?.StatusCode;throw new G(`Vendor status failure: ${e??""} ${g?.Message||g?.["#text"]||""}`.trim(),{status:g,resXml:n})}const T={success:"SUCCESS"===N.kind||"NO_MATCH"===N.kind,statusBlocks:o,applicationArea:i,xml:{request:C,response:n},parsed:r};if("function"==typeof l)try{T.data=l(r)}catch(e){y?.warn?.(`postParse failed: ${e?.message||e}`)}return"1"===process.env.RR_DUMP_XML&&console.log(`[rr] Full response XML (${e?.elementName}):\n`+n+"\n"),T?.data&&"1"===process.env.RR_DUMP_DATA&&(console.log(`[rr] Parsed response data (${e?.elementName}):\n`),console.dir(T.data,{depth:null,colors:!0})),T};try{return await async function(e,{max:t=3,logger:r}){let n,o=0;for(;o=t)break;const s=A(D(400,o));r?.warn?.(`Retrying attempt ${o}/${t} in ${s}ms: ${e.message}`),await M(s)}throw n}(f,{max:this.cfg.retries?.max??3,logger:y})}catch(e){if(e instanceof $||e instanceof G)throw e;throw new $(`Unexpected error: ${e?.message||e}`,{cause:e})}}async combinedSearch(e,r){return this._send(function(e={},r={}){if(!e||"object"!=typeof e)throw new Q("combinedSearch requires a query object");const n=function(e){if(!e)return"";const t=String(e).trim().toLowerCase();return"telephone"===t?"phone":"lic"===t||"plate"===t?"license":"vin"===t||"partvin"===t?"vin":"name"===t?"name":"namerecid"===t||"custid"===t?"nameRecId":"stkno"===t||"stock"===t?"stkNo":t}(e.kind),o={MaxRecs:Math.min(Number(e.maxResults||e.maxRecs||50),50)};if("phone"===n){const t=g(e.phone,"phone");if(!t)throw new Q("combinedSearch phone value missing");o.Phone=t}else if("license"===n){const t=g(e.license,"license");if(!t)throw new Q("combinedSearch license value missing");o.LicenseNum=t}else if("vin"===n){const t=g(e.vin,"vin");if(!t)throw new Q("combinedSearch vin value missing");o.PartVIN=t}else if("name"===n){const t=e.name;if("string"==typeof t){const e=t.trim();if(!e)throw new Q("combinedSearch name string is empty");o.LName=e}else{if(!t||"object"!=typeof t)throw new Q("combinedSearch name requires { fname/lname/mname } object or a last-name string");{const e=N(t.fname),r=N(t.mname),n=N(t.lname),a=!e&&!r&&!n&&N(t.name);if(e||r||n)o.FullName={FName:e,MName:r,LName:n};else{if(!a)throw new Q("combinedSearch name requires string last name, or object with any of { fname, lname, mname }");o.LName=a}}}}else if("nameRecId"===n){const t=g(e.nameRecId??e.custId,"custId");if(!t)throw new Q("combinedSearch nameRecId value missing");o.NameRecId=t}else{if("stkNo"!==n)throw new Q(`Unsupported CombinedSearch kind: ${e.kind}`);{const t=g(e.stkNo??e.stock,"stkNo");if(!t)throw new Q("combinedSearch stkNo value missing");o.StkNo=t}}if(1!==[o.Phone,o.LicenseNum,o.PartVIN,o.LName,o.FullName,o.NameRecId,o.StkNo].filter(Boolean).length)throw new Q("combinedSearch requires exactly one search criterion");const a=N(e.make),s=N(e.model),i=N(e.year);(a||s||i)&&(o.VehData={MakePfx:a,Model:s,Year:i});const l=t({routing:r.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,...o}),routing:r.routing,envelope:r.envelope,elementName:"rey_RomeCustServVehCombReq",xsdFilename:"rey_RomeCustServVehCombReq.xsd",postParse:y}}(e,r))}async insertCustomer(e,r){return this._send(function(e,r){if(!r?.routing?.dealerNumber)throw new Q("routing.dealerNumber required");const n=f(e),o=t({routing:r.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:o,C:n}),routing:r.routing,envelope:r.envelope,postParse:b,xsdFilename:"rey_RomeCustomerInsertReq.xsd",elementName:"rey_RomeCustomerInsertReq"}}(e,r))}async updateCustomer(e,r){return this._send(function(e,r){if(!r?.routing?.dealerNumber)throw new Q("routing.dealerNumber required");if(!e.nameRecId)throw new Q("nameRecId or customerId required");const n=x(e.ibFlag);if("I"!==n&&"B"!==n)throw new Q("ibFlag required ('I' or 'B')");const o=f(e);o.contactInfo.NameRecId=String(e.nameRecId);const a=t({routing:r.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:a,C:o}),routing:r.routing,envelope:r.envelope,postParse:b,xsdFilename:"rey_RomeCustomerUpdateReq.xsd",elementName:"rey_RomeCustomerUpdateReq"}}(e,r))}async insertServiceVehicle(e,r){return this._send(function(e={},r={}){if(!r?.routing?.dealerNumber)throw new Q("routing.dealerNumber is required");const n=t({routing:r.routing,sender:r?.envelope?.sender??{component:"Rome",task:"SV",referenceId:"Insert"},creationDateTime:r?.envelope?.creationDateTime,bodId:r?.envelope?.bodId}),o=function(e={}){const t=e.vin;if(!t)throw new Q("insertServiceVehicle: vin is required");const r=e.vehicleServInfo?.customerNo;if(!r)throw new Q("insertServiceVehicle: vehicleServInfo.customerNo (or customerNo) is required");return{VIN:String(t),ModelDesc:e.modelDesc,Carline:e.carline,ExtClrDesc:e.extClrDesc,IntClrDesc:e.intClrDesc,TrimDesc:e.trimDesc,BodyStyle:e.bodyStyle,EngineDesc:e.engineDesc,TransDesc:e.transDesc,Year:e.year,Odometer:e.odometer,OdometerUnits:e.odometerUnits,LicNo:e.vehicleDetail?.licNo,CustomerNo:String(r),vehicleServInfo:{salesmanNo:e.vehicleServInfo?.salesmanNo,inServiceDate:e.vehicleServInfo?.inServiceDate,mileage:e.vehicleServInfo?.mileage,teamCode:e.vehicleServInfo?.teamCode,vehExtWarranty:(()=>{const t=e.vehicleServInfo?.vehExtWarranty;if(!t)return;const r={contractNumber:t.contractNumber,expirationDate:t.expirationDate,expirationMileage:t.expirationMileage};return Object.values(r).some(e=>null!=e&&""!==e)?r:void 0})(),advisor:(()=>{const t=e.vehicleServInfo?.advisor,r=t?.contactInfo?.nameRecId;return r?{contactInfo:{nameRecId:String(r)}}:void 0})()}}}(e);return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n\n \n {{#V.Year}}{{.}}{{/V.Year}}\n {{#V.Odometer}}{{.}}{{/V.Odometer}}\n {{#V.OdometerUnits}}{{.}}{{/V.OdometerUnits}}\n\n {{#V.LicNo}}{{/V.LicNo}}\n \n\n \n {{#V.vehicleServInfo.salesmanNo}}{{.}}{{/V.vehicleServInfo.salesmanNo}}\n {{#V.vehicleServInfo.inServiceDate}}{{.}}{{/V.vehicleServInfo.inServiceDate}}\n {{#V.vehicleServInfo.mileage}}{{.}}{{/V.vehicleServInfo.mileage}}\n {{#V.vehicleServInfo.teamCode}}{{.}}{{/V.vehicleServInfo.teamCode}}\n\n {{#V.vehicleServInfo.vehExtWarranty}}\n \n {{#contractNumber}}{{.}}{{/contractNumber}}\n {{#expirationDate}}{{.}}{{/expirationDate}}\n {{#expirationMileage}}{{.}}{{/expirationMileage}}\n \n {{/V.vehicleServInfo.vehExtWarranty}}\n\n {{#V.vehicleServInfo.advisor}}\n \n \n \n {{/V.vehicleServInfo.advisor}}\n \n\n',{ApplicationArea:n,V:o}),routing:r.routing,envelope:r.envelope,postParse:R,xsdFilename:"rey_RomeServVehicleInsertReq.xsd",elementName:"rey_RomeServVehicleInsertReq"}}(e,r))}async getAdvisors(e,t){return this._send(I(e,t))}async createRepairOrder(e,r){return this._send(function(e={},r={}){if(!r?.routing?.dealerNumber)throw new Q("routing.dealerNumber required");if(!e?.customerNo)throw new Q("customerNo (CustNo) required");if(!e?.departmentType)throw new Q("departmentType (DeptType) required");if(!e?.vin)throw new Q("vin (Vin) required");if(!e?.outsdRoNo)throw new Q("outsdRoNo required");const n={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(n.tax?.payType&&!["All","Cust","Intr","Warr"].includes(n.tax.payType))throw new Q("tax.payType must be one of: All, Cust, Intr, Warr");if(n.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 Q("Taxable flags (CustTxblNTxblFlag, WarrTxblNTxblFlag, IntrTxblNTxblFlag) must be 'T' or 'N'");if(n.rogg?.ops?.some(e=>e.lines?.some(e=>e.itemType&&!["G","P","S","F"].includes(e.itemType))))throw new Q("rogg.ops.lines.itemType must be one of: G, P, S, F");const o={...r?.envelope||{},sender:{component:r?.envelope?.sender?.component??"Rome",task:r?.envelope?.sender?.task??"BSMRO",referenceId:r?.envelope?.sender?.referenceId??"Insert",creatorNameCode:r?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:r?.envelope?.sender?.senderNameCode??"RCI"}},a=t({routing:r.routing,sender:o.sender,creationDateTime:o.creationDateTime,bodId:o.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:a,RO:n}),routing:r.routing,envelope:o,postParse:F,xsdFilename:"rey_RomeCreateBSMRepairOrderReq.xsd"}}(e,r))}async updateRepairOrder(e,r){return this._send(function(e={},r={}){if(!r?.routing?.dealerNumber)throw new Q("routing.dealerNumber required");if(!e?.finalUpdate)throw new Q("finalUpdate (FinalUpdate) required");if(!["Y","N"].includes(e.finalUpdate))throw new Q("finalUpdate must be 'Y' or 'N'");if(!e?.outsdRoNo)throw new Q(" outsdRoNo");const n={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(n.tax?.payType&&!["All","Cust","Intr","Warr"].includes(n.tax.payType))throw new Q("tax.payType must be one of: All, Cust, Intr, Warr");if(n.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 Q("Taxable flags (CustTxblNTxblFlag, WarrTxblNTxblFlag, IntrTxblNTxblFlag) must be 'T' or 'N'");if(n.rogg?.ops?.some(e=>e.lines?.some(e=>e.itemType&&!["G","P","S","F"].includes(e.itemType))))throw new Q("rogg.ops.lines.itemType must be one of: G, P, S, F");const o={...r?.envelope||{},sender:{component:r?.envelope?.sender?.component??"Rome",task:r?.envelope?.sender?.task??"BSMRO",referenceId:r?.envelope?.sender?.referenceId??"Update",creatorNameCode:r?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:r?.envelope?.sender?.senderNameCode??"RCI"}},a=t({routing:r.routing,sender:o.sender,creationDateTime:o.creationDateTime,bodId:o.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:a,RO:n}),routing:r.routing,envelope:o,postParse:F,xsdFilename:"rey_RomeUpdateBSMRepairOrderReq.xsd",elementName:"rey_RomeUpdateBSMRepairOrderReq"}}(e,r))}async getParts(e,r){return this._send(function(e={},r={}){const n=e.roNumber?String(e.roNumber).trim():void 0;if(!n)throw new Q("getParts: roNumber required");const o=t({routing:r.routing,sender:{component:"Rome",task:"RCT",referenceId:"Query",creator:"RCI",senderName:"RCI"}});return{starXml:U.default.render('\n\n {{{ApplicationArea}}}\n \n\n',{ApplicationArea:o,RoNumber:n}),routing:r.routing,envelope:r.envelope,xsdFilename:"rey_RomeGetPartsReq.xsd",elementName:"rey_RomeGetPartsReq",postParse:e=>function(e){return e?.rey_RomeGetPartsResp?.RoParts?.map(e=>({partNumber:w(e,"PartNumber"),partDescription:w(e,"PartDescription"),quantityOrdered:w(e,"QuantityOrdered"),quantityShipped:w(e,"QuantityShipped"),price:w(e,"Price"),cost:w(e,"Cost"),processedFlag:w(e,"ProcessedFlag"),addOrDelete:w(e,"AddOrDelete")}))||[]}(e)}}(e,r))}},exports.errors=W; +"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,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}; diff --git a/server/rr/lib/index.mjs b/server/rr/lib/index.mjs index 09e628d64..8dfe3add9 100644 --- a/server/rr/lib/index.mjs +++ b/server/rr/lib/index.mjs @@ -1 +1 @@ -function e({routing:e={},sender:t={},creationDateTime:r,bodId:n}={}){const o={Sender:{Component:t.component??"Rome",Task:t.task??"CU",ReferenceId:t.referenceId??"Query",CreatorNameCode:t.creator??"RCI",SenderNameCode:t.senderName??"RCI"},CreationDateTime:r??(new Date).toISOString().replace(/\.\d{3}Z$/,"Z"),BODId:n??L(),Destination:{DestinationNameCode:"RR",DealerNumber:e.dealerNumber||"",StoreNumber:e.storeNumber||"",AreaNumber:e.areaNumber||""}},a={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()},s=`\n${["bod","creation","sender","dest"].map(e=>a[e]).join("\n")}\n`;return E.render(s,o).trim()}function t(e,t=2){const r=" ".repeat(t);return String(e).split("\n").map(e=>e.length?r+e:e).join("\n")}function r(e){return String(e??"").replace(/&/g,"&").replace(//g,">")}function n(e,t){if(null==e)return null;if(Array.isArray(e)){for(const r of e){const e=n(r,t);if(null!=e)return e}return null}if("object"!=typeof e)return null;for(const[r,o]of Object.entries(e)){if(t(r,o))return o;const e=n(o,t);if(null!=e)return e}return null}function o(e,t,r=[]){if(null==e)return r;if(Array.isArray(e)){for(const n of e)o(n,t,r);return r}if("object"!=typeof e)return r;for(const[n,a]of Object.entries(e))t(n,a)&&r.push(a),o(a,t,r);return r}function a(e){return null==e?[]:Array.isArray(e)?e:[e]}function s(e,t){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[t])}function i(e,t){const r=s(e,t);if(Q(r))return r;const n=function(e,t){if(e&&"object"==typeof e)return e.$&&Q(e.$[t])?e.$[t]:Q(e[`@_${t}`])?e[`@_${t}`]:Q(e[`@${t}`])?e[`@${t}`]:e._attributes&&Q(e._attributes[t])?e._attributes[t]:e.attributes&&Q(e.attributes[t])?e.attributes[t]:void 0}(e,t);return Q(n)?n:void 0}function l(e,t){if(e&&"object"==typeof e)return null!=e[`@_${t}`]?e[`@_${t}`]: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 m(e){return o(e,e=>/(GenTransStatus|TransStatus)$/i.test(e)).flatMap(a)[0]}function u(e){if(e)return{status:(l(e,"Status")||e.Status||c(e)||"").toString().trim()||void 0,statusCode:(l(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 p(e){if(e)return{status:(l(e,"Status")||e.Status||c(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 d(e){const t=e?.rey_RomeCustServVehCombRes??e?.rey_RomeCustServVehCombReq??e?.rey_RomeCustServVehComb??e??{};return a(t?.CustServVehComb??t?.CustServVehCombRes??t?.CustServVehCombReq??t).map(e=>{const t=e?.NameContactId??void 0,r=t?.NameId??void 0,n=r?.IndName?H(r.IndName):void 0,o=r?.BusName?H(r.BusName):void 0,s=t&&{NameId:r&&{...H(r)||{},...n?{IndName:n}:{},...o?{BusName:o}:{}},Address:a(t?.Address).map(e=>H(e)||{}),ContactOptions:a(t?.ContactOptions).map(e=>H(e)||{}),Phone:a(t?.Phone).map(e=>H(e)||{}),Email:a(t?.Email).map(e=>H(e)||{})},i=a(e?.ServVehicle).map(e=>{const t=e?.Vehicle,r=t?.VehicleDetail,n=t&&{...H(t)||{},...r?{VehicleDetail:H(r)||{}}:{}},o=e?.VehicleServInfo,s=o?.VehExtWarranty,i=o?.Advisor,l=i?.ContactInfo;let c;i&&(c={...H(i)||{},...l?{ContactInfo:H(l)||{}}:{}});const m=o&&{...H(o)||{},...s?{VehExtWarranty:H(s)||{}}:{},...c?{Advisor:c}:{},...o?.VehServComments?{VehServComments:a(o.VehServComments).map(e=>Y(e)).filter(e=>null!=e&&""!==String(e).trim())}:{}};return{...n?{Vehicle:n}:{},...m?{VehicleServInfo:m}:{}}}),l=a(e?.Message).map(e=>{const t=Y(e);return{...H(e)||{},...null!=t&&""!==String(t).trim()?{Text:t}:{}}}).filter(e=>Object.keys(e).length>0),c={};return s&&(c.NameContactId=s),i.length&&(c.ServVehicle=i),l.length&&(c.Message=l),c})}function y(e,t){if(null!=e)return String("string"==typeof e||"number"==typeof e?e:e[t]||"")}function g(e){return String(e??"").trim()||void 0}function N(e,...t){if(e)for(const r of t){if(e.$&&null!=e.$[r])return e.$[r];if(null!=e[`@_${r}`])return e[`@_${r}`];if(null!=e[r]&&"object"!=typeof e[r])return e[r]}}function T(e){const t=function(e){const t=n(e,e=>"rey_RomeCustomerResponse"===e||e.endsWith(":rey_RomeCustomerResponse"));return t?o(t,e=>"TransStatus"===e||e.endsWith(":TransStatus")).flatMap(a)[0]:void console.log("No rey_RomeCustomerResponse found in root")}(e);if(!t)return{dmsRecKey:void 0};const r=N(t,"DMSRecKey");return{dmsRecKey:null!=r?String(r):void 0,status:N(t,"Status"),statusCode:N(t,"StatusCode")}}function b(e){if(null==e)return;const t=String(e).toUpperCase().replace(/[^A-Z0-9 ]+/g,"");if(!t)throw new k(`Invalid string: ${e}. Must contain A-Z, 0-9, or space`);return t}function C(e){return e?String(e).toUpperCase():void 0}function x(e={}){const t=C(e.ibFlag)||(e.firstName?"I":"B");if("I"!==t&&"B"!==t)throw new k("ibFlag must be 'I' or 'B'");const r=e.lastName||e.customerName;if(!r)throw new k("lastName or customerName required");if("I"===t&&!e.firstName)throw new k("firstName required when ibFlag='I'");const n=C(e.customerType);if(n&&!["R","W","I"].includes(n))throw new k("customerType must be 'R', 'W', 'I', Retail, Wholesale, or Internal");const o=(e.addresses||[]).map(e=>{const t={Type:C(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(!t.Addr1)throw new k("Address requires line1");return t}),a=(e.phones||[]).map(e=>{const t={Type:C(e.type)||"H",Num:e.number?String(e.number):void 0,Ext:e.extension?String(e.extension):void 0};if(!t.Num)throw new k("Phone requires number");return t}),s=e.emails?.[0]?.address?{MailTo:String(e.emails[0].address)}:void 0,i=e.personal,l=i?{Gender:C(i.gender),OtherName:b(i.otherName),AnniversaryDate:i.anniversaryDate?String(i.anniversaryDate):void 0,EmployerName:b(i.employerName),EmployerPhone:i.employerPhone?String(i.employerPhone):void 0,Occupation:b(i.occupation),OptOut:i.optOut?String(i.optOut):void 0,OptOutUse:i.optOutUse?String(i.optOutUse):void 0,BirthDates:(i.birthDates||[]).map(e=>({Type:C(e.type)||"P",date:e.date?String(e.date):void 0})).filter(e=>e.date),SSNs:(i.ssns||[]).map(e=>({Type:C(e.type)||"P",ssn:e.ssn?String(e.ssn):void 0})).filter(e=>e.ssn),DriverInfo:i.driver?[{Type:C(i.driver.type)||"P",LicNum:i.driver.licenseNumber?String(i.driver.licenseNumber):void 0,LicState:i.driver.licenseState?String(i.driver.licenseState):void 0,LicExpDate:i.driver.licenseExpDate?String(i.driver.licenseExpDate):void 0}].filter(e=>e.LicNum):void 0,CustChildren:(i.children||[]).map(e=>({ChildName:b(e.name)})).filter(e=>e.ChildName)}:void 0,c=e.dms,m=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:C(e.type),Value:C(e.value)})).filter(e=>e.Type&&e.Value)}:void 0;return{custCateg:n||"R",createdBy:e.createdBy?String(e.createdBy):void 0,contactInfo:{IBFlag:t,LastName:b(r),FirstName:b(e.firstName),MidName:b(e.midName),Salut:b(e.salut),Suffix:b(e.suffix),Addresses:o,Phones:a,Email:s},custPersonal:l,dmsCustInfo:m}}function R(e){const t=n(e,e=>"rey_RomeServVehicleInsertResponse"===e||e.endsWith(":rey_RomeServVehicleInsertResponse"))||e,r=n(t,e=>"GenTransStatus"===e||e.endsWith(":GenTransStatus"));return{status:r?i(r,"Status"):void 0,statusCode:r?i(r,"StatusCode"):void 0}}function f(e,t){const r=Array.isArray(t)?t.map(e=>e.toLowerCase()):[String(t).toLowerCase()],n=[e];for(;n.length;){const e=n.pop();if(Z(e))for(const t of Object.keys(e)){const o=e[t],a=X(t).toLowerCase();if(r.includes(a))return o;if(Z(o))n.push(o);else if(Array.isArray(o))for(const e of o)Z(e)&&n.push(e)}}}function S(e,t){if(e&&Z(e)){if(null!=e.$?.[t])return e.$[t];if(null!=e[`@${t}`])return e[`@${t}`];if(null!=e[`@_${t}`])return e[`@_${t}`]}}function v(e){if(null!=e){if("string"==typeof e)return e;if("number"==typeof e)return String(e);if(Z(e)){if(null!=e._)return String(e._);if(null!=e["#text"])return String(e["#text"]);if(null!=e.text)return String(e.text)}}}function O(e){const t=f(e,["CreateBSMRepairOrderResp","UpdateBSMRepairOrderResp"])||e,r=f(t,"RoRecordStatus")||{};return{status:S(r,"Status")||v(f(r,"Status")),date:S(r,"Date")||v(f(r,"Date")),time:S(r,"Time")||v(f(r,"Time")),outsdRoNo:S(r,"OutsdRoNo")||v(f(r,"OutsdRoNo")),dmsRoNo:S(r,"DMSRoNo")||v(f(r,"DMSRoNo")),errorMessage:S(r,"ErrorMessage")||v(f(r,"ErrorMessage"))}}function F(t={},r={}){const n=function(e){if(!e)throw new Error("department is required (S, P, B, SERVICE, PARTS, BODY)");const t=String(e).trim().toUpperCase();if("S"===t||"P"===t||"B"===t)return t;if("SERVICE"===t)return"S";if("PART"===t||"PARTS"===t)return"P";if("BODY"===t||"BODYSHOP"===t||"BODY SHOP"===t)return"B";throw new Error(`Invalid department: ${e}. Must be S, P, B, SERVICE, PARTS, BODY, BODYSHOP, or BODY SHOP`)}(t.department),o=t.advisorNumber?String(t.advisorNumber).trim():void 0,a=e({routing:r.routing,sender:r?.envelope?.sender,creationDateTime:r?.envelope?.creationDateTime,bodId:r?.envelope?.bodId});return{starXml:E.render('\n\n {{{ApplicationArea}}}\n \n \n \n\n',{ApplicationArea:a,DepartmentType:n,AdvisorNumber:o}),routing:r.routing,envelope:r.envelope,xsdFilename:"rey_RomeGetAdvisorsReq.xsd",elementName:"rey_RomeGetAdvisorsReq",postParse:e=>function(e,t={}){const r=t?.department;var n;return(e=>{const t=e?.Advisor;return t?Array.isArray(t)?t:[t]:[]})((n=e,n?.rey_RomeGetAdvisorsResp??n??{})).map(e=>({advisorId:J(e,"AdvisorNumber"),firstName:J(e,"FirstName"),lastName:J(e,"LastName"),department:r}))}(e,{department:n})}}function I(e){return null==e?void 0:String(e)}function h(e,t){if(e)return null!=e[t]?"object"!=typeof e[t]?I(e[t]):I(e[t]["#text"]):null!=e[`@_${t}`]?I(e[`@_${t}`]):void 0}function w(e){const t=e?.meta?.statusBlocks?.transaction?.message;if(t)return String(t);return String((e?.meta?.status?.Message??e?.meta?.status?.message)||e?.message||"")}function P(e,t){return Math.min(1e4,e*Math.pow(2,t))}function D(e){return e+Math.floor(250*Math.random())}function A(e){return new Promise(t=>setTimeout(t,e))}function M(e){return/lock|in use|record.*busy/i.test(String(e||""))}function V(e,t="****"){if(!e||"string"!=typeof e)return e;let r=e;return r=r.replace(/(]*>)([^<]*)(<\/wsse:Username>)/gi,`$1${t}$3`),r=r.replace(/(]*>)([^<]*)(<\/wsse:Password>)/gi,`$1${t}$3`),r}import E from"mustache";import{v4 as L}from"uuid";import{create as _}from"xmlbuilder2";import j from"axios";import{XMLParser as B}from"fast-xml-parser";class q extends Error{constructor(e,t={}){super(e),this.name="RRTransportError",this.meta=t}}class U extends Error{constructor(e,t={}){super(e),this.name="RRVendorStatusError",this.meta=t,this.retryable=!!t.retryable}}class k extends Error{constructor(e,t={}){super(e),this.name="RRValidationError",this.meta=t}}const $=Object.freeze({__proto__:null,RRTransportError:q,RRVendorStatusError:U,RRValidationError:k}),G={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(),W=new B({ignoreAttributes:!1,attributeNamePrefix:"@_",parseAttributeValue:!1,parseTagValue:!1,isArray:e=>["Advisor"].includes(e)}),H=e=>{if(!e||"object"!=typeof e)return;const t={};for(const[r,n]of Object.entries(e))r.startsWith("@_")&&(t[r.slice(2)]=n);return Object.keys(t).length?t:void 0},Y=e=>{if(null!=e)return"string"==typeof e?e:e["#text"]},X=e=>{if("string"!=typeof e)return"";let t=e.includes("}")?e.split("}").pop():e;return t=t.includes(":")?t.split(":").pop():t,t.startsWith("rey_")&&(t=t.slice(4)),t},Z=e=>e&&"object"==typeof e&&!Array.isArray(e),J=(e,t)=>((e,t)=>e?.[`@_${t}`])(e,t)??s(e,t);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:G,retries:{max:3},...e},this.mask={password:!0}}async _send(e){const{starXml:n,routing:s,envelope:i,postParse:d}=e,y=this.cfg.logger||G,{bodId:g,creationDateTime:N,sender:T}=function(e){return{bodId:e?.bodId||L(),creationDateTime:e?.creationDateTime||new Date,sender:e?.sender||{}}}(i),b=function({username:e,password:n,wssePasswordType:o="Text",starContentXml:a,normalize:s=!0,normalizeOptions:i}={}){const l=function(e){return`\n \n \n \n${t(e,10)}\n \n \n \n `.trim()}(a),c=`\n \n \n${t(function(e,t,n){const o="Digest"===n?' 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 ${r(e)}\n ${r(t)}\n \n \n `.trim()}(e,n,o),8)}\n \n \n${t(l,8)}\n \n \n `.trim();return s?function(e,{prettyPrint:t=!0}={}){if(!e||"string"!=typeof e)return e;try{return _(e).end({prettyPrint:t,width:0,indent:" ",newline:"\n"}).trim()}catch(t){return String(e).trim()}}(c,i):c}({username:this.cfg.username,password:this.cfg.password,wssePasswordType:this.cfg.wssePasswordType||"Text",routing:s,sender:T,creationDateTime:(x=N,"string"==typeof x?x:(x instanceof Date?x:new Date).toISOString().replace(/\.\d{3}Z$/,"Z")),bodId:g,starContentXml:n}),C=V(b);var x;"1"===process.env.RR_DUMP_ENVELOPE&&console.log(`[rr] Soap envelope about to send (${e?.elementName}): \n`+C+"\n");const R=async()=>{const t=await async function({baseUrl:e,envelopeXml:t,timeoutMs:r=3e4,logger:n}){try{const n=await j.post(e,t,{timeout:r,headers:{"Content-Type":"text/xml; charset=utf-8",SOAPAction:"http://www.starstandards.org/webservices/2005/10/transport/ProcessMessage"},responseType:"text",validateStatus:()=>!0});if(n.status>=200&&n.status<300)return String(n.data??"");throw new q(`HTTP ${n.status}: ${function(e){const t=String(e??"");return t.length>1024?t.slice(0,1024)+"…":t}(n.data)}`,{status:n.status,body:n.data})}catch(e){if(j.isAxiosError(e))throw new q(`Network error: ${e.message}`,{cause:e});throw e}}({baseUrl:this.cfg.baseUrl,envelopeXml:b,timeoutMs:this.cfg.timeoutMs,logger:y}),r=function(e){const t=W.parse(e),r=t?.Envelope||t?.["soapenv:Envelope"]||t,n=r?.Body||r?.["soapenv:Body"]||r?.["S:Body"]||r?.["soap:Body"],o=n?.ProcessMessageResponse||n?.["ns2:ProcessMessageResponse"]||n?.["trans:ProcessMessageResponse"]||n,a=o?.payload||o?.["ns2:payload"]||o;return a?.content||a?.["ns2:content"]||a}(t),n=V(t),s=function(e){const t=m(e),r=o(e,e=>/RoRecordStatus$/i.test(e)).flatMap(a)[0];return{transaction:u(t),roRecord:p(r)}}(r),i=function(e){const t=String("ApplicationArea").toLowerCase(),r=[e];for(;r.length;){const e=r.pop();if(e&&"object"==typeof e)for(const[n,o]of Object.entries(e)){if(n.toLowerCase().endsWith(t))return o;o&&"object"==typeof o&&r.push(o)}}}(r),{status:g,norm:N}=function(e){const t=m(e)||o(e,e=>/Status$/i.test(e)).flatMap(a)[0]||{},r=(l(t,"Status")||t.Status||"").toString().trim();let n=(l(t,"StatusCode")||t.StatusCode||"").toString().trim();const s=t.Message&&c(t.Message)||c(t)||"";!n&&/success/i.test(r)&&(n="0");const i=Number(n);let u="FAIL";return/success/i.test(r)||0===i?u="SUCCESS":2!==i&&213!==i||(u="NO_MATCH"),{status:{Status:r,StatusCode:n,Message:s},norm:{kind:u,code:Number.isFinite(i)?i:void 0,message:s}}}(r);if("1"===process.env.RR_DUMP_STATUS&&(console.log("[rr] Status blocks:"),console.dir(s,{depth:null,colors:!0})),"1"===process.env.RR_DUMP_APPLICATION&&(console.log("[rr] ApplicationArea:"),console.dir(i,{depth:null,colors:!0})),"FAIL"===N.kind){const e=g?.StatusCode;throw new U(`Vendor status failure: ${e??""} ${g?.Message||g?.["#text"]||""}`.trim(),{status:g,resXml:n})}const T={success:"SUCCESS"===N.kind||"NO_MATCH"===N.kind,statusBlocks:s,applicationArea:i,xml:{request:C,response:n},parsed:r};if("function"==typeof d)try{T.data=d(r)}catch(e){y?.warn?.(`postParse failed: ${e?.message||e}`)}return"1"===process.env.RR_DUMP_XML&&console.log(`[rr] Full response XML (${e?.elementName}):\n`+n+"\n"),T?.data&&"1"===process.env.RR_DUMP_DATA&&(console.log(`[rr] Parsed response data (${e?.elementName}):\n`),console.dir(T.data,{depth:null,colors:!0})),T};try{return await async function(e,{max:t=3,logger:r}){let n,o=0;for(;o=t)break;const s=D(P(400,o));r?.warn?.(`Retrying attempt ${o}/${t} in ${s}ms: ${e.message}`),await A(s)}throw n}(R,{max:this.cfg.retries?.max??3,logger:y})}catch(e){if(e instanceof q||e instanceof U)throw e;throw new q(`Unexpected error: ${e?.message||e}`,{cause:e})}}async combinedSearch(t,r){return this._send(function(t={},r={}){if(!t||"object"!=typeof t)throw new k("combinedSearch requires a query object");const n=function(e){if(!e)return"";const t=String(e).trim().toLowerCase();return"telephone"===t?"phone":"lic"===t||"plate"===t?"license":"vin"===t||"partvin"===t?"vin":"name"===t?"name":"namerecid"===t||"custid"===t?"nameRecId":"stkno"===t||"stock"===t?"stkNo":t}(t.kind),o={MaxRecs:Math.min(Number(t.maxResults||t.maxRecs||50),50)};if("phone"===n){const e=y(t.phone,"phone");if(!e)throw new k("combinedSearch phone value missing");o.Phone=e}else if("license"===n){const e=y(t.license,"license");if(!e)throw new k("combinedSearch license value missing");o.LicenseNum=e}else if("vin"===n){const e=y(t.vin,"vin");if(!e)throw new k("combinedSearch vin value missing");o.PartVIN=e}else if("name"===n){const e=t.name;if("string"==typeof e){const t=e.trim();if(!t)throw new k("combinedSearch name string is empty");o.LName=t}else{if(!e||"object"!=typeof e)throw new k("combinedSearch name requires { fname/lname/mname } object or a last-name string");{const t=g(e.fname),r=g(e.mname),n=g(e.lname),a=!t&&!r&&!n&&g(e.name);if(t||r||n)o.FullName={FName:t,MName:r,LName:n};else{if(!a)throw new k("combinedSearch name requires string last name, or object with any of { fname, lname, mname }");o.LName=a}}}}else if("nameRecId"===n){const e=y(t.nameRecId??t.custId,"custId");if(!e)throw new k("combinedSearch nameRecId value missing");o.NameRecId=e}else{if("stkNo"!==n)throw new k(`Unsupported CombinedSearch kind: ${t.kind}`);{const e=y(t.stkNo??t.stock,"stkNo");if(!e)throw new k("combinedSearch stkNo value missing");o.StkNo=e}}if(1!==[o.Phone,o.LicenseNum,o.PartVIN,o.LName,o.FullName,o.NameRecId,o.StkNo].filter(Boolean).length)throw new k("combinedSearch requires exactly one search criterion");const a=g(t.make),s=g(t.model),i=g(t.year);(a||s||i)&&(o.VehData={MakePfx:a,Model:s,Year:i});const l=e({routing:r.routing,sender:{component:"Rome",task:"CVC",referenceId:"Query",creator:"RCI",senderName:"RCI"},order:"creation-bod-sender-destination"});return{starXml:E.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,...o}),routing:r.routing,envelope:r.envelope,elementName:"rey_RomeCustServVehCombReq",xsdFilename:"rey_RomeCustServVehCombReq.xsd",postParse:d}}(t,r))}async insertCustomer(t,r){return this._send(function(t,r){if(!r?.routing?.dealerNumber)throw new k("routing.dealerNumber required");const n=x(t),o=e({routing:r.routing,sender:{component:"Rome",task:"CU",referenceId:"Insert"},order:"sender-creation-bod-destination"});return{starXml:E.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:o,C:n}),routing:r.routing,envelope:r.envelope,postParse:T,xsdFilename:"rey_RomeCustomerInsertReq.xsd",elementName:"rey_RomeCustomerInsertReq"}}(t,r))}async updateCustomer(t,r){return this._send(function(t,r){if(!r?.routing?.dealerNumber)throw new k("routing.dealerNumber required");if(!t.nameRecId)throw new k("nameRecId or customerId required");const n=C(t.ibFlag);if("I"!==n&&"B"!==n)throw new k("ibFlag required ('I' or 'B')");const o=x(t);o.contactInfo.NameRecId=String(t.nameRecId);const a=e({routing:r.routing,sender:{component:"Rome",task:"CU",referenceId:"Update"},order:"sender-creation-bod-destination"});return{starXml:E.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:a,C:o}),routing:r.routing,envelope:r.envelope,postParse:T,xsdFilename:"rey_RomeCustomerUpdateReq.xsd",elementName:"rey_RomeCustomerUpdateReq"}}(t,r))}async insertServiceVehicle(t,r){return this._send(function(t={},r={}){if(!r?.routing?.dealerNumber)throw new k("routing.dealerNumber is required");const n=e({routing:r.routing,sender:r?.envelope?.sender??{component:"Rome",task:"SV",referenceId:"Insert"},creationDateTime:r?.envelope?.creationDateTime,bodId:r?.envelope?.bodId}),o=function(e={}){const t=e.vin;if(!t)throw new k("insertServiceVehicle: vin is required");const r=e.vehicleServInfo?.customerNo;if(!r)throw new k("insertServiceVehicle: vehicleServInfo.customerNo (or customerNo) is required");return{VIN:String(t),ModelDesc:e.modelDesc,Carline:e.carline,ExtClrDesc:e.extClrDesc,IntClrDesc:e.intClrDesc,TrimDesc:e.trimDesc,BodyStyle:e.bodyStyle,EngineDesc:e.engineDesc,TransDesc:e.transDesc,Year:e.year,Odometer:e.odometer,OdometerUnits:e.odometerUnits,LicNo:e.vehicleDetail?.licNo,CustomerNo:String(r),vehicleServInfo:{salesmanNo:e.vehicleServInfo?.salesmanNo,inServiceDate:e.vehicleServInfo?.inServiceDate,mileage:e.vehicleServInfo?.mileage,teamCode:e.vehicleServInfo?.teamCode,vehExtWarranty:(()=>{const t=e.vehicleServInfo?.vehExtWarranty;if(!t)return;const r={contractNumber:t.contractNumber,expirationDate:t.expirationDate,expirationMileage:t.expirationMileage};return Object.values(r).some(e=>null!=e&&""!==e)?r:void 0})(),advisor:(()=>{const t=e.vehicleServInfo?.advisor,r=t?.contactInfo?.nameRecId;return r?{contactInfo:{nameRecId:String(r)}}:void 0})()}}}(t);return{starXml:E.render('\n\n {{{ApplicationArea}}}\n\n \n {{#V.Year}}{{.}}{{/V.Year}}\n {{#V.Odometer}}{{.}}{{/V.Odometer}}\n {{#V.OdometerUnits}}{{.}}{{/V.OdometerUnits}}\n\n {{#V.LicNo}}{{/V.LicNo}}\n \n\n \n {{#V.vehicleServInfo.salesmanNo}}{{.}}{{/V.vehicleServInfo.salesmanNo}}\n {{#V.vehicleServInfo.inServiceDate}}{{.}}{{/V.vehicleServInfo.inServiceDate}}\n {{#V.vehicleServInfo.mileage}}{{.}}{{/V.vehicleServInfo.mileage}}\n {{#V.vehicleServInfo.teamCode}}{{.}}{{/V.vehicleServInfo.teamCode}}\n\n {{#V.vehicleServInfo.vehExtWarranty}}\n \n {{#contractNumber}}{{.}}{{/contractNumber}}\n {{#expirationDate}}{{.}}{{/expirationDate}}\n {{#expirationMileage}}{{.}}{{/expirationMileage}}\n \n {{/V.vehicleServInfo.vehExtWarranty}}\n\n {{#V.vehicleServInfo.advisor}}\n \n \n \n {{/V.vehicleServInfo.advisor}}\n \n\n',{ApplicationArea:n,V:o}),routing:r.routing,envelope:r.envelope,postParse:R,xsdFilename:"rey_RomeServVehicleInsertReq.xsd",elementName:"rey_RomeServVehicleInsertReq"}}(t,r))}async getAdvisors(e,t){return this._send(F(e,t))}async createRepairOrder(t,r){return this._send(function(t={},r={}){if(!r?.routing?.dealerNumber)throw new k("routing.dealerNumber required");if(!t?.customerNo)throw new k("customerNo (CustNo) required");if(!t?.departmentType)throw new k("departmentType (DeptType) required");if(!t?.vin)throw new k("vin (Vin) required");if(!t?.outsdRoNo)throw new k("outsdRoNo required");const n={customerNo:t.customerNo,advisorNo:t.advisorNo,tagNo:t.tagNo,outsdRoNo:t.outsdRoNo,departmentType:t.departmentType,vin:t.vin,mileageIn:t.mileageIn,roComment:t.roComment,estimate:t.estimate?{parts:t.estimate.parts,labor:t.estimate.labor,total:t.estimate.total}:void 0,tax:t.tax?{payType:t.tax.payType,taxCode:t.tax.taxCode,txblGrossAmt:t.tax.txblGrossAmt,grossTaxAmt:t.tax.grossTaxAmt}:void 0,rolabor:t.rolabor?{ops:t.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:t.ropart?{jobs:t.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:t.rogg?{roNo:t.rogg.roNo,ops:t.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:t.romisc?{roNo:t.romisc.roNo,ops:t.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(n.tax?.payType&&!["All","Cust","Intr","Warr"].includes(n.tax.payType))throw new k("tax.payType must be one of: All, Cust, Intr, Warr");if(n.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(n.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 o={...r?.envelope||{},sender:{component:r?.envelope?.sender?.component??"Rome",task:r?.envelope?.sender?.task??"BSMRO",referenceId:r?.envelope?.sender?.referenceId??"Insert",creatorNameCode:r?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:r?.envelope?.sender?.senderNameCode??"RCI"}},a=e({routing:r.routing,sender:o.sender,creationDateTime:o.creationDateTime,bodId:o.bodId});return{starXml:E.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:a,RO:n}),routing:r.routing,envelope:o,postParse:O,xsdFilename:"rey_RomeCreateBSMRepairOrderReq.xsd"}}(t,r))}async updateRepairOrder(t,r){return this._send(function(t={},r={}){if(!r?.routing?.dealerNumber)throw new k("routing.dealerNumber required");if(!t?.finalUpdate)throw new k("finalUpdate (FinalUpdate) required");if(!["Y","N"].includes(t.finalUpdate))throw new k("finalUpdate must be 'Y' or 'N'");if(!t?.outsdRoNo)throw new k(" outsdRoNo");const n={finalUpdate:t.finalUpdate||"N",roNo:t.roNo,customerNo:t.customerNo,tagNo:t.tagNo,outsdRoNo:t.outsdRoNo,departmentType:t.departmentType,vin:t.vin,mileageIn:t.mileageIn,mileageOut:t.mileageOut,roComment:t.roComment,estimate:t.estimate?{estimateType:t.estimate.estimateType}:void 0,tax:t.tax?{payType:t.tax.payType,taxCode:t.tax.taxCode,txblGrossAmt:t.tax.txblGrossAmt,grossTaxAmt:t.tax.grossTaxAmt}:void 0,rolabor:t.rolabor?{ops:t.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:t.ropart?{jobs:t.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:t.rogg?{roNo:t.rogg.roNo,ops:t.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:t.romisc?{roNo:t.romisc.roNo,ops:t.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(n.tax?.payType&&!["All","Cust","Intr","Warr"].includes(n.tax.payType))throw new k("tax.payType must be one of: All, Cust, Intr, Warr");if(n.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(n.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 o={...r?.envelope||{},sender:{component:r?.envelope?.sender?.component??"Rome",task:r?.envelope?.sender?.task??"BSMRO",referenceId:r?.envelope?.sender?.referenceId??"Update",creatorNameCode:r?.envelope?.sender?.creatorNameCode??"RCI",senderNameCode:r?.envelope?.sender?.senderNameCode??"RCI"}},a=e({routing:r.routing,sender:o.sender,creationDateTime:o.creationDateTime,bodId:o.bodId});return{starXml:E.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:a,RO:n}),routing:r.routing,envelope:o,postParse:O,xsdFilename:"rey_RomeUpdateBSMRepairOrderReq.xsd",elementName:"rey_RomeUpdateBSMRepairOrderReq"}}(t,r))}async getParts(t,r){return this._send(function(t={},r={}){const n=t.roNumber?String(t.roNumber).trim():void 0;if(!n)throw new k("getParts: roNumber required");const o=e({routing:r.routing,sender:{component:"Rome",task:"RCT",referenceId:"Query",creator:"RCI",senderName:"RCI"}});return{starXml:E.render('\n\n {{{ApplicationArea}}}\n \n\n',{ApplicationArea:o,RoNumber:n}),routing:r.routing,envelope:r.envelope,xsdFilename:"rey_RomeGetPartsReq.xsd",elementName:"rey_RomeGetPartsReq",postParse:e=>function(e){return e?.rey_RomeGetPartsResp?.RoParts?.map(e=>({partNumber:h(e,"PartNumber"),partDescription:h(e,"PartDescription"),quantityOrdered:h(e,"QuantityOrdered"),quantityShipped:h(e,"QuantityShipped"),price:h(e,"Price"),cost:h(e,"Cost"),processedFlag:h(e,"ProcessedFlag"),addOrDelete:h(e,"AddOrDelete")}))||[]}(e)}}(t,r))}}export{z as RRClient,$ as errors}; +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,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}; diff --git a/server/rr/rr-export-logs.js b/server/rr/rr-export-logs.js index 269b7d43b..27acca0e3 100644 --- a/server/rr/rr-export-logs.js +++ b/server/rr/rr-export-logs.js @@ -8,10 +8,24 @@ const getAuthToken = (socket) => /** Compact metadata for RR */ const buildRRExportMeta = ({ result, extra = {} }) => { - const roStatus = result?.roStatus || result?.data?.roStatus || null; + const tx = result?.statusBlocks?.transaction; + const rawRoStatus = result?.roStatus || result?.data?.roStatus || null; + + const roStatus = + rawRoStatus || + (tx + ? { + status: tx.status ?? tx.Status, + statusCode: tx.statusCode ?? tx.StatusCode, + message: tx.message ?? tx.Message + } + : null); + return { provider: "rr", - success: Boolean(result?.success || roStatus?.status === "Success"), + success: Boolean( + result?.success || (roStatus && String(roStatus.status || roStatus.Status).toUpperCase() === "SUCCESS") + ), customerNo: result?.customerNo, svId: result?.svId, roStatus: roStatus && { @@ -55,7 +69,12 @@ const buildMessageJSONString = ({ error, classification, result, fallback }) => else if (error?.message) push(error.message); // RR status message - push(result?.roStatus?.message ?? result?.roStatus?.Message); + push( + result?.roStatus?.message ?? + result?.roStatus?.Message ?? + result?.statusBlocks?.transaction?.message ?? + result?.statusBlocks?.transaction?.Message + ); // Fallback push(fallback || "RR export failed"); diff --git a/server/rr/rr-job-export.js b/server/rr/rr-job-export.js index b58e8889e..cb143f98b 100644 --- a/server/rr/rr-job-export.js +++ b/server/rr/rr-job-export.js @@ -1,5 +1,3 @@ -// server/rr/rr-job-exports.js - const { buildRRRepairOrderPayload } = require("./rr-job-helpers"); const { buildClientAndOpts } = require("./rr-lookup"); const CreateRRLogEvent = require("./rr-logger-event"); @@ -7,26 +5,59 @@ const { extractRrResponsibilityCenters } = require("./rr-responsibility-centers" const CdkCalculateAllocations = require("../cdk/cdk-calculate-allocations").default; /** - * Step 1: Export a job to Reynolds & Reynolds as a *new* Repair Order. - * - * This is the "create" phase only: - * - We always call client.createRepairOrder(payload, opts) - * - Any follow-up / finalUpdate is handled by finalizeRRRepairOrder - * - * When in RR mode (bodyshop.rr_dealerid truthy), we also: - * - Extract responsibility center config (for logging / debugging) - * - Run CdkCalculateAllocations to produce the allocations array - * (with profitCenter/costCenter + rr_gogcode / rr_item_type / rr_cust_txbl_flag) - * - Derive a default RR OpCode + TaxCode (if configured) - * - Pass bodyshop, allocations, opCode, taxCode into buildRRRepairOrderPayload - * so it can create the payload fields used by reynolds-rome-client: - * - header fields (CustNo, AdvNo, DeptType, Vin, etc.) - * - RO.rolabor (ops[]) - * - RO.rogg (ops[]) - * - RO.tax (TaxCodeInfo) - * + * Derive RR status information from response object. + * @param rrRes + * @returns {{status: *, statusCode: *|undefined, message}|null} + */ +const deriveRRStatus = (rrRes = {}) => { + const data = rrRes.data || {}; + const tx = rrRes.statusBlocks && rrRes.statusBlocks.transaction; + + const pick = (obj, ...keys) => { + if (!obj) return undefined; + for (const k of keys) { + if (obj[k] != null) return obj[k]; + } + return undefined; + }; + + let status = + pick(data.roStatus, "status", "Status") || pick(data, "status", "Status") || pick(tx, "status", "Status"); + + let statusCode = + pick(data.roStatus, "statusCode", "StatusCode") || + pick(data, "statusCode", "StatusCode") || + pick(tx, "statusCode", "StatusCode"); + + let message = pick(data.roStatus, "message", "Message") || data.errorMessage || pick(tx, "message", "Message"); + + // Last resort: parse from XML if present + if ((!status || !message) && typeof rrRes.xml === "string") { + const m = rrRes.xml.match(/<(?:GenTransStatus|TransStatus)\b([^>]*)>([^<]*)<\/(?:GenTransStatus|TransStatus)>/i); + if (m) { + const attrs = m[1] || ""; + const body = (m[2] || "").trim(); + const statusMatch = attrs.match(/\bStatus="([^"]*)"/i); + const codeMatch = attrs.match(/\bStatusCode="([^"]*)"/i); + if (!status && statusMatch) status = statusMatch[1]; + if (!statusCode && codeMatch) statusCode = codeMatch[1]; + if (!message && body) message = body; + } + } + + if (!status && !statusCode && !message) return null; + + return { + status, + statusCode: statusCode != null && statusCode !== "" ? statusCode : undefined, + message: message || undefined + }; +}; + +/** + * Step 1: Export a job to RR as a new Repair Order. * @param args - * @returns {Promise<{success, data: *, roStatus: *, statusBlocks, customerNo: string, svId: string|null, roNo: *}>} + * @returns {Promise<{success: boolean, data: *, roStatus: {status: *, statusCode: *|undefined, message}, statusBlocks: *|{}, customerNo: string, svId: *, roNo: *, xml: *}>} */ const exportJobToRR = async (args) => { const { bodyshop, job, advisorNo, selectedCustomer, txEnvelope, socket, svId } = args || {}; @@ -63,77 +94,57 @@ const exportJobToRR = async (args) => { let rrCentersConfig = null; let allocations = null; let opCode = null; - let taxCode = null; + // let taxCode = null; - if (bodyshop.rr_dealerid) { - // 1) Responsibility center config (for visibility / debugging) - try { - rrCentersConfig = extractRrResponsibilityCenters(bodyshop); + // 1) Responsibility center config (for visibility / debugging) + try { + rrCentersConfig = extractRrResponsibilityCenters(bodyshop); - CreateRRLogEvent(socket, "SILLY", "RR responsibility centers resolved", { - hasCenters: !!bodyshop.md_responsibility_centers, - profitCenters: Object.keys(rrCentersConfig?.profitsByName || {}), - costCenters: Object.keys(rrCentersConfig?.costsByName || {}), - dmsCostDefaults: rrCentersConfig?.dmsCostDefaults || {}, - dmsProfitDefaults: rrCentersConfig?.dmsProfitDefaults || {} - }); - } catch (e) { - CreateRRLogEvent(socket, "ERROR", "Failed to resolve RR responsibility centers", { - message: e?.message, - stack: e?.stack - }); - } - - // 2) Allocations (sales + cost by center, with rr_* metadata already attached) - try { - allocations = await CdkCalculateAllocations(socket, job.id); - - CreateRRLogEvent(socket, "SILLY", "RR allocations resolved", { - hasAllocations: Array.isArray(allocations), - count: Array.isArray(allocations) ? allocations.length : 0 - }); - } catch (e) { - CreateRRLogEvent(socket, "ERROR", "Failed to calculate RR allocations", { - message: e?.message, - stack: e?.stack - }); - allocations = null; // We still proceed with a header-only RO if this fails. - } - - // 3) OpCode (global, but overridable) - // - baseOpCode can come from bodyshop or rrCentersConfig (you'll map it in onboarding) - // - txEnvelope can carry an explicit override field (opCode/opcode/op_code) - const baseOpCode = - bodyshop.rr_default_opcode || - bodyshop.rr_opcode || - rrCentersConfig?.defaultOpCode || - rrCentersConfig?.rrDefaultOpCode || - "51DOZ"; // TODO Change / implement default handling policy - - const opCodeOverride = txEnvelope?.opCode || txEnvelope?.opcode || txEnvelope?.op_code || null; - - if (opCodeOverride || baseOpCode) { - opCode = String(opCodeOverride || baseOpCode).trim() || null; - } - - // 4) TaxCode (for header-level tax, e.g. state/prov tax) - const baseTaxCode = - bodyshop.rr_default_taxcode || - bodyshop.rr_tax_code || - rrCentersConfig?.defaultTaxCode || - rrCentersConfig?.rrDefaultTaxCode || - "TEST"; // TODO Change / implement default handling policy - - if (baseTaxCode) { - taxCode = String(baseTaxCode).trim() || null; - } - - CreateRRLogEvent(socket, "SILLY", "RR op/tax config resolved", { - opCode, - taxCode + CreateRRLogEvent(socket, "SILLY", "RR responsibility centers resolved", { + hasCenters: !!bodyshop.md_responsibility_centers, + profitCenters: Object.keys(rrCentersConfig?.profitsByName || {}), + costCenters: Object.keys(rrCentersConfig?.costsByName || {}), + dmsCostDefaults: rrCentersConfig?.dmsCostDefaults || {}, + dmsProfitDefaults: rrCentersConfig?.dmsProfitDefaults || {} + }); + } catch (e) { + CreateRRLogEvent(socket, "ERROR", "Failed to resolve RR responsibility centers", { + message: e?.message, + stack: e?.stack }); } + // 2) Allocations (sales + cost by center, with rr_* metadata already attached) + try { + allocations = await CdkCalculateAllocations(socket, job.id); + + CreateRRLogEvent(socket, "SILLY", "RR allocations resolved", { + hasAllocations: Array.isArray(allocations), + count: Array.isArray(allocations) ? allocations.length : 0 + }); + } catch (e) { + CreateRRLogEvent(socket, "ERROR", "Failed to calculate RR allocations", { + message: e?.message, + stack: e?.stack + }); + allocations = null; // We still proceed with a header-only RO if this fails. + } + + // 3) OpCode (global, but overridable) + // - baseOpCode can come from bodyshop or rrCentersConfig (you'll map it in onboarding) + // - txEnvelope can carry an explicit override field (opCode/opcode/op_code) + const baseOpCode = bodyshop?.rr_configuration?.baseOpCode || "28TOZ"; // TODO Change / implement default handling policy + + const opCodeOverride = txEnvelope?.opCode || txEnvelope?.opcode || txEnvelope?.op_code || null; + + if (opCodeOverride || baseOpCode) { + opCode = String(opCodeOverride || baseOpCode).trim() || null; + } + + CreateRRLogEvent(socket, "SILLY", "RR OP config resolved", { + opCode + }); + // Build RO payload for create. // // NOTE: @@ -147,8 +158,7 @@ const exportJobToRR = async (args) => { story, makeOverride, allocations, - opCode, - taxCode + opCode }); const response = await client.createRepairOrder(payload, finalOpts); @@ -159,32 +169,42 @@ const exportJobToRR = async (args) => { }); const data = response?.data || null; - const roStatus = data?.roStatus || null; + const statusBlocks = response?.statusBlocks || {}; + const roStatus = deriveRRStatus(response); + + const statusUpper = roStatus?.status ? String(roStatus.status).toUpperCase() : null; + + let success = false; + + if (statusUpper) { + // Treat explicit FAILURE / ERROR as hard failures + success = !["FAILURE", "ERROR"].includes(statusUpper); + } else if (typeof response?.success === "boolean") { + // Fallback to library boolean if no explicit status + success = response.success; + } else if (roStatus?.status) { + success = String(roStatus.status).toUpperCase() === "SUCCESS"; + } // Extract canonical roNo you'll need for finalize step const roNo = data?.dmsRoNo ?? data?.outsdRoNo ?? roStatus?.dmsRoNo ?? null; return { - success: response?.success === true || roStatus?.status === "Success", + success, data, roStatus, - statusBlocks: response?.statusBlocks || [], + statusBlocks, customerNo: String(selected), - // svId comes from the earlier ensureRRServiceVehicle call (if the caller passes it) svId, - roNo + roNo, + xml: response?.xml // expose XML for logging/diagnostics }; }; /** - * Step 2: Finalize an RR Repair Order by sending finalUpdate: "Y". - * This is the *update* phase. - * - * We intentionally do NOT send Rogog/Rolabor here — all of that is pushed on - * create; finalize is just a header-level update (FinalUpdate + estimateType). - * + * Step 2: Finalize an existing RR Repair Order (previously created). * @param args - * @returns {Promise<{success, data: *, roStatus: *, statusBlocks}>} + * @returns {Promise<{success: boolean, data: *, roStatus: {status: *, statusCode: *|undefined, message}, statusBlocks: *|{}, xml: *}>} */ const finalizeRRRepairOrder = async (args) => { const { bodyshop, job, advisorNo, customerNo, roNo, vin, socket } = args || {}; @@ -251,14 +271,27 @@ const finalizeRRRepairOrder = async (args) => { }); const data = rrRes?.data || null; - const roStatus = data?.roStatus || null; + const statusBlocks = rrRes?.statusBlocks || {}; + const roStatus = deriveRRStatus(rrRes); + + const statusUpper = roStatus?.status ? String(roStatus.status).toUpperCase() : null; + + let success = false; + if (statusUpper) { + success = !["FAILURE", "ERROR"].includes(statusUpper); + } else if (typeof rrRes?.success === "boolean") { + success = rrRes.success; + } else if (roStatus?.status) { + success = String(roStatus.status).toUpperCase() === "SUCCESS"; + } return { - success: rrRes?.success === true || roStatus?.status === "Success", + success, data, roStatus, - statusBlocks: rrRes?.statusBlocks || [] + statusBlocks, + xml: rrRes?.xml }; }; -module.exports = { exportJobToRR, finalizeRRRepairOrder }; +module.exports = { exportJobToRR, finalizeRRRepairOrder, deriveRRStatus }; diff --git a/server/rr/rr-job-helpers.js b/server/rr/rr-job-helpers.js index 9e9d34f17..8ec0cf302 100644 --- a/server/rr/rr-job-helpers.js +++ b/server/rr/rr-job-helpers.js @@ -161,100 +161,6 @@ const buildRolaborFromRogog = (rogg, { payType = "Cust" } = {}) => { return { ops }; }; -/** - * Build a header-level TaxCodeInfo payload from allocations (e.g. PROVINCIAL SALES TAX line). - * - * Shape returned matches what `buildCreateRepairOrder` expects for: - * - * payload.tax = { - * payType, - * taxCode, - * txblGrossAmt, - * grossTaxAmt - * } - * - * NOTE: We are currently NOT wiring this into the payload (see buildRRRepairOrderPayload) - * so that TaxCodeInfo is suppressed in the XML, but we keep this helper around for - * future use. - * - * @param {Array} allocations - * @param {Object} opts - * @param {string} opts.taxCode - RR tax code (configured per dealer) - * @param {string} [opts.payType="Cust"] - * @returns {null|{payType, taxCode, txblGrossAmt, grossTaxAmt}} - */ -const buildTaxFromAllocations = (allocations, { taxCode, payType = "Cust" } = {}) => { - if (!taxCode || !Array.isArray(allocations) || !allocations.length) return null; - - const taxAlloc = allocations.find((a) => a && a.tax); - if (!taxAlloc || !taxAlloc.sale) return null; - - const grossTaxNum = parseFloat(asN2(taxAlloc.sale)); - if (!Number.isFinite(grossTaxNum)) return null; - - const rate = typeof taxAlloc.profitCenter?.rate === "number" ? taxAlloc.profitCenter.rate : null; - - let taxableGrossNum = grossTaxNum; - if (rate && rate > 0) { - const r = rate / 100; - taxableGrossNum = grossTaxNum / r; - } - - return { - payType, - taxCode, - txblGrossAmt: taxableGrossNum.toFixed(2), - grossTaxAmt: grossTaxNum.toFixed(2) - }; -}; - -/** - * Build a minimal Rolabor structure in the new normalized shape. - * - * Useful for tests or for scenarios where you want a single zero-dollar - * Rolabor op but don't have GOG data. Shape matches payload.rolabor for the - * reynolds-rome-client builders. - * - * @param {Object} opts - * @param {string} opts.opCode - * @param {number|string} [opts.jobNo=1] - * @param {string} [opts.payType="Cust"] - * @returns {null|{ops: Array}} - */ -const buildRolaborSkeleton = ({ opCode, jobNo = 1, payType = "Cust" } = {}) => { - if (!opCode) return null; - - return { - ops: [ - { - opCode, - jobNo: String(jobNo), - custPayTypeFlag: "C", - warrPayTypeFlag: "W", - intrPayTypeFlag: "I", - custTxblNtxblFlag: "N", - warrTxblNtxblFlag: "N", - intrTxblNtxblFlag: "N", - vlrCode: undefined, - bill: { - payType, - jobTotalHrs: "0", - billTime: "0", - billRate: "0" - }, - amount: { - payType, - amtType: "Job", - custPrice: "0", - totalAmt: "0" - } - } - ] - }; -}; - -// ---------- Public API ---------- - /** * Query job data by ID from GraphQL API. * @param ctx @@ -301,8 +207,8 @@ const buildRRRepairOrderPayload = ({ story, makeOverride, allocations, - opCode, - taxCode + opCode + // taxCode } = {}) => { const customerNo = selectedCustomer?.customerNo ? String(selectedCustomer.customerNo).trim() @@ -353,7 +259,7 @@ const buildRRRepairOrderPayload = ({ if (haveAllocations) { const effectiveOpCode = (opCode && String(opCode).trim()) || null; - const effectiveTaxCode = (taxCode && String(taxCode).trim()) || null; + // const effectiveTaxCode = (taxCode && String(taxCode).trim()) || null; if (effectiveOpCode) { // Build RO.GOG and RO.LABOR in the new normalized shape @@ -493,6 +399,20 @@ const normalizeVehicleCandidates = (res) => { }); }; +/** + * Build a minimal Rolabor structure in the new normalized shape. + * + * Useful for tests or for scenarios where you want a single zero-dollar + * Rolabor op but don't have GOG data. Shape matches payload.rolabor for the + * reynolds-rome-client builders. + * + * @param {Object} opts + * @param {string} opts.opCode + * @param {number|string} [opts.jobNo=1] + * @param {string} [opts.payType="Cust"] + * @returns {null|{ops: Array}} + */ + module.exports = { QueryJobData, buildRRRepairOrderPayload, @@ -500,9 +420,6 @@ module.exports = { makeVehicleSearchPayloadFromJob, normalizeCustomerCandidates, normalizeVehicleCandidates, - // exporting these so you can unit-test them directly if you want buildRogogFromAllocations, - buildTaxFromAllocations, - buildRolaborSkeleton, buildRolaborFromRogog }; diff --git a/server/rr/rr-register-socket-events.js b/server/rr/rr-register-socket-events.js index b7b21c18e..279d6a8d3 100644 --- a/server/rr/rr-register-socket-events.js +++ b/server/rr/rr-register-socket-events.js @@ -644,17 +644,28 @@ const registerRREvents = ({ socket, redisHelpers }) => { }); } else { // classify & fail (no finalize) + const tx = result?.statusBlocks?.transaction; + const vendorStatusCode = Number( - result?.roStatus?.statusCode ?? result?.roStatus?.StatusCode ?? result?.statusBlocks?.transaction?.statusCode + result?.roStatus?.statusCode ?? result?.roStatus?.StatusCode ?? tx?.statusCode ?? tx?.StatusCode ); + const vendorMessage = + result?.roStatus?.message ?? + result?.roStatus?.Message ?? + tx?.message ?? + tx?.Message ?? + result?.error ?? + "RR export failed"; + const cls = classifyRRVendorError({ code: vendorStatusCode, - message: result?.roStatus?.message ?? result?.roStatus?.Message ?? result?.error ?? "RR export failed" + message: vendorMessage }); CreateRRLogEvent(socket, "ERROR", `Export failed (step 1)`, { roStatus: result?.roStatus, + statusBlocks: result?.statusBlocks, classification: cls }); @@ -802,18 +813,26 @@ const registerRREvents = ({ socket, redisHelpers }) => { socket.emit("export-success", { vendor: "rr", jobId: rid, roStatus: finalizeResult?.roStatus }); ack?.({ ok: true, result: finalizeResult }); } else { + const tx = finalizeResult?.statusBlocks?.transaction; + const vendorStatusCode = Number( finalizeResult?.roStatus?.statusCode ?? finalizeResult?.roStatus?.StatusCode ?? - finalizeResult?.statusBlocks?.transaction?.statusCode + tx?.statusCode ?? + tx?.StatusCode ); + + const vendorMessage = + finalizeResult?.roStatus?.message ?? + finalizeResult?.roStatus?.Message ?? + tx?.message ?? + tx?.Message ?? + finalizeResult?.error ?? + "RR finalize failed"; + const cls = classifyRRVendorError({ code: vendorStatusCode, - message: - finalizeResult?.roStatus?.message ?? - finalizeResult?.roStatus?.Message ?? - finalizeResult?.error ?? - "RR finalize failed" + message: vendorMessage }); await insertRRFailedExportLog({ diff --git a/server/rr/rr-service-vehicles.js b/server/rr/rr-service-vehicles.js index bdfa4c78d..b111ca124 100644 --- a/server/rr/rr-service-vehicles.js +++ b/server/rr/rr-service-vehicles.js @@ -64,6 +64,47 @@ const isAlreadyExistsError = (e) => { return msg.includes("ALREADY EXISTS") || msg.includes("VEHICLE ALREADY EXISTS"); }; +function deriveMakeCode(makeDesc) { + if (!makeDesc) return "FR"; // safe default + + const map = { + Ford: "FO", + FORD: "FO", + Lincoln: "LN", + Mercury: "MY", + Chevrolet: "CH", + GMC: "GM", + Cadillac: "CA", + Buick: "BU", + Pontiac: "PO", + Oldsmobile: "OL", + Saturn: "SA", + Dodge: "DO", + Chrysler: "CH", + Jeep: "JE", + Plymouth: "PL", + Toyota: "TY", + Lexus: "LX", + Honda: "HO", + Acura: "AC", + Nissan: "NI", + Infiniti: "IN", + Hyundai: "HY", + Kia: "KI", + Subaru: "SU", + Mazda: "MZ", + Volkswagen: "VW", + Audi: "AU", + BMW: "BM", + Mercedes: "MB", + "Mercedes-Benz": "MB", + Volvo: "VO", + Ram: "RA" // post-2010 + }; + + return map[makeDesc.trim().toUpperCase()] || "FR"; // TODO Default set +} + /** * Ensure/create a Service Vehicle in RR for the given VIN + customer. * Args may contain: @@ -150,10 +191,57 @@ const ensureRRServiceVehicle = async (args = {}) => { // IMPORTANT: The current RR lib build validates `vehicleServInfo.customerNo`. // To be future-proof, we also include top-level `customerNo`. const insertPayload = { - vin: vinStr, - customerNo: custNoStr, // fallback form (some builds accept this) - vehicleServInfo: { customerNo: custNoStr }, // primary form expected by the lib - vehicleDetail: license ? { licNo: String(license).trim() } : undefined + // === Core Vehicle Identity (MANDATORY for success) === + vin: vinStr.toUpperCase(), // "1FDWX34Y28EB01395" + + // Required: 2-character make code (from v_make_desc → known mapping) + vehicleMake: deriveMakeCode(job.v_make_desc), // → "FR" for Ford + + // Required: 2-digit year (last 2 digits of v_model_yr) + year: job?.v_model_yr || undefined, + + // Required: Model number — fallback strategy per ERA behavior + // Most Ford trucks use "T" = Truck. Some systems accept actual code. + // CAN BE (P)assenger , (T)ruck, (O)ther + mdlNo: undefined, + + // === Descriptive Fields (highly recommended) === + modelDesc: job?.v_model_desc?.trim() || undefined, // "F-350 SD" + carline: job?.v_model_desc?.trim() || undefined, // Series line + extClrDesc: job?.v_color?.trim() || undefined, // "Red" + + // Optional but helpful + accentClr: undefined, + + // === VehicleDetail Flags (CRITICAL — cause silent fails or error 303 if missing) === + aircond: undefined, // "Y", // Nearly all modern vehicles have A/C + pwrstr: undefined, // "Y", // Power steering = yes on 99% of vehicles post-1990 + transm: undefined, // "A", // Default to Automatic — change to "M" only if known manual + turbo: undefined, //"N", // 2008 F-350 6.4L Power Stroke has turbo, but field is optional + engineConfig: undefined, //"V8", // or "6.4L Diesel" — optional but nice + trim: undefined, //"XLT", // You don't have this — safe to omit or guess + + // License plate + licNo: license ? String(license).trim() : undefined, + + // === VehicleServInfo (attributes on the element) === + customerNo: custNoStr, // fallback (some builds read this) + stockId: job.ro_number || undefined, // Use RO as stock# — common pattern + + vehicleServInfo: { + customerNo: custNoStr, // REQUIRED — this is what toServiceVehicleView() validates + // Optional but increases success rate + salesmanNo: undefined, // You don't have advisor yet — omit + inServiceDate: undefined, + // Optional — safe to include if you want + productionDate: undefined, + modelMaintCode: undefined, + teamCode: undefined, + // Extended warranty — omit unless you sell contracts + vehExtWarranty: undefined, + // Advisor — omit unless you know who the service advisor is + advisor: undefined + } }; const insertOpts = {