Coverage for backend \ app \ Inventario \ services \ inventarioService.py: 100.00%
60 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.repositories.inventarioRepository import InventarioRepository
2from app.configuracionGeneral.schemasGenerales import respuestaApi
3from fastapi import HTTPException
4from app.Inventario.schemas.inventarioSchemas import *
6class InventarioService:
7 def __init__(self, dbSession):
8 self.dbSession = dbSession
9 self.inventarioRepository = InventarioRepository(dbSession)
11 def listarInventarios(self):
12 invs = self.inventarioRepository.listarInventarios()
13 if invs is None:
14 return respuestaApi(success=True, message="No se encontraron inventarios", data=[])
15 data = [InventarioRespuestaSchema.from_orm(i) for i in invs]
16 return respuestaApi(success=True, message="Inventarios encontrados", data=data)
18 def obtenerPorId(self, idInventario: int):
19 inv = self.inventarioRepository.obtenerPorId(idInventario)
20 if inv is None:
21 raise HTTPException(status_code=404, detail="Inventario no encontrado")
22 data = InventarioRespuestaSchema.from_orm(inv)
23 return respuestaApi(success=True, message="Inventario encontrado", data=data)
25 def obtenerPorProducto(self, idProducto: int):
26 inv = self.inventarioRepository.obtenerPorProducto(idProducto)
27 if inv is None:
28 raise HTTPException(status_code=404, detail="Inventario no encontrado")
29 data = InventarioRespuestaSchema.from_orm(inv)
30 return respuestaApi(success=True, message="Inventario encontrado", data=data)
32 def crearInventario(self, inventario: InventarioCrearSchema):
33 # si ya existe inventario para el producto -> devolver existente (idempotente)
34 existente = self.inventarioRepository.obtenerPorProducto(inventario.idProducto)
35 if existente:
36 data = InventarioRespuestaSchema.from_orm(existente)
37 return respuestaApi(success=True, message="Inventario existente", data=data), 200
38 creado = self.inventarioRepository.crearInventario(inventario)
39 if isinstance(creado, dict) and "error" in creado:
40 missing = creado["error"]
41 mensajes = []
42 if "producto" in missing:
43 mensajes.append("Producto no existe")
44 if "producto_inactiva" in missing:
45 mensajes.append("Producto deshabilitado")
46 raise HTTPException(status_code=400, detail="; ".join(mensajes))
47 creado = InventarioRespuestaSchema.from_orm(creado)
48 return respuestaApi(success=True, message="Inventario creado", data=creado), 201
50 def modificarInventario(self, idInventario: int, inventario: InventarioActualizarSchema, usuario: dict):
51 # restricciones por rol: Bodeguero no puede modificar cantidadDisponible
52 datos = inventario.model_dump(exclude_unset=True)
53 rol = usuario.get("rol")
54 if rol == "Bodeguero" and "cantidadDisponible" in datos:
55 raise HTTPException(status_code=403, detail="No tienes permiso para modificar la cantidad disponible")
56 actualizado = self.inventarioRepository.modificarInventario(idInventario, inventario)
57 if actualizado is None:
58 raise HTTPException(status_code=404, detail="Inventario no encontrado")
59 actualizado = InventarioRespuestaSchema.from_orm(actualizado)
60 return respuestaApi(success=True, message="Inventario actualizado", data=actualizado)
62 def deshabilitarInventario(self, idInventario: int):
63 des = self.inventarioRepository.deshabilitarInventario(idInventario)
64 if des is None:
65 raise HTTPException(status_code=404, detail="Inventario no encontrado")
66 if des is False:
67 raise HTTPException(status_code=400, detail="No se puede deshabilitar inventario mientras el producto esté habilitado")
68 des = InventarioRespuestaSchema.from_orm(des)
69 return respuestaApi(success=True, message="Inventario deshabilitado", data=des)