Add recurring transaction detection, subscriptions page, and UK tax reporting
- Recurring service: auto-detects direct debits/subscriptions from CSV imports using frequency analysis; manual toggle in transaction detail drawer - Subscriptions page (/subscriptions): groups recurring payments with monthly cost equivalents, next-payment badges, and re-scan trigger - UK Tax page (/tax): payslips/P60 entry, income tax + NI + CGT + dividend tax calculations, configurable rate tables per tax year (pre-seeded 2024/25 and 2025/26), editable in-app so Budget changes need no rebuild - Migration 0006: tax_rate_configs, tax_profiles, payslips, manual_cgt_disposals with RLS; seeds 2025/2026 rate configs for existing users - Chart tooltip fix: all Recharts tooltips now use TOOLTIP_STYLE constant so they render correctly across all dark/light themes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
0b326cbd87
commit
afb5e99bb2
48 changed files with 6238 additions and 39 deletions
|
|
@ -47,6 +47,7 @@ def _to_response(t: Transaction) -> dict:
|
|||
"notes": _dec(t.notes_enc),
|
||||
"tags": t.tags or [],
|
||||
"is_recurring": t.is_recurring,
|
||||
"recurring_rule": t.recurring_rule,
|
||||
"attachment_refs": t.attachment_refs or [],
|
||||
"created_at": t.created_at,
|
||||
"updated_at": t.updated_at,
|
||||
|
|
@ -221,6 +222,10 @@ async def update_transaction(
|
|||
txn.notes_enc = _enc(data.notes)
|
||||
if data.tags is not None:
|
||||
txn.tags = data.tags
|
||||
if data.is_recurring is not None:
|
||||
txn.is_recurring = data.is_recurring
|
||||
if data.recurring_rule is not None:
|
||||
txn.recurring_rule = data.recurring_rule
|
||||
|
||||
txn.updated_at = now
|
||||
await db.flush()
|
||||
|
|
@ -307,5 +312,7 @@ async def import_csv(
|
|||
await db.flush()
|
||||
if imported > 0:
|
||||
await recalculate_balance(db, account_id)
|
||||
from app.services.recurring_service import detect_recurring
|
||||
await detect_recurring(db, user_id)
|
||||
|
||||
return {"imported": imported, "skipped": skipped}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue