diff --git a/src/claim-request-management/claim-request-management.service.ts b/src/claim-request-management/claim-request-management.service.ts index b79edd0..baf443e 100644 --- a/src/claim-request-management/claim-request-management.service.ts +++ b/src/claim-request-management/claim-request-management.service.ts @@ -8198,8 +8198,12 @@ export class ClaimRequestManagementService { ); } - // 4. Validate outer parts haven't been selected yet + // 4. Validate outer parts haven't been selected yet. + // Skip this guard when FileMaker rejected the claim and the FileReviewer + // is updating (overwriting) the previous selection. + const isFileMakerRejectedRerun = !!(claimCase as any).fileMakerRejectedPendingReview; if ( + !isFileMakerRejectedRerun && claimCase.damage?.selectedParts && claimCase.damage.selectedParts.length > 0 ) { @@ -8266,7 +8270,9 @@ export class ClaimRequestManagementService { })); const selectedPartIds = selectedItems.map((p) => p.id); - // 6. Update claim case with selected parts and move to next step + // 6. Update claim case with selected parts and move to next step. + // Also clear fileMakerRejectedPendingReview now that the reviewer has + // actively re-submitted outer parts. const updatedClaim = await this.claimCaseDbService.findByIdAndUpdate( claimRequestId, { @@ -8276,7 +8282,10 @@ export class ClaimRequestManagementService { status: ClaimCaseStatus.SELECTING_OTHER_PARTS, "workflow.currentStep": ClaimWorkflowStep.SELECT_OTHER_PARTS, "workflow.nextStep": ClaimWorkflowStep.CAPTURE_PART_DAMAGES, - $unset: { "damage.selectedOuterParts": "" }, + $unset: { + "damage.selectedOuterParts": "", + "fileMakerRejectedPendingReview": "", + }, $push: { "workflow.completedSteps": ClaimWorkflowStep.SELECT_OUTER_PARTS, history: { @@ -8401,8 +8410,11 @@ export class ClaimRequestManagementService { ); } - // 4. Validate other parts and bank info haven't been submitted yet + // 4. Validate other parts and bank info haven't been submitted yet. + // Skip when FileMaker rejected the claim — the FileReviewer can update bank info. + const isFileMakerRejectedRerun = !!(claimCase as any).fileMakerRejectedPendingReview; if ( + !isFileMakerRejectedRerun && claimCase.money?.sheba && claimCase.money?.nationalCodeOfInsurer && claimCase.workflow?.currentStep !== ClaimWorkflowStep.USER_EXPERT_RESEND diff --git a/src/request-management/request-management.service.ts b/src/request-management/request-management.service.ts index d696441..d3b7092 100644 --- a/src/request-management/request-management.service.ts +++ b/src/request-management/request-management.service.ts @@ -10615,8 +10615,8 @@ export class RequestManagementService { const newRejectionCount = currentRejections + 1; const actorName = `${fileMaker.firstName || ""} ${fileMaker.lastName || ""}`.trim(); - // Steps that belong to the damage-assessment cycle being discarded. - // They are pulled from completedSteps so the FileReviewer can re-run them. + // Steps that belong to the re-run assessment cycle. + // Pulled from completedSteps so workflow ordering guards pass on re-run. const assessmentSteps = [ ClaimWorkflowStep.SELECT_OUTER_PARTS, ClaimWorkflowStep.SELECT_OTHER_PARTS, @@ -10630,21 +10630,18 @@ export class RequestManagementService { claimStatus: ClaimStatus.NEEDS_REVISION, fileMakerRejectionCount: newRejectionCount, fileMakerRejectionReason: reason ?? null, - // Reset to UPLOAD_REQUIRED_DOCUMENTS so advanceV3ClaimToOuterPartsIfReady - // can advance the claim to SELECT_OUTER_PARTS when the FileReviewer calls - // select-outer-parts again. - "workflow.currentStep": ClaimWorkflowStep.UPLOAD_REQUIRED_DOCUMENTS, - "workflow.nextStep": ClaimWorkflowStep.SELECT_OUTER_PARTS, + // Land directly at SELECT_OUTER_PARTS: the FileReviewer sees the + // existing parts pre-populated and can adjust or confirm them. + "workflow.currentStep": ClaimWorkflowStep.SELECT_OUTER_PARTS, + "workflow.nextStep": ClaimWorkflowStep.SELECT_OTHER_PARTS, "workflow.locked": false, + // Flag consumed by selectOuterPartsV2 / selectOtherPartsV2 to allow + // overwriting previously submitted data instead of throwing ConflictException. + "fileMakerRejectedPendingReview": true, }, - // Clear all stale data from the rejected assessment cycle: - // - workflow lock fields left over from the completed review cycle - // - evaluation sub-documents (reply, resend, approvals) - // - damage selections: selectedParts, otherParts - // - media captures: damagedPart photos, walk-around video - // (the FileReviewer must re-select parts and re-photograph everything) - // - assignedForReviewBy intentionally kept so the same reviewer - // is still scoped to this file on re-lock + // Clear stale lock/evaluation fields and media that must be re-captured. + // Part selections (damage.selectedParts, damage.otherParts) are intentionally + // preserved as a pre-populated starting point for the FileReviewer to adjust. $unset: { "workflow.lockedAt": "", "workflow.expiredAt": "", @@ -10654,14 +10651,13 @@ export class RequestManagementService { "evaluation.damageExpertResend": "", "evaluation.ownerInsurerApproval": "", "evaluation.ownerPricedPartsApproval": "", - "damage.selectedParts": "", - "damage.otherParts": "", + // Photos and walk-around video must be re-taken for the new part set. "media.damagedParts": "", "media.captures": "", "media.videoCaptureId": "", }, - // Remove assessment-cycle steps from completedSteps so none of the - // "already completed" guards fire when the FileReviewer re-runs them. + // Remove assessment-cycle steps from completedSteps so workflow ordering + // guards pass when the FileReviewer re-runs each step. $pull: { "workflow.completedSteps": { $in: assessmentSteps }, },