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

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 

8 

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 

15 

16class VentasFiltro(BaseModel): 

17 # Fechas obligatorias 

18 fechaInicio: date 

19 fechaFin: date 

20 idProducto: Optional[int] = None 

21 idCategoria: Optional[int] = None 

22 

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 

30 

31class CajaFiltro(BaseModel): 

32 fecha: date 

33 idUsuarioCaja: int 

34 

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") 

39 

40# Respuestas 

41class InventarioReporteRespuesta(BaseModel): 

42 items: List[InventarioRespuestaSchema] = [] 

43 

44class VentasPorProductoItem(BaseModel): 

45 idProducto: int 

46 nombreProducto: str 

47 idCategoria: int 

48 nombreCategoria: str 

49 cantidadVendida: int 

50 ingresos: float 

51 

52class VentasReporteRespuesta(BaseModel): 

53 items: List[VentasPorProductoItem] = [] 

54 

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] = [] 

66 

67class ResumenCajaRespuesta(BaseModel): 

68 items: List[ResumenCajaItem] = [] 

69 

70class ClienteFrecuenteItem(BaseModel): 

71 cliente: ClienteRespuestaSchema 

72 ventasCount: int 

73 totalGastado: float 

74 historialVentas: List[VentaRespuestaSchema] = [] 

75 

76class ClientesFrecuentesRespuesta(BaseModel): 

77 items: List[ClienteFrecuenteItem] = []