From e9c02811f70535178ba79801d3ecfa16cc0c71d5 Mon Sep 17 00:00:00 2001 From: Sepehr Yahyaee Date: Sun, 5 Jul 2026 15:13:19 +0330 Subject: [PATCH] V4: add WAITING_FOR_FILE_REVIEWER claim status; fix select-outer-parts for split flow - Add ClaimCaseStatus.WAITING_FOR_FILE_REVIEWER (V4 split flow only) - Set claim status to WAITING_FOR_FILE_REVIEWER when FileMaker uploads the last required document (v3InPersonFlow path), replacing the old behaviour that incorrectly auto-advanced to SELECT_OUTER_PARTS - advanceV3ClaimToOuterPartsIfReady: also allow canAdvance when claimCase.status === WAITING_FOR_FILE_REVIEWER so the FileReviewer can call select-outer-parts after submitting accident fields - Add WAITING_FOR_FILE_REVIEWER to CLAIM_USER_PHASE (unified-file-status) so the file still resolves to IN_PROGRESS in the unified status report - Add WAITING_FOR_FILE_REVIEWER to CLAIM_IN_PROGRESS_STATUSES (expert-panel-status-report) for the expert report bucket - Add WAITING_FOR_FILE_REVIEWER to claimInHandling set (expert-insurer.service) so insurer stats count these correctly --- .../claim-case-status.enum.ts | 10 ++++++- .../claim-request-management.service.ts | 29 +++++++++++-------- src/expert-insurer/expert-insurer.service.ts | 1 + src/helpers/expert-panel-status-report.ts | 2 ++ src/helpers/unified-file-status.ts | 2 ++ 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/Types&Enums/claim-request-management/claim-case-status.enum.ts b/src/Types&Enums/claim-request-management/claim-case-status.enum.ts index 2476c94..0c0905f 100644 --- a/src/Types&Enums/claim-request-management/claim-case-status.enum.ts +++ b/src/Types&Enums/claim-request-management/claim-case-status.enum.ts @@ -34,7 +34,15 @@ export enum ClaimCaseStatus { /** All required factor files are uploaded; damage expert validates factors (`UNDER_REVIEW` @ `EXPERT_COST_EVALUATION`). */ EXPERT_VALIDATING_REPAIR_FACTORS = "EXPERT_VALIDATING_REPAIR_FACTORS", - + + /** + * V4 split flow only. FileMaker has uploaded all initial required documents; + * the file is sealed and waiting for a FileReviewer to pick it up (accident fields, + * capture, and final blame video). Transitions to SELECTING_OUTER_PARTS when the + * FileReviewer calls select-outer-parts after submitting accident fields. + */ + WAITING_FOR_FILE_REVIEWER = "WAITING_FOR_FILE_REVIEWER", + // Final states COMPLETED = "COMPLETED", CANCELLED = "CANCELLED", diff --git a/src/claim-request-management/claim-request-management.service.ts b/src/claim-request-management/claim-request-management.service.ts index e2231ab..707bb37 100644 --- a/src/claim-request-management/claim-request-management.service.ts +++ b/src/claim-request-management/claim-request-management.service.ts @@ -8148,10 +8148,12 @@ export class ClaimRequestManagementService { if (allDocumentsUploaded) { if (options?.v3InPersonFlow) { - $set["status"] = ClaimCaseStatus.SELECTING_OUTER_PARTS; - $set["workflow.currentStep"] = - ClaimWorkflowStep.SELECT_OUTER_PARTS; - $set["workflow.nextStep"] = ClaimWorkflowStep.SELECT_OTHER_PARTS; + // V4 split flow: mark the claim as waiting for the FileReviewer. + // The FileReviewer calls accident-fields then select-outer-parts, at + // which point advanceV3ClaimToOuterPartsIfReady() moves the claim to + // SELECTING_OUTER_PARTS / SELECT_OUTER_PARTS. + $set["status"] = ClaimCaseStatus.WAITING_FOR_FILE_REVIEWER; + $set["workflow.nextStep"] = ClaimWorkflowStep.SELECT_OUTER_PARTS; completedStepsEntries.push( ClaimWorkflowStep.UPLOAD_REQUIRED_DOCUMENTS, @@ -8167,7 +8169,7 @@ export class ClaimRequestManagementService { metadata: { stepKey: ClaimWorkflowStep.UPLOAD_REQUIRED_DOCUMENTS, description: - "Initial required documents uploaded. Proceed to outer part selection.", + "FileMaker documents complete. File sealed — awaiting FileReviewer.", v3InPersonFlow: true, }, }); @@ -8283,7 +8285,7 @@ export class ClaimRequestManagementService { ) : allDocumentsUploaded ? options?.v3InPersonFlow - ? "Initial required documents uploaded. Proceed to outer part selection." + ? "All FileMaker documents uploaded. File is sealed and ready for FileReviewer pickup." : "All documents uploaded successfully. Your claim is now ready for damage expert review." : `Document uploaded successfully. ${remaining} documents remaining.`; @@ -8298,7 +8300,7 @@ export class ClaimRequestManagementService { : ClaimWorkflowStep.CAPTURE_PART_DAMAGES : allDocumentsUploaded ? options?.v3InPersonFlow - ? ClaimWorkflowStep.SELECT_OUTER_PARTS + ? ClaimWorkflowStep.UPLOAD_REQUIRED_DOCUMENTS : ClaimWorkflowStep.USER_SUBMISSION_COMPLETE : ClaimWorkflowStep.UPLOAD_REQUIRED_DOCUMENTS, message, @@ -9891,13 +9893,16 @@ export class ClaimRequestManagementService { } const step = claimCase.workflow?.currentStep; - // USER_SUBMISSION_COMPLETE can occur when documents were uploaded via a - // non-V3 path (e.g. generic v2 endpoint). As long as accident fields are - // set (checked just below), it is safe to advance to SELECT_OUTER_PARTS. - // The duplicate-selection guard lives in selectOuterPartsV2 itself. + // UPLOAD_REQUIRED_DOCUMENTS: normal V3/V4 path after FileMaker docs. + // WAITING_FOR_FILE_REVIEWER (claim status): same DB step but with the new + // V4 claim status — FileReviewer is picking up the sealed file. + // USER_SUBMISSION_COMPLETE: can occur when documents were uploaded via a + // non-V3 path (e.g. generic v2 endpoint). Safe to advance as long as + // accident fields are set (checked just below). const canAdvance = step === ClaimWorkflowStep.UPLOAD_REQUIRED_DOCUMENTS || - step === ClaimWorkflowStep.USER_SUBMISSION_COMPLETE; + step === ClaimWorkflowStep.USER_SUBMISSION_COMPLETE || + claimCase.status === ClaimCaseStatus.WAITING_FOR_FILE_REVIEWER; if (!canAdvance) { throw new BadRequestException( diff --git a/src/expert-insurer/expert-insurer.service.ts b/src/expert-insurer/expert-insurer.service.ts index ac66e52..fc72998 100644 --- a/src/expert-insurer/expert-insurer.service.ts +++ b/src/expert-insurer/expert-insurer.service.ts @@ -1519,6 +1519,7 @@ export class ExpertInsurerService { ClaimCaseStatus.SELECTING_OTHER_PARTS, ClaimCaseStatus.UPLOADING_REQUIRED_DOCUMENTS, ClaimCaseStatus.CAPTURING_PART_DAMAGES, + ClaimCaseStatus.WAITING_FOR_FILE_REVIEWER, ClaimCaseStatus.WAITING_FOR_USER_RESEND, ClaimCaseStatus.WAITING_FOR_DAMAGE_EXPERT, ClaimCaseStatus.EXPERT_REVIEWING, diff --git a/src/helpers/expert-panel-status-report.ts b/src/helpers/expert-panel-status-report.ts index f8b5e63..bcd29ab 100644 --- a/src/helpers/expert-panel-status-report.ts +++ b/src/helpers/expert-panel-status-report.ts @@ -16,6 +16,8 @@ const CLAIM_IN_PROGRESS_STATUSES = new Set([ ClaimCaseStatus.SELECTING_OTHER_PARTS, ClaimCaseStatus.UPLOADING_REQUIRED_DOCUMENTS, ClaimCaseStatus.CAPTURING_PART_DAMAGES, + // V4 split flow: sealed by FileMaker, pending FileReviewer pickup. + ClaimCaseStatus.WAITING_FOR_FILE_REVIEWER, ]); export function blameCaseStatusToReportBucket(status: string): string { diff --git a/src/helpers/unified-file-status.ts b/src/helpers/unified-file-status.ts index 06f154b..a1803f4 100644 --- a/src/helpers/unified-file-status.ts +++ b/src/helpers/unified-file-status.ts @@ -31,6 +31,8 @@ const CLAIM_USER_PHASE = new Set([ ClaimCaseStatus.SELECTING_OTHER_PARTS, ClaimCaseStatus.UPLOADING_REQUIRED_DOCUMENTS, ClaimCaseStatus.CAPTURING_PART_DAMAGES, + // V4 split flow: FileMaker sealed the file; FileReviewer hasn't picked it up yet. + ClaimCaseStatus.WAITING_FOR_FILE_REVIEWER, ]); const INSURER_REVIEW_CLAIM_STATUSES = new Set([