updated the fucking mf fanavaran

This commit is contained in:
2026-09-07 16:33:15 +03:30
parent 395e3dbe63
commit b9bffdccc1
5 changed files with 423 additions and 114 deletions

View File

@@ -1,4 +1,5 @@
import {
collectPartyVinCandidates,
filterPoliciesByLine,
insuranceLineLabel,
parseLastCarPolicyInput,
@@ -114,6 +115,39 @@ describe("fanavaran last car policy", () => {
).toBe("NAS451100P4934023");
});
it("does not let chassis stored on vehicle.vin beat the inquiry VIN", () => {
const party = {
vehicle: {
vin: "NAAN01CA9BK493683",
inquiry: {
mapped: {
VIN: "IRFC901V119493683",
ChassisNo: "NAAN01CA9BK493683",
},
},
},
};
expect(pickVinFromPartyVehicle(party)).toBe("IRFC901V119493683");
expect(collectPartyVinCandidates(party)).toEqual([
"IRFC901V119493683",
"NAAN01CA9BK493683",
]);
});
it("prefers the VIN-inquiry row that already has PlaqueKindId", () => {
expect(
pickFanavaranVehicleFromInquiry([
{ Id: 1, VIN: "IRFC901V119493683" },
{ Id: 2, VIN: "IRFC901V119493683", PlaqueKindId: 15, PlaqueSampleId: 24 },
]),
).toEqual({
Id: 2,
VIN: "IRFC901V119493683",
PlaqueKindId: 15,
PlaqueSampleId: 24,
});
});
it("reads plaque kind and sample from VIN inquiry for the lookup filter", () => {
expect(
pickFanavaranPlaqueLookupFields({

View File

@@ -243,6 +243,12 @@ export function pickFanavaranVehicleFromInquiry(
const match = inquired.find((row) => pickVehicleId(row) === vehicleId);
if (match) return asObjectRecord(match);
}
const withPlaqueKind = inquired.find(
(row) =>
parseFanavaranId(asObjectRecord(row)?.PlaqueKindId) != null ||
parseFanavaranId(asObjectRecord(row)?.plaqueKindId) != null,
);
if (withPlaqueKind) return asObjectRecord(withPlaqueKind);
return asObjectRecord(inquired[0]);
}
return asObjectRecord(inquired);
@@ -251,15 +257,51 @@ export function pickFanavaranVehicleFromInquiry(
export function pickVinFromPartyVehicle(party: {
vehicle?: { vin?: unknown; inquiry?: unknown };
} | null | undefined): string | null {
const direct = normalizeVin(party?.vehicle?.vin);
if (direct) return direct;
return collectPartyVinCandidates(party)[0] ?? null;
}
const inquiry = party?.vehicle?.inquiry;
const nested = asObjectRecord(inquiry);
const mapped = pickVehicleVin(asObjectRecord(nested?.mapped));
if (mapped) return mapped;
const raw = pickVehicleVin(asObjectRecord(nested?.raw ?? inquiry));
return raw || null;
/**
* VIN first (mapped/raw VIN fields), then party.vehicle.vin, then chassis.
* Damaged cars often store chassis on `vehicle.vin` which must not win over the real VIN.
*/
export function collectPartyVinCandidates(party: {
vehicle?: { vin?: unknown; inquiry?: unknown };
} | null | undefined): string[] {
const inquiry = asObjectRecord(party?.vehicle?.inquiry);
const mapped = asObjectRecord(inquiry?.mapped);
const rawData = asObjectRecord(
asObjectRecord(inquiry?.raw)?.data ?? inquiry?.raw ?? inquiry,
);
const values = [
mapped?.VIN,
mapped?.Vin,
mapped?.vin,
mapped?.VinNumberField,
rawData?.VIN,
rawData?.Vin,
rawData?.vin,
rawData?.VinNumberField,
party?.vehicle?.vin,
mapped?.ChassisNo,
mapped?.chassisNo,
mapped?.ShsNum,
mapped?.shsNam,
mapped?.ChassisNumberField,
rawData?.ChassisNo,
rawData?.chassisNo,
rawData?.ShsNum,
rawData?.shsNam,
rawData?.ChassisNumberField,
];
const unique: string[] = [];
const seen = new Set<string>();
for (const value of values) {
const vin = normalizeVin(value);
if (!vin || seen.has(vin)) continue;
seen.add(vin);
unique.push(vin);
}
return unique;
}
export type FanavaranPlaqueLookupFields = {