Hawaii - Major (22.22)
Kaptio is proud to announce that in this Major Release, Hawaii, we have introduced the following features: **Bulk Actions for Group Tours**, **Package Levels**, **Rake Configuration templates for Cabin Configuration Scheme** and **Passenger Import for Non-Operational Itineraries** **NOTE:** The following post-installment script must be executed after this release is installed. ::video{url="https://share.zight.com/2NuORYNx?embed=true"}
"Add segment" button in Edit timetable feature doesn't create links to Route Departures (ST-2965)
"Add segment" button in Edit timetable feature doesn't create links to Route Departures Service Departures "Add segment" button in Edit timetable feature creates links to Route Departures
Remove validation for passenger-configuration assignment from passenger grid flow (GTT-700)
Remove validation for passenger-configuration assignment from passenger grid flow Passenger import Users are no longer required to select a specific Passenger Configuration option (Single, Twin, or Crew) in the Passenger Assignment modal.
KAPI-6353 - Bulk Manager - From & To Dates for the itinerary items showing a day off (GTT-694)
KAPI-6353 - Bulk Manager - From & To Dates for the itinerary items showing a day off Bulk Operations Fixed bug with time zones on Bulk Manager table
Add column "Day in Tour" to the builder for Price Models and Operational itineraries (GTT-681)
Add column "Day in Tour" to the builder for Price Models and Operational itineraries Group Tour Enhanced the existing "Days" column in Itinerary Builder to work relative to a tour reference date. Supports negative values, ranges, and direct editing. Day 1 is calculated from Tour Departure (Operational) or the first non-optional service (Price Model).
Exclude service lines with optional configs from the Price Model request (GTT-680)
Exclude service lines with optional configs from the Price Model request Group Tour Excluded service lines with optional configs from the Price Model Output calculation request
Service field is not prepopulated for Timetable modal window (GTT-677)
Service field is not prepopulated for Timetable modal window Timetable Service field is populated after some time model window in opened
Service with “Standard” qty behavior cannot be splitted (GTT-675)
Service with “Standard” qty behavior cannot be splitted Group Tour Operational itinerary Fixed Standard quantity behavior lines splitting and merging
Limit of async job running PriceModelOutputDeletionService-deleted only for Price Model itineraries (GTT-674)
Limit of async job running PriceModelOutputDeletionService-deleted only for Price Model itineraries Group Tour Price Model Output creation and deletion processing has been refined to run only when relevant. Orphan Price Model Outputs are now cleaned up only when a Price Model itinerary is deleted, preventing unnecessary async processing for non-Price Model itineraries (for example, customers not using Group Tours). In addition, new Async Job Settings allow administrators to control whether successful Price Model Output creation and deletion jobs are automatically removed, helping reduce async job clutter while retaining flexibility for monitoring and troubleshooting.
Add custom permission for Price Model Room Pricing feature (GTT-671)
Add custom permission for Price Model Room Pricing feature Group Tour Half Twin pricing Added custom permission "`Allow editing Price Model Room pricing`" for Price Model Room Pricing feature
TemplateOverride__c field update in ServiceDepartureOpsLocation__c (GTT-668)
TemplateOverride__c field update in ServiceDepartureOpsLocation__c Timetable TemplateOverride__c flag is set to true if ServicDepartureOpsLocation__c is updated
New Price Model form error after layout update (GTT-664)
New Price Model form error after layout update Group Tour Fixed bug with incorrect values for standard lookups on Price model and Group Tour modals
Part 2- Refactoring in operational re-evaluation functionality to prvent heap size error (GTT-663)
Part 2- Refactoring in operational re-evaluation functionality to prvent heap size error Group Tour Operational itinerary Reduced heap size usage during Operational Itineraries revaluation
Group Tour and Price Model modals ignore Default field values. (GTT-662)
Group Tour and Price Model modals ignore Default field values. Group Tour Group Tour and Price Model modals support Default field values.
Bulk Edit timetable function (GTT-661)
Bulk Edit timetable function Timetable Added Bulk Edit timetable logic to have an opportunity for editing from Service Departure list view
Show optional configs on the Operational itinerary (GTT-652)
Show optional configs on the Operational itinerary Group Tour Operational itinerary Added logic to display optional configurations from related Price Model on Operational Itinerary
Component for CSS service departure creation/edit (GTT-645)
Component for CSS service departure creation/edit Cabin Allocation tool Cabin Configuration Scheme **Business Context:** Users need to create departure-specific cabin configurations based on templates, with the ability to adjust cabin availability per departure. <iframe src="https://share.zight.com/Bluw0j5Z?embed=true" width="360" height="270" style="border:none" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowtransparency="true" allowfullscreen="true" /> **Step-by-Step Process:** 1. **Use Template** * "Use template" button is active only when no carriages or cabins are assigned * System shows CCS templates linked to the Train from the Service Departure * User selects a template; cabins default to "Available" status 2. **Manage Departure CCS** * Add/delete cabin sets and reorder via drag-and-drop * Change cabin status to "Unavailable" (cannot change if "Occupied") * Cannot delete cabin set if any cabin is "Occupied" * Update Service Departure notes 3. **Save Operations (Backend)** * Creates/updates CCS record with type "Cabin configuration" * Manages `CabinConfigurationAssignment__c`, `CabinSetAssignment__c`, `Cabin__c` (linked to CCS), `ServiceCabin__c`, and `ServiceCabinSegmentAssignment__c` records
Component for CCS template creation/edit (GTT-644)
Component for CCS template creation/edit Cabin Allocation tool Cabin Configuration Scheme **Business Context:** Users need a dedicated interface to create and manage Rake Cabin Configuration templates, defining the default scheme for a train that can later be applied to departures. <iframe src="https://share.zight.com/nOuxwzmw?embed=true" width="360" height="270" style="border:none" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowtransparency="true" allowfullscreen="true" /> **Step-by-Step Process:** 1. **Create/Edit Template** * LWC component overrides Create/Edit buttons for the "Rake Configuration Template" record type * User can change the CCS name, select a Train (`Ship__c`), add/delete cabin sets, and reorder via drag-and-drop 2. **Save Operations (Backend)** * Creates/updates `CabinConfigurationScheme__c` record * Manages `CabinConfigurationAssignment__c` and `CabinSetAssignment__c` records * Cabins are **not** linked directly to the CCS at the template level
Add New Record Type "Rake Configuration Template" for Cabin Configuration Scheme (GTT-642)
Add new Record Type for CabinConfigurationScheme__c - "Rake configuration template" Cabin Allocation tool Cabin Configuration Scheme **Business Context:** A template record type is needed to distinguish between departure-specific CCS records and reusable templates for train configurations. **Changes:** * Deprecated the unused "Rake Configuration" record type * Added new "Rake Configuration Template" record type for `CabinConfigurationScheme__c` * Template record types cannot be linked to Service Departures
Change Lookup(CabinConfigurationScheme__c) to non-mandatory in Cabin__c object (GTT-641)
Change Lookup(CabinConfigurationScheme__c) to non-mandatory in Cabin__c object Cabin Allocation tool Cabin Configuration Scheme **Business Context:** In the rake configuration model, a cabin can be linked to multiple Cabin Configuration Schemes via Cabin Set Assignments, so the direct lookup should not be mandatory. **Resolution:** - `Lookup(CabinConfigurationScheme__c)` on the `Cabin__c` object is now **non-mandatory** - Supports the new pattern where Cabin-to-CCS linkage is managed through Cabin Set Assignments
New component for Package levels creation (GTT-636)
New component for Package levels creation Package Levels **Business Context:** Users need to create Package Level records directly from the Components tab when the package is in Package Levels mode. **Step-by-Step Process:** 1. **Access Package Level Component** - Navigate to the Components tab on a package with Service Level Mode = "Package Levels" - The Package Level component is visible 2. **Create Package Levels** - **Create Package Level**: Define a name and sort order - **Create From Cabin Type**: Select from available cabin types; the package level name is auto-populated from the cabin type name 3. **Junction Record Creation** - When saving, a **Package Service Level Assignment** junction record is created linking the Package Level to the package 4. **Edit and Delete** - Users can edit existing package levels (name, sort order) - Users can delete package levels from the component
Warnings when service level mode has been changed (GTT-635)
Warnings when service level mode has been changed Package Levels **Business Context:** Switching between service level modes can invalidate existing assignments. Users must be explicitly warned before changes that clear data. **Confirmation and Auto-Clearing Logic:** | Old Mode -> New Mode | Confirmation Required | Action on Confirm | | --- | --- | --- | | Service Levels -> Standard | Yes | Clear Component Options, clear junction records | | Service Levels -> Package Levels | Yes | Clear incompatible Service Level values | | Package Levels -> Service Levels | Yes | Clear Package Level values, delete package levels | | Package Levels -> Standard | Yes | Clear Package Level values, delete package levels | | Standard -> Service Levels | No | No cleanup needed | | Standard -> Package Levels | No | No cleanup needed | Note: If you're using shared levels across multiple packages, **avoid changing the service level mode**. Doing so may cause your package level records to be deleted. - If the user cancels, no data changes and mode remains unchanged - System prevents silent data loss by requiring explicit confirmation
UI improvements for Edit Package and Comoponents modals (GTT-634)
UI improvements for Edit Package and Comoponents modals Package Levels **Business Context:** Users need the Service Level / Package Level field behavior in modals to reflect the selected Service Level Mode, preventing configuration errors. **Mode-Specific Behavior:** 1. **Standard Mode** - Service Level field is **disabled** in both Edit Package and Component Options modals - No values can be selected 2. **Service Levels Mode** - Service Level field is **enabled** in both modals - Only Service Level record type values appear (Package Levels are excluded) 3. **Package Levels Mode** - Service Level field is **disabled** in Edit Package modal - In Component Options modal, field is labelled "Package Levels" and shows only Package Level records assigned to the package via the Package Service Level Assignment object
Relabelling Cabin Levels + new record type + PDS script (GTT-633)
Relabelling Cabin Levels + new record type + PDS script Package Levels **Business Context:** Administrators need correct naming and data model setup for Package Levels, which were previously mislabeled as "Cabin Levels" despite being used for non-cabin purposes. **Changes Implemented:** 1. **Label Rename** - The picklist value label "Cabin Levels" is renamed to "Package Levels" - The API name remains unchanged to preserve backward compatibility 2. **New Record Types on Service Level Object** - **Service Level** record type: Default for standard service level records - **Package Level** record type: For records previously identified as cabin levels 3. **Post-Install Script** - Assigns record types based on the Service Level Mode field: - Standard / Service Levels -> Service Level record type - Cabin Levels / Package Levels -> Package Level record type - Script is idempotent (safe to run multiple times) - See Release Notes Summary for instructions on how to install
Add Date__c field to the RouteDeparture__c object (GTT-624)
Add Date__c field to the RouteDeparture__c object Route & Segment Configurations Timetable Added Date__c field to the RouteDeparture__c object Added Service Departure Location related list on Departure Template Location layout Added Start Date Time, End Day, End Date Time fields on Service Departure Location layout
Auto populate IntegrationCode__c field on configuration object (GTT-619)
Auto populate IntegrationCode__c field on configuration object Group Tour Auto populate IntegrationCode__c field on configuration object
Add the Tour duration field to the Tour Departure object (GTT-614)
Add the Tour duration field to the Tour Departure object Group Tour Added the Tour duration field to the Tour Departure object
Bulk Manager Items table for Operational Itineraries (KT-13973)
Bulk Manager Items table for Operational Itineraries Bulk Actions for Group A new items table has been added to the Operational Bulk Manager, providing enhanced visibility for Tour departures, operational itineraries, and price models.
Modify re-check inventory control (KT-13976)
Modify re-check inventory control Bulk Actions for Group When running the Re-Check Inventory Operation, the Bulk Manager Confirmation Modal will alert users if Price Model Itineraries are selected, and prevent operations from being run.
Actions for Bulk Manager Items Table Control (KT-13985)
Actions for Bulk Manager Items Table Control Bulk Actions for Group Table controls and Action controls now share the same line in Bulk Manager for Operational Itineraries
Add new Items Table Control to Bulk Manager 1 (KT-14048)
Add new Items Table Control to Bulk Manager 1 Bulk Actions for Group Action Controls and Table Controls have been combined into a single line in Bulk Manager to improve space efficiency.
Outline active Standalone Services for cancelled pax (ST-2703)
Outline active Standalone Services for cancelled pax Booking Overview Printed over the active pills to the green color in the 'Canceled/Transferred Passengers' section
Outline active Standalone Services for cancelled pax (ST-2719)
Outline active Standalone Services for cancelled pax Booking Overview Printed over the active pills to the green color in the 'Canceled/Transferred Passengers' section
Update Availability Pill in Booking Wizard Options based on Quantity Changes (ST-2706)
Update Availability Pill in Booking Wizard Options based on Quantity Changes Booking Wizard Added availability UI updates for Unit based items inventory when quantity control in Booking Wizard is enabled.
Support of 20+ Rooms in Booking Wizard (ST-2483)
Support of 20+ Rooms in Booking Wizard Booking Wizard This introduces improvements in the UI of Package Search and Booking Wizard for large group bookings. - Price Summary tables in Package Search availabilities now have "sticky" headers so that bookings with 5 or more rooms are now scrollable within the context of the package row to remove the need for excessive window scrolling. - An issue with the "Auto Select" feature in the Cabins section of Booking Wizard has also been resolved. - When Room Headers are collapsed in the Options section of Booking Wizard their state is preserved when options in other rooms are selected avoiding the need to scroll. - There have also been general improvements to consistency of the UI within Booking Wizard.
Add control over quantity to Booking Wizard Options (ST-2587)
Add control over quantity to Booking Wizard Options Booking Wizard Added quantity control support to Booking Wizard for optional package services priced per unit.
Configurable Quantity Column in Booking Wizard Options (ST-2593)
Configurable Quantity Column in Booking Wizard Options Booking Wizard This enhancement introduces a "Quantity" column in the Booking Wizard's Options tab, allowing agents to book multiple units of services like private transfers or vehicles. The column's visibility and maximum quantity are now controllable via the Booking Wizard's JSON configuration. **Administrator Configuration** To enable this feature, update the Booking Wizard Configuration field on the Package Search edit page. Add the showQuantityControl object to the JSON. This object controls both the feature's visibility and the quantity limit. **Example JSON Configuration:** To enable the quantity column with a maximum limit of 15, add the following to your configuration JSON: ```json { "showQuantityControl": { "enabled": true, "maxLimit": 15 } } ``` - **enabled**: Set to true to show the column. If false or omitted, the feature is disabled. - **maxLimit**: Sets the maximum value for the quantity stepper. If omitted, it defaults to 10. **Key Functionality:** - The "Quantity" column will only appear if enabled and if the package contains at least one unit-based option (UOM (unit(s) or bus(es)). - The quantity stepper is disabled for an item until it is selected. - Non-unit-based items display a dash (-) in the quantity column. - All prices in the Options tab and the main Summary panel update in real-time to reflect the selected quantity. - State Management: The client-side DTO for selected components (PassengerSelectionSelectedComponentDTO) was updated to include a quantity property. This ensures the selected quantity is correctly stored in the bookingWizardState and is available for real-time price calculations.
Update Booking Wizard Save Logic to Handle Unit-Based Item Quantities (ST-2594)
Update Booking Wizard Save Logic to Handle Unit-Based Item Quantities Booking Wizard What was introduced - Backend support for quantity > 1 on optional components with UOM unit(s) or bus(es) in the Legacy Booking Wizard (Create Quote / Create Booking). - When an agent selects a quantity (e.g. 3 champagnes), the system now creates one Itinerary Item per unit (each with Quantity = 1) and the correct Passenger Itinerary Unit Assignments for each item. Booking Overview shows one row per unit for these optionals. Scope - Legacy flow only; New flow / BookingV2 unchanged. - Only optionals with UOM unit(s) or bus(es) and quantity > 1 are expanded; all other options behave as before. - When quantity is 1 or the feature is disabled, behaviour is unchanged.
Integrate Temporary Hold with Unit-Based Item Quantity (ST-2595)
Integrate Temporary Hold with Unit-Based Item Quantity Booking Wizard Added Temporary Hold support for quantity controls related to optional package items
Display Quantity Column for Options in Change Modes (ST-2596)
Display Quantity Column for Options in Change Modes Booking Wizard Added Quantity control support for Booking Wizard modify mode for `Unit` based optional items
Detect Cross-Room Allocations for Options in Booking Wizard (ST-2632)
Detect Cross-Room Allocations for Options in Booking Wizard Booking Wizard The backend now detects when a single option is allocated to passengers across multiple rooms and exposes this state to the Booking Wizard. This allows the frontend to properly handle and visualize complex allocation scenarios during booking modification.
UI for Options with Cross-Room Allocations (ST-2633)
UI for Options with Cross-Room Allocations Booking Wizard Added UI support in Booking Wizard to identify and handle Options with Cross-Room Allocations, preventing unintended modifications.
Address Minor Issue in Progress Modal on Error (ST-2874)
Address Minor Issue in Progress Modal on Error Booking Wizard Addressed a minor issue in the Booking Wizard progress modal. In the event of an error only "-" was shown for itemName. This has now been corrected to show the correct itemName.
Confirmed Quantity to Itinerary Items (GTT-654)
Confirmed Quantity to Itinerary Items Group Tour Operational itinerary Added `ConfirmedQty__c` field to the `Itinerary_Item__c` object
New trigger points for Operational Itinerary re-evaluation (GTT-658)
New trigger points for Operational Itinerary re-evaluation Group Tour Operational itinerary Operational Itinerary now gets re-evaluated when cancelling passenger or changing itinerary item dates
Payment Schedule Processing Optimization (KT-14018)
Payment Schedule Processing Optimization Group Tour Payments **Problem/Background** Payment schedule recalculation always ran in sync, leading to unnecessary work during updates. There is no reason to run it in sync for Operational itineraries, and it serves no purpose for Price Model itineraries. **Enhancement** Payment schedule and recalculation flows now skip Price Model itineraries and honor async processing for Operational itineraries across itinerary, itinerary group, and passenger updates. **Impact** Operational updates are processed more efficiently with fewer unnecessary schedule recalculations, improving overall system responsiveness.
Route Legs Inventory (KT-13790)
Evaluate inventory based on route legs Inventory Management This release adds support for **inventory based on route legs**: metadata, engine behaviour, and UI so you can manage allotments and inventory when items are set up by route leg. *** ### What’s New ### Metadata and configuration * **Metadata has been extended** so inventory can be configured and used based on route legs. The system can now work with route-leg-based inventory end to end. * **Picklist values** have been added to the relevant Item record types so you can correctly classify and filter items that use route legs for inventory. ### Inventory engine * The **inventory engine** has been updated to support **route legs** and **route-based inventory**. Requests for availability and inventory now take route leg information into account. * The process for **Advance and Route inventory setup** has been optimised so configuration and checks run more efficiently. * When the system requests inventory from the inventory engine, it now uses the **service departure date** (where applicable) so that availability and allotment checks align with the actual departure date of the service. This gives more accurate results for route-leg and time-based inventory. ### Allotments table (UI) * For items whose **Inventory Type is “By Route Leg”**, the **Allotments** table now includes a **Service Departure Location** column. You can see at a glance which location is associated with each allotment row. * Table fields are **loaded dynamically** so the right columns appear for the inventory type you’re viewing, keeping the table relevant and easier to use. *** ### Summary for users | What you get | Benefit | | --------------------------------------------------------- | ----------------------------------------------------------------------------------------- | | Extended metadata and picklist values for route legs | Configure and identify route-leg-based items correctly. | | Inventory engine support for route legs | Availability and inventory checks work for route-based products. | | Use of service departure date in inventory requests | More accurate availability and allotment behaviour for dated services. | | Service Departure Location column on the Allotments table | Quickly see which location applies to each allotment when using “By Route Leg” inventory. | | Dynamically loaded columns on the Allotments table | A clearer, context-specific view of allotments. |
Hide Bundles from Package Search (CEE-663)
Hide Bundles from Package Search Package Search Added new Kaptio Setting checkbox under Trip & Itinerary Settings -> Package & Fuzzy Search named "Hide Bundles from Package Search" that control bundle visibility in package search name filter.
'Create Itinerary' button Active when not available to book (CEE-664)
'Create Itinerary' button Active when not available to book Package Search This functionality allows users to create a **Quote Itinerary** even when one or more package components (hotel, rail, cruise cabin, etc.) are unavailable. When enabled, the **Create Itinerary** button remains active regardless of availability status, supporting pricing and quoting scenarios **Configuration Setting** A new checkbox is available in the **Package Search (lwcPackageSearch) component**: **Setting name:** Create Itinerary button always active * **Default value:** Unchecked (current behavior). * When enabled, the **Create Itinerary** button remains active even if: * `selectedDateDetails.isBookable = false` * One or more components are unavailable :::danger IMPORTANT: This setting only affects the Create Itinerary button. The Add Options button behaviour is not affected. Date validation (e.g., past dates) still applies. :::
Create Option - Create itineraries with reserved inventory from Package Search (CEE-669)
Create Option - Create itineraries with reserved inventory from Package Search Package Search Sales agents can now create itineraries in **Option** status with reserved inventory directly from the Package Search Availability tab, without using the Booking Wizard.
Correction - Tour Code needs to replace Package code (CEE-674)
Correction - Tour Code needs to replace Package code Package Search The **"Show Package Code in Package Selections"** setting in Kaptio Settings, released in version 22.17, has been relabelled **"Show Tour Code in Package Selections"** and now controls whether the **Tour Code** is displayed in the package search results instead of the **Package Code**.
Temporary Hold Callable API (ST-2774)
Expose TemporaryHold functionality via Callable Interface Passenger Grid We've added a new `TemporaryHoldCallableApi` callable service that exposes all temporary hold operations for consumption outside of the managed package. This enables external systems to programmatically create, modify, and manage temporary inventory holds through `ServiceCall.execute()`. ### Available Methods *** #### createContainer Creates a new temporary hold session with items. ``` Map<String, Object> arguments = new Map<String, Object>{ 'request' => new Map<String, Object>{ 'packageId' => 'a1BTA000001xyzABC', 'itineraryId' => 'a26TA000002cOHtYAM', // can be null for new bookings 'packageDepartureId' => 'a2FTA000003abcDEF', 'sourceSystem' => 'BW', 'requestInput' => new Map<String, Object>{ 'accountId' => '001TA000004ghiJKL', 'channelId' => 'a0cTA000005jklMNO', 'currencyCode' => 'USD', 'dateValue' => '2026-03-15', 'occupancy' => '1=2,0', 'taxProfileId' => 'a4BQz000000loz3MAA' } } }; Object result = ServiceCall.execute('TemporaryHoldCallableApi.createContainer', arguments); ``` | Parameter | Type | Required | Description | | --------- | -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | request | Map\<String, Object> | Yes | Serializable to `TemporaryHoldContainerDto.CreateHoldContainerRequest`. Contains package details, itinerary, source system, occupancy, and optional cabin/allotment selections. | **Response:** Returns a `CreateTemporaryHoldResponse` containing: * `success` - Whether the container was created successfully * `container` - The created container details (id, expiresAt, sessionId, status) * `items` - List of hold items created within the container * `cruiseSelectionMapping` - Price category mappings by room index and cabin type * `priceCatMetaByPriceCatId` - Component metadata by price category ID *** #### addHoldItems Adds or modifies hold items in an existing container (e.g. room changes, pre/post night additions). ``` Map<String, Object> arguments = new Map<String, Object>{ 'containerId' => 'a3ATA000006mnoPQR', 'request' => new Map<String, Object>{ 'departureDate' => '2026-03-15', 'componentDetailsArray' => new List<Object>{ new Map<String, Object>{ 'itemId' => 'a0iTA000007stuVWX', 'priceCatId' => 'a1CTA000008uvwXYZ', 'startDay' => 1, 'endDay' => 3, 'componentType' => 'Accommodation' } }, 'context' => new Map<String, Object>{ 'accountId' => '001TA000004ghiJKL', 'channelId' => 'a0cTA000005jklMNO', 'packageId' => 'a1BTA000001xyzABC' } } }; Object result = ServiceCall.execute('TemporaryHoldCallableApi.addHoldItems', arguments); ``` | Parameter | Type | Required | Description | | ----------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- | | containerId | Id | Yes | The Salesforce ID of the temporary hold container | | request | Map\<String, Object> | Yes | Serializable to `TemporaryHoldItemDto.TempHoldItemChangeRequest`. Contains departure date, component details, and request context. | **Response:** Returns a `List<TemporaryHoldItemDto>` of the items added to the container, each containing id, containerId, componentType, priceCategoryId, and departureCabinId. *** #### removeHoldItems Removes specific items from a hold container. ``` Map<String, Object> arguments = new Map<String, Object>{ 'containerId' => 'a3ATA000006mnoPQR', 'holdItemIds' => new List<Id>{ 'a3BTA000009abcDEF' } }; Object result = ServiceCall.execute('TemporaryHoldCallableApi.removeHoldItems', arguments); ``` | Parameter | Type | Required | Description | | ----------- | --------- | -------- | ------------------------------------------------- | | containerId | Id | Yes | The Salesforce ID of the temporary hold container | | holdItemIds | List\<Id> | Yes | List of temporary hold item IDs to remove | **Response:** Returns a `RemoveHoldItemResult` containing: * `isSuccess` - Whether the removal succeeded * `message` - Result message *** #### releaseContainer Releases (cancels or converts) temporary hold containers and frees the held inventory. ``` Map<String, Object> arguments = new Map<String, Object>{ 'containerIds' => new List<Id>{ 'a3ATA000006mnoPQR' }, 'status' => 'UserCancelled' }; Object result = ServiceCall.execute('TemporaryHoldCallableApi.releaseContainer', arguments); ``` | Parameter | Type | Required | Description | | ------------ | --------- | -------- | ----------------------------------------------------------------------------------------------------- | | containerIds | List\<Id> | Yes | List of container IDs to release | | status | String | Yes | Release status. Valid values: `UserCancelled`, `Expired`, `ConvertedToBooking`, `ConvertedToReserved` | **Response:** Returns a `ReleaseHoldDataDto` containing: * `itemsByContainerId` - Released items mapped by container ID * `containersById` - Released containers by ID * `inactiveContainerIds` - IDs of containers that were already inactive (skipped) *** #### extendHoldTimer Extends the hold expiration timer for one or more containers. ``` Map<String, Object> arguments = new Map<String, Object>{ 'containerIds' => new List<Id>{ 'a3ATA000006mnoPQR' } }; Object result = ServiceCall.execute('TemporaryHoldCallableApi.extendHoldTimer', arguments); ``` | Parameter | Type | Required | Description | | ------------ | --------- | -------- | ------------------------------- | | containerIds | List\<Id> | Yes | List of container IDs to extend | **Response:** Returns an `ExtendHoldResponse` containing: * `expirationTimeByContId` - New expiration timestamps mapped by container ID * `skippedForProcessing` - Container IDs that could not be extended *** #### getSessionSettings Retrieves hold configuration settings for a source system. ``` Map<String, Object> arguments = new Map<String, Object>{ 'systemName' => 'BW' }; Object result = ServiceCall.execute('TemporaryHoldCallableApi.getSessionSettings', arguments); ``` | Parameter | Type | Required | Description | | ---------- | ------ | -------- | -------------------------------------------------------------------------------- | | systemName | String | Yes | Developer name of the source system (matches `TemporaryHoldSetting__mdt` record) | **Response:** Returns a `SessionSettingsDto` containing: * `sourceSystemName` - The source system name * `holdDuration` - Hold duration in minutes * `showWarningBeforeMinutes` - Minutes before expiration to show a warning * `extensionDurationMinutes` - Duration of each extension in minutes *** #### getDetails Retrieves container and item details for the given container IDs. ``` Map<String, Object> arguments = new Map<String, Object>{ 'containerIds' => new List<Id>{ 'a3ATA000006mnoPQR' } }; Object result = ServiceCall.execute('TemporaryHoldCallableApi.getDetails', arguments); ``` | Parameter | Type | Required | Description | | ------------ | --------- | -------- | --------------------------------------------- | | containerIds | List\<Id> | Yes | List of container IDs to retrieve details for | **Response:** Returns a `Map<Id, TemporaryHoldContainerDto>` where each container DTO contains: * `id` - Container ID * `expiresAt` - Expiration timestamp * `itinerary` - Associated itinerary ID * `sessionId` - Session identifier * `source` - Source system name * `status` - Current container status (Active, Expired, UserCancelled, ConvertedToBooking, ConvertedToReserved)
Reinstate Button on Lapsed Booking is not able to be hidden/disabled (ST-2866)
Reinstate Button on Lapsed Booking is not able to be hidden/disabled Reinstate The Reinstate flow in Booking Overview is now controlled by permission. Users can only access reinstatement when the itinerary is lapsed **and** they have the **(Kaptio) Enable Reinstate Features** permission set assigned. This introduces role-based control over who can reinstate itineraries.
On Rightrez Callback when no segments are present reject update (ST-2794)
On Rightrez Callback when no segments are present reject update Right Rez We added a business logic to the RightRez callback to skip processing Shell and Cancelled PNRs on import and refresh. We ignore such PNRs and log the error about the lack of flight segments to the Asynchronous Job records.
Color Coding for Service Levels (CEE-662)
Color Coding for Service Levels Service Levels This functionality allows agents to quickly identify service levels by color in the **Availability** and **Results** tabs of Package Search. Each service level can have a dedicated color configured in Kaptio settings. **Service Level Color Configuration** - A **Hex Color field** is available in the **Service Levels configuration** in Kaptio settings - Users can enter a **6-character hex color value** (e.g., `#FFFFFF`). - The field is **optional**: - If a color is provided, it will be used in Package Search. - If no color is set, the system default color will be used. - If an invalid hex value is entered, the system may display an incorrect or default color.
'Create Itinerary' label shown instead of 'Add to Itinerary' (CEE-673)
'Create Itinerary' label shown instead of 'Add to Itinerary' Fixed label from "Create Itinerary" to "Add to Itinerary" when entering Package Search from an existing Itinerary
Error when saving Itinerary from Standalone Package Search (CEE-697)
Error when saving Itinerary from Standalone Package Search Resolved an issue where users encountered the error: _"Account, Primary Contact, Start Date and Group Size cannot be null when Trip is not set"_ when creating and saving an Itinerary via Standalone Package Search. Users can now successfully create and save an Itinerary after selecting a package account and contact, without receiving the validation error.
Default Pricing Behavior for New Itinerary Items (KT-14016)
Default Pricing Behavior for New Itinerary Items New itinerary items created without an explicit Pricing Behavior could remain unset, leading to inconsistent pricing defaults in group travel scenarios. **Solution** Pricing Behavior now defaults to Standard when not provided during itinerary item creation, aligning with existing defaulting for Quantity Behavior. **Impact** More consistent pricing setup for newly created itinerary items, reducing manual adjustments and improving data consistency.
Supplier Invoice Lines "Dates with Time" and "Due Date" are calculating incorrectly (KT-14062)
Supplier Invoice Lines "Dates with Time" and "Due Date" are calculating incorrectly Fixed the "after travel" date calculation logic for supplier invoice lines to correctly compute "Dates with Time" and "Due Date" fields.
Lead Passenger Assignment Fix for Multi-Role Import Scenarios (KT-14078)
Lead Passenger Assignment Fix for Multi-Role Import Scenarios When importing passengers into an itinerary that already contained passengers with different channel roles, the system could incorrectly assign lead passenger status to newly imported passengers, even when a valid lead passenger already existed on the itinerary. This issue occurred specifically when: - An itinerary had existing passengers with valid lead-eligible roles (such as Adult) - One of those existing passengers was already designated as the lead - New passengers with different channel roles were imported - The system failed to recognize that existing passengers were valid lead candidates As a result, the newly imported passenger would incorrectly become the lead passenger, overriding the existing lead assignment and potentially causing confusion in customer records and communications. **Solution** The passenger validation logic has been enhanced to properly evaluate all passengers--both existing and newly imported--when determining lead passenger assignments. The system now: 1. **Retrieves complete role information**: When validating lead passengers during import operations, the system fetches channel role details for both incoming passengers and existing passengers on the itinerary 2. **Validates across all roles**: The lead passenger eligibility check now considers the occupant types of all passengers, ensuring existing valid leads are preserved 3. **Maintains data integrity**: The enhanced validation prevents incorrect lead reassignment when passengers with various channel roles are present **Impact** **For Operations Teams:** - Passenger imports will now correctly preserve existing lead passenger assignments - Lead passenger information will remain accurate when adding passengers to itineraries with multiple channel role types - Reduced need for manual correction of lead passenger assignments after bulk imports **For Sales and Customer Service:** - Customer communications will consistently reference the correct lead passenger - Improved data accuracy for itineraries with diverse passenger configurations (e.g., drivers, captains, adults) - More reliable lead passenger information for booking confirmations and correspondence **For System Administrators:** - Enhanced data quality for passenger records - Reduced support requests related to incorrect lead passenger assignments - Better handling of complex itinerary configurations with multiple role types **Technical Details** **Components Modified:** Passenger trigger logic, Lead passenger validation **Test Coverage:** Added comprehensive test case covering multi-role scenarios with existing and new passengers **Validation** The fix has been validated with scenarios including: - Itineraries with existing TBD passengers as leads - Import of passengers with different channel roles (Driver, Captain, etc.) - Multiple existing passengers with various occupant types - Verification that only one lead passenger exists per itinerary after import operations
Import Passengers fails if two passengers have the same Room Group Id (KT-14091)
Import Passengers fails if two passengers have the same Room Group Id The passenger import fix should update TBD passenger data assigned to the same Room ID within non-operational itineraries
Adjustments not working after changing occupancy (ST-2211)
Adjustments not working after changing occupancy Previously, after cancelling a passenger via Change Occupancy, searching for an adjustment would return results but leave the adjustment field disabled and clear the selected adjustment. This was caused by adjustment interactions being evaluated before user permissions were fully re-initialised. The adjustment UI now waits for permissions to be fully loaded and correctly reprocesses passenger adjustments, ensuring adjustments can be searched, selected, and applied as expected after occupancy changes.
It is not possible to select the same cabin while changing occupancy (ST-2678)
It is not possible to select the same cabin while changing occupancy Improved cabin selection behavior during **Change Occupancy** in Cruise Itineraries. Previously, when reducing the number of passengers and attempting to re-select the same cabin, the system could display a temporary hold error even though the cabin had been released and remained visible in the list. This update refines cabin availability validation by considering the current itinerary context, allowing users to successfully reselect the same cabin after occupancy changes and preventing false "cabin already held" errors.
Booking Overview for a lapsed itinerary is empty after cancelling a room (ST-2685)
Booking Overview for a lapsed itinerary is empty after cancelling a room The change correctly resolves the issue where passengers who were cancelled before an itinerary lapsed appeared without any associated items. Previously, once an itinerary lapsed, the query retrieved only items in **Inactive** mode. This excluded items already marked as **Cancellation**, causing cancelled passengers to lose visibility of their package items. By updating the query to include both **Inactive** and **Cancellation** modes, the system now retains items for cancelled passengers while continuing to display items that became inactive due to the lapse. This aligns with the expected behavior: lapsing an itinerary should not impact passengers who were already cancelled.
Cabins not visible in Modify mode (ST-2699)
Cabins not visible in Modify mode Fixed an issue where cabins were not visible in modify modes when all cabins from a given price category were reserved
Change occupancy (decrease) not working when inventory is at 0 (ST-2725)
Change occupancy (decrease) not working when inventory is at 0 Fixed an inventory availability error that occurred when reducing occupancy in low inventory scenarios by updating the Temporary Hold flow to correctly release unused inventory items.
Error trying to launch RightRez - for non AdminUser (ST-2734)
Error trying to launch RightRez - for non AdminUser Added permissions to update external credentials via Salesforce ConnectAPI to Kaptio Flights permission sets. It allows non-admin users to refresh Right Rez authorization token which caused the original error.
ALL promos fail due to this error most of the time - specifically Gift of Time, solo and child promotions. (ST-2743)
ALL promos fail due to this error most of the time - specifically Gift of Time, solo and child promotions. This is now handled by the API. It will now accept 15 char IDs for v3 of the prices bulk endpoint.
Getting Error On Bookings and Change Occupancy (ST-2747)
Getting Error On Bookings and Change Occupancy Fixes an issue where users could exceed available pre/post stay allotment when multiple rooms shared the same inventory contract, causing validation errors during Change Occupancy. Allotment usage is now correctly tracked across rooms using shared inventory keys, ensuring availability is accurately reduced regardless of which room makes the selection. Additionally, when allotment reaches zero, options now display AL(0) and are disabled instead of falling back to "On Request," while previously selected items remain selectable. This change prevents overbooking of shared inventory without affecting non-shared inventory behaviour.
Cancelled pax show no package items after lapsing the itinerary (ST-2782)
Cancelled pax show no package items after lapsing the itinerary The change correctly resolves the issue where passengers who were cancelled before an itinerary lapsed appeared without any associated items. Previously, once an itinerary lapsed, the query retrieved only items in **Inactive** mode. This excluded items already marked as **Cancellation**, causing cancelled passengers to lose visibility of their package items. By updating the query to include both **Inactive** and **Cancellation** modes, the system now retains items for cancelled passengers while continuing to display items that became inactive due to the lapse. This aligns with the expected behavior: lapsing an itinerary should not impact passengers who were already cancelled.
Temporary hold errors in some scenarios (ST-2786)
Temporary hold errors in some scenarios This release introduces support for propagating **Allotment Day inventory changes** within bulk inventory requests to ensure accurate inventory updates during temporary hold operations. A new `allotment_day_changes` structure has been added to `InventoryBulkRequest`, along with helper logic to map and include unit adjustments (booked, released, reserved, and available). Temporary hold create and change processes now pass these updates through when preparing inventory requests. This resolves an issue where Allotment Day values were not being updated correctly, which caused recurring temporary hold processing failures. Additional tests have been added to validate correct propagation and null-handling behaviour.
When passenger is selected and saved after Importing PNR, airfare is getting duplicated (ST-2801)
When passenger is selected and saved after Importing PNR, airfare is getting duplicated Enhancements have been made to the PNR import process to improve duplicate prevention, performance, and consistency. A new shared validation method now checks for existing active PNRs for the same itinerary and locator, ensuring duplicate records cannot be created. The PNR save operation has been extended to optionally skip duplicate checks when validation has already occurred within the same transaction, reducing unnecessary database queries and improving efficiency. Import flows have been refactored to use the centralised validation logic, error handling for duplicate imports is now consistent across entry points, and additional automated tests have been added to verify duplicate detection and validation behaviour.
The Options Allotment shows wrong value in Modify Package and Change Occupancy mode (ST-2811)
The Options Allotment shows wrong value in Modify Package and Change Occupancy mode This update improves inventory accuracy within the Booking Wizard by ensuring that only **new option selections that consume inventory** are deducted from availability. Previously, all matched passenger selections were counted, including those already booked or previously selected, which could lead to overstated inventory reductions. The enhancement now excludes selections linked to existing itinerary items and those already selected in the current session, resulting in more precise real-time inventory calculations for both per-person and per-unit options.
Booking migrates to Kaptio even when inventory is Sold Out in Kaptio (ST-2815)
Booking migrates to Kaptio even when inventory is Sold Out in Kaptio Fixed a migration issue where bookings were incorrectly booked in Kaptio even when the required inventory was sold out.
Modify package - Unable to remove pre and post if it is sold out (ST-2821)
Modify package - Unable to remove pre and post if it is sold out Updates have been made to allow the un-selection of previously selected Sold Out Price Category/options.
Pre Stay & Post Stay Tabs, cannot book On Request room when other has AL status with Shared Inventory Contracts (ST-2822)
Pre Stay & Post Stay Tabs, cannot book On Request room when other has AL status with Shared Inventory Contracts This was resolved as part of ST-2747, which addressed an issue where users could exceed the available pre- and post-stay allotment when multiple rooms were linked to the same inventory contract. This sometimes led to validation errors when changing occupancy.
Temp hold not working on low inventory scenarios (ST-2824)
Temp hold not working on low inventory scenarios We have enhanced how inventory updates are processed when creating or modifying Temporary Holds. The system now includes detailed day-level allotment adjustments as part of bulk inventory requests, ensuring that changes to booked, reserved, released, and available units are accurately reflected in real time. This improvement provides more consistent inventory availability, reduces the risk of discrepancies during hold updates, and improves overall reliability when managing package availability.
Package Search does not shows cabins as available during Change Occupancy (ST-2831)
Package Search does not shows cabins as available during Change Occupancy Resolved an issue where the last available cabins in a price category could not be re-selected during a Change Occupancy operation.
The Rooms expands in Passenger tab in Modify Package and Change Occupancy (ST-2835)
The Rooms expands in Passenger tab in Modify Package and Change Occupancy Added logic to preserve a rooms "toggled" state. For large bookings; if multiple rooms were toggled (closed) and a change was made to a pax/contact then all rooms would re-open. This no longer happens as toggled state is preserved during changes.
Booking Wizard_Pre/Post stay nights cannot be cleared once selected (ST-2847)
Booking Wizard_Pre/Post stay nights cannot be cleared once selected - **Booking Wizard** (`lwcBookingWizard`) now prevents step changes while temporary holds are in progress, improving user experience during concurrent updates. - **Pre/Post Stay** (`lwcBookingWizardPrePostStay`) ensures that the `isAllotment` flag is consistently treated as a Boolean, handling cases where it may be provided as a string (`'true'`/`'false'`). - **Temporary Hold** (`lwcTemporaryHold`) `removeItem` now safely handles optional parameters, avoiding errors when `uom` or `quantity` are not provided.
All the Options can be selected in Booking Wizard (ST-2850)
All the Options can be selected in Booking Wizard We've fixed an issue in Booking Wizard where multiple options could be selected at the same time in the **Options** tab and then saved to the itinerary. Options are now correctly restricted to a single selection, so choosing a new option will automatically deselect the previously selected one. This ensures bookings behave as expected and prevents unintended option combinations from being added to itineraries.
Loading modal - no buttons in case of error (ST-2858)
Loading modal - no buttons in case of error Improved error handling during splash modal initialization in **lwcProgressSplashModal**. If a step cannot be resolved and the process fails, the component now captures and records the failure with a clear error message, flags fatal errors where applicable, updates the continue button text appropriately, and emits a `stepfailed` event with failure details. This ensures initialization errors are surfaced consistently and improves visibility and control of early-stage failures in the progress flow.
Removing Post Stay gives "No Longer Available" Error (ST-2867)
Removing Post Stay gives "No Longer Available" Error The issue where the Allotment type Pre or Post option could not be deselected once the respective Allotment units are all used is fixed. The option can be deselected and selected again for the same or a different room.
Redirection in Console after Change Occupancy (ST-2868)
Redirection in Console after Change Occupancy Fixed redirection issue for Change Occupancy for Salesforce Console Apps
RightRez: Manual import is failing with 'Attempt to de-reference a null object' (ST-2886)
RightRez: Manual import is failing with 'Attempt to de-reference a null object' Added some additional guards to prevent Null Pointer Exception (NPE).
Pre/Post temp hold error in Modify Package mode low inventory (ST-2890)
Pre/Post temp hold error in Modify Package mode low inventory Improved stability and user experience when managing temporary holds in the Booking Wizard. A race condition was resolved by ensuring temporary hold items are properly awaited when added, preventing background API calls from overlapping and triggering "another call in progress" errors if users act quickly. Additionally, when removing items from an empty temporary hold on initial unselect, a short delay is now applied so the UI has time to render the spinner before processing completes. Error handling has also been enhanced to surface Apex errors more consistently.
Payments cannot be made for itineraries created with a specific package (ST-2907)
Payments cannot be made for itineraries created with a specific package Optimized code to fix the "Aggregate query has too many rows for direct assignment error" issue when payments are made.
When a pax is cancelled and the survivor does not change the room, cancellation fees are incorrect in Booking Overview (ST-2908)
When a pax is cancelled and the survivor does not change the room, cancellation fees are incorrect in Booking Overview Updated cancellation fee display for active passenger.
Passenger Import Enhancements for All Itinerary Types (KT-13982)
Enable Passenger Import outside of Operational Itineraries Passenger Grid ### Overview The Passenger Import feature has been significantly enhanced to support importing passengers into all itinerary types, not just operational itineraries. This release introduces smart matching logic for placeholder passengers (TBD travellers) and fixes critical date handling issues that occurred in certain timezones. *** ### New Features #### 1. Passenger Import Now Available for All Itinerary Types **Background** Previously, the passenger import feature was restricted to operational itineraries only. This limitation required workarounds when managing passenger data for price model and amendment itineraries. **Enhancement** The passenger import functionality is now available for all itinerary types, including: * Price Model itineraries * Amendment itineraries * Operational itineraries This expansion enables more flexible passenger management workflows across different stages of the booking lifecycle. **Business Benefits** * Streamlined data entry processes for non-operational itineraries * Reduced manual data entry errors * Consistent import experience across all itinerary types *** #### 2. Smart TBD Passenger Matching by Room Allocation **Background** When real passenger data arrives to replace TBD (To Be Determined) placeholder passengers in non-operational itineraries, the system previously had limited ways to match incoming data with the correct placeholder records. This could result in duplicate passenger records rather than properly updating existing placeholders. **Enhancement** A new intelligent matching system has been introduced that uses Room Allocation IDs to match incoming passenger data with TBD placeholders. The matching logic now follows this priority order: **Priority 1:** Salesforce Record ID (if provided) **Priority 2:** Room Allocation ID (for TBD passengers in non-operational itineraries only) **Priority 3:** Name + Date of Birth + Email combination **Priority 4:** Name + Date of Birth + Passport Number combination **How It Works** When importing passengers into non-operational itineraries: * Each TBD passenger with an assigned room allocation can be matched to incoming real passenger data using the Room Allocation ID * The TBD placeholder is updated with the real passenger information * Room assignments are preserved through the update process * No duplicate passenger records are created **Important Business Rules** * Room Allocation matching only applies to non-operational itineraries * Operational itineraries continue to use traditional matching logic * TBD passengers must have the Room Allocation ID field populated to participate in this matching **Business Benefits** * Eliminates duplicate passenger records when updating TBD placeholders * Preserves room allocation relationships automatically * Reduces post-import cleanup and data correction work * Maintains data integrity through the booking lifecycle *** #### 3. Context-Aware Options Step in Import Wizard **Background** The passenger import wizard previously displayed an "Options" step for all itinerary types, even when configuration options were not applicable or required. **Enhancement** The import wizard now intelligently skips the Options step for non-operational itineraries where passenger configuration options are not assigned. This creates a more streamlined import experience with fewer unnecessary steps. **User Experience** * Non-operational itineraries: 2-step wizard (Upload → Review → Confirm) * Operational itineraries: 3-step wizard (Upload → Review → Options → Confirm) **Business Benefits** * Faster import process for non-operational itineraries * Reduced user confusion by removing unnecessary steps * Improved workflow efficiency *** ### Bug Fixes #### 4. Date Import Timezone Issue Resolved **Problem** When importing Excel files containing date fields (such as Date of Birth or Passport Expiry), dates were being shifted by one day for users in timezones east of UTC (UTC+1 and higher). For example: * User enters: January 29, 2026 in Excel * System incorrectly saved: January 28, 2026 This occurred because the system was converting local dates to UTC before extracting the date component, causing day shifts in positive UTC offset timezones. **Solution** The date import logic has been corrected to preserve the exact date entered in the Excel file, regardless of the user's timezone. The system now uses local date components directly without UTC conversion. **Business Impact** * Dates now import exactly as entered in Excel files * No more date discrepancies for users in Asian, Australian, European (east), and other UTC+ timezones * Eliminates need for manual date corrections after import * Improves data accuracy and user trust in the import feature **Affected Fields** * Date of Birth * Passport Expiry Date * Any other date fields in the import file *** ### Technical Improvements #### 5. Enhanced TBD Passenger Lifecycle Management **Operational Itineraries** When passengers are imported into operational itineraries, TBD placeholders that were cloned from price models (identified by the presence of an Original ID) are automatically deleted after successful import. This prevents accumulation of obsolete placeholder records. **Non-Operational Itineraries** When passengers are imported into non-operational itineraries (price models, amendments), TBD placeholders are updated with real passenger data rather than deleted. This preserves the passenger record and all its relationships (room assignments, configuration assignments) while replacing placeholder information with actual passenger details. **Business Benefits** * Cleaner data management with automatic cleanup of obsolete placeholders * Preservation of important relationships when updating placeholders * Reduced need for manual data cleanup * Better data integrity across itinerary types *** #### 6. Improved Error Reporting **Enhancement** Error messages during passenger import now include more specific categorization to help identify the source of issues: * DML errors (database constraint violations) * Validation errors (business rule violations) * Field-level errors (mapping or data type issues) **Business Benefits** * Faster troubleshooting of import issues * More actionable error messages * Reduced time to resolution for failed imports *** ### Migration Notes #### For Existing Implementations This enhancement is backward compatible with existing passenger import workflows. No changes are required to existing integrations or processes. **Key Points:** * Existing operational itinerary imports continue to work exactly as before * REST API endpoints remain unchanged * Historical passenger data is not affected * Room allocation matching only activates when Room Allocation IDs are present #### Best Practices **For Non-Operational Itineraries:** * Ensure TBD placeholders have Room Allocation IDs assigned before import * Include the Room Allocation ID column in import files when replacing TBD passengers * Review the import preview carefully to confirm matching logic **For All Itinerary Types:** * Continue using Excel files formatted in the standard template * Verify date fields appear correctly in the import preview before confirming * Use the externalId field in API integrations for guaranteed record matching *** ### Change Summary **Release Date:** February 2026 **Components Affected:** * Passenger Import Service * Passenger Mass Import Modal (LWC) * Passenger Grid (Itinerary Builder) * REST API (backward compatible) **Files Changed:** * PassengerImportService.cls (enhanced matching logic) * lwcPassengerMassImportModal (UI workflow improvements) * lwcPassengerMassImportUpload (date handling fix) * Supporting test classes (comprehensive test coverage)