YARA-1216

This commit is contained in:
SepehrYahyaee
2026-08-09 10:36:45 +03:30
parent 473075e546
commit 3821bf36ef
3 changed files with 104 additions and 5 deletions

View File

@@ -87,6 +87,33 @@ export class DescriptionDto {
lightCondition?: LightCondition; lightCondition?: LightCondition;
} }
/**
* V4 FileMaker description step (THIRD_PARTY and CAR_BODY alike).
* Accident date and time are required for all file types in V4 so the
* front-end can display them consistently regardless of blame type.
*/
export class DescriptionV4Dto {
@ApiProperty({ description: "Accident description" })
@IsString()
@IsNotEmpty()
desc: string;
@ApiProperty({
description: "Date of the accident (required for all V4 files)",
example: "2025-12-08",
})
@IsNotEmpty()
accidentDate: Date;
@ApiProperty({
description: "Time of the accident (required for all V4 files)",
example: "14:30",
})
@IsString()
@IsNotEmpty()
accidentTime: string;
}
/** /**
* THIRD_PARTY description step: only desc is accepted. * THIRD_PARTY description step: only desc is accepted.
*/ */

View File

@@ -33,7 +33,7 @@ import { SendPartyOtpDto, VerifyPartyOtpDto } from "./dto/party-otp.dto";
import { RunInquiriesV3Dto, RunInquiriesVinV3Dto } from "./dto/run-inquiries-v3.dto"; import { RunInquiriesV3Dto, RunInquiriesVinV3Dto } from "./dto/run-inquiries-v3.dto";
import { import {
CarBodyFormDto, CarBodyFormDto,
DescriptionDto, DescriptionV4Dto,
LocationDto, LocationDto,
} from "./dto/create-request-management.dto"; } from "./dto/create-request-management.dto";
import { RequestManagementService } from "./request-management.service"; import { RequestManagementService } from "./request-management.service";
@@ -260,15 +260,20 @@ export class FileMakerBlameV4Controller {
@Post("add-detail-description/:requestId") @Post("add-detail-description/:requestId")
@ApiParam({ name: "requestId" }) @ApiParam({ name: "requestId" })
@ApiBody({ type: DescriptionDto }) @ApiBody({ type: DescriptionV4Dto })
@ApiOperation({ summary: "Add description for current party" }) @ApiOperation({
summary: "Add description for current party (V4)",
description:
"Saves description, accidentDate, and accidentTime on the party statement. " +
"accidentDate and accidentTime are required for all V4 files (THIRD_PARTY and CAR_BODY alike).",
})
async addDescription( async addDescription(
@Param("requestId") requestId: string, @Param("requestId") requestId: string,
@Body() body: DescriptionDto, @Body() body: DescriptionV4Dto,
@CurrentUser() fileMaker: any, @CurrentUser() fileMaker: any,
@Body("partyRole") partyRole?: string, @Body("partyRole") partyRole?: string,
) { ) {
return this.requestManagementService.addPartyDescriptionV3( return this.requestManagementService.addPartyDescriptionV4(
requestId, requestId,
fileMaker, fileMaker,
body, body,

View File

@@ -57,6 +57,7 @@ import { AutoCloseRequestService } from "src/utils/cron/cron.service";
import { SmsOrchestrationService } from "src/sms-orchestration/sms-orchestration.service"; import { SmsOrchestrationService } from "src/sms-orchestration/sms-orchestration.service";
import { import {
DescriptionDto, DescriptionDto,
DescriptionV4Dto,
LocationDto, LocationDto,
RequestManagementDtoRs, RequestManagementDtoRs,
} from "./dto/create-request-management.dto"; } from "./dto/create-request-management.dto";
@@ -10260,6 +10261,72 @@ export class RequestManagementService {
return { requestId: req._id, publicId: req.publicId, partyRole: role }; return { requestId: req._id, publicId: req.publicId, partyRole: role };
} }
/**
* V4 description step.
*
* Identical to {@link addPartyDescriptionV3} but additionally requires
* `accidentDate` and `accidentTime` for all blame types (THIRD_PARTY and
* CAR_BODY alike) and persists them on `party.statement`. This lets the
* front-end display the accident time consistently for every V4 file without
* branching on blame type.
*/
async addPartyDescriptionV4(
requestId: string,
actor: any,
body: DescriptionV4Dto,
partyRole?: string,
) {
if (
body.accidentDate == null ||
body.accidentDate === ("" as any)
) {
throw new BadRequestException(
"accidentDate is required for V4 files.",
);
}
if (
!body.accidentTime ||
!String(body.accidentTime).trim()
) {
throw new BadRequestException(
"accidentTime is required for V4 files.",
);
}
const req = await this.blameRequestDbService.findById(requestId);
if (!req) throw new NotFoundException("Request not found");
await this.verifyExpertAccessForBlameV2(req, actor);
const role = this.resolvePartyRoleV3(req, partyRole);
this.assertBlameV3PartyDetailPhase(req, role);
const idx = this.getPartyIndex(req, role);
if (idx === -1) throw new BadRequestException(`${role} party not found`);
const party = req.parties[idx];
if (!party.statement) party.statement = {} as any;
party.statement.description = body.desc;
party.statement.accidentDate = body.accidentDate as any;
party.statement.accidentTime = body.accidentTime;
if (!Array.isArray(req.history)) req.history = [];
req.history.push({
type: "V4_PARTY_DESCRIPTION_SAVED",
actor: {
actorId: new Types.ObjectId(actor.sub),
actorName: `${actor.firstName || ""} ${actor.lastName || ""}`.trim(),
actorType: "field_expert",
},
metadata: {
partyRole: role,
accidentDate: body.accidentDate,
accidentTime: body.accidentTime,
},
} as any);
await (req as any).save();
return { requestId: req._id, publicId: req.publicId, partyRole: role };
}
async carBodyAccidentTypeFormV3( async carBodyAccidentTypeFormV3(
requestId: string, requestId: string,
body: CarBodyFormDto, body: CarBodyFormDto,