{% extends "base.html" %} {% block title %}Dashboard — BILLS{% endblock %} {% block main_class %}container container--wide{% endblock %} {% block content %}
€ {{ '%.0f'|format(total_out_paid) }}
€ {{ '%.0f'|format(total_out_unpaid) }} unpaid
Total Out (€)
€ {{ '%.0f'|format(total_in_paid) }}
€ {{ '%.0f'|format(total_in_unpaid) }} unpaid
Total In (€)
€ {{ '%.0f'|format(balance_realised) }}
€ {{ '%.0f'|format(balance_projected) }} projected
Balance (€)
{{ overdue_count }}
Invoices Overdue
{{ unvalidated_count }}
Needs Review
{{ missing_pdf_count or 0 }}
Missing Invoice
{% if overdue_only %}
⏰ Overdue only ×
{% endif %} {% if aging_bucket != '' %}
🕒 Aging bucket {{ aging_bucket }} ×
{% endif %}

Aging — Unpaid invoices by days overdue

Receivables: — · Payables: —

Payment delay — average days, last 12 months

Clients (paying us) Suppliers (we pay) Reference term
Clients avg: — · Suppliers avg: —

By Company

By Category

Expenses Over Time

Chart Controls

Filter Controls

Clear 📥 Export 📊 Export Graphs 📦 Bundle
{% macro sort_header(label, field) %} {% endmacro %} {% set SORTABLE = { 'pdf_number': 'pdf_number', 'company_name': 'company_name', 'invoice_date': 'invoice_date', 'payment_date': 'payment_date', 'total_amount': 'total_amount', 'extraction_source': 'source', 'validated': 'validated', } %} {% for col in visible_columns %} {% if col.key in SORTABLE %} {{ sort_header(col.label, SORTABLE[col.key]) }} {% else %} {% endif %} {% endfor %} {% for inv in invoices.items %} {% set issues = get_issues(inv) %} {% for col in visible_columns %} {% if col.key == 'pdf_number' %} {% elif col.key == 'company_name' %} {% elif col.key == 'invoice_number' %} {% elif col.key == 'invoice_date' %} {% elif col.key == 'payment_date' %} {% elif col.key == 'total_amount' %} {% elif col.key == 'vat_number' %} {% elif col.key == 'project_name' %} {% elif col.key == 'category' %} {% elif col.key == 'extraction_source' %} {% elif col.key == 'direction' %} {% elif col.key == 'due_date' %} {% elif col.key == 'validated' %} {% elif col.key == 'payment_frequency' %} {% endif %} {% endfor %} {% else %} {% endfor %}
{{ label }} {% if sort_by == field %} {{ '▲' if sort_dir == 'asc' else '▼' }} {% else %} {% endif %} {{ col.label }}Issues Update
{{ inv.pdf_number }}
{{ inv.company_name or '—' }}
{{ inv.invoice_number or '—' }}{{ inv.invoice_date.strftime('%d/%m/%Y') if inv.invoice_date else '—' }}{{ inv.payment_date.strftime('%d/%m/%Y') if inv.payment_date else '—' }}{{ '%.2f'|format(inv.total_amount|float) if inv.total_amount else '—' }}{{ inv.vat_number or '—' }} {% if inv.project_name and inv.project_name in project_colors %} {% set _pcolor = project_colors[inv.project_name] %} {{ inv.project_name }} {% else %} {{ inv.project_name or '—' }} {% endif %} {% if inv.category %} {{ inv.category.name }} {% else %}{% endif %} {{ inv.extraction_source }} {% if inv.direction == 'emitted' %} 📤 Emitted {% else %} 📥 Received {% endif %} {{ inv.due_date.strftime('%d/%m/%Y') if inv.due_date else '—' }} {% if inv.validated %} ✓ Paid {% else %}{% endif %} {{ inv.payment_frequency or '—' }} {% if issues %} {% else %} {% endif %} {% if inv.pdf_filename %} {% else %} Upload {% endif %}
No invoices match the current filters.
{% if invoices.pages > 1 %} {% endif %}
{% endblock %}