from __future__ import annotations from datetime import date from decimal import Decimal from mousehold_api import models from mousehold_api.services.projects import calculate_project_summary from mousehold_domain import ( PaymentLineStatus, PaymentStatus, PlanningStatus, ProjectStatus, ReconciliationStatus, SettlementStatus, ) from sqlalchemy.orm import Session def test_project_partial_payment_summary( session: Session, household_setup: dict[str, str], ) -> None: project = models.Project( household_id=household_setup["household_id"], name="Stockholm 2026", status=ProjectStatus.ACTIVE, currency="EUR", ) session.add(project) session.flush() budget_line = models.ProjectBudgetLine( project_id=project.id, name="Accommodation", budgeted_amount=Decimal("800.00"), ) session.add(budget_line) session.flush() item = models.ProjectPlannedItem( project_id=project.id, budget_line_id=budget_line.id, description="Hotel", estimated_amount=Decimal("800.00"), committed_amount=Decimal("760.00"), due_date=date(2026, 8, 12), planning_status=PlanningStatus.COMMITTED, payment_status=PaymentStatus.PARTIALLY_PAID, reconciliation_status=ReconciliationStatus.EMAIL_SEEN, settlement_status=SettlementStatus.UNSETTLED, ) session.add(item) session.flush() session.add( models.PaymentLine( planned_item_id=item.id, amount=Decimal("200.00"), currency="EUR", date=date(2026, 1, 5), paid_by_user_id=household_setup["user_a_id"], status=PaymentLineStatus.PAID, ) ) session.commit() summary = calculate_project_summary(session, project.id) assert summary.budgeted_total == Decimal("800.00") assert summary.committed_total == Decimal("760.00") assert summary.paid_total == Decimal("200.00") assert summary.due_later_total == Decimal("560.00") assert summary.remaining_uncommitted_budget == Decimal("40.00")