@fiado/type-kit 3.421.0 → 3.423.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 (25) hide show
  1. package/_test_/unit/messagesConnector/messagingEnums.test.ts +2 -1
  2. package/_test_/unit/whatsappConnector/ConnectorSendMessageRequest.test.ts +97 -0
  3. package/_test_/unit/whatsappConnector/ConnectorSendMessageResponse.test.ts +16 -0
  4. package/_test_/unit/whatsappConnector/SelectedProvider.test.ts +39 -0
  5. package/bin/identity/dtos/PeopleResponse.d.ts +31 -3
  6. package/bin/index.d.ts +1 -0
  7. package/bin/index.js +3 -2
  8. package/bin/messagesConnector/enums/DeliveryChannelExtendedEnum.d.ts +3 -1
  9. package/bin/messagesConnector/enums/DeliveryChannelExtendedEnum.js +2 -0
  10. package/bin/whatsappConnector/dtos/ConnectorSendMessageRequest.d.ts +20 -0
  11. package/bin/whatsappConnector/dtos/ConnectorSendMessageRequest.js +59 -0
  12. package/bin/whatsappConnector/dtos/ConnectorSendMessageResponse.d.ts +9 -0
  13. package/bin/whatsappConnector/dtos/ConnectorSendMessageResponse.js +30 -0
  14. package/bin/whatsappConnector/dtos/SelectedProvider.d.ts +17 -0
  15. package/bin/whatsappConnector/dtos/SelectedProvider.js +45 -0
  16. package/bin/whatsappConnector/index.d.ts +3 -0
  17. package/bin/whatsappConnector/index.js +19 -0
  18. package/package.json +1 -1
  19. package/src/identity/dtos/PeopleResponse.ts +31 -3
  20. package/src/index.ts +1 -0
  21. package/src/messagesConnector/enums/DeliveryChannelExtendedEnum.ts +2 -0
  22. package/src/whatsappConnector/dtos/ConnectorSendMessageRequest.ts +28 -0
  23. package/src/whatsappConnector/dtos/ConnectorSendMessageResponse.ts +13 -0
  24. package/src/whatsappConnector/dtos/SelectedProvider.ts +23 -0
  25. package/src/whatsappConnector/index.ts +3 -0
@@ -2,12 +2,13 @@ import 'reflect-metadata';
2
2
  import { DeliveryChannelExtendedEnum, MessagingSlotEnum } from '../../../src/messagesConnector/index';
3
3
 
4
4
  describe('DeliveryChannelExtendedEnum', () => {
5
- it('incluye MDM junto a los tres canales que ya existían', () => {
5
+ it('incluye MDM y WHATSAPP junto a los tres canales que ya existían', () => {
6
6
  expect(Object.values(DeliveryChannelExtendedEnum).sort()).toEqual([
7
7
  'MAIL',
8
8
  'MDM',
9
9
  'PUSH_NOTIFICATION',
10
10
  'SMS',
11
+ 'WHATSAPP',
11
12
  ]);
12
13
  });
13
14
 
@@ -0,0 +1,97 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { ConnectorSendMessageRequest } from '../../../src/whatsappConnector/dtos/ConnectorSendMessageRequest';
5
+ import { DeliveryChannelExtendedEnum } from '../../../src/messagesConnector/index';
6
+
7
+ const base = {
8
+ channelType: DeliveryChannelExtendedEnum.WHATSAPP,
9
+ destination: '+525512345678',
10
+ language: 'es',
11
+ tenantId: 'surekeep',
12
+ messageType: 'OTP_CODE',
13
+ selectedProvider: {
14
+ templateId: 'otp_code',
15
+ senderId: '1234567890',
16
+ contentVariables: { '1': '123456' },
17
+ secretRef: 'whatsapp-surekeep-credentials',
18
+ },
19
+ };
20
+
21
+ const errorsOn = async (payload: Record<string, unknown>, property: string) => {
22
+ const dto = plainToInstance(ConnectorSendMessageRequest, { ...base, ...payload });
23
+ const errors = await validate(dto);
24
+ return errors.filter((e) => e.property === property);
25
+ };
26
+
27
+ describe('ConnectorSendMessageRequest', () => {
28
+ it('acepta el contrato completo', async () => {
29
+ expect(await validate(plainToInstance(ConnectorSendMessageRequest, base))).toEqual([]);
30
+ });
31
+
32
+ describe('channelType', () => {
33
+ it('acepta un valor del enum', async () => {
34
+ expect(await errorsOn({ channelType: DeliveryChannelExtendedEnum.WHATSAPP }, 'channelType')).toHaveLength(0);
35
+ });
36
+
37
+ it('rechaza un valor fuera del enum', async () => {
38
+ expect(await errorsOn({ channelType: 'TELEGRAM' }, 'channelType')).not.toHaveLength(0);
39
+ });
40
+
41
+ it('rechaza el vacío', async () => {
42
+ expect(await errorsOn({ channelType: '' }, 'channelType')).not.toHaveLength(0);
43
+ });
44
+
45
+ it('rechaza la ausencia', async () => {
46
+ expect(await errorsOn({ channelType: undefined }, 'channelType')).not.toHaveLength(0);
47
+ });
48
+ });
49
+
50
+ describe('destination', () => {
51
+ it('acepta un destino válido', async () => {
52
+ expect(await errorsOn({ destination: '+525512345678' }, 'destination')).toHaveLength(0);
53
+ });
54
+
55
+ it('rechaza el vacío', async () => {
56
+ expect(await errorsOn({ destination: '' }, 'destination')).not.toHaveLength(0);
57
+ });
58
+
59
+ it('rechaza la ausencia', async () => {
60
+ expect(await errorsOn({ destination: undefined }, 'destination')).not.toHaveLength(0);
61
+ });
62
+ });
63
+
64
+ describe('language', () => {
65
+ it('rechaza el vacío', async () => {
66
+ expect(await errorsOn({ language: '' }, 'language')).not.toHaveLength(0);
67
+ });
68
+
69
+ it('rechaza la ausencia', async () => {
70
+ expect(await errorsOn({ language: undefined }, 'language')).not.toHaveLength(0);
71
+ });
72
+ });
73
+
74
+ describe('tenantId', () => {
75
+ it('rechaza el vacío', async () => {
76
+ expect(await errorsOn({ tenantId: '' }, 'tenantId')).not.toHaveLength(0);
77
+ });
78
+
79
+ it('rechaza la ausencia', async () => {
80
+ expect(await errorsOn({ tenantId: undefined }, 'tenantId')).not.toHaveLength(0);
81
+ });
82
+ });
83
+
84
+ describe('selectedProvider', () => {
85
+ it('valida el proveedor anidado', async () => {
86
+ expect(await errorsOn({ selectedProvider: { templateId: '', senderId: '' } }, 'selectedProvider')).not.toHaveLength(0);
87
+ });
88
+
89
+ it('rechaza la ausencia', async () => {
90
+ expect(await errorsOn({ selectedProvider: undefined }, 'selectedProvider')).not.toHaveLength(0);
91
+ });
92
+ });
93
+
94
+ it('messageType sigue siendo opcional', async () => {
95
+ expect(await errorsOn({ messageType: undefined }, 'messageType')).toHaveLength(0);
96
+ });
97
+ });
@@ -0,0 +1,16 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { ConnectorSendMessageResponse } from '../../../src/whatsappConnector/dtos/ConnectorSendMessageResponse';
5
+
6
+ describe('ConnectorSendMessageResponse', () => {
7
+ it('acepta el id y el estado que devuelve Meta', async () => {
8
+ const dto = plainToInstance(ConnectorSendMessageResponse, { providerMessageId: 'wamid.HBg', status: 'accepted' });
9
+ expect(await validate(dto)).toEqual([]);
10
+ });
11
+
12
+ it('rechaza un id que no es string', async () => {
13
+ const dto = plainToInstance(ConnectorSendMessageResponse, { providerMessageId: 42, status: 'accepted' });
14
+ expect(await validate(dto)).not.toHaveLength(0);
15
+ });
16
+ });
@@ -0,0 +1,39 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { SelectedProvider } from '../../../src/whatsappConnector/dtos/SelectedProvider';
5
+
6
+ const base = {
7
+ templateId: 'otp_code',
8
+ senderId: '1234567890',
9
+ contentVariables: { '1': '123456' },
10
+ secretRef: 'whatsapp-surekeep-credentials',
11
+ };
12
+
13
+ const build = (over: Record<string, unknown> = {}) => plainToInstance(SelectedProvider, { ...base, ...over });
14
+
15
+ describe('SelectedProvider', () => {
16
+ it('acepta el proveedor ya resuelto', async () => {
17
+ expect(await validate(build())).toEqual([]);
18
+ });
19
+
20
+ it('rechaza templateId vacío', async () => {
21
+ expect(await validate(build({ templateId: '' }))).not.toHaveLength(0);
22
+ });
23
+
24
+ it('rechaza senderId vacío', async () => {
25
+ expect(await validate(build({ senderId: '' }))).not.toHaveLength(0);
26
+ });
27
+
28
+ it('rechaza secretRef vacío', async () => {
29
+ expect(await validate(build({ secretRef: '' }))).not.toHaveLength(0);
30
+ });
31
+
32
+ it('rechaza la ausencia de secretRef', async () => {
33
+ expect(await validate(build({ secretRef: undefined }))).not.toHaveLength(0);
34
+ });
35
+
36
+ it('deja contentVariables opcional', async () => {
37
+ expect(await validate(build({ contentVariables: undefined }))).toEqual([]);
38
+ });
39
+ });
@@ -17,11 +17,39 @@ export declare class PeopleResponse {
17
17
  indexName: string | null;
18
18
  /**
19
19
  * Nombre a imprimir en la tarjeta, derivado de usNames y usLastNames por el
20
- * lambda de identidad: MAYUSCULAS sin acentos y maximo 21 caracteres, que es
21
- * el limite de name_on_card en Central Payments. Solo de lectura para los
22
- * consumidores; se recalcula solo en cada guardado de la persona.
20
+ * lambda de identidad: MAYUSCULAS y maximo 21 caracteres, que es el limite de
21
+ * name_on_card en Central Payments.
22
+ *
23
+ * Los diacriticos SI se conservan: si el apellido es Peña, viaja Peña. El
24
+ * conector manda los nombres al proveedor sin plegarlos, asi que plegarlos
25
+ * aqui alejaria el valor esperado de lo que el proveedor recibio.
26
+ *
27
+ * Solo de lectura para los consumidores. Se recalcula en cada guardado que
28
+ * traiga los DOS nombres de origen; un guardado parcial no lo toca, para no
29
+ * pisar un valor bueno con uno calculado a medias.
23
30
  */
24
31
  usName21: string | null;
32
+ /**
33
+ * El mismo nombre de usName21, partido en dos, porque es asi como viaja al
34
+ * proveedor: usName21First va a first_name y usName21Second a last_name, y de
35
+ * esos dos campos el proveedor DERIVA el nombre que imprime. No hay otro camino
36
+ * para cambiar lo impreso.
37
+ *
38
+ * El corte cae en la frontera entre usNames y usLastNames, NO en una posicion
39
+ * fija: MARIA CARMEN CRUZ queda como "MARIA CARMEN" y "CRUZ". Ninguna parte
40
+ * empieza ni termina con espacio, y ninguna parte una palabra al medio salvo
41
+ * cuando el apellido por si solo ya no cabe en 21.
42
+ *
43
+ * Invariante: con las dos partes presentes, usName21First + " " + usName21Second
44
+ * es exactamente usName21 — el espacio del borde se consume como separador, que
45
+ * es el mismo que el proveedor intercala al imprimir. De ahi que las dos partes
46
+ * sumen como maximo 20, no 21. Si una viene vacia, la otra es usName21 completo.
47
+ *
48
+ * Son ADITIVOS: usName21 se sigue guardando completo, asi que quien ya lo lee no
49
+ * necesita cambiar nada.
50
+ */
51
+ usName21First: string | null;
52
+ usName21Second: string | null;
25
53
  preferredName: string | null;
26
54
  usSuffix: string | null;
27
55
  usLastNames: string | null;
package/bin/index.d.ts CHANGED
@@ -81,6 +81,7 @@ export * as MilestoneBusiness from './milestone-business';
81
81
  export * as Mdm from './mdm';
82
82
  export * as MessagesConnector from './messagesConnector';
83
83
  export * as TwilioConnector from './twilioConnector';
84
+ export * as WhatsappConnector from './whatsappConnector';
84
85
  export * as CognitoBackofficeConnector from './cognitoBackofficeConnector';
85
86
  export * as PlatformRbac from './platformRbac';
86
87
  export * as Remittance from './remittance';
package/bin/index.js CHANGED
@@ -37,8 +37,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  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.Biometrics = exports.MetamapConnector = exports.Account = exports.Crypto = void 0;
40
- exports.LoanConfig = exports.DatalakeQuery = exports.RetailWizard = exports.RetailCustomer = exports.RetailCards = exports.RetailCatalog = exports.RetailCommission = 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 = exports.Device = exports.Observations = void 0;
41
- exports.Membership = exports.WebhookBusiness = exports.PeopleBusiness = exports.UserConfirmations = exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.Shortlink = void 0;
40
+ exports.DatalakeQuery = exports.RetailWizard = exports.RetailCustomer = exports.RetailCards = exports.RetailCatalog = exports.RetailCommission = exports.RetailOrg = exports.EmailVerification = exports.NetworkConnector = exports.Modelias = exports.TotpSecurity = exports.Passport = exports.WalletFunding = exports.Remittance = exports.PlatformRbac = exports.CognitoBackofficeConnector = exports.WhatsappConnector = 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 = exports.Device = exports.Observations = void 0;
41
+ exports.Membership = exports.WebhookBusiness = exports.PeopleBusiness = exports.UserConfirmations = exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.Shortlink = exports.LoanConfig = void 0;
42
42
  exports.Crypto = __importStar(require("./crypto"));
43
43
  exports.Account = __importStar(require("./account"));
44
44
  exports.MetamapConnector = __importStar(require("./metamapConnector"));
@@ -122,6 +122,7 @@ exports.MilestoneBusiness = __importStar(require("./milestone-business"));
122
122
  exports.Mdm = __importStar(require("./mdm"));
123
123
  exports.MessagesConnector = __importStar(require("./messagesConnector"));
124
124
  exports.TwilioConnector = __importStar(require("./twilioConnector"));
125
+ exports.WhatsappConnector = __importStar(require("./whatsappConnector"));
125
126
  exports.CognitoBackofficeConnector = __importStar(require("./cognitoBackofficeConnector"));
126
127
  // PlatformRbac: módulo del lambda platform-rbac-business (Fase 0 SureKeep).
127
128
  // Contiene Permission enum + AuthContext + RoleAssignmentInfo + PermissionScope +
@@ -3,5 +3,7 @@ export declare enum DeliveryChannelExtendedEnum {
3
3
  MAIL = "MAIL",
4
4
  PUSH_NOTIFICATION = "PUSH_NOTIFICATION",
5
5
  /** Aviso en la pantalla del equipo financiado. Se entrega por IMEI, no por teléfono ni correo. */
6
- MDM = "MDM"
6
+ MDM = "MDM",
7
+ /** Mensaje por WhatsApp. Se entrega por teléfono; el connector normaliza el número antes de enviar. */
8
+ WHATSAPP = "WHATSAPP"
7
9
  }
@@ -8,4 +8,6 @@ var DeliveryChannelExtendedEnum;
8
8
  DeliveryChannelExtendedEnum["PUSH_NOTIFICATION"] = "PUSH_NOTIFICATION";
9
9
  /** Aviso en la pantalla del equipo financiado. Se entrega por IMEI, no por teléfono ni correo. */
10
10
  DeliveryChannelExtendedEnum["MDM"] = "MDM";
11
+ /** Mensaje por WhatsApp. Se entrega por teléfono; el connector normaliza el número antes de enviar. */
12
+ DeliveryChannelExtendedEnum["WHATSAPP"] = "WHATSAPP";
11
13
  })(DeliveryChannelExtendedEnum || (exports.DeliveryChannelExtendedEnum = DeliveryChannelExtendedEnum = {}));
@@ -0,0 +1,20 @@
1
+ import { DeliveryChannelExtendedEnum } from '../../messagesConnector/index';
2
+ import { SelectedProvider } from './SelectedProvider';
3
+ /**
4
+ * Contrato de entrada `messages-business → whatsapp-connector`.
5
+ * El proveedor llega ya resuelto: el connector solo transmite a Meta.
6
+ */
7
+ export declare class ConnectorSendMessageRequest {
8
+ /** Canal de entrega. Acepta cualquier valor de `DeliveryChannelExtendedEnum`. */
9
+ channelType: DeliveryChannelExtendedEnum;
10
+ /** Teléfono destino. El connector lo normaliza a E.164 antes de enviar. Ej: "+525512345678". */
11
+ destination: string;
12
+ /** Tipo de mensaje de dominio. Ej: "OTP_CODE". Solo para logging/trazabilidad. */
13
+ messageType?: string;
14
+ /** Idioma de la plantilla. Ej: "es". Obligatorio: Meta lo exige en cada envío. */
15
+ language: string;
16
+ /** Tenant dueño del envío. El connector valida contra el que corresponde al `secretRef`. */
17
+ tenantId: string;
18
+ /** Proveedor ya seleccionado y resuelto por messages-business. */
19
+ selectedProvider: SelectedProvider;
20
+ }
@@ -0,0 +1,59 @@
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.ConnectorSendMessageRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const index_1 = require("../../messagesConnector/index");
16
+ const SelectedProvider_1 = require("./SelectedProvider");
17
+ /**
18
+ * Contrato de entrada `messages-business → whatsapp-connector`.
19
+ * El proveedor llega ya resuelto: el connector solo transmite a Meta.
20
+ */
21
+ class ConnectorSendMessageRequest {
22
+ }
23
+ exports.ConnectorSendMessageRequest = ConnectorSendMessageRequest;
24
+ __decorate([
25
+ (0, class_transformer_1.Expose)(),
26
+ (0, class_validator_1.IsEnum)(index_1.DeliveryChannelExtendedEnum),
27
+ __metadata("design:type", String)
28
+ ], ConnectorSendMessageRequest.prototype, "channelType", void 0);
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ (0, class_validator_1.IsString)(),
32
+ (0, class_validator_1.IsNotEmpty)(),
33
+ __metadata("design:type", String)
34
+ ], ConnectorSendMessageRequest.prototype, "destination", void 0);
35
+ __decorate([
36
+ (0, class_transformer_1.Expose)(),
37
+ (0, class_validator_1.IsOptional)(),
38
+ (0, class_validator_1.IsString)(),
39
+ __metadata("design:type", String)
40
+ ], ConnectorSendMessageRequest.prototype, "messageType", void 0);
41
+ __decorate([
42
+ (0, class_transformer_1.Expose)(),
43
+ (0, class_validator_1.IsString)(),
44
+ (0, class_validator_1.IsNotEmpty)(),
45
+ __metadata("design:type", String)
46
+ ], ConnectorSendMessageRequest.prototype, "language", void 0);
47
+ __decorate([
48
+ (0, class_transformer_1.Expose)(),
49
+ (0, class_validator_1.IsString)(),
50
+ (0, class_validator_1.IsNotEmpty)(),
51
+ __metadata("design:type", String)
52
+ ], ConnectorSendMessageRequest.prototype, "tenantId", void 0);
53
+ __decorate([
54
+ (0, class_transformer_1.Expose)(),
55
+ (0, class_validator_1.IsDefined)(),
56
+ (0, class_validator_1.ValidateNested)(),
57
+ (0, class_transformer_1.Type)(() => SelectedProvider_1.SelectedProvider),
58
+ __metadata("design:type", SelectedProvider_1.SelectedProvider)
59
+ ], ConnectorSendMessageRequest.prototype, "selectedProvider", void 0);
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Respuesta del whatsapp-connector tras delegar el envío a Meta.
3
+ */
4
+ export declare class ConnectorSendMessageResponse {
5
+ /** Id del mensaje generado por Meta (wamid...). */
6
+ providerMessageId: string;
7
+ /** Estado reportado por Meta al momento del envío (accepted, sent, ...). */
8
+ status: string;
9
+ }
@@ -0,0 +1,30 @@
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.ConnectorSendMessageResponse = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * Respuesta del whatsapp-connector tras delegar el envío a Meta.
17
+ */
18
+ class ConnectorSendMessageResponse {
19
+ }
20
+ exports.ConnectorSendMessageResponse = ConnectorSendMessageResponse;
21
+ __decorate([
22
+ (0, class_transformer_1.Expose)(),
23
+ (0, class_validator_1.IsString)(),
24
+ __metadata("design:type", String)
25
+ ], ConnectorSendMessageResponse.prototype, "providerMessageId", void 0);
26
+ __decorate([
27
+ (0, class_transformer_1.Expose)(),
28
+ (0, class_validator_1.IsString)(),
29
+ __metadata("design:type", String)
30
+ ], ConnectorSendMessageResponse.prototype, "status", void 0);
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Proveedor ya resuelto por messages-business desde el `senderConfig` del `(tenant, channel)`.
3
+ * Los nombres son genéricos para no acoplar el contrato al vocabulario del proveedor.
4
+ */
5
+ export declare class SelectedProvider {
6
+ /** Plantilla del proveedor ya resuelta. Para Meta = nombre de la plantilla aprobada. */
7
+ templateId: string;
8
+ /** Remitente ya resuelto. Para Meta = Phone Number ID de la cuenta de WhatsApp Business. */
9
+ senderId: string;
10
+ /** Variables de la plantilla ya resueltas, keyeadas por slot posicional. Ej: { "1": "1234" }. */
11
+ contentVariables?: Record<string, string>;
12
+ /**
13
+ * Referencia (nombre/ARN) al secret de Secrets Manager con las credenciales de Meta.
14
+ * Es obligatoria: el connector valida que ese secret corresponda al `tenantId` del envío.
15
+ */
16
+ secretRef: string;
17
+ }
@@ -0,0 +1,45 @@
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.SelectedProvider = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * Proveedor ya resuelto por messages-business desde el `senderConfig` del `(tenant, channel)`.
17
+ * Los nombres son genéricos para no acoplar el contrato al vocabulario del proveedor.
18
+ */
19
+ class SelectedProvider {
20
+ }
21
+ exports.SelectedProvider = SelectedProvider;
22
+ __decorate([
23
+ (0, class_transformer_1.Expose)(),
24
+ (0, class_validator_1.IsString)(),
25
+ (0, class_validator_1.IsNotEmpty)(),
26
+ __metadata("design:type", String)
27
+ ], SelectedProvider.prototype, "templateId", void 0);
28
+ __decorate([
29
+ (0, class_transformer_1.Expose)(),
30
+ (0, class_validator_1.IsString)(),
31
+ (0, class_validator_1.IsNotEmpty)(),
32
+ __metadata("design:type", String)
33
+ ], SelectedProvider.prototype, "senderId", void 0);
34
+ __decorate([
35
+ (0, class_transformer_1.Expose)(),
36
+ (0, class_validator_1.IsOptional)(),
37
+ (0, class_validator_1.IsObject)(),
38
+ __metadata("design:type", Object)
39
+ ], SelectedProvider.prototype, "contentVariables", void 0);
40
+ __decorate([
41
+ (0, class_transformer_1.Expose)(),
42
+ (0, class_validator_1.IsString)(),
43
+ (0, class_validator_1.IsNotEmpty)(),
44
+ __metadata("design:type", String)
45
+ ], SelectedProvider.prototype, "secretRef", void 0);
@@ -0,0 +1,3 @@
1
+ export * from './dtos/SelectedProvider';
2
+ export * from './dtos/ConnectorSendMessageRequest';
3
+ export * from './dtos/ConnectorSendMessageResponse';
@@ -0,0 +1,19 @@
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
+ __exportStar(require("./dtos/SelectedProvider"), exports);
18
+ __exportStar(require("./dtos/ConnectorSendMessageRequest"), exports);
19
+ __exportStar(require("./dtos/ConnectorSendMessageResponse"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.421.0",
3
+ "version": "3.423.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -20,11 +20,39 @@ export class PeopleResponse {
20
20
  indexName: string | null;
21
21
  /**
22
22
  * Nombre a imprimir en la tarjeta, derivado de usNames y usLastNames por el
23
- * lambda de identidad: MAYUSCULAS sin acentos y maximo 21 caracteres, que es
24
- * el limite de name_on_card en Central Payments. Solo de lectura para los
25
- * consumidores; se recalcula solo en cada guardado de la persona.
23
+ * lambda de identidad: MAYUSCULAS y maximo 21 caracteres, que es el limite de
24
+ * name_on_card en Central Payments.
25
+ *
26
+ * Los diacriticos SI se conservan: si el apellido es Peña, viaja Peña. El
27
+ * conector manda los nombres al proveedor sin plegarlos, asi que plegarlos
28
+ * aqui alejaria el valor esperado de lo que el proveedor recibio.
29
+ *
30
+ * Solo de lectura para los consumidores. Se recalcula en cada guardado que
31
+ * traiga los DOS nombres de origen; un guardado parcial no lo toca, para no
32
+ * pisar un valor bueno con uno calculado a medias.
26
33
  */
27
34
  usName21: string | null;
35
+ /**
36
+ * El mismo nombre de usName21, partido en dos, porque es asi como viaja al
37
+ * proveedor: usName21First va a first_name y usName21Second a last_name, y de
38
+ * esos dos campos el proveedor DERIVA el nombre que imprime. No hay otro camino
39
+ * para cambiar lo impreso.
40
+ *
41
+ * El corte cae en la frontera entre usNames y usLastNames, NO en una posicion
42
+ * fija: MARIA CARMEN CRUZ queda como "MARIA CARMEN" y "CRUZ". Ninguna parte
43
+ * empieza ni termina con espacio, y ninguna parte una palabra al medio salvo
44
+ * cuando el apellido por si solo ya no cabe en 21.
45
+ *
46
+ * Invariante: con las dos partes presentes, usName21First + " " + usName21Second
47
+ * es exactamente usName21 — el espacio del borde se consume como separador, que
48
+ * es el mismo que el proveedor intercala al imprimir. De ahi que las dos partes
49
+ * sumen como maximo 20, no 21. Si una viene vacia, la otra es usName21 completo.
50
+ *
51
+ * Son ADITIVOS: usName21 se sigue guardando completo, asi que quien ya lo lee no
52
+ * necesita cambiar nada.
53
+ */
54
+ usName21First: string | null;
55
+ usName21Second: string | null;
28
56
  preferredName: string | null;
29
57
  usSuffix: string | null;
30
58
  usLastNames: string | null;
package/src/index.ts CHANGED
@@ -81,6 +81,7 @@ export * as MilestoneBusiness from './milestone-business';
81
81
  export * as Mdm from './mdm';
82
82
  export * as MessagesConnector from './messagesConnector';
83
83
  export * as TwilioConnector from './twilioConnector';
84
+ export * as WhatsappConnector from './whatsappConnector';
84
85
  export * as CognitoBackofficeConnector from './cognitoBackofficeConnector';
85
86
  // PlatformRbac: módulo del lambda platform-rbac-business (Fase 0 SureKeep).
86
87
  // Contiene Permission enum + AuthContext + RoleAssignmentInfo + PermissionScope +
@@ -4,4 +4,6 @@ export enum DeliveryChannelExtendedEnum {
4
4
  PUSH_NOTIFICATION = 'PUSH_NOTIFICATION',
5
5
  /** Aviso en la pantalla del equipo financiado. Se entrega por IMEI, no por teléfono ni correo. */
6
6
  MDM = 'MDM',
7
+ /** Mensaje por WhatsApp. Se entrega por teléfono; el connector normaliza el número antes de enviar. */
8
+ WHATSAPP = 'WHATSAPP',
7
9
  }
@@ -0,0 +1,28 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsDefined, IsEnum, IsNotEmpty, IsOptional, IsString, ValidateNested } from 'class-validator';
3
+ import { DeliveryChannelExtendedEnum } from '../../messagesConnector/index';
4
+ import { SelectedProvider } from './SelectedProvider';
5
+
6
+ /**
7
+ * Contrato de entrada `messages-business → whatsapp-connector`.
8
+ * El proveedor llega ya resuelto: el connector solo transmite a Meta.
9
+ */
10
+ export class ConnectorSendMessageRequest {
11
+ /** Canal de entrega. Acepta cualquier valor de `DeliveryChannelExtendedEnum`. */
12
+ @Expose() @IsEnum(DeliveryChannelExtendedEnum) channelType!: DeliveryChannelExtendedEnum;
13
+
14
+ /** Teléfono destino. El connector lo normaliza a E.164 antes de enviar. Ej: "+525512345678". */
15
+ @Expose() @IsString() @IsNotEmpty() destination!: string;
16
+
17
+ /** Tipo de mensaje de dominio. Ej: "OTP_CODE". Solo para logging/trazabilidad. */
18
+ @Expose() @IsOptional() @IsString() messageType?: string;
19
+
20
+ /** Idioma de la plantilla. Ej: "es". Obligatorio: Meta lo exige en cada envío. */
21
+ @Expose() @IsString() @IsNotEmpty() language!: string;
22
+
23
+ /** Tenant dueño del envío. El connector valida contra el que corresponde al `secretRef`. */
24
+ @Expose() @IsString() @IsNotEmpty() tenantId!: string;
25
+
26
+ /** Proveedor ya seleccionado y resuelto por messages-business. */
27
+ @Expose() @IsDefined() @ValidateNested() @Type(() => SelectedProvider) selectedProvider!: SelectedProvider;
28
+ }
@@ -0,0 +1,13 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsString } from 'class-validator';
3
+
4
+ /**
5
+ * Respuesta del whatsapp-connector tras delegar el envío a Meta.
6
+ */
7
+ export class ConnectorSendMessageResponse {
8
+ /** Id del mensaje generado por Meta (wamid...). */
9
+ @Expose() @IsString() providerMessageId!: string;
10
+
11
+ /** Estado reportado por Meta al momento del envío (accepted, sent, ...). */
12
+ @Expose() @IsString() status!: string;
13
+ }
@@ -0,0 +1,23 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsNotEmpty, IsObject, IsOptional, IsString } from 'class-validator';
3
+
4
+ /**
5
+ * Proveedor ya resuelto por messages-business desde el `senderConfig` del `(tenant, channel)`.
6
+ * Los nombres son genéricos para no acoplar el contrato al vocabulario del proveedor.
7
+ */
8
+ export class SelectedProvider {
9
+ /** Plantilla del proveedor ya resuelta. Para Meta = nombre de la plantilla aprobada. */
10
+ @Expose() @IsString() @IsNotEmpty() templateId!: string;
11
+
12
+ /** Remitente ya resuelto. Para Meta = Phone Number ID de la cuenta de WhatsApp Business. */
13
+ @Expose() @IsString() @IsNotEmpty() senderId!: string;
14
+
15
+ /** Variables de la plantilla ya resueltas, keyeadas por slot posicional. Ej: { "1": "1234" }. */
16
+ @Expose() @IsOptional() @IsObject() contentVariables?: Record<string, string>;
17
+
18
+ /**
19
+ * Referencia (nombre/ARN) al secret de Secrets Manager con las credenciales de Meta.
20
+ * Es obligatoria: el connector valida que ese secret corresponda al `tenantId` del envío.
21
+ */
22
+ @Expose() @IsString() @IsNotEmpty() secretRef!: string;
23
+ }
@@ -0,0 +1,3 @@
1
+ export * from './dtos/SelectedProvider';
2
+ export * from './dtos/ConnectorSendMessageRequest';
3
+ export * from './dtos/ConnectorSendMessageResponse';