{% extends "base.html" %} {% block content %}
{{ month_name }} Total
${{ month_total | money }}
{{ year }} YTD Total
${{ ytd_total | money }}
Monthly Average
{% set months_with_income = ytd_by_month | length %} ${{ (ytd_total / months_with_income if months_with_income else 0) | money }}
🧾 {{ year }} Tax Estimate — based on ${{ ytd_total | money }} YTD income
~${{ tax_estimate.total | money }} owed  ·  ${{ tax_set_aside | money }} set aside  ·  {% if tax_still_needed > 0 %} ${{ tax_still_needed | money }} still needed {% else %} fully covered ✓ {% endif %}
View Tax Details →

{{ month_name }} {{ year }} — by Stream

{% for s in income_streams %} {% endfor %}
StreamOwnerThis MonthYTD
{{ s.name }} {{ s.owner }} ${{ by_stream.get(s.name, 0) | money }} ${{ ytd_by_stream.get(s.name, 0) | money }}
Total ${{ month_total | money }} ${{ ytd_total | money }}
{% if ytd_by_month %}

{{ year }} — Month by Month

{% for mk in sorted_months %} {% set amt = ytd_by_month[mk] %} {% endfor %}
MonthTotal Income
{{ mk }} ${{ amt | money }}
YTD Total ${{ ytd_total | money }}
{% endif %} {% if entries %}

{{ month_name }} Entries

{% for e in entries | sort(attribute='date', reverse=True) %} {% endfor %}
StreamAmountDate LoggedNote
{{ e.stream }} ${{ e.amount | money }} {{ e.date }} {{ e.note or '—' }}
{% endif %}

Backfill Past Months

Enter totals for any month you haven't logged yet. Leave blank to skip. Existing entries won't be duplicated.

{% for s in income_streams %} {% endfor %} {% for m in range(1, 13) %} {% set mk = '%04d-%02d' | format(year, m) %} {% set mn = month_names[m] %} {% set is_current = (m == month) %} {% for s in income_streams %} {% endfor %} {% endfor %}
Month {{ s.name }}
{{ s.owner }}
{{ mn }} {% if is_current %} (current){% endif %} {% if ytd_by_month.get(mk) %} ✓ ${{ "%.0f"|format(ytd_by_month[mk]) }} {% endif %}
{% endblock %}