# Monetarie SPB - Analise Completa de GAPs
## Data: 2026-02-07
## Status: TODOS OS GAPS RESOLVIDOS

> **NOTA**: Este documento foi o diagnostico inicial. Todos os gaps listados abaixo foram resolvidos.
> Veja `2026-02-07-deployment-complete.md` para o estado final com todas as 5 camadas operacionais.

---

## REGRA FUNDAMENTAL
**NAO E PERMITIDO DADOS MOCK NESSE SISTEMA.**
Qualquer dado exibido no frontend DEVE vir da API real, que consulta o banco de dados real.

---

## 1. ESTADO DA INFRAESTRUTURA

### 1.1 Cloud SQL
- **Instancia**: `fluxiq-pg-dev` (PostgreSQL 16, `10.140.241.2`)
- **Database**: `spb_dev` existe
- **Status**: RUNNABLE

### 1.2 GKE (namespace: spb)
| Pod | Status | Problema |
|-----|--------|----------|
| spb-backend (x2) | Running | SEM conexao ao banco |
| spb-frontend (x2) | Running | Login nao funciona |
| spb-docs (x1) | Running | OK |
| spb-simulator (x1) | Running | OK |

### 1.3 BLOQUEADOR #1: Cloud SQL Proxy Sidecar
- **Problema**: O `runtime.exs` aponta para `127.0.0.1:5432` (Cloud SQL Proxy), mas o deployment `spb-backend` NAO tem o sidecar
- **Evidencia**: Logs mostram `tcp connect (127.0.0.1:5432): connection refused - :econnrefused`
- **Referencia**: `pix-backend` usa `gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.8.2` com args `--structured-logs --private-ip --port=5432 fluxiqbr:southamerica-east1:monetarie-pg-dev`
- **FIX**: `kubectl patch` para adicionar Cloud SQL Proxy sidecar identico ao PIX

### 1.4 Env Vars Faltantes no spb-backend
Atual:
```
PORT=4000
PHX_HOST=spbapi-dev.fluxiq.com.br
NATS_URL=nats://10.10.40.5:4222
SECRET_KEY_BASE=MonetarieSPBDev2026...
PHX_SERVER=true
```

Faltando (comparado com PIX):
```
DATABASE_URL=ecto://postgres:<pass>@127.0.0.1:5432/spb_dev  (via Secret)
JWT_SECRET=<valor>
CORS_ORIGINS=https://spbadmin-dev.fluxiq.com.br,https://spbapi-dev.fluxiq.com.br
```

---

## 2. ESTADO DO BANCO DE DADOS

### 2.1 SQL Migrations Disponiveis
| Arquivo | Tabelas Criadas |
|---------|----------------|
| `modern_schema.sql` | institutions, users, accounts, payment_requests, bacen_messages, webhook_configs, message_templates, api_keys, system_config, sessions, audit_logs, dlq_entries (12 tabelas) |
| `comprehensive_bacen_schema.sql` | + str_transfers, lpi_operations, debit_authorizations, forex_operations, securities_operations, settlements, cash_operations, custody_operations, fixed_income_operations, other_operations, message_state_history (11 tabelas adicionais) |
| `005_reference_tables.sql` | bacen_holidays, bacen_operating_schedule, bacen_error_codes |
| `alter_existing_tables.sql` | Alters para colunas faltantes |

**TOTAL SQL disponivel: ~26 tabelas**

### 2.2 Ecto Migrations (services/bacen_gateway/priv/repo/migrations/)
| Migration | Tabela |
|-----------|--------|
| 20260130_create_dlq_entries.exs | dlq_entries |
| 20260201_create_bacen_error_codes.exs | bacen_error_codes |
| 20260201_create_bacen_messages.exs | bacen_messages |
| 20260202_add_bacen_message_fields.exs | alter bacen_messages |
| 20260202_create_financial_institutions.exs | financial_institutions |
| 20260205_create_message_templates.exs | message_templates |

**APENAS 6 Ecto migrations** — NENHUMA roda porque o backend nao conecta ao banco.

### 2.3 GAP: Ecto vs SQL
As Ecto migrations criam tabelas com nomes DIFERENTES das SQL migrations:
- Ecto: `financial_institutions` vs SQL: `institutions`
- Ecto: `bacen_messages` (com UUID pk) vs SQL: `bacen_messages` (com SERIAL pk)

**Decisao necessaria**: Usar as SQL migrations (comprehensive) como base OU reescrever Ecto migrations alinhadas.

### 2.4 Tabelas que Controllers Esperam mas NAO Existem em Ecto
| Controller | Tabelas Necessarias | Existe SQL? | Existe Ecto? |
|------------|-------------------|-------------|-------------|
| OperationsController | str_transfers, lpi_operations, settlements, sme_operations, cir_operations, slb_operations, status_transitions, audit_logs | Parcial | NAO |
| AlcadasController | alcadas (create on-the-fly) | NAO | NAO |
| VistosController | vistos (create on-the-fly) | NAO | NAO |
| ClearingsController | clearings | NAO | NAO |
| TariffsController | bacen_tariffs | NAO | NAO |
| MessageTemplatesController | message_templates | SIM | SIM |
| MessageGroupsController | message_groups | NAO | NAO |
| OperationStatusesController | operation_statuses, status_transitions | NAO | NAO |
| ReportsController | audit_logs, bacen_messages, str_transfers, lpi_operations, bacen_error_codes | Parcial | Parcial |
| SettingsController | system_settings (create on-the-fly) | NAO (system_config similar) | NAO |

---

## 3. ESTADO DO BACKEND (Router vs Controllers)

### 3.1 Router Atual (router.ex)
```
GET  /health                    -> HealthController.health
GET  /ready                     -> HealthController.ready
GET  /api/health                -> HealthController.health
GET  /api/ready                 -> HealthController.ready
GET  /api/messages              -> MessagesController.index
GET  /api/messages/:id          -> MessagesController.show
POST /api/messages              -> MessagesController.create
PUT  /api/messages/:id          -> MessagesController.update
DEL  /api/messages/:id          -> MessagesController.delete
GET  /api/messages/categories   -> MessagesController.categories
GET  /api/messages/states       -> MessagesController.states
GET  /api/stats/by-state        -> StatsController.by_state
GET  /api/stats/by-category     -> StatsController.by_category
```

**Total: 13 rotas mapeadas**

### 3.2 Controllers Existentes SEM Rota
| Controller | Endpoints Implementados | Tabelas |
|------------|------------------------|---------|
| OperationsController | index, show, create, update_state, send_to_clearing, cancel, retry | str_transfers, lpi_operations, settlements |
| AlcadasController | index, create, update, delete | alcadas (auto-create) |
| VistosController | index, approve, reject, batch | vistos (auto-create) |
| ClearingsController | index, show | clearings |
| TariffsController | index, calculate | bacen_tariffs |
| MessageTemplatesController | index, show | message_templates |
| MessageGroupsController | index | message_groups |
| OperationStatusesController | index, transitions | operation_statuses |
| FunctionalitiesController | index | Nenhuma (static data) |
| ReportsController | audit_log, message_movement, reserve_statement, message_stats | audit_logs, bacen_messages, str_transfers |
| SettingsController | index, update | system_settings (auto-create) |

**Total: ~30 endpoints implementados mas NAO mapeados no router**

### 3.3 Controllers que NAO EXISTEM (Frontend espera)
| Endpoint Frontend | Controller | Status |
|-------------------|-----------|--------|
| POST /api/auth/login | AuthController | **NAO EXISTE** |
| POST /api/auth/verify | AuthController | **NAO EXISTE** |
| POST /api/auth/logout | AuthController | **NAO EXISTE** |
| GET /api/dashboard/stats | DashboardController | **NAO EXISTE** |
| GET /api/dashboard/recent-activity | DashboardController | **NAO EXISTE** |
| CRUD /api/users | UsersController | **NAO EXISTE** |
| CRUD /api/entities | EntitiesController | **NAO EXISTE** |
| CRUD /api/groups | GroupsController | **NAO EXISTE** |
| CRUD /api/transactions | TransactionsController | **NAO EXISTE** |
| CRUD /api/payments | PaymentsController | **NAO EXISTE** |

---

## 4. ESTADO DO FRONTEND

### 4.1 Rotas do Frontend
**Admin Portal**: ~40 rotas (DashboardView, EntitiesView, UsersView, GroupsView, PermissionsView, MessagesView, OperationsView, TransactionsView, ReportsView, SettingsView, e mais 30 views de configuracao, seguranca, registro, etc.)

**Operator Portal**: ~35 rotas (DashboardView, PaymentsView, MessagesView, OperationsView, BacenMessagesView, TransactionsView, MonitoringView, ReportsView, ReqGen, Alcadas, Vistos, Balances, + alerts, accounting, config, tools)

### 4.2 MOCK DATA: 63 Arquivos Afetados
**api.ts (servico principal):**
- `dashboardAPI.getStats()` - fallback para mock (L348-367)
- `operationsAPI.list()` - fallback para mock (L661-663)
- `operationsAPI.get()` - fallback para mock (L674-676)
- `operationsAPI.getClearings()` - fallback para mock (L719-729)
- `operationsAPI.getStatuses()` - fallback para mock (L743-754)
- `generateMockOperationsResponse()` - 100 linhas de geracao mock (L759-858)
- `generateMockOperationDetail()` - 60 linhas de mock (L860-919)

**63 arquivos Vue com mock data embutido** — praticamente TODAS as views usam dados mock inline no `<script setup>`.

### 4.3 Login
- Frontend chama `POST /api/auth/login` com email/password
- Credenciais demo: `usuário autorizado / senha gerida no Secrets Manager`
- Backend NAO tem AuthController
- **Login NUNCA funciona**

---

## 5. SEED DATA (Sample Data / Dados de Referencia)

### 5.1 Status Atual
- **Sem arquivo de seeds** — nao existe `priv/repo/seeds.exs` nem `database/seeds/`
- Dados de referencia BACEN (error codes, ISPBs, message types) existem nos SQL files mas NAO foram carregados
- O `comprehensive_bacen_schema.sql` tem INSERT para dados de referencia no final

### 5.2 O que Precisa Ser Populado
| Dado | Origem | Quantidade |
|------|--------|-----------|
| Instituicoes financeiras (ISPBs) | Dados publicos BACEN | ~800 |
| Codigos de erro BACEN | `005_reference_tables.sql` | 5,306+ |
| Feriados BACEN | `005_reference_tables.sql` | ~15/ano |
| Horarios de operacao | `005_reference_tables.sql` | ~20 |
| Message templates (979 tipos) | Schemas XML BACEN | 979 |
| Clearings | Dados publicos | ~6 |
| Tariffs | Circular BCB | ~979 |
| Operation statuses | Schema estado | ~15 |
| Status transitions | Machine de estados | ~30 |
| Message groups | Categorias BACEN | ~37 |
| Users iniciais | Config | 3-5 |

---

## 6. CAMINHO CRITICO (Ordem de Execucao)

### Fase 0: Conectar Backend ao Banco (BLOQUEADOR)
1. Adicionar Cloud SQL Proxy sidecar ao deployment `spb-backend`
2. Adicionar env vars: DATABASE_URL, JWT_SECRET, CORS_ORIGINS
3. Verificar que backend conecta ao banco

### Fase 1: Schema do Banco + Seeds
1. Executar `comprehensive_bacen_schema.sql` no banco `spb_dev`
2. Executar `005_reference_tables.sql` (error codes, holidays, schedules)
3. Executar `alter_existing_tables.sql`
4. Popular dados de referencia (institutions, clearings, tariffs, operation_statuses, status_transitions, message_groups)
5. Criar users iniciais (admin, operator)
6. Alinhar Ecto migrations com o schema SQL (ou usar apenas SQL raw via SqlHelpers)

### Fase 2: Auth (Login funcionar)
1. Criar AuthController com login (validar email/password_hash via bcrypt)
2. Criar JWT token generation (usar `jwt_secret` env var)
3. Criar AuthPlug middleware para validar Bearer token
4. Mapear rotas POST /api/auth/login, /verify, /logout
5. Testar login via frontend

### Fase 3: Conectar Controllers ao Router
1. Adicionar TODAS as rotas dos 11 controllers existentes no router.ex
2. Criar DashboardController (agregar dados reais de bacen_messages + str_transfers + institutions)
3. Criar UsersController (CRUD na tabela users)
4. Criar EntitiesController (alias para institutions)
5. Criar GroupsController (tabela user_groups a criar)
6. Testar cada endpoint via curl

### Fase 4: Eliminar Todo Mock do Frontend
1. Remover `generateMockOperationsResponse()` e `generateMockOperationDetail()` do api.ts
2. Remover TODOS os catch-fallback-to-mock em api.ts
3. Remover dados mock inline de CADA um dos 63 arquivos Vue
4. Cada view deve mostrar estado "empty" ou "loading" quando nao tem dados, NUNCA mock
5. Validar que cada tela carrega dados reais da API

### Fase 5: Validacao End-to-End
1. Login como admin -> Dashboard com dados reais
2. Navegar cada tela admin e verificar que chama API real
3. Login como operator -> Dashboard com dados reais
4. Operations Monitor com dados de str_transfers/lpi_operations reais
5. ReqGen criando mensagem que aparece no Operations Monitor
6. Alcadas e Vistos com workflow real
7. Reports com dados reais do banco

---

## 7. TABELAS COMPLETAS NECESSARIAS

### Existem no SQL (comprehensive_bacen_schema.sql)
institutions, users, accounts, bacen_messages, message_state_history, str_transfers, lpi_operations, payment_requests, debit_authorizations, forex_operations, securities_operations, settlements, cash_operations, custody_operations, fixed_income_operations, other_operations, api_keys, sessions, audit_logs, dlq_entries

### Existem no SQL (005_reference_tables.sql)
bacen_holidays, bacen_operating_schedule, bacen_error_codes

### Existem no SQL (modern_schema.sql)
message_templates, webhook_configs, system_config

### NAO EXISTEM em nenhum SQL (controllers criam on-the-fly ou precisam ser criadas)
- alcadas (AlcadasController cria via ensure_table)
- vistos (VistosController cria via ensure_table)
- clearings (ClearingsController espera tabela)
- bacen_tariffs (TariffsController espera tabela)
- message_groups (MessageGroupsController espera tabela)
- operation_statuses (OperationStatusesController espera tabela)
- status_transitions (OperationsController usa para validar transicoes)
- system_settings (SettingsController cria via ensure_table)

---

## 8. NOTA SOBRE CONTROLLERS "RAW SQL" vs ECTO

A maioria dos controllers usa `import BacenGatewayWeb.SqlHelpers` e faz SQL raw via `Ecto.Adapters.SQL.query`. Isso funciona sem Ecto schemas, contanto que as tabelas existam no banco. Os 6 Ecto schemas existentes sao usados pelo MessagesController.

**Decisao**: Manter raw SQL para controllers existentes (funciona se tabelas existem) e criar schemas Ecto apenas para novos controllers (Auth, Users, etc.) ou conforme necessario.

---

*Analise realizada em 2026-02-07 sobre o estado real do codigo, banco de dados e infraestrutura.*
