from pydantic import BaseModel, EmailStr, Field from typing import Optional from datetime import datetime from app.models.enums import EstadoCliente class ClienteBase(BaseModel): nombre: str = Field(..., min_length=1, max_length=255) email: EmailStr rfc: Optional[str] = Field(None, max_length=13) telefono: Optional[str] = Field(None, max_length=20) permite_subclientes: bool = True class ClienteCreate(ClienteBase): limite_timbres: int = Field(0, ge=0) class ClienteUpdate(BaseModel): nombre: Optional[str] = Field(None, min_length=1, max_length=255) email: Optional[EmailStr] = None rfc: Optional[str] = Field(None, max_length=13) telefono: Optional[str] = Field(None, max_length=20) limite_timbres: Optional[int] = Field(None, ge=0) estado: Optional[EstadoCliente] = None permite_subclientes: Optional[bool] = None class ClienteResponse(ClienteBase): id: int timbres_consumidos: int estado: EstadoCliente created_at: datetime updated_at: Optional[datetime] # Campos calculados dinámicamente limite_timbres: Optional[int] = None timbres_disponibles: Optional[int] = None class Config: from_attributes = True class ClienteWithStats(ClienteResponse): total_subclientes: int = 0 timbres_consumidos_subclientes: int = 0 total_limites_asignados: int = 0 class BalanceResponse(BaseModel): cliente_id: int nombre_cliente: str limite_timbres: int timbres_disponibles: int timbres_consumidos: int porcentaje_uso: float total_subclientes: int = 0 timbres_consumidos_subclientes: int = 0 class RecargaTimbreCreate(BaseModel): """Schema específico para recargar timbres""" cantidad: int = Field(..., gt=0) descripcion: Optional[str] = Field(None, max_length=500)