@hed-hog/finance 0.0.299 → 0.0.301

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 (79) 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/update-bank-account.dto.d.ts +1 -0
  6. package/dist/dto/update-bank-account.dto.d.ts.map +1 -1
  7. package/dist/dto/update-bank-account.dto.js +7 -0
  8. package/dist/dto/update-bank-account.dto.js.map +1 -1
  9. package/dist/finance-bank-accounts.controller.d.ts +3 -0
  10. package/dist/finance-bank-accounts.controller.d.ts.map +1 -1
  11. package/dist/finance-data.controller.d.ts +1 -0
  12. package/dist/finance-data.controller.d.ts.map +1 -1
  13. package/dist/finance.contract-activated.subscriber.d.ts +24 -0
  14. package/dist/finance.contract-activated.subscriber.d.ts.map +1 -0
  15. package/dist/finance.contract-activated.subscriber.js +519 -0
  16. package/dist/finance.contract-activated.subscriber.js.map +1 -0
  17. package/dist/finance.contract-activated.subscriber.spec.d.ts +2 -0
  18. package/dist/finance.contract-activated.subscriber.spec.d.ts.map +1 -0
  19. package/dist/finance.contract-activated.subscriber.spec.js +302 -0
  20. package/dist/finance.contract-activated.subscriber.spec.js.map +1 -0
  21. package/dist/finance.module.d.ts.map +1 -1
  22. package/dist/finance.module.js +6 -1
  23. package/dist/finance.module.js.map +1 -1
  24. package/dist/finance.service.d.ts +4 -0
  25. package/dist/finance.service.d.ts.map +1 -1
  26. package/dist/finance.service.js +5 -0
  27. package/dist/finance.service.js.map +1 -1
  28. package/hedhog/data/dashboard.yaml +6 -0
  29. package/hedhog/data/dashboard_component.yaml +72 -17
  30. package/hedhog/data/dashboard_component_role.yaml +30 -0
  31. package/hedhog/data/dashboard_item.yaml +155 -0
  32. package/hedhog/data/dashboard_role.yaml +6 -0
  33. package/hedhog/data/role_menu.yaml +6 -0
  34. package/hedhog/data/role_route.yaml +127 -0
  35. package/hedhog/frontend/app/_components/finance-layout.tsx.ejs +108 -0
  36. package/hedhog/frontend/app/accounts-payable/approvals/page.tsx.ejs +91 -106
  37. package/hedhog/frontend/app/accounts-payable/installments/page.tsx.ejs +1306 -1145
  38. package/hedhog/frontend/app/accounts-receivable/collections-default/page.tsx.ejs +288 -268
  39. package/hedhog/frontend/app/accounts-receivable/installments/page.tsx.ejs +491 -351
  40. package/hedhog/frontend/app/administration/audit-logs/page.tsx.ejs +157 -173
  41. package/hedhog/frontend/app/administration/categories/page.tsx.ejs +44 -62
  42. package/hedhog/frontend/app/administration/cost-centers/page.tsx.ejs +62 -80
  43. package/hedhog/frontend/app/administration/period-close/page.tsx.ejs +151 -170
  44. package/hedhog/frontend/app/cash-and-banks/bank-accounts/page.tsx.ejs +586 -224
  45. package/hedhog/frontend/app/cash-and-banks/bank-reconciliation/page.tsx.ejs +204 -226
  46. package/hedhog/frontend/app/cash-and-banks/statements/page.tsx.ejs +122 -140
  47. package/hedhog/frontend/app/cash-and-banks/transfers/page.tsx.ejs +32 -49
  48. package/hedhog/frontend/app/planning/cash-flow-forecast/page.tsx.ejs +84 -108
  49. package/hedhog/frontend/app/planning/receivables-calendar/page.tsx.ejs +53 -70
  50. package/hedhog/frontend/app/planning/scenarios/page.tsx.ejs +98 -95
  51. package/hedhog/frontend/app/reports/actual-vs-forecast/page.tsx.ejs +100 -125
  52. package/hedhog/frontend/app/reports/aging-default/page.tsx.ejs +77 -105
  53. package/hedhog/frontend/app/reports/cash-position/page.tsx.ejs +99 -134
  54. package/hedhog/frontend/app/reports/overview-results/page.tsx.ejs +147 -182
  55. package/hedhog/frontend/app/reports/top-customers/page.tsx.ejs +49 -61
  56. package/hedhog/frontend/app/reports/top-operational-expenses/page.tsx.ejs +49 -67
  57. package/hedhog/frontend/messages/en.json +224 -70
  58. package/hedhog/frontend/messages/pt.json +224 -70
  59. package/hedhog/frontend/widgets/alerts.tsx.ejs +1 -1
  60. package/hedhog/frontend/widgets/bank-reconciliation-status.tsx.ejs +142 -0
  61. package/hedhog/frontend/widgets/cash-balance-kpi.tsx.ejs +9 -9
  62. package/hedhog/frontend/widgets/cash-flow-chart.tsx.ejs +1 -1
  63. package/hedhog/frontend/widgets/default-kpi.tsx.ejs +9 -9
  64. package/hedhog/frontend/widgets/payable-30d-kpi.tsx.ejs +9 -9
  65. package/hedhog/frontend/widgets/pending-approvals-kpi.tsx.ejs +78 -0
  66. package/hedhog/frontend/widgets/pending-approvals-list.tsx.ejs +147 -0
  67. package/hedhog/frontend/widgets/pending-reconciliation-kpi.tsx.ejs +84 -0
  68. package/hedhog/frontend/widgets/receivable-30d-kpi.tsx.ejs +9 -9
  69. package/hedhog/frontend/widgets/receivable-aging-analysis.tsx.ejs +163 -0
  70. package/hedhog/frontend/widgets/upcoming-payable.tsx.ejs +1 -1
  71. package/hedhog/frontend/widgets/upcoming-receivable.tsx.ejs +1 -1
  72. package/hedhog/table/bank_account.yaml +8 -0
  73. package/package.json +7 -6
  74. package/src/dto/create-bank-account.dto.ts +7 -1
  75. package/src/dto/update-bank-account.dto.ts +7 -1
  76. package/src/finance.contract-activated.subscriber.spec.ts +392 -0
  77. package/src/finance.contract-activated.subscriber.ts +780 -0
  78. package/src/finance.module.ts +6 -1
  79. package/src/finance.service.ts +4 -0
@@ -3,13 +3,6 @@
3
3
  import { Page, PageHeader, PaginationFooter } from '@/components/entity-list';
4
4
  import { Badge } from '@/components/ui/badge';
5
5
  import { Button } from '@/components/ui/button';
6
- import {
7
- Card,
8
- CardContent,
9
- CardDescription,
10
- CardHeader,
11
- CardTitle,
12
- } from '@/components/ui/card';
13
6
  import {
14
7
  Form,
15
8
  FormControl,
@@ -43,7 +36,7 @@ import {
43
36
  } from '@/components/ui/table';
44
37
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
45
38
  import { zodResolver } from '@hookform/resolvers/zod';
46
- import { CalendarCheck2, Plus, Search, X } from 'lucide-react';
39
+ import { Plus, Search, X } from 'lucide-react';
47
40
  import { useTranslations } from 'next-intl';
48
41
  import { useState } from 'react';
49
42
  import { useForm } from 'react-hook-form';
@@ -309,187 +302,175 @@ export default function PeriodClosePage() {
309
302
  },
310
303
  { label: t('breadcrumbs.current') },
311
304
  ]}
312
- />
313
-
314
- <Card>
315
- <CardHeader className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
316
- <div>
317
- <CardTitle className="flex items-center gap-2">
318
- <CalendarCheck2 className="h-5 w-5" />
319
- {t('card.title')}
320
- </CardTitle>
321
- <CardDescription>{t('card.description')}</CardDescription>
322
- </div>
305
+ actions={
323
306
  <Button className="gap-2" onClick={() => setSheetOpen(true)}>
324
307
  <Plus className="h-4 w-4" />
325
308
  {t('actions.new')}
326
309
  </Button>
327
- </CardHeader>
328
-
329
- <CardContent className="space-y-4">
330
- <div className="grid gap-3 md:grid-cols-2 lg:grid-cols-4">
331
- <div className="relative lg:col-span-2">
332
- <Search className="pointer-events-none absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" />
333
- <Input
334
- placeholder={t('filters.searchPlaceholder')}
335
- value={search}
336
- onChange={(event) => {
337
- setSearch(event.target.value);
338
- setPage(1);
339
- }}
340
- className="pl-8"
341
- />
342
- </div>
343
-
344
- <Select
345
- value={status}
346
- onValueChange={(value) => {
347
- setStatus(value);
348
- setPage(1);
349
- }}
350
- >
351
- <SelectTrigger>
352
- <SelectValue placeholder={t('filters.status')} />
353
- </SelectTrigger>
354
- <SelectContent>
355
- <SelectItem value="all">{t('filters.allStatus')}</SelectItem>
356
- <SelectItem value="closed">{t('status.closed')}</SelectItem>
357
- <SelectItem value="open">{t('status.open')}</SelectItem>
358
- </SelectContent>
359
- </Select>
310
+ }
311
+ />
360
312
 
313
+ <div className="space-y-4">
314
+ <div className="grid gap-3 md:grid-cols-2 lg:grid-cols-4">
315
+ <div className="relative lg:col-span-2">
316
+ <Search className="pointer-events-none absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" />
361
317
  <Input
362
- placeholder={t('filters.userPlaceholder')}
363
- value={user}
318
+ placeholder={t('filters.searchPlaceholder')}
319
+ value={search}
364
320
  onChange={(event) => {
365
- setUser(event.target.value);
321
+ setSearch(event.target.value);
366
322
  setPage(1);
367
323
  }}
324
+ className="pl-8"
368
325
  />
326
+ </div>
369
327
 
370
- <Input
371
- type="date"
372
- value={from}
373
- onChange={(event) => {
374
- setFrom(event.target.value);
375
- setPage(1);
376
- }}
377
- />
328
+ <Select
329
+ value={status}
330
+ onValueChange={(value) => {
331
+ setStatus(value);
332
+ setPage(1);
333
+ }}
334
+ >
335
+ <SelectTrigger className="w-full">
336
+ <SelectValue placeholder={t('filters.status')} />
337
+ </SelectTrigger>
338
+ <SelectContent>
339
+ <SelectItem value="all">{t('filters.allStatus')}</SelectItem>
340
+ <SelectItem value="closed">{t('status.closed')}</SelectItem>
341
+ <SelectItem value="open">{t('status.open')}</SelectItem>
342
+ </SelectContent>
343
+ </Select>
344
+
345
+ <Input
346
+ placeholder={t('filters.userPlaceholder')}
347
+ value={user}
348
+ onChange={(event) => {
349
+ setUser(event.target.value);
350
+ setPage(1);
351
+ }}
352
+ />
378
353
 
379
- <Input
380
- type="date"
381
- value={to}
382
- onChange={(event) => {
383
- setTo(event.target.value);
384
- setPage(1);
385
- }}
386
- />
354
+ <Input
355
+ type="date"
356
+ value={from}
357
+ onChange={(event) => {
358
+ setFrom(event.target.value);
359
+ setPage(1);
360
+ }}
361
+ />
387
362
 
388
- <Button
389
- variant="outline"
390
- className="gap-2"
391
- onClick={() => {
392
- setSearch('');
393
- setStatus('all');
394
- setUser('');
395
- setFrom('');
396
- setTo('');
397
- setPage(1);
398
- refetch();
399
- }}
400
- >
401
- <X className="h-4 w-4" />
402
- {t('filters.clear')}
403
- </Button>
404
- </div>
363
+ <Input
364
+ type="date"
365
+ value={to}
366
+ onChange={(event) => {
367
+ setTo(event.target.value);
368
+ setPage(1);
369
+ }}
370
+ />
405
371
 
406
- <div className="rounded-md border">
407
- <Table>
408
- <TableHeader>
372
+ <Button
373
+ variant="outline"
374
+ className="gap-2"
375
+ onClick={() => {
376
+ setSearch('');
377
+ setStatus('all');
378
+ setUser('');
379
+ setFrom('');
380
+ setTo('');
381
+ setPage(1);
382
+ refetch();
383
+ }}
384
+ >
385
+ <X className="h-4 w-4" />
386
+ {t('filters.clear')}
387
+ </Button>
388
+ </div>
389
+
390
+ <div className="rounded-md border">
391
+ <Table>
392
+ <TableHeader>
393
+ <TableRow>
394
+ <TableHead>{t('table.headers.start')}</TableHead>
395
+ <TableHead>{t('table.headers.end')}</TableHead>
396
+ <TableHead>{t('table.headers.status')}</TableHead>
397
+ <TableHead>{t('table.headers.closedBy')}</TableHead>
398
+ <TableHead>{t('table.headers.closedAt')}</TableHead>
399
+ <TableHead>{t('table.headers.notes')}</TableHead>
400
+ </TableRow>
401
+ </TableHeader>
402
+ <TableBody>
403
+ {isLoading ? (
409
404
  <TableRow>
410
- <TableHead>{t('table.headers.start')}</TableHead>
411
- <TableHead>{t('table.headers.end')}</TableHead>
412
- <TableHead>{t('table.headers.status')}</TableHead>
413
- <TableHead>{t('table.headers.closedBy')}</TableHead>
414
- <TableHead>{t('table.headers.closedAt')}</TableHead>
415
- <TableHead>{t('table.headers.notes')}</TableHead>
405
+ <TableCell colSpan={6} className="h-24 text-center">
406
+ {t('table.loading')}
407
+ </TableCell>
416
408
  </TableRow>
417
- </TableHeader>
418
- <TableBody>
419
- {isLoading ? (
420
- <TableRow>
421
- <TableCell colSpan={6} className="h-24 text-center">
422
- {t('table.loading')}
409
+ ) : rows.length === 0 ? (
410
+ <TableRow>
411
+ <TableCell colSpan={6} className="h-24 text-center">
412
+ {t('table.empty')}
413
+ </TableCell>
414
+ </TableRow>
415
+ ) : (
416
+ rows.map((row) => (
417
+ <TableRow key={row.id}>
418
+ <TableCell>
419
+ {row.periodStart
420
+ ? new Date(row.periodStart).toLocaleDateString('pt-BR')
421
+ : '-'}
423
422
  </TableCell>
424
- </TableRow>
425
- ) : rows.length === 0 ? (
426
- <TableRow>
427
- <TableCell colSpan={6} className="h-24 text-center">
428
- {t('table.empty')}
423
+ <TableCell>
424
+ {row.periodEnd
425
+ ? new Date(row.periodEnd).toLocaleDateString('pt-BR')
426
+ : '-'}
427
+ </TableCell>
428
+ <TableCell>
429
+ <Badge
430
+ variant={
431
+ row.status === 'closed' ? 'default' : 'secondary'
432
+ }
433
+ >
434
+ {row.status === 'closed'
435
+ ? t('status.closed')
436
+ : t('status.open')}
437
+ </Badge>
438
+ </TableCell>
439
+ <TableCell>
440
+ <div className="flex flex-col">
441
+ <span>{row.closedByName || '-'}</span>
442
+ <span className="text-xs text-muted-foreground">
443
+ {row.closedByEmail || row.closedByUserId || '-'}
444
+ </span>
445
+ </div>
446
+ </TableCell>
447
+ <TableCell>
448
+ {row.closedAt
449
+ ? new Date(row.closedAt).toLocaleString('pt-BR')
450
+ : '-'}
451
+ </TableCell>
452
+ <TableCell className="max-w-80 truncate">
453
+ {row.notes || '-'}
429
454
  </TableCell>
430
455
  </TableRow>
431
- ) : (
432
- rows.map((row) => (
433
- <TableRow key={row.id}>
434
- <TableCell>
435
- {row.periodStart
436
- ? new Date(row.periodStart).toLocaleDateString(
437
- 'pt-BR'
438
- )
439
- : '-'}
440
- </TableCell>
441
- <TableCell>
442
- {row.periodEnd
443
- ? new Date(row.periodEnd).toLocaleDateString('pt-BR')
444
- : '-'}
445
- </TableCell>
446
- <TableCell>
447
- <Badge
448
- variant={
449
- row.status === 'closed' ? 'default' : 'secondary'
450
- }
451
- >
452
- {row.status === 'closed'
453
- ? t('status.closed')
454
- : t('status.open')}
455
- </Badge>
456
- </TableCell>
457
- <TableCell>
458
- <div className="flex flex-col">
459
- <span>{row.closedByName || '-'}</span>
460
- <span className="text-xs text-muted-foreground">
461
- {row.closedByEmail || row.closedByUserId || '-'}
462
- </span>
463
- </div>
464
- </TableCell>
465
- <TableCell>
466
- {row.closedAt
467
- ? new Date(row.closedAt).toLocaleString('pt-BR')
468
- : '-'}
469
- </TableCell>
470
- <TableCell className="max-w-[320px] truncate">
471
- {row.notes || '-'}
472
- </TableCell>
473
- </TableRow>
474
- ))
475
- )}
476
- </TableBody>
477
- </Table>
478
- </div>
479
-
480
- <PaginationFooter
481
- currentPage={data?.page || page}
482
- pageSize={data?.pageSize || pageSize}
483
- totalItems={data?.total || 0}
484
- onPageChange={(newPage) => setPage(newPage)}
485
- onPageSizeChange={(newPageSize) => {
486
- setPageSize(newPageSize);
487
- setPage(1);
488
- }}
489
- pageSizeOptions={[10, 20, 30, 40, 50]}
490
- />
491
- </CardContent>
492
- </Card>
456
+ ))
457
+ )}
458
+ </TableBody>
459
+ </Table>
460
+ </div>
461
+
462
+ <PaginationFooter
463
+ currentPage={data?.page || page}
464
+ pageSize={data?.pageSize || pageSize}
465
+ totalItems={data?.total || 0}
466
+ onPageChange={(newPage) => setPage(newPage)}
467
+ onPageSizeChange={(newPageSize) => {
468
+ setPageSize(newPageSize);
469
+ setPage(1);
470
+ }}
471
+ pageSizeOptions={[10, 20, 30, 40, 50]}
472
+ />
473
+ </div>
493
474
 
494
475
  <ClosePeriodSheet
495
476
  open={sheetOpen}