# API para liberar as comandas após finalizar a venda.

# 📌 API – Confirmar Faturamento (Liberar/Resetar Comandas)

**Endpoint:**  
`POST /api/v1/mesas-comandas/confirmar-faturamento`

---

## 🎯 Objetivo da API

Esta API é utilizada pelo **PDV** ao final do atendimento para **liberar (resetar)** uma ou mais comandas que estavam em **`conferencia`**, tornando-as **`livre`** novamente para um novo cliente.

✅ O que essa API faz no Servidor de Comandas (para cada comanda liberada):

- apaga **itens** associados à comanda;
- apaga **pagamentos** associados (se existirem);
- limpa/zera informações associadas à mesa/comanda (mesma lógica do `liberar-mesa`);
- altera o status para **`livre`**.

🚫 O que essa API **NÃO faz**:

- não recebe dados fiscais;
- não recebe pagamentos;
- não valida NFC-e/NF-e;
- não emite documento fiscal.

> Pagamento e emissão fiscal são responsabilidades do PDV e não são enviados ao Servidor de Comandas.

---

## 🧠 Quando usar (fluxo do integrador)

Use esta API **apenas após** o PDV ter:

1. chamado `POST /api/v1/mesas-comandas/iniciar-faturamento` (e recebido comandas em `conferencia`), e
2. finalizado o atendimento no PDV.

📌 **Recomendação prática**:  
Envie em `confirmar-faturamento` **somente as comandas que o servidor retornou em `comandasParaFaturar`** (ou seja, as que realmente entraram em `conferencia`).

---

## 🔐 Autenticação

Segue o **padrão de autenticação do Servidor de Comandas** (não detalhado no cartão).

> Quando você definir/passar o padrão, incluo aqui (JWT, x-api-key, etc.).

---

## 📥 Request

### Body (JSON)

<div class="TyagGW_tableContainer" id="bkmrk-campo-tipo-obrigat%C3%B3r"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="2078" data-start="1789"><thead data-end="1831" data-start="1789"><tr data-end="1831" data-start="1789"><th data-col-size="sm" data-end="1797" data-start="1789">Campo</th><th data-col-size="sm" data-end="1804" data-start="1797">Tipo</th><th data-col-size="sm" data-end="1818" data-start="1804">Obrigatório</th><th data-col-size="md" data-end="1831" data-start="1818">Descrição</th></tr></thead><tbody data-end="2078" data-start="1851"><tr data-end="1939" data-start="1851"><td data-col-size="sm" data-end="1867" data-start="1851">`numeroMesas`</td><td data-col-size="sm" data-end="1880" data-start="1867">`number[]`</td><td data-col-size="sm" data-end="1884" data-start="1880">✅</td><td data-col-size="md" data-end="1939" data-start="1884">Lista de mesas/comandas a serem liberadas/resetadas</td></tr><tr data-end="2005" data-start="1940"><td data-col-size="sm" data-end="1954" data-start="1940">`numeroPdv`</td><td data-col-size="sm" data-end="1965" data-start="1954">`string`</td><td data-col-size="sm" data-end="1969" data-start="1965">✅</td><td data-col-size="md" data-end="2005" data-start="1969">Identificação do PDV solicitante</td></tr><tr data-end="2078" data-start="2006"><td data-col-size="sm" data-end="2022" data-start="2006">`operador_id`</td><td data-col-size="sm" data-end="2033" data-start="2022">`string`</td><td data-col-size="sm" data-end="2037" data-start="2033">✅</td><td data-col-size="md" data-end="2078" data-start="2037">Identificação do operador solicitante</td></tr></tbody></table>

</div></div>### Exemplo

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk--4"><div class="sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl/main:top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>```json
{
  "numeroMesas": [4069, 4070, 4075],
  "numeroPdv": "12",
  "operador_id": "1275"
}

```

---

## ⚙️ Regras de validação (por comanda)

Para cada `idMesa` em `numeroMesas`:

### 1) Comanda não existe

- Vai para `comandasBloqueadasParaConfirmar`
- `motivo = NAO_ENCONTRADA`

### 2) Comanda está em `conferencia`

- Pode liberar, **desde que**:
    
    
    - se existir `numeroPdvEmConferencia` e ele for **diferente** do `numeroPdv` do request → bloquear:
        
        
        - `motivo = EM_CONFERENCIA_OUTRO_PDV`
        - retornar `numeroPdvEmConferencia`
    - caso contrário → liberar com sucesso

### 3) Comanda está `livre`

- Bloquear:
    
    
    - `motivo = STATUS_LIVRE` (já está disponível)

### 4) Comanda está `consumo`

- Se tiver `pos_lancando` → bloquear:
    
    
    - `motivo = EM_LANCAMENTO_ITENS`
    - retornar `pos_lancando`
- Se **não** tiver `pos_lancando` → bloquear:
    
    
    - `motivo = NAO_ESTA_EM_CONFERENCIA`
    - (porque não é uma comanda travada para faturamento do PDV Linux)

### 5) Comanda está `transferencia`

- Bloquear:
    
    
    - `motivo = EM_TRANSFERENCIA`

### 6) Outros status

- Bloquear:
    
    
    - `motivo = STATUS_INVALIDO`

> Observação importante: mesmo parecendo “reset”, a regra do fluxo do PDV Linux é **liberar somente o que estava em conferência**, para reduzir risco de liberar mesa errada.

---

## 📤 Response – Sucesso (200)

### Quando acontece?

Quando **pelo menos 1 comanda** foi liberada/resetada com sucesso.

### Estrutura do retorno

A API sempre retorna duas listas:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk--7"><div class="sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl/main:top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>```json
{
  "comandasConfirmadasParaFaturar": [],
  "comandasBloqueadasParaConfirmar": []
}

```

---

## ✅ `comandasConfirmadasParaFaturar`

Lista das comandas que foram **liberadas/resetadas** com sucesso.

### Campos

<div class="TyagGW_tableContainer" id="bkmrk-campo-descri%C3%A7%C3%A3o-idme"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="3954" data-start="3768"><thead data-end="3789" data-start="3768"><tr data-end="3789" data-start="3768"><th data-col-size="sm" data-end="3776" data-start="3768">Campo</th><th data-col-size="sm" data-end="3789" data-start="3776">Descrição</th></tr></thead><tbody data-end="3954" data-start="3800"><tr data-end="3828" data-start="3800"><td data-col-size="sm" data-end="3811" data-start="3800">`idMesa`</td><td data-col-size="sm" data-end="3828" data-start="3811">ID da comanda</td></tr><tr data-end="3877" data-start="3829"><td data-col-size="sm" data-end="3847" data-start="3829">`codigoComanda`</td><td data-col-size="sm" data-end="3877" data-start="3847">Código exibido ao operador</td></tr><tr data-end="3919" data-start="3878"><td data-col-size="sm" data-end="3901" data-start="3878">`statusAlteradoPara`</td><td data-col-size="sm" data-end="3919" data-start="3901">Sempre `livre`</td></tr><tr data-end="3954" data-start="3920"><td data-col-size="sm" data-end="3933" data-start="3920">`mensagem`</td><td data-col-size="sm" data-end="3954" data-start="3933">Texto explicativo</td></tr></tbody></table>

</div></div>### Exemplo — 200 (todas liberadas)

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk--9"><div class="sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl/main:top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>```json
{
  "comandasConfirmadasParaFaturar": [
    {
      "idMesa": 4069,
      "codigoComanda": "21",
      "statusAlteradoPara": "livre",
      "mensagem": "Comanda liberada com sucesso."
    },
    {
      "idMesa": 4070,
      "codigoComanda": "22",
      "statusAlteradoPara": "livre",
      "mensagem": "Comanda liberada com sucesso."
    }
  ],
  "comandasBloqueadasParaConfirmar": []
}

```

---

## 🚫 `comandasBloqueadasParaConfirmar`

Lista das comandas que **não puderam** ser liberadas.

### Campos

<div class="TyagGW_tableContainer" id="bkmrk-campo-descri%C3%A7%C3%A3o-idme-1"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="5036" data-start="4608"><thead data-end="4629" data-start="4608"><tr data-end="4629" data-start="4608"><th data-col-size="sm" data-end="4616" data-start="4608">Campo</th><th data-col-size="md" data-end="4629" data-start="4616">Descrição</th></tr></thead><tbody data-end="5036" data-start="4640"><tr data-end="4685" data-start="4640"><td data-col-size="sm" data-end="4651" data-start="4640">`idMesa`</td><td data-col-size="md" data-end="4685" data-start="4651">ID da comanda (quando existir)</td></tr><tr data-end="4742" data-start="4686"><td data-col-size="sm" data-end="4704" data-start="4686">`codigoComanda`</td><td data-col-size="md" data-end="4742" data-start="4704">Código da comanda (quando existir)</td></tr><tr data-end="4803" data-start="4743"><td data-col-size="sm" data-end="4759" data-start="4743">`statusAtual`</td><td data-col-size="md" data-end="4803" data-start="4759">Status atual da comanda (quando existir)</td></tr><tr data-end="4849" data-start="4804"><td data-col-size="sm" data-end="4815" data-start="4804">`motivo`</td><td data-col-size="md" data-end="4849" data-start="4815">Código padronizado do bloqueio</td></tr><tr data-end="4887" data-start="4850"><td data-col-size="sm" data-end="4863" data-start="4850">`mensagem`</td><td data-col-size="md" data-end="4887" data-start="4863">Mensagem explicativa</td></tr><tr data-end="4969" data-start="4888"><td data-col-size="sm" data-end="4915" data-start="4888">`numeroPdvEmConferencia`</td><td data-col-size="md" data-end="4969" data-start="4915">Somente quando `motivo = EM_CONFERENCIA_OUTRO_PDV`</td></tr><tr data-end="5036" data-start="4970"><td data-col-size="sm" data-end="4987" data-start="4970">`pos_lancando`</td><td data-col-size="md" data-end="5036" data-start="4987">Somente quando `motivo = EM_LANCAMENTO_ITENS`</td></tr></tbody></table>

</div></div>### Exemplo — 200 (parcial)

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk--11"><div class="sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl/main:top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>```json
{
  "comandasConfirmadasParaFaturar": [
    {
      "idMesa": 4069,
      "codigoComanda": "21",
      "statusAlteradoPara": "livre",
      "mensagem": "Comanda liberada com sucesso."
    }
  ],
  "comandasBloqueadasParaConfirmar": [
    {
      "idMesa": 4070,
      "codigoComanda": "22",
      "statusAtual": "conferencia",
      "motivo": "EM_CONFERENCIA_OUTRO_PDV",
      "numeroPdvEmConferencia": "15",
      "mensagem": "Comanda está em conferência por outro PDV."
    },
    {
      "idMesa": 4073,
      "codigoComanda": "24",
      "statusAtual": "consumo",
      "motivo": "EM_LANCAMENTO_ITENS",
      "pos_lancando": [1, 2],
      "mensagem": "Comanda está em consumo tendo lançamento de itens."
    },
    {
      "codigoComanda": "1231",
      "motivo": "NAO_ENCONTRADA",
      "mensagem": "Comanda não encontrada."
    }
  ]
}

```

---

## Response – (200 Quando **nenhuma comanda** enviada pôde ser liberada/resetada.)

### Quando acontece?

Quando **nenhuma comanda** enviada pôde ser liberada/resetada.

### Comportamento esperado do PDV

- considerar que **nenhuma mesa foi liberada**;
- exibir os motivos ao operador;
- seguir procedimento operacional (ex.: tratativa gerencial/manual quando necessário).

### Exemplo — 200 (nenhuma liberada)

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk--13"><div class="sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl/main:top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>```json
{
  "comandasConfirmadasParaFaturar": [],
  "comandasBloqueadasParaConfirmar": [
    {
      "idMesa": 4070,
      "codigoComanda": "22",
      "statusAtual": "conferencia",
      "motivo": "EM_CONFERENCIA_OUTRO_PDV",
      "numeroPdvEmConferencia": "15",
      "mensagem": "Comanda está em conferência por outro PDV."
    },
    {
      "idMesa": 4073,
      "codigoComanda": "24",
      "statusAtual": "consumo",
      "motivo": "EM_LANCAMENTO_ITENS",
      "pos_lancando": [1, 2],
      "mensagem": "Comanda está em consumo tendo lançamento de itens."
    },
    {
      "idMesa": 4071,
      "codigoComanda": "23",
      "statusAtual": "livre",
      "motivo": "STATUS_LIVRE",
      "mensagem": "Comanda já está livre."
    },
    {
      "codigoComanda": "1231",
      "motivo": "NAO_ENCONTRADA",
      "mensagem": "Comanda não encontrada."
    }
  ]
}

```

---

## 🧾 Enum `motivo` (mínimo)

<div class="TyagGW_tableContainer" id="bkmrk-motivo-significado-n"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="7661" data-start="7192"><thead data-end="7216" data-start="7192"><tr data-end="7216" data-start="7192"><th data-col-size="sm" data-end="7201" data-start="7192">Motivo</th><th data-col-size="md" data-end="7216" data-start="7201">Significado</th></tr></thead><tbody data-end="7661" data-start="7227"><tr data-end="7268" data-start="7227"><td data-col-size="sm" data-end="7246" data-start="7227">`NAO_ENCONTRADA`</td><td data-col-size="md" data-end="7268" data-start="7246">Comanda não existe</td></tr><tr data-end="7311" data-start="7269"><td data-col-size="sm" data-end="7286" data-start="7269">`STATUS_LIVRE`</td><td data-col-size="md" data-end="7311" data-start="7286">Comanda já está livre</td></tr><tr data-end="7407" data-start="7312"><td data-col-size="sm" data-end="7340" data-start="7312">`NAO_ESTA_EM_CONFERENCIA`</td><td data-col-size="md" data-end="7407" data-start="7340">Comanda não está em conferência (não é do fluxo de faturamento)</td></tr><tr data-end="7482" data-start="7408"><td data-col-size="sm" data-end="7437" data-start="7408">`EM_CONFERENCIA_OUTRO_PDV`</td><td data-col-size="md" data-end="7482" data-start="7437">Comanda está em conferência por outro PDV</td></tr><tr data-end="7532" data-start="7483"><td data-col-size="sm" data-end="7504" data-start="7483">`EM_TRANSFERENCIA`</td><td data-col-size="md" data-end="7532" data-start="7504">Comanda em transferência</td></tr><tr data-end="7616" data-start="7533"><td data-col-size="sm" data-end="7557" data-start="7533">`EM_LANCAMENTO_ITENS`</td><td data-col-size="md" data-end="7616" data-start="7557">Comanda em consumo com lançamento de itens em andamento</td></tr><tr data-end="7661" data-start="7617"><td data-col-size="sm" data-end="7637" data-start="7617">`STATUS_INVALIDO`</td><td data-col-size="md" data-end="7661" data-start="7637">Status não permitido</td></tr></tbody></table>

</div></div>## ✅ Boas práticas para quem integra (PDV)

- Chame `confirmar-faturamento` **somente** para comandas que você recebeu em `comandasParaFaturar` no `iniciar-faturamento`.
- Sempre trate **retorno parcial**:
    
    
    - confirme/libere as que vierem em `comandasConfirmadasParaFaturar`
    - exiba e trate operacionalmente as bloqueadas
- Não tente “forçar” liberação de comanda em conferência de outro PDV via esta API (isso deve ser endpoint administrativo/gerencial).