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
« 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
7class PedidoService:
8 def __init__(self, dbSession):
9 self.dbSession = dbSession
10 self.repo = PedidoRepository(dbSession)
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)
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)
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)
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)
42 def revisarPedido(self, idPedido: int, revisar: RevisarPedidoSchema, usuario: dict):
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)
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)
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)
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)