Skip to content

Modal de Pagamento

Visão Geral

Modal para processamento de pagamento do pedido na filial.

Localização

frontend-react/src/views/pdv/PaymentModal.tsx

Funcionalidades

Informações do Pedido

  • Lista de itens
  • Total
  • Desconto (se aplicado)

Formas de Pagamento

  • Dinheiro (com cálculo de troco)
  • Cartão de crédito
  • Cartão de débito
  • PIX (QR Code gerado automaticamente)
  • Voucher
  • Misto

Cálculo

  • Valor recebido
  • Troco calculado

PIX QR Code

Quando o método PIX é selecionado e o pedido é confirmado, o modal exibe automaticamente a tela de QR code PIX:

  • Imagem do QR code (Base64 PNG)
  • Campo "PIX Copia e Cola" com botão de copiar
  • Botão "Pagamento Confirmado" para fechar após confirmação

Pré-requisito

O tenant precisa ter pixKey e pixMerchantName configurados em Configurações → PIX.

Props do componente

typescript
interface PaymentModalProps {
  total: number;
  onConfirm: (method: PaymentMethod, amountReceived?: number) => void;
  onCancel: () => void;
  pixData?: { payload: string; qrCodeBase64: string } | null;
  onPixClose?: () => void;
  terminalSerial?: string; // Serial da maquininha Stone — quando presente, habilita fluxo Stone para cartão
}

O pixData é populado pelo PdvTerminalView quando a API de criação de pedido retorna pixPayload e pixQrCodeBase64.

O terminalSerial é lido de activePdv.stoneTerminalSerial; quando presente, o fluxo de cartão usa o gateway Stone.

Campos

CampoTipoDescrição
methodstringForma de pagamento selecionada
amountReceivednumberValor recebido (para dinheiro)
changenumberTroco calculado automaticamente

Fluxo

Dinheiro

  1. Atendente seleciona Dinheiro
  2. Insere valor recebido
  3. Sistema calcula troco
  4. Confirma pagamento

PIX

  1. Atendente seleciona PIX
  2. Confirma
  3. Sistema cria pedido na API → retorna QR code
  4. Modal exibe QR code e payload "Copia e Cola"
  5. Cliente escaneia e paga
  6. Atendente clica "Pagamento Confirmado"

Cartão (sem maquininha Stone)

  1. Atendente seleciona Crédito/Débito
  2. Confirma
  3. Prossegue com a maquininha física manualmente

Cartão via Terminal Stone

Ativado quando activePdv.stoneTerminalSerial está configurado.

  1. Atendente seleciona Crédito/Débito
  2. Confirma — o modal entra no estado processing
  3. Sistema chama POST /t/:slug/orders/:id/process-payment com { gateway: "stone", stoneTerminalSerial }
  4. API responde com { status: "processing", intentId: "..." } — o pagamento foi enviado à maquininha
  5. Modal exibe spinner + serial do terminal + mensagem "Aguardando na maquininha..."
  6. Resolução assíncrona: PdvTerminalView escuta o evento WebSocket paymentUpdate no namespace /kitchen
    • paymentStatus: "approved" → modal fecha e pedido é concluído
    • paymentStatus: "declined" → exibe mensagem de recusa com opção de tentar novamente
  7. Timeout de 60 s sem resposta → exibe alerta e permite nova tentativa

Relacionados

Lançado sob a licença MIT.