POC de uma aplicação de domínio financeiro.

Overview

Financial

Minimum Kotlin Version

Overview

A ideia deste projeto é aplicar o conteúdo estudado sobre Clean Architecture, Hexagonal Architecture, Domain-Driven Design, Event Sourcing, CQRS e Kafka.

Domínio

O domínio da aplicação é financial, que possui um subdomínio accounting. Dentro do subdomínio, temos dois contextos, account e bookkeeping.

Representação do domínio.
Representação do domínio.

Accounting

O Accounting (contabilidade) é o processo de registro de transações financeiras pertencentes a uma empresa.

Account

O contexto de account nada mais é do que uma conta contábil, que contém contas nas quais as informações sobre as transações de débitos e créditos são classificadas e resumidas.

Bookkeeping

O contexto de bookkeeping é o registro das transações financeiras, e envolve a preparação de documentos de origem para todas as transações, operações e outros eventos de uma empresa. As transações incluem compras, vendas, recebimentos e pagamentos por uma pessoa individual ou uma organização.

Arquitetura

A arquitetura da aplicação está dividida em alguns pilares, os quais delimitam os contextos.

Arquitetura do Financial.
Arquitetura do Financial.

Fluxo da aplicação.
Fluxo da aplicação.

  • Command

    Um comando é uma ordem para execução de algum caso de uso de negócio, eles geralmente resultam em eventos sendo emitidos.

  • Core

    É o núcleo da aplicação. Os objetos desta camada contém a lógica para manipular os casos de uso, que são específicos do próprio domínio. O core é independente dos processos de negócio que acionam essa lógica, são independentes e desconhecem completamente outras camadas.

  • Driven

    No driven estão os adaptadores de acionamento, os quais implementam as interfaces de saída da aplicação. Isso permite que o núcleo da aplicação exponha funcionalidades para o exterior.

  • Driver

    No driver estão os adaptadores primários que envolvem uma porta e a usam para informar ao core o que fazer. Eles traduzem tudo o que vem de um mecanismo de entrega em uma chamada de método no core.

  • Query

    Implementações das recuperações dos modelos de leitura.

Organização da aplicação

De forma geral, a aplicação está separada em quatro módulos:

application
┣ 📂account
┣ 📂bookkeeping
┣ 📂shared
┗ 📂starter

Account: Possui a lógica/regra de negócio do contexto de account.

Bookkeeping: Possui a lógica/regra de negócio do contexto de bookkeeping.

Shared: Possui implementações e interfaces comuns, que não detém lógica/regra de negócio. O conteúdo desse módulo pode ser convertido em várias bibliotecas.

Starter: Possui a inicialização dos componentes de plataforma usados pela aplicação, e as configurações de dependências da aplicação.

Casos de uso

Bookkeeping

No contexto de bookkeeping, quando uma operação contábil é registrada a partir de um comando RegisterFinancialTransaction, então um evento de TransactionRegistered ocorre, e é registrado no tópico financial.accounting.bookkeeping.transaction-registered. Apenas transações com valores maiores que R$ 0,00 são registradas.

O streaming dos dados é realizado usando o Kafka, onde foi utilizado o método de CDC, implementando uma abordagem utilizando logs.

Fluxo de CDC com o Kafka.
Fluxo de CDC com o Kafka.

Account

No contexto de account, uma política reage ao evento TransactionRegistered emitido pelo contexto de bookkeeping, o que resulta em um comando AdjustBalance, que faz a atualização dos saldos das contas.

Fluxo de produção e consumo do evento.
Fluxo de produção e consumo do evento.

Instalação

Repositório

Para clonar o repositório usando a linha de comando, execute:

> git clone https://github.com/gustavofreze/financial.git

Configuração

Verifique se algum processo usa as portas: 2181, 5432, 8080, 8081, 8083, 9000, 9001 e 9021. Se alguma das portas descritas estiver em uso, ela deve ser “liberada”.

Para instalar e configurar o projeto, execute na raiz do projeto:

> make configure

Roadmap

Verificando o ambiente

Para executar os casos de uso, basta estar com o ambiente docker inicializado.

Você pode conferir executando:

> docker ps --format "table {{.Names}}\t{{.Status}}"

Containers inicializados.
Containers inicializados.

E posteriormente verifique a aplicação executando:

> docker logs -f app

Aplicação pronta para executar os casos de uso.
Aplicação pronta para executar os casos de uso.

Executando os casos de uso

O primeiro comando a ser executado, pertence ao contexto de account. O comando ShowBalance exibe o saldo de todas as contas.

> make show-balance

Saldo inicial das contas.
Saldo inicial das contas.

O segundo comando a ser executado, pertence ao contexto de bookkeeping. O comando RegisterFinancialTransaction registra uma transação financeira.

> make register-financial-transaction

Transação financeira registrada.
Transação financeira registrada.

Após o comando RegisterFinancialTransaction ter sido executado, um evento TransactionRegistered é gerado, e enviado para o tópico no Kafka, através do processo de CDC, conforme explicado anteriormente.

No contexto de account, a política irá reagir ao evento TransactionRegistered, o que resulta na execução do comando AdjustBalance. O saldo é atualizado realizando uma operação de débito e crédito respectivamente. Mesmo se uma conta estiver com saldo de R$ 0,00 ou negativo, a operação é realizada.

Para conferir se o saldo foi atualizado, basta executar novamente o comando ShowBalance.

> make show-balance

Saldo atualizado das contas.
Saldo atualizado das contas.

Ainda no contexto de account, caso ocorra uma falha ao executar uma política, o evento desta política vai para uma fila de solução de problemas, de forma que é possível tentar novamente sua execução.

Essa fila de solução de problemas, é uma junção dos conceitos de troubleshooting e DLQ.

Para demonstrar na prática, existe um registro previamente registrado na fila troubleshooting. Para executar a política novamente a partir da fila de troubleshooting, é necessário executar o comando SolveFailures.

> make solve-failures

Execução da fila de troubleshooting.
Execução da fila de troubleshooting.

Com a política de atualizar saldo executada, o saldo das contas foi mais uma vez atualizado.

Para conferir se o saldo foi atualizado, basta executar novamente o comando ShowBalance.

> make show-balance

Saldo atualizado das contas, após a execução da política na fila de troubleshooting.
Saldo atualizado das contas, após a execução da política na fila de troubleshooting.

Testes

  • Executa todos os testes:

    > make test
  • Executa os testes unitários:

    > make unit-test
  • Executa os testes de integração:

    > make integration-test

Úteis

  • Para todos os containers do projeto:

    > make stop
  • Remove todos os containers e networks criados pelo projeto:

    > make clean
  • Remove todos os containers, networks e imagens criados pelo projeto:

    > make clean-all
You might also like...
Desenvolvimento de uma API utilizando SpringBoot + Kotlin com o intuito de cadastro de Vingadores.

Avengers API - Curso de introdução á Arquitetura Hexagonal com Spring Boot e Kotlin Desenvolvimento de uma API utilizando SpringBoot + Kotlin com o in

Uma biblioteca completa e performática para destacar trechos de textos usando Spannable com Expressões Regulares (Regex) para Android.

Highlight Uma biblioteca completa e performática para destacar trechos de textos usando Spannable com Expressões Regulares (Regex) para Android totalm

Aplicativo simples de piadas do Chuck Norris fazendo o consumo de uma API com Retrofit.
Aplicativo simples de piadas do Chuck Norris fazendo o consumo de uma API com Retrofit.

Chuck-Norris-API-Android Aplicativo simples de piadas do Chuck Norris fazendo o consumo de uma API com Retrofit. A API NÃO FOI CRIADA POR MIM! Disponí

Uma máscara personalizável para EditText, que pode ser adicionada como um TextWatcher.

Custom-Mask-for-EditText 🎭 ( Máscara personalizável para EditTexts!) Uma máscara customizável que pode ser adicionada aos seus EditTexts, e adaptada

API que converte uma planilha do excel para o banco de dados, utilizando Kotlin + Spring.

API Excel2DB 📈 Uma API que tem como objetivo facilitar a carga de dados nos formatos .xlsx ou .xls para um banco de dados. Nessa situação, como o foc

Resoluções a problemas e desafios comuns da plataforma Android, que todo desenvolvedor profissional cedo ou tarde irá enfrentar e deveria ter visto, ao menos, uma única vez na vida!
Resoluções a problemas e desafios comuns da plataforma Android, que todo desenvolvedor profissional cedo ou tarde irá enfrentar e deveria ter visto, ao menos, uma única vez na vida!

Resoluções a problemas e desafios comuns da plataforma Android, que todo desenvolvedor profissional cedo ou tarde irá enfrentar e deveria ter visto, ao menos, uma única vez na vida!

Experimental Graphviz code generation POC built with Jetpack Compose compiler/runtime.
Experimental Graphviz code generation POC built with Jetpack Compose compiler/runtime.

Compose Dot Experimental proof of concept to generate GraphViz dot code via Jetpack Compose's tree management. Valid dot file content can be generated

POC of how you can animate LazyColumn insertions/deletions/moving

Animated LazyColumn/LazyRow POC of how you can animate LazyColumn/LazyRow insertions/deletions/moving Note, this is not production ready or a library,

Just a POC repo for using Kotlin continuations

This repository This is for now just a POC repo for using Kotlin continuations, but i plan on using this to make a general library for kotlin integrat

The application is a PoC that helps in identifying modern bankers, potentially malicious and remote controlling applications abusing Android AccessibilityService.

Motivation Project aims to help in: identifying keyloggers and events hijacking malicious applications such as Anubis/TeaBot, identifying a "fake bank

This is a dirty POC of a LazyColumn that supports swipe-to-dismiss and reordering

This is a dirty POC of a LazyColumn that supports swipe-to-dismiss and reordering. This solution is dirty because items are only really removed from the list after the removal animation has finished.

Mobile application for Decentralized ML POC: Spotify Recommendation

Mobile application for Decentralized ML POC: Spotify Recommendation This repo co

POC Simulate Backend Biometric Authentication with AIDL (client app/server app)

poc-simulate-bio-auth-aidl POC Simulate Backend Biometric Authentication with AIDL (client app/server app) #How to use Install server app and run Inst

Mobile application for Decentralized ML POC: Spotify Recommendation

Mobile application for Decentralized ML POC: Spotify Recommendation This repo contains mobile applications to perform training on Spotify listening hi

Android StrandHogg Task Injection POC

Android StrandHogg Task Injection POC This project demonstrates how StrandHogg task injection works.

ChartPOC - Chart POC-Android
ChartPOC - Chart POC-Android

ChartPOC Chart POC-Android Time Frame Bar Chart Component To use the component j

Poc-sealed-secrets - An alternative to store sensitive data in the template Secrets Kubernetes an encrypted way

POC Sealed Secrets Overview Proof of concept with the objective of showing an al

A POC for spring app using testng, cucumber, findbugs, and jacoco framework with failsafe and surefire plugins.

A POC for spring app using testng, cucumber, findbugs, and jacoco framework with failsafe and surefire plugins.

ML Kit & CameraX Reader POC
ML Kit & CameraX Reader POC

LeitorUnificadoPoc ML Kit & CameraX Reader POC Funcionalities description Barcode and QR Code reader Tech stack Minimum SDK level 21 Kotlin based + Co

Releases(1.0.0)
Owner
Gustavo Santos
Software Engineer in BoaCompra by PagSeguro.
Gustavo Santos
Desenvolvimento de uma API utilizando SpringBoot + Kotlin com o intuito de cadastro de Vingadores.

Avengers API - Curso de introdução á Arquitetura Hexagonal com Spring Boot e Kotlin Desenvolvimento de uma API utilizando SpringBoot + Kotlin com o in

Gian Felipe 0 Nov 8, 2021
Aplicativo simples de piadas do Chuck Norris fazendo o consumo de uma API com Retrofit.

Chuck-Norris-API-Android Aplicativo simples de piadas do Chuck Norris fazendo o consumo de uma API com Retrofit. A API NÃO FOI CRIADA POR MIM! Disponí

Marcos Lopes da Silva Junior 0 Nov 26, 2021
API que converte uma planilha do excel para o banco de dados, utilizando Kotlin + Spring.

API Excel2DB ?? Uma API que tem como objetivo facilitar a carga de dados nos formatos .xlsx ou .xls para um banco de dados. Nessa situação, como o foc

Francisco Angelo 1 May 14, 2022
Resoluções a problemas e desafios comuns da plataforma Android, que todo desenvolvedor profissional cedo ou tarde irá enfrentar e deveria ter visto, ao menos, uma única vez na vida!

Resoluções a problemas e desafios comuns da plataforma Android, que todo desenvolvedor profissional cedo ou tarde irá enfrentar e deveria ter visto, ao menos, uma única vez na vida!

Ricardo Ferreira 115 Jan 4, 2023
Just a POC repo for using Kotlin continuations

This repository This is for now just a POC repo for using Kotlin continuations, but i plan on using this to make a general library for kotlin integrat

Roman / Nea 0 Oct 29, 2021
A POC for spring app using testng, cucumber, findbugs, and jacoco framework with failsafe and surefire plugins.

A POC for spring app using testng, cucumber, findbugs, and jacoco framework with failsafe and surefire plugins.

null 0 Feb 1, 2022
Aplicação Micronaut GRPC utilizando Kotlin e arquitetura Hexagonal

micronaut-grpc-demo Aplicação Micronaut GRPC utilizando Kotlin e arquitetura Hexagonal #Baixando e configurando um container Postgres: Postgres: docke

Paulo César de Souza 0 Nov 15, 2021
Aplicação Mobile desenvolvida em Android utilizando Jetpack Compose

DevHub - Compose ?? Aplicação Mobile desenvolvida em Android utilizando Jetpack Compose Sobre o projeto ?? Esse projeto foi desenvolvido durante o eve

Carlos Henrique 3 Jul 1, 2022
Botão que ao clique longo, carrega uma animação que o preenche lateralmente

Botão que ao clique longo, carrega uma animação que o preenche lateralmente

David Castro 4 Sep 26, 2022
Aplicativo Studio Ghibli apresenta uma filmes do studio de animação japonesa Ghibli.

App-Studio-Ghibli Aplicativo Studio Ghibli para Android, apresenta os filmes e personagens do studio de animação japonesa Ghibli. Recursos Base de dad

Agatha Monfredini de Paula Faria 0 Nov 5, 2021