""" Invoice-related DTO models. Based on PHP library's DTO classes for invoices. Note: Invoice functionality is marked as "Not implemented" in the PHP library, but DTO structures are provided for future implementation. """ from decimal import Decimal from typing import Any from pydantic import BaseModel, Field, field_serializer class InvoiceServiceItem(BaseModel): """ Invoice service item model. Maps to PHP DTO\\InvoiceServiceItem. Similar to IncomeServiceItem but for invoices. """ name: str = Field(..., description="Service name/description") amount: Decimal = Field(..., description="Service amount", gt=0) quantity: Decimal = Field(..., description="Service quantity", gt=0) @field_serializer("amount", "quantity") def serialize_decimal(self, value: Decimal) -> str: """Serialize Decimal as string.""" return str(value) def get_total_amount(self) -> Decimal: """Calculate total amount (amount * quantity).""" return self.amount * self.quantity def model_dump(self, **kwargs: Any) -> dict[str, Any]: """Custom serialization to match API format.""" _ = kwargs return { "name": self.name, "amount": str(self.amount), "quantity": str(self.quantity), } class InvoiceClient(BaseModel): """ Invoice client information model. Maps to PHP DTO\\InvoiceClient. Similar to IncomeClient but for invoices. """ contact_phone: str | None = Field( None, alias="contactPhone", description="Client contact phone" ) display_name: str | None = Field( None, alias="displayName", description="Client display name" ) inn: str | None = Field(None, description="Client INN") def model_dump(self, **kwargs: Any) -> dict[str, Any]: """Custom serialization to match API format.""" _ = kwargs return { "contactPhone": self.contact_phone, "displayName": self.display_name, "inn": self.inn, }