@fiado/type-kit 3.218.0 → 3.220.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 (31) hide show
  1. package/_test_/unit/kyc/IsKycStepStatusByStep.test.ts +86 -0
  2. package/_test_/unit/kyc/KycStepCompletedV1.test.ts +239 -0
  3. package/_test_/unit/kyc/applyKycStep.test.ts +75 -0
  4. package/bin/benefitCenter/enums/BenefitFlowEnum.d.ts +11 -0
  5. package/bin/benefitCenter/enums/BenefitFlowEnum.js +15 -0
  6. package/bin/kyc/enums/KycSubCheckNameEnum.d.ts +32 -0
  7. package/bin/kyc/enums/KycSubCheckNameEnum.js +39 -0
  8. package/bin/kyc/events/KycStepCompletedV1.d.ts +85 -0
  9. package/bin/kyc/events/KycStepCompletedV1.js +93 -0
  10. package/bin/kyc/helpers/applyKycStep.d.ts +26 -0
  11. package/bin/kyc/helpers/applyKycStep.js +30 -0
  12. package/bin/kyc/index.d.ts +4 -0
  13. package/bin/kyc/index.js +6 -0
  14. package/bin/kyc/validators/IsKycStepStatusByStep.d.ts +26 -0
  15. package/bin/kyc/validators/IsKycStepStatusByStep.js +64 -0
  16. package/bin/loanConfig/enums/ModifiableByRoleEnum.d.ts +11 -0
  17. package/bin/loanConfig/enums/ModifiableByRoleEnum.js +15 -0
  18. package/bin/places/dtos/CashInFeeDto.d.ts +17 -0
  19. package/bin/places/dtos/CashInFeeDto.js +12 -0
  20. package/bin/platformRbac/dtos/ResendOtpRequest.d.ts +22 -0
  21. package/bin/platformRbac/dtos/ResendOtpRequest.js +36 -0
  22. package/bin/platformRbac/dtos/ResendSelfRegisterOtpRequest.d.ts +11 -0
  23. package/bin/platformRbac/dtos/ResendSelfRegisterOtpRequest.js +36 -0
  24. package/bin/retailWizard/dtos/responses/KycPrepareResponse.d.ts +6 -0
  25. package/package.json +1 -1
  26. package/src/kyc/enums/KycSubCheckNameEnum.ts +36 -0
  27. package/src/kyc/events/KycStepCompletedV1.ts +105 -0
  28. package/src/kyc/helpers/applyKycStep.ts +36 -0
  29. package/src/kyc/index.ts +8 -0
  30. package/src/kyc/validators/IsKycStepStatusByStep.ts +57 -0
  31. package/src/retailWizard/dtos/responses/KycPrepareResponse.ts +6 -0
@@ -0,0 +1,36 @@
1
+ import { KycSubChecks } from '../dtos/KycSubChecks';
2
+ import { KycSubCheckNameEnum } from '../enums/KycSubCheckNameEnum';
3
+ import { KycSubCheckStatusEnum } from '../enums/KycSubCheckStatusEnum';
4
+ import { KycWatchlistStatusEnum } from '../enums/KycWatchlistStatusEnum';
5
+
6
+ /**
7
+ * Asienta el resultado de UNA estación (`KycStepCompletedV1`) sobre el progreso acumulado de la
8
+ * verificación, y devuelve un objeto NUEVO — no muta el que recibe.
9
+ *
10
+ * **Por qué esto vive en la lib y no en cada consumidor:** la asignación obvia
11
+ * `progreso[evento.step] = evento.status` **no compila**. Todos los campos de `KycSubChecks` son
12
+ * opcionales, así que al escribir a través de una llave-unión TypeScript exige el tipo intersección
13
+ * de todas las propiedades, que colapsa a `undefined` (TS2322). El consumidor que se topa con eso
14
+ * lo resuelve con `(progreso as Record<string, string>)[step] = status`, y ese cast desactiva
15
+ * justamente el cruce estación ↔ vocabulario que `IsKycStepStatusByStep` acaba de defender: un
16
+ * `watchlists: 'FAIL'` armado en memoria ya no lo detiene nadie.
17
+ *
18
+ * Concentrar el cast acá lo deja en UN solo lugar auditado, en vez de replicado en cada repo que
19
+ * consuma el evento. La seguridad real viene de haber validado el evento en el boundary; este helper
20
+ * solo evita que cada consumidor reinvente el atajo inseguro.
21
+ *
22
+ * ⚠️ NO valida la coherencia estación ↔ status: eso ya lo hizo el DTO en el boundary. Si se le pasa
23
+ * un par incoherente a mano, lo escribe — igual que lo haría el cast que reemplaza.
24
+ *
25
+ * SureKeep Fase 2 — progreso del KYC estación por estación.
26
+ */
27
+ export function applyKycStep(
28
+ progreso: KycSubChecks | undefined,
29
+ step: KycSubCheckNameEnum,
30
+ status: KycSubCheckStatusEnum | KycWatchlistStatusEnum,
31
+ ): KycSubChecks {
32
+ // El único cast del ecosistema para escribir por llave dinámica sobre `KycSubChecks`.
33
+ const siguiente = { ...(progreso ?? {}) } as Record<string, string>;
34
+ siguiente[step] = status;
35
+ return siguiente as KycSubChecks;
36
+ }
package/src/kyc/index.ts CHANGED
@@ -3,10 +3,17 @@
3
3
  export * from './enums/KycVerificationStatusEnum';
4
4
  export * from './enums/KycSubCheckStatusEnum';
5
5
  export * from './enums/KycWatchlistStatusEnum';
6
+ export * from './enums/KycSubCheckNameEnum';
6
7
 
7
8
  // Sub-pasos descompuestos (SureKeep F2)
8
9
  export * from './dtos/KycSubChecks';
9
10
 
11
+ // Validators
12
+ export * from './validators/IsKycStepStatusByStep';
13
+
14
+ // Helpers
15
+ export * from './helpers/applyKycStep';
16
+
10
17
  // Domicilio del INE normalizado por places (SureKeep F2)
11
18
  export * from './dtos/KycAddress';
12
19
 
@@ -16,3 +23,4 @@ export * from './dtos/responses/KycByDirectoryResponse';
16
23
 
17
24
  // Events
18
25
  export * from './events/KycVerificationChangedV1';
26
+ export * from './events/KycStepCompletedV1';
@@ -0,0 +1,57 @@
1
+ import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments } from 'class-validator';
2
+ import { KycSubCheckNameEnum, KYC_WATCHLIST_STEPS } from '../enums/KycSubCheckNameEnum';
3
+ import { KycSubCheckStatusEnum } from '../enums/KycSubCheckStatusEnum';
4
+ import { KycWatchlistStatusEnum } from '../enums/KycWatchlistStatusEnum';
5
+
6
+ const VALORES_LISTA: readonly string[] = Object.values(KycWatchlistStatusEnum);
7
+ const VALORES_BINARIO: readonly string[] = Object.values(KycSubCheckStatusEnum);
8
+
9
+ /**
10
+ * Valida que el `status` de un `KycStepCompletedV1` pertenezca al vocabulario de SU estación:
11
+ * las de lista hablan `CLEAR`/`HIT`, las binarias `PASS`/`FAIL`.
12
+ *
13
+ * **Por qué un validador y no un `@IsIn` con los cuatro valores:** un `@IsIn(['PASS','FAIL','CLEAR','HIT'])`
14
+ * aceptaría `{ step: 'watchlists', status: 'FAIL' }`. Eso rompe el matiz que `KycWatchlistStatusEnum`
15
+ * existe para proteger — un HIT **no es un fallo**, es "que lo mire cumplimiento". Con ese evento
16
+ * colado, el consumidor lo escribiría en el progreso y la pantalla del vendedor marcaría como falla
17
+ * algo que solo requiere revisión. El candado del anidado (`KycSubChecks`) tiene que valer igual
18
+ * cuando la estación viaja suelta.
19
+ *
20
+ * Es la misma razón por la que `KycSubChecks` tipa cada campo a su enum en vez de a un string.
21
+ *
22
+ * Uso:
23
+ * ```ts
24
+ * @Validate(IsKycStepStatusByStep)
25
+ * status!: KycSubCheckStatusEnum | KycWatchlistStatusEnum;
26
+ * ```
27
+ *
28
+ * SureKeep Fase 2 — progreso del KYC estación por estación.
29
+ */
30
+ @ValidatorConstraint({ name: 'IsKycStepStatusByStep', async: false })
31
+ export class IsKycStepStatusByStep implements ValidatorConstraintInterface {
32
+ validate(value: unknown, args: ValidationArguments): boolean {
33
+ if (typeof value !== 'string') return false;
34
+
35
+ const step = (args.object as { step?: unknown }).step;
36
+
37
+ // Un `step` fuera del enum ya falla por su propio `@IsEnum`. Acá se rechaza igual en vez de
38
+ // dejar pasar el status: sin estación conocida no hay vocabulario contra el cual validar.
39
+ if (!Object.values(KycSubCheckNameEnum).includes(step as KycSubCheckNameEnum)) return false;
40
+
41
+ return KYC_WATCHLIST_STEPS.includes(step as KycSubCheckNameEnum)
42
+ ? VALORES_LISTA.includes(value)
43
+ : VALORES_BINARIO.includes(value);
44
+ }
45
+
46
+ defaultMessage(args: ValidationArguments): string {
47
+ const step = (args.object as { step?: unknown }).step;
48
+
49
+ if (KYC_WATCHLIST_STEPS.includes(step as KycSubCheckNameEnum)) {
50
+ return `status de la estación ${String(step)} debe ser ${VALORES_LISTA.join(' o ')} (un HIT no es un fallo)`;
51
+ }
52
+ if (Object.values(KycSubCheckNameEnum).includes(step as KycSubCheckNameEnum)) {
53
+ return `status de la estación ${String(step)} debe ser ${VALORES_BINARIO.join(' o ')}`;
54
+ }
55
+ return 'status no se puede validar sin un step reconocido';
56
+ }
57
+ }
@@ -23,6 +23,12 @@ export interface KycSdkMetadata {
23
23
  phoneNumber: string;
24
24
  typeOfDocumentId?: string;
25
25
  isPartial?: boolean;
26
+ /**
27
+ * Idioma con el que Metamap fija el flujo del widget. El wizard lo manda como `'es'` para que
28
+ * la verificación salga en español por defecto (si no viaja, Metamap arranca en su default, inglés).
29
+ * Va opcional en el tipo porque es un ajuste de presentación del SDK, no parte de la correlación.
30
+ */
31
+ fixedLanguage?: string;
26
32
  customInput?: boolean;
27
33
  userPhotoLink?: string;
28
34
  userPhotoLinkHash?: string;