This document summarizes what has been implemented so far for the M&M bundle-pricing architecture, what changed in existing APIs, and what new APIs were introduced.
src/shared/enums/hotel-category.enum.tssrc/shared/entity/itinerary-bundle-pricing.entity.tssrc/shared/entity/itinerary-bundle-capacity-price.entity.tssrc/shared/entity/itinerary.entity.tstripTypebundlePricingsrc/shared/entity/hotel-itinerary-mapping.entity.tscategory and locationIdUpdated controller: src/modules/itinerary/itinerary.controller.ts
GET /v1/itinerary/:id/price-detailsGET /v1/itinerary/:id/customer-price-detailsPUT /v1/itinerary/:id/pricing-table (admin)PUT /v1/itinerary/:id/customer-pricing-selection (customer)Now supports optional query params:
selectedCategoryselectedVehicleNameselectedCapacityMinselectedCapacityMaxincludeDinnerSupplementchannelPurpose split:
Persistence split:
booking.priceDetails (latest booking for booking user + itinerary).Updated DTO/controller/service:
src/modules/hotel/dto/map-hotel-itinerary.dto.tssrc/modules/hotel/hotel.controller.tssrc/modules/hotel/hotel.service.tsExisting endpoint:
POST /v1/hotel/map-itineraryNew optional payload fields added:
categorylocationIdPurpose: support primary scoping and category-aware hotel mapping for itinerary bundle architecture.
Updated DTO/service:
src/modules/bookings/dto/create-booking.dto.tssrc/modules/bookings/bookings.service.tsExisting endpoint: booking create flow now accepts bundle selectors:
selectedCategoryselectedCapacityMinselectedCapacityMaxincludeDinnerSupplementchildrenWithBedchildrenWithoutBedPurpose: booking calculation can be performed from bundle matrix + selected capacity bucket.
Updated service: src/modules/days/days.service.ts
Existing endpoint behavior changed to:
data.itineraryDetails.daysdata.itineraryDetails.hotelsdata.itineraryDetails.transfersinstead of embedding hotels/transfers inside each day.
All added in src/modules/itinerary/itinerary.controller.ts.
PUT /v1/itinerary/:id/default-categorySetDefaultCategoryDtosrc/modules/itinerary/dto/bundle-pricing.dto.tssrc/modules/itinerary/itinerary.service.tssrc/modules/itinerary/itinerary.repository.tsPUT /v1/itinerary/:id/bundle-pricingUpsertBundlePricingDtoGET /v1/itinerary/:id/bundle-pricingPOST /v1/itinerary/import-itinerary-fullImportItineraryFullDtosrc/modules/itinerary/dto/import-itinerary-full.dto.tsThis API is designed for your "import all at once" requirement and supports:
transferIds)hotelIds)hotelDayMappings)activities with dayOrder, mandatory startTime, optional duration)Implemented in src/modules/itinerary/itinerary.service.ts:
Transfer mapping:
transferIds)Hotel mapping:
hotelIds)hotelDayMappings (hotelId + dayOrder)hotelDayMappings not provided, maps hotel to all itinerary days with matching locationActivity mapping:
startTime (required) and duration (optional) in activity_other_detailsday_resource_mapping using dayOrderTransfer mapping:
transferIds)Bundle pricing rows can be created in same import request.
Implemented in publish toggle flow (src/modules/itinerary/itinerary.service.ts + src/modules/itinerary/itinerary.repository.ts).
Validation now follows scenario-specific rules:
hotel + transfer (+activities):hotel-only:transfer-only:activities-only:adultPrice requiredAlso aligned:
tripType, hotel category, and bundle pricing category now use the same category enum semantics.tripType is treated as canonical category source.BASIC behavior is treated as STANDARD for compatibility handling.Transfer mapping defaults:
isPrimary=truesrc/modules/transfer/transfer.repository.tsTraveler/pricing interfaces extended for bundle selectors:
src/shared/interfaces/traveler-counts.interface.tssrc/modules/itinerary/interface/traveler-details.interface.tsitineraryDetails.hotels and itineraryDetails.transfers.