@hed-hog/finance 0.0.270 → 0.0.275

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 +725 -438
  2. package/package.json +6 -6
package/README.md CHANGED
@@ -1,467 +1,754 @@
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 | 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 | 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 | 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 | 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 | 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 | 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`.
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.
91
+ | Método | Path | Auth | Descrição | Parâmetros/Body/Query | Resposta | Erros Comuns |
92
+ |--------|-------------------------------------------------------------|------|----------------------------------|-------------------------------------------------------------------------------------------------------|---------------------------|----------------------|
93
+ | GET | /finance/accounts-payable/installments | Sim | Lista parcelas contas a pagar | Query: `status`, paginação | Lista paginada | 401 Unauthorized |
94
+ | GET | /finance/accounts-payable/installments/:id | Sim | Detalha parcela contas a pagar | Path param: `id` | Detalhes da parcela | 404 Not Found |
95
+ | POST | /finance/accounts-payable/installments | Sim | Cria título contas a pagar | Body: `CreateFinancialTitleDto` | Título criado | 400 Validação |
96
+ | PATCH | /finance/accounts-payable/installments/:id | Sim | Atualiza título contas a pagar | Body: `CreateFinancialTitleDto` | Título atualizado | 400 Validação, 404 |
97
+ | PATCH | /finance/accounts-payable/installments/:id/approve | Sim | Aprova título contas a pagar | - | Título aprovado | 404 Not Found |
98
+ | PATCH | /finance/accounts-payable/installments/:id/reject | Sim | Rejeita título contas a pagar | Body: `{ reason?: string }` | Título rejeitado | 400 Validação, 404 |
99
+ | PATCH | /finance/accounts-payable/installments/:id/cancel | Sim | Cancela título contas a pagar | Body: `{ reason?: string }` | Título cancelado | 400 Validação, 404 |
100
+ | POST | /finance/accounts-payable/installments/:id/settlements | Sim | Registra liquidação parcela | Body: `SettleInstallmentDto` | Liquidação registrada | 400 Validação, 404 |
101
+ | 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 |
102
+ | PATCH | /finance/settlements/:id/reverse | Sim | Estorna liquidação por id | Body: `{ reason?: string; memo?: string }` | Liquidação estornada | 400 Validação, 404 |
103
+ | DELETE | /finance/bank-reconciliations/:id | Sim | Desfaz conciliação bancária | - | Conciliação desfeita | 404 Not Found |
104
+ | PATCH | /finance/accounts-payable/installments/:id/tags | Sim | Atualiza tags da parcela | Body: `{ tag_ids?: number[] }` | Tags atualizadas | 400 Validação, 404 |
105
+ | 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 |
106
+ | GET | /finance/accounts-receivable/installments | Sim | Lista parcelas contas a receber | Query: `status`, paginação | Lista paginada | 401 Unauthorized |
107
+ | GET | /finance/accounts-receivable/installments/:id | Sim | Detalha parcela contas a receber | Path param: `id` | Detalhes da parcela | 404 Not Found |
108
+ | POST | /finance/accounts-receivable/installments | Sim | Cria título contas a receber | Body: `CreateFinancialTitleDto` | Título criado | 400 Validação |
109
+ | PATCH | /finance/accounts-receivable/installments/:id | Sim | Atualiza título contas a receber | Body: `CreateFinancialTitleDto` | Título atualizado | 400 Validação, 404 |
110
+ | PATCH | /finance/accounts-receivable/installments/:id/approve | Sim | Aprova título contas a receber | - | Título aprovado | 404 Not Found |
111
+ | PATCH | /finance/accounts-receivable/installments/:id/cancel | Sim | Cancela título contas a receber | Body: `{ reason?: string }` | Título cancelado | 400 Validação, 404 |
112
+ | POST | /finance/accounts-receivable/installments/:id/settlements | Sim | Registra liquidação parcela | Body: `SettleInstallmentDto` | Liquidação registrada | 400 Validação, 404 |
113
+ | 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 |
114
+ | PATCH | /finance/accounts-receivable/installments/:id/tags | Sim | Atualiza tags da parcela | Body: `{ tag_ids?: number[] }` | Tags atualizadas | 400 Validação, 404 |
115
+ | POST | /finance/tags | Sim | Cria tag financeira | Body: `{ name: string; color?: string }` | Tag criada | 400 Validação |
116
+ | 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 |
117
+
118
+ ---
119
+
120
+ ### FinancePeriodCloseController
121
+
122
+ | Método | Path | Auth | Descrição | Parâmetros/Body | Resposta | Erros Comuns |
123
+ |--------|-------------------|------|---------------------------|-------------------------------------------------------------------------------------------------|--------------------|----------------------|
124
+ | GET | /finance/period-close | Sim | Lista fechamentos de períodos | Query: `search`, `status`, `user`, `from`, `to`, paginação | Lista paginada | 401 Unauthorized |
125
+ | 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 |
126
+
127
+ ---
128
+
129
+ ### FinanceStatementsController
130
+
131
+ | Método | Path | Auth | Descrição | Parâmetros/Query/Body | Resposta | Erros Comuns |
132
+ |--------|-------------------------------|------|-------------------------------|-------------------------------------------------------------------------------------------------------|------------------------|----------------------|
133
+ | GET | /finance/statements | Sim | Lista extratos bancários | Query: `bank_account_id`, `search` | Lista de extratos | 400 BadRequest, 401 |
134
+ | 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 |
135
+ | GET | /finance/statements/export | Sim | Exporta extratos em CSV | Query: `bank_account_id` (obrigatório), `search` | CSV para download | 400 BadRequest, 401 |
136
+ | POST | /finance/statements/import | Sim | Importa extrato bancário | Multipart file + Body: `bank_account_id` (obrigatório) | Importação realizada | 400 BadRequest, 401 |
137
+ | 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 |
138
+
139
+ ---
140
+
141
+ ### FinanceTransfersController
142
+
143
+ | Método | Path | Auth | Descrição | Parâmetros/Query/Body | Resposta | Erros Comuns |
144
+ |--------|-------------------|------|----------------------------|-------------------------------------------------------------------------------------------------------|------------------------|----------------------|
145
+ | GET | /finance/transfers | Sim | Lista transferências | Query: `search`, `bank_account_id` | Lista de transferências | 401 Unauthorized |
146
+ | 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 |
147
+
148
+ ---
149
+
150
+ ## 4. Regras de autenticação e autorização
151
+
152
+ - Todos os endpoints requerem autenticação via token válido.
153
+ - O decorator `@Role()` indica que o acesso é restrito a usuários autenticados.
154
+ - Controle de permissões específicas deve ser implementado na camada de serviço conforme regras de negócio.
155
+ - Usuários são identificados via decorator `@User()` para rastreabilidade.
156
+
157
+ ---
158
+
159
+ ## 5. Estruturas de request/response
160
+
161
+ ### CreateBankAccountDto
162
+
163
+ ```ts
164
+ {
165
+ bank: string; // obrigatório
166
+ branch?: string;
167
+ account?: string;
168
+ type: string; // obrigatório
169
+ description?: string;
170
+ initial_balance?: number; // >= 0
171
+ }
172
+ ```
173
+
174
+ ### CreateFinancialTitleDto
175
+
176
+ ```ts
177
+ {
178
+ document_number: string; // obrigatório, não vazio
179
+ person_id: number; // obrigatório
180
+ competence_date?: string (ISO date);
181
+ issue_date?: string (ISO date);
182
+ due_date: string (ISO date); // obrigatório
183
+ total_amount: number; // obrigatório, >= 0.01
184
+ finance_category_id?: number;
185
+ cost_center_id?: number;
186
+ payment_channel?: string;
187
+ description?: string;
188
+ installments?: [
189
+ {
190
+ installment_number?: number; // >= 1
191
+ due_date: string (ISO date);
192
+ amount: number; // >= 0.01
193
+ }
194
+ ];
195
+ attachment_file_ids?: number[];
196
+ }
197
+ ```
198
+
199
+ ### SettleInstallmentDto
200
+
201
+ ```ts
202
+ {
203
+ installment_id: number; // obrigatório
204
+ amount: number; // obrigatório, >= 0.01
205
+ settled_at?: string (ISO date);
206
+ bank_account_id?: number;
207
+ bank_statement_line_id?: number;
208
+ payment_channel?: string;
209
+ discount?: number; // >= 0
210
+ interest?: number; // >= 0
211
+ penalty?: number; // >= 0
212
+ description?: string;
213
+ }
214
+ ```
215
+
216
+ ### CreateBankStatementAdjustmentDto
217
+
218
+ ```ts
219
+ {
220
+ bank_account_id: number; // obrigatório
221
+ amount: number; // obrigatório, >= 0.01
222
+ date?: string (ISO date);
223
+ type: string; // obrigatório
224
+ description?: string;
225
+ }
226
+ ```
227
+
228
+ ### CreateTransferDto
229
+
230
+ ```ts
231
+ {
232
+ source_account_id: number; // obrigatório
233
+ destination_account_id: number; // obrigatório
234
+ date: string; // obrigatório
235
+ amount: number; // obrigatório, >= 0.01
236
+ description?: string;
237
+ }
238
+ ```
239
+
240
+ ### CreateFinanceTagDto
241
+
242
+ ```ts
243
+ {
244
+ name: string; // obrigatório, string não vazia
245
+ color?: string; // opcional, cor hexadecimal válida
246
+ }
247
+ ```
248
+
249
+ ### CreateFinanceCategoryDto
250
+
251
+ ```ts
252
+ {
253
+ name: string; // obrigatório
254
+ kind: string; // obrigatório
255
+ parent_id?: number; // opcional
256
+ }
257
+ ```
258
+
259
+ ### UpdateFinanceCategoryDto
260
+
261
+ ```ts
262
+ {
263
+ name?: string;
264
+ kind?: string;
265
+ parent_id?: number;
266
+ status?: 'active' | 'inactive';
267
+ }
268
+ ```
269
+
270
+ ### MoveFinanceCategoryDto
271
+
272
+ ```ts
273
+ {
274
+ parent_id?: number;
275
+ position?: number;
276
+ }
277
+ ```
278
+
279
+ ### CreateCostCenterDto
280
+
281
+ ```ts
282
+ {
283
+ name: string; // obrigatório
284
+ }
285
+ ```
286
+
287
+ ### UpdateCostCenterDto
288
+
289
+ ```ts
290
+ {
291
+ name?: string;
292
+ status?: 'active' | 'inactive';
293
+ }
294
+ ```
295
+
296
+ ### RejectTitleDto
297
+
298
+ ```ts
299
+ {
300
+ reason?: string;
301
+ }
302
+ ```
303
+
304
+ ### ReverseSettlementDto
305
+
306
+ ```ts
307
+ {
308
+ reason?: string;
309
+ memo?: string;
310
+ }
311
+ ```
312
+
313
+ ### SendCollectionDto
314
+
315
+ ```ts
316
+ {
317
+ message: string; // obrigatório, min 5 e max 2000 caracteres
318
+ subject?: string; // opcional, max 255 caracteres
319
+ }
320
+ ```
321
+
322
+ ### RegisterCollectionAgreementDto
323
+
324
+ ```ts
325
+ {
326
+ amount: number; // obrigatório, min 0.01
327
+ installments: number; // obrigatório, entre 1 e 120
328
+ first_due_date: string; // obrigatório, ISO date
329
+ notes?: string; // opcional
330
+ }
331
+ ```
332
+
333
+ ### UpdateInstallmentTagsDto
334
+
335
+ ```ts
336
+ {
337
+ tag_ids?: number[]; // opcional, array de números únicos e >= 1
338
+ }
339
+ ```
340
+
341
+ ### CreatePeriodCloseDto
342
+
343
+ ```ts
344
+ {
345
+ period_start: string; // obrigatório, ISO date
346
+ period_end: string; // obrigatório, ISO date
347
+ notes?: string; // opcional
348
+ status?: 'open' | 'closed'; // opcional
349
+ }
350
+ ```
351
+
352
+ ### ExtractFinancialTitleFromFileDto
353
+
354
+ ```ts
355
+ {
356
+ file_id?: number; // opcional
357
+ }
358
+ ```
359
+
360
+ ---
361
+
362
+ ## 6. Erros comuns
363
+
364
+ - **400 Bad Request**: dados inválidos ou ausentes conforme validações dos DTOs.
365
+ - **401 Unauthorized**: ausência ou invalidez do token de autenticação.
366
+ - **404 Not Found**: recurso não encontrado (ex.: id inválido).
367
+ - **409 Conflict**: tentativas de duplicidade em tabelas com unicidade (ex.: tags, rateios).
368
+ - **422 Unprocessable Entity**: violações de regras de negócio (ex.: saldo insuficiente, período fechado).
369
+
370
+ ---
371
+
372
+ ## 7. Banco de dados (tabelas YAML)
373
+
374
+ ### company_profile
375
+
376
+ - **Finalidade:** Configurações globais financeiras (status, moeda, timezone).
377
+ - **Colunas:**
378
+ - `id` (PK)
379
+ - `code` (string, único, não nulo)
380
+ - `status` (enum: `active`, `inactive`, default `active`)
381
+ - `default_currency` (string, não nulo, ex: `BRL`)
382
+ - `timezone` (string, não nulo, ex: `America/Sao_Paulo`)
383
+ - `created_at`, `updated_at` (timestamps)
384
+ - **Integridade:** PK em `id`
385
+ - **Indices:** índice único em `code`
386
+ - **Enums:** `status`
387
+
388
+ ---
389
+
390
+ ### finance_category
391
+
392
+ - **Finalidade:** Categorias financeiras hierárquicas.
393
+ - **Colunas:**
394
+ - `id` (PK)
395
+ - `parent_id` (FK para self, nullable)
396
+ - `code` (string)
397
+ - `name` (string)
398
+ - `kind` (enum: `revenue`, `expense`, `transfer`, `adjustment`, `other`)
399
+ - `status` (enum: `active`, `inactive`, default `active`)
400
+ - `created_at`, `updated_at`
401
+ - **Integridade:** FK para `parent_id`
402
+ - **Indices:** índice em `code`
403
+ - **Enums:** `kind`, `status`
404
+
405
+ ---
406
+
407
+ ### cost_center
408
+
409
+ - **Finalidade:** Centros de custo para rateio.
410
+ - **Colunas:**
411
+ - `id` (PK)
412
+ - `code` (string)
413
+ - `name` (string)
414
+ - `status` (enum: `active`, `inactive`, default `active`)
415
+ - `created_at`, `updated_at`
416
+ - **Integridade:** PK em `id`
417
+ - **Indices:** índice em `code`
418
+ - **Enums:** `status`
419
+
420
+ ---
421
+
422
+ ### payment_method
423
+
424
+ - **Finalidade:** Meios de pagamento configuráveis.
425
+ - **Colunas:**
426
+ - `id` (PK)
427
+ - `code` (string)
428
+ - `name` (string)
429
+ - `type` (enum: `pix`, `boleto`, `ted`, `doc`, `card`, `cash`, `other`)
430
+ - `status` (enum: `active`, `inactive`, default `active`)
431
+ - `created_at`, `updated_at`
432
+ - **Integridade:** PK em `id`
433
+ - **Indices:** índice em `code`
434
+ - **Enums:** `type`, `status`
435
+
436
+ ---
437
+
438
+ ### bank_account
439
+
440
+ - **Finalidade:** Contas bancárias e caixas.
441
+ - **Colunas:**
442
+ - `id` (PK)
443
+ - `code` (string)
444
+ - `name` (string)
445
+ - `bank_name` (string, nullable)
446
+ - `bank_code` (string, nullable)
447
+ - `agency` (string, nullable)
448
+ - `account_number` (string, nullable)
449
+ - `account_type` (enum: `checking`, `savings`, `investment`, `cash`, `other`)
450
+ - `status` (enum: `active`, `inactive`, default `active`)
451
+ - `created_at`, `updated_at`
452
+ - **Integridade:** PK em `id`
453
+ - **Indices:** índice em `code`
454
+ - **Enums:** `account_type`, `status`
455
+
456
+ ---
457
+
458
+ ### financial_title
459
+
460
+ - **Finalidade:** Documento pai de contas a pagar/receber.
461
+ - **Colunas:**
462
+ - `id` (PK)
463
+ - `person_id` (FK para `person.id`)
464
+ - `title_type` (enum: `payable`, `receivable`)
465
+ - `status` (enum: `draft`, `open`, `partial`, `settled`, `canceled`, `overdue`, default `draft`)
466
+ - `document_number` (string, nullable)
467
+ - `description` (string, nullable)
468
+ - `competence_date` (date, nullable)
469
+ - `issue_date` (date, nullable)
470
+ - `total_amount_cents` (integer)
471
+ - `finance_category_id` (FK para `finance_category.id`, nullable)
472
+ - `created_by_user_id` (FK para `user.id`, nullable)
473
+ - `created_at`, `updated_at`
474
+ - **Integridade:** FK para `person`, `finance_category`, `user`
475
+ - **Indices:** índice em `document_number`
476
+ - **Enums:** `title_type`, `status`
477
+
478
+ ---
479
+
480
+ ### financial_installment
481
+
482
+ - **Finalidade:** Parcelas de títulos financeiros.
483
+ - **Colunas:**
484
+ - `id` (PK)
485
+ - `title_id` (FK para `financial_title.id`)
486
+ - `installment_number` (integer)
487
+ - `competence_date` (date)
488
+ - `due_date` (date)
489
+ - `amount_cents` (integer)
490
+ - `open_amount_cents` (integer)
491
+ - `status` (enum: `open`, `partial`, `settled`, `canceled`, `overdue`, default `open`)
492
+ - `notes` (string, nullable)
493
+ - `created_at`, `updated_at`
494
+ - **Integridade:** FK para `financial_title`
495
+ - **Indices:** índice composto em `title_id`, `installment_number`
496
+ - **Enums:** `status`
497
+
498
+ ---
499
+
500
+ ### settlement
501
+
502
+ - **Finalidade:** Evento financeiro real (pagamento, recebimento, transferência, ajuste).
503
+ - **Colunas:**
504
+ - `id` (PK)
505
+ - `person_id` (FK para `person.id`, nullable)
506
+ - `bank_account_id` (FK para `bank_account.id`, nullable)
507
+ - `payment_method_id` (FK para `payment_method.id`, nullable)
508
+ - `settlement_type` (enum: `payable`, `receivable`, `transfer`, `adjustment`)
509
+ - `status` (enum: `pending`, `confirmed`, `reversed`, default `pending`)
510
+ - `settled_at` (datetime)
511
+ - `amount_cents` (integer)
512
+ - `description` (string, nullable)
513
+ - `external_reference` (string, nullable)
514
+ - `created_by_user_id` (FK para `user.id`, nullable)
515
+ - `created_at`, `updated_at`
516
+ - **Integridade:** FK para `person`, `bank_account`, `payment_method`, `user`
517
+ - **Indices:** índice em `settled_at`
518
+ - **Enums:** `settlement_type`, `status`
519
+
520
+ ---
521
+
522
+ ### bank_statement
523
+
524
+ - **Finalidade:** Lote de importação de extrato bancário.
525
+ - **Colunas:**
526
+ - `id` (PK)
527
+ - `bank_account_id` (FK para `bank_account.id`)
528
+ - `source_type` (enum: `ofx`, `csv`, `manual`)
529
+ - `idempotency_key` (string, nullable)
530
+ - `period_start` (date, nullable)
531
+ - `period_end` (date, nullable)
532
+ - `imported_at` (datetime)
533
+ - `imported_by_user_id` (FK para `user.id`, nullable)
534
+ - `created_at`, `updated_at`
535
+ - **Integridade:** FK para `bank_account`, `user`
536
+ - **Enums:** `source_type`
537
+
538
+ ---
539
+
540
+ ### bank_statement_line
541
+
542
+ - **Finalidade:** Transações individuais do extrato.
543
+ - **Colunas:**
544
+ - `id` (PK)
545
+ - `bank_statement_id` (FK para `bank_statement.id`)
546
+ - `bank_account_id` (FK para `bank_account.id`)
547
+ - `external_id` (string, nullable)
548
+ - `posted_date` (date)
549
+ - `amount_cents` (integer)
550
+ - `description` (string)
551
+ - `status` (enum: `imported`, `pending`, `reconciled`, `reversed`, `adjusted`, default `imported`)
552
+ - `dedupe_key` (string, único)
553
+ - `created_at`, `updated_at`
554
+ - **Integridade:** FK para `bank_statement`, `bank_account`
555
+ - **Indices:** índice único em `dedupe_key`
556
+ - **Enums:** `status`
557
+
558
+ ---
559
+
560
+ ### bank_reconciliation
561
+
562
+ - **Finalidade:** Associação entre linha de extrato e settlement.
563
+ - **Colunas:**
564
+ - `id` (PK)
565
+ - `bank_statement_line_id` (FK para `bank_statement_line.id`, único)
566
+ - `settlement_id` (FK para `settlement.id`, único)
567
+ - `status` (enum: `pending`, `reconciled`, `reversed`, `adjusted`, default `pending`)
568
+ - `matched_at` (datetime, nullable)
569
+ - `matched_by_user_id` (FK para `user.id`, nullable)
570
+ - `created_at`, `updated_at`
571
+ - **Integridade:** FK para `bank_statement_line`, `settlement`, `user`
572
+ - **Indices:** unicidade em `bank_statement_line_id` e `settlement_id`
573
+ - **Enums:** `status`
574
+
575
+ ---
576
+
577
+ ### audit_log
578
+
579
+ - **Finalidade:** Registro de auditoria funcional.
580
+ - **Colunas:**
581
+ - `id` (PK)
582
+ - `actor_user_id` (FK para `user.id`, nullable)
583
+ - `action` (string)
584
+ - `entity_table` (string)
585
+ - `entity_id` (string)
586
+ - `summary` (string, nullable)
587
+ - `before_data` (json, nullable)
588
+ - `after_data` (json, nullable)
589
+ - `ip_address` (string, nullable)
590
+ - `created_at`, `updated_at`
591
+ - **Integridade:** FK para `user`
592
+
593
+ ---
594
+
595
+ ### period_close
596
+
597
+ - **Finalidade:** Controle de fechamento operacional de períodos.
598
+ - **Colunas:**
599
+ - `id` (PK)
600
+ - `period_start` (date)
601
+ - `period_end` (date)
602
+ - `status` (enum: `open`, `closed`, default `open`)
603
+ - `closed_at` (datetime, nullable)
604
+ - `closed_by_user_id` (FK para `user.id`, nullable)
605
+ - `notes` (string, nullable)
606
+ - `created_at`, `updated_at`
607
+ - **Integridade:** FK para `user`
608
+ - **Enums:** `status`
609
+
610
+ ---
611
+
612
+ ### forecast_scenario
613
+
614
+ - **Finalidade:** Cenários de planejamento financeiro.
615
+ - **Colunas:**
616
+ - `id` (PK)
617
+ - `name` (string)
618
+ - `status` (enum: `active`, `inactive`, default `active`)
619
+ - `is_default` (boolean, default `false`)
620
+ - `created_at`, `updated_at`
621
+ - **Enums:** `status`
622
+
623
+ ---
624
+
625
+ ### cashflow_projection
626
+
627
+ - **Finalidade:** Projeções de fluxo de caixa.
628
+ - **Colunas:**
629
+ - `id` (PK)
630
+ - `scenario_id` (FK para `forecast_scenario.id`)
631
+ - `projection_date` (date)
632
+ - `projection_type` (enum: `inflow`, `outflow`, `net`)
633
+ - `amount_cents` (integer)
634
+ - `notes` (string, nullable)
635
+ - `created_at`, `updated_at`
636
+ - **Enums:** `projection_type`
637
+
638
+ ---
639
+
640
+ ### receivable_schedule
641
+
642
+ - **Finalidade:** Agenda de recebíveis previstos.
643
+ - **Colunas:**
644
+ - `id` (PK)
645
+ - `scenario_id` (FK para `forecast_scenario.id`)
646
+ - `person_id` (FK para `person.id`, nullable)
647
+ - `expected_date` (date)
648
+ - `amount_cents` (integer)
649
+ - `description` (string, nullable)
650
+ - `created_at`, `updated_at`
651
+
652
+ ---
653
+
654
+ ## 8. Regras de negócio relevantes
655
+
656
+ - Valores monetários são armazenados em centavos para evitar erros de precisão.
657
+ - Datas de competência e vencimento são separadas para análises corretas.
658
+ - Histórico financeiro é imutável; correções são feitas via estorno ou ajuste, nunca exclusão.
659
+ - Saldo aberto de parcelas (`open_amount_cents`) deve ser >= 0 e <= valor original.
660
+ - Rateios e alocações devem respeitar unicidade e somatórios coerentes.
661
+ - Períodos fechados bloqueiam operações diretas, permitindo apenas estornos sob regras.
662
+ - Conciliações bancárias são 1:1 entre linha de extrato e settlement.
663
+ - Auditoria é obrigatória para alterações relevantes.
664
+ - Importação de extratos deve usar chave de deduplicação estável para evitar duplicidade.
665
+
666
+ ---
667
+
668
+ ## 9. Guia rápido de uso (exemplos)
669
+
670
+ ### Criar conta bancária
671
+
672
+ ```http
673
+ POST /finance/bank-accounts
674
+ Authorization: Bearer <token>
675
+ Content-Type: application/json
676
+
677
+ {
678
+ "bank": "Banco do Brasil",
679
+ "branch": "1234",
680
+ "account": "56789-0",
681
+ "type": "checking",
682
+ "description": "Conta principal",
683
+ "initial_balance": 100000
684
+ }
685
+ ```
686
+
687
+ ### Criar título contas a pagar com parcelas
688
+
689
+ ```http
690
+ POST /finance/accounts-payable/installments
691
+ Authorization: Bearer <token>
692
+ Content-Type: application/json
693
+
694
+ {
695
+ "document_number": "FAT-2024-001",
696
+ "person_id": 123,
697
+ "due_date": "2024-07-31",
698
+ "total_amount": 1500.00,
699
+ "installments": [
700
+ { "installment_number": 1, "due_date": "2024-07-31", "amount": 500.00 },
701
+ { "installment_number": 2, "due_date": "2024-08-31", "amount": 500.00 },
702
+ { "installment_number": 3, "due_date": "2024-09-30", "amount": 500.00 }
703
+ ]
704
+ }
705
+ ```
706
+
707
+ ### Registrar liquidação de parcela
708
+
709
+ ```http
710
+ POST /finance/accounts-payable/installments/456/settlements
711
+ Authorization: Bearer <token>
712
+ Content-Type: application/json
713
+
714
+ {
715
+ "installment_id": 456,
716
+ "amount": 500.00,
717
+ "settled_at": "2024-07-31T10:00:00Z",
718
+ "bank_account_id": 10,
719
+ "payment_channel": "TED",
720
+ "discount": 0,
721
+ "interest": 0,
722
+ "penalty": 0,
723
+ "description": "Pagamento via TED"
724
+ }
725
+ ```
726
+
727
+ ### Importar extrato bancário
728
+
729
+ ```http
730
+ POST /finance/statements/import
731
+ Authorization: Bearer <token>
732
+ Content-Type: multipart/form-data
733
+
734
+ Form-data:
735
+ - file: arquivo OFX ou CSV
736
+ - bank_account_id: 10
737
+ ```
738
+
739
+ ### Estornar liquidação
740
+
741
+ ```http
742
+ PATCH /finance/accounts-payable/installments/456/settlements/789/reverse
743
+ Authorization: Bearer <token>
744
+ Content-Type: application/json
745
+
746
+ {
747
+ "reason": "Pagamento duplicado",
748
+ "memo": "Estorno realizado em 2024-08-01"
749
+ }
750
+ ```
751
+
752
+ ---
753
+
754
+ 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.275",
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.275",
13
13
  "@hed-hog/api-prisma": "0.0.5",
14
- "@hed-hog/api-pagination": "0.0.6",
15
- "@hed-hog/tag": "0.0.270",
16
14
  "@hed-hog/api": "0.0.4",
17
- "@hed-hog/api-types": "0.0.1",
15
+ "@hed-hog/tag": "0.0.275",
18
16
  "@hed-hog/api-locale": "0.0.13",
19
- "@hed-hog/core": "0.0.270"
17
+ "@hed-hog/core": "0.0.275",
18
+ "@hed-hog/api-types": "0.0.1",
19
+ "@hed-hog/api-pagination": "0.0.6"
20
20
  },
21
21
  "exports": {
22
22
  ".": {