import { Prop, Schema, SchemaFactory } from "@nestjs/mongoose"; import { Types } from "mongoose"; import { ClaimWorkflowStep } from "src/Types&Enums/claim-request-management/claim-workflow-steps.enum"; import { ClaimStatus } from "src/Types&Enums/claim-request-management/claimStatus.enum"; import { ExpertProfileSnapshot, ExpertProfileSnapshotSchema, } from "src/request-management/entities/schema/expert-profile-snapshot.schema"; @Schema({ _id: false }) export class ClaimActorLock { @Prop({ type: Types.ObjectId }) actorId: Types.ObjectId; @Prop({ type: String }) actorName: string; @Prop({ type: String, default: "damage_expert" }) actorRole: "damage_expert" | "expert" | "admin"; /** Damage expert profile when lock was taken (`damage-expert` collection). */ @Prop({ type: ExpertProfileSnapshotSchema }) expertProfileSnapshot?: ExpertProfileSnapshot; } export const ClaimActorLockSchema = SchemaFactory.createForClass(ClaimActorLock); /** Captures queue fields before a damage-expert lock; restored if the lock TTL expires without a reply. */ @Schema({ _id: false }) export class ClaimPreLockQueueSnapshot { @Prop({ type: String, enum: ClaimStatus, required: true }) claimStatus: ClaimStatus; @Prop({ type: String, enum: ClaimWorkflowStep, required: true }) currentStep: ClaimWorkflowStep; @Prop({ type: String, enum: ClaimWorkflowStep, required: false }) nextStep?: ClaimWorkflowStep; } export const ClaimPreLockQueueSnapshotSchema = SchemaFactory.createForClass( ClaimPreLockQueueSnapshot, ); @Schema({ _id: false }) export class ClaimWorkflow { @Prop({ type: String, enum: ClaimWorkflowStep }) currentStep: ClaimWorkflowStep; @Prop({ type: String, enum: ClaimWorkflowStep }) nextStep: ClaimWorkflowStep; @Prop({ type: [String], enum: ClaimWorkflowStep, default: [] }) completedSteps?: ClaimWorkflowStep[]; @Prop({ type: Boolean, default: false }) locked?: boolean; @Prop({ type: Date }) lockedAt?: Date; /** Lock expiry used by UI countdown (typically lockedAt + 15m). */ @Prop({ type: Date }) expiredAt?: Date; @Prop({ type: ClaimActorLockSchema }) lockedBy?: ClaimActorLock; @Prop({ type: ClaimPreLockQueueSnapshotSchema }) preLockQueueSnapshot?: ClaimPreLockQueueSnapshot; /** * First damage expert who called review assign; kept after the 15m lock expires * so no other expert can take the case while it remains in the expert queue. */ @Prop({ type: ClaimActorLockSchema }) assignedForReviewBy?: ClaimActorLock; } export const ClaimWorkflowSchema = SchemaFactory.createForClass(ClaimWorkflow);