71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
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")
|