{% 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 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?

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 %}