Coverage for backend \ app \ Pedido \ controllers \ pedidoController.py: 80.65%

31 statements  

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

1from fastapi import APIRouter, Depends 

2from app.Pedido.services.pedidoService import PedidoService 

3from app.Pedido.schemas.pedidoSchemas import * 

4from app.database import obtenerSesion 

5from app.configuracionGeneral.seguridadJWT import protegerRuta 

6from app.configuracionGeneral.schemasGenerales import respuestaApi 

7 

8router = APIRouter() 

9 

10@router.get("/", tags=["Pedido"], summary="Obtener todos los pedidos", status_code=200, response_model=respuestaApi, 

11 description="Lista todos los pedidos. Roles permitidos: Administrador, Bodeguero. Útil para ver el historial y estado de pedidos (devuelve información completa del usuario creador, aprobador, productos y detalles).") 

12async def listarPedidos(dbSession=Depends(obtenerSesion), usuario=Depends(protegerRuta("Pedido", "GET"))): 

13 return PedidoService(dbSession).listarPedidos() 

14 

15@router.get("/pendientes", tags=["Pedido"], summary="Obtener pedidos pendientes de revisión", status_code=200, response_model=respuestaApi, 

16 description="Devuelve pedidos con estado 'PENDIENTE_REVISION'. Roles: Administrador, Bodeguero. Útil para Administrador para revisar y aprobar/rechazar solicitudes.") 

17async def listarPedidosPendientes(dbSession=Depends(obtenerSesion), usuario=Depends(protegerRuta("Pedido", "GET"))): 

18 return PedidoService(dbSession).listarPedidosPendientes() 

19 

20@router.get("/{idPedido}", tags=["Pedido"], summary="Obtener un pedido por id", status_code=200, response_model=respuestaApi, 

21 description="Devuelve un pedido por su id con detalles y datos de usuarios. Roles: Administrador, Bodeguero.") 

22async def obtenerPedido(idPedido: int, dbSession=Depends(obtenerSesion), usuario=Depends(protegerRuta("Pedido", "GET"))): 

23 return PedidoService(dbSession).obtenerPorId(idPedido) 

24 

25@router.post("/", tags=["Pedido"], summary="Crear un nuevo pedido", status_code=201, response_model=respuestaApi, 

26 description="Crear un pedido. Enviar: {detalles: [{idProducto, cantidadSolicitada}]}. El pedido se crea en estado 'PENDIENTE_REVISION'. Roles: Bodeguero (usa para solicitar abastecimiento) y Administrador.") 

27async def crearPedido(pedido: PedidoCrearSchema, dbSession=Depends(obtenerSesion), usuario=Depends(protegerRuta("Pedido", "POST"))): 

28 return PedidoService(dbSession).crearPedido(pedido, usuario) 

29 

30@router.post("/{idPedido}/revisar", tags=["Pedido"], summary="Revisar/aprobar/rechazar un pedido", status_code=200, response_model=respuestaApi, 

31 description="Aprobar o rechazar un pedido. Enviar: {estadoPedido: 'APROBADO'|'RECHAZADO', observaciones?: string}. Solo el Administrador puede aprobar pedidos creados por otros usuarios.") 

32async def revisarPedido(idPedido: int, revisar: RevisarPedidoSchema, dbSession=Depends(obtenerSesion), usuario=Depends(protegerRuta("Pedido", "ALL"))): 

33 return PedidoService(dbSession).revisarPedido(idPedido, revisar, usuario) 

34 

35# Detalles 

36@router.get("/{idPedido}/detalles", tags=["Pedido"], summary="Listar detalles de un pedido", status_code=200, response_model=respuestaApi, 

37 description="Listar todos los detalles de un pedido. Roles: Administrador, Bodeguero.") 

38async def listarDetalles(idPedido: int, dbSession=Depends(obtenerSesion), usuario=Depends(protegerRuta("Pedido", "GET"))): 

39 return PedidoService(dbSession).listarDetallesPorPedido(idPedido) 

40 

41@router.get("/detalles/{idDetalle}", tags=["Pedido"], summary="Obtener un detalle por id", status_code=200, response_model=respuestaApi, 

42 description="Obtener un detalle de pedido por su id con información del producto y usuario receptor. Roles: Administrador, Bodeguero.") 

43async def obtenerDetalle(idDetalle: int, dbSession=Depends(obtenerSesion), usuario=Depends(protegerRuta("Pedido", "GET"))): 

44 return PedidoService(dbSession).obtenerDetallePorId(idDetalle) 

45 

46@router.post("/detalles/{idDetalle}/recepcionar", tags=["Pedido"], summary="Confirmar recepción de un detalle de pedido", status_code=200, response_model=respuestaApi, 

47 description="Confirmar recepción completa de un detalle: enviar {confirmar: true}. Al confirmar, el detalle se marca como 'RECIBIDO' y la cantidad solicitada se suma al inventario. Roles: Bodeguero (si el pedido está aprobado) y Administrador.") 

48async def recepcionarDetalle(idDetalle: int, recepcion: RecepcionDetalleSchema, dbSession=Depends(obtenerSesion), usuario=Depends(protegerRuta("Pedido", "POST"))): 

49 return PedidoService(dbSession).realizarRecepcionDetalle(idDetalle, recepcion, usuario)