Midterm Adjustments (MTA)¶
How to calculate premium adjustments when a customer changes their policy mid-term.
Scenario¶
Customer wants to add coverage mid-policy:
- Original Policy: Home Contents, £566.59 annual premium
- Policy Start: 2024-01-15
- MTA Date: 2024-06-20 (157 days into 365-day policy)
- Change: Adding accidental damage cover (£75 additional premium)
- MTA Fee: £15
Complete MTA Script¶
// Set MTA context
let MTADate = $ToDate("2024-06-20");
let MTALedgerHistory = Ledger; // Save original ledger
// Rebuild pricing matrix with new item
$SetCurrencyToPricingMatrix("GBP");
$SetCommissionRateToPricingMatrix(0.15);
$SetIptRateToPricingMatrix(0.12);
// Original items
$AddItemToPricingMatrix("Contents Cover", 450.00, 1.0);
$AddFactorToPricingMatrix("No Claims Discount", 0.90, true, 0);
// NEW: Accidental Damage Cover
$AddItemToPricingMatrix("Accidental Damage", 75.00, 1.0);
$SetFeeToPricingMatrix(25.00);
// Calculate MTA with pro-rata adjustment
$CalculateMTAPremium(15.00); // £15 MTA fee
// Access adjustment premium
let additionalCharge = AdditionalPremium;
$Log("Additional Premium Due: £" + $ToString(additionalCharge));
How MTA Calculation Works¶
1. Pro-Rata Factor Calculation¶
2. Full Year Premium Comparison¶
Original Annual Premium:
Contents Cover: £450.00
No Claims Discount (10%): × 0.90 = £405.00
Commission + IPT: £533.65
Fee: £32.94
Total: £566.59
New Annual Premium:
Contents Cover: £450.00
Accidental Damage: £75.00
No Claims Discount (10%): × 0.90 = £472.50
Commission + IPT: £622.07
Fee: £32.94
Total: £655.01
Annual Difference: £655.01 - £566.59 = £88.42
3. Pro-Rata Adjustment¶
Pro-rata additional premium: £88.42 × 0.5699 = £50.37
MTA Fee: £15.00
Total Additional Charge: £50.37 + £15.00 = £65.37
Step-by-Step MTA Process¶
Step 1: Save Original State¶
// Before making changes, preserve original ledger
let MTALedgerHistory = Ledger;
let OriginalPremium = PricingMatrix.Premium;
Step 2: Set MTA Date¶
// MTA effective date
let MTADate = $ToDate("2024-06-20");
// Validate MTA date
if (MTADate < Policy.InceptionDate || MTADate > Policy.ExpiryDate) {
$Referral("MTA date outside policy period");
}
Step 3: Rebuild Pricing Matrix¶
Reconstruct the entire pricing matrix with changes:
$SetCurrencyToPricingMatrix("GBP");
$SetCommissionRateToPricingMatrix(0.15);
$SetIptRateToPricingMatrix(0.12);
// Include ALL items (original + new)
$AddItemToPricingMatrix("Contents Cover", 450.00, 1.0);
$AddItemToPricingMatrix("Accidental Damage", 75.00, 1.0); // NEW
// Include ALL factors/discounts
$AddFactorToPricingMatrix("No Claims Discount", 0.90, true, 0);
$SetFeeToPricingMatrix(25.00);
Step 4: Calculate MTA Premium¶
$CalculateMTAPremium(15.00); // MTA admin fee
// Results populated automatically:
// - AdditionalPremium (environment variable)
// - AdjustmentDifferencePricingMatrix
// - Ledger (contains pro-rata entries)
Step 5: Present to Customer¶
let additionalCharge = AdditionalPremium;
let mtaResult = {
EffectiveDate: MTADate,
OriginalAnnualPremium: OriginalPremium,
NewAnnualPremium: PricingMatrix.Premium,
ProRataAdjustment: additionalCharge - 15.00, // Exclude fee
MTAFee: 15.00,
TotalAdditionalCharge: additionalCharge
};
$Log("MTA Summary", mtaResult);
Common MTA Scenarios¶
Adding Coverage¶
// Customer adds bicycle cover
let MTADate = $Today();
let MTALedgerHistory = Ledger;
// Rebuild matrix with addition
$SetCurrencyToPricingMatrix("GBP");
$SetCommissionRateToPricingMatrix(0.15);
$SetIptRateToPricingMatrix(0.12);
// Existing + new
$AddItemToPricingMatrix("Contents Cover", 450.00, 1.0);
$AddItemToPricingMatrix("Bicycle Cover", 60.00, 1.0); // NEW
$AddFactorToPricingMatrix("No Claims Discount", 0.90, true, 0);
$SetFeeToPricingMatrix(25.00);
$CalculateMTAPremium(15.00);
// Customer pays AdditionalPremium
Removing Coverage¶
// Customer removes legal expenses
let MTADate = $Today();
let MTALedgerHistory = Ledger;
// Rebuild WITHOUT removed item
$SetCurrencyToPricingMatrix("GBP");
$SetCommissionRateToPricingMatrix(0.15);
$SetIptRateToPricingMatrix(0.12);
$AddItemToPricingMatrix("Contents Cover", 450.00, 1.0);
// Legal Expenses REMOVED (was previously included)
$AddFactorToPricingMatrix("No Claims Discount", 0.90, true, 0);
$SetFeeToPricingMatrix(25.00);
$CalculateMTAPremium(15.00);
// AdditionalPremium may be negative (refund) or just the fee
// depending on pro-rata calculation
Increasing Sum Insured¶
// Customer increases contents value
let MTADate = $Today();
let MTALedgerHistory = Ledger;
// Increased premium for higher sum insured
let newBasePremium = 550.00; // Was 450.00
$SetCurrencyToPricingMatrix("GBP");
$SetCommissionRateToPricingMatrix(0.15);
$SetIptRateToPricingMatrix(0.12);
$AddItemToPricingMatrix("Contents Cover", newBasePremium, 1.0); // INCREASED
$AddFactorToPricingMatrix("No Claims Discount", 0.90, true, 0);
$SetFeeToPricingMatrix(25.00);
$CalculateMTAPremium(15.00);
let increase = AdditionalPremium;
MTA Validation¶
// Validate MTA changes before calculation
fn ValidateMTARequest(mtaDate, changes) {
// Date validation
if (mtaDate < Policy.InceptionDate) {
return { IsValid: false, Message: "MTA date before inception" };
}
if (mtaDate > Policy.ExpiryDate) {
return { IsValid: false, Message: "MTA date after expiry" };
}
// Cooling-off period check
let daysSinceInception = $DifferenceInDays(mtaDate, Policy.InceptionDate);
if (daysSinceInception <= 14) {
return {
IsValid: false,
Message: "Cannot MTA within cooling-off period - cancel and re-quote instead"
};
}
// Business rules validation
if (changes.RemovingAllCover) {
return { IsValid: false, Message: "Cannot remove all coverage - use cancellation" };
}
return { IsValid: true };
}
// Use validation
let validation = ValidateMTARequest(MTADate, proposedChanges);
if (!validation.IsValid) {
$Referral(validation.Message);
} else {
$CalculateMTAPremium(15.00);
}
Waiving MTA Premium¶
Some business rules may waive the premium change:
// Set waive flag before calculation
let MTAWaivePremium = true; // Environment variable
$CalculateMTAPremium(0.00); // Fee also waived
// Ledger will show "MTA Premium Waived" entry
// AdditionalPremium = 0
Complete MTA Workflow¶
// Complete MTA function
fn ProcessMTA(mtaDate, changes) {
// Save original state
let MTADate = mtaDate;
let MTALedgerHistory = Ledger;
let OriginalPremium = PricingMatrix.Premium;
// Validate
let validation = ValidateMTARequest(mtaDate, changes);
if (!validation.IsValid) {
return { Success: false, Message: validation.Message };
}
// Run product-specific MTA validation
let productValidation = $ValidateMTAChanges();
if (!productValidation.IsValid) {
return { Success: false, Message: productValidation.Message };
}
// Rebuild pricing matrix with changes
$SetCurrencyToPricingMatrix("GBP");
$SetCommissionRateToPricingMatrix(0.15);
$SetIptRateToPricingMatrix(0.12);
// Apply all items (original + modified + new)
for (let item in changes.Items) {
$AddItemToPricingMatrix(item.Name, item.Amount, item.Quantity);
}
// Apply factors
for (let factor in changes.Factors) {
$AddFactorToPricingMatrix(factor.Name, factor.Rate, factor.Accumulative, 0);
}
$SetFeeToPricingMatrix(25.00);
// Calculate
$CalculateMTAPremium(changes.MTAFee);
// Return result
return {
Success: true,
OriginalPremium: OriginalPremium,
NewPremium: PricingMatrix.Premium,
AdditionalCharge: AdditionalPremium,
Ledger: Ledger
};
}
// Execute MTA
let mtaResult = ProcessMTA($Today(), {
MTAFee: 15.00,
Items: [
{ Name: "Contents Cover", Amount: 450.00, Quantity: 1.0 },
{ Name: "Accidental Damage", Amount: 75.00, Quantity: 1.0 }
],
Factors: [
{ Name: "No Claims Discount", Rate: 0.90, Accumulative: true }
]
});
if (mtaResult.Success) {
$Log("MTA successful - additional charge: £" + $ToString(mtaResult.AdditionalCharge));
} else {
$Log("MTA failed: " + mtaResult.Message);
}
Next Steps¶
- Cancellation Scenarios - Handle policy cancellations
- Quote Calculation Functions - MTA function reference