Coverage for backend \ app \ Productos \ services \ productoService.py: 100.00%
76 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.Productos.repositories.productoRepository import ProductoRepository
2from app.configuracionGeneral.schemasGenerales import respuestaApi
3from fastapi import HTTPException
4from app.Productos.schemas.productoSchemas import *
6class ProductoService:
7 def __init__(self, dbSession):
8 self.dbSession = dbSession
9 self.productoRepository = ProductoRepository(dbSession)
11 def listarProductos(self):
12 productos = self.productoRepository.listarProductos()
13 if productos is None:
14 return respuestaApi(success=True, message="No se encontraron productos", data=[])
15 productos = [ProductoRespuestaSchema.from_orm(p) for p in productos]
16 return respuestaApi(success=True, message="Productos encontrados", data=productos)
18 def obtenerPorId(self, idProducto: int):
19 producto = self.productoRepository.obtenerPorId(idProducto)
20 if producto is None:
21 raise HTTPException(status_code=404, detail="Producto no encontrado")
22 producto = ProductoRespuestaSchema.from_orm(producto)
23 return respuestaApi(success=True, message="Producto encontrado", data=producto)
25 def crearProducto(self, producto: ProductoCrearSchema):
26 creado = self.productoRepository.crearProducto(producto)
27 if isinstance(creado, dict) and "error" in creado:
28 missing = creado["error"]
29 # Mapear códigos a mensajes
30 mensajes = []
31 if "categoria" in missing and "proveedor" in missing:
32 raise HTTPException(status_code=400, detail="Categoria y Proveedor no existen")
33 if "categoria" in missing:
34 mensajes.append("Categoria no existe")
35 if "proveedor" in missing:
36 mensajes.append("Proveedor no existe")
37 if "categoria_inactiva" in missing:
38 mensajes.append("Categoria deshabilitada")
39 if "proveedor_inactiva" in missing:
40 mensajes.append("Proveedor deshabilitado")
41 if "cantidad_disponible_negativa" in missing:
42 mensajes.append("cantidadDisponible no puede ser negativa")
43 if "cantidad_minima_negativa" in missing:
44 mensajes.append("cantidadMinima no puede ser negativa")
45 raise HTTPException(status_code=400, detail="; ".join(mensajes))
46 if creado is None:
47 raise HTTPException(status_code=400, detail="Error al crear producto")
48 inventario_creado = False
49 producto_obj = creado
50 # Si el repo devuelve una tupla (producto, inventario_creado)
51 if isinstance(creado, tuple):
52 producto_obj, inventario_creado = creado
53 producto_resp = ProductoRespuestaSchema.from_orm(producto_obj)
54 if inventario_creado:
55 return respuestaApi(success=True, message="Producto e inventario creados", data=producto_resp)
56 return respuestaApi(success=True, message="Producto creado", data=producto_resp)
58 def modificarProducto(self, idProducto: int, producto: ProductoActualizarSchema):
59 actualizado = self.productoRepository.modificarProducto(idProducto, producto)
60 if actualizado is None:
61 raise HTTPException(status_code=404, detail="Producto no encontrado")
62 if isinstance(actualizado, dict) and "error" in actualizado:
63 missing = actualizado["error"]
64 mensajes = []
65 if "categoria" in missing and "proveedor" in missing:
66 raise HTTPException(status_code=400, detail="Categoria y Proveedor no existen")
67 if "categoria" in missing:
68 mensajes.append("Categoria no existe")
69 if "proveedor" in missing:
70 mensajes.append("Proveedor no existe")
71 if "categoria_inactiva" in missing:
72 mensajes.append("Categoria deshabilitada")
73 if "proveedor_inactiva" in missing:
74 mensajes.append("Proveedor deshabilitado")
75 raise HTTPException(status_code=400, detail="; ".join(mensajes))
76 actualizado = ProductoRespuestaSchema.from_orm(actualizado)
77 return respuestaApi(success=True, message="Producto actualizado", data=actualizado)
79 def deshabilitarProducto(self, idProducto: int):
80 des = self.productoRepository.deshabilitarProducto(idProducto)
81 if des is None:
82 raise HTTPException(status_code=404, detail="Producto no encontrado")
83 des = ProductoRespuestaSchema.from_orm(des)
84 return respuestaApi(success=True, message="Producto deshabilitado", data=des)