![google-labs-jules[bot]](/assets/img/avatar_default.png)
Backend: - Added `SettlementActivity` model to track payments against specific expense shares. - Added `status` and `paid_at` to `ExpenseSplit` model. - Added `overall_settlement_status` to `Expense` model. - Implemented CRUD for `SettlementActivity`, including logic to update parent expense/split statuses. - Updated `Expense` CRUD to initialize new status fields. - Defined Pydantic schemas for `SettlementActivity` and updated `Expense/ExpenseSplit` schemas. - Exposed API endpoints for creating/listing settlement activities and settling shares. - Adjusted group balance summary logic to include settlement activities. - Added comprehensive backend unit and API tests for new functionality. Frontend (Foundation & TODOs due to my current capabilities): - Created TypeScript interfaces for all new/updated models. - Set up `listDetailStore.ts` with an action to handle `settleExpenseSplit` (API call is a placeholder) and refresh data. - Created `SettleShareModal.vue` component for payment confirmation. - Added unit tests for the new modal and store logic. - Updated `ListDetailPage.vue` to display detailed expense/share statuses and settlement activities. - `mitlist_doc.md` updated to reflect all backend changes and current frontend status. - A `TODO.md` (implicitly within `mitlist_doc.md`'s new section) outlines necessary manual frontend integrations for `api.ts` and `ListDetailPage.vue` to complete the 'Settle Share' UI flow. This set of changes provides the core backend infrastructure for precise expense share tracking and settlement, and lays the groundwork for full frontend integration.
44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
from pydantic import BaseModel, ConfigDict, field_validator
|
|
from typing import Optional, List
|
|
from decimal import Decimal
|
|
from datetime import datetime
|
|
|
|
from app.schemas.user import UserPublic # Assuming UserPublic is defined here
|
|
|
|
class SettlementActivityBase(BaseModel):
|
|
expense_split_id: int
|
|
paid_by_user_id: int
|
|
amount_paid: Decimal
|
|
paid_at: Optional[datetime] = None
|
|
|
|
class SettlementActivityCreate(SettlementActivityBase):
|
|
@field_validator('amount_paid')
|
|
@classmethod
|
|
def amount_must_be_positive(cls, v: Decimal) -> Decimal:
|
|
if v <= Decimal("0"):
|
|
raise ValueError("Amount paid must be a positive value.")
|
|
return v
|
|
|
|
class SettlementActivityPublic(SettlementActivityBase):
|
|
id: int
|
|
created_by_user_id: int # User who recorded this activity
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
payer: Optional[UserPublic] = None # User who made this part of the payment
|
|
creator: Optional[UserPublic] = None # User who recorded this activity
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
# Schema for updating a settlement activity (if needed in the future)
|
|
# class SettlementActivityUpdate(BaseModel):
|
|
# amount_paid: Optional[Decimal] = None
|
|
# paid_at: Optional[datetime] = None
|
|
|
|
# @field_validator('amount_paid')
|
|
# @classmethod
|
|
# def amount_must_be_positive_if_provided(cls, v: Optional[Decimal]) -> Optional[Decimal]:
|
|
# if v is not None and v <= Decimal("0"):
|
|
# raise ValueError("Amount paid must be a positive value.")
|
|
# return v
|