|
1 | | -# Sistema de Compra Programada de Ações |
| 1 | +# Compra Programada – Itaú Corretora |
2 | 2 |
|
3 | | -**Itaú Corretora** – Desafio Técnico | Arquitetura **Microsserviços** |
| 3 | +Sistema de compra programada (carteira Top Five) em **.NET 9**, **MySQL**, **Kafka**, integração **COTAHIST B3**. |
4 | 4 |
|
5 | | ---- |
6 | | - |
7 | | -## Visão Geral |
8 | | - |
9 | | -Sistema de compra programada que permite aos clientes aderir a um plano de investimento recorrente na carteira **Top Five** (5 ações recomendadas). Desenvolvido em **.NET 9**, **MySQL**, **Apache Kafka**, com integração ao arquivo **COTAHIST da B3**. |
10 | | - |
11 | | ---- |
12 | | - |
13 | | -## Arquitetura Microsserviços |
14 | | - |
15 | | -``` |
16 | | - ┌─────────────────────────────────────────────────────────┐ |
17 | | - │ API GATEWAY (YARP) │ |
18 | | - │ http://localhost:5000 │ |
19 | | - └───────────────────────────┬─────────────────────────────┘ |
20 | | - │ |
21 | | - ┌───────────────────┬───────────────────┼───────────────────┬───────────────────┐ |
22 | | - │ │ │ │ │ |
23 | | - ▼ ▼ ▼ ▼ ▼ |
24 | | -┌───────────────┐ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ |
25 | | -│ Clientes │ │ Admin │ │ Cotação │ │ Motor Compra │ │ Rebalanceamento│ |
26 | | -│ Service │ │ Service │ │ Service │ │ Service │ │ Service │ |
27 | | -│ :5001 │ │ :5002 │ │ :5003 │ │ :5004 │ │ :5005 │ |
28 | | -└───────┬───────┘ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ |
29 | | - │ │ │ │ │ |
30 | | - │ │ │ │ │ |
31 | | - ▼ ▼ ▼ ▼ ▼ |
32 | | - [MySQL] [MySQL] [MySQL] [MySQL] [MySQL] |
33 | | - clientes_db admin_db CotacaoDb motor_db rebalanceamento_db |
34 | | - │ │ │ │ │ |
35 | | - └──────────────────┴──────────────────┴──────────────────┴──────────────────┘ |
36 | | - │ |
37 | | - ▼ |
38 | | - ┌─────────────┐ |
39 | | - │ Kafka │ |
40 | | - │ :9092 │ |
41 | | - │ ir-dedo-duro│ |
42 | | - └─────────────┘ |
43 | | -``` |
44 | | - |
45 | | -### Responsabilidade dos Serviços |
46 | | - |
47 | | -| Serviço | Responsabilidade | API Base | |
48 | | -|---------|------------------|----------| |
49 | | -| **ApiGateway** | Roteamento reverso (YARP), único ponto de entrada | `/` | |
50 | | -| **Clientes.Service** | Adesão, saída, alterar valor mensal, consultar carteira, rentabilidade | `/api/clientes` | |
51 | | -| **Admin.Service** | Cesta Top Five (CRUD), histórico, custódia master | `/api/admin` | |
52 | | -| **Cotacao.Service** | Leitura/parse COTAHIST B3, cache de cotações, fechamento por ticker | `/api/cotacoes` | |
53 | | -| **MotorCompra.Service** | Execução da compra programada (dias 5, 15, 25), distribuição, ordens | `/api/motor` | |
54 | | -| **MotorCompra.Worker** | Job em background que dispara a compra nas datas configuradas | — | |
55 | | -| **Rebalanceamento.Service** | Rebalanceamento por mudança de cesta ou desvio de proporção | `/api/rebalanceamento` | |
56 | | - |
57 | | -### Comunicação |
| 5 | +## Arquitetura |
58 | 6 |
|
59 | | -- **Síncrona:** Cliente → Gateway → Serviços via HTTP/REST. |
60 | | -- **Assíncrona:** MotorCompra e Rebalanceamento publicam eventos de **IR** no **Kafka** (tópico `ir-dedo-duro`). |
| 7 | +- **ApiGateway (YARP)** – `:5000` – roteamento reverso |
| 8 | +- **Clientes.Service** – `:5001` – adesão, saída, valor mensal, carteira, rentabilidade |
| 9 | +- **Admin.Service** – `:5002` – cesta Top Five, histórico, custódia master |
| 10 | +- **Cotacao.Service** – `:5003` – COTAHIST, fechamento por ticker |
| 11 | +- **MotorCompra.Service** – `:5004` – execução compra (dias 5, 15, 25), distribuição |
| 12 | +- **Rebalanceamento.Service** – `:5005` – rebalanceamento por mudança de cesta ou desvio |
| 13 | +- **MotorCompra.Worker** – job em background (datas de execução) |
| 14 | +- **Kafka** – `:9092` – eventos IR (`ir-dedo-duro`, `ir-operacoes`) |
61 | 15 |
|
62 | | -### Banco de Dados (MySQL) |
63 | | - |
64 | | -Cada microsserviço pode usar um **database próprio** na mesma instância MySQL (ou instâncias separadas): |
65 | | - |
66 | | -- `clientes_db` – Clientes, ContasGraficas, Custodias (filhote) |
67 | | -- `admin_db` – CestasRecomendacao, ItensCesta |
68 | | -- `CotacaoDb` – Cache de cotações (COTAHIST) |
69 | | -- `motor_db` – OrdensCompra, Distribuicoes, ContaMaster, CustodiaMaster, ExecucaoCompras |
70 | | -- `rebalanceamento_db` – Rebalanceamentos, eventos de venda |
71 | | - |
72 | | ---- |
| 16 | +Cada serviço pode usar DB próprio no MySQL: `clientes_db`, `admin_db`, `CotacaoDb`, `motor_db`, `rebalanceamento_db`. |
73 | 17 |
|
74 | | -## Estrutura do Projeto |
| 18 | +## Estrutura |
75 | 19 |
|
76 | 20 | ``` |
77 | | -/ |
78 | | -├── src/ |
79 | | -│ ├── ApiGateway/ # YARP reverse proxy :5000 |
80 | | -│ ├── Shared/ |
81 | | -│ │ ├── Shared.Contracts/ # DTOs, eventos (Adesao, Cesta, EventoIR) |
82 | | -│ │ └── Shared.Kafka/ # IEventoIRPublisher, Kafka producer |
83 | | -│ └── Services/ |
84 | | -│ ├── Clientes.Service/ # API clientes :5001 |
85 | | -│ ├── Admin.Service/ # API admin :5002 |
86 | | -│ ├── Cotacao.Service/ # API cotações + parser COTAHIST :5003 |
87 | | -│ ├── MotorCompra.Service/ # API motor + orquestração :5004 |
88 | | -│ ├── MotorCompra.Worker/ # Background job dias 5/15/25 |
89 | | -│ └── Rebalanceamento.Service/# API rebalanceamento :5005 |
90 | | -├── cotacoes/ # Pasta padrão para COTAHIST (configurável no Cotacao.Service) |
91 | | -├── tests/ # Testes unitários e integração |
92 | | -├── Docs/ # Documentação do desafio |
93 | | -├── docker-compose.yml # MySQL + Kafka (+ Zookeeper) |
94 | | -├── CompraProgramada.sln |
95 | | -└── README.md |
| 21 | +src/ |
| 22 | +├── ApiGateway/ |
| 23 | +├── Shared/ (Shared.Contracts, Shared.Kafka) |
| 24 | +└── Services/ (Clientes, Admin, Cotacao, MotorCompra, MotorCompra.Worker, Rebalanceamento) |
| 25 | +cotacoes/ → arquivos COTAHIST (configurável) |
| 26 | +tests/ → CompraProgramada.Tests |
| 27 | +Docs/ → regras, contratos API, layout COTAHIST |
96 | 28 | ``` |
97 | 29 |
|
98 | | ---- |
99 | | - |
100 | | -## Pré-requisitos |
101 | | - |
102 | | -- .NET 9 SDK |
103 | | -- Docker e Docker Compose (MySQL, Kafka) |
104 | | -- Arquivos COTAHIST na pasta `cotacoes/` (download no site B3) |
105 | | - |
106 | | ---- |
107 | | - |
108 | | -## Como Rodar |
109 | | - |
110 | | -### 1. Subir infraestrutura |
| 30 | +## Rodar |
111 | 31 |
|
112 | 32 | ```bash |
113 | 33 | docker-compose up -d |
114 | | -``` |
| 34 | +# Criar DBs no MySQL (clientes_db, admin_db, CotacaoDb, motor_db, rebalanceamento_db) |
115 | 35 |
|
116 | | -Aguarde MySQL e Kafka estarem saudáveis. |
117 | | - |
118 | | -### 2. Criar databases (se usar um único MySQL) |
119 | | - |
120 | | -```bash |
121 | | -docker exec -it compraprogramada-mysql mysql -uroot -proot -e " |
122 | | -CREATE DATABASE IF NOT EXISTS clientes_db; |
123 | | -CREATE DATABASE IF NOT EXISTS admin_db; |
124 | | -CREATE DATABASE IF NOT EXISTS CotacaoDb; |
125 | | -CREATE DATABASE IF NOT EXISTS motor_db; |
126 | | -CREATE DATABASE IF NOT EXISTS rebalanceamento_db; |
127 | | -" |
128 | | -``` |
129 | | - |
130 | | -### 3. Restaurar dependências e rodar os serviços |
131 | | - |
132 | | -Use a solution **CompraProgramada.sln**: |
133 | | - |
134 | | -```bash |
135 | 36 | dotnet restore CompraProgramada.sln |
136 | 37 | dotnet build CompraProgramada.sln |
137 | 38 | ``` |
138 | 39 |
|
139 | | -Em terminais separados (ou via IDE): |
| 40 | +Subir cada serviço (ou via IDE): |
140 | 41 |
|
141 | 42 | ```bash |
142 | | -# Terminal 1 – Gateway |
143 | 43 | dotnet run --project src/ApiGateway |
144 | | - |
145 | | -# Terminal 2 – Clientes |
146 | 44 | dotnet run --project src/Services/Clientes.Service |
147 | | - |
148 | | -# Terminal 3 – Admin |
149 | 45 | dotnet run --project src/Services/Admin.Service |
150 | | - |
151 | | -# Terminal 4 – Cotação |
152 | 46 | dotnet run --project src/Services/Cotacao.Service |
153 | | - |
154 | | -# Terminal 5 – Motor |
155 | 47 | dotnet run --project src/Services/MotorCompra.Service |
156 | | - |
157 | | -# Terminal 6 – Rebalanceamento |
158 | 48 | dotnet run --project src/Services/Rebalanceamento.Service |
159 | | - |
160 | | -# (Opcional) Worker do motor |
161 | | -dotnet run --project src/Services/MotorCompra.Worker |
| 49 | +# opcional: dotnet run --project src/Services/MotorCompra.Worker |
162 | 50 | ``` |
163 | 51 |
|
164 | | -### 4. Acessar |
165 | | - |
166 | | -- **Gateway (todas as APIs):** http://localhost:5000 |
167 | | -- **Exemplos:** |
168 | | - - `GET http://localhost:5000/api/clientes/1/carteira` |
169 | | - - `GET http://localhost:5000/api/admin/cesta/atual` |
170 | | - - `POST http://localhost:5000/api/motor/executar-compra` |
171 | | - |
172 | | -Swagger/OpenAPI em cada serviço (quando habilitado) em `http://localhost:500X/swagger`. |
173 | | - |
174 | | ---- |
175 | | - |
176 | | -## Decisões Técnicas |
177 | | - |
178 | | -- **Gateway:** YARP para roteamento reverso leve e configurável. |
179 | | -- **Microsserviços:** um serviço por bounded context (clientes, cesta, cotação, motor, rebalanceamento). |
180 | | -- **Kafka:** um tópico para eventos de IR (dedo-duro e IR venda), consumível por sistemas fiscais. |
181 | | -- **B3:** integração via arquivo COTAHIST (layout posicional 245 caracteres); parser no **Cotacao.Service**. |
182 | | -- **Database:** MySQL por serviço (ou databases separados na mesma instância) para evolução independente. |
183 | | - |
184 | | ---- |
| 52 | +APIs via Gateway: `http://localhost:5000` (ex.: `GET /api/clientes/1/carteira`, `POST /api/motor/executar-compra`). |
185 | 53 |
|
186 | 54 | ## CI/CD |
187 | 55 |
|
188 | | -O projeto inclui pipelines **GitHub Actions** para integração e entrega contínuas. |
189 | | - |
190 | | -### CI (`.github/workflows/ci.yml`) |
191 | | - |
192 | | -- **Trigger:** push e pull requests em `main`, `master`, `develop`. |
193 | | -- **Jobs:** |
194 | | - - **Build:** restore + build em Release. |
195 | | - - **Test:** testes com xUnit, cobertura (Coverlet), relatório TRX e ReportGenerator; artefatos de cobertura e resultados de teste; report de testes em PRs. |
196 | | - - **Format check:** `dotnet format --verify-no-changes`. |
197 | | - - **Security:** listagem de pacotes vulneráveis (`dotnet list package --vulnerable`). |
198 | | -- **Cache:** NuGet em `~/.nuget/packages` por hash dos `.csproj`. |
199 | | -- **Cobertura:** mínimo de 70% (configurável por `MIN_COVERAGE`); relatório em HTML/Summary/Badges. |
| 56 | +- **ci.yml** – build, testes (xUnit + Coverlet), format check, segurança; cobertura mínima 70% (coverlet.runsettings). |
| 57 | +- **cd.yml** – build e push de imagens Docker para ghcr.io. |
| 58 | +- **security.yml** – CodeQL, dependency review. |
| 59 | +- **dependabot.yml** – atualizações NuGet e Actions. |
200 | 60 |
|
201 | | -### CD (`.github/workflows/cd.yml`) |
| 61 | +## Docs |
202 | 62 |
|
203 | | -- **Trigger:** push em `main`/`master`, tags `v*`, e `workflow_dispatch`. |
204 | | -- **Jobs:** build e push de imagens Docker para **GitHub Container Registry** (`ghcr.io`): |
205 | | - - `compraprogramada-api-gateway` |
206 | | - - `compraprogramada-clientes` |
207 | | - - `compraprogramada-admin` |
208 | | - - `compraprogramada-cotacao` |
209 | | - - `compraprogramada-motor` |
210 | | - - `compraprogramada-motor-worker` |
211 | | - - `compraprogramada-rebalanceamento` |
212 | | -- **Versão:** tags `v*` ou `sha-<commit>`. |
213 | | -- **Cache:** Docker layer cache (GitHub Actions cache). |
214 | | - |
215 | | -### Security (`.github/workflows/security.yml`) |
216 | | - |
217 | | -- **CodeQL:** análise estática em C# (push em `main`/`master`, PRs, agendamento semanal). |
218 | | -- **Dependency review:** revisão de dependências em PRs. |
219 | | - |
220 | | -### Dependabot (`.github/dependabot.yml`) |
221 | | - |
222 | | -- Atualizações semanais (segunda-feira) para NuGet e GitHub Actions. |
223 | | -- Agrupamento de pacotes Microsoft/xunit/coverlet; limite de 5 PRs abertos. |
224 | | - |
225 | | -### Rodar localmente (equivalente ao CI) |
226 | | - |
227 | | -```bash |
228 | | -dotnet restore CompraProgramada.sln |
229 | | -dotnet build CompraProgramada.sln -c Release |
230 | | -dotnet test CompraProgramada.sln -c Release --collect:"XPlat Code Coverage" --results-directory ./TestResults |
231 | | -``` |
| 63 | +`Docs/` – desafio técnico, regras de negócio, layout COTAHIST, exemplos de contratos API. |
232 | 64 |
|
233 | 65 | --- |
234 | 66 |
|
235 | | -## Documentação do Desafio |
236 | | - |
237 | | -Regras de negócio, layout COTAHIST, contratos de API e diagramas estão em **Docs/**: |
238 | | - |
239 | | -- `desafio-tecnico-compra-programada.md` |
240 | | -- `regras-negocio-detalhadas.md` |
241 | | -- `layout-cotahist-b3.md` |
242 | | -- `exemplos-contratos-api.md` |
243 | | -- `glossario-compra-programada.md` |
244 | | -- Diagramas ER, sequência e negócios (drawio) |
245 | | - |
246 | | ---- |
247 | | - |
248 | | -## Licença |
249 | | - |
250 | 67 | Desafio técnico – Itaú Corretora. |
0 commit comments