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

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 

6 

7class PromocionService: 

8 def __init__(self, dbSession): 

9 self.dbSession = dbSession 

10 self.repo = PromocionRepository(dbSession) 

11 

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) 

18 

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) 

25 

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) 

37 

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) 

44 

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) 

51 

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)