from typing import List, Optional from pydantic import BaseModel from datetime import datetime from decimal import Decimal class InvoiceItemBase(BaseModel): description: str quantity: Decimal unit_price: Decimal total_price: Decimal class InvoiceItemCreate(InvoiceItemBase): pass class InvoiceItemUpdate(BaseModel): description: Optional[str] = None quantity: Optional[Decimal] = None unit_price: Optional[Decimal] = None total_price: Optional[Decimal] = None class InvoiceItemInDBBase(InvoiceItemBase): id: int invoice_id: int created_at: datetime class Config: from_attributes = True class InvoiceItem(InvoiceItemInDBBase): pass class InvoiceBase(BaseModel): invoice_number: str issue_date: datetime due_date: datetime status: str = "draft" subtotal: Decimal = Decimal("0.00") tax_rate: Decimal = Decimal("0.00") tax_amount: Decimal = Decimal("0.00") total_amount: Decimal = Decimal("0.00") notes: Optional[str] = None class InvoiceCreate(InvoiceBase): customer_id: int items: List[InvoiceItemCreate] = [] class InvoiceUpdate(BaseModel): invoice_number: Optional[str] = None issue_date: Optional[datetime] = None due_date: Optional[datetime] = None status: Optional[str] = None subtotal: Optional[Decimal] = None tax_rate: Optional[Decimal] = None tax_amount: Optional[Decimal] = None total_amount: Optional[Decimal] = None notes: Optional[str] = None customer_id: Optional[int] = None items: Optional[List[InvoiceItemCreate]] = None class InvoiceInDBBase(InvoiceBase): id: int user_id: int customer_id: int created_at: datetime updated_at: Optional[datetime] = None class Config: from_attributes = True class Invoice(InvoiceInDBBase): items: List[InvoiceItem] = []