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

1from app.Productos.repositories.productoRepository import ProductoRepository 

2from app.configuracionGeneral.schemasGenerales import respuestaApi 

3from fastapi import HTTPException 

4from app.Productos.schemas.productoSchemas import * 

5 

6class ProductoService: 

7 def __init__(self, dbSession): 

8 self.dbSession = dbSession 

9 self.productoRepository = ProductoRepository(dbSession) 

10 

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) 

17 

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) 

24 

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) 

57 

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) 

78 

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)