Cadastro de itens
O lojista monta o cardápio no portal: foto, preço, adicionais e o código do produto no PDV. Sem esse código o Integra não sabe qual produto lançar no Linx.
Cardápio do cliente
Trilha
Testar no celular
Aponte a câmera do celular para um QR. O app do restaurante abre em tela cheia e a loja anda sozinha: a fila chama, o delivery avança e os SMS chegam como notificação.
SMS enviados
Para testar
Mesas
Fila de espera Ao vivo com os celulares
A recepção vê quem está esperando, chama pela mesa livre e o cliente recebe SMS. Quem entra pelo QR da porta se cadastra sozinho; a recepção também pode incluir alguém pelo balcão.
Delivery
Pedidos feitos pelo link da loja, com endereço, taxa por bairro e pagamento online ou na entrega. Cada mudança de status manda SMS para o cliente.
Pedidos
Onde cada pedido está entre o cardápio e o PDV, o que o app local recebeu e o que foi gravado no Linx. A lista mostra os pedidos de mesa do modo selecionado no topo e os de delivery.
Como funciona
O cardápio tem dois modos de operação, configurados por loja. Os dois reaproveitam o caminho que MultiPedidos, OlaClick e Amana já usam: o pedido entra no lic-server como evento pendente, o app-client busca, grava no Linx e confirma. O pagamento online é feito pela Pagar.me.
Os dois modos
| Comanda | Pedido | |
|---|---|---|
| Ideia | O cliente pede quantas vezes quiser. Tudo soma na conta da mesa e ele paga no final. | O cliente paga cada pedido na hora de enviar. |
| Vai para a cozinha | Assim que é enviado. | Só depois que a Pagar.me confirma o pagamento (charge.paid). |
| No PDV | Um orçamento por mesa. Cada rodada acrescenta linhas. Pagamentos parciais entram em orcamento_pagamento. A taxa de serviço entra no fechamento. | Um orçamento por pedido, já com o pagamento "PIX - PAGO" ou "CARTAO - PAGO". É o mesmo caminho do delivery pago de hoje (payment_splits). |
| Conta da mesa | Sim. Cada pessoa vê os pedidos da mesa, quem pagou e quanto falta. | Não. Cada pessoa vê os próprios pedidos. |
| Dividir | Pagar tudo, só o que eu pedi, dividir em partes ou outro valor. | Não se aplica. |
| Taxa de serviço | Opcional, 10% (código PDV 9001). | Não. |
| Pagar no caixa | Sim. O operador lança no Linx e marca na mesa. | Não. Só pagamento online. |
| Mudança no app-client | Nova: acrescentar linhas num orçamento aberto e gravar pagamentos parciais. | Pequena: o integrador novo entrega um pedido já pago e o resto já existe. |
| Indicado para | Restaurante e bar com garçom. | Lanchonete, balcão e praça de alimentação. |
Onde cada peça mora
Cardápio público
Aberto pelo QR da mesa (/c/casa-brasa/m/{token}). Cardápio, carrinho, conta da mesa e pagamento. Sem login.
Portal, conta e fila
Itens, fotos, mesas e modo da loja. Guarda a conta da mesa, cria as cobranças na Pagar.me, recebe os webhooks e gera os IntegrationEvent.
Pagamento
PIX e cartão via API v5. O cartão é tokenizado no navegador: o número nunca passa pelo nosso servidor.
Avisos
Fila e delivery. O lic-server envia por uma interface própria (SmsSender) para trocar de provedor sem mexer no resto; o status volta por webhook.
Integrador novo
integrations/cardapio_777.py busca eventos de pedido, pagamento da mesa e fechamento, e dá ack ou fail.
Orçamento
orcamento, orcamento_produto e prevenda.orcamento_pagamento. O caixa emite a NFC-e.
Modo Comanda
sequenceDiagram
autonumber
participant C as Cliente (QR da mesa)
participant L as lic-server
participant G as Pagar.me
participant A as app-client
participant P as PDV Linx
C->>L: POST /c/{slug}/pedidos (mesa 12)
L->>L: soma na conta da mesa + evento order PENDING
A->>L: GET /integration/cardapio777/pending
A->>P: abre orçamento da mesa ou acrescenta linhas
A->>L: ack
Note over C,P: o cliente repete quantas vezes quiser
C->>L: GET /c/{slug}/mesas/12/conta
C->>L: POST /c/{slug}/mesas/12/pagamentos (valor, PIX ou card_token)
L->>G: POST /core/v5/orders
G-->>L: webhook charge.paid
L->>L: abate da conta + evento table_payment PENDING
A->>P: INSERT orcamento_pagamento
alt conta zerada
L->>L: evento table_closed (taxa de serviço)
A->>P: linha 9001 TAXA DE SERVICO
Note over P: caixa emite a NFC-e e libera a mesa
end
Modo Pedido
sequenceDiagram
autonumber
participant C as Cliente
participant L as lic-server
participant G as Pagar.me
participant A as app-client
participant P as PDV Linx
C->>L: POST /c/{slug}/pedidos (itens + PIX ou card_token)
L->>G: POST /core/v5/orders
G-->>C: QR do PIX (ou resultado do cartão)
G-->>L: webhook charge.paid
L->>L: só agora cria o evento order PENDING
A->>L: GET /integration/cardapio777/pending
A->>P: orçamento + itens + pagamento "PIX - PAGO"
A->>L: ack
Note over C,L: PIX expirado ou cartão recusado: o pedido nunca chega ao PDV
Fila de espera
Não passa pelo PDV. É estado do lic-server (fila por loja) com SMS nos momentos que importam para o cliente. Quando o grupo senta, a mesa fica ocupada no mapa e a comanda abre no primeiro pedido pelo QR da mesa.
stateDiagram-v2
direction LR
[*] --> Esperando: QR da porta ou recepção · SMS de entrada
Esperando --> Esperando: virou o 1º · SMS "você é o próximo"
Esperando --> Chamado: recepção escolhe mesa livre · SMS "mesa pronta"
Esperando --> Saiu: cliente sai ou recepção remove
Chamado --> Sentou: chegou na recepção · mesa ocupada
Chamado --> NaoVeio: passou de 10 min · SMS "vez expirou"
Sentou --> [*]
Saiu --> [*]
NaoVeio --> [*]
- Posição e espera estimada vêm da ordem de chegada e do giro médio de mesas do dia. Grupos grandes podem esperar mais, porque dependem de mesa grande ou de juntar mesas.
- A página do cliente é a fonte da verdade; o SMS só avisa e leva o link. Quem não quer SMS acompanha pela página.
- Prazo de chamada configurável (10 min no mockup). Depois disso a recepção marca "não veio" e a mesa volta a ficar livre.
Delivery
sequenceDiagram
autonumber
participant C as Cliente (link da loja)
participant L as lic-server
participant G as Pagar.me
participant S as Provedor SMS
participant A as app-client
participant P as PDV Linx
C->>L: POST /c/{slug}/delivery (itens, CEP, endereço, pagamento)
L->>L: valida área, taxa e pedido mínimo
opt pagamento online
L->>G: POST /core/v5/orders
G-->>L: webhook charge.paid
end
L->>S: SMS "pedido recebido"
L->>L: evento order (channel=delivery) PENDING
A->>L: GET /integration/cardapio777/pending
A->>P: orçamento de entrega com endereço, frete e pagamento
A->>L: ack
Note over L,S: loja muda o status no painel: em preparo, saiu, entregue · cada um vira SMS
- O PDV já sabe gravar delivery. O
pdv_integratorusadeliveryAddressedeliveryFeedo pedido, como no MultiPedidos. Pago online entra como "PIX - PAGO"; na entrega, como "DINHEIRO - A COBRAR" ou "CARTAO - A COBRAR", com o troco na observação. - O status da entrega é do painel, não do PDV: a loja avança o pedido no quadro e cada etapa gera um SMS. Cancelar gera estorno na Pagar.me (se pago) e um evento de cancelamento para o app-client.
- Área de entrega: CEP → endereço → distância ou polígono, com taxa e prazo por faixa. Fora da área, o cliente vê antes de montar o pedido inteiro.
SMS
- Textos sem acento e com até 160 caracteres. Um acento troca a codificação para UCS-2 e o limite cai para 70, o que dobra ou triplica o custo. O mockup mostra a contagem de cada mensagem.
- Só SMS transacional, com opt-in na própria tela e "Responda SAIR" na primeira mensagem (LGPD). O número fica só no pedido ou na fila e é mascarado no painel.
- Envio assíncrono: o lic-server grava o SMS como pendente e um worker envia. O webhook de status do provedor marca enviado, entregue ou falhou, e o painel mostra.
- Limites: no máximo um SMS por etapa e por pedido ou entrada na fila; reenvio só manual pela recepção. Custo por loja aparece no portal.
- WhatsApp fica para depois, pela mesma interface de envio.
Regras
- Código PDV é obrigatório para o item entrar no orçamento. Código inexistente cai no mesmo
ProductLookupErrorde hoje e o pedido fica na fila com erro até o lojista corrigir. - O cartão nunca passa pelo nosso servidor. O navegador gera um
card_tokencom a chave pública da loja; o lic-server só recebe o token. A chave secreta fica no lic-server, cifrada, uma por loja. - Webhook não é prova sozinho. O lic-server valida a autenticação do webhook e consulta a cobrança na API antes de dar baixa.
- Valores em centavos e calculados no servidor. O cliente escolhe quanto pagar, mas o servidor limita ao que falta na mesa. Um PIX pendente reserva o valor por 15 minutos para duas pessoas não pagarem a mesma parte.
- Idempotência em tudo: chave por carrinho no pedido, chave por cobrança na Pagar.me e o evento só sai da fila com ack.
- Pedido pago com erro no PDV (modo Pedido) já tem o dinheiro capturado. O painel destaca e o lojista corrige e reprocessa, ou estorna pela Pagar.me.
- Taxa de serviço é opcional e configurável. Vai como linha 9001 no fechamento da comanda.
- O QR tem token assinado por mesa. Ninguém pede para a mesa 12 trocando o número na URL.
Contratos novos
| Quem chama | Rota | Para quê |
|---|---|---|
| Portal | GET/POST/PATCH /cardapio/itens | Itens, categorias e adicionais. |
| Portal | POST /cardapio/itens/{id}/foto | Upload. O servidor redimensiona e salva em storage de objetos. |
| Portal | PATCH /cardapio/config | Modo (comanda/pedido), taxa de serviço, chaves Pagar.me da loja. |
| Portal | GET /cardapio/mesas · POST /cardapio/mesas/{n}/liberar | Mapa de mesas, pagamento no caixa e liberação. |
| Cliente | GET /c/{slug}/m/{token} | Cardápio e mesa a partir do QR. |
| Cliente | POST /c/{slug}/pedidos | Comanda: entra na conta e na fila. Pedido: cria a cobrança e devolve o PIX ou o resultado do cartão. |
| Cliente | GET /c/{slug}/mesas/{n}/conta | Conta da mesa (só no modo Comanda). |
| Cliente | POST /c/{slug}/mesas/{n}/pagamentos | Paga parte ou o total da comanda. |
| Cliente | POST /c/{slug}/fila · GET /c/{slug}/fila/{code} · DELETE /c/{slug}/fila/{code} | Entrar, acompanhar a posição e sair da fila. |
| Portal | GET /cardapio/fila · POST /cardapio/fila/{id}/chamar · /sentou · /nao-veio | Recepção opera a fila; cada ação pode gerar SMS. |
| Cliente | GET /c/{slug}/delivery/cep/{cep} · POST /c/{slug}/delivery | Área, taxa e prazo pelo CEP; criação do pedido de entrega. |
| Portal | PATCH /cardapio/delivery/pedidos/{id}/status | Em preparo, saiu, entregue ou cancelado. Gera SMS e, no cancelamento, estorno e evento. |
| Provedor SMS | POST /webhooks/sms | Status de entrega de cada mensagem e respostas "SAIR". |
| Pagar.me | POST /webhooks/pagarme | charge.paid, charge.payment_failed, charge.refunded. |
| app-client | GET /integration/cardapio777/pending | Eventos order, table_payment e table_closed. |
| app-client | POST /integration/cardapio777/ack/{id} · /fail/{id} | Confirma com o número do orçamento, ou devolve o motivo do erro. |
Fases
Os dois modos com Pagar.me
- Cadastro com foto e código PDV
- QR por mesa
- Comanda: conta da mesa, dividir, pagar no caixa
- Pedido: PIX e cartão antes da cozinha
- Fila com ack e fail no painel
Fila e delivery
- Fila de espera com SMS
- Delivery com área por CEP, pagamento online ou na entrega
- Status de entrega com SMS
- Estorno pelo painel
Menos digitação, mais canais
- Importar produtos do Linx (snapshot do
catalog_sync) - Pausar item quando o estoque zera
- WhatsApp e retirada no balcão com senha
- Rastreio do entregador, gorjeta e cupom
Decisões em aberto
A comanda depende disso. Se não aceitar, cada rodada vira um orçamento e o pagamento da mesa é rateado entre eles.
Por loja é mais simples: o dinheiro cai direto para o lojista. Marketplace com split permite à 777 cobrar por transação, mas exige recebedores e KYC.
No MVP, o caixa finaliza o orçamento pago no Linx. Emissão automática fica para depois.
Algumas casas querem comanda no salão e pedido no balcão. O contrato já leva o modo em cada pedido.
Precisa de rota transacional no Brasil, webhook de status e preço por volume. A interface de envio deixa a troca barata.
No começo, motoboy da loja com status manual no painel. Integração com plataforma de entregadores fica para depois.