@fiado/type-kit 3.200.0 → 3.202.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 (35) hide show
  1. package/_test_/unit/auth/SignUpProspectRequest.test.ts +32 -0
  2. package/_test_/unit/auth/SignUpProspectResponse.test.ts +26 -0
  3. package/_test_/unit/kyc/KycByDirectoryResponse.test.ts +139 -0
  4. package/_test_/unit/kyc/KycVerificationChangedV1.test.ts +99 -0
  5. package/_test_/unit/messagesConnector/SendMessageRequest.test.ts +48 -0
  6. package/bin/auth/dtos/SignUpProspectRequest.d.ts +15 -0
  7. package/bin/auth/dtos/SignUpProspectRequest.js +44 -0
  8. package/bin/auth/dtos/SignUpProspectResponse.d.ts +11 -0
  9. package/bin/auth/dtos/SignUpProspectResponse.js +36 -0
  10. package/bin/auth/index.d.ts +2 -0
  11. package/bin/auth/index.js +2 -0
  12. package/bin/index.d.ts +1 -0
  13. package/bin/index.js +5 -0
  14. package/bin/kyc/dtos/responses/KycByDirectoryResponse.d.ts +49 -0
  15. package/bin/kyc/dtos/responses/KycByDirectoryResponse.js +91 -0
  16. package/bin/kyc/dtos/responses/KycPersonData.d.ts +11 -0
  17. package/bin/kyc/dtos/responses/KycPersonData.js +51 -0
  18. package/bin/kyc/enums/KycVerificationStatusEnum.d.ts +18 -0
  19. package/bin/kyc/enums/KycVerificationStatusEnum.js +22 -0
  20. package/bin/kyc/events/KycVerificationChangedV1.d.ts +35 -0
  21. package/bin/kyc/events/KycVerificationChangedV1.js +76 -0
  22. package/bin/kyc/index.d.ts +4 -0
  23. package/bin/kyc/index.js +24 -0
  24. package/bin/messagesConnector/dtos/SendMessageRequest.js +2 -1
  25. package/package.json +1 -1
  26. package/src/auth/dtos/SignUpProspectRequest.ts +23 -0
  27. package/src/auth/dtos/SignUpProspectResponse.ts +17 -0
  28. package/src/auth/index.ts +2 -0
  29. package/src/index.ts +4 -0
  30. package/src/kyc/dtos/responses/KycByDirectoryResponse.ts +69 -0
  31. package/src/kyc/dtos/responses/KycPersonData.ts +23 -0
  32. package/src/kyc/enums/KycVerificationStatusEnum.ts +18 -0
  33. package/src/kyc/events/KycVerificationChangedV1.ts +51 -0
  34. package/src/kyc/index.ts +10 -0
  35. package/src/messagesConnector/dtos/SendMessageRequest.ts +8 -1
@@ -0,0 +1,32 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { SignUpProspectRequest } from '../../../src/auth/index';
5
+
6
+ describe('SignUpProspectRequest', () => {
7
+ it('acepta un alta válida de prospecto', async () => {
8
+ const dto = plainToInstance(SignUpProspectRequest,
9
+ { name: 'Paulina Garcia', phoneNumber: '5512345678', tenantId: 'surekeep' },
10
+ { excludeExtraneousValues: true });
11
+
12
+ expect(await validate(dto as object)).toHaveLength(0);
13
+ });
14
+
15
+ it('rechaza si falta el tenantId (el hardcode FIADO_BETA es justo lo que se elimina)', async () => {
16
+ const dto = plainToInstance(SignUpProspectRequest,
17
+ { name: 'Paulina Garcia', phoneNumber: '5512345678' },
18
+ { excludeExtraneousValues: true });
19
+
20
+ const errors = await validate(dto as object);
21
+ expect(errors.map((e) => e.property)).toContain('tenantId');
22
+ });
23
+
24
+ it('rechaza campos vacíos en vez de dejarlos pasar', async () => {
25
+ const dto = plainToInstance(SignUpProspectRequest,
26
+ { name: '', phoneNumber: '', tenantId: '' },
27
+ { excludeExtraneousValues: true });
28
+
29
+ const props = (await validate(dto as object)).map((e) => e.property);
30
+ expect(props).toEqual(expect.arrayContaining(['name', 'phoneNumber', 'tenantId']));
31
+ });
32
+ });
@@ -0,0 +1,26 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { SignUpProspectResponse } from '../../../src/auth/index';
5
+
6
+ describe('SignUpProspectResponse', () => {
7
+ it('acepta una respuesta válida con ambos identificadores', async () => {
8
+ const dto = plainToInstance(SignUpProspectResponse,
9
+ { directoryId: 'dir-1', peopleId: 'ppl-1' },
10
+ { excludeExtraneousValues: true });
11
+
12
+ expect(await validate(dto as object)).toHaveLength(0);
13
+ });
14
+
15
+ // DEC-KYC-015: el destino ya demostró devolver strings vacíos. @IsString() pelado los dejaría
16
+ // pasar y la falla aparecería tres pasos río abajo. Candado simétrico sobre los DOS campos —
17
+ // con solo directoryId cubierto se podía quitar el @IsNotEmpty() de peopleId sin ponerse rojo.
18
+ it.each(['directoryId', 'peopleId'])('rechaza %s vacío en vez de dejarlo pasar', async (campo) => {
19
+ const dto = plainToInstance(SignUpProspectResponse,
20
+ { directoryId: 'dir-1', peopleId: 'ppl-1', [campo]: '' },
21
+ { excludeExtraneousValues: true });
22
+
23
+ const errors = await validate(dto as object);
24
+ expect(errors.map((e) => e.property)).toContain(campo);
25
+ });
26
+ });
@@ -0,0 +1,139 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { KycByDirectoryResponse } from '../../../src/kyc/index';
5
+
6
+ describe('KycByDirectoryResponse', () => {
7
+ it('acepta una respuesta completa con datos de persona', async () => {
8
+ const raw = {
9
+ consolidated: 'VERIFIED',
10
+ verificationId: 'ver-1',
11
+ peopleId: 'ppl-1',
12
+ metamapFlowId: 'flow-1',
13
+ verificationStatus: 'COMPLETED',
14
+ verificationResult: 'VERIFIED',
15
+ createDate: '2026-07-21T10:00:00.000Z',
16
+ updateDate: '2026-07-21T10:05:00.000Z',
17
+ person: {
18
+ names: 'PAULINA',
19
+ paternalLastName: 'GARCIA',
20
+ maternalLastName: 'MICHAUS',
21
+ curp: 'GAMP981028MDFRCL08',
22
+ dateOfBirth: '1998-10-28',
23
+ },
24
+ };
25
+
26
+ const dto = plainToInstance(KycByDirectoryResponse, raw, { excludeExtraneousValues: true });
27
+ const errors = await validate(dto as object);
28
+
29
+ expect(errors).toHaveLength(0);
30
+ expect(dto.person?.curp).toBe('GAMP981028MDFRCL08');
31
+ });
32
+
33
+ it('acepta una respuesta sin datos de persona (KYC aún sin completar)', async () => {
34
+ const raw = {
35
+ consolidated: 'PENDING',
36
+ verificationId: 'ver-2',
37
+ peopleId: 'ppl-2',
38
+ verificationStatus: 'IN_PROGRESS',
39
+ verificationResult: 'UNVERIFIED',
40
+ createDate: '2026-07-21T10:00:00.000Z',
41
+ updateDate: '2026-07-21T10:00:00.000Z',
42
+ };
43
+
44
+ const dto = plainToInstance(KycByDirectoryResponse, raw, { excludeExtraneousValues: true });
45
+
46
+ expect(await validate(dto as object)).toHaveLength(0);
47
+ expect(dto.person).toBeUndefined();
48
+ });
49
+
50
+ it('rechaza un verificationStatus fuera del enum', async () => {
51
+ const raw = {
52
+ consolidated: 'VERIFIED', verificationId: 'v', peopleId: 'p',
53
+ verificationStatus: 'INVENTADO', verificationResult: 'VERIFIED',
54
+ createDate: '2026-07-21T10:00:00.000Z', updateDate: '2026-07-21T10:00:00.000Z',
55
+ };
56
+
57
+ const dto = plainToInstance(KycByDirectoryResponse, raw, { excludeExtraneousValues: true });
58
+ const errors = await validate(dto as object);
59
+
60
+ expect(errors.map((e) => e.property)).toContain('verificationStatus');
61
+ });
62
+
63
+ // DEC-KYC-015: el 7.3% de las filas de dev trae peopleId vacío, 5 de ellas COMPLETED.
64
+ // @IsString() lo aceptaría en silencio y la falla aparecería tres pasos más adelante.
65
+ it('rechaza peopleId vacío en vez de dejarlo pasar', async () => {
66
+ const raw = {
67
+ consolidated: 'VERIFIED', verificationId: 'ver-1', peopleId: '',
68
+ verificationStatus: 'COMPLETED', verificationResult: 'VERIFIED',
69
+ createDate: '2026-07-21T10:00:00.000Z', updateDate: '2026-07-21T10:00:00.000Z',
70
+ };
71
+
72
+ const dto = plainToInstance(KycByDirectoryResponse, raw, { excludeExtraneousValues: true });
73
+ const errors = await validate(dto as object);
74
+
75
+ expect(errors.map((e) => e.property)).toContain('peopleId');
76
+ });
77
+
78
+ // DEC-KYC-015: candado simétrico al de peopleId. Sin este caso, alguien puede borrar el
79
+ // @IsNotEmpty() de verificationId y la suite sigue verde.
80
+ it('rechaza verificationId vacío en vez de dejarlo pasar', async () => {
81
+ const raw = {
82
+ consolidated: 'VERIFIED', verificationId: '', peopleId: 'ppl-1',
83
+ verificationStatus: 'COMPLETED', verificationResult: 'VERIFIED',
84
+ createDate: '2026-07-21T10:00:00.000Z', updateDate: '2026-07-21T10:00:00.000Z',
85
+ };
86
+
87
+ const dto = plainToInstance(KycByDirectoryResponse, raw, { excludeExtraneousValues: true });
88
+ const errors = await validate(dto as object);
89
+
90
+ expect(errors.map((e) => e.property)).toContain('verificationId');
91
+ });
92
+
93
+ // DEC-KYC-014: "sin verificación" se responde con 404, NO con un consolidated fuera de
94
+ // RetailKycStatusEnum. Este test es el candado de esa decisión.
95
+ it('rechaza un consolidated fuera de RetailKycStatusEnum (p.ej. el NONE descartado)', async () => {
96
+ const raw = {
97
+ consolidated: 'NONE', verificationId: 'ver-1', peopleId: 'ppl-1',
98
+ verificationStatus: 'COMPLETED', verificationResult: 'VERIFIED',
99
+ createDate: '2026-07-21T10:00:00.000Z', updateDate: '2026-07-21T10:00:00.000Z',
100
+ };
101
+
102
+ const dto = plainToInstance(KycByDirectoryResponse, raw, { excludeExtraneousValues: true });
103
+ const errors = await validate(dto as object);
104
+
105
+ expect(errors.map((e) => e.property)).toContain('consolidated');
106
+ });
107
+
108
+ // DEC-KYC-016: `verificationResult` está acotado a IdentificationDocumentStatus. Sin este
109
+ // candado se puede degradar el campo a @IsString() y la suite sigue verde (antipattern
110
+ // STRING_FOR_ENUM_FIELD). 'COMPLETED' es un valor del OTRO enum — el error de tipeo real.
111
+ it('rechaza un verificationResult que en realidad es un valor de verificationStatus', async () => {
112
+ const raw = {
113
+ consolidated: 'VERIFIED', verificationId: 'ver-1', peopleId: 'ppl-1',
114
+ verificationStatus: 'COMPLETED', verificationResult: 'COMPLETED',
115
+ createDate: '2026-07-21T10:00:00.000Z', updateDate: '2026-07-21T10:00:00.000Z',
116
+ };
117
+
118
+ const dto = plainToInstance(KycByDirectoryResponse, raw, { excludeExtraneousValues: true });
119
+ const errors = await validate(dto as object);
120
+
121
+ expect(errors.map((e) => e.property)).toContain('verificationResult');
122
+ });
123
+
124
+ // El ordenamiento del endpoint (spec §6) se apoya en fechas ISO-8601 léxicamente ordenables.
125
+ // Sin este candado se puede quitar el @IsISO8601() y la suite sigue verde.
126
+ it.each(['createDate', 'updateDate'])('rechaza %s con formato no ISO-8601', async (campo) => {
127
+ const raw = {
128
+ consolidated: 'VERIFIED', verificationId: 'ver-1', peopleId: 'ppl-1',
129
+ verificationStatus: 'COMPLETED', verificationResult: 'VERIFIED',
130
+ createDate: '2026-07-21T10:00:00.000Z', updateDate: '2026-07-21T10:00:00.000Z',
131
+ [campo]: '21/07/2026',
132
+ };
133
+
134
+ const dto = plainToInstance(KycByDirectoryResponse, raw, { excludeExtraneousValues: true });
135
+ const errors = await validate(dto as object);
136
+
137
+ expect(errors.map((e) => e.property)).toContain(campo);
138
+ });
139
+ });
@@ -0,0 +1,99 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { KycVerificationChangedV1 } from '../../../src/kyc/index';
5
+
6
+ describe('KycVerificationChangedV1', () => {
7
+ it('valida el shape que produce el Pipe desde el NewImage', async () => {
8
+ const raw = {
9
+ verificationId: 'ver-1',
10
+ directoryId: 'dir-1',
11
+ peopleId: 'ppl-1',
12
+ metamapFlowId: 'flow-1',
13
+ verificationStatus: 'COMPLETED',
14
+ verificationResult: 'VERIFIED',
15
+ updateDate: '2026-07-21T10:05:00.000Z',
16
+ };
17
+
18
+ const dto = plainToInstance(KycVerificationChangedV1, raw, { excludeExtraneousValues: true });
19
+
20
+ expect(await validate(dto as object)).toHaveLength(0);
21
+ expect(dto.verificationId).toBe('ver-1');
22
+ });
23
+
24
+ it('rechaza un evento sin directoryId (sin él no hay gate posible)', async () => {
25
+ const raw = {
26
+ verificationId: 'ver-1', peopleId: 'ppl-1',
27
+ verificationStatus: 'COMPLETED', verificationResult: 'VERIFIED',
28
+ updateDate: '2026-07-21T10:05:00.000Z',
29
+ };
30
+
31
+ const dto = plainToInstance(KycVerificationChangedV1, raw, { excludeExtraneousValues: true });
32
+ const errors = await validate(dto as object);
33
+
34
+ expect(errors.map((e) => e.property)).toContain('directoryId');
35
+ });
36
+
37
+ // DEC-KYC-015. El NewImage de DDB puede traer S: "" — pasa como string vacío, no como ausente.
38
+ it.each(['verificationId', 'directoryId', 'peopleId'])(
39
+ 'rechaza %s vacío (el 7.3% de las filas de dev trae peopleId: "")',
40
+ async (campo) => {
41
+ const raw = {
42
+ verificationId: 'ver-1', directoryId: 'dir-1', peopleId: 'ppl-1',
43
+ verificationStatus: 'COMPLETED', verificationResult: 'VERIFIED',
44
+ updateDate: '2026-07-21T10:05:00.000Z',
45
+ [campo]: '',
46
+ };
47
+
48
+ const dto = plainToInstance(KycVerificationChangedV1, raw, { excludeExtraneousValues: true });
49
+ const errors = await validate(dto as object);
50
+
51
+ expect(errors.map((e) => e.property)).toContain(campo);
52
+ },
53
+ );
54
+
55
+ // Este es el boundary del Pipe: un estado no reconocido DEBE caer al DLQ, no colarse.
56
+ // Sin este candado se puede degradar verificationStatus a @IsString() y la suite sigue verde.
57
+ it('rechaza un verificationStatus fuera del enum', async () => {
58
+ const raw = {
59
+ verificationId: 'ver-1', directoryId: 'dir-1', peopleId: 'ppl-1',
60
+ verificationStatus: 'INVENTADO', verificationResult: 'VERIFIED',
61
+ updateDate: '2026-07-21T10:05:00.000Z',
62
+ };
63
+
64
+ const dto = plainToInstance(KycVerificationChangedV1, raw, { excludeExtraneousValues: true });
65
+ const errors = await validate(dto as object);
66
+
67
+ expect(errors.map((e) => e.property)).toContain('verificationStatus');
68
+ });
69
+
70
+ // DEC-KYC-016: `verificationResult` está acotado a IdentificationDocumentStatus. Sin este
71
+ // candado se puede degradar el campo a @IsString() y la suite sigue verde (antipattern
72
+ // STRING_FOR_ENUM_FIELD). 'COMPLETED' es un valor del OTRO enum — el error de tipeo real.
73
+ it('rechaza un verificationResult que en realidad es un valor de verificationStatus', async () => {
74
+ const raw = {
75
+ verificationId: 'ver-1', directoryId: 'dir-1', peopleId: 'ppl-1',
76
+ verificationStatus: 'COMPLETED', verificationResult: 'COMPLETED',
77
+ updateDate: '2026-07-21T10:05:00.000Z',
78
+ };
79
+
80
+ const dto = plainToInstance(KycVerificationChangedV1, raw, { excludeExtraneousValues: true });
81
+ const errors = await validate(dto as object);
82
+
83
+ expect(errors.map((e) => e.property)).toContain('verificationResult');
84
+ });
85
+
86
+ // El consumidor ordena por updateDate (spec §6): sin @IsISO8601() el orden es una asunción.
87
+ it('rechaza updateDate con formato no ISO-8601', async () => {
88
+ const raw = {
89
+ verificationId: 'ver-1', directoryId: 'dir-1', peopleId: 'ppl-1',
90
+ verificationStatus: 'COMPLETED', verificationResult: 'VERIFIED',
91
+ updateDate: '21/07/2026',
92
+ };
93
+
94
+ const dto = plainToInstance(KycVerificationChangedV1, raw, { excludeExtraneousValues: true });
95
+ const errors = await validate(dto as object);
96
+
97
+ expect(errors.map((e) => e.property)).toContain('updateDate');
98
+ });
99
+ });
@@ -0,0 +1,48 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { SendMessageRequest } from '../../../src/messagesConnector/dtos/SendMessageRequest';
5
+ import { DeliveryChannelEnum } from '../../../src/messaging';
6
+
7
+ /**
8
+ * Candado: `directoryId` es una LLAVE DE CORRELACIÓN opaca para messages-business (rate-limit + log +
9
+ * verify), NO una FK a un directorio. Volver a ponerle `@IsUUID()` rompe dos casos productivos:
10
+ * los cognitoSub UUID v7 (que class-validator rechaza) y el OTP de teléfono del wizard retail, donde
11
+ * el cliente todavía no tiene identidad Fiado cuando se envía el código.
12
+ */
13
+ const base = {
14
+ channelType: DeliveryChannelEnum.SMS,
15
+ messageType: 'OTP_CODE',
16
+ typeOfDirectory: 'PHONE',
17
+ language: 'es',
18
+ country: 'MX',
19
+ destination: '4422194128',
20
+ };
21
+
22
+ const errorsOn = async (directoryId: unknown) => {
23
+ const dto = plainToInstance(SendMessageRequest, { ...base, directoryId });
24
+ const errors = await validate(dto);
25
+ return errors.filter((e) => e.property === 'directoryId');
26
+ };
27
+
28
+ describe('SendMessageRequest.directoryId', () => {
29
+ it('acepta un teléfono (OTP del wizard retail: aún no hay identidad Fiado)', async () => {
30
+ expect(await errorsOn('4422194128')).toHaveLength(0);
31
+ });
32
+
33
+ it('acepta un UUID v7 (cognitoSub de los pools backoffice)', async () => {
34
+ expect(await errorsOn('01930b5e-7c3a-7f21-9a4e-1c8d5f2b6a90')).toHaveLength(0);
35
+ });
36
+
37
+ it('sigue aceptando un UUID v4 (consumidores legacy)', async () => {
38
+ expect(await errorsOn('6aeacae2-92ff-4593-8dfe-410f1f4a2ee6')).toHaveLength(0);
39
+ });
40
+
41
+ it('rechaza vacío (la llave de correlación es obligatoria)', async () => {
42
+ expect(await errorsOn('')).not.toHaveLength(0);
43
+ });
44
+
45
+ it('rechaza un no-string', async () => {
46
+ expect(await errorsOn(12345)).not.toHaveLength(0);
47
+ });
48
+ });
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Alta de prospecto M2M en `auth-business` (crea onboarding + People + DirectoryUser).
3
+ * Contrato REDUCIDO respecto del de agente: sin caller, sin referral, sin campos de app.
4
+ *
5
+ * `tenantId` es OBLIGATORIO y explícito: la variante de agente lo tiene hardcodeado a
6
+ * `FIADO_BETA`, y eliminar ese hardcode es parte del contrato de este endpoint privado.
7
+ *
8
+ * ⚠️ PII: nombre y teléfono — nunca loguear el request completo.
9
+ */
10
+ export declare class SignUpProspectRequest {
11
+ name: string;
12
+ phoneNumber: string;
13
+ /** Decidido: sin `@Matches(/^[a-z0-9-]+$/)` — `FIADO_BETA` es un tenant real y ese regex lo rechazaría. */
14
+ tenantId: string;
15
+ }
@@ -0,0 +1,44 @@
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.SignUpProspectRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * Alta de prospecto M2M en `auth-business` (crea onboarding + People + DirectoryUser).
17
+ * Contrato REDUCIDO respecto del de agente: sin caller, sin referral, sin campos de app.
18
+ *
19
+ * `tenantId` es OBLIGATORIO y explícito: la variante de agente lo tiene hardcodeado a
20
+ * `FIADO_BETA`, y eliminar ese hardcode es parte del contrato de este endpoint privado.
21
+ *
22
+ * ⚠️ PII: nombre y teléfono — nunca loguear el request completo.
23
+ */
24
+ class SignUpProspectRequest {
25
+ }
26
+ exports.SignUpProspectRequest = SignUpProspectRequest;
27
+ __decorate([
28
+ (0, class_transformer_1.Expose)(),
29
+ (0, class_validator_1.IsString)(),
30
+ (0, class_validator_1.IsNotEmpty)(),
31
+ __metadata("design:type", String)
32
+ ], SignUpProspectRequest.prototype, "name", void 0);
33
+ __decorate([
34
+ (0, class_transformer_1.Expose)(),
35
+ (0, class_validator_1.IsString)(),
36
+ (0, class_validator_1.IsNotEmpty)(),
37
+ __metadata("design:type", String)
38
+ ], SignUpProspectRequest.prototype, "phoneNumber", void 0);
39
+ __decorate([
40
+ (0, class_transformer_1.Expose)(),
41
+ (0, class_validator_1.IsString)(),
42
+ (0, class_validator_1.IsNotEmpty)(),
43
+ __metadata("design:type", String)
44
+ ], SignUpProspectRequest.prototype, "tenantId", void 0);
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Identidad Fiado creada (o reusada) para el prospecto.
3
+ *
4
+ * DEC-KYC-015: `directoryId` y `peopleId` llevan `@IsNotEmpty()` — son los mismos dos
5
+ * identificadores que en el dominio `kyc`, y vienen de un destino que ya demostró devolver
6
+ * strings vacíos. `@IsString()` pelado los dejaría pasar en silencio.
7
+ */
8
+ export declare class SignUpProspectResponse {
9
+ directoryId: string;
10
+ peopleId: string;
11
+ }
@@ -0,0 +1,36 @@
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.SignUpProspectResponse = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * Identidad Fiado creada (o reusada) para el prospecto.
17
+ *
18
+ * DEC-KYC-015: `directoryId` y `peopleId` llevan `@IsNotEmpty()` — son los mismos dos
19
+ * identificadores que en el dominio `kyc`, y vienen de un destino que ya demostró devolver
20
+ * strings vacíos. `@IsString()` pelado los dejaría pasar en silencio.
21
+ */
22
+ class SignUpProspectResponse {
23
+ }
24
+ exports.SignUpProspectResponse = SignUpProspectResponse;
25
+ __decorate([
26
+ (0, class_transformer_1.Expose)(),
27
+ (0, class_validator_1.IsString)(),
28
+ (0, class_validator_1.IsNotEmpty)(),
29
+ __metadata("design:type", String)
30
+ ], SignUpProspectResponse.prototype, "directoryId", void 0);
31
+ __decorate([
32
+ (0, class_transformer_1.Expose)(),
33
+ (0, class_validator_1.IsString)(),
34
+ (0, class_validator_1.IsNotEmpty)(),
35
+ __metadata("design:type", String)
36
+ ], SignUpProspectResponse.prototype, "peopleId", void 0);
@@ -3,3 +3,5 @@ export * from './dtos/ResetPasswordBackofficeRequest';
3
3
  export * from './dtos/SignInBackofficeRequest';
4
4
  export * from './dtos/SignInBackofficeResponse';
5
5
  export * from './dtos/SignUpBackofficeRequest';
6
+ export * from './dtos/SignUpProspectRequest';
7
+ export * from './dtos/SignUpProspectResponse';
package/bin/auth/index.js CHANGED
@@ -20,3 +20,5 @@ __exportStar(require("./dtos/ResetPasswordBackofficeRequest"), exports);
20
20
  __exportStar(require("./dtos/SignInBackofficeRequest"), exports);
21
21
  __exportStar(require("./dtos/SignInBackofficeResponse"), exports);
22
22
  __exportStar(require("./dtos/SignUpBackofficeRequest"), exports);
23
+ __exportStar(require("./dtos/SignUpProspectRequest"), exports);
24
+ __exportStar(require("./dtos/SignUpProspectResponse"), exports);
package/bin/index.d.ts CHANGED
@@ -98,5 +98,6 @@ export * as LoanOfferings from './loanOfferings';
98
98
  export * as LoanCollectorAssignment from './loanCollectorAssignment';
99
99
  export * as LoanCredit from './loanCredit';
100
100
  export * as LoanScoring from './loanScoring';
101
+ export * as Kyc from './kyc';
101
102
  export * from './messaging';
102
103
  export * from './complaint';
package/bin/index.js CHANGED
@@ -38,6 +38,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.Device = exports.Observations = exports.IssuanceBusiness = exports.Blacklist = exports.CentralPayments = exports.Helpdesk = exports.FiadoApiResponse = exports.Auth = exports.LegalDocumentsBusiness = exports.Role = exports.STPAccount = exports.RiskProfile = exports.FraudPreventionEngine = exports.BBVARst = exports.Stp = exports.BenefitCenter = exports.BankAccount = exports.P2pContact = exports.CreditContract = exports.Contract = exports.ProductCatalog = exports.ContactInfo = exports.TransactionAnalytics = exports.Transaction = exports.TransactionProcessor = exports.GenericMessage = exports.EventBridgeMessage = exports.SessionActivity = exports.NotificationMessages = exports.ServicePayment = exports.Header = exports.Identity = exports.UserTags = exports.Group = exports.File = exports.ExchangeRate = exports.Directory = exports.Currency = exports.Country = exports.Card = exports.Authentication = exports.AppContent = exports.App = exports.Offices = exports.Places = exports.Address = exports.Beneficiary = exports.Activity = exports.Account = exports.Crypto = void 0;
40
40
  exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.LoanConfig = exports.RetailWizard = exports.RetailCustomer = exports.RetailCards = exports.RetailCatalog = exports.RetailOrg = exports.EmailVerification = exports.NetworkConnector = exports.Modelias = exports.TotpSecurity = exports.Passport = exports.WalletFunding = exports.Remittance = exports.PlatformRbac = exports.CognitoBackofficeConnector = exports.TwilioConnector = exports.MessagesConnector = exports.Mdm = exports.MilestoneBusiness = exports.CirculoCredito = exports.CreditStatements = exports.Sentry = exports.AiEngine = exports.Funnel = exports.TeamsConnector = exports.PlatformErrorEvents = exports.CustomerFile = exports.CreditBackoffice = exports.CreditDashboard = exports.CreditEngine = exports.Credit = exports.ComissionBusiness = exports.ReferralBusiness = exports.ZendeskMessaging = exports.NotificationWS = exports.Event = exports.PayrollBusiness = exports.Cnbv = exports.DirectorySetting = exports.InvoiceCollector = exports.Collector = exports.Pricelist = exports.Company = exports.Services = exports.AccountIssuanceBusiness = exports.AppSelectionData = void 0;
41
+ exports.Kyc = void 0;
41
42
  exports.Crypto = __importStar(require("./crypto"));
42
43
  exports.Account = __importStar(require("./account"));
43
44
  exports.Activity = __importStar(require("./activity"));
@@ -170,5 +171,9 @@ exports.LoanCredit = __importStar(require("./loanCredit"));
170
171
  // ScoringProviderRouter configurable Modelias|Círculo con contrato agnóstico ScoringDecision;
171
172
  // SureKeep Fase 2 — pista Loan/SOFOM).
172
173
  exports.LoanScoring = __importStar(require("./loanScoring"));
174
+ // Kyc: contrato de la lectura confirmatoria del KYC (kyc-verifications-business) — estado
175
+ // consolidado + estados crudos + datos de persona. El consolidado reusa RetailKycStatusEnum
176
+ // (no hay enum consolidado propio — DEC-KYC-014). SureKeep Fase 2.
177
+ exports.Kyc = __importStar(require("./kyc"));
173
178
  __exportStar(require("./messaging"), exports);
174
179
  __exportStar(require("./complaint"), exports);
@@ -0,0 +1,49 @@
1
+ import { IdentificationDocumentStatus } from '../../../identity/enums/IdentificationDocumentStatus';
2
+ import { RetailKycStatusEnum } from '../../../retailCustomer/enums/RetailKycStatusEnum';
3
+ import { KycVerificationStatusEnum } from '../../enums/KycVerificationStatusEnum';
4
+ import { KycPersonData } from './KycPersonData';
5
+ /**
6
+ * Estado consolidado del KYC de un directorio + los estados crudos + los datos de persona.
7
+ *
8
+ * Los campos crudos viajan además del consolidado para que el consumidor NO tenga que
9
+ * reimplementar el mapeo de otro dominio.
10
+ *
11
+ * DEC-KYC-014: "sin verificación" se responde con 404, NO con un valor de enum. Por eso todos
12
+ * los campos de identidad y estado son REQUERIDOS — este DTO solo describe el caso en que sí
13
+ * existe una verificación.
14
+ *
15
+ * DEC-KYC-004: el vocabulario del consolidado es `RetailKycStatusEnum`, el único de la lib.
16
+ *
17
+ * DEC-KYC-016: `verificationResult` reusa `IdentificationDocumentStatus` — es el enum que el
18
+ * lambda productor (`kyc-verifications-business`) escribe literalmente en la tabla; duplicarlo
19
+ * aquí sería drift garantizado.
20
+ *
21
+ * ⚠️ Lleva PII en `person` (CURP y nombre completo).
22
+ */
23
+ export declare class KycByDirectoryResponse {
24
+ consolidated: RetailKycStatusEnum;
25
+ /** La PK de la fila (`id`) mapeada a nombre de negocio. */
26
+ verificationId: string;
27
+ /** DEC-KYC-015: `@IsNotEmpty()` — el 7.3% de las filas de dev trae string vacío. */
28
+ peopleId: string;
29
+ metamapFlowId?: string;
30
+ verificationStatus: KycVerificationStatusEnum;
31
+ /**
32
+ * Requerido y acotado al enum: se escanearon las 193 filas de `KycVerifications` en dev y los
33
+ * valores son exactamente los tres — `IN_PROGRESS+UNVERIFIED` 104, `COMPLETED+VERIFIED` 69,
34
+ * `COMPLETED+UNVERIFIED` 19, `COMPLETED+REJECTED` 1. Cero valores fuera del set, cero vacíos.
35
+ * Verificado, no asumido (2026-07-21).
36
+ */
37
+ verificationResult: IdentificationDocumentStatus;
38
+ /**
39
+ * ISO-8601 obligatorio: el ordenamiento del endpoint (spec §6) se apoya en que estas fechas
40
+ * son léxicamente ordenables — si no se valida el formato, el orden es una asunción sin red.
41
+ * Se escanearon las 193 filas de `KycVerifications` en dev: `createDate` 193/193 ISO-8601 y
42
+ * `updateDate` 193/193 — 386/386, cero excepciones (ejemplo real: '2025-10-06T21:40:58.277Z').
43
+ * Verificado, no asumido (2026-07-21).
44
+ */
45
+ createDate: string;
46
+ /** ISO-8601 obligatorio — mismo escaneo de dev: 386/386 fechas ISO-8601 (2026-07-21). */
47
+ updateDate: string;
48
+ person?: KycPersonData;
49
+ }
@@ -0,0 +1,91 @@
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.KycByDirectoryResponse = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const IdentificationDocumentStatus_1 = require("../../../identity/enums/IdentificationDocumentStatus");
16
+ const RetailKycStatusEnum_1 = require("../../../retailCustomer/enums/RetailKycStatusEnum");
17
+ const KycVerificationStatusEnum_1 = require("../../enums/KycVerificationStatusEnum");
18
+ const KycPersonData_1 = require("./KycPersonData");
19
+ /**
20
+ * Estado consolidado del KYC de un directorio + los estados crudos + los datos de persona.
21
+ *
22
+ * Los campos crudos viajan además del consolidado para que el consumidor NO tenga que
23
+ * reimplementar el mapeo de otro dominio.
24
+ *
25
+ * DEC-KYC-014: "sin verificación" se responde con 404, NO con un valor de enum. Por eso todos
26
+ * los campos de identidad y estado son REQUERIDOS — este DTO solo describe el caso en que sí
27
+ * existe una verificación.
28
+ *
29
+ * DEC-KYC-004: el vocabulario del consolidado es `RetailKycStatusEnum`, el único de la lib.
30
+ *
31
+ * DEC-KYC-016: `verificationResult` reusa `IdentificationDocumentStatus` — es el enum que el
32
+ * lambda productor (`kyc-verifications-business`) escribe literalmente en la tabla; duplicarlo
33
+ * aquí sería drift garantizado.
34
+ *
35
+ * ⚠️ Lleva PII en `person` (CURP y nombre completo).
36
+ */
37
+ class KycByDirectoryResponse {
38
+ }
39
+ exports.KycByDirectoryResponse = KycByDirectoryResponse;
40
+ __decorate([
41
+ (0, class_transformer_1.Expose)(),
42
+ (0, class_validator_1.IsEnum)(RetailKycStatusEnum_1.RetailKycStatusEnum),
43
+ __metadata("design:type", String)
44
+ ], KycByDirectoryResponse.prototype, "consolidated", void 0);
45
+ __decorate([
46
+ (0, class_transformer_1.Expose)(),
47
+ (0, class_validator_1.IsString)(),
48
+ (0, class_validator_1.IsNotEmpty)(),
49
+ __metadata("design:type", String)
50
+ ], KycByDirectoryResponse.prototype, "verificationId", void 0);
51
+ __decorate([
52
+ (0, class_transformer_1.Expose)(),
53
+ (0, class_validator_1.IsString)(),
54
+ (0, class_validator_1.IsNotEmpty)(),
55
+ __metadata("design:type", String)
56
+ ], KycByDirectoryResponse.prototype, "peopleId", 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
+ ], KycByDirectoryResponse.prototype, "metamapFlowId", void 0);
63
+ __decorate([
64
+ (0, class_transformer_1.Expose)(),
65
+ (0, class_validator_1.IsEnum)(KycVerificationStatusEnum_1.KycVerificationStatusEnum),
66
+ __metadata("design:type", String)
67
+ ], KycByDirectoryResponse.prototype, "verificationStatus", void 0);
68
+ __decorate([
69
+ (0, class_transformer_1.Expose)(),
70
+ (0, class_validator_1.IsEnum)(IdentificationDocumentStatus_1.IdentificationDocumentStatus),
71
+ __metadata("design:type", String)
72
+ ], KycByDirectoryResponse.prototype, "verificationResult", void 0);
73
+ __decorate([
74
+ (0, class_transformer_1.Expose)(),
75
+ (0, class_validator_1.IsString)(),
76
+ (0, class_validator_1.IsISO8601)(),
77
+ __metadata("design:type", String)
78
+ ], KycByDirectoryResponse.prototype, "createDate", void 0);
79
+ __decorate([
80
+ (0, class_transformer_1.Expose)(),
81
+ (0, class_validator_1.IsString)(),
82
+ (0, class_validator_1.IsISO8601)(),
83
+ __metadata("design:type", String)
84
+ ], KycByDirectoryResponse.prototype, "updateDate", void 0);
85
+ __decorate([
86
+ (0, class_transformer_1.Expose)(),
87
+ (0, class_validator_1.IsOptional)(),
88
+ (0, class_validator_1.ValidateNested)(),
89
+ (0, class_transformer_1.Type)(() => KycPersonData_1.KycPersonData),
90
+ __metadata("design:type", KycPersonData_1.KycPersonData)
91
+ ], KycByDirectoryResponse.prototype, "person", void 0);
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Datos de identidad del cliente, leídos de People tras un KYC completado.
3
+ * ⚠️ PII: nunca loguear esta estructura ni exponerla en endpoints de alta frecuencia.
4
+ */
5
+ export declare class KycPersonData {
6
+ names?: string;
7
+ paternalLastName?: string;
8
+ maternalLastName?: string;
9
+ curp?: string;
10
+ dateOfBirth?: string;
11
+ }
@@ -0,0 +1,51 @@
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.KycPersonData = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * Datos de identidad del cliente, leídos de People tras un KYC completado.
17
+ * ⚠️ PII: nunca loguear esta estructura ni exponerla en endpoints de alta frecuencia.
18
+ */
19
+ class KycPersonData {
20
+ }
21
+ exports.KycPersonData = KycPersonData;
22
+ __decorate([
23
+ (0, class_transformer_1.Expose)(),
24
+ (0, class_validator_1.IsOptional)(),
25
+ (0, class_validator_1.IsString)(),
26
+ __metadata("design:type", String)
27
+ ], KycPersonData.prototype, "names", void 0);
28
+ __decorate([
29
+ (0, class_transformer_1.Expose)(),
30
+ (0, class_validator_1.IsOptional)(),
31
+ (0, class_validator_1.IsString)(),
32
+ __metadata("design:type", String)
33
+ ], KycPersonData.prototype, "paternalLastName", void 0);
34
+ __decorate([
35
+ (0, class_transformer_1.Expose)(),
36
+ (0, class_validator_1.IsOptional)(),
37
+ (0, class_validator_1.IsString)(),
38
+ __metadata("design:type", String)
39
+ ], KycPersonData.prototype, "maternalLastName", void 0);
40
+ __decorate([
41
+ (0, class_transformer_1.Expose)(),
42
+ (0, class_validator_1.IsOptional)(),
43
+ (0, class_validator_1.IsString)(),
44
+ __metadata("design:type", String)
45
+ ], KycPersonData.prototype, "curp", void 0);
46
+ __decorate([
47
+ (0, class_transformer_1.Expose)(),
48
+ (0, class_validator_1.IsOptional)(),
49
+ (0, class_validator_1.IsString)(),
50
+ __metadata("design:type", String)
51
+ ], KycPersonData.prototype, "dateOfBirth", void 0);
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Ciclo de vida de la verificación en `kyc-verifications-business` (crudo, sin colapsar).
3
+ *
4
+ * DEC-KYC-016: sí, duplica `KycVerificationStatus` de `@fiado/fiado-abstractions`
5
+ * (`bin/Fiado/Database/KycVerifications.d.ts`, mismos 5 valores) — y se queda así a propósito.
6
+ * `fiado-abstractions` es la lib legacy de la que `type-kit` está migrando: el contrato nuevo no
7
+ * debe depender de ella. No lo "arregles" importando desde abstractions.
8
+ *
9
+ * (Contraste: `verificationResult` NO se duplica — reusa `IdentificationDocumentStatus`, que ya
10
+ * vive publicado en esta misma lib bajo `identity`.)
11
+ */
12
+ export declare enum KycVerificationStatusEnum {
13
+ CREATED = "CREATED",
14
+ SENT = "SENT",
15
+ IN_PROGRESS = "IN_PROGRESS",
16
+ COMPLETED = "COMPLETED",
17
+ ERROR = "ERROR"
18
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KycVerificationStatusEnum = void 0;
4
+ /**
5
+ * Ciclo de vida de la verificación en `kyc-verifications-business` (crudo, sin colapsar).
6
+ *
7
+ * DEC-KYC-016: sí, duplica `KycVerificationStatus` de `@fiado/fiado-abstractions`
8
+ * (`bin/Fiado/Database/KycVerifications.d.ts`, mismos 5 valores) — y se queda así a propósito.
9
+ * `fiado-abstractions` es la lib legacy de la que `type-kit` está migrando: el contrato nuevo no
10
+ * debe depender de ella. No lo "arregles" importando desde abstractions.
11
+ *
12
+ * (Contraste: `verificationResult` NO se duplica — reusa `IdentificationDocumentStatus`, que ya
13
+ * vive publicado en esta misma lib bajo `identity`.)
14
+ */
15
+ var KycVerificationStatusEnum;
16
+ (function (KycVerificationStatusEnum) {
17
+ KycVerificationStatusEnum["CREATED"] = "CREATED";
18
+ KycVerificationStatusEnum["SENT"] = "SENT";
19
+ KycVerificationStatusEnum["IN_PROGRESS"] = "IN_PROGRESS";
20
+ KycVerificationStatusEnum["COMPLETED"] = "COMPLETED";
21
+ KycVerificationStatusEnum["ERROR"] = "ERROR";
22
+ })(KycVerificationStatusEnum || (exports.KycVerificationStatusEnum = KycVerificationStatusEnum = {}));
@@ -0,0 +1,35 @@
1
+ import { IdentificationDocumentStatus } from '../../identity/enums/IdentificationDocumentStatus';
2
+ import { KycVerificationStatusEnum } from '../enums/KycVerificationStatusEnum';
3
+ /**
4
+ * Cambio terminal de una verificación KYC, tal como llega desde el DDB Stream de
5
+ * `KycVerifications` a través del EventBridge Pipe (filtrado a COMPLETED).
6
+ *
7
+ * NO lleva `tenantId`: el de la tabla es un valor hardcodeado que no discrimina silo.
8
+ * La pertenencia se resuelve en el consumer con el gate de `WizardSession`.
9
+ *
10
+ * Los estados viajan CRUDOS para no acoplar al consumidor con el mapeo del dominio dueño.
11
+ *
12
+ * DEC-KYC-015: los tres identificadores usan `@IsNotEmpty()`. El NewImage de DDB puede traer
13
+ * `S: ""` — que `@IsString()` aceptaría en silencio. Preferimos que el mensaje caiga al DLQ
14
+ * en el boundary antes que fallar mudo tres pasos río abajo.
15
+ *
16
+ * DEC-KYC-016: `verificationResult` reusa `IdentificationDocumentStatus` — es el enum que el
17
+ * lambda productor (`kyc-verifications-business`) escribe literalmente en la tabla; duplicarlo
18
+ * aquí sería drift garantizado.
19
+ */
20
+ export declare class KycVerificationChangedV1 {
21
+ /** La PK de la fila (`id`) mapeada a nombre de negocio. */
22
+ verificationId: string;
23
+ directoryId: string;
24
+ peopleId: string;
25
+ metamapFlowId?: string;
26
+ verificationStatus: KycVerificationStatusEnum;
27
+ verificationResult: IdentificationDocumentStatus;
28
+ /**
29
+ * ISO-8601 obligatorio: el ordenamiento del endpoint (spec §6) se apoya en que la fecha es
30
+ * léxicamente ordenable. Se escanearon las 193 filas de `KycVerifications` en dev —
31
+ * `createDate` 193/193 y `updateDate` 193/193 ISO-8601: 386/386, cero excepciones
32
+ * (ejemplo real: '2025-10-06T21:40:58.277Z'). Verificado, no asumido (2026-07-21).
33
+ */
34
+ updateDate: string;
35
+ }
@@ -0,0 +1,76 @@
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.KycVerificationChangedV1 = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const IdentificationDocumentStatus_1 = require("../../identity/enums/IdentificationDocumentStatus");
16
+ const KycVerificationStatusEnum_1 = require("../enums/KycVerificationStatusEnum");
17
+ /**
18
+ * Cambio terminal de una verificación KYC, tal como llega desde el DDB Stream de
19
+ * `KycVerifications` a través del EventBridge Pipe (filtrado a COMPLETED).
20
+ *
21
+ * NO lleva `tenantId`: el de la tabla es un valor hardcodeado que no discrimina silo.
22
+ * La pertenencia se resuelve en el consumer con el gate de `WizardSession`.
23
+ *
24
+ * Los estados viajan CRUDOS para no acoplar al consumidor con el mapeo del dominio dueño.
25
+ *
26
+ * DEC-KYC-015: los tres identificadores usan `@IsNotEmpty()`. El NewImage de DDB puede traer
27
+ * `S: ""` — que `@IsString()` aceptaría en silencio. Preferimos que el mensaje caiga al DLQ
28
+ * en el boundary antes que fallar mudo tres pasos río abajo.
29
+ *
30
+ * DEC-KYC-016: `verificationResult` reusa `IdentificationDocumentStatus` — es el enum que el
31
+ * lambda productor (`kyc-verifications-business`) escribe literalmente en la tabla; duplicarlo
32
+ * aquí sería drift garantizado.
33
+ */
34
+ class KycVerificationChangedV1 {
35
+ }
36
+ exports.KycVerificationChangedV1 = KycVerificationChangedV1;
37
+ __decorate([
38
+ (0, class_transformer_1.Expose)(),
39
+ (0, class_validator_1.IsString)(),
40
+ (0, class_validator_1.IsNotEmpty)(),
41
+ __metadata("design:type", String)
42
+ ], KycVerificationChangedV1.prototype, "verificationId", void 0);
43
+ __decorate([
44
+ (0, class_transformer_1.Expose)(),
45
+ (0, class_validator_1.IsString)(),
46
+ (0, class_validator_1.IsNotEmpty)(),
47
+ __metadata("design:type", String)
48
+ ], KycVerificationChangedV1.prototype, "directoryId", void 0);
49
+ __decorate([
50
+ (0, class_transformer_1.Expose)(),
51
+ (0, class_validator_1.IsString)(),
52
+ (0, class_validator_1.IsNotEmpty)(),
53
+ __metadata("design:type", String)
54
+ ], KycVerificationChangedV1.prototype, "peopleId", void 0);
55
+ __decorate([
56
+ (0, class_transformer_1.Expose)(),
57
+ (0, class_validator_1.IsOptional)(),
58
+ (0, class_validator_1.IsString)(),
59
+ __metadata("design:type", String)
60
+ ], KycVerificationChangedV1.prototype, "metamapFlowId", void 0);
61
+ __decorate([
62
+ (0, class_transformer_1.Expose)(),
63
+ (0, class_validator_1.IsEnum)(KycVerificationStatusEnum_1.KycVerificationStatusEnum),
64
+ __metadata("design:type", String)
65
+ ], KycVerificationChangedV1.prototype, "verificationStatus", void 0);
66
+ __decorate([
67
+ (0, class_transformer_1.Expose)(),
68
+ (0, class_validator_1.IsEnum)(IdentificationDocumentStatus_1.IdentificationDocumentStatus),
69
+ __metadata("design:type", String)
70
+ ], KycVerificationChangedV1.prototype, "verificationResult", void 0);
71
+ __decorate([
72
+ (0, class_transformer_1.Expose)(),
73
+ (0, class_validator_1.IsString)(),
74
+ (0, class_validator_1.IsISO8601)(),
75
+ __metadata("design:type", String)
76
+ ], KycVerificationChangedV1.prototype, "updateDate", void 0);
@@ -0,0 +1,4 @@
1
+ export * from './enums/KycVerificationStatusEnum';
2
+ export * from './dtos/responses/KycPersonData';
3
+ export * from './dtos/responses/KycByDirectoryResponse';
4
+ export * from './events/KycVerificationChangedV1';
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ // Enums (el consolidado reusa RetailKycStatusEnum del dominio retailCustomer — DEC-KYC-014;
18
+ // `verificationResult` reusa IdentificationDocumentStatus de `identity` — DEC-KYC-016)
19
+ __exportStar(require("./enums/KycVerificationStatusEnum"), exports);
20
+ // Response DTOs
21
+ __exportStar(require("./dtos/responses/KycPersonData"), exports);
22
+ __exportStar(require("./dtos/responses/KycByDirectoryResponse"), exports);
23
+ // Events
24
+ __exportStar(require("./events/KycVerificationChangedV1"), exports);
@@ -29,7 +29,8 @@ __decorate([
29
29
  ], SendMessageRequest.prototype, "messageType", void 0);
30
30
  __decorate([
31
31
  (0, class_transformer_1.Expose)(),
32
- (0, class_validator_1.IsUUID)(),
32
+ (0, class_validator_1.IsString)(),
33
+ (0, class_validator_1.IsNotEmpty)(),
33
34
  __metadata("design:type", String)
34
35
  ], SendMessageRequest.prototype, "directoryId", void 0);
35
36
  __decorate([
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.200.0",
3
+ "version": "3.202.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,23 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsNotEmpty, IsString } from 'class-validator';
3
+
4
+ /**
5
+ * Alta de prospecto M2M en `auth-business` (crea onboarding + People + DirectoryUser).
6
+ * Contrato REDUCIDO respecto del de agente: sin caller, sin referral, sin campos de app.
7
+ *
8
+ * `tenantId` es OBLIGATORIO y explícito: la variante de agente lo tiene hardcodeado a
9
+ * `FIADO_BETA`, y eliminar ese hardcode es parte del contrato de este endpoint privado.
10
+ *
11
+ * ⚠️ PII: nombre y teléfono — nunca loguear el request completo.
12
+ */
13
+ export class SignUpProspectRequest {
14
+ @Expose() @IsString() @IsNotEmpty()
15
+ name!: string;
16
+
17
+ @Expose() @IsString() @IsNotEmpty()
18
+ phoneNumber!: string;
19
+
20
+ /** Decidido: sin `@Matches(/^[a-z0-9-]+$/)` — `FIADO_BETA` es un tenant real y ese regex lo rechazaría. */
21
+ @Expose() @IsString() @IsNotEmpty()
22
+ tenantId!: string;
23
+ }
@@ -0,0 +1,17 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsNotEmpty, IsString } from 'class-validator';
3
+
4
+ /**
5
+ * Identidad Fiado creada (o reusada) para el prospecto.
6
+ *
7
+ * DEC-KYC-015: `directoryId` y `peopleId` llevan `@IsNotEmpty()` — son los mismos dos
8
+ * identificadores que en el dominio `kyc`, y vienen de un destino que ya demostró devolver
9
+ * strings vacíos. `@IsString()` pelado los dejaría pasar en silencio.
10
+ */
11
+ export class SignUpProspectResponse {
12
+ @Expose() @IsString() @IsNotEmpty()
13
+ directoryId!: string;
14
+
15
+ @Expose() @IsString() @IsNotEmpty()
16
+ peopleId!: string;
17
+ }
package/src/auth/index.ts CHANGED
@@ -5,3 +5,5 @@ export * from './dtos/ResetPasswordBackofficeRequest';
5
5
  export * from './dtos/SignInBackofficeRequest';
6
6
  export * from './dtos/SignInBackofficeResponse';
7
7
  export * from './dtos/SignUpBackofficeRequest';
8
+ export * from './dtos/SignUpProspectRequest';
9
+ export * from './dtos/SignUpProspectResponse';
package/src/index.ts CHANGED
@@ -130,5 +130,9 @@ export * as LoanCredit from './loanCredit';
130
130
  // ScoringProviderRouter configurable Modelias|Círculo con contrato agnóstico ScoringDecision;
131
131
  // SureKeep Fase 2 — pista Loan/SOFOM).
132
132
  export * as LoanScoring from './loanScoring';
133
+ // Kyc: contrato de la lectura confirmatoria del KYC (kyc-verifications-business) — estado
134
+ // consolidado + estados crudos + datos de persona. El consolidado reusa RetailKycStatusEnum
135
+ // (no hay enum consolidado propio — DEC-KYC-014). SureKeep Fase 2.
136
+ export * as Kyc from './kyc';
133
137
  export * from './messaging';
134
138
  export * from './complaint';
@@ -0,0 +1,69 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsEnum, IsISO8601, IsNotEmpty, IsOptional, IsString, ValidateNested } from 'class-validator';
3
+ import { IdentificationDocumentStatus } from '../../../identity/enums/IdentificationDocumentStatus';
4
+ import { RetailKycStatusEnum } from '../../../retailCustomer/enums/RetailKycStatusEnum';
5
+ import { KycVerificationStatusEnum } from '../../enums/KycVerificationStatusEnum';
6
+ import { KycPersonData } from './KycPersonData';
7
+
8
+ /**
9
+ * Estado consolidado del KYC de un directorio + los estados crudos + los datos de persona.
10
+ *
11
+ * Los campos crudos viajan además del consolidado para que el consumidor NO tenga que
12
+ * reimplementar el mapeo de otro dominio.
13
+ *
14
+ * DEC-KYC-014: "sin verificación" se responde con 404, NO con un valor de enum. Por eso todos
15
+ * los campos de identidad y estado son REQUERIDOS — este DTO solo describe el caso en que sí
16
+ * existe una verificación.
17
+ *
18
+ * DEC-KYC-004: el vocabulario del consolidado es `RetailKycStatusEnum`, el único de la lib.
19
+ *
20
+ * DEC-KYC-016: `verificationResult` reusa `IdentificationDocumentStatus` — es el enum que el
21
+ * lambda productor (`kyc-verifications-business`) escribe literalmente en la tabla; duplicarlo
22
+ * aquí sería drift garantizado.
23
+ *
24
+ * ⚠️ Lleva PII en `person` (CURP y nombre completo).
25
+ */
26
+ export class KycByDirectoryResponse {
27
+ @Expose() @IsEnum(RetailKycStatusEnum)
28
+ consolidated!: RetailKycStatusEnum;
29
+
30
+ /** La PK de la fila (`id`) mapeada a nombre de negocio. */
31
+ @Expose() @IsString() @IsNotEmpty()
32
+ verificationId!: string;
33
+
34
+ /** DEC-KYC-015: `@IsNotEmpty()` — el 7.3% de las filas de dev trae string vacío. */
35
+ @Expose() @IsString() @IsNotEmpty()
36
+ peopleId!: string;
37
+
38
+ @Expose() @IsOptional() @IsString()
39
+ metamapFlowId?: string;
40
+
41
+ @Expose() @IsEnum(KycVerificationStatusEnum)
42
+ verificationStatus!: KycVerificationStatusEnum;
43
+
44
+ /**
45
+ * Requerido y acotado al enum: se escanearon las 193 filas de `KycVerifications` en dev y los
46
+ * valores son exactamente los tres — `IN_PROGRESS+UNVERIFIED` 104, `COMPLETED+VERIFIED` 69,
47
+ * `COMPLETED+UNVERIFIED` 19, `COMPLETED+REJECTED` 1. Cero valores fuera del set, cero vacíos.
48
+ * Verificado, no asumido (2026-07-21).
49
+ */
50
+ @Expose() @IsEnum(IdentificationDocumentStatus)
51
+ verificationResult!: IdentificationDocumentStatus;
52
+
53
+ /**
54
+ * ISO-8601 obligatorio: el ordenamiento del endpoint (spec §6) se apoya en que estas fechas
55
+ * son léxicamente ordenables — si no se valida el formato, el orden es una asunción sin red.
56
+ * Se escanearon las 193 filas de `KycVerifications` en dev: `createDate` 193/193 ISO-8601 y
57
+ * `updateDate` 193/193 — 386/386, cero excepciones (ejemplo real: '2025-10-06T21:40:58.277Z').
58
+ * Verificado, no asumido (2026-07-21).
59
+ */
60
+ @Expose() @IsString() @IsISO8601()
61
+ createDate!: string;
62
+
63
+ /** ISO-8601 obligatorio — mismo escaneo de dev: 386/386 fechas ISO-8601 (2026-07-21). */
64
+ @Expose() @IsString() @IsISO8601()
65
+ updateDate!: string;
66
+
67
+ @Expose() @IsOptional() @ValidateNested() @Type(() => KycPersonData)
68
+ person?: KycPersonData;
69
+ }
@@ -0,0 +1,23 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsOptional, IsString } from 'class-validator';
3
+
4
+ /**
5
+ * Datos de identidad del cliente, leídos de People tras un KYC completado.
6
+ * ⚠️ PII: nunca loguear esta estructura ni exponerla en endpoints de alta frecuencia.
7
+ */
8
+ export class KycPersonData {
9
+ @Expose() @IsOptional() @IsString()
10
+ names?: string;
11
+
12
+ @Expose() @IsOptional() @IsString()
13
+ paternalLastName?: string;
14
+
15
+ @Expose() @IsOptional() @IsString()
16
+ maternalLastName?: string;
17
+
18
+ @Expose() @IsOptional() @IsString()
19
+ curp?: string;
20
+
21
+ @Expose() @IsOptional() @IsString()
22
+ dateOfBirth?: string;
23
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Ciclo de vida de la verificación en `kyc-verifications-business` (crudo, sin colapsar).
3
+ *
4
+ * DEC-KYC-016: sí, duplica `KycVerificationStatus` de `@fiado/fiado-abstractions`
5
+ * (`bin/Fiado/Database/KycVerifications.d.ts`, mismos 5 valores) — y se queda así a propósito.
6
+ * `fiado-abstractions` es la lib legacy de la que `type-kit` está migrando: el contrato nuevo no
7
+ * debe depender de ella. No lo "arregles" importando desde abstractions.
8
+ *
9
+ * (Contraste: `verificationResult` NO se duplica — reusa `IdentificationDocumentStatus`, que ya
10
+ * vive publicado en esta misma lib bajo `identity`.)
11
+ */
12
+ export enum KycVerificationStatusEnum {
13
+ CREATED = 'CREATED',
14
+ SENT = 'SENT',
15
+ IN_PROGRESS = 'IN_PROGRESS',
16
+ COMPLETED = 'COMPLETED',
17
+ ERROR = 'ERROR',
18
+ }
@@ -0,0 +1,51 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsEnum, IsISO8601, IsNotEmpty, IsOptional, IsString } from 'class-validator';
3
+ import { IdentificationDocumentStatus } from '../../identity/enums/IdentificationDocumentStatus';
4
+ import { KycVerificationStatusEnum } from '../enums/KycVerificationStatusEnum';
5
+
6
+ /**
7
+ * Cambio terminal de una verificación KYC, tal como llega desde el DDB Stream de
8
+ * `KycVerifications` a través del EventBridge Pipe (filtrado a COMPLETED).
9
+ *
10
+ * NO lleva `tenantId`: el de la tabla es un valor hardcodeado que no discrimina silo.
11
+ * La pertenencia se resuelve en el consumer con el gate de `WizardSession`.
12
+ *
13
+ * Los estados viajan CRUDOS para no acoplar al consumidor con el mapeo del dominio dueño.
14
+ *
15
+ * DEC-KYC-015: los tres identificadores usan `@IsNotEmpty()`. El NewImage de DDB puede traer
16
+ * `S: ""` — que `@IsString()` aceptaría en silencio. Preferimos que el mensaje caiga al DLQ
17
+ * en el boundary antes que fallar mudo tres pasos río abajo.
18
+ *
19
+ * DEC-KYC-016: `verificationResult` reusa `IdentificationDocumentStatus` — es el enum que el
20
+ * lambda productor (`kyc-verifications-business`) escribe literalmente en la tabla; duplicarlo
21
+ * aquí sería drift garantizado.
22
+ */
23
+ export class KycVerificationChangedV1 {
24
+ /** La PK de la fila (`id`) mapeada a nombre de negocio. */
25
+ @Expose() @IsString() @IsNotEmpty()
26
+ verificationId!: string;
27
+
28
+ @Expose() @IsString() @IsNotEmpty()
29
+ directoryId!: string;
30
+
31
+ @Expose() @IsString() @IsNotEmpty()
32
+ peopleId!: string;
33
+
34
+ @Expose() @IsOptional() @IsString()
35
+ metamapFlowId?: string;
36
+
37
+ @Expose() @IsEnum(KycVerificationStatusEnum)
38
+ verificationStatus!: KycVerificationStatusEnum;
39
+
40
+ @Expose() @IsEnum(IdentificationDocumentStatus)
41
+ verificationResult!: IdentificationDocumentStatus;
42
+
43
+ /**
44
+ * ISO-8601 obligatorio: el ordenamiento del endpoint (spec §6) se apoya en que la fecha es
45
+ * léxicamente ordenable. Se escanearon las 193 filas de `KycVerifications` en dev —
46
+ * `createDate` 193/193 y `updateDate` 193/193 ISO-8601: 386/386, cero excepciones
47
+ * (ejemplo real: '2025-10-06T21:40:58.277Z'). Verificado, no asumido (2026-07-21).
48
+ */
49
+ @Expose() @IsString() @IsISO8601()
50
+ updateDate!: string;
51
+ }
@@ -0,0 +1,10 @@
1
+ // Enums (el consolidado reusa RetailKycStatusEnum del dominio retailCustomer — DEC-KYC-014;
2
+ // `verificationResult` reusa IdentificationDocumentStatus de `identity` — DEC-KYC-016)
3
+ export * from './enums/KycVerificationStatusEnum';
4
+
5
+ // Response DTOs
6
+ export * from './dtos/responses/KycPersonData';
7
+ export * from './dtos/responses/KycByDirectoryResponse';
8
+
9
+ // Events
10
+ export * from './events/KycVerificationChangedV1';
@@ -5,7 +5,14 @@ import { DeliveryChannelEnum } from '../../messaging';
5
5
  export class SendMessageRequest {
6
6
  @Expose() @IsEnum(DeliveryChannelEnum) channelType!: DeliveryChannelEnum;
7
7
  @Expose() @IsString() @IsNotEmpty() messageType!: string;
8
- @Expose() @IsUUID() directoryId!: string;
8
+ // directoryId NO se valida como @IsUUID: para messages es una LLAVE DE CORRELACIÓN opaca
9
+ // (rate-limit + log + verify), no una FK a ningún directorio — la llave real es el par
10
+ // (typeOfDirectory, directoryId). Exigir UUID rompía dos casos legítimos: los cognitoSub UUID v7
11
+ // (que class-validator @IsUUID() v1-5 rechaza) y el OTP de teléfono del wizard retail, donde el
12
+ // cliente todavía NO tiene identidad Fiado — el OTP es justamente lo que verifica el teléfono, y
13
+ // corre ANTES de crear directory/people. Las otras dos puertas ya usan @IsString:
14
+ // VerifyOtpRequest y NotificationQueueMessageRequestV2 — esto deja el SEND HTTP consistente.
15
+ @Expose() @IsString() @IsNotEmpty() directoryId!: string;
9
16
  @Expose() @IsString() @IsNotEmpty() typeOfDirectory!: string;
10
17
  @Expose() @IsString() @IsNotEmpty() language!: string;
11
18
  @Expose() @IsString() @IsNotEmpty() country!: string;