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.
Token de autenticación Bearer
Path Parameters
Proceso de Anulación
Al anular una compra:
-
Verifica el estado: No permite anular compras ya anuladas
-
Cambia el estado de la compra a
0 (Anulado)
-
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
-
Mantiene la trazabilidad: La compra anulada permanece en la base de datos con
estado = 0
Respuesta Exitosa
true si la compra se anuló exitosamente
“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
La compra ya está anulada{
"success": false,
"message": "La compra ya está anulada"
}
Compra no encontrada o no pertenece a la empresa del usuario autenticado
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:
- Consulta la compra original:
GET /api/compras/{id}
- Anula la compra:
POST /api/compras/{id}/anular
- Crea una nueva compra con los datos corregidos:
POST /api/compras
Esto mantiene el historial de auditoría completo.