From 3d2b358ecc690a8e590116822756b3de15b7b29f Mon Sep 17 00:00:00 2001 From: sudheer Date: Mon, 22 Jun 2026 02:19:37 +0200 Subject: [PATCH] chore: readme screenshots; fix: celery + prev async.queue bug in receipt extraction; feat: rate limit for demo users --- README.md | 18 + .../alembic/versions/0001_initial_schema.py | 4 +- .../0004_add_rejection_reason_and_user_cv.py | 1 + .../alembic/versions/0007_spendhound_mvp.py | 141 +- ...add_expense_items_and_statement_imports.py | 28 +- .../versions/0009_add_transaction_types.py | 14 +- ..._add_expense_cadence_and_major_purchase.py | 14 +- .../alembic/versions/0011_add_expense_chat.py | 61 +- .../0012_add_monthly_report_deliveries.py | 37 +- ...0013_add_user_automatic_monthly_reports.py | 4 +- .../0014_add_recurring_generation_fields.py | 15 +- .../versions/0015_add_item_keyword_rules.py | 12 +- .../versions/0021_add_partners_and_ledgers.py | 90 +- backend/app/api/admin.py | 69 +- backend/app/api/auth.py | 66 +- backend/app/api/budgets.py | 54 +- backend/app/api/categories.py | 154 +- backend/app/api/chat.py | 4 +- backend/app/api/expenses.py | 369 ++- backend/app/api/ledgers.py | 126 +- backend/app/api/llm_models.py | 56 +- backend/app/api/monthly_reports.py | 4 +- backend/app/api/ollama.py | 5 +- backend/app/api/partners.py | 40 +- backend/app/api/receipts.py | 50 +- backend/app/celery_app.py | 7 +- backend/app/config.py | 73 +- backend/app/database.py | 29 +- backend/app/jobs/monthly_reports.py | 50 +- backend/app/jobs/recurring_expenses.py | 10 +- backend/app/main.py | 8 +- backend/app/middleware/rate_limit.py | 4 +- backend/app/models/__init__.py | 19 +- backend/app/models/budget.py | 19 +- backend/app/models/category.py | 59 +- backend/app/models/chat_message.py | 15 +- backend/app/models/chat_session.py | 12 +- backend/app/models/expense.py | 61 +- backend/app/models/expense_item.py | 15 +- backend/app/models/item_embedding.py | 12 +- backend/app/models/ledger.py | 57 +- backend/app/models/monthly_report_delivery.py | 12 +- backend/app/models/partner.py | 30 +- backend/app/models/receipt.py | 16 +- backend/app/models/user.py | 70 +- backend/app/schemas/user.py | 22 +- backend/app/services/analytics.py | 109 +- backend/app/services/cache.py | 8 +- backend/app/services/demo_seed.py | 2007 ++++++++++++----- backend/app/services/email.py | 37 +- backend/app/services/expense_chat.py | 104 +- backend/app/services/item_rag.py | 8 +- backend/app/services/llm/anthropic.py | 8 +- backend/app/services/llm/encryption.py | 6 +- backend/app/services/llm/factory.py | 23 +- backend/app/services/llm/nebius.py | 4 +- backend/app/services/llm/ollama.py | 8 +- backend/app/services/llm/openai.py | 4 +- backend/app/services/receipt_extraction.py | 310 ++- backend/app/services/receipt_queue.py | 4 +- backend/app/services/report_exports.py | 8 +- backend/app/services/spendhound.py | 493 ++-- backend/app/services/url_validation.py | 45 +- backend/tests/test_admin.py | 8 +- backend/tests/test_cache_invalidation.py | 4 +- backend/tests/test_expenses_crud.py | 189 +- backend/tests/test_monthly_reports.py | 54 +- backend/tests/test_parser.py | 44 +- backend/tests/test_report_retry.py | 6 +- backend/tests/test_task_internals.py | 13 +- docs/screenshots/.gitkeep | 0 docs/screenshots/budgets.png | Bin 0 -> 170183 bytes docs/screenshots/categories.png | Bin 0 -> 198536 bytes docs/screenshots/chat.png | Bin 0 -> 157788 bytes docs/screenshots/dashboard.png | Bin 0 -> 204044 bytes docs/screenshots/expenses.png | Bin 0 -> 275572 bytes docs/screenshots/receipt-extraction.png | Bin 0 -> 174974 bytes frontend/src/app/(app)/chat/page.tsx | 6 +- frontend/src/app/(app)/expenses/new/page.tsx | 12 +- 79 files changed, 4155 insertions(+), 1403 deletions(-) create mode 100644 docs/screenshots/.gitkeep create mode 100644 docs/screenshots/budgets.png create mode 100644 docs/screenshots/categories.png create mode 100644 docs/screenshots/chat.png create mode 100644 docs/screenshots/dashboard.png create mode 100644 docs/screenshots/expenses.png create mode 100644 docs/screenshots/receipt-extraction.png diff --git a/README.md b/README.md index 9321c68..1c9a335 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,24 @@ Licensed under the [GNU Affero General Public License v3.0](LICENSE). --- +## Screenshots + +> Or, try it live [here](https://spendhound.dodecahedrons.com). + +| Dashboard | Expense list | +|---|---| +| ![Monthly analytics overview](docs/screenshots/dashboard.png) | ![Expense list with filters](docs/screenshots/expenses.png) | + +| Receipt extraction | AI chat | +|---|---| +| ![AI receipt parsing preview](docs/screenshots/receipt-extraction.png) | ![Financial chat grounded on 90 days of expenses](docs/screenshots/chat.png) | + +| Budgets | Categories and rules | +|---|---| +| ![Budget vs actual tracking](docs/screenshots/budgets.png) | ![Category and merchant rule management](docs/screenshots/categories.png) | + +--- + ## Features - Google OAuth with admin approval gate diff --git a/backend/alembic/versions/0001_initial_schema.py b/backend/alembic/versions/0001_initial_schema.py index 4f57ea2..d3ffdcd 100644 --- a/backend/alembic/versions/0001_initial_schema.py +++ b/backend/alembic/versions/0001_initial_schema.py @@ -168,9 +168,7 @@ def upgrade() -> None: "ALTER TABLE job_description_embeddings " "ALTER COLUMN embedding TYPE vector(1536) USING embedding::vector" ) - op.create_index( - "ix_jde_application_id", "job_description_embeddings", ["application_id"] - ) + op.create_index("ix_jde_application_id", "job_description_embeddings", ["application_id"]) # IVFFlat index for approximate nearest-neighbor search op.execute( "CREATE INDEX ix_jde_embedding_ivfflat " diff --git a/backend/alembic/versions/0004_add_rejection_reason_and_user_cv.py b/backend/alembic/versions/0004_add_rejection_reason_and_user_cv.py index f19e300..ac9f3c3 100644 --- a/backend/alembic/versions/0004_add_rejection_reason_and_user_cv.py +++ b/backend/alembic/versions/0004_add_rejection_reason_and_user_cv.py @@ -4,6 +4,7 @@ Revises: 0003 Create Date: 2026-04-10 """ + import sqlalchemy as sa from alembic import op diff --git a/backend/alembic/versions/0007_spendhound_mvp.py b/backend/alembic/versions/0007_spendhound_mvp.py index 90201c3..82b7255 100644 --- a/backend/alembic/versions/0007_spendhound_mvp.py +++ b/backend/alembic/versions/0007_spendhound_mvp.py @@ -44,7 +44,9 @@ def upgrade() -> None: chat_message_columns = {column["name"] for column in inspector.get_columns("chat_messages")} if "session_id" in chat_message_columns: - chat_message_indexes = {index["name"] for index in inspector.get_indexes("chat_messages")} + chat_message_indexes = { + index["name"] for index in inspector.get_indexes("chat_messages") + } if "ix_chat_messages_session_id" in chat_message_indexes: logger.info("Dropping legacy index ix_chat_messages_session_id") op.drop_index("ix_chat_messages_session_id", table_name="chat_messages") @@ -76,14 +78,29 @@ def upgrade() -> None: op.create_table( "categories", sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False), - sa.Column("user_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False), + sa.Column( + "user_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), sa.Column("name", sa.String(80), nullable=False), sa.Column("color", sa.String(20), nullable=False, server_default="#60a5fa"), sa.Column("icon", sa.String(32), nullable=True), sa.Column("description", sa.Text(), nullable=True), sa.Column("is_system", sa.Boolean(), nullable=False, server_default="false"), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), sa.UniqueConstraint("user_id", "name", name="uq_categories_user_name"), ) op.create_index("ix_categories_user_id", "categories", ["user_id"]) @@ -92,15 +109,35 @@ def upgrade() -> None: op.create_table( "merchant_rules", sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False), - sa.Column("user_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False), - sa.Column("category_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("categories.id", ondelete="SET NULL"), nullable=True), + sa.Column( + "user_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), + sa.Column( + "category_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("categories.id", ondelete="SET NULL"), + nullable=True, + ), sa.Column("merchant_pattern", sa.String(255), nullable=False), sa.Column("pattern_type", sa.String(20), nullable=False, server_default="contains"), sa.Column("priority", sa.Integer(), nullable=False, server_default="100"), sa.Column("is_active", sa.Boolean(), nullable=False, server_default="true"), sa.Column("notes", sa.Text(), nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), ) op.create_index("ix_merchant_rules_user_id", "merchant_rules", ["user_id"]) op.create_index("ix_merchant_rules_category_id", "merchant_rules", ["category_id"]) @@ -109,7 +146,12 @@ def upgrade() -> None: op.create_table( "receipts", sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False), - sa.Column("user_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False), + sa.Column( + "user_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), sa.Column("original_filename", sa.String(255), nullable=False), sa.Column("stored_filename", sa.String(255), nullable=False), sa.Column("content_type", sa.String(120), nullable=True), @@ -118,11 +160,23 @@ def upgrade() -> None: sa.Column("ocr_text", sa.Text(), nullable=True), sa.Column("preview_data", postgresql.JSONB(astext_type=sa.Text()), nullable=True), sa.Column("extraction_confidence", sa.Float(), nullable=True), - sa.Column("extraction_status", sa.String(30), nullable=False, server_default="uploaded"), + sa.Column( + "extraction_status", sa.String(30), nullable=False, server_default="uploaded" + ), sa.Column("needs_review", sa.Boolean(), nullable=False, server_default="true"), sa.Column("review_notes", sa.Text(), nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), sa.Column("finalized_at", sa.DateTime(timezone=True), nullable=True), ) op.create_index("ix_receipts_user_id", "receipts", ["user_id"]) @@ -131,9 +185,24 @@ def upgrade() -> None: op.create_table( "expenses", sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False), - sa.Column("user_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False), - sa.Column("category_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("categories.id", ondelete="SET NULL"), nullable=True), - sa.Column("receipt_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("receipts.id", ondelete="SET NULL"), nullable=True), + sa.Column( + "user_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), + sa.Column( + "category_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("categories.id", ondelete="SET NULL"), + nullable=True, + ), + sa.Column( + "receipt_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("receipts.id", ondelete="SET NULL"), + nullable=True, + ), sa.Column("merchant", sa.String(255), nullable=False), sa.Column("description", sa.Text(), nullable=True), sa.Column("amount", sa.Numeric(12, 2), nullable=False), @@ -145,8 +214,18 @@ def upgrade() -> None: sa.Column("notes", sa.Text(), nullable=True), sa.Column("recurring_group", sa.String(255), nullable=True), sa.Column("is_recurring", sa.Boolean(), nullable=False, server_default="false"), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), ) op.create_index("ix_expenses_user_id", "expenses", ["user_id"]) op.create_index("ix_expenses_category_id", "expenses", ["category_id"]) @@ -159,16 +238,36 @@ def upgrade() -> None: op.create_table( "budgets", sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False), - sa.Column("user_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False), - sa.Column("category_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("categories.id", ondelete="SET NULL"), nullable=True), + sa.Column( + "user_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), + sa.Column( + "category_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("categories.id", ondelete="SET NULL"), + nullable=True, + ), sa.Column("name", sa.String(120), nullable=False), sa.Column("amount", sa.Numeric(12, 2), nullable=False), sa.Column("currency", sa.String(3), nullable=False, server_default="EUR"), sa.Column("period", sa.String(20), nullable=False, server_default="monthly"), sa.Column("month_start", sa.Date(), nullable=False), sa.Column("notes", sa.Text(), nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), ) op.create_index("ix_budgets_user_id", "budgets", ["user_id"]) op.create_index("ix_budgets_category_id", "budgets", ["category_id"]) diff --git a/backend/alembic/versions/0008_add_expense_items_and_statement_imports.py b/backend/alembic/versions/0008_add_expense_items_and_statement_imports.py index 2f8b8ff..a9c3d93 100644 --- a/backend/alembic/versions/0008_add_expense_items_and_statement_imports.py +++ b/backend/alembic/versions/0008_add_expense_items_and_statement_imports.py @@ -22,21 +22,41 @@ def upgrade() -> None: receipt_columns = {column["name"] for column in inspector.get_columns("receipts")} if "document_kind" not in receipt_columns: - op.add_column("receipts", sa.Column("document_kind", sa.String(length=20), nullable=False, server_default="receipt")) + op.add_column( + "receipts", + sa.Column( + "document_kind", sa.String(length=20), nullable=False, server_default="receipt" + ), + ) if not inspector.has_table("expense_items"): op.create_table( "expense_items", sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False), - sa.Column("expense_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("expenses.id", ondelete="CASCADE"), nullable=False), + sa.Column( + "expense_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("expenses.id", ondelete="CASCADE"), + nullable=False, + ), sa.Column("description", sa.String(length=300), nullable=False), sa.Column("quantity", sa.Float(), nullable=True), sa.Column("unit_price", sa.Numeric(12, 2), nullable=True), sa.Column("total_price", sa.Numeric(12, 2), nullable=True), sa.Column("subcategory", sa.String(length=120), nullable=True), sa.Column("subcategory_confidence", sa.Float(), nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), ) op.create_index("ix_expense_items_expense_id", "expense_items", ["expense_id"]) op.create_index("ix_expense_items_subcategory", "expense_items", ["subcategory"]) diff --git a/backend/alembic/versions/0009_add_transaction_types.py b/backend/alembic/versions/0009_add_transaction_types.py index 7446ba7..8451afa 100644 --- a/backend/alembic/versions/0009_add_transaction_types.py +++ b/backend/alembic/versions/0009_add_transaction_types.py @@ -22,14 +22,24 @@ def upgrade() -> None: category_columns = {column["name"] for column in inspector.get_columns("categories")} category_indexes = {index["name"] for index in inspector.get_indexes("categories")} if "transaction_type" not in category_columns: - op.add_column("categories", sa.Column("transaction_type", sa.String(length=20), nullable=False, server_default="debit")) + op.add_column( + "categories", + sa.Column( + "transaction_type", sa.String(length=20), nullable=False, server_default="debit" + ), + ) if "ix_categories_transaction_type" not in category_indexes: op.create_index("ix_categories_transaction_type", "categories", ["transaction_type"]) expense_columns = {column["name"] for column in inspector.get_columns("expenses")} expense_indexes = {index["name"] for index in inspector.get_indexes("expenses")} if "transaction_type" not in expense_columns: - op.add_column("expenses", sa.Column("transaction_type", sa.String(length=20), nullable=False, server_default="debit")) + op.add_column( + "expenses", + sa.Column( + "transaction_type", sa.String(length=20), nullable=False, server_default="debit" + ), + ) if "ix_expenses_transaction_type" not in expense_indexes: op.create_index("ix_expenses_transaction_type", "expenses", ["transaction_type"]) diff --git a/backend/alembic/versions/0010_add_expense_cadence_and_major_purchase.py b/backend/alembic/versions/0010_add_expense_cadence_and_major_purchase.py index c2865bc..5e286fc 100644 --- a/backend/alembic/versions/0010_add_expense_cadence_and_major_purchase.py +++ b/backend/alembic/versions/0010_add_expense_cadence_and_major_purchase.py @@ -22,11 +22,19 @@ def upgrade() -> None: expense_indexes = {index["name"] for index in inspector.get_indexes("expenses")} if "cadence" not in expense_columns: - op.add_column("expenses", sa.Column("cadence", sa.String(length=20), nullable=False, server_default="one_time")) + op.add_column( + "expenses", + sa.Column("cadence", sa.String(length=20), nullable=False, server_default="one_time"), + ) if "cadence_override" not in expense_columns: - op.add_column("expenses", sa.Column("cadence_override", sa.String(length=20), nullable=True)) + op.add_column( + "expenses", sa.Column("cadence_override", sa.String(length=20), nullable=True) + ) if "is_major_purchase" not in expense_columns: - op.add_column("expenses", sa.Column("is_major_purchase", sa.Boolean(), nullable=False, server_default=sa.false())) + op.add_column( + "expenses", + sa.Column("is_major_purchase", sa.Boolean(), nullable=False, server_default=sa.false()), + ) if "ix_expenses_cadence" not in expense_indexes: op.create_index("ix_expenses_cadence", "expenses", ["cadence"]) diff --git a/backend/alembic/versions/0011_add_expense_chat.py b/backend/alembic/versions/0011_add_expense_chat.py index 88a2c58..0a559ed 100644 --- a/backend/alembic/versions/0011_add_expense_chat.py +++ b/backend/alembic/versions/0011_add_expense_chat.py @@ -46,14 +46,29 @@ def upgrade() -> None: op.create_table( "chat_sessions", sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False), - sa.Column("user_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False), + sa.Column( + "user_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), sa.Column("title", sa.String(length=255), nullable=False, server_default="New Chat"), sa.Column("summary", sa.Text(), nullable=True), sa.Column("token_count", sa.Integer(), nullable=False, server_default="0"), sa.Column("max_tokens", sa.Integer(), nullable=False, server_default="4096"), sa.Column("last_message_at", sa.DateTime(timezone=True), nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")), - sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + nullable=False, + server_default=sa.text("now()"), + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + nullable=False, + server_default=sa.text("now()"), + ), ) op.create_index("ix_chat_sessions_user_id", "chat_sessions", ["user_id"]) op.create_index("ix_chat_sessions_last_message_at", "chat_sessions", ["last_message_at"]) @@ -61,8 +76,18 @@ def upgrade() -> None: op.create_table( "chat_messages", sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False), - sa.Column("user_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False), - sa.Column("session_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("chat_sessions.id", ondelete="CASCADE"), nullable=False), + sa.Column( + "user_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), + sa.Column( + "session_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("chat_sessions.id", ondelete="CASCADE"), + nullable=False, + ), sa.Column("role", sa.String(length=20), nullable=False), sa.Column("content", sa.Text(), nullable=False), sa.Column("client_id", sa.String(length=120), nullable=False), @@ -71,8 +96,18 @@ def upgrade() -> None: sa.Column("model", sa.String(length=255), nullable=True), sa.Column("token_count", sa.Integer(), nullable=True), sa.Column("metadata", sa.JSON(), nullable=False), - sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")), - sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + nullable=False, + server_default=sa.text("now()"), + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + nullable=False, + server_default=sa.text("now()"), + ), ) op.create_index("ix_chat_messages_user_id", "chat_messages", ["user_id"]) op.create_index("ix_chat_messages_session_id", "chat_messages", ["session_id"]) @@ -84,8 +119,16 @@ def upgrade() -> None: def downgrade() -> None: bind = op.get_bind() inspector = sa.inspect(bind) - message_indexes = {index["name"] for index in inspector.get_indexes("chat_messages")} if inspector.has_table("chat_messages") else set() - session_indexes = {index["name"] for index in inspector.get_indexes("chat_sessions")} if inspector.has_table("chat_sessions") else set() + message_indexes = ( + {index["name"] for index in inspector.get_indexes("chat_messages")} + if inspector.has_table("chat_messages") + else set() + ) + session_indexes = ( + {index["name"] for index in inspector.get_indexes("chat_sessions")} + if inspector.has_table("chat_sessions") + else set() + ) for index_name in [ "ix_chat_messages_parent_client_id", diff --git a/backend/alembic/versions/0012_add_monthly_report_deliveries.py b/backend/alembic/versions/0012_add_monthly_report_deliveries.py index cd107a0..200199f 100644 --- a/backend/alembic/versions/0012_add_monthly_report_deliveries.py +++ b/backend/alembic/versions/0012_add_monthly_report_deliveries.py @@ -20,7 +20,12 @@ def upgrade() -> None: op.create_table( "monthly_report_deliveries", sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False), - sa.Column("user_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False), + sa.Column( + "user_id", + postgresql.UUID(as_uuid=True), + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), sa.Column("report_month", sa.Date(), nullable=False), sa.Column("status", sa.String(length=20), nullable=False, server_default="pending"), sa.Column("attempted_at", sa.DateTime(timezone=True), nullable=True), @@ -28,17 +33,35 @@ def upgrade() -> None: sa.Column("resend_email_id", sa.String(length=255), nullable=True), sa.Column("pdf_source_url", sa.String(length=1000), nullable=True), sa.Column("error_message", sa.Text(), nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")), - sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")), - sa.UniqueConstraint("user_id", "report_month", name="uq_monthly_report_deliveries_user_month"), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + nullable=False, + server_default=sa.text("now()"), + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + nullable=False, + server_default=sa.text("now()"), + ), + sa.UniqueConstraint( + "user_id", "report_month", name="uq_monthly_report_deliveries_user_month" + ), + ) + op.create_index( + "ix_monthly_report_deliveries_user_id", "monthly_report_deliveries", ["user_id"] + ) + op.create_index( + "ix_monthly_report_deliveries_report_month", "monthly_report_deliveries", ["report_month"] ) - op.create_index("ix_monthly_report_deliveries_user_id", "monthly_report_deliveries", ["user_id"]) - op.create_index("ix_monthly_report_deliveries_report_month", "monthly_report_deliveries", ["report_month"]) op.create_index("ix_monthly_report_deliveries_status", "monthly_report_deliveries", ["status"]) def downgrade() -> None: op.drop_index("ix_monthly_report_deliveries_status", table_name="monthly_report_deliveries") - op.drop_index("ix_monthly_report_deliveries_report_month", table_name="monthly_report_deliveries") + op.drop_index( + "ix_monthly_report_deliveries_report_month", table_name="monthly_report_deliveries" + ) op.drop_index("ix_monthly_report_deliveries_user_id", table_name="monthly_report_deliveries") op.drop_table("monthly_report_deliveries") diff --git a/backend/alembic/versions/0013_add_user_automatic_monthly_reports.py b/backend/alembic/versions/0013_add_user_automatic_monthly_reports.py index c2d2919..9cb5a78 100644 --- a/backend/alembic/versions/0013_add_user_automatic_monthly_reports.py +++ b/backend/alembic/versions/0013_add_user_automatic_monthly_reports.py @@ -18,7 +18,9 @@ def upgrade() -> None: op.add_column( "users", - sa.Column("automatic_monthly_reports", sa.Boolean(), nullable=False, server_default=sa.true()), + sa.Column( + "automatic_monthly_reports", sa.Boolean(), nullable=False, server_default=sa.true() + ), ) diff --git a/backend/alembic/versions/0014_add_recurring_generation_fields.py b/backend/alembic/versions/0014_add_recurring_generation_fields.py index 5eafe86..47b67ed 100644 --- a/backend/alembic/versions/0014_add_recurring_generation_fields.py +++ b/backend/alembic/versions/0014_add_recurring_generation_fields.py @@ -36,8 +36,15 @@ def upgrade() -> None: "expenses", sa.Column("generated_for_month", sa.Date(), nullable=True), ) - op.create_index(op.f("ix_expenses_generated_for_month"), "expenses", ["generated_for_month"], unique=False) - op.create_index(op.f("ix_expenses_recurring_source_expense_id"), "expenses", ["recurring_source_expense_id"], unique=False) + op.create_index( + op.f("ix_expenses_generated_for_month"), "expenses", ["generated_for_month"], unique=False + ) + op.create_index( + op.f("ix_expenses_recurring_source_expense_id"), + "expenses", + ["recurring_source_expense_id"], + unique=False, + ) op.create_foreign_key( "fk_expenses_recurring_source_expense_id_expenses", "expenses", @@ -49,7 +56,9 @@ def upgrade() -> None: def downgrade() -> None: - op.drop_constraint("fk_expenses_recurring_source_expense_id_expenses", "expenses", type_="foreignkey") + op.drop_constraint( + "fk_expenses_recurring_source_expense_id_expenses", "expenses", type_="foreignkey" + ) op.drop_index(op.f("ix_expenses_recurring_source_expense_id"), table_name="expenses") op.drop_index(op.f("ix_expenses_generated_for_month"), table_name="expenses") op.drop_column("expenses", "generated_for_month") diff --git a/backend/alembic/versions/0015_add_item_keyword_rules.py b/backend/alembic/versions/0015_add_item_keyword_rules.py index 3a2e232..ee0d1fd 100644 --- a/backend/alembic/versions/0015_add_item_keyword_rules.py +++ b/backend/alembic/versions/0015_add_item_keyword_rules.py @@ -26,12 +26,18 @@ def upgrade() -> None: sa.Column("priority", sa.Integer(), nullable=False, server_default="100"), sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.true()), sa.Column("notes", sa.Text(), nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()), - sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()), + sa.Column( + "created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now() + ), + sa.Column( + "updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now() + ), sa.ForeignKeyConstraint(["user_id"], ["users.id"], ondelete="CASCADE"), sa.PrimaryKeyConstraint("id"), ) - op.create_index(op.f("ix_item_keyword_rules_user_id"), "item_keyword_rules", ["user_id"], unique=False) + op.create_index( + op.f("ix_item_keyword_rules_user_id"), "item_keyword_rules", ["user_id"], unique=False + ) def downgrade() -> None: diff --git a/backend/alembic/versions/0021_add_partners_and_ledgers.py b/backend/alembic/versions/0021_add_partners_and_ledgers.py index 642f1f0..4665c5e 100644 --- a/backend/alembic/versions/0021_add_partners_and_ledgers.py +++ b/backend/alembic/versions/0021_add_partners_and_ledgers.py @@ -24,37 +24,80 @@ def upgrade() -> None: sa.Column("id", sa.Uuid(as_uuid=True), primary_key=True), sa.Column("name", sa.String(255), nullable=False), sa.Column("type", sa.String(20), nullable=False, server_default="personal"), - sa.Column("created_by", sa.Uuid(as_uuid=True), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), + sa.Column( + "created_by", + sa.Uuid(as_uuid=True), + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), + sa.Column( + "created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False + ), + sa.Column( + "updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False + ), ) op.create_index("ix_ledgers_created_by", "ledgers", ["created_by"]) op.create_table( "ledger_memberships", sa.Column("id", sa.Uuid(as_uuid=True), primary_key=True), - sa.Column("ledger_id", sa.Uuid(as_uuid=True), sa.ForeignKey("ledgers.id", ondelete="CASCADE"), nullable=False), - sa.Column("user_id", sa.Uuid(as_uuid=True), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False), + sa.Column( + "ledger_id", + sa.Uuid(as_uuid=True), + sa.ForeignKey("ledgers.id", ondelete="CASCADE"), + nullable=False, + ), + sa.Column( + "user_id", + sa.Uuid(as_uuid=True), + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), sa.Column("role", sa.String(20), nullable=False, server_default="owner"), - sa.Column("joined_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), + sa.Column( + "joined_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False + ), sa.UniqueConstraint("ledger_id", "user_id", name="uq_ledger_membership"), ) op.create_index("ix_ledger_memberships_ledger_id", "ledger_memberships", ["ledger_id"]) op.create_index("ix_ledger_memberships_user_id", "ledger_memberships", ["user_id"]) - op.add_column("expenses", sa.Column("ledger_id", sa.Uuid(as_uuid=True), sa.ForeignKey("ledgers.id", ondelete="SET NULL"), nullable=True)) + op.add_column( + "expenses", + sa.Column( + "ledger_id", + sa.Uuid(as_uuid=True), + sa.ForeignKey("ledgers.id", ondelete="SET NULL"), + nullable=True, + ), + ) op.create_index("ix_expenses_ledger_id", "expenses", ["ledger_id"]) op.create_table( "partner_requests", sa.Column("id", sa.Uuid(as_uuid=True), primary_key=True), - sa.Column("requester_id", sa.Uuid(as_uuid=True), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False), + sa.Column( + "requester_id", + sa.Uuid(as_uuid=True), + sa.ForeignKey("users.id", ondelete="CASCADE"), + nullable=False, + ), sa.Column("recipient_email", sa.String(255), nullable=False), - sa.Column("recipient_id", sa.Uuid(as_uuid=True), sa.ForeignKey("users.id", ondelete="SET NULL"), nullable=True), + sa.Column( + "recipient_id", + sa.Uuid(as_uuid=True), + sa.ForeignKey("users.id", ondelete="SET NULL"), + nullable=True, + ), sa.Column("status", sa.String(20), nullable=False, server_default="pending"), sa.Column("token", sa.Text, nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), + sa.Column( + "created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False + ), + sa.Column( + "updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False + ), ) op.create_index("ix_partner_requests_requester_id", "partner_requests", ["requester_id"]) op.create_index("ix_partner_requests_recipient_email", "partner_requests", ["recipient_email"]) @@ -63,12 +106,29 @@ def upgrade() -> None: op.create_table( "ledger_audit_logs", sa.Column("id", sa.Uuid(as_uuid=True), primary_key=True), - sa.Column("ledger_id", sa.Uuid(as_uuid=True), sa.ForeignKey("ledgers.id", ondelete="CASCADE"), nullable=False), - sa.Column("expense_id", sa.Uuid(as_uuid=True), sa.ForeignKey("expenses.id", ondelete="SET NULL"), nullable=True), - sa.Column("user_id", sa.Uuid(as_uuid=True), sa.ForeignKey("users.id", ondelete="SET NULL"), nullable=True), + sa.Column( + "ledger_id", + sa.Uuid(as_uuid=True), + sa.ForeignKey("ledgers.id", ondelete="CASCADE"), + nullable=False, + ), + sa.Column( + "expense_id", + sa.Uuid(as_uuid=True), + sa.ForeignKey("expenses.id", ondelete="SET NULL"), + nullable=True, + ), + sa.Column( + "user_id", + sa.Uuid(as_uuid=True), + sa.ForeignKey("users.id", ondelete="SET NULL"), + nullable=True, + ), sa.Column("action", sa.String(50), nullable=False), sa.Column("changes", sa.Text, nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), + sa.Column( + "created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False + ), ) op.create_index("ix_ledger_audit_logs_ledger_id", "ledger_audit_logs", ["ledger_id"]) op.create_index("ix_ledger_audit_logs_expense_id", "ledger_audit_logs", ["expense_id"]) diff --git a/backend/app/api/admin.py b/backend/app/api/admin.py index 8c787cc..916f48a 100644 --- a/backend/app/api/admin.py +++ b/backend/app/api/admin.py @@ -37,7 +37,11 @@ async def get_admin_user(current_user: User = Depends(get_current_user)) -> User def create_action_token(user_id: uuid.UUID, action: str) -> str: expire = datetime.now(UTC) + timedelta(hours=_ACTION_TOKEN_EXPIRY_HOURS) - return jwt.encode({"sub": str(user_id), "action": action, "exp": expire}, settings.jwt_secret, algorithm=settings.jwt_algorithm) + return jwt.encode( + {"sub": str(user_id), "action": action, "exp": expire}, + settings.jwt_secret, + algorithm=settings.jwt_algorithm, + ) def _decode_action_token(token: str, expected_action: str) -> str: @@ -85,10 +89,16 @@ async def approve_user(token: str = Query(...), db: AsyncSession = Depends(get_d if user is None: return _html_page("User Not Found", "No matching user found.", "#ef4444") if user.status == "approved": - return _html_page("Already Approved", f"{user.email} already has access to SpendHound.", "#22c55e") + return _html_page( + "Already Approved", f"{user.email} already has access to SpendHound.", "#22c55e" + ) user.status = "approved" await db.commit() - return _html_page("Access Granted", f"{user.email} has been approved and can now sign in to SpendHound.", "#22c55e") + return _html_page( + "Access Granted", + f"{user.email} has been approved and can now sign in to SpendHound.", + "#22c55e", + ) @router.get("/reject", response_class=HTMLResponse, include_in_schema=False) @@ -125,16 +135,45 @@ class UpdateStatusRequest(BaseModel): @router.get("/panel/users", response_model=list[AdminUserResponse]) -async def list_users(_admin: User = Depends(get_admin_user), db: AsyncSession = Depends(get_db)) -> list[AdminUserResponse]: - counts_q = select(Expense.user_id, func.count(Expense.id).label("expense_count")).group_by(Expense.user_id).subquery() - result = await db.execute(select(User, func.coalesce(counts_q.c.expense_count, 0).label("expense_count")).outerjoin(counts_q, User.id == counts_q.c.user_id).order_by(User.created_at.desc())) - return [AdminUserResponse(id=str(user.id), email=user.email, name=user.name, avatar_url=user.avatar_url, status=user.status, is_admin=is_admin_email(user.email), expense_count=int(count), created_at=user.created_at.isoformat()) for user, count in result.all()] +async def list_users( + _admin: User = Depends(get_admin_user), db: AsyncSession = Depends(get_db) +) -> list[AdminUserResponse]: + counts_q = ( + select(Expense.user_id, func.count(Expense.id).label("expense_count")) + .group_by(Expense.user_id) + .subquery() + ) + result = await db.execute( + select(User, func.coalesce(counts_q.c.expense_count, 0).label("expense_count")) + .outerjoin(counts_q, User.id == counts_q.c.user_id) + .order_by(User.created_at.desc()) + ) + return [ + AdminUserResponse( + id=str(user.id), + email=user.email, + name=user.name, + avatar_url=user.avatar_url, + status=user.status, + is_admin=is_admin_email(user.email), + expense_count=int(count), + created_at=user.created_at.isoformat(), + ) + for user, count in result.all() + ] @router.patch("/panel/users/{user_id}/status") -async def update_user_status(user_id: uuid.UUID, body: UpdateStatusRequest, admin: User = Depends(get_admin_user), db: AsyncSession = Depends(get_db)) -> dict: +async def update_user_status( + user_id: uuid.UUID, + body: UpdateStatusRequest, + admin: User = Depends(get_admin_user), + db: AsyncSession = Depends(get_db), +) -> dict: if body.status not in ("approved", "rejected"): - raise HTTPException(status_code=400, detail="Invalid status value. Expected 'approved' or 'rejected'.") + raise HTTPException( + status_code=400, detail="Invalid status value. Expected 'approved' or 'rejected'." + ) result = await db.execute(select(User).where(User.id == user_id)) user = result.scalar_one_or_none() if user is None: @@ -143,18 +182,24 @@ async def update_user_status(user_id: uuid.UUID, body: UpdateStatusRequest, admi raise HTTPException(status_code=400, detail="Cannot change admin's own status") user.status = body.status await db.commit() - logger.info("User status updated by admin", target=user.email, status=body.status, admin=admin.email) + logger.info( + "User status updated by admin", target=user.email, status=body.status, admin=admin.email + ) return {"id": str(user.id), "status": user.status} @router.delete("/panel/users/{user_id}", status_code=204) -async def delete_user(user_id: uuid.UUID, admin: User = Depends(get_admin_user), db: AsyncSession = Depends(get_db)) -> None: +async def delete_user( + user_id: uuid.UUID, admin: User = Depends(get_admin_user), db: AsyncSession = Depends(get_db) +) -> None: result = await db.execute(select(User).where(User.id == user_id)) user = result.scalar_one_or_none() if user is None: raise HTTPException(status_code=404, detail="User not found") if is_admin_email(user.email): raise HTTPException(status_code=400, detail="Cannot delete the admin account") - logger.info("Deleting user and all related SpendHound data", target=user.email, admin=admin.email) + logger.info( + "Deleting user and all related SpendHound data", target=user.email, admin=admin.email + ) await db.delete(user) await db.commit() diff --git a/backend/app/api/auth.py b/backend/app/api/auth.py index a0b312c..7d87f07 100644 --- a/backend/app/api/auth.py +++ b/backend/app/api/auth.py @@ -68,16 +68,27 @@ def serialize_user_profile(user: User) -> UserResponse: @router.post("/google", response_model=AuthResponse) @limiter.limit(f"{settings.rate_limit_auth_per_minute}/minute") -async def google_auth(request: Request, body: GoogleTokenRequest, db: AsyncSession = Depends(get_db), _bot_check: None = Depends(block_bots)) -> AuthResponse: +async def google_auth( + request: Request, + body: GoogleTokenRequest, + db: AsyncSession = Depends(get_db), + _bot_check: None = Depends(block_bots), +) -> AuthResponse: try: - id_info = id_token.verify_oauth2_token(body.id_token, google_requests.Request(), settings.google_client_id) # type: ignore[no-untyped-call] + id_info = id_token.verify_oauth2_token( + body.id_token, google_requests.Request(), settings.google_client_id + ) # type: ignore[no-untyped-call] except ValueError as error: logger.warning("Invalid Google ID token", error=str(error)) - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=f"Invalid Google token: {error}") from error + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, detail=f"Invalid Google token: {error}" + ) from error email = id_info.get("email") if not email: - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Google token missing email claim") + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, detail="Google token missing email claim" + ) normalized_email = email.strip().lower() result = await db.execute(select(User).where(func.lower(User.email) == normalized_email)) @@ -85,8 +96,17 @@ async def google_auth(request: Request, body: GoogleTokenRequest, db: AsyncSessi is_new_user = user is None if user is None: - initial_status = "approved" if (is_admin_email(normalized_email) or not (settings.admin_email or "").strip()) else "pending" - user = User(email=normalized_email, name=id_info.get("name"), avatar_url=id_info.get("picture"), status=initial_status) + initial_status = ( + "approved" + if (is_admin_email(normalized_email) or not (settings.admin_email or "").strip()) + else "pending" + ) + user = User( + email=normalized_email, + name=id_info.get("name"), + avatar_url=id_info.get("picture"), + status=initial_status, + ) db.add(user) await db.flush() logger.info("New user created", email=email, status=initial_status) @@ -106,7 +126,12 @@ async def google_auth(request: Request, body: GoogleTokenRequest, db: AsyncSessi reject_token = create_action_token(user.id, "reject") approve_url = f"{settings.app_url}/backend/api/admin/approve?token={approve_token}" reject_url = f"{settings.app_url}/backend/api/admin/reject?token={reject_token}" - await send_approval_request_email(user_email=user.email, user_name=user.name, approve_url=approve_url, reject_url=reject_url) + await send_approval_request_email( + user_email=user.email, + user_name=user.name, + approve_url=approve_url, + reject_url=reject_url, + ) token = create_access_token(user.id, user.email) is_admin = is_admin_email(normalized_email) @@ -125,6 +150,7 @@ async def google_auth(request: Request, body: GoogleTokenRequest, db: AsyncSessi @router.post("/demo-login", response_model=AuthResponse) +@limiter.limit(f"{settings.rate_limit_auth_per_minute}/minute") async def demo_login(request: Request, db: AsyncSession = Depends(get_db)) -> AuthResponse: """Issue a backend JWT for the Bruce Wayne demo account — no Google auth required. @@ -153,6 +179,7 @@ async def demo_login(request: Request, db: AsyncSession = Depends(get_db)) -> Au @router.post("/demo-login-peter", response_model=AuthResponse) +@limiter.limit(f"{settings.rate_limit_auth_per_minute}/minute") async def demo_login_peter(request: Request, db: AsyncSession = Depends(get_db)) -> AuthResponse: """Issue a backend JWT for the Peter Parker demo account — no Google auth required.""" from app.services.demo_seed import seed_peter_data @@ -230,6 +257,7 @@ async def update_llm_settings( await db.commit() await db.refresh(current_user) from app.services.cache import invalidate_llm_models_cache + await invalidate_llm_models_cache(current_user.id) return serialize_user_profile(current_user) @@ -291,7 +319,11 @@ async def get_me_stats( """Return current user's join date, expense count, and needs-review count.""" expense_count_result, needs_review_result = await asyncio.gather( db.execute(select(func.count(Expense.id)).where(Expense.user_id == current_user.id)), - db.execute(select(func.count(Expense.id)).where(Expense.user_id == current_user.id, Expense.needs_review.is_(True))), + db.execute( + select(func.count(Expense.id)).where( + Expense.user_id == current_user.id, Expense.needs_review.is_(True) + ) + ), ) return { "created_at": current_user.created_at.isoformat(), @@ -311,18 +343,24 @@ async def search_users( if len(q) < 3: return [] from sqlalchemy import or_ + result = await db.execute( - select(User).where( + select(User) + .where( User.status == "approved", User.id != current_user.id, or_( func.lower(User.email).contains(q), func.lower(User.name).contains(q), ), - ).limit(10) + ) + .limit(10) ) users = result.scalars().all() - return [{"id": str(u.id), "name": u.name, "email": u.email, "avatar_url": u.avatar_url} for u in users] + return [ + {"id": str(u.id), "name": u.name, "email": u.email, "avatar_url": u.avatar_url} + for u in users + ] @router.delete("/me/data") @@ -380,6 +418,11 @@ async def delete_my_account( - Uploaded receipt/statement files on disk - Redis cache entries for this user (best-effort) """ + from app.services.llm.factory import _is_demo_user + + if _is_demo_user(current_user): + raise HTTPException(status_code=403, detail="Demo accounts cannot be deleted.") + import shutil from pathlib import Path @@ -397,6 +440,7 @@ async def delete_my_account( # Best-effort cache eviction — non-fatal if Redis is unreachable try: from app.services.cache import invalidate_analytics_cache + await invalidate_analytics_cache(user_id) except Exception: pass diff --git a/backend/app/api/budgets.py b/backend/app/api/budgets.py index d11e21d..7eae2fb 100644 --- a/backend/app/api/budgets.py +++ b/backend/app/api/budgets.py @@ -46,7 +46,11 @@ class BudgetUpdate(BaseModel): @router.get("") -async def list_budgets(month: str | None = Query(default=None), current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> list[dict]: +async def list_budgets( + month: str | None = Query(default=None), + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> list[dict]: month_value = month_start_from_string(month) month_end = next_month(month_value) result = await db.execute( @@ -74,11 +78,22 @@ async def list_budgets(month: str | None = Query(default=None), current_user: Us overall += amount actuals[category_name] = actuals.get(category_name, 0.0) + amount - return [serialize_budget(budget, category_name=category_name, actual=overall if category_name is None else actuals.get(category_name, 0.0)) for budget, category_name in budget_rows] + return [ + serialize_budget( + budget, + category_name=category_name, + actual=overall if category_name is None else actuals.get(category_name, 0.0), + ) + for budget, category_name in budget_rows + ] @router.post("") -async def create_budget(body: BudgetCreate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: +async def create_budget( + body: BudgetCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: budget = Budget( user_id=current_user.id, name=body.name.strip(), @@ -92,14 +107,25 @@ async def create_budget(body: BudgetCreate, current_user: User = Depends(get_cur await db.flush() category_name = None if budget.category_id: - result = await db.execute(select(Category.name).where(Category.id == budget.category_id, Category.user_id == current_user.id)) + result = await db.execute( + select(Category.name).where( + Category.id == budget.category_id, Category.user_id == current_user.id + ) + ) category_name = result.scalar_one_or_none() return serialize_budget(budget, category_name=category_name) @router.patch("/{budget_id}") -async def update_budget(budget_id: uuid.UUID, body: BudgetUpdate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: - result = await db.execute(select(Budget).where(Budget.id == budget_id, Budget.user_id == current_user.id)) +async def update_budget( + budget_id: uuid.UUID, + body: BudgetUpdate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: + result = await db.execute( + select(Budget).where(Budget.id == budget_id, Budget.user_id == current_user.id) + ) budget = result.scalar_one_or_none() if budget is None: raise HTTPException(status_code=404, detail="Budget not found") @@ -111,14 +137,24 @@ async def update_budget(budget_id: uuid.UUID, body: BudgetUpdate, current_user: await db.flush() category_name = None if budget.category_id: - category_result = await db.execute(select(Category.name).where(Category.id == budget.category_id, Category.user_id == current_user.id)) + category_result = await db.execute( + select(Category.name).where( + Category.id == budget.category_id, Category.user_id == current_user.id + ) + ) category_name = category_result.scalar_one_or_none() return serialize_budget(budget, category_name=category_name) @router.delete("/{budget_id}", status_code=204) -async def delete_budget(budget_id: uuid.UUID, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> None: - result = await db.execute(select(Budget).where(Budget.id == budget_id, Budget.user_id == current_user.id)) +async def delete_budget( + budget_id: uuid.UUID, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> None: + result = await db.execute( + select(Budget).where(Budget.id == budget_id, Budget.user_id == current_user.id) + ) budget = result.scalar_one_or_none() if budget is None: raise HTTPException(status_code=404, detail="Budget not found") diff --git a/backend/app/api/categories.py b/backend/app/api/categories.py index 3bacad4..d80336c 100644 --- a/backend/app/api/categories.py +++ b/backend/app/api/categories.py @@ -90,16 +90,28 @@ class ItemKeywordRuleUpdate(BaseModel): @router.get("") -async def list_categories(current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> list[dict]: +async def list_categories( + current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db) +) -> list[dict]: await ensure_default_categories(db, current_user.id) - result = await db.execute(select(Category).where(Category.user_id == current_user.id).order_by(Category.name.asc())) + result = await db.execute( + select(Category).where(Category.user_id == current_user.id).order_by(Category.name.asc()) + ) return [serialize_category(category) for category in result.scalars().all()] @router.post("") -async def create_category(body: CategoryCreate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: +async def create_category( + body: CategoryCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: await ensure_default_categories(db, current_user.id) - existing = await db.execute(select(Category).where(Category.user_id == current_user.id, Category.name.ilike(body.name.strip()))) + existing = await db.execute( + select(Category).where( + Category.user_id == current_user.id, Category.name.ilike(body.name.strip()) + ) + ) if existing.scalar_one_or_none() is not None: raise HTTPException(status_code=400, detail="Category already exists") is_admin = is_admin_email(current_user.email) @@ -119,8 +131,15 @@ async def create_category(body: CategoryCreate, current_user: User = Depends(get @router.patch("/{category_id}") -async def update_category(category_id: uuid.UUID, body: CategoryUpdate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: - result = await db.execute(select(Category).where(Category.id == category_id, Category.user_id == current_user.id)) +async def update_category( + category_id: uuid.UUID, + body: CategoryUpdate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: + result = await db.execute( + select(Category).where(Category.id == category_id, Category.user_id == current_user.id) + ) category = result.scalar_one_or_none() if category is None: raise HTTPException(status_code=404, detail="Category not found") @@ -133,8 +152,14 @@ async def update_category(category_id: uuid.UUID, body: CategoryUpdate, current_ @router.delete("/{category_id}", status_code=204) -async def delete_category(category_id: uuid.UUID, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> None: - result = await db.execute(select(Category).where(Category.id == category_id, Category.user_id == current_user.id)) +async def delete_category( + category_id: uuid.UUID, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> None: + result = await db.execute( + select(Category).where(Category.id == category_id, Category.user_id == current_user.id) + ) category = result.scalar_one_or_none() if category is None: raise HTTPException(status_code=404, detail="Category not found") @@ -142,7 +167,9 @@ async def delete_category(category_id: uuid.UUID, current_user: User = Depends(g @router.get("/rules") -async def list_rules(current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> list[dict]: +async def list_rules( + current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db) +) -> list[dict]: result = await db.execute( select(MerchantRule, Category.name) .outerjoin(Category, Category.id == MerchantRule.category_id) @@ -152,13 +179,19 @@ async def list_rules(current_user: User = Depends(get_current_user), db: AsyncSe MerchantRule.is_global.is_(True), ) ) - .order_by(MerchantRule.is_global.asc(), MerchantRule.priority.asc(), MerchantRule.created_at.asc()) + .order_by( + MerchantRule.is_global.asc(), MerchantRule.priority.asc(), MerchantRule.created_at.asc() + ) ) return [serialize_rule(rule, category_name) for rule, category_name in result.all()] @router.post("/rules") -async def create_rule(body: MerchantRuleCreate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: +async def create_rule( + body: MerchantRuleCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: is_admin = is_admin_email(current_user.email) rule = MerchantRule( user_id=current_user.id, @@ -174,14 +207,27 @@ async def create_rule(body: MerchantRuleCreate, current_user: User = Depends(get await db.flush() category_name = None if rule.category_id: - category_result = await db.execute(select(Category.name).where(Category.id == rule.category_id, Category.user_id == current_user.id)) + category_result = await db.execute( + select(Category.name).where( + Category.id == rule.category_id, Category.user_id == current_user.id + ) + ) category_name = category_result.scalar_one_or_none() return serialize_rule(rule, category_name) @router.patch("/rules/{rule_id}") -async def update_rule(rule_id: uuid.UUID, body: MerchantRuleUpdate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: - result = await db.execute(select(MerchantRule).where(MerchantRule.id == rule_id, MerchantRule.user_id == current_user.id)) +async def update_rule( + rule_id: uuid.UUID, + body: MerchantRuleUpdate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: + result = await db.execute( + select(MerchantRule).where( + MerchantRule.id == rule_id, MerchantRule.user_id == current_user.id + ) + ) rule = result.scalar_one_or_none() if rule is None: raise HTTPException(status_code=404, detail="Rule not found") @@ -195,14 +241,26 @@ async def update_rule(rule_id: uuid.UUID, body: MerchantRuleUpdate, current_user await db.flush() category_name = None if rule.category_id: - category_result = await db.execute(select(Category.name).where(Category.id == rule.category_id, Category.user_id == current_user.id)) + category_result = await db.execute( + select(Category.name).where( + Category.id == rule.category_id, Category.user_id == current_user.id + ) + ) category_name = category_result.scalar_one_or_none() return serialize_rule(rule, category_name) @router.delete("/rules/{rule_id}", status_code=204) -async def delete_rule(rule_id: uuid.UUID, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> None: - result = await db.execute(select(MerchantRule).where(MerchantRule.id == rule_id, MerchantRule.user_id == current_user.id)) +async def delete_rule( + rule_id: uuid.UUID, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> None: + result = await db.execute( + select(MerchantRule).where( + MerchantRule.id == rule_id, MerchantRule.user_id == current_user.id + ) + ) rule = result.scalar_one_or_none() if rule is None: raise HTTPException(status_code=404, detail="Rule not found") @@ -211,8 +269,11 @@ async def delete_rule(rule_id: uuid.UUID, current_user: User = Depends(get_curre # ── Item keyword rules ─────────────────────────────────────────────────────── + @router.get("/item-rules") -async def list_item_rules(current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> list[dict]: +async def list_item_rules( + current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db) +) -> list[dict]: """Return user's own rules plus all global rules.""" result = await db.execute( select(ItemKeywordRule) @@ -222,15 +283,26 @@ async def list_item_rules(current_user: User = Depends(get_current_user), db: As ItemKeywordRule.is_global.is_(True), ) ) - .order_by(ItemKeywordRule.is_global.asc(), ItemKeywordRule.priority.asc(), ItemKeywordRule.created_at.asc()) + .order_by( + ItemKeywordRule.is_global.asc(), + ItemKeywordRule.priority.asc(), + ItemKeywordRule.created_at.asc(), + ) ) return [serialize_item_rule(rule) for rule in result.scalars().all()] @router.post("/item-rules") -async def create_item_rule(body: ItemKeywordRuleCreate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: +async def create_item_rule( + body: ItemKeywordRuleCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: if body.pattern_type not in _VALID_PATTERN_TYPES: - raise HTTPException(status_code=400, detail=f"Invalid pattern_type. Choose from: {', '.join(sorted(_VALID_PATTERN_TYPES))}") + raise HTTPException( + status_code=400, + detail=f"Invalid pattern_type. Choose from: {', '.join(sorted(_VALID_PATTERN_TYPES))}", + ) # Only admin can create global rules is_admin = is_admin_email(current_user.email) is_global = body.is_global and is_admin @@ -250,15 +322,27 @@ async def create_item_rule(body: ItemKeywordRuleCreate, current_user: User = Dep @router.patch("/item-rules/{rule_id}") -async def update_item_rule(rule_id: uuid.UUID, body: ItemKeywordRuleUpdate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: - result = await db.execute(select(ItemKeywordRule).where(ItemKeywordRule.id == rule_id, ItemKeywordRule.user_id == current_user.id)) +async def update_item_rule( + rule_id: uuid.UUID, + body: ItemKeywordRuleUpdate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: + result = await db.execute( + select(ItemKeywordRule).where( + ItemKeywordRule.id == rule_id, ItemKeywordRule.user_id == current_user.id + ) + ) rule = result.scalar_one_or_none() if rule is None: raise HTTPException(status_code=404, detail="Item rule not found") is_admin = is_admin_email(current_user.email) data = body.model_dump(exclude_unset=True) if "pattern_type" in data and data["pattern_type"] not in _VALID_PATTERN_TYPES: - raise HTTPException(status_code=400, detail=f"Invalid pattern_type. Choose from: {', '.join(sorted(_VALID_PATTERN_TYPES))}") + raise HTTPException( + status_code=400, + detail=f"Invalid pattern_type. Choose from: {', '.join(sorted(_VALID_PATTERN_TYPES))}", + ) for field, value in data.items(): if field == "is_global": # Only admin can promote/demote global flag @@ -271,8 +355,16 @@ async def update_item_rule(rule_id: uuid.UUID, body: ItemKeywordRuleUpdate, curr @router.delete("/item-rules/{rule_id}", status_code=204) -async def delete_item_rule(rule_id: uuid.UUID, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> None: - result = await db.execute(select(ItemKeywordRule).where(ItemKeywordRule.id == rule_id, ItemKeywordRule.user_id == current_user.id)) +async def delete_item_rule( + rule_id: uuid.UUID, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> None: + result = await db.execute( + select(ItemKeywordRule).where( + ItemKeywordRule.id == rule_id, ItemKeywordRule.user_id == current_user.id + ) + ) rule = result.scalar_one_or_none() if rule is None: raise HTTPException(status_code=404, detail="Item rule not found") @@ -281,6 +373,7 @@ async def delete_item_rule(rule_id: uuid.UUID, current_user: User = Depends(get_ # ── Knowledge base (RAG embeddings) ───────────────────────────────────────── + def _serialize_kb_entry(entry: ItemEmbedding) -> dict: return { "id": str(entry.id), @@ -335,7 +428,9 @@ async def upload_knowledge_base( """ is_admin = is_admin_email(current_user.email) if is_global and not is_admin: - raise HTTPException(status_code=403, detail="Only admin can upload global knowledge-base entries") + raise HTTPException( + status_code=403, detail="Only admin can upload global knowledge-base entries" + ) content_bytes = await file.read() try: @@ -359,7 +454,10 @@ async def upload_knowledge_base( entries.append((desc, subcat)) if not entries: - raise HTTPException(status_code=400, detail="No valid entries found. Expected CSV with columns: description,subcategory") + raise HTTPException( + status_code=400, + detail="No valid entries found. Expected CSV with columns: description,subcategory", + ) inserted = await bulk_upsert_embeddings( db, diff --git a/backend/app/api/chat.py b/backend/app/api/chat.py index 0de7056..e6088c8 100644 --- a/backend/app/api/chat.py +++ b/backend/app/api/chat.py @@ -100,7 +100,9 @@ async def stream_chat( raise HTTPException(status_code=400, detail="Message is required") service = ExpenseChatService(db, current_user) return StreamingResponse( - service.stream_chat(current_user.id, session_id=session_id, request=body, http_request=request), + service.stream_chat( + current_user.id, session_id=session_id, request=body, http_request=request + ), media_type="text/event-stream", headers={ "Cache-Control": "no-cache", diff --git a/backend/app/api/expenses.py b/backend/app/api/expenses.py index 0a475e0..8ff7e36 100644 --- a/backend/app/api/expenses.py +++ b/backend/app/api/expenses.py @@ -71,7 +71,9 @@ def _resolve_cadence_fields( if resolved_cadence == CADENCE_CUSTOM: interval = cadence_interval or 3 if interval < 2: - raise HTTPException(status_code=422, detail="cadence_interval must be at least 2 for custom cadence") + raise HTTPException( + status_code=422, detail="cadence_interval must be at least 2 for custom cadence" + ) return interval, None, None if resolved_cadence == CADENCE_PREPAID: months = prepaid_months or 12 @@ -88,11 +90,15 @@ def _normalize_major_purchase(value: bool | None, *, transaction_type: str) -> b return bool(value) and normalize_transaction_type(transaction_type) == TRANSACTION_TYPE_DEBIT -async def _get_existing_receipt_expense(db: AsyncSession, *, user_id: uuid.UUID, receipt_id: uuid.UUID, source: str = "receipt") -> tuple[Expense, str | None] | None: +async def _get_existing_receipt_expense( + db: AsyncSession, *, user_id: uuid.UUID, receipt_id: uuid.UUID, source: str = "receipt" +) -> tuple[Expense, str | None] | None: result = await db.execute( select(Expense, Category.name) .outerjoin(Category, Category.id == Expense.category_id) - .where(Expense.user_id == user_id, Expense.receipt_id == receipt_id, Expense.source == source) + .where( + Expense.user_id == user_id, Expense.receipt_id == receipt_id, Expense.source == source + ) .order_by(Expense.created_at.asc()) .limit(1) ) @@ -100,7 +106,9 @@ async def _get_existing_receipt_expense(db: AsyncSession, *, user_id: uuid.UUID, return (row[0], row[1]) if row is not None else None -async def _get_expense_with_category_name(db: AsyncSession, *, user_id: uuid.UUID, expense_id: uuid.UUID) -> tuple[Expense, str | None] | None: +async def _get_expense_with_category_name( + db: AsyncSession, *, user_id: uuid.UUID, expense_id: uuid.UUID +) -> tuple[Expense, str | None] | None: result = await db.execute( select(Expense, Category.name) .outerjoin(Category, Category.id == Expense.category_id) @@ -123,9 +131,9 @@ class ExpenseCreate(BaseModel): notes: str | None = None items: list[dict] | None = None cadence: str | None = None - cadence_interval: int | None = None # for cadence="custom", must be >= 2 - prepaid_months: int | None = None # for cadence="prepaid" - prepaid_start_date: str | None = None # ISO date; defaults to expense_date for prepaid + cadence_interval: int | None = None # for cadence="custom", must be >= 2 + prepaid_months: int | None = None # for cadence="prepaid" + prepaid_start_date: str | None = None # ISO date; defaults to expense_date for prepaid recurring_variable: bool = False recurring_auto_add: bool = False is_major_purchase: bool = False @@ -194,7 +202,12 @@ async def list_expenses( try: lid = uuid.UUID(p) # Verify membership - m = await db.execute(select(LedgerMembership).where(LedgerMembership.ledger_id == lid, LedgerMembership.user_id == current_user.id)) + m = await db.execute( + select(LedgerMembership).where( + LedgerMembership.ledger_id == lid, + LedgerMembership.user_id == current_user.id, + ) + ) if m.scalar_one_or_none(): parsed_ledger_ids.append(lid) except ValueError: @@ -221,12 +234,22 @@ async def list_expenses( conditions.append(sql_and(Expense.user_id == current_user.id, Expense.ledger_id.is_(None))) base = base.where(sql_or(*conditions)) - base = apply_expense_filters(base, user_id=None, month=month, category_id=category_id, transaction_type=transaction_type, cadence=cadence, review_only=review_only, search=search).order_by(Expense.expense_date.desc(), Expense.created_at.desc()) + base = apply_expense_filters( + base, + user_id=None, + month=month, + category_id=category_id, + transaction_type=transaction_type, + cadence=cadence, + review_only=review_only, + search=search, + ).order_by(Expense.expense_date.desc(), Expense.created_at.desc()) result = await db.execute(base) rows = result.all() if show_duplicates: from collections import defaultdict + key_map: dict[tuple, list] = defaultdict(list) for row in rows: exp = row[0] @@ -246,20 +269,45 @@ async def list_expenses( added_by = None if expense.user_id != current_user.id and expense.user_id in shared_user_map: u = shared_user_map[expense.user_id] - added_by = {"id": str(u.id), "name": u.name, "email": u.email, "avatar_url": u.avatar_url} - items.append(serialize_expense(expense, category_name=category_name, receipt_filename=receipt_filename, ledger_name=ledger_name, added_by=added_by)) + added_by = { + "id": str(u.id), + "name": u.name, + "email": u.email, + "avatar_url": u.avatar_url, + } + items.append( + serialize_expense( + expense, + category_name=category_name, + receipt_filename=receipt_filename, + ledger_name=ledger_name, + added_by=added_by, + ) + ) return {"items": items, "total": len(items)} @router.get("/review-queue") -async def review_queue(current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: - receipt_result = await db.execute(select(Receipt).where(Receipt.user_id == current_user.id, (Receipt.needs_review.is_(True)) | (Receipt.extraction_status != "finalized")).order_by(Receipt.created_at.desc())) +async def review_queue( + current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db) +) -> dict: + receipt_result = await db.execute( + select(Receipt) + .where( + Receipt.user_id == current_user.id, + (Receipt.needs_review.is_(True)) | (Receipt.extraction_status != "finalized"), + ) + .order_by(Receipt.created_at.desc()) + ) expense_result = await db.execute( select(Expense, Category.name, Receipt.original_filename) .outerjoin(Category, Category.id == Expense.category_id) .outerjoin(Receipt, Receipt.id == Expense.receipt_id) - .where(Expense.user_id == current_user.id, (Expense.needs_review.is_(True)) | (Expense.category_id.is_(None))) + .where( + Expense.user_id == current_user.id, + (Expense.needs_review.is_(True)) | (Expense.category_id.is_(None)), + ) .order_by(Expense.expense_date.desc(), Expense.created_at.desc()) ) return { @@ -275,28 +323,64 @@ async def review_queue(current_user: User = Depends(get_current_user), db: Async } for receipt in receipt_result.scalars().all() ], - "expenses": [serialize_expense(expense, category_name=category_name, receipt_filename=receipt_filename) for expense, category_name, receipt_filename in expense_result.all()], + "expenses": [ + serialize_expense( + expense, category_name=category_name, receipt_filename=receipt_filename + ) + for expense, category_name, receipt_filename in expense_result.all() + ], } @router.get("/export") -async def export_expenses(export_format: str = Query(default="json"), month: str | None = Query(default=None), current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> Response: +async def export_expenses( + export_format: str = Query(default="json"), + month: str | None = Query(default=None), + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> Response: export_payload = await build_expense_export_payload(db, user_id=current_user.id, month=month) items = export_payload["items"] if export_format == "csv": output = io.StringIO() - fieldnames = ["id", "expense_date", "merchant", "description", "amount", "signed_amount", "transaction_type", "currency", "cadence", "cadence_override", "is_major_purchase", "category_name", "source", "needs_review", "is_recurring", "receipt_filename", "notes"] + fieldnames = [ + "id", + "expense_date", + "merchant", + "description", + "amount", + "signed_amount", + "transaction_type", + "currency", + "cadence", + "cadence_override", + "is_major_purchase", + "category_name", + "source", + "needs_review", + "is_recurring", + "receipt_filename", + "notes", + ] writer = csv.DictWriter(output, fieldnames=fieldnames) writer.writeheader() writer.writerows({key: item.get(key) for key in fieldnames} for item in items) - return StreamingResponse(iter([output.getvalue()]), media_type="text/csv", headers={"Content-Disposition": "attachment; filename=spendhound-expenses.csv"}) + return StreamingResponse( + iter([output.getvalue()]), + media_type="text/csv", + headers={"Content-Disposition": "attachment; filename=spendhound-expenses.csv"}, + ) return JSONResponse(export_payload) @router.post("") -async def create_expense(body: ExpenseCreate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: +async def create_expense( + body: ExpenseCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: await ensure_default_categories(db, current_user.id) transaction_type = normalize_transaction_type(body.transaction_type) cadence_override = _parse_cadence_override(body.cadence) @@ -312,20 +396,27 @@ async def create_expense(body: ExpenseCreate, current_user: User = Depends(get_c recurring_variable=body.recurring_variable, recurring_auto_add=body.recurring_auto_add, ) - category = await resolve_category(db, current_user.id, category_id=body.category_id, category_name=body.category_name, merchant=body.merchant, transaction_type=transaction_type) + category = await resolve_category( + db, + current_user.id, + category_id=body.category_id, + category_name=body.category_name, + merchant=body.merchant, + transaction_type=transaction_type, + ) # Validate ledger membership if a ledger is specified ledger_id = body.ledger_id ledger_name: str | None = None if ledger_id: - ledger_result = await db.execute( - select(Ledger).where(Ledger.id == ledger_id) - ) + ledger_result = await db.execute(select(Ledger).where(Ledger.id == ledger_id)) ledger = ledger_result.scalar_one_or_none() if not ledger: raise HTTPException(status_code=404, detail="Ledger not found") membership = await db.execute( - select(LedgerMembership).where(LedgerMembership.ledger_id == ledger_id, LedgerMembership.user_id == current_user.id) + select(LedgerMembership).where( + LedgerMembership.ledger_id == ledger_id, LedgerMembership.user_id == current_user.id + ) ) if not membership.scalar_one_or_none(): raise HTTPException(status_code=403, detail="You are not a member of this ledger") @@ -351,30 +442,53 @@ async def create_expense(body: ExpenseCreate, current_user: User = Depends(get_c prepaid_start_date=resolved_prepaid_start, recurring_variable=recurring_variable, recurring_auto_add=recurring_auto_add, - is_major_purchase=_normalize_major_purchase(body.is_major_purchase, transaction_type=transaction_type), + is_major_purchase=_normalize_major_purchase( + body.is_major_purchase, transaction_type=transaction_type + ), ledger_id=ledger_id, ) db.add(expense) await db.flush() - await replace_expense_items(db, expense, body.items, category_name=category.name if category else body.category_name) + await replace_expense_items( + db, expense, body.items, category_name=category.name if category else body.category_name + ) if ledger_id: - db.add(LedgerAuditLog(ledger_id=ledger_id, expense_id=expense.id, user_id=current_user.id, action="created")) + db.add( + LedgerAuditLog( + ledger_id=ledger_id, + expense_id=expense.id, + user_id=current_user.id, + action="created", + ) + ) await recompute_recurring_expenses(db, current_user.id) await db.refresh(expense) await invalidate_analytics_cache(current_user.id) - return serialize_expense(expense, category_name=category.name if category else None, ledger_name=ledger_name) + return serialize_expense( + expense, category_name=category.name if category else None, ledger_name=ledger_name + ) @router.post("/from-receipt") -async def create_expense_from_receipt(body: ReceiptExpenseCreate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: - receipt_result = await db.execute(select(Receipt).where(Receipt.id == body.receipt_id, Receipt.user_id == current_user.id).with_for_update()) +async def create_expense_from_receipt( + body: ReceiptExpenseCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: + receipt_result = await db.execute( + select(Receipt) + .where(Receipt.id == body.receipt_id, Receipt.user_id == current_user.id) + .with_for_update() + ) receipt = receipt_result.scalar_one_or_none() if receipt is None: raise HTTPException(status_code=404, detail="Receipt not found") if receipt.document_kind != "receipt": raise HTTPException(status_code=400, detail="This document is not a receipt upload") - existing_expense_row = await _get_existing_receipt_expense(db, user_id=current_user.id, receipt_id=receipt.id) + existing_expense_row = await _get_existing_receipt_expense( + db, user_id=current_user.id, receipt_id=receipt.id + ) if existing_expense_row is not None: existing_expense, existing_category_name = existing_expense_row if receipt.extraction_status != "finalized": @@ -382,7 +496,11 @@ async def create_expense_from_receipt(body: ReceiptExpenseCreate, current_user: receipt.needs_review = existing_expense.needs_review receipt.finalized_at = receipt.finalized_at or datetime.now(UTC) await db.flush() - return serialize_expense(existing_expense, category_name=existing_category_name, receipt_filename=receipt.original_filename) + return serialize_expense( + existing_expense, + category_name=existing_category_name, + receipt_filename=receipt.original_filename, + ) if receipt.extraction_status == "finalized": raise HTTPException(status_code=409, detail="Receipt has already been finalized") @@ -401,8 +519,17 @@ async def create_expense_from_receipt(body: ReceiptExpenseCreate, current_user: recurring_variable=body.recurring_variable, recurring_auto_add=body.recurring_auto_add, ) - category = await resolve_category(db, current_user.id, category_id=body.category_id, category_name=body.category_name, merchant=body.merchant, transaction_type=transaction_type) - confidence = body.confidence if body.confidence is not None else receipt.extraction_confidence or 0.5 + category = await resolve_category( + db, + current_user.id, + category_id=body.category_id, + category_name=body.category_name, + merchant=body.merchant, + transaction_type=transaction_type, + ) + confidence = ( + body.confidence if body.confidence is not None else receipt.extraction_confidence or 0.5 + ) expense = Expense( user_id=current_user.id, merchant=body.merchant.strip(), @@ -424,7 +551,9 @@ async def create_expense_from_receipt(body: ReceiptExpenseCreate, current_user: prepaid_start_date=resolved_prepaid_start, recurring_variable=recurring_variable, recurring_auto_add=recurring_auto_add, - is_major_purchase=_normalize_major_purchase(body.is_major_purchase, transaction_type=transaction_type), + is_major_purchase=_normalize_major_purchase( + body.is_major_purchase, transaction_type=transaction_type + ), ) db.add(expense) receipt.preview_data = { @@ -439,24 +568,45 @@ async def create_expense_from_receipt(body: ReceiptExpenseCreate, current_user: "cadence": cadence_override or CADENCE_ONE_TIME, "recurring_variable": recurring_variable, "recurring_auto_add": recurring_auto_add, - "is_major_purchase": _normalize_major_purchase(body.is_major_purchase, transaction_type=transaction_type), - "items": body.items if body.items is not None else (receipt.preview_data or {}).get("items", []), + "is_major_purchase": _normalize_major_purchase( + body.is_major_purchase, transaction_type=transaction_type + ), + "items": body.items + if body.items is not None + else (receipt.preview_data or {}).get("items", []), "confidence": confidence, } receipt.needs_review = expense.needs_review receipt.extraction_status = "finalized" receipt.finalized_at = datetime.now(UTC) await db.flush() - await replace_expense_items(db, expense, body.items if body.items is not None else (receipt.preview_data or {}).get("items", []), category_name=category.name if category else body.category_name) + await replace_expense_items( + db, + expense, + body.items if body.items is not None else (receipt.preview_data or {}).get("items", []), + category_name=category.name if category else body.category_name, + ) await recompute_recurring_expenses(db, current_user.id) await db.refresh(expense) await invalidate_analytics_cache(current_user.id) - return serialize_expense(expense, category_name=category.name if category else None, receipt_filename=receipt.original_filename) + return serialize_expense( + expense, + category_name=category.name if category else None, + receipt_filename=receipt.original_filename, + ) @router.post("/from-statement-entry") -async def create_expense_from_statement_entry(body: StatementExpenseCreate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: - receipt_result = await db.execute(select(Receipt).where(Receipt.id == body.receipt_id, Receipt.user_id == current_user.id).with_for_update()) +async def create_expense_from_statement_entry( + body: StatementExpenseCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: + receipt_result = await db.execute( + select(Receipt) + .where(Receipt.id == body.receipt_id, Receipt.user_id == current_user.id) + .with_for_update() + ) receipt = receipt_result.scalar_one_or_none() if receipt is None: raise HTTPException(status_code=404, detail="Statement import not found") @@ -471,11 +621,17 @@ async def create_expense_from_statement_entry(body: StatementExpenseCreate, curr if entry.get("status") == "finalized": saved_expense_id = entry.get("saved_expense_id") if saved_expense_id: - existing_expense_row = await _get_expense_with_category_name(db, user_id=current_user.id, expense_id=uuid.UUID(str(saved_expense_id))) + existing_expense_row = await _get_expense_with_category_name( + db, user_id=current_user.id, expense_id=uuid.UUID(str(saved_expense_id)) + ) if existing_expense_row is not None: existing_expense, existing_category_name = existing_expense_row return { - "expense": serialize_expense(existing_expense, category_name=existing_category_name, receipt_filename=receipt.original_filename), + "expense": serialize_expense( + existing_expense, + category_name=existing_category_name, + receipt_filename=receipt.original_filename, + ), "statement": serialize_receipt(receipt), } raise HTTPException(status_code=409, detail="Statement entry has already been finalized") @@ -494,8 +650,19 @@ async def create_expense_from_statement_entry(body: StatementExpenseCreate, curr recurring_variable=body.recurring_variable, recurring_auto_add=body.recurring_auto_add, ) - category = await resolve_category(db, current_user.id, category_id=body.category_id, category_name=body.category_name, merchant=body.merchant, transaction_type=transaction_type) - confidence = body.confidence if body.confidence is not None else float(entry.get("confidence") or receipt.extraction_confidence or 0.5) + category = await resolve_category( + db, + current_user.id, + category_id=body.category_id, + category_name=body.category_name, + merchant=body.merchant, + transaction_type=transaction_type, + ) + confidence = ( + body.confidence + if body.confidence is not None + else float(entry.get("confidence") or receipt.extraction_confidence or 0.5) + ) expense = Expense( user_id=current_user.id, merchant=body.merchant.strip(), @@ -517,7 +684,9 @@ async def create_expense_from_statement_entry(body: StatementExpenseCreate, curr prepaid_start_date=resolved_prepaid_start, recurring_variable=recurring_variable, recurring_auto_add=recurring_auto_add, - is_major_purchase=_normalize_major_purchase(body.is_major_purchase, transaction_type=transaction_type), + is_major_purchase=_normalize_major_purchase( + body.is_major_purchase, transaction_type=transaction_type + ), ) db.add(expense) await db.flush() @@ -535,7 +704,9 @@ async def create_expense_from_statement_entry(body: StatementExpenseCreate, curr "cadence": cadence_override or CADENCE_ONE_TIME, "recurring_variable": recurring_variable, "recurring_auto_add": recurring_auto_add, - "is_major_purchase": _normalize_major_purchase(body.is_major_purchase, transaction_type=transaction_type), + "is_major_purchase": _normalize_major_purchase( + body.is_major_purchase, transaction_type=transaction_type + ), "confidence": confidence, "status": "finalized", "saved_expense_id": str(expense.id), @@ -554,13 +725,21 @@ async def create_expense_from_statement_entry(body: StatementExpenseCreate, curr await db.refresh(expense) await invalidate_analytics_cache(current_user.id) return { - "expense": serialize_expense(expense, category_name=category.name if category else None, receipt_filename=receipt.original_filename), + "expense": serialize_expense( + expense, + category_name=category.name if category else None, + receipt_filename=receipt.original_filename, + ), "statement": serialize_receipt(receipt), } @router.get("/{expense_id}") -async def get_expense(expense_id: uuid.UUID, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: +async def get_expense( + expense_id: uuid.UUID, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: result = await db.execute( select(Expense) .options(selectinload(Expense.items), selectinload(Expense.receipt)) @@ -571,7 +750,11 @@ async def get_expense(expense_id: uuid.UUID, current_user: User = Depends(get_cu raise HTTPException(status_code=404, detail="Expense not found") category_name = None if expense.category_id: - category_result = await db.execute(select(Category.name).where(Category.id == expense.category_id, Category.user_id == current_user.id)) + category_result = await db.execute( + select(Category.name).where( + Category.id == expense.category_id, Category.user_id == current_user.id + ) + ) category_name = category_result.scalar_one_or_none() receipt = expense.receipt return serialize_expense( @@ -586,15 +769,28 @@ async def get_expense(expense_id: uuid.UUID, current_user: User = Depends(get_cu @router.patch("/{expense_id}") -async def update_expense(expense_id: uuid.UUID, body: ExpenseUpdate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: - result = await db.execute(select(Expense).where(Expense.id == expense_id, Expense.user_id == current_user.id)) +async def update_expense( + expense_id: uuid.UUID, + body: ExpenseUpdate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: + result = await db.execute( + select(Expense).where(Expense.id == expense_id, Expense.user_id == current_user.id) + ) expense = result.scalar_one_or_none() if expense is None: raise HTTPException(status_code=404, detail="Expense not found") data = body.model_dump(exclude_unset=True) - next_transaction_type = normalize_transaction_type(data.get("transaction_type"), default=expense.transaction_type) - next_cadence = _parse_cadence_override(data.get("cadence")) if "cadence" in data else (expense.cadence_override or expense.cadence) + next_transaction_type = normalize_transaction_type( + data.get("transaction_type"), default=expense.transaction_type + ) + next_cadence = ( + _parse_cadence_override(data.get("cadence")) + if "cadence" in data + else (expense.cadence_override or expense.cadence) + ) recurring_variable, recurring_auto_add = normalize_recurring_settings( next_cadence, recurring_variable=data.get("recurring_variable", expense.recurring_variable), @@ -611,7 +807,9 @@ async def update_expense(expense_id: uuid.UUID, body: ExpenseUpdate, current_use if "cadence_interval" in data and next_cadence == CADENCE_CUSTOM: interval = data["cadence_interval"] or 3 if interval < 2: - raise HTTPException(status_code=422, detail="cadence_interval must be at least 2 for custom cadence") + raise HTTPException( + status_code=422, detail="cadence_interval must be at least 2 for custom cadence" + ) expense.cadence_interval = interval if "prepaid_months" in data and next_cadence == CADENCE_PREPAID: expense.prepaid_months = data["prepaid_months"] @@ -625,9 +823,22 @@ async def update_expense(expense_id: uuid.UUID, body: ExpenseUpdate, current_use category_name = data.get("category_name") if "category_name" in data else None merchant = data.get("merchant", expense.merchant) if "category_id" in data or "category_name" in data: - category = await resolve_category(db, current_user.id, category_id=category_id, category_name=category_name, merchant=merchant, transaction_type=next_transaction_type) + category = await resolve_category( + db, + current_user.id, + category_id=category_id, + category_name=category_name, + merchant=merchant, + transaction_type=next_transaction_type, + ) else: - category = await resolve_category(db, current_user.id, category_id=expense.category_id, merchant=merchant, transaction_type=next_transaction_type) + category = await resolve_category( + db, + current_user.id, + category_id=expense.category_id, + merchant=merchant, + transaction_type=next_transaction_type, + ) expense.category_id = category.id if category else None for field, value in data.items(): if field == "amount" and value is not None: @@ -637,33 +848,61 @@ async def update_expense(expense_id: uuid.UUID, body: ExpenseUpdate, current_use elif field == "expense_date" and value is not None: expense.expense_date = datetime.fromisoformat(value).date() elif field == "is_major_purchase": - expense.is_major_purchase = _normalize_major_purchase(value, transaction_type=next_transaction_type) + expense.is_major_purchase = _normalize_major_purchase( + value, transaction_type=next_transaction_type + ) elif field == "cadence": continue - elif field in {"recurring_variable", "recurring_auto_add", "cadence_interval", "prepaid_months", "prepaid_start_date"}: + elif field in { + "recurring_variable", + "recurring_auto_add", + "cadence_interval", + "prepaid_months", + "prepaid_start_date", + }: continue elif field not in {"category_id", "category_name"}: setattr(expense, field, value) current_category = None if expense.category_id: - category_result = await db.execute(select(Category).where(Category.id == expense.category_id, Category.user_id == current_user.id)) + category_result = await db.execute( + select(Category).where( + Category.id == expense.category_id, Category.user_id == current_user.id + ) + ) current_category = category_result.scalar_one_or_none() - expense.needs_review = body.needs_review if body.needs_review is not None else expense_requires_review(current_category, expense.confidence, expense.source) + expense.needs_review = ( + body.needs_review + if body.needs_review is not None + else expense_requires_review(current_category, expense.confidence, expense.source) + ) await db.flush() await recompute_recurring_expenses(db, current_user.id) await db.refresh(expense) receipt_filename = None if expense.receipt_id: - receipt_result = await db.execute(select(Receipt.original_filename).where(Receipt.id == expense.receipt_id)) + receipt_result = await db.execute( + select(Receipt.original_filename).where(Receipt.id == expense.receipt_id) + ) receipt_filename = receipt_result.scalar_one_or_none() await invalidate_analytics_cache(current_user.id) - return serialize_expense(expense, category_name=current_category.name if current_category else None, receipt_filename=receipt_filename) + return serialize_expense( + expense, + category_name=current_category.name if current_category else None, + receipt_filename=receipt_filename, + ) @router.delete("/{expense_id}", status_code=204) -async def delete_expense(expense_id: uuid.UUID, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> None: - result = await db.execute(select(Expense).where(Expense.id == expense_id, Expense.user_id == current_user.id)) +async def delete_expense( + expense_id: uuid.UUID, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> None: + result = await db.execute( + select(Expense).where(Expense.id == expense_id, Expense.user_id == current_user.id) + ) expense = result.scalar_one_or_none() if expense is None: raise HTTPException(status_code=404, detail="Expense not found") diff --git a/backend/app/api/ledgers.py b/backend/app/api/ledgers.py index 9e97b7b..e8eb38e 100644 --- a/backend/app/api/ledgers.py +++ b/backend/app/api/ledgers.py @@ -24,21 +24,33 @@ logger = structlog.get_logger(__name__) -async def _get_accessible_ledger(db: AsyncSession, *, ledger_id: uuid.UUID, user_id: uuid.UUID) -> Ledger: +async def _get_accessible_ledger( + db: AsyncSession, *, ledger_id: uuid.UUID, user_id: uuid.UUID +) -> Ledger: """Return ledger if user is a member; raise 404/403 otherwise.""" result = await db.execute(select(Ledger).where(Ledger.id == ledger_id)) ledger = result.scalar_one_or_none() if not ledger: raise HTTPException(status_code=404, detail="Ledger not found") membership = await db.execute( - select(LedgerMembership).where(LedgerMembership.ledger_id == ledger_id, LedgerMembership.user_id == user_id) + select(LedgerMembership).where( + LedgerMembership.ledger_id == ledger_id, LedgerMembership.user_id == user_id + ) ) if not membership.scalar_one_or_none(): raise HTTPException(status_code=403, detail="You are not a member of this ledger") return ledger -async def _log_audit(db: AsyncSession, *, ledger_id: uuid.UUID, user_id: uuid.UUID, expense_id: uuid.UUID | None, action: str, changes: dict | None = None) -> None: +async def _log_audit( + db: AsyncSession, + *, + ledger_id: uuid.UUID, + user_id: uuid.UUID, + expense_id: uuid.UUID | None, + action: str, + changes: dict | None = None, +) -> None: log = LedgerAuditLog( ledger_id=ledger_id, expense_id=expense_id, @@ -126,7 +138,9 @@ async def list_ledgers( memberships_by_ledger.setdefault(m.ledger_id, []).append(m) return { - "ledgers": [_serialize_ledger(ldg, memberships_by_ledger.get(ldg.id, [])) for ldg in ledgers] + "ledgers": [ + _serialize_ledger(ldg, memberships_by_ledger.get(ldg.id, [])) for ldg in ledgers + ] } @@ -147,14 +161,18 @@ async def create_ledger( partner_check = await db.execute( select(PartnerRequest).where( or_( - (PartnerRequest.requester_id == current_user.id) & (PartnerRequest.recipient_id == uid), - (PartnerRequest.requester_id == uid) & (PartnerRequest.recipient_id == current_user.id), + (PartnerRequest.requester_id == current_user.id) + & (PartnerRequest.recipient_id == uid), + (PartnerRequest.requester_id == uid) + & (PartnerRequest.recipient_id == current_user.id), ), PartnerRequest.status == PARTNER_STATUS_ACCEPTED, ) ) if not partner_check.scalar_one_or_none(): - raise HTTPException(status_code=400, detail=f"User {uid} is not your expense partner") + raise HTTPException( + status_code=400, detail=f"User {uid} is not your expense partner" + ) partner_ids.add(uid) ledger = Ledger(name=body.name.strip(), type=body.type, created_by=current_user.id) @@ -171,7 +189,9 @@ async def create_ledger( await db.commit() await db.refresh(ledger) - membership_result = await db.execute(select(LedgerMembership).where(LedgerMembership.ledger_id == ledger.id)) + membership_result = await db.execute( + select(LedgerMembership).where(LedgerMembership.ledger_id == ledger.id) + ) memberships = membership_result.scalars().all() user_ids = [m.user_id for m in memberships] user_result = await db.execute(select(User).where(User.id.in_(user_ids))) @@ -233,8 +253,10 @@ async def add_ledger_members( partner_check = await db.execute( select(PartnerRequest).where( or_( - (PartnerRequest.requester_id == current_user.id) & (PartnerRequest.recipient_id == uid), - (PartnerRequest.requester_id == uid) & (PartnerRequest.recipient_id == current_user.id), + (PartnerRequest.requester_id == current_user.id) + & (PartnerRequest.recipient_id == uid), + (PartnerRequest.requester_id == uid) + & (PartnerRequest.recipient_id == current_user.id), ), PartnerRequest.status == PARTNER_STATUS_ACCEPTED, ) @@ -242,14 +264,18 @@ async def add_ledger_members( if not partner_check.scalar_one_or_none(): raise HTTPException(status_code=400, detail=f"User {uid} is not your expense partner") existing = await db.execute( - select(LedgerMembership).where(LedgerMembership.ledger_id == ledger_id, LedgerMembership.user_id == uid) + select(LedgerMembership).where( + LedgerMembership.ledger_id == ledger_id, LedgerMembership.user_id == uid + ) ) if not existing.scalar_one_or_none(): db.add(LedgerMembership(ledger_id=ledger_id, user_id=uid, role="member")) await db.commit() - membership_result = await db.execute(select(LedgerMembership).where(LedgerMembership.ledger_id == ledger_id)) + membership_result = await db.execute( + select(LedgerMembership).where(LedgerMembership.ledger_id == ledger_id) + ) memberships = membership_result.scalars().all() user_ids = [m.user_id for m in memberships] user_result = await db.execute(select(User).where(User.id.in_(user_ids))) @@ -268,9 +294,13 @@ async def leave_ledger( """Leave a shared ledger. The owner must delete instead.""" ledger = await _get_accessible_ledger(db, ledger_id=ledger_id, user_id=current_user.id) if ledger.created_by == current_user.id: - raise HTTPException(status_code=400, detail="You are the owner — delete the ledger instead of leaving") + raise HTTPException( + status_code=400, detail="You are the owner — delete the ledger instead of leaving" + ) membership = await db.execute( - select(LedgerMembership).where(LedgerMembership.ledger_id == ledger_id, LedgerMembership.user_id == current_user.id) + select(LedgerMembership).where( + LedgerMembership.ledger_id == ledger_id, LedgerMembership.user_id == current_user.id + ) ) m = membership.scalar_one_or_none() if m: @@ -311,8 +341,12 @@ async def get_audit_log( "id": str(log.user_id), "name": user_map[log.user_id].name if log.user_id in user_map else None, "email": user_map[log.user_id].email if log.user_id in user_map else None, - "avatar_url": user_map[log.user_id].avatar_url if log.user_id in user_map else None, - } if log.user_id else None, + "avatar_url": user_map[log.user_id].avatar_url + if log.user_id in user_map + else None, + } + if log.user_id + else None, "changes": json.loads(log.changes) if log.changes else None, "created_at": log.created_at.isoformat(), } @@ -333,9 +367,7 @@ async def move_expenses( moved = 0 for eid in body.expense_ids: - result = await db.execute( - select(Expense).where(Expense.id == eid) - ) + result = await db.execute(select(Expense).where(Expense.id == eid)) expense = result.scalar_one_or_none() if not expense: continue @@ -344,7 +376,10 @@ async def move_expenses( has_access = expense.user_id == current_user.id if not has_access and expense.ledger_id: m = await db.execute( - select(LedgerMembership).where(LedgerMembership.ledger_id == expense.ledger_id, LedgerMembership.user_id == current_user.id) + select(LedgerMembership).where( + LedgerMembership.ledger_id == expense.ledger_id, + LedgerMembership.user_id == current_user.id, + ) ) has_access = m.scalar_one_or_none() is not None @@ -354,9 +389,25 @@ async def move_expenses( old_ledger_id = expense.ledger_id expense.ledger_id = body.target_ledger_id if body.target_ledger_id: - await _log_audit(db, ledger_id=body.target_ledger_id, user_id=current_user.id, expense_id=eid, action="moved_in", changes={"from_ledger_id": str(old_ledger_id) if old_ledger_id else None}) + await _log_audit( + db, + ledger_id=body.target_ledger_id, + user_id=current_user.id, + expense_id=eid, + action="moved_in", + changes={"from_ledger_id": str(old_ledger_id) if old_ledger_id else None}, + ) if old_ledger_id: - await _log_audit(db, ledger_id=old_ledger_id, user_id=current_user.id, expense_id=eid, action="moved_out", changes={"to_ledger_id": str(body.target_ledger_id) if body.target_ledger_id else None}) + await _log_audit( + db, + ledger_id=old_ledger_id, + user_id=current_user.id, + expense_id=eid, + action="moved_out", + changes={ + "to_ledger_id": str(body.target_ledger_id) if body.target_ledger_id else None + }, + ) moved += 1 await db.commit() @@ -376,9 +427,7 @@ async def copy_expenses( copied = 0 for eid in body.expense_ids: - result = await db.execute( - select(Expense).where(Expense.id == eid) - ) + result = await db.execute(select(Expense).where(Expense.id == eid)) src = result.scalar_one_or_none() if not src: continue @@ -413,17 +462,26 @@ async def copy_expenses( await db.flush() for item in src_items: - db.add(ExpenseItem( - expense_id=new_expense.id, - description=item.description, - quantity=item.quantity, - unit_price=item.unit_price, - total_price=item.total_price, - subcategory=item.subcategory, - )) + db.add( + ExpenseItem( + expense_id=new_expense.id, + description=item.description, + quantity=item.quantity, + unit_price=item.unit_price, + total_price=item.total_price, + subcategory=item.subcategory, + ) + ) if target_id: - await _log_audit(db, ledger_id=target_id, user_id=current_user.id, expense_id=new_expense.id, action="copied_in", changes={"source_expense_id": str(eid)}) + await _log_audit( + db, + ledger_id=target_id, + user_id=current_user.id, + expense_id=new_expense.id, + action="copied_in", + changes={"source_expense_id": str(eid)}, + ) copied += 1 await db.commit() diff --git a/backend/app/api/llm_models.py b/backend/app/api/llm_models.py index e57a26a..9ee8ca0 100644 --- a/backend/app/api/llm_models.py +++ b/backend/app/api/llm_models.py @@ -31,10 +31,28 @@ # Helpers # --------------------------------------------------------------------------- -OPENAI_INCLUDE_PREFIXES = ("gpt-4o", "gpt-4o-mini", "gpt-4-turbo", "gpt-4", "gpt-3.5-turbo", "o1", "o3", "o4") +OPENAI_INCLUDE_PREFIXES = ( + "gpt-4o", + "gpt-4o-mini", + "gpt-4-turbo", + "gpt-4", + "gpt-3.5-turbo", + "o1", + "o3", + "o4", +) OPENAI_EXCLUDE_SUBSTRINGS = ( - "dall-e", "whisper", "tts", "embedding", "moderation", "audio", - "babbage", "davinci", "search", "realtime", "transcribe", + "dall-e", + "whisper", + "tts", + "embedding", + "moderation", + "audio", + "babbage", + "davinci", + "search", + "realtime", + "transcribe", ) OPENAI_VISION_SUBSTRINGS = ("gpt-4o", "gpt-4-turbo", "o1", "o3", "o4") @@ -54,6 +72,7 @@ def _get_effective_api_key( if user.llm_api_key: try: from app.services.llm.encryption import decrypt_api_key + return decrypt_api_key(user.llm_api_key) except Exception: pass @@ -78,6 +97,7 @@ def _get_effective_api_key( # Provider helpers # --------------------------------------------------------------------------- + async def _list_openai(api_key: str) -> list[LLMModelInfo]: """Fetch and filter models from the OpenAI API.""" try: @@ -140,7 +160,12 @@ async def _list_anthropic(api_key: str) -> list[LLMModelInfo]: display_name: str = m.get("display_name", model_id) if not model_id: continue - vision = "claude-3" in model_id or "claude-opus" in model_id or "claude-sonnet" in model_id or "claude-haiku" in model_id + vision = ( + "claude-3" in model_id + or "claude-opus" in model_id + or "claude-sonnet" in model_id + or "claude-haiku" in model_id + ) models.append(LLMModelInfo(id=model_id, name=display_name, supports_vision=vision)) return sorted(models, key=lambda m: m.id)[:_MAX_MODELS] @@ -335,11 +360,9 @@ async def _list_mistral(api_key: str) -> list[LLMModelInfo]: async def _list_nebius(api_key: str, base_url: str | None) -> list[LLMModelInfo]: """Fetch models from the Nebius (OpenAI-compatible) API.""" - nebius_base = ( - base_url - or settings.nebius_base_url - or "https://api.studio.nebius.ai" - ).rstrip("/") + nebius_base = (base_url or settings.nebius_base_url or "https://api.studio.nebius.ai").rstrip( + "/" + ) try: async with httpx.AsyncClient(timeout=_TIMEOUT) as client: @@ -398,10 +421,13 @@ async def _list_ollama(base_url: str | None) -> list[LLMModelInfo]: # Route # --------------------------------------------------------------------------- + @router.get("/models", response_model=list[LLMModelInfo]) async def list_llm_models( provider: str = Query(..., description="LLM provider name"), - api_key: str | None = Query(default=None, description="Plaintext API key for this one-time fetch (never stored)"), + api_key: str | None = Query( + default=None, description="Plaintext API key for this one-time fetch (never stored)" + ), current_user: User = Depends(get_current_user), ) -> list[LLMModelInfo]: """ @@ -437,7 +463,11 @@ async def list_llm_models( elif provider_lower == "mistral": result = await _list_mistral(effective_key) if effective_key else [] elif provider_lower == "nebius": - result = await _list_nebius(effective_key, current_user.llm_base_url) if effective_key else [] + result = ( + await _list_nebius(effective_key, current_user.llm_base_url) + if effective_key + else [] + ) elif provider_lower == "ollama": result = await _list_ollama(current_user.llm_base_url) else: @@ -445,6 +475,8 @@ async def list_llm_models( result = [] if use_cache and result: - await set_cached_llm_models(provider_lower, current_user.id, [m.model_dump() for m in result]) + await set_cached_llm_models( + provider_lower, current_user.id, [m.model_dump() for m in result] + ) return result diff --git a/backend/app/api/monthly_reports.py b/backend/app/api/monthly_reports.py index 1d35080..1815ff1 100644 --- a/backend/app/api/monthly_reports.py +++ b/backend/app/api/monthly_reports.py @@ -33,7 +33,9 @@ def _parse_report_month(month: str) -> date: try: return month_start_from_string(month) except ValueError as error: - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="month must be a valid YYYY-MM value") from error + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, detail="month must be a valid YYYY-MM value" + ) from error @router.post("/send", response_model=MonthlyReportSendResponse) diff --git a/backend/app/api/ollama.py b/backend/app/api/ollama.py index 1fcb35e..267ee39 100644 --- a/backend/app/api/ollama.py +++ b/backend/app/api/ollama.py @@ -1,6 +1,5 @@ """Ollama utility endpoints.""" - import httpx from fastapi import APIRouter, Depends @@ -29,7 +28,9 @@ async def list_ollama_models( Filters out known embedding models. Returns empty list if Ollama is not reachable. """ - ollama_base = (current_user.llm_base_url or settings.ollama_url or "http://localhost:11434").rstrip("/") + ollama_base = ( + current_user.llm_base_url or settings.ollama_url or "http://localhost:11434" + ).rstrip("/") try: async with httpx.AsyncClient(timeout=5.0) as client: diff --git a/backend/app/api/partners.py b/backend/app/api/partners.py index b7dad91..070c6fe 100644 --- a/backend/app/api/partners.py +++ b/backend/app/api/partners.py @@ -33,7 +33,9 @@ def _serialize_request(req: PartnerRequest, *, viewer_id: uuid.UUID) -> dict: "id": str(req.id), "direction": "sent" if is_sender else "received", "status": req.status, - "email": req.recipient_email if is_sender else (req.requester.email if req.requester else ""), + "email": req.recipient_email + if is_sender + else (req.requester.email if req.requester else ""), "name": None if is_sender else (req.requester.name if req.requester else None), "avatar_url": None if is_sender else (req.requester.avatar_url if req.requester else None), "created_at": req.created_at.isoformat(), @@ -62,7 +64,10 @@ async def list_partners( result = await db.execute( select(PartnerRequest) .where( - or_(PartnerRequest.requester_id == current_user.id, PartnerRequest.recipient_id == current_user.id) + or_( + PartnerRequest.requester_id == current_user.id, + PartnerRequest.recipient_id == current_user.id, + ) ) .order_by(PartnerRequest.created_at.desc()) ) @@ -80,7 +85,11 @@ async def list_partners( partner_result = await db.execute(select(User).where(User.id.in_(accepted_partner_ids))) partners = [_serialize_partner(u) for u in partner_result.scalars().all()] - pending = [_serialize_request(r, viewer_id=current_user.id) for r in requests if r.status == PARTNER_STATUS_PENDING] + pending = [ + _serialize_request(r, viewer_id=current_user.id) + for r in requests + if r.status == PARTNER_STATUS_PENDING + ] return {"partners": partners, "pending_requests": pending} @@ -103,20 +112,27 @@ async def send_partner_request( ) ) if existing.scalar_one_or_none(): - raise HTTPException(status_code=409, detail="A pending request to this email already exists") + raise HTTPException( + status_code=409, detail="A pending request to this email already exists" + ) recipient_result = await db.execute(select(User).where(func.lower(User.email) == target_email)) recipient = recipient_result.scalar_one_or_none() if not recipient: - raise HTTPException(status_code=404, detail="No SpendHound account found with that email. Only existing users can be added as partners.") + raise HTTPException( + status_code=404, + detail="No SpendHound account found with that email. Only existing users can be added as partners.", + ) if recipient: already_partners = await db.execute( select(PartnerRequest).where( or_( - (PartnerRequest.requester_id == current_user.id) & (PartnerRequest.recipient_id == recipient.id), - (PartnerRequest.requester_id == recipient.id) & (PartnerRequest.recipient_id == current_user.id), + (PartnerRequest.requester_id == current_user.id) + & (PartnerRequest.recipient_id == recipient.id), + (PartnerRequest.requester_id == recipient.id) + & (PartnerRequest.recipient_id == current_user.id), ), PartnerRequest.status == PARTNER_STATUS_ACCEPTED, ) @@ -164,7 +180,10 @@ async def accept_partner_request( req = result.scalar_one_or_none() if not req: raise HTTPException(status_code=404, detail="Request not found") - if req.recipient_id != current_user.id and func.lower(req.recipient_email) != current_user.email.lower(): + if ( + req.recipient_id != current_user.id + and func.lower(req.recipient_email) != current_user.email.lower() + ): raise HTTPException(status_code=403, detail="Not your request to accept") if req.status != PARTNER_STATUS_PENDING: raise HTTPException(status_code=409, detail=f"Request is already {req.status}") @@ -185,7 +204,10 @@ async def reject_partner_request( req = result.scalar_one_or_none() if not req: raise HTTPException(status_code=404, detail="Request not found") - if req.recipient_id != current_user.id and req.recipient_email.lower() != current_user.email.lower(): + if ( + req.recipient_id != current_user.id + and req.recipient_email.lower() != current_user.email.lower() + ): raise HTTPException(status_code=403, detail="Not your request to reject") if req.status != PARTNER_STATUS_PENDING: raise HTTPException(status_code=409, detail=f"Request is already {req.status}") diff --git a/backend/app/api/receipts.py b/backend/app/api/receipts.py index 8980f05..005d637 100644 --- a/backend/app/api/receipts.py +++ b/backend/app/api/receipts.py @@ -28,7 +28,11 @@ @router.get("") -async def list_receipts(needs_review: bool | None = Query(default=None), current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> list[dict]: +async def list_receipts( + needs_review: bool | None = Query(default=None), + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> list[dict]: statement = select(Receipt).where(Receipt.user_id == current_user.id) if needs_review is not None: statement = statement.where(Receipt.needs_review.is_(needs_review)) @@ -38,12 +42,24 @@ async def list_receipts(needs_review: bool | None = Query(default=None), current @router.post("/upload") @limiter.limit(f"{settings.rate_limit_upload_per_minute}/minute") -async def upload_receipt(request: Request, file: UploadFile = File(...), provider: str | None = Form(default=None), model: str | None = Form(default=None), api_key: str | None = Form(default=None), base_url: str | None = Form(default=None), current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), _bot_check: None = Depends(block_bots)) -> dict: +async def upload_receipt( + request: Request, + file: UploadFile = File(...), + provider: str | None = Form(default=None), + model: str | None = Form(default=None), + api_key: str | None = Form(default=None), + base_url: str | None = Form(default=None), + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), + _bot_check: None = Depends(block_bots), +) -> dict: await validate_llm_base_url(base_url) await ensure_default_categories(db, current_user.id) stored = await store_upload(current_user.id, file) filename = file.filename or stored.stored_filename - llm_config = create_llm_config(provider=provider, model=model, api_key=api_key, base_url=base_url) + llm_config = create_llm_config( + provider=provider, model=model, api_key=api_key, base_url=base_url + ) receipt = Receipt( user_id=current_user.id, original_filename=filename, @@ -89,15 +105,27 @@ async def upload_receipt(request: Request, file: UploadFile = File(...), provide @router.post("/upload-statement") -async def upload_statement(file: UploadFile = File(...), provider: str | None = Form(default=None), model: str | None = Form(default=None), api_key: str | None = Form(default=None), base_url: str | None = Form(default=None), current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: +async def upload_statement( + file: UploadFile = File(...), + provider: str | None = Form(default=None), + model: str | None = Form(default=None), + api_key: str | None = Form(default=None), + base_url: str | None = Form(default=None), + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: await validate_llm_base_url(base_url) filename = file.filename or "statement.pdf" is_pdf = (file.content_type or "") == "application/pdf" or filename.lower().endswith(".pdf") if not is_pdf: - raise HTTPException(status_code=400, detail="Bank statement import currently requires a PDF upload") + raise HTTPException( + status_code=400, detail="Bank statement import currently requires a PDF upload" + ) stored = await store_upload(current_user.id, file) - llm_config = create_llm_config(provider=provider, model=model, api_key=api_key, base_url=base_url) + llm_config = create_llm_config( + provider=provider, model=model, api_key=api_key, base_url=base_url + ) # Create receipt immediately with pending status — extraction runs in Celery worker. receipt = Receipt( @@ -132,8 +160,14 @@ async def upload_statement(file: UploadFile = File(...), provider: str | None = @router.get("/{receipt_id}") -async def get_receipt(receipt_id: uuid.UUID, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)) -> dict: - result = await db.execute(select(Receipt).where(Receipt.id == receipt_id, Receipt.user_id == current_user.id)) +async def get_receipt( + receipt_id: uuid.UUID, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +) -> dict: + result = await db.execute( + select(Receipt).where(Receipt.id == receipt_id, Receipt.user_id == current_user.id) + ) receipt = result.scalar_one_or_none() if receipt is None: raise HTTPException(status_code=404, detail="Receipt not found") diff --git a/backend/app/celery_app.py b/backend/app/celery_app.py index 34eb366..a2748bc 100644 --- a/backend/app/celery_app.py +++ b/backend/app/celery_app.py @@ -24,7 +24,12 @@ "spendhound", broker=settings.redis_url, backend=None, # results discarded — status lives in Postgres - include=["app.tasks.receipt_tasks", "app.tasks.statement_tasks", "app.tasks.report_tasks", "app.tasks.demo_tasks"], + include=[ + "app.tasks.receipt_tasks", + "app.tasks.statement_tasks", + "app.tasks.report_tasks", + "app.tasks.demo_tasks", + ], ) celery_app.conf.update( diff --git a/backend/app/config.py b/backend/app/config.py index 8f07734..86b03d1 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -29,12 +29,16 @@ class Settings(BaseSettings): default="ollama", description="LLM provider: ollama | openai | anthropic | nebius", ) - ollama_url: str = Field(default="http://host.docker.internal:11434", description="Ollama base URL") + ollama_url: str = Field( + default="http://host.docker.internal:11434", description="Ollama base URL" + ) ollama_model: str = Field(default="gemma4:e4b", description="Ollama model name") openai_api_key: str = Field(default="", description="OpenAI API key") openai_model: str = Field(default="gpt-4o-mini", description="OpenAI model name") anthropic_api_key: str = Field(default="", description="Anthropic API key") - anthropic_model: str = Field(default="claude-sonnet-4-20250514", description="Anthropic model name") + anthropic_model: str = Field( + default="claude-sonnet-4-20250514", description="Anthropic model name" + ) nebius_api_key: str = Field(default="", description="Nebius API key") nebius_model: str = Field(default="", description="Nebius model name") nebius_base_url: str = Field(default="", description="Nebius base URL") @@ -46,26 +50,51 @@ class Settings(BaseSettings): app_url: str = Field(default="http://localhost:3000", description="Public frontend URL") resend_api_key: str = Field(default="", description="Resend API key") resend_from_email: str = Field(default="", description="Approval email sender") - monthly_reports_enabled: bool = Field(default=False, description="Enable monthly report delivery job") - monthly_reports_timezone: str = Field(default="UTC", description="IANA timezone used to compute the reporting month") - monthly_reports_frontend_pdf_url: str = Field(default="", description="Internal frontend endpoint used to render monthly report PDFs") - monthly_reports_frontend_token: str = Field(default="", description="Shared secret token sent to the internal frontend PDF endpoint") - monthly_reports_frontend_token_header: str = Field(default="X-SpendHound-Internal-Token", description="Header name used for monthly report frontend authentication") - monthly_reports_frontend_timeout_seconds: int = Field(default=60, description="Timeout for internal frontend monthly report PDF requests") - recurring_generation_enabled: bool = Field(default=False, description="Enable automatic generation of recurring expenses") - recurring_generation_timezone: str = Field(default="UTC", description="IANA timezone used to compute recurring expense generation months") + monthly_reports_enabled: bool = Field( + default=False, description="Enable monthly report delivery job" + ) + monthly_reports_timezone: str = Field( + default="UTC", description="IANA timezone used to compute the reporting month" + ) + monthly_reports_frontend_pdf_url: str = Field( + default="", description="Internal frontend endpoint used to render monthly report PDFs" + ) + monthly_reports_frontend_token: str = Field( + default="", description="Shared secret token sent to the internal frontend PDF endpoint" + ) + monthly_reports_frontend_token_header: str = Field( + default="X-SpendHound-Internal-Token", + description="Header name used for monthly report frontend authentication", + ) + monthly_reports_frontend_timeout_seconds: int = Field( + default=60, description="Timeout for internal frontend monthly report PDF requests" + ) + recurring_generation_enabled: bool = Field( + default=False, description="Enable automatic generation of recurring expenses" + ) + recurring_generation_timezone: str = Field( + default="UTC", + description="IANA timezone used to compute recurring expense generation months", + ) llm_key_encryption_secret: str = Field( default="", description=( "Fernet encryption key for user LLM API keys stored in the database. " - "Generate with: python -c \"from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())\"" + 'Generate with: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"' ), ) - ollama_embedding_model: str = Field(default="embeddinggemma:latest", description="Ollama model for item embeddings (RAG)") - embedding_dimensions: int = Field(default=768, description="Vector dimensions produced by the embedding model") - rag_similarity_threshold: float = Field(default=0.22, description="Cosine distance threshold for RAG match (lower = stricter; 0.0=identical, 2.0=opposite)") + ollama_embedding_model: str = Field( + default="embeddinggemma:latest", description="Ollama model for item embeddings (RAG)" + ) + embedding_dimensions: int = Field( + default=768, description="Vector dimensions produced by the embedding model" + ) + rag_similarity_threshold: float = Field( + default=0.22, + description="Cosine distance threshold for RAG match (lower = stricter; 0.0=identical, 2.0=opposite)", + ) # ── LLM concurrency ────────────────────────────────────────────────────────── ollama_max_concurrent: int = Field( @@ -102,13 +131,21 @@ class Settings(BaseSettings): ) # ── Rate limiting ───────────────────────────────────────────────────────── - rate_limit_chat_per_minute: int = Field(default=20, description="Chat stream requests per user per minute") - rate_limit_upload_per_minute: int = Field(default=3, description="Receipt uploads per user per minute") - rate_limit_auth_per_minute: int = Field(default=10, description="Auth requests per IP per minute") + rate_limit_chat_per_minute: int = Field( + default=20, description="Chat stream requests per user per minute" + ) + rate_limit_upload_per_minute: int = Field( + default=3, description="Receipt uploads per user per minute" + ) + rate_limit_auth_per_minute: int = Field( + default=10, description="Auth requests per IP per minute" + ) # ── Database connection pool ────────────────────────────────────────────── db_pool_size: int = Field(default=20, description="SQLAlchemy async connection pool base size") - db_max_overflow: int = Field(default=40, description="Max extra connections beyond db_pool_size") + db_max_overflow: int = Field( + default=40, description="Max extra connections beyond db_pool_size" + ) # ── Observability ───────────────────────────────────────────────────────── metrics_token: str = Field( diff --git a/backend/app/database.py b/backend/app/database.py index 9351665..d306e9a 100644 --- a/backend/app/database.py +++ b/backend/app/database.py @@ -4,6 +4,7 @@ from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from sqlalchemy.orm import DeclarativeBase +from sqlalchemy.pool import NullPool from app.config import settings @@ -15,13 +16,13 @@ if not settings.database_url.startswith("sqlite"): engine_kwargs["pool_size"] = settings.db_pool_size engine_kwargs["max_overflow"] = settings.db_max_overflow - engine_kwargs["pool_timeout"] = 30 # fail fast if pool exhausted instead of blocking - engine_kwargs["pool_recycle"] = 1800 # recycle stale connections every 30 min + engine_kwargs["pool_timeout"] = 30 # fail fast if pool exhausted instead of blocking + engine_kwargs["pool_recycle"] = 1800 # recycle stale connections every 30 min -# Create async engine with connection pooling where supported. +# FastAPI engine - connection pool shared across the process lifetime. engine = create_async_engine(settings.database_url, **engine_kwargs) -# Session factory +# Session factory for FastAPI request handlers. AsyncSessionLocal = async_sessionmaker( engine, class_=AsyncSession, @@ -30,6 +31,26 @@ autoflush=False, ) +# Celery tasks call asyncio.run() for each task, creating a new event loop every +# time. The pooled engine above keeps asyncpg connections alive across calls; +# those connections hold asyncio Futures bound to the previous (now closed) loop, +# causing "Future attached to a different loop" on the second task run. +# NullPool disables connection reuse entirely: each checkout opens a fresh +# connection and each checkin closes it, so there is no cross-loop state. +_celery_engine = create_async_engine( + settings.database_url, + poolclass=NullPool, + echo=settings.debug, +) + +CelerySessionLocal = async_sessionmaker( + _celery_engine, + class_=AsyncSession, + expire_on_commit=False, + autocommit=False, + autoflush=False, +) + class Base(DeclarativeBase): """Base class for all SQLAlchemy ORM models.""" diff --git a/backend/app/jobs/monthly_reports.py b/backend/app/jobs/monthly_reports.py index ea47539..7c430f5 100644 --- a/backend/app/jobs/monthly_reports.py +++ b/backend/app/jobs/monthly_reports.py @@ -41,7 +41,11 @@ class MonthlyReportSendResult: def previous_calendar_month_start(reference_datetime: datetime | None = None) -> date: timezone_name = ZoneInfo(settings.monthly_reports_timezone) - local_now = reference_datetime.astimezone(timezone_name) if reference_datetime else datetime.now(timezone_name) + local_now = ( + reference_datetime.astimezone(timezone_name) + if reference_datetime + else datetime.now(timezone_name) + ) if local_now.month == 1: return date(local_now.year - 1, 12, 1) return date(local_now.year, local_now.month - 1, 1) @@ -53,7 +57,9 @@ async def fetch_monthly_report_pdf(user: User, report_month: date) -> bytes: headers = {"Accept": "application/pdf"} if settings.monthly_reports_frontend_token: - headers[settings.monthly_reports_frontend_token_header] = settings.monthly_reports_frontend_token + headers[settings.monthly_reports_frontend_token_header] = ( + settings.monthly_reports_frontend_token + ) payload = { "user_id": str(user.id), @@ -62,8 +68,12 @@ async def fetch_monthly_report_pdf(user: User, report_month: date) -> bytes: "report_month": report_month.strftime("%Y-%m"), } - async with httpx.AsyncClient(timeout=settings.monthly_reports_frontend_timeout_seconds) as client: - response = await client.post(settings.monthly_reports_frontend_pdf_url, headers=headers, json=payload) + async with httpx.AsyncClient( + timeout=settings.monthly_reports_frontend_timeout_seconds + ) as client: + response = await client.post( + settings.monthly_reports_frontend_pdf_url, headers=headers, json=payload + ) response.raise_for_status() if not response.content: @@ -94,7 +104,9 @@ async def get_or_create_monthly_report_delivery( ) delivery = delivery_result.scalar_one_or_none() if delivery is None: - delivery = MonthlyReportDelivery(user_id=user_id, report_month=report_month, status="pending") + delivery = MonthlyReportDelivery( + user_id=user_id, report_month=report_month, status="pending" + ) db.add(delivery) await db.flush() return delivery @@ -108,7 +120,9 @@ async def send_monthly_report_for_user( force: bool = False, ) -> MonthlyReportSendResult: report_month_key = report_month.strftime("%Y-%m") - delivery = await get_or_create_monthly_report_delivery(db, user_id=user.id, report_month=report_month) + delivery = await get_or_create_monthly_report_delivery( + db, user_id=user.id, report_month=report_month + ) if not force and delivery.status == "sent": logger.info( @@ -118,7 +132,9 @@ async def send_monthly_report_for_user( report_month=report_month_key, reason="already_sent", ) - return MonthlyReportSendResult(report_month=report_month_key, outcome="skipped", delivery=delivery) + return MonthlyReportSendResult( + report_month=report_month_key, outcome="skipped", delivery=delivery + ) try: attempted_at = datetime.now(UTC) @@ -129,7 +145,9 @@ async def send_monthly_report_for_user( delivery.resend_email_id = None delivery.pdf_source_url = settings.monthly_reports_frontend_pdf_url or None - expense_json_bytes = await build_expense_export_json_bytes(db, user_id=user.id, month=report_month_key) + expense_json_bytes = await build_expense_export_json_bytes( + db, user_id=user.id, month=report_month_key + ) dashboard_pdf_bytes = await fetch_monthly_report_pdf(user, report_month) resend_email_id = await send_monthly_report_email( user.email, @@ -154,7 +172,9 @@ async def send_monthly_report_for_user( resend_email_id=resend_email_id, forced=force, ) - return MonthlyReportSendResult(report_month=report_month_key, outcome="sent", delivery=delivery) + return MonthlyReportSendResult( + report_month=report_month_key, outcome="sent", delivery=delivery + ) except Exception as error: delivery.status = "failed" delivery.error_message = str(error) @@ -169,13 +189,19 @@ async def send_monthly_report_for_user( error=str(error), forced=force, ) - return MonthlyReportSendResult(report_month=report_month_key, outcome="failed", delivery=delivery) + return MonthlyReportSendResult( + report_month=report_month_key, outcome="failed", delivery=delivery + ) -async def send_monthly_reports_for_month(db: AsyncSession, report_month: date) -> MonthlyReportJobSummary: +async def send_monthly_reports_for_month( + db: AsyncSession, report_month: date +) -> MonthlyReportJobSummary: report_month_key = report_month.strftime("%Y-%m") summary = MonthlyReportJobSummary(report_month=report_month_key) - users_result = await db.execute(select(User).where(User.status == "approved").order_by(User.created_at.asc())) + users_result = await db.execute( + select(User).where(User.status == "approved").order_by(User.created_at.asc()) + ) for user in users_result.scalars().all(): summary.processed_users += 1 diff --git a/backend/app/jobs/recurring_expenses.py b/backend/app/jobs/recurring_expenses.py index a2228d6..88c11be 100644 --- a/backend/app/jobs/recurring_expenses.py +++ b/backend/app/jobs/recurring_expenses.py @@ -29,7 +29,11 @@ class RecurringExpenseGenerationSummary: def current_calendar_month_start(reference_datetime: datetime | None = None) -> date: timezone_name = ZoneInfo(settings.recurring_generation_timezone) - local_now = reference_datetime.astimezone(timezone_name) if reference_datetime else datetime.now(timezone_name) + local_now = ( + reference_datetime.astimezone(timezone_name) + if reference_datetime + else datetime.now(timezone_name) + ) return date(local_now.year, local_now.month, 1) @@ -38,7 +42,9 @@ async def generate_recurring_expenses_for_all_users( target_month: date, ) -> RecurringExpenseGenerationSummary: summary = RecurringExpenseGenerationSummary(target_month=target_month.strftime("%Y-%m")) - users_result = await db.execute(select(User).where(User.status == "approved").order_by(User.created_at.asc())) + users_result = await db.execute( + select(User).where(User.status == "approved").order_by(User.created_at.asc()) + ) for user in users_result.scalars().all(): summary.processed_users += 1 diff --git a/backend/app/main.py b/backend/app/main.py index 8ee4fd2..984f96b 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -142,7 +142,9 @@ def _safe_get_route_name(scope, routes, route_name=None): # type: ignore[no-unt app.include_router(receipts.router, prefix="/api/receipts", tags=["receipts"]) app.include_router(chat.router, prefix="/api/chat", tags=["chat"]) app.include_router(analytics.router, prefix="/api/analytics", tags=["analytics"]) - app.include_router(monthly_reports.router, prefix="/api/monthly-reports", tags=["monthly-reports"]) + app.include_router( + monthly_reports.router, prefix="/api/monthly-reports", tags=["monthly-reports"] + ) app.include_router(ollama.router) app.include_router(llm_models.router) @@ -154,9 +156,7 @@ async def health_check() -> dict[str, str]: async def metrics_endpoint(authorization: str = Header(default="")) -> Response: """Prometheus scrape endpoint — bearer token required.""" token = settings.metrics_token - if not token or not hmac.compare_digest( - authorization.encode(), f"Bearer {token}".encode() - ): + if not token or not hmac.compare_digest(authorization.encode(), f"Bearer {token}".encode()): raise HTTPException(status_code=403, detail="Forbidden") depth = await get_celery_queue_depth() RECEIPT_QUEUE_DEPTH.set(depth) diff --git a/backend/app/middleware/rate_limit.py b/backend/app/middleware/rate_limit.py index b2d7dec..574b20b 100644 --- a/backend/app/middleware/rate_limit.py +++ b/backend/app/middleware/rate_limit.py @@ -34,4 +34,6 @@ def _rate_limit_key(request: Request) -> str: return f"ip:{get_remote_address(request)}" -limiter = Limiter(key_func=_rate_limit_key, storage_uri=settings.redis_url, strategy="moving-window") +limiter = Limiter( + key_func=_rate_limit_key, storage_uri=settings.redis_url, strategy="moving-window" +) diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index 44f31dc..ce400ba 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -13,4 +13,21 @@ from app.models.receipt import Receipt from app.models.user import User -__all__ = ["Budget", "Category", "ChatMessage", "ChatSession", "Expense", "ExpenseItem", "ItemEmbedding", "ItemKeywordRule", "Ledger", "LedgerAuditLog", "LedgerMembership", "MerchantRule", "MonthlyReportDelivery", "PartnerRequest", "Receipt", "User"] +__all__ = [ + "Budget", + "Category", + "ChatMessage", + "ChatSession", + "Expense", + "ExpenseItem", + "ItemEmbedding", + "ItemKeywordRule", + "Ledger", + "LedgerAuditLog", + "LedgerMembership", + "MerchantRule", + "MonthlyReportDelivery", + "PartnerRequest", + "Receipt", + "User", +] diff --git a/backend/app/models/budget.py b/backend/app/models/budget.py index dcd6a9f..015042d 100644 --- a/backend/app/models/budget.py +++ b/backend/app/models/budget.py @@ -23,16 +23,27 @@ class Budget(Base): __tablename__ = "budgets" id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - user_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) - category_id: Mapped[uuid.UUID | None] = mapped_column(Uuid(as_uuid=True), ForeignKey("categories.id", ondelete="SET NULL"), nullable=True, index=True) + user_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True + ) + category_id: Mapped[uuid.UUID | None] = mapped_column( + Uuid(as_uuid=True), + ForeignKey("categories.id", ondelete="SET NULL"), + nullable=True, + index=True, + ) name: Mapped[str] = mapped_column(String(120), nullable=False) amount: Mapped[Decimal] = mapped_column(Numeric(12, 2), nullable=False) currency: Mapped[str] = mapped_column(String(3), nullable=False, server_default="EUR") period: Mapped[str] = mapped_column(String(20), nullable=False, server_default="monthly") month_start: Mapped[date] = mapped_column(Date, nullable=False, index=True) notes: Mapped[str | None] = mapped_column(Text, nullable=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) - updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False + ) user: Mapped[User] = relationship("User", back_populates="budgets") category: Mapped[Category | None] = relationship("Category", back_populates="budgets") diff --git a/backend/app/models/category.py b/backend/app/models/category.py index aaacee6..e0c30ad 100644 --- a/backend/app/models/category.py +++ b/backend/app/models/category.py @@ -34,20 +34,30 @@ class Category(Base): __table_args__ = (UniqueConstraint("user_id", "name", name="uq_categories_user_name"),) id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - user_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) + user_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True + ) name: Mapped[str] = mapped_column(String(80), nullable=False) color: Mapped[str] = mapped_column(String(20), nullable=False, server_default="#60a5fa") icon: Mapped[str | None] = mapped_column(String(32), nullable=True) description: Mapped[str | None] = mapped_column(Text, nullable=True) - transaction_type: Mapped[str] = mapped_column(String(20), nullable=False, server_default="debit", index=True) + transaction_type: Mapped[str] = mapped_column( + String(20), nullable=False, server_default="debit", index=True + ) is_system: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default="false") - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) - updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False + ) user: Mapped[User] = relationship("User", back_populates="categories") expenses: Mapped[list[Expense]] = relationship("Expense", back_populates="category") budgets: Mapped[list[Budget]] = relationship("Budget", back_populates="category") - merchant_rules: Mapped[list[MerchantRule]] = relationship("MerchantRule", back_populates="category") + merchant_rules: Mapped[list[MerchantRule]] = relationship( + "MerchantRule", back_populates="category" + ) class MerchantRule(Base): @@ -56,16 +66,29 @@ class MerchantRule(Base): __tablename__ = "merchant_rules" id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - user_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) - category_id: Mapped[uuid.UUID | None] = mapped_column(Uuid(as_uuid=True), ForeignKey("categories.id", ondelete="SET NULL"), nullable=True, index=True) + user_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True + ) + category_id: Mapped[uuid.UUID | None] = mapped_column( + Uuid(as_uuid=True), + ForeignKey("categories.id", ondelete="SET NULL"), + nullable=True, + index=True, + ) merchant_pattern: Mapped[str] = mapped_column(String(255), nullable=False) pattern_type: Mapped[str] = mapped_column(String(20), nullable=False, server_default="contains") priority: Mapped[int] = mapped_column(Integer, nullable=False, server_default="100") is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default="true") - is_global: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default="false", index=True) + is_global: Mapped[bool] = mapped_column( + Boolean, nullable=False, server_default="false", index=True + ) notes: Mapped[str | None] = mapped_column(Text, nullable=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) - updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False + ) user: Mapped[User] = relationship("User", back_populates="merchant_rules") category: Mapped[Category | None] = relationship("Category", back_populates="merchant_rules") @@ -81,15 +104,23 @@ class ItemKeywordRule(Base): __tablename__ = "item_keyword_rules" id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - user_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) - is_global: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default="false", index=True) + user_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True + ) + is_global: Mapped[bool] = mapped_column( + Boolean, nullable=False, server_default="false", index=True + ) keyword: Mapped[str] = mapped_column(String(255), nullable=False) subcategory_label: Mapped[str] = mapped_column(String(120), nullable=False) pattern_type: Mapped[str] = mapped_column(String(20), nullable=False, server_default="fuzzy") priority: Mapped[int] = mapped_column(Integer, nullable=False, server_default="100") is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default="true") notes: Mapped[str | None] = mapped_column(Text, nullable=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) - updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False + ) user: Mapped[User] = relationship("User", back_populates="item_keyword_rules") diff --git a/backend/app/models/chat_message.py b/backend/app/models/chat_message.py index 7e8c497..f9d8250 100644 --- a/backend/app/models/chat_message.py +++ b/backend/app/models/chat_message.py @@ -22,8 +22,15 @@ class ChatMessage(Base): __tablename__ = "chat_messages" id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - user_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) - session_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("chat_sessions.id", ondelete="CASCADE"), nullable=False, index=True) + user_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True + ) + session_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), + ForeignKey("chat_sessions.id", ondelete="CASCADE"), + nullable=False, + index=True, + ) role: Mapped[str] = mapped_column(String(20), nullable=False, index=True) content: Mapped[str] = mapped_column(Text, nullable=False) client_id: Mapped[str] = mapped_column(String(120), nullable=False, index=True) @@ -32,7 +39,9 @@ class ChatMessage(Base): model: Mapped[str | None] = mapped_column(String(255), nullable=True) token_count: Mapped[int | None] = mapped_column(Integer, nullable=True) message_metadata: Mapped[dict] = mapped_column("metadata", JSON, nullable=False, default=dict) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False ) diff --git a/backend/app/models/chat_session.py b/backend/app/models/chat_session.py index aaff08a..8bacfb1 100644 --- a/backend/app/models/chat_session.py +++ b/backend/app/models/chat_session.py @@ -22,13 +22,19 @@ class ChatSession(Base): __tablename__ = "chat_sessions" id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - user_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) + user_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True + ) title: Mapped[str] = mapped_column(String(255), nullable=False, server_default="New Chat") summary: Mapped[str | None] = mapped_column(Text, nullable=True) token_count: Mapped[int] = mapped_column(Integer, nullable=False, server_default="0") max_tokens: Mapped[int] = mapped_column(Integer, nullable=False, server_default="4096") - last_message_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True, index=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) + last_message_at: Mapped[datetime | None] = mapped_column( + DateTime(timezone=True), nullable=True, index=True + ) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False ) diff --git a/backend/app/models/expense.py b/backend/app/models/expense.py index c0a7fdf..6671349 100644 --- a/backend/app/models/expense.py +++ b/backend/app/models/expense.py @@ -38,13 +38,27 @@ class Expense(Base): __tablename__ = "expenses" id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - user_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) - category_id: Mapped[uuid.UUID | None] = mapped_column(Uuid(as_uuid=True), ForeignKey("categories.id", ondelete="SET NULL"), nullable=True, index=True) - receipt_id: Mapped[uuid.UUID | None] = mapped_column(Uuid(as_uuid=True), ForeignKey("receipts.id", ondelete="SET NULL"), nullable=True, index=True) + user_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True + ) + category_id: Mapped[uuid.UUID | None] = mapped_column( + Uuid(as_uuid=True), + ForeignKey("categories.id", ondelete="SET NULL"), + nullable=True, + index=True, + ) + receipt_id: Mapped[uuid.UUID | None] = mapped_column( + Uuid(as_uuid=True), + ForeignKey("receipts.id", ondelete="SET NULL"), + nullable=True, + index=True, + ) merchant: Mapped[str] = mapped_column(String(255), nullable=False, index=True) description: Mapped[str | None] = mapped_column(Text, nullable=True) amount: Mapped[Decimal] = mapped_column(Numeric(12, 2), nullable=False) - transaction_type: Mapped[str] = mapped_column(String(20), nullable=False, server_default="debit", index=True) + transaction_type: Mapped[str] = mapped_column( + String(20), nullable=False, server_default="debit", index=True + ) currency: Mapped[str] = mapped_column(String(3), nullable=False, server_default="EUR") expense_date: Mapped[date] = mapped_column(Date, nullable=False, index=True) source: Mapped[str] = mapped_column(String(30), nullable=False, server_default="manual") @@ -53,24 +67,45 @@ class Expense(Base): notes: Mapped[str | None] = mapped_column(Text, nullable=True) recurring_group: Mapped[str | None] = mapped_column(String(255), nullable=True, index=True) is_recurring: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default="false") - cadence: Mapped[str] = mapped_column(String(20), nullable=False, server_default="one_time", index=True) + cadence: Mapped[str] = mapped_column( + String(20), nullable=False, server_default="one_time", index=True + ) cadence_override: Mapped[str | None] = mapped_column(String(20), nullable=True) cadence_interval: Mapped[int | None] = mapped_column(Integer, nullable=True, index=True) prepaid_months: Mapped[int | None] = mapped_column(Integer, nullable=True) prepaid_start_date: Mapped[date | None] = mapped_column(Date, nullable=True, index=True) - recurring_variable: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, server_default="false") - recurring_auto_add: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, server_default="false") - recurring_source_expense_id: Mapped[uuid.UUID | None] = mapped_column(Uuid(as_uuid=True), ForeignKey("expenses.id", ondelete="SET NULL"), nullable=True, index=True) - auto_generated: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, server_default="false") + recurring_variable: Mapped[bool] = mapped_column( + Boolean, nullable=False, default=False, server_default="false" + ) + recurring_auto_add: Mapped[bool] = mapped_column( + Boolean, nullable=False, default=False, server_default="false" + ) + recurring_source_expense_id: Mapped[uuid.UUID | None] = mapped_column( + Uuid(as_uuid=True), + ForeignKey("expenses.id", ondelete="SET NULL"), + nullable=True, + index=True, + ) + auto_generated: Mapped[bool] = mapped_column( + Boolean, nullable=False, default=False, server_default="false" + ) generated_for_month: Mapped[date | None] = mapped_column(Date, nullable=True, index=True) is_major_purchase: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default="false") - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) - updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False + ) - ledger_id: Mapped[uuid.UUID | None] = mapped_column(Uuid(as_uuid=True), ForeignKey("ledgers.id", ondelete="SET NULL"), nullable=True, index=True) + ledger_id: Mapped[uuid.UUID | None] = mapped_column( + Uuid(as_uuid=True), ForeignKey("ledgers.id", ondelete="SET NULL"), nullable=True, index=True + ) user: Mapped[User] = relationship("User", back_populates="expenses") category: Mapped[Category | None] = relationship("Category", back_populates="expenses") receipt: Mapped[Receipt | None] = relationship("Receipt", back_populates="expenses") - items: Mapped[list[ExpenseItem]] = relationship("ExpenseItem", back_populates="expense", cascade="all, delete-orphan") + items: Mapped[list[ExpenseItem]] = relationship( + "ExpenseItem", back_populates="expense", cascade="all, delete-orphan" + ) ledger: Mapped[Ledger | None] = relationship("Ledger", back_populates="expenses") diff --git a/backend/app/models/expense_item.py b/backend/app/models/expense_item.py index 6c2c00d..07d65e7 100644 --- a/backend/app/models/expense_item.py +++ b/backend/app/models/expense_item.py @@ -22,14 +22,23 @@ class ExpenseItem(Base): __tablename__ = "expense_items" id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - expense_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("expenses.id", ondelete="CASCADE"), nullable=False, index=True) + expense_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), + ForeignKey("expenses.id", ondelete="CASCADE"), + nullable=False, + index=True, + ) description: Mapped[str] = mapped_column(String(300), nullable=False) quantity: Mapped[float | None] = mapped_column(Float, nullable=True) unit_price: Mapped[Decimal | None] = mapped_column(Numeric(12, 2), nullable=True) total_price: Mapped[Decimal | None] = mapped_column(Numeric(12, 2), nullable=True) subcategory: Mapped[str | None] = mapped_column(String(120), nullable=True, index=True) subcategory_confidence: Mapped[float | None] = mapped_column(Float, nullable=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) - updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False + ) expense: Mapped[Expense] = relationship("Expense", back_populates="items") diff --git a/backend/app/models/item_embedding.py b/backend/app/models/item_embedding.py index fb6e1f1..9302a63 100644 --- a/backend/app/models/item_embedding.py +++ b/backend/app/models/item_embedding.py @@ -30,15 +30,21 @@ class ItemEmbedding(Base): user_id: Mapped[uuid.UUID | None] = mapped_column( Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=True, index=True ) - is_global: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default="false", index=True) + is_global: Mapped[bool] = mapped_column( + Boolean, nullable=False, server_default="false", index=True + ) description_text: Mapped[str] = mapped_column(String(300), nullable=False) # Vector dimension must match settings.embedding_dimensions (default 768). # If you change the dimension, create a new migration to alter the column. - embedding: Mapped[list[float]] = mapped_column(Vector(settings.embedding_dimensions), nullable=False) + embedding: Mapped[list[float]] = mapped_column( + Vector(settings.embedding_dimensions), nullable=False + ) subcategory_label: Mapped[str] = mapped_column(String(120), nullable=False) # source: "document" (admin upload) | "correction" (user-confirmed fix) source: Mapped[str] = mapped_column(String(50), nullable=False, server_default="document") notes: Mapped[str | None] = mapped_column(Text, nullable=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) user: Mapped[User | None] = relationship("User", back_populates="item_embeddings") diff --git a/backend/app/models/ledger.py b/backend/app/models/ledger.py index d7bbfa7..5bdd19e 100644 --- a/backend/app/models/ledger.py +++ b/backend/app/models/ledger.py @@ -22,14 +22,26 @@ class Ledger(Base): id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) name: Mapped[str] = mapped_column(String(255), nullable=False) type: Mapped[str] = mapped_column(String(20), nullable=False, server_default="personal") - created_by: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) - updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) - - creator: Mapped[User] = relationship("User", foreign_keys=[created_by], back_populates="created_ledgers") - memberships: Mapped[list[LedgerMembership]] = relationship("LedgerMembership", back_populates="ledger", cascade="all, delete-orphan") + created_by: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False + ) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False + ) + + creator: Mapped[User] = relationship( + "User", foreign_keys=[created_by], back_populates="created_ledgers" + ) + memberships: Mapped[list[LedgerMembership]] = relationship( + "LedgerMembership", back_populates="ledger", cascade="all, delete-orphan" + ) expenses: Mapped[list[Expense]] = relationship("Expense", back_populates="ledger") - audit_logs: Mapped[list[LedgerAuditLog]] = relationship("LedgerAuditLog", back_populates="ledger", cascade="all, delete-orphan") + audit_logs: Mapped[list[LedgerAuditLog]] = relationship( + "LedgerAuditLog", back_populates="ledger", cascade="all, delete-orphan" + ) class LedgerMembership(Base): @@ -37,10 +49,16 @@ class LedgerMembership(Base): __table_args__ = (UniqueConstraint("ledger_id", "user_id", name="uq_ledger_membership"),) id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - ledger_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("ledgers.id", ondelete="CASCADE"), nullable=False, index=True) - user_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) + ledger_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("ledgers.id", ondelete="CASCADE"), nullable=False, index=True + ) + user_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True + ) role: Mapped[str] = mapped_column(String(20), nullable=False, server_default="owner") - joined_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) + joined_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) ledger: Mapped[Ledger] = relationship("Ledger", back_populates="memberships") user: Mapped[User] = relationship("User", back_populates="ledger_memberships") @@ -50,12 +68,23 @@ class LedgerAuditLog(Base): __tablename__ = "ledger_audit_logs" id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - ledger_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("ledgers.id", ondelete="CASCADE"), nullable=False, index=True) - expense_id: Mapped[uuid.UUID | None] = mapped_column(Uuid(as_uuid=True), ForeignKey("expenses.id", ondelete="SET NULL"), nullable=True, index=True) - user_id: Mapped[uuid.UUID | None] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="SET NULL"), nullable=True) + ledger_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("ledgers.id", ondelete="CASCADE"), nullable=False, index=True + ) + expense_id: Mapped[uuid.UUID | None] = mapped_column( + Uuid(as_uuid=True), + ForeignKey("expenses.id", ondelete="SET NULL"), + nullable=True, + index=True, + ) + user_id: Mapped[uuid.UUID | None] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="SET NULL"), nullable=True + ) action: Mapped[str] = mapped_column(String(50), nullable=False) changes: Mapped[str | None] = mapped_column(String, nullable=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) ledger: Mapped[Ledger] = relationship("Ledger", back_populates="audit_logs") user: Mapped[User] = relationship("User") diff --git a/backend/app/models/monthly_report_delivery.py b/backend/app/models/monthly_report_delivery.py index ba68878..0b28d3b 100644 --- a/backend/app/models/monthly_report_delivery.py +++ b/backend/app/models/monthly_report_delivery.py @@ -24,15 +24,21 @@ class MonthlyReportDelivery(Base): ) id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - user_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) + user_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True + ) report_month: Mapped[date] = mapped_column(Date, nullable=False, index=True) - status: Mapped[str] = mapped_column(String(20), nullable=False, server_default="pending", index=True) + status: Mapped[str] = mapped_column( + String(20), nullable=False, server_default="pending", index=True + ) attempted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) sent_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) resend_email_id: Mapped[str | None] = mapped_column(String(255), nullable=True) pdf_source_url: Mapped[str | None] = mapped_column(String(1000), nullable=True) error_message: Mapped[str | None] = mapped_column(Text, nullable=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), diff --git a/backend/app/models/partner.py b/backend/app/models/partner.py index 29f7422..037b387 100644 --- a/backend/app/models/partner.py +++ b/backend/app/models/partner.py @@ -23,13 +23,27 @@ class PartnerRequest(Base): __tablename__ = "partner_requests" id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - requester_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) + requester_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True + ) recipient_email: Mapped[str] = mapped_column(String(255), nullable=False, index=True) - recipient_id: Mapped[uuid.UUID | None] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True) - status: Mapped[str] = mapped_column(String(20), nullable=False, server_default=PARTNER_STATUS_PENDING) + recipient_id: Mapped[uuid.UUID | None] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True + ) + status: Mapped[str] = mapped_column( + String(20), nullable=False, server_default=PARTNER_STATUS_PENDING + ) token: Mapped[str | None] = mapped_column(Text, nullable=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) - updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) - - requester: Mapped[User] = relationship("User", foreign_keys=[requester_id], back_populates="sent_partner_requests") - recipient: Mapped[User | None] = relationship("User", foreign_keys=[recipient_id], back_populates="received_partner_requests") + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False + ) + + requester: Mapped[User] = relationship( + "User", foreign_keys=[requester_id], back_populates="sent_partner_requests" + ) + recipient: Mapped[User | None] = relationship( + "User", foreign_keys=[recipient_id], back_populates="received_partner_requests" + ) diff --git a/backend/app/models/receipt.py b/backend/app/models/receipt.py index 5424369..93dc3ba 100644 --- a/backend/app/models/receipt.py +++ b/backend/app/models/receipt.py @@ -22,7 +22,9 @@ class Receipt(Base): __tablename__ = "receipts" id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid.uuid4) - user_id: Mapped[uuid.UUID] = mapped_column(Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) + user_id: Mapped[uuid.UUID] = mapped_column( + Uuid(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True + ) original_filename: Mapped[str] = mapped_column(String(255), nullable=False) stored_filename: Mapped[str] = mapped_column(String(255), nullable=False) content_type: Mapped[str | None] = mapped_column(String(120), nullable=True) @@ -32,11 +34,17 @@ class Receipt(Base): preview_data: Mapped[dict | None] = mapped_column(JSON, nullable=True) extraction_confidence: Mapped[float | None] = mapped_column(Float, nullable=True) document_kind: Mapped[str] = mapped_column(String(20), nullable=False, server_default="receipt") - extraction_status: Mapped[str] = mapped_column(String(30), nullable=False, server_default="uploaded") + extraction_status: Mapped[str] = mapped_column( + String(30), nullable=False, server_default="uploaded" + ) needs_review: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default="true") review_notes: Mapped[str | None] = mapped_column(Text, nullable=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) - updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False + ) finalized_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) user: Mapped[User] = relationship("User", back_populates="receipts") diff --git a/backend/app/models/user.py b/backend/app/models/user.py index a84c28f..f6dfdea 100644 --- a/backend/app/models/user.py +++ b/backend/app/models/user.py @@ -34,31 +34,69 @@ class User(Base): name: Mapped[str | None] = mapped_column(String(255), nullable=True) avatar_url: Mapped[str | None] = mapped_column(String(500), nullable=True) status: Mapped[str] = mapped_column(String(20), nullable=False, server_default="pending") - automatic_monthly_reports: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True, server_default=true()) + automatic_monthly_reports: Mapped[bool] = mapped_column( + Boolean, nullable=False, default=True, server_default=true() + ) receipt_prompt_override: Mapped[str | None] = mapped_column(Text, nullable=True) llm_provider: Mapped[str | None] = mapped_column(String(50), nullable=True) llm_model: Mapped[str | None] = mapped_column(String(255), nullable=True) llm_api_key: Mapped[str | None] = mapped_column(Text, nullable=True) llm_base_url: Mapped[str | None] = mapped_column(String(500), nullable=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False + ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False ) - created_ledgers: Mapped[list["Ledger"]] = relationship("Ledger", foreign_keys="Ledger.created_by", back_populates="creator", cascade="all, delete-orphan") - ledger_memberships: Mapped[list["LedgerMembership"]] = relationship("LedgerMembership", back_populates="user", cascade="all, delete-orphan") - sent_partner_requests: Mapped[list["PartnerRequest"]] = relationship("PartnerRequest", foreign_keys="PartnerRequest.requester_id", back_populates="requester", cascade="all, delete-orphan") - received_partner_requests: Mapped[list["PartnerRequest"]] = relationship("PartnerRequest", foreign_keys="PartnerRequest.recipient_id", back_populates="recipient") - categories: Mapped[list["Category"]] = relationship("Category", back_populates="user", cascade="all, delete-orphan") - merchant_rules: Mapped[list["MerchantRule"]] = relationship("MerchantRule", back_populates="user", cascade="all, delete-orphan") - item_keyword_rules: Mapped[list["ItemKeywordRule"]] = relationship("ItemKeywordRule", back_populates="user", cascade="all, delete-orphan") - item_embeddings: Mapped[list["ItemEmbedding"]] = relationship("ItemEmbedding", back_populates="user", cascade="all, delete-orphan") - budgets: Mapped[list["Budget"]] = relationship("Budget", back_populates="user", cascade="all, delete-orphan") - receipts: Mapped[list["Receipt"]] = relationship("Receipt", back_populates="user", cascade="all, delete-orphan") - expenses: Mapped[list["Expense"]] = relationship("Expense", back_populates="user", cascade="all, delete-orphan") - monthly_report_deliveries: Mapped[list["MonthlyReportDelivery"]] = relationship("MonthlyReportDelivery", back_populates="user", cascade="all, delete-orphan") - chat_sessions: Mapped[list["ChatSession"]] = relationship("ChatSession", back_populates="user", cascade="all, delete-orphan") - chat_messages: Mapped[list["ChatMessage"]] = relationship("ChatMessage", back_populates="user", cascade="all, delete-orphan") + created_ledgers: Mapped[list["Ledger"]] = relationship( + "Ledger", + foreign_keys="Ledger.created_by", + back_populates="creator", + cascade="all, delete-orphan", + ) + ledger_memberships: Mapped[list["LedgerMembership"]] = relationship( + "LedgerMembership", back_populates="user", cascade="all, delete-orphan" + ) + sent_partner_requests: Mapped[list["PartnerRequest"]] = relationship( + "PartnerRequest", + foreign_keys="PartnerRequest.requester_id", + back_populates="requester", + cascade="all, delete-orphan", + ) + received_partner_requests: Mapped[list["PartnerRequest"]] = relationship( + "PartnerRequest", foreign_keys="PartnerRequest.recipient_id", back_populates="recipient" + ) + categories: Mapped[list["Category"]] = relationship( + "Category", back_populates="user", cascade="all, delete-orphan" + ) + merchant_rules: Mapped[list["MerchantRule"]] = relationship( + "MerchantRule", back_populates="user", cascade="all, delete-orphan" + ) + item_keyword_rules: Mapped[list["ItemKeywordRule"]] = relationship( + "ItemKeywordRule", back_populates="user", cascade="all, delete-orphan" + ) + item_embeddings: Mapped[list["ItemEmbedding"]] = relationship( + "ItemEmbedding", back_populates="user", cascade="all, delete-orphan" + ) + budgets: Mapped[list["Budget"]] = relationship( + "Budget", back_populates="user", cascade="all, delete-orphan" + ) + receipts: Mapped[list["Receipt"]] = relationship( + "Receipt", back_populates="user", cascade="all, delete-orphan" + ) + expenses: Mapped[list["Expense"]] = relationship( + "Expense", back_populates="user", cascade="all, delete-orphan" + ) + monthly_report_deliveries: Mapped[list["MonthlyReportDelivery"]] = relationship( + "MonthlyReportDelivery", back_populates="user", cascade="all, delete-orphan" + ) + chat_sessions: Mapped[list["ChatSession"]] = relationship( + "ChatSession", back_populates="user", cascade="all, delete-orphan" + ) + chat_messages: Mapped[list["ChatMessage"]] = relationship( + "ChatMessage", back_populates="user", cascade="all, delete-orphan" + ) def __repr__(self) -> str: return f"" diff --git a/backend/app/schemas/user.py b/backend/app/schemas/user.py index f451c77..ac4cb32 100644 --- a/backend/app/schemas/user.py +++ b/backend/app/schemas/user.py @@ -26,7 +26,9 @@ class UserResponse(BaseModel): llm_provider: str | None = None llm_model: str | None = None llm_base_url: str | None = None - has_llm_api_key: bool = False # True if a stored encrypted key exists — never return the raw key + has_llm_api_key: bool = ( + False # True if a stored encrypted key exists — never return the raw key + ) created_at: datetime @@ -45,9 +47,9 @@ class UserLLMSettingsUpdateRequest(BaseModel): llm_provider: str | None = None llm_model: str | None = None - llm_api_key: str | None = None # Plaintext; backend encrypts before storing + llm_api_key: str | None = None # Plaintext; backend encrypts before storing llm_base_url: str | None = None - clear_api_key: bool = False # If True, delete the stored key + clear_api_key: bool = False # If True, delete the stored key class LLMTestRequest(BaseModel): @@ -55,7 +57,7 @@ class LLMTestRequest(BaseModel): provider: str | None = None model: str | None = None - api_key: str | None = None # Plaintext, NOT saved to DB + api_key: str | None = None # Plaintext, NOT saved to DB base_url: str | None = None @@ -63,23 +65,23 @@ class LLMTestResponse(BaseModel): """Response schema for the LLM test endpoint.""" success: bool - response: str | None = None # LLM reply on success - error: str | None = None # Error message on failure + response: str | None = None # LLM reply on success + error: str | None = None # Error message on failure class LLMModelPricing(BaseModel): """Per-provider token pricing when the API exposes it.""" - input_per_1m: float | None = None # USD per 1M input tokens + input_per_1m: float | None = None # USD per 1M input tokens output_per_1m: float | None = None # USD per 1M output tokens class LLMModelInfo(BaseModel): """Metadata for a single chat/vision model returned by the listing endpoint.""" - id: str # model identifier (used in API calls) - name: str # display name + id: str # model identifier (used in API calls) + name: str # display name description: str | None = None context_length: int | None = None pricing: LLMModelPricing | None = None # None = no pricing info available - supports_vision: bool = False # true if image input supported + supports_vision: bool = False # true if image input supported diff --git a/backend/app/services/analytics.py b/backend/app/services/analytics.py index 135eaf7..5090f0d 100644 --- a/backend/app/services/analytics.py +++ b/backend/app/services/analytics.py @@ -30,7 +30,9 @@ logger = structlog.get_logger(__name__) -async def _build_grocery_insights(db: AsyncSession, user_id: uuid.UUID, selected_month: date, month_end: date) -> dict: +async def _build_grocery_insights( + db: AsyncSession, user_id: uuid.UUID, selected_month: date, month_end: date +) -> dict: result = await db.execute( select(ExpenseItem, Expense.amount) .join(Expense, Expense.id == ExpenseItem.expense_id) @@ -62,7 +64,11 @@ async def _build_grocery_insights(db: AsyncSession, user_id: uuid.UUID, selected items_by_expense: dict[uuid.UUID, list[tuple[ExpenseItem, float]]] = defaultdict(list) for item, expense_amount in grocery_item_rows: - raw_amount = float(item.total_price) if item.total_price is not None else float(item.unit_price or 0) * float(item.quantity or 0) + raw_amount = ( + float(item.total_price) + if item.total_price is not None + else float(item.unit_price or 0) * float(item.quantity or 0) + ) approved_totals_by_expense[item.expense_id] = float(expense_amount) items_by_expense[item.expense_id].append((item, raw_amount)) @@ -117,20 +123,40 @@ async def _build_grocery_insights(db: AsyncSession, user_id: uuid.UUID, selected } -async def build_dashboard_analytics(db: AsyncSession, user_id: uuid.UUID, *, month: str | None) -> dict: +async def build_dashboard_analytics( + db: AsyncSession, user_id: uuid.UUID, *, month: str | None +) -> dict: selected_month = month_start_from_string(month) month_end = next_month(selected_month) expenses_result = await db.execute( select(Expense, Category.name) .outerjoin(Category, Category.id == Expense.category_id) - .where(Expense.user_id == user_id, Expense.expense_date >= selected_month, Expense.expense_date < month_end) + .where( + Expense.user_id == user_id, + Expense.expense_date >= selected_month, + Expense.expense_date < month_end, + ) .order_by(Expense.expense_date.desc(), Expense.created_at.desc()) ) expense_rows = expenses_result.all() - money_out = round(sum(float(expense.amount) for expense, _ in expense_rows if expense.transaction_type == TRANSACTION_TYPE_DEBIT), 2) - money_in = round(sum(float(expense.amount) for expense, _ in expense_rows if expense.transaction_type == TRANSACTION_TYPE_CREDIT), 2) + money_out = round( + sum( + float(expense.amount) + for expense, _ in expense_rows + if expense.transaction_type == TRANSACTION_TYPE_DEBIT + ), + 2, + ) + money_in = round( + sum( + float(expense.amount) + for expense, _ in expense_rows + if expense.transaction_type == TRANSACTION_TYPE_CREDIT + ), + 2, + ) monthly_total = money_out net_total = round(money_in - money_out, 2) @@ -143,10 +169,17 @@ async def build_dashboard_analytics(db: AsyncSession, user_id: uuid.UUID, *, mon else: money_in_by_currency[cur] += float(expense.amount) all_currencies = set(list(money_out_by_currency.keys()) + list(money_in_by_currency.keys())) - net_by_currency = {cur: round(money_in_by_currency.get(cur, 0.0) - money_out_by_currency.get(cur, 0.0), 2) for cur in all_currencies} + net_by_currency = { + cur: round(money_in_by_currency.get(cur, 0.0) - money_out_by_currency.get(cur, 0.0), 2) + for cur in all_currencies + } transaction_count = len(expense_rows) - debit_count = sum(1 for expense, _ in expense_rows if expense.transaction_type == TRANSACTION_TYPE_DEBIT) - credit_count = sum(1 for expense, _ in expense_rows if expense.transaction_type == TRANSACTION_TYPE_CREDIT) + debit_count = sum( + 1 for expense, _ in expense_rows if expense.transaction_type == TRANSACTION_TYPE_DEBIT + ) + credit_count = sum( + 1 for expense, _ in expense_rows if expense.transaction_type == TRANSACTION_TYPE_CREDIT + ) average_transaction = round(monthly_total / debit_count, 2) if debit_count else 0.0 average_income = round(money_in / credit_count, 2) if credit_count else 0.0 @@ -180,7 +213,11 @@ async def build_dashboard_analytics(db: AsyncSession, user_id: uuid.UUID, *, mon "is_major_purchase": expense.is_major_purchase, } ) - if expense.transaction_type == TRANSACTION_TYPE_DEBIT and expense.cadence == CADENCE_ONE_TIME and expense.is_major_purchase: + if ( + expense.transaction_type == TRANSACTION_TYPE_DEBIT + and expense.cadence == CADENCE_ONE_TIME + and expense.is_major_purchase + ): major_one_time_purchases.append( { "id": str(expense.id), @@ -199,11 +236,17 @@ async def build_dashboard_analytics(db: AsyncSession, user_id: uuid.UUID, *, mon trend_start = date(selected_month.year - 1, selected_month.month, 1) trend_result = await db.execute( select(Expense) - .where(Expense.user_id == user_id, Expense.expense_date >= trend_start, Expense.expense_date < month_end) + .where( + Expense.user_id == user_id, + Expense.expense_date >= trend_start, + Expense.expense_date < month_end, + ) .order_by(Expense.expense_date.asc()) ) trend_expenses = trend_result.scalars().all() - monthly_trend_map: dict[str, dict[str, float]] = defaultdict(lambda: {"money_in": 0.0, "money_out": 0.0, "net": 0.0}) + monthly_trend_map: dict[str, dict[str, float]] = defaultdict( + lambda: {"money_in": 0.0, "money_out": 0.0, "net": 0.0} + ) for expense in trend_expenses: month_key = expense.expense_date.strftime("%Y-%m") if expense.transaction_type == TRANSACTION_TYPE_CREDIT: @@ -226,7 +269,9 @@ async def build_dashboard_analytics(db: AsyncSession, user_id: uuid.UUID, *, mon category_actuals[category_name] += float(expense.amount) budgets = [] for budget, category_name in budget_rows: - actual = monthly_total if category_name is None else category_actuals.get(category_name, 0.0) + actual = ( + monthly_total if category_name is None else category_actuals.get(category_name, 0.0) + ) budgets.append(serialize_budget(budget, category_name=category_name, actual=actual)) grocery_insights = await _build_grocery_insights(db, user_id, selected_month, month_end) @@ -283,9 +328,21 @@ async def build_dashboard_analytics(db: AsyncSession, user_id: uuid.UUID, *, mon "money_in": money_in, "money_out": money_out, "net": net_total, - "money_out_by_currency": {k: round(v, 2) for k, v in sorted(money_out_by_currency.items(), key=lambda item: (item[0] != "EUR", -item[1]))}, - "money_in_by_currency": {k: round(v, 2) for k, v in sorted(money_in_by_currency.items(), key=lambda item: (item[0] != "EUR", -item[1]))}, - "net_by_currency": dict(sorted(net_by_currency.items(), key=lambda item: item[0] != "EUR")), + "money_out_by_currency": { + k: round(v, 2) + for k, v in sorted( + money_out_by_currency.items(), key=lambda item: (item[0] != "EUR", -item[1]) + ) + }, + "money_in_by_currency": { + k: round(v, 2) + for k, v in sorted( + money_in_by_currency.items(), key=lambda item: (item[0] != "EUR", -item[1]) + ) + }, + "net_by_currency": dict( + sorted(net_by_currency.items(), key=lambda item: item[0] != "EUR") + ), "transaction_count": transaction_count, "average_transaction": average_transaction, "average_outflow": average_transaction, @@ -294,19 +351,27 @@ async def build_dashboard_analytics(db: AsyncSession, user_id: uuid.UUID, *, mon }, "spend_by_category": [ {"name": name, "amount": round(amount, 2)} - for name, amount in sorted(by_category_map.items(), key=lambda item: item[1], reverse=True) + for name, amount in sorted( + by_category_map.items(), key=lambda item: item[1], reverse=True + ) ], "income_by_category": [ {"name": name, "amount": round(amount, 2)} - for name, amount in sorted(income_by_category_map.items(), key=lambda item: item[1], reverse=True) + for name, amount in sorted( + income_by_category_map.items(), key=lambda item: item[1], reverse=True + ) ], "top_merchants": [ {"merchant": name, "amount": round(amount, 2)} - for name, amount in sorted(by_merchant_map.items(), key=lambda item: item[1], reverse=True)[:8] + for name, amount in sorted( + by_merchant_map.items(), key=lambda item: item[1], reverse=True + )[:8] ], "top_income_sources": [ {"merchant": name, "amount": round(amount, 2)} - for name, amount in sorted(income_by_merchant_map.items(), key=lambda item: item[1], reverse=True)[:8] + for name, amount in sorted( + income_by_merchant_map.items(), key=lambda item: item[1], reverse=True + )[:8] ], "monthly_trend": [ { @@ -320,7 +385,9 @@ async def build_dashboard_analytics(db: AsyncSession, user_id: uuid.UUID, *, mon ], "recurring_transactions": recurring_items, "recurring_expenses": recurring_items, - "major_one_time_purchases": sorted(major_one_time_purchases, key=lambda item: item["amount"], reverse=True)[:6], + "major_one_time_purchases": sorted( + major_one_time_purchases, key=lambda item: item["amount"], reverse=True + )[:6], "prepaid_subscriptions": prepaid_subscriptions, "budgets": budgets, "grocery_insights": grocery_insights, diff --git a/backend/app/services/cache.py b/backend/app/services/cache.py index d50bad9..5f078d9 100644 --- a/backend/app/services/cache.py +++ b/backend/app/services/cache.py @@ -85,9 +85,7 @@ async def get_cached_analytics(user_id: uuid.UUID, month: str | None) -> dict | return None -async def set_cached_analytics( - user_id: uuid.UUID, month: str | None, data: dict -) -> None: +async def set_cached_analytics(user_id: uuid.UUID, month: str | None, data: dict) -> None: """Write dashboard analytics to cache. Silently ignores Redis errors.""" if _redis_client is None: return @@ -153,9 +151,7 @@ async def get_cached_llm_models(provider: str, user_id: uuid.UUID) -> list | Non return None -async def set_cached_llm_models( - provider: str, user_id: uuid.UUID, data: list -) -> None: +async def set_cached_llm_models(provider: str, user_id: uuid.UUID, data: list) -> None: """Write model list to cache. Silently ignores Redis errors.""" if _redis_client is None: return diff --git a/backend/app/services/demo_seed.py b/backend/app/services/demo_seed.py index 57a1f9b..b01b43b 100644 --- a/backend/app/services/demo_seed.py +++ b/backend/app/services/demo_seed.py @@ -37,6 +37,7 @@ # Avatar helper — inline SVG data URI, no external dependency, CSP-safe # --------------------------------------------------------------------------- + def _avatar_svg(initials: str, bg: str, fg: str) -> str: """Return a data:image/svg+xml;base64 URI for an initials avatar. @@ -49,7 +50,7 @@ def _avatar_svg(initials: str, bg: str, fg: str) -> str: f'{initials}' - f'' + f"" ) return "data:image/svg+xml;base64," + base64.b64encode(svg.encode()).decode() @@ -136,8 +137,18 @@ def _day(months_ago: int, day: int) -> date: # Expense item helpers # --------------------------------------------------------------------------- -def _item(desc: str, qty: float | None, unit: float | None, total: float, subcat: str | None = None) -> dict: - return {"description": desc, "quantity": qty, "unit_price": unit, "total": total, "subcategory": subcat, "subcategory_confidence": 0.92 if subcat else None} + +def _item( + desc: str, qty: float | None, unit: float | None, total: float, subcat: str | None = None +) -> dict: + return { + "description": desc, + "quantity": qty, + "unit_price": unit, + "total": total, + "subcategory": subcat, + "subcategory_confidence": 0.92 if subcat else None, + } # Grocery items for each month's Alfred run @@ -190,7 +201,13 @@ def _item(desc: str, qty: float | None, unit: float | None, total: float, subcat _item("Organic dark chocolate 85% x8 bars", 8, 4.50, 36.00, "Snacks"), _item("Fresh pappardelle pasta x3", 3, 3.50, 10.50, "Pantry"), _item("Buffalo mozzarella x3", 3, 4.90, 14.70, "Dairy & Eggs"), - _item("Fresh summer truffle 30g (Alfred's 'non-negotiable' splurge)", 1, 54.00, 54.00, "Condiments & Spices"), + _item( + "Fresh summer truffle 30g (Alfred's 'non-negotiable' splurge)", + 1, + 54.00, + 54.00, + "Condiments & Spices", + ), _item("Cherry tomatoes 500g x3", 3, 2.80, 8.40, "Vegetables"), _item("Fresh basil bundle x2", 2, 1.80, 3.60, "Condiments & Spices"), _item("Prosecco DOC x2", 2, 9.90, 19.80, "Beverages"), @@ -217,7 +234,13 @@ def _item(desc: str, qty: float | None, unit: float | None, total: float, subcat _item("Smucker's strawberry jam", 1, 3.29, 3.29, "Condiments & Spices"), _item("Whole milk 1 gallon", 1, 3.80, 3.80, "Dairy & Eggs"), _item("Large eggs x12", 1, 2.89, 2.89, "Dairy & Eggs"), - _item("Gatorade Blue Bolt x6 (electrolyte replenishment — not labeled as such)", 6, 1.29, 7.74, "Beverages"), + _item( + "Gatorade Blue Bolt x6 (electrolyte replenishment — not labeled as such)", + 6, + 1.29, + 7.74, + "Beverages", + ), _item("Clif Bar assorted x8 (field rations, again not labeled)", 8, 1.25, 10.00, "Snacks"), _item("Apples x5 (Aunt May made me)", 5, 0.50, 2.50, "Vegetables"), _item("Instant oatmeal packets x8", 8, 0.45, 3.60, "Breakfast & Cereal"), @@ -302,277 +325,666 @@ def _e( } -def _build_expenses(ledger_manor: uuid.UUID, ledger_fox: uuid.UUID, ledger_jl: uuid.UUID) -> list[dict]: +def _build_expenses( + ledger_manor: uuid.UUID, ledger_fox: uuid.UUID, ledger_jl: uuid.UUID +) -> list[dict]: return [ - # ── Month -2 (two months ago) ──────────────────────────────────────────── - # Big Q1 income - _e("inc-m2-01", "Wayne Enterprises", "280000.00", "Salary", _day(2, 1), tx="credit", - description="Q1 executive dividend — board-approved"), - - _e("m2-01", "Wayne Manor Property Management", "3200.00", "Housing", _day(2, 1), - description="Q2 property insurance & estate levy"), - - _e("m2-02", "Dr. Harleen Quinzel, Psy.D.", "320.00", "Health", _day(2, 2), - cadence="monthly", rg=_RG["therapy"], - description="Session 1: recurring nightmares, social isolation, strong aversion to clowns"), - - _e("m2-03", "Wayne Manor Estate Grid", "1840.00", "Bills", _day(2, 3), - cadence="monthly", rg=_RG["manor_elec"], - description="Wayne Manor electricity — billing cycle"), - - _e("m2-04", "Gotham Industrial Power Corp", "4100.00", "Bills", _day(2, 4), - cadence="monthly", rg=_RG["cave_elec"], - description="Sub-basement power draw (cave ventilation & server farm)"), - - _e("m2-05", "WayneTech Advanced Materials", "3600.00", "Shopping", _day(2, 5), - is_major=True, - description="Tactical-grade Kevlar jacket, ballistic prototype x4 — field test batch"), - - _e("m2-06", "ComfortCave Industries Ltd.", "144.00", "Shopping", _day(2, 6), - description="Custom bat-motif briefs — 48-pack (comfort is non-negotiable)"), - - _e("m2-07", "Dr. Harleen Quinzel, Psy.D.", "320.00", "Health", _day(2, 9), - cadence="monthly", rg=_RG["therapy"], - description="Session 2: trust issues, childhood trauma, unhealthy obsession with justice"), - - _e("m2-08", "Metropolis Geological Survey", "42000.00", "WayneTech R&D", _day(2, 10), - is_major=True, - description="Kryptonite sample Class-A 200g — research & containment (strictly precautionary)"), - - _e("m2-09", "The Blue Orchid, Nanda Parbat", "1240.00", "Dining", _day(2, 12), - description="Business dinner with R. al Ghul — 'League networking'. Ordered the tasting menu."), - - _e("m2-10", "Gotham Opera House", "1800.00", "Entertainment", _day(2, 14), - description="La Traviata — Box A (10 seats). Arrived via grappling hook, left via limousine."), - - _e("m2-11", "Dr. Harleen Quinzel, Psy.D.", "320.00", "Health", _day(2, 16), - cadence="monthly", rg=_RG["therapy"], - description="Session 3: boundary-setting, identity concealment & its psychological cost"), - - _e("m2-12", "Two Sides Brasserie", "380.00", "Dining", _day(2, 18), - description="Lunch with Harvey Dent — pre-acid incident. Split the bill 50/50."), - - _e("m2-13", "Anthropic (Claude Code)", "180.00", "Shopping", _day(2, 20), - cadence="monthly", rg=_RG["claude"], - description="Monthly AI assistant subscription — indispensable for cave ops planning"), - - _e("m2-14", "Gotham City Asylum Foundation", "50000.00", "Wayne Foundation", _day(2, 21), - is_major=True, tx="debit", - description="Annual charitable endowment — rehabilitation programmes fund"), - - _e("m2-15", "Dr. Harleen Quinzel, Psy.D.", "320.00", "Health", _day(2, 23), - cadence="monthly", rg=_RG["therapy"], - description="Session 4: parental loss, long-term coping strategies (ongoing since age 8)"), - - _e("m2-16", "GothamAir Private Charter", "18500.00", "Travel", _day(2, 24), - is_major=True, - description="Gotham ↔ Nanda Parbat return — cargo hold includes 'sports equipment'"), - - _e("m2-17", "Billa Supermercato", "345.00", "Groceries", _day(2, 26), - description="Alfred's weekly provisions — he insists on checking every label", - items=_M2_GROCERY_ITEMS), - - _e("m2-18", "Wayne Foundation Events", "8800.00", "Entertainment", _day(2, 28), - is_major=True, - description="Annual Gala — 22 VIP tickets. Wore the tuxedo, not the other suit."), - - _e("m2-19", "WayneTech Manufacturing", "1600.00", "Crime Fighting", _day(2, 30), - description="Batarang replenishment pack 200 units — monthly supply gone in 3 weeks (Gotham is busy)"), - + _e( + "inc-m2-01", + "Wayne Enterprises", + "280000.00", + "Salary", + _day(2, 1), + tx="credit", + description="Q1 executive dividend — board-approved", + ), + _e( + "m2-01", + "Wayne Manor Property Management", + "3200.00", + "Housing", + _day(2, 1), + description="Q2 property insurance & estate levy", + ), + _e( + "m2-02", + "Dr. Harleen Quinzel, Psy.D.", + "320.00", + "Health", + _day(2, 2), + cadence="monthly", + rg=_RG["therapy"], + description="Session 1: recurring nightmares, social isolation, strong aversion to clowns", + ), + _e( + "m2-03", + "Wayne Manor Estate Grid", + "1840.00", + "Bills", + _day(2, 3), + cadence="monthly", + rg=_RG["manor_elec"], + description="Wayne Manor electricity — billing cycle", + ), + _e( + "m2-04", + "Gotham Industrial Power Corp", + "4100.00", + "Bills", + _day(2, 4), + cadence="monthly", + rg=_RG["cave_elec"], + description="Sub-basement power draw (cave ventilation & server farm)", + ), + _e( + "m2-05", + "WayneTech Advanced Materials", + "3600.00", + "Shopping", + _day(2, 5), + is_major=True, + description="Tactical-grade Kevlar jacket, ballistic prototype x4 — field test batch", + ), + _e( + "m2-06", + "ComfortCave Industries Ltd.", + "144.00", + "Shopping", + _day(2, 6), + description="Custom bat-motif briefs — 48-pack (comfort is non-negotiable)", + ), + _e( + "m2-07", + "Dr. Harleen Quinzel, Psy.D.", + "320.00", + "Health", + _day(2, 9), + cadence="monthly", + rg=_RG["therapy"], + description="Session 2: trust issues, childhood trauma, unhealthy obsession with justice", + ), + _e( + "m2-08", + "Metropolis Geological Survey", + "42000.00", + "WayneTech R&D", + _day(2, 10), + is_major=True, + description="Kryptonite sample Class-A 200g — research & containment (strictly precautionary)", + ), + _e( + "m2-09", + "The Blue Orchid, Nanda Parbat", + "1240.00", + "Dining", + _day(2, 12), + description="Business dinner with R. al Ghul — 'League networking'. Ordered the tasting menu.", + ), + _e( + "m2-10", + "Gotham Opera House", + "1800.00", + "Entertainment", + _day(2, 14), + description="La Traviata — Box A (10 seats). Arrived via grappling hook, left via limousine.", + ), + _e( + "m2-11", + "Dr. Harleen Quinzel, Psy.D.", + "320.00", + "Health", + _day(2, 16), + cadence="monthly", + rg=_RG["therapy"], + description="Session 3: boundary-setting, identity concealment & its psychological cost", + ), + _e( + "m2-12", + "Two Sides Brasserie", + "380.00", + "Dining", + _day(2, 18), + description="Lunch with Harvey Dent — pre-acid incident. Split the bill 50/50.", + ), + _e( + "m2-13", + "Anthropic (Claude Code)", + "180.00", + "Shopping", + _day(2, 20), + cadence="monthly", + rg=_RG["claude"], + description="Monthly AI assistant subscription — indispensable for cave ops planning", + ), + _e( + "m2-14", + "Gotham City Asylum Foundation", + "50000.00", + "Wayne Foundation", + _day(2, 21), + is_major=True, + tx="debit", + description="Annual charitable endowment — rehabilitation programmes fund", + ), + _e( + "m2-15", + "Dr. Harleen Quinzel, Psy.D.", + "320.00", + "Health", + _day(2, 23), + cadence="monthly", + rg=_RG["therapy"], + description="Session 4: parental loss, long-term coping strategies (ongoing since age 8)", + ), + _e( + "m2-16", + "GothamAir Private Charter", + "18500.00", + "Travel", + _day(2, 24), + is_major=True, + description="Gotham ↔ Nanda Parbat return — cargo hold includes 'sports equipment'", + ), + _e( + "m2-17", + "Billa Supermercato", + "345.00", + "Groceries", + _day(2, 26), + description="Alfred's weekly provisions — he insists on checking every label", + items=_M2_GROCERY_ITEMS, + ), + _e( + "m2-18", + "Wayne Foundation Events", + "8800.00", + "Entertainment", + _day(2, 28), + is_major=True, + description="Annual Gala — 22 VIP tickets. Wore the tuxedo, not the other suit.", + ), + _e( + "m2-19", + "WayneTech Manufacturing", + "1600.00", + "Crime Fighting", + _day(2, 30), + description="Batarang replenishment pack 200 units — monthly supply gone in 3 weeks (Gotham is busy)", + ), # Wayne Manor Ops ledger — month -2 - _e("l-manor-m2-01", "Whole Foods Market Gotham", "1800.00", "Groceries", _day(2, 8), - ledger_id=ledger_manor, description="Wayne Manor monthly provisions — Alfred's bulk order"), - _e("l-manor-m2-02", "Gotham Green Grounds Ltd.", "850.00", "Other", _day(2, 15), - ledger_id=ledger_manor, description="Manor grounds bi-monthly maintenance & topiary"), - + _e( + "l-manor-m2-01", + "Whole Foods Market Gotham", + "1800.00", + "Groceries", + _day(2, 8), + ledger_id=ledger_manor, + description="Wayne Manor monthly provisions — Alfred's bulk order", + ), + _e( + "l-manor-m2-02", + "Gotham Green Grounds Ltd.", + "850.00", + "Other", + _day(2, 15), + ledger_id=ledger_manor, + description="Manor grounds bi-monthly maintenance & topiary", + ), # Fox-Wayne Labs ledger — month -2 - _e("l-fox-m2-01", "Gotham Advanced Composites Inc.", "12400.00", "WayneTech R&D", _day(2, 22), - ledger_id=ledger_fox, is_major=True, - description="Fox-Wayne Labs Q2 raw materials — carbon fiber, titanium alloy sheets"), - + _e( + "l-fox-m2-01", + "Gotham Advanced Composites Inc.", + "12400.00", + "WayneTech R&D", + _day(2, 22), + ledger_id=ledger_fox, + is_major=True, + description="Fox-Wayne Labs Q2 raw materials — carbon fiber, titanium alloy sheets", + ), # JL Petty Cash — month -2 - _e("l-jl-m2-01", "Gotham Roast Coffee", "145.00", "Dining", _day(2, 29), - ledger_id=ledger_jl, description="JL HQ monthly coffee & snack fund. Aquaman drinks an unreasonable amount."), - + _e( + "l-jl-m2-01", + "Gotham Roast Coffee", + "145.00", + "Dining", + _day(2, 29), + ledger_id=ledger_jl, + description="JL HQ monthly coffee & snack fund. Aquaman drinks an unreasonable amount.", + ), # ── Month -1 (last month) ──────────────────────────────────────────────── - - _e("inc-m1-01", "Wayne Enterprises", "95000.00", "Salary", _day(1, 1), tx="credit", - description="Monthly executive compensation — board-approved"), - - _e("m1-01", "Wayne Manor Estate Grid", "1840.00", "Bills", _day(1, 1), - cadence="monthly", rg=_RG["manor_elec"], - description="Wayne Manor electricity — previous billing cycle"), - - _e("m1-02", "Gotham Industrial Power Corp", "4100.00", "Bills", _day(1, 1), - cadence="monthly", rg=_RG["cave_elec"], - description="Sub-basement power draw — previous billing (the servers never sleep)"), - - _e("m1-03", "WayneTech BioLab", "8900.00", "Crime Fighting", _day(1, 3), - is_major=True, - description="Anti-Joker toxin research Phase II — synthesis & antidote stockpile"), - - _e("m1-04", "WayneTech Engineering", "2800.00", "Shopping", _day(1, 5), - description="Grappling hook upgrade v4.0 — titanium core, 300m rated, silent deployment"), - - _e("m1-05", "Dr. Harleen Quinzel, Psy.D.", "320.00", "Health", _day(1, 6), - cadence="monthly", rg=_RG["therapy"], - description="Session 5: processing the Ra's al Ghul dinner (again). Dr. Q seems concerned."), - - _e("m1-06", "Gotham Sports Medicine Clinic", "480.00", "Health", _day(1, 8), - description="Sports physio — knee (recurring injury, cause of injury: classified)"), - - _e("m1-07", "WayneTech Special Projects", "29500.00", "WayneTech R&D", _day(1, 10), - is_major=True, - description="Kryptonite containment unit — Lucius Fox custom-spec, lead-lined with biometric lock"), - - _e("m1-08", "GothamAir Private Charter", "2400.00", "Travel", _day(1, 11), - description="Gotham → Metropolis business class — JL Emergency Summit (not my idea)"), - - _e("m1-09", "The Diamond Restaurant", "940.00", "Dining", _day(1, 13), - description="Dinner with Diana Prince — she ordered the entire seafood section. Respect."), - - _e("m1-10", "Dr. Harleen Quinzel, Psy.D.", "320.00", "Health", _day(1, 14), - cadence="monthly", rg=_RG["therapy"], - description="Session 6: dinner with Diana (complicated), ongoing Ra's situation (very complicated)"), - - _e("m1-11", "Himalayan Botanicals Ltd.", "11200.00", "Shopping", _day(1, 15), - is_major=True, - description="Blue lotus flower seeds x500 — rare Nanda Parbat cultivar (research purposes ONLY)"), - - _e("m1-12", "Gotham Knights Sports Group", "3200.00", "Entertainment", _day(1, 17), - description="VIP courtside box (16 seats) — Knights vs. Metropolis United. Clark was there. Awkward."), - - _e("m1-13", "ComfortCave Industries Ltd.", "72.00", "Shopping", _day(1, 18), - description="Custom bat-motif briefs — 24-pack (half-order, trying to cut back)"), - - _e("m1-14", "Anthropic (Claude Code)", "180.00", "Shopping", _day(1, 19), - cadence="monthly", rg=_RG["claude"], - description="Monthly AI assistant — saved 3 hours of cave analysis this week"), - - _e("m1-15", "Dr. Harleen Quinzel, Psy.D.", "320.00", "Health", _day(1, 21), - cadence="monthly", rg=_RG["therapy"], - description="Session 7: she asked why I keep attending Ra's dinners. I said networking."), - - _e("m1-16", "Gotham Children's Hospital", "75000.00", "Wayne Foundation", _day(1, 23), - is_major=True, - description="New cardiac unit sponsorship — anonymous donor (it's not anonymous)"), - - _e("m1-17", "Billa Supermercato", "412.00", "Groceries", _day(1, 25), - description="Alfred's weekly provisions — he added salmon this month", - items=_M1_GROCERY_ITEMS), - - _e("m1-18", "WayneTech Ordnance", "2100.00", "Crime Fighting", _day(1, 25), - description="Explosive gel refill cartridges — batch order (Gotham especially busy)"), - - _e("m1-19", "WayneTech Materials Supply", "7200.00", "Shopping", _day(1, 27), - is_major=True, - description="Armored motorcycle jacket bulk order x12 — for the team (just Bruce)"), - - _e("m1-20", "Dr. Harleen Quinzel, Psy.D.", "320.00", "Health", _day(1, 28), - cadence="monthly", rg=_RG["therapy"], - description="Session 8: blue flower seeds purchase flagged as 'concerning pattern'. Agreed to discuss."), - - _e("m1-21", "WayneTech Drone Division", "44000.00", "Crime Fighting", _day(1, 30), - is_major=True, - description="Gotham surveillance drone fleet x8 — silent rotors, 48h battery, Lucius-certified"), - + _e( + "inc-m1-01", + "Wayne Enterprises", + "95000.00", + "Salary", + _day(1, 1), + tx="credit", + description="Monthly executive compensation — board-approved", + ), + _e( + "m1-01", + "Wayne Manor Estate Grid", + "1840.00", + "Bills", + _day(1, 1), + cadence="monthly", + rg=_RG["manor_elec"], + description="Wayne Manor electricity — previous billing cycle", + ), + _e( + "m1-02", + "Gotham Industrial Power Corp", + "4100.00", + "Bills", + _day(1, 1), + cadence="monthly", + rg=_RG["cave_elec"], + description="Sub-basement power draw — previous billing (the servers never sleep)", + ), + _e( + "m1-03", + "WayneTech BioLab", + "8900.00", + "Crime Fighting", + _day(1, 3), + is_major=True, + description="Anti-Joker toxin research Phase II — synthesis & antidote stockpile", + ), + _e( + "m1-04", + "WayneTech Engineering", + "2800.00", + "Shopping", + _day(1, 5), + description="Grappling hook upgrade v4.0 — titanium core, 300m rated, silent deployment", + ), + _e( + "m1-05", + "Dr. Harleen Quinzel, Psy.D.", + "320.00", + "Health", + _day(1, 6), + cadence="monthly", + rg=_RG["therapy"], + description="Session 5: processing the Ra's al Ghul dinner (again). Dr. Q seems concerned.", + ), + _e( + "m1-06", + "Gotham Sports Medicine Clinic", + "480.00", + "Health", + _day(1, 8), + description="Sports physio — knee (recurring injury, cause of injury: classified)", + ), + _e( + "m1-07", + "WayneTech Special Projects", + "29500.00", + "WayneTech R&D", + _day(1, 10), + is_major=True, + description="Kryptonite containment unit — Lucius Fox custom-spec, lead-lined with biometric lock", + ), + _e( + "m1-08", + "GothamAir Private Charter", + "2400.00", + "Travel", + _day(1, 11), + description="Gotham → Metropolis business class — JL Emergency Summit (not my idea)", + ), + _e( + "m1-09", + "The Diamond Restaurant", + "940.00", + "Dining", + _day(1, 13), + description="Dinner with Diana Prince — she ordered the entire seafood section. Respect.", + ), + _e( + "m1-10", + "Dr. Harleen Quinzel, Psy.D.", + "320.00", + "Health", + _day(1, 14), + cadence="monthly", + rg=_RG["therapy"], + description="Session 6: dinner with Diana (complicated), ongoing Ra's situation (very complicated)", + ), + _e( + "m1-11", + "Himalayan Botanicals Ltd.", + "11200.00", + "Shopping", + _day(1, 15), + is_major=True, + description="Blue lotus flower seeds x500 — rare Nanda Parbat cultivar (research purposes ONLY)", + ), + _e( + "m1-12", + "Gotham Knights Sports Group", + "3200.00", + "Entertainment", + _day(1, 17), + description="VIP courtside box (16 seats) — Knights vs. Metropolis United. Clark was there. Awkward.", + ), + _e( + "m1-13", + "ComfortCave Industries Ltd.", + "72.00", + "Shopping", + _day(1, 18), + description="Custom bat-motif briefs — 24-pack (half-order, trying to cut back)", + ), + _e( + "m1-14", + "Anthropic (Claude Code)", + "180.00", + "Shopping", + _day(1, 19), + cadence="monthly", + rg=_RG["claude"], + description="Monthly AI assistant — saved 3 hours of cave analysis this week", + ), + _e( + "m1-15", + "Dr. Harleen Quinzel, Psy.D.", + "320.00", + "Health", + _day(1, 21), + cadence="monthly", + rg=_RG["therapy"], + description="Session 7: she asked why I keep attending Ra's dinners. I said networking.", + ), + _e( + "m1-16", + "Gotham Children's Hospital", + "75000.00", + "Wayne Foundation", + _day(1, 23), + is_major=True, + description="New cardiac unit sponsorship — anonymous donor (it's not anonymous)", + ), + _e( + "m1-17", + "Billa Supermercato", + "412.00", + "Groceries", + _day(1, 25), + description="Alfred's weekly provisions — he added salmon this month", + items=_M1_GROCERY_ITEMS, + ), + _e( + "m1-18", + "WayneTech Ordnance", + "2100.00", + "Crime Fighting", + _day(1, 25), + description="Explosive gel refill cartridges — batch order (Gotham especially busy)", + ), + _e( + "m1-19", + "WayneTech Materials Supply", + "7200.00", + "Shopping", + _day(1, 27), + is_major=True, + description="Armored motorcycle jacket bulk order x12 — for the team (just Bruce)", + ), + _e( + "m1-20", + "Dr. Harleen Quinzel, Psy.D.", + "320.00", + "Health", + _day(1, 28), + cadence="monthly", + rg=_RG["therapy"], + description="Session 8: blue flower seeds purchase flagged as 'concerning pattern'. Agreed to discuss.", + ), + _e( + "m1-21", + "WayneTech Drone Division", + "44000.00", + "Crime Fighting", + _day(1, 30), + is_major=True, + description="Gotham surveillance drone fleet x8 — silent rotors, 48h battery, Lucius-certified", + ), # Wayne Manor Ops ledger — month -1 - _e("l-manor-m1-01", "Whole Foods Market Gotham", "1920.00", "Groceries", _day(1, 6), - ledger_id=ledger_manor, description="Wayne Manor monthly provisions"), - _e("l-manor-m1-02", "CaveClean Industrial Services", "440.00", "Groceries", _day(1, 28), - ledger_id=ledger_manor, description="Batcave deep-clean supplies — industrial-grade, bat-safe certified"), - + _e( + "l-manor-m1-01", + "Whole Foods Market Gotham", + "1920.00", + "Groceries", + _day(1, 6), + ledger_id=ledger_manor, + description="Wayne Manor monthly provisions", + ), + _e( + "l-manor-m1-02", + "CaveClean Industrial Services", + "440.00", + "Groceries", + _day(1, 28), + ledger_id=ledger_manor, + description="Batcave deep-clean supplies — industrial-grade, bat-safe certified", + ), # Fox-Wayne Labs ledger — month -1 - _e("l-fox-m1-01", "CognitionTech Computing", "8900.00", "WayneTech R&D", _day(1, 16), - ledger_id=ledger_fox, is_major=True, - description="Batcomputer RAM expansion — Lucius Fox spec, 2PB upgrade"), - + _e( + "l-fox-m1-01", + "CognitionTech Computing", + "8900.00", + "WayneTech R&D", + _day(1, 16), + ledger_id=ledger_fox, + is_major=True, + description="Batcomputer RAM expansion — Lucius Fox spec, 2PB upgrade", + ), # JL Petty Cash — month -1 - _e("l-jl-m1-01", "Gotham Pizza Palace", "280.00", "Dining", _day(1, 20), - ledger_id=ledger_jl, - description="JL meeting dinner — 4 large pizzas. Aquaman ate 6 slices. Arthur pays next time."), - + _e( + "l-jl-m1-01", + "Gotham Pizza Palace", + "280.00", + "Dining", + _day(1, 20), + ledger_id=ledger_jl, + description="JL meeting dinner — 4 large pizzas. Aquaman ate 6 slices. Arthur pays next time.", + ), # ── Current month ──────────────────────────────────────────────────────── - - _e("inc-m0-01", "Wayne Enterprises", "95000.00", "Salary", _day(0, 1), tx="credit", - description="Monthly executive compensation — board-approved"), - - _e("m0-01", "Wayne Manor Estate Grid", "1840.00", "Bills", _day(0, 1), - cadence="monthly", rg=_RG["manor_elec"], - description="Wayne Manor electricity — previous billing cycle"), - - _e("m0-02", "Gotham Industrial Power Corp", "4100.00", "Bills", _day(0, 1), - cadence="monthly", rg=_RG["cave_elec"], - description="Sub-basement power draw — previous billing"), - - _e("m0-03", "Dr. Harleen Quinzel, Psy.D.", "320.00", "Health", _day(0, 2), - cadence="monthly", rg=_RG["therapy"], - description="Session 9: the blue flower situation. She brought in a specialist colleague."), - - _e("m0-04", "WayneTech Engineering", "4800.00", "Shopping", _day(0, 3), - description="Tactical utility belt prototype v7 — grappling hook, gel dispenser, 12 compartments"), - - _e("m0-05", "Caffè Romano, Gotham CBD", "280.00", "Dining", _day(0, 5), - description="Business lunch with Clark Kent (Daily Planet) — he asked a lot of questions. Nice tie."), - - _e("m0-06", "Metropolis Advanced Materials", "68000.00", "WayneTech R&D", _day(0, 6), - is_major=True, - description="Kryptonite acquisition: 3 premium-grade specimens — green, red, gold variants (precautionary)"), - - _e("m0-07", "Dr. Harleen Quinzel, Psy.D.", "320.00", "Health", _day(0, 9), - cadence="monthly", rg=_RG["therapy"], - description="Session 10: she asked why I now own Kryptonite in three colours. Still classified."), - - _e("m0-08", "al-Ghul Estate, Nanda Parbat", "880.00", "Dining", _day(0, 10), - description="League of Shadows annual networking dinner — third year attending. Ra's is a good host."), - - _e("m0-09", "WayneTech Fuels Lab", "1240.00", "Crime Fighting", _day(0, 12), - description="Batmobile premium synthetic fuel blend — 180L, high-octane, low thermal signature"), - - _e("m0-grocery", "Billa Supermercato", "296.00", "Groceries", _day(0, 12), - description="Alfred's current-month provisions — the truffle was 'non-negotiable', apparently", - items=_M0_GROCERY_ITEMS), - - _e("m0-10", "ComfortCave Industries Ltd.", "144.00", "Shopping", _day(0, 13), - description="Custom bat-motif briefs — BACK TO 48-PACK. The half-order experiment failed."), - - _e("m0-11", "The Grand Ballroom, Gotham Plaza", "18500.00", "Entertainment", _day(0, 15), - is_major=True, - description="Wayne Enterprises Q2 Staff Summer Party — 340 attendees, open bar (Alfred supervised)"), - - _e("m0-12", "Dr. Harleen Quinzel, Psy.D.", "320.00", "Health", _day(0, 16), - cadence="monthly", rg=_RG["therapy"], - description="Session 11: staff party incident (joker-themed decoration — someone's fired). Bilateral trauma."), - - _e("m0-13", "Gotham Addiction Recovery Center", "100000.00", "Wayne Foundation", _day(0, 17), - is_major=True, - description="New wing naming rights + construction sponsorship — 'The Thomas & Martha Wayne Wing'"), - - _e("m0-14", "Anthropic (Claude Code)", "180.00", "Shopping", _day(0, 18), - cadence="monthly", rg=_RG["claude"], - description="Monthly AI assistant — used it to analyse Kryptonite acquisition ROI. Helpful."), - - _e("m0-15", "Gotham Sports Medicine Clinic", "750.00", "Health", _day(0, 19), - description="Sports physio — knee (same knee). 'You really need to stop doing whatever you're doing.'"), - - _e("m0-16", "WayneTech Optics Division", "1800.00", "Crime Fighting", _day(0, 20), - description="Night vision replacement unit x2, long-range — the gargoyle landing was a mistake"), - + _e( + "inc-m0-01", + "Wayne Enterprises", + "95000.00", + "Salary", + _day(0, 1), + tx="credit", + description="Monthly executive compensation — board-approved", + ), + _e( + "m0-01", + "Wayne Manor Estate Grid", + "1840.00", + "Bills", + _day(0, 1), + cadence="monthly", + rg=_RG["manor_elec"], + description="Wayne Manor electricity — previous billing cycle", + ), + _e( + "m0-02", + "Gotham Industrial Power Corp", + "4100.00", + "Bills", + _day(0, 1), + cadence="monthly", + rg=_RG["cave_elec"], + description="Sub-basement power draw — previous billing", + ), + _e( + "m0-03", + "Dr. Harleen Quinzel, Psy.D.", + "320.00", + "Health", + _day(0, 2), + cadence="monthly", + rg=_RG["therapy"], + description="Session 9: the blue flower situation. She brought in a specialist colleague.", + ), + _e( + "m0-04", + "WayneTech Engineering", + "4800.00", + "Shopping", + _day(0, 3), + description="Tactical utility belt prototype v7 — grappling hook, gel dispenser, 12 compartments", + ), + _e( + "m0-05", + "Caffè Romano, Gotham CBD", + "280.00", + "Dining", + _day(0, 5), + description="Business lunch with Clark Kent (Daily Planet) — he asked a lot of questions. Nice tie.", + ), + _e( + "m0-06", + "Metropolis Advanced Materials", + "68000.00", + "WayneTech R&D", + _day(0, 6), + is_major=True, + description="Kryptonite acquisition: 3 premium-grade specimens — green, red, gold variants (precautionary)", + ), + _e( + "m0-07", + "Dr. Harleen Quinzel, Psy.D.", + "320.00", + "Health", + _day(0, 9), + cadence="monthly", + rg=_RG["therapy"], + description="Session 10: she asked why I now own Kryptonite in three colours. Still classified.", + ), + _e( + "m0-08", + "al-Ghul Estate, Nanda Parbat", + "880.00", + "Dining", + _day(0, 10), + description="League of Shadows annual networking dinner — third year attending. Ra's is a good host.", + ), + _e( + "m0-09", + "WayneTech Fuels Lab", + "1240.00", + "Crime Fighting", + _day(0, 12), + description="Batmobile premium synthetic fuel blend — 180L, high-octane, low thermal signature", + ), + _e( + "m0-grocery", + "Billa Supermercato", + "296.00", + "Groceries", + _day(0, 12), + description="Alfred's current-month provisions — the truffle was 'non-negotiable', apparently", + items=_M0_GROCERY_ITEMS, + ), + _e( + "m0-10", + "ComfortCave Industries Ltd.", + "144.00", + "Shopping", + _day(0, 13), + description="Custom bat-motif briefs — BACK TO 48-PACK. The half-order experiment failed.", + ), + _e( + "m0-11", + "The Grand Ballroom, Gotham Plaza", + "18500.00", + "Entertainment", + _day(0, 15), + is_major=True, + description="Wayne Enterprises Q2 Staff Summer Party — 340 attendees, open bar (Alfred supervised)", + ), + _e( + "m0-12", + "Dr. Harleen Quinzel, Psy.D.", + "320.00", + "Health", + _day(0, 16), + cadence="monthly", + rg=_RG["therapy"], + description="Session 11: staff party incident (joker-themed decoration — someone's fired). Bilateral trauma.", + ), + _e( + "m0-13", + "Gotham Addiction Recovery Center", + "100000.00", + "Wayne Foundation", + _day(0, 17), + is_major=True, + description="New wing naming rights + construction sponsorship — 'The Thomas & Martha Wayne Wing'", + ), + _e( + "m0-14", + "Anthropic (Claude Code)", + "180.00", + "Shopping", + _day(0, 18), + cadence="monthly", + rg=_RG["claude"], + description="Monthly AI assistant — used it to analyse Kryptonite acquisition ROI. Helpful.", + ), + _e( + "m0-15", + "Gotham Sports Medicine Clinic", + "750.00", + "Health", + _day(0, 19), + description="Sports physio — knee (same knee). 'You really need to stop doing whatever you're doing.'", + ), + _e( + "m0-16", + "WayneTech Optics Division", + "1800.00", + "Crime Fighting", + _day(0, 20), + description="Night vision replacement unit x2, long-range — the gargoyle landing was a mistake", + ), # Wayne Manor Ops ledger — current month - _e("l-manor-m0-01", "Whole Foods Market Gotham", "2100.00", "Groceries", _day(0, 14), - ledger_id=ledger_manor, description="Wayne Manor monthly provisions — Alfred splurged on truffles"), - + _e( + "l-manor-m0-01", + "Whole Foods Market Gotham", + "2100.00", + "Groceries", + _day(0, 14), + ledger_id=ledger_manor, + description="Wayne Manor monthly provisions — Alfred splurged on truffles", + ), # Fox-Wayne Labs ledger — current month - _e("l-fox-m0-01", "SentinelTech Systems", "19500.00", "WayneTech R&D", _day(0, 8), - ledger_id=ledger_fox, is_major=True, - description="Fox-Wayne Labs — long-range thermal imaging prototype system v2"), - + _e( + "l-fox-m0-01", + "SentinelTech Systems", + "19500.00", + "WayneTech R&D", + _day(0, 8), + ledger_id=ledger_fox, + is_major=True, + description="Fox-Wayne Labs — long-range thermal imaging prototype system v2", + ), # JL Petty Cash — current month - _e("l-jl-m0-01", "Themyscira Premium Caterers", "1200.00", "Dining", _day(0, 11), - ledger_id=ledger_jl, - description="JL Summit catering — Diana's family catering company. Excellent, but NO seafood for Arthur."), + _e( + "l-jl-m0-01", + "Themyscira Premium Caterers", + "1200.00", + "Dining", + _day(0, 11), + ledger_id=ledger_jl, + description="JL Summit catering — Diana's family catering company. Excellent, but NO seafood for Arthur.", + ), ] @@ -580,6 +992,7 @@ def _build_expenses(ledger_manor: uuid.UUID, ledger_fox: uuid.UUID, ledger_jl: u # Budget seed # --------------------------------------------------------------------------- + def _build_budgets(cat_by_name: dict[str, uuid.UUID]) -> list[dict]: month = _month_start(0) return [ @@ -648,255 +1061,601 @@ def _build_budgets(cat_by_name: dict[str, uuid.UUID]) -> list[dict]: } -def _build_peter_expenses(ledger_lab: uuid.UUID, ledger_avengers: uuid.UUID, ledger_may: uuid.UUID) -> list[dict]: +def _build_peter_expenses( + ledger_lab: uuid.UUID, ledger_avengers: uuid.UUID, ledger_may: uuid.UUID +) -> list[dict]: return [ - # ── Month -2 ───────────────────────────────────────────────────────────── - - _e("p-inc-m2-01", "Daily Bugle Photography", "340.00", "Salary", _day(2, 1), tx="credit", - description="J. Jonah Jameson's freelance check — docked €160 for 'Spider-Man photos not menacing enough'"), - - _e("p-inc-m2-02", "Empire State University", "280.00", "Salary", _day(2, 5), tx="credit", - description="Chemistry TA stipend — grading papers on polymers I invented two years ago"), - - _e("p-m2-rent", "Queens Landlord LLC", "850.00", "Housing", _day(2, 2), - cadence="monthly", rg=_PETER_RG["rent"], - description="Monthly rent — Mrs Chen gave me an extension. She said 'you're a good boy, Peter'. I said nothing."), - - _e("p-m2-webfluid", "Oscorp Industrial Chemicals", "180.00", "Web Fluid R&D", _day(2, 3), - cadence="monthly", rg=_PETER_RG["web_fluid"], - description="Web fluid base polymer — monthly supply. Lab notebook reason: 'advanced thesis research on adhesives'"), - - _e("p-m2-therapy-01", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(2, 4), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 1: we started with Uncle Ben. We always start with Uncle Ben."), - - _e("p-m2-medical-01", "Queens Medical Center", "420.00", "Health", _day(2, 6), - description="Rib fractures x2, dislocated shoulder — cause of injury entered as 'bicycle accident'. 4th visit this quarter."), - - _e("p-m2-suit-01", "Chinatown Fabric District", "34.00", "Crime Fighting", _day(2, 7), - description="Red/blue spandex 3m + UV-resistant dye — told the cashier it was for a 'theatre project'"), - - _e("p-m2-ramen", "H-Mart Queens", "8.50", "Dining", _day(2, 8), - description="Emergency ramen run — 3rd time this week. Ned says I should learn to cook. Ned is right."), - - _e("p-m2-camera", "B&H Photo Video NYC", "280.00", "Shopping", _day(2, 10), - is_major=True, - description="Nikon zoom lens — previous one destroyed in the Vulture incident. Expensed to Bugle as 'equipment wear'"), - - _e("p-m2-therapy-02", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(2, 12), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 2: still Uncle Ben. Briefly touched on Gwen. Dr. Madison suggested journaling. Will not journal."), - - _e("p-m2-cartridge", "Oscorp Advanced Materials", "320.00", "Web Fluid R&D", _day(2, 14), - is_major=True, - description="High-tensile web cartridges x12 — monthly supply. Told Ned they're '3D printing filament'. He knows."), - - _e("p-m2-chem-01", "Staten Island Chemical Co.", "95.00", "Web Fluid R&D", _day(2, 15), - description="Tensile modifier compound — web strength upgrade. MJ noticed the chemicals. I said 'for school'."), - - _e("p-m2-backpack-01", "Target Queens", "28.00", "Shopping", _day(2, 16), - description="Backpack #4 this year — previous ones: left on rooftop, caught fire, dissolved in acid (don't ask)"), - - _e("p-m2-therapy-03", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(2, 18), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 3: lighter session! We discussed compartmentalization. Very relevant to my situation."), - - _e("p-m2-book", "ESU Campus Bookstore", "74.00", "Shopping", _day(2, 19), - description="Advanced Organic Chemistry vol. 4 — for class AND for other reasons I will not specify here"), - - _e("p-m2-mj-01", "Delmar's Deli-Grocery", "22.00", "Dining", _day(2, 20), - description="Dinner with MJ — she had the salmon; I had the #3 combo. She tried to pay. I declined. Error."), - - _e("p-m2-grocery", "Walmart Supercenter Queens", "52.00", "Groceries", _day(2, 22), - description="Monthly provisions — ramen x24, PB&J supplies. Aunt May would not approve of this diet.", - items=_M2_PETER_GROCERY_ITEMS), - - _e("p-m2-therapy-04", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(2, 25), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 4: discussed masks — metaphor and literal. She doesn't know it's both."), - - _e("p-m2-metro", "MTA New York City Transit", "33.00", "Transport", _day(2, 26), - cadence="monthly", rg=_PETER_RG["metro"], - description="Monthly MetroCard — backup transport for when the suit is being repaired by Ned"), - - _e("p-m2-medical-02", "Queens Medical Center", "140.00", "Health", _day(2, 28), - description="Rib follow-up. Doctor notes I'm healing 'unusually fast'. I said: good metabolism. He: noted it."), - + _e( + "p-inc-m2-01", + "Daily Bugle Photography", + "340.00", + "Salary", + _day(2, 1), + tx="credit", + description="J. Jonah Jameson's freelance check — docked €160 for 'Spider-Man photos not menacing enough'", + ), + _e( + "p-inc-m2-02", + "Empire State University", + "280.00", + "Salary", + _day(2, 5), + tx="credit", + description="Chemistry TA stipend — grading papers on polymers I invented two years ago", + ), + _e( + "p-m2-rent", + "Queens Landlord LLC", + "850.00", + "Housing", + _day(2, 2), + cadence="monthly", + rg=_PETER_RG["rent"], + description="Monthly rent — Mrs Chen gave me an extension. She said 'you're a good boy, Peter'. I said nothing.", + ), + _e( + "p-m2-webfluid", + "Oscorp Industrial Chemicals", + "180.00", + "Web Fluid R&D", + _day(2, 3), + cadence="monthly", + rg=_PETER_RG["web_fluid"], + description="Web fluid base polymer — monthly supply. Lab notebook reason: 'advanced thesis research on adhesives'", + ), + _e( + "p-m2-therapy-01", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(2, 4), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 1: we started with Uncle Ben. We always start with Uncle Ben.", + ), + _e( + "p-m2-medical-01", + "Queens Medical Center", + "420.00", + "Health", + _day(2, 6), + description="Rib fractures x2, dislocated shoulder — cause of injury entered as 'bicycle accident'. 4th visit this quarter.", + ), + _e( + "p-m2-suit-01", + "Chinatown Fabric District", + "34.00", + "Crime Fighting", + _day(2, 7), + description="Red/blue spandex 3m + UV-resistant dye — told the cashier it was for a 'theatre project'", + ), + _e( + "p-m2-ramen", + "H-Mart Queens", + "8.50", + "Dining", + _day(2, 8), + description="Emergency ramen run — 3rd time this week. Ned says I should learn to cook. Ned is right.", + ), + _e( + "p-m2-camera", + "B&H Photo Video NYC", + "280.00", + "Shopping", + _day(2, 10), + is_major=True, + description="Nikon zoom lens — previous one destroyed in the Vulture incident. Expensed to Bugle as 'equipment wear'", + ), + _e( + "p-m2-therapy-02", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(2, 12), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 2: still Uncle Ben. Briefly touched on Gwen. Dr. Madison suggested journaling. Will not journal.", + ), + _e( + "p-m2-cartridge", + "Oscorp Advanced Materials", + "320.00", + "Web Fluid R&D", + _day(2, 14), + is_major=True, + description="High-tensile web cartridges x12 — monthly supply. Told Ned they're '3D printing filament'. He knows.", + ), + _e( + "p-m2-chem-01", + "Staten Island Chemical Co.", + "95.00", + "Web Fluid R&D", + _day(2, 15), + description="Tensile modifier compound — web strength upgrade. MJ noticed the chemicals. I said 'for school'.", + ), + _e( + "p-m2-backpack-01", + "Target Queens", + "28.00", + "Shopping", + _day(2, 16), + description="Backpack #4 this year — previous ones: left on rooftop, caught fire, dissolved in acid (don't ask)", + ), + _e( + "p-m2-therapy-03", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(2, 18), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 3: lighter session! We discussed compartmentalization. Very relevant to my situation.", + ), + _e( + "p-m2-book", + "ESU Campus Bookstore", + "74.00", + "Shopping", + _day(2, 19), + description="Advanced Organic Chemistry vol. 4 — for class AND for other reasons I will not specify here", + ), + _e( + "p-m2-mj-01", + "Delmar's Deli-Grocery", + "22.00", + "Dining", + _day(2, 20), + description="Dinner with MJ — she had the salmon; I had the #3 combo. She tried to pay. I declined. Error.", + ), + _e( + "p-m2-grocery", + "Walmart Supercenter Queens", + "52.00", + "Groceries", + _day(2, 22), + description="Monthly provisions — ramen x24, PB&J supplies. Aunt May would not approve of this diet.", + items=_M2_PETER_GROCERY_ITEMS, + ), + _e( + "p-m2-therapy-04", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(2, 25), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 4: discussed masks — metaphor and literal. She doesn't know it's both.", + ), + _e( + "p-m2-metro", + "MTA New York City Transit", + "33.00", + "Transport", + _day(2, 26), + cadence="monthly", + rg=_PETER_RG["metro"], + description="Monthly MetroCard — backup transport for when the suit is being repaired by Ned", + ), + _e( + "p-m2-medical-02", + "Queens Medical Center", + "140.00", + "Health", + _day(2, 28), + description="Rib follow-up. Doctor notes I'm healing 'unusually fast'. I said: good metabolism. He: noted it.", + ), # Parker Lab ledger — month -2 - _e("p-l-lab-m2-01", "Carolina Biological Supply", "145.00", "Web Fluid R&D", _day(2, 11), - ledger_id=ledger_lab, - description="Lab supplies (Ned's order) — listed as 'ESU adhesion research project'. That's not what we call it."), - + _e( + "p-l-lab-m2-01", + "Carolina Biological Supply", + "145.00", + "Web Fluid R&D", + _day(2, 11), + ledger_id=ledger_lab, + description="Lab supplies (Ned's order) — listed as 'ESU adhesion research project'. That's not what we call it.", + ), # Avengers — month -2 - _e("p-l-avg-m2-01", "Avengers Compound Cafeteria", "8.50", "Dining", _day(2, 19), - ledger_id=ledger_avengers, - description="Lunch at the compound — I was invited. This is not a drill. Turkey sandwich. Very good."), - + _e( + "p-l-avg-m2-01", + "Avengers Compound Cafeteria", + "8.50", + "Dining", + _day(2, 19), + ledger_id=ledger_avengers, + description="Lunch at the compound — I was invited. This is not a drill. Turkey sandwich. Very good.", + ), # Aunt May ledger — month -2 - _e("p-l-may-m2-01", "Walgreens Queens", "34.00", "Health", _day(2, 17), - ledger_id=ledger_may, - description="Aunt May's prescriptions + vitamins — she doesn't ask where I find the money. I appreciate that."), - + _e( + "p-l-may-m2-01", + "Walgreens Queens", + "34.00", + "Health", + _day(2, 17), + ledger_id=ledger_may, + description="Aunt May's prescriptions + vitamins — she doesn't ask where I find the money. I appreciate that.", + ), # ── Month -1 ───────────────────────────────────────────────────────────── - - _e("p-inc-m1-01", "Daily Bugle Photography", "480.00", "Salary", _day(1, 1), tx="credit", - description="Best Bugle check in months — Jameson said 'barely adequate'. Framed it on the wall."), - - _e("p-inc-m1-02", "Stark Industries", "500.00", "Salary", _day(1, 3), tx="credit", - description="Consulting fee from Happy Hogan — Tony called it 'educational expenses'. I'll take it."), - - _e("p-m1-rent", "Queens Landlord LLC", "850.00", "Housing", _day(1, 2), - cadence="monthly", rg=_PETER_RG["rent"], - description="Monthly rent — paid ON TIME for once. Mrs Chen nearly fainted."), - - _e("p-m1-webfluid", "Oscorp Industrial Chemicals", "180.00", "Web Fluid R&D", _day(1, 3), - cadence="monthly", rg=_PETER_RG["web_fluid"], - description="Web fluid monthly order — formula still the best I've designed. Ned wanted to add glitter. No."), - - _e("p-m1-therapy-01", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(1, 5), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 5: we made it 15 full minutes before Uncle Ben came up. Personal record."), - - _e("p-m1-medical-01", "Bellevue Hospital Center", "650.00", "Health", _day(1, 7), - is_major=True, - description="Concussion + fractured wrist — 'bicycle accident'. Doctor said 'see you next month'. Accurate prediction."), - - _e("p-m1-suit-01", "AliExpress", "18.00", "Crime Fighting", _day(1, 8), - description="Replacement eye lenses for mask — €18 + 3 weeks shipping. Ned suggested Prime. He's right."), - - _e("p-m1-cartridge", "Oscorp Advanced Materials", "320.00", "Web Fluid R&D", _day(1, 10), - is_major=True, - description="Web cartridges x12 — went through them fast. Rhino was involved. Long story, much webbing."), - - _e("p-m1-camera", "B&H Photo Video NYC", "190.00", "Shopping", _day(1, 12), - description="Camera mount + remote trigger — for 'self-portraits'. Bugle pays better for action shots."), - - _e("p-m1-therapy-02", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(1, 14), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 6: discussed whether wearing a mask all day is authentic self-expression. It is not."), - - _e("p-m1-grocery", "Walmart Supercenter Queens", "57.00", "Groceries", _day(1, 16), - description="Monthly grocery run — splurged on NAME-BRAND peanut butter. Stark stipend month. No regrets.", - items=_M1_PETER_GROCERY_ITEMS), - - _e("p-m1-chem-01", "Fisher Scientific", "145.00", "Web Fluid R&D", _day(1, 18), - description="Micro-filament spooler + precision nozzle tips — 'for the lab'. For THE lab."), - - _e("p-m1-therapy-03", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(1, 20), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 7: discussed power and responsibility. I changed the subject. She noticed immediately."), - - _e("p-m1-mj-01", "Joe Coffee Midtown", "14.00", "Dining", _day(1, 21), - description="Coffee with MJ — she's writing on vigilantes. I pretended to find it purely hypothetical."), - - _e("p-m1-backpack-01", "Target Queens", "28.00", "Shopping", _day(1, 22), - description="Backpack #2 this month — last one lasted 11 days before the Electro incident"), - - _e("p-m1-therapy-04", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(1, 24), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 8: she asked if the 'mystery friend' I mentioned has my back. Yes. Sort of. It's complicated."), - - _e("p-m1-metro", "MTA New York City Transit", "33.00", "Transport", _day(1, 25), - cadence="monthly", rg=_PETER_RG["metro"], - description="Monthly MetroCard — Happy asked why I still need this. 'Dates,' I said. Partially true."), - - _e("p-m1-suit-repair", "Chinatown Fabric District", "45.00", "Crime Fighting", _day(1, 27), - description="Suit patching + Kevlar reinforcement — Rhino tears. Ned is doing the stitching now. He's better at it."), - - _e("p-m1-tuition", "Empire State University", "380.00", "Shopping", _day(1, 28), - is_major=True, - description="Monthly tuition installment — scholarship covers 70%. The other 30% covers the anxiety too."), - + _e( + "p-inc-m1-01", + "Daily Bugle Photography", + "480.00", + "Salary", + _day(1, 1), + tx="credit", + description="Best Bugle check in months — Jameson said 'barely adequate'. Framed it on the wall.", + ), + _e( + "p-inc-m1-02", + "Stark Industries", + "500.00", + "Salary", + _day(1, 3), + tx="credit", + description="Consulting fee from Happy Hogan — Tony called it 'educational expenses'. I'll take it.", + ), + _e( + "p-m1-rent", + "Queens Landlord LLC", + "850.00", + "Housing", + _day(1, 2), + cadence="monthly", + rg=_PETER_RG["rent"], + description="Monthly rent — paid ON TIME for once. Mrs Chen nearly fainted.", + ), + _e( + "p-m1-webfluid", + "Oscorp Industrial Chemicals", + "180.00", + "Web Fluid R&D", + _day(1, 3), + cadence="monthly", + rg=_PETER_RG["web_fluid"], + description="Web fluid monthly order — formula still the best I've designed. Ned wanted to add glitter. No.", + ), + _e( + "p-m1-therapy-01", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(1, 5), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 5: we made it 15 full minutes before Uncle Ben came up. Personal record.", + ), + _e( + "p-m1-medical-01", + "Bellevue Hospital Center", + "650.00", + "Health", + _day(1, 7), + is_major=True, + description="Concussion + fractured wrist — 'bicycle accident'. Doctor said 'see you next month'. Accurate prediction.", + ), + _e( + "p-m1-suit-01", + "AliExpress", + "18.00", + "Crime Fighting", + _day(1, 8), + description="Replacement eye lenses for mask — €18 + 3 weeks shipping. Ned suggested Prime. He's right.", + ), + _e( + "p-m1-cartridge", + "Oscorp Advanced Materials", + "320.00", + "Web Fluid R&D", + _day(1, 10), + is_major=True, + description="Web cartridges x12 — went through them fast. Rhino was involved. Long story, much webbing.", + ), + _e( + "p-m1-camera", + "B&H Photo Video NYC", + "190.00", + "Shopping", + _day(1, 12), + description="Camera mount + remote trigger — for 'self-portraits'. Bugle pays better for action shots.", + ), + _e( + "p-m1-therapy-02", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(1, 14), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 6: discussed whether wearing a mask all day is authentic self-expression. It is not.", + ), + _e( + "p-m1-grocery", + "Walmart Supercenter Queens", + "57.00", + "Groceries", + _day(1, 16), + description="Monthly grocery run — splurged on NAME-BRAND peanut butter. Stark stipend month. No regrets.", + items=_M1_PETER_GROCERY_ITEMS, + ), + _e( + "p-m1-chem-01", + "Fisher Scientific", + "145.00", + "Web Fluid R&D", + _day(1, 18), + description="Micro-filament spooler + precision nozzle tips — 'for the lab'. For THE lab.", + ), + _e( + "p-m1-therapy-03", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(1, 20), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 7: discussed power and responsibility. I changed the subject. She noticed immediately.", + ), + _e( + "p-m1-mj-01", + "Joe Coffee Midtown", + "14.00", + "Dining", + _day(1, 21), + description="Coffee with MJ — she's writing on vigilantes. I pretended to find it purely hypothetical.", + ), + _e( + "p-m1-backpack-01", + "Target Queens", + "28.00", + "Shopping", + _day(1, 22), + description="Backpack #2 this month — last one lasted 11 days before the Electro incident", + ), + _e( + "p-m1-therapy-04", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(1, 24), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 8: she asked if the 'mystery friend' I mentioned has my back. Yes. Sort of. It's complicated.", + ), + _e( + "p-m1-metro", + "MTA New York City Transit", + "33.00", + "Transport", + _day(1, 25), + cadence="monthly", + rg=_PETER_RG["metro"], + description="Monthly MetroCard — Happy asked why I still need this. 'Dates,' I said. Partially true.", + ), + _e( + "p-m1-suit-repair", + "Chinatown Fabric District", + "45.00", + "Crime Fighting", + _day(1, 27), + description="Suit patching + Kevlar reinforcement — Rhino tears. Ned is doing the stitching now. He's better at it.", + ), + _e( + "p-m1-tuition", + "Empire State University", + "380.00", + "Shopping", + _day(1, 28), + is_major=True, + description="Monthly tuition installment — scholarship covers 70%. The other 30% covers the anxiety too.", + ), # Parker Lab ledger — month -1 - _e("p-l-lab-m1-01", "Sigma-Aldrich", "220.00", "Web Fluid R&D", _day(1, 13), - ledger_id=ledger_lab, is_major=True, - description="Polymer synthesis kit — Ned found a deal. The deal was: experimental and possibly not legal in 3 states."), - + _e( + "p-l-lab-m1-01", + "Sigma-Aldrich", + "220.00", + "Web Fluid R&D", + _day(1, 13), + ledger_id=ledger_lab, + is_major=True, + description="Polymer synthesis kit — Ned found a deal. The deal was: experimental and possibly not legal in 3 states.", + ), # Avengers — month -1 - _e("p-l-avg-m1-01", "Avengers Compound Gift Shop", "24.00", "Shopping", _day(1, 15), - ledger_id=ledger_avengers, - description="Bought Aunt May a 'Stark Industries' mug from the gift shop. Did not tell her where I was."), - + _e( + "p-l-avg-m1-01", + "Avengers Compound Gift Shop", + "24.00", + "Shopping", + _day(1, 15), + ledger_id=ledger_avengers, + description="Bought Aunt May a 'Stark Industries' mug from the gift shop. Did not tell her where I was.", + ), # Aunt May ledger — month -1 - _e("p-l-may-m1-01", "Key Food Supermarkets", "78.00", "Groceries", _day(1, 20), - ledger_id=ledger_may, - description="May's weekly shop — she cooks for me every Sunday. Roast chicken. This is the least I can do."), - + _e( + "p-l-may-m1-01", + "Key Food Supermarkets", + "78.00", + "Groceries", + _day(1, 20), + ledger_id=ledger_may, + description="May's weekly shop — she cooks for me every Sunday. Roast chicken. This is the least I can do.", + ), # ── Current month ───────────────────────────────────────────────────────── - - _e("p-inc-m0-01", "Daily Bugle Photography", "410.00", "Salary", _day(0, 1), tx="credit", - description="This month's Bugle check — Jameson said my Spider-Man photos 'show his criminal nature'. Framing #2."), - - _e("p-m0-rent", "Queens Landlord LLC", "850.00", "Housing", _day(0, 2), - cadence="monthly", rg=_PETER_RG["rent"], - description="Monthly rent — autopay set up. Small victory in an otherwise chaotic life."), - - _e("p-m0-webfluid", "Oscorp Industrial Chemicals", "180.00", "Web Fluid R&D", _day(0, 3), - cadence="monthly", rg=_PETER_RG["web_fluid"], - description="Web fluid supply — reformulated adhesion coefficient. Ned: 'impressive'. MJ: 'why is there webbing in the sink'."), - - _e("p-m0-therapy-01", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(0, 4), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 9: 40 full minutes, no Uncle Ben. Dr. Madison cried. (So did I, later, in the stairwell.)"), - - _e("p-m0-cartridge", "Oscorp Advanced Materials", "320.00", "Web Fluid R&D", _day(0, 6), - is_major=True, - description="Web cartridges x12 — ran out in 3 weeks. Sandman is very, very wasteful of webbing."), - - _e("p-m0-chem-01", "Staten Island Chemical Co.", "115.00", "Web Fluid R&D", _day(0, 8), - description="Polymer catalyst batch — new synthesis. Lab note: DO NOT TOUCH THE BLUE ONE (lab incident, don't ask)"), - - _e("p-m0-therapy-02", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(0, 9), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 10: relapse — talked about Uncle Ben for 55 of 60 minutes. Dr. Madison: visibly tired."), - - _e("p-m0-medical", "Queens Medical Center", "290.00", "Health", _day(0, 11), - description="Sprained ankle, bruised sternum — 'same bicycle, same exact accident'. They have a dedicated file now."), - - _e("p-m0-grocery", "Walmart Supercenter Queens", "44.00", "Groceries", _day(0, 12), - description="Monthly grocery — ramen x20, bread, PB, Gatorade x6. Aunt May would not approve. She'd be right.", - items=_M0_PETER_GROCERY_ITEMS), - - _e("p-m0-mj-01", "Patsy's Pizzeria Queens", "28.00", "Dining", _day(0, 13), - description="Pizza with MJ — her idea, my bill. She had 4 slices. I respect that. I had 2. Shame."), - - _e("p-m0-suit-01", "Amazon.com", "52.00", "Crime Fighting", _day(0, 14), - description="Carbon fibre reinforcement fabric + heat-resistant thread — suit v3.4 upgrade. Ned: 'This one will hold?' Maybe."), - - _e("p-m0-therapy-03", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(0, 16), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 11: breakthrough — 25 minutes no Uncle Ben. Then I mentioned the radioactive spider. Back to zero."), - - _e("p-m0-metro", "MTA New York City Transit", "33.00", "Transport", _day(0, 17), - cadence="monthly", rg=_PETER_RG["metro"], - description="Monthly MetroCard — Ned asked why I still buy this. 'For dates,' I said. Partially true."), - - _e("p-m0-backpack-01", "Duane Reade", "19.00", "Shopping", _day(0, 18), - description="Backpack from the clearance bin — €19. Mr Stark would be embarrassed. He never said that but I know."), - - _e("p-m0-therapy-04", "Dr. Marla Madison, LCSW", "80.00", "Health", _day(0, 19), - cadence="monthly", rg=_PETER_RG["therapy"], - description="Session 12: discussed responsibility. She still doesn't know. I think that's the whole point."), - - _e("p-m0-tuition", "Empire State University", "380.00", "Shopping", _day(0, 20), - is_major=True, - description="Tuition installment — Professor Connors wrote a glowing recommendation. He then became a lizard."), - + _e( + "p-inc-m0-01", + "Daily Bugle Photography", + "410.00", + "Salary", + _day(0, 1), + tx="credit", + description="This month's Bugle check — Jameson said my Spider-Man photos 'show his criminal nature'. Framing #2.", + ), + _e( + "p-m0-rent", + "Queens Landlord LLC", + "850.00", + "Housing", + _day(0, 2), + cadence="monthly", + rg=_PETER_RG["rent"], + description="Monthly rent — autopay set up. Small victory in an otherwise chaotic life.", + ), + _e( + "p-m0-webfluid", + "Oscorp Industrial Chemicals", + "180.00", + "Web Fluid R&D", + _day(0, 3), + cadence="monthly", + rg=_PETER_RG["web_fluid"], + description="Web fluid supply — reformulated adhesion coefficient. Ned: 'impressive'. MJ: 'why is there webbing in the sink'.", + ), + _e( + "p-m0-therapy-01", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(0, 4), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 9: 40 full minutes, no Uncle Ben. Dr. Madison cried. (So did I, later, in the stairwell.)", + ), + _e( + "p-m0-cartridge", + "Oscorp Advanced Materials", + "320.00", + "Web Fluid R&D", + _day(0, 6), + is_major=True, + description="Web cartridges x12 — ran out in 3 weeks. Sandman is very, very wasteful of webbing.", + ), + _e( + "p-m0-chem-01", + "Staten Island Chemical Co.", + "115.00", + "Web Fluid R&D", + _day(0, 8), + description="Polymer catalyst batch — new synthesis. Lab note: DO NOT TOUCH THE BLUE ONE (lab incident, don't ask)", + ), + _e( + "p-m0-therapy-02", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(0, 9), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 10: relapse — talked about Uncle Ben for 55 of 60 minutes. Dr. Madison: visibly tired.", + ), + _e( + "p-m0-medical", + "Queens Medical Center", + "290.00", + "Health", + _day(0, 11), + description="Sprained ankle, bruised sternum — 'same bicycle, same exact accident'. They have a dedicated file now.", + ), + _e( + "p-m0-grocery", + "Walmart Supercenter Queens", + "44.00", + "Groceries", + _day(0, 12), + description="Monthly grocery — ramen x20, bread, PB, Gatorade x6. Aunt May would not approve. She'd be right.", + items=_M0_PETER_GROCERY_ITEMS, + ), + _e( + "p-m0-mj-01", + "Patsy's Pizzeria Queens", + "28.00", + "Dining", + _day(0, 13), + description="Pizza with MJ — her idea, my bill. She had 4 slices. I respect that. I had 2. Shame.", + ), + _e( + "p-m0-suit-01", + "Amazon.com", + "52.00", + "Crime Fighting", + _day(0, 14), + description="Carbon fibre reinforcement fabric + heat-resistant thread — suit v3.4 upgrade. Ned: 'This one will hold?' Maybe.", + ), + _e( + "p-m0-therapy-03", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(0, 16), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 11: breakthrough — 25 minutes no Uncle Ben. Then I mentioned the radioactive spider. Back to zero.", + ), + _e( + "p-m0-metro", + "MTA New York City Transit", + "33.00", + "Transport", + _day(0, 17), + cadence="monthly", + rg=_PETER_RG["metro"], + description="Monthly MetroCard — Ned asked why I still buy this. 'For dates,' I said. Partially true.", + ), + _e( + "p-m0-backpack-01", + "Duane Reade", + "19.00", + "Shopping", + _day(0, 18), + description="Backpack from the clearance bin — €19. Mr Stark would be embarrassed. He never said that but I know.", + ), + _e( + "p-m0-therapy-04", + "Dr. Marla Madison, LCSW", + "80.00", + "Health", + _day(0, 19), + cadence="monthly", + rg=_PETER_RG["therapy"], + description="Session 12: discussed responsibility. She still doesn't know. I think that's the whole point.", + ), + _e( + "p-m0-tuition", + "Empire State University", + "380.00", + "Shopping", + _day(0, 20), + is_major=True, + description="Tuition installment — Professor Connors wrote a glowing recommendation. He then became a lizard.", + ), # Parker Lab ledger — current month - _e("p-l-lab-m0-01", "LabSupply Direct", "95.00", "Web Fluid R&D", _day(0, 7), - ledger_id=ledger_lab, - description="Micro-dispensing nozzles x20 — web cartridge refill components. Ned: 'this is genuinely so cool'"), - + _e( + "p-l-lab-m0-01", + "LabSupply Direct", + "95.00", + "Web Fluid R&D", + _day(0, 7), + ledger_id=ledger_lab, + description="Micro-dispensing nozzles x20 — web cartridge refill components. Ned: 'this is genuinely so cool'", + ), # Avengers — current month - _e("p-l-avg-m0-01", "Shake Shack Midtown", "12.50", "Dining", _day(0, 9), - ledger_id=ledger_avengers, - description="Lunch near the compound — Happy invited. I paid my own shake out of pride. Happy didn't notice."), - + _e( + "p-l-avg-m0-01", + "Shake Shack Midtown", + "12.50", + "Dining", + _day(0, 9), + ledger_id=ledger_avengers, + description="Lunch near the compound — Happy invited. I paid my own shake out of pride. Happy didn't notice.", + ), # Aunt May ledger — current month - _e("p-l-may-m0-01", "Walgreens Queens", "34.00", "Health", _day(0, 10), - ledger_id=ledger_may, - description="May's prescriptions — she asked why I look bruised. I said 'gym'. She said 'sure'. She knows."), + _e( + "p-l-may-m0-01", + "Walgreens Queens", + "34.00", + "Health", + _day(0, 10), + ledger_id=ledger_may, + description="May's prescriptions — she asked why I look bruised. I said 'gym'. She said 'sure'. She knows.", + ), ] @@ -960,6 +1719,7 @@ def _build_peter_budgets(cat_by_name: dict[str, uuid.UUID]) -> list[dict]: # Core helpers # --------------------------------------------------------------------------- + async def _get_or_create_user( db: AsyncSession, user_id: uuid.UUID, @@ -993,7 +1753,16 @@ async def _ensure_custom_categories( ) -> None: for name, color, icon, tx_type in custom_cats: if name.lower() not in {k.lower() for k in cat_by_name}: - db.add(Category(user_id=user_id, name=name, color=color, icon=icon, transaction_type=tx_type, is_system=False)) + db.add( + Category( + user_id=user_id, + name=name, + color=color, + icon=icon, + transaction_type=tx_type, + is_system=False, + ) + ) await db.flush() @@ -1010,13 +1779,15 @@ async def _ensure_partner_requests( ) ) if result.scalar_one_or_none() is None: - db.add(PartnerRequest( - id=_did(f"partner:{bruce_id}:{partner_id}"), - requester_id=bruce_id, - recipient_email=partner_email, - recipient_id=partner_id, - status="accepted", - )) + db.add( + PartnerRequest( + id=_did(f"partner:{bruce_id}:{partner_id}"), + requester_id=bruce_id, + recipient_email=partner_email, + recipient_id=partner_id, + status="accepted", + ) + ) await db.flush() @@ -1073,29 +1844,33 @@ async def _seed_expenses_and_budgets( await db.flush() for item in row["items"]: - db.add(ExpenseItem( - expense_id=expense.id, - description=item["description"], - quantity=item.get("quantity"), - unit_price=Decimal(str(item["unit_price"])) if item.get("unit_price") else None, - total_price=Decimal(str(item["total"])), - subcategory=item.get("subcategory"), - subcategory_confidence=item.get("subcategory_confidence"), - )) + db.add( + ExpenseItem( + expense_id=expense.id, + description=item["description"], + quantity=item.get("quantity"), + unit_price=Decimal(str(item["unit_price"])) if item.get("unit_price") else None, + total_price=Decimal(str(item["total"])), + subcategory=item.get("subcategory"), + subcategory_confidence=item.get("subcategory_confidence"), + ) + ) budgets = _build_budgets(cat_by_name) for b in budgets: - db.add(Budget( - id=b["id"], - user_id=user_id, - name=b["name"], - category_id=b["category_id"], - amount=b["amount"], - currency=b["currency"], - period=b["period"], - month_start=b["month_start"], - notes=b["notes"], - )) + db.add( + Budget( + id=b["id"], + user_id=user_id, + name=b["name"], + category_id=b["category_id"], + amount=b["amount"], + currency=b["currency"], + period=b["period"], + month_start=b["month_start"], + notes=b["notes"], + ) + ) await db.flush() @@ -1103,22 +1878,41 @@ async def _seed_expenses_and_budgets( # Public API # --------------------------------------------------------------------------- + async def seed_demo_data(db: AsyncSession) -> User: """Create Bruce Wayne, partner stubs, categories, and all seed data. Idempotent: safe to call multiple times — will not duplicate data. """ # Stub partner accounts - await _get_or_create_user(db, ALFRED_ID, "alfred.pennyworth@waynemanor.com", "Alfred Pennyworth", - _avatar_svg("AP", "#1a1a2e", "#d4af37")) - await _get_or_create_user(db, LUCIUS_ID, "lucius.fox@wayneenterprises.com", "Lucius Fox", - _avatar_svg("LF", "#1e3a5f", "#60a5fa")) - await _get_or_create_user(db, CLARK_ID, "clark.kent@dailyplanet.com", "Clark Kent", - _avatar_svg("CK", "#1e293b", "#ef4444")) + await _get_or_create_user( + db, + ALFRED_ID, + "alfred.pennyworth@waynemanor.com", + "Alfred Pennyworth", + _avatar_svg("AP", "#1a1a2e", "#d4af37"), + ) + await _get_or_create_user( + db, + LUCIUS_ID, + "lucius.fox@wayneenterprises.com", + "Lucius Fox", + _avatar_svg("LF", "#1e3a5f", "#60a5fa"), + ) + await _get_or_create_user( + db, + CLARK_ID, + "clark.kent@dailyplanet.com", + "Clark Kent", + _avatar_svg("CK", "#1e293b", "#ef4444"), + ) # Bruce Wayne bruce = await _get_or_create_user( - db, BRUCE_WAYNE_ID, DEMO_USER_EMAIL, "Bruce Wayne", + db, + BRUCE_WAYNE_ID, + DEMO_USER_EMAIL, + "Bruce Wayne", _avatar_svg("BW", "#0d1117", "#fbbf24"), ) @@ -1130,16 +1924,22 @@ async def seed_demo_data(db: AsyncSession) -> User: cat_by_name = await _get_categories(db, bruce.id) # Partner links (shown on account page) - await _ensure_partner_requests(db, bruce.id, [ - (ALFRED_ID, "alfred.pennyworth@waynemanor.com"), - (LUCIUS_ID, "lucius.fox@wayneenterprises.com"), - (CLARK_ID, "clark.kent@dailyplanet.com"), - ]) + await _ensure_partner_requests( + db, + bruce.id, + [ + (ALFRED_ID, "alfred.pennyworth@waynemanor.com"), + (LUCIUS_ID, "lucius.fox@wayneenterprises.com"), + (CLARK_ID, "clark.kent@dailyplanet.com"), + ], + ) # Seed if empty, or if the current month's grocery (a reliable canary) is missing — # which happens when new seed code is deployed but the beat reset hasn't fired yet. needs_seed = False - count_result = await db.execute(select(func.count(Expense.id)).where(Expense.user_id == bruce.id)) + count_result = await db.execute( + select(func.count(Expense.id)).where(Expense.user_id == bruce.id) + ) if (count_result.scalar() or 0) == 0: needs_seed = True else: @@ -1159,7 +1959,11 @@ async def seed_demo_data(db: AsyncSession) -> User: return bruce -async def reset_demo_data(db: AsyncSession, user_id: uuid.UUID | None = None, cat_by_name: dict[str, uuid.UUID] | None = None) -> None: +async def reset_demo_data( + db: AsyncSession, + user_id: uuid.UUID | None = None, + cat_by_name: dict[str, uuid.UUID] | None = None, +) -> None: """Wipe and re-seed all ephemeral data for Bruce Wayne. Called by the Celery beat task every 30 minutes and on first login when @@ -1186,7 +1990,9 @@ async def reset_demo_data(db: AsyncSession, user_id: uuid.UUID | None = None, ca ledger_fox = await _create_ledger(db, _LEDGER_FOX_ID, "Fox-Wayne Labs", uid, [LUCIUS_ID]) ledger_jl = await _create_ledger(db, _LEDGER_JL_ID, "JL Petty Cash", uid, [CLARK_ID]) - await _seed_expenses_and_budgets(db, uid, cat_by_name, ledger_manor.id, ledger_fox.id, ledger_jl.id) + await _seed_expenses_and_budgets( + db, uid, cat_by_name, ledger_manor.id, ledger_fox.id, ledger_jl.id + ) await db.commit() await invalidate_analytics_cache(uid) logger.info("demo.reset_complete", user_id=str(uid)) @@ -1197,17 +2003,40 @@ async def seed_peter_data(db: AsyncSession) -> User: Idempotent: safe to call multiple times — will not duplicate data. """ - await _get_or_create_user(db, MJ_ID, "mj.watson@empire-state.edu", "Mary Jane Watson", - _avatar_svg("MJ", "#7f1d1d", "#fca5a5")) - await _get_or_create_user(db, NED_ID, "ned.leeds@empire-state.edu", "Ned Leeds", - _avatar_svg("NL", "#1e3a5f", "#93c5fd")) - await _get_or_create_user(db, AUNT_MAY_ID, "may.parker@queens.ny.us", "May Parker", - _avatar_svg("MP", "#3b1f5c", "#c084fc")) - await _get_or_create_user(db, HAPPY_ID, "happy.hogan@starkindustries.com", "Happy Hogan", - _avatar_svg("HH", "#1c1917", "#fb923c")) + await _get_or_create_user( + db, + MJ_ID, + "mj.watson@empire-state.edu", + "Mary Jane Watson", + _avatar_svg("MJ", "#7f1d1d", "#fca5a5"), + ) + await _get_or_create_user( + db, + NED_ID, + "ned.leeds@empire-state.edu", + "Ned Leeds", + _avatar_svg("NL", "#1e3a5f", "#93c5fd"), + ) + await _get_or_create_user( + db, + AUNT_MAY_ID, + "may.parker@queens.ny.us", + "May Parker", + _avatar_svg("MP", "#3b1f5c", "#c084fc"), + ) + await _get_or_create_user( + db, + HAPPY_ID, + "happy.hogan@starkindustries.com", + "Happy Hogan", + _avatar_svg("HH", "#1c1917", "#fb923c"), + ) peter = await _get_or_create_user( - db, PETER_PARKER_ID, PETER_PARKER_EMAIL, "Peter Parker", + db, + PETER_PARKER_ID, + PETER_PARKER_EMAIL, + "Peter Parker", _avatar_svg("PP", "#1e1b4b", "#f87171"), ) @@ -1217,15 +2046,21 @@ async def seed_peter_data(db: AsyncSession) -> User: await db.commit() cat_by_name = await _get_categories(db, peter.id) - await _ensure_partner_requests(db, peter.id, [ - (MJ_ID, "mj.watson@empire-state.edu"), - (NED_ID, "ned.leeds@empire-state.edu"), - (AUNT_MAY_ID, "may.parker@queens.ny.us"), - (HAPPY_ID, "happy.hogan@starkindustries.com"), - ]) + await _ensure_partner_requests( + db, + peter.id, + [ + (MJ_ID, "mj.watson@empire-state.edu"), + (NED_ID, "ned.leeds@empire-state.edu"), + (AUNT_MAY_ID, "may.parker@queens.ny.us"), + (HAPPY_ID, "happy.hogan@starkindustries.com"), + ], + ) needs_seed = False - count_result = await db.execute(select(func.count(Expense.id)).where(Expense.user_id == peter.id)) + count_result = await db.execute( + select(func.count(Expense.id)).where(Expense.user_id == peter.id) + ) if (count_result.scalar() or 0) == 0: needs_seed = True else: @@ -1245,7 +2080,11 @@ async def seed_peter_data(db: AsyncSession) -> User: return peter -async def reset_peter_data(db: AsyncSession, user_id: uuid.UUID | None = None, cat_by_name: dict[str, uuid.UUID] | None = None) -> None: +async def reset_peter_data( + db: AsyncSession, + user_id: uuid.UUID | None = None, + cat_by_name: dict[str, uuid.UUID] | None = None, +) -> None: """Wipe and re-seed all ephemeral data for Peter Parker.""" uid = user_id or PETER_PARKER_ID @@ -1259,8 +2098,12 @@ async def reset_peter_data(db: AsyncSession, user_id: uuid.UUID | None = None, c cat_by_name = await _get_categories(db, uid) ledger_lab = await _create_ledger(db, _LEDGER_PARKER_LAB_ID, "Parker's Lab", uid, [NED_ID]) - ledger_avengers = await _create_ledger(db, _LEDGER_AVENGERS_ID, "Avengers Auxiliary", uid, [HAPPY_ID]) - ledger_may = await _create_ledger(db, _LEDGER_MAY_ID, "Aunt May's Household", uid, [AUNT_MAY_ID]) + ledger_avengers = await _create_ledger( + db, _LEDGER_AVENGERS_ID, "Avengers Auxiliary", uid, [HAPPY_ID] + ) + ledger_may = await _create_ledger( + db, _LEDGER_MAY_ID, "Aunt May's Household", uid, [AUNT_MAY_ID] + ) rows = _build_peter_expenses(ledger_lab.id, ledger_avengers.id, ledger_may.id) for row in rows: @@ -1289,29 +2132,33 @@ async def reset_peter_data(db: AsyncSession, user_id: uuid.UUID | None = None, c db.add(expense) await db.flush() for item in row["items"]: - db.add(ExpenseItem( - expense_id=expense.id, - description=item["description"], - quantity=item.get("quantity"), - unit_price=Decimal(str(item["unit_price"])) if item.get("unit_price") else None, - total_price=Decimal(str(item["total"])), - subcategory=item.get("subcategory"), - subcategory_confidence=item.get("subcategory_confidence"), - )) + db.add( + ExpenseItem( + expense_id=expense.id, + description=item["description"], + quantity=item.get("quantity"), + unit_price=Decimal(str(item["unit_price"])) if item.get("unit_price") else None, + total_price=Decimal(str(item["total"])), + subcategory=item.get("subcategory"), + subcategory_confidence=item.get("subcategory_confidence"), + ) + ) budgets = _build_peter_budgets(cat_by_name) for b in budgets: - db.add(Budget( - id=b["id"], - user_id=uid, - name=b["name"], - category_id=b["category_id"], - amount=b["amount"], - currency=b["currency"], - period=b["period"], - month_start=b["month_start"], - notes=b["notes"], - )) + db.add( + Budget( + id=b["id"], + user_id=uid, + name=b["name"], + category_id=b["category_id"], + amount=b["amount"], + currency=b["currency"], + period=b["period"], + month_start=b["month_start"], + notes=b["notes"], + ) + ) await db.flush() await db.commit() await invalidate_analytics_cache(uid) diff --git a/backend/app/services/email.py b/backend/app/services/email.py index 9bafde3..0ff6a93 100644 --- a/backend/app/services/email.py +++ b/backend/app/services/email.py @@ -63,7 +63,9 @@ async def send_email( return response.json() -async def send_approval_request_email(user_email: str, user_name: str | None, approve_url: str, reject_url: str) -> None: +async def send_approval_request_email( + user_email: str, user_name: str | None, approve_url: str, reject_url: str +) -> None: if not settings.admin_email: logger.warning("ADMIN_EMAIL not set — skipping approval request email") return @@ -74,7 +76,11 @@ async def send_approval_request_email(user_email: str, user_name: str | None, ap html=_approval_email_html(user_email, user_name, approve_url, reject_url), ) if response is not None: - logger.info("Approval request email sent", to=settings.admin_email, resend_email_id=response.get("id")) + logger.info( + "Approval request email sent", + to=settings.admin_email, + resend_email_id=response.get("id"), + ) except Exception as error: logger.error("Failed to send approval request email", error=str(error)) @@ -106,7 +112,12 @@ async def send_monthly_report_email( ) if response is None: return None - logger.info("Monthly report email sent", to=user_email, report_month=report_month_key, resend_email_id=response.get("id")) + logger.info( + "Monthly report email sent", + to=user_email, + report_month=report_month_key, + resend_email_id=response.get("id"), + ) return response.get("id") @@ -122,15 +133,21 @@ async def send_partner_request_email( response = await send_email( to=[recipient_email], subject=f"[SpendHound] {requester_name or requester_email} wants to add you as an expense partner", - html=_partner_request_email_html(requester_name, requester_email, accept_url, reject_url), + html=_partner_request_email_html( + requester_name, requester_email, accept_url, reject_url + ), ) if response is not None: - logger.info("Partner request email sent", to=recipient_email, resend_email_id=response.get("id")) + logger.info( + "Partner request email sent", to=recipient_email, resend_email_id=response.get("id") + ) except Exception as error: logger.error("Failed to send partner request email", error=str(error)) -def _partner_request_email_html(requester_name: str | None, requester_email: str, accept_url: str, reject_url: str) -> str: +def _partner_request_email_html( + requester_name: str | None, requester_email: str, accept_url: str, reject_url: str +) -> str: name = requester_name or requester_email return f""" @@ -147,7 +164,9 @@ def _partner_request_email_html(requester_name: str | None, requester_email: str """ -def _approval_email_html(user_email: str, user_name: str | None, approve_url: str, reject_url: str) -> str: +def _approval_email_html( + user_email: str, user_name: str | None, approve_url: str, reject_url: str +) -> str: name = user_name or user_email return f""" @@ -167,7 +186,9 @@ def _approval_email_html(user_email: str, user_name: str | None, approve_url: st """ -def _monthly_report_email_html(user_email: str, user_name: str | None, report_month_label: str) -> str: +def _monthly_report_email_html( + user_email: str, user_name: str | None, report_month_label: str +) -> str: name = user_name or user_email return f""" diff --git a/backend/app/services/expense_chat.py b/backend/app/services/expense_chat.py index 9188b56..6c540a7 100644 --- a/backend/app/services/expense_chat.py +++ b/backend/app/services/expense_chat.py @@ -74,7 +74,9 @@ async def list_sessions(self, user_id: uuid.UUID) -> list[ChatSessionResponse]: ) return [self._session_response(session) for session in result.scalars().all()] - async def create_session(self, user_id: uuid.UUID, *, title: str | None = None) -> ChatSessionResponse: + async def create_session( + self, user_id: uuid.UUID, *, title: str | None = None + ) -> ChatSessionResponse: clean_title = (title or "New Chat").strip() or "New Chat" session = ChatSession( user_id=user_id, @@ -105,12 +107,16 @@ async def delete_session(self, user_id: uuid.UUID, *, session_id: uuid.UUID) -> await self.db.delete(session) await self.db.flush() - async def get_history(self, user_id: uuid.UUID, *, session_id: uuid.UUID) -> ChatHistoryResponse: + async def get_history( + self, user_id: uuid.UUID, *, session_id: uuid.UUID + ) -> ChatHistoryResponse: session = await self._get_session(user_id, session_id, load_messages=True) messages = [self._message_response(message) for message in session.messages] return ChatHistoryResponse(session=self._session_response(session), messages=messages) - async def clear_history(self, user_id: uuid.UUID, *, session_id: uuid.UUID) -> ChatHistoryResponse: + async def clear_history( + self, user_id: uuid.UUID, *, session_id: uuid.UUID + ) -> ChatHistoryResponse: session = await self._get_session(user_id, session_id) await self.db.execute(delete(ChatMessage).where(ChatMessage.session_id == session.id)) session.summary = None @@ -146,7 +152,9 @@ async def stream_chat( self.db.add(user_message) await self.db.flush() - history_messages = [message for message in session.messages if message.id != user_message.id] + history_messages = [ + message for message in session.messages if message.id != user_message.id + ] prompt_messages = await self._build_chat_prompt_messages( user_id=user_id, session=session, @@ -208,7 +216,9 @@ async def stream_chat( self.db.add(assistant_message) session.last_message_at = datetime.now(UTC) session.max_tokens = request.max_tokens - session.token_count += (user_message.token_count or 0) + (assistant_message.token_count or 0) + session.token_count += (user_message.token_count or 0) + ( + assistant_message.token_count or 0 + ) if session.title == TITLE_FALLBACK: session.title = await self._generate_title(user_message.content, llm_config) await self.db.flush() @@ -246,7 +256,10 @@ async def stream_summary( session=session, history_messages=history_messages, ) - messages = [Message(role="system", content=SYSTEM_PROMPT), Message(role="user", content=summary_prompt)] + messages = [ + Message(role="system", content=SYSTEM_PROMPT), + Message(role="user", content=summary_prompt), + ] yield self._sse_event( "meta", @@ -281,7 +294,9 @@ async def stream_summary( async def _get_session( self, user_id: uuid.UUID, session_id: uuid.UUID, *, load_messages: bool = False ) -> ChatSession: - statement = select(ChatSession).where(ChatSession.id == session_id, ChatSession.user_id == user_id) + statement = select(ChatSession).where( + ChatSession.id == session_id, ChatSession.user_id == user_id + ) if load_messages: statement = statement.options(selectinload(ChatSession.messages)) result = await self.db.execute(statement) @@ -299,7 +314,11 @@ async def _build_chat_prompt_messages( user_prompt: str, ) -> list[Message]: finance_context = await self._build_finance_context(user_id) - contextual_system = SYSTEM_PROMPT + "\n\n" + self._build_context_block(session=session, finance_context=finance_context) + contextual_system = ( + SYSTEM_PROMPT + + "\n\n" + + self._build_context_block(session=session, finance_context=finance_context) + ) prompt_messages: list[Message] = [Message(role="system", content=contextual_system)] for message in history_messages[-16:]: if message.role not in {"user", "assistant"}: @@ -311,7 +330,11 @@ async def _build_chat_prompt_messages( async def _build_finance_context(self, user_id: uuid.UUID) -> str: today = date.today() current_month = month_start_from_string(today.strftime("%Y-%m")) - next_month = date(current_month.year + (1 if current_month.month == 12 else 0), 1 if current_month.month == 12 else current_month.month + 1, 1) + next_month = date( + current_month.year + (1 if current_month.month == 12 else 0), + 1 if current_month.month == 12 else current_month.month + 1, + 1, + ) lookback_date = today - timedelta(days=90) recent_expenses_result = await self.db.execute( @@ -324,7 +347,9 @@ async def _build_finance_context(self, user_id: uuid.UUID) -> str: recent_expenses = recent_expenses_result.all() category_totals_result = await self.db.execute( - select(Category.name, Expense.transaction_type, Expense.currency, func.sum(Expense.amount)) + select( + Category.name, Expense.transaction_type, Expense.currency, func.sum(Expense.amount) + ) .select_from(Expense) .outerjoin(Category, Category.id == Expense.category_id) .where(Expense.user_id == user_id, Expense.expense_date >= lookback_date) @@ -334,7 +359,9 @@ async def _build_finance_context(self, user_id: uuid.UUID) -> str: ) merchant_totals_result = await self.db.execute( - select(Expense.merchant, Expense.currency, func.sum(Expense.amount), func.count(Expense.id)) + select( + Expense.merchant, Expense.currency, func.sum(Expense.amount), func.count(Expense.id) + ) .where( Expense.user_id == user_id, Expense.expense_date >= lookback_date, @@ -346,7 +373,13 @@ async def _build_finance_context(self, user_id: uuid.UUID) -> str: ) recurring_result = await self.db.execute( - select(Expense.merchant, Expense.cadence, Expense.currency, func.avg(Expense.amount), func.count(Expense.id)) + select( + Expense.merchant, + Expense.cadence, + Expense.currency, + func.avg(Expense.amount), + func.count(Expense.id), + ) .where( Expense.user_id == user_id, (Expense.is_recurring.is_(True)) | (Expense.cadence != "one_time"), @@ -374,11 +407,12 @@ async def _build_finance_context(self, user_id: uuid.UUID) -> str: ) .group_by(Expense.category_id) ) - monthly_spend_by_category = {category_id: float(total or 0) for category_id, total in monthly_spend_result.all()} + monthly_spend_by_category = { + category_id: float(total or 0) for category_id, total in monthly_spend_result.all() + } month_total_result = await self.db.execute( - select(func.sum(Expense.amount)) - .where( + select(func.sum(Expense.amount)).where( Expense.user_id == user_id, Expense.transaction_type == "debit", Expense.expense_date >= current_month, @@ -388,17 +422,29 @@ async def _build_finance_context(self, user_id: uuid.UUID) -> str: month_total_spend = float(month_total_result.scalar() or 0) receipt_items_result = await self.db.execute( - select(ExpenseItem.description, func.sum(ExpenseItem.total_price), func.count(ExpenseItem.id)) + select( + ExpenseItem.description, + func.sum(ExpenseItem.total_price), + func.count(ExpenseItem.id), + ) .select_from(ExpenseItem) .join(Expense, Expense.id == ExpenseItem.expense_id) .where(Expense.user_id == user_id, Expense.expense_date >= lookback_date) .group_by(ExpenseItem.description) - .order_by(func.sum(ExpenseItem.total_price).desc().nullslast(), func.count(ExpenseItem.id).desc()) + .order_by( + func.sum(ExpenseItem.total_price).desc().nullslast(), + func.count(ExpenseItem.id).desc(), + ) .limit(10) ) receipt_result = await self.db.execute( - select(Receipt.original_filename, Receipt.document_kind, Receipt.extraction_status, Receipt.created_at) + select( + Receipt.original_filename, + Receipt.document_kind, + Receipt.extraction_status, + Receipt.created_at, + ) .where(Receipt.user_id == user_id) .order_by(Receipt.created_at.desc()) .limit(5) @@ -407,8 +453,12 @@ async def _build_finance_context(self, user_id: uuid.UUID) -> str: sections: list[str] = [] sections.append("=== DATE CONTEXT ===") sections.append(f"Today's date: {today.isoformat()} ({today.strftime('%A, %B %d, %Y')})") - sections.append(f"Current month: {today.strftime('%B %Y')} — starts {current_month.isoformat()}, ends {(next_month - timedelta(days=1)).isoformat()}") - sections.append(f"Expense data range: {lookback_date.isoformat()} to {today.isoformat()} (last 90 days)") + sections.append( + f"Current month: {today.strftime('%B %Y')} — starts {current_month.isoformat()}, ends {(next_month - timedelta(days=1)).isoformat()}" + ) + sections.append( + f"Expense data range: {lookback_date.isoformat()} to {today.isoformat()} (last 90 days)" + ) sections.append("====================") sections.append("") sections.append("Recent expenses:") @@ -433,7 +483,11 @@ async def _build_finance_context(self, user_id: uuid.UUID) -> str: sections.append("Budgets for current month:") if budgets: for budget, category_name in budgets: - actual = month_total_spend if budget.category_id is None else monthly_spend_by_category.get(budget.category_id, 0.0) + actual = ( + month_total_spend + if budget.category_id is None + else monthly_spend_by_category.get(budget.category_id, 0.0) + ) sections.append( f"- {budget.name}: budget {float(budget.amount):.2f} {budget.currency}, spent {actual:.2f} {budget.currency}, remaining {float(budget.amount) - actual:.2f} {budget.currency} | category {category_name or 'All spending'}" ) @@ -500,7 +554,9 @@ def _build_summary_prompt( session: ChatSession | None, history_messages: list[ChatMessage], ) -> str: - history_text = "\n".join(f"- {message.role}: {message.content}" for message in history_messages[-12:]) + history_text = "\n".join( + f"- {message.role}: {message.content}" for message in history_messages[-12:] + ) return ( "Summarize the user's finances using the structured SpendHound context below. " "Prioritize notable spend trends, category outliers, budgets at risk, recurring charges, and helpful next actions.\n\n" @@ -544,7 +600,9 @@ def _message_response(self, message: ChatMessage) -> ChatMessageResponse: updated_at=message.updated_at, ) - def _build_llm_config(self, request: ChatStreamRequest | ChatSummarizeStreamRequest) -> LLMConfig: + def _build_llm_config( + self, request: ChatStreamRequest | ChatSummarizeStreamRequest + ) -> LLMConfig: # Build a config from any explicit request params (may all be None) request_config = create_llm_config( provider=request.provider, diff --git a/backend/app/services/item_rag.py b/backend/app/services/item_rag.py index aa16ace..b52916f 100644 --- a/backend/app/services/item_rag.py +++ b/backend/app/services/item_rag.py @@ -36,11 +36,15 @@ async def get_embedding(text: str) -> list[float] | None: data = response.json() embedding = data.get("embedding") if not isinstance(embedding, list) or not embedding: - logger.warning("item_rag.embedding.empty_response", model=settings.ollama_embedding_model) + logger.warning( + "item_rag.embedding.empty_response", model=settings.ollama_embedding_model + ) return None return embedding except Exception as exc: - logger.warning("item_rag.embedding.failed", error=str(exc), model=settings.ollama_embedding_model) + logger.warning( + "item_rag.embedding.failed", error=str(exc), model=settings.ollama_embedding_model + ) return None diff --git a/backend/app/services/llm/anthropic.py b/backend/app/services/llm/anthropic.py index ab6b30b..b115f06 100644 --- a/backend/app/services/llm/anthropic.py +++ b/backend/app/services/llm/anthropic.py @@ -80,7 +80,9 @@ async def complete(self, messages: list[Message], config: LLMConfig | None = Non max_tokens = config.max_tokens if config else 4096 system_prompt, user_messages = _split_system(messages) - anthropic_messages = [{"role": m.role, "content": _build_content_blocks(m)} for m in user_messages] + anthropic_messages = [ + {"role": m.role, "content": _build_content_blocks(m)} for m in user_messages + ] kwargs: dict = { "model": model, @@ -110,7 +112,9 @@ async def stream( max_tokens = config.max_tokens if config else 4096 system_prompt, user_messages = _split_system(messages) - anthropic_messages = [{"role": m.role, "content": _build_content_blocks(m)} for m in user_messages] + anthropic_messages = [ + {"role": m.role, "content": _build_content_blocks(m)} for m in user_messages + ] kwargs: dict = { "model": model, diff --git a/backend/app/services/llm/encryption.py b/backend/app/services/llm/encryption.py index ba76c08..4ca57b4 100644 --- a/backend/app/services/llm/encryption.py +++ b/backend/app/services/llm/encryption.py @@ -10,7 +10,7 @@ def _get_fernet() -> Fernet: if not secret: raise ValueError( "LLM_KEY_ENCRYPTION_SECRET is not configured. " - "Generate one with: python -c \"from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())\"" + 'Generate one with: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"' ) return Fernet(secret.encode() if isinstance(secret, str) else secret) @@ -25,4 +25,6 @@ def decrypt_api_key(encrypted_key: str) -> str: try: return _get_fernet().decrypt(encrypted_key.encode()).decode() except InvalidToken as e: - raise ValueError("Failed to decrypt API key — the encryption secret may have changed.") from e + raise ValueError( + "Failed to decrypt API key — the encryption secret may have changed." + ) from e diff --git a/backend/app/services/llm/factory.py b/backend/app/services/llm/factory.py index 849d2d8..2bec642 100644 --- a/backend/app/services/llm/factory.py +++ b/backend/app/services/llm/factory.py @@ -65,10 +65,12 @@ def get_llm_provider(config: LLMConfig | None = None) -> BaseLLMProvider: return MeteredLLMProvider(OllamaProvider(), "ollama") -_DEMO_USER_EMAILS = frozenset({ - "bruce.wayne@wayneenterprises.com", - "peter.parker@dailybugle.com", -}) +_DEMO_USER_EMAILS = frozenset( + { + "bruce.wayne@wayneenterprises.com", + "peter.parker@dailybugle.com", + } +) def _is_demo_user(user: User) -> bool: @@ -104,9 +106,8 @@ def resolve_user_llm_config( raise HTTPException( status_code=400, detail=( - "Demo mode: Ollama is disabled for the Bruce Wayne account. " - "Add your own API key in Settings → AI Provider to unlock AI features. " - "Bruce Wayne always pays his own way." + "Demo mode: the server's local AI model is not available for demo accounts. " + "Add your own API key in Settings → AI Provider to unlock AI features." ), ) @@ -114,8 +115,12 @@ def resolve_user_llm_config( if effective_provider == "ollama": return LLMConfig( provider=effective_provider, - model=(request_config.model if request_config else None) or user.llm_model or settings.ollama_model, - base_url=(request_config.base_url if request_config else None) or user.llm_base_url or settings.ollama_url, + model=(request_config.model if request_config else None) + or user.llm_model + or settings.ollama_model, + base_url=(request_config.base_url if request_config else None) + or user.llm_base_url + or settings.ollama_url, temperature=request_config.temperature if request_config else 0.1, max_tokens=request_config.max_tokens if request_config else 4096, ) diff --git a/backend/app/services/llm/nebius.py b/backend/app/services/llm/nebius.py index 3907623..046c68b 100644 --- a/backend/app/services/llm/nebius.py +++ b/backend/app/services/llm/nebius.py @@ -23,9 +23,7 @@ def _get_client(self, config: LLMConfig | None) -> Any: try: from openai import AsyncOpenAI except ImportError as exc: - raise ValueError( - "openai package is not installed. Run: pip install openai" - ) from exc + raise ValueError("openai package is not installed. Run: pip install openai") from exc api_key = (config.api_key if config else None) or settings.nebius_api_key base_url = (config.base_url if config else None) or settings.nebius_base_url diff --git a/backend/app/services/llm/ollama.py b/backend/app/services/llm/ollama.py index c8b7c5b..b5b8347 100644 --- a/backend/app/services/llm/ollama.py +++ b/backend/app/services/llm/ollama.py @@ -82,7 +82,9 @@ async def complete(self, messages: list[Message], config: LLMConfig | None = Non "ollama.complete.semaphore_timeout", max_concurrent=settings.ollama_max_concurrent, ) - raise HTTPException(status_code=503, detail="LLM is busy. Please try again in a moment.") from None + raise HTTPException( + status_code=503, detail="LLM is busy. Please try again in a moment." + ) from None try: url = f"{self._base_url(config)}/api/chat" @@ -109,7 +111,9 @@ async def complete(self, messages: list[Message], config: LLMConfig | None = Non data = response.json() content = data.get("message", {}).get("content") if content is None: - raise ValueError(f"Unexpected Ollama response payload keys: {sorted(data.keys())}") + raise ValueError( + f"Unexpected Ollama response payload keys: {sorted(data.keys())}" + ) return content except httpx.HTTPStatusError as exc: raise ValueError( diff --git a/backend/app/services/llm/openai.py b/backend/app/services/llm/openai.py index 452f61a..8eac24e 100644 --- a/backend/app/services/llm/openai.py +++ b/backend/app/services/llm/openai.py @@ -23,9 +23,7 @@ def _get_client(self, config: LLMConfig | None) -> Any: try: from openai import AsyncOpenAI except ImportError as exc: - raise ValueError( - "openai package is not installed. Run: pip install openai" - ) from exc + raise ValueError("openai package is not installed. Run: pip install openai") from exc api_key = (config.api_key if config else None) or settings.openai_api_key base_url = (config.base_url if config else None) or None diff --git a/backend/app/services/receipt_extraction.py b/backend/app/services/receipt_extraction.py index 3b4b6c9..dfa77ab 100644 --- a/backend/app/services/receipt_extraction.py +++ b/backend/app/services/receipt_extraction.py @@ -54,24 +54,34 @@ "despar": "Despar", } -_GENERIC_CATEGORY_NAMES = {"misc", "miscellaneous", "other", "other expense", "shopping", "spesa varia", "varie"} +_GENERIC_CATEGORY_NAMES = { + "misc", + "miscellaneous", + "other", + "other expense", + "shopping", + "spesa varia", + "varie", +} # ── Upload validation ───────────────────────────────────────────────────────── -_ALLOWED_EXTENSIONS: frozenset[str] = frozenset({".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".pdf"}) +_ALLOWED_EXTENSIONS: frozenset[str] = frozenset( + {".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".pdf"} +) _UPLOAD_MAX_BYTES: int = 50 * 1024 * 1024 # 50 MB hard cap before any processing # Limits to prevent resource exhaustion from crafted PDF uploads. -_MAX_PDF_PAGES = 50 # no real receipt or statement needs more than this +_MAX_PDF_PAGES = 50 # no real receipt or statement needs more than this # First-bytes signatures for each allowed extension. # WebP is handled separately (RIFF....WEBP layout). _MAGIC_BYTES: dict[str, list[bytes]] = { - ".jpg": [b"\xff\xd8\xff"], + ".jpg": [b"\xff\xd8\xff"], ".jpeg": [b"\xff\xd8\xff"], - ".png": [b"\x89PNG\r\n\x1a\n"], - ".gif": [b"GIF87a", b"GIF89a"], - ".bmp": [b"BM"], - ".pdf": [b"%PDF"], + ".png": [b"\x89PNG\r\n\x1a\n"], + ".gif": [b"GIF87a", b"GIF89a"], + ".bmp": [b"BM"], + ".pdf": [b"%PDF"], } @@ -173,15 +183,22 @@ async def store_upload(user_id: uuid.UUID, upload: UploadFile) -> StoredReceipt: content = await upload.read() if len(content) > _UPLOAD_MAX_BYTES: - raise HTTPException(status_code=413, detail=f"File too large. Maximum allowed size is {_UPLOAD_MAX_BYTES // (1024 * 1024)} MB.") + raise HTTPException( + status_code=413, + detail=f"File too large. Maximum allowed size is {_UPLOAD_MAX_BYTES // (1024 * 1024)} MB.", + ) if suffix and not _check_magic_bytes(content, suffix): - raise HTTPException(status_code=400, detail="File content does not match its declared type.") + raise HTTPException( + status_code=400, detail="File content does not match its declared type." + ) stored_filename = f"{uuid.uuid4()}{suffix}" target_path = receipt_dir / stored_filename target_path.write_bytes(content) - return StoredReceipt(stored_filename=stored_filename, storage_path=str(target_path), file_size=len(content)) + return StoredReceipt( + stored_filename=stored_filename, storage_path=str(target_path), file_size=len(content) + ) async def extract_text_from_file(storage_path: str, content_type: str | None) -> str: @@ -203,7 +220,9 @@ async def extract_text_from_file(storage_path: str, content_type: str | None) -> return "\n\n".join(plumber_text).strip() try: reader = PdfReader(storage_path) - return "\n".join((page.extract_text() or "") for page in reader.pages[:_MAX_PDF_PAGES]).strip() + return "\n".join( + (page.extract_text() or "") for page in reader.pages[:_MAX_PDF_PAGES] + ).strip() except Exception: return "" return "" @@ -249,7 +268,12 @@ def _canonical_supermarket_name(value: str | None) -> str | None: return None compact = normalized.replace(" ", "") for candidate, label in _ITALIAN_SUPERMARKET_MERCHANTS.items(): - if candidate == normalized or candidate == compact or candidate in normalized or normalized in candidate: + if ( + candidate == normalized + or candidate == compact + or candidate in normalized + or normalized in candidate + ): return label return None @@ -258,7 +282,24 @@ def _looks_like_noise_line(line: str) -> bool: normalized = normalize_match_text(line) if not normalized: return True - if any(token in normalized for token in {"totale", "subtotal", "pagamento", "contanti", "resto", "iva", "telefono", "scontrino", "documento", "eur", "euro", "bancomat", "cassa"}): + if any( + token in normalized + for token in { + "totale", + "subtotal", + "pagamento", + "contanti", + "resto", + "iva", + "telefono", + "scontrino", + "documento", + "eur", + "euro", + "bancomat", + "cassa", + } + ): return True if re.search(r"\d{2}[/-]\d{2}[/-]\d{2,4}", line): return True @@ -291,36 +332,82 @@ def _looks_like_grocery_item(description: str | None) -> bool: if not normalized: return False grocery_terms = { - "pomodoro", "pomodori", "latte", "pane", "pasta", "riso", "banana", "mele", "mela", "insalata", "zucchine", "pollo", "uova", "mozzarella", "yogurt", "acqua", "detersivo", "sapone", "shampoo", "cien", "verdura", "frutta", + "pomodoro", + "pomodori", + "latte", + "pane", + "pasta", + "riso", + "banana", + "mele", + "mela", + "insalata", + "zucchine", + "pollo", + "uova", + "mozzarella", + "yogurt", + "acqua", + "detersivo", + "sapone", + "shampoo", + "cien", + "verdura", + "frutta", } return any(term in normalized for term in grocery_terms) def _should_force_groceries(preview: ReceiptPreviewModel, context_text: str | None = None) -> bool: - if normalize_transaction_type(preview.transaction_type, default=TRANSACTION_TYPE_DEBIT) != TRANSACTION_TYPE_DEBIT: + if ( + normalize_transaction_type(preview.transaction_type, default=TRANSACTION_TYPE_DEBIT) + != TRANSACTION_TYPE_DEBIT + ): return False if _is_supermarket_merchant(preview.merchant): return True item_descriptions = [item.description for item in (preview.items or []) if item.description] - if item_descriptions and sum(1 for description in item_descriptions if _looks_like_grocery_item(description)) >= max(1, len(item_descriptions) // 2): + if item_descriptions and sum( + 1 for description in item_descriptions if _looks_like_grocery_item(description) + ) >= max(1, len(item_descriptions) // 2): return True return _canonical_supermarket_name(context_text or "") is not None -async def _apply_category_heuristics(db: AsyncSession, user_id: uuid.UUID, preview: ReceiptPreviewModel, *, context_text: str | None = None) -> ReceiptPreviewModel: +async def _apply_category_heuristics( + db: AsyncSession, + user_id: uuid.UUID, + preview: ReceiptPreviewModel, + *, + context_text: str | None = None, +) -> ReceiptPreviewModel: if _should_force_groceries(preview, context_text=context_text): preview.category_name = "Groceries" preview.confidence = max(preview.confidence or 0.35, 0.86) normalized_category_name = normalize_match_text(preview.category_name) if preview.merchant: - matched_category = await find_matching_category(db, user_id, preview.merchant, transaction_type=preview.transaction_type or TRANSACTION_TYPE_DEBIT) - if matched_category is not None and (not normalized_category_name or normalized_category_name in _GENERIC_CATEGORY_NAMES or _is_supermarket_merchant(preview.merchant)): + matched_category = await find_matching_category( + db, + user_id, + preview.merchant, + transaction_type=preview.transaction_type or TRANSACTION_TYPE_DEBIT, + ) + if matched_category is not None and ( + not normalized_category_name + or normalized_category_name in _GENERIC_CATEGORY_NAMES + or _is_supermarket_merchant(preview.merchant) + ): preview.category_name = matched_category.name preview.confidence = max(preview.confidence or 0.35, 0.82) if preview.category_name: - existing_category = await get_category_by_name(db, user_id, preview.category_name, transaction_type=preview.transaction_type or TRANSACTION_TYPE_DEBIT) + existing_category = await get_category_by_name( + db, + user_id, + preview.category_name, + transaction_type=preview.transaction_type or TRANSACTION_TYPE_DEBIT, + ) if existing_category is not None: preview.category_name = existing_category.name return preview @@ -361,7 +448,9 @@ async def _apply_category_heuristics(db: AsyncSession, user_id: uuid.UUID, previ _DEBIT_DIRECTION_MARKERS = {"debit", "dr", "outgoing", "out"} -def _infer_transaction_type(description: str | None, amount: float | None, *, direction_hint: str | None = None) -> str: +def _infer_transaction_type( + description: str | None, amount: float | None, *, direction_hint: str | None = None +) -> str: normalized_description = re.sub(r"\s+", " ", (description or "").lower()).strip() normalized_hint = re.sub(r"[^a-z]", "", (direction_hint or "").lower()) if normalized_hint in _CREDIT_DIRECTION_MARKERS: @@ -377,7 +466,9 @@ def _infer_transaction_type(description: str | None, amount: float | None, *, di return TRANSACTION_TYPE_DEBIT -def _normalize_statement_entries(entries: list[StatementPreviewEntryModel] | None) -> list[StatementPreviewEntryModel]: +def _normalize_statement_entries( + entries: list[StatementPreviewEntryModel] | None, +) -> list[StatementPreviewEntryModel]: normalized: list[StatementPreviewEntryModel] = [] for entry in (entries or [])[:200]: cleaned = StatementPreviewEntryModel.model_validate(entry) @@ -386,10 +477,18 @@ def _normalize_statement_entries(entries: list[StatementPreviewEntryModel] | Non normalized_amount = float(Decimal(str(cleaned.amount)).quantize(Decimal("0.01"))) except (InvalidOperation, ValueError): normalized_amount = None - cleaned.transaction_type = normalize_transaction_type(cleaned.transaction_type or _infer_transaction_type(f"{cleaned.description or ''} {cleaned.notes or ''}", normalized_amount), default=TRANSACTION_TYPE_DEBIT) + cleaned.transaction_type = normalize_transaction_type( + cleaned.transaction_type + or _infer_transaction_type( + f"{cleaned.description or ''} {cleaned.notes or ''}", normalized_amount + ), + default=TRANSACTION_TYPE_DEBIT, + ) cleaned.amount = abs(normalized_amount) if normalized_amount is not None else None else: - cleaned.transaction_type = normalize_transaction_type(cleaned.transaction_type, default=TRANSACTION_TYPE_DEBIT) + cleaned.transaction_type = normalize_transaction_type( + cleaned.transaction_type, default=TRANSACTION_TYPE_DEBIT + ) cleaned.currency = _normalize_currency(cleaned.currency) cleaned.expense_date = _parse_date_candidate(cleaned.expense_date) cleaned.merchant = (cleaned.merchant or "").strip()[:255] or None @@ -397,7 +496,9 @@ def _normalize_statement_entries(entries: list[StatementPreviewEntryModel] | Non cleaned.category_name = (cleaned.category_name or "").strip()[:120] or None cleaned.notes = (cleaned.notes or "").strip()[:2000] or None cleaned.status = cleaned.status if cleaned.status in {"pending", "finalized"} else "pending" - cleaned.confidence = min(max(cleaned.confidence if cleaned.confidence is not None else 0.45, 0.0), 1.0) + cleaned.confidence = min( + max(cleaned.confidence if cleaned.confidence is not None else 0.45, 0.0), 1.0 + ) if cleaned.amount is None or not cleaned.merchant or cleaned.expense_date is None: continue normalized.append(cleaned) @@ -453,7 +554,9 @@ def _merchant_hint_from_filename(filename: str) -> str | None: return candidate.title()[:255] -def _preview_context_defaults(*, filename: str | None, context_text: str | None) -> dict[str, str | float | None]: +def _preview_context_defaults( + *, filename: str | None, context_text: str | None +) -> dict[str, str | float | None]: text = (context_text or "").strip() lines = [line.strip() for line in text.splitlines() if line.strip()] amount = None @@ -486,7 +589,9 @@ def _preview_context_defaults(*, filename: str | None, context_text: str | None) } -def _finalize_preview_model(model: ReceiptPreviewModel, *, filename: str | None = None, context_text: str | None = None) -> ReceiptPreviewModel: +def _finalize_preview_model( + model: ReceiptPreviewModel, *, filename: str | None = None, context_text: str | None = None +) -> ReceiptPreviewModel: defaults = _preview_context_defaults(filename=filename, context_text=context_text) if not model.merchant: model.merchant = defaults["merchant"] if isinstance(defaults["merchant"], str) else None @@ -498,14 +603,20 @@ def _finalize_preview_model(model: ReceiptPreviewModel, *, filename: str | None model.amount = None elif isinstance(defaults["amount"], float): model.amount = defaults["amount"] - model.transaction_type = normalize_transaction_type(model.transaction_type, default=TRANSACTION_TYPE_DEBIT) + model.transaction_type = normalize_transaction_type( + model.transaction_type, default=TRANSACTION_TYPE_DEBIT + ) model.currency = _normalize_currency(model.currency) if model.merchant: - model.merchant = (_canonical_supermarket_name(model.merchant) or model.merchant.strip())[:255] + model.merchant = (_canonical_supermarket_name(model.merchant) or model.merchant.strip())[ + :255 + ] elif isinstance(defaults["merchant"], str): model.merchant = defaults["merchant"][:255] parsed_expense_date = _parse_date_candidate(model.expense_date) - model.expense_date = parsed_expense_date or (defaults["expense_date"] if isinstance(defaults["expense_date"], str) else None) + model.expense_date = parsed_expense_date or ( + defaults["expense_date"] if isinstance(defaults["expense_date"], str) else None + ) if model.description: model.description = model.description.strip()[:300] elif isinstance(defaults["description"], str): @@ -514,12 +625,20 @@ def _finalize_preview_model(model: ReceiptPreviewModel, *, filename: str | None model.category_name = model.category_name.strip()[:120] or None if model.notes: model.notes = model.notes.strip()[:2000] or None - model.confidence = min(max(model.confidence if model.confidence is not None else 0.35, 0.0), 1.0) + model.confidence = min( + max(model.confidence if model.confidence is not None else 0.35, 0.0), 1.0 + ) model.items = _normalize_items(model.items) return model -async def _apply_receipt_category_heuristics(db: AsyncSession, user_id: uuid.UUID, preview: ReceiptPreviewModel, *, context_text: str | None = None) -> ReceiptPreviewModel: +async def _apply_receipt_category_heuristics( + db: AsyncSession, + user_id: uuid.UUID, + preview: ReceiptPreviewModel, + *, + context_text: str | None = None, +) -> ReceiptPreviewModel: if _should_force_groceries(preview, context_text=context_text): preview.category_name = "Groceries" preview.confidence = max(preview.confidence or 0.35, 0.86) @@ -552,10 +671,14 @@ async def _apply_receipt_category_heuristics(db: AsyncSession, user_id: uuid.UUI return preview -def _finalize_statement_preview(model: StatementPreviewModel, *, text: str | None = None) -> StatementPreviewModel: +def _finalize_statement_preview( + model: StatementPreviewModel, *, text: str | None = None +) -> StatementPreviewModel: model.summary = (model.summary or "").strip()[:500] or None model.notes = (model.notes or "").strip()[:2000] or None - model.confidence = min(max(model.confidence if model.confidence is not None else 0.45, 0.0), 1.0) + model.confidence = min( + max(model.confidence if model.confidence is not None else 0.45, 0.0), 1.0 + ) model.entries = _normalize_statement_entries(model.entries) if model.summary is None and model.entries: merchants = ", ".join(entry.merchant or "Unknown" for entry in model.entries[:3]) @@ -570,7 +693,9 @@ def _extract_json_object(raw_text: str) -> dict | None: if not text: return None - fenced_match = re.search(r"```(?:json)?\s*(\{.*?\})\s*```", text, flags=re.DOTALL | re.IGNORECASE) + fenced_match = re.search( + r"```(?:json)?\s*(\{.*?\})\s*```", text, flags=re.DOTALL | re.IGNORECASE + ) if fenced_match: text = fenced_match.group(1).strip() @@ -623,7 +748,7 @@ def _response_preview(raw_text: str, *, limit: int = 400) -> str: def _effective_provider_name(llm_config: LLMConfig | None) -> str: - return (llm_config.provider if llm_config and llm_config.provider else settings.llm_provider) + return llm_config.provider if llm_config and llm_config.provider else settings.llm_provider def _effective_model_name(llm_config: LLMConfig | None) -> str: @@ -641,20 +766,33 @@ def _effective_model_name(llm_config: LLMConfig | None) -> str: def fallback_preview_from_text(text: str, filename: str) -> ReceiptPreviewModel: defaults = _preview_context_defaults(filename=filename, context_text=text) - return _finalize_preview_model(ReceiptPreviewModel( - merchant=defaults["merchant"] if isinstance(defaults["merchant"], str) else None, - amount=defaults["amount"] if isinstance(defaults["amount"], float) else None, - transaction_type=TRANSACTION_TYPE_DEBIT, - expense_date=defaults["expense_date"] if isinstance(defaults["expense_date"], str) else None, - description=defaults["description"] if isinstance(defaults["description"], str) else None, - notes="Fallback text extraction used after multimodal receipt extraction was unavailable or failed.", - confidence=0.4 if isinstance(defaults["amount"], float) else 0.25, - ), filename=filename, context_text=text) + return _finalize_preview_model( + ReceiptPreviewModel( + merchant=defaults["merchant"] if isinstance(defaults["merchant"], str) else None, + amount=defaults["amount"] if isinstance(defaults["amount"], float) else None, + transaction_type=TRANSACTION_TYPE_DEBIT, + expense_date=defaults["expense_date"] + if isinstance(defaults["expense_date"], str) + else None, + description=defaults["description"] + if isinstance(defaults["description"], str) + else None, + notes="Fallback text extraction used after multimodal receipt extraction was unavailable or failed.", + confidence=0.4 if isinstance(defaults["amount"], float) else 0.25, + ), + filename=filename, + context_text=text, + ) def _merchant_from_statement_description(description: str) -> str | None: normalized = re.sub(r"\s+", " ", description).strip(" -") - normalized = re.sub(r"\b(?:card|visa|pos|debit|purchase|payment|transaction|auth|ref)\b", "", normalized, flags=re.IGNORECASE) + normalized = re.sub( + r"\b(?:card|visa|pos|debit|purchase|payment|transaction|auth|ref)\b", + "", + normalized, + flags=re.IGNORECASE, + ) normalized = re.sub(r"\s+", " ", normalized).strip(" -") if not normalized: return None @@ -683,7 +821,14 @@ def fallback_statement_preview_from_text(text: str, filename: str) -> StatementP StatementPreviewEntryModel( merchant=merchant, amount=abs(amount), - transaction_type=normalize_transaction_type(_infer_transaction_type(f"{description} {direction_marker or ''}", amount, direction_hint=direction_marker), default=TRANSACTION_TYPE_DEBIT), + transaction_type=normalize_transaction_type( + _infer_transaction_type( + f"{description} {direction_marker or ''}", + amount, + direction_hint=direction_marker, + ), + default=TRANSACTION_TYPE_DEBIT, + ), currency=settings.default_currency, expense_date=expense_date, description=description[:300], @@ -793,7 +938,11 @@ async def llm_receipt_preview_from_image( Message( role="user", content=_receipt_prompt(filename), - images=[ImageInput(media_type=media_type, data=base64.b64encode(file_bytes).decode("utf-8"))], + images=[ + ImageInput( + media_type=media_type, data=base64.b64encode(file_bytes).decode("utf-8") + ) + ], ), ], request_config, @@ -824,7 +973,9 @@ async def llm_receipt_preview_from_image( return None -async def llm_receipt_preview(text: str, filename: str, llm_config: LLMConfig | None, system_prompt: str | None = None) -> ReceiptPreviewModel | None: +async def llm_receipt_preview( + text: str, filename: str, llm_config: LLMConfig | None, system_prompt: str | None = None +) -> ReceiptPreviewModel | None: if not text.strip(): return None try: @@ -902,7 +1053,9 @@ def _statement_prompt(filename: str, text: str) -> str: ) -async def llm_statement_preview(text: str, filename: str, llm_config: LLMConfig | None) -> StatementPreviewModel | None: +async def llm_statement_preview( + text: str, filename: str, llm_config: LLMConfig | None +) -> StatementPreviewModel | None: if not text.strip(): return None try: @@ -968,7 +1121,9 @@ async def build_receipt_preview( select(User.receipt_prompt_override).where(User.email == admin_email).limit(1) ) prompt_override = admin_prompt_result.scalar_one_or_none() - preview = await llm_receipt_preview_from_image(storage_path, filename, content_type, effective_config, prompt_override) + preview = await llm_receipt_preview_from_image( + storage_path, filename, content_type, effective_config, prompt_override + ) if preview is None: logger.info( "receipt_extraction.using_text_fallback", @@ -976,8 +1131,12 @@ async def build_receipt_preview( content_type=content_type, ) extracted_text = await extract_text_from_file(storage_path, content_type) - used_text_fallback = bool(extracted_text.strip()) or not _is_supported_image(content_type, filename) - preview = await llm_receipt_preview(extracted_text, filename, effective_config, prompt_override) + used_text_fallback = bool(extracted_text.strip()) or not _is_supported_image( + content_type, filename + ) + preview = await llm_receipt_preview( + extracted_text, filename, effective_config, prompt_override + ) if preview is None: logger.info( "receipt_extraction.using_rule_based_fallback", @@ -987,13 +1146,22 @@ async def build_receipt_preview( ) preview = fallback_preview_from_text(extracted_text, filename) if preview.category_name is None and preview.merchant: - category = await resolve_category(db, user.id, merchant=preview.merchant, transaction_type=preview.transaction_type or TRANSACTION_TYPE_DEBIT) + category = await resolve_category( + db, + user.id, + merchant=preview.merchant, + transaction_type=preview.transaction_type or TRANSACTION_TYPE_DEBIT, + ) if category is not None: preview.category_name = category.name preview.confidence = max(preview.confidence or 0.0, 0.72) - preview = await _apply_receipt_category_heuristics(db, user.id, preview, context_text=extracted_text) + preview = await _apply_receipt_category_heuristics( + db, user.id, preview, context_text=extracted_text + ) preview = _finalize_preview_model(preview, filename=filename, context_text=extracted_text) - return ReceiptExtractionResult(preview=preview, extracted_text=extracted_text, used_text_fallback=used_text_fallback) + return ReceiptExtractionResult( + preview=preview, extracted_text=extracted_text, used_text_fallback=used_text_fallback + ) async def build_statement_preview( @@ -1011,13 +1179,22 @@ async def build_statement_preview( extracted_text = await extract_text_from_file(storage_path, content_type) preview = await llm_statement_preview(extracted_text, filename, effective_config) if preview is None: - logger.info("receipt_extraction.using_statement_fallback", filename=filename, content_type=content_type) + logger.info( + "receipt_extraction.using_statement_fallback", + filename=filename, + content_type=content_type, + ) preview = fallback_statement_preview_from_text(extracted_text, filename) resolved_entries: list[dict[str, Any]] = [] for entry in preview.entries: payload = entry.model_dump() if payload.get("category_name") is None and payload.get("merchant"): - category = await resolve_category(db, user.id, merchant=payload["merchant"], transaction_type=payload.get("transaction_type") or TRANSACTION_TYPE_DEBIT) + category = await resolve_category( + db, + user.id, + merchant=payload["merchant"], + transaction_type=payload.get("transaction_type") or TRANSACTION_TYPE_DEBIT, + ) if category is not None: payload["category_name"] = category.name payload["confidence"] = max(float(payload.get("confidence") or 0.45), 0.72) @@ -1031,10 +1208,19 @@ async def build_statement_preview( ), text=extracted_text, ) - return ReceiptExtractionResult(preview=preview, extracted_text=extracted_text, used_text_fallback=True) + return ReceiptExtractionResult( + preview=preview, extracted_text=extracted_text, used_text_fallback=True + ) -def create_llm_config(*, provider: str | None, model: str | None, api_key: str | None, base_url: str | None) -> LLMConfig | None: +def create_llm_config( + *, provider: str | None, model: str | None, api_key: str | None, base_url: str | None +) -> LLMConfig | None: if not any([provider, model, api_key, base_url]): return None - return LLMConfig(provider=provider or None, model=model or None, api_key=api_key or None, base_url=base_url or None) + return LLMConfig( + provider=provider or None, + model=model or None, + api_key=api_key or None, + base_url=base_url or None, + ) diff --git a/backend/app/services/receipt_queue.py b/backend/app/services/receipt_queue.py index d41bc38..4136d50 100644 --- a/backend/app/services/receipt_queue.py +++ b/backend/app/services/receipt_queue.py @@ -113,7 +113,9 @@ async def _run_extraction_job(job: ExtractionJob) -> None: ) try: async with AsyncSessionLocal() as db: - receipt_result = await db.execute(select(Receipt).where(Receipt.id == job.receipt_id)) + receipt_result = await db.execute( + select(Receipt).where(Receipt.id == job.receipt_id) + ) receipt = receipt_result.scalar_one_or_none() if receipt: receipt.extraction_status = "error" diff --git a/backend/app/services/report_exports.py b/backend/app/services/report_exports.py index 8a387e6..0cead40 100644 --- a/backend/app/services/report_exports.py +++ b/backend/app/services/report_exports.py @@ -15,7 +15,9 @@ from app.services.spendhound import apply_expense_filters, serialize_expense -async def build_expense_export_payload(db: AsyncSession, *, user_id: uuid.UUID, month: str | None) -> dict: +async def build_expense_export_payload( + db: AsyncSession, *, user_id: uuid.UUID, month: str | None +) -> dict: statement = apply_expense_filters( select(Expense, Category.name, Receipt.original_filename) .outerjoin(Category, Category.id == Expense.category_id) @@ -36,6 +38,8 @@ async def build_expense_export_payload(db: AsyncSession, *, user_id: uuid.UUID, } -async def build_expense_export_json_bytes(db: AsyncSession, *, user_id: uuid.UUID, month: str | None) -> bytes: +async def build_expense_export_json_bytes( + db: AsyncSession, *, user_id: uuid.UUID, month: str | None +) -> bytes: payload = await build_expense_export_payload(db, user_id=user_id, month=month) return json.dumps(payload, indent=2, sort_keys=True).encode("utf-8") diff --git a/backend/app/services/spendhound.py b/backend/app/services/spendhound.py index 047065b..7cfeb27 100644 --- a/backend/app/services/spendhound.py +++ b/backend/app/services/spendhound.py @@ -32,7 +32,7 @@ CADENCE_ONE_TIME = "one_time" CADENCE_MONTHLY = "monthly" CADENCE_YEARLY = "yearly" -CADENCE_CUSTOM = "custom" # every N months, interval stored in cadence_interval +CADENCE_CUSTOM = "custom" # every N months, interval stored in cadence_interval CADENCE_PREPAID = "prepaid" # single lump-sum payment covering N months DEFAULT_CATEGORIES: list[tuple[str, str, str, str]] = [ @@ -57,159 +57,196 @@ GROCERY_SUBCATEGORY_RULES: list[tuple[re.Pattern[str], str]] = [ # Vegetables — EN + IT - (re.compile( - r"\b(lettuce|tomato|tomatoes|spinach|potato|potatoes|onion|onions|broccoli|carrot|carrots|" - r"pepper|peppers|cucumber|cucumbers|zucchini|mushroom|mushrooms|salad|vegetable|vegetables|veg|" - r"pomodoro|pomodori|pomodorino|pomodorini|spinaci|patata|patate|cipolla|cipolle|carota|carote|" - r"peperone|peperoni|cetriolo|cetrioli|zucchina|zucchine|fungo|funghi|insalata|verdura|verdure|" - r"aglio|finocchio|finocchi|melanzana|melanzane|carciofo|carciofi|cavolo|cavoli|" - r"asparago|asparagi|fagiolino|fagiolini|pisello|piselli|mais|radicchio|sedano|rucola|porro|porri|" - r"cipollotto|broccolo|cavolfiore|zucca|fagiolini)\b", - re.IGNORECASE, - ), "Vegetables"), - + ( + re.compile( + r"\b(lettuce|tomato|tomatoes|spinach|potato|potatoes|onion|onions|broccoli|carrot|carrots|" + r"pepper|peppers|cucumber|cucumbers|zucchini|mushroom|mushrooms|salad|vegetable|vegetables|veg|" + r"pomodoro|pomodori|pomodorino|pomodorini|spinaci|patata|patate|cipolla|cipolle|carota|carote|" + r"peperone|peperoni|cetriolo|cetrioli|zucchina|zucchine|fungo|funghi|insalata|verdura|verdure|" + r"aglio|finocchio|finocchi|melanzana|melanzane|carciofo|carciofi|cavolo|cavoli|" + r"asparago|asparagi|fagiolino|fagiolini|pisello|piselli|mais|radicchio|sedano|rucola|porro|porri|" + r"cipollotto|broccolo|cavolfiore|zucca|fagiolini)\b", + re.IGNORECASE, + ), + "Vegetables", + ), # Fruit — EN + IT - (re.compile( - r"\b(apple|apples|banana|bananas|orange|oranges|lemon|lemons|lime|limes|" - r"berry|berries|grape|grapes|melon|melons|pear|pears|peach|peaches|" - r"kiwi|kiwis|mango|mangoes|avocado|avocados|fruit|" - r"mela|mele|banane|arancia|arance|limone|limoni|fragola|fragole|uva|" - r"melone|meloni|pera|pere|pesca|pesche|frutta|ananas|ciliegia|ciliegie|" - r"albicocca|albicocche|prugna|prugne|fico|fichi|pompelmo|mandarino|mandarini|" - r"clementina|clementine|mora|more|lampone|lamponi|mirtillo|mirtilli)\b", - re.IGNORECASE, - ), "Fruit"), - + ( + re.compile( + r"\b(apple|apples|banana|bananas|orange|oranges|lemon|lemons|lime|limes|" + r"berry|berries|grape|grapes|melon|melons|pear|pears|peach|peaches|" + r"kiwi|kiwis|mango|mangoes|avocado|avocados|fruit|" + r"mela|mele|banane|arancia|arance|limone|limoni|fragola|fragole|uva|" + r"melone|meloni|pera|pere|pesca|pesche|frutta|ananas|ciliegia|ciliegie|" + r"albicocca|albicocche|prugna|prugne|fico|fichi|pompelmo|mandarino|mandarini|" + r"clementina|clementine|mora|more|lampone|lamponi|mirtillo|mirtilli)\b", + re.IGNORECASE, + ), + "Fruit", + ), # Meat — EN + IT - (re.compile( - r"\b(chicken|beef|pork|turkey|sausage|bacon|mince|steak|ham|meat|" - r"pollo|manzo|maiale|tacchino|salsiccia|salsicce|pancetta|bistecca|prosciutto|carne|" - r"vitello|agnello|salame|mortadella|bresaola|speck|wurstel|cotoletta|cotolette|" - r"arrosto|fettina|fettine|braciola|braciole|hamburger|polpetta|polpette|affettato|affettati)\b", - re.IGNORECASE, - ), "Meat"), - + ( + re.compile( + r"\b(chicken|beef|pork|turkey|sausage|bacon|mince|steak|ham|meat|" + r"pollo|manzo|maiale|tacchino|salsiccia|salsicce|pancetta|bistecca|prosciutto|carne|" + r"vitello|agnello|salame|mortadella|bresaola|speck|wurstel|cotoletta|cotolette|" + r"arrosto|fettina|fettine|braciola|braciole|hamburger|polpetta|polpette|affettato|affettati)\b", + re.IGNORECASE, + ), + "Meat", + ), # Fish & Seafood — EN + IT - (re.compile( - r"\b(salmon|tuna|cod|shrimp|prawn|mussel|mussels|fish|seafood|" - r"salmone|tonno|merluzzo|gambero|gamberetti|gamberi|cozza|cozze|pesce|" - r"acciuga|acciughe|sardina|sardine|trota|branzino|orata|vongola|vongole|" - r"calamaro|calamari|polpo|baccala|dentice|sgombro|rombo|spigola)\b", - re.IGNORECASE, - ), "Fish & Seafood"), - + ( + re.compile( + r"\b(salmon|tuna|cod|shrimp|prawn|mussel|mussels|fish|seafood|" + r"salmone|tonno|merluzzo|gambero|gamberetti|gamberi|cozza|cozze|pesce|" + r"acciuga|acciughe|sardina|sardine|trota|branzino|orata|vongola|vongole|" + r"calamaro|calamari|polpo|baccala|dentice|sgombro|rombo|spigola)\b", + re.IGNORECASE, + ), + "Fish & Seafood", + ), # Dairy & Eggs — EN + IT - (re.compile( - r"\b(milk|yogurt|cheese|butter|cream|mozzarella|parmesan|egg|eggs|" - r"latte|formaggio|formaggi|burro|panna|parmigiano|grana|uova|uovo|ricotta|" - r"gorgonzola|pecorino|mascarpone|scamorza|stracchino|taleggio|kefir|" - r"brie|feta|fontina|provolone|asiago|emmental|caciotta|crescenza)\b", - re.IGNORECASE, - ), "Dairy & Eggs"), - + ( + re.compile( + r"\b(milk|yogurt|cheese|butter|cream|mozzarella|parmesan|egg|eggs|" + r"latte|formaggio|formaggi|burro|panna|parmigiano|grana|uova|uovo|ricotta|" + r"gorgonzola|pecorino|mascarpone|scamorza|stracchino|taleggio|kefir|" + r"brie|feta|fontina|provolone|asiago|emmental|caciotta|crescenza)\b", + re.IGNORECASE, + ), + "Dairy & Eggs", + ), # Bakery — EN + IT - (re.compile( - r"\b(bread|bagel|croissant|bun|roll|baguette|cake|muffin|bakery|pastry|tortilla|" - r"pane|cornetto|brioche|focaccia|ciabatta|grissini|panino|panini|" - r"schiacciata|tramezzino|filone|michetta|sfilatino|biscottate)\b", - re.IGNORECASE, - ), "Bakery"), - + ( + re.compile( + r"\b(bread|bagel|croissant|bun|roll|baguette|cake|muffin|bakery|pastry|tortilla|" + r"pane|cornetto|brioche|focaccia|ciabatta|grissini|panino|panini|" + r"schiacciata|tramezzino|filone|michetta|sfilatino|biscottate)\b", + re.IGNORECASE, + ), + "Bakery", + ), # Frozen — EN + IT - (re.compile( - r"\b(frozen|ice cream|gelato|pizza|fries|fish fingers|" - r"surgelato|surgelati|ghiacciolo|gelati)\b", - re.IGNORECASE, - ), "Frozen"), - + ( + re.compile( + r"\b(frozen|ice cream|gelato|pizza|fries|fish fingers|" + r"surgelato|surgelati|ghiacciolo|gelati)\b", + re.IGNORECASE, + ), + "Frozen", + ), # Snacks — EN + IT - (re.compile( - r"\b(chips|crisps|cracker|crackers|chocolate|cookie|cookies|biscuit|biscuits|" - r"snack|snacks|candy|popcorn|nuts|trail mix|" - r"patatine|cioccolato|biscotto|biscotti|caramella|caramelle|" - r"noccioline|noci|mandorle|arachidi|pistacchi|wafer|merendina|merendine|confetti)\b", - re.IGNORECASE, - ), "Snacks"), - + ( + re.compile( + r"\b(chips|crisps|cracker|crackers|chocolate|cookie|cookies|biscuit|biscuits|" + r"snack|snacks|candy|popcorn|nuts|trail mix|" + r"patatine|cioccolato|biscotto|biscotti|caramella|caramelle|" + r"noccioline|noci|mandorle|arachidi|pistacchi|wafer|merendina|merendine|confetti)\b", + re.IGNORECASE, + ), + "Snacks", + ), # Beverages — EN + IT - (re.compile( - r"\b(water|juice|cola|soda|sparkling|coffee|tea|beer|wine|drink|beverage|" - r"acqua|succo|bibita|bibite|gassata|caffe|birra|vino|aranciata|limonata|" - r"aperitivo|spumante|prosecco|bevanda|bevande|sciroppo|infuso|tisana|smoothie)\b", - re.IGNORECASE, - ), "Beverages"), - + ( + re.compile( + r"\b(water|juice|cola|soda|sparkling|coffee|tea|beer|wine|drink|beverage|" + r"acqua|succo|bibita|bibite|gassata|caffe|birra|vino|aranciata|limonata|" + r"aperitivo|spumante|prosecco|bevanda|bevande|sciroppo|infuso|tisana|smoothie)\b", + re.IGNORECASE, + ), + "Beverages", + ), # Cleaning Products — EN + IT - (re.compile( - r"\b(detergent|dish soap|dishwasher|bleach|cleaner|disinfectant|toilet cleaner|" - r"laundry|softener|descaler|cleaning|" - r"detersivo|detersivi|ammorbidente|anticalcare|sgrassatore|candeggina|" - r"disinfettante|brillantante|pavimenti)\b", - re.IGNORECASE, - ), "Cleaning Products"), - + ( + re.compile( + r"\b(detergent|dish soap|dishwasher|bleach|cleaner|disinfectant|toilet cleaner|" + r"laundry|softener|descaler|cleaning|" + r"detersivo|detersivi|ammorbidente|anticalcare|sgrassatore|candeggina|" + r"disinfettante|brillantante|pavimenti)\b", + re.IGNORECASE, + ), + "Cleaning Products", + ), # Personal Care — EN + IT - (re.compile( - r"\b(shampoo|conditioner|soap|body wash|deodorant|toothpaste|toothbrush|" - r"razor|lotion|personal care|" - r"sapone|bagnoschiuma|dentifricio|spazzolino|rasoio|crema|balsamo|" - r"assorbente|assorbenti|deodorante|dopobarba|profumo|igiene)\b", - re.IGNORECASE, - ), "Personal Care"), - + ( + re.compile( + r"\b(shampoo|conditioner|soap|body wash|deodorant|toothpaste|toothbrush|" + r"razor|lotion|personal care|" + r"sapone|bagnoschiuma|dentifricio|spazzolino|rasoio|crema|balsamo|" + r"assorbente|assorbenti|deodorante|dopobarba|profumo|igiene)\b", + re.IGNORECASE, + ), + "Personal Care", + ), # Baby — EN + IT - (re.compile( - r"\b(diaper|diapers|wipes|formula|baby food|baby|" - r"pannolino|pannolini|salviette|omogeneizzato|omogeneizzati|neonato|biberon)\b", - re.IGNORECASE, - ), "Baby"), - + ( + re.compile( + r"\b(diaper|diapers|wipes|formula|baby food|baby|" + r"pannolino|pannolini|salviette|omogeneizzato|omogeneizzati|neonato|biberon)\b", + re.IGNORECASE, + ), + "Baby", + ), # Pet Care — EN + IT - (re.compile( - r"\b(cat food|dog food|pet food|kibble|litter|treats|pet|" - r"gatto|lettiera|mangime|crocchette)\b", - re.IGNORECASE, - ), "Pet Care"), - + ( + re.compile( + r"\b(cat food|dog food|pet food|kibble|litter|treats|pet|" + r"gatto|lettiera|mangime|crocchette)\b", + re.IGNORECASE, + ), + "Pet Care", + ), # Household — EN + IT - (re.compile( - r"\b(paper towel|paper towels|napkin|napkins|foil|cling film|garbage bag|" - r"trash bag|bin bag|batteries|light bulb|household|" - r"tovagliolo|tovaglioli|alluminio|pellicola|batterie|lampadina|" - r"sacchetti|fazzoletti|scottex)\b", - re.IGNORECASE, - ), "Household"), - + ( + re.compile( + r"\b(paper towel|paper towels|napkin|napkins|foil|cling film|garbage bag|" + r"trash bag|bin bag|batteries|light bulb|household|" + r"tovagliolo|tovaglioli|alluminio|pellicola|batterie|lampadina|" + r"sacchetti|fazzoletti|scottex)\b", + re.IGNORECASE, + ), + "Household", + ), # Breakfast & Cereal — EN + IT - (re.compile( - r"\b(cereal|granola|oats|muesli|breakfast|" - r"cereali|fiocchi|avena|colazione|cacao|nesquik)\b", - re.IGNORECASE, - ), "Breakfast & Cereal"), - + ( + re.compile( + r"\b(cereal|granola|oats|muesli|breakfast|" + r"cereali|fiocchi|avena|colazione|cacao|nesquik)\b", + re.IGNORECASE, + ), + "Breakfast & Cereal", + ), # Condiments & Spices — EN + IT - (re.compile( - r"\b(ketchup|mustard|mayo|mayonnaise|vinegar|hot sauce|soy sauce|peppercorn|" - r"spice|spices|herb|seasoning|salt|" - r"senape|maionese|aceto|pepe|spezie|erbe|condimento|sale|origano|rosmarino|" - r"basilico|prezzemolo|curry|paprika|dado|salsa)\b", - re.IGNORECASE, - ), "Condiments & Spices"), - + ( + re.compile( + r"\b(ketchup|mustard|mayo|mayonnaise|vinegar|hot sauce|soy sauce|peppercorn|" + r"spice|spices|herb|seasoning|salt|" + r"senape|maionese|aceto|pepe|spezie|erbe|condimento|sale|origano|rosmarino|" + r"basilico|prezzemolo|curry|paprika|dado|salsa)\b", + re.IGNORECASE, + ), + "Condiments & Spices", + ), # Pantry (staples) — EN + IT - (re.compile( - r"\b(pasta|rice|flour|oil|sauce|beans|lentils|canned|soup|pantry|sugar|breadcrumbs|noodles|" - r"riso|farina|olio|sugo|fagioli|lenticchie|conserva|minestra|zucchero|" - r"pangrattato|pelati|passata|legumi|ceci|polpa|brodo|dispensa)\b", - re.IGNORECASE, - ), "Pantry"), - + ( + re.compile( + r"\b(pasta|rice|flour|oil|sauce|beans|lentils|canned|soup|pantry|sugar|breadcrumbs|noodles|" + r"riso|farina|olio|sugo|fagioli|lenticchie|conserva|minestra|zucchero|" + r"pangrattato|pelati|passata|legumi|ceci|polpa|brodo|dispensa)\b", + re.IGNORECASE, + ), + "Pantry", + ), # Prepared Meals — EN + IT - (re.compile( - r"\b(ready meal|prepared|meal deal|sandwich|wrap|sushi|rotisserie|deli|take away|" - r"gastronomia|rosticceria|piatto pronto)\b", - re.IGNORECASE, - ), "Prepared Meals"), + ( + re.compile( + r"\b(ready meal|prepared|meal deal|sandwich|wrap|sushi|rotisserie|deli|take away|" + r"gastronomia|rosticceria|piatto pronto)\b", + re.IGNORECASE, + ), + "Prepared Meals", + ), ] @@ -301,7 +338,12 @@ def cadence_is_recurring(value: str | None) -> bool: return normalize_cadence(value) in {CADENCE_MONTHLY, CADENCE_YEARLY, CADENCE_CUSTOM} -def normalize_recurring_settings(cadence: str | None, *, recurring_variable: bool | None = None, recurring_auto_add: bool | None = None) -> tuple[bool, bool]: +def normalize_recurring_settings( + cadence: str | None, + *, + recurring_variable: bool | None = None, + recurring_auto_add: bool | None = None, +) -> tuple[bool, bool]: normalized_cadence = normalize_cadence(cadence) if not cadence_is_recurring(normalized_cadence): return False, False @@ -310,7 +352,12 @@ def normalize_recurring_settings(cadence: str | None, *, recurring_variable: boo def signed_amount(value: Decimal | float, transaction_type: str) -> float: amount = float(value) - return round(amount if normalize_transaction_type(transaction_type) == TRANSACTION_TYPE_CREDIT else -amount, 2) + return round( + amount + if normalize_transaction_type(transaction_type) == TRANSACTION_TYPE_CREDIT + else -amount, + 2, + ) def _expense_group_key(expense: Expense) -> tuple[str, str, str]: @@ -327,7 +374,10 @@ def _detect_recurring_cadence(group: list[Expense]) -> str | None: return None if any(abs(amount - avg_amount) / avg_amount > 0.05 for amount in amounts): return None - gaps = [(group[index].expense_date - group[index - 1].expense_date).days for index in range(1, len(group))] + gaps = [ + (group[index].expense_date - group[index - 1].expense_date).days + for index in range(1, len(group)) + ] if not gaps: return None if all(20 <= gap <= 40 for gap in gaps): @@ -361,12 +411,16 @@ def fuzzy_text_match(value: str, pattern: str) -> bool: if SequenceMatcher(None, normalized_value, normalized_pattern).ratio() >= 0.84: return True for token in pattern_tokens: - if any(SequenceMatcher(None, token, candidate).ratio() >= 0.9 for candidate in value_tokens): + if any( + SequenceMatcher(None, token, candidate).ratio() >= 0.9 for candidate in value_tokens + ): return True return False -async def expense_category_name(db: AsyncSession, expense: Expense, category_name: str | None = None) -> str | None: +async def expense_category_name( + db: AsyncSession, expense: Expense, category_name: str | None = None +) -> str | None: if category_name is not None: return category_name if expense.category is not None: @@ -382,16 +436,31 @@ async def ensure_default_categories(db: AsyncSession, user_id: uuid.UUID) -> Non existing = {name.lower() for name in result.scalars().all()} for name, color, icon, transaction_type in DEFAULT_CATEGORIES: if name.lower() not in existing: - db.add(Category(user_id=user_id, name=name, color=color, icon=icon, transaction_type=transaction_type, is_system=True)) + db.add( + Category( + user_id=user_id, + name=name, + color=color, + icon=icon, + transaction_type=transaction_type, + is_system=True, + ) + ) await db.flush() -async def get_category_by_name(db: AsyncSession, user_id: uuid.UUID, name: str | None, *, transaction_type: str | None = None) -> Category | None: +async def get_category_by_name( + db: AsyncSession, user_id: uuid.UUID, name: str | None, *, transaction_type: str | None = None +) -> Category | None: if not name: return None - statement = select(Category).where(Category.user_id == user_id, Category.name.ilike(name.strip())) + statement = select(Category).where( + Category.user_id == user_id, Category.name.ilike(name.strip()) + ) if transaction_type: - statement = statement.where(Category.transaction_type == normalize_transaction_type(transaction_type)) + statement = statement.where( + Category.transaction_type == normalize_transaction_type(transaction_type) + ) result = await db.execute(statement) return result.scalar_one_or_none() @@ -412,7 +481,12 @@ async def get_or_create_category( existing_category = await get_category_by_name(db, user_id, name) if existing_category is not None: return None - category = Category(user_id=user_id, name=name.strip(), color=color, transaction_type=normalize_transaction_type(transaction_type)) + category = Category( + user_id=user_id, + name=name.strip(), + color=color, + transaction_type=normalize_transaction_type(transaction_type), + ) db.add(category) await db.flush() return category @@ -467,11 +541,19 @@ def matches_item_keyword_rule(description: str, rule: ItemKeywordRule) -> bool: kw = normalize_match_text(rule.keyword) if len(kw) < 2: return False - return any(_is_subsequence(kw, token) for token in normalize_match_text(description).split()) + return any( + _is_subsequence(kw, token) for token in normalize_match_text(description).split() + ) return fuzzy_text_match(description, rule.keyword) -async def find_matching_category(db: AsyncSession, user_id: uuid.UUID, merchant: str | None, *, transaction_type: str | None = None) -> Category | None: +async def find_matching_category( + db: AsyncSession, + user_id: uuid.UUID, + merchant: str | None, + *, + transaction_type: str | None = None, +) -> Category | None: if not merchant: return None normalized_type = normalize_transaction_type(transaction_type) if transaction_type else None @@ -485,7 +567,9 @@ async def find_matching_category(db: AsyncSession, user_id: uuid.UUID, merchant: ), ) # user-specific rules first, then global; within each group order by priority - .order_by(MerchantRule.is_global.asc(), MerchantRule.priority.asc(), MerchantRule.created_at.asc()) + .order_by( + MerchantRule.is_global.asc(), MerchantRule.priority.asc(), MerchantRule.created_at.asc() + ) ) for rule in result.scalars().all(): if not rule.category_id: @@ -493,21 +577,32 @@ async def find_matching_category(db: AsyncSession, user_id: uuid.UUID, merchant: if matches_rule(merchant, rule): # For global rules, the category may belong to a different user — look up by id only if rule.is_global: - category_result = await db.execute(select(Category).where(Category.id == rule.category_id)) + category_result = await db.execute( + select(Category).where(Category.id == rule.category_id) + ) else: - category_result = await db.execute(select(Category).where(Category.id == rule.category_id, Category.user_id == user_id)) + category_result = await db.execute( + select(Category).where( + Category.id == rule.category_id, Category.user_id == user_id + ) + ) category = category_result.scalar_one_or_none() - if category is not None and (normalized_type is None or category.transaction_type == normalized_type): + if category is not None and ( + normalized_type is None or category.transaction_type == normalized_type + ): return category return None -async def find_matching_item_subcategory(db: AsyncSession, user_id: uuid.UUID, description: str | None) -> tuple[str, float] | None: +async def find_matching_item_subcategory( + db: AsyncSession, user_id: uuid.UUID, description: str | None +) -> tuple[str, float] | None: """Check user-specific rules first (lower priority number = higher precedence), then fall back to global rules created by admin.""" if not description: return None from sqlalchemy import or_ + result = await db.execute( select(ItemKeywordRule) .where( @@ -544,7 +639,9 @@ async def upsert_item_keyword_rule_from_correction( Picks the longest normalized token (≥4 chars, non-numeric) as the keyword with `contains` matching. Skips if an identical rule already exists. """ - tokens = [t for t in normalize_match_text(description).split() if len(t) >= 4 and not t.isdigit()] + tokens = [ + t for t in normalize_match_text(description).split() if len(t) >= 4 and not t.isdigit() + ] if not tokens: return None keyword = max(tokens, key=len) @@ -586,12 +683,16 @@ async def resolve_category( ) -> Category | None: normalized_type = normalize_transaction_type(transaction_type) if category_id: - result = await db.execute(select(Category).where(Category.id == category_id, Category.user_id == user_id)) + result = await db.execute( + select(Category).where(Category.id == category_id, Category.user_id == user_id) + ) category = result.scalar_one_or_none() if category is not None and category.transaction_type == normalized_type: return category if category_name: - category = await get_or_create_category(db, user_id, category_name, transaction_type=normalized_type) + category = await get_or_create_category( + db, user_id, category_name, transaction_type=normalized_type + ) if category is not None: return category return await find_matching_category(db, user_id, merchant, transaction_type=normalized_type) @@ -655,7 +756,9 @@ def serialize_item_rule(rule: ItemKeywordRule) -> dict: } -def serialize_budget(budget: Budget, category_name: str | None = None, actual: float | None = None) -> dict: +def serialize_budget( + budget: Budget, category_name: str | None = None, actual: float | None = None +) -> dict: amount = float(budget.amount) actual_value = actual or 0.0 return { @@ -753,12 +856,18 @@ def serialize_expense( "cadence_override": expense.cadence_override, "recurring_variable": expense.recurring_variable, "recurring_auto_add": expense.recurring_auto_add, - "recurring_source_expense_id": str(expense.recurring_source_expense_id) if expense.recurring_source_expense_id else None, + "recurring_source_expense_id": str(expense.recurring_source_expense_id) + if expense.recurring_source_expense_id + else None, "auto_generated": expense.auto_generated, - "generated_for_month": expense.generated_for_month.isoformat() if expense.generated_for_month else None, + "generated_for_month": expense.generated_for_month.isoformat() + if expense.generated_for_month + else None, "cadence_interval": expense.cadence_interval, "prepaid_months": expense.prepaid_months, - "prepaid_start_date": expense.prepaid_start_date.isoformat() if expense.prepaid_start_date else None, + "prepaid_start_date": expense.prepaid_start_date.isoformat() + if expense.prepaid_start_date + else None, "prepaid_end_date": _compute_prepaid_end_date(expense), "is_major_purchase": expense.is_major_purchase, "category_id": str(expense.category_id) if expense.category_id else None, @@ -797,7 +906,9 @@ def _item_value(item: object, field_name: str) -> Any: return getattr(item, field_name, None) -async def replace_expense_items(db: AsyncSession, expense: Expense, items: list[Any] | None, *, category_name: str | None = None) -> None: +async def replace_expense_items( + db: AsyncSession, expense: Expense, items: list[Any] | None, *, category_name: str | None = None +) -> None: resolved_category_name = await expense_category_name(db, expense, category_name) is_grocery_expense = is_grocery_category_name(resolved_category_name) normalized_items: list[ExpenseItem] = [] @@ -810,11 +921,14 @@ async def replace_expense_items(db: AsyncSession, expense: Expense, items: list[ subcategory = str(_item_value(item, "subcategory") or "").strip()[:120] or None subcategory_confidence = _coerce_optional_float(_item_value(item, "subcategory_confidence")) if is_grocery_expense and not subcategory: - matched_subcategory = await find_matching_item_subcategory(db, expense.user_id, description) + matched_subcategory = await find_matching_item_subcategory( + db, expense.user_id, description + ) if matched_subcategory is not None: subcategory, subcategory_confidence = matched_subcategory if is_grocery_expense and not subcategory: from app.services.item_rag import find_similar_subcategory + rag_result = await find_similar_subcategory(db, expense.user_id, description) if rag_result is not None: subcategory, subcategory_confidence = rag_result @@ -852,7 +966,9 @@ async def replace_expense_items(db: AsyncSession, expense: Expense, items: list[ async def recompute_recurring_expenses(db: AsyncSession, user_id: uuid.UUID) -> None: - result = await db.execute(select(Expense).where(Expense.user_id == user_id).order_by(Expense.expense_date.asc())) + result = await db.execute( + select(Expense).where(Expense.user_id == user_id).order_by(Expense.expense_date.asc()) + ) expenses = result.scalars().all() grouped: dict[tuple[str, str, str], list[Expense]] = defaultdict(list) @@ -865,7 +981,9 @@ async def recompute_recurring_expenses(db: AsyncSession, user_id: uuid.UUID) -> if cadence_is_recurring(overridden_cadence): merchant_key, currency, transaction_type = _expense_group_key(expense) expense.is_recurring = True - expense.recurring_group = f"manual:{merchant_key}:{currency}:{transaction_type}:{overridden_cadence}" + expense.recurring_group = ( + f"manual:{merchant_key}:{currency}:{transaction_type}:{overridden_cadence}" + ) continue expense.cadence = CADENCE_ONE_TIME @@ -878,14 +996,19 @@ async def recompute_recurring_expenses(db: AsyncSession, user_id: uuid.UUID) -> if detected_cadence is None: continue avg_amount = sum(float(item.amount) for item in group) / len(group) - recurring_group = f"{merchant_key}:{currency}:{transaction_type}:{detected_cadence}:{avg_amount:.2f}" + recurring_group = ( + f"{merchant_key}:{currency}:{transaction_type}:{detected_cadence}:{avg_amount:.2f}" + ) for expense in group: expense.cadence = detected_cadence expense.is_recurring = True expense.recurring_group = recurring_group for expense in expenses: - if normalize_transaction_type(expense.transaction_type) != TRANSACTION_TYPE_DEBIT or expense.cadence != CADENCE_ONE_TIME: + if ( + normalize_transaction_type(expense.transaction_type) != TRANSACTION_TYPE_DEBIT + or expense.cadence != CADENCE_ONE_TIME + ): expense.is_major_purchase = False await db.flush() @@ -901,12 +1024,16 @@ def recurring_expense_is_due_for_month(expense: Expense, target_month: date) -> return expense.expense_date.month == target_month.month if cadence == CADENCE_CUSTOM: interval = expense.cadence_interval or 1 - months_since = (target_month.year - template_month.year) * 12 + (target_month.month - template_month.month) + months_since = (target_month.year - template_month.year) * 12 + ( + target_month.month - template_month.month + ) return months_since % interval == 0 return False -async def generate_recurring_expenses_for_month(db: AsyncSession, user_id: uuid.UUID, target_month: date) -> list[Expense]: +async def generate_recurring_expenses_for_month( + db: AsyncSession, user_id: uuid.UUID, target_month: date +) -> list[Expense]: target_month = month_start_for_date(target_month) result = await db.execute( select(Expense) @@ -927,11 +1054,13 @@ async def generate_recurring_expenses_for_month(db: AsyncSession, user_id: uuid. continue existing_result = await db.execute( - select(Expense.id).where( + select(Expense.id) + .where( Expense.user_id == user_id, Expense.recurring_source_expense_id == template.id, Expense.generated_for_month == target_month, - ).limit(1) + ) + .limit(1) ) if existing_result.scalar_one_or_none() is not None: continue @@ -986,20 +1115,32 @@ def apply_expense_filters( statement = statement.where(Expense.user_id == user_id) if month and month not in {"all", "all_time"}: start = month_start_from_string(month) - statement = statement.where(Expense.expense_date >= start, Expense.expense_date < next_month(start)) + statement = statement.where( + Expense.expense_date >= start, Expense.expense_date < next_month(start) + ) if category_id: statement = statement.where(Expense.category_id == category_id) if transaction_type: - statement = statement.where(Expense.transaction_type == normalize_transaction_type(transaction_type)) + statement = statement.where( + Expense.transaction_type == normalize_transaction_type(transaction_type) + ) if cadence and cadence not in {"all", "auto"}: statement = statement.where(Expense.cadence == normalize_cadence(cadence)) if review_only: - statement = statement.where((Expense.needs_review.is_(True)) | (Expense.category_id.is_(None))) + statement = statement.where( + (Expense.needs_review.is_(True)) | (Expense.category_id.is_(None)) + ) if search: like_value = f"%{search.strip()}%" - statement = statement.where(Expense.merchant.ilike(like_value) | Expense.description.ilike(like_value)) + statement = statement.where( + Expense.merchant.ilike(like_value) | Expense.description.ilike(like_value) + ) return statement async def delete_orphaned_category_rules(db: AsyncSession, category_id: uuid.UUID) -> None: - await db.execute(delete(MerchantRule).where(MerchantRule.category_id == category_id, MerchantRule.is_active.is_(False))) + await db.execute( + delete(MerchantRule).where( + MerchantRule.category_id == category_id, MerchantRule.is_active.is_(False) + ) + ) diff --git a/backend/app/services/url_validation.py b/backend/app/services/url_validation.py index 77546e9..63b29d7 100644 --- a/backend/app/services/url_validation.py +++ b/backend/app/services/url_validation.py @@ -21,27 +21,44 @@ _PRIVATE_NETWORKS: list[ipaddress.IPv4Network | ipaddress.IPv6Network] = [ ipaddress.ip_network("10.0.0.0/8"), - ipaddress.ip_network("172.16.0.0/12"), # includes Docker bridge (172.17-31.x) + ipaddress.ip_network("172.16.0.0/12"), # includes Docker bridge (172.17-31.x) ipaddress.ip_network("192.168.0.0/16"), - ipaddress.ip_network("127.0.0.0/8"), # loopback - ipaddress.ip_network("169.254.0.0/16"), # link-local / AWS metadata (169.254.169.254) + ipaddress.ip_network("127.0.0.0/8"), # loopback + ipaddress.ip_network("169.254.0.0/16"), # link-local / AWS metadata (169.254.169.254) ipaddress.ip_network("0.0.0.0/8"), - ipaddress.ip_network("100.64.0.0/10"), # carrier-grade NAT - ipaddress.ip_network("::1/128"), # IPv6 loopback - ipaddress.ip_network("fe80::/10"), # IPv6 link-local - ipaddress.ip_network("fc00::/7"), # IPv6 unique local + ipaddress.ip_network("100.64.0.0/10"), # carrier-grade NAT + ipaddress.ip_network("::1/128"), # IPv6 loopback + ipaddress.ip_network("fe80::/10"), # IPv6 link-local + ipaddress.ip_network("fc00::/7"), # IPv6 unique local ] # Docker Compose service names and other known-internal hostnames that resolve # inside the container network. Blocked by name before DNS, because by the time # we try to resolve them from inside Docker they point to real (internal) IPs. -_BLOCKED_HOSTNAMES: frozenset[str] = frozenset({ - "localhost", - "db", "postgres", "postgresql", "mysql", "mariadb", "mongo", "mongodb", - "redis", "rabbitmq", "kafka", "zookeeper", "elasticsearch", - "backend", "frontend", "cloudflared", "nginx", "traefik", - "metadata", "metadata.google.internal", # GCP metadata -}) +_BLOCKED_HOSTNAMES: frozenset[str] = frozenset( + { + "localhost", + "db", + "postgres", + "postgresql", + "mysql", + "mariadb", + "mongo", + "mongodb", + "redis", + "rabbitmq", + "kafka", + "zookeeper", + "elasticsearch", + "backend", + "frontend", + "cloudflared", + "nginx", + "traefik", + "metadata", + "metadata.google.internal", # GCP metadata + } +) def _is_private_ip(ip: str) -> bool: diff --git a/backend/tests/test_admin.py b/backend/tests/test_admin.py index 9e23239..b94b9bd 100644 --- a/backend/tests/test_admin.py +++ b/backend/tests/test_admin.py @@ -48,13 +48,17 @@ async def test_admin_panel_access_and_review_controls(client, db_session): assert status_response.status_code == 200 assert status_response.json() == {"status": "approved", "is_admin": True} - panel_response = await client.get("/api/admin/panel/users", headers=_auth_headers(admin_user)) + panel_response = await client.get( + "/api/admin/panel/users", headers=_auth_headers(admin_user) + ) assert panel_response.status_code == 200 returned_emails = {user["email"] for user in panel_response.json()} assert settings.admin_email in returned_emails assert regular_user.email in returned_emails - forbidden_response = await client.get("/api/admin/panel/users", headers=_auth_headers(non_admin)) + forbidden_response = await client.get( + "/api/admin/panel/users", headers=_auth_headers(non_admin) + ) assert forbidden_response.status_code == 403 invalid_status_response = await client.patch( diff --git a/backend/tests/test_cache_invalidation.py b/backend/tests/test_cache_invalidation.py index 29d4d73..c2c650b 100644 --- a/backend/tests/test_cache_invalidation.py +++ b/backend/tests/test_cache_invalidation.py @@ -50,9 +50,7 @@ async def test_analytics_cache_invalidated_on_expense_create( ) -async def test_analytics_cache_all_months_invalidated( - client, auth_headers, test_user, fake_redis -): +async def test_analytics_cache_all_months_invalidated(client, auth_headers, test_user, fake_redis): """invalidate_analytics_cache uses scan+delete with a wildcard — all month variants go.""" keys = [ f"analytics:dashboard:{test_user.id}:2026-04", diff --git a/backend/tests/test_expenses_crud.py b/backend/tests/test_expenses_crud.py index 4517a98..b29085c 100644 --- a/backend/tests/test_expenses_crud.py +++ b/backend/tests/test_expenses_crud.py @@ -59,7 +59,9 @@ async def test_create_list_update_delete_expense(client: AsyncClient, auth_heade assert delete_response.status_code == 204 -async def test_create_credit_transaction_and_filter_by_type(client: AsyncClient, auth_headers: dict): +async def test_create_credit_transaction_and_filter_by_type( + client: AsyncClient, auth_headers: dict +): payload = { "merchant": "ACME Payroll", "amount": 3500.00, @@ -76,7 +78,9 @@ async def test_create_credit_transaction_and_filter_by_type(client: AsyncClient, assert created["category_name"] == "Salary" assert created["signed_amount"] == 3500.0 - credit_list_response = await client.get("/api/expenses?month=2026-04&transaction_type=credit", headers=auth_headers) + credit_list_response = await client.get( + "/api/expenses?month=2026-04&transaction_type=credit", headers=auth_headers + ) assert credit_list_response.status_code == 200 credit_listing = credit_list_response.json() assert any(item["id"] == created["id"] for item in credit_listing["items"]) @@ -113,7 +117,9 @@ async def test_all_time_listing_and_cadence_filter(client: AsyncClient, auth_hea assert all(item["id"] != created["id"] for item in current_month.json()["items"]) -async def test_recurring_settings_are_saved_and_cleared_on_update(client: AsyncClient, auth_headers: dict): +async def test_recurring_settings_are_saved_and_cleared_on_update( + client: AsyncClient, auth_headers: dict +): create_response = await client.post( "/api/expenses", json={ @@ -166,17 +172,25 @@ async def test_review_queue_and_export(client: AsyncClient, auth_headers: dict): assert len(review_data["expenses"]) >= 1 assert review_data["expenses"][0]["needs_review"] is True - export_json = await client.get("/api/expenses/export?format=json&month=2026-04", headers=auth_headers) + export_json = await client.get( + "/api/expenses/export?format=json&month=2026-04", headers=auth_headers + ) assert export_json.status_code == 200 assert export_json.json()["total"] >= 1 - export_csv = await client.get("/api/expenses/export?format=csv&month=2026-04", headers=auth_headers) + export_csv = await client.get( + "/api/expenses/export?format=csv&month=2026-04", headers=auth_headers + ) assert export_csv.status_code == 200 assert "merchant" in export_csv.text -async def test_generate_recurring_expenses_for_month_creates_constant_and_variable_entries(db_session: AsyncSession, test_user): - bills_category = Category(user_id=test_user.id, name="Bills", color="#f87171", transaction_type="debit") +async def test_generate_recurring_expenses_for_month_creates_constant_and_variable_entries( + db_session: AsyncSession, test_user +): + bills_category = Category( + user_id=test_user.id, name="Bills", color="#f87171", transaction_type="debit" + ) db_session.add(bills_category) await db_session.flush() @@ -218,7 +232,9 @@ async def test_generate_recurring_expenses_for_month_creates_constant_and_variab await db_session.flush() await recompute_recurring_expenses(db_session, test_user.id) - generated = await generate_recurring_expenses_for_month(db_session, test_user.id, date(2026, 5, 1)) + generated = await generate_recurring_expenses_for_month( + db_session, test_user.id, date(2026, 5, 1) + ) await db_session.commit() assert len(generated) == 2 @@ -238,12 +254,16 @@ async def test_generate_recurring_expenses_for_month_creates_constant_and_variab assert power.expense_date == date(2026, 5, 18) assert power.needs_review is True - second_run = await generate_recurring_expenses_for_month(db_session, test_user.id, date(2026, 5, 1)) + second_run = await generate_recurring_expenses_for_month( + db_session, test_user.id, date(2026, 5, 1) + ) await db_session.commit() assert second_run == [] -async def test_create_expense_from_receipt_is_listed_in_saved_month(client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user): +async def test_create_expense_from_receipt_is_listed_in_saved_month( + client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user +): receipt = Receipt( id=uuid.uuid4(), user_id=test_user.id, @@ -307,7 +327,9 @@ async def test_create_expense_from_receipt_is_listed_in_saved_month(client: Asyn assert detail["items"][0]["description"] == "Soup" -async def test_create_expense_from_statement_entry_updates_queue(client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user): +async def test_create_expense_from_statement_entry_updates_queue( + client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user +): statement = Receipt( id=uuid.uuid4(), user_id=test_user.id, @@ -373,7 +395,9 @@ async def test_create_expense_from_statement_entry_updates_queue(client: AsyncCl assert payload["statement"]["preview"]["entries"][1]["status"] == "pending" -async def test_create_credit_transaction_from_statement_entry(client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user): +async def test_create_credit_transaction_from_statement_entry( + client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user +): statement = Receipt( id=uuid.uuid4(), user_id=test_user.id, @@ -430,7 +454,9 @@ async def test_create_credit_transaction_from_statement_entry(client: AsyncClien assert payload["expense"]["category_name"] == "Salary" -async def test_replace_expense_items_replaces_rows_without_relationship_assignment(db_session: AsyncSession, test_user): +async def test_replace_expense_items_replaces_rows_without_relationship_assignment( + db_session: AsyncSession, test_user +): expense = Expense( id=uuid.uuid4(), user_id=test_user.id, @@ -464,7 +490,9 @@ async def test_replace_expense_items_replaces_rows_without_relationship_assignme stored_items = ( ( await db_session.execute( - select(ExpenseItem).where(ExpenseItem.expense_id == expense.id).order_by(ExpenseItem.created_at.asc()) + select(ExpenseItem) + .where(ExpenseItem.expense_id == expense.id) + .order_by(ExpenseItem.created_at.asc()) ) ) .scalars() @@ -477,7 +505,9 @@ async def test_replace_expense_items_replaces_rows_without_relationship_assignme assert [item.description for item in expense.items] == ["Coffee"] -async def test_replace_expense_items_assigns_deterministic_grocery_subcategories(db_session: AsyncSession, test_user): +async def test_replace_expense_items_assigns_deterministic_grocery_subcategories( + db_session: AsyncSession, test_user +): grocery_category = Category(user_id=test_user.id, name="Groceries", color="#34d399") db_session.add(grocery_category) await db_session.flush() @@ -510,18 +540,26 @@ async def test_replace_expense_items_assigns_deterministic_grocery_subcategories stored_items = ( ( await db_session.execute( - select(ExpenseItem).where(ExpenseItem.expense_id == expense.id).order_by(ExpenseItem.created_at.asc()) + select(ExpenseItem) + .where(ExpenseItem.expense_id == expense.id) + .order_by(ExpenseItem.created_at.asc()) ) ) .scalars() .all() ) - assert [item.subcategory for item in stored_items] == ["Vegetables", "Meat", "Cleaning Products"] + assert [item.subcategory for item in stored_items] == [ + "Vegetables", + "Meat", + "Cleaning Products", + ] assert all(item.subcategory_confidence is not None for item in stored_items) -async def test_dashboard_analytics_derives_grocery_subcategories_for_existing_blank_items(client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user): +async def test_dashboard_analytics_derives_grocery_subcategories_for_existing_blank_items( + client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user +): grocery_category = Category(user_id=test_user.id, name="Groceries", color="#34d399") db_session.add(grocery_category) await db_session.flush() @@ -542,9 +580,27 @@ async def test_dashboard_analytics_derives_grocery_subcategories_for_existing_bl await db_session.flush() db_session.add_all( [ - ExpenseItem(expense_id=expense.id, description="Bananas", quantity=1, unit_price=1.8, total_price=normalize_money(1.8)), - ExpenseItem(expense_id=expense.id, description="Laundry detergent", quantity=1, unit_price=5.4, total_price=normalize_money(5.4)), - ExpenseItem(expense_id=expense.id, description="Pasta", quantity=2, unit_price=1.5, total_price=normalize_money(3.0)), + ExpenseItem( + expense_id=expense.id, + description="Bananas", + quantity=1, + unit_price=1.8, + total_price=normalize_money(1.8), + ), + ExpenseItem( + expense_id=expense.id, + description="Laundry detergent", + quantity=1, + unit_price=5.4, + total_price=normalize_money(5.4), + ), + ExpenseItem( + expense_id=expense.id, + description="Pasta", + quantity=2, + unit_price=1.5, + total_price=normalize_money(3.0), + ), ] ) await db_session.commit() @@ -560,8 +616,12 @@ async def test_dashboard_analytics_derives_grocery_subcategories_for_existing_bl assert payload["grocery_insights"]["uncategorized_count"] == 0 -async def test_dashboard_grocery_insights_scale_item_totals_to_approved_expense_amount(client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user): - grocery_category = Category(user_id=test_user.id, name="Groceries", color="#34d399", transaction_type="debit") +async def test_dashboard_grocery_insights_scale_item_totals_to_approved_expense_amount( + client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user +): + grocery_category = Category( + user_id=test_user.id, name="Groceries", color="#34d399", transaction_type="debit" + ) db_session.add(grocery_category) await db_session.flush() @@ -582,8 +642,20 @@ async def test_dashboard_grocery_insights_scale_item_totals_to_approved_expense_ await db_session.flush() db_session.add_all( [ - ExpenseItem(expense_id=expense.id, description="Bananas", quantity=1, unit_price=4.0, total_price=normalize_money(4.0)), - ExpenseItem(expense_id=expense.id, description="Pasta", quantity=1, unit_price=8.0, total_price=normalize_money(8.0)), + ExpenseItem( + expense_id=expense.id, + description="Bananas", + quantity=1, + unit_price=4.0, + total_price=normalize_money(4.0), + ), + ExpenseItem( + expense_id=expense.id, + description="Pasta", + quantity=1, + unit_price=8.0, + total_price=normalize_money(8.0), + ), ] ) await db_session.commit() @@ -593,7 +665,9 @@ async def test_dashboard_grocery_insights_scale_item_totals_to_approved_expense_ assert response.status_code == 200 payload = response.json() grocery_insights = payload["grocery_insights"] - top_subcategories = {item["name"]: item["amount"] for item in grocery_insights["top_subcategories"]} + top_subcategories = { + item["name"]: item["amount"] for item in grocery_insights["top_subcategories"] + } assert payload["summary"]["money_out"] == 10.0 assert grocery_insights["total_itemized_spend"] == 10.0 @@ -601,9 +675,15 @@ async def test_dashboard_grocery_insights_scale_item_totals_to_approved_expense_ assert top_subcategories["Fruit"] == 3.33 -async def test_dashboard_analytics_separates_money_in_and_out(client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user): - grocery_category = Category(user_id=test_user.id, name="Groceries", color="#34d399", transaction_type="debit") - salary_category = Category(user_id=test_user.id, name="Salary", color="#10b981", transaction_type="credit") +async def test_dashboard_analytics_separates_money_in_and_out( + client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user +): + grocery_category = Category( + user_id=test_user.id, name="Groceries", color="#34d399", transaction_type="debit" + ) + salary_category = Category( + user_id=test_user.id, name="Salary", color="#10b981", transaction_type="credit" + ) db_session.add_all([grocery_category, salary_category]) await db_session.flush() @@ -650,9 +730,15 @@ async def test_dashboard_analytics_separates_money_in_and_out(client: AsyncClien assert payload["income_by_category"][0]["name"] == "Salary" -async def test_dashboard_analytics_surfaces_yearly_and_major_one_time_transactions(client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user): - bills_category = Category(user_id=test_user.id, name="Bills", color="#f87171", transaction_type="debit") - shopping_category = Category(user_id=test_user.id, name="Shopping", color="#22c55e", transaction_type="debit") +async def test_dashboard_analytics_surfaces_yearly_and_major_one_time_transactions( + client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user +): + bills_category = Category( + user_id=test_user.id, name="Bills", color="#f87171", transaction_type="debit" + ) + shopping_category = Category( + user_id=test_user.id, name="Shopping", color="#22c55e", transaction_type="debit" + ) db_session.add_all([bills_category, shopping_category]) await db_session.flush() @@ -704,7 +790,9 @@ async def test_dashboard_analytics_surfaces_yearly_and_major_one_time_transactio assert major_purchases["Tech Store"]["is_major_purchase"] is True -async def test_create_expense_from_receipt_is_idempotent_for_repeated_submission(client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user): +async def test_create_expense_from_receipt_is_idempotent_for_repeated_submission( + client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user +): receipt = Receipt( id=uuid.uuid4(), user_id=test_user.id, @@ -738,14 +826,20 @@ async def test_create_expense_from_receipt_is_idempotent_for_repeated_submission "category_name": "Dining", "confidence": 0.92, } - first_response = await client.post("/api/expenses/from-receipt", json=payload, headers=auth_headers) - second_response = await client.post("/api/expenses/from-receipt", json=payload, headers=auth_headers) + first_response = await client.post( + "/api/expenses/from-receipt", json=payload, headers=auth_headers + ) + second_response = await client.post( + "/api/expenses/from-receipt", json=payload, headers=auth_headers + ) assert first_response.status_code == 200 assert second_response.status_code == 200 assert first_response.json()["id"] == second_response.json()["id"] - expense_count = await db_session.scalar(select(func.count(Expense.id)).where(Expense.receipt_id == receipt.id)) + expense_count = await db_session.scalar( + select(func.count(Expense.id)).where(Expense.receipt_id == receipt.id) + ) assert expense_count == 1 await db_session.refresh(receipt) @@ -753,7 +847,9 @@ async def test_create_expense_from_receipt_is_idempotent_for_repeated_submission assert receipt.finalized_at is not None -async def test_create_expense_from_statement_entry_is_idempotent_for_repeated_submission(client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user): +async def test_create_expense_from_statement_entry_is_idempotent_for_repeated_submission( + client: AsyncClient, auth_headers: dict, db_session: AsyncSession, test_user +): statement = Receipt( id=uuid.uuid4(), user_id=test_user.id, @@ -797,16 +893,27 @@ async def test_create_expense_from_statement_entry_is_idempotent_for_repeated_su "category_name": "Transport", "confidence": 0.86, } - first_response = await client.post("/api/expenses/from-statement-entry", json=payload, headers=auth_headers) - second_response = await client.post("/api/expenses/from-statement-entry", json=payload, headers=auth_headers) + first_response = await client.post( + "/api/expenses/from-statement-entry", json=payload, headers=auth_headers + ) + second_response = await client.post( + "/api/expenses/from-statement-entry", json=payload, headers=auth_headers + ) assert first_response.status_code == 200 assert second_response.status_code == 200 assert first_response.json()["expense"]["id"] == second_response.json()["expense"]["id"] - expense_count = await db_session.scalar(select(func.count(Expense.id)).where(Expense.receipt_id == statement.id, Expense.source == "statement")) + expense_count = await db_session.scalar( + select(func.count(Expense.id)).where( + Expense.receipt_id == statement.id, Expense.source == "statement" + ) + ) assert expense_count == 1 await db_session.refresh(statement) assert statement.preview_data["entries"][0]["status"] == "finalized" - assert statement.preview_data["entries"][0]["saved_expense_id"] == first_response.json()["expense"]["id"] + assert ( + statement.preview_data["entries"][0]["saved_expense_id"] + == first_response.json()["expense"]["id"] + ) diff --git a/backend/tests/test_monthly_reports.py b/backend/tests/test_monthly_reports.py index f9fc8ba..6871327 100644 --- a/backend/tests/test_monthly_reports.py +++ b/backend/tests/test_monthly_reports.py @@ -16,7 +16,9 @@ pytestmark = pytest.mark.asyncio -async def test_send_monthly_reports_for_month_records_success(monkeypatch, db_session: AsyncSession, test_user): +async def test_send_monthly_reports_for_month_records_success( + monkeypatch, db_session: AsyncSession, test_user +): expense = Expense( user_id=test_user.id, merchant="Metro Grocery", @@ -34,23 +36,31 @@ async def test_send_monthly_reports_for_month_records_success(monkeypatch, db_se db_session.add(expense) await db_session.commit() - monkeypatch.setattr(monthly_reports.settings, "monthly_reports_frontend_pdf_url", "http://frontend:3000/api/internal/reports/monthly-pdf") + monkeypatch.setattr( + monthly_reports.settings, + "monthly_reports_frontend_pdf_url", + "http://frontend:3000/api/internal/reports/monthly-pdf", + ) async def fake_fetch_monthly_report_pdf(user, report_month): assert user.id == test_user.id assert report_month == date(2026, 3, 1) return b"%PDF-1.4 fake pdf bytes" - async def fake_send_monthly_report_email(user_email, user_name, report_month, *, expense_json_bytes, dashboard_pdf_bytes): + async def fake_send_monthly_report_email( + user_email, user_name, report_month, *, expense_json_bytes, dashboard_pdf_bytes + ): assert user_email == test_user.email assert user_name == test_user.name assert report_month == date(2026, 3, 1) - assert b'Metro Grocery' in expense_json_bytes + assert b"Metro Grocery" in expense_json_bytes assert dashboard_pdf_bytes.startswith(b"%PDF-1.4") return "re_test_123" monkeypatch.setattr(monthly_reports, "fetch_monthly_report_pdf", fake_fetch_monthly_report_pdf) - monkeypatch.setattr(monthly_reports, "send_monthly_report_email", fake_send_monthly_report_email) + monkeypatch.setattr( + monthly_reports, "send_monthly_report_email", fake_send_monthly_report_email + ) summary = await monthly_reports.send_monthly_reports_for_month(db_session, date(2026, 3, 1)) @@ -73,7 +83,9 @@ async def fake_send_monthly_report_email(user_email, user_name, report_month, *, assert delivery.error_message is None -async def test_send_monthly_reports_for_month_skips_existing_sent_delivery(monkeypatch, db_session: AsyncSession, test_user): +async def test_send_monthly_reports_for_month_skips_existing_sent_delivery( + monkeypatch, db_session: AsyncSession, test_user +): db_session.add( MonthlyReportDelivery( user_id=test_user.id, @@ -97,7 +109,9 @@ async def should_not_run(*args, **kwargs): assert summary.failed_users == 0 -async def test_send_monthly_reports_for_month_skips_users_with_auto_send_disabled(monkeypatch, db_session: AsyncSession, test_user): +async def test_send_monthly_reports_for_month_skips_users_with_auto_send_disabled( + monkeypatch, db_session: AsyncSession, test_user +): test_user.automatic_monthly_reports = False await db_session.commit() @@ -115,7 +129,9 @@ async def should_not_run(*args, **kwargs): assert summary.failed_users == 0 -async def test_manual_send_endpoint_resends_and_reuses_existing_delivery(monkeypatch, client, db_session: AsyncSession, test_user, auth_headers): +async def test_manual_send_endpoint_resends_and_reuses_existing_delivery( + monkeypatch, client, db_session: AsyncSession, test_user, auth_headers +): existing_delivery = MonthlyReportDelivery( user_id=test_user.id, report_month=date(2026, 3, 1), @@ -130,7 +146,9 @@ async def fake_fetch_monthly_report_pdf(user, report_month): assert report_month == date(2026, 3, 1) return b"%PDF-1.4 manual pdf bytes" - async def fake_send_monthly_report_email(user_email, user_name, report_month, *, expense_json_bytes, dashboard_pdf_bytes): + async def fake_send_monthly_report_email( + user_email, user_name, report_month, *, expense_json_bytes, dashboard_pdf_bytes + ): assert user_email == test_user.email assert user_name == test_user.name assert report_month == date(2026, 3, 1) @@ -138,7 +156,9 @@ async def fake_send_monthly_report_email(user_email, user_name, report_month, *, return "re_manual_456" monkeypatch.setattr(monthly_reports, "fetch_monthly_report_pdf", fake_fetch_monthly_report_pdf) - monkeypatch.setattr(monthly_reports, "send_monthly_report_email", fake_send_monthly_report_email) + monkeypatch.setattr( + monthly_reports, "send_monthly_report_email", fake_send_monthly_report_email + ) response = await client.post( "/api/monthly-reports/send", @@ -153,13 +173,17 @@ async def fake_send_monthly_report_email(user_email, user_name, report_month, *, assert payload["resend_email_id"] == "re_manual_456" deliveries = ( - await db_session.execute( - select(MonthlyReportDelivery).where( - MonthlyReportDelivery.user_id == test_user.id, - MonthlyReportDelivery.report_month == date(2026, 3, 1), + ( + await db_session.execute( + select(MonthlyReportDelivery).where( + MonthlyReportDelivery.user_id == test_user.id, + MonthlyReportDelivery.report_month == date(2026, 3, 1), + ) ) ) - ).scalars().all() + .scalars() + .all() + ) assert len(deliveries) == 1 assert deliveries[0].id == existing_delivery.id assert deliveries[0].status == "sent" diff --git a/backend/tests/test_parser.py b/backend/tests/test_parser.py index 99d1d3c..c386368 100644 --- a/backend/tests/test_parser.py +++ b/backend/tests/test_parser.py @@ -25,13 +25,17 @@ def test_extract_json_object_embedded_payload(): - payload = _extract_json_object('hello {"merchant": "Cafe Roma", "amount": 8.50, "confidence": 0.8} world') + payload = _extract_json_object( + 'hello {"merchant": "Cafe Roma", "amount": 8.50, "confidence": 0.8} world' + ) assert payload is not None assert payload["merchant"] == "Cafe Roma" def test_extract_json_object_from_markdown_fence(): - payload = _extract_json_object('```json\n{"merchant":"Cafe Roma","amount":8.5,"confidence":0.8}\n```') + payload = _extract_json_object( + '```json\n{"merchant":"Cafe Roma","amount":8.5,"confidence":0.8}\n```' + ) assert payload is not None assert payload["amount"] == 8.5 @@ -50,7 +54,9 @@ def test_fallback_preview_from_text_uses_filename_for_missing_merchant(): def test_merchant_hint_from_receipt_text_prefers_known_supermarket_brand(): - merchant = _merchant_hint_from_receipt_text("PUNTI FIDELITY\nESSELUNGA ROMA\nVia Example 12\nTotale 24,90") + merchant = _merchant_hint_from_receipt_text( + "PUNTI FIDELITY\nESSELUNGA ROMA\nVia Example 12\nTotale 24,90" + ) assert merchant == "Esselunga" @@ -62,7 +68,10 @@ def test_should_force_groceries_for_supermarket_receipts(): preview = ReceiptPreviewModel( merchant="Carrefour Market", transaction_type="debit", - items=[ReceiptPreviewItemModel(description="Pomodori datterini"), ReceiptPreviewItemModel(description="Cien shampoo")], + items=[ + ReceiptPreviewItemModel(description="Pomodori datterini"), + ReceiptPreviewItemModel(description="Cien shampoo"), + ], ) assert _should_force_groceries(preview) is True @@ -112,9 +121,13 @@ async def test_extract_text_from_pdf_prefers_pdfplumber(tmp_path): @pytest.mark.asyncio async def test_llm_receipt_preview_validates_json_response(): provider = MagicMock() - provider.complete = AsyncMock(return_value='{"merchant":"Trainline","amount":27.4,"currency":"EUR","expense_date":"2026-04-03","description":"Rail ticket","category_name":"Transport","notes":"","items":[{"description":"Rail ticket","total":27.4}],"confidence":0.91}') + provider.complete = AsyncMock( + return_value='{"merchant":"Trainline","amount":27.4,"currency":"EUR","expense_date":"2026-04-03","description":"Rail ticket","category_name":"Transport","notes":"","items":[{"description":"Rail ticket","total":27.4}],"confidence":0.91}' + ) with patch("app.services.receipt_extraction.get_llm_provider", return_value=provider): - preview = await llm_receipt_preview("Trainline receipt", "ticket.txt", LLMConfig(provider="ollama", model="test")) + preview = await llm_receipt_preview( + "Trainline receipt", "ticket.txt", LLMConfig(provider="ollama", model="test") + ) assert preview is not None assert preview.merchant == "Trainline" assert preview.category_name == "Transport" @@ -125,12 +138,16 @@ async def test_llm_receipt_preview_validates_json_response(): @pytest.mark.asyncio async def test_llm_receipt_preview_from_image_uses_multimodal_message(tmp_path): provider = MagicMock() - provider.complete = AsyncMock(return_value='{"merchant":"Cafe Roma","amount":8.5,"currency":"EUR","expense_date":"2026-04-11","description":"Coffee and pastry","category_name":"Dining","notes":"","items":[{"description":"Coffee","quantity":1,"unit_price":3.5,"total":3.5},{"description":"Pastry","quantity":1,"unit_price":5.0,"total":5.0}],"confidence":0.89}') + provider.complete = AsyncMock( + return_value='{"merchant":"Cafe Roma","amount":8.5,"currency":"EUR","expense_date":"2026-04-11","description":"Coffee and pastry","category_name":"Dining","notes":"","items":[{"description":"Coffee","quantity":1,"unit_price":3.5,"total":3.5},{"description":"Pastry","quantity":1,"unit_price":5.0,"total":5.0}],"confidence":0.89}' + ) image_path = tmp_path / "receipt.png" image_path.write_bytes(b"fake-image-bytes") with patch("app.services.receipt_extraction.get_llm_provider", return_value=provider): - preview = await llm_receipt_preview_from_image(str(image_path), "receipt.png", "image/png", LLMConfig(provider="ollama", model="test")) + preview = await llm_receipt_preview_from_image( + str(image_path), "receipt.png", "image/png", LLMConfig(provider="ollama", model="test") + ) assert preview is not None assert preview.merchant == "Cafe Roma" @@ -147,12 +164,19 @@ async def test_llm_receipt_preview_from_image_uses_multimodal_message(tmp_path): @pytest.mark.asyncio async def test_llm_receipt_preview_from_image_accepts_partial_json_with_null_fields(tmp_path): provider = MagicMock() - provider.complete = AsyncMock(return_value='{"merchant":null,"amount":8.5,"currency":null,"expense_date":null,"description":null,"category_name":null,"notes":"","items":null,"confidence":0.74}') + provider.complete = AsyncMock( + return_value='{"merchant":null,"amount":8.5,"currency":null,"expense_date":null,"description":null,"category_name":null,"notes":"","items":null,"confidence":0.74}' + ) image_path = tmp_path / "cafe-roma_2026-04-11.png" image_path.write_bytes(b"fake-image-bytes") with patch("app.services.receipt_extraction.get_llm_provider", return_value=provider): - preview = await llm_receipt_preview_from_image(str(image_path), "cafe-roma_2026-04-11.png", "image/png", LLMConfig(provider="ollama", model="test")) + preview = await llm_receipt_preview_from_image( + str(image_path), + "cafe-roma_2026-04-11.png", + "image/png", + LLMConfig(provider="ollama", model="test"), + ) assert preview is not None assert preview.merchant == "Cafe Roma" diff --git a/backend/tests/test_report_retry.py b/backend/tests/test_report_retry.py index 93b3bae..fc6265f 100644 --- a/backend/tests/test_report_retry.py +++ b/backend/tests/test_report_retry.py @@ -53,9 +53,9 @@ def test_backoff_arithmetic(): @pytest.mark.parametrize( "attempt, expected_countdown", [ - (0, 2), # 2 ** (0 + 1) = 2 s - (1, 4), # 2 ** (1 + 1) = 4 s - (2, 8), # 2 ** (2 + 1) = 8 s + (0, 2), # 2 ** (0 + 1) = 2 s + (1, 4), # 2 ** (1 + 1) = 4 s + (2, 8), # 2 ** (2 + 1) = 8 s ], ids=["attempt-1", "attempt-2", "attempt-3"], ) diff --git a/backend/tests/test_task_internals.py b/backend/tests/test_task_internals.py index 59fcc51..0268ebe 100644 --- a/backend/tests/test_task_internals.py +++ b/backend/tests/test_task_internals.py @@ -60,11 +60,19 @@ def test_reset_called_before_each_task(): # Compare line numbers so docstring mentions of 'asyncio.run()' don't confuse us. lines = inspect.getsource(receipt_tasks).splitlines() reset_line = next( - (i for i, line in enumerate(lines) if "_reset_ollama_semaphore()" in line and not line.strip().startswith("#")), + ( + i + for i, line in enumerate(lines) + if "_reset_ollama_semaphore()" in line and not line.strip().startswith("#") + ), None, ) run_line = next( - (i for i, line in enumerate(lines) if "asyncio.run(" in line and not line.strip().startswith(("\"\"\"", "#", "``"))), + ( + i + for i, line in enumerate(lines) + if "asyncio.run(" in line and not line.strip().startswith(('"""', "#", "``")) + ), None, ) assert reset_line is not None, "_reset_ollama_semaphore() call not found in receipt_tasks" @@ -85,6 +93,7 @@ def test_semaphore_lazily_recreated_after_reset(): async def _check(): from app.services.llm.ollama import _get_semaphore + sema = _get_semaphore() assert sema is not None assert isinstance(sema, asyncio.Semaphore) diff --git a/docs/screenshots/.gitkeep b/docs/screenshots/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/docs/screenshots/budgets.png b/docs/screenshots/budgets.png new file mode 100644 index 0000000000000000000000000000000000000000..354d31625baf73f7d964b6f1a68d8a855c1ba71a GIT binary patch literal 170183 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%0DkgbPfK?2u9QPb7>yoAD(hBF&JcIvyJ6!N> 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 R{8vjKr4-&*yfgUzzW@$CPP+gA literal 0 HcmV?d00001 diff --git a/docs/screenshots/categories.png b/docs/screenshots/categories.png new file mode 100644 index 0000000000000000000000000000000000000000..b8884446df393c8f358ed322454f29c9bc33d452 GIT binary patch literal 198536 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⋙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 ZgEtJ7b@-l|3xCmyx{9_kPU-RM{{wJ1R6hU! literal 0 HcmV?d00001 diff --git a/docs/screenshots/chat.png b/docs/screenshots/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb6a8b275f6c05712df4b0c1c880570555a92ff GIT binary patch literal 157788 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/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