Coverage for backend \ app \ Pedido \ services \ pedidoService.py: 84.88%

86 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2025-12-29 16:13 -0500

1from app.Pedido.repositories.pedidoRepository import PedidoRepository 

2from app.configuracionGeneral.schemasGenerales import respuestaApi 

3from app.Pedido.schemas.pedidoSchemas import * 

4from fastapi import HTTPException 

5from app.Usuarios.schemas.usuarioSchemas import UsuarioPublicoSchema 

6 

7class PedidoService: 

8 def __init__(self, dbSession): 

9 self.dbSession = dbSession 

10 self.repo = PedidoRepository(dbSession) 

11 

12 def listarPedidos(self): 

13 pedidos = self.repo.listarPedidos() 

14 if not pedidos: 

15 return respuestaApi(success=True, message="No se encontraron pedidos", data=[]) 

16 pedidos_schemas = [PedidoRespuestaSchema.from_orm(p) for p in pedidos] 

17 return respuestaApi(success=True, message="Pedidos encontrados", data=pedidos_schemas) 

18 

19 def obtenerPorId(self, idPedido: int): 

20 pedido = self.repo.obtenerPorId(idPedido) 

21 if not pedido: 

22 raise HTTPException(status_code=404, detail="Pedido no encontrado") 

23 pedido_schema = PedidoRespuestaSchema.from_orm(pedido) 

24 return respuestaApi(success=True, message="Pedido encontrado", data=pedido_schema) 

25 

26 def listarPedidosPendientes(self): 

27 pedidos = self.repo.listarPedidosPendientes() 

28 if not pedidos: 

29 return respuestaApi(success=True, message="No se encontraron pedidos pendientes", data=[]) 

30 pedidos_schemas = [PedidoRespuestaSchema.from_orm(p) for p in pedidos] 

31 return respuestaApi(success=True, message="Pedidos pendientes encontrados", data=pedidos_schemas) 

32 

33 def crearPedido(self, pedidoCrear: PedidoCrearSchema, usuario: dict): 

34 idUsuario = usuario.get("idUsuario") 

35 rol = usuario.get("rol") 

36 resultado = self.repo.crearPedido(pedidoCrear, idUsuario, rol) 

37 if isinstance(resultado, dict) and resultado.get("error"): 

38 raise HTTPException(status_code=400, detail=resultado) 

39 pedido_schema = PedidoRespuestaSchema.from_orm(resultado) 

40 return respuestaApi(success=True, message="Pedido creado", data=pedido_schema) 

41 

42 def revisarPedido(self, idPedido: int, revisar: RevisarPedidoSchema, usuario: dict): 

43 

44 rol = usuario.get("rol") 

45 idUsuario = usuario.get("idUsuario") 

46 # Validar permisos: si el pedido fue creado por otro usuario y el rol no es Administrador, no puede aprobar/rechazar 

47 pedido = self.repo.obtenerPorId(idPedido) 

48 if not pedido: 

49 raise HTTPException(status_code=404, detail="Pedido no encontrado") 

50 print(pedido.idUsuarioCreador, idUsuario, rol) 

51 #if pedido.idUsuarioCreador != idUsuario and rol != "Administrador": 

52 if rol != "Administrador": 

53 print(pedido.idUsuarioCreador, idUsuario, rol) 

54 raise HTTPException(status_code=403, detail="Solo el Administrador puede revisar pedidos creados por otros") 

55 if revisar.estadoPedido not in ["APROBADO", "RECHAZADO"]: 

56 raise HTTPException(status_code=400, detail="Estado de revisión inválido") 

57 resultado = self.repo.revisarPedido(idPedido, revisar.estadoPedido, revisar.observaciones, idUsuario) 

58 if resultado is None: 

59 raise HTTPException(status_code=404, detail="Pedido no encontrado") 

60 if isinstance(resultado, dict) and resultado.get("error") == "pedido_no_modificable": 

61 raise HTTPException(status_code=400, detail="El pedido ya fue revisado y no puede cambiar de estado") 

62 pedido_schema = PedidoRespuestaSchema.from_orm(resultado) 

63 return respuestaApi(success=True, message="Pedido revisado", data=pedido_schema) 

64 

65 def listarDetallesPorPedido(self, idPedido: int): 

66 detalles = self.repo.listarDetallesPorPedido(idPedido) 

67 if not detalles: 

68 return respuestaApi(success=True, message="No se encontraron detalles para este pedido", data=[]) 

69 detalles_schema = [DetallePedidoRespuestaSchema.from_orm(d) for d in detalles] 

70 return respuestaApi(success=True, message="Detalles encontrados", data=detalles_schema) 

71 

72 def obtenerDetallePorId(self, idDetalle: int): 

73 detalle = self.repo.obtenerDetallePorId(idDetalle) 

74 if not detalle: 

75 raise HTTPException(status_code=404, detail="Detalle no encontrado") 

76 detalle_schema = DetallePedidoRespuestaSchema.from_orm(detalle) 

77 return respuestaApi(success=True, message="Detalle encontrado", data=detalle_schema) 

78 

79 def realizarRecepcionDetalle(self, idDetalle: int, recepcion: RecepcionDetalleSchema, usuario: dict): 

80 rol = usuario.get("rol") 

81 idUsuario = usuario.get("idUsuario") 

82 # Permisos: solo Bodeguero y Administrador pueden realizar recepción 

83 if rol not in ["Bodeguero", "Administrador"]: 

84 raise HTTPException(status_code=403, detail="No tiene permisos para recepcionar pedidos") 

85 # Solo aceptamos confirmaciones verdaderas 

86 if not recepcion.confirmar: 

87 raise HTTPException(status_code=400, detail="La recepción debe ser confirmada con {'confirmar': true}") 

88 resultado = self.repo.registrarRecepcionDetalle(idDetalle, recepcion.confirmar, idUsuario) 

89 if resultado is None: 

90 raise HTTPException(status_code=404, detail="Detalle no encontrado") 

91 if isinstance(resultado, dict): 

92 if resultado.get("error") == "ya_recibido": 

93 raise HTTPException(status_code=409, detail="Este detalle ya fue recepcionado previamente") 

94 if resultado.get("error") == "pedido_no_aprobado": 

95 raise HTTPException(status_code=400, detail="El pedido aún no ha sido aprobado") 

96 if resultado.get("error") == "confirmacion_requerida": 

97 raise HTTPException(status_code=400, detail="Confirmación requerida y debe ser true") 

98 raise HTTPException(status_code=400, detail="Error en la recepción") 

99 detalle_schema = DetallePedidoRespuestaSchema.from_orm(resultado) 

100 return respuestaApi(success=True, message="Recepción registrada", data=detalle_schema)