@fiado/type-kit 3.552.0 → 3.554.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 (93) hide show
  1. package/_test_/unit/common/InputPatternValidators.test.ts +64 -0
  2. package/_test_/unit/common/InputPatterns.test.ts +104 -0
  3. package/_test_/unit/retailCatalog/backofficeRequests.test.ts +1 -1
  4. package/_test_/unit/retailOrg/dtos/requests/inputPatternRequests.test.ts +93 -0
  5. package/_test_/unit/retailWizard/accessorySaleRequests.test.ts +4 -3
  6. package/_test_/unit/retailWizard/fixtures/saleWithoutCustomer.strict.ts +3 -0
  7. package/_test_/unit/retailWizard/saleWithoutCustomer.test.ts +32 -0
  8. package/bin/common/constants/InputPatterns.d.ts +25 -0
  9. package/bin/common/constants/InputPatterns.js +28 -0
  10. package/bin/common/decorators/UpperCase.d.ts +2 -0
  11. package/bin/common/decorators/UpperCase.js +7 -0
  12. package/bin/common/helpers/imeiChecksum.d.ts +2 -0
  13. package/bin/common/helpers/imeiChecksum.js +20 -0
  14. package/bin/common/index.d.ts +8 -0
  15. package/bin/common/index.js +10 -0
  16. package/bin/common/validators/IsMxPhone.d.ts +3 -0
  17. package/bin/common/validators/IsMxPhone.js +8 -0
  18. package/bin/common/validators/IsMxZipCode.d.ts +3 -0
  19. package/bin/common/validators/IsMxZipCode.js +8 -0
  20. package/bin/common/validators/IsRfc.d.ts +3 -0
  21. package/bin/common/validators/IsRfc.js +8 -0
  22. package/bin/common/validators/IsSku.d.ts +3 -0
  23. package/bin/common/validators/IsSku.js +8 -0
  24. package/bin/common/validators/matchesInputPattern.d.ts +3 -0
  25. package/bin/common/validators/matchesInputPattern.js +16 -0
  26. package/bin/helpers/constans/regex.js +2 -1
  27. package/bin/loanCredit/dtos/LoanContractDetails.js +2 -2
  28. package/bin/loanCredit/dtos/LoanDeviceEnrollItem.js +4 -4
  29. package/bin/retailCatalog/constants/SkuPattern.d.ts +2 -2
  30. package/bin/retailCatalog/constants/SkuPattern.js +5 -3
  31. package/bin/retailCatalog/dtos/ProductComponent.js +1 -1
  32. package/bin/retailCatalog/dtos/requests/BackofficeCreateKitRequest.js +1 -1
  33. package/bin/retailCatalog/dtos/requests/BackofficeCreateProductRequest.js +1 -1
  34. package/bin/retailCatalog/dtos/requests/BackofficeCreateServiceRequest.js +1 -1
  35. package/bin/retailCatalog/dtos/requests/BackofficeCreateTransferRequest.js +1 -1
  36. package/bin/retailCatalog/dtos/requests/BackofficeRegisterAdjustmentRequest.js +1 -1
  37. package/bin/retailCatalog/dtos/requests/BackofficeRegisterEntryRequest.js +1 -1
  38. package/bin/retailCatalog/dtos/requests/CreateProductRequest.js +1 -1
  39. package/bin/retailCatalog/dtos/requests/ReturnPieceCondition.js +1 -1
  40. package/bin/retailCatalog/dtos/requests/SyncInventoryRequest.js +1 -1
  41. package/bin/retailIntegration/constants/retailIntegrationLimits.d.ts +1 -1
  42. package/bin/retailIntegration/constants/retailIntegrationLimits.js +2 -2
  43. package/bin/retailOrg/dtos/requests/CreateRetailUserRequest.js +2 -1
  44. package/bin/retailOrg/dtos/requests/CreateRetailerRequest.d.ts +1 -1
  45. package/bin/retailOrg/dtos/requests/CreateRetailerRequest.js +6 -2
  46. package/bin/retailOrg/dtos/requests/CreateStoreRequest.js +2 -1
  47. package/bin/retailOrg/dtos/requests/CreateSubdistributorRequest.d.ts +1 -1
  48. package/bin/retailOrg/dtos/requests/CreateSubdistributorRequest.js +6 -2
  49. package/bin/retailOrg/dtos/requests/ProvisionRetailUserRequest.js +2 -1
  50. package/bin/retailOrg/dtos/requests/RetailAddressInput.d.ts +1 -1
  51. package/bin/retailOrg/dtos/requests/RetailAddressInput.js +2 -2
  52. package/bin/retailOrg/dtos/requests/UpdateRetailUserRequest.js +2 -1
  53. package/bin/retailOrg/dtos/requests/UpdateRetailerRequest.js +2 -1
  54. package/bin/retailOrg/dtos/requests/UpdateStoreRequest.js +2 -1
  55. package/bin/retailWizard/dtos/Sale.d.ts +2 -1
  56. package/bin/retailWizard/dtos/requests/CreateAccessorySaleRequest.d.ts +1 -2
  57. package/bin/retailWizard/dtos/requests/CreateAccessorySaleRequest.js +1 -7
  58. package/package.json +1 -1
  59. package/src/common/constants/InputPatterns.ts +32 -0
  60. package/src/common/decorators/UpperCase.ts +5 -0
  61. package/src/common/helpers/imeiChecksum.ts +16 -0
  62. package/src/common/index.ts +12 -0
  63. package/src/common/validators/IsMxPhone.ts +7 -0
  64. package/src/common/validators/IsMxZipCode.ts +7 -0
  65. package/src/common/validators/IsRfc.ts +7 -0
  66. package/src/common/validators/IsSku.ts +7 -0
  67. package/src/common/validators/matchesInputPattern.ts +24 -0
  68. package/src/helpers/constans/regex.ts +2 -1
  69. package/src/loanCredit/dtos/LoanContractDetails.ts +1 -1
  70. package/src/loanCredit/dtos/LoanDeviceEnrollItem.ts +3 -3
  71. package/src/retailCatalog/constants/SkuPattern.ts +2 -2
  72. package/src/retailCatalog/dtos/ProductComponent.ts +2 -2
  73. package/src/retailCatalog/dtos/requests/BackofficeCreateKitRequest.ts +2 -2
  74. package/src/retailCatalog/dtos/requests/BackofficeCreateProductRequest.ts +2 -2
  75. package/src/retailCatalog/dtos/requests/BackofficeCreateServiceRequest.ts +2 -2
  76. package/src/retailCatalog/dtos/requests/BackofficeCreateTransferRequest.ts +2 -2
  77. package/src/retailCatalog/dtos/requests/BackofficeRegisterAdjustmentRequest.ts +2 -2
  78. package/src/retailCatalog/dtos/requests/BackofficeRegisterEntryRequest.ts +2 -2
  79. package/src/retailCatalog/dtos/requests/CreateProductRequest.ts +2 -2
  80. package/src/retailCatalog/dtos/requests/ReturnPieceCondition.ts +2 -2
  81. package/src/retailCatalog/dtos/requests/SyncInventoryRequest.ts +2 -2
  82. package/src/retailIntegration/constants/retailIntegrationLimits.ts +2 -2
  83. package/src/retailOrg/dtos/requests/CreateRetailUserRequest.ts +2 -1
  84. package/src/retailOrg/dtos/requests/CreateRetailerRequest.ts +8 -4
  85. package/src/retailOrg/dtos/requests/CreateStoreRequest.ts +2 -1
  86. package/src/retailOrg/dtos/requests/CreateSubdistributorRequest.ts +8 -4
  87. package/src/retailOrg/dtos/requests/ProvisionRetailUserRequest.ts +2 -1
  88. package/src/retailOrg/dtos/requests/RetailAddressInput.ts +3 -3
  89. package/src/retailOrg/dtos/requests/UpdateRetailUserRequest.ts +2 -1
  90. package/src/retailOrg/dtos/requests/UpdateRetailerRequest.ts +2 -1
  91. package/src/retailOrg/dtos/requests/UpdateStoreRequest.ts +2 -1
  92. package/src/retailWizard/dtos/Sale.ts +2 -1
  93. package/src/retailWizard/dtos/requests/CreateAccessorySaleRequest.ts +1 -6
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SKU_PATTERN = void 0;
4
- /** Charset permitido para el SKU: alfanumérico + guion, 1-64 chars. */
5
- exports.SKU_PATTERN = /^[A-Za-z0-9-]+$/;
3
+ exports.SKU_MESSAGE = exports.SKU_PATTERN = void 0;
4
+ /** Charset del SKU: letras, dígitos, guiones y espacios entre palabras; el tope de 64 va con `@Length`. */
5
+ var InputPatterns_1 = require("../../common/constants/InputPatterns");
6
+ Object.defineProperty(exports, "SKU_PATTERN", { enumerable: true, get: function () { return InputPatterns_1.SKU_PATTERN; } });
7
+ Object.defineProperty(exports, "SKU_MESSAGE", { enumerable: true, get: function () { return InputPatterns_1.SKU_MESSAGE; } });
@@ -17,7 +17,7 @@ class ProductComponent {
17
17
  }
18
18
  exports.ProductComponent = ProductComponent;
19
19
  __decorate([
20
- (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: 'sku admite solo [A-Za-z0-9-]' }),
20
+ (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: SkuPattern_1.SKU_MESSAGE }),
21
21
  (0, class_validator_1.Length)(1, 64),
22
22
  (0, class_validator_1.IsString)(),
23
23
  __metadata("design:type", String)
@@ -19,7 +19,7 @@ class BackofficeCreateKitRequest {
19
19
  }
20
20
  exports.BackofficeCreateKitRequest = BackofficeCreateKitRequest;
21
21
  __decorate([
22
- (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: 'sku admite solo [A-Za-z0-9-]' }),
22
+ (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: SkuPattern_1.SKU_MESSAGE }),
23
23
  (0, class_validator_1.Length)(1, 64),
24
24
  (0, class_validator_1.IsString)(),
25
25
  __metadata("design:type", String)
@@ -25,7 +25,7 @@ class BackofficeCreateProductRequest {
25
25
  }
26
26
  exports.BackofficeCreateProductRequest = BackofficeCreateProductRequest;
27
27
  __decorate([
28
- (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: 'sku admite solo [A-Za-z0-9-]' }),
28
+ (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: SkuPattern_1.SKU_MESSAGE }),
29
29
  (0, class_validator_1.Length)(1, 64),
30
30
  (0, class_validator_1.IsString)(),
31
31
  __metadata("design:type", String)
@@ -17,7 +17,7 @@ class BackofficeCreateServiceRequest {
17
17
  }
18
18
  exports.BackofficeCreateServiceRequest = BackofficeCreateServiceRequest;
19
19
  __decorate([
20
- (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: 'sku admite solo [A-Za-z0-9-]' }),
20
+ (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: SkuPattern_1.SKU_MESSAGE }),
21
21
  (0, class_validator_1.Length)(1, 64),
22
22
  (0, class_validator_1.IsString)(),
23
23
  __metadata("design:type", String)
@@ -27,7 +27,7 @@ __decorate([
27
27
  __metadata("design:type", String)
28
28
  ], BackofficeCreateTransferRequest.prototype, "toStoreId", void 0);
29
29
  __decorate([
30
- (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: 'sku admite solo [A-Za-z0-9-]' }),
30
+ (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: SkuPattern_1.SKU_MESSAGE }),
31
31
  (0, class_validator_1.Length)(1, 64),
32
32
  (0, class_validator_1.IsString)(),
33
33
  __metadata("design:type", String)
@@ -24,7 +24,7 @@ __decorate([
24
24
  __metadata("design:type", String)
25
25
  ], BackofficeRegisterAdjustmentRequest.prototype, "storeId", void 0);
26
26
  __decorate([
27
- (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: 'sku admite solo [A-Za-z0-9-]' }),
27
+ (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: SkuPattern_1.SKU_MESSAGE }),
28
28
  (0, class_validator_1.Length)(1, 64),
29
29
  (0, class_validator_1.IsString)(),
30
30
  __metadata("design:type", String)
@@ -23,7 +23,7 @@ __decorate([
23
23
  __metadata("design:type", String)
24
24
  ], BackofficeRegisterEntryRequest.prototype, "storeId", void 0);
25
25
  __decorate([
26
- (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: 'sku admite solo [A-Za-z0-9-]' }),
26
+ (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: SkuPattern_1.SKU_MESSAGE }),
27
27
  (0, class_validator_1.Length)(1, 64),
28
28
  (0, class_validator_1.IsString)(),
29
29
  __metadata("design:type", String)
@@ -24,7 +24,7 @@ class CreateProductRequest {
24
24
  }
25
25
  exports.CreateProductRequest = CreateProductRequest;
26
26
  __decorate([
27
- (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: 'sku admite solo [A-Za-z0-9-]' }),
27
+ (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: SkuPattern_1.SKU_MESSAGE }),
28
28
  (0, class_validator_1.Length)(1, 64),
29
29
  (0, class_validator_1.IsString)(),
30
30
  __metadata("design:type", String)
@@ -24,7 +24,7 @@ class ReturnPieceCondition {
24
24
  exports.ReturnPieceCondition = ReturnPieceCondition;
25
25
  __decorate([
26
26
  (0, class_transformer_1.Expose)(),
27
- (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: 'sku admite solo [A-Za-z0-9-]' }),
27
+ (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: SkuPattern_1.SKU_MESSAGE }),
28
28
  (0, class_validator_1.Length)(1, 64),
29
29
  (0, class_validator_1.IsString)(),
30
30
  __metadata("design:type", String)
@@ -43,7 +43,7 @@ class SyncProduct {
43
43
  }
44
44
  exports.SyncProduct = SyncProduct;
45
45
  __decorate([
46
- (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: 'sku admite solo [A-Za-z0-9-]' }),
46
+ (0, class_validator_1.Matches)(SkuPattern_1.SKU_PATTERN, { message: SkuPattern_1.SKU_MESSAGE }),
47
47
  (0, class_validator_1.Length)(1, 64),
48
48
  (0, class_validator_1.IsString)(),
49
49
  __metadata("design:type", String)
@@ -14,7 +14,7 @@ export declare const RETAIL_STORE_CODE_MAX_LENGTH = 10;
14
14
  /** Código postal: de 4 a 10 caracteres. */
15
15
  export declare const RETAIL_ZIP_CODE_MIN_LENGTH = 4;
16
16
  export declare const RETAIL_ZIP_CODE_MAX_LENGTH = 10;
17
- /** SKU del catálogo del retailer. */
17
+ /** SKU del catálogo del retailer: el charset de `SKU_PATTERN` con tope de 64. */
18
18
  export declare const RETAIL_SKU_PATTERN: RegExp;
19
19
  /** Decimal del contrato: string con dos decimales, nunca negativo. */
20
20
  export declare const RETAIL_DECIMAL_PATTERN: RegExp;
@@ -17,7 +17,7 @@ exports.RETAIL_STORE_CODE_MAX_LENGTH = 10;
17
17
  /** Código postal: de 4 a 10 caracteres. */
18
18
  exports.RETAIL_ZIP_CODE_MIN_LENGTH = 4;
19
19
  exports.RETAIL_ZIP_CODE_MAX_LENGTH = 10;
20
- /** SKU del catálogo del retailer. */
21
- exports.RETAIL_SKU_PATTERN = /^[A-Za-z0-9-]{1,64}$/;
20
+ /** SKU del catálogo del retailer: el charset de `SKU_PATTERN` con tope de 64. */
21
+ exports.RETAIL_SKU_PATTERN = /^(?=.{1,64}$)[A-Za-z0-9-]+(?: +[A-Za-z0-9-]+)*$/;
22
22
  /** Decimal del contrato: string con dos decimales, nunca negativo. */
23
23
  exports.RETAIL_DECIMAL_PATTERN = /^\d+\.\d{2}$/;
@@ -14,6 +14,7 @@ const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  const CollectorSeniorityEnum_1 = require("../../enums/CollectorSeniorityEnum");
16
16
  const EmploymentTypeEnum_1 = require("../../enums/EmploymentTypeEnum");
17
+ const IsMxPhone_1 = require("../../../common/validators/IsMxPhone");
17
18
  /**
18
19
  * Body de POST /retailers/:retailerId/users — alta de usuario retail (el `retailerId` sale del path;
19
20
  * `cognitoSub` enlaza con la identidad Cognito validada vía platform-rbac por api-invoker).
@@ -56,7 +57,7 @@ __decorate([
56
57
  __decorate([
57
58
  (0, class_transformer_1.Expose)(),
58
59
  (0, class_validator_1.IsOptional)(),
59
- (0, class_validator_1.IsString)(),
60
+ (0, IsMxPhone_1.IsMxPhone)(),
60
61
  __metadata("design:type", String)
61
62
  ], CreateRetailUserRequest.prototype, "phone", void 0);
62
63
  __decorate([
@@ -9,7 +9,7 @@ export declare class CreateRetailerRequest {
9
9
  type: RetailerTypeEnum;
10
10
  name: string;
11
11
  legalName: string;
12
- /** RFC mexicano — 12 (persona moral / empresa) o 13 (persona física). */
12
+ /** RFC — 12 (persona moral) o 13 (persona física); se pasa a mayúsculas antes de validar. */
13
13
  rfc: string;
14
14
  contactEmail: string;
15
15
  contactPhone: string;
@@ -14,6 +14,9 @@ const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  const RetailerTypeEnum_1 = require("../../enums/RetailerTypeEnum");
16
16
  const RetailAddressInput_1 = require("./RetailAddressInput");
17
+ const IsMxPhone_1 = require("../../../common/validators/IsMxPhone");
18
+ const IsRfc_1 = require("../../../common/validators/IsRfc");
19
+ const UpperCase_1 = require("../../../common/decorators/UpperCase");
17
20
  /**
18
21
  * Body de POST /retailers — alta de un retailer raíz (SureKeep Fase 1 — pista Retail).
19
22
  * Los campos server-assigned (`retailerId`, `parentId`, `status`, `createdAt/By`, `updatedAt/By`)
@@ -40,7 +43,8 @@ __decorate([
40
43
  __decorate([
41
44
  (0, class_transformer_1.Expose)(),
42
45
  (0, class_validator_1.IsString)(),
43
- (0, class_validator_1.Length)(12, 13),
46
+ (0, UpperCase_1.UpperCase)(),
47
+ (0, IsRfc_1.IsRfc)(),
44
48
  __metadata("design:type", String)
45
49
  ], CreateRetailerRequest.prototype, "rfc", void 0);
46
50
  __decorate([
@@ -50,7 +54,7 @@ __decorate([
50
54
  ], CreateRetailerRequest.prototype, "contactEmail", void 0);
51
55
  __decorate([
52
56
  (0, class_transformer_1.Expose)(),
53
- (0, class_validator_1.IsString)(),
57
+ (0, IsMxPhone_1.IsMxPhone)(),
54
58
  __metadata("design:type", String)
55
59
  ], CreateRetailerRequest.prototype, "contactPhone", void 0);
56
60
  __decorate([
@@ -14,6 +14,7 @@ const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  const GeoLocation_1 = require("../GeoLocation");
16
16
  const RetailAddressInput_1 = require("./RetailAddressInput");
17
+ const IsMxPhone_1 = require("../../../common/validators/IsMxPhone");
17
18
  /**
18
19
  * Body de POST /retailers/:retailerId/stores — alta de tienda física (el `retailerId` sale del path).
19
20
  * `location` (coordenada {lat,lng}) es OBLIGATORIA; los campos nullable van presentes-pero-nulos.
@@ -54,7 +55,7 @@ __decorate([
54
55
  ], CreateStoreRequest.prototype, "location", void 0);
55
56
  __decorate([
56
57
  (0, class_transformer_1.Expose)(),
57
- (0, class_validator_1.IsString)(),
58
+ (0, IsMxPhone_1.IsMxPhone)(),
58
59
  __metadata("design:type", String)
59
60
  ], CreateStoreRequest.prototype, "phone", void 0);
60
61
  __decorate([
@@ -11,7 +11,7 @@ export declare class CreateSubdistributorRequest {
11
11
  type: RetailerTypeEnum.SUBDISTRIBUTOR | RetailerTypeEnum.FRANCHISE;
12
12
  name: string;
13
13
  legalName: string;
14
- /** RFC mexicano — 12 (persona moral / empresa) o 13 (persona física). */
14
+ /** RFC — 12 (persona moral) o 13 (persona física); se pasa a mayúsculas antes de validar. */
15
15
  rfc: string;
16
16
  contactEmail: string;
17
17
  contactPhone: string;
@@ -14,6 +14,9 @@ const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  const RetailerTypeEnum_1 = require("../../enums/RetailerTypeEnum");
16
16
  const RetailAddressInput_1 = require("./RetailAddressInput");
17
+ const IsMxPhone_1 = require("../../../common/validators/IsMxPhone");
18
+ const IsRfc_1 = require("../../../common/validators/IsRfc");
19
+ const UpperCase_1 = require("../../../common/decorators/UpperCase");
17
20
  /**
18
21
  * Body de POST /retailers/:retailerId/subdistributors — alta de un retailer hijo colgando de
19
22
  * `:retailerId` (el `parentId` sale del path param, NO del body).
@@ -42,7 +45,8 @@ __decorate([
42
45
  __decorate([
43
46
  (0, class_transformer_1.Expose)(),
44
47
  (0, class_validator_1.IsString)(),
45
- (0, class_validator_1.Length)(12, 13),
48
+ (0, UpperCase_1.UpperCase)(),
49
+ (0, IsRfc_1.IsRfc)(),
46
50
  __metadata("design:type", String)
47
51
  ], CreateSubdistributorRequest.prototype, "rfc", void 0);
48
52
  __decorate([
@@ -52,7 +56,7 @@ __decorate([
52
56
  ], CreateSubdistributorRequest.prototype, "contactEmail", void 0);
53
57
  __decorate([
54
58
  (0, class_transformer_1.Expose)(),
55
- (0, class_validator_1.IsString)(),
59
+ (0, IsMxPhone_1.IsMxPhone)(),
56
60
  __metadata("design:type", String)
57
61
  ], CreateSubdistributorRequest.prototype, "contactPhone", void 0);
58
62
  __decorate([
@@ -15,6 +15,7 @@ const class_validator_1 = require("class-validator");
15
15
  const CollectorSeniorityEnum_1 = require("../../enums/CollectorSeniorityEnum");
16
16
  const EmploymentTypeEnum_1 = require("../../enums/EmploymentTypeEnum");
17
17
  const PermissionScope_1 = require("../../../platformRbac/enums/PermissionScope");
18
+ const IsMxPhone_1 = require("../../../common/validators/IsMxPhone");
18
19
  /**
19
20
  * Body de POST /retailers/:retailerId/users/provision — alta de usuario retail ORQUESTADA (SureKeep F1,
20
21
  * scope mirror). Invierte el orden del alta clásica: en vez de recibir un `cognitoSub` ya existente,
@@ -77,7 +78,7 @@ __decorate([
77
78
  __decorate([
78
79
  (0, class_transformer_1.Expose)(),
79
80
  (0, class_validator_1.IsOptional)(),
80
- (0, class_validator_1.IsString)(),
81
+ (0, IsMxPhone_1.IsMxPhone)(),
81
82
  __metadata("design:type", String)
82
83
  ], ProvisionRetailUserRequest.prototype, "phone", void 0);
83
84
  __decorate([
@@ -23,7 +23,7 @@ export declare class RetailAddressInput {
23
23
  neighborhood?: string;
24
24
  city: string;
25
25
  state: string;
26
- /** Código postal (espejo de `LocationAddress.zipCode`). */
26
+ /** Código postal MX de 5 dígitos (espejo de `LocationAddress.zipCode`). */
27
27
  zipCode: string;
28
28
  /** País ISO. OPCIONAL — sin slot en `LocationAddress` (TD-SKF1-007). */
29
29
  country?: string;
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.RetailAddressInput = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
+ const IsMxZipCode_1 = require("../../../common/validators/IsMxZipCode");
15
16
  /**
16
17
  * Dirección comercial de entrada (input validado) para los requests de creación/edición del dominio
17
18
  * retail-org-business. A diferencia del DTO de entidad (que reutiliza `LocationAddress`, laxo a
@@ -71,8 +72,7 @@ __decorate([
71
72
  ], RetailAddressInput.prototype, "state", void 0);
72
73
  __decorate([
73
74
  (0, class_transformer_1.Expose)(),
74
- (0, class_validator_1.IsString)(),
75
- (0, class_validator_1.Length)(4, 10),
75
+ (0, IsMxZipCode_1.IsMxZipCode)(),
76
76
  __metadata("design:type", String)
77
77
  ], RetailAddressInput.prototype, "zipCode", void 0);
78
78
  __decorate([
@@ -14,6 +14,7 @@ const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  const CollectorSeniorityEnum_1 = require("../../enums/CollectorSeniorityEnum");
16
16
  const EmploymentTypeEnum_1 = require("../../enums/EmploymentTypeEnum");
17
+ const IsMxPhone_1 = require("../../../common/validators/IsMxPhone");
17
18
  /**
18
19
  * Body de PUT /users/:retailUserId — edición de usuario retail (campos editables opcionales).
19
20
  * NO edita `cognitoSub` (identidad) ni `homeStoreId` (para reubicar hay `TransferRetailUserRequest`);
@@ -49,7 +50,7 @@ __decorate([
49
50
  __decorate([
50
51
  (0, class_transformer_1.Expose)(),
51
52
  (0, class_validator_1.IsOptional)(),
52
- (0, class_validator_1.IsString)(),
53
+ (0, IsMxPhone_1.IsMxPhone)(),
53
54
  __metadata("design:type", String)
54
55
  ], UpdateRetailUserRequest.prototype, "phone", void 0);
55
56
  __decorate([
@@ -13,6 +13,7 @@ exports.UpdateRetailerRequest = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  const RetailAddressInput_1 = require("./RetailAddressInput");
16
+ const IsMxPhone_1 = require("../../../common/validators/IsMxPhone");
16
17
  /**
17
18
  * Body de PUT /retailers/:retailerId — edición de campos comerciales del retailer.
18
19
  * Solo campos editables (todos opcionales). NO se puede editar `type`, `rfc` ni `status`
@@ -42,7 +43,7 @@ __decorate([
42
43
  __decorate([
43
44
  (0, class_transformer_1.Expose)(),
44
45
  (0, class_validator_1.IsOptional)(),
45
- (0, class_validator_1.IsString)(),
46
+ (0, IsMxPhone_1.IsMxPhone)(),
46
47
  __metadata("design:type", String)
47
48
  ], UpdateRetailerRequest.prototype, "contactPhone", void 0);
48
49
  __decorate([
@@ -14,6 +14,7 @@ const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  const GeoLocation_1 = require("../GeoLocation");
16
16
  const RetailAddressInput_1 = require("./RetailAddressInput");
17
+ const IsMxPhone_1 = require("../../../common/validators/IsMxPhone");
17
18
  /**
18
19
  * Body de PUT /stores/:storeId — edición de tienda (campos editables opcionales). El status se
19
20
  * cambia con el endpoint dedicado → `ChangeStoreStatusRequest`. Si se envía `location`/`address`,
@@ -58,7 +59,7 @@ __decorate([
58
59
  __decorate([
59
60
  (0, class_transformer_1.Expose)(),
60
61
  (0, class_validator_1.IsOptional)(),
61
- (0, class_validator_1.IsString)(),
62
+ (0, IsMxPhone_1.IsMxPhone)(),
62
63
  __metadata("design:type", String)
63
64
  ], UpdateStoreRequest.prototype, "phone", void 0);
64
65
  __decorate([
@@ -18,7 +18,8 @@ export interface Sale {
18
18
  retailerId: string;
19
19
  storeId: string;
20
20
  sellerRetailUserId: string;
21
- retailCustomerId: string;
21
+ /** `null` en la venta de mostrador sin cliente. */
22
+ retailCustomerId: string | null;
22
23
  /** Sesión del wizard que cerró la venta; ausente en la venta de mostrador. */
23
24
  wizardSessionId?: string;
24
25
  /** Canal de la venta; ausente = `WIZARD` (ventas anteriores al campo). */
@@ -2,11 +2,10 @@ import { SalePaymentMethodEnum } from '../../enums/SalePaymentMethodEnum';
2
2
  import { SalePaymentDetail } from '../SalePaymentDetail';
3
3
  import { AccessorySaleLine } from '../AccessorySaleLine';
4
4
  /**
5
- * POST /wizard/accessory-sales — cierra la venta de mostrador con el celular ya verificado.
5
+ * POST /wizard/accessory-sales — cierra la venta de mostrador, sin cliente.
6
6
  * `amountCents` es lo cobrado en caja y debe igualar la suma del catálogo.
7
7
  */
8
8
  export declare class CreateAccessorySaleRequest {
9
- otpChallengeId: string;
10
9
  lines: AccessorySaleLine[];
11
10
  paymentMethod: SalePaymentMethodEnum;
12
11
  amountCents: number;
@@ -16,18 +16,12 @@ const SalePaymentMethodEnum_1 = require("../../enums/SalePaymentMethodEnum");
16
16
  const SalePaymentDetail_1 = require("../SalePaymentDetail");
17
17
  const AccessorySaleLine_1 = require("../AccessorySaleLine");
18
18
  /**
19
- * POST /wizard/accessory-sales — cierra la venta de mostrador con el celular ya verificado.
19
+ * POST /wizard/accessory-sales — cierra la venta de mostrador, sin cliente.
20
20
  * `amountCents` es lo cobrado en caja y debe igualar la suma del catálogo.
21
21
  */
22
22
  class CreateAccessorySaleRequest {
23
23
  }
24
24
  exports.CreateAccessorySaleRequest = CreateAccessorySaleRequest;
25
- __decorate([
26
- (0, class_transformer_1.Expose)(),
27
- (0, class_validator_1.IsString)(),
28
- (0, class_validator_1.MinLength)(1),
29
- __metadata("design:type", String)
30
- ], CreateAccessorySaleRequest.prototype, "otpChallengeId", void 0);
31
25
  __decorate([
32
26
  (0, class_transformer_1.Expose)(),
33
27
  (0, class_validator_1.IsArray)(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.552.0",
3
+ "version": "3.554.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,32 @@
1
+ /** Teléfono MX tal como se teclea en la UI: exactamente 10 dígitos. */
2
+ export const PHONE_MX_PATTERN = /^\d{10}$/;
3
+
4
+ /** Teléfono MX en el backend: 10 dígitos, opcionalmente con `+52` para clientes que ya lo mandan. */
5
+ export const PHONE_MX_ACCEPTED_PATTERN = /^(?:\+52)?\d{10}$/;
6
+ export const PHONE_MX_MESSAGE = 'El teléfono debe tener 10 dígitos';
7
+
8
+ /** Correo pragmático: algo@dominio.tld, sin espacios. */
9
+ export const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
10
+ export const EMAIL_MAX_LENGTH = 254;
11
+ export const EMAIL_MESSAGE = 'Ingresa un correo válido';
12
+
13
+ /** RFC en mayúsculas: 12 caracteres persona moral, 13 persona física. */
14
+ export const RFC_PATTERN = /^[A-ZÑ&]{3,4}\d{6}[A-Z\d]{3}$/;
15
+ export const RFC_MESSAGE = 'El RFC debe tener 12 o 13 caracteres con el formato del SAT';
16
+
17
+ /** Código postal MX: 5 dígitos. */
18
+ export const ZIP_CODE_MX_PATTERN = /^\d{5}$/;
19
+ export const ZIP_CODE_MX_MESSAGE = 'El código postal debe tener 5 dígitos';
20
+
21
+ /** SKU: letras, dígitos y guiones, con espacios solo entre palabras. */
22
+ export const SKU_PATTERN = /^[A-Za-z0-9-]+(?: +[A-Za-z0-9-]+)*$/;
23
+ export const SKU_MAX_LENGTH = 64;
24
+ export const SKU_MESSAGE = 'El SKU admite letras, números, guiones y espacios entre palabras (máximo 64)';
25
+
26
+ /** IMEI: 15 dígitos; el checksum se valida con `isValidImei`. */
27
+ export const IMEI_PATTERN = /^\d{15}$/;
28
+ export const IMEI_MESSAGE = 'El IMEI debe tener 15 dígitos';
29
+
30
+ /** URL https sin espacios; en DTOs de backend también sirve `@IsUrl({ protocols: ['https'], require_protocol: true })`. */
31
+ export const HTTPS_URL_PATTERN = /^https:\/\/[^\s/$.?#][^\s]*$/i;
32
+ export const HTTPS_URL_MESSAGE = 'Ingresa una URL que empiece con https://';
@@ -0,0 +1,5 @@
1
+ import { Transform } from 'class-transformer';
2
+
3
+ /** Pasa un string a mayúsculas antes de validarlo; deja pasar cualquier otro tipo sin tocarlo. */
4
+ export const UpperCase = (): PropertyDecorator =>
5
+ Transform(({ value }) => (typeof value === 'string' ? value.toUpperCase() : value));
@@ -0,0 +1,16 @@
1
+ import { IMEI_PATTERN } from '../constants/InputPatterns';
2
+
3
+ /** Valida un IMEI: 15 dígitos y checksum Luhn. */
4
+ export function isValidImei(imei: string): boolean {
5
+ if (!IMEI_PATTERN.test(imei)) return false;
6
+ let sum = 0;
7
+ for (let i = 0; i < 15; i++) {
8
+ let digit = Number(imei[i]);
9
+ if (i % 2 === 1) {
10
+ digit *= 2;
11
+ if (digit > 9) digit -= 9;
12
+ }
13
+ sum += digit;
14
+ }
15
+ return sum % 10 === 0;
16
+ }
@@ -1,8 +1,20 @@
1
+ //constants
2
+ export * from './constants/InputPatterns';
3
+
4
+ //helpers
5
+ export * from './helpers/imeiChecksum';
6
+
1
7
  //decorators
2
8
  export * from './decorators/Trim';
9
+ export * from './decorators/UpperCase';
3
10
 
4
11
  //validators
5
12
  export * from './validators/IsStringValueRecord';
13
+ export * from './validators/matchesInputPattern';
14
+ export * from './validators/IsMxPhone';
15
+ export * from './validators/IsMxZipCode';
16
+ export * from './validators/IsRfc';
17
+ export * from './validators/IsSku';
6
18
 
7
19
  //dtos
8
20
  export * from './dtos/ProcessValidationResultDto';
@@ -0,0 +1,7 @@
1
+ import { ValidationOptions } from 'class-validator';
2
+ import { PHONE_MX_ACCEPTED_PATTERN, PHONE_MX_MESSAGE } from '../constants/InputPatterns';
3
+ import { matchesInputPattern } from './matchesInputPattern';
4
+
5
+ /** Teléfono MX de 10 dígitos; admite el prefijo `+52`. */
6
+ export const IsMxPhone = (validationOptions?: ValidationOptions): PropertyDecorator =>
7
+ matchesInputPattern('isMxPhone', PHONE_MX_ACCEPTED_PATTERN, PHONE_MX_MESSAGE, validationOptions);
@@ -0,0 +1,7 @@
1
+ import { ValidationOptions } from 'class-validator';
2
+ import { ZIP_CODE_MX_MESSAGE, ZIP_CODE_MX_PATTERN } from '../constants/InputPatterns';
3
+ import { matchesInputPattern } from './matchesInputPattern';
4
+
5
+ /** Código postal MX de 5 dígitos. */
6
+ export const IsMxZipCode = (validationOptions?: ValidationOptions): PropertyDecorator =>
7
+ matchesInputPattern('isMxZipCode', ZIP_CODE_MX_PATTERN, ZIP_CODE_MX_MESSAGE, validationOptions);
@@ -0,0 +1,7 @@
1
+ import { ValidationOptions } from 'class-validator';
2
+ import { RFC_MESSAGE, RFC_PATTERN } from '../constants/InputPatterns';
3
+ import { matchesInputPattern } from './matchesInputPattern';
4
+
5
+ /** RFC en mayúsculas; combínalo con `@UpperCase()` para normalizar la entrada. */
6
+ export const IsRfc = (validationOptions?: ValidationOptions): PropertyDecorator =>
7
+ matchesInputPattern('isRfc', RFC_PATTERN, RFC_MESSAGE, validationOptions);
@@ -0,0 +1,7 @@
1
+ import { ValidationOptions } from 'class-validator';
2
+ import { SKU_MAX_LENGTH, SKU_MESSAGE, SKU_PATTERN } from '../constants/InputPatterns';
3
+ import { matchesInputPattern } from './matchesInputPattern';
4
+
5
+ /** SKU de 1 a 64 caracteres: letras, dígitos, guiones y espacios entre palabras. */
6
+ export const IsSku = (validationOptions?: ValidationOptions): PropertyDecorator =>
7
+ matchesInputPattern('isSku', SKU_PATTERN, SKU_MESSAGE, validationOptions, SKU_MAX_LENGTH);
@@ -0,0 +1,24 @@
1
+ import { ValidateBy, ValidationOptions } from 'class-validator';
2
+
3
+ /** Arma un decorador que exige un string que cumpla `pattern` y, si se da, `maxLength`. */
4
+ export function matchesInputPattern(
5
+ name: string,
6
+ pattern: RegExp,
7
+ message: string,
8
+ validationOptions?: ValidationOptions,
9
+ maxLength?: number,
10
+ ): PropertyDecorator {
11
+ return ValidateBy(
12
+ {
13
+ name,
14
+ validator: {
15
+ validate: (value: unknown): boolean =>
16
+ typeof value === 'string' &&
17
+ (maxLength === undefined || value.length <= maxLength) &&
18
+ pattern.test(value),
19
+ defaultMessage: (): string => message,
20
+ },
21
+ },
22
+ validationOptions,
23
+ );
24
+ }
@@ -1,3 +1,4 @@
1
+ import { PHONE_MX_PATTERN } from '../../common/constants/InputPatterns';
1
2
 
2
3
 
3
4
  // Expresión regular para validar UUID v4
@@ -21,7 +22,7 @@ export const regexCurp =
21
22
 
22
23
  // Teléfono MX: exactamente 10 dígitos (se normalizan espacios/guiones antes de validar).
23
24
  // Usado por retailCustomer y retailWizard. SureKeep Fase 2 — pista Retail.
24
- export const regexPhoneMx = /^\d{10}$/;
25
+ export const regexPhoneMx = PHONE_MX_PATTERN;
25
26
 
26
27
 
27
28
 
@@ -6,7 +6,7 @@ const SHORT_TEXT = 120;
6
6
  /** Largo máximo de un texto largo del contrato (nombre, domicilio, razón social). */
7
7
  const LONG_TEXT = 300;
8
8
  /** IMEI: exactamente 15 dígitos. */
9
- const IMEI_PATTERN = /^\d{15}$/;
9
+ import { IMEI_PATTERN } from '../../common/constants/InputPatterns';
10
10
 
11
11
  /** Datos del acreditado tal como se imprimen en el contrato (Sección II.1). */
12
12
  export class LoanContractBorrowerDetails {
@@ -1,10 +1,10 @@
1
1
  import { Expose } from 'class-transformer';
2
2
  import { IsISO8601, IsInt, IsNotEmpty, IsOptional, IsPositive, IsString, Matches, Max, MaxLength } from 'class-validator';
3
- import { SKU_PATTERN } from '../../retailCatalog/constants/SkuPattern';
3
+ import { SKU_MESSAGE, SKU_PATTERN } from '../../retailCatalog/constants/SkuPattern';
4
4
  import { CREDIT_ID_MESSAGE, CREDIT_ID_PATTERN } from '../constants/CreditIdPattern';
5
5
 
6
6
  /** Charset y largo del IMEI: exactamente 15 dígitos. */
7
- const IMEI_PATTERN = /^\d{15}$/;
7
+ import { IMEI_PATTERN } from '../../common/constants/InputPatterns';
8
8
 
9
9
  /** Plazo máximo del crédito en meses. */
10
10
  const MAX_TERM_MONTHS = 60;
@@ -32,7 +32,7 @@ export class LoanDeviceEnrollItem {
32
32
  @IsString()
33
33
  @IsNotEmpty()
34
34
  @MaxLength(64)
35
- @Matches(SKU_PATTERN, { message: 'productSku admite solo [A-Za-z0-9-]' })
35
+ @Matches(SKU_PATTERN, { message: SKU_MESSAGE })
36
36
  productSku: string;
37
37
 
38
38
  @Expose()
@@ -1,2 +1,2 @@
1
- /** Charset permitido para el SKU: alfanumérico + guion, 1-64 chars. */
2
- export const SKU_PATTERN = /^[A-Za-z0-9-]+$/;
1
+ /** Charset del SKU: letras, dígitos, guiones y espacios entre palabras; el tope de 64 va con `@Length`. */
2
+ export { SKU_PATTERN, SKU_MESSAGE } from '../../common/constants/InputPatterns';
@@ -1,9 +1,9 @@
1
1
  import { IsInt, IsString, Length, Matches, Min } from 'class-validator';
2
- import { SKU_PATTERN } from '../constants/SkuPattern';
2
+ import { SKU_MESSAGE, SKU_PATTERN } from '../constants/SkuPattern';
3
3
 
4
4
  /** Componente de un kit (BUNDLE): qué SKU consume y cuántas piezas por kit. */
5
5
  export class ProductComponent {
6
- @Matches(SKU_PATTERN, { message: 'sku admite solo [A-Za-z0-9-]' })
6
+ @Matches(SKU_PATTERN, { message: SKU_MESSAGE })
7
7
  @Length(1, 64)
8
8
  @IsString()
9
9
  sku!: string;