Rotina: Caixa e PDV
Abertura/fechamento de caixa, recebimentos, TEF (cartões), PIX, cupom fiscal e conciliação.
Módulos Delphi
| Arquivo | Papel |
|---|---|
source/jCaixa/UCaixa.pas | Form principal de recebimentos/pagamentos |
source/jCaixa/UdmCaixa.pas | DataModule — queries e lógica |
source/jCaixa/UformPIX.pas | Form de integração PIX |
source/JunsoftTEF/EsTEF.pas | DataModule de integração TEF (TdmTEF) |
source/JunsoftTEF/esTEFClasses.pas | Classes de domínio TEF |
source/JunsoftPix/UdmControle.pas | DataModule central PIX |
source/JunsoftPix/UPixUtils.pas | Utilitários PIX |
Tabelas do Banco de Dados
CAIXA — Turno de Caixa
DDL: docs/schema/tables/CAIXA.sql
| Campo | Tipo | Descrição |
|---|---|---|
| CD_EMPRESA | INTEGER | Empresa |
| CD_USUARIO | VARCHAR(5) | Operador (PK composta) |
| NR_CONTROLE | INTEGER | Número do turno (PK sequencial) |
| DT_ABERTURA | TIMESTAMP | Início do turno |
| DT_FECHAMENTO | TIMESTAMP | Fim do turno (NULL = caixa aberto) |
| VL_ABERTURA | NUMERIC(15,2) | Valor inicial informado |
| VL_FECHAMENTO | NUMERIC(15,2) | Valor final conferido |
| VL_MOVIMENTO | NUMERIC(15,2) | Total movimentado no turno |
| DT_REGISTRO | TIMESTAMP | Auditoria |
Regra:
DT_FECHAMENTO IS NULL= caixa ativo no momento.
MOVTOCAIXA — Lançamentos do Caixa
DDL: docs/schema/tables/MOVTOCAIXA.sql
Registra cada movimento: recebimento, pagamento, sangria, suprimento.
| Campo | Tipo | Descrição |
|---|---|---|
| NR_LANCCAIXA | INTEGER | Sequencial (PK) |
| TP_MOVTOCAIXA | CHAR(1) | 'R'=Recebimento, 'P'=Pagamento |
| DT_LANCAMENTO | DATE | Data do movimento |
| VL_DOCUMENTO | NUMERIC(15,2) | Valor movimentado |
| ST_ESTORNO | CHAR(1) | 'N'=Normal, 'S'=Estornado |
| ST_TRANSFERENCIA | CHAR(1) | 'S'=Transferência interna, 'N'=Externa |
| NR_CONTROLE | INTEGER | Turno de caixa (FK → CAIXA) |
| NR_PROCESSO | INTEGER | Lote de baixa (FK → PROCESSO) |
| CD_EMPRCONTAS + NR_LANCAMENTO + ... | FK | Título liquidado (FK → CONTAS) |
| CD_FORMAPAGTO | VARCHAR(2) | Forma de pagamento |
| VL_TROCO | NUMERIC(15,2) | Troco devolvido |
| CD_BANCO, CD_AGENCIA, NR_CONTACOR | — | Dados bancários |
| CD_USUARIOESTORNO | VARCHAR(5) | Quem estornou |
| DS_MOTIVOESTORNO | VARCHAR(240) | Motivo do estorno |
| DT_ESTORNO | DATE | Data do estorno |
FORMAPAGTO — Meios de Pagamento
DDL: docs/schema/tables/FORMAPAGTO.sql
| Campo | Tipo | Descrição |
|---|---|---|
| CD_FORMAPAGTO | VARCHAR(2) | Código (PK) |
| DS_FORMAPAGTO | VARCHAR(60) | Descrição |
| TP_PAGTCUPOM | VARCHAR(2) | Código fiscal SEFAZ: '01'=Dinheiro, '02'=Cheque, '03'=Cartão, '15'=PIX |
| ST_BLOQUEIO | CHAR(1) | 'S' = forma bloqueada |
| CD_CONTAPADRAO | INTEGER | Conta contábil padrão |
CUPOMFISCAL — Cupons ECF/SAT/NFC-e
DDL: docs/schema/tables/CUPOMFISCAL.sql
| Campo | Tipo | Descrição |
|---|---|---|
| NR_SERIE | VARCHAR(25) | Série do equipamento |
| NR_EQUIPAMENTO | VARCHAR(4) | ID do terminal ECF/SAT |
| CD_MODELO | VARCHAR(4) | 'ECF', 'SAT', 'NFCE' |
| DT_EMISSAO | DATE | Data de emissão |
| NR_REDUCAO | INTEGER | Número de redução Z |
| NR_OPERACAO | INTEGER | Sequência da operação |
| VL_VENDABRUTA | NUMERIC(15,2) | Valor bruto da venda |
| VL_TOTALGERAL | NUMERIC(15,2) | Total geral do cupom |
| VL_TRIBUTACAO | NUMERIC(15,2) | Total tributado |
TEF — Transações de Cartão
DDL: docs/schema/tables/TEF.sql
| Campo | Tipo | Descrição |
|---|---|---|
| ID | INTEGER | PK |
| NRNSU | VARCHAR(150) | NSU da transação |
| NMREDE | VARCHAR(32) | Rede (Visa, Mastercard, Elo, Hipercard...) |
| TPTRANSACAO | INTEGER | 1=Débito, 2=Crédito à vista, 3=Crédito parcelado |
| NRPARCELAS | INTEGER | Número de parcelas |
| CDAUTTRANSACAO | VARCHAR(150) | Código de autorização |
| VL_TRANSACAO | NUMERIC(15,2) | Valor |
| DHTRANSACAO | TIMESTAMP | Data/hora |
| CD_EMPRESA, NR_LANCTOCAIXA | FK | Lançamento de caixa vinculado |
PIX — Transações PIX
DDL: docs/schema/tables/PIX.sql
| Campo | Tipo | Descrição |
|---|---|---|
| CD_PIX | INTEGER | PK |
| CD_EMPRESA, NR_LANCCAIXA | FK | Lançamento de caixa |
| TP_INTEGRADORA | SMALLINT | Tipo de PSP/banco |
| ST_PIX | SMALLINT | 1=Pendente, 2=Confirmado, 3=Cancelado |
| VL_TOTAL | NUMERIC(15,2) | Valor |
| DT_PIX | TIMESTAMP | Data/hora |
| NM_CARTEIRA | VARCHAR(150) | Nome do PSP (BB, Itaú, C6Bank...) |
| ORDERQRCODE | VARCHAR(5000) | QR Code dinâmico (Base64) |
| ORDERENDTOENDID | VARCHAR(150) | ID End-to-End (rastreio Bacen) |
| ORDERID, ORDERREF | VARCHAR | Identificadores internos da integradora |
| CD_USUARIOESTORNO | VARCHAR(5) | Quem solicitou estorno |
| DS_MOTIVOESTORNO | VARCHAR(240) | Motivo |
| DT_ESTORNO | TIMESTAMP | Data do estorno |
⚠️ Problema conhecido:
Sleep(5000)no loop de estorno PIX pode travar a UI por até 200s em caso de falha de rede.
Integração TEF (JunsoftTEF)
Arquivo: source/JunsoftTEF/EsTEF.pas
Configuração (lida de JunsoftTEF.ini):
conf_TipoGP // Tipo de Gateway de Pagamento
conf_CodigoLoja // Código da loja
conf_NumeroTerminal // Número do terminal
conf_GPExeName // Caminho do programa do GP
conf_EnderecoIP // IP do servidor TEF
conf_EnderecoPorta // Porta
conf_CNPJ // CNPJ da empresa
conf_PINPAD // Modelo do pinpad
conf_IntervaloAposComando // ms de espera
Tipos de GP (Gateway de Pagamento) suportados:
| Tipo | Integrador |
|---|---|
| SiTef | ABECS — múltiplas adquirentes |
| Cappta | Cielo direta |
| EstabilPDV | Multi-rede |
Fluxo TEF:
1. Inicia pagamento: ACBrTEFD1 ou ACBrTEFAPI1
2. Envia valor + tipo ao terminal
3. Aguarda resposta do pinpad (cliente digita senha)
4. Retorna: NSU, NMREDE, CDAUTTRANSACAO, NRPARCELAS
5. INSERT TEF (vínculo com MOVTOCAIXA)
6. Se cancelamento pendente: tmrCapptaTimer (polling)
Integração PIX (JunsoftPix)
Integradoras suportadas (em source/JunsoftPix/Integradoras/):
| Arquivo | PSP |
|---|---|
UPSP_13Shipay.pas | Shipay |
UPSP_13Matera.pas | Matera |
UPSP_14Cielo.pas | Cielo |
UPSP_BB.pas | Banco do Brasil |
UPSP_15Banrisul.pas | Banrisul |
UPSP_16C6Bank.pas | C6Bank |
UPSP_Ailos.pas | Ailos |
Cada integradora implementa:
- Geração de QR Code dinâmico (POST /cobv)
- Recebimento de callback (webhook de confirmação)
- Consulta de status (GET /cobv/{txid})
- Devolução/cancelamento (PUT /cobv)
Parâmetros (PARMFINANC)
DDL: docs/schema/tables/PARMFINANC.sql
| Parâmetro | Tipo | Efeito |
|---|---|---|
TP_ABERTURA | CHAR(1) | 'A'=Automática (sem digitar valor), 'M'=Manual, 'N'=Não usa caixa |
ST_ABRECAIXA | S/N | Habilita módulo de caixa |
ST_DIASCAIXA | S/N | 'S' = fechamento de caixa respeita dias úteis |
ST_VISUALIZARECIBO | S/N | Mostra recibo ao finalizar baixa |
CD_LAYCAIXA | VARCHAR(6) | Layout de impressão de recibos |
ST_MOVTOCAIXA | S/N | Gera MOVTOCAIXA automaticamente ao baixar título |
ST_ESTORNO | S/N | Permite estornar lançamentos de caixa |
Estados do PIX
ST_PIX = 1 (Pendente)
→ QR Code gerado, aguardando pagamento do cliente
→ Sistema faz polling na integradora a cada N segundos
│
├── Cliente paga → Webhook/polling confirma
│ ST_PIX = 2 (Confirmado)
│ INSERT MOVTOCAIXA (efetiva o recebimento)
│ CONTAS.ST_CONTAS atualizado
│
└── Timeout ou cancelamento
ST_PIX = 3 (Cancelado)
Caixa reabre para outra forma de pagamento
Fluxo Completo — Abertura e Recebimento
┌──────────────────────────────────────────────────────┐
│ 1. ABERTURA DE CAIXA │
│ UCaixa.btnAbrirClick │
│ INSERT CAIXA (DT_ABERTURA=NOW, DT_FECHAMENTO=NULL) │
│ Se TP_ABERTURA='M': usuário informa VL_ABERTURA │
│ INSERT MOVTOCAIXA (suprimento inicial) │
└─────────────────────────┬────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────┐
│ 2. RECEBIMENTO (UCaixa) │
│ Seleciona CD_PESSOA (cliente) e títulos │
│ Calcula juros: CALCULA_JUROMORA (se atrasado) │
│ │
│ Se CD_FORMAPAGTO = PIX: │
│ UformPIX.ShowModal │
│ Gera QR Code dinâmico (integradora) │
│ Poll até ST_PIX=2 (confirmado) │
│ INSERT PIX │
│ │
│ Se CD_FORMAPAGTO = CARTÃO: │
│ JunsoftTEF.IniciarPagamento(VL) │
│ Aguarda NSU + código autorização │
│ INSERT TEF │
│ │
│ Se CD_FORMAPAGTO = DINHEIRO: │
│ Calcula troco (VL_RECEBIDO - VL_TOTAL) │
│ VL_TROCO := troco │
│ │
│ INSERT MOVTOCAIXA │
│ Atualiza CONTAS.VL_SALDO / ST_CONTAS │
│ Se VL_SALDO=0: ST_CONTAS='L', DT_LIQUIDACAO=hoje │
└─────────────────────────┬────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────┐
│ 3. SANGRIA / SUPRIMENTO │
│ Sangria: INSERT MOVTOCAIXA (VL negativo) │
│ Suprimento: INSERT MOVTOCAIXA (VL positivo) │
│ Controle por limites configuráveis │
└─────────────────────────┬────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────┐
│ 4. FECHAMENTO DE CAIXA │
│ SUM(MOVTOCAIXA.VL_DOCUMENTO WHERE NR_CONTROLE=X) │
│ Usuário confere valores físicos │
│ CAIXA.DT_FECHAMENTO := NOW │
│ CAIXA.VL_FECHAMENTO := valor conferido │
│ Diferença registrada em MOVTOCAIXA se necessário │
└──────────────────────────────────────────────────────┘
Relatórios e Views
| Procedure/View | Uso |
|---|---|
EXTRATO_CAIXA | Extrato de movimentação de conta em período |
VIEW_FLUXOCAIXA | Projeção de entradas e saídas futuras |
VIEW_DIARIOCAIXA | Resumo diário por tipo de movimento |
VIEW_DEMONSTRATIVOCAIXA | Analítico de caixa |
Influências em Outros Módulos
→ Contas a Receber
- Recebimento no caixa baixa título via MOVTOCAIXA → atualiza CONTAS.VL_SALDO
- Encargos calculados: CALCULA_JUROMORA → MOVTOPROCESSO.VL_JURO
→ Contas a Pagar
- Pagamentos a fornecedores: MOVTOCAIXA (TP='P')
→ Emissão NF-e
- PDV emite NFC-e (modelo 65) ou SAT-CFe vinculado ao cupom
- CUPOMFISCAL registra cada cupom emitido
→ jCaixa
- Toda a lógica de recebimento é encapsulada em jCaixa (UCaixa, UdmCaixa, UformPIX)