{% if not violations %}
No violations match these filters.
{% else %} {# Build the lag-sort URL preserving current filters #} {% set lag_qs = [] %} {% if filter_ticker %}{% set _ = lag_qs.append('ticker=' ~ filter_ticker) %}{% endif %} {% if filter_account %}{% set _ = lag_qs.append('account=' ~ filter_account) %}{% endif %} {% if filter_year %}{% set _ = lag_qs.append('year=' ~ filter_year) %}{% endif %} {% if filter_confidence %}{% set _ = lag_qs.append('confidence=' ~ filter_confidence) %}{% endif %} {% set _ = lag_qs.append('sort=lag') %} {% set _ = lag_qs.append('order=' ~ next_lag_order) %} {% set lag_url = '/wash-sales?' ~ lag_qs|join('&') %}
{% for g in groups %}
{% for v in g.violations %} {% set lag = lag_days(v) %} {% set src = source_label(v) %} {% endfor %}
Loss date Loss → Buy Trigger date Lag {% if sort == 'lag' %}{{ '▼' if order == 'desc' else '▲' }}{% endif %} Disallowed Matched qty Confidence Source
{{ v.loss_sale_date or "—" }} {{ v.loss_account or "—" }} → {{ v.buy_account or "—" }} {{ v.triggering_buy_date or "—" }} {% if lag is not none %}{{ lag }}d{% else %}—{% endif %} ${{ "%.2f"|format(v.disallowed_loss) }} {{ v.matched_quantity }} {{ v.confidence }} {% if src == "Schwab" %} {{ src }} {% elif src == "Cross-account" %} {{ src }} {% else %} {{ src }} {% endif %}
{% endfor %}
{% endif %}