# Car-body (بدنه) — Fanavaran stage bodies (current YARA) Snapshot of **what hull submit actually sends** after `toFanavaranHullBaseClaimPayload` / `toFanavaranHullExpertisePayload`. Staged flow (VHUD): 1. Base: `POST /car/vehicle-hull-claims` (GEN.03) 2. **No dmg-cases** (`vehicle-hull-claims/{id}/dmg-cases` does not exist) 3. Attachments: `POST …/{Id}/files` (GEN.05) 4. Expertise: `POST …/{Id}/expertise` (GEN.06) Use hull `ContractId` (`hullContractId`, else tenant `contractId`). Nested URLs use GEN.03 **`Id`**, never `ClaimNo`. A PUT to `/vehicle-hull-claims/{Id}` may run before files/expertise; Parsian often has **no PUT route**. That PUT is best-effort and must not block GEN.05/06. **Send rule:** send the **hull whitelist only**. Do not send ثالث-only keys (`DamagedCount`, `HasOtherCulprit`, `CompensationReferenceId`, `DocReceivedDate`, `IsLicenseReplacement`, plaque block on base, …). **Source tags:** same as `third-party-stage-fields.md` (`system` / `lookup` / `inquiry` / `user` / `staff` / `derived`). --- ## Stage 1 — Hull base claim (GEN.03) Built by `buildFanavaranSubmitPayload` then `enrichCarBodyHullBaseClaimPayload` then `toFanavaranHullBaseClaimPayload`. **Fanavaran has rejected as required (must not be null):** `CustomerFaultPercent`, `AuthorityCulpritId`, `AccidentTypeId`, `CostSeparationToDmgSections`, `IsOwnerChanged`, `PolicyId`, `ClaimExpertId`, dates/time, `CulpritTypeId`. **Must be null:** `IsLicenseReplaced` (error if `0` / mapped from ثالث `IsLicenseReplacement`). | Field | Persian | Type | Null? | Current value / source | |-------|---------|------|-------|------------------------| | PolicyId | شناسه بیمه‌نامه بدنه | number | **no** | **inquiry** first-party hull policy (`processed-body-policy` / `body-policy/{id}` / stored inquiry `policyId`) | | ClaimExpertId | کارشناس مسئول پرونده | number | **no** | **staff** FileMaker `CarBodyClaimExpertId` on V4/V5, else tenant | | AccidentDate | تاریخ حادثه | string Jalali | **no** | **user** first-party `statement.accidentDate`, else createdAt | | AccidentTime | ساعت حادثه | string `HH:mm` | **no** | **user** `statement.accidentTime` if set | | AnnouncementDate | تاریخ اعلام | string Jalali | **no** | **derived** = AccidentDate | | AccidentLocationAddress | نشانی محل حادثه | string | **no** | **system** `"استان تهران شهر تهران"` | | AccidentCauseId | علت حادثه | number | **no** | **system** `6` · lookup `accident-causes` | | AccidentCityId | شهر حادثه | number | **no** | **system** `701` · lookup `cities` | | AccidentReportTypeId | نحوه اعلام | number | **no** | **system** `155` · lookup `accident-report-type` | | AccidentTypeId | نوع حادثه بدنه | number | **no** | **system** `2` تصادف(حادثه) · **lookup** `GET /lookups/vehicle-hull-accident-types` | | CulpritTypeId | نوع مقصر بدنه | number | **no** | **system** `300` (ثالث `337` remapped) · **lookup** `GET /lookups/vehicle-hull-accident-culprit-type` | | AuthorityCulpritId | مرجع تعیین مقصر | number | **no** | **lookup** `GET /lookups/detection-accident-culprits` (caption بیمه‌گذار, fallback `1`) | | AccidentCulpritId | شناسه مقصر فناوران | number | preferred | **inquiry** parties `inquiry-by-unique-identifier`, fallback hull policy `CustomerId` | | CustomerFaultPercent | درصد تقصیر بیمه‌گذار | number | **no** | **system** `100` | | CostSeparationToDmgSections | تفکیک هزینه به نقاط | number (ans) | **no** | **system** `0` خیر · lookup `ans` | | IsOwnerChanged | مالک تغییر یافته؟ | number (ans) | **no** | **system** `0` · lookup `ans` | | IsLicenseReplaced | گواهینامه تعویضی است؟ | number | **must be null** | never copy ثالث `IsLicenseReplacement` | | ActualPremium | حق بیمه واقعی | number | preferred | **inquiry** hull policy `TotalPremium` via `GET /lookups/body-policy/{PolicyId}` | | EstimateAmount | برآورد | number | **no** | **user** expert prices / provisional | | CulpritLicenceNo | شماره گواهینامه | string | **no** | dummy / **user** | | CulpritLicenceIssuDate | تاریخ صدور گواهینامه | string Jalali | **no** | **system** `"1394/10/13"` | | CulpritLicenceTypeId | نوع گواهینامه | number | sent | tenant `2` · lookup `driving-licence-types` | | AccidentVehicleUsedId | کاربری خودرو | number | **no** | **inquiry** VIN/policy, else tenant | | PoliceOfficerId | افسر | number | sent | **system** `1` | | IsAccidentOutOfBorder | خارج از مرز | number | sent | **system** `0` | | ArchiveNo | بایگانی | string | yes | null | | EntryDate | تاریخ ورود | string | yes | null | | CulpritLicenceForeignCityName | شهر خارجی گواهینامه | string | yes | null | | PoliceReportSeri / Serial / Desc | کروکی | string | yes | null until **user** | | CulpritLevelTwoLicenceIssuDate | صدور گواهینامه پایه ۲ | string | yes | null | | TrackingCode | کد پیگیری | string | yes | null | | CourtArchiveNo | بایگانی دادگاه | string | yes | null | | PlaqueReplacementDate | تاریخ تعویض پلاک | string | yes | null | | StatusChangeDate | تغییر وضعیت | string | yes | null | | ClaimCompletionDate | تکمیل پرونده | string | yes | null | | DmgAssessorFirstCreationTime | زمان ارزیاب | string | yes | null | | IsSurplusArticleEighthLaw | مازاد ماده ۸ | number | yes | null | | GlassBreakReasonId | علت شکست شیشه | number | yes | null | | CulpritLicenceCountryId / CityId | محل صدور گواهینامه | number | yes | null | Also persisted locally (not a GEN.03 field): `claimCase.vehicle.carPrice` from hull policy **`VehicleValue`**. **Inquiries at this stage** - Hull policy: `GET /lookups/body-policy/{PolicyId}` → `TotalPremium`, `CustomerId`, `VehicleValue`, `VehicleId` - Parties: `GET /lookups/inquiry-by-unique-identifier` - Optional VIN / vehicle used-id --- ## Stage 2 — Damage case **Skipped.** YARA returns `fanavaranSync.damageCase.status = skipped`. Do not POST `dmg-cases`. --- ## Stage 3 — Attachments (GEN.05) Multipart `Param` + `Param1`. Proven `FileTypeId=63`. | Field | Persian | Type | Null? | Source | |-------|---------|------|-------|--------| | FileName | نام فایل | string | **no** | **user** (exact match to binary) | | FileTypeId | نوع مدرک | number | **no** | **lookup** `file-types` / tenant `ClaimFileTypeId` | | ClaimId | کد رایانه پرونده بدنه | number | **no** | stage 1 `Id` | --- ## Stage 4 — Expertise (GEN.06) Not ثالث GEN.08: no `DmgCaseId`, `InspectionPlaceId`, `RepairWage` on the root. Uses `Wage` + vehicle identity. `ClaimExpertId` = FileReviewer `CarBodyExpertiseClaim` on V4/V5, else tenant `ExpertiseClaimExpertId`. | Field | Persian | Type | Null? | Current source | |-------|---------|------|-------|----------------| | ClaimExpertId | کارشناس ارزیاب بدنه | number | **no** | **staff** / tenant | | DmgAssessmentDate | تاریخ بازدید | string Jalali | **no** | **derived** expert `submittedAt` | | InspectionTime | ساعت بازدید | string | **no** | **derived** | | MotorNo | شماره موتور | string | preferred | **inquiry** hull vehicle / party mapped `MtrNum` | | ChassisNo | شماره شاسی | string | preferred | **inquiry** `ShsNum` | | BuiltYear | سال ساخت | number | preferred | **inquiry** `BuiltYear` / `PrdDte` | | VIN | VIN | string | preferred | **inquiry** | | PlaqueNo | پلاک رشته‌ای | string | preferred | **inquiry** plk1+letter+plk3 | | PlaqueSerial | سریال پلاک (ایران) | string | preferred | **inquiry** | | ColorId | رنگ | number | preferred | **inquiry** `GET` vehicle by policy `VehicleId` | | Wage | اجرت کل | number | **no** | **user** sum `salary` | | ComponentReplacementCost | قطعه کل | number | **no** | **user** sum `price` | | WasteValue | داغی کل | number | **no** | **user** daghi | | RepairDuration | مدت تعمیر (روز) | number | **no** | **system** `3` | | VehicleCurrentValue | ارزش روز خودرو | number | preferred | **user** `vehicle.carPrice` / `vehicle.price`, else **inquiry** policy `VehicleValue` | | DropAmount | افت قیمت | number | **no** | **user** price-drop total or `0` | | CarryAndRescueCost | حمل و نجات | number | yes | null | | WreckHighestValue | بالاترین ارزش لاشه | number | yes | null | | InspectionDeduction | کسر بازدید | number | yes | null | | DmgAndWasteDesc | شرح خسارت و داغی | string | yes | null | | WentDistanceByExpert | مسافت | number | yes | null | | IsDestruction | اسقاط؟ | number | yes | null | | PlaqueDesignId | طرح پلاک | number | yes | null | | PlaqueCityId | شهر پلاک | number | yes | null | | AccidentPercent | درصد حادثه | number | yes | null | | TheftCases | موارد سرقت | array | empty `[]` | system | | DmgSections[].Count | تعداد | number | **no** | **system** `1` | | DmgSections[].Desc | شرح قطعه | string | **no** | **user** part label | | DmgSections[].WasteValue | داغی ردیف | number | **no** | **user** | | DmgSections[].AccessoryKindId | نوع قطعه کاتالوگ | number | preferred | **user** `partId` · lookup `car-components` | | DmgSections[].DmgKindId | نوع آسیب بدنه | number | **no** | **lookup** `vehicle-hull-dmg-kind` caption تخریب, fallback `5485` | | DmgSections[].VehicleHullAccessoryId | شناسه لوازم بدنه | number | **no** | **system** `3043330` (فابریک) for **every** row | | DmgSections[].DmgSectionCosts[].Caption | عنوان هزینه | string | **no** | **user** label | | DmgSections[].DmgSectionCosts[].Amount | مبلغ (قطعه+اجرت) | number | **no** | **user** | | DmgSections[].DmgSectionCosts[].DmgCostKindId | نوع هزینه | number | **no** | **lookup** `vehicle-hull-dmg-cost-kinds` caption مجموع لوازم, fallback `1` | **Lookups used:** `vehicle-hull-dmg-kind`, `vehicle-hull-dmg-cost-kinds`, `detection-accident-culprits`, `vehicle-hull-accident-types`, `vehicle-hull-accident-culprit-type`, `ans`, optional `vehicle-hull-policies/{id}/dmg-accessories` (no longer used for AccessoryId). **Inquiries:** `body-policy/{PolicyId}`, `vehicleById` (color + identity), parties inquiry, VIN/plate inquiry on blame. --- ## YARA preview / submit Same routes as ثالث (`/base-claim`, `/attachments`, `/expertise`). `/damage-case` preview/submit **skips** for `CAR_BODY`.