Problem
compute_spendable_income equates net revenue with taxable profit. Business expenses (health insurance, professional liability, operating costs) are not deducted before estimating income tax. This overstates both the tax reserve and the safe-to-spend amount.
The RecurringExpense model exists and is already used in the salary calculation (compute_effective_salary), but the Tax & Reserves waterfall ignores it.
Required waterfall
Gross Revenue € 5,355
− VAT (to remit) −€ 855
− Business Expenses −€ XXX ← from RecurringExpense
= Taxable Profit € X,XXX ← new line
− Est. Income Tax −€ XXX ← computed on profit, not revenue
= Safe to Spend € X,XXX
The same structure applies to the Salary page (monthly figures).
Scope
SpendableIncome NamedTuple: add business_expenses and taxable_profit fields
compute_spendable_income in tuttle/tax_reserves.py: accept expenses list, subtract from net revenue before tax estimate
TaxReservesView.tsx: add Business Expenses and Taxable Profit bars to the waterfall
- RPC handler: pass expenses to
compute_spendable_income
Related: #299 (pension/retirement is one category of recurring expense that feeds into this)
Problem
compute_spendable_incomeequates net revenue with taxable profit. Business expenses (health insurance, professional liability, operating costs) are not deducted before estimating income tax. This overstates both the tax reserve and the safe-to-spend amount.The
RecurringExpensemodel exists and is already used in the salary calculation (compute_effective_salary), but the Tax & Reserves waterfall ignores it.Required waterfall
The same structure applies to the Salary page (monthly figures).
Scope
SpendableIncomeNamedTuple: addbusiness_expensesandtaxable_profitfieldscompute_spendable_incomeintuttle/tax_reserves.py: accept expenses list, subtract from net revenue before tax estimateTaxReservesView.tsx: add Business Expenses and Taxable Profit bars to the waterfallcompute_spendable_incomeRelated: #299 (pension/retirement is one category of recurring expense that feeds into this)