@hed-hog/finance 0.0.363 → 0.0.365

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.
@@ -186,6 +186,7 @@
186
186
  "select": "Select...",
187
187
  "cancel": "Cancel",
188
188
  "save": "Save",
189
+ "saveAndNew": "Save and new",
189
190
  "upload": {
190
191
  "label": "Invoice file (optional)",
191
192
  "upload": "Upload",
@@ -201,7 +202,6 @@
201
202
  },
202
203
  "draftStatus": "Draft saved {relativeLabel} • Last saved: {absoluteLabel}",
203
204
  "validation": {
204
- "documentRequired": "Document is required",
205
205
  "supplierRequired": "Supplier is required",
206
206
  "dueDateRequired": "Due date is required",
207
207
  "amountGreaterThanZero": "Amount must be greater than zero",
@@ -214,13 +214,32 @@
214
214
  "installmentsCountMismatch": "Installments count does not match detailed schedule",
215
215
  "installmentsSumMismatch": "Installments sum must match total amount",
216
216
  "installmentRequired": "Installment is required",
217
- "recurrenceEndOrCount": "Provide an end date or number of repetitions"
217
+ "recurrenceEndOrCount": "Provide an end date or number of repetitions",
218
+ "paymentDateRequired": "Payment date is required",
219
+ "bankAccountRequired": "Bank account is required",
220
+ "paidAmountInvalid": "Paid amount must be greater than zero and at most the total amount",
221
+ "installmentPaymentDateRequired": "Provide the payment date for installments marked as paid"
218
222
  },
219
223
  "titleType": {
220
- "label": "Entry type",
224
+ "label": "Payment terms",
225
+ "cash": "Single payment",
221
226
  "installment": "Installments",
222
227
  "recurring": "Recurring"
223
228
  },
229
+ "paidToggle": {
230
+ "label": "Already paid?",
231
+ "hint": "The settlement is recorded automatically on save."
232
+ },
233
+ "payment": {
234
+ "dateLabel": "Payment date",
235
+ "bankAccountLabel": "Bank account",
236
+ "bankAccountPlaceholder": "Select an account",
237
+ "paidAmountLabel": "Amount paid",
238
+ "interestLabel": "Interest",
239
+ "penaltyLabel": "Fine",
240
+ "discountLabel": "Discount",
241
+ "installmentsHint": "Mark the paid installments in the Payment terms section."
242
+ },
224
243
  "recurrenceEditor": {
225
244
  "title": "Recurrence",
226
245
  "description": "Configure the title recurrence frequency",
@@ -245,15 +264,15 @@
245
264
  "descriptionPlaceholder": "Title description..."
246
265
  },
247
266
  "fields": {
248
- "document": "Document",
267
+ "document": "Document number",
249
268
  "supplier": "Supplier",
250
- "competency": "Competency",
251
- "dueDate": "Due Date",
252
- "totalValue": "Total Value",
253
- "totalValueRecurring": "Amount per Period",
269
+ "competency": "Competency month",
270
+ "dueDate": "Due date",
271
+ "totalValue": "Total amount",
272
+ "totalValueRecurring": "Amount per period",
254
273
  "category": "Category",
255
- "costCenter": "Cost Center",
256
- "paymentMethod": "Payment Method",
274
+ "costCenter": "Cost center",
275
+ "paymentMethod": "Payment method",
257
276
  "description": "Description"
258
277
  },
259
278
  "paymentMethods": {
@@ -309,7 +328,7 @@
309
328
  "sections": {
310
329
  "main": {
311
330
  "title": "Main data",
312
- "description": "Provide document, supplier, dates, and the total title amount."
331
+ "description": "Provide supplier, document, due date, and the title amount."
313
332
  },
314
333
  "installments": {
315
334
  "title": "Installments",
@@ -319,6 +338,19 @@
319
338
  "title": "Recurrence",
320
339
  "description": "Configure the title repetition frequency."
321
340
  },
341
+ "paymentCondition": {
342
+ "title": "Payment terms",
343
+ "description": "Choose single payment, installments, or recurring.",
344
+ "summary": {
345
+ "cash": "Single payment • due {date}",
346
+ "installments": "{count} installments • first due {date}",
347
+ "recurring": "Recurring • {frequency}"
348
+ }
349
+ },
350
+ "details": {
351
+ "title": "Classification and details",
352
+ "description": "Competency, category, cost center, and notes."
353
+ },
322
354
  "classification": {
323
355
  "title": "Financial classification",
324
356
  "description": "Assign category, cost center, and payment method to organize the operation."
@@ -387,12 +419,14 @@
387
419
  },
388
420
  "installmentsEditor": {
389
421
  "title": "Installments",
390
- "countLabel": "Installments Count",
422
+ "countLabel": "Number of installments",
391
423
  "recalculate": "Recalculate automatically",
392
424
  "autoRedistributeLabel": "Automatically redistribute remaining amount when editing installment",
393
425
  "autoRedistributeHint": "Redistribution occurs after typing stops and on field blur.",
394
426
  "dueDateLabel": "Due date",
395
427
  "amountLabel": "Amount",
428
+ "paidLabel": "Paid",
429
+ "paymentDateLabel": "Payment date",
396
430
  "totalPrefix": "Installments total: {total}",
397
431
  "adjustmentNeeded": "(adjustment needed)"
398
432
  },
@@ -665,6 +699,7 @@
665
699
  "select": "Select...",
666
700
  "cancel": "Cancel",
667
701
  "save": "Save",
702
+ "saveAndNew": "Save and new",
668
703
  "upload": {
669
704
  "label": "Invoice file (optional)",
670
705
  "upload": "Upload",
@@ -680,7 +715,6 @@
680
715
  },
681
716
  "draftStatus": "Draft saved {relativeLabel} • Last saved: {absoluteLabel}",
682
717
  "validation": {
683
- "documentRequired": "Document is required",
684
718
  "clientRequired": "Client is required",
685
719
  "dueDateRequired": "Due date is required",
686
720
  "amountGreaterThanZero": "Amount must be greater than zero",
@@ -692,13 +726,32 @@
692
726
  "installmentsRequired": "Provide at least one installment",
693
727
  "installmentsCountMismatch": "Installments count does not match detailed schedule",
694
728
  "installmentsSumMismatch": "Installments sum must match total amount",
695
- "recurrenceEndOrCount": "Provide an end date or number of repetitions"
729
+ "recurrenceEndOrCount": "Provide an end date or number of repetitions",
730
+ "paymentDateRequired": "Receipt date is required",
731
+ "bankAccountRequired": "Bank account is required",
732
+ "paidAmountInvalid": "Received amount must be greater than zero and at most the total amount",
733
+ "installmentPaymentDateRequired": "Provide the receipt date for installments marked as received"
696
734
  },
697
735
  "titleType": {
698
- "label": "Entry type",
736
+ "label": "Receipt terms",
737
+ "cash": "Single payment",
699
738
  "installment": "Installments",
700
739
  "recurring": "Recurring"
701
740
  },
741
+ "paidToggle": {
742
+ "label": "Already received?",
743
+ "hint": "The receipt is recorded automatically on save."
744
+ },
745
+ "payment": {
746
+ "dateLabel": "Receipt date",
747
+ "bankAccountLabel": "Bank account",
748
+ "bankAccountPlaceholder": "Select an account",
749
+ "paidAmountLabel": "Amount received",
750
+ "interestLabel": "Interest",
751
+ "penaltyLabel": "Fine",
752
+ "discountLabel": "Discount",
753
+ "installmentsHint": "Mark the received installments in the Receipt terms section."
754
+ },
702
755
  "recurrenceEditor": {
703
756
  "title": "Recurrence",
704
757
  "description": "Configure the title recurrence frequency",
@@ -723,15 +776,15 @@
723
776
  "descriptionPlaceholder": "Title description..."
724
777
  },
725
778
  "fields": {
726
- "document": "Document",
779
+ "document": "Document number",
727
780
  "client": "Client",
728
- "competency": "Competency",
729
- "dueDate": "Due Date",
730
- "totalValue": "Total Value",
731
- "totalValueRecurring": "Amount per Period",
781
+ "competency": "Competency month",
782
+ "dueDate": "Due date",
783
+ "totalValue": "Total amount",
784
+ "totalValueRecurring": "Amount per period",
732
785
  "category": "Category",
733
- "costCenter": "Cost Center",
734
- "channel": "Receiving Channel",
786
+ "costCenter": "Cost center",
787
+ "channel": "Receipt method",
735
788
  "description": "Description"
736
789
  },
737
790
  "channels": {
@@ -785,7 +838,7 @@
785
838
  "sections": {
786
839
  "main": {
787
840
  "title": "Main data",
788
- "description": "Provide document, client, dates, and the total title amount."
841
+ "description": "Provide client, document, due date, and the title amount."
789
842
  },
790
843
  "installments": {
791
844
  "title": "Installments",
@@ -795,6 +848,19 @@
795
848
  "title": "Recurrence",
796
849
  "description": "Configure the title repetition frequency."
797
850
  },
851
+ "paymentCondition": {
852
+ "title": "Receipt terms",
853
+ "description": "Choose single payment, installments, or recurring.",
854
+ "summary": {
855
+ "cash": "Single payment • due {date}",
856
+ "installments": "{count} installments • first due {date}",
857
+ "recurring": "Recurring • {frequency}"
858
+ }
859
+ },
860
+ "details": {
861
+ "title": "Classification and details",
862
+ "description": "Competency, category, cost center, and notes."
863
+ },
798
864
  "classification": {
799
865
  "title": "Financial classification",
800
866
  "description": "Assign category, cost center, and receiving channel to organize the operation."
@@ -829,12 +895,14 @@
829
895
  },
830
896
  "installmentsEditor": {
831
897
  "title": "Installments",
832
- "countLabel": "Installments Count",
898
+ "countLabel": "Number of installments",
833
899
  "recalculate": "Recalculate automatically",
834
900
  "autoRedistributeLabel": "Automatically redistribute remaining amount when editing installment",
835
901
  "autoRedistributeHint": "Redistribution occurs after typing stops and on field blur.",
836
902
  "dueDateLabel": "Due date",
837
903
  "amountLabel": "Amount",
904
+ "paidLabel": "Received",
905
+ "paymentDateLabel": "Receipt date",
838
906
  "totalPrefix": "Installments total: {total}",
839
907
  "adjustmentNeeded": "(adjustment needed)"
840
908
  },
@@ -171,6 +171,7 @@
171
171
  "select": "Selecione...",
172
172
  "cancel": "Cancelar",
173
173
  "save": "Salvar",
174
+ "saveAndNew": "Salvar e novo",
174
175
  "upload": {
175
176
  "label": "Arquivo da fatura (opcional)",
176
177
  "upload": "Upload",
@@ -186,7 +187,6 @@
186
187
  },
187
188
  "draftStatus": "Rascunho salvo {relativeLabel} • Último salvamento: {absoluteLabel}",
188
189
  "validation": {
189
- "documentRequired": "Documento é obrigatório",
190
190
  "supplierRequired": "Fornecedor é obrigatório",
191
191
  "dueDateRequired": "Vencimento é obrigatório",
192
192
  "amountGreaterThanZero": "Valor deve ser maior que zero",
@@ -199,13 +199,32 @@
199
199
  "installmentsCountMismatch": "Quantidade de parcelas não confere com o detalhamento",
200
200
  "installmentsSumMismatch": "A soma das parcelas deve ser igual ao valor total",
201
201
  "installmentRequired": "Parcela obrigatória",
202
- "recurrenceEndOrCount": "Informe a data de término ou o número de repetições"
202
+ "recurrenceEndOrCount": "Informe a data de término ou o número de repetições",
203
+ "paymentDateRequired": "Informe a data do pagamento",
204
+ "bankAccountRequired": "Informe a conta bancária",
205
+ "paidAmountInvalid": "O valor pago deve ser maior que zero e no máximo o valor total",
206
+ "installmentPaymentDateRequired": "Informe a data de pagamento das parcelas marcadas como pagas"
203
207
  },
204
208
  "titleType": {
205
- "label": "Tipo de lançamento",
209
+ "label": "Condição de pagamento",
210
+ "cash": "À vista",
206
211
  "installment": "Parcelado",
207
212
  "recurring": "Recorrente"
208
213
  },
214
+ "paidToggle": {
215
+ "label": "Já foi pago?",
216
+ "hint": "A baixa será registrada automaticamente ao salvar."
217
+ },
218
+ "payment": {
219
+ "dateLabel": "Data do pagamento",
220
+ "bankAccountLabel": "Conta bancária",
221
+ "bankAccountPlaceholder": "Selecione a conta",
222
+ "paidAmountLabel": "Valor pago",
223
+ "interestLabel": "Juros",
224
+ "penaltyLabel": "Multa",
225
+ "discountLabel": "Desconto",
226
+ "installmentsHint": "Marque as parcelas pagas na seção Condição de pagamento."
227
+ },
209
228
  "recurrenceEditor": {
210
229
  "title": "Recorrência",
211
230
  "description": "Configure a periodicidade do título",
@@ -230,15 +249,15 @@
230
249
  "descriptionPlaceholder": "Descrição do título..."
231
250
  },
232
251
  "fields": {
233
- "document": "Documento",
252
+ "document": "Nº do documento",
234
253
  "supplier": "Fornecedor",
235
- "competency": "Competência",
236
- "dueDate": "Vencimento",
237
- "totalValue": "Valor Total",
238
- "totalValueRecurring": "Valor por Período",
254
+ "competency": "Mês de competência",
255
+ "dueDate": "Data de vencimento",
256
+ "totalValue": "Valor total",
257
+ "totalValueRecurring": "Valor por período",
239
258
  "category": "Categoria",
240
- "costCenter": "Centro de Custo",
241
- "paymentMethod": "Forma de Pagamento",
259
+ "costCenter": "Centro de custo",
260
+ "paymentMethod": "Forma de pagamento",
242
261
  "description": "Descrição"
243
262
  },
244
263
  "paymentMethods": {
@@ -294,7 +313,7 @@
294
313
  "sections": {
295
314
  "main": {
296
315
  "title": "Dados principais",
297
- "description": "Informe documento, fornecedor, datas e valor total do título."
316
+ "description": "Informe fornecedor, documento, vencimento e valor do título."
298
317
  },
299
318
  "installments": {
300
319
  "title": "Parcelas",
@@ -304,6 +323,19 @@
304
323
  "title": "Recorrência",
305
324
  "description": "Configure a frequência de repetição do título."
306
325
  },
326
+ "paymentCondition": {
327
+ "title": "Condição de pagamento",
328
+ "description": "Defina se o lançamento é à vista, parcelado ou recorrente.",
329
+ "summary": {
330
+ "cash": "À vista • vence em {date}",
331
+ "installments": "{count}x • 1ª parcela em {date}",
332
+ "recurring": "Recorrente • {frequency}"
333
+ }
334
+ },
335
+ "details": {
336
+ "title": "Classificação e detalhes",
337
+ "description": "Competência, categoria, centro de custo e observações."
338
+ },
307
339
  "classification": {
308
340
  "title": "Classificação financeira",
309
341
  "description": "Associe categoria, centro de custo e forma de pagamento para organizar a operação."
@@ -372,12 +404,14 @@
372
404
  },
373
405
  "installmentsEditor": {
374
406
  "title": "Parcelas",
375
- "countLabel": "Quantidade de Parcelas",
407
+ "countLabel": "Número de parcelas",
376
408
  "recalculate": "Recalcular automaticamente",
377
409
  "autoRedistributeLabel": "Redistribuir automaticamente o restante ao editar parcela",
378
410
  "autoRedistributeHint": "A redistribuição ocorre ao parar de digitar e ao sair do campo.",
379
411
  "dueDateLabel": "Vencimento",
380
412
  "amountLabel": "Valor",
413
+ "paidLabel": "Paga",
414
+ "paymentDateLabel": "Data do pagamento",
381
415
  "totalPrefix": "Soma das parcelas: {total}",
382
416
  "adjustmentNeeded": "(ajuste necessário)"
383
417
  },
@@ -650,6 +684,7 @@
650
684
  "select": "Selecione...",
651
685
  "cancel": "Cancelar",
652
686
  "save": "Salvar",
687
+ "saveAndNew": "Salvar e novo",
653
688
  "upload": {
654
689
  "label": "Arquivo da fatura (opcional)",
655
690
  "upload": "Upload",
@@ -665,7 +700,6 @@
665
700
  },
666
701
  "draftStatus": "Rascunho salvo {relativeLabel} • Último salvamento: {absoluteLabel}",
667
702
  "validation": {
668
- "documentRequired": "Documento é obrigatório",
669
703
  "clientRequired": "Cliente é obrigatório",
670
704
  "dueDateRequired": "Vencimento é obrigatório",
671
705
  "amountGreaterThanZero": "Valor deve ser maior que zero",
@@ -677,13 +711,32 @@
677
711
  "installmentsRequired": "Informe ao menos uma parcela",
678
712
  "installmentsCountMismatch": "Quantidade de parcelas não confere com o detalhamento",
679
713
  "installmentsSumMismatch": "A soma das parcelas deve ser igual ao valor total",
680
- "recurrenceEndOrCount": "Informe a data de término ou o número de repetições"
714
+ "recurrenceEndOrCount": "Informe a data de término ou o número de repetições",
715
+ "paymentDateRequired": "Informe a data do recebimento",
716
+ "bankAccountRequired": "Informe a conta bancária",
717
+ "paidAmountInvalid": "O valor recebido deve ser maior que zero e no máximo o valor total",
718
+ "installmentPaymentDateRequired": "Informe a data de recebimento das parcelas marcadas como recebidas"
681
719
  },
682
720
  "titleType": {
683
- "label": "Tipo de lançamento",
721
+ "label": "Condição de recebimento",
722
+ "cash": "À vista",
684
723
  "installment": "Parcelado",
685
724
  "recurring": "Recorrente"
686
725
  },
726
+ "paidToggle": {
727
+ "label": "Já foi recebido?",
728
+ "hint": "O recebimento será registrado automaticamente ao salvar."
729
+ },
730
+ "payment": {
731
+ "dateLabel": "Data do recebimento",
732
+ "bankAccountLabel": "Conta bancária",
733
+ "bankAccountPlaceholder": "Selecione a conta",
734
+ "paidAmountLabel": "Valor recebido",
735
+ "interestLabel": "Juros",
736
+ "penaltyLabel": "Multa",
737
+ "discountLabel": "Desconto",
738
+ "installmentsHint": "Marque as parcelas recebidas na seção Condição de recebimento."
739
+ },
687
740
  "recurrenceEditor": {
688
741
  "title": "Recorrência",
689
742
  "description": "Configure a periodicidade do título",
@@ -708,15 +761,15 @@
708
761
  "descriptionPlaceholder": "Descrição do título..."
709
762
  },
710
763
  "fields": {
711
- "document": "Documento",
764
+ "document": "Nº do documento",
712
765
  "client": "Cliente",
713
- "competency": "Competência",
714
- "dueDate": "Vencimento",
715
- "totalValue": "Valor Total",
716
- "totalValueRecurring": "Valor por Período",
766
+ "competency": "Mês de competência",
767
+ "dueDate": "Data de vencimento",
768
+ "totalValue": "Valor total",
769
+ "totalValueRecurring": "Valor por período",
717
770
  "category": "Categoria",
718
- "costCenter": "Centro de Custo",
719
- "channel": "Canal de Recebimento",
771
+ "costCenter": "Centro de custo",
772
+ "channel": "Forma de recebimento",
720
773
  "description": "Descrição"
721
774
  },
722
775
  "channels": {
@@ -770,7 +823,7 @@
770
823
  "sections": {
771
824
  "main": {
772
825
  "title": "Dados principais",
773
- "description": "Informe documento, cliente, datas e valor total do título."
826
+ "description": "Informe cliente, documento, vencimento e valor do título."
774
827
  },
775
828
  "installments": {
776
829
  "title": "Parcelas",
@@ -780,6 +833,19 @@
780
833
  "title": "Recorrência",
781
834
  "description": "Configure a frequência de repetição do título."
782
835
  },
836
+ "paymentCondition": {
837
+ "title": "Condição de recebimento",
838
+ "description": "Defina se o lançamento é à vista, parcelado ou recorrente.",
839
+ "summary": {
840
+ "cash": "À vista • vence em {date}",
841
+ "installments": "{count}x • 1ª parcela em {date}",
842
+ "recurring": "Recorrente • {frequency}"
843
+ }
844
+ },
845
+ "details": {
846
+ "title": "Classificação e detalhes",
847
+ "description": "Competência, categoria, centro de custo e observações."
848
+ },
783
849
  "classification": {
784
850
  "title": "Classificação financeira",
785
851
  "description": "Associe categoria, centro de custo e canal de recebimento para organizar a operação."
@@ -814,12 +880,14 @@
814
880
  },
815
881
  "installmentsEditor": {
816
882
  "title": "Parcelas",
817
- "countLabel": "Quantidade de Parcelas",
883
+ "countLabel": "Número de parcelas",
818
884
  "recalculate": "Recalcular automaticamente",
819
885
  "autoRedistributeLabel": "Redistribuir automaticamente o restante ao editar parcela",
820
886
  "autoRedistributeHint": "A redistribuição ocorre ao parar de digitar e ao sair do campo.",
821
887
  "dueDateLabel": "Vencimento",
822
888
  "amountLabel": "Valor",
889
+ "paidLabel": "Recebida",
890
+ "paymentDateLabel": "Data do recebimento",
823
891
  "totalPrefix": "Soma das parcelas: {total}",
824
892
  "adjustmentNeeded": "(ajuste necessário)"
825
893
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hed-hog/finance",
3
- "version": "0.0.363",
3
+ "version": "0.0.365",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "dependencies": {
@@ -12,11 +12,11 @@
12
12
  "@hed-hog/api": "0.0.8",
13
13
  "@hed-hog/api-pagination": "0.0.7",
14
14
  "@hed-hog/api-locale": "0.0.14",
15
- "@hed-hog/crm": "0.0.362",
16
15
  "@hed-hog/api-prisma": "0.0.6",
16
+ "@hed-hog/crm": "0.0.365",
17
+ "@hed-hog/tag": "0.0.365",
17
18
  "@hed-hog/api-types": "0.0.1",
18
- "@hed-hog/core": "0.0.362",
19
- "@hed-hog/tag": "0.0.362"
19
+ "@hed-hog/core": "0.0.365"
20
20
  },
21
21
  "exports": {
22
22
  ".": {
@@ -2,10 +2,10 @@ import { getLocaleText } from '@hed-hog/api-locale';
2
2
  import { Type } from 'class-transformer';
3
3
  import {
4
4
  IsArray,
5
+ IsBoolean,
5
6
  IsDateString,
6
7
  IsIn,
7
8
  IsInt,
8
- IsNotEmpty,
9
9
  IsNumber,
10
10
  IsOptional,
11
11
  IsString,
@@ -63,16 +63,42 @@ export class CreateFinancialInstallmentDto {
63
63
  getLocaleText('validation.installmentAmountMin', args.value),
64
64
  })
65
65
  amount: number;
66
+
67
+ @IsOptional()
68
+ @IsBoolean()
69
+ paid?: boolean;
70
+
71
+ @IsOptional()
72
+ @IsDateString()
73
+ paid_at?: string;
74
+
75
+ @IsOptional()
76
+ @IsNumber()
77
+ @Min(0.01)
78
+ paid_amount?: number;
79
+
80
+ @IsOptional()
81
+ @IsNumber()
82
+ @Min(0)
83
+ discount?: number;
84
+
85
+ @IsOptional()
86
+ @IsNumber()
87
+ @Min(0)
88
+ interest?: number;
89
+
90
+ @IsOptional()
91
+ @IsNumber()
92
+ @Min(0)
93
+ penalty?: number;
66
94
  }
67
95
 
68
96
  export class CreateFinancialTitleDto {
97
+ @IsOptional()
69
98
  @IsString({
70
99
  message: (args) => getLocaleText('validation.documentMustBeString', args.value),
71
100
  })
72
- @IsNotEmpty({
73
- message: (args) => getLocaleText('validation.documentRequired', args.value),
74
- })
75
- document_number: string;
101
+ document_number?: string;
76
102
 
77
103
  @IsInt({
78
104
  message: (args) => getLocaleText('validation.personIdMustBeNumber', args.value),
@@ -142,6 +168,11 @@ export class CreateFinancialTitleDto {
142
168
  })
143
169
  payment_channel?: string;
144
170
 
171
+ @IsOptional()
172
+ @Type(() => Number)
173
+ @IsInt()
174
+ bank_account_id?: number;
175
+
145
176
  @IsOptional()
146
177
  @IsString({
147
178
  message: (args) =>