{% extends "base.html" %} {% block title %}Utilities{% endblock %} {% block page_title %}Utilities{% endblock %} {% block extra_css %} .util-card { border-radius: 12px; border: 1px solid var(--border); background: var(--card-bg); padding: 16px 18px; height: 100%; } .util-chip { font-size: 10px; font-weight: 700; padding: 2px 7px; border-radius: 10px; text-transform: uppercase; letter-spacing: .05em; } .trend-up { color: #ef4444; } .trend-down { color: #10b981; } {% endblock %} {% block topbar_actions %} All Bills Providers New Bill {% endblock %} {% block content %}
This Month
{{ summary.this_month | currency }}
{% if summary.month_change_pct is not none %} {{ summary.month_change_pct | abs }}% vs last month {% endif %}
Monthly Average
{{ summary.avg_monthly | currency }}
Last 12 months
Year to Date
{{ summary.ytd | currency }}
Unpaid
{{ summary.unpaid_total | currency }}
{{ summary.unpaid_count }} bill{{ '' if summary.unpaid_count == 1 else 's' }}{% if summary.overdue_count %} · {{ summary.overdue_count }} overdue{% endif %}
{% if summary.upcoming %}
Bills Due
{% for b in summary.upcoming %} {% endfor %}
ProviderPeriodDueAmountAction
{{ b.period_label }} {{ b.due_date.strftime('%b %d') }} {% if b.status == 'overdue' %} {{ b.days_until_due | abs }}d late {% elif b.status == 'due_soon' %} in {{ b.days_until_due }}d {% endif %} {{ b.amount | currency }} Pay
{% endif %}
Utility Spend — Last 12 Months
{% if chart.datasets %}
{% else %}
No bills recorded yet.
{% endif %}
By Type — 12 Months
{% if type_totals %} {% set grand = type_totals | sum(attribute='total') %} {% for t in type_totals %}
{{ t.label }} {{ t.total | currency }}
{% endfor %} {% else %}
No data yet.
{% endif %}
Providers
Add Provider
{% if providers %}
{% for p in providers %} {% set s = summaries[p.id] %}
{{ p.name }}
{{ p.type_label }}{% if s.unpaid_count %} · {{ s.unpaid_count }} unpaid{% endif %}
{% if s.latest %}
Latest · {{ s.latest.period_start.strftime('%b %Y') }}
{{ s.latest.amount | currency }}
{% if s.amount_change_pct is not none %}
{{ s.amount_change_pct | abs }}%
vs prev period
{% endif %}
{% if s.latest.usage %}
Usage {{ '%.1f' | format(s.latest.usage | float) }} {{ s.latest.usage_unit or p.usage_unit }} {% if s.usage_change_pct is not none %} ({{ '+' if s.usage_change_pct > 0 else '' }}{{ s.usage_change_pct }}%) {% endif %}
{% endif %} {% if s.latest.rate_per_unit %}
Unit rate {{ current_user.currency_symbol }}{{ '%.4f' | format(s.latest.rate_per_unit) }} / {{ s.latest.usage_unit or p.usage_unit }}
{% endif %}
12-month total {{ s.total_12mo | currency }}
{% if s.latest.status != 'paid' %} Mark Latest Paid {% else %} Add Bill {% endif %} {% else %}
No bills yet
Add First Bill {% endif %}
{% endfor %}
{% else %}
No utility providers yet

Add your electricity, water, gas, and internet providers to track bills and usage.

Add First Provider
{% endif %} {% endblock %} {% block extra_js %} {% if chart.datasets %} {% endif %} {% endblock %}