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` (from `BMSEstimateCommonTypes_2024R1_V6.9.0.xsd`) * **Service group** (where this message is accepted): `EstimateService` in `BMSEstimateService_2024R1_V6.9.0.xsd` Includes: `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) — **required** * `AsyncRqUID` (UUID) — *optional* * `PartnerKey` (Identifier) — *optional* **Body (from `EstimateRqType`):** * `SvcProviderName` (Identifier) — *optional* * `RefClaimNum` (Char\_50) — *optional* * **`DocumentInfo`** (`DocumentInfoType`) — **required, 1** * **`ApplicationInfo`** (`ApplicationInfoType`) — **required, 1..**\* * `EventInfo` (`EventInfoType`) — *optional* * **`AdminInfo`** (`AdminInfoType`) — **required** * **`EstimatorIDs`** (`EstimatorIDsTypeType`) — **required** * `ClaimInfo` (`ClaimInfoType`) — *optional* * **`VehicleInfo`** (`VehicleInfoType`) **OR** `PropertyInfo` (`PropertyInfoType`) — **choice** → for vehicle, use **`VehicleInfo`** * **`ProfileInfo`** (`ProfileInfoType`) — **required** * **`DamageLineInfo`** (`DamageLineInfoType`) — **required, 1..**\* (line items) * `CalibrationInfo` (`CalibrationInfoType`) — *optional, 0..* * `ScanInfo` (`ScanInfoType`) — *optional, 0..* * `FileAttachment` (`FileAttachmentType`) — *optional* * `NonNewOEMPartInd` (Boolean) — *optional* * `StorageDuration` (Integer\_Range\_0-999) — *optional* * **`RepairTotalsInfo`** (`RepairTotalsInfoType`) — **required, 1..**\* * `RepairTotalsHistory` (`RepairTotalsHistoryType`) — *optional, 0..* * `PaymentInfo` (`PaymentInfoType`) — *optional* * `EstimateMemo` (C) — *optional* * `AdministrativeMemo` (C) — *optional* * `Disclaimers` (C) — *optional* * `CustomMemo` (C) — *optional* * `CustomPrintImage` (C) — *optional* * `OtherMemos` (`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.0`** * **`DocumentType`** (`DocumentTypeClosedEnumType`) — code for message family (e.g. `E` for estimate; codelists provide the letter codes) * `DocumentSubType` (`DocumentSubTypeClosedEnumType`) — e.g. “Original Estimate”, “Copy”, etc. * `DocumentID` (Char\_50) — your ID * `VendorCode` (VendorCodeOpenEnumType) — optional * `DocumentVer` (`DocumentVerType`) — versioning container (0..\*) * **`CreateDateTime`** (DateTime) * `TransmitDateTime` (DateTime) * `ReferenceInfo` (`RefInfoType`) — links to prior docs * `CountryCode`, `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 `` if you don’t need parties; it validates.) ## `EstimatorIDsTypeType` (BMSEstimateCommonTypes) * `OriginalEstimatorID` (Char\_40) — optional * `EstimatorHistory` (0..\*) → `EstimatorHistoryType` ⇒ (`DocumentVerCode`, `DocumentVerNum`) ## `ClaimInfoType` (BMSCommonGlobalTypes) *(optional)* * `ClaimNum` (Char\_50) * `PolicyInfo` (0..\*) (`PolicyInfoType`) * `LossInfo` (`LossInfoType`) — details on loss/time/location/coverage * `AdditionalIDInfo` (0..\*) (`IDInfoType`) * `ClaimStatus`, `PreviousPaymentAmt`, `ClaimMemo`, etc. ## `VehicleInfoType` (BMSCommonGlobalTypes) *(choose this over PropertyInfo)* * `VINInfo` (0..\*) (`VINInfoType`) → **choice** of `VINAvailabilityCode` or one or more `VIN` ( `VINType`) * `License` (`LicenseType`) * `VehicleDesc` (`VehicleDescType`) — **ModelYear**, **MakeDesc/MakeCode**, **ModelName/ModelNum**, `VehicleType`, etc. * `Paint`, `Body`, `Powertrain`, `Condition`, `Valuation`, `VehicleMemo` * `PolicyVehicleNum`, `LossVehicleNum` * `FileAttachment` (`FileAttachmentType`) * `CustomElement` (0..\*) * `UnitNum` (Char\_20) > Note: `VINType` is 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`, `LineStatusCode` * `LineDesc`, `LineDescCode` * `SubletInfo` (`SubletInfoType`) * `PartInfo` (0..\*) (`PartInfoType`) * `LaborInfo` (`LaborInfoType`) * `RefinishLaborInfo` (`LaborInfoType`) * `MaterialType`, `OtherChargesInfo`, `WhoPays` * `LineAdjustment`, `AppliedAdjustment` * `PDRInfo`, `LineType`, `LineMemo`, `VendorRefNum` (0..\*) **`PartInfoType`** highlights: * `PartMaterialCode`, `PartType`, `LineItemCategoryCode` * `PartDesc`, `PartNum`, `OEMPartNum` * `NonOEM` (0..\*) (`NonOEMType`) — alternate sources/quality * `ListPrice`, `PartPrice`, `UnitPartPrice`, `TotalPartPrice`, `OEMPartPrice` * `PriceAdjustment` (0..\*) (`PriceAdjustmentType`) * `TaxableInd`, `AppliedTaxes` * `CertificationType` (0..\*), `AlternatePartInd`, `GlassPartInd` * `Quantity`, `PartStatus`, `Dimensions`, `Glass*`, `QuotedPartList` … **`LaborInfoType`** highlights: * **`LaborType`** (`LaborTypeClosedEnumType`) — **required** * `LaborOperation`, `LaborHours`, `LaborHourlyRate`, `LaborAmt` * `DatabaseLaborType/Hours/Amt` * `LaborAdjustment` (0..\*) * Judgment/flags (e.g., `LaborAmtJudgmentInd`, `OverlapInd`) * Paint-specific fields (`PaintStagesNum`, `PaintTonesNum`) * `AssemblyLaborCode` ## `CalibrationInfoType` / `ScanInfoType` (BMSEstimateCommonTypes) * **`ScanInfoType`**: `ScanDetailsList` (optional), `FileAttachment` (optional), `ScanTool`, `ScanDateTime` (**required**), flags `CleanScanInd`, `FollowUpInd`, plus `Technician`. * **`CalibrationInfoType`**: optional lists for details & technicians, plus process flags ( `PrerequisitesMetInd`, `ProceduresFollowedInd`, `ADASReviewedWithOwnerInd`). ## `FileAttachmentType` (BMSCommonGlobalTypes) * `DocAttachment` (0..\*) (`DocAttachmentType`) * `AttachmentType` (open enum) * `AttachmentTitle` **or** `AttachmentMemo` * `AttachmentFileType`, `AttachmentFileName`, `AttachmentLength` * **One of:** `AttachmentURI` **or** `EmbeddedAttachmentType` * `EmbeddedAttachmentType` → **choice**: `EmbeddedAttachment` (Binary) **or** `EmbeddedAttachmentText` (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 totals * `RepairTotalsType` (`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 `HistoryTotalsInfo` entries. ## `PaymentInfoType` (BMSCommonGlobalTypes) *(optional)* * `PayerType`, `PaymentType` * `Payee`/`PayerInfo`/`PayeeInfo` * `PaymentDateTime`, **`PaymentAmt`** * `PaymentID`, `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. ```xml 00000000-0000-0000-0000-000000000000 6.9.0 E 2025-08-14T12:00:00Z INSERT_APP_TYPE INSERT_APP_NAME INSERT_APP_VER INSERT_RATE_TYPE INSERT_LABOR_TYPE INSERT_TOTAL_TYPE Grand Total 0.00 ``` --- # Implementation notes & gotchas (important) 1. **Required containers vs. required content** * `AdminInfo` and `EstimatorIDs` are **required containers** but their **children are optional**. Empty elements validate. * `ProfileInfo` is required and must include **≥1 `RateInfo`** with a `RateType`. * You must include the **choice** of **`VehicleInfo`** (for this message) instead of `PropertyInfo`. * Include **≥1 `DamageLineInfo`** and **≥1 `RepairTotalsInfo`** each containing * *≥1 `SummaryTotalsInfo`**. 2. **Header** * `RqUID` is required; use a real UUID. 3. **Enumerations / code lists** * Many fields are `ClosedEnumType`/`OpenEnumType` and 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` = `E` for estimates). * `BMSVer` supports `6.9.0`. 4. **Line hierarchy** * For nested kits/assemblies, use `ParentLineNum`; `UniqueSequenceNum` helps ordering. `LineType` can label grouping (e.g., Sublet, Labor, Part, etc.). 5. **Attachments** * You can embed binary (`EmbeddedAttachmentType/EmbeddedAttachment`) **or** provide a URI ( `AttachmentURI`). Provide `AttachmentFileType` and `AttachmentFileName` either way. 6. **Scans & calibrations** * If you include `ScanInfo`, it **requires** `ScanTool` and `ScanDateTime`. Calibrations are optional but provide strong ADAS traceability. 7. **Totals integrity** * `RepairTotalsInfo/SummaryTotalsInfo` acts as your roll-up. Ensure it reconciles with the sum of `DamageLineInfo` components and the profile’s rates/taxes so consumers don’t reject on mismatches. 8. **Currency / numeric facets** * Monetary fields use `Currency`. Hours/rates/quantities have explicit facets (e.g., `Decimal_Range_-999.9-999.9`). Stay within ranges. 9. **Canada specifics** * `DocumentInfo/CountryCode` = `CA`, and `ProfileInfo/CanadianTax` is 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** * `` (or populate parties) ✅ * **EstimatorIDs** * `` (or add contents) ✅ * **Vehicle** * `VehicleInfo` (VIN + YMM recommended) ✅ * **Profile & rates** * `ProfileInfo/RateInfo[1..*]/RateType` ✅ * **Lines** * `DamageLineInfo[1..*]` with at least one `LaborInfo/LaborType` or `PartInfo` ✅ * **Totals** * `RepairTotalsInfo[1..*]/SummaryTotalsInfo[1..*]/(TotalType, TotalTypeDesc, TotalAmt)` ✅ --- # Pointers to definitions in your bundle (for traceability) * `VehicleDamageEstimateAddRq` element → `BMSEstimateMessages_2024R1_V6.9.0.xsd` * `EstimateRqType` → `BMSEstimateCommonTypes_2024R1_V6.9.0.xsd` * `MessageHeaderType`, `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` ---