from pydantic import BaseModel, Field from typing import Optional, List from datetime import date from app.models.invoice import InvoiceStatus class InvoiceItemBase(BaseModel): description: str quantity: float = Field(..., gt=0) unit_price: float = Field(..., ge=0) class InvoiceItemCreate(InvoiceItemBase): pass class InvoiceItemUpdate(InvoiceItemBase): description: Optional[str] = None quantity: Optional[float] = Field(None, gt=0) unit_price: Optional[float] = Field(None, ge=0) class InvoiceItemInDBBase(InvoiceItemBase): id: str invoice_id: str class Config: from_attributes = True class InvoiceItem(InvoiceItemInDBBase): pass class InvoiceBase(BaseModel): invoice_number: str status: InvoiceStatus = InvoiceStatus.DRAFT issued_date: date due_date: date notes: Optional[str] = None client_id: str class InvoiceCreate(InvoiceBase): items: List[InvoiceItemCreate] class InvoiceUpdate(BaseModel): invoice_number: Optional[str] = None status: Optional[InvoiceStatus] = None issued_date: Optional[date] = None due_date: Optional[date] = None notes: Optional[str] = None client_id: Optional[str] = None class InvoiceInDBBase(InvoiceBase): id: str user_id: str created_at: date updated_at: date class Config: from_attributes = True class Invoice(InvoiceInDBBase): items: List[InvoiceItem] = [] total: float = 0.0