{% extends "base.html" %} {% block title %}Reconciliation — RWA Calculator{% endblock %} {# One table renderer reused by every tier. Integers print without decimals, other numbers to 2dp, everything else verbatim (blank for nulls). #} {% macro render_table(table) %}
{% for c in table.columns %}{% endfor %} {% for row in table.rows %} {% for c in table.columns %} {% set v = row[c] %} {% endfor %} {% endfor %}
{{ c }}
{% if v is integer %}{{ "{:,}".format(v) }}{% elif v is number %}{{ "{:,.2f}".format(v) }}{% else %}{{ v if v is not none else "" }}{% endif %}
{% endmacro %} {% block content %}

Parallel-run reconciliation

Run this calculator and reconcile its output against your legacy calculator, component by component (EAD, RWA, risk weight, PD, LGD, CCF, exposure class, …). Each row is bucketed as match / within-tolerance / break / missing, with our reason and input drivers attached so a break can be triaged to a data fix or an engine fix.

{% if error %}
Reconciliation failed: {{ error }}
{% endif %}

Declare the join key(s) and which legacy column maps to each canonical component. legacy_file resolves relative to the data path above; numeric components accept scale and unit = "percent", categoricals a value_map of synonyms.

{% if has_saved_run %}Reset to defaults{% endif %}
{% if result %} {% if result.warnings %}
{% for w in result.warnings %}
{{ w }}
{% endfor %}
{% endif %} {% if not result.success %}
No comparable components — check the mapping (legacy file path, join keys and column names).
{% else %}

1 · Headline — does it tie out?

{% for s in result.headline %}
{{ "{:,.0f}".format(s.our_total) }}
{{ s.component }} — ours
legacy {{ "{:,.0f}".format(s.legacy_total) }}{% if s.delta_pct is not none %} · Δ {{ "%+.2f"|format(s.delta_pct) }}%{% endif %}
{% endfor %}

Tie-out — legacy vs ours per component

{{ result.chart_tie_out | safe }}

Where the money differs — Σ|Δ| by component

{{ result.chart_abs_delta | safe }}

By component

{{ render_table(result.component_table) }}

2 · Segment — where do breaks concentrate?

{% if result.allocation_table.rows %}

Asset-class allocation — legacy vs ours (RWA)

{{ result.chart_allocation | safe }}

Asset-class allocation — EAD & RWA by risk class

Each side's exposures are totalled by risk class (a split exposure's portions each counted in their own class). Offsetting deltas show where the two engines allocate an exposure to different classes.

{{ render_table(result.allocation_table) }} {% endif %}

By bucket

{{ render_table(result.bucket_table) }}

By exposure class

{{ render_table(result.class_table) }}

By approach

{{ render_table(result.approach_table) }}

3 · Worklist — {{ result.break_count }} break(s), largest first

{{ render_table(result.breaks_table) }}

4 · Forensic — per-key detail

{% for b in result.bucket_choices %} {{ b }} {% endfor %}

Showing {{ result.forensic.shown }} of {{ result.forensic.total }} row(s). Download the full per-key detail (with explain & input columns): CSV · Excel.

{{ render_table(result.forensic) }} {% endif %} {% endif %} {% endblock %}