Skip to content

maikkkko1/elixir-financial-system

Repository files navigation

Elixir Financial System Actions Status Coverage Status

Projeto de um sistema financeiro desenvolvido utilizando Elixir para o desafio da Tech Challenge da Stone.

Sobre

O objetivo deste projeto é ser um sistema financeiro capaz de disponibilizar diversas operações financeiras, como:

  • Depósitos em conta;
  • Saques de contas;
  • Transferências entre contas;
  • Split de transações entre diversas contas;
  • Câmbio de valores monetários;

Todas as operações acima estão em conformidade com a ISO 4217

Solução

Para atender o que foi proposto e eliminar os problemas com aritmética dos pontos flutuantes, todos os valores foram encodificados em valores inteiros, por exemplo a representação do valor 10,00 seria 1000, sem os pontos.

Exemplos de como os valores são representados:

  • 10,00 = 1000
  • 100,00 = 10000
  • 1,00 = 100
  • 5,50 = 550
  • 0,10 - 10
  • 0,01 - 1

Para a persistência de dados foi utilizado o SQLite3.

Também além do sistema utilizavel pelo shell interativo do Elixir(IEX), também foi desenvolvida uma API Rest capaz de realizar todas as mesmas operações que o shell interativo via requisições HTTP.

Dependências

  • sqlite_ecto2 - Adaptador para utilização do banco de dados SQLite3.
  • Tesla - Cliente HTTP utilizado para realizar as requisições.
  • ExDoc - Utilizado para gerar a documentação completa do projeto.
  • Cowboy - Client HTTP utilizado para servir a API Rest.
  • Poison - JSON Parser utilizado para realizar o encode/decode das requisições HTTP.
  • Money - Biblioteca para trabalhar com dinheiro.
  • ExCoveralls - Ferramenta utilizada para cobertura de testes.

Instalação

Para iniciarmos, o primeiro passo caso ainda não possua o Elixir instalado, é realizar a instalação do mesmo.

O guia oficial pode ser seguido para realizar a instalação: Guia Oficial de Instalação

Após ter realizado a instalação, clone o repositório e então na raiz do projeto, instale todas as dependências com o comando:

mix deps.get

Com o sucesso deste comando, todas as dependências para o projeto funcionar devem estar instaladas.

O último passo é criar o banco de dados e seu esquema, para isso execute o comando:

mix ecto.migrate

Utilização

Existem duas formas de utilização do sistema, pelo IEX ou via API.

Utilizando pelo IEX

Primeiramente abra o terminal na raiz do projeto e acesse o IEX com o comando:

iex -S mix

Após esse comando, você deve estar dentro do IEX e então agora conseguimos utilizar todas as funcionalidades do nosso sistema financeiro.

Todas as operações necessitam de uma conta existente e se baseiam no número ou ID da conta.

Operações de conta

Não são permitidas contas com o mesmo número de conta, este é um campo de indíce único.

# Criar uma conta com os seguintes dados: Nome: Maikon, Numero: 1234, Agência: 1111, Moeda: BRL e Saldo: 10,00.
iex(1)> AccountService.create_account("Maikon", 1234, 1111, "BRL", 1000)

# Atualizar uma conta pelo seu ID do banco de dados.
iex(1)> AccountService.update_account_by_id(1, %{name: "Nome atualizado", currency: "USD"})

# Retornar o saldo formatado de uma conta pelo seu número.
iex(1)> AccountService.get_account_balance_by_number(1234)

# Retornar todos os dados de uma conta pelo seu número.
iex(1)> AccountService.get_account_by_number(1234)

# Retornar todos os dados de uma conta pelo seu ID do banco de dados.
iex(1)> AccountService.get_account_by_id(1)

# Retornar todas as contas do banco de dados.
iex(1)> AccountService.get_all_accounts()

Operações financeiras e transações

Todos os valores devem ser representados por números inteiros como descrito na seção Solução.

Todas as operações realizam o câmbio de valores em sua execução, com excessão da operação de split.

Todas as operações financeiras são também transações, por esse motivo todas operações geram registros de transações no banco de dados de acordo com o tipo de operação

# Realizar um depósito na conta número 1234, na moeda "BRL" e no valor de 25,00. 
# Considerar que a conta 1234 possuí a moeda BRL.
iex(1)> TransactionService.deposit(1234, "BRL", 2500) # Sem câmbio pois a moeda é a mesma da conta.
iex(1)> TransactionService.deposit(1234, "USD", 2500) # Com câmbio pois a moeda é diferente da conta.

# Realizar um saque na conta número 1234, na moeda "BRL" e no valor de 12,50.
# Considerar que a conta 1234 possuí a moeda BRL.
iex(1)> TransactionService.withdraw(1234, "BRL", 2500) # Sem câmbio pois a moeda é a mesma da conta.
iex(1)> TransactionService.withdraw(1234, "USD", 2500) # Com câmbio pois a moeda é diferente da conta.

# Realizar uma transferência da conta número 1234, no valor de 200,33 para a conta número 4321.
# Caso as duas contas possuam moedas diferentes, será realizado o câmbio dos valores antes da efetivação.
iex(1)> TransactionService.transfer(1234, 4321, 20033)

# Realizar o split de uma transação no valor de 500,00 entre duas contas.
# O calculo da porcentagem de todas as contas deve ser igual a 100%.
split_details = [
  %{account_number: 1234, percentage: 25},
  %{account_number: 4321, percentage: 75}
]

iex(1)> TransactionService.split(split_details, 50000)

# Retornar todas as transações do banco de dados.
iex(1)> TransactionService.get_all_transactions()

Câmbio de moedas

No caso do câmbio de valores, os valores devem ser informados no formato float.

# Realizar o câmbio de valores entre BRL e USD no valor de 10,00.
iex(1)> CurrencyService.handle_conversion("BRL", "USD", 10.00)

Utilizando pela API

Para realizar o teste das requisições é recomendado a utilização dos clientes REST Insomnia ou Postman.

No momento nenhuma requisição necessita de autenticação.

Antes de realizar as requisições para a API, é necessário iniciar o servidor HTTP com o comando:

mix run --no-halt

Agora com o servidor HTTP online, podem ser realizadas as requisições.

A documentação completa de todas as rotas disponíveis pela API está disponível no Postman pelo link:

Documentação da API

Testes

O projeto possuí tanto testes de unidade como testes de cobertura.

Para rodar os testes sem os detalhes de cobertura, no terminal e na raiz do projeto, execute o comando:

MIX_ENV=test mix test

Para rodar com os detalhes de cobertura:

MIX_ENV=test mix coveralls

Também é possivel gerar um relatório HTML de cobertura que estará disponível na pasta cover/:

MIX_ENV=test mix coveralls.html

Integração Contínua

Para a integração contínua, foi utilizado o Github Actions, a configuração utilizada está disponível no arquivo elixir.yml no diretório .github/workflows.

Padronização de código

Utilizando o comando mix format é possivel garantir que a base de código esteja de acordo com os padrões do Elixir.

Documentação

Utilizando o comando mix docs é possivel gerar a documentação completa do projeto, que estará disponível nos arquivos HTML no diretório /doc.

Referências

About

Projeto de um sistema financeiro desenvolvido utilizando Elixir para o desafio Tech Challenge da Stone. https://github.com/stone-payments/tech-challenge

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages