Skip to content

API - Pedidos

Endpoints

GET /t/:slug/orders

Lista pedidos (staff/admin). Filtrado automaticamente pelo BranchScopeGuard com base nos PDVs atribuídos ao usuário.

Auth: Staff ou Admin

Query params:

  • status — Filtrar por status (pending, confirmed, preparing, ready, delivered, cancelled)
  • pdvIds[] — Array de IDs de PDV para escopo de filial (aplicado automaticamente pelo guard)

Response:

json
[
  {
    "_id": "...",
    "orderNumber": "20260227-0001",
    "items": [
      { "menuItem": "...", "name": "X-Burguer", "price": 2500, "quantity": 2, "notes": "Sem cebola" }
    ],
    "customerName": "João",
    "customerPhone": "11999999999",
    "status": "preparing",
    "type": "dine_in",
    "table": "...",
    "pdv": "...",
    "paymentMethod": null,
    "isSplitBill": false,
    "splitBillReference": null,
    "total": 5000,
    "createdAt": "..."
  }
]

POST /t/:slug/orders

Cria um novo pedido (público — sem autenticação).

Body:

json
{
  "items": [
    { "menuItem": "...", "quantity": 2, "notes": "Sem cebola" }
  ],
  "customerName": "João Silva",
  "customerPhone": "11999999999",
  "orderType": "dine_in",
  "table": "..."
}

GET /t/:slug/orders/open-tab/:tableId

Retorna o pedido ativo (não entregue e não cancelado) de uma mesa. Usado pelo PDV no Modo Mesa para detectar comanda aberta.

Auth: Staff ou Admin

Response: Objeto Order ou null

PATCH /t/:slug/orders/:id/add-items

Adiciona itens a uma comanda aberta existente (Modo Mesa). Incrementa a quantidade se o item já existe; adiciona como novo item caso contrário. Recalcula o total e emite evento WebSocket para a cozinha.

Auth: Staff ou Admin + BranchScopeGuard

Body:

json
{
  "items": [
    { "menuItem": "...", "quantity": 1, "notes": "Bem passado" }
  ]
}

Response: Objeto Order atualizado

POST /t/:slug/orders/:id/close-tab

Fecha uma comanda aberta: marca o pedido como delivered e emite evento WebSocket.

Auth: Staff ou Admin + BranchScopeGuard

Body (opcional):

json
{ "paymentMethod": "credit_card" }

Response: Objeto Order atualizado

POST /t/:slug/orders/:id/process-payment

Processa o pagamento de um pedido via gateway externo.

Auth: Staff ou Admin

Body:

json
{
  "method": "credit_card",
  "gateway": "stone",
  "stoneTerminalSerial": "T-001ABC"
}

Response (mock/gateway desativado):

json
{ "status": "approved", "transactionId": "mock-txn-abc123" }

Response (Stone ativo):

json
{
  "status": "processing",
  "intentId": "stone-intent-xyz",
  "message": "Aguardando pagamento na maquininha..."
}

A resolução final chega assincronamente via WebSocket paymentUpdate quando o webhook Stone é processado.


POST /api/stone/webhook

Recebe notificações de resultado de pagamento da Stone. Rota global (sem prefixo /t/:slug).

Auth: HMAC-SHA256 via header X-Stone-Signature (segredo: variável de ambiente STONE_WEBHOOK_SECRET). Requisições com assinatura inválida retornam 401.

Body (Stone):

json
{
  "event": "payment_intent.approved",
  "data": {
    "id": "stone-intent-xyz",
    "status": "approved"
  }
}

Ao receber o webhook, o StoneController atualiza paymentStatus no pedido e emite paymentUpdate via KitchenGateway.

PUT /t/:slug/orders/:id/status

Atualiza status do pedido.

Auth: Staff ou Admin

Body:

json
{
  "status": "preparing"
}

Status Disponíveis

StatusDescrição
pendingPendente
confirmedConfirmado
preparingEm preparo
readyPronto
deliveredEntregue
cancelledCancelado

Campos Adicionais no Modelo

CampoTipoDescrição
pdvObjectId?Referência à filial que criou o pedido
paymentMethodstring?cash | credit_card | debit_card | pix | voucher | mixed
isSplitBillbooleanSe é parte de uma conta dividida
splitBillReferencestring?Número do pedido pai na divisão
pixPayloadstring?Payload PIX para geração do QR code
pixQrCodeBase64string?QR code PIX em base64
paymentGatewaystring?Gateway utilizado: mock ou stone
paymentTransactionIdstring?ID da transação no gateway externo
paymentStatusstring?processing | approved | declined
paymentAttemptsnumberContador de tentativas de pagamento (inicia em 0)
receiptTokenstring?Token único para acesso ao comprovante (expiração: 10 min)

Lançado sob a licença MIT.