# 05 — Regras de negócio

> Fonte operacional: código em `app/Services` e controllers. Documentos de escopo/checklist foram confrontados; divergências estão marcadas.

## Catálogo de confronto (pendências)

### RN-001 — PROD_SEM_0200
**Descrição:** Item de documento SPED sem registro 0200.  
**Condição:** `cod_prod` em C170/A170/D101/D501 sem `sped_reg_0200`.  
**Ação:** Pendência criticidade alta, impacto **bloqueia**.  
**Módulo:** Confronto/SPED.  
**Evidência:** `ConfrontoRegrasCatalog`, `ConfrontoService::executarParaImport` — CONFIRMADO.

### RN-002 — NCM_AUSENTE
**Condição:** NCM não resolvido (item + 0200 + correções).  
**Ação:** Pendência **bloqueia**.  
**Evidência:** `ConfrontoService` + `SimulacaoSpedCorrecaoService::resolverNcm` — CONFIRMADO.

### RN-003 — INTEGRIDADE_BAIXA
**Condição:** `% integridade` do relatório SPED **< 95**.  
**Ação:** Pendência **bloqueia**.  
**Evidência:** `ConfrontoService` + `SpedRelatorioService::integridade` — CONFIRMADO.

### RN-004 — UNIDADE_DIVERGENTE
**Condição:** Mesmo `cod_prod` com unidades distintas no import.  
**Ação:** Ressalva.  
**Evidência:** `ConfrontoService` — CONFIRMADO.

### RN-005 — CONVERSAO_UNIDADE_AUSENTE
**Condição:** Após divergência, falta cadeia de conversão em `prodserv_conversao_unidade`.  
**Ação:** Ressalva.  
**Evidência:** `ConfrontoService::temConversaoCompleta` — CONFIRMADO.

### RN-006 — PROD_DUPLICADO
**Condição:** Mesmo NCM + descrição truncada (40) com múltiplos `cod_item`.  
**Ação:** Informativo.  
**Evidência:** `ConfrontoService` — CONFIRMADO.

### RN-007 — CADASTRO_AUSENTE
**Condição:** 0200 sem match em `prodserv.cod_item_sped`.  
**Ação:** Ressalva.  
**Evidência:** `ProdutoCadastroMatcher` — CONFIRMADO.

### RN-008 — CADASTRO_INCONSISTENTE
**Condição:** NCM SPED ≠ NCM cadastro.  
**Ação:** Ressalva.  
**Evidência:** `ProdutoCadastroMatcher` — CONFIRMADO.

### RN-009 — ORIGEM_INDEFINIDA
**Condição:** `reforma_produto_item.origem_classificada = indefinido`.  
**Ação:** Ressalva (nível simulação).  
**Evidência:** `ConfrontoService::executarParaSimulacao` — CONFIRMADO.

### RN-010 — CLASSTRIB_AMBIGUO / CLASSTRIB_AUSENTE
**Condição:** Tabela `classtrib_referencia` carregada; item sem cClassTrib definido (ambíguo se >1 opção por CST).  
**Ação:** Ressalva.  
**Exceção:** Sem sync da tabela, não gera pendência no confronto.  
**Evidência:** `ClassTribConfrontoService`, `ClassTribResolverService` — CONFIRMADO.

### RN-011 — SIMPLES_NAO_CONSULTADO
**Condição:** Pessoa CNPJ 14 dígitos sem `regimetributario`.  
**Ação:** Informativo.  
**Evidência:** `ConfrontoService::executarParaPessoa` — CONFIRMADO.

### RN-012 — PERIODO_INCOMPLETO
**Condição:** SPEDs processados com menos de 12 meses distintos.  
**Ação:** Ressalva.  
**Evidência:** `ConfrontoService::executarParaPessoa` — CONFIRMADO.

### RN-013 — GRUPO_DEPARA_AUSENTE
**Descrição:** Presente no catálogo.  
**Detector em runtime:** **não encontrado** em services.  
**Classificação:** NÃO CONFIRMADO (implementação de detecção).  
**Evidência:** apenas `ConfrontoRegrasCatalog` + teste.

### RN-014 — Persistência / auto-resolução de pendências
**Condição:** Chave `(idtenant, codigo_regra, referencia_chave, idpessoa, idimport)`.  
**Ação:** Upsert `aberta`; auto `resolvida` se condição some.  
**Evidência:** `ConfrontoService::persistirPendencias` — CONFIRMADO.

## Prontidão e bloqueio

### RN-016 — Score de prontidão (0–100)
Componentes: integridade (25) + origem definida (25) + NCM (15) + meses SPED (20) + zero bloqueantes (15).  
**Evidência:** `ProntidaoService::calcular` — CONFIRMADO.

### RN-017 — Classificação
- `nao_simulavel`: bloqueantes > 0 **OU** score < 50  
- `simulavel_ressalva`: score < 80 **OU** ressalvas > 0  
- `simulavel`: demais  
**Evidência:** `ProntidaoService::classificar` — CONFIRMADO.

### RN-019 — Bloqueio recálculo reforma CBS/IBS
Se última prontidão = `nao_simulavel` → `SimulacaoBloqueadaException` (salvo `forcar=true`).  
**Evidência:** `ReformaCalculoService::verificarBloqueio` — CONFIRMADO.

### RN-020 — Regime atual sem bloqueio por pendência
`SimulacaoCalculoService::calcular` não consulta prontidão.  
**Evidência:** CONFIRMADO.

### RN-023 — Confiabilidade do resultado reforma
`baixa` / `media` / `alta` via `ConfiabilidadeService::avaliar` — CONFIRMADO.

## Classificação de origem (reforma)

### RN-024 — ProdutoOrigemClassifier
Ordem: serviço (bloco D/A/F) → exportação CFOP 7xxx → importado 3xxx → produção própria (1551/1556/2551/2556) → CST origem → CFOP nacional → indefinido.  
**Evidência:** `ProdutoOrigemClassifier::classificar` — CONFIRMADO.  
**Nota:** alinha-se a `docs/ESCOPO-CALCULADORA-REFORMA-TRIBUTARIA.md` (fonte documental + código).

## Cálculos

### RN-028 — ReformaCalculoService
Bases CBS/IBS, exclusão exportação, defaults PIS/COFINS/ICMS/ISS, transição `ReformaTransicaoService`, ClassTrib reductions. — CONFIRMADO.

### RN-029 — SimulacaoCalculoService (regime atual)
Receitas por categoria; PIS/COFINS cumulativo vs não conforme `lucro_real`; créditos rateados. — CONFIRMADO.

## Workflow pendências (UI)

### RN-030 — Atualização manual
Status: `aberta|em_revisao|resolvida|ignorada`; justificativa obrigatória ao resolver/ignorar (10–500).  
**Evidência:** `PendenciaController::update` — CONFIRMADO.

## Sessão e acesso

### RN-040 — Sessão única
Login grava `idsession`; middleware invalida outras sessões. — CONFIRMADO `SingleSession`.

### RN-041 — Tenant admin
Somente `is_admin_tenant=1` gerencia tenants. — CONFIRMADO `AdminTenantMiddleware`.
