@hed-hog/finance 0.0.238 → 0.0.240

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 (53) hide show
  1. package/README.md +1 -22
  2. package/dist/dto/reject-title.dto.d.ts +4 -0
  3. package/dist/dto/reject-title.dto.d.ts.map +1 -0
  4. package/dist/dto/reject-title.dto.js +22 -0
  5. package/dist/dto/reject-title.dto.js.map +1 -0
  6. package/dist/dto/reverse-settlement.dto.d.ts +4 -0
  7. package/dist/dto/reverse-settlement.dto.d.ts.map +1 -0
  8. package/dist/dto/reverse-settlement.dto.js +22 -0
  9. package/dist/dto/reverse-settlement.dto.js.map +1 -0
  10. package/dist/dto/settle-installment.dto.d.ts +12 -0
  11. package/dist/dto/settle-installment.dto.d.ts.map +1 -0
  12. package/dist/dto/settle-installment.dto.js +71 -0
  13. package/dist/dto/settle-installment.dto.js.map +1 -0
  14. package/dist/finance-data.controller.d.ts +13 -5
  15. package/dist/finance-data.controller.d.ts.map +1 -1
  16. package/dist/finance-installments.controller.d.ts +380 -12
  17. package/dist/finance-installments.controller.d.ts.map +1 -1
  18. package/dist/finance-installments.controller.js +144 -0
  19. package/dist/finance-installments.controller.js.map +1 -1
  20. package/dist/finance-statements.controller.d.ts +8 -0
  21. package/dist/finance-statements.controller.d.ts.map +1 -1
  22. package/dist/finance-statements.controller.js +40 -0
  23. package/dist/finance-statements.controller.js.map +1 -1
  24. package/dist/finance.module.d.ts.map +1 -1
  25. package/dist/finance.module.js +1 -0
  26. package/dist/finance.module.js.map +1 -1
  27. package/dist/finance.service.d.ts +435 -19
  28. package/dist/finance.service.d.ts.map +1 -1
  29. package/dist/finance.service.js +1286 -80
  30. package/dist/finance.service.js.map +1 -1
  31. package/hedhog/data/route.yaml +117 -0
  32. package/hedhog/frontend/app/accounts-payable/approvals/page.tsx.ejs +92 -12
  33. package/hedhog/frontend/app/accounts-payable/installments/[id]/page.tsx.ejs +434 -7
  34. package/hedhog/frontend/app/accounts-payable/installments/page.tsx.ejs +1172 -25
  35. package/hedhog/frontend/app/accounts-receivable/installments/[id]/page.tsx.ejs +396 -49
  36. package/hedhog/frontend/app/accounts-receivable/installments/page.tsx.ejs +430 -14
  37. package/hedhog/frontend/app/cash-and-banks/statements/page.tsx.ejs +212 -60
  38. package/hedhog/frontend/messages/en.json +1 -0
  39. package/hedhog/frontend/messages/pt.json +1 -0
  40. package/hedhog/query/0_constraints.sql +2 -0
  41. package/hedhog/query/constraints.sql +86 -0
  42. package/hedhog/table/bank_account.yaml +0 -8
  43. package/hedhog/table/financial_title.yaml +1 -9
  44. package/hedhog/table/settlement.yaml +0 -8
  45. package/package.json +6 -6
  46. package/src/dto/reject-title.dto.ts +7 -0
  47. package/src/dto/reverse-settlement.dto.ts +7 -0
  48. package/src/dto/settle-installment.dto.ts +55 -0
  49. package/src/finance-installments.controller.ts +172 -10
  50. package/src/finance-statements.controller.ts +61 -2
  51. package/src/finance.module.ts +2 -1
  52. package/src/finance.service.ts +1887 -106
  53. package/hedhog/table/branch.yaml +0 -18
@@ -31,9 +31,10 @@ import {
31
31
  TableRow,
32
32
  } from '@/components/ui/table';
33
33
  import { Textarea } from '@/components/ui/textarea';
34
+ import { useApp } from '@hed-hog/next-app-provider';
34
35
  import { AlertTriangle, CheckCircle, Clock, XCircle } from 'lucide-react';
35
36
  import { useTranslations } from 'next-intl';
36
- import { useEffect, useState } from 'react';
37
+ import { useMemo, useState } from 'react';
37
38
  import { formatarData } from '../../_lib/formatters';
38
39
  import { useFinanceData } from '../../_lib/use-finance-data';
39
40
 
@@ -43,10 +44,11 @@ function AprovacaoDialog({
43
44
  t,
44
45
  }: {
45
46
  tipo: 'aprovar' | 'reprovar';
46
- onConfirm: () => void;
47
+ onConfirm: (comment?: string) => void;
47
48
  t: ReturnType<typeof useTranslations>;
48
49
  }) {
49
50
  const isAprovar = tipo === 'aprovar';
51
+ const [comment, setComment] = useState('');
50
52
 
51
53
  return (
52
54
  <Dialog>
@@ -81,6 +83,8 @@ function AprovacaoDialog({
81
83
  <Label htmlFor="comentario">{t('dialog.comment')}</Label>
82
84
  <Textarea
83
85
  id="comentario"
86
+ value={comment}
87
+ onChange={(event) => setComment(event.target.value)}
84
88
  placeholder={
85
89
  isAprovar
86
90
  ? t('dialog.optionalCommentPlaceholder')
@@ -96,7 +100,7 @@ function AprovacaoDialog({
96
100
  <Button
97
101
  type="button"
98
102
  variant={isAprovar ? 'default' : 'destructive'}
99
- onClick={onConfirm}
103
+ onClick={() => onConfirm(comment || undefined)}
100
104
  >
101
105
  {isAprovar ? t('dialog.confirmApprove') : t('dialog.confirmReject')}
102
106
  </Button>
@@ -108,19 +112,84 @@ function AprovacaoDialog({
108
112
 
109
113
  export default function AprovacoesPage() {
110
114
  const t = useTranslations('finance.PayableApprovalsPage');
111
- const { data } = useFinanceData();
115
+ const { request, showToastHandler } = useApp();
116
+ const { data, refetch } = useFinanceData();
112
117
  const { aprovacoesPendentes, titulosPagar, pessoas } = data;
113
118
 
114
119
  const getPessoaById = (id?: string) => pessoas.find((p) => p.id === id);
115
120
 
116
- const [aprovacoes, setAprovacoes] = useState(aprovacoesPendentes);
121
+ const aprovacoes = useMemo(() => {
122
+ const pendenciasDoBackend = Array.isArray(aprovacoesPendentes)
123
+ ? aprovacoesPendentes
124
+ : [];
117
125
 
118
- useEffect(() => {
119
- setAprovacoes(aprovacoesPendentes);
120
- }, [aprovacoesPendentes]);
126
+ const pendenciasDerivadasDosTitulos = (
127
+ Array.isArray(titulosPagar) ? titulosPagar : []
128
+ )
129
+ .filter(
130
+ (titulo) => titulo.status === 'rascunho' || titulo.status === 'draft'
131
+ )
132
+ .map((titulo) => ({
133
+ id: String(titulo.id),
134
+ tituloId: String(titulo.id),
135
+ solicitante: '-',
136
+ valor: Number(titulo.valorTotal || 0),
137
+ politica: 'Aprovação financeira',
138
+ urgencia: 'media',
139
+ dataSolicitacao: titulo.criadoEm,
140
+ }));
121
141
 
122
- const handleAprovacao = (id: string) => {
123
- setAprovacoes(aprovacoes.filter((a) => a.id !== id));
142
+ const basePendencias =
143
+ pendenciasDoBackend.length > 0
144
+ ? pendenciasDoBackend
145
+ : pendenciasDerivadasDosTitulos;
146
+
147
+ return basePendencias;
148
+ }, [aprovacoesPendentes, titulosPagar]);
149
+
150
+ const handleAprovacao = async (_id: string, tituloId?: string) => {
151
+ if (!tituloId) {
152
+ showToastHandler?.('error', 'Título inválido para aprovação');
153
+ return;
154
+ }
155
+
156
+ try {
157
+ await request({
158
+ url: `/finance/accounts-payable/installments/${tituloId}/approve`,
159
+ method: 'PATCH',
160
+ });
161
+
162
+ await refetch();
163
+ showToastHandler?.('success', 'Título aprovado com sucesso');
164
+ } catch {
165
+ showToastHandler?.('error', 'Não foi possível aprovar o título');
166
+ }
167
+ };
168
+
169
+ const handleReprovacao = async (
170
+ _id: string,
171
+ tituloId?: string,
172
+ reason?: string
173
+ ) => {
174
+ if (!tituloId) {
175
+ showToastHandler?.('error', 'Título inválido para reprovação');
176
+ return;
177
+ }
178
+
179
+ try {
180
+ await request({
181
+ url: `/finance/accounts-payable/installments/${tituloId}/reject`,
182
+ method: 'PATCH',
183
+ data: {
184
+ reason: reason || undefined,
185
+ },
186
+ });
187
+
188
+ await refetch();
189
+ showToastHandler?.('success', 'Título reprovado com sucesso');
190
+ } catch {
191
+ showToastHandler?.('error', 'Não foi possível reprovar o título');
192
+ }
124
193
  };
125
194
 
126
195
  const urgenciaConfig = {
@@ -265,12 +334,23 @@ export default function AprovacoesPage() {
265
334
  <AprovacaoDialog
266
335
  tipo="aprovar"
267
336
  t={t}
268
- onConfirm={() => handleAprovacao(aprovacao.id)}
337
+ onConfirm={() =>
338
+ void handleAprovacao(
339
+ aprovacao.id,
340
+ aprovacao.tituloId
341
+ )
342
+ }
269
343
  />
270
344
  <AprovacaoDialog
271
345
  tipo="reprovar"
272
346
  t={t}
273
- onConfirm={() => handleAprovacao(aprovacao.id)}
347
+ onConfirm={(comment) =>
348
+ void handleReprovacao(
349
+ aprovacao.id,
350
+ aprovacao.tituloId,
351
+ comment
352
+ )
353
+ }
274
354
  />
275
355
  </div>
276
356
  </TableCell>