Files
GTI_GERENCIADOR_FISCAL/docs/rtc_pis_cofins_model.md
T

64 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Reforma Tributária (RTC) no cadastro de produto — modelo condicional
Substitui o modelo anterior de "escopo ampliado". Não existe segundo escopo, segundo painel ou segunda fila: RTC é **uma condição** da definição única de completude (`docs/unified_fiscal_completeness.md`).
## Regra definitiva
`RTC_ENABLED = PARAMETROS.USAR_REFORMA_TRIBUTARIA truthy (1/S/T/TRUE) E o schema comporta RTC`
(`C000025.CCLASSTRIB`, `RTC_CCLASSTRIB(CCLASSTRIB, CSTIBSCBS)`, `RTC_CST(CSTIBSCBS)`). Isso habilita o recurso RTC; **não** torna cClassTrib obrigatório para todos os produtos.
`CCLASSTRIB_APPLICABLE = RTC_ENABLED E C000004.CRT conhecido E data atual >= data efetiva do CRT`:
- CRT 3: aplicável a partir de 2026-08-03.
- CRT 1/2/4: aplicável a partir de 2027-01-01.
- CRT ausente/desconhecido/conflitante: não aplicável até resolver o contexto, sem inferir regime.
- RTC desligada, CRT sem aplicabilidade na data, ou contexto não resolvido: `CCLASSTRIB` é ignorado na validação/completude; não cria blocker nem candidato e não escreve. Os outros campos fiscais continuam avaliados.
- RTC ligada e cClassTrib aplicável: validar o valor e manter os blockers de campo vazio/inválido/catálogo existentes.
Parâmetro ilegível ou conflito de valores continua fail-closed para o escopo RTC. A aplicabilidade de cClassTrib é calculada separadamente com CRT ao vivo de `C000004` e as datas efetivas.
## Validação com RTC ativa
`C000025.CCLASSTRIB → RTC_CCLASSTRIB.CSTIBSCBS → RTC_CST` (o CST IBS/CBS **não** é coluna do produto; é derivado pela relação).
| Blocker (PT-BR) | Condição |
|---|---|
| `CCLASSTRIB_MISSING` cClassTrib ausente | vazio |
| `CCLASSTRIB_INVALID_FORMAT` cClassTrib com formato inválido | não tem exatamente 6 dígitos |
| `CCLASSTRIB_NOT_IN_CATALOG` cClassTrib fora do catálogo local | inexistente em `RTC_CCLASSTRIB`, ou fora da vigência (`INICIO_VIGENCIA` futura / `FIM_VIGENCIA` passada — colunas do próprio catálogo) |
| `RTC_CST_MISSING` CST IBS/CBS ausente no catálogo | a classe não aponta CST ou o CST não existe em `RTC_CST` |
| `RTC_CATALOG_INVALID` Catálogo RTC local inválido | catálogo com órfãos, duplicatas ou formatos inválidos (todo produto, enquanto RTC ativa) |
Integridade do catálogo: sem órfãos (classe → CST inexistente), sem duplicatas, classes com 6 dígitos, CST com 3 dígitos. TESTESOFICIAIS: 145 classes, 18 CSTs, 0 órfãos, 0 duplicatas.
## O que NÃO é validado
O schema do produto não modela alíquota IBS/CBS, valor IBS/CBS nem `cCredPres`. Não existem blockers desses campos e nenhum write target foi inventado. A validação do produto reflete só o que o SGV guarda como default: `CCLASSTRIB`.
## Fontes (ACCESSED_AT 2026-09-24/25)
- NT 2025.002-RTC v1.51, Portal Nacional da NF-e (publicada 04/08/2026): campos IBS/CBS (grupo UB) obrigatórios em 2026; para emitentes CRT 1/2/4 as orientações "serão publicadas em NT futura" porque a tributação IBS/CBS/IS desses contribuintes ocorre a partir de 2027 (art. 348 da LC 214/2025).
- LC 214/2025 (Planalto, compilada): art. 348 (2026: IBS/CBS compensados com PIS/Cofins; alíquotas de teste).
- Catálogo local do ERP (`RTC_CCLASSTRIB`/`RTC_CST`, `PUBLICACAO`/`INICIO_VIGENCIA`) e cClassTrib oficial no Hub (`cClassTrib 2026-06-22.xlsx`).
- `PARAMETROS.USAR_REFORMA_TRIBUTARIA`: parâmetro do próprio SGV (executável 5.1.0.4 o lê; o 5.0.6.124 não tem RTC).
- `C000004.CRT`: regime da empresa lido ao vivo; a vigência de aplicabilidade segue o calendário oficial registrado por `legal_effective_context`.
O interruptor do ERP habilita o recurso RTC; `C000004.CRT` e a vigência decidem quando cClassTrib entra na completude. Assim, `USAR_REFORMA_TRIBUTARIA=1` por si só não causa 521 blockers em empresa CRT 1 antes de 2027.
## Fonte da verdade (ERP_RTC_ENABLED)
Quem decide é o **Agent**, lendo o banco real daquela instalação **a cada varredura** (nunca uma decisão guardada no Hub, nunca cache local):
`SELECT FIRST 20 USAR_REFORMA_TRIBUTARIA FROM PARAMETROS` — todas as linhas. Uma linha (ou linhas iguais) truthy ⇒ ativa; linhas divergentes ⇒ **não** ativa e `rtc_param_conflict=true` (nunca "adivinha" ligado); parâmetro ausente/nulo ⇒ desativada.
O estado observado vai em `fiscal_context` do resultado do job e aparece no painel com proveniência (tooltip): `rtc_enabled`/`erp_rtc_enabled`, `rtc_source` (`PARAMETROS.USAR_REFORMA_TRIBUTARIA`), `rtc_param`, `rtc_param_rows`, `rtc_param_conflict`, `rtc_observed_at` (UTC), `rtc_supported`, `rtc_catalog_valid`.
O fingerprint dos blockers inclui o estado RTC: 0→1 cria blockers novos; 1→0 faz a varredura seguinte não reenviar os RTC e o Hub os fecha (`AUTO_REEVALUATION`).
## ERP_RTC_ENABLED × CCLASSTRIB_APPLICABLE
- `ERP_RTC_ENABLED` registra que o SGV ativou RTC e o schema suporta o recurso.
- `CCLASSTRIB_APPLICABLE` usa `C000004.CRT` e a data efetiva acima; só quando verdadeiro `CCLASSTRIB` participa da completude e pode gerar blocker/candidato.
- `legal_effective_context(crt)` continua reportando o contexto amplo de documentos; a decisão operacional por cClassTrib está registrada separadamente em `fiscal_context.cclasstrib_applicability` (`state`, `basis`, `effective_from`, `source`).
## Achado de corpus e causa da divergência de RTC (somente leitura)
Estado atual do parâmetro nas cópias locais: `CONSTRUCAO=1`, `TESTESOFICIAIS=1`, `MMMODAS=0`, `RINCAO=0`, `UNIAO=0` (cada uma com **uma** linha em `PARAMETROS`, `ODS 11.2`, Firebird 2.5.9). O discovery de `TESTESOFICIAIS.FDB` registrou `0` às 15:25 de 24/09 e a leitura de hoje (mesmo arquivo, mesmas 521 linhas) retorna `1`. Causas descartadas: linha errada / várias linhas (há 1), cache do Hub (a leitura é direta no Firebird, o Agent lê ao vivo), outro arquivo (mesmo caminho canônico). Causa real comprovada: **o valor mudou no próprio banco depois do discovery** (mesmo arquivo, mesma linha única). O autor da mudança não é rastreável (o Firebird 2.5 não guarda histórico de valores e o SGV não tem tabela de log de parâmetros); a hipótese mais simples é a alteração do parâmetro "usar reforma tributária" no SGV 5.1.0.4, que é quem lê esse parâmetro. Por isso o Agent nunca reaproveita um estado anterior.
Baseline anterior ao gate CRT/vigência (TESTESOFICIAIS, RTC ligada): 521/521 produtos foram contados como blockers cClassTrib e cobertura ficou em 0%. A validação pós-gate do Agent 2 deve registrar as novas contagens após executar o Agent atualizado; a medição antiga não representa a regra atual.
## Determinação e preenchimento do cClassTrib
Ver `docs/cclasstrib_resolution.md` (fontes oficiais, catálogo local × oficial, regras) e `docs/rtc_auto_apply.md` (auto-apply restrito a `CCLASSTRIB`, desligado por padrão).
## Testes
RTC off/on, `CCLASSTRIB` vazio/válido/inválido/órfão/expirado, catálogo inválido: `central/tests/test_unified_fiscal_coverage.py`, `agent/tests/test_unified_fiscal.py`.