- resolver (rules RTC-R0..R4/A1..A3/G1..G2) over the official cClassTrib table 2026-06-22 and LC 214/2025 annexes; local vs official catalog comparison - ONE root-cause RTC blocker per product (missing/unresolved/ambiguous/conflict/official mismatch/catalog outdated/evidence missing) - auto-apply: C000025.CCLASSTRIB only, three switches (FIREBIRD_WRITES + RTC_AUTO_APPLY_ENABLED + Hub authorization), per-product re-read and re-decision, never overwrites, rowcount 1, audit table rtc_write_audits (migration 0027) - copy-only write E2E (280/280 applied, only CCLASSTRIB changed, 2nd run 0 writes, stale decision 0 writes); real databases untouched - docs: cclasstrib_resolution, rtc_auto_apply, unified_fiscal_completeness Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
6.2 KiB
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)).
RTC_ENABLED=false(parâmetro 0, nulo, ausente ou schema antigo):CCLASSTRIBe CST IBS/CBS não entram na completude; nenhum blocker RTC; o painel só mostra "Reforma Tributária: Desativada".RTC_ENABLED=true: RTC passa a ser obrigatório para todo produto.
Não há estado "desconhecido": um parâmetro ilegível conta como não habilitado pelo ERP (fail-closed para escopo, sem inflar cobertura porque o campo não é exigido).
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)
- 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).
Nota fiscal vs. regra do produto: para CRT 1 a legislação só exige IBS/CBS no documento a partir de 2027; a regra deste motor segue o interruptor do ERP — quando o cliente liga a reforma no SGV, o cadastro passa a ser cobrado.
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 × LEGAL_EFFECTIVE_CONTEXT (registrados separadamente)
ERP_RTC_ENABLEDé a regra operacional do produto e a única que entra na completude.legal_effective_context(crt)é informativo (informational_only=true, nunca blocker): para CRT 1/2/4 a NT 2025.002 v1.51 diz que as orientações de IBS/CBS em documentos virão em NT futura e que a tributação desses contribuintes ocorre a partir de 2027 (LC 214/2025 art. 348); para CRT 3 o preenchimento é obrigatório desde 01/01/2026. Uma empresa Simples com o interruptor ligado no SGV é validada; uma com o interruptor desligado não é, seja qual for o calendário legal.
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.
Consequência medida (TESTESOFICIAIS, RTC ligada de fato): 521/521 produtos com CCLASSTRIB_MISSING ⇒ cobertura real 0%; com RTC desligada (estado do piloto) 94,82%.
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.