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
| Campo | Tipo | Descrição |
|---|---|---|
| method | string | Forma de pagamento selecionada |
| amountReceived | number | Valor recebido (para dinheiro) |
| change | number | Troco calculado automaticamente |
Fluxo
Dinheiro
- Atendente seleciona Dinheiro
- Insere valor recebido
- Sistema calcula troco
- Confirma pagamento
PIX
- Atendente seleciona PIX
- Confirma
- Sistema cria pedido na API → retorna QR code
- Modal exibe QR code e payload "Copia e Cola"
- Cliente escaneia e paga
- Atendente clica "Pagamento Confirmado"
Cartão (sem maquininha Stone)
- Atendente seleciona Crédito/Débito
- Confirma
- Prossegue com a maquininha física manualmente
Cartão via Terminal Stone
Ativado quando activePdv.stoneTerminalSerial está configurado.
- Atendente seleciona Crédito/Débito
- Confirma — o modal entra no estado
processing - Sistema chama
POST /t/:slug/orders/:id/process-paymentcom{ gateway: "stone", stoneTerminalSerial } - API responde com
{ status: "processing", intentId: "..." }— o pagamento foi enviado à maquininha - Modal exibe spinner + serial do terminal + mensagem "Aguardando na maquininha..."
- Resolução assíncrona:
PdvTerminalViewescuta o evento WebSocketpaymentUpdateno namespace/kitchenpaymentStatus: "approved"→ modal fecha e pedido é concluídopaymentStatus: "declined"→ exibe mensagem de recusa com opção de tentar novamente
- Timeout de 60 s sem resposta → exibe alerta e permite nova tentativa