@fiado/type-kit 3.577.0 → 3.579.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 (166) hide show
  1. package/_test_/unit/platformRbac/dtos/levelEntityAdminDtos.test.ts +14 -0
  2. package/_test_/unit/retailCatalog/catalogEnums.test.ts +2 -2
  3. package/_test_/unit/retailCatalog/centralSaleAccepted.test.ts +54 -0
  4. package/_test_/unit/retailCatalog/sellInventoryRequest.test.ts +25 -0
  5. package/_test_/unit/retailCatalog/stockRequests.test.ts +14 -4
  6. package/_test_/unit/retailCatalog/ventaSaga.test.ts +7 -0
  7. package/_test_/unit/retailIntegration/reconciliationContracts.test.ts +121 -0
  8. package/_test_/unit/retailIntegration/retailIntegrationErrorCodes.test.ts +37 -0
  9. package/_test_/unit/retailIntegration/retailOutboundRequests.test.ts +46 -15
  10. package/_test_/unit/retailIntegration/retailSaleContracts.test.ts +160 -0
  11. package/_test_/unit/retailIntegration/retailSystemEnums.test.ts +1 -1
  12. package/_test_/unit/retailOrg/dtos/retailerIntegration.test.ts +92 -0
  13. package/_test_/unit/retailWizard/centralOutboundAndLiveCheck.test.ts +63 -0
  14. package/_test_/unit/retailWizard/centralSaleStatus.test.ts +49 -0
  15. package/_test_/unit/retailWizard/customerTableShapes.test.ts +22 -0
  16. package/_test_/unit/retailWizard/multiItemShapes.test.ts +2 -2
  17. package/bin/platformRbac/dtos/UpdateLevelEntityRequest.d.ts +3 -1
  18. package/bin/platformRbac/dtos/UpdateLevelEntityRequest.js +8 -1
  19. package/bin/retailCatalog/dtos/requests/ReturnStockRequest.d.ts +2 -0
  20. package/bin/retailCatalog/dtos/requests/ReturnStockRequest.js +5 -0
  21. package/bin/retailCatalog/dtos/requests/SellInventoryRequest.d.ts +9 -0
  22. package/bin/retailCatalog/dtos/requests/SellInventoryRequest.js +32 -0
  23. package/bin/retailCatalog/dtos/requests/SellStockRequest.d.ts +2 -2
  24. package/bin/retailCatalog/dtos/requests/SellStockRequest.js +1 -1
  25. package/bin/retailCatalog/enums/InventoryInboundMessageTypeEnum.d.ts +2 -1
  26. package/bin/retailCatalog/enums/InventoryInboundMessageTypeEnum.js +1 -0
  27. package/bin/retailCatalog/enums/InventoryItemStatusEnum.d.ts +3 -1
  28. package/bin/retailCatalog/enums/InventoryItemStatusEnum.js +2 -0
  29. package/bin/retailCatalog/events/InventoryCentralSaleAcceptedMessage.d.ts +13 -0
  30. package/bin/retailCatalog/events/InventoryCentralSaleAcceptedMessage.js +55 -0
  31. package/bin/retailCatalog/events/InventoryInboundMessage.d.ts +2 -1
  32. package/bin/retailCatalog/events/InventorySaleAppliedMessage.d.ts +0 -2
  33. package/bin/retailCatalog/events/InventorySaleAppliedMessage.js +0 -6
  34. package/bin/retailCatalog/index.d.ts +2 -0
  35. package/bin/retailCatalog/index.js +2 -0
  36. package/bin/retailCustomer/dtos/requests/UpsertCustomerFromKycRequest.d.ts +2 -0
  37. package/bin/retailCustomer/dtos/requests/UpsertCustomerFromKycRequest.js +6 -0
  38. package/bin/retailIntegration/constants/retailIntegrationErrorHttpStatus.d.ts +3 -0
  39. package/bin/retailIntegration/constants/retailIntegrationErrorHttpStatus.js +19 -0
  40. package/bin/retailIntegration/constants/retailIntegrationLimits.d.ts +2 -0
  41. package/bin/retailIntegration/constants/retailIntegrationLimits.js +3 -1
  42. package/bin/retailIntegration/dtos/CancelRetailSaleRequest.d.ts +6 -0
  43. package/bin/retailIntegration/dtos/CancelRetailSaleRequest.js +32 -0
  44. package/bin/retailIntegration/dtos/CheckRetailInventoryRequest.d.ts +7 -0
  45. package/bin/retailIntegration/dtos/CheckRetailInventoryRequest.js +43 -0
  46. package/bin/retailIntegration/dtos/GetReconciliationResponses.d.ts +35 -0
  47. package/bin/retailIntegration/dtos/GetReconciliationResponses.js +2 -0
  48. package/bin/retailIntegration/dtos/GetRetailInventoryRequest.d.ts +2 -2
  49. package/bin/retailIntegration/dtos/GetRetailInventoryRequest.js +2 -2
  50. package/bin/retailIntegration/dtos/ReconciliationPageMessage.d.ts +13 -0
  51. package/bin/retailIntegration/dtos/ReconciliationPageMessage.js +48 -0
  52. package/bin/retailIntegration/dtos/ReconciliationRunCounts.d.ts +9 -0
  53. package/bin/retailIntegration/dtos/ReconciliationRunCounts.js +2 -0
  54. package/bin/retailIntegration/dtos/RetailListQuery.d.ts +5 -0
  55. package/bin/retailIntegration/dtos/RetailListQuery.js +24 -0
  56. package/bin/retailIntegration/dtos/RetailOutboundResponses.d.ts +9 -0
  57. package/bin/retailIntegration/dtos/RetailPagedQuery.d.ts +2 -2
  58. package/bin/retailIntegration/dtos/RetailPagedQuery.js +2 -2
  59. package/bin/retailIntegration/dtos/RetailTenantQuery.d.ts +2 -1
  60. package/bin/retailIntegration/dtos/RetailTenantQuery.js +6 -1
  61. package/bin/retailIntegration/dtos/StartCatalogReconciliationRequest.d.ts +11 -0
  62. package/bin/retailIntegration/dtos/StartCatalogReconciliationRequest.js +28 -0
  63. package/bin/retailIntegration/dtos/StartOrgReconciliationRequest.d.ts +9 -0
  64. package/bin/retailIntegration/dtos/StartOrgReconciliationRequest.js +22 -0
  65. package/bin/retailIntegration/enums/InactiveReasonEnum.d.ts +5 -0
  66. package/bin/retailIntegration/enums/InactiveReasonEnum.js +9 -0
  67. package/bin/retailIntegration/enums/ReconciliationEntityEnum.d.ts +7 -0
  68. package/bin/retailIntegration/enums/ReconciliationEntityEnum.js +11 -0
  69. package/bin/retailIntegration/enums/ReconciliationRunStatusEnum.d.ts +7 -0
  70. package/bin/retailIntegration/enums/ReconciliationRunStatusEnum.js +11 -0
  71. package/bin/retailIntegration/enums/ReconciliationTriggerEnum.d.ts +6 -0
  72. package/bin/retailIntegration/enums/ReconciliationTriggerEnum.js +10 -0
  73. package/bin/retailIntegration/enums/RetailEventRejectCodeEnum.d.ts +3 -1
  74. package/bin/retailIntegration/enums/RetailEventRejectCodeEnum.js +2 -0
  75. package/bin/retailIntegration/enums/RetailIntegrationErrorCodeEnum.d.ts +23 -0
  76. package/bin/retailIntegration/enums/RetailIntegrationErrorCodeEnum.js +27 -0
  77. package/bin/retailIntegration/enums/RetailSaleLineRoleEnum.d.ts +4 -0
  78. package/bin/retailIntegration/enums/RetailSaleLineRoleEnum.js +8 -0
  79. package/bin/retailIntegration/enums/index.d.ts +6 -0
  80. package/bin/retailIntegration/enums/index.js +6 -0
  81. package/bin/retailIntegration/index.d.ts +9 -0
  82. package/bin/retailIntegration/index.js +9 -0
  83. package/bin/retailIntegration/models/RetailSystemSale.d.ts +8 -7
  84. package/bin/retailIntegration/models/RetailSystemSale.js +186 -0
  85. package/bin/retailOrg/dtos/Retailer.d.ts +5 -0
  86. package/bin/retailOrg/dtos/Retailer.js +20 -0
  87. package/bin/retailOrg/dtos/requests/ActivateRetailerIntegrationRequest.d.ts +5 -0
  88. package/bin/retailOrg/dtos/requests/ActivateRetailerIntegrationRequest.js +24 -0
  89. package/bin/retailOrg/dtos/responses/ActivateRetailerIntegrationResponse.d.ts +3 -0
  90. package/bin/retailOrg/dtos/responses/ActivateRetailerIntegrationResponse.js +2 -0
  91. package/bin/retailOrg/dtos/validation/RetailerValidationDto.d.ts +4 -0
  92. package/bin/retailOrg/enums/RetailIntegrationSystemEnum.d.ts +4 -0
  93. package/bin/retailOrg/enums/RetailIntegrationSystemEnum.js +8 -0
  94. package/bin/retailOrg/index.d.ts +3 -0
  95. package/bin/retailOrg/index.js +3 -0
  96. package/bin/retailWizard/dtos/Sale.d.ts +25 -0
  97. package/bin/retailWizard/dtos/WizardReservedLine.d.ts +3 -0
  98. package/bin/retailWizard/dtos/WizardSession.d.ts +3 -0
  99. package/bin/retailWizard/dtos/responses/BackofficeCustomerTableResponse.d.ts +18 -5
  100. package/bin/retailWizard/enums/CentralCancelStatusEnum.d.ts +18 -0
  101. package/bin/retailWizard/enums/CentralCancelStatusEnum.js +22 -0
  102. package/bin/retailWizard/enums/CentralLiveCheckEnum.d.ts +10 -0
  103. package/bin/retailWizard/enums/CentralLiveCheckEnum.js +14 -0
  104. package/bin/retailWizard/enums/CentralSyncStatusEnum.d.ts +8 -2
  105. package/bin/retailWizard/enums/CentralSyncStatusEnum.js +7 -1
  106. package/bin/retailWizard/enums/RetailCentralOutboundMessageTypeEnum.d.ts +5 -0
  107. package/bin/retailWizard/enums/RetailCentralOutboundMessageTypeEnum.js +9 -0
  108. package/bin/retailWizard/enums/WizardLineStatusEnum.d.ts +3 -1
  109. package/bin/retailWizard/enums/WizardLineStatusEnum.js +2 -0
  110. package/bin/retailWizard/events/RetailCentralOutboundMessage.d.ts +9 -0
  111. package/bin/retailWizard/events/RetailCentralOutboundMessage.js +42 -0
  112. package/bin/retailWizard/index.d.ts +4 -0
  113. package/bin/retailWizard/index.js +4 -0
  114. package/package.json +1 -1
  115. package/src/platformRbac/dtos/UpdateLevelEntityRequest.ts +3 -1
  116. package/src/retailCatalog/dtos/requests/ReturnStockRequest.ts +6 -1
  117. package/src/retailCatalog/dtos/requests/SellInventoryRequest.ts +19 -0
  118. package/src/retailCatalog/dtos/requests/SellStockRequest.ts +4 -4
  119. package/src/retailCatalog/enums/InventoryInboundMessageTypeEnum.ts +1 -0
  120. package/src/retailCatalog/enums/InventoryItemStatusEnum.ts +2 -0
  121. package/src/retailCatalog/events/InventoryCentralSaleAcceptedMessage.ts +36 -0
  122. package/src/retailCatalog/events/InventoryInboundMessage.ts +5 -1
  123. package/src/retailCatalog/events/InventorySaleAppliedMessage.ts +1 -7
  124. package/src/retailCatalog/index.ts +2 -0
  125. package/src/retailCustomer/dtos/requests/UpsertCustomerFromKycRequest.ts +6 -0
  126. package/src/retailIntegration/constants/retailIntegrationErrorHttpStatus.ts +17 -0
  127. package/src/retailIntegration/constants/retailIntegrationLimits.ts +3 -0
  128. package/src/retailIntegration/dtos/CancelRetailSaleRequest.ts +9 -0
  129. package/src/retailIntegration/dtos/CheckRetailInventoryRequest.ts +20 -0
  130. package/src/retailIntegration/dtos/GetReconciliationResponses.ts +37 -0
  131. package/src/retailIntegration/dtos/GetRetailInventoryRequest.ts +2 -2
  132. package/src/retailIntegration/dtos/ReconciliationPageMessage.ts +32 -0
  133. package/src/retailIntegration/dtos/ReconciliationRunCounts.ts +9 -0
  134. package/src/retailIntegration/dtos/RetailListQuery.ts +10 -0
  135. package/src/retailIntegration/dtos/RetailOutboundResponses.ts +11 -0
  136. package/src/retailIntegration/dtos/RetailPagedQuery.ts +2 -2
  137. package/src/retailIntegration/dtos/RetailTenantQuery.ts +5 -1
  138. package/src/retailIntegration/dtos/StartCatalogReconciliationRequest.ts +19 -0
  139. package/src/retailIntegration/dtos/StartOrgReconciliationRequest.ts +13 -0
  140. package/src/retailIntegration/enums/InactiveReasonEnum.ts +5 -0
  141. package/src/retailIntegration/enums/ReconciliationEntityEnum.ts +7 -0
  142. package/src/retailIntegration/enums/ReconciliationRunStatusEnum.ts +7 -0
  143. package/src/retailIntegration/enums/ReconciliationTriggerEnum.ts +6 -0
  144. package/src/retailIntegration/enums/RetailEventRejectCodeEnum.ts +2 -0
  145. package/src/retailIntegration/enums/RetailIntegrationErrorCodeEnum.ts +23 -0
  146. package/src/retailIntegration/enums/RetailSaleLineRoleEnum.ts +4 -0
  147. package/src/retailIntegration/enums/index.ts +6 -0
  148. package/src/retailIntegration/index.ts +9 -0
  149. package/src/retailIntegration/models/RetailSystemSale.ts +45 -37
  150. package/src/retailOrg/dtos/Retailer.ts +19 -1
  151. package/src/retailOrg/dtos/requests/ActivateRetailerIntegrationRequest.ts +10 -0
  152. package/src/retailOrg/dtos/responses/ActivateRetailerIntegrationResponse.ts +5 -0
  153. package/src/retailOrg/dtos/validation/RetailerValidationDto.ts +4 -0
  154. package/src/retailOrg/enums/RetailIntegrationSystemEnum.ts +4 -0
  155. package/src/retailOrg/index.ts +3 -0
  156. package/src/retailWizard/dtos/Sale.ts +25 -0
  157. package/src/retailWizard/dtos/WizardReservedLine.ts +3 -0
  158. package/src/retailWizard/dtos/WizardSession.ts +3 -0
  159. package/src/retailWizard/dtos/responses/BackofficeCustomerTableResponse.ts +19 -5
  160. package/src/retailWizard/enums/CentralCancelStatusEnum.ts +18 -0
  161. package/src/retailWizard/enums/CentralLiveCheckEnum.ts +10 -0
  162. package/src/retailWizard/enums/CentralSyncStatusEnum.ts +7 -1
  163. package/src/retailWizard/enums/RetailCentralOutboundMessageTypeEnum.ts +5 -0
  164. package/src/retailWizard/enums/WizardLineStatusEnum.ts +2 -0
  165. package/src/retailWizard/events/RetailCentralOutboundMessage.ts +24 -0
  166. package/src/retailWizard/index.ts +4 -0
@@ -0,0 +1,13 @@
1
+ import { IsIn } from 'class-validator';
2
+ import { ReconciliationEntityEnum } from '../enums/ReconciliationEntityEnum';
3
+
4
+ /** Body de POST /backoffice/retailers/{retailerId}/reconciliations en org (backofficeStartOrgReconciliation). */
5
+ export class StartOrgReconciliationRequest {
6
+ @IsIn([ReconciliationEntityEnum.STORES, ReconciliationEntityEnum.USERS])
7
+ entity!: ReconciliationEntityEnum.STORES | ReconciliationEntityEnum.USERS;
8
+ }
9
+
10
+ /** Respuesta 202 del arranque en org. */
11
+ export interface StartOrgReconciliationResponse {
12
+ runId: string;
13
+ }
@@ -0,0 +1,5 @@
1
+ /** Motivo de una baja suave; solo NOT_IN_ZENTRAL se reactiva solo al volver a listarse. */
2
+ export enum InactiveReasonEnum {
3
+ NOT_IN_ZENTRAL = 'NOT_IN_ZENTRAL',
4
+ ZENTRAL_EVENT = 'ZENTRAL_EVENT',
5
+ }
@@ -0,0 +1,7 @@
1
+ /** Entidad que revisa una corrida contra los listados de Zentral. */
2
+ export enum ReconciliationEntityEnum {
3
+ STORES = 'STORES',
4
+ USERS = 'USERS',
5
+ CATALOG = 'CATALOG',
6
+ INVENTORY = 'INVENTORY',
7
+ }
@@ -0,0 +1,7 @@
1
+ /** Estado de una corrida de revisión; BRAKED es el freno por bajas de más del 10 %. */
2
+ export enum ReconciliationRunStatusEnum {
3
+ RUNNING = 'RUNNING',
4
+ COMPLETE = 'COMPLETE',
5
+ ABORTED = 'ABORTED',
6
+ BRAKED = 'BRAKED',
7
+ }
@@ -0,0 +1,6 @@
1
+ /** Quién abrió la corrida: el reloj horario, el botón «Actualizar» o la activación del retailer. */
2
+ export enum ReconciliationTriggerEnum {
3
+ SCHEDULED = 'SCHEDULED',
4
+ MANUAL = 'MANUAL',
5
+ ACTIVATION = 'ACTIVATION',
6
+ }
@@ -13,4 +13,6 @@ export enum RetailEventRejectCodeEnum {
13
13
  TRACKING_MODE_MISMATCH = 'TRACKING_MODE_MISMATCH',
14
14
  INVALID_IMEI = 'INVALID_IMEI',
15
15
  IDENTIFIER_CONFLICT = 'IDENTIFIER_CONFLICT',
16
+ /** El evento trae una fecha posterior a la hora del servidor. */
17
+ EVENT_IN_FUTURE = 'EVENT_IN_FUTURE',
16
18
  }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Codes HTTP de la integración con el sistema del retailer (org, catalog, wizard y connector).
3
+ * El status de cada uno está en `RETAIL_INTEGRATION_ERROR_HTTP_STATUS`; las clases `DomainError` viven en el lambda.
4
+ * @enum {string}
5
+ */
6
+ export enum RetailIntegrationErrorCodeEnum {
7
+ /** La entidad la administra la integración y no se edita desde SK. */
8
+ ENTITY_MANAGED_BY_INTEGRATION = 'ENTITY_MANAGED_BY_INTEGRATION',
9
+ RECONCILIATION_ALREADY_RUNNING = 'RECONCILIATION_ALREADY_RUNNING',
10
+ RECONCILIATION_NOT_FOUND = 'RECONCILIATION_NOT_FOUND',
11
+ /** El apartado de la pieza se perdió antes del cierre. */
12
+ RESERVATION_LOST = 'RESERVATION_LOST',
13
+ PRODUCT_NO_LONGER_SELLABLE = 'PRODUCT_NO_LONGER_SELLABLE',
14
+ STORE_NOT_OPERATIONAL = 'STORE_NOT_OPERATIONAL',
15
+ /** La venta no está en un estado de sincronización con Central que admita reenvío. */
16
+ CENTRAL_SYNC_NOT_RESENDABLE = 'CENTRAL_SYNC_NOT_RESENDABLE',
17
+ SALE_NOT_FOUND = 'SALE_NOT_FOUND',
18
+ RETAILER_ALREADY_INTEGRATED = 'RETAILER_ALREADY_INTEGRATED',
19
+ RETAILER_NOT_INTEGRATED = 'RETAILER_NOT_INTEGRATED',
20
+ /** El producto no tiene MDM y solo se vende de contado. */
21
+ CREDIT_REQUIRES_MDM = 'CREDIT_REQUIRES_MDM',
22
+ RETAILER_INTEGRATION_MISMATCH = 'RETAILER_INTEGRATION_MISMATCH',
23
+ }
@@ -0,0 +1,4 @@
1
+ /** Rol especial de una línea de venta; `null` es una línea normal. */
2
+ export enum RetailSaleLineRoleEnum {
3
+ GIFT = 'GIFT',
4
+ }
@@ -19,5 +19,11 @@ export * from './RetailSaleTypeEnum';
19
19
  export * from './RetailSaleFinancierEnum';
20
20
  export * from './RetailPaymentMethodEnum';
21
21
  export * from './RetailLinePaymentTypeEnum';
22
+ export * from './RetailSaleLineRoleEnum';
22
23
  export * from './RetailEventRejectCodeEnum';
23
24
  export * from './RetailMovementTypeEnum';
25
+ export * from './RetailIntegrationErrorCodeEnum';
26
+ export * from './ReconciliationEntityEnum';
27
+ export * from './ReconciliationRunStatusEnum';
28
+ export * from './ReconciliationTriggerEnum';
29
+ export * from './InactiveReasonEnum';
@@ -1,4 +1,5 @@
1
1
  export * from './constants/retailIntegrationLimits';
2
+ export * from './constants/retailIntegrationErrorHttpStatus';
2
3
  export * from './enums';
3
4
  export * from './validators/IsIsoDateTimeWithZone';
4
5
  export * from './dtos/RetailEventEnvelope';
@@ -15,12 +16,15 @@ export * from './dtos/RetailUserEventPayload';
15
16
  export * from './dtos/ProductEventPayload';
16
17
  export * from './dtos/InventoryEventPayload';
17
18
  export * from './dtos/RetailTenantQuery';
19
+ export * from './dtos/RetailListQuery';
18
20
  export * from './dtos/RetailPagedQuery';
19
21
  export * from './dtos/ListRetailStoresRequest';
20
22
  export * from './dtos/ListRetailCatalogRequest';
21
23
  export * from './dtos/GetRetailInventoryRequest';
22
24
  export * from './dtos/ListRetailUsersRequest';
23
25
  export * from './dtos/RegisterRetailSaleRequest';
26
+ export * from './dtos/CancelRetailSaleRequest';
27
+ export * from './dtos/CheckRetailInventoryRequest';
24
28
  export * from './dtos/RetailOutboundResponses';
25
29
  export * from './models/RetailPageMeta';
26
30
  export * from './models/RetailSystemStore';
@@ -28,3 +32,8 @@ export * from './models/RetailSystemProduct';
28
32
  export * from './models/RetailSystemInventory';
29
33
  export * from './models/RetailSystemUser';
30
34
  export * from './models/RetailSystemSale';
35
+ export * from './dtos/StartOrgReconciliationRequest';
36
+ export * from './dtos/StartCatalogReconciliationRequest';
37
+ export * from './dtos/ReconciliationRunCounts';
38
+ export * from './dtos/GetReconciliationResponses';
39
+ export * from './dtos/ReconciliationPageMessage';
@@ -1,51 +1,59 @@
1
- import { RetailLinePaymentTypeEnum, RetailPaymentMethodEnum, RetailSaleFinancierEnum, RetailSaleTypeEnum } from '../enums';
1
+ import { Type } from 'class-transformer';
2
+ import { ArrayNotEmpty, IsArray, IsIn, IsInt, IsObject, IsString, Matches, Min, Validate, ValidateIf, ValidateNested } from 'class-validator';
3
+ import { RETAIL_DECIMAL_PATTERN, RETAIL_ENTITY_ID_PATTERN, RETAIL_SKU_PATTERN } from '../constants/retailIntegrationLimits';
4
+ import { RetailCurrencyEnum, RetailLinePaymentTypeEnum, RetailPaymentMethodEnum, RetailSaleFinancierEnum, RetailSaleLineRoleEnum, RetailSaleTypeEnum } from '../enums';
5
+ import { IsIsoDateTimeWithZone } from '../validators/IsIsoDateTimeWithZone';
6
+ import { HasUniqueKeys, isNullOrValidated } from '../validators/payloadValidators';
2
7
  import { RetailCurrency } from './RetailSystemProduct';
3
8
 
4
9
  export type RetailSaleType = `${RetailSaleTypeEnum}`;
5
10
  export type RetailSaleFinancier = `${RetailSaleFinancierEnum}`;
6
11
  export type RetailPaymentMethod = `${RetailPaymentMethodEnum}`;
7
12
  export type RetailLinePaymentType = `${RetailLinePaymentTypeEnum}`;
13
+ export type RetailSaleLineRole = `${RetailSaleLineRoleEnum}`;
8
14
 
9
- export interface RetailSystemSaleCustomer {
10
- customerId: string;
11
- names: string;
12
- paternalLastName: string;
13
- maternalLastName: string | null;
14
- phone: string;
15
+ export class RetailSystemSaleCustomer {
16
+ @IsString() @Matches(/\S/) customerId!: string;
17
+ @IsString() @Matches(/\S/) names!: string;
18
+ @IsString() @Matches(/\S/) paternalLastName!: string;
19
+ @ValidateIf(isNullOrValidated) @IsString() maternalLastName!: string | null;
20
+ @IsString() @Matches(/\S/) phone!: string;
15
21
  }
16
22
 
17
- export interface RetailSystemSaleComponent {
18
- sku: string;
19
- qty: number;
20
- identifiers: string[];
23
+ export class RetailSystemSaleComponent {
24
+ @IsString() @Matches(RETAIL_SKU_PATTERN) sku!: string;
25
+ @IsInt() @Min(1) qty!: number;
26
+ @IsArray() @IsString({ each: true }) @Matches(/\S/, { each: true }) identifiers!: string[];
21
27
  }
22
28
 
23
- export interface RetailSystemSaleLine {
24
- lineId: string;
25
- sku: string;
26
- qty: number;
27
- basePrice: string;
28
- discount: string;
29
- paymentType: RetailLinePaymentType;
30
- financedAmount: string;
31
- role: 'GIFT' | null;
32
- components: RetailSystemSaleComponent[];
29
+ export class RetailSystemSaleLine {
30
+ @IsString() @Matches(/\S/) lineId!: string;
31
+ @IsString() @Matches(RETAIL_SKU_PATTERN) sku!: string;
32
+ @IsInt() @Min(1) qty!: number;
33
+ @IsString() @Matches(RETAIL_DECIMAL_PATTERN) basePrice!: string;
34
+ @IsString() @Matches(RETAIL_DECIMAL_PATTERN) discount!: string;
35
+ @IsIn(Object.values(RetailLinePaymentTypeEnum)) paymentType!: RetailLinePaymentType;
36
+ @IsString() @Matches(RETAIL_DECIMAL_PATTERN) financedAmount!: string;
37
+ @ValidateIf(isNullOrValidated) @IsIn(Object.values(RetailSaleLineRoleEnum)) role!: RetailSaleLineRole | null;
38
+ @IsArray() @ValidateNested({ each: true }) @Type(() => RetailSystemSaleComponent) components!: RetailSystemSaleComponent[];
33
39
  }
34
40
 
35
- /** Cuerpo de `POST /sales` de la doc; `saleId` es la llave de idempotencia. */
36
- export interface RetailSystemSale {
37
- saleId: string;
38
- folio: string;
39
- storeId: string;
40
- sellerRetailUserId: string;
41
- soldAt: string;
42
- saleType: RetailSaleType;
43
- financier: RetailSaleFinancier;
44
- creditId: string | null;
45
- currencyId: RetailCurrency;
46
- customer: RetailSystemSaleCustomer;
47
- equipmentPrice: string;
48
- amountPaid: string;
49
- paymentMethod: RetailPaymentMethod | null;
50
- lines: RetailSystemSaleLine[];
41
+ /** Cuerpo de `POST /sales` de la doc y de `privateRegisterRetailSale`; `saleId` es la llave de idempotencia. */
42
+ export class RetailSystemSale {
43
+ @IsString() @Matches(/\S/) saleId!: string;
44
+ @IsString() @Matches(/\S/) folio!: string;
45
+ @IsString() @Matches(RETAIL_ENTITY_ID_PATTERN) storeId!: string;
46
+ @IsString() @Matches(RETAIL_ENTITY_ID_PATTERN) sellerRetailUserId!: string;
47
+ @Validate(IsIsoDateTimeWithZone) soldAt!: string;
48
+ @IsIn(Object.values(RetailSaleTypeEnum)) saleType!: RetailSaleType;
49
+ @IsIn(Object.values(RetailSaleFinancierEnum)) financier!: RetailSaleFinancier;
50
+ @ValidateIf(isNullOrValidated) @IsString() @Matches(/\S/) creditId!: string | null;
51
+ @IsIn(Object.values(RetailCurrencyEnum)) currencyId!: RetailCurrency;
52
+ @IsObject() @ValidateNested() @Type(() => RetailSystemSaleCustomer) customer!: RetailSystemSaleCustomer;
53
+ @IsString() @Matches(RETAIL_DECIMAL_PATTERN) equipmentPrice!: string;
54
+ @IsString() @Matches(RETAIL_DECIMAL_PATTERN) amountPaid!: string;
55
+ @ValidateIf(isNullOrValidated) @IsIn(Object.values(RetailPaymentMethodEnum)) paymentMethod!: RetailPaymentMethod | null;
56
+
57
+ @IsArray() @ArrayNotEmpty() @ValidateNested({ each: true }) @Type(() => RetailSystemSaleLine) @Validate(HasUniqueKeys, ['lineId'])
58
+ lines!: RetailSystemSaleLine[];
51
59
  }
@@ -1,9 +1,10 @@
1
1
  import { Expose, Type } from 'class-transformer';
2
- import { IsEmail, IsEnum, IsObject, IsString, Length, Matches } from 'class-validator';
2
+ import { IsEmail, IsEnum, IsObject, IsOptional, IsString, Length, Matches } from 'class-validator';
3
3
  import { LocationAddress } from '../../address/dtos/LocationAddress';
4
4
  import { regexIso8601 } from '../../helpers/constans/regex';
5
5
  import { RetailerStatusEnum } from '../enums/RetailerStatusEnum';
6
6
  import { RetailerTypeEnum } from '../enums/RetailerTypeEnum';
7
+ import { RetailIntegrationSystemEnum } from '../enums/RetailIntegrationSystemEnum';
7
8
 
8
9
  /**
9
10
  * Retailer — nodo raíz de la organización comercial SureKeep (cadena / subdistribuidor / franquicia).
@@ -78,4 +79,21 @@ export class Retailer {
78
79
  @Expose()
79
80
  @IsString()
80
81
  updatedBy!: string;
82
+
83
+ /** Bandera «integrado»: presente solo si el retailer ya se activó con un sistema externo. */
84
+ @Expose()
85
+ @IsOptional()
86
+ @IsEnum(RetailIntegrationSystemEnum)
87
+ integrationSystem?: RetailIntegrationSystemEnum;
88
+
89
+ @Expose()
90
+ @IsOptional()
91
+ @IsString()
92
+ @Matches(regexIso8601, { message: 'integrationActivatedAt debe ser una fecha ISO 8601' })
93
+ integrationActivatedAt?: string;
94
+
95
+ @Expose()
96
+ @IsOptional()
97
+ @IsString()
98
+ integrationActivatedBy?: string;
81
99
  }
@@ -0,0 +1,10 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsEnum } from 'class-validator';
3
+ import { RetailIntegrationSystemEnum } from '../../enums/RetailIntegrationSystemEnum';
4
+
5
+ /** Body de POST /retailers/:retailerId/integration/activate. */
6
+ export class ActivateRetailerIntegrationRequest {
7
+ @Expose()
8
+ @IsEnum(RetailIntegrationSystemEnum)
9
+ integrationSystem!: RetailIntegrationSystemEnum;
10
+ }
@@ -0,0 +1,5 @@
1
+ import type { Retailer } from '../Retailer';
2
+
3
+ /** Respuesta de POST /retailers/:retailerId/integration/activate: el Retailer con la bandera ya sellada. */
4
+ export type ActivateRetailerIntegrationResponse = Retailer &
5
+ Required<Pick<Retailer, 'integrationSystem' | 'integrationActivatedAt' | 'integrationActivatedBy'>>;
@@ -1,5 +1,6 @@
1
1
  import type { RetailerStatusEnum } from '../../enums/RetailerStatusEnum';
2
2
  import type { RetailerTypeEnum } from '../../enums/RetailerTypeEnum';
3
+ import type { RetailIntegrationSystemEnum } from '../../enums/RetailIntegrationSystemEnum';
3
4
 
4
5
  /**
5
6
  * Shape mínimo que devuelve el endpoint privado de validación de retailer (consumido por otros
@@ -12,4 +13,7 @@ export interface RetailerValidationDto {
12
13
  type: RetailerTypeEnum;
13
14
  status: RetailerStatusEnum;
14
15
  parentId: string;
16
+ /** Bandera «integrado»; ausente si el retailer no está integrado. */
17
+ integrationSystem?: RetailIntegrationSystemEnum;
18
+ integrationActivatedAt?: string;
15
19
  }
@@ -0,0 +1,4 @@
1
+ /** Sistema externo que administra la organización de un retailer integrado. */
2
+ export enum RetailIntegrationSystemEnum {
3
+ ZENTRAL = 'ZENTRAL',
4
+ }
@@ -6,6 +6,7 @@ export * from './enums/RetailUserStatusEnum';
6
6
  export * from './enums/EmploymentTypeEnum';
7
7
  export * from './enums/CollectorSeniorityEnum';
8
8
  export * from './enums/RetailUserWalletLinkMethodEnum';
9
+ export * from './enums/RetailIntegrationSystemEnum';
9
10
  // F3 — Portal Admin VentasLuga (metas de venta del periodo)
10
11
  export * from './enums/GoalTargetTypeEnum';
11
12
 
@@ -56,6 +57,7 @@ export * from './dtos/requests/GoalPathParams';
56
57
  export * from './dtos/requests/PrivateGoalListQuery';
57
58
  export * from './dtos/requests/KpiQuery';
58
59
  export * from './dtos/requests/PrivateSellerListQuery';
60
+ export * from './dtos/requests/ActivateRetailerIntegrationRequest';
59
61
 
60
62
  // Response DTOs
61
63
  export * from './dtos/responses/RetailerHierarchyResponse';
@@ -66,3 +68,4 @@ export * from './dtos/responses/StoreKpiResponse';
66
68
  export * from './dtos/responses/SellerKpiResponse';
67
69
  export * from './dtos/responses/LookupRetailUserWalletResponse';
68
70
  export * from './dtos/responses/PrivateRetailUserWalletResponse';
71
+ export * from './dtos/responses/ActivateRetailerIntegrationResponse';
@@ -4,6 +4,8 @@ import type { SalePaymentMethodEnum } from '../enums/SalePaymentMethodEnum';
4
4
  import type { SaleChannelEnum } from '../enums/SaleChannelEnum';
5
5
  import type { ExternalProviderEnum } from '../enums/ExternalProviderEnum';
6
6
  import type { CentralSyncStatusEnum } from '../enums/CentralSyncStatusEnum';
7
+ import type { CentralCancelStatusEnum } from '../enums/CentralCancelStatusEnum';
8
+ import type { CentralLiveCheckEnum } from '../enums/CentralLiveCheckEnum';
7
9
  import type { SalePaymentDetail } from './SalePaymentDetail';
8
10
  import type { SaleLine } from './SaleLine';
9
11
  import type { SalePromotionRef } from '../../retailPromotions/dtos/SalePromotionRef';
@@ -64,6 +66,29 @@ export interface Sale {
64
66
  cardDeliveryId: string | null;
65
67
  centralSyncStatus: CentralSyncStatusEnum;
66
68
  centralTag: string | null;
69
+ /** Estado de la cancelación en Central; ausente si la venta no se ha cancelado. */
70
+ centralCancelStatus?: CentralCancelStatusEnum;
71
+ /** ISO; primer intento de envío, se sella una sola vez. */
72
+ centralFirstAttemptAt?: string;
73
+ /** ISO; inicio de la ventana de 24 h de reintentos, el reenvío la reinicia. */
74
+ centralRetryWindowStartAt?: string;
75
+ /** ISO; último intento de envío. */
76
+ centralLastAttemptAt?: string;
77
+ /** ISO; hasta cuándo el consumidor tiene tomada la venta. */
78
+ centralLeaseUntil?: string;
79
+ centralAttempts?: number;
80
+ /** Code del rechazo o del último error de Central. */
81
+ centralLastErrorCode?: string;
82
+ /** ISO; cuándo Central aceptó la venta. */
83
+ centralAcceptedAt?: string;
84
+ /** ISO; primer intento de la cancelación, se sella una sola vez. */
85
+ centralCancelFirstAttemptAt?: string;
86
+ /** ISO; inicio de la ventana de 24 h de la cancelación, el reenvío la reinicia. */
87
+ centralCancelRetryWindowStartAt?: string;
88
+ /** ISO; cuándo Central aceptó la cancelación. */
89
+ centralCancelAcceptedAt?: string;
90
+ /** Resultado de la consulta en vivo, copiado de la sesión al cerrar. */
91
+ centralLiveCheck?: CentralLiveCheckEnum;
67
92
  status: SaleStatusEnum;
68
93
  cancelledAt: string | null;
69
94
  /** Reason OBLIGATORIO en cancelación (AuditTrail) — flujo C. */
@@ -1,3 +1,4 @@
1
+ import type { InventoryItemStatusEnum } from '../../retailCatalog/enums/InventoryItemStatusEnum';
1
2
  import type { MdmProviderEnum } from '../../retailCatalog/enums/MdmProviderEnum';
2
3
  import type { ReservedComponent } from '../../retailCatalog/dtos/responses/ReserveStockResponse';
3
4
  import type { LinePaymentTypeEnum } from '../enums/LinePaymentTypeEnum';
@@ -12,6 +13,8 @@ export interface WizardReservedLine extends WizardLinePromotionFields {
12
13
  sku: string;
13
14
  qty: number;
14
15
  status: WizardLineStatusEnum;
16
+ /** Solo en LOST: estado en que Central dejó la pieza (SOLD, IN_TRANSIT o DAMAGED). */
17
+ lostReason?: InventoryItemStatusEnum;
15
18
  /** Llave de idempotencia de la reserva; una nueva por cada intento. */
16
19
  reservationId: string;
17
20
  /** Vencimiento de la reserva; una línea PENDING nace con ahora + 30 min. */
@@ -1,4 +1,5 @@
1
1
  import type { SalePromotionRef } from '../../retailPromotions/dtos/SalePromotionRef';
2
+ import type { CentralLiveCheckEnum } from '../enums/CentralLiveCheckEnum';
2
3
  import type { WizardStateEnum } from '../enums/WizardStateEnum';
3
4
  import type { WizardStepEnum } from '../enums/WizardStepEnum';
4
5
  import type { FiadoPhoneStatusEnum } from '../enums/FiadoPhoneStatusEnum';
@@ -152,6 +153,8 @@ export interface WizardSession {
152
153
  /** Contexto de crédito (pista SOFOM, pasos 04-09): PUNTEROS al dominio loan-*. Null en contado/externa. */
153
154
  loan: WizardLoan | null;
154
155
  saleId: string | null;
156
+ /** Resultado de la consulta en vivo a Central; la TX de cierre lo copia a la venta. */
157
+ centralLiveCheck?: CentralLiveCheckEnum;
155
158
  /** Prospecto vinculado (si la sesión se reanudó desde un prospecto): se cierra al cerrar la venta (D-prospecto). */
156
159
  prospectId: string | null;
157
160
  cancelReason: string | null;
@@ -1,17 +1,24 @@
1
1
  import type { ClientLevelEnum } from '../../../loanScoring/enums/ClientLevelEnum';
2
2
  import type { SellerTableSourceStatusEnum } from '../../enums/SellerTableSourceStatusEnum';
3
3
 
4
- /** Una fila de la tabla de Clientes: compras en la cadena dentro de la ventana, sin canceladas, más su crédito SK. */
4
+ /**
5
+ * Una fila de la tabla de Clientes: un cliente del padrón de la cadena con sus compras en la ventana
6
+ * (sin canceladas) y su crédito SK. `accountOnly` = abrió cuenta y no tiene ninguna compra en la cadena.
7
+ */
5
8
  export interface CustomerTableRow {
6
9
  retailCustomerId: string;
10
+ accountOnly: boolean;
11
+ /** Tienda donde se dio de alta; `null` si el padrón no la tiene. */
12
+ originStoreId: string | null;
7
13
  name: string | null;
8
14
  phone: string | null;
9
15
  purchaseCount: number;
10
16
  /** Precio de lo comprado (en crédito, el precio del equipo, no el enganche). */
11
17
  totalSpentCents: number;
12
18
  averageTicketCents: number | null;
13
- firstPurchaseAt: string;
14
- lastPurchaseAt: string;
19
+ /** `null` en un cliente «solo cuenta». */
20
+ firstPurchaseAt: string | null;
21
+ lastPurchaseAt: string | null;
15
22
  lastStoreName: string | null;
16
23
  /** Tienda con más compras; en empate, la de la compra más reciente. */
17
24
  favoriteStoreId: string | null;
@@ -28,14 +35,21 @@ export interface CustomerTableSources {
28
35
  credit: SellerTableSourceStatusEnum;
29
36
  }
30
37
 
38
+ /** Clientes del padrón leídos en la página, antes del filtro `customerType`; el front los suma por página. */
39
+ export interface CustomerTableCounts {
40
+ withSales: number;
41
+ accountOnly: number;
42
+ }
43
+
31
44
  /**
32
- * `GET /backoffice/customers/table?from&to&limit&nextToken&storeId&sellerId&value` — tabla de Clientes
33
- * del Portal Admin VL, paginada por última compra descendente. `from` en `null` es «Todo».
45
+ * `GET /backoffice/customers/table?from&to&limit&nextToken&storeId&sellerId&customerType&value` — tabla
46
+ * de Clientes del Portal Admin VL, paginada sobre el padrón por alta descendente. `from` en `null` es «Todo».
34
47
  */
35
48
  export interface BackofficeCustomerTableResponse {
36
49
  from: string | null;
37
50
  to: string;
38
51
  nextToken: string | null;
39
52
  sources: CustomerTableSources;
53
+ counts: CustomerTableCounts;
40
54
  items: CustomerTableRow[];
41
55
  }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Estado de la cancelación de la venta en Central.
3
+ *
4
+ * PENDING - Por enviar o en reintento.
5
+ * SENDING - Tomada por el consumidor, envío en curso.
6
+ * ACCEPTED - Central aceptó la cancelación.
7
+ * REJECTED - Central rechazó la cancelación.
8
+ * FAILED - Se agotó la ventana de reintentos.
9
+ * NOT_SENT - No se envía: la venta nunca quedó en Central.
10
+ */
11
+ export enum CentralCancelStatusEnum {
12
+ PENDING = 'PENDING',
13
+ SENDING = 'SENDING',
14
+ ACCEPTED = 'ACCEPTED',
15
+ REJECTED = 'REJECTED',
16
+ FAILED = 'FAILED',
17
+ NOT_SENT = 'NOT_SENT',
18
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Resultado de la consulta en vivo a Central antes de cerrar la venta.
3
+ *
4
+ * VERIFIED - Central confirmó la pieza a tiempo.
5
+ * UNVERIFIED - Central no contestó a tiempo; la venta sigue igual.
6
+ */
7
+ export enum CentralLiveCheckEnum {
8
+ VERIFIED = 'VERIFIED',
9
+ UNVERIFIED = 'UNVERIFIED',
10
+ }
@@ -2,13 +2,19 @@
2
2
  * Estado de sincronización de la venta con Central (local-first; badge en BO). SureKeep Fase 2 — pista Retail.
3
3
  *
4
4
  * PENDING - Aún no sincronizada.
5
- * SENT - Enviada a Central.
5
+ * SENT - Enviada a Central (sin uso: lo reemplazan SENDING y ACCEPTED).
6
6
  * FAILED - Falló la sincronización.
7
7
  * N_A - No aplica (p. ej. derivación externa).
8
+ * SENDING - Tomada por el consumidor, envío en curso.
9
+ * ACCEPTED - Central la aceptó.
10
+ * REJECTED - Central la rechazó con un 4xx de su catálogo.
8
11
  */
9
12
  export enum CentralSyncStatusEnum {
10
13
  PENDING = 'PENDING',
11
14
  SENT = 'SENT',
12
15
  FAILED = 'FAILED',
13
16
  N_A = 'N_A',
17
+ SENDING = 'SENDING',
18
+ ACCEPTED = 'ACCEPTED',
19
+ REJECTED = 'REJECTED',
14
20
  }
@@ -0,0 +1,5 @@
1
+ /** Tipo de mensaje que el wizard publica en RetailCentralOutboundQueue. */
2
+ export enum RetailCentralOutboundMessageTypeEnum {
3
+ CENTRAL_SALE_REGISTER = 'CENTRAL_SALE_REGISTER',
4
+ CENTRAL_SALE_CANCEL = 'CENTRAL_SALE_CANCEL',
5
+ }
@@ -6,4 +6,6 @@ export enum WizardLineStatusEnum {
6
6
  RESERVED = 'RESERVED',
7
7
  /** Marcada para liberar; pago y enganche la rechazan. */
8
8
  RELEASING = 'RELEASING',
9
+ /** Central vendió, traspasó o retiró la pieza; no se puede cobrar, firmar ni cerrar con ella. */
10
+ LOST = 'LOST',
9
11
  }
@@ -0,0 +1,24 @@
1
+ import { IsEnum, IsNotEmpty, IsString } from 'class-validator';
2
+ import { RetailCentralOutboundMessageTypeEnum } from '../enums/RetailCentralOutboundMessageTypeEnum';
3
+
4
+ /** Aviso a Central de una venta por registrar o cancelar; el consumidor lee la venta por saleId. */
5
+ export class RetailCentralOutboundMessage {
6
+ @IsEnum(RetailCentralOutboundMessageTypeEnum)
7
+ messageType!: RetailCentralOutboundMessageTypeEnum;
8
+
9
+ @IsString()
10
+ @IsNotEmpty()
11
+ tenantId!: string;
12
+
13
+ @IsString()
14
+ @IsNotEmpty()
15
+ retailerId!: string;
16
+
17
+ @IsString()
18
+ @IsNotEmpty()
19
+ storeId!: string;
20
+
21
+ @IsString()
22
+ @IsNotEmpty()
23
+ saleId!: string;
24
+ }
@@ -13,6 +13,8 @@ export * from './enums/SalePaymentMethodEnum';
13
13
  export * from './enums/RefundStatusEnum';
14
14
  export * from './enums/SaleStatusEnum';
15
15
  export * from './enums/CentralSyncStatusEnum';
16
+ export * from './enums/CentralCancelStatusEnum';
17
+ export * from './enums/CentralLiveCheckEnum';
16
18
  export * from './enums/ProspectStatusEnum';
17
19
  export * from './enums/PendingReasonEnum';
18
20
  export * from './enums/OccupationEnum';
@@ -199,11 +201,13 @@ export * from './events/SaleCancelledV2';
199
201
  export * from './events/SessionExpiredV1';
200
202
  export * from './enums/RetailPromotionInboundMessageTypeEnum';
201
203
  export * from './enums/RetailCommissionInboundMessageTypeEnum';
204
+ export * from './enums/RetailCentralOutboundMessageTypeEnum';
202
205
  export * from './events/RetailPromotionInboundMessage';
203
206
  export * from './events/RetailPromotionAccountOpenedMessage';
204
207
  export * from './events/RetailPromotionInstallmentPaidMessage';
205
208
  export * from './events/RetailPromotionQueueMessage';
206
209
  export * from './events/RetailCommissionInboundMessage';
210
+ export * from './events/RetailCentralOutboundMessage';
207
211
 
208
212
  // Lookup privado por lote (GET /private/wizard-sessions/batch)
209
213
  export * from './enums/WizardSessionLookupStatusEnum';