16 KiB
Awesome — thanks for the dumps. I pulled the structures directly from the XSDs you uploaded and
focused on VehicleDamageEstimateAddRq and the graph of types it depends on. Below is a
developer-grade map you can hand to a coding agent.
What it is & where it lives
- Global element:
VehicleDamageEstimateAddRq - Namespace:
http://www.cieca.com/BMS(default ns in your files) - Defined in:
BMSEstimateMessages_2024R1_V6.9.0.xsd - Type:
EstimateRqType(fromBMSEstimateCommonTypes_2024R1_V6.9.0.xsd) - Service group (where this message is accepted):
EstimateServiceinBMSEstimateService_2024R1_V6.9.0.xsdIncludes:PropertyDamageEstimateAddRq/Rs,VehicleDamageEstimateAddRq/Rs,VehicleDamageEstimateChgRq/Rs,VehicleDamagePhotoEstimateAddRq/Rs.
Top-level schema (for VehicleDamageEstimateAddRq → EstimateRqType)
EstimateRqType extends MessageHeaderType (from BMSCommonGlobalTypes_2024R1_V6.9.0.xsd) and
then adds the following sequence. I’ve marked required vs optional and multiplicity:
Header (inherited from MessageHeaderType):
RqUID(UUID) — requiredAsyncRqUID(UUID) — optionalPartnerKey(Identifier) — optional
Body (from EstimateRqType):
SvcProviderName(Identifier) — optionalRefClaimNum(Char_50) — optionalDocumentInfo(DocumentInfoType) — required, 1ApplicationInfo(ApplicationInfoType) — required, 1..*EventInfo(EventInfoType) — optionalAdminInfo(AdminInfoType) — requiredEstimatorIDs(EstimatorIDsTypeType) — requiredClaimInfo(ClaimInfoType) — optionalVehicleInfo(VehicleInfoType) ORPropertyInfo(PropertyInfoType) — choice → for vehicle, useVehicleInfoProfileInfo(ProfileInfoType) — requiredDamageLineInfo(DamageLineInfoType) — required, 1..* (line items)CalibrationInfo(CalibrationInfoType) — optional, 0..ScanInfo(ScanInfoType) — optional, 0..FileAttachment(FileAttachmentType) — optionalNonNewOEMPartInd(Boolean) — optionalStorageDuration(Integer_Range_0-999) — optionalRepairTotalsInfo(RepairTotalsInfoType) — required, 1..*RepairTotalsHistory(RepairTotalsHistoryType) — optional, 0..PaymentInfo(PaymentInfoType) — optionalEstimateMemo(C) — optionalAdministrativeMemo(C) — optionalDisclaimers(C) — optionalCustomMemo(C) — optionalCustomPrintImage(C) — optionalOtherMemos(OtherMemosType) — optional, 0..
Files involved:
BMSEstimateMessages_2024R1_V6.9.0.xsd, BMSEstimateCommonTypes_2024R1_V6.9.0.xsd,
BMSCommonGlobalTypes_2024R1_V6.9.0.xsd, BMSSimpleTypes_2024R1_V6.9.0.xsd + code lists XSDs for
enums.
Key dependent types (immediate children you’ll actually populate)
Below are the first-level structures you’ll typically use. I’ve trimmed to the practical fields; each type has many optional parties and details you can ignore for a minimal AddRq.
DocumentInfoType (BMSCommonGlobalTypes)
Typical header metadata:
BMSVer(BMSVersionClosedEnumType) — e.g.6.9.0DocumentType(DocumentTypeClosedEnumType) — code for message family (e.g.Efor estimate; codelists provide the letter codes)DocumentSubType(DocumentSubTypeClosedEnumType) — e.g. “Original Estimate”, “Copy”, etc.DocumentID(Char_50) — your IDVendorCode(VendorCodeOpenEnumType) — optionalDocumentVer(DocumentVerType) — versioning container (0..*)CreateDateTime(DateTime)TransmitDateTime(DateTime)ReferenceInfo(RefInfoType) — links to prior docsCountryCode,CurrencyInfo,CultureCode— optional locale bits
ApplicationInfoType (BMSCommonGlobalTypes) (1..*)
ApplicationType(ApplicationTypeClosedEnumType) — e.g., Estimator, Shop Mgmt, etc.ApplicationName(Char_30)ApplicationVer(Char_12)DatabaseVer(Char_12)DatabaseDateTime(DateTime)
AdminInfoType (BMSCommonGlobalTypes)
Large party/role roster; all child elements are optional, but the container itself is required. Common ones:
InsuranceCompany(InsuranceCompanyType)PolicyHolder(PolicyHolderType)Insured/Owner/Customer(GenericPartyType)Claimant(ClaimantType)Estimator(0..*) (EstimatorType)RepairFacility(RepairFacilityType)RentalProvider,TowCompany,Lender,Lienholder(0..*), etc. (You can send<AdminInfo/>if you don’t need parties; it validates.)
EstimatorIDsTypeType (BMSEstimateCommonTypes)
OriginalEstimatorID(Char_40) — optionalEstimatorHistory(0..*) →EstimatorHistoryType⇒ (DocumentVerCode,DocumentVerNum)
ClaimInfoType (BMSCommonGlobalTypes) (optional)
ClaimNum(Char_50)PolicyInfo(0..*) (PolicyInfoType)LossInfo(LossInfoType) — details on loss/time/location/coverageAdditionalIDInfo(0..*) (IDInfoType)ClaimStatus,PreviousPaymentAmt,ClaimMemo, etc.
VehicleInfoType (BMSCommonGlobalTypes) (choose this over PropertyInfo)
VINInfo(0..*) (VINInfoType) → choice ofVINAvailabilityCodeor one or moreVIN(VINType)License(LicenseType)VehicleDesc(VehicleDescType) — ModelYear, MakeDesc/MakeCode, ModelName/ModelNum,VehicleType, etc.Paint,Body,Powertrain,Condition,Valuation,VehicleMemoPolicyVehicleNum,LossVehicleNumFileAttachment(FileAttachmentType)CustomElement(0..*)UnitNum(Char_20)
Note:
VINTypeis referenced but its concrete restriction is provided elsewhere in BMS; you can treat it as a VIN string (17-char typical) and your validator will enforce the real facet.
ProfileInfoType (BMSEstimateCommonTypes) required
Controls rates, tax, and rules used to compute totals:
-
ProfileName(Char_40) -
RateInfo(1..*) (RateInfoType)RateType(RateTypeClosedEnumType) — e.g., BODY_LABOR, PAINT_LABOR, MECHANICAL_LABOR, MATERIAL, etc.RateTierInfo/RateTierHistory(0..*)TaxableInd,TaxRate,AdjustmentInfo(0..),TaxInfo(0..)MaterialCalcSettings(optional)
-
AlternatePartInfo(0..),PartCertification(0..),RefinishCalcSettings,PreTaxDiscountRate,TaxExemptInfo(0..*),CanadianTax(for CA specifics)
DamageLineInfoType (BMSEstimateCommonTypes) 1..*
One per estimate line. Core children:
LineNum,UniqueSequenceNum,ParentLineNum(hierarchy)ManualLineInd,AutomatedEntry,LineStatusCodeLineDesc,LineDescCodeSubletInfo(SubletInfoType)PartInfo(0..*) (PartInfoType)LaborInfo(LaborInfoType)RefinishLaborInfo(LaborInfoType)MaterialType,OtherChargesInfo,WhoPaysLineAdjustment,AppliedAdjustmentPDRInfo,LineType,LineMemo,VendorRefNum(0..*)
PartInfoType highlights:
PartMaterialCode,PartType,LineItemCategoryCodePartDesc,PartNum,OEMPartNumNonOEM(0..*) (NonOEMType) — alternate sources/qualityListPrice,PartPrice,UnitPartPrice,TotalPartPrice,OEMPartPricePriceAdjustment(0..*) (PriceAdjustmentType)TaxableInd,AppliedTaxesCertificationType(0..*),AlternatePartInd,GlassPartIndQuantity,PartStatus,Dimensions,Glass*,QuotedPartList…
LaborInfoType highlights:
LaborType(LaborTypeClosedEnumType) — requiredLaborOperation,LaborHours,LaborHourlyRate,LaborAmtDatabaseLaborType/Hours/AmtLaborAdjustment(0..*)- Judgment/flags (e.g.,
LaborAmtJudgmentInd,OverlapInd) - Paint-specific fields (
PaintStagesNum,PaintTonesNum) AssemblyLaborCode
CalibrationInfoType / ScanInfoType (BMSEstimateCommonTypes)
ScanInfoType:ScanDetailsList(optional),FileAttachment(optional),ScanTool,ScanDateTime(required), flagsCleanScanInd,FollowUpInd, plusTechnician.CalibrationInfoType: optional lists for details & technicians, plus process flags (PrerequisitesMetInd,ProceduresFollowedInd,ADASReviewedWithOwnerInd).
FileAttachmentType (BMSCommonGlobalTypes)
-
DocAttachment(0..*) (DocAttachmentType)-
AttachmentType(open enum) -
AttachmentTitleorAttachmentMemo -
AttachmentFileType,AttachmentFileName,AttachmentLength -
One of:
AttachmentURIorEmbeddedAttachmentTypeEmbeddedAttachmentType→ choice:EmbeddedAttachment(Binary) orEmbeddedAttachmentText(C)
-
AttachmentIntegrity(0..*) (optionally includes Binary integrity blobs) -
AttachmentStatusCode(open enum)
-
RepairTotalsInfoType (BMSEstimateCommonTypes) 1..*
LaborTotalsInfo(0..*) (TotalsInfoType)PartsTotalsInfo(0..*) (TotalsInfoType)OtherChargesTotalsInfo(0..*) (TotalsInfoType)NumOfDamageLines(optional)SummaryTotalsInfo(1..*) (TotalsInfoType) — your rolled-up totalsRepairTotalsType(LineTypeClosedEnumType) — optional (e.g., gross vs. customer-pay segments)
TotalsInfoType (BMSCommonGlobalTypes) highlights:
TotalType(TotalTypeOpenEnumType) — category (e.g., LABOR, PARTS, TAX, GRAND_TOTAL,…)TotalSubType(open enum)TotalTypeDesc(Char_30)- Hours quantities & units, item quantity, unit price
- Detailed
TotalTaxInfo/TotalAdjustmentInfo(0..*) - Amounts:
NonTaxableAmt,TaxableAmt,TaxTotalAmt,OtherCharges*,TotalAmt,TotalPct,TotalCost AmtDueInfo(0..*)
RepairTotalsHistoryType (BMSEstimateCommonTypes)
- Version stamp and one or more
HistoryTotalsInfoentries.
PaymentInfoType (BMSCommonGlobalTypes) (optional)
PayerType,PaymentTypePayee/PayerInfo/PayeeInfoPaymentDateTime,PaymentAmtPaymentID,PaymentMemo,PaymentAmtType
OtherMemosType (BMSCommonGlobalTypes)
OtherMemoRef(open enum),OtherMemo(C)
Minimal, schema-valid XML skeleton (vehicle path)
Uses only required containers/fields; values shown as PLACEHOLDER. You must add at least one DamageLineInfo and one SummaryTotalsInfo item, and at least one RateInfo inside ProfileInfo. Enumerations are code lists; use valid codes from your system.
<VehicleDamageEstimateAddRq xmlns="http://www.cieca.com/BMS">
<!-- MessageHeaderType -->
<RqUID>00000000-0000-0000-0000-000000000000</RqUID>
<!-- EstimateRqType sequence -->
<DocumentInfo>
<BMSVer>6.9.0</BMSVer>
<DocumentType>E</DocumentType>
<CreateDateTime>2025-08-14T12:00:00Z</CreateDateTime>
</DocumentInfo>
<ApplicationInfo>
<ApplicationType>INSERT_APP_TYPE</ApplicationType>
<ApplicationName>INSERT_APP_NAME</ApplicationName>
<ApplicationVer>INSERT_APP_VER</ApplicationVer>
</ApplicationInfo>
<AdminInfo/> <!-- container required; children optional -->
<EstimatorIDs/> <!-- container required; children optional -->
<!-- choice: VehicleInfo OR PropertyInfo -->
<VehicleInfo>
<!-- minimally empty is allowed; typical payload would include VIN and Year/Make/Model -->
<!-- Example:
<VINInfo>
<VIN>1HGBH41JXMN109186</VIN>
</VINInfo>
<VehicleDesc>
<ModelYear>2020</ModelYear>
<MakeDesc>Honda</MakeDesc>
<ModelName>Civic</ModelName>
</VehicleDesc>
-->
</VehicleInfo>
<ProfileInfo>
<!-- at least one RateInfo required -->
<RateInfo>
<RateType>INSERT_RATE_TYPE</RateType>
<!-- optional: <RateDesc>Body Labor</RateDesc> <TaxRate>13.00</TaxRate> etc. -->
</RateInfo>
</ProfileInfo>
<!-- at least one DamageLineInfo -->
<DamageLineInfo>
<!-- minimal: include a LaborInfo with required LaborType -->
<LaborInfo>
<LaborType>INSERT_LABOR_TYPE</LaborType>
<!-- optional: <LaborHours>1.0</LaborHours> <LaborHourlyRate>85.00</LaborHourlyRate> -->
</LaborInfo>
</DamageLineInfo>
<!-- at least one RepairTotalsInfo with at least one SummaryTotalsInfo -->
<RepairTotalsInfo>
<SummaryTotalsInfo>
<TotalType>INSERT_TOTAL_TYPE</TotalType>
<TotalTypeDesc>Grand Total</TotalTypeDesc>
<TotalAmt>0.00</TotalAmt>
</SummaryTotalsInfo>
</RepairTotalsInfo>
</VehicleDamageEstimateAddRq>
Implementation notes & gotchas (important)
- Required containers vs. required content
AdminInfoandEstimatorIDsare required containers but their children are optional. Empty elements validate.ProfileInfois required and must include ≥1RateInfowith aRateType.- You must include the choice of
VehicleInfo(for this message) instead ofPropertyInfo. - Include ≥1
DamageLineInfoand ≥1RepairTotalsInfoeach containing * *≥1SummaryTotalsInfo**.
- Header
RqUIDis required; use a real UUID.
- Enumerations / code lists
- Many fields are
ClosedEnumType/OpenEnumTypeand validated against the BMS code list XSDs you included (e.g.,BMSCodeLists_*.xsd). Use the exact code values your trading partner expects ( e.g.,DocumentType=Efor estimates). BMSVersupports6.9.0.
- Line hierarchy
- For nested kits/assemblies, use
ParentLineNum;UniqueSequenceNumhelps ordering.LineTypecan label grouping (e.g., Sublet, Labor, Part, etc.).
- Attachments
- You can embed binary (
EmbeddedAttachmentType/EmbeddedAttachment) or provide a URI (AttachmentURI). ProvideAttachmentFileTypeandAttachmentFileNameeither way.
- Scans & calibrations
- If you include
ScanInfo, it requiresScanToolandScanDateTime. Calibrations are optional but provide strong ADAS traceability.
- Totals integrity
RepairTotalsInfo/SummaryTotalsInfoacts as your roll-up. Ensure it reconciles with the sum ofDamageLineInfocomponents and the profile’s rates/taxes so consumers don’t reject on mismatches.
- Currency / numeric facets
- Monetary fields use
Currency. Hours/rates/quantities have explicit facets (e.g.,Decimal_Range_-999.9-999.9). Stay within ranges.
- Canada specifics
DocumentInfo/CountryCode=CA, andProfileInfo/CanadianTaxis available for PST/HST/GST modeling if you need to encode tax policy explicitly.
Quick field checklist for a typical valid “vehicle add” you’ll generate
-
Header
RqUID✅
-
Doc header
DocumentInfo/BMSVer=6.9.0✅DocumentInfo/DocumentType=E✅DocumentInfo/CreateDateTime✅
-
App
ApplicationInfo[1..*]/(ApplicationType, ApplicationName, ApplicationVer)✅
-
Admin
<AdminInfo/>(or populate parties) ✅
-
EstimatorIDs
<EstimatorIDs/>(or add contents) ✅
-
Vehicle
VehicleInfo(VIN + YMM recommended) ✅
-
Profile & rates
ProfileInfo/RateInfo[1..*]/RateType✅
-
Lines
DamageLineInfo[1..*]with at least oneLaborInfo/LaborTypeorPartInfo✅
-
Totals
RepairTotalsInfo[1..*]/SummaryTotalsInfo[1..*]/(TotalType, TotalTypeDesc, TotalAmt)✅
Pointers to definitions in your bundle (for traceability)
VehicleDamageEstimateAddRqelement →BMSEstimateMessages_2024R1_V6.9.0.xsdEstimateRqType→BMSEstimateCommonTypes_2024R1_V6.9.0.xsdMessageHeaderType,DocumentInfoType,VehicleInfoType,FileAttachmentType,PaymentInfoType, etc. →BMSCommonGlobalTypes_2024R1_V6.9.0.xsd- Rates/lines/totals/calibration/scan subtypes → mostly
BMSEstimateCommonTypes_2024R1_V6.9.0.xsd - Enums/code lists →
BMSCodeLists_ClassicCode_2024R1_V6.9.0.xsd,BMSCodeLists_CodeExt_2024R1_V6.9.0.xsd - Service wrapper (which messages are valid to send/receive) →
BMSEstimateService_2024R1_V6.9.0.xsd