{% extends "controlpanel/base.html" %} {% load lucide %} {% block heading %}Billing{% endblock heading %} {% block subheading %}

What the platform charges its clubs.

{% endblock subheading %} {% block actions %} {% lucide "plus" size=16 %} New tier {% endblock actions %} {% block panel %}

{% lucide "layers" size=18 %} Tiers

{% comment %} Prices are dated, not edited. A rate change is a new row with a future active_from; every period already opened keeps the amount it was billed at, so raising the price cannot rewrite an invoice you have already sent. {% endcomment %}

A rate change is a new dated price. Periods already billed keep the amount they were issued at.

{% for tier in tiers %} {% empty %} {% endfor %}
Tier Clubs Prices
{{ tier.name }}
{% if not tier.is_active %}Retired{% endif %} {% if tier.description %}
{{ tier.description }}
{% endif %}
{{ tier.club_count }} {% for price in tier.prices.all %}
€{{ price.amount|floatformat:2 }} from {{ price.active_from|date:"j M Y" }} {% if price.active_from > today %}Scheduled{% endif %}
{% empty %} No price — cannot be billed {% endfor %}
{% lucide "euro" size=14 %} New price {% lucide "pencil" size=14 %} Edit
No tiers yet.

{% lucide "receipt-euro" size=18 %} Owed

{% for due in owing %} {% empty %} {% endfor %}
Club Period Owed Status
{{ due.club.name }}
{{ due.tier.name }}
{{ due.period_start|date:"j M Y" }} — {{ due.period_end|date:"j M Y" }}
Grace to {{ due.grace_until|date:"j M Y" }}
€{{ due.balance|floatformat:2 }} {% if due.grace_until < today %} {% lucide "triangle-alert" size=12 %} Overdue {% elif due.period_end < today %} {% lucide "hourglass" size=12 %} In grace {% else %} {{ due.get_status_display }} {% endif %} {% lucide "banknote" size=14 %} Record payment {% lucide "file-text" size=14 %} Invoice
Nothing outstanding.
{% endblock panel %}