import type { IStrategyRunnerResponse } from "@/@types/types/strategy-service.types"; import { getResultFromStrategyResponse } from "@/libs/helpers/strategy-service.helper"; import { JsonParserHelper } from "@/libs/helpers/string-to-json-helper"; import type { IBookingRequest } from "@/models/booking-request.model"; import type { IBookingDetailResponse } from "../booking-detail-request/booking-detail-service.types"; import type { PricingCombination2 } from "../demand/demand-service.types"; import type { PricingCombinationWithCombinationGroups } from "../flight/flight-search/flight-search-services-serializer"; import type { IBookingRequestResponse } from "./booking-request-service.types"; export const bookingRequestSerializer = ( bookingRequestData: IBookingRequestResponse | IBookingDetailResponse, ) => { function getModuleName() { switch (bookingRequestData.moduleName) { case "HotelModule": return "Hotel"; case "Hotel": return "Hotel"; case "FlightModule": return "Flight"; case "Flight": return "Flight"; case "Transfer": case "TransferModule": return "Transfer"; case "CarRentalModule": return "CarRental"; default: return undefined; } } const bookingRequestItem: IBookingRequest = { id: bookingRequestData.id, moduleName: getModuleName(), displayInformations: JsonParserHelper.jsonParseOrUndefined( bookingRequestData.displayInformations, ), passengerInformations: JsonParserHelper.jsonParseOrUndefined( bookingRequestData.passengerInformations, ), searchId: bookingRequestData.searchId, userId: bookingRequestData.userId, masterUserId: bookingRequestData.masterUserId, travelReasonId: bookingRequestData.travelReasonId, travelReasonName: bookingRequestData.travelReasonName, bookedProduct: JsonParserHelper.jsonParseOrUndefined( bookingRequestData.bookedProduct, ), predictedPriceTry: bookingRequestData.predictedPriceTry, extraServiceRequests: bookingRequestData.extraServiceRequests, reservationData: JsonParserHelper.jsonParseOrUndefined( bookingRequestData.reservationData, ), searchRequest: bookingRequestData.searchRequest, bookedPriceTry: bookingRequestData.bookedPriceTry, budgetRoleId: bookingRequestData.budgetRoleId, requestStatus: bookingRequestData.requestStatus, beforeRequestId: bookingRequestData.beforeRequestId, totalPrice: bookingRequestData.totalPrice, netPrice: bookingRequestData.netPrice, createDate: bookingRequestData.createDate, updateDate: bookingRequestData.updateDate, createdByUserId: bookingRequestData.createdByUserId, createdByUserName: bookingRequestData.createdByUserName, updatedByUserId: bookingRequestData.updatedByUserId, updatedByUserName: bookingRequestData.updatedByUserName, status: bookingRequestData.status, cancelRequest: bookingRequestData.cancelRequest, corpBookingRecords: bookingRequestData.corpBookingRecords, corpRequestHistories: bookingRequestData?.corpRequestHistories, }; if ((bookingRequestData as IBookingDetailResponse).requesterUserIds) { bookingRequestItem.requesterUserIds = ( bookingRequestData as IBookingDetailResponse ).requesterUserIds; } return bookingRequestItem; }; export const bookingRequestResultSerializer = ( data: IStrategyRunnerResponse<{ data: IBookingRequestResponse[]; recordsFiltered: number; recordsTotal: number; }>, ) => { if (!data.success) { return []; } const bookingRequestList = getResultFromStrategyResponse(data); if (!bookingRequestList || !bookingRequestList.data) return []; return bookingRequestList.data.map((bookingRequestItem) => bookingRequestSerializer(bookingRequestItem), ); }; export const bookingRequestResultSerializerWithPagiData = ( data: IStrategyRunnerResponse<{ data: IBookingRequestResponse[]; recordsFiltered: number; recordsTotal: number; }>, ) => { if (!data.success) { return { items: [], pagination: { recordsFiltered: 0, recordsTotal: 0 } }; } const bookingRequestList = getResultFromStrategyResponse(data); if (!bookingRequestList || !bookingRequestList.data) return { items: [], pagination: { recordsFiltered: 0, recordsTotal: 0 } }; return { items: bookingRequestList.data.map((bookingRequestItem) => bookingRequestSerializer(bookingRequestItem), ), pagination: { recordsFiltered: bookingRequestList.recordsFiltered, recordsTotal: bookingRequestList.recordsTotal, }, }; }; export type BookingRequestBodyVariablesTypes = { pagination?: { pageSize?: number; pageNumber?: number; }; sort?: { sortColumn?: string; }; filter?: { ModuleName?: "HotelModule" | "FlightModule" | "CarRentalModule" | undefined; // "HotelModule", TravelReason?: string; CancelReason?: string; RequestStatus?: string | undefined; RequestId?: number; OnlyCurrentUser?: boolean; SearchTerm?: string; }; }; export const bookingRequestBodySerializer = ({ pagination, sort, filter, }: BookingRequestBodyVariablesTypes) => { return { CorpRequestSelectListRequest: { DataGridRequest: { Page: pagination?.pageNumber ?? 1, PageSize: pagination?.pageSize ?? 10, SortColumn: sort?.sortColumn ?? "Id", SortIsAscending: false, }, Filter: { ModuleName: filter?.ModuleName ?? null, TravelReason: filter?.TravelReason ?? null, CancelReason: filter?.CancelReason ?? null, RequestStatus: filter?.RequestStatus ?? null, RequestId: filter?.RequestId ?? null, OnlyCurrentUser: !!filter?.OnlyCurrentUser, SearchTerm: filter?.SearchTerm ?? null, }, }, }; }; export const bookingRequestDataToPricingCombinationWithCombinationGroups = ( data: PricingCombination2, ): PricingCombinationWithCombinationGroups => { const result: PricingCombinationWithCombinationGroups = { basePrice: data.BasePrice, combinationGroupKeys: data.CombinationGroupKeys, discount: data.Discount, onRequest: data.OnRequest, reservable: data.Reservable, taxes: data.Taxes, totalPrice: data.TotalPrice, bankCampaingId: data.BankCampaingId, posKey: data.PosKey, pricingDate: data.PricingDate, equivalentTotalPrice: data.EquivalentTotalPrice, combinationGroups: [], type: data.Type, key: data.Key, }; const resultCombinationGroups: PricingCombinationWithCombinationGroups["combinationGroups"] = []; data.CombinationGroups.forEach((combinationGroup) => { const resultSegments: PricingCombinationWithCombinationGroups["combinationGroups"][number]["flightSegments"] = []; combinationGroup.FlightSegments.forEach((flightSegment) => { resultSegments.push({ arrivalTime: flightSegment.ArrivalTime, bookingCode: flightSegment.BookingCode, cabinClass: flightSegment.CabinClass, departureTime: flightSegment.DepartureTime, destination: flightSegment.Destination, flightNumber: flightSegment.FlightNumber, flightTime: flightSegment.FlightTime, groupId: flightSegment.GroupId, marketingAirline: flightSegment.MarketingAirline, marketingAirlineCode: flightSegment.MarketingAirlineCode, operatingAirline: flightSegment.OperatingAirline, operatingAirlineCode: flightSegment.OperatingAirlineCode, origin: flightSegment.Origin, quota: flightSegment.Quota, voyageCode: flightSegment.VoyageCode, key: flightSegment.Key, }); }); resultCombinationGroups.push({ basePrice: combinationGroup.BasePrice, discount: combinationGroup.Discount, equivalentTotalPrice: combinationGroup.EquivalentTotalPrice, flightSegmentKeys: combinationGroup.FlightSegmentKeys, groupId: combinationGroup.GroupId, isOneWayCombinable: combinationGroup.IsOneWayCombinable, onRequest: combinationGroup.OnRequest, key: combinationGroup.Key, taxes: combinationGroup.Taxes, flightSegments: resultSegments, reservable: combinationGroup.Reservable, totalPrice: combinationGroup.TotalPrice, totalPriceCast: combinationGroup.TotalPriceCast, travelTime: combinationGroup.TravelTime, type: combinationGroup.Type, bankCampaingId: combinationGroup.BankCampaingId, cabinClassDescription: combinationGroup.CabinClassDescription, cabinClassTitle: combinationGroup.CabinClassTitle, posKey: combinationGroup.PosKey, pricingDate: combinationGroup.PricingDate, }); }); result.combinationGroups = resultCombinationGroups; return result; };