forked from Yara724/api
505 lines
13 KiB
TypeScript
505 lines
13 KiB
TypeScript
import {
|
|
canReuseCachedFanavaranVehicleIds,
|
|
collectPartyVinCandidates,
|
|
fanavaranIdOrConfigDefault,
|
|
fanavaranPayloadMatchesDamagedIdentity,
|
|
fanavaranVehicleMatchesDamagedIdentity,
|
|
filterPoliciesByLine,
|
|
applyFanavaranManualPayloadOverrides,
|
|
resolveDamageCasePlaqueLookupIds,
|
|
insuranceLineLabel,
|
|
parseLastCarPolicyInput,
|
|
pickFanavaranPlaqueLookupFields,
|
|
pickFanavaranVehicleFromInquiry,
|
|
pickVehicleId,
|
|
pickVinFromPartyVehicle,
|
|
plaqueLetterFromMiddleCode,
|
|
plaqueMatchesVehicle,
|
|
selectFanavaranVehicleForDamageCase,
|
|
selectLastAmongCarMatches,
|
|
toAppPlaque,
|
|
vehicleMatchesCar,
|
|
} from "./fanavaran-last-car-policy";
|
|
|
|
describe("fanavaran last car policy", () => {
|
|
const today = "2026-09-05";
|
|
|
|
it("parses national code and prefers VIN when both identifiers are sent", () => {
|
|
const parsed = parseLastCarPolicyInput({
|
|
nationalCode: "۰۰۱۲۳۴۵۶۷۸",
|
|
vin: " irnkaek4150012345 ",
|
|
plaqueLeft: "12",
|
|
plaqueLetter: "ب",
|
|
plaqueRight: "345",
|
|
plaqueSerial: "67",
|
|
});
|
|
|
|
expect(parsed).toEqual({
|
|
nationalCode: "0012345678",
|
|
vin: "IRNKAEK4150012345",
|
|
plaque: { left: "12", letter: "ب", right: "345", serial: "67" },
|
|
});
|
|
});
|
|
|
|
it("rejects a partial plaque when VIN is missing", () => {
|
|
const parsed = parseLastCarPolicyInput({
|
|
nationalCode: "0012345678",
|
|
plaqueLeft: "12",
|
|
plaqueLetter: "ب",
|
|
});
|
|
|
|
expect(parsed).toEqual({
|
|
error:
|
|
"plaque requires all four parts: plaqueLeft, plaqueLetter, plaqueRight, plaqueSerial",
|
|
});
|
|
});
|
|
|
|
it("maps insurance line ids to CAR_BODY and THIRD_PARTY", () => {
|
|
expect(insuranceLineLabel(4)).toBe("CAR_BODY");
|
|
expect(insuranceLineLabel(5)).toBe("THIRD_PARTY");
|
|
});
|
|
|
|
it("converts PlaqueMiddleCodeId 5 to د and builds app plaque parts", () => {
|
|
expect(plaqueLetterFromMiddleCode(5)).toBe("د");
|
|
expect(
|
|
toAppPlaque({
|
|
PlaqueLeftNo: "29",
|
|
PlaqueMiddleCodeId: 5,
|
|
PlaqueRightNo: "782",
|
|
PlaqueSerial: "60",
|
|
}),
|
|
).toEqual({
|
|
leftTwoDigits: "29",
|
|
serialLetter: "د",
|
|
threeDigits: "782",
|
|
rightTwoDigits: "60",
|
|
});
|
|
});
|
|
|
|
it("keeps only the requested insurance line", () => {
|
|
const rows = filterPoliciesByLine(
|
|
[
|
|
{ PolicyId: 1, InsuranceLineId: 5, EndDate: "1405/01/01" },
|
|
{ PolicyId: 2, InsuranceLineId: 4, EndDate: "1405/01/01" },
|
|
{ PolicyId: 3, EndDate: "1405/01/01" },
|
|
],
|
|
5,
|
|
);
|
|
|
|
expect(rows.map((row) => row.PolicyId)).toEqual([1, 3]);
|
|
});
|
|
|
|
it("reads VehicleId from a one-item inquiry-by-vin array", () => {
|
|
expect(pickVehicleId([{ Id: 4118289, VIN: "NAAR03HFFRDE07024" }])).toBe(
|
|
4118289,
|
|
);
|
|
});
|
|
|
|
it("picks the inquiry row matching policy VehicleId and VIN from the party", () => {
|
|
const inquired = [
|
|
{ Id: 1, UsedId: 1, VehicleKindId: 10 },
|
|
{
|
|
Id: 3379978,
|
|
UsedId: 84,
|
|
VehicleKindId: 5950,
|
|
VIN: "NAS451100P4934023",
|
|
},
|
|
];
|
|
expect(pickFanavaranVehicleFromInquiry(inquired, 3379978)).toEqual(
|
|
inquired[1],
|
|
);
|
|
expect(
|
|
pickVinFromPartyVehicle({
|
|
vehicle: { vin: "nas451100p4934023" },
|
|
}),
|
|
).toBe("NAS451100P4934023");
|
|
expect(
|
|
pickVinFromPartyVehicle({
|
|
vehicle: {
|
|
inquiry: { mapped: { VIN: "NAS451100P4934023" } },
|
|
},
|
|
}),
|
|
).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({
|
|
PlaqueKindId: 15,
|
|
PlaqueSampleId: 24,
|
|
PlaqueCityId: null,
|
|
PlaqueLeftNo: "62",
|
|
PlaqueMiddleCodeId: 14,
|
|
PlaqueRightNo: "278",
|
|
PlaqueSerial: "50",
|
|
PlaqueNo: "278و62",
|
|
}),
|
|
).toEqual({
|
|
kindId: 15,
|
|
sampleId: 24,
|
|
cityId: null,
|
|
leftNo: "62",
|
|
middleCodeId: 14,
|
|
rightNo: "278",
|
|
serial: "50",
|
|
plaqueNo: "278و62",
|
|
});
|
|
});
|
|
|
|
it("uses tenant config default when the API id is missing", () => {
|
|
expect(fanavaranIdOrConfigDefault(15, 8)).toBe(15);
|
|
expect(fanavaranIdOrConfigDefault(null, 8)).toBe(8);
|
|
expect(fanavaranIdOrConfigDefault(0, 10)).toBe(10);
|
|
});
|
|
|
|
it("matches VIN against ChassisNo when VIN is empty", () => {
|
|
expect(
|
|
vehicleMatchesCar(
|
|
{ VIN: null, ChassisNo: "NAAR03HFFRDE07024" },
|
|
{ vin: "NAAR03HFFRDE07024" },
|
|
),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("matches by VIN-inquiry VehicleId when GEN.15 VIN is empty", () => {
|
|
expect(
|
|
vehicleMatchesCar(
|
|
{ Id: 4118289, VIN: null, ChassisNo: "RDE07024" },
|
|
{ vin: "NAAR03HFFRDE07024" },
|
|
4118289,
|
|
),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("matches VIN trim and case-insensitively", () => {
|
|
expect(
|
|
vehicleMatchesCar(
|
|
{ VIN: " irnKAEK4150012345 " },
|
|
{ vin: "IRNKAEK4150012345" },
|
|
),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("matches plaque by all four parts including letter code", () => {
|
|
expect(
|
|
plaqueMatchesVehicle(
|
|
{ left: "12", letter: "ب", right: "345", serial: "67" },
|
|
{
|
|
PlaqueLeftNo: "12",
|
|
PlaqueMiddleCodeId: 2,
|
|
PlaqueRightNo: "345",
|
|
PlaqueSerial: "67",
|
|
},
|
|
),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("lets VIN win when both VIN and plaque are sent", () => {
|
|
expect(
|
|
vehicleMatchesCar(
|
|
{
|
|
VIN: "IRNKAEK4150012345",
|
|
PlaqueLeftNo: "99",
|
|
PlaqueMiddleCodeId: 1,
|
|
PlaqueRightNo: "111",
|
|
PlaqueSerial: "22",
|
|
},
|
|
{
|
|
vin: "IRNKAEK4150012345",
|
|
plaque: { left: "12", letter: "ب", right: "345", serial: "67" },
|
|
},
|
|
),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("does not match plaque when any part differs", () => {
|
|
expect(
|
|
plaqueMatchesVehicle(
|
|
{ left: "12", letter: "ب", right: "345", serial: "67" },
|
|
{
|
|
PlaqueLeftNo: "12",
|
|
PlaqueMiddleCodeId: 2,
|
|
PlaqueRightNo: "345",
|
|
PlaqueSerial: "68",
|
|
},
|
|
),
|
|
).toBe(false);
|
|
});
|
|
|
|
it("picks the active renewal with the newest BeginDate", () => {
|
|
const selected = selectLastAmongCarMatches(
|
|
[
|
|
{
|
|
policyId: 10,
|
|
beginDate: "1404/06/01",
|
|
endDate: "1405/06/01",
|
|
policy: {},
|
|
vehicle: null,
|
|
},
|
|
{
|
|
policyId: 20,
|
|
beginDate: "1405/06/02",
|
|
endDate: "1406/06/01",
|
|
policy: {},
|
|
vehicle: null,
|
|
},
|
|
{
|
|
policyId: 30,
|
|
beginDate: "1403/01/01",
|
|
endDate: "1404/01/01",
|
|
policy: {},
|
|
vehicle: null,
|
|
},
|
|
],
|
|
today,
|
|
);
|
|
|
|
expect(selected?.policyId).toBe(20);
|
|
});
|
|
|
|
it("falls back to the latest EndDate when no match is active", () => {
|
|
const selected = selectLastAmongCarMatches(
|
|
[
|
|
{
|
|
policyId: 10,
|
|
beginDate: "1402/01/01",
|
|
endDate: "1403/01/01",
|
|
policy: {},
|
|
vehicle: null,
|
|
},
|
|
{
|
|
policyId: 20,
|
|
beginDate: "1403/01/01",
|
|
endDate: "1404/06/01",
|
|
policy: {},
|
|
vehicle: null,
|
|
},
|
|
],
|
|
today,
|
|
);
|
|
|
|
expect(selected?.policyId).toBe(20);
|
|
});
|
|
|
|
it("returns null when there are no matches", () => {
|
|
expect(selectLastAmongCarMatches([], today)).toBeNull();
|
|
});
|
|
|
|
const damagedIdentity = {
|
|
vin: "IRPC941V2BD798656",
|
|
chassis: "NAS431100E5798656",
|
|
plaque: { left: "59", letter: "ی", right: "419", serial: "78" },
|
|
policyCINumber: "16040446424",
|
|
};
|
|
|
|
const culpritVehicle = {
|
|
Id: 475449,
|
|
VIN: "IRFC891V7D2301065",
|
|
ChassisNo: "NAAP41FD5BJ301065",
|
|
VehicleKindId: 6953,
|
|
VersionNo: 3,
|
|
PlaqueKindId: 8,
|
|
PlaqueSampleId: 10,
|
|
PlaqueLeftNo: "56",
|
|
PlaqueMiddleCodeId: 5,
|
|
PlaqueRightNo: "394",
|
|
PlaqueSerial: "66",
|
|
PlaqueNo: "394د56",
|
|
};
|
|
|
|
it("does not treat the culprit vehicle as the damaged car", () => {
|
|
expect(
|
|
fanavaranVehicleMatchesDamagedIdentity(culpritVehicle, damagedIdentity),
|
|
).toBe(false);
|
|
expect(
|
|
selectFanavaranVehicleForDamageCase(
|
|
[
|
|
culpritVehicle,
|
|
{ Id: 9, VIN: "OTHER", PlaqueKindId: 15, PlaqueSampleId: 24 },
|
|
],
|
|
damagedIdentity,
|
|
),
|
|
).toBeNull();
|
|
});
|
|
|
|
it("ignores a PlaqueKindId 15 row that does not share VIN or plate", () => {
|
|
expect(
|
|
selectFanavaranVehicleForDamageCase(
|
|
[
|
|
{ Id: 1, VIN: "IRPC941V2BD798656" },
|
|
{
|
|
Id: 2,
|
|
VIN: "IRFC901V119493683",
|
|
PlaqueKindId: 15,
|
|
PlaqueSampleId: 24,
|
|
PlaqueLeftNo: "62",
|
|
PlaqueMiddleCodeId: 14,
|
|
PlaqueRightNo: "278",
|
|
PlaqueSerial: "50",
|
|
},
|
|
],
|
|
damagedIdentity,
|
|
),
|
|
).toEqual({ Id: 1, VIN: "IRPC941V2BD798656" });
|
|
});
|
|
|
|
it("requires plate agreement when the inquiry row has plaque parts", () => {
|
|
expect(
|
|
selectFanavaranVehicleForDamageCase(
|
|
[
|
|
{
|
|
Id: 1,
|
|
VIN: "IRPC941V2BD798656",
|
|
PlaqueKindId: 15,
|
|
PlaqueLeftNo: "56",
|
|
PlaqueMiddleCodeId: 5,
|
|
PlaqueRightNo: "394",
|
|
PlaqueSerial: "66",
|
|
},
|
|
],
|
|
damagedIdentity,
|
|
),
|
|
).toBeNull();
|
|
});
|
|
|
|
it("picks the newest matching version of the damaged VIN and plate", () => {
|
|
expect(
|
|
selectFanavaranVehicleForDamageCase(
|
|
[
|
|
{
|
|
Id: 10,
|
|
VIN: "IRPC941V2BD798656",
|
|
ChassisNo: "NAS431100E5798656",
|
|
VersionNo: 1,
|
|
PlaqueKindId: 15,
|
|
PlaqueSampleId: 24,
|
|
PlaqueLeftNo: "59",
|
|
PlaqueMiddleCodeId: 16,
|
|
PlaqueRightNo: "419",
|
|
PlaqueSerial: "78",
|
|
},
|
|
{
|
|
Id: 10,
|
|
VIN: "IRPC941V2BD798656",
|
|
ChassisNo: "NAS431100E5798656",
|
|
VersionNo: 3,
|
|
PlaqueKindId: 8,
|
|
PlaqueSampleId: 10,
|
|
PlaqueLeftNo: "59",
|
|
PlaqueMiddleCodeId: 16,
|
|
PlaqueRightNo: "419",
|
|
PlaqueSerial: "78",
|
|
},
|
|
],
|
|
damagedIdentity,
|
|
)?.PlaqueKindId,
|
|
).toBe(8);
|
|
});
|
|
|
|
it("rejects cached payload ids from a different VIN, plate, or CI number", () => {
|
|
expect(
|
|
fanavaranPayloadMatchesDamagedIdentity(
|
|
{
|
|
VIN: "IRFC891V7D2301065",
|
|
ChassisNo: "NAAP41FD5BJ301065",
|
|
PolicyCINumber: "16018466143",
|
|
PlaqueKindId: 8,
|
|
PlaqueLeftNo: "56",
|
|
PlaqueMiddleCodeId: 5,
|
|
PlaqueRightNo: "394",
|
|
PlaqueSerial: "66",
|
|
},
|
|
damagedIdentity,
|
|
),
|
|
).toBe(false);
|
|
expect(canReuseCachedFanavaranVehicleIds("config-default")).toBe(false);
|
|
expect(canReuseCachedFanavaranVehicleIds("vehicle-inquiry")).toBe(true);
|
|
expect(canReuseCachedFanavaranVehicleIds(undefined)).toBe(false);
|
|
});
|
|
|
|
it("accepts cache only when VIN, plate, and CI number all agree", () => {
|
|
expect(
|
|
fanavaranPayloadMatchesDamagedIdentity(
|
|
{
|
|
VIN: "IRPC941V2BD798656",
|
|
ChassisNo: "NAS431100E5798656",
|
|
PolicyCINumber: "16040446424",
|
|
PlaqueLeftNo: "59",
|
|
PlaqueMiddleCodeId: 16,
|
|
PlaqueRightNo: "419",
|
|
PlaqueSerial: "78",
|
|
PlaqueKindId: 8,
|
|
},
|
|
damagedIdentity,
|
|
),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("uses national plaque 8/10 when the damaged VIN is unknown to Fanavaran", () => {
|
|
expect(resolveDamageCasePlaqueLookupIds(null)).toEqual({
|
|
kindId: 8,
|
|
sampleId: 10,
|
|
source: "national-plate-default",
|
|
});
|
|
});
|
|
|
|
it("keeps live PlaqueKindId 8 when Swagger body still has stale 15", () => {
|
|
expect(
|
|
applyFanavaranManualPayloadOverrides(
|
|
{
|
|
PlaqueKindId: 8,
|
|
PlaqueSampleId: 10,
|
|
VehicleKindId: 6704,
|
|
AccidentVehicleUsedId: 1,
|
|
Desc: "سپر جلو",
|
|
},
|
|
{
|
|
PlaqueKindId: 15,
|
|
PlaqueSampleId: 24,
|
|
Desc: "سپر جلو (edited)",
|
|
},
|
|
["Desc", "EstimateAmount", "LicenceNo"],
|
|
),
|
|
).toEqual({
|
|
PlaqueKindId: 8,
|
|
PlaqueSampleId: 10,
|
|
VehicleKindId: 6704,
|
|
AccidentVehicleUsedId: 1,
|
|
Desc: "سپر جلو (edited)",
|
|
});
|
|
});
|
|
});
|