Hawaii - Major (22.22)
Release Summary
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.
Deployment Guide
See this page for the Hawaii Deployment guide.
New Features
Feature: Bulk Actions for Group
This release introduces the Bulk Manager for Operational Itineraries: a dedicated screen where you can search, filter, and run bulk actions on operational itineraries from one place.
What’s New
New bulk manager experience
-
A dedicated Bulk Manager for Operational Itineraries app page is available. Use it to work with operational itineraries without leaving the bulk manager workflow.
-
The page includes a search sidebar and an items table so you can find the right itineraries and act on them in bulk.
Search and filters
-
Search by tour departure date so you can narrow results to specific departure dates or ranges.
-
Filter by day of the week (e.g. Mondays, Fridays) to focus on itineraries that run on selected days.
-
Additional filters (e.g. location, service, supplier, group tour, primary account, inventory status, confirmation status, itinerary status, record type) let you build the exact set of itineraries you need.
-
Multi-select filters: choose multiple values in each filter (e.g. several locations or services at once).
-
Pre-filled filters from the URL: you can open the bulk manager with filters already set from a link (e.g. from a report or dashboard), so the list loads with the right context.
-
A Search button applies your filter choices and refreshes the results.
Layout and navigation
-
Hide sidebar: collapse the search panel to get more space for the items table, and show it again when you want to change filters.
-
Items table layout has been adjusted for clearer reading and more consistent alignment.
-
Day of the week filter is easier to use and read.
-
Table controls (e.g. expand/collapse, refresh) are available on the items table and work for both the standard and operational bulk manager where applicable.
-
Table styling (including colours) has been updated to align with the design and improve clarity.
Bulk actions
-
Actions (e.g. Replace listing with content, Recheck inventory, Recalculate, and others) are available from the bulk manager so you can run the right operation on the selected itineraries.
-
Re-check inventory behaviour has been updated. If you run it when price models are selected, the system shows a clear error message in the modal so you know why the action is not allowed and what to do instead.
-
Replace Service Options is available for operational itineraries:
-
Open the Replace Service Options modal from the bulk manager to change service options in bulk.
-
The modal shows the data needed to choose replacements (e.g. existing service, replacement service, price category, status).
-
A confirmation step asks you to confirm before saving; while the save is in progress, the confirmation buttons are disabled and a spinner is shown so you know the system is working.
-
After saving, the updated service options are reflected for the selected itineraries.
Operational items table
-
The Operational Bulk Manager Items Table shows the relevant operational itinerary items with improved height and layout so you can scan and select rows more easily.
-
You can expand and collapse sections and use the table controls to refresh or adjust the view as needed.
Summary for users
| What you can do | Benefit |
|---|---|
Open the dedicated Bulk Manager for Operational Itineraries page |
Work with operational itineraries in one focused place. |
Filter by tour departure date, day of week, and many other criteria |
Find exactly the itineraries you need. |
Use multi-select filters and URL-based defaults |
Save time and open the bulk manager with the right filters already set. |
Hide or show the search sidebar |
Use screen space the way you prefer. |
Run bulk actions (Replace, Recheck inventory, Recalculate, etc.) |
Update many itineraries in one go. |
Use Replace Service Options with confirmation and clear feedback |
Change service options in bulk with a clear, safe workflow. |
See a clear error when Re-check inventory is used with price models |
Understand why the action is blocked and what to change. |
Bulk Manager Items table for Operational Itineraries (KT-13973)
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)
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)
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)
Action Controls and Table Controls have been combined into a single line in Bulk Manager to improve space efficiency.
Feature: Package Levels
The Package Levels feature renames the existing "Cabin Levels" concept to "Package Levels", introduces record types for the Service Level object, adds a dedicated UI component for creating and managing Package Levels, and enforces mode-specific behavior in the Edit Package and Component Options modals. A post-install script ensures existing records are correctly assigned to the appropriate record type. This feature provides a clearer naming convention and structured separation between Service Levels and Package Levels.
Relabelling Cabin Levels + New Record Type + PDS Script (GTT-633)
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:
-
Label Rename
-
The picklist value label "Cabin Levels" is renamed to "Package Levels"
-
The API name remains unchanged to preserve backward compatibility
-
-
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
-
-
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
-
UI Improvements for Edit Package and Component Modals (GTT-634)
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:
-
Standard Mode
-
Service Level field is disabled in both Edit Package and Component Options modals
-
No values can be selected
-
-
Service Levels Mode
-
Service Level field is enabled in both modals
-
Only Service Level record type values appear (Package Levels are excluded)
-
-
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
-
Warnings When Service Level Mode Has Been Changed (GTT-635)
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
New Component for Package Levels Creation (GTT-636)
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:
-
Access Package Level Component
-
Navigate to the Components tab on a package with Service Level Mode = "Package Levels"
-
The Package Level component is visible
-
-
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
-
-
Junction Record Creation
-
When saving, a Package Service Level Assignment junction record is created linking the Package Level to the package
-
-
Edit and Delete
-
Users can edit existing package levels (name, sort order)
-
Users can delete package levels from the component
-
Feature: Rake Configuration Templates for Cabin Configuration Scheme
This feature introduces template-based Cabin Configuration Scheme (CCS) management for rake (train) configurations. It includes a new "Rake Configuration Template" record type for CCS, a LWC component for creating and editing templates, and a departure-specific CCS component that can inherit from templates. The CabinConfigurationScheme__c lookup on the Cabin__c object is made non-mandatory to support the new rake configuration model where cabins can be linked to multiple schemes via Cabin Set Assignments.
Change Lookup(CabinConfigurationScheme__c) to Non-Mandatory (GTT-641)
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 theCabin__cobject is now non-mandatory -
Supports the new pattern where Cabin-to-CCS linkage is managed through Cabin Set Assignments
Add New Record Type "Rake Configuration Template" for CCS
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
Component for CCS Template Creation/Edit (GTT-644)
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.
Step-by-Step Process:
-
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
-
-
Save Operations (Backend)
-
Creates/updates
CabinConfigurationScheme__crecord -
Manages
CabinConfigurationAssignment__candCabinSetAssignment__crecords -
Cabins are not linked directly to the CCS at the template level
-
Component for CCS Service Departure Creation/Edit (GTT-645)
Business Context: Users need to create departure-specific cabin configurations based on templates, with the ability to adjust cabin availability per departure.
Step-by-Step Process:
-
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
-
-
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
-
-
Save Operations (Backend)
-
Creates/updates CCS record with type "Cabin configuration"
-
Manages
CabinConfigurationAssignment__c,CabinSetAssignment__c,Cabin__c(linked to CCS),ServiceCabin__c, andServiceCabinSegmentAssignment__crecords
-
Feature: Passenger Import for all Itinerary Types
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)
Minor Changes
Feature: Booking Overview
Outline active Standalone Services for cancelled pax (ST-2703)
Printed over the active pills to the green color in the 'Canceled/Transferred Passengers' section
Outline active Standalone Services for cancelled pax (ST-2719)
Printed over the active pills to the green color in the 'Canceled/Transferred Passengers' section
Feature: Booking Wizard
Update Availability Pill in Booking Wizard Options based on Quantity Changes (ST-2706)
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)
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)
Added quantity control support to Booking Wizard for optional package services priced per unit.
Configurable Quantity Column in Booking Wizard Options (ST-2593)
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:
{
"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)
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)
Added Temporary Hold support for quantity controls related to optional package items
Display Quantity Column for Options in Change Modes (ST-2596)
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)
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)
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)
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.
Feature: Group Tour
Add the Tour duration field to the Tour Departure object (GTT-614)
Added the Tour duration field to the Tour Departure object
Auto populate Integration Code on configuration object (GTT-619)
Auto populate IntegrationCode__c field on configuration object
Improved Price Model Output cleanup and async job management (GTT-674)
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.
Exclude service lines with optional configs from the Price Model request (GTT-680)
Excluded service lines with optional configs from the Price Model Output calculation request
"Days" column in Itinerary Builder working relative to a tour reference date (GTT-681)
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).
Feature: Group Tour, Half Twin pricing
Add custom permission for Price Model Room Pricing feature (GTT-671)
Added custom permission “Allow editing Price Model Room pricing” for Price Model Room Pricing feature
Feature: Group Tour, Operational itinerary
Show optional configs on the Operational itinerary (GTT-652)
Added logic to display optional configurations from related Price Model on Operational Itinerary
Confirmed Quantity to Itinerary Items (GTT-654)
Added ConfirmedQty__c field to the Itinerary_Item__c object
New trigger points for Operational Itinerary re-evaluation (GTT-658)
Operational Itinerary now gets re-evaluated when cancelling passenger or changing itinerary item dates
Refactoring in operational re-evaluation functionality to prvent heap size error (GTT-663)
Reduced heap size usage during Operational Itineraries revaluation
Feature: Group Tour, Payments
Payment Schedule Processing Optimization (KT-14018)
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.
Feature: Inventory Management
Route Legs Inventory (KT-13790)
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. |
Feature: Package Search
Hide Bundles from Package Search (CEE-663)
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)
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
| This setting only affects the Create Itinerary button. The Add Options button behavior is not affected. Date validation (e.g., past dates) still applies. |
Create Option - Create itineraries with reserved inventory from Package Search (CEE-669)
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)
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.
Feature: Passenger Grid
Temporary Hold Callable API (ST-2774)
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 |
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 |
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: |
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 |
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)
Feature: Passenger import
Remove validation for passenger-configuration assignment from passenger grid flow (GTT-700)
Users are no longer required to select a specific Passenger Configuration option (Single, Twin, or Crew) in the Passenger Assignment modal.
Feature: Reinstate
Reinstate Button on Lapsed Booking is not able to be hidden/disabled (ST-2866)
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.
Feature: Right Rez
On Rightrez Callback when no segments are present reject update (ST-2794)
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.
Feature: Service Levels
Color Coding for Service Levels (CEE-662)
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.
Feature: Timetable
Timetable Enhancements (GTT-624)
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
Bulk Edit timetable function (GTT-661)
Added Bulk Edit timetable logic to have an opportunity for editing from Service Departure list view
Template Override update on Service Departure Ops Locations (GTT-668)
TemplateOverride__c flag is set to true if ServicDepartureOpsLocation__c is updated
Bug Fixes
'Create Itinerary' label shown instead of 'Add to Itinerary' (CEE-673)
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)
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.
Group Tour and Price Model modals ignore Default field values. (GTT-662)
Group Tour and Price Model modals support Default field values.
New Price Model form error after layout update (GTT-664)
Fixed bug with incorrect values for standard lookups on Price model and Group Tour modals
Service with "Standard" qty behavior cannot be splitted (GTT-675)
Fixed Standard quantity behavior lines splitting and merging
Service field is not pre-populated for Timetable modal window (GTT-677)
Service field is populated after some time model window in opened
Bulk Manager - From & To Dates for the itinerary items showing a day off (GTT-694)
Fixed bug with time zones on Bulk Manager table
Multiple clicks on Save create duplicate passenger assignments (GTT-704)
Fixed multiple clicks on Save via disabling buttons
Default Pricing Behavior for New Itinerary Items (KT-14016)
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)
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)
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:
-
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
-
Validates across all roles: The lead passenger eligibility check now considers the occupant types of all passengers, ensuring existing valid leads are preserved
-
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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 (
lwcBookingWizard) now prevents step changes while temporary holds are in progress, improving user experience during concurrent updates. -
Pre/Post Stay (
lwcBookingWizardPrePostStay) ensures that theisAllotmentflag is consistently treated as a Boolean, handling cases where it may be provided as a string ('true'/'false'). -
Temporary Hold (
lwcTemporaryHold)removeItemnow safely handles optional parameters, avoiding errors whenuomorquantityare not provided.
All the Options can be selected in Booking Wizard (ST-2850)
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)
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)
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)
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)
Added some additional guards to prevent Null Pointer Exception (NPE).
Pre/Post temp hold error in Modify Package mode low inventory (ST-2890)
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)
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)
Updated cancellation fee display for active passenger.