# API para buscar comanda a ser faturada.

# 📌 API – Iniciar Faturamento de Comandas

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

---

## 🎯 Objetivo da API

Esta API permite que um **PDV** solicite ao **Servidor de Comandas** o início do faturamento de **uma ou mais comandas**, possibilitando que elas sejam pagas juntas em uma única venda.

O Servidor de Comandas:

- valida cada comanda solicitada;
- **trava** (coloca em `conferencia`) apenas as comandas que podem ser faturadas;
- retorna os **itens da comanda** para o PDV montar a venda;
- retorna também as comandas que **não puderam ser faturadas**, com o motivo.

⚠️ **Importante:**  
A API permite **sucesso parcial**.  
Se 3 comandas forem enviadas e apenas 2 puderem ser faturadas, **essas 2 serão liberadas para faturamento** e a outra será retornada como bloqueada.

---

## 🧠 Conceitos importantes (antes de integrar)

### Status da comanda

<div class="TyagGW_tableContainer" id="bkmrk-status-significado-c"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="1544" data-start="1276"><thead data-end="1300" data-start="1276"><tr data-end="1300" data-start="1276"><th data-col-size="sm" data-end="1285" data-start="1276">Status</th><th data-col-size="md" data-end="1300" data-start="1285">Significado</th></tr></thead><tbody data-end="1544" data-start="1323"><tr data-end="1373" data-start="1323"><td data-col-size="sm" data-end="1335" data-start="1323">`consumo`</td><td data-col-size="md" data-end="1373" data-start="1335">Comanda em uso, com itens lançados</td></tr><tr data-end="1436" data-start="1374"><td data-col-size="sm" data-end="1390" data-start="1374">`conferencia`</td><td data-col-size="md" data-end="1436" data-start="1390">Comanda travada para faturamento em um PDV</td></tr><tr data-end="1485" data-start="1437"><td data-col-size="sm" data-end="1447" data-start="1437">`livre`</td><td data-col-size="md" data-end="1485" data-start="1447">Comanda sem itens ou já finalizada</td></tr><tr data-end="1544" data-start="1486"><td data-col-size="sm" data-end="1504" data-start="1486">`transferencia`</td><td data-col-size="md" data-end="1544" data-start="1504">Comanda em processo de transferência</td></tr></tbody></table>

</div></div>### Regras gerais

- **Nunca existe faturamento parcial de itens**: ou a comanda entra inteira ou não entra.
- **Itens cancelados sempre são retornados**, mas **não entram no total**.
- O PDV **não recalcula valores**: deve confiar nos valores retornados pela API.

---

## 🔐 Autenticação

Segue o **padrão de autenticação do Servidor de Comandas** (definido pelo projeto).

> Caso a autenticação falhe, a API retornará erro HTTP (401/403).

---

## 📥 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="2312" data-start="2024"><thead data-end="2066" data-start="2024"><tr data-end="2066" data-start="2024"><th data-col-size="sm" data-end="2032" data-start="2024">Campo</th><th data-col-size="sm" data-end="2039" data-start="2032">Tipo</th><th data-col-size="sm" data-end="2053" data-start="2039">Obrigatório</th><th data-col-size="md" data-end="2066" data-start="2053">Descrição</th></tr></thead><tbody data-end="2312" data-start="2107"><tr data-end="2185" data-start="2107"><td data-col-size="sm" data-end="2123" data-start="2107">`numeroMesas`</td><td data-col-size="sm" data-end="2136" data-start="2123">`number[]`</td><td data-col-size="sm" data-end="2140" data-start="2136">✅</td><td data-col-size="md" data-end="2185" data-start="2140">IDs das comandas que o PDV deseja faturar</td></tr><tr data-end="2251" data-start="2186"><td data-col-size="sm" data-end="2200" data-start="2186">`numeroPdv`</td><td data-col-size="sm" data-end="2211" data-start="2200">`string`</td><td data-col-size="sm" data-end="2215" data-start="2211">✅</td><td data-col-size="md" data-end="2251" data-start="2215">Identificação do PDV solicitante</td></tr><tr data-end="2312" data-start="2252"><td data-col-size="sm" data-end="2268" data-start="2252">`operador_id`</td><td data-col-size="sm" data-end="2279" data-start="2268">`string`</td><td data-col-size="sm" data-end="2283" data-start="2279">✅</td><td data-col-size="md" data-end="2312" data-start="2283">Identificação do operador</td></tr></tbody></table>

</div></div>### Exemplo de requisição

<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>```
{
  "numeroMesas": [4069, 4070, 4075],
  "numeroPdv": "12",
  "operador_id": "1275"
}

```

---

## ⚙️ O que o servidor faz ao receber a requisição

Para **cada comanda enviada**, o servidor avalia:

<div class="TyagGW_tableContainer" id="bkmrk-situa%C3%A7%C3%A3o-da-comanda-"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="2987" data-start="2547"><thead data-end="2582" data-start="2547"><tr data-end="2582" data-start="2547"><th data-col-size="sm" data-end="2569" data-start="2547">Situação da comanda</th><th data-col-size="md" data-end="2582" data-start="2569">Resultado</th></tr></thead><tbody data-end="2987" data-start="2618"><tr data-end="2663" data-start="2618"><td data-col-size="sm" data-end="2631" data-start="2618">Não existe</td><td data-col-size="md" data-end="2663" data-start="2631">Bloqueada (`NAO_ENCONTRADA`)</td></tr><tr data-end="2721" data-start="2664"><td data-col-size="sm" data-end="2689" data-start="2664">Já está em conferência</td><td data-col-size="md" data-end="2721" data-start="2689">Bloqueada (`EM_CONFERENCIA`)</td></tr><tr data-end="2765" data-start="2722"><td data-col-size="sm" data-end="2735" data-start="2722">Está livre</td><td data-col-size="md" data-end="2765" data-start="2735">Bloqueada (`STATUS_LIVRE`)</td></tr><tr data-end="2846" data-start="2766"><td data-col-size="sm" data-end="2809" data-start="2766">Está em consumo e há PDVs lançando itens</td><td data-col-size="md" data-end="2846" data-start="2809">Bloqueada (`EM_LANCAMENTO_ITENS`)</td></tr><tr data-end="2905" data-start="2847"><td data-col-size="sm" data-end="2871" data-start="2847">Está em transferência</td><td data-col-size="md" data-end="2905" data-start="2871">Bloqueada (`EM_TRANSFERENCIA`)</td></tr><tr data-end="2987" data-start="2906"><td data-col-size="sm" data-end="2940" data-start="2906">Está em consumo (sem bloqueios)</td><td data-col-size="md" data-end="2987" data-start="2940">✅ Elegível → status muda para `conferencia`</td></tr></tbody></table>

</div></div>---

## Response – Sucesso (200)

### Estrutura do retorno

<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
{
  "comandasParaFaturar": [],
  "comandasBloqueadasParaFaturar": []
}

```

---

## ✅ `comandasParaFaturar`

Lista das comandas que **foram liberadas para faturamento**.

### 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="3594" data-start="3332"><thead data-end="3353" data-start="3332"><tr data-end="3353" data-start="3332"><th data-col-size="sm" data-end="3340" data-start="3332">Campo</th><th data-col-size="sm" data-end="3353" data-start="3340">Descrição</th></tr></thead><tbody data-end="3594" data-start="3374"><tr data-end="3402" data-start="3374"><td data-col-size="sm" data-end="3385" data-start="3374">`idMesa`</td><td data-col-size="sm" data-end="3402" data-start="3385">ID da comanda</td></tr><tr data-end="3451" data-start="3403"><td data-col-size="sm" data-end="3421" data-start="3403">`codigoComanda`</td><td data-col-size="sm" data-end="3451" data-start="3421">Código exibido ao operador</td></tr><tr data-end="3499" data-start="3452"><td data-col-size="sm" data-end="3475" data-start="3452">`statusAlteradoPara`</td><td data-col-size="sm" data-end="3499" data-start="3475">Sempre `conferencia`</td></tr><tr data-end="3554" data-start="3500"><td data-col-size="sm" data-end="3517" data-start="3500">`totalComanda`</td><td data-col-size="sm" data-end="3554" data-start="3517">Soma dos itens **não cancelados**</td></tr><tr data-end="3594" data-start="3555"><td data-col-size="sm" data-end="3565" data-start="3555">`itens`</td><td data-col-size="sm" data-end="3594" data-start="3565">Lista de itens da comanda</td></tr></tbody></table>

</div></div>### Regras do total

- `totalComanda` = soma de `preco_total` **somente dos itens com `cancelado = false`**

---

### Estrutura de um item

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk--10"><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
{
  "id": 34,
  "usuario_lancamento": "1275895",
  "produto_id": 9381649,
  "ean": "00000000100700",
  "descricao_resumida": "PROD TESTE 01",
  "quantidade": 1,
  "valorTotalAcrescimo": 10,
  "valorTotalDesconto": 0,
  "cancelado": false,
  "cancelado_por": null,
  "preco_unitario": 15,
  "preco_total": 25,
  "data_hora": "27/01/2026, 11:03:12"
}

```

### ⚠️ Itens cancelados

- `cancelado = true`
- **Não entram no total**
- Servem apenas para **auditoria/relatórios**
- `preco_total` é apenas informativo

---

## 🚫 `comandasBloqueadasParaFaturar`

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

### 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="4740" data-start="4360"><thead data-end="4381" data-start="4360"><tr data-end="4381" data-start="4360"><th data-col-size="sm" data-end="4368" data-start="4360">Campo</th><th data-col-size="md" data-end="4381" data-start="4368">Descrição</th></tr></thead><tbody data-end="4740" data-start="4402"><tr data-end="4447" data-start="4402"><td data-col-size="sm" data-end="4413" data-start="4402">`idMesa`</td><td data-col-size="md" data-end="4447" data-start="4413">ID da comanda (quando existir)</td></tr><tr data-end="4487" data-start="4448"><td data-col-size="sm" data-end="4466" data-start="4448">`codigoComanda`</td><td data-col-size="md" data-end="4487" data-start="4466">Código da comanda</td></tr><tr data-end="4531" data-start="4488"><td data-col-size="sm" data-end="4504" data-start="4488">`statusAtual`</td><td data-col-size="md" data-end="4531" data-start="4504">Status atual da comanda</td></tr><tr data-end="4565" data-start="4532"><td data-col-size="sm" data-end="4543" data-start="4532">`motivo`</td><td data-col-size="md" data-end="4565" data-start="4543">Código do bloqueio</td></tr><tr data-end="4600" data-start="4566"><td data-col-size="sm" data-end="4579" data-start="4566">`mensagem`</td><td data-col-size="md" data-end="4600" data-start="4579">Texto explicativo</td></tr><tr data-end="4680" data-start="4601"><td data-col-size="sm" data-end="4628" data-start="4601">`numeroPdvEmConferencia`</td><td data-col-size="md" data-end="4680" data-start="4628">PDV que está usando a comanda (quando aplicável)</td></tr><tr data-end="4740" data-start="4681"><td data-col-size="sm" data-end="4698" data-start="4681">`pos_lancando`</td><td data-col-size="md" data-end="4740" data-start="4698">PDVs lançando itens (quando aplicável)</td></tr></tbody></table>

</div></div>---

## 🧾 Enum `motivo`

<div class="TyagGW_tableContainer" id="bkmrk-motivo-significado-e"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="5168" data-start="4768"><thead data-end="4792" data-start="4768"><tr data-end="4792" data-start="4768"><th data-col-size="sm" data-end="4777" data-start="4768">Motivo</th><th data-col-size="sm" data-end="4792" data-start="4777">Significado</th></tr></thead><tbody data-end="5168" data-start="4816"><tr data-end="4869" data-start="4816"><td data-col-size="sm" data-end="4835" data-start="4816">`EM_CONFERENCIA`</td><td data-col-size="sm" data-end="4869" data-start="4835">Comanda já está sendo faturada</td></tr><tr data-end="4919" data-start="4870"><td data-col-size="sm" data-end="4887" data-start="4870">`STATUS_LIVRE`</td><td data-col-size="sm" data-end="4919" data-start="4887">Comanda está livre/sem itens</td></tr><tr data-end="4962" data-start="4920"><td data-col-size="sm" data-end="4939" data-start="4920">`NAO_ENCONTRADA`</td><td data-col-size="sm" data-end="4962" data-start="4939">Comanda inexistente</td></tr><tr data-end="5018" data-start="4963"><td data-col-size="sm" data-end="4987" data-start="4963">`EM_LANCAMENTO_ITENS`</td><td data-col-size="sm" data-end="5018" data-start="4987">Existem PDVs lançando itens</td></tr><tr data-end="5068" data-start="5019"><td data-col-size="sm" data-end="5040" data-start="5019">`EM_TRANSFERENCIA`</td><td data-col-size="sm" data-end="5068" data-start="5040">Comanda em transferência</td></tr><tr data-end="5113" data-start="5069"><td data-col-size="sm" data-end="5089" data-start="5069">`STATUS_INVALIDO`</td><td data-col-size="sm" data-end="5113" data-start="5089">Status não permitido</td></tr><tr data-end="5168" data-start="5114"><td data-col-size="sm" data-end="5128" data-start="5114">`SEM_ITENS`</td><td data-col-size="sm" data-end="5168" data-start="5128">Comanda sem itens (quando aplicável)</td></tr></tbody></table>

</div></div>## Response – Sucesso (200) <span class="text-big">contendo apenas comandas aptas a faturar.</span>

```json
{
 "comandasParaFaturar": [
   {
     "idMesa": 4069,
     "codigoComanda": "21",
     "statusAlteradoPara": "conferencia",
      "totalComanda": 31.50,  
     "itens": [
       {
         "id": 34,
         "usuario_lancamento": "1275895",
         "produto_id": 9381649,
         "ean": "00000000100700",
         "descricao_resumida": "PROD TESTE 01",
         "quantidade": 1,
         "valorTotalAcrescimo": 10, 
         "valorTotalDesconto": 0,    
         "cancelado": false,
         "cancelado_por": null,
         "preco_unitario": 15,     
         "preco_total": 25,       
         "data_hora": "27/01/2026, 11:03:12"
        
       },
       {
         "id": 35,
         "usuario_lancamento": "1275895",
         "produto_id": 9381647,
         "ean": "00000000100670",
         "descricao_resumida": "PROD TESTE 40",
         "quantidade": 1,
         "valorTotalAcrescimo": 0,
         "valorTotalDesconto": 0,
         "cancelado": false,
         "cancelado_por": null,
         "preco_unitario": 6.5,
         "preco_total": 6.5,    
         "data_hora": "27/01/2026, 11:03:12"
       },
       {
         "id": 36,
         "usuario_lancamento": "1275895",
         "produto_id": 8104916,
         "ean": "00000001267532",
         "descricao_resumida": "10 OVO",
         "quantidade": 1,
         "valorTotalAcrescimo": 0,
         "valorTotalDesconto": 0,
         "cancelado": true,
         "cancelado_por": "1275895",
         "preco_unitario": 50,
         "preco_total": 50,
         "data_hora": "27/01/2026, 11:07:01"         
       }
     ]
   }
 ],
 "comandasBloqueadasParaFaturar": []
}


```

## Response – Sucesso (200) <span class="text-big">contendo comandas aptas e não aptas a faturar</span><span class="text-big">.</span>

```json
{
 "comandasParaFaturar": [
   {
     "idMesa": 4069,
     "codigoComanda": "21",
     "statusAlteradoPara": "conferencia",
      "totalComanda": 31.50,       
     "itens": [
       {
         "id": 34,
         "usuario_lancamento": "1275895",
         "produto_id": 9381649,
         "ean": "00000000100700",
         "descricao_resumida": "PROD TESTE 01",
         "quantidade": 1,
         "valorTotalAcrescimo": 10,  
         "valorTotalDesconto": 0,    
         "cancelado": false,
         "cancelado_por": null,
         "preco_unitario": 15,     
         "preco_total": 25,         
         "data_hora": "27/01/2026, 11:03:12"
        
       },
       {
         "id": 35,
         "usuario_lancamento": "1275895",
         "produto_id": 9381647,
         "ean": "00000000100670",
         "descricao_resumida": "PROD TESTE 40",
         "quantidade": 1,
         "valorTotalAcrescimo": 0,
         "valorTotalDesconto": 0,
         "cancelado": false,
         "cancelado_por": null,
         "preco_unitario": 6.5,
         "preco_total": 6.5,   
         "data_hora": "27/01/2026, 11:03:12"
       },
       {
         "id": 36,
         "usuario_lancamento": "1275895",
         "produto_id": 8104916,
         "ean": "00000001267532",
         "descricao_resumida": "10 OVO",
         "quantidade": 1,
         "valorTotalAcrescimo": 0,
         "valorTotalDesconto": 0,
         "cancelado": true,
         "cancelado_por": "1275895",
         "preco_unitario": 50,
         "preco_total": 50,
         "data_hora": "27/01/2026, 11:07:01"         
       }
     ]
   }
 ],
 "comandasBloqueadasParaFaturar": [
   {
     "idMesa": 4070,
     "codigoComanda": "22",
     "statusAtual": "conferencia",
     "motivo": "EM_CONFERENCIA",
      "numeroPdvEmConferencia": "12",
     "mensagem": "Comanda já está em conferência."  
   },
   {
     "idMesa": 4071,
     "codigoComanda": "23",
     "statusAtual": "livre",
     "motivo": "STATUS_LIVRE",
     "mensagem": "Comanda está livre e sem itens a faturar."
   },
   {
     "codigoComanda": "23",
     "mensagem": "Comanda não encontrada"
	}
 ]
}


```

##   
  
 Response – 200 - Nenhuma comanda apta a faturar. 

### Quando acontece?

Quando **nenhuma comanda** enviada pode ser faturada.

### Comportamento esperado do PDV

- **Não montar a venda**
- Exibir os motivos ao operador
- Encerrar o fluxo

### Exemplo

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk--14"><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
{
"comandasParaFaturar": [],
"comandasBloqueadasParaFaturar": [
   {
     "idMesa": 4070,
     "codigoComanda": "22",
     "statusAtual": "conferencia",
     "motivo": "EM_CONFERENCIA",
      "numeroPdvEmConferencia": "12",
     "mensagem": "Comanda já está em conferência."  
   },
   {
     "idMesa": 4072,
     "codigoComanda": "23",
     "statusAtual": "livre",
     "motivo": "STATUS_LIVRE",
     "mensagem": "Comanda está livre e sem itens a faturar."
   },      
   {
     "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": "25",
     "statusAtual": "transferencia",
     "motivo": "EM_TRANSFERENCIA",
     "mensagem": "Comanda está em transferência de itens."
   },
      
    {
     "codigoComanda": "1231",
     "motivo": "NAO_ENCONTRADA",
     "mensagem": "Comanda não encontrada."
    }
 ]
}
```

---

## ✅ Boas práticas para quem integra (PDV)

- Sempre trate **sucesso parcial**
- Nunca recalcular valores
- Não tente faturar comandas bloqueadas
- Guarde localmente as comandas que entraram em `conferencia`
- Use essa lista depois para:
    
    
    - `confirmar-faturamento`
    - `cancelar-faturamento`