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 `<AdminInfo/>` 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

<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)

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**

  * `<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 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`

---
