Skip to main content
Glama
Rannielson

MCP Financeiro

by Rannielson
README.md
# MCP Financeiro - API Multi-Empresas

API em Node.js + TypeScript + Hono para orquestrar integrações **SGA (Hinova)** e **Chat Atomos** em modelo SaaS multi-empresas. Consulta boletos por placa, envia PIX/PDF ou mensagem de regularização (revistoria) conforme configuração por cliente.

---

## Base URL

| Ambiente | URL |
|----------|-----|
| **Produção** | `https://mcpfinanceiro-production.up.railway.app` |
| **Local** | `http://localhost:3000` |

Use a base URL desejada nos exemplos de cURL abaixo.

---

## Pré-requisitos

- Node.js 18+
- Conta Supabase
- Tokens por cliente: **token_erp** (Hinova SGA), **token_chat** e **token_canal** (Atomos)

---

## Setup

### 1. Instalar dependências

```bash
npm install
```

### 2. Variáveis de ambiente

Copie `.env.example` para `.env` e preencha:

```env
SUPABASE_URL=https://seu-projeto.supabase.co
SUPABASE_SERVICE_ROLE_KEY=sua-service-role-key
```

### 3. Migrations no Supabase

No [Supabase Dashboard](https://supabase.com/dashboard) > **SQL Editor**, execute em ordem:

1. `supabase/migrations/001_initial_schema.sql`
2. `supabase/migrations/002_rename_base_url_sga_to_base_url.sql` (se existir)
3. `supabase/migrations/003_situacoes_envio_direto_e_checagem.sql`
4. `supabase/migrations/004_intervalo_max_50.sql`

### 4. Iniciar o servidor

```bash
npm run dev
```

---

## Endpoints e cURL

### Health check

**GET /** — Verifica se a API está no ar.

```bash
curl -s https://mcpfinanceiro-production.up.railway.app/
```

**Resposta (200):**

```json
{"status":"ok","service":"mcpfinanceiro"}
```

---

### Cadastrar cliente

**POST** `/api/v1/clientes` — Cadastra um cliente com todas as configurações (boleto, respostas, revistoria).

**Body (JSON):**

| Campo | Tipo | Obrigatório | Descrição |
|-------|------|-------------|-----------|
| `nome` | string | sim | Nome do cliente |
| `ativo` | boolean | não | Default `true` |
| `token_erp` | string | sim | Token Hinova SGA |
| `token_chat` | string | sim | Token Chat Atomos |
| `token_canal` | string | sim | Token do canal Atomos |
| `perfil_sistema` | "SGA" \| "SOUTH" | não | Default `"SGA"` |
| `base_url` | string (URL) | não | Default `https://api.hinova.com.br/api/sga/v2` |
| `configuracoes_boleto` | object | sim | Ver tabela abaixo |
| `configuracoes_respostas` | object | sim | Ver tabela abaixo |
| `configuracoes_revistoria` | object | sim | Ver tabela abaixo |

**configuracoes_boleto:**

| Campo | Tipo | Descrição |
|-------|------|-----------|
| `dias_antes_vencimento` | number | Dias antes do vencimento para buscar boleto (0–60) |
| `dias_depois_vencimento` | number | Dias depois do vencimento (0–60). Soma com `dias_antes` ≤ 50 |
| `situacoes_envio_direto` | string[] | Ex.: `["ATIVO"]` — envia PIX/PDF direto |
| `situacoes_com_checagem_vencimento` | string[] | Ex.: `["INADIMPLENTE"]` — checa dias após vencimento |
| `dias_checagem_vencimento` | number | Se passar desse número de dias após vencimento, retorna regularização |

**configuracoes_respostas:**

| Campo | Tipo | Descrição |
|-------|------|-----------|
| `response_sucesso` | string | Mensagem quando boleto/PIX enviados. Use `{{data_vencimento}}` e `{{valor_boleto}}` |
| `response_regularizacao_moto` | string | Mensagem de regularização para moto |
| `response_regularizacao_veiculo` | string | Mensagem de regularização para carro |
| `response_boleto_baixado` | string | Mensagem quando boleto já está baixado |

**configuracoes_revistoria:**

| Campo | Tipo | Descrição |
|-------|------|-----------|
| `enviar_midia` | boolean | Se `true`, envia vídeo de regularização (quando houver URL) |
| `video_moto` | string (URL) ou null | URL do vídeo para moto |
| `video_carro` | string (URL) ou null | URL do vídeo para carro |

**cURL — Cadastrar cliente:**

```bash
curl -X POST https://mcpfinanceiro-production.up.railway.app/api/v1/clientes \
  -H "Content-Type: application/json" \
  -d '{
    "nome": "Meu Cliente",
    "ativo": true,
    "token_erp": "SEU_TOKEN_ERP",
    "token_chat": "SEU_TOKEN_CHAT",
    "token_canal": "SEU_TOKEN_CANAL",
    "perfil_sistema": "SGA",
    "base_url": "https://api.hinova.com.br/api/sga/v2",
    "configuracoes_boleto": {
      "dias_antes_vencimento": 30,
      "dias_depois_vencimento": 20,
      "situacoes_envio_direto": ["ATIVO"],
      "situacoes_com_checagem_vencimento": ["INADIMPLENTE"],
      "dias_checagem_vencimento": 5
    },
    "configuracoes_respostas": {
      "response_sucesso": "Boleto e pix enviados! Data: {{data_vencimento}}, Valor: {{valor_boleto}}",
      "response_regularizacao_moto": "Estamos enviando o vídeo modelo para regularização.",
      "response_regularizacao_veiculo": "Estamos enviando o vídeo modelo para regularização.",
      "response_boleto_baixado": "Boleto já foi baixado."
    },
    "configuracoes_revistoria": {
      "enviar_midia": false,
      "video_moto": null,
      "video_carro": null
    }
  }'
```

**Resposta (201):**

```json
{"id":"uuid-do-cliente","message":"Cliente criado com sucesso"}
```

**Resposta (400):** `{"error":"mensagem"}` (validação ou banco).

---

### Atualizar configurações do cliente

**PATCH** `/api/v1/clientes/:id/configuracoes` — Atualiza apenas as configurações enviadas (parcial). `:id` = UUID do cliente.

**Body (JSON):** qualquer combinação de:

- `configuracoes_boleto` — mesmos campos do cadastro (todos opcionais no PATCH)
- `configuracoes_respostas` — mesmos campos (opcionais)
- `configuracoes_revistoria` — mesmos campos (opcionais)

**Regra:** `dias_antes_vencimento + dias_depois_vencimento` ≤ 50.

**cURL — Ajustar apenas boleto (ex.: 30 dias antes, 20 depois):**

```bash
curl -X PATCH https://mcpfinanceiro-production.up.railway.app/api/v1/clientes/SEU_CLIENTE_UUID/configuracoes \
  -H "Content-Type: application/json" \
  -d '{
    "configuracoes_boleto": {
      "dias_antes_vencimento": 30,
      "dias_depois_vencimento": 20
    }
  }'
```

**cURL — Ajustar apenas revistoria (ativar envio de vídeo):**

```bash
curl -X PATCH https://mcpfinanceiro-production.up.railway.app/api/v1/clientes/SEU_CLIENTE_UUID/configuracoes \
  -H "Content-Type: application/json" \
  -d '{
    "configuracoes_revistoria": {
      "enviar_midia": true,
      "video_moto": "https://exemplo.com/video-moto.mp4",
      "video_carro": "https://exemplo.com/video-carro.mp4"
    }
  }'
```

**Resposta (200):**

```json
{"message":"Configurações atualizadas com sucesso"}
```

**Resposta (404):** `{"error":"Cliente não encontrado"}`.

---

### Webhook — Processar boleto por placa

**POST** `/api/v1/webhook` — Recebe placa e telefone, consulta SGA, envia PIX/PDF ou retorna mensagem de regularização/revistoria. Resposta é um texto para o agente de IA (ex.: LLM).

**Body (JSON):**

| Campo | Tipo | Obrigatório | Descrição |
|-------|------|-------------|-----------|
| `placa` | string | sim | Placa do veículo |
| `telefone` | string | sim | Telefone (com DDD, só números ou formatado) |
| `client_id` | string (UUID) | não* | ID do cliente. *Obrigatório no body ou no header `X-Client-Id` |

**cURL — Com client_id no body:**

```bash
curl -X POST https://mcpfinanceiro-production.up.railway.app/api/v1/webhook \
  -H "Content-Type: application/json" \
  -d '{
    "placa": "ABC1D23",
    "telefone": "5581999999999",
    "client_id": "SEU_CLIENTE_UUID"
  }'
```

**cURL — Com client_id no header (recomendado para integração com agente):**

```bash
curl -X POST https://mcpfinanceiro-production.up.railway.app/api/v1/webhook \
  -H "Content-Type: application/json" \
  -H "X-Client-Id: SEU_CLIENTE_UUID" \
  -d '{"placa":"ABC1D23","telefone":"5581999999999"}'
```

**Resposta (200):**

```json
{"message":"Boleto e pix enviados! Data: 20/02/2026, Valor: R$ 150,00"}
```

ou, em caso de regularização (revistoria):

```json
{"message":"Isto é imprescindível: Acione a habilidade de Pendência de Revistoria quando identificar inadimplência no veículo.\n\nEstamos enviando o vídeo modelo para regularização."}
```

Outras mensagens possíveis: `"Veículo não encontrado."`, `"Boleto já foi baixado."`, `"Cliente não encontrado ou inativo."`, ou mensagem de erro da API SGA.

**Resposta (400):** `{"error":"client_id é obrigatório (body ou header X-Client-Id)"}` ou erros de validação (placa/telefone).

---

## Resumo das regras de negócio

- **Janela de boletos:** entre `(hoje - dias_antes_vencimento)` e `(hoje + dias_depois_vencimento)`. Soma máxima 50 dias.
- **Envio direto:** se a situação do veículo estiver em `situacoes_envio_direto`, envia PIX e link do boleto e retorna `response_sucesso`.
- **Checagem de vencimento:** se a situação estiver em `situacoes_com_checagem_vencimento` e o boleto estiver vencido há mais de `dias_checagem_vencimento` dias, retorna mensagem de regularização (com prefixo de instrução para a IA).
- **Revistoria:** em fluxos de regularização, a resposta inclui um prefixo fixo para o agente de IA (“Pendência de Revistoria”). Se `enviar_midia` estiver ativo e houver `video_moto`/`video_carro`, o vídeo é enviado pelo Atomos (sem texto junto ao vídeo).

---

## Scripts

| Comando | Descrição |
|--------|-----------|
| `npm run dev` | Inicia em modo watch (desenvolvimento) |
| `npm run start` | Inicia em produção |
| `npm run build` | Compila TypeScript |
| `npm run typecheck` | Verifica tipos sem gerar arquivos |