---
title: "Cancelar o actualizar un pedido"
method: PUT
path: "/orders"
tags: ["Pedidos"]
---

# Cancelar o actualizar un pedido

`PUT /orders`

## Request

- Base URL: `https://api.pirpos.com`
- URL: `https://api.pirpos.com/orders`
- Auth: HTTP bearer

Actualiza los datos de un pedido existente: estado, notas, causa de cancelación,
cortesía, cantidad, comensales, entre otros. Este es el endpoint utilizado para
**cancelar o anular un pedido**.

## 🚫 Cómo cancelar (o anular) un pedido

Cancelar un pedido **no es una ruta aparte**: se hace con este mismo `PUT /orders`
cambiando el estado del pedido. Sigue estos pasos:

1. **Obtén el `_id` del pedido** que deseas cancelar (por ejemplo desde `GET /orders`).
2. **Envía el cuerpo de la petición** con:
   - `_id`: el ID del pedido a cancelar (**obligatorio**).
   - `status`: `"Cancelada"` (también se acepta el valor equivalente `"Anulada"`).
   - `causeCancel`: el motivo de la cancelación (opcional pero **recomendado**).
3. **Resultado:** el pedido queda con el nuevo estado y se emite una notificación
   WebSocket con el evento `orderCancelled` que incluye el producto cancelado, la
   cantidad, la mesa y el motivo (`causeCancel`) cuando están disponibles.

Ejemplo mínimo del cuerpo para cancelar:
```json
{
  "_id": "507f1f77bcf86cd799439011",
  "status": "Cancelada",
  "causeCancel": "El cliente cambió de opinión"
}
```

> **Nota:** `"Cancelada"` y `"Anulada"` son equivalentes: ambos valores cancelan el
> pedido siguiendo exactamente el mismo flujo. Si el `_id` no corresponde a un pedido
> del negocio, la respuesta será `404`.

**Otros comportamientos:**
- Si el pedido se marca como cortesía (`complementary.isComplementary = true`) el precio y total se establecen en 0.
- Si `updateDiners` es `true` se actualiza la cantidad de comensales (validada entre 1 y 999) y se registra en el historial.
- Si `updateQuantity` es `true` se recalculan los totales de `productsExtra` y `productsCombo` según la nueva cantidad.
- Si el estado cambia a "Entregado" se descuenta del inventario.
- Cualquier cambio notifica al negocio via WebSocket (`ordersUpdated`).

**Autenticación requerida:** Bearer Token en header `Authorization: Bearer {tokenCurrent}`

**Permiso requerido:** `OR_PUT` - "Cancelar Pedidos"

## Request body

- object
  - `_id` string, required: ID del pedido a actualizar
  - `status` 'Espera' | 'Cocina' | 'Listo' | 'Entregado' | 'Cancelada' | 'Anulada' | 'Cortesia' | 'Interno': Nuevo estado del pedido
  - `table` string: ID de la mesa
  - `notes` string[]: Notas del pedido
  - `causeCancel` string: Motivo de cancelación. Opcional, pero se recomienda enviarlo cuando status es Cancelada/Anulada (se incluye en la notificación WebSocket)
  - `complementary` object: Configuración de cortesía
    - `isComplementary` boolean
    - `note` string
  - `quantity` number: Nueva cantidad del pedido
  - `updateQuantity` boolean: Si es true, recalcula totales de productsExtra y productsCombo según la nueva cantidad
  - `diners` object: Cantidad de comensales del pedido (se aplica solo si updateDiners es true)
    - `quantity` integer: Número de comensales (entero entre 1 y 999)
  - `updateDiners` boolean: Si es true, actualiza la cantidad de comensales con el valor de diners.quantity y lo registra en el historial
  - `promo` object: Información de promoción aplicada
  - `newPrint` boolean: Si es true, resetea el flag de impresión del pedido

## Response `200`

Pedido actualizado exitosamente

- Order
  - `_id` string: ID único del pedido
  - `business` string: ID del negocio al que pertenece el pedido
  - `product` object: Información del producto pedido
    - `_id` string: ID del producto
    - `name` string: Nombre del producto
    - `price` number: Precio del producto
  - `table` object: Información de la mesa
    - `_id` string: ID de la mesa
    - `name` string: Nombre de la mesa
  - `deliveryProviderOrder` string: ID del pedido del proveedor de entrega
  - `group` string: ID del grupo de pedidos
  - `groupName` string: Nombre del grupo de pedidos
  - `seller` object: Información del vendedor/mesero
    - `_id` string: ID del vendedor
    - `name` string: Nombre del vendedor
    - `lastName` string: Apellido del vendedor
    - `urlImage` string: URL de la imagen del vendedor
  - `notes` string[]: Notas especiales del pedido
  - `causeCancel` string: Motivo de cancelación del pedido
  - `quantity` number: Cantidad del producto
  - `unit_price` number: Precio unitario
  - `total` number: Total del pedido
  - `status` 'Espera' | 'Cocina' | 'Listo' | 'Entregado' | 'Cancelado': Estado del pedido
  - `statusKitchen` 'Espera' | 'Preparacion' | 'Listo': Estado en cocina
  - `productsExtra` object[]: Productos adicionales/complementos
    - `product` object
      - `_id` string: ID del producto extra
      - `name` string: Nombre del producto extra
      - `price` number: Precio del producto extra
    - `quantity` number: Cantidad del producto extra
  - `complementary` object: Información de cortesía
    - `isComplementary` boolean: Si el pedido es cortesía
    - `reason` string: Motivo de la cortesía
  - `modifiedBy` object: Usuario que modificó el pedido
    - `_id` string: ID del usuario
    - `name` string: Nombre del usuario
  - `deleted` boolean: Si el pedido está eliminado
  - `createdOn` string, date-time: Fecha de creación del pedido
  - `modifiedOn` string, date-time: Fecha de última modificación

## Other responses

- `400`: Datos de entrada inválidos
- `401`: Token de autorización inválido o faltante
- `403`: Sin permisos para cancelar pedidos
- `404`: Pedido no encontrado
- `500`: Error interno del servidor

---

[API](https://skmtc.dev/loggro/apis/restobar-servicios-del-m-dulo-de-restobar.md) - [All operations](https://skmtc.dev/loggro/apis/restobar-servicios-del-m-dulo-de-restobar/llms.txt) - [OpenAPI document](https://skmtc.dev/loggro/apis/restobar-servicios-del-m-dulo-de-restobar/revisions/9d4431a3cddc?raw)
