O BridgeBank é um toolkit .NET de código aberto para reconciliação bancária em sistemas ERP. Oferece correspondência inteligente de transacções, classificação automática (baseada em regras e ML), leitura de extractos bancários e geração de ficheiros de pagamento para bancos moçambicanos e internacionais.
Disponível como pacotes NuGet para .NET, uma API REST (Docker) para qualquer linguagem, e SDKs tipados para Python, TypeScript e Java.
- Reconciliação Bancária — motor de correspondência inteligente com estratégias configuráveis (referência, valor+data, similaridade de descrição, baseado em ML)
- Classificação de Transacções — categorização automática baseada em regras e ML.NET (salários, impostos, taxas bancárias, fornecedores, etc.)
- Leitura de Extractos Bancários — lê extractos Excel de 6 bancos moçambicanos
- Geração de Ficheiros de Pagamento — produz ficheiros de pagamento específicos por banco (TXT, CSV, XML)
- API REST — expõe todas as funcionalidades via HTTP com especificação OpenAPI e interface Scalar
- SDKs Multi-linguagem — clientes tipados para Python, TypeScript e Java via Kiota
| Banco | Leitor de Extracto | Gerador de Pagamento |
|---|---|---|
| BCI (Banco Comercial e de Investimentos) | Sim | Sim (TXT) |
| Millennium BIM | Sim | Sim (CSV) |
| Standard Bank | Sim | Sim (XML) |
| NedBank | Sim | — |
| Access Bank | Sim | — |
| M-Pesa | Sim | — |
Os pacotes estão disponíveis no NuGet.org e no GitHub Packages:
dotnet add package Simansoft.BridgeBank.Core
dotnet add package Simansoft.BridgeBank.Parsers
dotnet add package Simansoft.BridgeBank.GeneratorsPara classificação e reconciliação baseadas em ML:
dotnet add package Simansoft.BridgeBank.MLPara utilizar os pacotes via GitHub Packages, requer autenticação mesmo para pacotes públicos. Crie um Personal Access Token (PAT) com o scope read:packages e registe a fonte:
dotnet nuget add source "https://nuget.pkg.github.com/SimansoftMZ/index.json" \
--name github-simansoftmz \
--username SEU_UTILIZADOR_GITHUB \
--password SEU_PAT \
--store-password-in-clear-textEm alternativa, adicione o registo e credenciais ao seu nuget.config:
<configuration>
<packageSources>
<add key="github-simansoftmz" value="https://nuget.pkg.github.com/SimansoftMZ/index.json" />
</packageSources>
<packageSourceCredentials>
<github-simansoftmz>
<add key="Username" value="SEU_UTILIZADOR_GITHUB" />
<add key="ClearTextPassword" value="SEU_PAT" />
</github-simansoftmz>
</packageSourceCredentials>
</configuration>Nota de segurança: Não inclua o
nuget.configcom credenciais no controlo de versão — adicione-o ao.gitignore. Use variáveis de ambiente ou o comandodotnet nuget add sourcepara gerir credenciais de forma segura.
A imagem Docker está disponível no Docker Hub e no GitHub Container Registry:
# Via Docker Hub
docker pull simansoftmz/bridgebank-api
docker run -p 8080:8080 simansoftmz/bridgebank-api
# Via GitHub Container Registry
docker pull ghcr.io/simansoftmz/bridgebank-api
docker run -p 8080:8080 ghcr.io/simansoftmz/bridgebank-apiOu com Docker Compose:
git clone https://github.com/SimansoftMZ/BridgeBank.git
cd BridgeBank
docker compose up --buildA API ficará disponível em http://localhost:8080 com a interface interativa Scalar em http://localhost:8080/scalar/v1.
Python:
pip install -r sdks/python/requirements.txtTypeScript:
cd sdks/typescript && npm installJava — adicione ao seu pom.xml:
<dependency>
<groupId>com.microsoft.kiota</groupId>
<artifactId>microsoft-kiota-bundle</artifactId>
<version>1.9.0</version>
</dependency>git clone https://github.com/SimansoftMZ/BridgeBank.git
cd BridgeBank
dotnet buildusing Simansoft.BridgeBank.Core;
using Simansoft.BridgeBank.Core.Strategies;
var motor = new MotorReconciliacao();
motor.RegistrarEstrategia(new EstrategiaCorrespondenciaPorReferencia());
motor.RegistrarEstrategia(new EstrategiaCorrespondenciaPorValorEData());
motor.RegistrarEstrategia(new EstrategiaCorrespondenciaPorDescricao());
var resultados = motor.Reconciliar(transacoesBancarias, lancamentosERP);
foreach (var r in resultados.Where(r => r.TipoCorrespondencia != TipoCorrespondencia.Nenhuma))
{
Console.WriteLine($"{r.Transacao.Id} -> {r.LancamentoCorrespondente?.Id} ({r.NivelConfianca:P0})");
}using Simansoft.BridgeBank.Core.Classificacao;
using var classificador = ClassificadorTransacao.CriarComRegrasPadrao();
var resultado = classificador.Classificar(transacao);
Console.WriteLine($"Categoria: {resultado.Categoria}, Confianca: {resultado.Confianca:P0}");using Simansoft.BridgeBank.Parsers.Bancos;
var leitor = new LeitorExtratoBCI();
var extrato = leitor.LerExtrato("extrato_bci.xls");
Console.WriteLine($"Banco: {extrato.Banco}");
Console.WriteLine($"Conta: {extrato.NumeroConta}");
Console.WriteLine($"Transacoes: {extrato.Transacoes.Count}");using Simansoft.BridgeBank.Generators.Bancos;
using Simansoft.BridgeBank.Generators.Models;
var pagamentos = new List<Pagamento>
{
new()
{
Id = "P001",
DataPagamento = DateTime.Now,
Valor = 1000.00m,
Beneficiario = "Fornecedor XYZ",
ContaBeneficiario = "123456789",
BancoBeneficiario = "BCI",
Referencia = "INV-001"
}
};
var gerador = new GeradorPagamentoBCI();
gerador.GerarFicheiro(pagamentos, "pagamentos.txt");using Simansoft.BridgeBank.ML.Classificacao;
// Treinar um modelo
var treinador = new TreinadorClassificacao();
var metricas = treinador.TreinarComDadosSinteticos("modelo.zip");
// Usar o modelo no classificador
using var classificador = ClassificadorTransacao.CriarComRegrasPadrao();
classificador.RegistrarRegra(new RegraClassificacaoML("modelo.zip", prioridade: 40));# Classificar transacções
curl -X POST http://localhost:8080/api/classificacao \
-H "Content-Type: application/json" \
-d '{"transacoes": [{"id": "1", "data": "2026-01-15", "valor": 1500, "descricao": "PAGAMENTO SALARIO", "tipo": "Debito", "categoria": "NaoClassificada", "confiancaClassificacao": 0}]}'
# Ler um extracto bancário (upload de ficheiro)
curl -X POST http://localhost:8080/api/extratos/parse \
-F "file=@extrato_bci.xls"
# Listar bancos suportados
curl http://localhost:8080/api/bancos/parsers| Método | Endpoint | Descrição |
|---|---|---|
GET |
/health |
Verificação de estado |
GET |
/api/bancos/parsers |
Listar bancos com leitores de extracto |
GET |
/api/bancos/geradores |
Listar bancos com geradores de pagamento |
POST |
/api/extratos/parse |
Carregar e ler um ficheiro de extracto bancário |
POST |
/api/classificacao |
Classificar transacções (JSON) |
POST |
/api/classificacao/extrato |
Carregar um extracto e classificar todas as transacções |
POST |
/api/reconciliacao |
Reconciliar transacções com lançamentos ERP |
POST |
/api/pagamentos/gerar |
Gerar e descarregar um ficheiro de pagamento |
GET |
/api/enums/categorias |
Listar categorias de transacções |
GET |
/api/enums/tipos-transacao |
Listar tipos de transacção |
GET |
/api/enums/tipos-correspondencia |
Listar tipos de correspondência |
Documentação interativa: http://localhost:8080/scalar/v1
Especificação OpenAPI: http://localhost:8080/openapi/v1.json
BridgeBank/
├── src/
│ ├── BridgeBank.Core/ # Motor de reconciliação, classificação e modelos
│ │ ├── Models/ # Modelos de domínio (Transacao, ExtratoBancario, etc.)
│ │ ├── Interfaces/ # Contratos (IMotorReconciliacao, IRegraClassificacao, etc.)
│ │ ├── Strategies/ # Estratégias de correspondência (referência, valor+data, descrição)
│ │ ├── Classificacao/ # Classificador de transacções baseado em regras
│ │ └── MotorReconciliacao.cs # Motor principal de reconciliação
│ ├── BridgeBank.Parsers/ # Leitores de extractos bancários
│ │ ├── Interfaces/ # Contrato ILeitorExtrato
│ │ ├── Excel/ # Leitor base Excel (NPOI)
│ │ └── Bancos/ # Implementações específicas por banco
│ ├── BridgeBank.Generators/ # Geradores de ficheiros de pagamento
│ │ ├── Interfaces/ # Contrato IGeradorFicheiroPagamento
│ │ ├── Models/ # Modelo Pagamento
│ │ └── Bancos/ # Implementações específicas por banco (TXT, CSV, XML)
│ ├── BridgeBank.ML/ # Classificação e reconciliação com aprendizagem automática
│ │ ├── Classificacao/ # Classificador de transacções ML.NET
│ │ ├── Reconciliacao/ # Estratégia de correspondência ML.NET
│ │ ├── Dados/ # Gerador de dados de treino sintéticos
│ │ └── Infraestrutura/ # Gestão de modelos e configuração
│ └── BridgeBank.Api/ # API REST (ASP.NET Core Minimal API)
│ ├── Dtos/ # DTOs de pedido/resposta
│ ├── Mappers/ # Mapeamento Modelo <-> DTO
│ ├── Dockerfile # Build Docker multi-etapa
│ └── Program.cs # Endpoints da API e registo de serviços
├── tests/ # Testes unitários para cada projecto
├── samples/ # Exemplos de utilização
├── sdks/ # Clientes da API gerados (Kiota)
│ ├── python/ # SDK Python
│ ├── typescript/ # SDK TypeScript
│ └── java/ # SDK Java
├── openapi/ # Especificação OpenAPI gerada automaticamente
├── scripts/ # Scripts de regeneração dos SDKs
├── docker-compose.yml # Docker Compose para a API
└── dotnet-tools.json # Manifesto de ferramentas locais (Kiota)
public class MinhaEstrategia : IEstrategiaCorrespondencia
{
public int Prioridade => 50;
public ResultadoCorrespondencia? TentarCorrespondencia(
Transacao transacao,
IEnumerable<LancamentoERP> lancamentos)
{
// Lógica de correspondência personalizada
return null;
}
}
motor.RegistrarEstrategia(new MinhaEstrategia());public class MinhaRegra : IRegraClassificacao
{
public int Prioridade => 60;
public string Nome => "MinhaRegra";
public ResultadoClassificacao? Classificar(Transacao transacao)
{
// Lógica de classificação personalizada
return null;
}
}
classificador.RegistrarRegra(new MinhaRegra());Extenda LeitorExcelBase e implemente ILeitorExtrato:
public class LeitorExtratoNovoBanco : LeitorExcelBase, ILeitorExtrato
{
public bool SuportaArquivo(string caminhoArquivo) =>
caminhoArquivo.EndsWith(".xls", StringComparison.OrdinalIgnoreCase);
public ExtratoBancario LerExtrato(string caminhoArquivo)
{
var workbook = AbrirFicheiro(caminhoArquivo);
// Lógica de leitura específica do banco
}
}Após modificar a API, regenere os SDKs tipados:
# Linux/macOS
./scripts/generate-sdks.sh
# Windows
pwsh scripts/generate-sdks.ps1Este processo reconstrói a API, regenera a especificação OpenAPI e actualiza os três SDKs (Python, TypeScript, Java) via Kiota.
# Executar todos os testes
dotnet test
# Executar testes de um projecto específico
dotnet test tests/BridgeBank.Core.Tests
# Com cobertura de código
dotnet test --collect:"XPlat Code Coverage"Contribuições são bem-vindas! Consulte o CONTRIBUTING.md para convenções de código, estratégia de branches, CI/CD e instruções detalhadas sobre como submeter Pull Requests.
Este projecto está licenciado sob a Licença MIT — consulte o ficheiro LICENSE para mais detalhes.
- Simansoft - Desenvolvimento inicial
Para questões e suporte, por favor abra uma issue no GitHub.