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 32223bb..110d743 100644 --- a/src/claim-request-management/claim-request-management.service.ts +++ b/src/claim-request-management/claim-request-management.service.ts @@ -8219,10 +8219,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, @@ -8238,7 +8240,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, }, }); @@ -8354,7 +8356,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.`; @@ -8369,7 +8371,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, @@ -9962,13 +9964,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([