diff --git a/prisma/schema.prisma b/prisma/schema.prisma index fee840e..b26f263 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1779,6 +1779,7 @@ model ItineraryHeader { toDate DateTime @map("to_date") toTime String @map("to_time") @db.VarChar(30) itineraryStatus String @default("draft") @map("itinerary_status") @db.VarChar(30) + cancellationReason String? @map("cancellation_reason") isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") diff --git a/src/modules/user/handlers/itinerary/cancelUserItinerary.ts b/src/modules/user/handlers/itinerary/cancelUserItinerary.ts index 929dd4a..7c9b3f2 100644 --- a/src/modules/user/handlers/itinerary/cancelUserItinerary.ts +++ b/src/modules/user/handlers/itinerary/cancelUserItinerary.ts @@ -39,14 +39,21 @@ export const handler = safeHandler(async ( body.itineraryHeaderXid !== undefined && body.itineraryHeaderXid !== null ? Number(body.itineraryHeaderXid) : NaN; + const reason = + typeof body.reason === 'string' ? body.reason.trim() : ''; if (!Number.isInteger(itineraryHeaderXid) || itineraryHeaderXid <= 0) { throw new ApiError(400, 'Invalid itineraryHeaderXid.'); } + if (!reason) { + throw new ApiError(400, 'Cancellation reason is required.'); + } + const result = await itineraryService.cancelUserItinerary( userId, itineraryHeaderXid, + reason, ); return { diff --git a/src/modules/user/services/itinerary.service.ts b/src/modules/user/services/itinerary.service.ts index a0e7b0d..3f5aeb2 100644 --- a/src/modules/user/services/itinerary.service.ts +++ b/src/modules/user/services/itinerary.service.ts @@ -2462,7 +2462,11 @@ export class ItineraryService { }; } - async cancelUserItinerary(userXid: number, itineraryHeaderXid: number) { + async cancelUserItinerary( + userXid: number, + itineraryHeaderXid: number, + cancellationReason: string, + ) { return this.prisma.$transaction(async (tx) => { const itinerary = await tx.itineraryHeader.findFirst({ where: { @@ -2638,29 +2642,23 @@ export class ItineraryService { }, }); - const cancelledItinerary = await tx.itineraryHeader.update({ - where: { - id: itineraryHeaderXid, - }, - data: { - isActive: false, - itineraryStatus: 'cancelled', - }, - select: { - id: true, - itineraryNo: true, - title: true, - itineraryStatus: true, - isActive: true, - }, - }); + await tx.$executeRaw` + UPDATE "itn"."itinerary_header" + SET + "is_active" = false, + "itinerary_status" = 'cancelled', + "cancellation_reason" = ${cancellationReason}, + "updated_at" = NOW() + WHERE "id" = ${itineraryHeaderXid} + `; return { - itineraryHeaderXid: cancelledItinerary.id, - itineraryNo: cancelledItinerary.itineraryNo, - title: cancelledItinerary.title, - itineraryStatus: cancelledItinerary.itineraryStatus, - isActive: cancelledItinerary.isActive, + itineraryHeaderXid: itinerary.id, + itineraryNo: itinerary.itineraryNo, + title: itinerary.title, + itineraryStatus: 'cancelled', + cancellationReason, + isActive: false, }; }); }