366 lines
12 KiB
Markdown
366 lines
12 KiB
Markdown
# CARONTE — Manual Técnico v1.0
|
|
|
|
> 🚣 "O barqueiro que guia famílias pelo rio burocrático pós-óbito"
|
|
|
|
---
|
|
|
|
## 1. Visão Geral da Arquitetura
|
|
|
|
O CARONTE é uma aplicação web full-stack composta por:
|
|
|
|
| Camada | Tecnologia | Porta Padrão |
|
|
|--------|-----------|-------------|
|
|
| **Frontend** | Next.js 14 (App Router) + React 18 + Tailwind CSS | 3102 |
|
|
| **Backend** | FastAPI (Python 3.12) + SQLAlchemy Async | 8102 |
|
|
| **Banco de Dados** | PostgreSQL (produção) / SQLite (desenvolvimento) | 5432 |
|
|
| **Proxy Reverso** | Nginx + Cloudflare | 80/443 |
|
|
| **Process Manager** | PM2 | — |
|
|
|
|
### Diagrama de Arquitetura
|
|
|
|
```
|
|
[Cloudflare CDN/DNS]
|
|
↓
|
|
[Nginx :80]
|
|
├── /api/* → FastAPI :8102
|
|
└── /* → Next.js :3102
|
|
↓
|
|
[PostgreSQL :5432]
|
|
```
|
|
|
|
---
|
|
|
|
## 2. Estrutura de Pastas
|
|
|
|
```
|
|
caronte/
|
|
├── backend/
|
|
│ ├── app/
|
|
│ │ ├── main.py # Entry point FastAPI
|
|
│ │ ├── __init__.py
|
|
│ │ ├── api/v1/ # Rotas da API
|
|
│ │ │ ├── auth.py # Autenticação (registro, login, /me)
|
|
│ │ │ ├── familias.py # CRUD famílias, membros, falecidos
|
|
│ │ │ ├── checklist.py # Checklist burocrático
|
|
│ │ │ ├── beneficios.py # Scanner de benefícios
|
|
│ │ │ ├── documentos.py # Geração de documentos PDF
|
|
│ │ │ └── dashboard.py # Dashboard consolidado
|
|
│ │ ├── core/
|
|
│ │ │ ├── config.py # Configurações (Pydantic Settings)
|
|
│ │ │ ├── database.py # Engine SQLAlchemy async
|
|
│ │ │ └── security.py # JWT, bcrypt, OAuth2
|
|
│ │ ├── models/ # Modelos SQLAlchemy
|
|
│ │ │ ├── usuario.py
|
|
│ │ │ ├── familia.py # Familia + MembroFamilia
|
|
│ │ │ ├── falecido.py
|
|
│ │ │ ├── checklist.py
|
|
│ │ │ ├── beneficio.py
|
|
│ │ │ └── documento.py
|
|
│ │ ├── schemas/
|
|
│ │ │ └── schemas.py # Pydantic schemas (request/response)
|
|
│ │ ├── services/
|
|
│ │ │ ├── checklist_engine.py # Geração automática de checklist
|
|
│ │ │ ├── beneficio_scanner.py # Scanner de benefícios elegíveis
|
|
│ │ │ └── document_generator.py # Geração de PDFs (ReportLab)
|
|
│ │ └── data/
|
|
│ │ └── checklist_templates.json # Templates de checklist
|
|
│ ├── uploads/ # PDFs gerados
|
|
│ ├── requirements.txt
|
|
│ └── seed_data.py
|
|
├── frontend/
|
|
│ ├── src/
|
|
│ │ ├── app/
|
|
│ │ │ ├── layout.js # Layout global
|
|
│ │ │ ├── page.js # Página inicial
|
|
│ │ │ ├── login/page.js
|
|
│ │ │ ├── registro/page.js
|
|
│ │ │ ├── dashboard/page.js
|
|
│ │ │ └── familia/[id]/
|
|
│ │ │ ├── page.js # Detalhe da família
|
|
│ │ │ ├── checklist/page.js
|
|
│ │ │ ├── beneficios/page.js
|
|
│ │ │ └── documentos/page.js
|
|
│ │ ├── components/
|
|
│ │ │ └── Sidebar.js
|
|
│ │ └── lib/
|
|
│ │ └── api.js # Cliente HTTP para a API
|
|
│ ├── package.json
|
|
│ ├── tailwind.config.js
|
|
│ └── postcss.config.js
|
|
├── docs/ # Documentação
|
|
├── start-backend.sh
|
|
└── start-frontend.sh
|
|
```
|
|
|
|
---
|
|
|
|
## 3. Modelos de Dados
|
|
|
|
### 3.1 Usuario
|
|
| Campo | Tipo | Descrição |
|
|
|-------|------|-----------|
|
|
| id | Integer (PK) | Auto-increment |
|
|
| nome | String | Nome completo |
|
|
| email | String (unique) | Email de login |
|
|
| senha_hash | String | Hash bcrypt |
|
|
| telefone | String (nullable) | Telefone |
|
|
| created_at | DateTime | Auto |
|
|
|
|
### 3.2 Familia
|
|
| Campo | Tipo | Descrição |
|
|
|-------|------|-----------|
|
|
| id | Integer (PK) | Auto-increment |
|
|
| nome | String | Nome da família |
|
|
| usuario_id | Integer (FK) | Usuário responsável |
|
|
| created_at | DateTime | Auto |
|
|
|
|
### 3.3 MembroFamilia
|
|
| Campo | Tipo | Descrição |
|
|
|-------|------|-----------|
|
|
| id | Integer (PK) | Auto-increment |
|
|
| familia_id | Integer (FK) | Família |
|
|
| nome | String | Nome do membro |
|
|
| parentesco | String | Grau de parentesco |
|
|
| cpf, telefone, email | String (nullable) | Dados de contato |
|
|
|
|
### 3.4 Falecido
|
|
| Campo | Tipo | Descrição |
|
|
|-------|------|-----------|
|
|
| id | Integer (PK) | Auto-increment |
|
|
| familia_id | Integer (FK) | Família |
|
|
| nome | String | Nome completo |
|
|
| cpf | String (nullable) | CPF |
|
|
| data_nascimento | Date (nullable) | Nascimento |
|
|
| data_obito | Date | Data do óbito |
|
|
| causa_obito | String (nullable) | Causa |
|
|
| tipo_vinculo | String | empregado, aposentado, autonomo, servidor |
|
|
| empregador | String (nullable) | Nome do empregador |
|
|
| tinha_carteira_assinada | Integer | 0/1 |
|
|
| tinha_fgts | Integer | 0/1 |
|
|
| era_aposentado | Integer | 0/1 |
|
|
| tinha_seguro_vida | Integer | 0/1 |
|
|
| tinha_imoveis | Integer | 0/1 |
|
|
| tinha_veiculos | Integer | 0/1 |
|
|
| salario_estimado | Float (nullable) | Último salário |
|
|
|
|
### 3.5 ChecklistItem
|
|
| Campo | Tipo | Descrição |
|
|
|-------|------|-----------|
|
|
| id | Integer (PK) | Auto-increment |
|
|
| familia_id | Integer (FK) | Família |
|
|
| falecido_id | Integer (FK) | Falecido |
|
|
| titulo | String | Título da tarefa |
|
|
| descricao | Text (nullable) | Descrição detalhada |
|
|
| fase | String | imediato, primeira_semana, 30_dias, 60_dias |
|
|
| categoria | String | certidoes, inss, fgts, inventario... |
|
|
| status | String | pendente, andamento, concluido |
|
|
| prazo_dias | Integer (nullable) | Prazo em dias |
|
|
| ordem | Integer | Ordem de execução |
|
|
| dependencia_id | Integer (nullable) | Item que precede |
|
|
|
|
### 3.6 Beneficio
|
|
| Campo | Tipo | Descrição |
|
|
|-------|------|-----------|
|
|
| id | Integer (PK) | Auto-increment |
|
|
| familia_id | Integer (FK) | Família |
|
|
| falecido_id | Integer (FK) | Falecido |
|
|
| tipo | String | fgts, pis, pensao_morte, seguro_vida, rescisao |
|
|
| nome | String | Nome do benefício |
|
|
| descricao | String (nullable) | Descrição |
|
|
| status | String | identificado, em_processo, sacado |
|
|
| valor_estimado | Float (nullable) | Valor estimado |
|
|
| valor_sacado | Float (nullable) | Valor efetivamente sacado |
|
|
|
|
### 3.7 Documento
|
|
| Campo | Tipo | Descrição |
|
|
|-------|------|-----------|
|
|
| id | Integer (PK) | Auto-increment |
|
|
| familia_id | Integer (FK) | Família |
|
|
| falecido_id | Integer (FK, nullable) | Falecido |
|
|
| tipo | String | procuracao, requerimento_fgts, peticao_pensao |
|
|
| nome | String | Nome do documento |
|
|
| arquivo_path | String (nullable) | Caminho do PDF |
|
|
| status | String | gerado, enviado, aprovado |
|
|
|
|
---
|
|
|
|
## 4. API — Endpoints
|
|
|
|
Base URL: `/api/v1`
|
|
|
|
### 4.1 Autenticação
|
|
|
|
| Método | Endpoint | Descrição | Auth |
|
|
|--------|----------|-----------|------|
|
|
| POST | `/auth/registro` | Criar conta | ❌ |
|
|
| POST | `/auth/login` | Login (OAuth2 form) → JWT | ❌ |
|
|
| GET | `/auth/me` | Dados do usuário logado | ✅ |
|
|
|
|
### 4.2 Famílias
|
|
|
|
| Método | Endpoint | Descrição | Auth |
|
|
|--------|----------|-----------|------|
|
|
| GET | `/familias/` | Listar famílias do usuário | ✅ |
|
|
| POST | `/familias/` | Criar família | ✅ |
|
|
| GET | `/familias/{id}` | Detalhe da família | ✅ |
|
|
| POST | `/familias/{id}/membros` | Adicionar membro | ✅ |
|
|
| GET | `/familias/{id}/membros` | Listar membros | ✅ |
|
|
| POST | `/familias/{id}/falecido` | Registrar falecido (gera checklist + benefícios) | ✅ |
|
|
| GET | `/familias/{id}/falecidos` | Listar falecidos | ✅ |
|
|
|
|
### 4.3 Checklist
|
|
|
|
| Método | Endpoint | Descrição | Auth |
|
|
|--------|----------|-----------|------|
|
|
| GET | `/familias/{id}/checklist/` | Listar itens do checklist | ✅ |
|
|
| PUT | `/familias/{id}/checklist/{item_id}` | Atualizar status | ✅ |
|
|
| GET | `/familias/{id}/checklist/proximo` | Próximo passo recomendado | ✅ |
|
|
|
|
### 4.4 Benefícios
|
|
|
|
| Método | Endpoint | Descrição | Auth |
|
|
|--------|----------|-----------|------|
|
|
| GET | `/familias/{id}/beneficios/` | Listar benefícios | ✅ |
|
|
| POST | `/familias/{id}/beneficios/scan` | Re-escanear benefícios | ✅ |
|
|
|
|
### 4.5 Documentos
|
|
|
|
| Método | Endpoint | Descrição | Auth |
|
|
|--------|----------|-----------|------|
|
|
| GET | `/familias/{id}/documentos/` | Listar documentos | ✅ |
|
|
| POST | `/familias/{id}/documentos/gerar` | Gerar PDF | ✅ |
|
|
| GET | `/familias/{id}/documentos/{doc_id}/download` | Download PDF | ✅ |
|
|
|
|
**Tipos de documento suportados:** `procuracao`, `requerimento_fgts`, `peticao_pensao`
|
|
|
|
### 4.6 Dashboard
|
|
|
|
| Método | Endpoint | Descrição | Auth |
|
|
|--------|----------|-----------|------|
|
|
| GET | `/dashboard/` | Resumo consolidado do usuário | ✅ |
|
|
|
|
---
|
|
|
|
## 5. Autenticação
|
|
|
|
- **Método:** JWT Bearer Token (OAuth2 Password Flow)
|
|
- **Hash:** bcrypt via passlib
|
|
- **Algoritmo:** HS256
|
|
- **Expiração:** 1440 minutos (24h)
|
|
- **Header:** `Authorization: Bearer <token>`
|
|
|
|
---
|
|
|
|
## 6. Variáveis de Ambiente
|
|
|
|
| Variável | Descrição | Padrão |
|
|
|----------|-----------|--------|
|
|
| `DATABASE_URL` | URL de conexão ao banco | `sqlite+aiosqlite:///./caronte.db` |
|
|
| `SECRET_KEY` | Chave secreta para JWT | `caronte-secret-key-change-in-production` |
|
|
| `ALGORITHM` | Algoritmo JWT | `HS256` |
|
|
| `ACCESS_TOKEN_EXPIRE_MINUTES` | Expiração do token | `1440` |
|
|
| `UPLOAD_DIR` | Diretório de uploads | `./uploads` |
|
|
|
|
**Produção (PostgreSQL):**
|
|
```
|
|
DATABASE_URL=postgresql+asyncpg://caronte:Caronte2026!@localhost:5432/caronte
|
|
```
|
|
|
|
> ⚠️ Para PostgreSQL, adicionar `asyncpg` ao requirements.txt e usar driver `postgresql+asyncpg://`
|
|
|
|
---
|
|
|
|
## 7. Requisitos de Sistema
|
|
|
|
### Backend
|
|
- Python 3.12+
|
|
- Dependências: FastAPI, SQLAlchemy, aiosqlite/asyncpg, python-jose, passlib, reportlab, pydantic-settings
|
|
|
|
### Frontend
|
|
- Node.js 18+
|
|
- Next.js 14, React 18, Tailwind CSS, lucide-react
|
|
|
|
### Produção
|
|
- Ubuntu 22.04+ / Debian 12+
|
|
- PostgreSQL 15+
|
|
- Nginx
|
|
- PM2 (Node.js process manager)
|
|
- Cloudflare (DNS + CDN)
|
|
|
|
---
|
|
|
|
## 8. Deploy de Produção
|
|
|
|
### 8.1 Backend
|
|
```bash
|
|
cd /opt/caronte/backend
|
|
python3 -m venv .venv
|
|
source .venv/bin/activate
|
|
pip install -r requirements.txt
|
|
pip install asyncpg # driver PostgreSQL
|
|
|
|
# Criar .env
|
|
echo 'DATABASE_URL=postgresql+asyncpg://caronte:Caronte2026!@localhost:5432/caronte' > .env
|
|
echo 'SECRET_KEY=<gerar-chave-segura>' >> .env
|
|
|
|
# Iniciar com PM2
|
|
pm2 start "source .venv/bin/activate && uvicorn app.main:app --host 0.0.0.0 --port 8102" --name caronte-backend
|
|
```
|
|
|
|
### 8.2 Frontend
|
|
```bash
|
|
cd /opt/caronte/frontend
|
|
npm install
|
|
npm run build # NUNCA usar next dev em produção
|
|
pm2 start "npm start -- -p 3102" --name caronte-frontend
|
|
```
|
|
|
|
### 8.3 Nginx
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name caronte.aivertice.com;
|
|
|
|
location /api/ {
|
|
proxy_pass http://127.0.0.1:8102/;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
}
|
|
|
|
location / {
|
|
proxy_pass http://127.0.0.1:3102;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 9. Serviços Inteligentes
|
|
|
|
### 9.1 Checklist Engine
|
|
Ao registrar um falecido, o sistema gera automaticamente um checklist burocrático personalizado baseado no perfil (tipo de vínculo, tinha FGTS, era aposentado, etc.). Os templates são carregados de `checklist_templates.json` e filtrados por condições.
|
|
|
|
### 9.2 Benefício Scanner
|
|
Analisa o perfil do falecido e identifica automaticamente benefícios elegíveis:
|
|
- **FGTS** (se tinha FGTS) — estimativa: 3.5x salário
|
|
- **PIS/PASEP** (se tinha carteira assinada) — estimativa: 0.8x salário
|
|
- **Pensão por Morte** (sempre) — estimativa: 12x salário
|
|
- **Seguro de Vida** (se tinha) — estimativa: 24x salário
|
|
- **Verbas Rescisórias** (se tinha carteira assinada) — estimativa: 2x salário
|
|
|
|
### 9.3 Document Generator
|
|
Gera PDFs profissionais via ReportLab:
|
|
- **Procuração** — representação perante órgãos
|
|
- **Requerimento FGTS** — saque por falecimento (Lei 8.036/90)
|
|
- **Petição Pensão por Morte** — requerimento INSS (Lei 8.213/91)
|
|
|
|
---
|
|
|
|
*Documento gerado em 08/02/2026 — CARONTE v1.0*
|