Skip to main content
POST
/
api
/
compras
/
{id}
/
anular
Anular Compra
curl --request POST \
  --url https://api.example.com/api/compras/{id}/anular \
  --header 'Authorization: <authorization>'
{
  "400": {},
  "404": {},
  "500": {},
  "success": true,
  "message": "<string>"
}
Anula una compra registrada, revirtiendo automáticamente el stock de todos los productos y generando movimientos de salida para auditoría.
Esta operación NO tiene endpoint de actualización (PUT/UPDATE). Las compras solo pueden ser anuladas, no modificadas. Para corregir una compra, debe anularse y crear una nueva.

Autenticación

Requiere token Bearer y permiso compras.delete.

Headers

Authorization
string
required
Token de autenticación Bearer

Path Parameters

id
integer
required
ID de la compra a anular

Proceso de Anulación

Al anular una compra:
  1. Verifica el estado: No permite anular compras ya anuladas
  2. Cambia el estado de la compra a 0 (Anulado)
  3. Para cada producto de la compra:
    • Revierte el stock: stock_nuevo = stock_anterior - cantidad_comprada
    • El stock no puede ser negativo (se aplica max(0, ...) para seguridad)
    • Registra un movimiento de stock:
      • tipo_movimiento: salida
      • tipo_documento: anulacion_compra
      • motivo: “Anulación de compra”
      • Incluye stock_anterior y stock_nuevo para trazabilidad
  4. Mantiene la trazabilidad: La compra anulada permanece en la base de datos con estado = 0

Respuesta Exitosa

success
boolean
true si la compra se anuló exitosamente
message
string
“Compra anulada exitosamente”

Ejemplo de Respuesta

{
  "success": true,
  "message": "Compra anulada exitosamente"
}

Movimientos de Stock Generados

Para cada producto de la compra anulada, se crea un movimiento de salida:
{
  "id_producto": 45,
  "tipo_movimiento": "salida",
  "cantidad": 50,
  "stock_anterior": 170,
  "stock_nuevo": 120,
  "tipo_documento": "anulacion_compra",
  "id_documento": 88,
  "documento_referencia": "F001-00000125",
  "motivo": "Anulación de compra",
  "id_almacen": 1,
  "id_empresa": 1,
  "id_usuario": 5,
  "fecha_movimiento": "2026-03-07 09:15:42"
}

Códigos de Error

400
error
La compra ya está anulada
{
  "success": false,
  "message": "La compra ya está anulada"
}
404
error
Compra no encontrada o no pertenece a la empresa del usuario autenticado
500
error
Error interno al anular la compra. Se hace rollback de la transacción.

Notas de Implementación

  • La operación es transaccional: si falla algún paso, se revierte todo (DB::rollBack)
  • El stock se actualiza inmediatamente en la tabla productos
  • Las cuotas de pago pendientes permanecen en dias_compras pero pierden relevancia al estar la compra anulada
  • Para consultar el historial completo de movimientos de un producto: GET /api/movimientos-stock?id_producto={id}
  • No se puede “des-anular” una compra. Si fue un error, debes crear una nueva compra.

Alternativa para Actualizar

Si necesitas modificar una compra:
  1. Consulta la compra original: GET /api/compras/{id}
  2. Anula la compra: POST /api/compras/{id}/anular
  3. Crea una nueva compra con los datos corregidos: POST /api/compras
Esto mantiene el historial de auditoría completo.

Build docs developers (and LLMs) love