Introduction to Corporate Travel Policies
For generic background on Corporate Travel Policies, refer to Corporate Travel Policies
With the greenfield Rubrics 2.0 review of Corporate Travel Policies, we sought external industry best-practice feedback, which validated:
-
- the design decision to treat Rubrics as a separate independent module to avoid schedules and Corporate Travel Policies becoming a spaghetti
- the importance of adding policy-group collections for key person insurance reasons
Small changes by admin in Rubrics will have large travel consequences, hence it is recommended that all configuration changes are trialed in the test environment before being applied in the production environment.
Rubrics is available to authorized users via the Portal.
For bookers, Rubrics:
- Is the facility which approves/declines booking requests according to Corporate Travel Policies
- Provides quota and penalty point lookups and reconciliation
- Bans and un-bans accounts
For admin, Rubrics:
- Configures data driven Corporate Travel Policies to apply Quotas and Sanctions
- Minimizes support phone calls
- Provides an audit trail of changes
Assumptions
- The purpose of Rubrics is to promote good traveler behavior and experience, leading to higher asset utilization for less cost and carbon, without onerous bureaucracy or un-fairness
- Transparency and predictability is a design goal
- Rubrics seeks to minimize the number of support calls to support staff
- As an example, too many no-shows will deny seats to other travelers and reduce asset utilization. Therefore staff will be banned for 21 days if they no-show repeatedly, however the idea is to make the booker responsible for their actions with some inconvenience, not to prevent essential family travel for groceries and school. As an alternative to banned staff who cannot book online needing to call support to make bookings, they can now also ask for a friend to use their excess quota to book online on their behalf.
- Stakeholders for Travel Policies include management, support staff, travelers and unions
Definitions
- A year is defined as 1/1 to 31/12 UTC
- A week is defined as Monday to Friday UTC
- using a standard week simplifies coding, debugging, and support calls
- A Segment denotes Active, Checked-in or No-show status transportation of a passenger or cargo on a Dated Operating Segment, including all legs and stopovers, which are listed under the same trip number on an itinerary
Corporate Travel Policies
- Corporate Travel Policies are agreed travel approval rules with associated quotas and penalties
- Without commercial fares to encourage good traveler behavior, Corporate Travel Policies seek to establish a balance that promotes good overall traveler experience and travel asset utilization e.g.,
- we might apply a penalty for a late reschedule, where the action denies another passenger that could have used that seat
- we might exclude late reschedules departing the same day because they don’t significantly reduce access to a seat
- complementing Rubrics, within Ops-Manager we might also apply fees for late rescheduling
- we might apply a penalty for a late reschedule, where the action denies another passenger that could have used that seat
- Corporate Travel Policies are also used to balance competing demands for seat inventory via Quotas e.g. Business versus family and community
- Travel-groups and Fare-categories are a related topic (analogous to commercial Revenue Management techniques), and are managed in Ops-Manager
- The primary input variables for Corporate Travel Policies approval are:
- source e.g., business/private
- trip reason e.g., local r&r
- passenger/travel-group type e.g., staff or community.
- staff location/office e.g., NLNG Bonny
- staff policy-group e.g., 212082797
- mode of transport e.g., Air
- fare-category e.g., NTS
- international y/n
- peak y/n
- The output variable for approved travel is passenger travel priority:
- through empirical experience of what works and what doesn’t in corporate travel, we do not employ the techniques of wait-listing or orphaning of bookings from trips, and bumping decisions in the event of overbooking are made by check-in staff using priority
- there are priority override exceptions in Global Policy Settings for International and Multi-Sector
- Individual Corporate Travel Policies can be archived to suspend them, and restored to activate them
Booking Approvals
- In general, the design goal for booking policy decline messages is to show meaningful information as early as possible with as few messages as possible e.g.,
- Banned bookers are informed at the start of the booking process, not the end
- If multiple rules are broken, they are all shown at the same time, rather than requiring multiple booking search requests to find all the booking variables that need fixed
- Any Rubrics message that appears in Bukit is prefixed with “Rubrics: ”. If the message in Bukit isn’t prefixed with “Rubrics: ”, then it’s an Ops-Manager/Bukit message e.g. it’s a schedule or fare-category related issue.
- Any Rubrics rule decline message in Bukit will include the rule number e.g. [11], which can be used to lookup the details of rule 11 e.g. to remove a pax-type that should be exempt from the rule
- Most Rubrics messages sent to Bukit can be customized e.g. if a decline message in Bukit is unclear, it can be updated using “Customize Messages”
- Bookings that will not have a rule applied because the policy engine was bypassed include:
- Admin/go-show bookings bypass rules
- TravelGroup bookings, where the booker may not have an account like in the case of Shell
- If a Bukit booking is made for a TravelGroup, the approval will use the TravelGroup as the PaxType for approval evaluation
Accounts
- Lookup accounts by Employee-id. To find an Employee-id, lookup travelers by name in Ops-Manager
- Important identifying variables are Employee-id, Location-id (office) and Policy-group-id
- Maintain account Ids in Ops-Manager
- Each account inherits allowed pax-types from its office, which can be overridden with extra pax-types in Accounts if required
- For example if I belong to Bonny-Staff, I may access approvals that relate to Spouse and Child
- Admin can uplift sanctions for a banned booker who has collected too many penalty points
- Sanctions arising from penalty points can be permanently disabled for an account e.g. VIPs never get banned
- An“Overview of banned users” button is available top right of Accounts screen
- Lift ban and notify by email automates what you normally do with the “Uplift” button in accounts
- The “Also load ban lifted” toggle shows booker accounts so you can clear out people who have had their ban lifted for Feb, but you want to re-queue them for the banning process with “Clear Dates”. Otherwise ban uplifted prevents the nightly banning process from looking at that account until the uplifted date. Clearing dates won’t notify an email.
- There is a screen to forecast who will be banned overnight if the banning job is enabled
Trip Reasons
- The list of trip-reasons held in Ops-Manager and Rubrics must match
- Trip-reasons may bypass penalty points e.g. Shutdown, Business, Medical bookings
- e.g. bypass penalties for Business, and in Accounts/Penalties Business events for the current month will disappear
PaxTypes/TravelGroups
- The list of pax-types held in Ops-Manager and Rubrics must match
- Bukit sources some lists of available paxtypes from Rubrics e.g. the Guest Types that bookers can add
- Age Group is used by Ops-Manager to identify infants
Quotas
- An outbound and a return segment are treated as separate.
- e.g. a return booking for 2 passengers counts as a quota of 4
- it is therefore necessary for Rubrics to be able to know whether a segment is outbound or return when calculating quota
- Departure date is used for calculating Quotas
- By default, all quota points are assigned to the booker
- See Policy-Group Collections for exceptions
- Quotas are created by admin in booking policies.
- Quotas are calculated per staff account and year, week, sector, peak and non-peak according to date of departure.
- When a quota is exceeded, further travel is declined for a booker until the next anniversary date provides new quota.
- Offsets can be applied by admin to a booker account.
- The Account Quota screen only shows quota rules which are setup in Booking Policies
- Clicking on the week for an account’s quota will show the related booking detail information at the bottom of the screen
Penalties
- By default, all penalty points are assigned to the booker
- Departure date is used for calculating Penalties
- Penalties are applied for late cancellations, reschedules and no-shows which deny travel to other passengers
- Penalty points are assigned according to event and time before departure as configured in Sanctions
- In Sanctions, the number of points to trigger a ban are specified, as well as the duration of the ban
- Once a booker account has been banned for too many penalty points, use the Accounts screen to un-ban the booker
- Upon request, an Azure app-setting can be enabled to run a job run at night to review whether a booker should be banned/un-banned
- emails get sent for ban/un-ban, including a link to Rubrics so bookers can reconcile why they were banned
- temporary no-shows during check-in will not lead to a ban, unless they are left in place overnight
- only 1 email is sent per ban event
- Rescheduling policies
- The primary purpose of rescheduling penalties is to avoid bookers repeatedly rescheduling a seat to a later departure date to avoid incurring a cancellation penalty, but with no intention of traveling.
- There is option to disable penalties when rescheduling a departure to a different time on the same day, on the basis that a same day reschedule doesn’t deny access to a seat for someone else, but does provide flexibility for late running or early finishing meetings.
- There is option in the future to uncheck/disable reschedule penalties where the date of departure is brought forward, on the basis that this action won’t significantly deny access to a seat for someone else
- The primary purpose of rescheduling penalties is to avoid bookers repeatedly rescheduling a seat to a later departure date to avoid incurring a cancellation penalty, but with no intention of traveling.
Sector Restrictions
- For the case where booking a short sector of a multi-sector segment will deny access to the longer sector, thereby reducing overall asset utilization and business outcomes, booking the short sector on its own can be declined up until shortly before departure.
- From a “Separation of Concerns” architectural perspective, “Sector Restrictions” fit into declining a booking request rather than providing a schedule
- The leased schedule routing engine is a high risk functional area, catering for multi-sector, multi-asset connections, integrations for dry-leased modes of transport, and dynamic departure control requirements. If the routing engine suffers a serious fault, the only fix is to rollback all data to the moment before the fault was introduced. While this risk is mitigated with CI/CD unit testing, prudence applies to the wisdom of making changes to the routing engine of a production system running large volumes of bookings, where a failure will cause catastrophic interruption to Logistics.
Policy Group Collections
- Each booker account has a policy-group-id, and collections can be used to identify a collection of booker accounts that are maintained in the ERP and synced to NLogistics overnight
- Collections can be used to Group GMs, so quota and penalty points will be assigned to the traveler (GM), not the booker (Secretary), over-riding default behavior
- A secretary booking on behalf of a GM is an example of a delegated booking, where the booker and the account responsible are not the same person
- In the future, Collections may be used to:
- identify General Managers who are allowed access to book Residential Areas 1 & 2
- prevent more than 1 key person traveling on the same trip
Debugging
- To debug a booking algorithm approval/decline:
- In Ops-Manager, check the booking audit trail to confirm the approval rule number that applied when the booking was approved. This can then be used to identify and correct policy configuration/setup problems e.g., archive an inadvertent conflicting policy.
- The Test deck provides a means to see what a booker will see when they try to get a booking approved. In Rubrics, test by impersonating a booker travel policy request, click on the user icon top right, then select “Test deck”.
Technical
- Architecturally in terms of schema, the cancel/reschedule/noshow etc events have no relation to policies
- e.g. event triggered penalty logic cannot be amended by policies
- Rubrics is a separate NLogistics module loosely coupled to OpsManager/Bukit by Azure ServiceBus booking events and an API call to approve/decline bookings
- Rubrics stores its own separate copy of all booking information/events
- Rubrics is analogous to the policy aspects of SAP Concur, and it’s foreseeable Concur could be used in place of Rubrics
- A collection of unit tests must be passed during the pipeline before future updates can be deployed, which will help to avoid faults when we make future changes
- All system settings are configurable within Azure app-settings e.g. whether the nightly banning process is enabled and at what time it runs
- Example data Bukit sends to Rubrics whenever there is a booking created, booking cancel, reschedule, booking split,booking checkin, booking confirm, booking noshow, sector/segment cancel event i.e. this information forms what Rubrics believes to be the present state of bookings per account at any given moment.
- {
“messageId”: “4d000000-ac10-0242-ffbd-08db062d9047”,
“messageType”: [
“urn:message:Corpfleet.Logistics.Shared.ServiceMessages:BookingCreatedMessage”
],
“message”: {
“id”: “7a72d6d6-cad9-421a-bb8b-a912a82e274c”,
“reference”: “05000473”,
“activityType”: “Private”,
“fare”: null,
“bookingDate”: “2023-02-03T21:28:16.6541505+00:00”,
“bookingType”: 0,
“fareCategory”: null,
“bookerGroup”: {
“id”: “0ce20791-793e-440d-9d8e-c177df0c4896”,
“name”: “Member of Staff Group”
},
“booker”: {
“id”: “545e6099-34e0-4057-aa3f-b82f80d26098”,
“name”: “Mr Neil Middleton”,
“relationship”: “Staff”,
“employeeId”: “00011114”,
“policyGroupId”: “212082797”,
“locationId”: “212082798”
},
“travelers”: [
{
“id”: “545e6099-34e0-4057-aa3f-b82f80d26098”,
“name”: “Mr Neil Middleton”,
“relationship”: “Staff”,
“subPassenger”: 0,
“employeeId”: “00011114”,
“policyGroupId”: “212082797”,
“locationId”: “212082798”
}
],
“outboundSegments”: [
{
“id”: “112ac1a5-99fc-4864-8035-b0950dcba427|0”,
“departureName”: “Bonny”,
“departureId”: “1a913d0c-5d8f-4374-9c0a-b758346c43df”,
“departureAt”: “2023-02-04T10:00:00+00:00”,
“arrivalName”: “Port Harcourt”,
“arrivalId”: “a8833d14-400b-4ad4-8e89-756c6510ab61”,
“arrivalAt”: “2023-02-04T11:30:00+00:00”,
“transportationType”: 1
}
],
“returnSegments”: [],
“isInternational”: false,
“state”: 20
},
“expirationTime”: null,
“sentTime”: “2023-02-03T21:28:16.6989757Z”,
“headers”: {},
“host”: {}
}
- {
- Example data that Bukit sends to Rubrics when asking to get a booking approved:
- {
“bookerId”: “00011114”,
“bookerTravelerGroup”: “Member of Staff Group”,
“bookerDetails”: {
“id”: “545e6099-34e0-4057-aa3f-b82f80d26098”,
“name”: “Mr Neil Middleton”,
“relationship”: “”,
“employeeId”: “00011114”,
“policyGroupId”: “212082797”,
“locationId”: “212082797”
},
“source”: “Private”,
“tripReason”: “Private”,
“international”: false,
“fareGroup”: “”,
“travelers”: [
{
“travelerguid”: “545e6099-34e0-4057-aa3f-b82f80d26098”,
“traveleremployeeid”: “00011114”,
“travelertypeid”: “6bee843b9d1e4462a55f3cbaab685fa4”
}
],
“itinerary”: {
“outbound”: {
“segments”: [
{
“transportationMode”: “Boat”,
“departureDate”: “2023-02-04T07:00:00”,
“isPeakPeriod”: true,
“details”: {
“id”: “Domain.Schedules.Schedule|0”,
“departureName”: “Bonny”,
“departureId”: “1a913d0c-5d8f-4374-9c0a-b758346c43df”,
“departureAt”: “2023-02-04T06:00:00Z”,
“arrivalName”: “Port Harcourt”,
“arrivalId”: “a8833d14-400b-4ad4-8e89-756c6510ab61”,
“arrivalAt”: “2023-02-04T07:30:00Z”,
“transportationType”: 1
}
}
],
“passengerTypeIds”: [
“6bee843b9d1e4462a55f3cbaab685fa4”
],
“rescheduling”: false
},
“return”: {
“segments”: [],
“passengerTypeIds”: [
“6bee843b9d1e4462a55f3cbaab685fa4”
],
“rescheduling”: false
}
}
}
- {
Quality Assurance Notes
Tests | Notes | Status |
Bonny->phc 1 way private/staff booked and cancelled | Penalty appeared 5000324 | Pass |
Bonny->phc 1 way private/staff booked and cancelled and reactivated and confirmed and Noshow | Penalty | Pass |
Bonny->phc 1 way private/guest booked | Quota | Pass |
Bonny->phc return private/staff booked split and cancelled | Split/cancelled 427 within 48hours, which appeared as penalty | Pass |
NTS | 330 Noshow doesn’t appear 330 cancelled doesn’t appear |
Pass |
2 x 2 = 4 private/guests return | Pass | |
1 way Peak rule |
Peak, less than 1 day before departure
|
Pass |
Return peak check less than 1 day | Pass | |
Weekly quota 1 pax return | Quota is 2 | Pass |
Cancelled booking quota disappeared | Pass | |
Reschedule | 335 shifted to week 52 from week 51 | Pass |
Multi-sector for return trip | Pass | |
Cancelled > 48 hours no penalty | Pass | |
2 passengers split in Opsmanager | Pass | |
Spouse booking on behalf | Pass | |
Secretary for gm | Pass | |
Friend for booker | Pass | |
Wife for daughter | Pass | |
Cancel segment e.g., multi-sector back to single? | Pass | |
Opsmanager cancel pax | Pass | |
Check noshow booking that is activated, penalty disappears and banning reversed | Pass | |
Infants | Pass | |
Multisector boat/air
|
Pass | |
Family visitor | Pass | |
Collection – Assign booking quota and penalties to traveller id | Pass | |
Community booking with no employeeid | Pass | |
LocalR&R/air approved, and Private/air declined | Pass | |
Delegated family visitor booking 11111 | Pass | |
If a return booking on 31/1 and 1/2, jan departing quota in jan and feb departing quota in feb | Pass | |
Neverban enable/disable | Pass | |
Ban/uplift email | Pass | |
Split pax private/guest | Pass | |
Cancel in 1 day shows penalty but not quota | Pass | |
If a ban is lifted for month, shouldn’t reban when batch job runs again | Pass | |
Can’t make bookings if banned | Pass | |
Can’t reschedule private/boat default farecategory onto private/air | Pass | |
Reschedules for same day departures don’t incur penalties | Pass | |
Bonny <> PHC Air > 24 hours not available | Pass | |
Bookings for TripReasons with disabled penalties don’t incur penalties | Pass |