/MyCoreBanking

personal financial control system

Primary LanguageC#

MyCoreBanking

Sobre

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.


Versões

  • 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"

Pré-requisitos para rodar o projeto

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.



Tecnologias utilizadas

  • Framework: .NET 6.0
  • API: Azure Functions 4.0
  • Web: Blazor WebAssembly
  • ORM: Entity Framework Core 6.0
  • Database: SQL Server 2022

Bibliotecas utilizadas

Comuns (Shared)

Back-end

  • BCrypt.Net - Criptografia de senhas
  • JWT - Autenticação via token

Front-end


Funcionalidades

Usuário

  • Cadastro
  • Login
  • Ver perfil
  • Alteração

Contas

  • 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

Transações

  • 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

Estatísticas financeiras

  • 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)

Arquitetura

Shared

O projeto Shared é responsável por conter as classes que são compartilhadas entre os projetos de domínio, API e cliente.

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.

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.


Diagrama de contexto

graph LR
    A[Usuário] --> B[Web]
    B --> C[API]
    C --> D[Banco de Dados]
    D --> C
    C --> B
    B --> A

Diagrama de sequência

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

Exemplo diagrama de sequência no fluxo de login

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


Diagrama de classe

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

Diagrama entidade-relacionamento

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