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
« 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
8router = APIRouter()
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()
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()
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)
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)
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)
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)
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)
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)