Pular para o conteúdo principal

Fluxo Completo de PDV

Este guia descreve a integração de ponta a ponta de um PDV real com o EloFiel, cobrindo desde a chegada do cliente até a confirmação do resgate.

Modelos de resgate disponíveis

O EloFiel suporta três modelos para aplicar cashback como desconto. Consulte GET /api/v1/configuracao na inicialização do PDV para descobrir quais estão habilitados.

Modelo 1 — Resgate SeparadoModelo 2 — Checkout IntegradoModelo 3 — Desconto Imediato
Chamadas3 (/saldo + /resgate + /venda)1 (/venda com usarCashbackDisponivel: true)2 (/venda/preview + /venda com usarCashbackGerado: true)
Saldo utilizadoAcumulado em compras anterioresAcumulado em compras anterioresCashback que esta venda geraria
Quando usarpermiteCheckoutCashbackNaVenda: falsepermiteCheckoutCashbackNaVenda: truepermiteDescontoSobreGerado: true
Controle do descontoPDV define o valor do resgateAPI aplica FIFO automáticoAPI calcula cashback gerado e aplica como desconto
AtomicidadeResgate e venda são chamadas separadasTudo numa única transaçãoPreview + venda (preview é read-only)
Funciona na 1ª compra?Não (sem saldo acumulado)Não (sem saldo acumulado)Sim — desconta o cashback que seria gerado

Modelo 1 — Resgate Separado

O cliente usa o saldo acumulado em compras anteriores como desconto. O PDV debita o saldo antes de registrar a venda.

CLIENTE                  OPERADOR PDV             API ELOFIEL
| | |
| [Inicialização do PDV] |
| |-- GET /configuracao --->|
| |<-- tipo campanha -------|
| | |
|-- Informa CPF ---------->| |
| |-- GET /resgate/saldo -->|
| |<-- saldo disponível ----|
|<-- Operador exibe saldo--| |
| | |
|-- Decide usar saldo? --->| |
| (sim / não) | |
| | |
|-- Itens finalizados ---->| |
| | |
| [Se vai usar saldo] | |
| |-- POST /resgate ------->|
| |<-- resgate confirmado --|
| | |
|<-- Desconto aplicado ----| |
| | |
|-- Pagamento confirmado ->| |
| |-- POST /venda --------->|
| |<-- cashback creditado --|
|<-- Comprovante + saldo --| |

Modelo 2 — Checkout Integrado

O saldo disponível é aplicado como desconto na mesma chamada de registro da venda. Menos chamadas, menos pontos de falha.

CLIENTE                  OPERADOR PDV             API ELOFIEL
| | |
| [Inicialização do PDV] |
| |-- GET /configuracao --->|
| |<-- permiteCheckout: true|
| | |
|-- Informa CPF ---------->| |
| |-- GET /resgate/saldo -->|
| |<-- saldo disponível ----|
|<-- "Usar R$ X desconto?"-| |
| | |
|-- Decide (sim / não) --->| |
|-- Itens finalizados ---->| |
|-- Pagamento confirmado ->| |
| |-- POST /venda --------->|
| | usarCashbackDisponivel: true
| |<-- cashbackUsado: X ----|
| |<-- valorFinal: Y -------|
| |<-- cashbackCreditado: Z-|
|<-- Comprovante + saldo --| |

Modelo 3 — Desconto Imediato sobre Cashback Gerado

O PDV oferece ao cliente um desconto igual ao cashback que esta venda geraria — sem consumir saldo acumulado. Ideal para a primeira compra.

CLIENTE                  OPERADOR PDV             API ELOFIEL
| | |
| [Inicialização do PDV] |
| |-- GET /configuracao --->|
| |<-- permiteDescontoSobreGerado: true
| | |
|-- Informa CPF ---------->| |
|-- Itens finalizados ---->| |
| | |
| [PDV simula desconto] | |
| |-- POST /venda/preview ->|
| |<-- cashbackGeradoPrevisto: 10.00
| | valorComDesconto: 90.00
| | |
|<-- "Desconto de R$ 10?" -| |
| | |
|-- Decide (sim / não) --->| |
|-- Pagamento confirmado ->| |
| |-- POST /venda --------->|
| | usarCashbackGerado: true
| |<-- descontoGerado: 10.00|
| |<-- valorFinal: 90.00 ---|
| |<-- cashbackCreditado: 0 |
|<-- Comprovante ----------| |
Passo 0 — inicialização

Antes do primeiro atendimento, chame GET /api/v1/configuracao para saber o tipo de campanha ativa e quais modelos de resgate estão habilitados. Veja o guia Configuração do PDV.

Código completo de exemplo

const BASE_URL = 'https://api.elofiel.com.br';
const API_KEY = process.env.ELOFIEL_API_KEY;
const CNPJ_LOJA = '12.345.678/0001-90';

async function eloFielRequest(method, path, body = null) {
const options = {
method,
headers: { 'Content-Type': 'application/json', 'X-Api-Key': API_KEY },
};
if (body) options.body = JSON.stringify(body);
const response = await fetch(`${BASE_URL}${path}`, options);
const resultado = await response.json();
if (!resultado.sucesso) {
throw new Error(resultado.erros?.[0] ?? resultado.mensagem ?? 'Erro desconhecido');
}
return resultado.dados;
}

/**
* Fluxo Modelo 3 — desconto sobre o cashback que esta venda geraria.
* Usar quando permiteDescontoSobreGerado === true.
*/
async function fluxoDescontoImediato(cpfCliente, valorVenda, numeroCupom) {
// 1. Simular desconto antes de exibir ao cliente
let preview;
try {
preview = await eloFielRequest('POST', '/api/v1/venda/preview', {
cnpjLoja: CNPJ_LOJA,
cpfCliente,
valorVenda,
});
} catch {
preview = { permiteAplicarDesconto: false };
}

let clienteQuerDesconto = false;

if (preview.permiteAplicarDesconto) {
// Exibir diálogo: "Desconto de R$ X — Total: R$ Y. Confirmar?"
console.log(`Desconto disponível: R$ ${preview.cashbackGeradoPrevisto}`);
console.log(`Total com desconto: R$ ${preview.valorComDesconto}`);
clienteQuerDesconto = true; // [PDV aguarda confirmação do cliente]
} else {
console.log(`Desconto indisponível: ${preview.motivoBloqueio ?? 'campanha não permite'}`);
}

// 2. Registrar a venda
const venda = await eloFielRequest('POST', '/api/v1/venda', {
cnpjLoja: CNPJ_LOJA,
cpfCliente,
valorVenda,
documentoExterno: numeroCupom,
usarCashbackGerado: clienteQuerDesconto,
});

if (clienteQuerDesconto) {
console.log(`Desconto aplicado: R$ ${venda.descontoGerado}`);
}
console.log(`Total pago: R$ ${venda.valorFinal}`);
console.log(`Cashback creditado: R$ ${venda.cashbackCreditado}`);

return venda;
}

const resultado = await fluxoDescontoImediato('123.456.789-09', 100.00, `PDV-${Date.now()}`);

Pontos de atenção

Modelo 1: o resgate ocorre ANTES da venda

O resgate (debitar o saldo do cliente) ocorre antes de registrar a nova venda. O cliente usa saldo de compras anteriores como desconto.

Modelo 2: atomicidade garantida pela API

No checkout integrado, a API consome os lotes de cashback e registra a venda numa única transação. Não há risco de débito sem crédito.

Modelo 3: preview é read-only, venda é atômica

POST /api/v1/venda/preview não grava nada — é apenas uma simulação. A operação real ocorre na POST /api/v1/venda. Se o cliente recusar o desconto após o preview, basta enviar a venda normalmente sem usarCashbackGerado: true.

Exclusividade mútua

Modelos 2 e 3 não podem ser combinados na mesma venda. Se usarCashbackDisponivel: true e usarCashbackGerado: true forem enviados simultaneamente, a API retorna 422.

Tolerância a falhas

A integração com o EloFiel não deve bloquear o caixa. Implemente:

  1. Timeout curto (5-10s) nas chamadas de saldo/resgate
  2. Fila de reprocessamento para vendas não registradas por falha de rede
  3. Log local de todas as operações para auditoria

Idempotência com documentoExterno

Use o mesmo documentoExterno (número do cupom fiscal) se precisar retransmitir uma venda. A API pode identificar duplicatas e evitar duplo crédito.