@fiado/type-kit 3.321.0 → 3.322.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 (61) hide show
  1. package/_test_/unit/retailCustomer/welcomeBonusRequests.test.ts +71 -0
  2. package/bin/common/decorators/Trim.d.ts +5 -0
  3. package/bin/common/decorators/Trim.js +10 -0
  4. package/bin/common/index.d.ts +1 -0
  5. package/bin/common/index.js +2 -0
  6. package/bin/networkConnector/dtos/CreateProfileRequest.d.ts +1 -4
  7. package/bin/networkConnector/dtos/CreateProfileRequest.js +1 -1
  8. package/bin/networkConnector/dtos/ProfileResponse.d.ts +0 -3
  9. package/bin/networkConnector/dtos/UpdateProfileRequest.d.ts +1 -0
  10. package/bin/networkConnector/dtos/UpdateProfileRequest.js +6 -0
  11. package/bin/retailCustomer/dtos/requests/WelcomeAccreditationRequest.d.ts +1 -3
  12. package/bin/retailCustomer/dtos/requests/WelcomeAccreditationRequest.js +11 -14
  13. package/bin/retailCustomer/dtos/requests/WelcomeAccreditationResultRequest.d.ts +8 -0
  14. package/bin/retailCustomer/dtos/requests/WelcomeAccreditationResultRequest.js +29 -6
  15. package/bin/retailCustomer/dtos/responses/WelcomeBonusResponse.d.ts +4 -0
  16. package/bin/retailWizard/dtos/WizardBlocked.d.ts +7 -2
  17. package/bin/retailWizard/dtos/WizardSession.d.ts +5 -6
  18. package/bin/retailWizard/dtos/requests/CreateProspectRequest.d.ts +2 -0
  19. package/bin/retailWizard/dtos/requests/CreateProspectRequest.js +6 -0
  20. package/bin/retailWizard/enums/PendingReasonEnum.d.ts +14 -2
  21. package/bin/retailWizard/enums/PendingReasonEnum.js +17 -2
  22. package/bin/walletFunding/dtos/GetWalletFundingLimitResponse.d.ts +57 -11
  23. package/bin/walletFunding/dtos/GetWalletFundingLimitResponse.js +22 -11
  24. package/package.json +1 -1
  25. package/src/common/decorators/Trim.ts +8 -0
  26. package/src/common/index.ts +3 -0
  27. package/src/networkConnector/dtos/CreateProfileRequest.ts +2 -5
  28. package/src/networkConnector/dtos/ProfileResponse.ts +0 -3
  29. package/src/networkConnector/dtos/UpdateProfileRequest.ts +1 -2
  30. package/src/retailCustomer/dtos/requests/WelcomeAccreditationRequest.ts +12 -17
  31. package/src/retailCustomer/dtos/requests/WelcomeAccreditationResultRequest.ts +32 -9
  32. package/src/retailCustomer/dtos/responses/WelcomeBonusResponse.ts +4 -0
  33. package/src/retailWizard/dtos/WizardBlocked.ts +7 -2
  34. package/src/retailWizard/dtos/WizardSession.ts +5 -6
  35. package/src/retailWizard/dtos/requests/CreateProspectRequest.ts +6 -0
  36. package/src/retailWizard/enums/PendingReasonEnum.ts +17 -1
  37. package/src/walletFunding/dtos/GetWalletFundingLimitResponse.ts +60 -11
  38. package/bin/identity/enums/SelfieSourceEnum.d.ts +0 -10
  39. package/bin/identity/enums/SelfieSourceEnum.js +0 -14
  40. package/bin/retailCards/dtos/requests/AssignCardRequest.d.ts +0 -6
  41. package/bin/retailCards/dtos/requests/AssignCardRequest.js +0 -30
  42. package/bin/retailCards/dtos/requests/CancelCardRequest.d.ts +0 -5
  43. package/bin/retailCards/dtos/requests/CancelCardRequest.js +0 -22
  44. package/bin/retailCards/dtos/responses/RetailCardResponse.d.ts +0 -12
  45. package/bin/retailCards/dtos/responses/RetailCardResponse.js +0 -2
  46. package/bin/retailCards/enums/CardBatchStatusEnum.d.ts +0 -17
  47. package/bin/retailCards/enums/CardBatchStatusEnum.js +0 -21
  48. package/bin/retailCards/enums/CardCancelReasonEnum.d.ts +0 -13
  49. package/bin/retailCards/enums/CardCancelReasonEnum.js +0 -17
  50. package/bin/retailCards/enums/RetailCardStatusEnum.d.ts +0 -13
  51. package/bin/retailCards/enums/RetailCardStatusEnum.js +0 -17
  52. package/bin/retailCards/events/RetailCardAssignedV1.d.ts +0 -10
  53. package/bin/retailCards/events/RetailCardAssignedV1.js +0 -2
  54. package/bin/retailCards/events/RetailCardCancelledV1.d.ts +0 -9
  55. package/bin/retailCards/events/RetailCardCancelledV1.js +0 -2
  56. package/bin/retailCards/events/RetailCardReleasedV1.d.ts +0 -7
  57. package/bin/retailCards/events/RetailCardReleasedV1.js +0 -2
  58. package/bin/retailWizard/dtos/requests/CompleteSaleRequest.d.ts +0 -9
  59. package/bin/retailWizard/dtos/requests/CompleteSaleRequest.js +0 -29
  60. package/bin/retailWizard/dtos/requests/MarkPcfCardDeliveredRequest.d.ts +0 -4
  61. package/bin/retailWizard/dtos/requests/MarkPcfCardDeliveredRequest.js +0 -23
@@ -131,6 +131,77 @@ describe('WelcomeAccreditationResultRequest — cerrar el asiento', () => {
131
131
  ).toContain('bonusKey');
132
132
  }
133
133
  });
134
+
135
+ // El asiento se declara SIN PII y `failReason` es el único texto libre que escribe el caller: un
136
+ // payload crudo del processor podría meterle una CLABE al libro.
137
+ it('rechaza un failReason de más de 256 caracteres', () => {
138
+ expect(
139
+ errorsOf(WelcomeAccreditationResultRequest, {
140
+ bonusKey: 'key-1',
141
+ status: WelcomeBonusStatusEnum.FAILED,
142
+ failReason: 'x'.repeat(257),
143
+ }),
144
+ ).toContain('failReason');
145
+ });
146
+
147
+ it('acepta un failReason de 256 caracteres', () => {
148
+ expect(
149
+ errorsOf(WelcomeAccreditationResultRequest, {
150
+ bonusKey: 'key-1',
151
+ status: WelcomeBonusStatusEnum.FAILED,
152
+ failReason: 'x'.repeat(256),
153
+ }),
154
+ ).toEqual([]);
155
+ });
156
+ });
157
+
158
+ describe('WelcomeAccreditationResultRequest — cierre de reconciliación', () => {
159
+ const RECONCILED = {
160
+ bonusKey: 'key-1',
161
+ status: WelcomeBonusStatusEnum.ACCREDITED,
162
+ processorTransactionId: 'tx-1',
163
+ reconciledBy: 'ops@somosfiado.com',
164
+ reconciliationReason: 'confirmado en el estado de cuenta del processor',
165
+ };
166
+
167
+ it('acepta el cierre con actor y motivo', () => {
168
+ expect(errorsOf(WelcomeAccreditationResultRequest, RECONCILED)).toEqual([]);
169
+ });
170
+
171
+ // Media reconciliación no sirve: un asiento cerrado a mano sin quién o sin por qué no es auditable.
172
+ it('exige el motivo cuando viene el actor', () => {
173
+ expect(
174
+ errorsOf(WelcomeAccreditationResultRequest, {
175
+ ...RECONCILED,
176
+ reconciliationReason: undefined,
177
+ }),
178
+ ).toContain('reconciliationReason');
179
+ });
180
+
181
+ it('exige el actor cuando viene el motivo', () => {
182
+ expect(
183
+ errorsOf(WelcomeAccreditationResultRequest, { ...RECONCILED, reconciledBy: undefined }),
184
+ ).toContain('reconciledBy');
185
+ });
186
+
187
+ it('rechaza un motivo de más de 256 caracteres', () => {
188
+ expect(
189
+ errorsOf(WelcomeAccreditationResultRequest, {
190
+ ...RECONCILED,
191
+ reconciliationReason: 'x'.repeat(257),
192
+ }),
193
+ ).toContain('reconciliationReason');
194
+ });
195
+
196
+ it('recorta los espacios del actor y del motivo', () => {
197
+ const dto = plainToInstance(
198
+ WelcomeAccreditationResultRequest,
199
+ { ...RECONCILED, reconciledBy: ' ops@somosfiado.com ', reconciliationReason: ' ok ' },
200
+ { excludeExtraneousValues: true },
201
+ );
202
+ expect(dto.reconciledBy).toBe('ops@somosfiado.com');
203
+ expect(dto.reconciliationReason).toBe('ok');
204
+ });
134
205
  });
135
206
 
136
207
  describe('enums del bono de bienvenida', () => {
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Recorta los espacios del borde de un string; deja pasar cualquier otro tipo sin tocarlo.
3
+ * Se aplica antes de los validadores, así que `' '` llega como `''` y `@IsNotEmpty` lo rechaza.
4
+ */
5
+ export declare const Trim: () => PropertyDecorator;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Trim = void 0;
4
+ const class_transformer_1 = require("class-transformer");
5
+ /**
6
+ * Recorta los espacios del borde de un string; deja pasar cualquier otro tipo sin tocarlo.
7
+ * Se aplica antes de los validadores, así que `' '` llega como `''` y `@IsNotEmpty` lo rechaza.
8
+ */
9
+ const Trim = () => (0, class_transformer_1.Transform)(({ value }) => (typeof value === 'string' ? value.trim() : value));
10
+ exports.Trim = Trim;
@@ -1,3 +1,4 @@
1
+ export * from './decorators/Trim';
1
2
  export * from './dtos/ProcessValidationResultDto';
2
3
  export * from './enums/ProcessValidationEnum';
3
4
  export * from './enums/ProcessResultEnum';
@@ -14,6 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ //decorators
18
+ __exportStar(require("./decorators/Trim"), exports);
17
19
  //dtos
18
20
  __exportStar(require("./dtos/ProcessValidationResultDto"), exports);
19
21
  //Enums
@@ -5,10 +5,7 @@ export declare class CreateProfileRequest {
5
5
  company?: string;
6
6
  slug: string;
7
7
  directoryId: string;
8
- /** Requerido desde DEC: se usa como llave para resolver el codigo de referido
9
- * (IOnboardingBusinessApi.getByPhoneNumber) al crear el perfil. Inmutable tras la creacion
10
- * (UpdateProfileRequest ya no acepta este campo). */
11
- phone: string;
8
+ phone?: string;
12
9
  email?: string;
13
10
  bio?: string;
14
11
  socialLinks?: Record<string, string>;
@@ -57,8 +57,8 @@ __decorate([
57
57
  ], CreateProfileRequest.prototype, "directoryId", void 0);
58
58
  __decorate([
59
59
  (0, class_transformer_1.Expose)(),
60
+ (0, class_validator_1.IsOptional)(),
60
61
  (0, class_validator_1.IsString)(),
61
- (0, class_validator_1.IsNotEmpty)(),
62
62
  __metadata("design:type", String)
63
63
  ], CreateProfileRequest.prototype, "phone", void 0);
64
64
  __decorate([
@@ -12,9 +12,6 @@ export interface ProfileResponse {
12
12
  logoUrl?: string;
13
13
  bio?: string;
14
14
  socialLinks?: Record<string, string>;
15
- /** Codigo de referido del promotor (myReferralCode de Onboarding), resuelto por telefono al
16
- * crear el perfil. null si el telefono no tiene codigo asociado en Onboarding. */
17
- referralCode?: string | null;
18
15
  status: ProfileStatusEnum;
19
16
  directoryId: string;
20
17
  createdAt: number;
@@ -5,6 +5,7 @@ export declare class UpdateProfileRequest {
5
5
  title?: string;
6
6
  company?: string;
7
7
  slug?: string;
8
+ phone?: string;
8
9
  email?: string;
9
10
  bio?: string;
10
11
  socialLinks?: Record<string, string>;
@@ -54,6 +54,12 @@ __decorate([
54
54
  (0, class_validator_1.MaxLength)(100),
55
55
  __metadata("design:type", String)
56
56
  ], UpdateProfileRequest.prototype, "slug", void 0);
57
+ __decorate([
58
+ (0, class_transformer_1.Expose)(),
59
+ (0, class_validator_1.IsOptional)(),
60
+ (0, class_validator_1.IsString)(),
61
+ __metadata("design:type", String)
62
+ ], UpdateProfileRequest.prototype, "phone", void 0);
57
63
  __decorate([
58
64
  (0, class_transformer_1.Expose)(),
59
65
  (0, class_validator_1.IsOptional)(),
@@ -3,9 +3,7 @@ import { WelcomeBonusAmountSourceEnum } from '../../enums/WelcomeBonusAmountSour
3
3
  * Datos de la venta que acompañan la reserva del bono de bienvenida (D33):
4
4
  * `POST /private/customers/:id/welcome-accreditation`. SureKeep Fase 2 — pista Retail.
5
5
  *
6
- * **TODOS los campos son opcionales a propósito.** El customer despliega antes que el wizard, así que
7
- * durante la ventana el wizard viejo sigue llamando sin body: el asiento nace incompleto y se acredita
8
- * igual. Exigirlos convertiría esa ventana en un 400 que deja al cliente sin bono.
6
+ * Todos los campos son opcionales: un caller que no los manda abre el asiento igual, incompleto.
9
7
  */
10
8
  export declare class WelcomeAccreditationRequest {
11
9
  /** Tienda donde se dio el bono — es la partición del asiento. */
@@ -12,16 +12,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.WelcomeAccreditationRequest = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
+ const Trim_1 = require("../../../common/decorators/Trim");
15
16
  const WelcomeBonusAmountSourceEnum_1 = require("../../enums/WelcomeBonusAmountSourceEnum");
16
- /** Recorta los strings del borde: un valor con espacios ensucia claves y cortes de conciliación. */
17
- const trim = () => (0, class_transformer_1.Transform)(({ value }) => (typeof value === 'string' ? value.trim() : value));
18
17
  /**
19
18
  * Datos de la venta que acompañan la reserva del bono de bienvenida (D33):
20
19
  * `POST /private/customers/:id/welcome-accreditation`. SureKeep Fase 2 — pista Retail.
21
20
  *
22
- * **TODOS los campos son opcionales a propósito.** El customer despliega antes que el wizard, así que
23
- * durante la ventana el wizard viejo sigue llamando sin body: el asiento nace incompleto y se acredita
24
- * igual. Exigirlos convertiría esa ventana en un 400 que deja al cliente sin bono.
21
+ * Todos los campos son opcionales: un caller que no los manda abre el asiento igual, incompleto.
25
22
  */
26
23
  class WelcomeAccreditationRequest {
27
24
  }
@@ -29,7 +26,7 @@ exports.WelcomeAccreditationRequest = WelcomeAccreditationRequest;
29
26
  __decorate([
30
27
  (0, class_transformer_1.Expose)(),
31
28
  (0, class_validator_1.IsOptional)(),
32
- trim(),
29
+ (0, Trim_1.Trim)(),
33
30
  (0, class_validator_1.IsString)(),
34
31
  (0, class_validator_1.IsNotEmpty)(),
35
32
  __metadata("design:type", String)
@@ -37,7 +34,7 @@ __decorate([
37
34
  __decorate([
38
35
  (0, class_transformer_1.Expose)(),
39
36
  (0, class_validator_1.IsOptional)(),
40
- trim(),
37
+ (0, Trim_1.Trim)(),
41
38
  (0, class_validator_1.IsString)(),
42
39
  (0, class_validator_1.IsNotEmpty)(),
43
40
  __metadata("design:type", String)
@@ -45,7 +42,7 @@ __decorate([
45
42
  __decorate([
46
43
  (0, class_transformer_1.Expose)(),
47
44
  (0, class_validator_1.IsOptional)(),
48
- trim(),
45
+ (0, Trim_1.Trim)(),
49
46
  (0, class_validator_1.IsString)(),
50
47
  (0, class_validator_1.IsNotEmpty)(),
51
48
  __metadata("design:type", String)
@@ -53,7 +50,7 @@ __decorate([
53
50
  __decorate([
54
51
  (0, class_transformer_1.Expose)(),
55
52
  (0, class_validator_1.IsOptional)(),
56
- trim(),
53
+ (0, Trim_1.Trim)(),
57
54
  (0, class_validator_1.IsString)(),
58
55
  (0, class_validator_1.IsNotEmpty)(),
59
56
  __metadata("design:type", String)
@@ -61,7 +58,7 @@ __decorate([
61
58
  __decorate([
62
59
  (0, class_transformer_1.Expose)(),
63
60
  (0, class_validator_1.IsOptional)(),
64
- trim(),
61
+ (0, Trim_1.Trim)(),
65
62
  (0, class_validator_1.IsString)(),
66
63
  (0, class_validator_1.IsNotEmpty)(),
67
64
  __metadata("design:type", String)
@@ -69,7 +66,7 @@ __decorate([
69
66
  __decorate([
70
67
  (0, class_transformer_1.Expose)(),
71
68
  (0, class_validator_1.IsOptional)(),
72
- trim(),
69
+ (0, Trim_1.Trim)(),
73
70
  (0, class_validator_1.IsString)(),
74
71
  (0, class_validator_1.IsNotEmpty)(),
75
72
  __metadata("design:type", String)
@@ -84,7 +81,7 @@ __decorate([
84
81
  __decorate([
85
82
  (0, class_transformer_1.Expose)(),
86
83
  (0, class_validator_1.IsOptional)(),
87
- trim(),
84
+ (0, Trim_1.Trim)(),
88
85
  (0, class_validator_1.IsString)(),
89
86
  (0, class_validator_1.IsNotEmpty)(),
90
87
  __metadata("design:type", String)
@@ -98,7 +95,7 @@ __decorate([
98
95
  __decorate([
99
96
  (0, class_transformer_1.Expose)(),
100
97
  (0, class_validator_1.IsOptional)(),
101
- trim(),
98
+ (0, Trim_1.Trim)(),
102
99
  (0, class_validator_1.IsString)(),
103
100
  (0, class_validator_1.IsNotEmpty)(),
104
101
  __metadata("design:type", String)
@@ -106,7 +103,7 @@ __decorate([
106
103
  __decorate([
107
104
  (0, class_transformer_1.Expose)(),
108
105
  (0, class_validator_1.IsOptional)(),
109
- trim(),
106
+ (0, Trim_1.Trim)(),
110
107
  (0, class_validator_1.IsString)(),
111
108
  (0, class_validator_1.IsNotEmpty)(),
112
109
  __metadata("design:type", String)
@@ -6,12 +6,20 @@ import { WelcomeBonusStatusEnum } from '../../enums/WelcomeBonusStatusEnum';
6
6
  * `FAILED` libera el candado `welcomeAccredited` para que la venta se reintente. `UNVERIFIED` lo deja
7
7
  * tomado: el `walletFundingCredit` del processor no deduplica, así que liberar tras un timeout podría
8
8
  * acreditar plata real dos veces.
9
+ *
10
+ * Un asiento `UNVERIFIED` se cierra después con `ACCREDITED` o `FAILED` mandando además `reconciledBy`
11
+ * y `reconciliationReason` — ese par es lo que marca el cierre como reconciliación.
9
12
  */
10
13
  export declare class WelcomeAccreditationResultRequest {
11
14
  /** Referencia opaca del asiento, tal como la devolvió la reserva. */
12
15
  bonusKey: string;
13
16
  status: WelcomeBonusStatusEnum;
14
17
  processorTransactionId?: string;
18
+ /** Motivo legible del fallo — un resumen, NO el payload crudo del processor (el libro va sin PII). */
15
19
  failReason?: string;
16
20
  providerName?: string;
21
+ /** Quién cierra a mano un asiento `UNVERIFIED`. Va junto con `reconciliationReason`. */
22
+ reconciledBy?: string;
23
+ /** Por qué se cerró a mano — un resumen, NO el payload crudo del processor. */
24
+ reconciliationReason?: string;
17
25
  }
@@ -12,9 +12,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.WelcomeAccreditationResultRequest = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
+ const Trim_1 = require("../../../common/decorators/Trim");
15
16
  const WelcomeBonusStatusEnum_1 = require("../../enums/WelcomeBonusStatusEnum");
16
- /** Recorta los strings del borde: un valor con espacios ensucia claves y cortes de conciliación. */
17
- const trim = () => (0, class_transformer_1.Transform)(({ value }) => (typeof value === 'string' ? value.trim() : value));
17
+ /** Tope de los textos libres que el caller escribe en el asiento. */
18
+ const FREE_TEXT_MAX_LENGTH = 256;
18
19
  /** Resultados que el caller puede asentar. `PENDING` lo escribe el server al reservar, no el caller. */
19
20
  const RESULT_STATUSES = [
20
21
  WelcomeBonusStatusEnum_1.WelcomeBonusStatusEnum.ACCREDITED,
@@ -33,13 +34,16 @@ const STATUSES_REQUIRING_REASON = [
33
34
  * `FAILED` libera el candado `welcomeAccredited` para que la venta se reintente. `UNVERIFIED` lo deja
34
35
  * tomado: el `walletFundingCredit` del processor no deduplica, así que liberar tras un timeout podría
35
36
  * acreditar plata real dos veces.
37
+ *
38
+ * Un asiento `UNVERIFIED` se cierra después con `ACCREDITED` o `FAILED` mandando además `reconciledBy`
39
+ * y `reconciliationReason` — ese par es lo que marca el cierre como reconciliación.
36
40
  */
37
41
  class WelcomeAccreditationResultRequest {
38
42
  }
39
43
  exports.WelcomeAccreditationResultRequest = WelcomeAccreditationResultRequest;
40
44
  __decorate([
41
45
  (0, class_transformer_1.Expose)(),
42
- trim(),
46
+ (0, Trim_1.Trim)(),
43
47
  (0, class_validator_1.IsString)(),
44
48
  (0, class_validator_1.IsNotEmpty)(),
45
49
  __metadata("design:type", String)
@@ -52,7 +56,7 @@ __decorate([
52
56
  __decorate([
53
57
  (0, class_transformer_1.Expose)(),
54
58
  (0, class_validator_1.ValidateIf)((o) => o.status === WelcomeBonusStatusEnum_1.WelcomeBonusStatusEnum.ACCREDITED),
55
- trim(),
59
+ (0, Trim_1.Trim)(),
56
60
  (0, class_validator_1.IsString)(),
57
61
  (0, class_validator_1.IsNotEmpty)({ message: 'processorTransactionId es obligatorio cuando status es ACCREDITED' }),
58
62
  __metadata("design:type", String)
@@ -60,16 +64,35 @@ __decorate([
60
64
  __decorate([
61
65
  (0, class_transformer_1.Expose)(),
62
66
  (0, class_validator_1.ValidateIf)((o) => STATUSES_REQUIRING_REASON.includes(o.status)),
63
- trim(),
67
+ (0, Trim_1.Trim)(),
64
68
  (0, class_validator_1.IsString)(),
65
69
  (0, class_validator_1.IsNotEmpty)({ message: 'failReason es obligatorio cuando status es FAILED o UNVERIFIED' }),
70
+ (0, class_validator_1.MaxLength)(FREE_TEXT_MAX_LENGTH),
66
71
  __metadata("design:type", String)
67
72
  ], WelcomeAccreditationResultRequest.prototype, "failReason", void 0);
68
73
  __decorate([
69
74
  (0, class_transformer_1.Expose)(),
70
75
  (0, class_validator_1.IsOptional)(),
71
- trim(),
76
+ (0, Trim_1.Trim)(),
72
77
  (0, class_validator_1.IsString)(),
73
78
  (0, class_validator_1.IsNotEmpty)(),
74
79
  __metadata("design:type", String)
75
80
  ], WelcomeAccreditationResultRequest.prototype, "providerName", void 0);
81
+ __decorate([
82
+ (0, class_transformer_1.Expose)(),
83
+ (0, class_validator_1.ValidateIf)((o) => o.reconciliationReason !== undefined),
84
+ (0, Trim_1.Trim)(),
85
+ (0, class_validator_1.IsString)(),
86
+ (0, class_validator_1.IsNotEmpty)({ message: 'reconciledBy es obligatorio en un cierre de reconciliación' }),
87
+ (0, class_validator_1.MaxLength)(FREE_TEXT_MAX_LENGTH),
88
+ __metadata("design:type", String)
89
+ ], WelcomeAccreditationResultRequest.prototype, "reconciledBy", void 0);
90
+ __decorate([
91
+ (0, class_transformer_1.Expose)(),
92
+ (0, class_validator_1.ValidateIf)((o) => o.reconciledBy !== undefined),
93
+ (0, Trim_1.Trim)(),
94
+ (0, class_validator_1.IsString)(),
95
+ (0, class_validator_1.IsNotEmpty)({ message: 'reconciliationReason es obligatorio en un cierre de reconciliación' }),
96
+ (0, class_validator_1.MaxLength)(FREE_TEXT_MAX_LENGTH),
97
+ __metadata("design:type", String)
98
+ ], WelcomeAccreditationResultRequest.prototype, "reconciliationReason", void 0);
@@ -31,6 +31,10 @@ export interface WelcomeBonusResponse {
31
31
  failReason: string | null;
32
32
  requestedAt: string;
33
33
  resolvedAt: string | null;
34
+ /** Instante del cierre de reconciliación. No nulo = el asiento se cerró a mano, no por el flujo. */
35
+ reconciledAt: string | null;
36
+ reconciledBy: string | null;
37
+ reconciliationReason: string | null;
34
38
  processorTransactionId: string | null;
35
39
  idempotencyKey: string | null;
36
40
  providerName: string | null;
@@ -22,10 +22,15 @@ export interface WizardBlocked {
22
22
  since: string;
23
23
  }
24
24
  /**
25
- * Lo mínimo del bloqueo que necesita la ficha de Prospectos: la etiqueta y el «hace N días». Deja
26
- * fuera `code` y `detail`, que son de soporte y admin.
25
+ * Lo del bloqueo que puede viajar al navegador del vendedor: qué pantalla toca, la etiqueta y el
26
+ * «hace N días». Deja fuera `code` y `detail`, que son de soporte y admin.
27
27
  */
28
28
  export interface WizardBlockedSummary {
29
+ /**
30
+ * Cuál de las dos pantallas del paso 02 toca: la espera, o «no se pudo abrir». Opcional: la ficha
31
+ * de Prospectos no lo manda, y un consumidor que no lo conoce sigue leyendo `category`.
32
+ */
33
+ reason?: BlockedReasonEnum;
29
34
  category: BlockedCategoryEnum | null;
30
35
  /** ISO 8601, copiado tal cual de `WizardBlocked.since`. */
31
36
  since: string;
@@ -4,7 +4,7 @@ import type { FiadoPhoneStatusEnum } from '../enums/FiadoPhoneStatusEnum';
4
4
  import type { PaymentMethodEnum } from '../enums/PaymentMethodEnum';
5
5
  import type { ExternalProviderEnum } from '../enums/ExternalProviderEnum';
6
6
  import type { OccupationEnum } from '../enums/OccupationEnum';
7
- import type { WizardBlocked } from './WizardBlocked';
7
+ import type { WizardBlockedSummary } from './WizardBlocked';
8
8
  import type { WizardConsents } from './WizardConsents';
9
9
  import type { WizardLoan } from './WizardLoan';
10
10
  import type { WizardPayment } from './WizardPayment';
@@ -94,12 +94,11 @@ export interface WizardSession {
94
94
  accountOpened: boolean;
95
95
  accountStatus: AccountStatus | null;
96
96
  /**
97
- * La venta está detenida esperando la cuenta. Es un campo y no un estado: `state` sigue `ACTIVE`,
98
- * así el retorno, las mutaciones del paso 10 y los barridos de mantenimiento siguen corriendo.
99
- *
100
- * Opcional por lo mismo que `resumeOtpRequired`. Ausente o `null` = la venta va bien.
97
+ * La venta está detenida esperando la cuenta. Resumen y no el bloqueo entero: el motivo crudo del
98
+ * emisor puede nombrar una coincidencia en listas de PLD, y avisarlo es delito se sirve por su
99
+ * propio endpoint con permiso. Ausente o `null` = la venta va bien.
101
100
  */
102
- blocked?: WizardBlocked | null;
101
+ blocked?: WizardBlockedSummary | null;
103
102
  reservedSku: string | null;
104
103
  reservedImei: string | null;
105
104
  /**
@@ -12,4 +12,6 @@ export declare class CreateProspectRequest {
12
12
  freeReason?: string;
13
13
  nextContactAt?: string;
14
14
  notes?: string;
15
+ /** La venta de la que sale el prospecto: el único camino de vuelta del prospecto a su sesión. */
16
+ wizardSessionId?: string;
15
17
  }
@@ -65,3 +65,9 @@ __decorate([
65
65
  (0, class_validator_1.MaxLength)(200),
66
66
  __metadata("design:type", String)
67
67
  ], CreateProspectRequest.prototype, "notes", void 0);
68
+ __decorate([
69
+ (0, class_transformer_1.Expose)(),
70
+ (0, class_validator_1.IsOptional)(),
71
+ (0, class_validator_1.IsString)(),
72
+ __metadata("design:type", String)
73
+ ], CreateProspectRequest.prototype, "wizardSessionId", void 0);
@@ -1,5 +1,8 @@
1
1
  /**
2
- * Motivo por el que un cliente quedó como prospecto (15 valores, filtrados por paso).
2
+ * Motivo por el que un cliente quedó como prospecto, filtrados por paso.
3
+ *
4
+ * Los primeros quince son objeciones del CLIENTE y los elige el vendedor. Los dos últimos los pone
5
+ * el sistema cuando la venta se traba por la cuenta: no se ofrecen en el desplegable ni se editan.
3
6
  * SureKeep Fase 2 — pista Retail.
4
7
  */
5
8
  export declare enum PendingReasonEnum {
@@ -17,5 +20,14 @@ export declare enum PendingReasonEnum {
17
20
  CONTRACT_DOUBTS = "CONTRACT_DOUBTS",
18
21
  DEVICE_ISSUE = "DEVICE_ISSUE",
19
22
  CLIENT_THINKING = "CLIENT_THINKING",
20
- OTHER = "OTHER"
23
+ OTHER = "OTHER",
24
+ /**
25
+ * La cuenta espera a que una persona la revise. Nunca nombra el área ni la causa: decir que hubo
26
+ * coincidencia en una lista de PLD es aviso indebido.
27
+ */
28
+ ACCOUNT_UNDER_REVIEW = "ACCOUNT_UNDER_REVIEW",
29
+ /** La cuenta no abrió por un dato del expediente o una falla del proveedor. */
30
+ ACCOUNT_OPEN_FAILED = "ACCOUNT_OPEN_FAILED"
21
31
  }
32
+ /** Los que pone el sistema al trabarse la venta: no se ofrecen al vendedor ni se pueden editar. */
33
+ export declare const SYSTEM_PENDING_REASONS: readonly PendingReasonEnum[];
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PendingReasonEnum = void 0;
3
+ exports.SYSTEM_PENDING_REASONS = exports.PendingReasonEnum = void 0;
4
4
  /**
5
- * Motivo por el que un cliente quedó como prospecto (15 valores, filtrados por paso).
5
+ * Motivo por el que un cliente quedó como prospecto, filtrados por paso.
6
+ *
7
+ * Los primeros quince son objeciones del CLIENTE y los elige el vendedor. Los dos últimos los pone
8
+ * el sistema cuando la venta se traba por la cuenta: no se ofrecen en el desplegable ni se editan.
6
9
  * SureKeep Fase 2 — pista Retail.
7
10
  */
8
11
  var PendingReasonEnum;
@@ -22,4 +25,16 @@ var PendingReasonEnum;
22
25
  PendingReasonEnum["DEVICE_ISSUE"] = "DEVICE_ISSUE";
23
26
  PendingReasonEnum["CLIENT_THINKING"] = "CLIENT_THINKING";
24
27
  PendingReasonEnum["OTHER"] = "OTHER";
28
+ /**
29
+ * La cuenta espera a que una persona la revise. Nunca nombra el área ni la causa: decir que hubo
30
+ * coincidencia en una lista de PLD es aviso indebido.
31
+ */
32
+ PendingReasonEnum["ACCOUNT_UNDER_REVIEW"] = "ACCOUNT_UNDER_REVIEW";
33
+ /** La cuenta no abrió por un dato del expediente o una falla del proveedor. */
34
+ PendingReasonEnum["ACCOUNT_OPEN_FAILED"] = "ACCOUNT_OPEN_FAILED";
25
35
  })(PendingReasonEnum || (exports.PendingReasonEnum = PendingReasonEnum = {}));
36
+ /** Los que pone el sistema al trabarse la venta: no se ofrecen al vendedor ni se pueden editar. */
37
+ exports.SYSTEM_PENDING_REASONS = [
38
+ PendingReasonEnum.ACCOUNT_UNDER_REVIEW,
39
+ PendingReasonEnum.ACCOUNT_OPEN_FAILED,
40
+ ];
@@ -1,22 +1,68 @@
1
1
  /**
2
- * Response del endpoint `POST /wallet-funding/limit` (processor).
2
+ * Response del endpoint de limites de wallet funding.
3
3
  *
4
- * Reporta el cap mensual del nivel del usuario (en MXN) y cuanto le queda
5
- * disponible este mes, para que el wallet-app pueda mostrar "Disponible este
6
- * mes: $X" antes de que el usuario haga cualquier deposito.
4
+ * Lo consume el wallet-app para decirle al usuario cuanto puede fondear ANTES
5
+ * de que vaya a la tienda. Hay dos topes distintos que lo pueden frenar, y el
6
+ * usuario tiene derecho a saber cual — asi que cada uno viaja en su propia
7
+ * propiedad en vez de colapsarlos en un solo numero:
7
8
  *
8
- * Semantica de los campos opcionales:
9
- * - `monthlyLimit === undefined` el nivel del usuario es ILIMITADO (el
10
- * accountLevel tiene `maxMonthlyIncomingAmount = 0` en UDIs). En ese caso
11
- * `remainingAmount` tambien viene undefined; el front muestra "Sin limite".
12
- * - `monthlyLimit` definido → hay cap. `remainingAmount = max(0, monthlyLimit
13
- * − monthlyConsumed)`. Si el usuario ya copo el cap, `remainingAmount = 0`.
9
+ * 1. TOPE DEL NIVEL DE CUENTA (`monthly*`) — regulatorio (CFPE / Contrato
10
+ * EDM). Cubre TODAS las entradas del usuario: P2P, SPEI, Pomelo y tambien
11
+ * el cash-in. Es el TECHO: nada puede pasarlo.
14
12
  *
15
- * `currency` siempre presente (default "MXN").
13
+ * 2. TOPE DE CASH IN (`cashIn*`) — decision de negocio Fiado, por cliente y
14
+ * por mes calendario. Dice cuanto de ese techo puede venir por efectivo en
15
+ * tienda. NO lo reemplaza: es un sub-limite dentro de el.
16
+ *
17
+ * El cap AGREGADO de exposicion FSA no se reporta aca: es global, no un limite
18
+ * personal del usuario. Si el servicio esta suspendido se comunica por otra via.
19
+ *
20
+ * `availableToFund` es la respuesta a "cuanto puedo depositar ahora": el MENOR
21
+ * de los dos, ya descontando lo pendiente. Es el unico numero que el front
22
+ * necesita para habilitar o bloquear; los demas sirven para explicar POR QUE,
23
+ * que es lo que evita el ticket de soporte.
24
+ *
25
+ * Compatibilidad: los cuatro campos originales conservan su semantica exacta.
26
+ * Los nuevos son opcionales — un caller viejo sigue funcionando igual.
16
27
  */
17
28
  export declare class GetWalletFundingLimitResponse {
29
+ /**
30
+ * Tope mensual de ENTRADAS del nivel de cuenta, en MXN.
31
+ * `undefined` = nivel ilimitado (`maxMonthlyIncomingAmount = 0` en UDIs);
32
+ * el front muestra "Sin limite".
33
+ */
18
34
  monthlyLimit?: number;
35
+ /** Entradas ya recibidas este mes por CUALQUIER via, no solo cash-in. */
19
36
  monthlyConsumed?: number;
37
+ /** `max(0, monthlyLimit − monthlyConsumed)`. `undefined` si no hay tope. */
20
38
  remainingAmount?: number;
39
+ /** Tope mensual de cash-in por cliente, en MXN. */
40
+ cashInMonthlyLimit?: number;
41
+ /** Cash-in ya ACREDITADO al cliente este mes. */
42
+ cashInMonthlyConsumed?: number;
43
+ /**
44
+ * Cash-in AUTORIZADO pero todavia no acreditado (pagos en verificacion).
45
+ *
46
+ * Cuenta contra el disponible aunque aun no toque el saldo: el cliente ya
47
+ * entrego ese efectivo en la caja y el dinero esta comprometido. Sin esto,
48
+ * en la ventana entre autorizar y acreditar el usuario veria un disponible
49
+ * inflado y podria pasarse del tope.
50
+ */
51
+ cashInMonthlyPending?: number;
52
+ /** `max(0, cashInMonthlyLimit − consumido − pendiente)`. */
53
+ cashInRemainingAmount?: number;
54
+ /**
55
+ * Cuanto puede fondear el usuario AHORA por cash-in: el menor entre
56
+ * `remainingAmount` y `cashInRemainingAmount`.
57
+ *
58
+ * Es el numero que el front debe usar para habilitar o bloquear el flujo.
59
+ */
60
+ availableToFund?: number;
61
+ /**
62
+ * Que tope esta limitando: `ACCOUNT_LEVEL` (el regulatorio del nivel) o
63
+ * `CASH_IN` (el de negocio). Permite explicarle al usuario por que no puede
64
+ * depositar mas, en vez de mostrarle un cero sin razon.
65
+ */
66
+ limitedBy?: "ACCOUNT_LEVEL" | "CASH_IN";
21
67
  currency: string;
22
68
  }
@@ -2,20 +2,31 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.GetWalletFundingLimitResponse = void 0;
4
4
  /**
5
- * Response del endpoint `POST /wallet-funding/limit` (processor).
5
+ * Response del endpoint de limites de wallet funding.
6
6
  *
7
- * Reporta el cap mensual del nivel del usuario (en MXN) y cuanto le queda
8
- * disponible este mes, para que el wallet-app pueda mostrar "Disponible este
9
- * mes: $X" antes de que el usuario haga cualquier deposito.
7
+ * Lo consume el wallet-app para decirle al usuario cuanto puede fondear ANTES
8
+ * de que vaya a la tienda. Hay dos topes distintos que lo pueden frenar, y el
9
+ * usuario tiene derecho a saber cual — asi que cada uno viaja en su propia
10
+ * propiedad en vez de colapsarlos en un solo numero:
10
11
  *
11
- * Semantica de los campos opcionales:
12
- * - `monthlyLimit === undefined` el nivel del usuario es ILIMITADO (el
13
- * accountLevel tiene `maxMonthlyIncomingAmount = 0` en UDIs). En ese caso
14
- * `remainingAmount` tambien viene undefined; el front muestra "Sin limite".
15
- * - `monthlyLimit` definido → hay cap. `remainingAmount = max(0, monthlyLimit
16
- * − monthlyConsumed)`. Si el usuario ya copo el cap, `remainingAmount = 0`.
12
+ * 1. TOPE DEL NIVEL DE CUENTA (`monthly*`) — regulatorio (CFPE / Contrato
13
+ * EDM). Cubre TODAS las entradas del usuario: P2P, SPEI, Pomelo y tambien
14
+ * el cash-in. Es el TECHO: nada puede pasarlo.
17
15
  *
18
- * `currency` siempre presente (default "MXN").
16
+ * 2. TOPE DE CASH IN (`cashIn*`) — decision de negocio Fiado, por cliente y
17
+ * por mes calendario. Dice cuanto de ese techo puede venir por efectivo en
18
+ * tienda. NO lo reemplaza: es un sub-limite dentro de el.
19
+ *
20
+ * El cap AGREGADO de exposicion FSA no se reporta aca: es global, no un limite
21
+ * personal del usuario. Si el servicio esta suspendido se comunica por otra via.
22
+ *
23
+ * `availableToFund` es la respuesta a "cuanto puedo depositar ahora": el MENOR
24
+ * de los dos, ya descontando lo pendiente. Es el unico numero que el front
25
+ * necesita para habilitar o bloquear; los demas sirven para explicar POR QUE,
26
+ * que es lo que evita el ticket de soporte.
27
+ *
28
+ * Compatibilidad: los cuatro campos originales conservan su semantica exacta.
29
+ * Los nuevos son opcionales — un caller viejo sigue funcionando igual.
19
30
  */
20
31
  class GetWalletFundingLimitResponse {
21
32
  }