Coverage for backend \ app \ Venta \ repositories \ promocionRepository.py: 20.00%

70 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2025-12-29 16:13 -0500

1from app.Venta.models.promocionModel import Promocion 

2from app.Productos.models.productoModel import Producto 

3from sqlalchemy.orm import joinedload 

4from datetime import datetime, timezone, timedelta,time 

5 

6class PromocionRepository: 

7 def __init__(self, dbSession): 

8 self.dbSession = dbSession 

9 

10 def listarPromociones(self): 

11 return self.dbSession.query(Promocion).options(joinedload(Promocion.producto)).all() 

12 

13 def obtenerPorId(self, idPromocion: int): 

14 return self.dbSession.query(Promocion).options(joinedload(Promocion.producto)).filter(Promocion.idPromocion == idPromocion).first() 

15 

16 def crearPromocion(self, promocionCrear, idUsuarioCreador=None): 

17 # Validar producto 

18 producto = self.dbSession.query(Producto).filter(Producto.idProducto == promocionCrear.idProducto).first() 

19 if not producto: 

20 return {"error": "producto_no_encontrado"} 

21 if not getattr(producto, "activoProducto", True): 

22 return {"error": "producto_inactivo"} 

23 # Las fechas ya fueron validadas en el schema; construir datetimes con horas apropiadas 

24 quitoTZ = timezone(timedelta(hours=-5)) 

25 

26 #fecha_inicio = datetime.combine(promocionCrear.fechaInicioPromocion, now.time()).astimezone(quitoTZ) 

27 #fecha_fin = datetime.combine(promocionCrear.fechaFinPromocion, datetime.max.time()).replace(hour=23, minute=59, second=59, microsecond=0).astimezone(quitoTZ) 

28 hora_actual = datetime.now(quitoTZ).time() 

29 fecha_inicio = datetime.combine(promocionCrear.fechaInicioPromocion,hora_actual,tzinfo=quitoTZ) 

30 fecha_fin = datetime.combine(promocionCrear.fechaFinPromocion,time(23,59,59,microsecond=0),tzinfo=quitoTZ) 

31 

32 print(quitoTZ, hora_actual, fecha_inicio, fecha_fin) 

33 nuevo = Promocion( 

34 idProducto=promocionCrear.idProducto, 

35 nombrePromocion=promocionCrear.nombrePromocion, 

36 porcentajePromocion=promocionCrear.porcentajePromocion, 

37 fechaInicioPromocion=fecha_inicio, 

38 fechaFinPromocion=fecha_fin, 

39 activoPromocion=True 

40 ) 

41 self.dbSession.add(nuevo) 

42 self.dbSession.commit() 

43 self.dbSession.refresh(nuevo) 

44 return nuevo 

45 

46 def obtenerPromocionesActivasPorProducto(self, idProducto: int): 

47 tz = timezone(timedelta(hours=-5)) 

48 ahora = datetime.now(tz) 

49 return (self.dbSession.query(Promocion) 

50 .filter(Promocion.idProducto == idProducto, Promocion.activoPromocion == True, Promocion.fechaInicioPromocion <= ahora, Promocion.fechaFinPromocion >= ahora) 

51 .all()) 

52 

53 def deshabilitarPromocion(self, idPromocion: int): 

54 promo = self.dbSession.query(Promocion).filter(Promocion.idPromocion == idPromocion).first() 

55 if not promo: 

56 return None 

57 promo.activoPromocion = False 

58 self.dbSession.commit() 

59 self.dbSession.refresh(promo) 

60 return promo 

61 

62 def obtenerPromocionActivaMayorDescuento(self, idProducto: int): 

63 tz = timezone(timedelta(hours=-5)) 

64 ahora = datetime.now(tz) 

65 promos = (self.dbSession.query(Promocion) 

66 .filter(Promocion.idProducto == idProducto, Promocion.activoPromocion == True, Promocion.fechaInicioPromocion <= ahora, Promocion.fechaFinPromocion >= ahora) 

67 .order_by(Promocion.porcentajePromocion.desc()).all()) 

68 return promos[0] if promos else None 

69 

70 def crearPromocionesIniciales(self): 

71 """Crea dos promociones de prueba si no existen promociones en la base: 

72 - Una promoción con fechas ya pasadas (start -60d / end -30d) 

73 - Una promoción que inicia hoy y finaliza en +30 días 

74 Las promociones usan los productos 'Cola 2 Litros' y 'Jugo de Naranja 1L' si existen. 

75 """ 

76 existe = self.dbSession.query(Promocion).first() 

77 if existe: 

78 return 

79 # Buscar productos de prueba 

80 producto1 = self.dbSession.query(Producto).filter(Producto.nombreProducto == "Cola 2 Litros").first() 

81 producto2 = self.dbSession.query(Producto).filter(Producto.nombreProducto == "Jugo de Naranja 1L").first() 

82 if not producto1 or not producto2: 

83 return 

84 quitoTZ = timezone(timedelta(hours=-5)) 

85 hoy = datetime.now(quitoTZ).date() 

86 # Promoción pasada 

87 inicio_pasado = hoy - timedelta(days=60) 

88 fin_pasado = hoy - timedelta(days=30) 

89 hora_actual = datetime.now(quitoTZ).time() 

90 

91 fecha_inicio_pasado = datetime.combine(inicio_pasado, hora_actual, tzinfo=quitoTZ) 

92 fecha_fin_pasado = datetime.combine(fin_pasado,time(23,59,59,microsecond=0),tzinfo=quitoTZ) 

93 

94 promo_pasada = Promocion( 

95 idProducto=producto1.idProducto, 

96 nombrePromocion="Promoción Pasada", 

97 porcentajePromocion=10.0, 

98 fechaInicioPromocion=fecha_inicio_pasado, 

99 fechaFinPromocion=fecha_fin_pasado, 

100 activoPromocion=True 

101 ) 

102 self.dbSession.add(promo_pasada) 

103 # Promoción vigente (hoy -> +30 días) 

104 inicio_act = hoy 

105 fin_act = hoy + timedelta(days=30) 

106 fecha_inicio_act = datetime.combine(inicio_act, hora_actual, tzinfo=quitoTZ) 

107 fecha_fin_act = datetime.combine(fin_act, time(23,59,59,microsecond=0), tzinfo=quitoTZ) 

108 promo_actual = Promocion( 

109 idProducto=producto2.idProducto, 

110 nombrePromocion="Promoción Actual", 

111 porcentajePromocion=25.0, 

112 fechaInicioPromocion=fecha_inicio_act, 

113 fechaFinPromocion=fecha_fin_act, 

114 activoPromocion=True 

115 ) 

116 self.dbSession.add(promo_actual) 

117 self.dbSession.commit() 

118 self.dbSession.close() 

119 print("Promociones por defecto creadas...!")