Skip to main content

[!WARNING] Unverified Interpretation - This mapping was extracted via Code Archaeology and requires USER validation.

Mapping: OrderFeeLineLifecycle

This document provides the technical mapping between Gherkin scenarios in OrderFeeLineLifecycle.feature and the legacy codebase.


Source Files​

FileLinesPurpose
OrderFeeComponentService.cs1852Main service containing fee CRUD and lifecycle logic
OrderFeeBusinessRule.cs21Placeholder for business rules (currently empty)

Business Rule Mappings​

BR-OMGT-010: Group Medical Insurance Propagation​

  • Scenario: Add medical insurance supplement to a Group Order
  • Code Location: AddFeeToOrder L573-610
  • Pseudocode:
IF (fee is TravelInsuranceSupplement OR TravelInsuranceDiscount)
AND order.IsGroup
AND order.GetGroupOMGT().IsMedicalInsuranceProcessSameForAll
THEN
FOR EACH order IN group.GetAllOrders()
IF NOT order.ExcludeAccounting
AddFeeToOrderGo(fee, order)
ELSE
HandleAddMedicalInsuranceFeeOMGT(order) // Only update process

BR-OMGT-011: Cancel Insurance Percentage Calculation​

  • Scenario: Proposed fee triggers linked Cancel Insurance calculation
  • Code Location: AddProposedFeeToOrder L508-532
  • Pseudocode:
IF fee.TypeOfFee has ProposalCancelInsuranceFeeOMGTId
AND country.HasCancelInsurance()
AND country.IsCancelInsCalculationInPercentage(programId)
THEN
cancelInsRate = country.CalculateCancelInsRate(programId, fee.EndUserPrice)
CREATE new OrderAddFeeDTO:
Amount = fee.EndUserPrice * cancelInsRate / 100
FeeId = cancelId
CancellationOfOrderFeeLineId = fee.Id

BR-OMGT-012: Deferred Discount Invoicing​

  • Scenario: Discount invoicing is deferred when Acceptance Invoice not yet requested
  • Code Location: HandleAccounting L897-913
  • Pseudocode:
IF office.IsInvoicingActive AND NOT doNotInvoice
IF order.AcceptanceInvoiceRequestedOn.HasValue
OR fee.type != Discount
OR forceInvoicing
THEN
invoiceRequestHandler.RequestFeeInvoicingAsync(fee)
ELSE
fee.ToInvoice = TRUE
RAISE DISCOUNT_ADDED_BUT_NOT_INVOICED

BR-OMGT-013: Travel Insurance Type Change on Supplement​

  • Scenario: Validating Travel Insurance supplement changes insurance type
  • Code Location: HandleAddMedicalInsuranceFeeOMGT L1006-1056
  • Pseudocode:
IF fee.IsTravelInsuranceSupplement AND fee.Status == VALIDATED
FOR EACH travelInsurance IN order.TravelInsuranceRequests
CASE travelInsurance.Type OF
N/A, PARTICIPANT:
SET Type = WEP
PARTNER (INBOUND):
REPLACE with WEP
PARTNER (OUTBOUND):
CREATE new WEP request
WEP (if booked):
SET Status = TO_EXTEND

BR-OMGT-014: Status Change Email Notifications​

  • Scenario: Status change with email notification
  • Code Location: ChangeStatus(int id, ...) L742-776
  • Pseudocode:
IF sendEmails == TRUE AND status change SUCCESS
SEND email template: NOTIFY_PAX_PROPOSAL_ACCEPTED_BY_PAX
SEND email template: NOTIFY_STAFF_PROPOSAL_ACCEPTED_BY_PAX

BR-OMGT-015: Delete Fee Group Propagation​

  • Scenario: Delete travel insurance fee propagates to group
  • Code Location: DeleteFee L1245-1300
  • Pseudocode:
IF fee.IsTravelInsurance()
AND order.IsGroup
AND group.IsMedicalInsuranceProcessSameForAll
THEN
FOR EACH order IN group.GetAllOrders()
IF NOT order.ExcludeAccounting
DeleteFeeGo(order, matchingFee)

BR-OMGT-016: Travel Insurance Extension Availability​

  • Scenario: Travel insurance extension only available when insurance is booked
  • Code Location: GetAvailableSupplement L1823-1836
  • Pseudocode:
IF travelInsurance.Type IN (WEP, PARTNER_BUT_WEP) AND NOT BookedOn.HasValue
EXCLUDE: FEE_MEDICAL_INS_BASIC_EXTENSION, FEE_MEDICAL_INS_EXTENDED_EXTENSION

IF travelInsurance.Type IN (WEP, PARTNER_BUT_WEP) AND BookedOn.HasValue
EXCLUDE: FEE_MEDICAL_INS_BASIC, FEE_MEDICAL_INS_EXTENDED

BR-OMGT-017: Order Price Recalculation After Fee Change​

  • Scenario: Any fee modification triggers order price recalculation
  • Code Location: AddNewOrderFeeLine L1169-1174, DeleteFeeGo L1310-1313
  • Pseudocode:
AFTER fee add/edit/delete:
FOR EACH orderHeader IN order.GetOrderHeaders()
orderHeader.HandleChangePricing(false)
THEN
order.HandleChangeInAccounting()

State Transition Matrix​

Current Status→ VALIDATED→ CANCELED→ PROPOSITION_CANCELED
PROPOSED✅ Billing + Accounting❌✅ Log only
VALIDATED❌✅ Accounting Cancel❌
PROPOSITION_CANCELED❌❌❌
PROPOSITION_OUT_OF_DATE❌❌❌

Open Questions​

  1. Cascade Validation: When validating a CancelInsurance child, should we ALWAYS cascade to parent, or only if parent is still PROPOSED?
  2. ExcludeAccounting Orders: What is the exact scenario where an order in a group has ExcludeAccounting = TRUE?
  3. ForceInvoicing: Under what circumstances should forceInvoicing be TRUE? Only status changes?