LibFiscalRecords 6.4.0
LibFiscalRecords
Core do produto Fiscal Records, distribuído como biblioteca compartilhada .NET 8. É a fonte de verdade das regras, casos de uso e persistência do ecossistema.
⚡ Quick Start
Novo? Comece aqui:
- 🛠️ CONTRIBUTING.md — ambiente, testes e fluxo de contribuição
- 🔐 SECURITY.md — reporte e tratamento de temas de segurança
- 🔧 AGENTS.md — instruções para IA e agentes de código, incluindo referência técnica completa (seção 16), processo de release (seção 16.8) e perspectivas estratégicas (seção 17.1)
- 📋 CHANGELOG.md — log completo de mudanças desde 2026-03-22
- 📦 Distribuição interna — o feed NuGet e o registry são infraestrutura privada, não serviços públicos; consulte SECURITY.md e AGENTS.md antes de os utilizar
Este projeto mantém documentação apenas em quatro arquivos: README.md, AGENTS.md, CHANGELOG.md e, quando aplicável, UX_AGENT.md — mais SECURITY.md/CONTRIBUTING.md como exceção por serem convenções nativas do GitHub. Não crie novos arquivos em docs/ para governança, estratégia ou templates.
Como começar
- Leia este
README.mdpara entender o papel da lib e os consumidores. - Use AGENTS.md (seção 16) para regras técnicas e padrões de implementação.
- Configure o host com
services.AddFiscalRecords(...)e umNpgsqlDataSource. - Execute
dotnet test LibFiscalRecords.slnantes de fazer mudanças.
AI / Codex guidance
For agent rules, ownership boundaries, protected files, and commit policy, see AGENTS.md.
Histórico de mudanças
O histórico de releases e todas as mudanças significativas pertencem exclusivamente ao CHANGELOG.md. O README descreve somente o estado atual, a configuração e a forma de uso da biblioteca; não replique aqui listas de mudanças por data.
Papel no ecossistema
lib-fiscal-records é o Core do produto e a fonte de verdade das regras, casos de uso e persistência. Centraliza domínio, políticas, billing, quotas, tenancy, ledger, documentos, faturas, extratos, movimentos bancários, reconciliação, classificação, deduplicação, normalização, regras de confiança, estados canônicos, repositórios, Unit of Work, contratos internos e integrações reutilizáveis.
Consumidores diretos atuais:
../api-fiscal-records— fronteira HTTP externa e versionada../web-fiscal-records— aplicação web (UI + orquestração HTTP)../worker-fiscal-records-document— worker de processamento de documentos com IA../worker-fiscal-records-delivery— worker de processamento de webhooks
Cliente externo atual:
../app-fiscal-records— aplicação Expo/React Native, exclusivamente via API
A arquitetura atual permanece:
web-fiscal-records → lib-fiscal-records
api-fiscal-records → lib-fiscal-records
app-fiscal-records → api-fiscal-records
worker-fiscal-records-document → lib-fiscal-records
worker-fiscal-records-delivery → lib-fiscal-records
A principal decisão de frontend ainda aberta é uma eventual aplicação React web:
React web → api-fiscal-records → lib-fiscal-records
A API já é responsável por transporte e contratos externos, consome os casos de uso do Core e não deve duplicar regras ou persistência. O app já existe em Expo/React Native e consome a API. Os workers continuam consumindo a lib diretamente, sem passar pela API.
O estado atual web-fiscal-records → lib-fiscal-records permanece suportado e coexiste com a API. Não existe obrigação ou prazo para migrar o web para React, remover Razor ou eliminar a referência direta do web à lib. Dois hosts consumirem o mesmo caso de uso do Core representa reutilização; duplicação ocorre quando regras semelhantes são reimplementadas nos hosts.
A separação por camadas ainda possui dívida conhecida: dois serviços de deduplicação executam SQL em Application, implementações concretas de I/O permanecem fora de Infrastructure, e web/worker de documentos conservam repositories legados. Essas exceções descrevem o código atual, não um padrão autorizado para novo trabalho; o inventário crítico e a regra de evolução estão em AGENTS.md seção 5.1.
A orientação normativa completa, inclusive para classificação de mudanças e estados transitórios, está em AGENTS.md.
Direção estratégica (resumo)
O produto já possui Core, API, web Razor, app Expo/React Native e workers. A prioridade recomendada é tornar releases, migrations e consumidores verificavelmente coerentes antes de ampliar o escopo. As opiniões consultivas de CEO, CTO, CMO, arquiteto de sistemas e developer estão centralizadas em AGENTS.md; elas orientam propostas futuras, mas não constituem roadmap automático. Prioridade e escopo de trabalho vêm sempre do pedido corrente do usuário e de validação explícita do product owner.
Invariantes de conciliação
- O score-base de candidatos usa a mesma política para fatura → movimento e movimento → fatura; classificadores específicos podem acrescentar evidências sem alterar essa base.
- A gravação N:N bloqueia deterministicamente o movimento e as faturas envolvidas durante a transação e valida tanto o saldo do movimento quanto o saldo disponível de cada fatura.
- Correspondência exata é uma recomendação do Core, não autorização para um
GETou carregamento de tela persistir uma conciliação.
Nota de nomenclatura
superowneré apenas referência interna; nunca expor em UI, help ou copy- Use
administrador internooubypass administrativoem superfícies visíveis ao cliente
Stack
.NET 8(C#)Dapper+Npgsql(PostgreSQL)Google Drive API v3+Google.Apis.Auth(OAuth)Microsoft.Extensions.DependencyInjection/OptionsxUnit(testes)BCrypt.Net-Next(hash de senhas)Microsoft.Extensions.Http(HttpClient)
Estrutura de pastas (src/)
Abstractions/ → interfaces/contratos (repositórios, serviços)
Domain/ → entidades, enums, records e regras puras
Application/ → serviços de orquestração e políticas aplicadas
Infrastructure/ → implementações concretas (Dapper, Drive, OAuth, locking)
Common/ → utilitários transversais
Google/ → modelos e helpers reutilizáveis para Google/Drive
Options/ → modelos de configuração
DependencyInjection/ → ponto único de registro DI (AddFiscalRecords)
Como consumir
// No host (web ou worker)
services.AddFiscalRecords(options =>
{
options.RootFolderName = "FiscalRecords";
});
// IInvoiceExtractor é registrado como MissingInvoiceExtractor por padrão.
// O host que processa documentos DEVE sobrescrever:
services.AddScoped<IInvoiceExtractor, MeuGeminiExtractor>();
// Para extratos bancários, a lib também expõe:
// - IBankStatementOperationTypeResolver
// - IBankStatementCounterpartyResolver
// - IBankStatementExtractionPostProcessor
// - IBankMovementCounterpartyAliasRepository
// AppUser expõe DisabledUtc; o host web usa isso para desativar contas via admin.
Pré-requisitos no host:
NpgsqlDataSourceregistrado no container DI- Configurações Google (
Google:ClientId,Google:ClientSecret, etc.) quando usar OAuth/Drive
Regra obrigatória para hosts
web-fiscal-records,worker-fiscal-records-deliveryeworker-fiscal-records-documentnão devem criar novos repositórios de dados, serviços de domínio ou contratos canônicos.- Quando surgir necessidade de novo repositório ou serviço de domínio, implementar primeiro na
lib-fiscal-recordse consumir via DI nos hosts.
Governança e decisões
- AGENTS.md — regras vinculativas, limites arquiteturais, referência técnica (seção 16), checklist estratégico (seção 17) e política do próprio arquivo (seção 12)
Canonical Rules
IUnitOfWork + Dapperfor all repository access.InvoiceFileStatusandInvoiceFileSourcestay canonical and lowercased where already established.InvoiceFileLifecycleis the canonical user-facing classification: intermediate audit states areProcessing,persistedisCompleted, andfailedisRequiresAttention. Consumers should navigate by these groups without renaming or discarding the underlying audit status.- Deduplication logic lives in
BankStatementMovementDeduplicationPolicy.csand related services. - Repositories that use
INSERT/UPDATE ... RETURNINGwith date/time columns must have a Postgres integration test that asserts the returned CLR types and round-trips the persisted values. - Update
CHANGELOG.mdand rundotnet test LibFiscalRecords.slnbefore finishing a non-trivial change.
Testes PostgreSQL locais
Os testes de integração aceitam exclusivamente LIB_FISCAL_RECORDS_TEST_POSTGRES. Quando a variável não está definida, os testes PostgreSQL são reportados como ignorados; não há descoberta automática de appsettings do web ou da máquina do desenvolvedor.
O banco deve ser descartável, conter test no nome e possuir o marcador criado por tests/LibFiscalRecords.Tests/TestDoubles/provision-test-database.sql. As conexões usam search_path=pg_temp, impedindo acesso acidental às tabelas permanentes por nomes não qualificados. Os schemas temporários dos testes precisam acompanhar as consultas atuais dos repositórios.
Documentation
O contrato técnico de Drive e integração com workers está consolidado na seção 16.6.1 do AGENTS.md; não há documentação canônica paralela em docs/.
No packages depend on LibFiscalRecords.
.NET 8.0
- BCrypt.Net-Next (>= 4.0.3)
- CsvHelper (>= 33.0.1)
- Dapper (>= 2.1.66)
- DnsClient (>= 1.8.0)
- Google.Apis.Auth (>= 1.73.0)
- Google.Apis.Drive.v3 (>= 1.73.0.3996)
- Microsoft.Extensions.Configuration.Abstractions (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Http (>= 8.0.1)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Options (>= 8.0.2)
- Npgsql (>= 9.0.4)
| Version | Downloads | Last updated |
|---|---|---|
| 8.0.2 | 29 | 10/02/2026 |
| 7.0.0 | 78 | 09/26/2026 |
| 6.15.0 | 3 | 09/26/2026 |
| 6.9.0 | 9 | 09/19/2026 |
| 6.8.0 | 9 | 09/19/2026 |
| 6.7.0 | 11 | 09/19/2026 |
| 6.6.1 | 11 | 09/18/2026 |
| 6.6.0 | 2 | 09/18/2026 |
| 6.5.0 | 32 | 09/15/2026 |
| 6.4.0 | 22 | 09/15/2026 |
| 6.3.0 | 5 | 09/15/2026 |
| 6.2.1 | 6 | 09/14/2026 |
| 6.2.0 | 1 | 09/14/2026 |
| 6.1.0 | 7 | 09/14/2026 |
| 6.0.0 | 8 | 09/13/2026 |
| 5.1.3 | 41 | 08/14/2026 |
| 5.1.2 | 3 | 08/14/2026 |
| 5.1.1 | 14 | 08/13/2026 |
| 5.0.0 | 10 | 08/11/2026 |
| 4.0.0 | 8 | 08/11/2026 |
| 3.0.2 | 16 | 08/07/2026 |
| 3.0.0 | 57 | 07/31/2026 |
| 2.10.0 | 12 | 06/06/2026 |
| 2.9.0 | 7 | 06/03/2026 |
| 2.8.0 | 12 | 06/03/2026 |
| 2.7.3 | 7 | 06/02/2026 |
| 2.7.2 | 4 | 06/02/2026 |
| 2.7.1 | 16 | 05/29/2026 |
| 2.7.0 | 9 | 05/22/2026 |
| 2.6.0 | 5 | 05/22/2026 |
| 2.5.1 | 9 | 05/17/2026 |
| 2.5.0 | 12 | 05/16/2026 |
| 2.4.1 | 9 | 05/14/2026 |
| 2.4.0 | 8 | 05/11/2026 |
| 2.3.2 | 12 | 05/08/2026 |
| 2.3.1 | 8 | 04/28/2026 |
| 2.3.0 | 6 | 04/27/2026 |
| 2.2.2 | 7 | 04/26/2026 |
| 2.2.1 | 7 | 04/25/2026 |
| 2.2.0 | 7 | 04/25/2026 |
| 2.1.1 | 7 | 04/25/2026 |
| 2.1.0 | 13 | 04/25/2026 |
| 2.0.0 | 12 | 04/22/2026 |
| 1.11.2 | 8 | 04/15/2026 |
| 1.11.1 | 7 | 04/05/2026 |
| 1.11.0 | 7 | 04/05/2026 |
| 1.10.3 | 7 | 03/31/2026 |
| 1.10.2 | 10 | 03/30/2026 |
| 1.10.1 | 5 | 03/29/2026 |
| 1.10.0 | 8 | 03/28/2026 |
| 1.9.0 | 6 | 03/28/2026 |
| 1.8.0 | 21 | 03/22/2026 |
| 1.7.0 | 23 | 03/14/2026 |
| 1.6.0 | 6 | 03/03/2026 |
| 1.5.3 | 18 | 02/20/2026 |
| 1.5.2 | 6 | 02/20/2026 |
| 1.5.1 | 9 | 02/17/2026 |
| 1.5.0 | 4 | 02/17/2026 |
| 1.4.1 | 6 | 02/17/2026 |
| 1.4.0 | 5 | 02/17/2026 |
| 1.3.2 | 5 | 02/15/2026 |
| 1.3.1 | 8 | 02/15/2026 |
| 1.3.0 | 3 | 02/15/2026 |
| 1.2.0 | 3 | 02/15/2026 |
| 1.1.0 | 3 | 02/15/2026 |
| 1.0.3 | 4 | 02/15/2026 |
| 1.0.2 | 3 | 02/15/2026 |
| 1.0.1 | 4 | 02/15/2026 |