@fiado/type-kit 3.631.0 → 3.633.0

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 (57) hide show
  1. package/_test_/unit/retailIntegration/retailSaleContracts.test.ts +15 -3
  2. package/_test_/unit/retailPromotions/salePromotionPaymentCheck.test.ts +14 -0
  3. package/_test_/unit/retailWizard/accessorySaleRequests.test.ts +2 -2
  4. package/_test_/unit/retailWizard/salePayments.test.ts +140 -0
  5. package/bin/retailIntegration/models/RetailSystemSale.d.ts +1 -1
  6. package/bin/retailIntegration/models/RetailSystemSale.js +4 -4
  7. package/bin/retailIntegration/validators/saleValidators.d.ts +1 -1
  8. package/bin/retailIntegration/validators/saleValidators.js +3 -2
  9. package/bin/retailPromotions/dtos/requests/CheckSalePromotionPaymentRequest.d.ts +3 -1
  10. package/bin/retailPromotions/dtos/requests/CheckSalePromotionPaymentRequest.js +10 -0
  11. package/bin/retailWizard/constants/retailWizardValidation.d.ts +5 -0
  12. package/bin/retailWizard/constants/retailWizardValidation.js +6 -1
  13. package/bin/retailWizard/dtos/Sale.d.ts +5 -0
  14. package/bin/retailWizard/dtos/SalePayment.d.ts +11 -0
  15. package/bin/retailWizard/dtos/SalePayment.js +69 -0
  16. package/bin/retailWizard/dtos/SalePaymentDetail.d.ts +1 -0
  17. package/bin/retailWizard/dtos/SalePaymentDetail.js +1 -0
  18. package/bin/retailWizard/dtos/SellerPendingRefundItem.d.ts +6 -1
  19. package/bin/retailWizard/dtos/WizardPayment.d.ts +5 -0
  20. package/bin/retailWizard/dtos/WizardPayment.js +7 -0
  21. package/bin/retailWizard/dtos/requests/CreateAccessorySaleRequest.d.ts +8 -3
  22. package/bin/retailWizard/dtos/requests/CreateAccessorySaleRequest.js +10 -2
  23. package/bin/retailWizard/dtos/requests/DownPaymentRequest.d.ts +7 -2
  24. package/bin/retailWizard/dtos/requests/DownPaymentRequest.js +9 -1
  25. package/bin/retailWizard/dtos/requests/RegisterPaymentRequest.d.ts +6 -1
  26. package/bin/retailWizard/dtos/requests/RegisterPaymentRequest.js +8 -0
  27. package/bin/retailWizard/events/RetailPromotionInboundMessage.d.ts +3 -1
  28. package/bin/retailWizard/events/RetailPromotionInboundMessage.js +6 -0
  29. package/bin/retailWizard/index.d.ts +5 -0
  30. package/bin/retailWizard/index.js +5 -0
  31. package/bin/retailWizard/validators/IsSalePaymentList.d.ts +2 -0
  32. package/bin/retailWizard/validators/IsSalePaymentList.js +22 -0
  33. package/bin/retailWizard/validators/OnlyForPaymentMethodConstraint.d.ts +6 -0
  34. package/bin/retailWizard/validators/OnlyForPaymentMethodConstraint.js +25 -0
  35. package/bin/retailWizard/validators/PaymentsHaveSingleUseMethodsConstraint.d.ts +6 -0
  36. package/bin/retailWizard/validators/PaymentsHaveSingleUseMethodsConstraint.js +27 -0
  37. package/bin/retailWizard/validators/PaymentsMatchAmountCentsConstraint.d.ts +6 -0
  38. package/bin/retailWizard/validators/PaymentsMatchAmountCentsConstraint.js +29 -0
  39. package/package.json +1 -1
  40. package/src/retailIntegration/models/RetailSystemSale.ts +4 -4
  41. package/src/retailIntegration/validators/saleValidators.ts +3 -2
  42. package/src/retailPromotions/dtos/requests/CheckSalePromotionPaymentRequest.ts +12 -2
  43. package/src/retailWizard/constants/retailWizardValidation.ts +8 -0
  44. package/src/retailWizard/dtos/Sale.ts +5 -0
  45. package/src/retailWizard/dtos/SalePayment.ts +55 -0
  46. package/src/retailWizard/dtos/SalePaymentDetail.ts +1 -0
  47. package/src/retailWizard/dtos/SellerPendingRefundItem.ts +6 -1
  48. package/src/retailWizard/dtos/WizardPayment.ts +10 -0
  49. package/src/retailWizard/dtos/requests/CreateAccessorySaleRequest.ts +17 -5
  50. package/src/retailWizard/dtos/requests/DownPaymentRequest.ts +14 -3
  51. package/src/retailWizard/dtos/requests/RegisterPaymentRequest.ts +13 -2
  52. package/src/retailWizard/events/RetailPromotionInboundMessage.ts +7 -1
  53. package/src/retailWizard/index.ts +5 -0
  54. package/src/retailWizard/validators/IsSalePaymentList.ts +20 -0
  55. package/src/retailWizard/validators/OnlyForPaymentMethodConstraint.ts +18 -0
  56. package/src/retailWizard/validators/PaymentsHaveSingleUseMethodsConstraint.ts +20 -0
  57. package/src/retailWizard/validators/PaymentsMatchAmountCentsConstraint.ts +21 -0
@@ -174,11 +174,17 @@ export class RetailPromotionInboundMessage {
174
174
  @IsEnum(SaleTypeEnum)
175
175
  saleType?: SaleTypeEnum;
176
176
 
177
- /** Medio de cobro, solo en contado. */
177
+ /** @deprecated Usa `paymentMethods`. Medio de cobro, solo en contado. */
178
178
  @IsOptional()
179
179
  @IsEnum(SalePaymentMethodEnum)
180
180
  paymentMethod?: SalePaymentMethodEnum | null;
181
181
 
182
+ /** Medios con que se cobró, uno por pago; solo en contado. */
183
+ @IsOptional()
184
+ @IsArray()
185
+ @IsEnum(SalePaymentMethodEnum, { each: true })
186
+ paymentMethods?: SalePaymentMethodEnum[] | null;
187
+
182
188
  /** Financiera externa, solo en `EXTERNAL_REFERRAL`. */
183
189
  @IsOptional()
184
190
  @IsEnum(ExternalProviderEnum)
@@ -45,6 +45,11 @@ export * from './dtos/WizardProduct';
45
45
  export * from './dtos/WizardWelcome';
46
46
  export * from './dtos/WizardCreditPromotionBonus';
47
47
  export * from './dtos/SalePaymentDetail';
48
+ export * from './dtos/SalePayment';
49
+ export * from './validators/IsSalePaymentList';
50
+ export * from './validators/OnlyForPaymentMethodConstraint';
51
+ export * from './validators/PaymentsHaveSingleUseMethodsConstraint';
52
+ export * from './validators/PaymentsMatchAmountCentsConstraint';
48
53
  export * from './dtos/ProspectNewCustomer';
49
54
  export * from './dtos/WizardBeneficiary';
50
55
  export * from './dtos/WizardLoan';
@@ -0,0 +1,20 @@
1
+ import { Type } from 'class-transformer';
2
+ import { ArrayMaxSize, ArrayMinSize, IsArray, Validate, ValidateNested } from 'class-validator';
3
+ import { MAX_SALE_PAYMENTS } from '../constants/retailWizardValidation';
4
+ import { SalePayment } from '../dtos/SalePayment';
5
+ import { PaymentsHaveSingleUseMethodsConstraint } from './PaymentsHaveSingleUseMethodsConstraint';
6
+ import { PaymentsMatchAmountCentsConstraint } from './PaymentsMatchAmountCentsConstraint';
7
+
8
+ /** Reglas de `payments`: 1 a 3 pagos válidos, efectivo y SPEI una vez, y la suma igual a `amountCents`. */
9
+ export function IsSalePaymentList(): PropertyDecorator {
10
+ const decorators: PropertyDecorator[] = [
11
+ IsArray(),
12
+ ArrayMinSize(1),
13
+ ArrayMaxSize(MAX_SALE_PAYMENTS),
14
+ ValidateNested({ each: true }),
15
+ Type(() => SalePayment),
16
+ Validate(PaymentsHaveSingleUseMethodsConstraint),
17
+ Validate(PaymentsMatchAmountCentsConstraint),
18
+ ];
19
+ return (target, propertyKey) => decorators.forEach((decorate) => decorate(target, propertyKey));
20
+ }
@@ -0,0 +1,18 @@
1
+ import {
2
+ ValidatorConstraint,
3
+ type ValidationArguments,
4
+ type ValidatorConstraintInterface,
5
+ } from 'class-validator';
6
+
7
+ /** Un campo de comprobante con valor solo se acepta en el medio de pago al que pertenece. */
8
+ @ValidatorConstraint({ name: 'onlyForPaymentMethod', async: false })
9
+ export class OnlyForPaymentMethodConstraint implements ValidatorConstraintInterface {
10
+ validate(value: unknown, args: ValidationArguments): boolean {
11
+ if (value == null) return true;
12
+ return (args.object as { method?: unknown }).method === args.constraints[0];
13
+ }
14
+
15
+ defaultMessage(args: ValidationArguments): string {
16
+ return `${args.property} solo aplica a pagos ${args.constraints[0]}`;
17
+ }
18
+ }
@@ -0,0 +1,20 @@
1
+ import {
2
+ ValidatorConstraint,
3
+ type ValidationArguments,
4
+ type ValidatorConstraintInterface,
5
+ } from 'class-validator';
6
+ import { SINGLE_USE_PAYMENT_METHODS } from '../constants/retailWizardValidation';
7
+
8
+ /** Efectivo y SPEI aparecen a lo más una vez en `payments`; la tarjeta se puede repetir. */
9
+ @ValidatorConstraint({ name: 'paymentsHaveSingleUseMethods', async: false })
10
+ export class PaymentsHaveSingleUseMethodsConstraint implements ValidatorConstraintInterface {
11
+ validate(value: unknown, _args: ValidationArguments): boolean {
12
+ if (!Array.isArray(value)) return true;
13
+ const methods = value.map((p) => (p as { method?: unknown } | null)?.method);
14
+ return SINGLE_USE_PAYMENT_METHODS.every((m) => methods.filter((x) => x === m).length <= 1);
15
+ }
16
+
17
+ defaultMessage(): string {
18
+ return `payments admite a lo más un pago de cada medio ${SINGLE_USE_PAYMENT_METHODS.join(' y ')}`;
19
+ }
20
+ }
@@ -0,0 +1,21 @@
1
+ import {
2
+ ValidatorConstraint,
3
+ type ValidationArguments,
4
+ type ValidatorConstraintInterface,
5
+ } from 'class-validator';
6
+
7
+ /** La suma de `payments[].amountCents` es el `amountCents` del cobro. */
8
+ @ValidatorConstraint({ name: 'paymentsMatchAmountCents', async: false })
9
+ export class PaymentsMatchAmountCentsConstraint implements ValidatorConstraintInterface {
10
+ validate(value: unknown, args: ValidationArguments): boolean {
11
+ const total = (args.object as { amountCents?: unknown }).amountCents;
12
+ if (!Array.isArray(value) || !Number.isInteger(total)) return true;
13
+ const amounts = value.map((p) => (p as { amountCents?: unknown } | null)?.amountCents);
14
+ if (!amounts.every((a) => Number.isInteger(a))) return true;
15
+ return (amounts as number[]).reduce((sum, a) => sum + a, 0) === total;
16
+ }
17
+
18
+ defaultMessage(): string {
19
+ return 'la suma de payments[].amountCents debe ser amountCents';
20
+ }
21
+ }