@hed-hog/finance 0.0.270 → 0.0.274
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 +636 -437
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,467 +1,666 @@
|
|
|
1
|
-
# Finance
|
|
1
|
+
# Módulo Finance - Biblioteca HedHog
|
|
2
2
|
|
|
3
|
-
Este documento
|
|
3
|
+
Este documento técnico detalha o módulo financeiro `@hed-hog/finance` do monorepo HedHog, cobrindo sua visão geral, escopo, endpoints, regras de autenticação, estruturas de dados, erros comuns, banco de dados, regras de negócio e guia rápido de uso.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## 1. Visão geral do módulo
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- planejamento (título e parcelas);
|
|
11
|
-
- execução financeira (liquidação/baixa real);
|
|
12
|
-
- conciliação bancária (extrato x liquidação);
|
|
13
|
-
- governança (auditoria e fechamento de período);
|
|
14
|
-
- projeções futuras (cenários, fluxo projetado e agenda de recebíveis).
|
|
9
|
+
O módulo financeiro gerencia o ciclo completo da gestão financeira corporativa, incluindo cadastro, planejamento, execução, conciliação bancária, governança e projeções futuras. Ele suporta contas a pagar e receber, liquidações, conciliações, auditoria e fechamento de períodos, além de cenários de fluxo de caixa e agenda de recebíveis.
|
|
15
10
|
|
|
16
|
-
|
|
11
|
+
---
|
|
17
12
|
|
|
18
|
-
|
|
13
|
+
## 2. Escopo e responsabilidades
|
|
19
14
|
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
- Cadastro de entidades financeiras: filiais, categorias, centros de custo, contas bancárias, meios de pagamento.
|
|
16
|
+
- Planejamento financeiro: títulos financeiros e suas parcelas.
|
|
17
|
+
- Execução financeira: liquidação e baixa real de parcelas.
|
|
18
|
+
- Conciliação bancária: importação e associação de extratos bancários.
|
|
19
|
+
- Governança: auditoria de ações e fechamento operacional de períodos.
|
|
20
|
+
- Projeções financeiras: cenários, fluxo projetado e agenda de recebíveis.
|
|
21
|
+
- Gestão de transferências entre contas.
|
|
22
|
+
- Gestão de cobranças e acordos.
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
---
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
## 3. Endpoints
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
- `user`: autoria e rastreabilidade (`created_by`, `matched_by`, `closed_by`, etc.).
|
|
29
|
-
- `tag`: classificação analítica de parcelas.
|
|
30
|
-
- `file`: anexos de títulos.
|
|
28
|
+
### FinanceAuditLogsController
|
|
31
29
|
|
|
32
|
-
|
|
30
|
+
| Método | Path | Auth | Descrição | Parâmetros/Query | Resposta | Erros Comuns |
|
|
31
|
+
|--------|-----------------------|-------|----------------------------------|-------------------------------------------------------------------------------------------------|---------------------------------|-----------------------|
|
|
32
|
+
| GET | /finance/audit-logs | Sim | Lista logs de auditoria financeira | Query: `search`, `action`, `entity_table`, `actor_user_id`, `from`, `to`, paginação | Lista paginada de logs | 401 Unauthorized |
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
- Datas de competência e vencimento separadas para análises corretas.
|
|
36
|
-
- Histórico imutável de eventos financeiros: não apagar histórico; corrigir por estorno/ajuste.
|
|
34
|
+
---
|
|
37
35
|
|
|
38
|
-
|
|
36
|
+
### FinanceBankAccountsController
|
|
39
37
|
|
|
40
|
-
|
|
38
|
+
| Método | Path | Auth | Descrição | Parâmetros/Body | Resposta | Erros Comuns |
|
|
39
|
+
|--------|---------------------------|-------|----------------------------------|-------------------------------------------------------------------------------------------------|---------------------------------|-----------------------|
|
|
40
|
+
| GET | /finance/bank-accounts | Sim | Lista contas bancárias | - | Lista de contas bancárias | 401 Unauthorized |
|
|
41
|
+
| POST | /finance/bank-accounts | Sim | Cria nova conta bancária | Body: `{ bank: string, branch?: string, account?: string, type: string, description?: string, initial_balance?: number }` | Conta criada | 400 Validação |
|
|
42
|
+
| PATCH | /finance/bank-accounts/:id | Sim | Atualiza conta bancária | Body: campos opcionais para atualização (bank, branch, account, type, description, status) | Conta atualizada | 400 Validação, 404 |
|
|
43
|
+
| DELETE | /finance/bank-accounts/:id | Sim | Remove conta bancária | - | Confirmação de exclusão | 404 Not Found |
|
|
41
44
|
|
|
42
|
-
|
|
43
|
-
2. Gera `financial_installment` (parcelas).
|
|
44
|
-
3. Registra `settlement` (dinheiro real).
|
|
45
|
-
4. Liga settlement às parcelas em `settlement_allocation`.
|
|
46
|
-
5. Importa extrato (`bank_statement` e `bank_statement_line`).
|
|
47
|
-
6. Concilia extrato x settlement em `bank_reconciliation`.
|
|
45
|
+
---
|
|
48
46
|
|
|
49
|
-
|
|
47
|
+
### FinanceCategoriesController
|
|
50
48
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
| Método | Path | Auth | Descrição | Parâmetros/Body | Resposta | Erros Comuns |
|
|
50
|
+
|--------|---------------------------|-------|----------------------------------|-------------------------------------------------------------------------------------------------|---------------------------------|-----------------------|
|
|
51
|
+
| GET | /finance/categories | Sim | Lista categorias financeiras | - | Lista de categorias | 401 Unauthorized |
|
|
52
|
+
| POST | /finance/categories | Sim | Cria categoria financeira | Body: `{ name: string, kind: string, parent_id?: number }` | Categoria criada | 400 Validação |
|
|
53
|
+
| PATCH | /finance/categories/:id | Sim | Atualiza categoria financeira | Body: campos opcionais (name, kind, parent_id, status) | Categoria atualizada | 400 Validação, 404 |
|
|
54
|
+
| PATCH | /finance/categories/:id/move | Sim | Move categoria na hierarquia | Body: `{ parent_id?: number, position?: number }` | Categoria movida | 400 Validação, 404 |
|
|
55
|
+
| DELETE | /finance/categories/:id | Sim | Remove categoria financeira | - | Confirmação de exclusão | 404 Not Found |
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
---
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
### FinanceCollectionsController
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
| Método | Path | Auth | Descrição | Parâmetros/Body | Resposta | Erros Comuns |
|
|
62
|
+
|--------|----------------------------------------------------|-------|----------------------------------|-------------------------------------------------------------------------------------------------|---------------------------------|-----------------------|
|
|
63
|
+
| GET | /finance/accounts-receivable/collections-default | Sim | Obtém configurações padrão de cobrança | - | Configurações padrão | 401 Unauthorized |
|
|
64
|
+
| POST | /finance/accounts-receivable/collections-default/:personId/send | Sim | Envia mensagem de cobrança para pessoa | Body: `{ message: string, subject?: string }` | Confirmação de envio | 400 Validação, 404 |
|
|
65
|
+
| POST | /finance/accounts-receivable/collections-default/:personId/agreements | Sim | Registra acordo de cobrança para pessoa | Body: `{ amount: number, installments: number, first_due_date: string, notes?: string }` | Acordo registrado | 400 Validação, 404 |
|
|
62
66
|
|
|
63
|
-
|
|
67
|
+
---
|
|
64
68
|
|
|
65
|
-
|
|
66
|
-
- `code`: identificador curto/estável para integração e referência.
|
|
67
|
-
- `status`: `active|inactive`.
|
|
68
|
-
- `default_currency`: moeda padrão (ex.: `BRL`).
|
|
69
|
-
- `timezone`: timezone padrão (ex.: `America/Sao_Paulo`).
|
|
70
|
-
- `created_at`, `updated_at`: auditoria temporal.
|
|
69
|
+
### FinanceCostCentersController
|
|
71
70
|
|
|
72
|
-
|
|
71
|
+
| Método | Path | Auth | Descrição | Parâmetros/Body | Resposta | Erros Comuns |
|
|
72
|
+
|--------|---------------------------|-------|----------------------------------|-------------------------------------------------------------------------------------------------|---------------------------------|-----------------------|
|
|
73
|
+
| GET | /finance/cost-centers | Sim | Lista centros de custo | - | Lista de centros de custo | 401 Unauthorized |
|
|
74
|
+
| POST | /finance/cost-centers | Sim | Cria centro de custo | Body: `{ name: string }` | Centro criado | 400 Validação |
|
|
75
|
+
| PATCH | /finance/cost-centers/:id | Sim | Atualiza centro de custo | Body: `{ name?: string, status?: 'active' | 'inactive' }` | Centro atualizado | 400 Validação, 404 |
|
|
76
|
+
| DELETE | /finance/cost-centers/:id | Sim | Remove centro de custo | - | Confirmação de exclusão | 404 Not Found |
|
|
73
77
|
|
|
74
|
-
|
|
78
|
+
---
|
|
75
79
|
|
|
76
|
-
|
|
80
|
+
### FinanceDataController
|
|
77
81
|
|
|
78
|
-
|
|
82
|
+
| Método | Path | Auth | Descrição | Parâmetros/Query | Resposta | Erros Comuns |
|
|
83
|
+
|--------|-----------------------|-------|----------------------------------|-------------------------------------------------------------------------------------------------|---------------------------------|-----------------------|
|
|
84
|
+
| GET | /finance/data | Sim | Obtém dados financeiros com filtros | Query: `horizonte` (dias), `cenario` (nome do cenário) | Dados financeiros filtrados | 401 Unauthorized |
|
|
85
|
+
| PATCH | /finance/scenarios/:cenario | Sim | Atualiza configurações do cenário | Body: `{ atrasoMedio: number, taxaInadimplencia: number, crescimentoReceita: number, setAsDefault?: boolean }` | Cenário atualizado | 400 Validação, 404 |
|
|
79
86
|
|
|
80
|
-
|
|
81
|
-
- `parent_id`: auto-relacionamento para hierarquia (nullable).
|
|
82
|
-
- `code`: código da categoria.
|
|
83
|
-
- `name`: nome da categoria.
|
|
84
|
-
- `kind`: `revenue|expense|transfer|adjustment|other`.
|
|
85
|
-
- `status`: `active|inactive`.
|
|
86
|
-
- `created_at`, `updated_at`.
|
|
87
|
+
---
|
|
87
88
|
|
|
88
|
-
|
|
89
|
+
### FinanceInstallmentsController
|
|
89
90
|
|
|
90
|
-
|
|
91
|
-
- Referenciada por `financial_title.finance_category_id`.
|
|
91
|
+
Endpoints para contas a pagar e receber, títulos, parcelas, liquidações, estornos, tags e extração de dados de arquivos.
|
|
92
92
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
-
|
|
100
|
-
- `
|
|
101
|
-
- `
|
|
102
|
-
-
|
|
103
|
-
- `
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
- `
|
|
116
|
-
- `
|
|
117
|
-
|
|
118
|
-
- `
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
-
|
|
155
|
-
- `
|
|
156
|
-
-
|
|
157
|
-
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
**
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
-
|
|
249
|
-
-
|
|
250
|
-
-
|
|
251
|
-
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
**
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
- `
|
|
265
|
-
- `
|
|
266
|
-
- `
|
|
267
|
-
- `
|
|
268
|
-
- `
|
|
269
|
-
- `
|
|
270
|
-
-
|
|
271
|
-
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
**Colunas:**
|
|
280
|
-
|
|
281
|
-
- `
|
|
282
|
-
- `
|
|
283
|
-
- `
|
|
284
|
-
- `
|
|
285
|
-
- `
|
|
286
|
-
- `
|
|
287
|
-
- `
|
|
288
|
-
- `
|
|
289
|
-
|
|
290
|
-
**
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
**Colunas:**
|
|
299
|
-
|
|
300
|
-
- `
|
|
301
|
-
- `
|
|
302
|
-
- `
|
|
303
|
-
- `
|
|
304
|
-
- `
|
|
305
|
-
-
|
|
306
|
-
-
|
|
307
|
-
-
|
|
308
|
-
- `
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
- `
|
|
322
|
-
- `
|
|
323
|
-
-
|
|
324
|
-
-
|
|
325
|
-
-
|
|
326
|
-
- `
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
**
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
- `
|
|
338
|
-
- `
|
|
339
|
-
- `
|
|
340
|
-
- `
|
|
341
|
-
- `
|
|
342
|
-
- `
|
|
343
|
-
- `
|
|
344
|
-
- `
|
|
345
|
-
-
|
|
346
|
-
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
-
|
|
355
|
-
-
|
|
356
|
-
- `
|
|
357
|
-
- `
|
|
358
|
-
- `
|
|
359
|
-
- `
|
|
360
|
-
- `
|
|
361
|
-
- `
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
**
|
|
370
|
-
|
|
371
|
-
-
|
|
372
|
-
- `
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
-
|
|
380
|
-
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
- `
|
|
389
|
-
- `
|
|
390
|
-
- `
|
|
391
|
-
- `
|
|
392
|
-
-
|
|
393
|
-
- `
|
|
394
|
-
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
**
|
|
401
|
-
|
|
402
|
-
- `id
|
|
403
|
-
- `
|
|
404
|
-
- `
|
|
405
|
-
- `
|
|
406
|
-
- `
|
|
407
|
-
- `
|
|
408
|
-
- `
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
-
|
|
445
|
-
-
|
|
446
|
-
-
|
|
447
|
-
-
|
|
448
|
-
- `
|
|
449
|
-
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
-
|
|
454
|
-
-
|
|
455
|
-
-
|
|
456
|
-
-
|
|
457
|
-
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
93
|
+
| Método | Path | Auth | Descrição | Parâmetros/Body/Query | Resposta | Erros Comuns |
|
|
94
|
+
|--------|-------------------------------------------------------------|-------|----------------------------------|-------------------------------------------------------------------------------------------------------|---------------------------------|-----------------------|
|
|
95
|
+
| GET | /finance/accounts-payable/installments | Sim | Lista parcelas contas a pagar | Query: `status`, paginação | Lista paginada | 401 Unauthorized |
|
|
96
|
+
| GET | /finance/accounts-payable/installments/:id | Sim | Detalha parcela contas a pagar | Path param: `id` | Detalhes da parcela | 404 Not Found |
|
|
97
|
+
| POST | /finance/accounts-payable/installments | Sim | Cria título contas a pagar | Body: `CreateFinancialTitleDto` | Título criado | 400 Validação |
|
|
98
|
+
| PATCH | /finance/accounts-payable/installments/:id | Sim | Atualiza título contas a pagar | Body: `CreateFinancialTitleDto` | Título atualizado | 400 Validação, 404 |
|
|
99
|
+
| PATCH | /finance/accounts-payable/installments/:id/approve | Sim | Aprova título contas a pagar | - | Título aprovado | 404 Not Found |
|
|
100
|
+
| PATCH | /finance/accounts-payable/installments/:id/reject | Sim | Rejeita título contas a pagar | Body: `{ reason?: string }` | Título rejeitado | 400 Validação, 404 |
|
|
101
|
+
| PATCH | /finance/accounts-payable/installments/:id/cancel | Sim | Cancela título contas a pagar | Body: `{ reason?: string }` | Título cancelado | 400 Validação, 404 |
|
|
102
|
+
| POST | /finance/accounts-payable/installments/:id/settlements | Sim | Registra liquidação parcela | Body: dados de liquidação (ver DTO SettleInstallmentDto) | Liquidação registrada | 400 Validação, 404 |
|
|
103
|
+
| PATCH | /finance/accounts-payable/installments/:id/settlements/:settlementId/reverse | Sim | Estorna liquidação parcela | Body: `{ reason?: string, memo?: string }` | Liquidação estornada | 400 Validação, 404 |
|
|
104
|
+
| PATCH | /finance/settlements/:id/reverse | Sim | Estorna liquidação por id | Body: `{ reason?: string, memo?: string }` | Liquidação estornada | 400 Validação, 404 |
|
|
105
|
+
| DELETE | /finance/bank-reconciliations/:id | Sim | Desfaz conciliação bancária | - | Conciliação desfeita | 404 Not Found |
|
|
106
|
+
| PATCH | /finance/accounts-payable/installments/:id/tags | Sim | Atualiza tags da parcela | Body: `{ tag_ids?: number[] }` | Tags atualizadas | 400 Validação, 404 |
|
|
107
|
+
| POST | /finance/accounts-payable/installments/extract-from-file | Sim | Extrai dados de título de arquivo | Multipart file + Body: `{ file_id?: number }` | Dados extraídos | 400 Validação |
|
|
108
|
+
| GET | /finance/accounts-receivable/installments | Sim | Lista parcelas contas a receber | Query: `status`, paginação | Lista paginada | 401 Unauthorized |
|
|
109
|
+
| GET | /finance/accounts-receivable/installments/:id | Sim | Detalha parcela contas a receber | Path param: `id` | Detalhes da parcela | 404 Not Found |
|
|
110
|
+
| POST | /finance/accounts-receivable/installments | Sim | Cria título contas a receber | Body: `CreateFinancialTitleDto` | Título criado | 400 Validação |
|
|
111
|
+
| PATCH | /finance/accounts-receivable/installments/:id | Sim | Atualiza título contas a receber | Body: `CreateFinancialTitleDto` | Título atualizado | 400 Validação, 404 |
|
|
112
|
+
| PATCH | /finance/accounts-receivable/installments/:id/approve | Sim | Aprova título contas a receber | - | Título aprovado | 404 Not Found |
|
|
113
|
+
| PATCH | /finance/accounts-receivable/installments/:id/cancel | Sim | Cancela título contas a receber | Body: `{ reason?: string }` | Título cancelado | 400 Validação, 404 |
|
|
114
|
+
| POST | /finance/accounts-receivable/installments/:id/settlements | Sim | Registra liquidação parcela | Body: dados de liquidação (ver DTO SettleInstallmentDto) | Liquidação registrada | 400 Validação, 404 |
|
|
115
|
+
| PATCH | /finance/accounts-receivable/installments/:id/settlements/:settlementId/reverse | Sim | Estorna liquidação parcela | Body: `{ reason?: string, memo?: string }` | Liquidação estornada | 400 Validação, 404 |
|
|
116
|
+
| PATCH | /finance/accounts-receivable/installments/:id/tags | Sim | Atualiza tags da parcela | Body: `{ tag_ids?: number[] }` | Tags atualizadas | 400 Validação, 404 |
|
|
117
|
+
| POST | /finance/tags | Sim | Cria tag financeira | Body: `{ name: string, color?: string }` | Tag criada | 400 Validação |
|
|
118
|
+
| POST | /finance/accounts-receivable/installments/extract-from-file | Sim | Extrai dados de título de arquivo | Multipart file + Body: `{ file_id?: number }` | Dados extraídos | 400 Validação |
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
### FinancePeriodCloseController
|
|
123
|
+
|
|
124
|
+
| Método | Path | Auth | Descrição | Parâmetros/Body | Resposta | Erros Comuns |
|
|
125
|
+
|--------|-------------------|-------|----------------------------------|-------------------------------------------------------------------------------------------------|---------------------------------|-----------------------|
|
|
126
|
+
| GET | /finance/period-close | Sim | Lista fechamentos de períodos | Query: `search`, `status`, `user`, `from`, `to`, paginação | Lista paginada | 401 Unauthorized |
|
|
127
|
+
| POST | /finance/period-close | Sim | Cria fechamento de período | Body: `{ period_start: string, period_end: string, notes?: string, status?: 'open' | 'closed' }` | Fechamento criado | 400 Validação |
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
### FinanceStatementsController
|
|
132
|
+
|
|
133
|
+
| Método | Path | Auth | Descrição | Parâmetros/Query/Body | Resposta | Erros Comuns |
|
|
134
|
+
|--------|-------------------------------|-------|----------------------------------|-------------------------------------------------------------------------------------------------------|---------------------------------|-----------------------|
|
|
135
|
+
| GET | /finance/statements | Sim | Lista extratos bancários | Query: `bank_account_id`, `search` | Lista de extratos | 400 BadRequest, 401 |
|
|
136
|
+
| GET | /finance/bank-reconciliation/summary | Sim | Resumo da conciliação bancária | Query: `bank_account_id` (obrigatório) | Resumo da conciliação | 400 BadRequest, 401 |
|
|
137
|
+
| GET | /finance/statements/export | Sim | Exporta extratos em CSV | Query: `bank_account_id` (obrigatório), `search` | CSV para download | 400 BadRequest, 401 |
|
|
138
|
+
| POST | /finance/statements/import | Sim | Importa extrato bancário | Multipart file + Body: `bank_account_id` (obrigatório) | Importação realizada | 400 BadRequest, 401 |
|
|
139
|
+
| POST | /finance/statements/adjustments | Sim | Cria ajuste em extrato bancário | Body: `{ bank_account_id: number, amount: number, date?: string, type: string, description?: string }` | Ajuste criado | 400 Validação, 401 |
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
### FinanceTransfersController
|
|
144
|
+
|
|
145
|
+
| Método | Path | Auth | Descrição | Parâmetros/Query/Body | Resposta | Erros Comuns |
|
|
146
|
+
|--------|-------------------|-------|----------------------------------|-------------------------------------------------------------------------------------------------------|---------------------------------|-----------------------|
|
|
147
|
+
| GET | /finance/transfers | Sim | Lista transferências | Query: `search`, `bank_account_id` | Lista de transferências | 401 Unauthorized |
|
|
148
|
+
| POST | /finance/transfers | Sim | Cria transferência entre contas | Body: `{ source_account_id: number, destination_account_id: number, date: string, amount: number, description?: string }` | Transferência criada | 400 Validação |
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 4. Regras de autenticação e autorização
|
|
153
|
+
|
|
154
|
+
- Todos os endpoints requerem autenticação via token válido.
|
|
155
|
+
- O decorator `@Role()` indica que o acesso é restrito a usuários autenticados.
|
|
156
|
+
- Controle de permissões específicas deve ser implementado na camada de serviço conforme regras de negócio.
|
|
157
|
+
- Usuários são identificados via decorator `@User()` para rastreabilidade.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## 5. Estruturas de request/response
|
|
162
|
+
|
|
163
|
+
### Exemplos de DTOs principais
|
|
164
|
+
|
|
165
|
+
- **CreateBankAccountDto**
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
{
|
|
169
|
+
bank: string; // obrigatório
|
|
170
|
+
branch?: string;
|
|
171
|
+
account?: string;
|
|
172
|
+
type: string; // obrigatório
|
|
173
|
+
description?: string;
|
|
174
|
+
initial_balance?: number; // >= 0
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
- **CreateFinancialTitleDto**
|
|
179
|
+
|
|
180
|
+
```ts
|
|
181
|
+
{
|
|
182
|
+
document_number: string; // obrigatório
|
|
183
|
+
person_id: number; // obrigatório
|
|
184
|
+
competence_date?: string (ISO date);
|
|
185
|
+
issue_date?: string (ISO date);
|
|
186
|
+
due_date: string (ISO date); // obrigatório
|
|
187
|
+
total_amount: number; // obrigatório, >= 0.01
|
|
188
|
+
finance_category_id?: number;
|
|
189
|
+
cost_center_id?: number;
|
|
190
|
+
payment_channel?: string;
|
|
191
|
+
description?: string;
|
|
192
|
+
installments?: [
|
|
193
|
+
{
|
|
194
|
+
installment_number?: number; // >= 1
|
|
195
|
+
due_date: string (ISO date);
|
|
196
|
+
amount: number; // >= 0.01
|
|
197
|
+
}
|
|
198
|
+
];
|
|
199
|
+
attachment_file_ids?: number[];
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
- **SettleInstallmentDto**
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
{
|
|
207
|
+
installment_id: number; // obrigatório
|
|
208
|
+
amount: number; // obrigatório, >= 0.01
|
|
209
|
+
settled_at?: string (ISO date);
|
|
210
|
+
bank_account_id?: number;
|
|
211
|
+
bank_statement_line_id?: number;
|
|
212
|
+
payment_channel?: string;
|
|
213
|
+
discount?: number; // >= 0
|
|
214
|
+
interest?: number; // >= 0
|
|
215
|
+
penalty?: number; // >= 0
|
|
216
|
+
description?: string;
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
- **CreateBankStatementAdjustmentDto**
|
|
221
|
+
|
|
222
|
+
```ts
|
|
223
|
+
{
|
|
224
|
+
bank_account_id: number; // obrigatório
|
|
225
|
+
amount: number; // obrigatório, >= 0.01
|
|
226
|
+
date?: string (ISO date);
|
|
227
|
+
type: string; // obrigatório
|
|
228
|
+
description?: string;
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
- **CreateTransferDto**
|
|
233
|
+
|
|
234
|
+
```ts
|
|
235
|
+
{
|
|
236
|
+
source_account_id: number; // obrigatório
|
|
237
|
+
destination_account_id: number; // obrigatório
|
|
238
|
+
date: string; // obrigatório
|
|
239
|
+
amount: number; // obrigatório, >= 0.01
|
|
240
|
+
description?: string;
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## 6. Erros comuns
|
|
247
|
+
|
|
248
|
+
- **400 Bad Request**: dados inválidos ou ausentes conforme validações dos DTOs.
|
|
249
|
+
- **401 Unauthorized**: ausência ou invalidez do token de autenticação.
|
|
250
|
+
- **404 Not Found**: recurso não encontrado (ex.: id inválido).
|
|
251
|
+
- **409 Conflict**: tentativas de duplicidade em tabelas com unicidade (ex.: tags, rateios).
|
|
252
|
+
- **422 Unprocessable Entity**: violações de regras de negócio (ex.: saldo insuficiente, período fechado).
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 7. Banco de dados (tabelas YAML)
|
|
257
|
+
|
|
258
|
+
### company_profile
|
|
259
|
+
|
|
260
|
+
- **Finalidade:** Configurações globais financeiras (status, moeda, timezone).
|
|
261
|
+
- **Colunas:**
|
|
262
|
+
- `id` (PK)
|
|
263
|
+
- `code` (string, único)
|
|
264
|
+
- `status` (enum: `active`, `inactive`)
|
|
265
|
+
- `default_currency` (string, ex: `BRL`)
|
|
266
|
+
- `timezone` (string, ex: `America/Sao_Paulo`)
|
|
267
|
+
- `created_at`, `updated_at` (timestamps)
|
|
268
|
+
- **Defaults:** `status = active`
|
|
269
|
+
- **Nulabilidade:** `code`, `default_currency`, `timezone` não nulos
|
|
270
|
+
- **Integridade:** PK em `id`
|
|
271
|
+
- **Indices:** índice único em `code`
|
|
272
|
+
- **Enums:** `status`
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
### finance_category
|
|
277
|
+
|
|
278
|
+
- **Finalidade:** Categorias financeiras hierárquicas.
|
|
279
|
+
- **Colunas:**
|
|
280
|
+
- `id` (PK)
|
|
281
|
+
- `parent_id` (FK para self, nullable)
|
|
282
|
+
- `code` (string)
|
|
283
|
+
- `name` (string)
|
|
284
|
+
- `kind` (enum: `revenue`, `expense`, `transfer`, `adjustment`, `other`)
|
|
285
|
+
- `status` (enum: `active`, `inactive`)
|
|
286
|
+
- `created_at`, `updated_at`
|
|
287
|
+
- **Defaults:** `status = active`
|
|
288
|
+
- **Nulabilidade:** `parent_id` nullable
|
|
289
|
+
- **Integridade:** FK para `parent_id`
|
|
290
|
+
- **Indices:** índice em `code`
|
|
291
|
+
- **Enums:** `kind`, `status`
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
### cost_center
|
|
296
|
+
|
|
297
|
+
- **Finalidade:** Centros de custo para rateio.
|
|
298
|
+
- **Colunas:**
|
|
299
|
+
- `id` (PK)
|
|
300
|
+
- `code` (string)
|
|
301
|
+
- `name` (string)
|
|
302
|
+
- `status` (enum: `active`, `inactive`)
|
|
303
|
+
- `created_at`, `updated_at`
|
|
304
|
+
- **Defaults:** `status = active`
|
|
305
|
+
- **Nulabilidade:** não nulo
|
|
306
|
+
- **Integridade:** PK em `id`
|
|
307
|
+
- **Indices:** índice em `code`
|
|
308
|
+
- **Enums:** `status`
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
### payment_method
|
|
313
|
+
|
|
314
|
+
- **Finalidade:** Meios de pagamento configuráveis.
|
|
315
|
+
- **Colunas:**
|
|
316
|
+
- `id` (PK)
|
|
317
|
+
- `code` (string)
|
|
318
|
+
- `name` (string)
|
|
319
|
+
- `type` (enum: `pix`, `boleto`, `ted`, `doc`, `card`, `cash`, `other`)
|
|
320
|
+
- `status` (enum: `active`, `inactive`)
|
|
321
|
+
- `created_at`, `updated_at`
|
|
322
|
+
- **Defaults:** `status = active`
|
|
323
|
+
- **Nulabilidade:** não nulo
|
|
324
|
+
- **Integridade:** PK em `id`
|
|
325
|
+
- **Indices:** índice em `code`
|
|
326
|
+
- **Enums:** `type`, `status`
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
### bank_account
|
|
331
|
+
|
|
332
|
+
- **Finalidade:** Contas bancárias e caixas.
|
|
333
|
+
- **Colunas:**
|
|
334
|
+
- `id` (PK)
|
|
335
|
+
- `code` (string)
|
|
336
|
+
- `name` (string)
|
|
337
|
+
- `bank_name` (string, nullable)
|
|
338
|
+
- `bank_code` (string, nullable)
|
|
339
|
+
- `agency` (string, nullable)
|
|
340
|
+
- `account_number` (string, nullable)
|
|
341
|
+
- `account_type` (enum: `checking`, `savings`, `investment`, `cash`, `other`)
|
|
342
|
+
- `status` (enum: `active`, `inactive`)
|
|
343
|
+
- `created_at`, `updated_at`
|
|
344
|
+
- **Defaults:** `status = active`
|
|
345
|
+
- **Nulabilidade:** campos bancários nullable
|
|
346
|
+
- **Integridade:** PK em `id`
|
|
347
|
+
- **Indices:** índice em `code`
|
|
348
|
+
- **Enums:** `account_type`, `status`
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
### financial_title
|
|
353
|
+
|
|
354
|
+
- **Finalidade:** Documento pai de contas a pagar/receber.
|
|
355
|
+
- **Colunas:**
|
|
356
|
+
- `id` (PK)
|
|
357
|
+
- `person_id` (FK para `person.id`)
|
|
358
|
+
- `title_type` (enum: `payable`, `receivable`)
|
|
359
|
+
- `status` (enum: `draft`, `open`, `partial`, `settled`, `canceled`, `overdue`)
|
|
360
|
+
- `document_number` (string, nullable)
|
|
361
|
+
- `description` (string, nullable)
|
|
362
|
+
- `competence_date` (date, nullable)
|
|
363
|
+
- `issue_date` (date, nullable)
|
|
364
|
+
- `total_amount_cents` (integer)
|
|
365
|
+
- `finance_category_id` (FK para `finance_category.id`, nullable)
|
|
366
|
+
- `created_by_user_id` (FK para `user.id`, nullable)
|
|
367
|
+
- `created_at`, `updated_at`
|
|
368
|
+
- **Defaults:** `status = draft`
|
|
369
|
+
- **Nulabilidade:** campos opcionais nullable
|
|
370
|
+
- **Integridade:** FK para `person`, `finance_category`, `user`
|
|
371
|
+
- **Indices:** índice em `document_number`
|
|
372
|
+
- **Enums:** `title_type`, `status`
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
### financial_installment
|
|
377
|
+
|
|
378
|
+
- **Finalidade:** Parcelas de títulos financeiros.
|
|
379
|
+
- **Colunas:**
|
|
380
|
+
- `id` (PK)
|
|
381
|
+
- `title_id` (FK para `financial_title.id`)
|
|
382
|
+
- `installment_number` (integer)
|
|
383
|
+
- `competence_date` (date)
|
|
384
|
+
- `due_date` (date)
|
|
385
|
+
- `amount_cents` (integer)
|
|
386
|
+
- `open_amount_cents` (integer)
|
|
387
|
+
- `status` (enum: `open`, `partial`, `settled`, `canceled`, `overdue`)
|
|
388
|
+
- `notes` (string, nullable)
|
|
389
|
+
- `created_at`, `updated_at`
|
|
390
|
+
- **Defaults:** `status = open`
|
|
391
|
+
- **Nulabilidade:** `notes` nullable
|
|
392
|
+
- **Integridade:** FK para `financial_title`
|
|
393
|
+
- **Indices:** índice composto em `title_id`, `installment_number`
|
|
394
|
+
- **Enums:** `status`
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
### settlement
|
|
399
|
+
|
|
400
|
+
- **Finalidade:** Evento financeiro real (pagamento, recebimento, transferência, ajuste).
|
|
401
|
+
- **Colunas:**
|
|
402
|
+
- `id` (PK)
|
|
403
|
+
- `person_id` (FK para `person.id`, nullable)
|
|
404
|
+
- `bank_account_id` (FK para `bank_account.id`, nullable)
|
|
405
|
+
- `payment_method_id` (FK para `payment_method.id`, nullable)
|
|
406
|
+
- `settlement_type` (enum: `payable`, `receivable`, `transfer`, `adjustment`)
|
|
407
|
+
- `status` (enum: `pending`, `confirmed`, `reversed`)
|
|
408
|
+
- `settled_at` (datetime)
|
|
409
|
+
- `amount_cents` (integer)
|
|
410
|
+
- `description` (string, nullable)
|
|
411
|
+
- `external_reference` (string, nullable)
|
|
412
|
+
- `created_by_user_id` (FK para `user.id`, nullable)
|
|
413
|
+
- `created_at`, `updated_at`
|
|
414
|
+
- **Defaults:** `status = pending`
|
|
415
|
+
- **Nulabilidade:** campos opcionais nullable
|
|
416
|
+
- **Integridade:** FK para `person`, `bank_account`, `payment_method`, `user`
|
|
417
|
+
- **Indices:** índice em `settled_at`
|
|
418
|
+
- **Enums:** `settlement_type`, `status`
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
### bank_statement
|
|
423
|
+
|
|
424
|
+
- **Finalidade:** Lote de importação de extrato bancário.
|
|
425
|
+
- **Colunas:**
|
|
426
|
+
- `id` (PK)
|
|
427
|
+
- `bank_account_id` (FK para `bank_account.id`)
|
|
428
|
+
- `source_type` (enum: `ofx`, `csv`, `manual`)
|
|
429
|
+
- `idempotency_key` (string, nullable)
|
|
430
|
+
- `period_start` (date, nullable)
|
|
431
|
+
- `period_end` (date, nullable)
|
|
432
|
+
- `imported_at` (datetime)
|
|
433
|
+
- `imported_by_user_id` (FK para `user.id`, nullable)
|
|
434
|
+
- `created_at`, `updated_at`
|
|
435
|
+
- **Defaults:** -
|
|
436
|
+
- **Nulabilidade:** campos opcionais nullable
|
|
437
|
+
- **Integridade:** FK para `bank_account`, `user`
|
|
438
|
+
- **Enums:** `source_type`
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
### bank_statement_line
|
|
443
|
+
|
|
444
|
+
- **Finalidade:** Transações individuais do extrato.
|
|
445
|
+
- **Colunas:**
|
|
446
|
+
- `id` (PK)
|
|
447
|
+
- `bank_statement_id` (FK para `bank_statement.id`)
|
|
448
|
+
- `bank_account_id` (FK para `bank_account.id`)
|
|
449
|
+
- `external_id` (string, nullable)
|
|
450
|
+
- `posted_date` (date)
|
|
451
|
+
- `amount_cents` (integer)
|
|
452
|
+
- `description` (string)
|
|
453
|
+
- `status` (enum: `imported`, `pending`, `reconciled`, `reversed`, `adjusted`)
|
|
454
|
+
- `dedupe_key` (string, único)
|
|
455
|
+
- `created_at`, `updated_at`
|
|
456
|
+
- **Defaults:** `status = imported`
|
|
457
|
+
- **Nulabilidade:** `external_id` nullable
|
|
458
|
+
- **Integridade:** FK para `bank_statement`, `bank_account`
|
|
459
|
+
- **Indices:** índice único em `dedupe_key`
|
|
460
|
+
- **Enums:** `status`
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
### bank_reconciliation
|
|
465
|
+
|
|
466
|
+
- **Finalidade:** Associação entre linha de extrato e settlement.
|
|
467
|
+
- **Colunas:**
|
|
468
|
+
- `id` (PK)
|
|
469
|
+
- `bank_statement_line_id` (FK para `bank_statement_line.id`, único)
|
|
470
|
+
- `settlement_id` (FK para `settlement.id`, único)
|
|
471
|
+
- `status` (enum: `pending`, `reconciled`, `reversed`, `adjusted`)
|
|
472
|
+
- `matched_at` (datetime, nullable)
|
|
473
|
+
- `matched_by_user_id` (FK para `user.id`, nullable)
|
|
474
|
+
- `created_at`, `updated_at`
|
|
475
|
+
- **Defaults:** `status = pending`
|
|
476
|
+
- **Nulabilidade:** `matched_at`, `matched_by_user_id` nullable
|
|
477
|
+
- **Integridade:** FK para `bank_statement_line`, `settlement`, `user`
|
|
478
|
+
- **Indices:** unicidade em `bank_statement_line_id` e `settlement_id`
|
|
479
|
+
- **Enums:** `status`
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
### audit_log
|
|
484
|
+
|
|
485
|
+
- **Finalidade:** Registro de auditoria funcional.
|
|
486
|
+
- **Colunas:**
|
|
487
|
+
- `id` (PK)
|
|
488
|
+
- `actor_user_id` (FK para `user.id`, nullable)
|
|
489
|
+
- `action` (string)
|
|
490
|
+
- `entity_table` (string)
|
|
491
|
+
- `entity_id` (string)
|
|
492
|
+
- `summary` (string, nullable)
|
|
493
|
+
- `before_data` (json, nullable)
|
|
494
|
+
- `after_data` (json, nullable)
|
|
495
|
+
- `ip_address` (string, nullable)
|
|
496
|
+
- `created_at`, `updated_at`
|
|
497
|
+
- **Defaults:** -
|
|
498
|
+
- **Nulabilidade:** campos opcionais nullable
|
|
499
|
+
- **Integridade:** FK para `user`
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
### period_close
|
|
504
|
+
|
|
505
|
+
- **Finalidade:** Controle de fechamento operacional de períodos.
|
|
506
|
+
- **Colunas:**
|
|
507
|
+
- `id` (PK)
|
|
508
|
+
- `period_start` (date)
|
|
509
|
+
- `period_end` (date)
|
|
510
|
+
- `status` (enum: `open`, `closed`)
|
|
511
|
+
- `closed_at` (datetime, nullable)
|
|
512
|
+
- `closed_by_user_id` (FK para `user.id`, nullable)
|
|
513
|
+
- `notes` (string, nullable)
|
|
514
|
+
- `created_at`, `updated_at`
|
|
515
|
+
- **Defaults:** `status = open`
|
|
516
|
+
- **Nulabilidade:** campos opcionais nullable
|
|
517
|
+
- **Integridade:** FK para `user`
|
|
518
|
+
- **Enums:** `status`
|
|
519
|
+
|
|
520
|
+
---
|
|
521
|
+
|
|
522
|
+
### forecast_scenario
|
|
523
|
+
|
|
524
|
+
- **Finalidade:** Cenários de planejamento financeiro.
|
|
525
|
+
- **Colunas:**
|
|
526
|
+
- `id` (PK)
|
|
527
|
+
- `name` (string)
|
|
528
|
+
- `status` (enum: `active`, `inactive`)
|
|
529
|
+
- `is_default` (boolean)
|
|
530
|
+
- `created_at`, `updated_at`
|
|
531
|
+
- **Defaults:** `status = active`, `is_default = false`
|
|
532
|
+
- **Nulabilidade:** não nulo
|
|
533
|
+
- **Enums:** `status`
|
|
534
|
+
|
|
535
|
+
---
|
|
536
|
+
|
|
537
|
+
### cashflow_projection
|
|
538
|
+
|
|
539
|
+
- **Finalidade:** Projeções de fluxo de caixa.
|
|
540
|
+
- **Colunas:**
|
|
541
|
+
- `id` (PK)
|
|
542
|
+
- `scenario_id` (FK para `forecast_scenario.id`)
|
|
543
|
+
- `projection_date` (date)
|
|
544
|
+
- `projection_type` (enum: `inflow`, `outflow`, `net`)
|
|
545
|
+
- `amount_cents` (integer)
|
|
546
|
+
- `notes` (string, nullable)
|
|
547
|
+
- `created_at`, `updated_at`
|
|
548
|
+
- **Enums:** `projection_type`
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
### receivable_schedule
|
|
553
|
+
|
|
554
|
+
- **Finalidade:** Agenda de recebíveis previstos.
|
|
555
|
+
- **Colunas:**
|
|
556
|
+
- `id` (PK)
|
|
557
|
+
- `scenario_id` (FK para `forecast_scenario.id`)
|
|
558
|
+
- `person_id` (FK para `person.id`, nullable)
|
|
559
|
+
- `expected_date` (date)
|
|
560
|
+
- `amount_cents` (integer)
|
|
561
|
+
- `description` (string, nullable)
|
|
562
|
+
- `created_at`, `updated_at`
|
|
563
|
+
|
|
564
|
+
---
|
|
565
|
+
|
|
566
|
+
## 8. Regras de negócio relevantes
|
|
567
|
+
|
|
568
|
+
- Valores monetários são armazenados em centavos para evitar erros de precisão.
|
|
569
|
+
- Datas de competência e vencimento são separadas para análises corretas.
|
|
570
|
+
- Histórico financeiro é imutável; correções são feitas via estorno ou ajuste, nunca exclusão.
|
|
571
|
+
- Saldo aberto de parcelas (`open_amount_cents`) deve ser >= 0 e <= valor original.
|
|
572
|
+
- Rateios e alocações devem respeitar unicidade e somatórios coerentes.
|
|
573
|
+
- Períodos fechados bloqueiam operações diretas, permitindo apenas estornos sob regras.
|
|
574
|
+
- Conciliações bancárias são 1:1 entre linha de extrato e settlement.
|
|
575
|
+
- Auditoria é obrigatória para alterações relevantes.
|
|
576
|
+
- Importação de extratos deve usar chave de deduplicação estável para evitar duplicidade.
|
|
577
|
+
|
|
578
|
+
---
|
|
579
|
+
|
|
580
|
+
## 9. Guia rápido de uso (exemplos)
|
|
581
|
+
|
|
582
|
+
### Criar conta bancária
|
|
583
|
+
|
|
584
|
+
```http
|
|
585
|
+
POST /finance/bank-accounts
|
|
586
|
+
Authorization: Bearer <token>
|
|
587
|
+
Content-Type: application/json
|
|
588
|
+
|
|
589
|
+
{
|
|
590
|
+
"bank": "Banco do Brasil",
|
|
591
|
+
"branch": "1234",
|
|
592
|
+
"account": "56789-0",
|
|
593
|
+
"type": "checking",
|
|
594
|
+
"description": "Conta principal",
|
|
595
|
+
"initial_balance": 100000
|
|
596
|
+
}
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
### Criar título contas a pagar com parcelas
|
|
600
|
+
|
|
601
|
+
```http
|
|
602
|
+
POST /finance/accounts-payable/installments
|
|
603
|
+
Authorization: Bearer <token>
|
|
604
|
+
Content-Type: application/json
|
|
605
|
+
|
|
606
|
+
{
|
|
607
|
+
"document_number": "FAT-2024-001",
|
|
608
|
+
"person_id": 123,
|
|
609
|
+
"due_date": "2024-07-31",
|
|
610
|
+
"total_amount": 1500.00,
|
|
611
|
+
"installments": [
|
|
612
|
+
{ "installment_number": 1, "due_date": "2024-07-31", "amount": 500.00 },
|
|
613
|
+
{ "installment_number": 2, "due_date": "2024-08-31", "amount": 500.00 },
|
|
614
|
+
{ "installment_number": 3, "due_date": "2024-09-30", "amount": 500.00 }
|
|
615
|
+
]
|
|
616
|
+
}
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
### Registrar liquidação de parcela
|
|
620
|
+
|
|
621
|
+
```http
|
|
622
|
+
POST /finance/accounts-payable/installments/456/settlements
|
|
623
|
+
Authorization: Bearer <token>
|
|
624
|
+
Content-Type: application/json
|
|
625
|
+
|
|
626
|
+
{
|
|
627
|
+
"installment_id": 456,
|
|
628
|
+
"amount": 500.00,
|
|
629
|
+
"settled_at": "2024-07-31T10:00:00Z",
|
|
630
|
+
"bank_account_id": 10,
|
|
631
|
+
"payment_channel": "TED",
|
|
632
|
+
"discount": 0,
|
|
633
|
+
"interest": 0,
|
|
634
|
+
"penalty": 0,
|
|
635
|
+
"description": "Pagamento via TED"
|
|
636
|
+
}
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
### Importar extrato bancário
|
|
640
|
+
|
|
641
|
+
```http
|
|
642
|
+
POST /finance/statements/import
|
|
643
|
+
Authorization: Bearer <token>
|
|
644
|
+
Content-Type: multipart/form-data
|
|
645
|
+
|
|
646
|
+
Form-data:
|
|
647
|
+
- file: arquivo OFX ou CSV
|
|
648
|
+
- bank_account_id: 10
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
### Estornar liquidação
|
|
652
|
+
|
|
653
|
+
```http
|
|
654
|
+
PATCH /finance/accounts-payable/installments/456/settlements/789/reverse
|
|
655
|
+
Authorization: Bearer <token>
|
|
656
|
+
Content-Type: application/json
|
|
657
|
+
|
|
658
|
+
{
|
|
659
|
+
"reason": "Pagamento duplicado",
|
|
660
|
+
"memo": "Estorno realizado em 2024-08-01"
|
|
661
|
+
}
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
---
|
|
665
|
+
|
|
666
|
+
Este README foi atualizado para refletir a implementação atual do módulo financeiro `@hed-hog/finance` conforme código fonte e DTOs disponíveis.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hed-hog/finance",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.274",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"dependencies": {
|
|
@@ -9,14 +9,14 @@
|
|
|
9
9
|
"@nestjs/core": "^11",
|
|
10
10
|
"@nestjs/jwt": "^11",
|
|
11
11
|
"@nestjs/mapped-types": "*",
|
|
12
|
-
"@hed-hog/contact": "0.0.
|
|
12
|
+
"@hed-hog/contact": "0.0.274",
|
|
13
13
|
"@hed-hog/api-prisma": "0.0.5",
|
|
14
14
|
"@hed-hog/api-pagination": "0.0.6",
|
|
15
|
-
"@hed-hog/tag": "0.0.270",
|
|
16
15
|
"@hed-hog/api": "0.0.4",
|
|
17
16
|
"@hed-hog/api-types": "0.0.1",
|
|
17
|
+
"@hed-hog/tag": "0.0.274",
|
|
18
18
|
"@hed-hog/api-locale": "0.0.13",
|
|
19
|
-
"@hed-hog/core": "0.0.
|
|
19
|
+
"@hed-hog/core": "0.0.274"
|
|
20
20
|
},
|
|
21
21
|
"exports": {
|
|
22
22
|
".": {
|