MyCoreBanking é um projeto pessoal para estudo de desenvolvimento de software. O objetivo é criar um sistema de controle financeiro pessoal, com funcionalidades básicas de um banco, como cadastro de contas, transações, acompanhamento das estatísticas por gráficos de movimentações, etc. O projeto foi desenvolvido utilizando o framework .NET 6.0, com a linguagem C#. O sistema foi dividido em duas partes: API e Web. A API foi desenvolvida utilizando Azure Functions e o banco de dados utilizado foi o SQL Server 2022. A Web foi desenvolvida utilizando Blazor WebAssembly.
-
v1:
- Cadastro de usuários
- Login
- Cadastro de contas
- Cadastro de transações
- Únicas
- Parcelamentos
- Filtro de transações
- Exportação de arquivo CSV
- Estatísticas financeiras
- Saldo geral
- Saldo por conta
- Número de transações pendentes
- Balanço mensal
- Gráficos de movimentações (receitas e despesas) nos últimos 12 meses
- Gráficos de gastos por categoria (mensal e anual)
-
v2 (futuro):
- Cartões de crédito
- Cadastro de faturas
- Efetivação de faturas
- Planejamento
- Possibilita criar metas de gastos onde o usuário pode definir um valor e uma data limite para atingir seu objetivo
- O sistema deve calcular e notificar o usuário quando o valor disponível estiver chegando próximo ao valor estipulado para a meta
- Transferências
- Possibilita transferir transações entre contas
- Investimentos
- Ao selecionar o tipo de transação "Investimento", exibir um campo para selecionar a conta de origem e a conta de destino
- O sistema deve descontar o saldo da conta de origem e adicionar o valor na conta de destino selecionada
- A conta de destino deve ser do tipo "Investimento" ou "Poupança" e a conta de origem deve ser do tipo "Corrente" ou "Carteira"
- Cartões de crédito
- .NET 6.0 SDK
- Azure Functions Core Tools
- EF Core Tools
- SQL Server 2022
- Escolha uma IDE de sua preferência:
- Azure Data Studio (opcional: SGBD)
- Postman (opcional: testar requisições)
Caso opte por utilizar o Visual Studio Code, é necessário instalar as extensões citadas acima. Para instalar as extensões, basta clicar no ícone de extensões no canto esquerdo da IDE e pesquisar pelo nome da extensão.
- Framework: .NET 6.0
- API: Azure Functions 4.0
- Web: Blazor WebAssembly
- ORM: Entity Framework Core 6.0
- Database: SQL Server 2022
- CsvHelper - Manipulação de arquivos CSV
- FluentValidation - Validação de dados
- BCrypt.Net - Criptografia de senhas
- JWT - Autenticação via token
- Blazored.FluentValidation - Validação de dados nos formulários do Blazor
- Blazored.Toast - Notificações
- Blazored.Modal - Modal
- Blazored.SessionStorage - Armazenamento de dados na sessão do navegador
- ChartJs.Blazor - Gráficos
- Cadastro
- Login
- Ver perfil
- Alteração
- Cadastro
- Regra de negócio: Limite máximo de 05 contas por usuário
- Listagem
- Obter por Id
- Alteração
- Exclusão
- Regra de negócio: Limite mínimo de 01 conta por usuário
- Regra de negócio: Não é possível excluir uma conta que possui transações associadas
- Cadastro
- Transação única
- Parcelamentos
- Listagem
- Listagem por mês e ano
- Listagem por parcelamentoId -> (visualizar todas as parcelas de uma transação parcelada)
- Listagem por meio de pagamento (enum) -> (visualizar somente transações PIX, por exemplo)
- Listagem por tipo de operação (enum) -> (receita, despesa)
- Listagem por tipo de transação (enum) -> (única, parcelada)
- Listagem por categoria (enum) -> (alimentação, transporte, etc)
- Listagem por data de efetivação -> (visualizar transações efetivadas de um dia específico)
- Obter por Id
- Alteração
- Alteração de transação única
- Alteração de transação parcelada
- Alteração de parcela única (por id)
- Alteração de parcelas pendente de pagamento
- Alteração de todas as parcelas
- Exclusão
- Exclusão de transação única
- Exclusão de transação parcelada
- Excluir parcela única (por id)
- Excluir todas as parcelas
- Efetivação de transações
- Exportação de arquivo CSV
- Saldo total (soma do saldo das contas: corrente e carteira)
- Total investido (soma do saldo das contas: investimento, poupança)
- Número de transações pendentes
- Balanço mensal (todas as contas)
- Visão geral de movimentações -> obter valor total de receitas e despesas por mês (ano atual)
- Visão geral de movimentações -> obter valor total de receitas e despesas por mês (dos últimos 12 meses)
- Total Despesas por categoria (mês atual)
- Total Despesas por categoria (ano atual)
O projeto Shared é responsável por conter as classes que são compartilhadas entre os projetos de domínio, API e cliente.
O cliente é uma aplicação Blazor WebAssembly, que é responsável por exibir as informações para o usuário e enviar as requisições para a API.
A API é uma Azure Function, que utiliza o padrão REST para expor os endpoints. É responsável por receber as requisições do cliente, validar os dados e chamar os serviços de domínio. Os serviços de domínio são responsáveis por realizar as regras de negócio e persistir os dados no banco de dados.
graph LR
A[Usuário] --> B[Web]
B --> C[API]
C --> D[Banco de Dados]
D --> C
C --> B
B --> A
sequenceDiagram
participant U as Usuário
participant S as Blazor WebAssembly (Web)
participant R as Azure Function (API)
participant D as Banco de Dados
U ->> S: Entra no site
S ->> R: Efetua uma requisição para a API
R ->> D: Efetua uma consulta no banco de dados
D ->> R: Retorna os dados da consulta
R ->> S: Retorna uma resposta
S ->> U: Exibe a resposta
sequenceDiagram
participant U as Usuário
participant S as Blazor WebAssembly (Web)
participant R as Azure Function (API)
participant D as SQL Server (DB)
U ->> S: Login
S ->> R: POST /api/usuario/login
R ->> D: SELECT * FROM Usuario WHERE Email = @Email AND Senha = @Senha
D ->> R: Retorna o usuário se encontrado
R ->> S: 200 OK
S ->> U: Login efetuado com sucesso
classDiagram
class TransacaoTipo{
<<enumeration>>
Unica
Parcelada
}
class OperacaoTipo{
<<enumeration>>
Receita
Despesa
}
class MeioPagamentoTipo{
<<enumeration>>
CartaoDeCreditoEntityDeCredito
ContaCorrente
}
class ContaTipo{
<<enumeration>>
Corrente
Poupanca
Investimento
Carteira
}
class Categoria{
<<enumeration>>
Alimentacao
Casa
Educacao
Eletronicos
Investimentos
Lazer
Outros
Presente
Salario
Saude
Servico
Supermercado
Transporte
Vestuario
Viagem
}
class BandeiraCartao{
<<enumeration>>
Visa
Mastercard
Elo
AmericanExpress
Hipercard
}
class Banco{
<<enumeration>>
BancoDoBrasil
Bradesco
Inter
Itau
Nubank
Santander
C6
Caixa
}
class BaseEntity{
Id: Guid
}
class BaseDataEntity{
CriadoEm: DateTime
UltimaAtualizacaoEm: DateTime
}
class UsuarioEntity{
Nome: String
Email: String
SenhaHash: String
Transacoes: List~TransacaoEntity~
ContasCorrente: List~ContaEntity~
HashSenha(String senha) void
SenhaValida(String senha) bool
}
class TransacaoEntity{
Descricao: String
Observacao: String?
Valor: Decimal
DataEfetivacao: DateTime
DataTransacao: DateTime
TipoOperacao: OperacaoTipo
TipoTransacao: TransacaoTipo
MeioPagamento: MeioPagamentoTipo
Categoria: Categoria
ReferenciaParcelaId: Guid?
ParcelaAtual: Int?
NumeroParcelas: Int?
Usuario: UsuarioEntity
Conta: ContaEntity
}
class ContaEntity{
Saldo: Decimal
Banco: Banco
Descricao: String
Tipo: ContaTipo
Usuario: UsuarioEntity
Transacoes: List~TransacaoEntity~
}
%% Relacionamentos:
UsuarioEntity --|> BaseDataEntity
TransacaoEntity --|> BaseDataEntity
ContaEntity --|> BaseDataEntity
BaseDataEntity --|> BaseEntity
erDiagram
ContaEntity{
uniqueidentifier Id PK "NOT NULL"
datetime2 CriadoEm "NOT NULL"
datetime2 UltimaAtualizacaoEm "NOT NULL"
nvarchar(max) Descricao "NOT NULL"
nvarchar(max) Banco "NOT NULL"
decimal Saldo "NOT NULL"
nvarchar(max) Tipo "NOT NULL"
uniqueidentifier UsuarioId FK "NOT NULL"
}
UsuarioEntity{
uniqueidentifier Id PK "NOT NULL"
datetime2 CriadoEm "NOT NULL"
datetime2 UltimaAtualizacaoEm "NOT NULL"
nvarchar(max) Nome "NOT NULL"
nvarchar(max) Email UK "NOT NULL"
nvarchar(max) SenhaHash "NOT NULL"
}
TransacaoEntity{
uniqueidentifier Id PK "NOT NULL"
datetime2 CriadoEm "NOT NULL"
datetime2 UltimaAtualizacaoEm "NOT NULL"
nvarchar(max) Descricao "NOT NULL"
nvarchar(max) Observacao "NULL"
decimal Valor "NOT NULL"
datetime2 DataEfetivacao "NULL"
datetime2 DataTransacao "NOT NULL"
nvarchar(max) TipoOperacao "NOT NULL"
nvarchar(max) TipoTransacao "NOT NULL"
nvarchar(max) MeioPagamento "NOT NULL"
nvarchar(max) Categoria "NOT NULL"
uniqueidentifier ReferenciaParcelaId "NULL"
int ParcelaAtual "NULL"
int NumeroParcelas "NULL"
uniqueidentifier UsuarioId FK "NOT NULL"
uniqueidentifier ContaId FK "NOT NULL"
}
%%Relacionamentos:
UsuarioEntity ||--|{ ContaEntity : possui
UsuarioEntity ||--|{ TransacaoEntity : possui
ContaEntity ||--|{ TransacaoEntity : possui