Skip to content

Commit 94403c7

Browse files
PhyBrunoclaude
andcommitted
docs: o que o GetSessao real diz (e nao diz) sobre TEF e PIX por forma
Verificacao ao vivo contra o ERP de demonstracao (tenant PZ6LP43176, empresa 1): 654 KB, 87 condicoes, 1305 linhas de forma, 13 combinacoes distintas de campos. Resposta a duvida levantada: PIX da para saber com precisao (`FormaMeioPagtoNFe = '17'` + `UtilizaCentriumPAG`); TEF so no nivel da **empresa** (`TEFAtivo`), nunca da forma — `FormaIntegracaoCartao` e `FormaTipoTransacaoTEF` estao vazios em 100% das linhas, e o `" "` que aparece em `FormaIntegracaoCartao` e padding, nao sinal (aparece em dinheiro, crediario e PIX, e **nao** aparece nas formas de cartao). Registra tambem o bloqueio anterior: `FormaMeioPagtoNFe` real chega como codigo numerico da NFe ('01','03','04','17'...) e nao como os nomes de AD-023, entao `filtrarFormasValidas` descarta as 15 formas de cada condicao e o catalogo fica vazio contra o ERP real. O erp-mock reproduz os nomes, por isso a suite passa verde com o caminho real quebrado. Colaterais no mesmo payload: teclas de venda rapida reais sao F4/F2/F8 (fora da faixa F6-F9 de FR-003); `FormaFpgUtiCar` vazio quebra a identificacao do vale devolucao (AD-149); GetSessao sem o header `Empresa` responde 200 com corpo zerado e `messages`, nao erro. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JWvwSu239eaDnBwy5ss9zx
1 parent 6c9ca45 commit 94403c7

1 file changed

Lines changed: 217 additions & 0 deletions

File tree

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
# Catálogo de pagamento no `GetSessao` real — o que dá (e o que não dá) para saber
2+
3+
**Verificado ao vivo em 2026-09-05** contra o ERP de demonstração, tenant
4+
`PZ6LP43176`, empresa `1`, via `GET /ApiCentriumOAuth/GetSessao?Login=admin`
5+
com header `Empresa: 1`. Payload de **654 KB**, 87 condições, **1305 linhas de
6+
forma de pagamento**.
7+
8+
Este documento existe para responder uma pergunta específica que a feature 013
9+
levantou e que vale para toda a 008/009/010:
10+
11+
> Pelo que o `GetSessao` devolve na parte de pagamentos, dá para saber se uma
12+
> forma/condição espera **TEF**, **PIX** ou **nenhuma integração**?
13+
14+
**Resposta curta:** para **PIX, sim, com precisão**. Para **TEF, só no nível da
15+
empresa** — não há, neste cadastro, nenhuma marca por forma. E há um bloqueio
16+
anterior a essa pergunta: o campo que carrega a resposta chega num formato que
17+
o Checkout hoje não reconhece.
18+
19+
---
20+
21+
## 1. Os campos disponíveis, e o que cada um vale na prática
22+
23+
Cada item de `CondicoesDePagamento[].CondicaoFormasDePagamento[]` traz sete
24+
campos. Cruzando **todas** as 1305 linhas do tenant real, só existem 13
25+
combinações distintas:
26+
27+
| `FormaMeioPagtoNFe` | `FormaIntegracaoCartao` | `FormaTipoTransacaoTEF` | `FormaFpgUtiCar` | `FormaEntrada` | Ocorrências | Exemplo |
28+
|---|---|---|---|---|---|---|
29+
| `01` | `" "` | `""` | `""` | `S` | 174 | `21 - DINHEIRO` |
30+
| `01` | `""` | `""` | `""` | `N` | 87 | `29 - CARTAO` |
31+
| `02` | `""` | `""` | `""` | `S` | 87 | `23 - CHEQUE` |
32+
| `03` | `""` | `""` | `""` | `S` | 87 | `31 - CARTAO CRED` |
33+
| `04` | `""` | `""` | `""` | `S` | 87 | `30 - CARTAO DEB` |
34+
| `05` | `" "` | `""` | `""` | `N` | 87 | `28 - CREDIARIO` |
35+
| `05` | `" "` | `""` | `""` | `S` | 87 | `33 - VALE DEVOLUÇÃO` |
36+
| `05` | `""` | `""` | `""` | `N` | 87 | `99 - ESCRITURAL` |
37+
| `14` | `""` | `""` | `""` | `N` | 87 | `32 - A PRAZO` |
38+
| `17` | `" "` | `""` | `""` | `S` | 87 | `36 - PIX` |
39+
| `90` | `""` | `""` | `""` | `N` | 87 | `27 - SEM PAGAMENTO` |
40+
| `99` | `""` | `""` | `""` | `N` | 87 | `25 - OUTROS` |
41+
| `99` | `""` | `""` | `""` | `S` | 174 | `24 - RECIBO` |
42+
43+
O que essa tabela diz, campo a campo:
44+
45+
### `FormaMeioPagtoNFe`**o único discriminador com sinal**
46+
47+
Chega como o **código numérico da tabela da NFe**, não como nome:
48+
49+
| Código | Significado (tabela NFe) | Integração esperada |
50+
|---|---|---|
51+
| `01` | Dinheiro | nenhuma |
52+
| `02` | Cheque | nenhuma |
53+
| `03` | Cartão de Crédito | **TEF**, se a empresa tiver TEF |
54+
| `04` | Cartão de Débito | **TEF**, se a empresa tiver TEF |
55+
| `05` | Crédito Loja | nenhuma |
56+
| `14` | Duplicata Mercantil | nenhuma |
57+
| `17` | **Pagamento Instantâneo (PIX)** | **PIX dinâmico**, se a empresa usar CentriumPAG |
58+
| `90` | Sem Pagamento | nenhuma |
59+
| `99` | Outros | nenhuma |
60+
61+
### `FormaIntegracaoCartao`**sem sinal neste tenant**
62+
63+
O contrato (AD-078) define `'1'` = TEF e `'2'` = POS/avulso. No cadastro real
64+
ele nunca é preenchido: **só aparecem `""` e `" "` (espaço) nas 1305 linhas**.
65+
66+
Pior: o `" "` **não** correlaciona com cartão. Ele aparece em `01` (dinheiro),
67+
`05` (crediário, vale devolução) e `17` (PIX) — e **não** aparece nas duas
68+
formas de cartão (`03`, `04`), que trazem `""`. É padding do GeneXus, não
69+
informação. Qualquer regra que leia este campo para decidir TEF vai decidir
70+
errado.
71+
72+
### `FormaTipoTransacaoTEF`**vazio em 100% das linhas**
73+
74+
Zero sinal. Não serve para distinguir crédito de débito, nem para dizer que a
75+
forma é TEF.
76+
77+
### `FormaFpgUtiCar`**vazio em 100% das linhas**
78+
79+
Consequência colateral relevante para a 008: sob AD-149, `'VDV'` é o que
80+
identifica a forma de vale devolução. Como o campo vem vazio, a forma
81+
`33 - VALE DEVOLUÇÃO` deste tenant **não** seria reconhecida como vale — ela
82+
cairia como uma forma comum de crédito loja, com campo de valor livre em vez da
83+
janela do ticket.
84+
85+
### `FormaEntrada` (`FpgEnt`) — preenchido, `S`/`N`
86+
87+
Único campo, além do meio, que chega com conteúdo útil. Ecoado no payload de
88+
faturamento (`FR-022`/AD-111), não interpretado.
89+
90+
---
91+
92+
## 2. As duas flags de empresa
93+
94+
```jsonc
95+
"ConfiguracoesTEF": {
96+
"TEFAtivo": false, // ← a única informação de TEF que existe
97+
"TEFempresaAutomacao": "", "TEFcapAutomacao": "0", "TEFversaoInterface": "0",
98+
"TEFnomeAutomacao": "", "TEFversaoAutomacao": "", "TEFregistroCertificacao": "",
99+
"TEFVersaoImpressao": "0"
100+
},
101+
"ConfiguracoesPIX": {
102+
"UtilizaCentriumPAG": false, // ← liga/desliga o PIX dinâmico
103+
"MinimoPix": "0.00000", "TempoEspera": "0",
104+
"UtilizaEncurtador": "", "UtilizaLinkExterno": ""
105+
}
106+
```
107+
108+
Os demais campos de `ConfiguracoesTEF` são **parâmetros de automação** que o
109+
Checkout repassaria ao serviço TEF local do PDV — identificação da automação
110+
comercial, versões, registro de certificação. Não são endereço de serviço nem
111+
credencial: não dá para "chamar o TEF" a partir deles.
112+
113+
---
114+
115+
## 3. A resposta à pergunta
116+
117+
### PIX — dá para saber, com precisão
118+
119+
Dois campos bastam e são suficientes:
120+
121+
```
122+
forma.FormaMeioPagtoNFe === '17' → esta forma é PIX
123+
ConfiguracoesPIX.UtilizaCentriumPAG === true → esta empresa faz PIX dinâmico
124+
```
125+
126+
Neste tenant a forma `36 - PIX` existe em todas as 87 condições, e
127+
`UtilizaCentriumPAG` está **desligado** — logo, hoje, o PIX aqui é pagamento
128+
manual (o operador confirma por fora), não integração.
129+
130+
### TEF — só no nível da empresa, nunca da forma
131+
132+
A única informação de TEF é `ConfiguracoesTEF.TEFAtivo`. **Não existe, no
133+
payload, nada que diga "esta forma vai por TEF"**: os dois campos que existiriam
134+
para isso (`FormaIntegracaoCartao`, `FormaTipoTransacaoTEF`) estão vazios em
135+
todas as linhas.
136+
137+
Portanto a única regra possível é a inferência por meio:
138+
139+
```
140+
(meio === '03' || meio === '04') && ConfiguracoesTEF.TEFAtivo → TEF
141+
```
142+
143+
O que **não** dá para saber, e é uma limitação real do cadastro:
144+
145+
- distinguir cartão que passa no **TEF** de cartão que passa em **maquininha
146+
avulsa (POS)** — os dois são `03`/`04` com os mesmos campos vazios. Numa
147+
empresa com `TEFAtivo`, toda forma de cartão será tratada como TEF;
148+
- se uma forma específica de cartão foi cadastrada para **não** integrar.
149+
150+
### Nenhuma integração — é o resto
151+
152+
Todo meio fora de `03`/`04`/`17`, e também `03`/`04`/`17` quando a flag da
153+
empresa correspondente está desligada.
154+
155+
Essa é exatamente a tabela que `resolverIntegracao`
156+
(`src/client/domain/pagamento/roteamentoIntegracao.ts`) já implementa — ela
157+
decide **** por `meioPagtoNFe` + as duas capacidades, e deliberadamente ignora
158+
`FormaIntegracaoCartao`. O dado real confirma que ignorar foi a escolha certa:
159+
aquele campo não carrega informação neste cadastro.
160+
161+
---
162+
163+
## 4. O bloqueio que vem antes de tudo isso
164+
165+
O Checkout **não consegue ler este catálogo hoje**.
166+
167+
`MeioPagtoNFe` (`domain/pagamento/formaPagamento.ts`, AD-023) é uma união
168+
fechada de **nomes**`'Dinheiro'`, `'CartaoCredito'`, `'Pix'`… — e o ERP real
169+
manda **códigos numéricos**. A cadeia de fronteira reage assim:
170+
171+
1. `filtrarFormasValidas` (`shared/schemas/pagamento.schema.ts`) descarta, com
172+
`console.warn`, toda forma cujo `FormaMeioPagtoNFe` não está na união →
173+
**as 15 formas de cada condição são descartadas**;
174+
2. `paraCondicoesPagamento` (`services/pagamento/pagamentoMapper.ts`) exclui
175+
condição que ficou sem nenhuma forma → **o catálogo inteiro fica vazio**;
176+
3. sem catálogo: a tela de pagamento não oferece forma nenhuma, e a venda
177+
rápida (013) não produz atalho algum, porque o filtro E4 cruza o par
178+
(condição, forma) com esse mesmo catálogo.
179+
180+
O `erp-mock` dos testes reproduz os **nomes**, e é por isso que a suíte inteira
181+
passa verde enquanto o caminho real está quebrado. Nenhum teste automatizado
182+
cobre este formato hoje.
183+
184+
**Correção necessária, na fronteira e em um lugar só:** mapear código → nome em
185+
`pagamento.schema.ts`, aceitando as duas formas (o ERP real e o YAML/mock),
186+
exatamente como `numeroErp`/`inteiroErp` já fazem para número que chega como
187+
string (AD-165). O domínio continua falando por nomes; só a fronteira aprende o
188+
código.
189+
190+
---
191+
192+
## 5. Achados colaterais deste mesmo payload
193+
194+
Não pertencem à pergunta, mas foram observados no mesmo dado e afetam features
195+
existentes:
196+
197+
1. **Teclas de venda rápida fora de F6–F9.** `CenarioPagamento` real:
198+
```json
199+
["21;DINHEIRO;1;À VISTA;Dinheiro;true;F4",
200+
"30;CARTAO DEB;1;À VISTA;DEBITO;true;F2",
201+
"31;CARTAO CRED;1;À VISTA;CREDITO A VISTA;true;F8"]
202+
```
203+
`FR-003` da 013 aceita só F6–F9: dois dos três cenários seriam descartados
204+
em silêncio, sobrando só o `F8`. O formato de 7 campos e o `true` minúsculo
205+
em `CPgIsEncerraOperacao` estão de acordo com AD-105/AD-106.
206+
207+
2. **`FormaFpgUtiCar` vazio** quebra a identificação do vale devolução (AD-149)
208+
— ver §1.
209+
210+
3. **Descrição não é confiável para inferir o meio.** A forma `29 - CARTAO` tem
211+
`FormaMeioPagtoNFe = '01'` (Dinheiro). Toda decisão precisa sair do meio,
212+
nunca da descrição — o que a base já faz, e este cadastro confirma por quê.
213+
214+
4. **`GetSessao` exige o header `Empresa`.** Sem ele o ERP responde `200` com
215+
`SessaoUsuario` inteiro zerado e `messages: [{ Id: "9999", Description:
216+
"Cabeçalho de Empresa é obrigatório" }]` — sucesso HTTP com corpo vazio, não
217+
erro. Quem for depurar bootstrap contra o ERP real precisa saber disso.

0 commit comments

Comments
 (0)