import { Body, Controller, Param, Post, UseGuards, } from "@nestjs/common"; import { ApiBearerAuth, ApiBody, ApiOperation, ApiParam, ApiResponse, ApiTags, } from "@nestjs/swagger"; import { IsOptional, IsString } from "class-validator"; import { ApiPropertyOptional } from "@nestjs/swagger"; import { LocalActorAuthGuard } from "src/auth/guards/actor-local.guard"; import { RolesGuard } from "src/auth/guards/role.guard"; import { Roles } from "src/decorators/roles.decorator"; import { CurrentUser } from "src/decorators/user.decorator"; import { RoleEnum } from "src/Types&Enums/role.enum"; import { RequestManagementService } from "./request-management.service"; import { ClaimRequestManagementService } from "src/claim-request-management/claim-request-management.service"; class FileMakerRejectDto { @ApiPropertyOptional({ description: "Reason for rejection (visible to FileReviewer)", example: "Damage assessment is incorrect — please re-evaluate parts X and Y", }) @IsOptional() @IsString() reason?: string; } /** * V5 FileMaker approval panel. * * After the full claim flow completes (FileReviewer does damage assessment via * expert-claim APIs, user signs), the claim lands in WAITING_FOR_FILE_MAKER_APPROVAL. * The FileMaker who created the blame file can then: * * approve → triggers fanavaran submission (claim → COMPLETED) * reject → sends claim back to WAITING_FOR_DAMAGE_EXPERT so the FileReviewer * can re-lock, adjust pricing, and redo the user interaction * * All endpoints operate on `claimRequestId` (the claim case ID, not the blame ID). * Use `GET v5/file-maker/blame-request-management/claim-id/:requestId` to obtain * the claimRequestId from the original blame request ID. */ @ApiTags("v5 FileMaker — claim approval before fanavaran") @Controller("v5/file-maker/claim-approval") @ApiBearerAuth() @UseGuards(LocalActorAuthGuard, RolesGuard) @Roles(RoleEnum.FILE_MAKER) export class FileMakerClaimApprovalV5Controller { constructor( private readonly requestManagementService: RequestManagementService, private readonly claimRequestManagementService: ClaimRequestManagementService, ) {} @Post("approve/:claimRequestId") @ApiParam({ name: "claimRequestId" }) @ApiOperation({ summary: "Approve the completed claim (FileMaker V5)", description: "Approves a claim that is in `WAITING_FOR_FILE_MAKER_APPROVAL` status. " + "Moves the claim to `INSURER_REVIEW_AWAITING_OWNER_SIGN` and sends the owner an SMS " + "with a signature link. Fanavaran submission is triggered automatically after the " + "owner signs.", }) async approve( @Param("claimRequestId") claimRequestId: string, @CurrentUser() fileMaker: any, ) { return this.requestManagementService.fileMakerApproveV5( fileMaker, claimRequestId, ); } @Post("reject/:claimRequestId") @ApiParam({ name: "claimRequestId" }) @ApiBody({ type: FileMakerRejectDto }) @ApiOperation({ summary: "Reject the completed claim back to FileReviewer (FileMaker V5)", description: "Rejects a claim that is in `WAITING_FOR_FILE_MAKER_APPROVAL` status. " + "Moves the claim back to `WAITING_FOR_DAMAGE_EXPERT` and the linked blame back to " + "`WAITING_FOR_FILE_REVIEWER` so the FileReviewer can re-lock, adjust the damage " + "assessment, and restart user interaction as needed.\n\n" + "**Rejection limit:** the FileMaker may reject at most **2 times** per claim. " + "On the 3rd attempt the endpoint returns **422** with " + "`errorCode: FILE_MAKER_REJECTION_LIMIT_EXCEEDED` — the FileMaker must approve instead. " + "The current count is returned as `fileMakerRejectionCount` in the response and in " + "`GET v2/expert-claim/requests`.", }) @ApiResponse({ status: 422, description: "Business rule violation: rejection limit exceeded. " + "`errorCode: FILE_MAKER_REJECTION_LIMIT_EXCEEDED` — the claim has already been rejected twice.", schema: { example: { errorCode: "FILE_MAKER_REJECTION_LIMIT_EXCEEDED", message: "This claim has already been rejected twice. You must approve it now — no further rejections are allowed.", }, }, }) async reject( @Param("claimRequestId") claimRequestId: string, @Body() body: FileMakerRejectDto, @CurrentUser() fileMaker: any, ) { return this.requestManagementService.fileMakerRejectV5( fileMaker, claimRequestId, body?.reason, ); } }