Use FileMaker and FileReviewer Fanavaran expert ids on V4/V5 flows.

Block file create and review when the matching third-party or car-body code is missing, and override GEN.03/GEN.06 ClaimExpertId from those profiles instead of tenant defaults.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-16 16:26:58 +03:30
parent acb5d2a682
commit ebfb4385de
4 changed files with 270 additions and 9 deletions

View File

@@ -0,0 +1,90 @@
import { BadRequestException } from "@nestjs/common";
import { BlameRequestType } from "src/Types&Enums/blame-request-management/blameRequestType.enum";
import { parseFanavaranId } from "src/lookups/fanavaran-last-car-policy";
export type FileMakerFanavaranExpertCodes = {
ThirdPartyClaimExpertId?: string;
CarBodyClaimExpertId?: string;
};
export type FileReviewerFanavaranExpertCodes = {
ThirdPartyExpertiseClaim?: string;
CarBodyExpertiseClaim?: string;
};
export function parseFanavaranExpertId(raw?: string | null): number | null {
if (raw == null) return null;
const trimmed = String(raw).trim();
if (!trimmed) return null;
return parseFanavaranId(trimmed) ?? parseFanavaranId(Number(trimmed));
}
export function fileMakerStageOneExpertCode(
fileMaker: FileMakerFanavaranExpertCodes,
blameType: BlameRequestType,
): string | undefined {
return blameType === BlameRequestType.CAR_BODY
? fileMaker.CarBodyClaimExpertId
: fileMaker.ThirdPartyClaimExpertId;
}
export function fileReviewerExpertiseExpertCode(
fileReviewer: FileReviewerFanavaranExpertCodes,
blameType: BlameRequestType,
): string | undefined {
return blameType === BlameRequestType.CAR_BODY
? fileReviewer.CarBodyExpertiseClaim
: fileReviewer.ThirdPartyExpertiseClaim;
}
function blameTypeLabel(blameType: BlameRequestType): string {
return blameType === BlameRequestType.CAR_BODY
? "car body (بدنه)"
: "third party (ثالث)";
}
export function assertFileMakerCanCreateBlameType(
fileMaker: FileMakerFanavaranExpertCodes,
blameType: BlameRequestType,
): void {
const raw = fileMakerStageOneExpertCode(fileMaker, blameType);
if (parseFanavaranExpertId(raw) != null) {
return;
}
throw new BadRequestException({
code: "FILE_MAKER_FANAVARAN_EXPERT_CODE_MISSING",
message: `Your FileMaker profile has no Fanavaran stage-1 claim expert id for ${blameTypeLabel(blameType)} files. You cannot create this file type.`,
});
}
export function assertFileReviewerCanReviewBlameType(
fileReviewer: FileReviewerFanavaranExpertCodes,
blameType: BlameRequestType,
): void {
const raw = fileReviewerExpertiseExpertCode(fileReviewer, blameType);
if (parseFanavaranExpertId(raw) != null) {
return;
}
throw new BadRequestException({
code: "FILE_REVIEWER_FANAVARAN_EXPERT_CODE_MISSING",
message: `Your FileReviewer profile has no Fanavaran expertise claim expert id for ${blameTypeLabel(blameType)} files. You cannot review this file type.`,
});
}
export function resolveFileMakerStageOneExpertId(
fileMaker: FileMakerFanavaranExpertCodes,
blameType: BlameRequestType,
): number | null {
return parseFanavaranExpertId(
fileMakerStageOneExpertCode(fileMaker, blameType),
);
}
export function resolveFileReviewerExpertiseExpertId(
fileReviewer: FileReviewerFanavaranExpertCodes,
blameType: BlameRequestType,
): number | null {
return parseFanavaranExpertId(
fileReviewerExpertiseExpertCode(fileReviewer, blameType),
);
}