MediaWiki:Gadget-wix-interactive.js: Difference between revisions
Content deleted Content added
No edit summary |
No edit summary |
||
Line 3,791:
/* ================================================================
GM vs PAA / VFA STEPPER — data-wix-module="gm-paa"
Side-by-side step-through
to
(same/modified). Falls back to PAA defaults when no config is
present.
================================================================ */
function initGmPaa( container ) {
/* ── Read config (or use PAA defaults) ───────────────────── */
var raw = container.getAttribute( 'data-wix-config' );
var cfg;
try { cfg = raw ? JSON.parse( raw ) : {}; } catch ( e ) { cfg = {}; }
var mode = cfg.mode || 'paa'; // 'paa' | 'vfa'
/* ── Default PAA steps ───────────────────────────────────── */
var PAA_STEPS = [
{ label: 'Collect premiums and deduct acquisition costs', type: 'same',
explain: 'Both paths start identically. The insurer collects premiums from the German motor group and deducts acquisition costs paid.' },
{ label: 'Project all future cash flows for remaining coverage',
explain: 'The General Model requires probability-weighted projections of every future cash flow. The PAA skips this \u2014 the premium itself serves as the proxy for expected service.' },
{ label: 'Discount projected cash flows to present value',
explain: 'Because the PAA doesn\u2019t project future cash flows for remaining coverage, there is nothing to discount. For a one-year contract the time-value difference is immaterial.' },
{ label: 'Calculate a risk adjustment on remaining coverage',
explain: 'The General Model quantifies compensation for bearing uncertainty about future cash flows. The PAA does not require this on the Liability for Remaining Coverage \u2014 another layer of actuarial judgment avoided.' },
{ label: 'Derive and track a Contractual Service Margin (CSM)',
explain: 'The heart of the simplification. The General Model calculates the CSM as the residual between fulfilment cash flows and premiums, then tracks it over time. The PAA has no CSM \u2014 the premium-based liability replaces the entire mechanism.' },
{ label: 'Release the CSM via coverage units each quarter',
explain: 'Under the General Model the insurer defines coverage units and allocates the CSM to determine revenue. Under the PAA, proportional time passage does the same job \u2014 each quarter, one quarter of the liability is released as insurance revenue.' },
{ label: 'Release remaining coverage as insurance revenue over time',
explain: 'Both approaches recognise insurance revenue as coverage is delivered. The PAA simply releases the premium-based liability proportionally over the coverage period \u2014 same result, far fewer calculations.' },
{ label: 'When a claim occurs, measure the Liability for Incurred Claims using fulfilment cash flows',
explain: 'Once a claim event happens, both paths converge. The insurer estimates the present value of future payments using probability-weighted cash flows. The PAA simplifies the \u201Cpromise outstanding\u201D side, not the \u201Cclaims already happened\u201D side.' },
{ label: 'Discount the Liability for Incurred Claims to present value',
explain: 'Both the General Model and PAA require discounting on incurred claims. The simplification only applies to the Liability for Remaining Coverage.' },
{ label: 'Add a risk adjustment to the Liability for Incurred Claims',
explain: 'The PAA removes the risk adjustment only on the remaining coverage side. For incurred claims, the insurer still quantifies uncertainty. Both models are identical here.' },
{ label: 'Apply the onerous contract test \u2014 recognise any loss immediately',
explain: 'If the group is expected to generate a loss, both approaches require immediate recognition. The PAA is a simplification, not an escape from prudent accounting.' },
{ label: 'Follow IFRS 17 grouping rules (portfolios, profitability groups, annual cohorts)',
explain: 'Grouping requirements are unchanged. Portfolios, profitability groups, and annual cohorts apply in exactly the same way under the PAA as under the General Model.' }
];
/* ── Default VFA steps ───────────────────────────────────── */
var VFA_STEPS = [
{ label: 'Calculate fulfilment cash flows at initial recognition', type: 'same',
explain: 'Both approaches start identically. The insurer projects probability-weighted future cash flows for the Belgian with-profits portfolio, including policyholder benefits, expenses, and premiums.' },
{ label: 'Discount cash flows to present value', type: 'same',
explain: 'Both approaches discount projected cash flows. For direct participating contracts the cash flows depend on the underlying items, but the discounting mechanics are the same at inception.' },
{ label: 'Add a risk adjustment for non-financial risk', type: 'same',
explain: 'Both approaches require the insurer to quantify the compensation it demands for bearing non-financial uncertainty (e.g. mortality, lapse risk). Identical treatment.' },
{ label: 'Derive the Contractual Service Margin (CSM) as the residual', type: 'same',
explain: 'Both approaches derive the CSM the same way at inception: premiums minus fulfilment cash flows. The CSM represents unearned profit to be released over the coverage period.' },
{ label: 'When non-financial assumptions change for future service \u2192 adjust the CSM', type: 'same',
explain: 'Both approaches route changes in non-financial estimates (e.g. revised mortality or lapse expectations) relating to future service through the CSM. No difference here.' },
{ label: 'When non-financial assumptions change for current or past service \u2192 recognise in profit or loss', type: 'same',
explain: 'Experience adjustments and changes relating to current or past service go straight to profit or loss under both approaches. The VFA does not change this rule.' },
{ label: 'When value of underlying items rises \u2192 insurer\u2019s share (\u20AC2.5M on a \u20AC25M gain) goes to income statement or OCI', type: 'modified',
explain: 'This is where the VFA diverges. Equity markets rise, the \u20AC500M pool gains \u20AC25M. Policyholders receive 90% (\u20AC22.5M). Under the General Model, the insurer\u2019s 10% share (\u20AC2.5M) flows to the income statement or OCI \u2014 creating immediate profit. Under the VFA, that \u20AC2.5M adjusts the CSM upward instead, to be released as insurance revenue over future periods. This reflects the economics of a variable fee.' },
{ label: 'When value of underlying items falls \u2192 insurer\u2019s share (\u20AC3M on a \u20AC30M drop) goes to income statement or OCI', type: 'modified',
explain: 'The same logic applies in reverse. Markets fall, the pool drops \u20AC30M. Policyholders absorb \u20AC27M (90%). Under the General Model, the insurer\u2019s \u20AC3M loss hits the income statement immediately \u2014 creating visible volatility even though the long-term fee structure is unchanged. Under the VFA, the \u20AC3M reduces the CSM instead. As long as the CSM remains positive, the insurer simply recognises less profit in future periods.' },
{ label: 'When discount rates or other financial assumptions change \u2192 adjust income statement or OCI', type: 'modified',
explain: 'Another key modification. Under the General Model, changes in financial assumptions (like discount rates) flow to the income statement or OCI. Under the VFA, the insurer\u2019s share of these changes is routed through the CSM as well \u2014 preventing artificial volatility that doesn\u2019t reflect the fee-based economics.' },
{ label: 'Release the CSM as insurance revenue over the coverage period', type: 'same',
explain: 'Both approaches release the CSM as insurance revenue over time using coverage units. The difference is that under the VFA, the CSM absorbs more movements (financial changes), so the revenue pattern is smoother and more reflective of the insurer\u2019s true variable fee.' },
{ label: 'Apply the onerous contract test \u2014 recognise any loss immediately', type: 'same',
explain: 'If the CSM is exhausted and the group becomes loss-making, both approaches require immediate loss recognition in profit or loss. The VFA does not shield the insurer from genuine losses.' }
];
/* ── Resolve config ──────────────────────────────────────── */
var STEPS = cfg.steps || ( mode === 'vfa' ? VFA_STEPS : PAA_STEPS );
var title = cfg.title || ( mode === 'vfa' ? 'General Model vs VFA \u2014 Side by Side' : 'General Model vs PAA \u2014 Side by Side' );
var scenario = cfg.scenario || ( mode === 'vfa'
? '<strong>Scenario:</strong> A with-profits savings portfolio in Belgium. Underlying items worth \u20AC500M. Policyholders receive 90% of returns; AXA retains 10% as a variable fee for managing assets and bearing insurance risk.'
: '<strong>Scenario:</strong> A group of one-year motor insurance contracts in Germany, measured under both approaches.' );
var colLabel = cfg.colLabel || ( mode === 'vfa' ? 'VFA' : 'PAA (shortcut)' );
var footnote = cfg.footnote || ( mode === 'vfa'
? 'The VFA modifies how financial changes are treated \u2014 everything else stays the same as the General Model.'
: 'The PAA simplifies the Liability for Remaining Coverage side \u2014 not the Liability for Incurred Claims side.' );
/* Labels for PAA mode counters vs VFA mode counters */
var isPaa = mode !== 'vfa';
var lbl1 = isPaa ? 'Steps kept' : 'Steps identical';
var lbl2 = isPaa ? 'Steps skipped' : 'Steps modified by VFA';
/* VFA class on container for colour override */
if ( mode === 'vfa' ) container.className += ' wix-gp--vfa';
/* ── State ───────────────────────────────────────────────── */
Line 3,839 ⟶ 3,895:
container.appendChild( wrapper );
wrapper.appendChild( wix.el( 'div', { className: 'wix-sim-title', textContent: title } ) );
wrapper.appendChild( wix.el( 'div', { className: 'wix-
/* Table */
Line 3,849 ⟶ 3,902:
wix.el( 'span', { className: 'wix-gp-th', textContent: 'Step' } ),
wix.el( 'span', { className: 'wix-gp-th wix-gp-th--gm', textContent: 'General Model' } ),
wix.el( 'span', { className: 'wix-gp-th wix-gp-th--
] );
var rowEls = [];
var gmMarks = [];
var
STEPS.forEach( function ( s, i ) {
var gm = wix.el( 'div', { className: 'wix-gp-mark' } );
var
gmMarks.push( gm );
wix.el( 'div', { className: 'wix-gp-row-label' }, [
wix.el( 'span', { className: 'wix-gp-num', textContent: String( i + 1 ) } ),
Line 3,868 ⟶ 3,921:
] ),
gm,
] ) );
} );
/* Explanation box */
Line 3,881 ⟶ 3,932:
wrapper.appendChild( wix.el( 'div', { className: 'wix-gp-explain' }, [ eStep, eBody ] ) );
/* Counters (2 boxes — no "effort saved" for VFA mode) */
var
var
var ctPct
var counterChildren = [
wix.el( 'div', { className: 'wix-gp-cbox' }, [
wix.el( 'div', { className: 'wix-gp-cbox' }, [
];
if ( ctPct ) counterChildren.push(
wix.el( 'div', { className: 'wix-gp-cbox' }, [ ctPct, wix.el( 'div', { className: 'wix-gp-cbox-lbl', textContent: 'Effort saved' } ) ] )
);
wrapper.appendChild( wix.el( 'div', { className: 'wix-gp-counters' }, counterChildren ) );
/* Controls */
Line 3,896 ⟶ 3,950:
var btnNext = wix.el( 'button', { className: 'wix-btn', textContent: 'Next \u2192' } );
wrapper.appendChild( wix.el( 'div', { className: 'wix-gp-controls' }, [ btnReset, btnNext ] ) );
wrapper.appendChild( wix.el( 'p', { className: 'wix-gp-footnote', textContent: footnote } ) );
/* ── Update ──────────────────────────────────────────────── */
function update() {
var
STEPS.forEach( function ( s, i ) {
var
if ( i <= current ) {
gmMarks[i].className = 'wix-gp-mark wix-gp-mark--yes';
gmMarks[i].textContent = '\u2714';
altMarks[i].textContent = '\u2714';
a++;
} else if ( s.type === 'modified' ) {
altMarks[i].className = 'wix-gp-mark wix-gp-mark--mod';
altMarks[i].textContent = '\u2260 CSM';
b++;
} else {
altMarks[i].className = 'wix-gp-mark wix-gp-mark--no';
altMarks[i].textContent = '\u2718';
b++;
}
} else {
gmMarks[i].className = 'wix-gp-mark';
gmMarks[i].textContent = '';
}
} );
Line 3,926 ⟶ 3,989:
if ( current >= 0 ) {
var s = STEPS[current];
var tag;
if ( isPaa ) tag = ( s.
else tag = ( s.type === 'modified' ? 'Modified by VFA' : 'Identical' );
eStep.textContent = 'Step ' + ( current + 1 ) + ' of ' + STEPS.length + ' \u00B7 ' + tag;
eBody.innerHTML = s.explain;
} else {
eStep.textContent = '';
Line 3,935 ⟶ 4,000:
/* Counters */
var total = a + b;
ctPct.textContent = total > 0 ? Math.round( b / STEPS.length * 100 ) + '%' : '\u2014';
}
/* Button */
| |||