Skip to content

feat(nfse): explicit company-scoped tax association groundwork (#428) - #444

Merged
vitormattos merged 22 commits into
mainfrom
feat/fiscal-tax-association-428-20261012
Oct 12, 2026
Merged

vitormattos merged 22 commits into
mainfrom
feat/fiscal-tax-association-428-20261012

Conversation

@vitormattos

@vitormattos vitormattos commented Oct 12, 2026 •

Copy link
Copy Markdown
Member

Estado — draft, não mergeável até validação independente

Implementação incremental da issue #428, sem encerrá-la. A dependência NT007 (#416) foi integrada em 3739466804aa2b398842748c06b749c482b2f9ad. Base do PR: main.

Entregas técnicas nesta branch

  • Associações versionadas por company_id + tax_id + vigência, modelo e enum de identidades fiscais.
  • Serviço interno de confirmação com operação transacional, lockForUpdate no imposto de sua empresa, intervalo não sobreposto, referência de auditoria e identidade do confirmador. O controle de acesso do futuro formulário pertence à frente feat: confirmar associações fiscais de impostos Akaunting existentes por empresa #431.
  • Leitura de linhas document_item_taxes com junções vinculadas por empresa, documento e item; decimais lidos como texto (CAST ... AS CHAR) para não receber floats no SQLite.
  • Divergência de vínculos simultaneamente válidos causa falha explícita, sem escolha silenciosa de mapeamento.
  • FiscalTaxFact imutável + diagnóstico de ausência, conflito de tipo/papel e tributo de transparência.
  • Agregador puro em centavos que respeita identidade da ocorrência persistida, separa valores próprios dos retidos, não soma alíquotas de imposto homônimo e não promove IBS/CBS a imposto de linha federal.
  • Oráculo independente para half-even em centavos exatos conforme NT007 v1.0, seção 2(c). Fonte primária: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/nt-007-se-cgnfse-v1-0.pdf (páginas 4 e 6 do PDF, com ativação de campos na produção e restrita em 09/02/2026).
  • Testes Unit e Feature sintéticos para arredondamento, valores iguais, duplicidade de linha, tipos incompatíveis, alteração temporal, origem e isolamento da empresa.

Falha anterior de CI / correção

Run 38296314427: 275 testes Feature aprovados, um falhou porque o driver devolvia DECIMAL como float. Corrigido em 11e2483e, sem aceitar conversões de float como oráculo. Checks posteriores devem ser conferidos no HEAD final; não tratar execuções canceladas ou pendentes como aprovação.

Limites de escopo ainda pendentes

Não houve emissão fiscal real, uso de certificados/PII reais, alterações de workflows nem pin de dependência fiscal. Todos os commits são incrementais e assinados via Git Signing MCP com DCO.

Revisão de complexidade e regras de negócio — 12/10/2026

HEAD: c6dd6592a9acf745cddfc5ea3f4014928d7e11aa (commits GPG/DCO). Revisão pedida pelo mantenedor, sem alterar workflows, dependências fiscais nem habilitar emissão real.

Métodos públicos refatorados, contagem de linhas por corpo (não métrica formal de complexidade):

  • FederalTaxFactAggregator::aggregate(): 100 → 36; extraídos validação da identidade, política de tipo/papel, identificação de ocorrência, acumulação em centavos e registro de alíquotas.
  • InvoiceTaxFactsResolver::resolve(): 126 → 25; validador de escopo, consulta de observações ativas, seleção temporal por empresa, materialização e validação da evidência são métodos independentes.
  • TaxFiscalAssociationStore::confirm(): 71 → 37; revisão de datas, prova do tax_id na empresa, lock e sobreposição isolados.
  • FiscalTaxAssociationDiagnostics::inspect(): 40 → 12; razão e construção de decisão em métodos próprios.
  • ExactTaxDecimal::percentOfCentsHalfEven(): 30 → 13; escala exata e tie-breaking half-even separados.

Data providers de negócio: ocorrência persistida vs. duplicação, homônimos e tax_id distintos, imposto devido/retido, tipo nativo incompatível, PIS/COFINS/CSLL/IRRF/CP vs. ISS/IBS/CBS, half-even (ties, não ties, overflow e valores desconhecidos), intervalos de confirmação inclusivos e não sobrepostos, competência no primeiro/último dia, evidência de confirmação e isolamento empresarial. A fixture Feature principal foi dividida em testes independentes com nomes que descrevem regras observáveis; nada foi acrescentado somente para elevar cobertura.

Limites mantidos: #428 continua aberta, esta entrega é groundwork e não conclui a integração do novo resolvedor ao InvoiceFederalPayloadResolver, FederalTaxSnapshotBuilder e retenções NT007. A classe não adquire autoridade para decidir base, alíquota, incidência ou IBS/CBS. Sem transmitir a SEFIN. Fonte normativa e validação independente da #427, checks no HEAD final e review CODEOWNER continuam obrigatórios. O autor @vitormattos continua sendo o único CODEOWNER registrado, o que exige resolução de governança sem bypass.

CI: consultar os resultados finais e não cancelados do HEAD acima em https://github.com/LibreCodeCoop/akaunting-nfse/pull/444/checks. Nenhum job em andamento conta como aprovado.

Integração da base e critérios de merge

A main avançou após a criação desta branch, incluindo os PRs #452 (oráculos normativos E2E) e #453 (evidência cooperativa). A nova base observada foi f238283b72d7f2df2f49a9b1eed065b7b969bbc4; o PR continua sem conflitos, mas os checks de c6dd6592a9acf745cddfc5ea3f4014928d7e11aa foram iniciados antes dessa integração. Exigir comparação e CI de integração contra a base vigente antes de liberar merge.

Na última conferência do HEAD da revisão de complexidade: PHPUnit PHP 8.2/8.3/8.4, Psalm, PHP-CS-Fixer, migrações MySQL, Smoke, Frontend Unit, REUSE, DCO e commits convencionais aprovados; Dependabot não aplicável; Akaunting Feature e Playwright Full UI ainda in_progress. Nunca classificar esses dois como sucesso sem resultado concluído. #428 segue aberta, PR em draft, sem substituição do caminho de emissão por fatos confirmados, sem revisão CODEOWNER, e sem bypass.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
…tion (#428)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
…cts (#428)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Base automatically changed from fix/nt007-social-retention-and-description-scope-20261010 to main October 12, 2026 19:16
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
…428)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
…ence (#428)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
…428)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
#428)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
…428)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
…ion (#428)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
…428)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
…ty (#428)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
@vitormattos
vitormattos marked this pull request as ready for review October 12, 2026 21:37
@vitormattos
vitormattos merged commit eaa13f8 into main Oct 12, 2026
16 checks passed
@vitormattos
vitormattos deleted the feat/fiscal-tax-association-428-20261012 branch October 12, 2026 21:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant