@hed-hog/finance 0.0.318 → 0.0.321

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 (92) hide show
  1. package/dist/dto/create-bank-account.dto.d.ts +1 -0
  2. package/dist/dto/create-bank-account.dto.d.ts.map +1 -1
  3. package/dist/dto/create-bank-account.dto.js +7 -0
  4. package/dist/dto/create-bank-account.dto.js.map +1 -1
  5. package/dist/dto/create-bank-statement-entry.dto.d.ts +8 -0
  6. package/dist/dto/create-bank-statement-entry.dto.d.ts.map +1 -0
  7. package/dist/dto/create-bank-statement-entry.dto.js +54 -0
  8. package/dist/dto/create-bank-statement-entry.dto.js.map +1 -0
  9. package/dist/dto/create-currency.dto.d.ts +6 -0
  10. package/dist/dto/create-currency.dto.d.ts.map +1 -0
  11. package/dist/dto/create-currency.dto.js +37 -0
  12. package/dist/dto/create-currency.dto.js.map +1 -0
  13. package/dist/dto/update-bank-account.dto.d.ts +1 -0
  14. package/dist/dto/update-bank-account.dto.d.ts.map +1 -1
  15. package/dist/dto/update-bank-account.dto.js +7 -0
  16. package/dist/dto/update-bank-account.dto.js.map +1 -1
  17. package/dist/dto/update-bank-statement-entry.dto.d.ts +6 -0
  18. package/dist/dto/update-bank-statement-entry.dto.d.ts.map +1 -0
  19. package/dist/dto/update-bank-statement-entry.dto.js +42 -0
  20. package/dist/dto/update-bank-statement-entry.dto.js.map +1 -0
  21. package/dist/dto/update-currency.dto.d.ts +7 -0
  22. package/dist/dto/update-currency.dto.d.ts.map +1 -0
  23. package/dist/dto/update-currency.dto.js +47 -0
  24. package/dist/dto/update-currency.dto.js.map +1 -0
  25. package/dist/finance-bank-accounts.controller.d.ts +25 -13
  26. package/dist/finance-bank-accounts.controller.d.ts.map +1 -1
  27. package/dist/finance-bank-accounts.controller.js +5 -3
  28. package/dist/finance-bank-accounts.controller.js.map +1 -1
  29. package/dist/finance-currencies.controller.d.ts +36 -0
  30. package/dist/finance-currencies.controller.d.ts.map +1 -0
  31. package/dist/finance-currencies.controller.js +74 -0
  32. package/dist/finance-currencies.controller.js.map +1 -0
  33. package/dist/finance-data.controller.d.ts +4 -0
  34. package/dist/finance-data.controller.d.ts.map +1 -1
  35. package/dist/finance-installments.controller.d.ts +3 -2
  36. package/dist/finance-installments.controller.d.ts.map +1 -1
  37. package/dist/finance-installments.controller.js +10 -6
  38. package/dist/finance-installments.controller.js.map +1 -1
  39. package/dist/finance-statements.controller.d.ts +61 -12
  40. package/dist/finance-statements.controller.d.ts.map +1 -1
  41. package/dist/finance-statements.controller.js +50 -8
  42. package/dist/finance-statements.controller.js.map +1 -1
  43. package/dist/finance-transfers.controller.d.ts +13 -8
  44. package/dist/finance-transfers.controller.d.ts.map +1 -1
  45. package/dist/finance-transfers.controller.js +11 -5
  46. package/dist/finance-transfers.controller.js.map +1 -1
  47. package/dist/finance.module.d.ts.map +1 -1
  48. package/dist/finance.module.js +2 -0
  49. package/dist/finance.module.js.map +1 -1
  50. package/dist/finance.service.d.ts +153 -35
  51. package/dist/finance.service.d.ts.map +1 -1
  52. package/dist/finance.service.js +468 -55
  53. package/dist/finance.service.js.map +1 -1
  54. package/hedhog/data/currency.yaml +14 -0
  55. package/hedhog/data/menu.yaml +16 -0
  56. package/hedhog/data/role.yaml +9 -1
  57. package/hedhog/data/route.yaml +78 -0
  58. package/hedhog/frontend/app/accounts-payable/approvals/page.tsx.ejs +87 -72
  59. package/hedhog/frontend/app/accounts-payable/installments/page.tsx.ejs +53 -25
  60. package/hedhog/frontend/app/accounts-receivable/installments/[id]/page.tsx.ejs +8 -0
  61. package/hedhog/frontend/app/accounts-receivable/installments/page.tsx.ejs +60 -24
  62. package/hedhog/frontend/app/administration/currencies/page.tsx.ejs +490 -0
  63. package/hedhog/frontend/app/cash-and-banks/bank-accounts/page.tsx.ejs +243 -65
  64. package/hedhog/frontend/app/cash-and-banks/bank-reconciliation/page.tsx.ejs +25 -3
  65. package/hedhog/frontend/app/cash-and-banks/statements/page.tsx.ejs +732 -61
  66. package/hedhog/frontend/app/cash-and-banks/transfers/page.tsx.ejs +101 -15
  67. package/hedhog/frontend/messages/en.json +58 -0
  68. package/hedhog/frontend/messages/pt.json +58 -0
  69. package/hedhog/table/bank_account.yaml +8 -0
  70. package/hedhog/table/bank_statement_line.yaml +1 -1
  71. package/hedhog/table/cashflow_projection.yaml +1 -1
  72. package/hedhog/table/currency.yaml +21 -0
  73. package/hedhog/table/financial_installment.yaml +2 -2
  74. package/hedhog/table/financial_title.yaml +1 -1
  75. package/hedhog/table/installment_allocation.yaml +1 -1
  76. package/hedhog/table/receivable_schedule.yaml +1 -1
  77. package/hedhog/table/settlement.yaml +1 -1
  78. package/hedhog/table/settlement_allocation.yaml +5 -5
  79. package/package.json +6 -6
  80. package/src/dto/create-bank-account.dto.ts +18 -1
  81. package/src/dto/create-bank-statement-entry.dto.ts +50 -0
  82. package/src/dto/create-currency.dto.ts +21 -0
  83. package/src/dto/update-bank-account.dto.ts +11 -1
  84. package/src/dto/update-bank-statement-entry.dto.ts +31 -0
  85. package/src/dto/update-currency.dto.ts +31 -0
  86. package/src/finance-bank-accounts.controller.ts +3 -2
  87. package/src/finance-currencies.controller.ts +44 -0
  88. package/src/finance-installments.controller.ts +9 -3
  89. package/src/finance-statements.controller.ts +40 -0
  90. package/src/finance-transfers.controller.ts +7 -1
  91. package/src/finance.module.ts +2 -0
  92. package/src/finance.service.ts +633 -55
@@ -1,8 +1,9 @@
1
1
  'use client';
2
2
 
3
3
  import { FinancePageSection } from '@/app/(app)/(libraries)/finance/_components/finance-layout';
4
- import { Page, PageHeader } from '@/components/entity-list';
4
+ import { Page, PageHeader, PaginationFooter } from '@/components/entity-list';
5
5
  import { Button } from '@/components/ui/button';
6
+ import { DateRangePicker } from '@/components/ui/date-range-picker';
6
7
  import { FilterBar } from '@/components/ui/filter-bar';
7
8
  import {
8
9
  Form,
@@ -68,6 +69,19 @@ type Transfer = {
68
69
  descricao: string;
69
70
  };
70
71
 
72
+ type PaginatedTransfersResponse = {
73
+ data: Transfer[];
74
+ total: number;
75
+ page: number;
76
+ pageSize: number;
77
+ prev: number | null;
78
+ next: number | null;
79
+ lastPage: number;
80
+ summary?: {
81
+ totalTransferido?: number;
82
+ };
83
+ };
84
+
71
85
  type TransferDraftPayload = {
72
86
  values: TransferFormValues;
73
87
  };
@@ -244,7 +258,7 @@ function NovaTransferenciaSheet({
244
258
  <FormLabel>{t('fields.sourceAccount')}</FormLabel>
245
259
  <Select value={field.value} onValueChange={field.onChange}>
246
260
  <FormControl>
247
- <SelectTrigger>
261
+ <SelectTrigger className="w-full">
248
262
  <SelectValue placeholder={t('common.select')} />
249
263
  </SelectTrigger>
250
264
  </FormControl>
@@ -269,7 +283,7 @@ function NovaTransferenciaSheet({
269
283
  <FormLabel>{t('fields.destinationAccount')}</FormLabel>
270
284
  <Select value={field.value} onValueChange={field.onChange}>
271
285
  <FormControl>
272
- <SelectTrigger>
286
+ <SelectTrigger className="w-full">
273
287
  <SelectValue placeholder={t('common.select')} />
274
288
  </SelectTrigger>
275
289
  </FormControl>
@@ -373,6 +387,10 @@ export default function TransferenciasPage() {
373
387
  const [search, setSearch] = useState('');
374
388
  const [debouncedSearch, setDebouncedSearch] = useState('');
375
389
  const [accountFilter, setAccountFilter] = useState('all');
390
+ const [fromDate, setFromDate] = useState('');
391
+ const [toDate, setToDate] = useState('');
392
+ const [page, setPage] = useState(1);
393
+ const pageSize = 10;
376
394
 
377
395
  useEffect(() => {
378
396
  const timeoutId = window.setTimeout(() => {
@@ -391,48 +409,98 @@ export default function TransferenciasPage() {
391
409
  const response = await request({
392
410
  url: '/finance/bank-accounts',
393
411
  method: 'GET',
412
+ params: {
413
+ page: 1,
414
+ pageSize: 100,
415
+ },
394
416
  });
395
417
 
396
- return (response?.data || []) as BankAccount[];
418
+ const payload = response?.data as
419
+ | { data?: BankAccount[] }
420
+ | BankAccount[]
421
+ | undefined;
422
+
423
+ return (
424
+ Array.isArray(payload) ? payload : payload?.data || []
425
+ ) as BankAccount[];
397
426
  },
398
427
  });
399
428
 
400
- const { data: transferencias = [], refetch: refetchTransferencias } =
401
- useQuery<Transfer[]>({
402
- queryKey: ['finance-transfers', debouncedSearch, accountFilter],
429
+ const { data: transferenciasResponse, refetch: refetchTransferencias } =
430
+ useQuery<PaginatedTransfersResponse>({
431
+ queryKey: [
432
+ 'finance-transfers',
433
+ debouncedSearch,
434
+ accountFilter,
435
+ fromDate,
436
+ toDate,
437
+ page,
438
+ pageSize,
439
+ ],
403
440
  queryFn: async () => {
404
- const params = new URLSearchParams();
441
+ const params: Record<string, string | number> = {
442
+ page,
443
+ pageSize,
444
+ };
405
445
 
406
446
  const trimmedSearch = debouncedSearch.trim();
407
447
  if (trimmedSearch) {
408
- params.set('search', trimmedSearch);
448
+ params.search = trimmedSearch;
409
449
  }
410
450
 
411
451
  if (accountFilter !== 'all') {
412
- params.set('bank_account_id', accountFilter);
452
+ params.bank_account_id = accountFilter;
453
+ }
454
+
455
+ if (fromDate) {
456
+ params.from = fromDate;
457
+ }
458
+
459
+ if (toDate) {
460
+ params.to = toDate;
413
461
  }
414
462
 
415
- const query = params.toString();
416
463
  const response = await request({
417
- url: query ? `/finance/transfers?${query}` : '/finance/transfers',
464
+ url: '/finance/transfers',
418
465
  method: 'GET',
466
+ params,
419
467
  });
420
468
 
421
- return (response?.data || []) as Transfer[];
469
+ return (response?.data || {
470
+ data: [],
471
+ total: 0,
472
+ page,
473
+ pageSize,
474
+ prev: null,
475
+ next: null,
476
+ lastPage: 1,
477
+ summary: {
478
+ totalTransferido: 0,
479
+ },
480
+ }) as PaginatedTransfersResponse;
422
481
  },
482
+ placeholderData: (old) => old,
423
483
  });
424
484
 
485
+ useEffect(() => {
486
+ setPage(1);
487
+ }, [debouncedSearch, accountFilter, fromDate, toDate]);
488
+
425
489
  const handleTransferCreated = async () => {
426
490
  await Promise.all([refetchTransferencias(), refetchContasBancarias()]);
427
491
  };
428
492
 
429
- const totalTransferido = transferencias.reduce((acc, t) => acc + t.valor, 0);
493
+ const transferencias = transferenciasResponse?.data ?? [];
494
+ const totalTransferencias = transferenciasResponse?.total ?? 0;
495
+ const totalTransferido =
496
+ transferenciasResponse?.summary?.totalTransferido ??
497
+ transferencias.reduce((acc, transfer) => acc + transfer.valor, 0);
430
498
  const summaryCards = [
431
499
  {
432
500
  key: 'transferred',
433
501
  title: t('cards.totalTransferred'),
434
502
  value: <Money value={totalTransferido} />,
435
- description: t('cards.transferCount', { count: transferencias.length }),
503
+ description: t('cards.transferCount', { count: totalTransferencias }),
436
504
  icon: ArrowRight,
437
505
  layout: 'compact' as const,
438
506
  iconContainerClassName: 'bg-blue-500/10 text-blue-700',
@@ -488,6 +556,14 @@ export default function TransferenciasPage() {
488
556
  onSearchChange={setSearch}
489
557
  />
490
558
  </div>
559
+
560
+ <DateRangePicker
561
+ fromDate={fromDate}
562
+ toDate={toDate}
563
+ onFromDateChange={setFromDate}
564
+ onToDateChange={setToDate}
565
+ defaultPreset="thisMonth"
566
+ />
491
567
  </div>
492
568
 
493
569
  <KpiCardsGrid items={summaryCards} columns={2} />
@@ -550,6 +626,16 @@ export default function TransferenciasPage() {
550
626
  </TableBody>
551
627
  </Table>
552
628
  </div>
629
+ <div className="border-t border-border/50 px-4 py-4 sm:px-6">
630
+ <PaginationFooter
631
+ currentPage={page}
632
+ pageSize={pageSize}
633
+ totalItems={totalTransferencias}
634
+ onPageChange={setPage}
635
+ onPageSizeChange={() => undefined}
636
+ pageSizeOptions={[10]}
637
+ />
638
+ </div>
553
639
  </FinancePageSection>
554
640
  </Page>
555
641
  );
@@ -1868,5 +1868,63 @@
1868
1868
  },
1869
1869
  "empty": "No expenses found for selected filters"
1870
1870
  }
1871
+ },
1872
+ "AdminCurrenciesPage": {
1873
+ "common": {
1874
+ "cancel": "Cancel",
1875
+ "save": "Save"
1876
+ },
1877
+ "messages": {
1878
+ "createSuccess": "Currency created successfully",
1879
+ "createError": "Error creating currency",
1880
+ "updateSuccess": "Currency updated successfully",
1881
+ "updateError": "Error updating currency",
1882
+ "deleteSuccess": "Currency deactivated successfully",
1883
+ "deleteError": "Error deactivating currency"
1884
+ },
1885
+ "header": {
1886
+ "title": "Currencies",
1887
+ "description": "Manage currencies used in bank accounts and financial transactions"
1888
+ },
1889
+ "breadcrumbs": {
1890
+ "finance": "Finance",
1891
+ "administration": "Administration",
1892
+ "current": "Currencies"
1893
+ },
1894
+ "actions": {
1895
+ "newCurrency": "New currency"
1896
+ },
1897
+ "sheet": {
1898
+ "newTitle": "New currency",
1899
+ "editTitle": "Edit currency",
1900
+ "newDescription": "Register a new currency with its ISO code and symbol.",
1901
+ "editDescription": "Update the currency information.",
1902
+ "fields": {
1903
+ "code": "ISO Code",
1904
+ "codePlaceholder": "Ex.: BRL",
1905
+ "name": "Name",
1906
+ "namePlaceholder": "Ex.: Brazilian Real",
1907
+ "symbol": "Symbol",
1908
+ "symbolPlaceholder": "Ex.: R$"
1909
+ },
1910
+ "validation": {
1911
+ "codeRequired": "ISO code is required",
1912
+ "codeMaxLength": "ISO code must have at most 3 characters",
1913
+ "nameRequired": "Name is required",
1914
+ "symbolRequired": "Symbol is required"
1915
+ }
1916
+ },
1917
+ "table": {
1918
+ "empty": "No currencies found.",
1919
+ "status": {
1920
+ "active": "Active",
1921
+ "inactive": "Inactive"
1922
+ }
1923
+ },
1924
+ "deleteDialog": {
1925
+ "title": "Deactivate currency",
1926
+ "description": "Do you really want to deactivate this currency?",
1927
+ "confirm": "Deactivate"
1928
+ }
1871
1929
  }
1872
1930
  }
@@ -1868,5 +1868,63 @@
1868
1868
  },
1869
1869
  "empty": "Nenhum gasto encontrado para os filtros selecionados"
1870
1870
  }
1871
+ },
1872
+ "AdminCurrenciesPage": {
1873
+ "common": {
1874
+ "cancel": "Cancelar",
1875
+ "save": "Salvar"
1876
+ },
1877
+ "messages": {
1878
+ "createSuccess": "Moeda cadastrada com sucesso",
1879
+ "createError": "Erro ao cadastrar moeda",
1880
+ "updateSuccess": "Moeda atualizada com sucesso",
1881
+ "updateError": "Erro ao atualizar moeda",
1882
+ "deleteSuccess": "Moeda inativada com sucesso",
1883
+ "deleteError": "Erro ao inativar moeda"
1884
+ },
1885
+ "header": {
1886
+ "title": "Moedas",
1887
+ "description": "Gerencie as moedas utilizadas em contas bancárias e transações financeiras"
1888
+ },
1889
+ "breadcrumbs": {
1890
+ "finance": "Financeiro",
1891
+ "administration": "Administração",
1892
+ "current": "Moedas"
1893
+ },
1894
+ "actions": {
1895
+ "newCurrency": "Nova moeda"
1896
+ },
1897
+ "sheet": {
1898
+ "newTitle": "Nova moeda",
1899
+ "editTitle": "Editar moeda",
1900
+ "newDescription": "Cadastre uma nova moeda com seu código ISO e símbolo.",
1901
+ "editDescription": "Atualize as informações da moeda.",
1902
+ "fields": {
1903
+ "code": "Código ISO",
1904
+ "codePlaceholder": "Ex.: BRL",
1905
+ "name": "Nome",
1906
+ "namePlaceholder": "Ex.: Real Brasileiro",
1907
+ "symbol": "Símbolo",
1908
+ "symbolPlaceholder": "Ex.: R$"
1909
+ },
1910
+ "validation": {
1911
+ "codeRequired": "Código ISO é obrigatório",
1912
+ "codeMaxLength": "Código ISO deve ter no máximo 3 caracteres",
1913
+ "nameRequired": "Nome é obrigatório",
1914
+ "symbolRequired": "Símbolo é obrigatório"
1915
+ }
1916
+ },
1917
+ "table": {
1918
+ "empty": "Nenhuma moeda encontrada.",
1919
+ "status": {
1920
+ "active": "Ativa",
1921
+ "inactive": "Inativa"
1922
+ }
1923
+ },
1924
+ "deleteDialog": {
1925
+ "title": "Inativar moeda",
1926
+ "description": "Deseja realmente inativar esta moeda?",
1927
+ "confirm": "Inativar"
1928
+ }
1871
1929
  }
1872
1930
  }
@@ -22,6 +22,13 @@ columns:
22
22
  type: varchar
23
23
  length: 34
24
24
  isNullable: true
25
+ - name: currency_id
26
+ type: fk
27
+ isNullable: true
28
+ references:
29
+ table: currency
30
+ column: id
31
+ onDelete: SET NULL
25
32
  - name: account_type
26
33
  type: enum
27
34
  values: [checking, savings, investment, cash, other]
@@ -42,4 +49,5 @@ indices:
42
49
  - columns: [code]
43
50
  isUnique: true
44
51
  - columns: [logo_file_id]
52
+ - columns: [currency_id]
45
53
  - columns: [status]
@@ -21,7 +21,7 @@ columns:
21
21
  - name: posted_date
22
22
  type: datetime
23
23
  - name: amount_cents
24
- type: int
24
+ type: bigint
25
25
  - name: description
26
26
  type: text
27
27
  - name: status
@@ -13,7 +13,7 @@ columns:
13
13
  type: enum
14
14
  values: [inflow, outflow, net]
15
15
  - name: amount_cents
16
- type: int
16
+ type: bigint
17
17
  - name: notes
18
18
  type: text
19
19
  isNullable: true
@@ -0,0 +1,21 @@
1
+ columns:
2
+ - type: pk
3
+ - name: code
4
+ type: varchar
5
+ length: 3
6
+ - name: name
7
+ type: varchar
8
+ length: 100
9
+ - name: symbol
10
+ type: varchar
11
+ length: 10
12
+ - name: status
13
+ type: enum
14
+ values: [active, inactive]
15
+ - type: created_at
16
+ - type: updated_at
17
+
18
+ indices:
19
+ - columns: [code]
20
+ isUnique: true
21
+ - columns: [status]
@@ -14,9 +14,9 @@ columns:
14
14
  - name: due_date
15
15
  type: datetime
16
16
  - name: amount_cents
17
- type: int
17
+ type: bigint
18
18
  - name: open_amount_cents
19
- type: int
19
+ type: bigint
20
20
  - name: status
21
21
  type: enum
22
22
  values: [open, partial, settled, canceled, overdue]
@@ -27,7 +27,7 @@ columns:
27
27
  type: datetime
28
28
  isNullable: true
29
29
  - name: total_amount_cents
30
- type: int
30
+ type: bigint
31
31
  - name: finance_category_id
32
32
  type: fk
33
33
  isNullable: true
@@ -15,7 +15,7 @@ columns:
15
15
  onDelete: RESTRICT
16
16
  onUpdate: CASCADE
17
17
  - name: allocated_amount_cents
18
- type: int
18
+ type: bigint
19
19
  - type: created_at
20
20
  - type: updated_at
21
21
 
@@ -18,7 +18,7 @@ columns:
18
18
  - name: expected_date
19
19
  type: datetime
20
20
  - name: amount_cents
21
- type: int
21
+ type: bigint
22
22
  - name: description
23
23
  type: text
24
24
  isNullable: true
@@ -37,7 +37,7 @@ columns:
37
37
  - name: settled_at
38
38
  type: datetime
39
39
  - name: amount_cents
40
- type: int
40
+ type: bigint
41
41
  - name: description
42
42
  type: text
43
43
  isNullable: true
@@ -15,18 +15,18 @@ columns:
15
15
  onDelete: RESTRICT
16
16
  onUpdate: CASCADE
17
17
  - name: allocated_amount_cents
18
- type: int
18
+ type: bigint
19
19
  - name: amount_cents
20
- type: int
20
+ type: bigint
21
21
  isNullable: true
22
22
  - name: discount_cents
23
- type: int
23
+ type: bigint
24
24
  default: 0
25
25
  - name: interest_cents
26
- type: int
26
+ type: bigint
27
27
  default: 0
28
28
  - name: penalty_cents
29
- type: int
29
+ type: bigint
30
30
  default: 0
31
31
  - type: created_at
32
32
  - type: updated_at
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hed-hog/finance",
3
- "version": "0.0.318",
3
+ "version": "0.0.321",
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.318",
12
+ "@hed-hog/api": "0.0.8",
13
13
  "@hed-hog/api-locale": "0.0.14",
14
- "@hed-hog/tag": "0.0.318",
15
- "@hed-hog/api-prisma": "0.0.6",
14
+ "@hed-hog/contact": "0.0.321",
16
15
  "@hed-hog/api-pagination": "0.0.7",
17
- "@hed-hog/api": "0.0.6",
16
+ "@hed-hog/api-prisma": "0.0.6",
18
17
  "@hed-hog/api-types": "0.0.1",
19
- "@hed-hog/core": "0.0.318"
18
+ "@hed-hog/tag": "0.0.321",
19
+ "@hed-hog/core": "0.0.321"
20
20
  },
21
21
  "exports": {
22
22
  ".": {
@@ -1,5 +1,12 @@
1
1
  import { getLocaleText } from '@hed-hog/api-locale';
2
- import { IsInt, IsNumber, IsOptional, IsString, Min } from 'class-validator';
2
+ import {
3
+ IsDateString,
4
+ IsInt,
5
+ IsNumber,
6
+ IsOptional,
7
+ IsString,
8
+ Min,
9
+ } from 'class-validator';
3
10
 
4
11
  export class CreateBankAccountDto {
5
12
  @IsString({
@@ -52,4 +59,14 @@ export class CreateBankAccountDto {
52
59
  message: (args) => getLocaleText('validation.initialBalanceMin', args.value),
53
60
  })
54
61
  initial_balance?: number;
62
+
63
+ @IsOptional()
64
+ @IsDateString(
65
+ {},
66
+ {
67
+ message: (args) =>
68
+ getLocaleText('validation.dateMustBeDateString', args.value),
69
+ },
70
+ )
71
+ start_date?: string;
55
72
  }
@@ -0,0 +1,50 @@
1
+ import { getLocaleText } from '@hed-hog/api-locale';
2
+ import {
3
+ IsDateString,
4
+ IsIn,
5
+ IsInt,
6
+ IsNumber,
7
+ IsString,
8
+ Min,
9
+ } from 'class-validator';
10
+
11
+ export class CreateBankStatementEntryDto {
12
+ @IsInt({
13
+ message: (args) => getLocaleText('validation.idMustBeInteger', args.value),
14
+ })
15
+ bank_account_id: number;
16
+
17
+ @IsDateString(
18
+ {},
19
+ {
20
+ message: (args) =>
21
+ getLocaleText('validation.dateMustBeDateString', args.value),
22
+ },
23
+ )
24
+ date: string;
25
+
26
+ @IsString({
27
+ message: (args) =>
28
+ getLocaleText('validation.descriptionMustBeString', args.value),
29
+ })
30
+ description: string;
31
+
32
+ @IsNumber(
33
+ {},
34
+ {
35
+ message: (args) => getLocaleText('validation.amountMustBeNumber', args.value),
36
+ },
37
+ )
38
+ @Min(0.01, {
39
+ message: (args) => getLocaleText('validation.amountGreaterThanZero', args.value),
40
+ })
41
+ amount: number;
42
+
43
+ @IsString({
44
+ message: (args) => getLocaleText('validation.typeMustBeString', args.value),
45
+ })
46
+ @IsIn(['entrada', 'saida'], {
47
+ message: (args) => getLocaleText('validation.typeIsNotValid', args.value),
48
+ })
49
+ type: 'entrada' | 'saida';
50
+ }
@@ -0,0 +1,21 @@
1
+ import { getLocaleText } from '@hed-hog/api-locale';
2
+ import { IsString, Length } from 'class-validator';
3
+
4
+ export class CreateCurrencyDto {
5
+ @IsString({
6
+ message: (args) => getLocaleText('validation.codeMustBeString', args.value),
7
+ })
8
+ @Length(1, 3)
9
+ code: string;
10
+
11
+ @IsString({
12
+ message: (args) => getLocaleText('validation.nameMustBeString', args.value),
13
+ })
14
+ name: string;
15
+
16
+ @IsString({
17
+ message: (args) =>
18
+ getLocaleText('validation.symbolMustBeString', args.value),
19
+ })
20
+ symbol: string;
21
+ }
@@ -1,5 +1,5 @@
1
1
  import { getLocaleText } from '@hed-hog/api-locale';
2
- import { IsInt, IsOptional, IsString } from 'class-validator';
2
+ import { IsDateString, IsInt, IsOptional, IsString } from 'class-validator';
3
3
 
4
4
  export class UpdateBankAccountDto {
5
5
  @IsOptional()
@@ -48,4 +48,14 @@ export class UpdateBankAccountDto {
48
48
  getLocaleText('validation.statusMustBeString', args.value),
49
49
  })
50
50
  status?: 'active' | 'inactive';
51
+
52
+ @IsOptional()
53
+ @IsDateString(
54
+ {},
55
+ {
56
+ message: (args) =>
57
+ getLocaleText('validation.dateMustBeDateString', args.value),
58
+ },
59
+ )
60
+ start_date?: string;
51
61
  }
@@ -0,0 +1,31 @@
1
+ import { getLocaleText } from '@hed-hog/api-locale';
2
+ import { IsDateString, IsNumber, IsOptional, IsString, Min } from 'class-validator';
3
+
4
+ export class UpdateBankStatementEntryDto {
5
+ @IsOptional()
6
+ @IsNumber(
7
+ {},
8
+ {
9
+ message: (args) => getLocaleText('validation.amountMustBeNumber', args.value),
10
+ },
11
+ )
12
+ @Min(0.01, {
13
+ message: (args) => getLocaleText('validation.amountGreaterThanZero', args.value),
14
+ })
15
+ amount?: number;
16
+
17
+ @IsOptional()
18
+ @IsString({
19
+ message: (args) => getLocaleText('validation.descriptionMustBeString', args.value),
20
+ })
21
+ description?: string;
22
+
23
+ @IsOptional()
24
+ @IsDateString(
25
+ {},
26
+ {
27
+ message: (args) => getLocaleText('validation.dateMustBeDateString', args.value),
28
+ },
29
+ )
30
+ date?: string;
31
+ }
@@ -0,0 +1,31 @@
1
+ import { getLocaleText } from '@hed-hog/api-locale';
2
+ import { IsOptional, IsString, Length } from 'class-validator';
3
+
4
+ export class UpdateCurrencyDto {
5
+ @IsOptional()
6
+ @IsString({
7
+ message: (args) => getLocaleText('validation.codeMustBeString', args.value),
8
+ })
9
+ @Length(1, 3)
10
+ code?: string;
11
+
12
+ @IsOptional()
13
+ @IsString({
14
+ message: (args) => getLocaleText('validation.nameMustBeString', args.value),
15
+ })
16
+ name?: string;
17
+
18
+ @IsOptional()
19
+ @IsString({
20
+ message: (args) =>
21
+ getLocaleText('validation.symbolMustBeString', args.value),
22
+ })
23
+ symbol?: string;
24
+
25
+ @IsOptional()
26
+ @IsString({
27
+ message: (args) =>
28
+ getLocaleText('validation.statusMustBeString', args.value),
29
+ })
30
+ status?: 'active' | 'inactive';
31
+ }