Coverage for backend \ app \ Reportes \ schemas \ reporteSchemas.py: 98.36%
61 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-29 16:13 -0500
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-29 16:13 -0500
1from pydantic import BaseModel, Field, field_validator
2from typing import Optional, List
3from datetime import date, datetime
4from app.Usuarios.schemas.usuarioSchemas import UsuarioPublicoSchema
5from app.Clientes.schemas.clienteSchemas import ClienteRespuestaSchema
6from app.Venta.schemas.ventaSchemas import VentaRespuestaSchema
7from app.Inventario.schemas.inventarioSchemas import InventarioRespuestaSchema
9# Filtros
10class InventarioFiltro(BaseModel):
11 # Filtros opcionales (se pueden enviar cualquiera de los tres y se combinarán): idProducto, idCategoria, nombreProducto
12 idProducto: Optional[int] = None
13 idCategoria: Optional[int] = None
14 nombreProducto: Optional[str] = None
16class VentasFiltro(BaseModel):
17 # Fechas obligatorias
18 fechaInicio: date
19 fechaFin: date
20 idProducto: Optional[int] = None
21 idCategoria: Optional[int] = None
23 @field_validator("fechaFin")
24 @classmethod
25 def validar_fechas(cls, v, info):
26 fechaInicio = info.data.get("fechaInicio")
27 if fechaInicio and v < fechaInicio:
28 raise ValueError("fechaFin debe ser mayor o igual a fechaInicio")
29 return v
31class CajaFiltro(BaseModel):
32 fecha: date
33 idUsuarioCaja: int
35class ClientesFiltro(BaseModel):
36 dias: int = Field(30, description="Periodo en días para considerar actividad")
37 minVentas: int = Field(3, description="Mínimo número de ventas para ser frecuente")
38 minGasto: float = Field(100.0, description="Gasto mínimo en el periodo")
40# Respuestas
41class InventarioReporteRespuesta(BaseModel):
42 items: List[InventarioRespuestaSchema] = []
44class VentasPorProductoItem(BaseModel):
45 idProducto: int
46 nombreProducto: str
47 idCategoria: int
48 nombreCategoria: str
49 cantidadVendida: int
50 ingresos: float
52class VentasReporteRespuesta(BaseModel):
53 items: List[VentasPorProductoItem] = []
55class ResumenCajaItem(BaseModel):
56 idCaja: int
57 usuario: Optional[UsuarioPublicoSchema] = None
58 fechaAperturaCaja: datetime
59 fechaCierreCaja: Optional[datetime] = None
60 montoInicialDeclarado: float
61 montoCierreDeclarado: Optional[float] = None
62 montoCierreSistema: Optional[float] = None
63 diferenciaCaja: Optional[float] = None
64 estadoCaja: str
65 ventas: List[VentaRespuestaSchema] = []
67class ResumenCajaRespuesta(BaseModel):
68 items: List[ResumenCajaItem] = []
70class ClienteFrecuenteItem(BaseModel):
71 cliente: ClienteRespuestaSchema
72 ventasCount: int
73 totalGastado: float
74 historialVentas: List[VentaRespuestaSchema] = []
76class ClientesFrecuentesRespuesta(BaseModel):
77 items: List[ClienteFrecuenteItem] = []