@fiado/type-kit 3.630.0 → 3.632.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 (68) hide show
  1. package/_test_/unit/retailIntegration/retailSaleContracts.test.ts +15 -3
  2. package/_test_/unit/retailWizard/accessorySaleRequests.test.ts +2 -2
  3. package/_test_/unit/retailWizard/salePayments.test.ts +140 -0
  4. package/bin/onboarding/dtos/responses/OnboardingStepsResponse.d.ts +13 -0
  5. package/bin/onboarding/dtos/responses/OnboardingStepsResponse.js +5 -1
  6. package/bin/onboarding/enums/OnboardingAccountMessageKeyV2Enum.d.ts +28 -0
  7. package/bin/onboarding/enums/OnboardingAccountMessageKeyV2Enum.js +32 -0
  8. package/bin/onboarding/enums/OnboardingAccountReasonV2Enum.d.ts +20 -0
  9. package/bin/onboarding/enums/OnboardingAccountReasonV2Enum.js +24 -0
  10. package/bin/onboarding/enums/OnboardingAccountStatusV2Enum.d.ts +15 -0
  11. package/bin/onboarding/enums/OnboardingAccountStatusV2Enum.js +19 -0
  12. package/bin/onboarding/index.d.ts +3 -0
  13. package/bin/onboarding/index.js +3 -0
  14. package/bin/retailIntegration/models/RetailSystemSale.d.ts +1 -1
  15. package/bin/retailIntegration/models/RetailSystemSale.js +4 -4
  16. package/bin/retailIntegration/validators/saleValidators.d.ts +1 -1
  17. package/bin/retailIntegration/validators/saleValidators.js +3 -2
  18. package/bin/retailWizard/constants/retailWizardValidation.d.ts +5 -0
  19. package/bin/retailWizard/constants/retailWizardValidation.js +6 -1
  20. package/bin/retailWizard/dtos/Sale.d.ts +5 -0
  21. package/bin/retailWizard/dtos/SalePayment.d.ts +11 -0
  22. package/bin/retailWizard/dtos/SalePayment.js +69 -0
  23. package/bin/retailWizard/dtos/SalePaymentDetail.d.ts +1 -0
  24. package/bin/retailWizard/dtos/SalePaymentDetail.js +1 -0
  25. package/bin/retailWizard/dtos/SellerPendingRefundItem.d.ts +6 -1
  26. package/bin/retailWizard/dtos/WizardPayment.d.ts +5 -0
  27. package/bin/retailWizard/dtos/WizardPayment.js +7 -0
  28. package/bin/retailWizard/dtos/requests/CreateAccessorySaleRequest.d.ts +8 -3
  29. package/bin/retailWizard/dtos/requests/CreateAccessorySaleRequest.js +10 -2
  30. package/bin/retailWizard/dtos/requests/DownPaymentRequest.d.ts +7 -2
  31. package/bin/retailWizard/dtos/requests/DownPaymentRequest.js +9 -1
  32. package/bin/retailWizard/dtos/requests/RegisterPaymentRequest.d.ts +6 -1
  33. package/bin/retailWizard/dtos/requests/RegisterPaymentRequest.js +8 -0
  34. package/bin/retailWizard/events/RetailPromotionInboundMessage.d.ts +3 -1
  35. package/bin/retailWizard/events/RetailPromotionInboundMessage.js +6 -0
  36. package/bin/retailWizard/index.d.ts +5 -0
  37. package/bin/retailWizard/index.js +5 -0
  38. package/bin/retailWizard/validators/IsSalePaymentList.d.ts +2 -0
  39. package/bin/retailWizard/validators/IsSalePaymentList.js +22 -0
  40. package/bin/retailWizard/validators/OnlyForPaymentMethodConstraint.d.ts +6 -0
  41. package/bin/retailWizard/validators/OnlyForPaymentMethodConstraint.js +25 -0
  42. package/bin/retailWizard/validators/PaymentsHaveSingleUseMethodsConstraint.d.ts +6 -0
  43. package/bin/retailWizard/validators/PaymentsHaveSingleUseMethodsConstraint.js +27 -0
  44. package/bin/retailWizard/validators/PaymentsMatchAmountCentsConstraint.d.ts +6 -0
  45. package/bin/retailWizard/validators/PaymentsMatchAmountCentsConstraint.js +29 -0
  46. package/package.json +1 -1
  47. package/src/onboarding/dtos/responses/OnboardingStepsResponse.ts +15 -0
  48. package/src/onboarding/enums/OnboardingAccountMessageKeyV2Enum.ts +28 -0
  49. package/src/onboarding/enums/OnboardingAccountReasonV2Enum.ts +20 -0
  50. package/src/onboarding/enums/OnboardingAccountStatusV2Enum.ts +15 -0
  51. package/src/onboarding/index.ts +3 -0
  52. package/src/retailIntegration/models/RetailSystemSale.ts +4 -4
  53. package/src/retailIntegration/validators/saleValidators.ts +3 -2
  54. package/src/retailWizard/constants/retailWizardValidation.ts +8 -0
  55. package/src/retailWizard/dtos/Sale.ts +5 -0
  56. package/src/retailWizard/dtos/SalePayment.ts +55 -0
  57. package/src/retailWizard/dtos/SalePaymentDetail.ts +1 -0
  58. package/src/retailWizard/dtos/SellerPendingRefundItem.ts +6 -1
  59. package/src/retailWizard/dtos/WizardPayment.ts +10 -0
  60. package/src/retailWizard/dtos/requests/CreateAccessorySaleRequest.ts +17 -5
  61. package/src/retailWizard/dtos/requests/DownPaymentRequest.ts +14 -3
  62. package/src/retailWizard/dtos/requests/RegisterPaymentRequest.ts +13 -2
  63. package/src/retailWizard/events/RetailPromotionInboundMessage.ts +7 -1
  64. package/src/retailWizard/index.ts +5 -0
  65. package/src/retailWizard/validators/IsSalePaymentList.ts +20 -0
  66. package/src/retailWizard/validators/OnlyForPaymentMethodConstraint.ts +18 -0
  67. package/src/retailWizard/validators/PaymentsHaveSingleUseMethodsConstraint.ts +20 -0
  68. package/src/retailWizard/validators/PaymentsMatchAmountCentsConstraint.ts +21 -0
@@ -145,6 +145,18 @@ describe('RetailSystemSale.payments', () => {
145
145
  expect(await errorsOf(RetailSystemSale, { ...sale, payments: [cashPayment, { ...wirePayment, senderClabe: null }] })).toEqual([]);
146
146
  });
147
147
 
148
+ it('acepta CARD y WIRE sin comprobante', async () => {
149
+ const card = { ...cardPayment, cardLast4: null, authCode: null };
150
+ const wire = { ...wirePayment, speiTrackingKey: null, senderClabe: null };
151
+ expect(await errorsOf(RetailSystemSale, { ...sale, payments: [cashPayment, card] })).toEqual([]);
152
+ expect(await errorsOf(RetailSystemSale, { ...sale, payments: [cashPayment, wire] })).toEqual([]);
153
+ });
154
+
155
+ it('acepta tarjeta repetida y tres medios', async () => {
156
+ const cards = [{ ...cardPayment, amount: '100.00' }, { ...cardPayment, amount: '100.00', cardLast4: null }];
157
+ expect(await errorsOf(RetailSystemSale, { ...sale, payments: [cashPayment, ...cards] })).toEqual([]);
158
+ });
159
+
148
160
  it('acepta speiTrackingKey de 1 a 30 alfanuméricos', async () => {
149
161
  expect(await errorsOf(RetailSystemSale, { ...sale, payments: [cashPayment, { ...wirePayment, speiTrackingKey: '7' }] })).toEqual([]);
150
162
  expect(await errorsOf(RetailSystemSale, { ...sale, payments: [cashPayment, { ...wirePayment, speiTrackingKey: 'A'.repeat(30) }] })).toEqual([]);
@@ -174,9 +186,9 @@ describe('RetailSystemSale.payments', () => {
174
186
  });
175
187
 
176
188
  it.each([
177
- ['cardLast4', { cardLast4: null }],
189
+ ['cardLast4', { cardLast4: undefined }],
178
190
  ['cardLast4', { cardLast4: '424' }],
179
- ['authCode', { authCode: null }],
191
+ ['authCode', { authCode: undefined }],
180
192
  ['authCode', { authCode: ' ' }],
181
193
  ['authCode', { authCode: 'A'.repeat(65) }],
182
194
  ['speiTrackingKey', { speiTrackingKey: '123456789012345678' }],
@@ -186,7 +198,7 @@ describe('RetailSystemSale.payments', () => {
186
198
  });
187
199
 
188
200
  it.each([
189
- ['speiTrackingKey', { speiTrackingKey: null }],
201
+ ['speiTrackingKey', { speiTrackingKey: undefined }],
190
202
  ['speiTrackingKey', { speiTrackingKey: '' }],
191
203
  ['speiTrackingKey', { speiTrackingKey: 'A'.repeat(31) }],
192
204
  ['speiTrackingKey', { speiTrackingKey: 'MBAN-0100-2610' }],
@@ -45,9 +45,9 @@ describe('CreateAccessorySaleRequest', () => {
45
45
  expect(errorsOf(CreateAccessorySaleRequest, { ...validSale, amountCents: 10.5 })).toContain('amountCents');
46
46
  });
47
47
 
48
- it('exige el comprobante del cobro', () => {
48
+ it('acepta el cobro sin comprobante', () => {
49
49
  const { paymentDetail: _omit, ...rest } = validSale;
50
- expect(errorsOf(CreateAccessorySaleRequest, rest)).toContain('paymentDetail');
50
+ expect(errorsOf(CreateAccessorySaleRequest, rest)).toEqual([]);
51
51
  });
52
52
 
53
53
  it('no lleva aviso de privacidad: privacyNoticeAccepted y privacyNoticeVersion se descartan', () => {
@@ -0,0 +1,140 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validateSync, type ValidationError } from 'class-validator';
4
+ import { SalePayment } from '../../../src/retailWizard/dtos/SalePayment';
5
+ import { WizardPayment } from '../../../src/retailWizard/dtos/WizardPayment';
6
+ import { RegisterPaymentRequest } from '../../../src/retailWizard/dtos/requests/RegisterPaymentRequest';
7
+ import { DownPaymentRequest } from '../../../src/retailWizard/dtos/requests/DownPaymentRequest';
8
+ import { CreateAccessorySaleRequest } from '../../../src/retailWizard/dtos/requests/CreateAccessorySaleRequest';
9
+ import { RetailPromotionInboundMessage } from '../../../src/retailWizard/events/RetailPromotionInboundMessage';
10
+ import { MAX_SALE_PAYMENTS, SINGLE_USE_PAYMENT_METHODS } from '../../../src/retailWizard/constants/retailWizardValidation';
11
+ import { SalePaymentMethodEnum } from '../../../src/retailWizard/enums/SalePaymentMethodEnum';
12
+ import * as RetailWizard from '../../../src/retailWizard';
13
+
14
+ const { CASH, CARD, WIRE } = SalePaymentMethodEnum;
15
+
16
+ function paths(errors: ValidationError[], prefix = ''): string[] {
17
+ return errors.flatMap((e) => {
18
+ const path = `${prefix}${e.property}`;
19
+ return e.children?.length ? paths(e.children, `${path}.`) : [path];
20
+ });
21
+ }
22
+
23
+ function errorsOf<T extends object>(cls: new () => T, payload: Record<string, unknown>): string[] {
24
+ return paths(validateSync(plainToInstance(cls, payload, { excludeExtraneousValues: true })));
25
+ }
26
+
27
+ const cash = { method: CASH, amountCents: 10000, cashConfirmedInRegister: true };
28
+ const card = { method: CARD, amountCents: 5000, cardLast4: '4242', authCode: 'A1B2C3' };
29
+ const wire = { method: WIRE, amountCents: 5000, speiTrackingKey: 'MBAN01002610', senderClabe: '012180001234567897' };
30
+
31
+ describe('SalePayment', () => {
32
+ it('acepta cada medio con comprobante', () => {
33
+ expect(errorsOf(SalePayment, cash)).toEqual([]);
34
+ expect(errorsOf(SalePayment, card)).toEqual([]);
35
+ expect(errorsOf(SalePayment, wire)).toEqual([]);
36
+ });
37
+
38
+ it('acepta tarjeta y SPEI sin comprobante, ausente o en null', () => {
39
+ expect(errorsOf(SalePayment, { method: CARD, amountCents: 5000 })).toEqual([]);
40
+ expect(errorsOf(SalePayment, { method: WIRE, amountCents: 5000, speiTrackingKey: null, senderClabe: null })).toEqual([]);
41
+ expect(errorsOf(SalePayment, { method: CASH, amountCents: 5000, cashConfirmedInRegister: null })).toEqual([]);
42
+ });
43
+
44
+ it.each([
45
+ ['cardLast4', { ...card, cardLast4: '424' }],
46
+ ['authCode', { ...card, authCode: ' ' }],
47
+ ['authCode', { ...card, authCode: 'A'.repeat(65) }],
48
+ ['speiTrackingKey', { ...wire, speiTrackingKey: 'MBAN-01' }],
49
+ ['senderClabe', { ...wire, senderClabe: '0121' }],
50
+ ['cashConfirmedInRegister', { ...cash, cashConfirmedInRegister: 'yes' }],
51
+ ])('rechaza %s con formato inválido', (field, payload) => {
52
+ expect(errorsOf(SalePayment, payload)).toEqual([field]);
53
+ });
54
+
55
+ it.each([
56
+ ['cardLast4', { ...cash, cardLast4: '4242' }],
57
+ ['speiTrackingKey', { ...card, speiTrackingKey: 'MBAN01' }],
58
+ ['cashConfirmedInRegister', { ...wire, cashConfirmedInRegister: true }],
59
+ ])('rechaza %s en un medio que no le corresponde', (field, payload) => {
60
+ expect(errorsOf(SalePayment, payload)).toEqual([field]);
61
+ });
62
+
63
+ it('rechaza un medio fuera del enum y un monto no positivo', () => {
64
+ expect(errorsOf(SalePayment, { method: 'FIADO', amountCents: 100 })).toEqual(['method']);
65
+ expect(errorsOf(SalePayment, { ...cash, amountCents: 0 })).toEqual(['amountCents']);
66
+ expect(errorsOf(SalePayment, { ...cash, amountCents: 10.5 })).toEqual(['amountCents']);
67
+ });
68
+ });
69
+
70
+ describe('payments en RegisterPaymentRequest', () => {
71
+ it('acepta solo payments, sin method ni detail', () => {
72
+ expect(errorsOf(RegisterPaymentRequest, { amountCents: 20000, payments: [cash, card, wire] })).toEqual([]);
73
+ });
74
+
75
+ it('acepta tarjeta repetida', () => {
76
+ expect(errorsOf(RegisterPaymentRequest, { amountCents: 20000, payments: [cash, card, card] })).toEqual([]);
77
+ });
78
+
79
+ it('sigue aceptando el formato viejo', () => {
80
+ expect(errorsOf(RegisterPaymentRequest, { method: CASH, amountCents: 20000, detail: { cashConfirmedInRegister: true } })).toEqual([]);
81
+ });
82
+
83
+ it('exige method si no vienen payments', () => {
84
+ expect(errorsOf(RegisterPaymentRequest, { amountCents: 20000 })).toEqual(['method']);
85
+ });
86
+
87
+ it('rechaza efectivo o SPEI repetidos', () => {
88
+ expect(errorsOf(RegisterPaymentRequest, { amountCents: 20000, payments: [cash, cash] })).toEqual(['payments']);
89
+ expect(errorsOf(RegisterPaymentRequest, { amountCents: 10000, payments: [wire, wire] })).toEqual(['payments']);
90
+ });
91
+
92
+ it(`rechaza más de ${MAX_SALE_PAYMENTS} pagos o una lista vacía`, () => {
93
+ expect(errorsOf(RegisterPaymentRequest, { amountCents: 25000, payments: [cash, card, card, wire] })).toEqual(['payments']);
94
+ expect(errorsOf(RegisterPaymentRequest, { amountCents: 0, payments: [] })).toEqual(['payments']);
95
+ });
96
+
97
+ it('rechaza que la suma no cuadre con amountCents', () => {
98
+ expect(errorsOf(RegisterPaymentRequest, { amountCents: 20001, payments: [cash, card, wire] })).toEqual(['payments']);
99
+ });
100
+
101
+ it('reporta el campo del pago inválido', () => {
102
+ expect(errorsOf(RegisterPaymentRequest, { amountCents: 15000, payments: [cash, { ...card, cardLast4: '1' }] })).toEqual([
103
+ 'payments.1.cardLast4',
104
+ ]);
105
+ });
106
+ });
107
+
108
+ describe('payments en los demás contratos', () => {
109
+ it('DownPaymentRequest acepta solo payments y valida la suma', () => {
110
+ expect(errorsOf(DownPaymentRequest, { amountCents: 15000, payments: [cash, wire] })).toEqual([]);
111
+ expect(errorsOf(DownPaymentRequest, { amountCents: 1, payments: [cash, wire] })).toEqual(['payments']);
112
+ });
113
+
114
+ it('CreateAccessorySaleRequest acepta solo payments y ya no exige paymentDetail', () => {
115
+ const lines = [{ sku: 'ACC-1', qty: 1 }];
116
+ expect(errorsOf(CreateAccessorySaleRequest, { lines, amountCents: 15000, payments: [cash, card] })).toEqual([]);
117
+ expect(errorsOf(CreateAccessorySaleRequest, { lines, amountCents: 15000 })).toEqual(['paymentMethod']);
118
+ expect(errorsOf(CreateAccessorySaleRequest, { lines, amountCents: 20000, payments: [cash, cash] })).toEqual(['payments']);
119
+ });
120
+
121
+ it('WizardPayment guarda payments tipados', () => {
122
+ const base = { method: CASH, amountCents: 15000, paidAt: '2026-11-03T10:00:00.000Z' };
123
+ expect(errorsOf(WizardPayment, { ...base, payments: [cash, card] })).toEqual([]);
124
+ expect(errorsOf(WizardPayment, base)).toEqual([]);
125
+ expect(errorsOf(WizardPayment, { ...base, payments: [cash, cash] })).toEqual(['payments']);
126
+ });
127
+
128
+ it('RetailPromotionInboundMessage acepta paymentMethods y rechaza valores fuera del enum', () => {
129
+ const plain = { paymentMethods: [CASH, CARD] };
130
+ const dto = plainToInstance(RetailPromotionInboundMessage, plain);
131
+ expect(paths(validateSync(dto)).filter((p) => p === 'paymentMethods')).toEqual([]);
132
+ const bad = plainToInstance(RetailPromotionInboundMessage, { paymentMethods: ['FIADO'] });
133
+ expect(paths(validateSync(bad))).toContain('paymentMethods');
134
+ });
135
+
136
+ it('el barrel exporta los tipos nuevos', () => {
137
+ expect(RetailWizard.SalePayment).toBe(SalePayment);
138
+ expect(SINGLE_USE_PAYMENT_METHODS).toEqual([CASH, WIRE]);
139
+ });
140
+ });
@@ -4,6 +4,9 @@ import { OnboardingStepStatusEnum } from '../../enums/OnboardingStepStatusEnum';
4
4
  import { OnboardingAccountStatusEnum } from '../../enums/OnboardingAccountStatusEnum';
5
5
  import { OnboardingAccountReasonEnum } from '../../enums/OnboardingAccountReasonEnum';
6
6
  import { OnboardingAccountMessageKeyEnum } from '../../enums/OnboardingAccountMessageKeyEnum';
7
+ import { OnboardingAccountStatusV2Enum } from '../../enums/OnboardingAccountStatusV2Enum';
8
+ import { OnboardingAccountReasonV2Enum } from '../../enums/OnboardingAccountReasonV2Enum';
9
+ import { OnboardingAccountMessageKeyV2Enum } from '../../enums/OnboardingAccountMessageKeyV2Enum';
7
10
  /**
8
11
  * Un paso: `id` + `status` y nada más. Sin motivo, sin metadata y sin lado (DEC-012 de
9
12
  * onboarding-business).
@@ -41,6 +44,14 @@ export declare class OnboardingAccountDto {
41
44
  */
42
45
  key: OnboardingAccountMessageKeyEnum;
43
46
  }
47
+ /** Cuenta con el catálogo homologado (v2). Ver `OnboardingAccountStatusV2Enum`. */
48
+ export declare class OnboardingAccountV2Dto {
49
+ scope: Scope;
50
+ status: OnboardingAccountStatusV2Enum;
51
+ /** Con `IFRAME` es el link de IDology; en cualquier otro estado, un valor del enum. */
52
+ reason: OnboardingAccountReasonV2Enum | string;
53
+ key: OnboardingAccountMessageKeyV2Enum;
54
+ }
44
55
  /**
45
56
  * Respuesta de `GET /onboarding-business/steps`.
46
57
  *
@@ -71,4 +82,6 @@ export declare class OnboardingStepsResponse {
71
82
  * igual va a recibir pasos abiertos.
72
83
  */
73
84
  accounts: OnboardingAccountDto[];
85
+ /** Catálogo homologado. Opcional mientras convive con `accounts` (v1). */
86
+ accountsV2?: OnboardingAccountV2Dto[];
74
87
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OnboardingStepsResponse = exports.OnboardingAccountDto = exports.OnboardingStepDto = void 0;
3
+ exports.OnboardingStepsResponse = exports.OnboardingAccountV2Dto = exports.OnboardingAccountDto = exports.OnboardingStepDto = void 0;
4
4
  /**
5
5
  * Un paso: `id` + `status` y nada más. Sin motivo, sin metadata y sin lado (DEC-012 de
6
6
  * onboarding-business).
@@ -17,6 +17,10 @@ exports.OnboardingStepDto = OnboardingStepDto;
17
17
  class OnboardingAccountDto {
18
18
  }
19
19
  exports.OnboardingAccountDto = OnboardingAccountDto;
20
+ /** Cuenta con el catálogo homologado (v2). Ver `OnboardingAccountStatusV2Enum`. */
21
+ class OnboardingAccountV2Dto {
22
+ }
23
+ exports.OnboardingAccountV2Dto = OnboardingAccountV2Dto;
20
24
  /**
21
25
  * Respuesta de `GET /onboarding-business/steps`.
22
26
  *
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Clave del mensaje de Fido (v2). Se busca en Remote Config `FIDO_STATUS_MESSAGES_V2_ESP` como
3
+ * `{[key]: {title, subtitle}}`. Una key = un texto: si dos casos necesitan textos distintos,
4
+ * necesitan keys distintas.
5
+ */
6
+ export declare enum OnboardingAccountMessageKeyV2Enum {
7
+ OPEN = "OPEN",
8
+ COMPLETE_YOUR_INFORMATION = "COMPLETE_YOUR_INFORMATION",
9
+ LONG_REVIEW = "LONG_REVIEW",
10
+ SHORT_REVIEW = "SHORT_REVIEW",
11
+ CUSTOMER_CARE_HELP = "CUSTOMER_CARE_HELP",
12
+ BLACKLIST = "BLACKLIST",
13
+ DUPLICATE_USER = "DUPLICATE_USER",
14
+ IDENTITY_MISMATCH = "IDENTITY_MISMATCH",
15
+ TEMPLATE_MISMATCH = "TEMPLATE_MISMATCH",
16
+ ALTERATION = "ALTERATION",
17
+ PENDING_OOW_QUESTIONS = "PENDING_OOW_QUESTIONS",
18
+ OOW_EXPIRED = "OOW_EXPIRED",
19
+ INCOMPLETE_OOW_ANSWERS = "INCOMPLETE_OOW_ANSWERS",
20
+ DOC_TOO_SMALL = "DOC_TOO_SMALL",
21
+ DOC_TOO_SMALL_IMAGE_ERROR = "DOC_TOO_SMALL_IMAGE_ERROR",
22
+ DOC_BAD_RESOLUTION = "DOC_BAD_RESOLUTION",
23
+ DOC_IMAGE_ERROR = "DOC_IMAGE_ERROR",
24
+ DOC_TOO_SMALL_BARCODE_IMAGE_ERROR = "DOC_TOO_SMALL_BARCODE_IMAGE_ERROR",
25
+ DATE_OF_BIRTH_UNDER_REVIEW = "DATE_OF_BIRTH_UNDER_REVIEW",
26
+ ADDRESS_US_REVIEW = "ADDRESS_US_REVIEW",
27
+ ADDRESS_MX_REVIEW = "ADDRESS_MX_REVIEW"
28
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OnboardingAccountMessageKeyV2Enum = void 0;
4
+ /**
5
+ * Clave del mensaje de Fido (v2). Se busca en Remote Config `FIDO_STATUS_MESSAGES_V2_ESP` como
6
+ * `{[key]: {title, subtitle}}`. Una key = un texto: si dos casos necesitan textos distintos,
7
+ * necesitan keys distintas.
8
+ */
9
+ var OnboardingAccountMessageKeyV2Enum;
10
+ (function (OnboardingAccountMessageKeyV2Enum) {
11
+ OnboardingAccountMessageKeyV2Enum["OPEN"] = "OPEN";
12
+ OnboardingAccountMessageKeyV2Enum["COMPLETE_YOUR_INFORMATION"] = "COMPLETE_YOUR_INFORMATION";
13
+ OnboardingAccountMessageKeyV2Enum["LONG_REVIEW"] = "LONG_REVIEW";
14
+ OnboardingAccountMessageKeyV2Enum["SHORT_REVIEW"] = "SHORT_REVIEW";
15
+ OnboardingAccountMessageKeyV2Enum["CUSTOMER_CARE_HELP"] = "CUSTOMER_CARE_HELP";
16
+ OnboardingAccountMessageKeyV2Enum["BLACKLIST"] = "BLACKLIST";
17
+ OnboardingAccountMessageKeyV2Enum["DUPLICATE_USER"] = "DUPLICATE_USER";
18
+ OnboardingAccountMessageKeyV2Enum["IDENTITY_MISMATCH"] = "IDENTITY_MISMATCH";
19
+ OnboardingAccountMessageKeyV2Enum["TEMPLATE_MISMATCH"] = "TEMPLATE_MISMATCH";
20
+ OnboardingAccountMessageKeyV2Enum["ALTERATION"] = "ALTERATION";
21
+ OnboardingAccountMessageKeyV2Enum["PENDING_OOW_QUESTIONS"] = "PENDING_OOW_QUESTIONS";
22
+ OnboardingAccountMessageKeyV2Enum["OOW_EXPIRED"] = "OOW_EXPIRED";
23
+ OnboardingAccountMessageKeyV2Enum["INCOMPLETE_OOW_ANSWERS"] = "INCOMPLETE_OOW_ANSWERS";
24
+ OnboardingAccountMessageKeyV2Enum["DOC_TOO_SMALL"] = "DOC_TOO_SMALL";
25
+ OnboardingAccountMessageKeyV2Enum["DOC_TOO_SMALL_IMAGE_ERROR"] = "DOC_TOO_SMALL_IMAGE_ERROR";
26
+ OnboardingAccountMessageKeyV2Enum["DOC_BAD_RESOLUTION"] = "DOC_BAD_RESOLUTION";
27
+ OnboardingAccountMessageKeyV2Enum["DOC_IMAGE_ERROR"] = "DOC_IMAGE_ERROR";
28
+ OnboardingAccountMessageKeyV2Enum["DOC_TOO_SMALL_BARCODE_IMAGE_ERROR"] = "DOC_TOO_SMALL_BARCODE_IMAGE_ERROR";
29
+ OnboardingAccountMessageKeyV2Enum["DATE_OF_BIRTH_UNDER_REVIEW"] = "DATE_OF_BIRTH_UNDER_REVIEW";
30
+ OnboardingAccountMessageKeyV2Enum["ADDRESS_US_REVIEW"] = "ADDRESS_US_REVIEW";
31
+ OnboardingAccountMessageKeyV2Enum["ADDRESS_MX_REVIEW"] = "ADDRESS_MX_REVIEW";
32
+ })(OnboardingAccountMessageKeyV2Enum || (exports.OnboardingAccountMessageKeyV2Enum = OnboardingAccountMessageKeyV2Enum = {}));
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Motivo del estado (v2). Siempre viaja, salvo con `IFRAME`, donde `reason` es el link de IDology.
3
+ */
4
+ export declare enum OnboardingAccountReasonV2Enum {
5
+ OPEN = "OPEN",
6
+ COMPLETE_YOUR_INFORMATION = "COMPLETE_YOUR_INFORMATION",
7
+ LONG_REVIEW = "LONG_REVIEW",
8
+ SHORT_REVIEW = "SHORT_REVIEW",
9
+ CUSTOMER_CARE_HELP = "CUSTOMER_CARE_HELP",
10
+ BLACKLIST = "BLACKLIST",
11
+ DUPLICATE_USER = "DUPLICATE_USER",
12
+ IDENTITY_MISMATCH = "IDENTITY_MISMATCH",
13
+ TEMPLATE_MISMATCH = "TEMPLATE_MISMATCH",
14
+ ALTERATION = "ALTERATION",
15
+ /** Las tres variantes de OOW comparten reason: la app navega a las preguntas por este valor. */
16
+ PENDING_OOW_QUESTIONS = "PENDING_OOW_QUESTIONS",
17
+ DATE_OF_BIRTH_UNDER_REVIEW = "DATE_OF_BIRTH_UNDER_REVIEW",
18
+ ADDRESS_US_REVIEW = "ADDRESS_US_REVIEW",
19
+ ADDRESS_MX_REVIEW = "ADDRESS_MX_REVIEW"
20
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OnboardingAccountReasonV2Enum = void 0;
4
+ /**
5
+ * Motivo del estado (v2). Siempre viaja, salvo con `IFRAME`, donde `reason` es el link de IDology.
6
+ */
7
+ var OnboardingAccountReasonV2Enum;
8
+ (function (OnboardingAccountReasonV2Enum) {
9
+ OnboardingAccountReasonV2Enum["OPEN"] = "OPEN";
10
+ OnboardingAccountReasonV2Enum["COMPLETE_YOUR_INFORMATION"] = "COMPLETE_YOUR_INFORMATION";
11
+ OnboardingAccountReasonV2Enum["LONG_REVIEW"] = "LONG_REVIEW";
12
+ OnboardingAccountReasonV2Enum["SHORT_REVIEW"] = "SHORT_REVIEW";
13
+ OnboardingAccountReasonV2Enum["CUSTOMER_CARE_HELP"] = "CUSTOMER_CARE_HELP";
14
+ OnboardingAccountReasonV2Enum["BLACKLIST"] = "BLACKLIST";
15
+ OnboardingAccountReasonV2Enum["DUPLICATE_USER"] = "DUPLICATE_USER";
16
+ OnboardingAccountReasonV2Enum["IDENTITY_MISMATCH"] = "IDENTITY_MISMATCH";
17
+ OnboardingAccountReasonV2Enum["TEMPLATE_MISMATCH"] = "TEMPLATE_MISMATCH";
18
+ OnboardingAccountReasonV2Enum["ALTERATION"] = "ALTERATION";
19
+ /** Las tres variantes de OOW comparten reason: la app navega a las preguntas por este valor. */
20
+ OnboardingAccountReasonV2Enum["PENDING_OOW_QUESTIONS"] = "PENDING_OOW_QUESTIONS";
21
+ OnboardingAccountReasonV2Enum["DATE_OF_BIRTH_UNDER_REVIEW"] = "DATE_OF_BIRTH_UNDER_REVIEW";
22
+ OnboardingAccountReasonV2Enum["ADDRESS_US_REVIEW"] = "ADDRESS_US_REVIEW";
23
+ OnboardingAccountReasonV2Enum["ADDRESS_MX_REVIEW"] = "ADDRESS_MX_REVIEW";
24
+ })(OnboardingAccountReasonV2Enum || (exports.OnboardingAccountReasonV2Enum = OnboardingAccountReasonV2Enum = {}));
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Estado del trámite de una cuenta — catálogo homologado (v2).
3
+ *
4
+ * Convive con `OnboardingAccountStatusEnum` (v1) mientras las apps publicadas sigan leyendo
5
+ * `accounts`. El v2 viaja en `accountsV2`. Los estados ya no distinguen motivos: eso lo dice la
6
+ * `key`. `IFRAME` es el único que pide acción inmediata en la app: abrir `reason` (un link).
7
+ */
8
+ export declare enum OnboardingAccountStatusV2Enum {
9
+ OPEN = "OPEN",
10
+ IN_PROGRESS = "IN_PROGRESS",
11
+ UNDER_REVIEW = "UNDER_REVIEW",
12
+ REJECTED = "REJECTED",
13
+ /** CP rechazó la foto y hay link de IDology vigente: `reason` trae la URL a abrir. */
14
+ IFRAME = "IFRAME"
15
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OnboardingAccountStatusV2Enum = void 0;
4
+ /**
5
+ * Estado del trámite de una cuenta — catálogo homologado (v2).
6
+ *
7
+ * Convive con `OnboardingAccountStatusEnum` (v1) mientras las apps publicadas sigan leyendo
8
+ * `accounts`. El v2 viaja en `accountsV2`. Los estados ya no distinguen motivos: eso lo dice la
9
+ * `key`. `IFRAME` es el único que pide acción inmediata en la app: abrir `reason` (un link).
10
+ */
11
+ var OnboardingAccountStatusV2Enum;
12
+ (function (OnboardingAccountStatusV2Enum) {
13
+ OnboardingAccountStatusV2Enum["OPEN"] = "OPEN";
14
+ OnboardingAccountStatusV2Enum["IN_PROGRESS"] = "IN_PROGRESS";
15
+ OnboardingAccountStatusV2Enum["UNDER_REVIEW"] = "UNDER_REVIEW";
16
+ OnboardingAccountStatusV2Enum["REJECTED"] = "REJECTED";
17
+ /** CP rechazó la foto y hay link de IDology vigente: `reason` trae la URL a abrir. */
18
+ OnboardingAccountStatusV2Enum["IFRAME"] = "IFRAME";
19
+ })(OnboardingAccountStatusV2Enum || (exports.OnboardingAccountStatusV2Enum = OnboardingAccountStatusV2Enum = {}));
@@ -3,6 +3,9 @@ export * from './enums/OnboardingStepStatusEnum';
3
3
  export * from './enums/OnboardingAccountStatusEnum';
4
4
  export * from './enums/OnboardingAccountReasonEnum';
5
5
  export * from './enums/OnboardingAccountMessageKeyEnum';
6
+ export * from './enums/OnboardingAccountStatusV2Enum';
7
+ export * from './enums/OnboardingAccountReasonV2Enum';
8
+ export * from './enums/OnboardingAccountMessageKeyV2Enum';
6
9
  export * from './enums/ExpedienteUpdatedSourceEnum';
7
10
  export * from './dtos/responses/OnboardingStepsResponse';
8
11
  export * from './dtos/ExpedienteUpdatedMessage';
@@ -20,6 +20,9 @@ __exportStar(require("./enums/OnboardingStepStatusEnum"), exports);
20
20
  __exportStar(require("./enums/OnboardingAccountStatusEnum"), exports);
21
21
  __exportStar(require("./enums/OnboardingAccountReasonEnum"), exports);
22
22
  __exportStar(require("./enums/OnboardingAccountMessageKeyEnum"), exports);
23
+ __exportStar(require("./enums/OnboardingAccountStatusV2Enum"), exports);
24
+ __exportStar(require("./enums/OnboardingAccountReasonV2Enum"), exports);
25
+ __exportStar(require("./enums/OnboardingAccountMessageKeyV2Enum"), exports);
23
26
  __exportStar(require("./enums/ExpedienteUpdatedSourceEnum"), exports);
24
27
  // Response DTOs
25
28
  __exportStar(require("./dtos/responses/OnboardingStepsResponse"), exports);
@@ -22,7 +22,7 @@ export declare class RetailSystemSaleCredit {
22
22
  totalToPay: string;
23
23
  firstPaymentDate: string;
24
24
  }
25
- /** Un medio de pago de `amountPaid`; las seis llaves van siempre, en `null` las que no aplican. */
25
+ /** Un medio de pago de `amountPaid`; las seis llaves van siempre. El comprobante es opcional (`null`) en su medio y `null` en los demás. */
26
26
  export declare class RetailSystemSalePayment {
27
27
  method: RetailPaymentMethod;
28
28
  amount: string;
@@ -79,7 +79,7 @@ __decorate([
79
79
  (0, class_validator_1.Validate)(IsCalendarDate_1.IsCalendarDate),
80
80
  __metadata("design:type", String)
81
81
  ], RetailSystemSaleCredit.prototype, "firstPaymentDate", void 0);
82
- /** Un medio de pago de `amountPaid`; las seis llaves van siempre, en `null` las que no aplican. */
82
+ /** Un medio de pago de `amountPaid`; las seis llaves van siempre. El comprobante es opcional (`null`) en su medio y `null` en los demás. */
83
83
  class RetailSystemSalePayment {
84
84
  }
85
85
  exports.RetailSystemSalePayment = RetailSystemSalePayment;
@@ -93,15 +93,15 @@ __decorate([
93
93
  __metadata("design:type", String)
94
94
  ], RetailSystemSalePayment.prototype, "amount", void 0);
95
95
  __decorate([
96
- (0, class_validator_1.Validate)(saleValidators_1.MatchesForPaymentMethod, [CARD, retailIntegrationLimits_1.RETAIL_CARD_LAST4_PATTERN]),
96
+ (0, class_validator_1.Validate)(saleValidators_1.MatchesForPaymentMethod, [CARD, retailIntegrationLimits_1.RETAIL_CARD_LAST4_PATTERN, true]),
97
97
  __metadata("design:type", String)
98
98
  ], RetailSystemSalePayment.prototype, "cardLast4", void 0);
99
99
  __decorate([
100
- (0, class_validator_1.Validate)(saleValidators_1.MatchesForPaymentMethod, [CARD, retailIntegrationLimits_1.RETAIL_SALE_ID_TEXT_PATTERN]),
100
+ (0, class_validator_1.Validate)(saleValidators_1.MatchesForPaymentMethod, [CARD, retailIntegrationLimits_1.RETAIL_SALE_ID_TEXT_PATTERN, true]),
101
101
  __metadata("design:type", String)
102
102
  ], RetailSystemSalePayment.prototype, "authCode", void 0);
103
103
  __decorate([
104
- (0, class_validator_1.Validate)(saleValidators_1.MatchesForPaymentMethod, [WIRE, retailIntegrationLimits_1.RETAIL_SPEI_TRACKING_KEY_PATTERN]),
104
+ (0, class_validator_1.Validate)(saleValidators_1.MatchesForPaymentMethod, [WIRE, retailIntegrationLimits_1.RETAIL_SPEI_TRACKING_KEY_PATTERN, true]),
105
105
  __metadata("design:type", String)
106
106
  ], RetailSystemSalePayment.prototype, "speiTrackingKey", void 0);
107
107
  __decorate([
@@ -1,5 +1,5 @@
1
1
  import { ValidationArguments, ValidatorConstraintInterface } from 'class-validator';
2
- /** Campo de un pago que solo aplica a un medio: con ese medio cumple el patrón; con los demás es `null`. */
2
+ /** Campo de un pago que solo aplica a un medio: con ese medio cumple el patrón (o es `null` si es nulable); con los demás es `null`. */
3
3
  export declare class MatchesForPaymentMethod implements ValidatorConstraintInterface {
4
4
  validate(value: unknown, args: ValidationArguments): boolean;
5
5
  defaultMessage(args: ValidationArguments): string;
@@ -13,7 +13,7 @@ const enums_1 = require("../enums");
13
13
  function decimalToCents(value) {
14
14
  return Number(value.replace('.', ''));
15
15
  }
16
- /** Campo de un pago que solo aplica a un medio: con ese medio cumple el patrón; con los demás es `null`. */
16
+ /** Campo de un pago que solo aplica a un medio: con ese medio cumple el patrón (o es `null` si es nulable); con los demás es `null`. */
17
17
  let MatchesForPaymentMethod = class MatchesForPaymentMethod {
18
18
  validate(value, args) {
19
19
  const [method, pattern, nullable] = args.constraints;
@@ -24,7 +24,8 @@ let MatchesForPaymentMethod = class MatchesForPaymentMethod {
24
24
  return typeof value === 'string' && pattern.test(value);
25
25
  }
26
26
  defaultMessage(args) {
27
- return `${args.property} es obligatorio y válido en ${args.constraints[0]} y null en los demás medios`;
27
+ const nullable = args.constraints[2] === true;
28
+ return `${args.property} debe ser ${nullable ? 'null o válido' : 'válido'} en ${args.constraints[0]} y null en los demás medios`;
28
29
  }
29
30
  };
30
31
  exports.MatchesForPaymentMethod = MatchesForPaymentMethod;
@@ -1,2 +1,7 @@
1
+ import { SalePaymentMethodEnum } from '../enums/SalePaymentMethodEnum';
1
2
  /** Nombre de lambda en kebab-case, p. ej. `reconciliation-engine-business`. */
2
3
  export declare const RETAIL_WIZARD_CALLER_SERVICE_PATTERN: RegExp;
4
+ /** Tope de pagos con los que se cobra una venta, un enganche o una venta de mostrador. */
5
+ export declare const MAX_SALE_PAYMENTS = 3;
6
+ /** Medios que aparecen a lo más una vez por cobro; la tarjeta se puede repetir. */
7
+ export declare const SINGLE_USE_PAYMENT_METHODS: readonly SalePaymentMethodEnum[];
@@ -1,5 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RETAIL_WIZARD_CALLER_SERVICE_PATTERN = void 0;
3
+ exports.SINGLE_USE_PAYMENT_METHODS = exports.MAX_SALE_PAYMENTS = exports.RETAIL_WIZARD_CALLER_SERVICE_PATTERN = void 0;
4
+ const SalePaymentMethodEnum_1 = require("../enums/SalePaymentMethodEnum");
4
5
  /** Nombre de lambda en kebab-case, p. ej. `reconciliation-engine-business`. */
5
6
  exports.RETAIL_WIZARD_CALLER_SERVICE_PATTERN = /^[a-z0-9-]{1,64}$/;
7
+ /** Tope de pagos con los que se cobra una venta, un enganche o una venta de mostrador. */
8
+ exports.MAX_SALE_PAYMENTS = 3;
9
+ /** Medios que aparecen a lo más una vez por cobro; la tarjeta se puede repetir. */
10
+ exports.SINGLE_USE_PAYMENT_METHODS = [SalePaymentMethodEnum_1.SalePaymentMethodEnum.CASH, SalePaymentMethodEnum_1.SalePaymentMethodEnum.WIRE];
@@ -7,6 +7,7 @@ import type { CentralSyncStatusEnum } from '../enums/CentralSyncStatusEnum';
7
7
  import type { CentralCancelStatusEnum } from '../enums/CentralCancelStatusEnum';
8
8
  import type { CentralLiveCheckEnum } from '../enums/CentralLiveCheckEnum';
9
9
  import type { SalePaymentDetail } from './SalePaymentDetail';
10
+ import type { SalePayment } from './SalePayment';
10
11
  import type { SaleLine } from './SaleLine';
11
12
  import type { SalePromotionRef } from '../../retailPromotions/dtos/SalePromotionRef';
12
13
  import type { SaleCancellation } from './SaleCancellation';
@@ -56,10 +57,14 @@ export interface Sale {
56
57
  downPaymentCents: number | null;
57
58
  /** Puntero al crédito SOFOM en loan-credit (solo ventas CREDIT; `null` en contado/externa). */
58
59
  creditId: string | null;
60
+ /** @deprecated Usa `payments`; con varios pagos lleva el método del primero. */
59
61
  paymentMethod: SalePaymentMethodEnum | null;
60
62
  /** `LG-T{storeCode}-VTA-{5hex}-{YYYY}W{ww}` (D11) — único vía `UNIQ#FOLIO`. */
61
63
  folio: string;
64
+ /** @deprecated Usa el comprobante de cada elemento de `payments`. */
62
65
  paymentDetail: SalePaymentDetail | null;
66
+ /** Pagos con que se cobró `amountCents` (1 a 3); `null` sin cobro, ausente en ventas anteriores al campo. */
67
+ payments?: SalePayment[] | null;
63
68
  soldAt: string;
64
69
  /** Puntero a la entrega de la tarjeta física en `retail-cards-business`. */
65
70
  cardDeliveryId: string | null;
@@ -0,0 +1,11 @@
1
+ import { SalePaymentMethodEnum } from '../enums/SalePaymentMethodEnum';
2
+ /** Un pago del cobro. El comprobante es opcional: si viene se valida y solo en su medio; si no, `null` o ausente. */
3
+ export declare class SalePayment {
4
+ method: SalePaymentMethodEnum;
5
+ amountCents: number;
6
+ cashConfirmedInRegister?: boolean | null;
7
+ cardLast4?: string | null;
8
+ authCode?: string | null;
9
+ speiTrackingKey?: string | null;
10
+ senderClabe?: string | null;
11
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SalePayment = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const retailIntegrationLimits_1 = require("../../retailIntegration/constants/retailIntegrationLimits");
16
+ const SalePaymentMethodEnum_1 = require("../enums/SalePaymentMethodEnum");
17
+ const OnlyForPaymentMethodConstraint_1 = require("../validators/OnlyForPaymentMethodConstraint");
18
+ const { CASH, CARD, WIRE } = SalePaymentMethodEnum_1.SalePaymentMethodEnum;
19
+ const hasValue = (field) => (o) => o[field] != null;
20
+ /** Un pago del cobro. El comprobante es opcional: si viene se valida y solo en su medio; si no, `null` o ausente. */
21
+ class SalePayment {
22
+ }
23
+ exports.SalePayment = SalePayment;
24
+ __decorate([
25
+ (0, class_transformer_1.Expose)(),
26
+ (0, class_validator_1.IsEnum)(SalePaymentMethodEnum_1.SalePaymentMethodEnum),
27
+ __metadata("design:type", String)
28
+ ], SalePayment.prototype, "method", void 0);
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ (0, class_validator_1.IsInt)(),
32
+ (0, class_validator_1.Min)(1),
33
+ __metadata("design:type", Number)
34
+ ], SalePayment.prototype, "amountCents", void 0);
35
+ __decorate([
36
+ (0, class_transformer_1.Expose)(),
37
+ (0, class_validator_1.ValidateIf)(hasValue('cashConfirmedInRegister')),
38
+ (0, class_validator_1.IsBoolean)(),
39
+ (0, class_validator_1.Validate)(OnlyForPaymentMethodConstraint_1.OnlyForPaymentMethodConstraint, [CASH]),
40
+ __metadata("design:type", Boolean)
41
+ ], SalePayment.prototype, "cashConfirmedInRegister", void 0);
42
+ __decorate([
43
+ (0, class_transformer_1.Expose)(),
44
+ (0, class_validator_1.ValidateIf)(hasValue('cardLast4')),
45
+ (0, class_validator_1.Matches)(retailIntegrationLimits_1.RETAIL_CARD_LAST4_PATTERN),
46
+ (0, class_validator_1.Validate)(OnlyForPaymentMethodConstraint_1.OnlyForPaymentMethodConstraint, [CARD]),
47
+ __metadata("design:type", String)
48
+ ], SalePayment.prototype, "cardLast4", void 0);
49
+ __decorate([
50
+ (0, class_transformer_1.Expose)(),
51
+ (0, class_validator_1.ValidateIf)(hasValue('authCode')),
52
+ (0, class_validator_1.Matches)(retailIntegrationLimits_1.RETAIL_SALE_ID_TEXT_PATTERN),
53
+ (0, class_validator_1.Validate)(OnlyForPaymentMethodConstraint_1.OnlyForPaymentMethodConstraint, [CARD]),
54
+ __metadata("design:type", String)
55
+ ], SalePayment.prototype, "authCode", void 0);
56
+ __decorate([
57
+ (0, class_transformer_1.Expose)(),
58
+ (0, class_validator_1.ValidateIf)(hasValue('speiTrackingKey')),
59
+ (0, class_validator_1.Matches)(retailIntegrationLimits_1.RETAIL_SPEI_TRACKING_KEY_PATTERN),
60
+ (0, class_validator_1.Validate)(OnlyForPaymentMethodConstraint_1.OnlyForPaymentMethodConstraint, [WIRE]),
61
+ __metadata("design:type", String)
62
+ ], SalePayment.prototype, "speiTrackingKey", void 0);
63
+ __decorate([
64
+ (0, class_transformer_1.Expose)(),
65
+ (0, class_validator_1.ValidateIf)(hasValue('senderClabe')),
66
+ (0, class_validator_1.Matches)(retailIntegrationLimits_1.RETAIL_CLABE_PATTERN),
67
+ (0, class_validator_1.Validate)(OnlyForPaymentMethodConstraint_1.OnlyForPaymentMethodConstraint, [WIRE]),
68
+ __metadata("design:type", String)
69
+ ], SalePayment.prototype, "senderClabe", void 0);
@@ -2,6 +2,7 @@
2
2
  * Detalle del pago según el medio (`Sale.paymentDetail`): efectivo `{cashConfirmedInRegister}` ·
3
3
  * tarjeta `{cardLast4, authCode}` · SPEI `{speiTrackingKey, senderClabe?}`. SureKeep Fase 2 — pista Retail.
4
4
  */
5
+ /** @deprecated Usa `SalePayment`, un elemento por pago. */
5
6
  export declare class SalePaymentDetail {
6
7
  cashConfirmedInRegister?: boolean;
7
8
  cardLast4?: string;
@@ -16,6 +16,7 @@ const class_validator_1 = require("class-validator");
16
16
  * Detalle del pago según el medio (`Sale.paymentDetail`): efectivo `{cashConfirmedInRegister}` ·
17
17
  * tarjeta `{cardLast4, authCode}` · SPEI `{speiTrackingKey, senderClabe?}`. SureKeep Fase 2 — pista Retail.
18
18
  */
19
+ /** @deprecated Usa `SalePayment`, un elemento por pago. */
19
20
  class SalePaymentDetail {
20
21
  }
21
22
  exports.SalePaymentDetail = SalePaymentDetail;