Coverage for backend \ app \ Inventario \ repositories \ inventarioRepository.py: 20.97%
62 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.Inventario.models.inventarioModel import Inventario
2from app.Productos.models.productoModel import Producto
3from sqlalchemy.orm import joinedload
5class InventarioRepository:
6 def __init__(self, dbSession):
7 self.dbSession = dbSession
9 def listarInventarios(self):
10 return self.dbSession.query(Inventario).options(joinedload(Inventario.producto)).all()
12 def obtenerPorId(self, idInventario: int):
13 return self.dbSession.query(Inventario).options(joinedload(Inventario.producto)).filter(Inventario.idInventario == idInventario).first()
15 def obtenerPorProducto(self, idProducto: int):
16 return self.dbSession.query(Inventario).filter(Inventario.idProducto == idProducto).first()
18 def crearInventario(self, inventario):
19 # validar producto existe y está activo
20 producto = self.dbSession.query(Producto).filter(Producto.idProducto == inventario.idProducto).first()
21 missing = []
22 if not producto:
23 missing.append("producto")
24 else:
25 if not getattr(producto, "activoProducto", True):
26 missing.append("producto_inactiva")
27 if missing:
28 return {"error": missing}
29 datos = inventario.model_dump()
30 # garantizar que cantidadMinima tenga valor si no se envía
31 if datos.get("cantidadMinima") is None:
32 datos["cantidadMinima"] = 0
33 nuevo = Inventario(**datos)
34 self.dbSession.add(nuevo)
35 self.dbSession.commit()
36 self.dbSession.refresh(nuevo)
37 return nuevo
39 def modificarInventario(self, idInventario: int, inventarioActualizar):
40 inventario = self.obtenerPorId(idInventario)
41 if not inventario:
42 return None
43 datos = inventarioActualizar.model_dump(exclude_unset=True)
44 camposValidos = ["cantidadDisponible","cantidadMinima","activoInventario"]
45 for campo, valor in datos.items():
46 if campo in camposValidos:
47 setattr(inventario, campo, valor)
48 self.dbSession.commit()
49 self.dbSession.refresh(inventario)
50 return inventario
52 def deshabilitarInventario(self, idInventario: int):
53 inventario = self.obtenerPorId(idInventario)
54 if not inventario:
55 return None
56 # Solo permitir deshabilitar si el producto asociado está deshabilitado
57 producto = self.dbSession.query(Producto).filter(Producto.idProducto == inventario.idProducto).first()
58 if producto and getattr(producto, "activoProducto", True):
59 return False
60 inventario.activoInventario = False
61 self.dbSession.commit()
62 self.dbSession.refresh(inventario)
63 return inventario
65 def crearInventariosIniciales(self):
66 # Crear un inventario por cada producto existente si no tiene inventario
67 productos = self.dbSession.query(Producto).all()
68 for p in productos:
69 existe = self.dbSession.query(Inventario).filter(Inventario.idProducto == p.idProducto).first()
70 if not existe:
71 nuevo = Inventario(idProducto=p.idProducto, cantidadDisponible=0, cantidadMinima=0, activoInventario=True)
72 self.dbSession.add(nuevo)
73 print("Inventarios por defecto creados...!")
74 self.dbSession.commit()
75 self.dbSession.close()