Files
GTI_GERENCIADOR_FISCAL/fiscal/docs/rtc_pis_cofins_model.md
T
gti d21a9d1140 Add 'fiscal/' from commit '102ba84500dbd9655a0471288c3e278652593ca9'
git-subtree-dir: fiscal
git-subtree-mainline: d95165fc8f
git-subtree-split: 102ba84500
2026-09-29 14:43:23 -03:00

6.8 KiB
Raw Blame History

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.