Coverage for backend \ app \ Venta \ services \ promocionService.py: 97.96%
49 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 app.Venta.repositories.promocionRepository import PromocionRepository
2from app.configuracionGeneral.schemasGenerales import respuestaApi
3from fastapi import HTTPException
4from app.Venta.schemas.promocionSchemas import PromocionCrearSchema, PromocionRespuestaSchema
5from datetime import datetime
7class PromocionService:
8 def __init__(self, dbSession):
9 self.dbSession = dbSession
10 self.repo = PromocionRepository(dbSession)
12 def listarPromociones(self):
13 promos = self.repo.listarPromociones()
14 if not promos:
15 return respuestaApi(success=True, message="No se encontraron promociones", data=[])
16 data = [PromocionRespuestaSchema.from_orm(p) for p in promos]
17 return respuestaApi(success=True, message="Promociones encontradas", data=data)
19 def obtenerPorId(self, idPromocion: int):
20 promo = self.repo.obtenerPorId(idPromocion)
21 if not promo:
22 raise HTTPException(status_code=404, detail="Promoción no encontrada")
23 data = PromocionRespuestaSchema.from_orm(promo)
24 return respuestaApi(success=True, message="Promoción encontrada", data=data)
26 def crearPromocion(self, promocion: PromocionCrearSchema, usuario: dict):
27 # validaciones adicionales: porcentaje en rango (ya en schema), fechas válidas en esquema
28 resultado = self.repo.crearPromocion(promocion, idUsuarioCreador=usuario.get("idUsuario"))
29 if isinstance(resultado, dict) and resultado.get("error"):
30 if resultado.get("error") == "producto_no_encontrado":
31 raise HTTPException(status_code=400, detail="Producto no encontrado")
32 if resultado.get("error") == "producto_inactivo":
33 raise HTTPException(status_code=400, detail="Producto inactivo")
34 raise HTTPException(status_code=400, detail=resultado)
35 data = PromocionRespuestaSchema.from_orm(resultado)
36 return respuestaApi(success=True, message="Promoción creada", data=data)
38 def obtenerActivasPorProducto(self, idProducto: int):
39 promos = self.repo.obtenerPromocionesActivasPorProducto(idProducto)
40 if not promos:
41 return respuestaApi(success=True, message="No se encontraron promociones activas para este producto", data=[])
42 data = [PromocionRespuestaSchema.from_orm(p) for p in promos]
43 return respuestaApi(success=True, message="Promociones activas encontradas", data=data)
45 def deshabilitarPromocion(self, idPromocion: int):
46 des = self.repo.deshabilitarPromocion(idPromocion)
47 if des is None:
48 raise HTTPException(status_code=404, detail="Promoción no encontrada")
49 data = PromocionRespuestaSchema.from_orm(des)
50 return respuestaApi(success=True, message="Promoción deshabilitada", data=data)
52 def obtenerPromocionAplicable(self, idProducto: int):
53 promo = self.repo.obtenerPromocionActivaMayorDescuento(idProducto)
54 if promo is None:
55 return respuestaApi(success=True, message="No hay promociones aplicables", data=None)
56 data = PromocionRespuestaSchema.from_orm(promo)
57 return respuestaApi(success=True, message="Promoción aplicable", data=data)