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
« 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
6class PromocionRepository:
7 def __init__(self, dbSession):
8 self.dbSession = dbSession
10 def listarPromociones(self):
11 return self.dbSession.query(Promocion).options(joinedload(Promocion.producto)).all()
13 def obtenerPorId(self, idPromocion: int):
14 return self.dbSession.query(Promocion).options(joinedload(Promocion.producto)).filter(Promocion.idPromocion == idPromocion).first()
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))
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)
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
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())
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
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
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()
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)
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...!")