@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.
Files changed (2) hide show
  1. package/README.md +636 -437
  2. package/package.json +4 -4
package/README.md CHANGED
@@ -1,467 +1,666 @@
1
- # Finance Library - Estrutura de Banco de Dados
1
+ # Módulo Finance - Biblioteca HedHog
2
2
 
3
- Este documento explica, de forma didática e técnica, como funciona a estrutura de dados do módulo financeiro em `libraries/finance`.
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
- ## 1) Objetivo do módulo
5
+ ---
6
6
 
7
- O módulo financeiro foi modelado para cobrir o ciclo completo de gestão financeira:
7
+ ## 1. Visão geral do módulo
8
8
 
9
- - cadastro base (filiais, categorias, centros de custo, contas bancárias, meios de pagamento);
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
- ## 2) Convenções gerais
11
+ ---
17
12
 
18
- ### 2.1 Escopo atual (sem tenant)
13
+ ## 2. Escopo e responsabilidades
19
14
 
20
- Nesta versão, o módulo **não usa separação por tenant** nas tabelas novas.
21
- Ou seja, não existem colunas `company_person_id` ou `person_company_id` nas tabelas do módulo financeiro.
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
- ### 2.2 Tabelas já existentes usadas pelo módulo
24
+ ---
24
25
 
25
- O módulo reutiliza tabelas de outras libraries:
26
+ ## 3. Endpoints
26
27
 
27
- - `person`: contraparte de títulos e liquidações (cliente/fornecedor).
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
- ### 2.3 Padrões recomendados de domínio
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
- - Valores monetários em centavos (`*_cents`) para evitar erro de precisão.
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
- ## 3) Visão macro das relações
36
+ ### FinanceBankAccountsController
39
37
 
40
- Fluxo principal de operação:
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
- 1. Cadastra `financial_title` (documento pai).
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
- Relações de suporte:
47
+ ### FinanceCategoriesController
50
48
 
51
- - `financial_installment_tag`: N:N entre parcela e tag.
52
- - `installment_allocation`: rateio de parcela por centro de custo.
53
- - `financial_title_attachment`: documentos anexos.
54
- - `audit_log`: trilha de auditoria de ações.
55
- - `period_close`: bloqueio operacional por período.
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
- ## 4) Dicionário de tabelas (objetivo, colunas e uso)
57
+ ---
58
58
 
59
- ## 4.1 company_profile
59
+ ### FinanceCollectionsController
60
60
 
61
- **Objetivo:** guardar configurações globais do contexto financeiro (status, moeda e timezone).
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
- **Colunas:**
67
+ ---
64
68
 
65
- - `id`: chave primária.
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
- **Uso comum:** inicialização de regras de data/moeda em UI, API e relatórios.
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
- ## 4.3 finance_category
78
+ ---
75
79
 
76
- **Objetivo:** plano de categorias financeiras para classificação analítica.
80
+ ### FinanceDataController
77
81
 
78
- **Colunas:**
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
- - `id`: chave primária.
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
- **Relações:**
89
+ ### FinanceInstallmentsController
89
90
 
90
- - Auto-relacionamento por `parent_id`.
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
- ## 4.4 cost_center
94
-
95
- **Objetivo:** centro de custo/projeto para rateio gerencial.
96
-
97
- **Colunas:**
98
-
99
- - `id`: chave primária.
100
- - `code`: código do centro de custo.
101
- - `name`: nome exibível.
102
- - `status`: `active|inactive`.
103
- - `created_at`, `updated_at`.
104
-
105
- **Relações:**
106
-
107
- - Referenciada por `installment_allocation.cost_center_id`.
108
-
109
- ## 4.5 payment_method
110
-
111
- **Objetivo:** catálogo configurável de meios de pagamento/recebimento.
112
-
113
- **Colunas:**
114
-
115
- - `id`: chave primária.
116
- - `code`: identificador do método.
117
- - `name`: nome exibível.
118
- - `type`: `pix|boleto|ted|doc|card|cash|other`.
119
- - `status`: `active|inactive`.
120
- - `created_at`, `updated_at`.
121
-
122
- **Relações:**
123
-
124
- - Referenciada por `settlement.payment_method_id`.
125
-
126
- ## 4.6 bank_account
127
-
128
- **Objetivo:** contas bancárias/caixa usadas nos movimentos reais.
129
-
130
- **Colunas:**
131
-
132
- - `id`: chave primária.
133
- - `code`: código da conta.
134
- - `name`: nome exibível.
135
- - `bank_name`, `bank_code`: metadados bancários (nullable).
136
- - `agency`, `account_number`: metadados bancários (nullable).
137
- - `account_type`: `checking|savings|investment|cash|other`.
138
- - `status`: `active|inactive`.
139
- - `created_at`, `updated_at`.
140
-
141
- **Relações:**
142
-
143
- - Referenciada por `bank_statement.bank_account_id`.
144
- - Referenciada por `bank_statement_line.bank_account_id`.
145
- - Referenciada por `settlement.bank_account_id`.
146
-
147
- ## 4.7 financial_title
148
-
149
- **Objetivo:** documento pai de contas a pagar/receber.
150
-
151
- **Colunas:**
152
-
153
- - `id`: chave primária.
154
- - `person_id`: FK para contraparte (`person.id`).
155
- - `title_type`: `payable|receivable`.
156
- - `status`: `draft|open|partial|settled|canceled|overdue`.
157
- - `document_number`: número do documento (nullable).
158
- - `description`: histórico/observações (nullable).
159
- - `competence_date`: competência macro (nullable).
160
- - `issue_date`: emissão (nullable).
161
- - `total_amount_cents`: total previsto no título.
162
- - `finance_category_id`: FK para categoria (nullable).
163
- - `created_by_user_id`: FK para `user.id` (nullable).
164
- - `created_at`, `updated_at`.
165
-
166
- **Relações:**
167
-
168
- - 1:N com `financial_installment`.
169
- - 1:N com `financial_title_attachment`.
170
-
171
- ## 4.8 financial_installment
172
-
173
- **Objetivo:** parcelas planejadas de cada título.
174
-
175
- **Colunas:**
176
-
177
- - `id`: chave primária.
178
- - `title_id`: FK para `financial_title.id`.
179
- - `installment_number`: número sequencial da parcela por título.
180
- - `competence_date`: competência contábil/gerencial.
181
- - `due_date`: vencimento.
182
- - `amount_cents`: valor original da parcela.
183
- - `open_amount_cents`: saldo em aberto.
184
- - `status`: `open|partial|settled|canceled|overdue`.
185
- - `notes`: observações (nullable).
186
- - `created_at`, `updated_at`.
187
-
188
- **Relações:**
189
-
190
- - N:1 com `financial_title`.
191
- - N:N com `tag` via `financial_installment_tag`.
192
- - 1:N com `installment_allocation`.
193
- - 1:N com `settlement_allocation`.
194
-
195
- ## 4.9 financial_title_attachment
196
-
197
- **Objetivo:** anexar arquivos ao título sem armazenar binário na tabela.
198
-
199
- **Colunas:**
200
-
201
- - `id`: chave primária.
202
- - `title_id`: FK para `financial_title.id`.
203
- - `file_id`: FK para `file.id`.
204
- - `uploaded_by_user_id`: FK para `user.id` (nullable).
205
- - `created_at`, `updated_at`.
206
-
207
- ## 4.10 financial_installment_tag
208
-
209
- **Objetivo:** classificação por tags em nível de parcela.
210
-
211
- **Colunas:**
212
-
213
- - `id`: chave primária.
214
- - `installment_id`: FK para `financial_installment.id`.
215
- - `tag_id`: FK para `tag.id`.
216
- - `created_at`, `updated_at`.
217
-
218
- **Observação:** possui unicidade (`installment_id`, `tag_id`) para evitar duplicidade.
219
-
220
- ## 4.11 installment_allocation
221
-
222
- **Objetivo:** ratear uma parcela entre centros de custo.
223
-
224
- **Colunas:**
225
-
226
- - `id`: chave primária.
227
- - `installment_id`: FK para `financial_installment.id`.
228
- - `cost_center_id`: FK para `cost_center.id`.
229
- - `allocated_amount_cents`: valor alocado.
230
- - `created_at`, `updated_at`.
231
-
232
- **Observação:** possui unicidade (`installment_id`, `cost_center_id`).
233
-
234
- ## 4.12 settlement
235
-
236
- **Objetivo:** representar o evento financeiro real (pagamento/recebimento/transferência/ajuste).
237
-
238
- **Colunas:**
239
-
240
- - `id`: chave primária.
241
- - `person_id`: FK para `person.id` (nullable).
242
- - `bank_account_id`: FK para `bank_account.id` (nullable).
243
- - `payment_method_id`: FK para `payment_method.id` (nullable).
244
- - `settlement_type`: `payable|receivable|transfer|adjustment`.
245
- - `status`: `pending|confirmed|reversed`.
246
- - `settled_at`: data/hora do evento financeiro.
247
- - `amount_cents`: valor do evento.
248
- - `description`: histórico (nullable).
249
- - `external_reference`: referência externa (nullable).
250
- - `created_by_user_id`: FK para `user.id` (nullable).
251
- - `created_at`, `updated_at`.
252
-
253
- **Relações:**
254
-
255
- - 1:N com `settlement_allocation`.
256
- - 1:1 com `bank_reconciliation` (por restrição de unicidade).
257
-
258
- ## 4.13 settlement_allocation
259
-
260
- **Objetivo:** distribuir um settlement em uma ou várias parcelas.
261
-
262
- **Colunas:**
263
-
264
- - `id`: chave primária.
265
- - `settlement_id`: FK para `settlement.id`.
266
- - `installment_id`: FK para `financial_installment.id`.
267
- - `allocated_amount_cents`: valor aplicado na parcela.
268
- - `discount_cents`: desconto aplicado.
269
- - `interest_cents`: juros aplicado.
270
- - `penalty_cents`: multa aplicada.
271
- - `created_at`, `updated_at`.
272
-
273
- **Observação:** possui unicidade (`settlement_id`, `installment_id`).
274
-
275
- ## 4.14 bank_statement
276
-
277
- **Objetivo:** lote de importação de extrato bancário.
278
-
279
- **Colunas:**
280
-
281
- - `id`: chave primária.
282
- - `bank_account_id`: FK para `bank_account.id`.
283
- - `source_type`: `ofx|csv|manual`.
284
- - `idempotency_key`: evita reimportação do mesmo lote (nullable).
285
- - `period_start`, `period_end`: intervalo coberto no extrato (nullable).
286
- - `imported_at`: data/hora da importação.
287
- - `imported_by_user_id`: FK para `user.id` (nullable).
288
- - `created_at`, `updated_at`.
289
-
290
- **Relações:**
291
-
292
- - 1:N com `bank_statement_line`.
293
-
294
- ## 4.15 bank_statement_line
295
-
296
- **Objetivo:** transações individuais do extrato (a prova bancária).
297
-
298
- **Colunas:**
299
-
300
- - `id`: chave primária.
301
- - `bank_statement_id`: FK para `bank_statement.id`.
302
- - `bank_account_id`: FK para `bank_account.id`.
303
- - `external_id`: identificador externo do banco (nullable).
304
- - `posted_date`: data efetiva.
305
- - `amount_cents`: valor da linha.
306
- - `description`: histórico do banco.
307
- - `status`: `imported|pending|reconciled|reversed|adjusted`.
308
- - `dedupe_key`: chave de deduplicação (única).
309
- - `created_at`, `updated_at`.
310
-
311
- **Relações:**
312
-
313
- - 1:1 com `bank_reconciliation` (por restrição de unicidade).
314
-
315
- ## 4.16 bank_reconciliation
316
-
317
- **Objetivo:** vínculo auditável entre linha de extrato e settlement.
318
-
319
- **Colunas:**
320
-
321
- - `id`: chave primária.
322
- - `bank_statement_line_id`: FK para `bank_statement_line.id` (único).
323
- - `settlement_id`: FK para `settlement.id` (único).
324
- - `status`: `pending|reconciled|reversed|adjusted`.
325
- - `matched_at`: data/hora da conciliação (nullable).
326
- - `matched_by_user_id`: FK para `user.id` (nullable).
327
- - `created_at`, `updated_at`.
328
-
329
- **Observação:** modelado como 1:1 para simplificar conciliação de eventos.
330
-
331
- ## 4.17 audit_log
332
-
333
- **Objetivo:** trilha de auditoria funcional do módulo.
334
-
335
- **Colunas:**
336
-
337
- - `id`: chave primária.
338
- - `actor_user_id`: FK para `user.id` (nullable).
339
- - `action`: ação executada (ex.: `SETTLEMENT_CREATE`).
340
- - `entity_table`: tabela afetada.
341
- - `entity_id`: id da entidade afetada (string).
342
- - `summary`: resumo legível (nullable).
343
- - `before_data`: snapshot anterior (nullable).
344
- - `after_data`: snapshot posterior (nullable).
345
- - `ip_address`: origem da ação (nullable).
346
- - `created_at`, `updated_at`.
347
-
348
- ## 4.18 period_close
349
-
350
- **Objetivo:** controlar fechamento operacional de período.
351
-
352
- **Colunas:**
353
-
354
- - `id`: chave primária.
355
- - `period_start`: início do período.
356
- - `period_end`: fim do período.
357
- - `status`: `open|closed`.
358
- - `closed_at`: data/hora do fechamento (nullable).
359
- - `closed_by_user_id`: FK para `user.id` (nullable).
360
- - `notes`: observações (nullable).
361
- - `created_at`, `updated_at`.
362
-
363
- **Uso comum:** bloquear operações diretas em períodos fechados e permitir apenas estornos sob regra.
364
-
365
- ## 4.19 forecast_scenario
366
-
367
- **Objetivo:** cenários de planejamento financeiro futuro.
368
-
369
- **Colunas:**
370
-
371
- - `id`: chave primária.
372
- - `name`: nome do cenário (ex.: Base, Conservador).
373
- - `status`: `active|inactive`.
374
- - `is_default`: cenário padrão.
375
- - `created_at`, `updated_at`.
376
-
377
- **Relações:**
378
-
379
- - 1:N com `cashflow_projection`.
380
- - 1:N com `receivable_schedule`.
381
-
382
- ## 4.20 cashflow_projection
383
-
384
- **Objetivo:** linhas de projeção de fluxo por data e tipo.
385
-
386
- **Colunas:**
387
-
388
- - `id`: chave primária.
389
- - `scenario_id`: FK para `forecast_scenario.id`.
390
- - `projection_date`: data projetada.
391
- - `projection_type`: `inflow|outflow|net`.
392
- - `amount_cents`: valor projetado.
393
- - `notes`: observações (nullable).
394
- - `created_at`, `updated_at`.
395
-
396
- ## 4.21 receivable_schedule
397
-
398
- **Objetivo:** agenda de recebíveis previstos quando ainda não há título lançado.
399
-
400
- **Colunas:**
401
-
402
- - `id`: chave primária.
403
- - `scenario_id`: FK para `forecast_scenario.id`.
404
- - `person_id`: FK para `person.id` (nullable).
405
- - `expected_date`: data esperada.
406
- - `amount_cents`: valor esperado.
407
- - `description`: descrição (nullable).
408
- - `created_at`, `updated_at`.
409
-
410
- ## 5) Fluxos operacionais essenciais
411
-
412
- ## 5.1 Contas a pagar/receber
413
-
414
- 1. Criar `financial_title`.
415
- 2. Criar parcelas em `financial_installment`.
416
- 3. Registrar liquidação em `settlement`.
417
- 4. Alocar liquidação em `settlement_allocation`.
418
- 5. Atualizar saldo em aberto e status da parcela/título na regra de negócio.
419
-
420
- ## 5.2 Conciliação bancária
421
-
422
- 1. Importar lote em `bank_statement`.
423
- 2. Inserir linhas em `bank_statement_line` com `dedupe_key`.
424
- 3. Associar linha e settlement em `bank_reconciliation`.
425
- 4. Atualizar status de conciliação e registrar auditoria.
426
-
427
- ## 5.3 Estorno
428
-
429
- 1. Não apagar dados históricos.
430
- 2. Marcar `settlement.status = reversed`.
431
- 3. Reprocessar saldo em aberto das parcelas relacionadas.
432
- 4. Registrar no `audit_log`.
433
-
434
- ## 5.4 Fechamento de período
435
-
436
- 1. Definir janela em `period_close`.
437
- 2. Marcar `status = closed`.
438
- 3. Bloquear lançamentos/alterações do período fechado via regra da aplicação.
439
-
440
- ## 6) Invariantes recomendados de regra de negócio
441
-
442
- Para manter consistência financeira, o ideal é garantir (na aplicação e, quando possível, no banco):
443
-
444
- - `financial_installment.open_amount_cents >= 0`.
445
- - `financial_installment.open_amount_cents <= financial_installment.amount_cents`.
446
- - soma de `settlement_allocation.allocated_amount_cents` por parcela não excede o valor permitido pela política da parcela.
447
- - soma de `installment_allocation.allocated_amount_cents` coerente com a política de rateio da parcela.
448
- - `period_end >= period_start` em `period_close`.
449
- - unicidade respeitada em tabelas de vínculo N:N para evitar duplicidades.
450
-
451
- ## 7) Diretrizes para novos desenvolvedores
452
-
453
- - Trate `financial_title` como agregador de documento e `financial_installment` como unidade operacional de cobrança/baixa.
454
- - Considere `settlement` como evento imutável de dinheiro real; prefira estorno/ajuste em vez de edição destrutiva.
455
- - Use `audit_log` sempre que houver alteração relevante de estado.
456
- - Ao importar extrato, monte `dedupe_key` estável para evitar duplicidade.
457
- - Ao evoluir schema, preserve compatibilidade de índices e FKs com os fluxos descritos neste documento.
458
-
459
- ## 8) Resumo rápido da arquitetura
460
-
461
- - **Cadastro:** `company_profile`, `branch`, `finance_category`, `cost_center`, `payment_method`, `bank_account`.
462
- - **Operação:** `financial_title`, `financial_installment`, `settlement`, `settlement_allocation`.
463
- - **Conciliação:** `bank_statement`, `bank_statement_line`, `bank_reconciliation`.
464
- - **Governança:** `audit_log`, `period_close`.
465
- - **Planejamento:** `forecast_scenario`, `cashflow_projection`, `receivable_schedule`.
466
-
467
- Com essa estrutura, o módulo cobre planejamento, execução, rastreabilidade e projeção financeira de forma consistente e extensível.
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.270",
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.270",
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.270"
19
+ "@hed-hog/core": "0.0.274"
20
20
  },
21
21
  "exports": {
22
22
  ".": {