fin-app-mcp 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -0
- package/docs/guia.md +271 -0
- package/index.mjs +1111 -0
- package/package.json +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# FIN App — MCP Server
|
|
2
|
+
|
|
3
|
+
MCP server que expõe as operações do FIN (finanças pessoais) para qualquer LLM agent via [Model Context Protocol](https://modelcontextprotocol.io/).
|
|
4
|
+
|
|
5
|
+
## O que faz
|
|
6
|
+
|
|
7
|
+
- **22 tools** para operar finanças: criar despesas, receitas, transferências, consultar saldos, faturas, relatórios, gerenciar contas e categorias.
|
|
8
|
+
- **1 resource** (`fin://docs/guia`) com o guia completo de regras de negócio — ciclo de fatura, estorno, parcelamento, modelo de dados.
|
|
9
|
+
- Descriptions ricas em cada tool: quando usar, quando NÃO usar, regras de negócio, armadilhas.
|
|
10
|
+
|
|
11
|
+
## Pré-requisitos
|
|
12
|
+
|
|
13
|
+
- Node.js 18+
|
|
14
|
+
- Uma instância do FIN rodando (local ou na nuvem)
|
|
15
|
+
- Service token configurado no FIN (endpoint `/api/genius/*`)
|
|
16
|
+
|
|
17
|
+
## Setup
|
|
18
|
+
|
|
19
|
+
### Opção A: via npx (recomendado — zero instalação)
|
|
20
|
+
|
|
21
|
+
Não precisa clonar nem instalar nada. O `npx` baixa e executa automaticamente.
|
|
22
|
+
|
|
23
|
+
#### Claude Code (settings.json)
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"mcpServers": {
|
|
28
|
+
"fin-app": {
|
|
29
|
+
"command": "npx",
|
|
30
|
+
"args": ["-y", "fin-app-mcp"],
|
|
31
|
+
"env": {
|
|
32
|
+
"FIN_BASE_URL": "https://fin.example.com",
|
|
33
|
+
"FIN_SERVICE_TOKEN": "seu-token-aqui",
|
|
34
|
+
"FIN_USER_ID": "seu-user-id-aqui"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Reinicie o client MCP. O server deve aparecer com as tools disponíveis.
|
|
42
|
+
|
|
43
|
+
### Opção B: instalação global
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install -g fin-app-mcp
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Claude Code (settings.json):
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"mcpServers": {
|
|
53
|
+
"fin-app": {
|
|
54
|
+
"command": "fin-app-mcp",
|
|
55
|
+
"env": {
|
|
56
|
+
"FIN_BASE_URL": "https://fin.example.com",
|
|
57
|
+
"FIN_SERVICE_TOKEN": "seu-token-aqui",
|
|
58
|
+
"FIN_USER_ID": "seu-user-id-aqui"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Opção C: clone local (para desenvolvimento)
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
git clone https://github.com/pe-menezes/fin-app.git
|
|
69
|
+
cd fin-app/mcp-server
|
|
70
|
+
npm install
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Claude Code (settings.json):
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"mcpServers": {
|
|
77
|
+
"fin-app": {
|
|
78
|
+
"command": "node",
|
|
79
|
+
"args": ["/caminho/para/fin-app/mcp-server/index.mjs"],
|
|
80
|
+
"env": {
|
|
81
|
+
"FIN_BASE_URL": "https://fin.example.com",
|
|
82
|
+
"FIN_SERVICE_TOKEN": "seu-token-aqui",
|
|
83
|
+
"FIN_USER_ID": "seu-user-id-aqui"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Variáveis de ambiente
|
|
91
|
+
|
|
92
|
+
| Variável | Descrição |
|
|
93
|
+
|----------|-----------|
|
|
94
|
+
| `FIN_BASE_URL` | URL base da instância do FIN (ex: `https://fin.example.com` ou `http://localhost:3000`) |
|
|
95
|
+
| `FIN_SERVICE_TOKEN` | Service token para autenticação na API Genius |
|
|
96
|
+
| `FIN_USER_ID` | UUID do usuário no FIN |
|
|
97
|
+
|
|
98
|
+
## Resource: Guia do FIN
|
|
99
|
+
|
|
100
|
+
O server expõe `fin://docs/guia` — um guia completo para agents operarem o FIN. Conteúdo:
|
|
101
|
+
|
|
102
|
+
- Modelo de dados (contas, transações, categorias)
|
|
103
|
+
- Valores em centavos
|
|
104
|
+
- Ciclo de fatura de cartão (reference_month, closing_day, due_day)
|
|
105
|
+
- Estorno / Reversal (como criar, armadilhas)
|
|
106
|
+
- Parcelamento (geração automática, deleção em grupo)
|
|
107
|
+
- Nomes vs IDs
|
|
108
|
+
|
|
109
|
+
Agents devem ler este resource antes de iniciar operações financeiras.
|
|
110
|
+
|
|
111
|
+
## Desenvolvimento
|
|
112
|
+
|
|
113
|
+
O server é um proxy da API Genius do FIN — não contém lógica de negócio própria. Quando regras de negócio mudam no FIN, as descriptions e o guia devem ser atualizados aqui.
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# Rodar direto (para debug)
|
|
117
|
+
FIN_BASE_URL=http://localhost:3000 FIN_SERVICE_TOKEN=xxx FIN_USER_ID=xxx node index.mjs
|
|
118
|
+
```
|
package/docs/guia.md
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Guia do FIN — Regras de Negócio para Agents
|
|
2
|
+
|
|
3
|
+
> Este documento é a referência completa para qualquer LLM agent que opera o FIN via MCP server.
|
|
4
|
+
> Leia antes de executar qualquer operação financeira.
|
|
5
|
+
|
|
6
|
+
## 1. Visão geral
|
|
7
|
+
|
|
8
|
+
O FIN é um app de finanças pessoais. Registra despesas, receitas e transferências, com suporte a múltiplas contas bancárias, cartões de crédito com faturas, categorização, parcelamento, e estornos.
|
|
9
|
+
|
|
10
|
+
Toda interação acontece via tools do MCP server. Os valores são sempre em **centavos** (ver seção 3). As tools aceitam nomes de contas e categorias (não IDs) e resolvem internamente.
|
|
11
|
+
|
|
12
|
+
## 2. Modelo de dados
|
|
13
|
+
|
|
14
|
+
### Contas (`accounts`)
|
|
15
|
+
Dois tipos:
|
|
16
|
+
- **`cash`** — conta corrente, carteira, poupança. Tem saldo calculado (saldo inicial + receitas - despesas).
|
|
17
|
+
- **`credit`** — cartão de crédito. Tem `closing_day` (dia de fechamento), `due_day` (dia de vencimento), e `credit_limit`. Não tem "saldo" — tem faturas.
|
|
18
|
+
|
|
19
|
+
### Transações (`transactions`)
|
|
20
|
+
Três tipos:
|
|
21
|
+
- **`expense`** — despesa. Debita de uma conta (cash ou credit).
|
|
22
|
+
- **`income`** — receita. Credita numa conta cash.
|
|
23
|
+
- **`transfer`** — transferência entre contas. Debita de uma e credita na outra.
|
|
24
|
+
|
|
25
|
+
Campos principais:
|
|
26
|
+
- `description` — texto livre
|
|
27
|
+
- `amount` — valor em centavos (sempre positivo no banco; o tipo determina o sinal)
|
|
28
|
+
- `tx_date` — data no formato YYYY-MM-DD
|
|
29
|
+
- `account_from_id` — conta de origem (expense e transfer)
|
|
30
|
+
- `account_to_id` — conta de destino (income e transfer)
|
|
31
|
+
- `category_id` / `subcategory_id` — categorização
|
|
32
|
+
- `essential` — booleano (despesa essencial vs supérflua)
|
|
33
|
+
- `reversal_of_id` — se preenchido, esta transação é um estorno (ver seção 5)
|
|
34
|
+
- `installment_group_id` — se preenchido, faz parte de um parcelamento (ver seção 6)
|
|
35
|
+
|
|
36
|
+
### Categorias e subcategorias
|
|
37
|
+
- Cada categoria tem um `flow`: `expense` ou `income`
|
|
38
|
+
- Subcategorias pertencem a exatamente uma categoria
|
|
39
|
+
- Categorias podem ser arquivadas (`is_active: false`)
|
|
40
|
+
|
|
41
|
+
### Faturas de cartão de crédito
|
|
42
|
+
- Uma fatura agrupa as transações de um cartão dentro de um ciclo de fechamento
|
|
43
|
+
- Tem `reference_month`, `net_total`, `charges_total`, `refunds_total`, `due_date`
|
|
44
|
+
- Ver seção 4 para detalhes do ciclo
|
|
45
|
+
|
|
46
|
+
## 3. Valores em centavos
|
|
47
|
+
|
|
48
|
+
**TODA a API trabalha em centavos.** R$10,50 = 1050 centavos.
|
|
49
|
+
|
|
50
|
+
Ao criar transações, informar `amount_cents` (não reais). Ao ler respostas, todos os valores monetários estão em centavos.
|
|
51
|
+
|
|
52
|
+
Conversão: `centavos = reais × 100`. Exemplo: R$1.234,56 = 123456 centavos.
|
|
53
|
+
|
|
54
|
+
## 4. Ciclo de fatura de cartão
|
|
55
|
+
|
|
56
|
+
### Como funciona
|
|
57
|
+
|
|
58
|
+
Cada cartão de crédito tem:
|
|
59
|
+
- `closing_day` — dia do mês em que a fatura fecha (1-28)
|
|
60
|
+
- `due_day` — dia do mês em que a fatura vence (1-28)
|
|
61
|
+
|
|
62
|
+
O ciclo de uma fatura vai do fechamento anterior até o fechamento atual. Transações dentro desse período pertencem a essa fatura.
|
|
63
|
+
|
|
64
|
+
### `reference_month` — ATENÇÃO
|
|
65
|
+
|
|
66
|
+
O FIN usa `reference_month` baseado no **mês do vencimento**, NÃO no mês dos gastos.
|
|
67
|
+
|
|
68
|
+
**Isso é diferente de como os bancos nomeiam faturas.**
|
|
69
|
+
|
|
70
|
+
Exemplo concreto — cartão com `closing_day=1` e `due_day=9`:
|
|
71
|
+
- Ciclo: 1 de março a 1 de abril
|
|
72
|
+
- Vencimento: 9 de abril
|
|
73
|
+
- **Banco chama:** "Fatura de Março" (mês dos gastos)
|
|
74
|
+
- **FIN chama:** `reference_month: 2026-04` (mês do vencimento)
|
|
75
|
+
|
|
76
|
+
**Regra prática:** quando o banco diz "Fatura de Março", no FIN é `reference_month` do mês seguinte. Ou seja:
|
|
77
|
+
- Fatura Março (banco) → `reference_month: 2026-04` (FIN)
|
|
78
|
+
- Fatura Abril (banco) → `reference_month: 2026-05` (FIN)
|
|
79
|
+
|
|
80
|
+
### Em qual fatura cai uma transação?
|
|
81
|
+
|
|
82
|
+
Uma transação cai na fatura cujo ciclo contém a `tx_date`:
|
|
83
|
+
- Compra em 15/03 com ciclo 01/03–01/04 → fatura de `reference_month: 2026-04`
|
|
84
|
+
- Compra em 31/03 com ciclo 01/03–01/04 → fatura de `reference_month: 2026-04`
|
|
85
|
+
|
|
86
|
+
**Detalhe:** transação feita exatamente no dia do fechamento (`closing_day`) é empurrada para o **próximo** ciclo.
|
|
87
|
+
|
|
88
|
+
## 5. Estorno / Reversal
|
|
89
|
+
|
|
90
|
+
### O que é
|
|
91
|
+
|
|
92
|
+
Um estorno é um crédito que reduz o total de uma fatura (ou devolve dinheiro numa conta cash). No FIN, estornos são modelados como **despesas especiais** com `reversal_of_id`.
|
|
93
|
+
|
|
94
|
+
### Como criar um estorno
|
|
95
|
+
|
|
96
|
+
Usar a tool `fin_criar_despesa` com:
|
|
97
|
+
|
|
98
|
+
| Campo | Valor |
|
|
99
|
+
|-------|-------|
|
|
100
|
+
| `reversal_of_id` | UUID da transação original sendo estornada |
|
|
101
|
+
| `reversal_kind` | `'full'` (estorno total) ou `'partial'` (estorno parcial) |
|
|
102
|
+
| `amount_cents` | valor do estorno em centavos (positivo — o sistema inverte) |
|
|
103
|
+
| `account_name` | **mesmo** cartão/conta da transação original |
|
|
104
|
+
| `description` | descrição do estorno |
|
|
105
|
+
| `category_name` | mesma categoria da original |
|
|
106
|
+
|
|
107
|
+
### Como funciona por dentro
|
|
108
|
+
|
|
109
|
+
- O estorno é salvo como `tx_type: 'expense'` com `amount` positivo
|
|
110
|
+
- Na hora de calcular a fatura, o sistema detecta `reversal_of_id != null` e **inverte o sinal** — o valor vira negativo e subtrai do total
|
|
111
|
+
- Na listagem da fatura, o estorno aparece como `kind: 'refund'`
|
|
112
|
+
|
|
113
|
+
### O que NÃO fazer
|
|
114
|
+
|
|
115
|
+
- **NUNCA usar `fin_criar_receita` para estorno em cartão de crédito.** Receita soma na fatura em vez de subtrair. O resultado é o oposto do esperado.
|
|
116
|
+
- **NUNCA** criar estorno de um estorno (a transação original não pode ter `reversal_of_id`)
|
|
117
|
+
- **NUNCA** criar estorno em conta diferente da original
|
|
118
|
+
|
|
119
|
+
### Validações automáticas
|
|
120
|
+
|
|
121
|
+
O sistema valida:
|
|
122
|
+
- A transação original deve existir
|
|
123
|
+
- A original deve ser `expense` (não pode ser receita, transferência, ou outro estorno)
|
|
124
|
+
- O `account_from_id` do estorno deve ser igual ao da original
|
|
125
|
+
- O valor deve ser > R$0,01
|
|
126
|
+
|
|
127
|
+
## 6. Parcelamento
|
|
128
|
+
|
|
129
|
+
### Como funciona
|
|
130
|
+
|
|
131
|
+
Ao criar uma despesa com `installments: N` (onde N é 2-48), o sistema gera **N transações separadas** automaticamente.
|
|
132
|
+
|
|
133
|
+
### Distribuição
|
|
134
|
+
|
|
135
|
+
- O `amount_cents` informado é o **TOTAL** (não o valor de cada parcela)
|
|
136
|
+
- O sistema divide: `total / N`, distribuindo centavos restantes nas primeiras parcelas
|
|
137
|
+
- Exemplo: R$100,00 em 3x → [R$33,34 + R$33,33 + R$33,33]
|
|
138
|
+
- Cada parcela ganha `tx_date` espaçada de 1 mês (+1 mês por parcela)
|
|
139
|
+
- Parcela 1: `tx_date` original
|
|
140
|
+
- Parcela 2: +1 mês
|
|
141
|
+
- Parcela 3: +2 meses
|
|
142
|
+
- Edge cases de fim de mês são tratados (31/jan → 28/fev)
|
|
143
|
+
|
|
144
|
+
### Campos em cada transação gerada
|
|
145
|
+
|
|
146
|
+
| Campo | Valor |
|
|
147
|
+
|-------|-------|
|
|
148
|
+
| `installment_group_id` | UUID compartilhado por todas as parcelas |
|
|
149
|
+
| `installment_index` | 1, 2, 3, ... N (1-based) |
|
|
150
|
+
| `installment_count` | N (total de parcelas) |
|
|
151
|
+
| `tx_date` | offset de +1 mês por parcela |
|
|
152
|
+
| `amount` | valor dividido (não o total) |
|
|
153
|
+
|
|
154
|
+
### Fatura
|
|
155
|
+
|
|
156
|
+
Cada parcela cai na fatura baseada na sua `tx_date` individual. Como cada parcela tem date offset de 1 mês, cada uma cai em uma fatura diferente automaticamente.
|
|
157
|
+
|
|
158
|
+
### Entrar no meio do parcelamento
|
|
159
|
+
|
|
160
|
+
O parâmetro `current_installment` permite começar de qualquer parcela. Se o parcelamento é de 10x e você está na parcela 3, passe `current_installment: 3, installments: 10` — o sistema gera 8 transações (3 a 10).
|
|
161
|
+
|
|
162
|
+
### Deleção
|
|
163
|
+
|
|
164
|
+
Ao deletar **qualquer** parcela de um grupo, **todas** as parcelas com o mesmo `installment_group_id` são deletadas juntas. Não é possível deletar uma parcela individual.
|
|
165
|
+
|
|
166
|
+
## 7. Nomes vs IDs
|
|
167
|
+
|
|
168
|
+
As tools do MCP aceitam **nomes** (não UUIDs) para contas e categorias:
|
|
169
|
+
- `account_name` — nome da conta (match parcial, case-insensitive)
|
|
170
|
+
- `category_name` — nome da categoria
|
|
171
|
+
- `subcategory_name` — nome da subcategoria
|
|
172
|
+
|
|
173
|
+
O servidor resolve o nome para o ID internamente. Se o nome for ambíguo ou não encontrado, a API retorna erro explicativo.
|
|
174
|
+
|
|
175
|
+
Exceção: `reversal_of_id` e `transaction_id` são sempre UUIDs — transações são identificadas por ID, não por nome.
|
|
176
|
+
|
|
177
|
+
## 8. Conciliação de faturas complexas
|
|
178
|
+
|
|
179
|
+
Bancos às vezes tratam estornos e cancelamentos de formas que o modelo padrão de faturas não cobre diretamente. O FIN tem dois mecanismos para lidar com isso: **`invoice_cycle_end`** (forçar transação pra outro ciclo) e **ajustes de fatura** (tool `fin_ajuste_fatura`).
|
|
180
|
+
|
|
181
|
+
### Cenário 1: Cancelamento cross-cycle
|
|
182
|
+
|
|
183
|
+
**O que acontece:** o banco cancela uma compra do ciclo X, mas aplica o crédito como desconto no pagamento da fatura Y. Exemplo:
|
|
184
|
+
|
|
185
|
+
- Compra GoDaddy R$593,22 em 18/03 → fatura Abr (ciclo 01/03–01/04)
|
|
186
|
+
- Cancelamento GoDaddy -R$593,22 → banco lista na fatura **Mai** (ciclo 01/04–01/05)
|
|
187
|
+
- Banco desconta os R$593,22 do pagamento da fatura Abr: total era R$11.368,91, Pedro pagou R$10.775,69
|
|
188
|
+
|
|
189
|
+
**Como resolver:**
|
|
190
|
+
|
|
191
|
+
1. Lançar o cancelamento como estorno (`fin_criar_despesa` com `reversal_of_id`) com `invoice_cycle_end` apontando pro ciclo de Mai (onde o banco listou):
|
|
192
|
+
```json
|
|
193
|
+
{ "description": "Cancelamento GoDaddy", "amount_cents": 59322, "account_name": "Latam Itaú", "reversal_of_id": "uuid-da-compra", "reversal_kind": "full", "invoice_cycle_end": "2026-05-01" }
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
2. Criar ajuste NEGATIVO na fatura Abr para representar o crédito que o banco aplicou no pagamento:
|
|
197
|
+
```json
|
|
198
|
+
fin_ajuste_fatura({ "card_name": "Latam Itaú", "cycle_end": "2026-04-01", "amount_cents": -59322 })
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Resultado: fatura Abr fecha com net_total = total - ajuste = pagamento. Fatura Mai mostra o refund.
|
|
202
|
+
|
|
203
|
+
### Cenário 2: Estorno que não abate do total
|
|
204
|
+
|
|
205
|
+
**O que acontece:** o banco lista um estorno na fatura, mas NÃO desconta do total. Exemplo:
|
|
206
|
+
|
|
207
|
+
- Estorno GitHub -R$38,63 em 04/03 → aparece no CSV da fatura Abr
|
|
208
|
+
- Total do banco: R$11.368,91 (não desconta os R$38,63)
|
|
209
|
+
|
|
210
|
+
Se lançar como refund no FIN, o líquido fica R$38,63 menor que o banco mostra.
|
|
211
|
+
|
|
212
|
+
**Como resolver:**
|
|
213
|
+
|
|
214
|
+
1. Lançar o estorno como refund normalmente (ele vai descontar do líquido)
|
|
215
|
+
2. Criar ajuste POSITIVO pra anular o efeito:
|
|
216
|
+
```json
|
|
217
|
+
fin_ajuste_fatura({ "card_name": "Latam Itaú", "cycle_end": "2026-04-01", "amount_cents": 3863 })
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Resultado: refund + ajuste se anulam → líquido bate com o banco.
|
|
221
|
+
|
|
222
|
+
### `cycle_end` vs `reference_month`
|
|
223
|
+
|
|
224
|
+
- **`cycle_end`** é a data de fechamento do ciclo (ex: `2026-04-01` para um cartão que fecha dia 1). É o identificador usado internamente pelo FIN e na tool `fin_ajuste_fatura`.
|
|
225
|
+
- **`reference_month`** é o mês do vencimento (ex: `2026-04` para uma fatura que vence em abril). É usado nas tools `fin_fatura_cartao` e `fin_fatura_transacoes`.
|
|
226
|
+
|
|
227
|
+
Para descobrir o `cycle_end` de uma fatura, use `fin_fatura_transacoes` — a resposta inclui o `cycle_end`.
|
|
228
|
+
|
|
229
|
+
### Combinando ajustes
|
|
230
|
+
|
|
231
|
+
Se uma fatura tem múltiplos ajustes necessários (ex: crédito cross-cycle + estorno que não abate), **some os valores** num único `fin_ajuste_fatura`:
|
|
232
|
+
|
|
233
|
+
```json
|
|
234
|
+
// Crédito GoDaddy (-R$593,22) + anular GitHub (+R$38,63) = -R$554,59
|
|
235
|
+
fin_ajuste_fatura({ "card_name": "Latam Itaú", "cycle_end": "2026-04-01", "amount_cents": -55459 })
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Um ajuste por (cartão, ciclo) — se chamar `fin_ajuste_fatura` duas vezes pro mesmo cartão/ciclo, o segundo valor sobrescreve o primeiro.
|
|
239
|
+
|
|
240
|
+
## 9. Contas a pagar (bills)
|
|
241
|
+
|
|
242
|
+
O FIN tem um sistema de contas a pagar recorrentes. Cada conta (Light, condomínio, internet, faxina) é cadastrada como **bill** com dia de vencimento e valor padrão.
|
|
243
|
+
|
|
244
|
+
### Modelo
|
|
245
|
+
|
|
246
|
+
- **Bill (template):** conta recorrente cadastrada. Campos: `name`, `due_day` (1-31), `amount_type` ('fixed' ou 'variable'), `default_amount`, conta/categoria default.
|
|
247
|
+
- **Occurrence (instância mensal):** gerada automaticamente para cada mês consultado. Campos: `due_date`, `amount`, `status`, `transaction_id` (se paga).
|
|
248
|
+
|
|
249
|
+
### Status
|
|
250
|
+
|
|
251
|
+
| Status | Significado |
|
|
252
|
+
|--------|------------|
|
|
253
|
+
| `pending` | Aguardando vencimento — ainda não venceu e não foi paga |
|
|
254
|
+
| `overdue` | Vencida e não paga |
|
|
255
|
+
| `paid` | Paga no prazo |
|
|
256
|
+
| `paid_late` | Paga em atraso (data de pagamento > data de vencimento) |
|
|
257
|
+
|
|
258
|
+
### Fluxo típico
|
|
259
|
+
|
|
260
|
+
1. **"O que falta pagar?"** → `fin_bills_do_mes` retorna lista com status de cada conta do mês.
|
|
261
|
+
2. **Conciliando extrato:** encontrou pagamento de Light → `fin_pagar_bill` com o `occurrence_id` (do passo 1). O sistema cria a transação de despesa automaticamente e marca como paga.
|
|
262
|
+
3. **Nova conta:** usuário contratou novo serviço → `fin_criar_bill` cadastra a recorrência.
|
|
263
|
+
|
|
264
|
+
### Geração de ocorrências
|
|
265
|
+
|
|
266
|
+
As ocorrências são geradas **lazily**: ao consultar um mês (`fin_bills_do_mes`), o sistema verifica se as ocorrências já existem e cria as que faltam. Não precisa gerar manualmente.
|
|
267
|
+
|
|
268
|
+
### amount_type
|
|
269
|
+
|
|
270
|
+
- `fixed`: valor fixo todo mês (ex: condomínio R$1.383). O `amount` da ocorrência já vem preenchido.
|
|
271
|
+
- `variable`: valor muda (ex: Light). O `amount` da ocorrência vem `null` até ser definido no momento do pagamento.
|