|
| 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 **só** 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