@fiado/type-kit 3.578.0 → 3.580.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 (163) 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/renewedReservationLine.test.ts +23 -0
  5. package/_test_/unit/retailCatalog/sellInventoryRequest.test.ts +25 -0
  6. package/_test_/unit/retailCatalog/stockRequests.test.ts +14 -4
  7. package/_test_/unit/retailCatalog/ventaSaga.test.ts +7 -0
  8. package/_test_/unit/retailIntegration/reconciliationContracts.test.ts +121 -0
  9. package/_test_/unit/retailIntegration/retailIntegrationErrorCodes.test.ts +37 -0
  10. package/_test_/unit/retailIntegration/retailOutboundRequests.test.ts +46 -15
  11. package/_test_/unit/retailIntegration/retailSaleContracts.test.ts +160 -0
  12. package/_test_/unit/retailIntegration/retailSystemEnums.test.ts +1 -1
  13. package/_test_/unit/retailOrg/dtos/retailerIntegration.test.ts +92 -0
  14. package/_test_/unit/retailWizard/centralOutboundAndLiveCheck.test.ts +63 -0
  15. package/_test_/unit/retailWizard/centralSaleStatus.test.ts +49 -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/dtos/responses/RenewReservationsResponse.d.ts +6 -0
  26. package/bin/retailCatalog/enums/InventoryInboundMessageTypeEnum.d.ts +2 -1
  27. package/bin/retailCatalog/enums/InventoryInboundMessageTypeEnum.js +1 -0
  28. package/bin/retailCatalog/enums/InventoryItemStatusEnum.d.ts +3 -1
  29. package/bin/retailCatalog/enums/InventoryItemStatusEnum.js +2 -0
  30. package/bin/retailCatalog/events/InventoryCentralSaleAcceptedMessage.d.ts +13 -0
  31. package/bin/retailCatalog/events/InventoryCentralSaleAcceptedMessage.js +55 -0
  32. package/bin/retailCatalog/events/InventoryInboundMessage.d.ts +2 -1
  33. package/bin/retailCatalog/events/InventorySaleAppliedMessage.d.ts +0 -2
  34. package/bin/retailCatalog/events/InventorySaleAppliedMessage.js +0 -6
  35. package/bin/retailCatalog/index.d.ts +2 -0
  36. package/bin/retailCatalog/index.js +2 -0
  37. package/bin/retailIntegration/constants/retailIntegrationErrorHttpStatus.d.ts +3 -0
  38. package/bin/retailIntegration/constants/retailIntegrationErrorHttpStatus.js +19 -0
  39. package/bin/retailIntegration/constants/retailIntegrationLimits.d.ts +2 -0
  40. package/bin/retailIntegration/constants/retailIntegrationLimits.js +3 -1
  41. package/bin/retailIntegration/dtos/CancelRetailSaleRequest.d.ts +6 -0
  42. package/bin/retailIntegration/dtos/CancelRetailSaleRequest.js +32 -0
  43. package/bin/retailIntegration/dtos/CheckRetailInventoryRequest.d.ts +7 -0
  44. package/bin/retailIntegration/dtos/CheckRetailInventoryRequest.js +43 -0
  45. package/bin/retailIntegration/dtos/GetReconciliationResponses.d.ts +35 -0
  46. package/bin/retailIntegration/dtos/GetReconciliationResponses.js +2 -0
  47. package/bin/retailIntegration/dtos/GetRetailInventoryRequest.d.ts +2 -2
  48. package/bin/retailIntegration/dtos/GetRetailInventoryRequest.js +2 -2
  49. package/bin/retailIntegration/dtos/ReconciliationPageMessage.d.ts +13 -0
  50. package/bin/retailIntegration/dtos/ReconciliationPageMessage.js +48 -0
  51. package/bin/retailIntegration/dtos/ReconciliationRunCounts.d.ts +9 -0
  52. package/bin/retailIntegration/dtos/ReconciliationRunCounts.js +2 -0
  53. package/bin/retailIntegration/dtos/RetailListQuery.d.ts +5 -0
  54. package/bin/retailIntegration/dtos/RetailListQuery.js +24 -0
  55. package/bin/retailIntegration/dtos/RetailOutboundResponses.d.ts +9 -0
  56. package/bin/retailIntegration/dtos/RetailPagedQuery.d.ts +2 -2
  57. package/bin/retailIntegration/dtos/RetailPagedQuery.js +2 -2
  58. package/bin/retailIntegration/dtos/RetailTenantQuery.d.ts +2 -1
  59. package/bin/retailIntegration/dtos/RetailTenantQuery.js +6 -1
  60. package/bin/retailIntegration/dtos/StartCatalogReconciliationRequest.d.ts +11 -0
  61. package/bin/retailIntegration/dtos/StartCatalogReconciliationRequest.js +28 -0
  62. package/bin/retailIntegration/dtos/StartOrgReconciliationRequest.d.ts +9 -0
  63. package/bin/retailIntegration/dtos/StartOrgReconciliationRequest.js +22 -0
  64. package/bin/retailIntegration/enums/InactiveReasonEnum.d.ts +5 -0
  65. package/bin/retailIntegration/enums/InactiveReasonEnum.js +9 -0
  66. package/bin/retailIntegration/enums/ReconciliationEntityEnum.d.ts +7 -0
  67. package/bin/retailIntegration/enums/ReconciliationEntityEnum.js +11 -0
  68. package/bin/retailIntegration/enums/ReconciliationRunStatusEnum.d.ts +7 -0
  69. package/bin/retailIntegration/enums/ReconciliationRunStatusEnum.js +11 -0
  70. package/bin/retailIntegration/enums/ReconciliationTriggerEnum.d.ts +6 -0
  71. package/bin/retailIntegration/enums/ReconciliationTriggerEnum.js +10 -0
  72. package/bin/retailIntegration/enums/RetailEventRejectCodeEnum.d.ts +3 -1
  73. package/bin/retailIntegration/enums/RetailEventRejectCodeEnum.js +2 -0
  74. package/bin/retailIntegration/enums/RetailIntegrationErrorCodeEnum.d.ts +23 -0
  75. package/bin/retailIntegration/enums/RetailIntegrationErrorCodeEnum.js +27 -0
  76. package/bin/retailIntegration/enums/RetailSaleLineRoleEnum.d.ts +4 -0
  77. package/bin/retailIntegration/enums/RetailSaleLineRoleEnum.js +8 -0
  78. package/bin/retailIntegration/enums/index.d.ts +6 -0
  79. package/bin/retailIntegration/enums/index.js +6 -0
  80. package/bin/retailIntegration/index.d.ts +9 -0
  81. package/bin/retailIntegration/index.js +9 -0
  82. package/bin/retailIntegration/models/RetailSystemSale.d.ts +8 -7
  83. package/bin/retailIntegration/models/RetailSystemSale.js +186 -0
  84. package/bin/retailOrg/dtos/Retailer.d.ts +5 -0
  85. package/bin/retailOrg/dtos/Retailer.js +20 -0
  86. package/bin/retailOrg/dtos/requests/ActivateRetailerIntegrationRequest.d.ts +5 -0
  87. package/bin/retailOrg/dtos/requests/ActivateRetailerIntegrationRequest.js +24 -0
  88. package/bin/retailOrg/dtos/responses/ActivateRetailerIntegrationResponse.d.ts +3 -0
  89. package/bin/retailOrg/dtos/responses/ActivateRetailerIntegrationResponse.js +2 -0
  90. package/bin/retailOrg/dtos/validation/RetailerValidationDto.d.ts +4 -0
  91. package/bin/retailOrg/enums/RetailIntegrationSystemEnum.d.ts +4 -0
  92. package/bin/retailOrg/enums/RetailIntegrationSystemEnum.js +8 -0
  93. package/bin/retailOrg/index.d.ts +3 -0
  94. package/bin/retailOrg/index.js +3 -0
  95. package/bin/retailWizard/dtos/Sale.d.ts +25 -0
  96. package/bin/retailWizard/dtos/WizardReservedLine.d.ts +3 -0
  97. package/bin/retailWizard/dtos/WizardSession.d.ts +3 -0
  98. package/bin/retailWizard/enums/CentralCancelStatusEnum.d.ts +18 -0
  99. package/bin/retailWizard/enums/CentralCancelStatusEnum.js +22 -0
  100. package/bin/retailWizard/enums/CentralLiveCheckEnum.d.ts +10 -0
  101. package/bin/retailWizard/enums/CentralLiveCheckEnum.js +14 -0
  102. package/bin/retailWizard/enums/CentralSyncStatusEnum.d.ts +8 -2
  103. package/bin/retailWizard/enums/CentralSyncStatusEnum.js +7 -1
  104. package/bin/retailWizard/enums/RetailCentralOutboundMessageTypeEnum.d.ts +5 -0
  105. package/bin/retailWizard/enums/RetailCentralOutboundMessageTypeEnum.js +9 -0
  106. package/bin/retailWizard/enums/WizardLineStatusEnum.d.ts +3 -1
  107. package/bin/retailWizard/enums/WizardLineStatusEnum.js +2 -0
  108. package/bin/retailWizard/events/RetailCentralOutboundMessage.d.ts +9 -0
  109. package/bin/retailWizard/events/RetailCentralOutboundMessage.js +42 -0
  110. package/bin/retailWizard/index.d.ts +4 -0
  111. package/bin/retailWizard/index.js +4 -0
  112. package/package.json +1 -1
  113. package/src/platformRbac/dtos/UpdateLevelEntityRequest.ts +3 -1
  114. package/src/retailCatalog/dtos/requests/ReturnStockRequest.ts +6 -1
  115. package/src/retailCatalog/dtos/requests/SellInventoryRequest.ts +19 -0
  116. package/src/retailCatalog/dtos/requests/SellStockRequest.ts +4 -4
  117. package/src/retailCatalog/dtos/responses/RenewReservationsResponse.ts +7 -0
  118. package/src/retailCatalog/enums/InventoryInboundMessageTypeEnum.ts +1 -0
  119. package/src/retailCatalog/enums/InventoryItemStatusEnum.ts +2 -0
  120. package/src/retailCatalog/events/InventoryCentralSaleAcceptedMessage.ts +36 -0
  121. package/src/retailCatalog/events/InventoryInboundMessage.ts +5 -1
  122. package/src/retailCatalog/events/InventorySaleAppliedMessage.ts +1 -7
  123. package/src/retailCatalog/index.ts +2 -0
  124. package/src/retailIntegration/constants/retailIntegrationErrorHttpStatus.ts +17 -0
  125. package/src/retailIntegration/constants/retailIntegrationLimits.ts +3 -0
  126. package/src/retailIntegration/dtos/CancelRetailSaleRequest.ts +9 -0
  127. package/src/retailIntegration/dtos/CheckRetailInventoryRequest.ts +20 -0
  128. package/src/retailIntegration/dtos/GetReconciliationResponses.ts +37 -0
  129. package/src/retailIntegration/dtos/GetRetailInventoryRequest.ts +2 -2
  130. package/src/retailIntegration/dtos/ReconciliationPageMessage.ts +32 -0
  131. package/src/retailIntegration/dtos/ReconciliationRunCounts.ts +9 -0
  132. package/src/retailIntegration/dtos/RetailListQuery.ts +10 -0
  133. package/src/retailIntegration/dtos/RetailOutboundResponses.ts +11 -0
  134. package/src/retailIntegration/dtos/RetailPagedQuery.ts +2 -2
  135. package/src/retailIntegration/dtos/RetailTenantQuery.ts +5 -1
  136. package/src/retailIntegration/dtos/StartCatalogReconciliationRequest.ts +19 -0
  137. package/src/retailIntegration/dtos/StartOrgReconciliationRequest.ts +13 -0
  138. package/src/retailIntegration/enums/InactiveReasonEnum.ts +5 -0
  139. package/src/retailIntegration/enums/ReconciliationEntityEnum.ts +7 -0
  140. package/src/retailIntegration/enums/ReconciliationRunStatusEnum.ts +7 -0
  141. package/src/retailIntegration/enums/ReconciliationTriggerEnum.ts +6 -0
  142. package/src/retailIntegration/enums/RetailEventRejectCodeEnum.ts +2 -0
  143. package/src/retailIntegration/enums/RetailIntegrationErrorCodeEnum.ts +23 -0
  144. package/src/retailIntegration/enums/RetailSaleLineRoleEnum.ts +4 -0
  145. package/src/retailIntegration/enums/index.ts +6 -0
  146. package/src/retailIntegration/index.ts +9 -0
  147. package/src/retailIntegration/models/RetailSystemSale.ts +45 -37
  148. package/src/retailOrg/dtos/Retailer.ts +19 -1
  149. package/src/retailOrg/dtos/requests/ActivateRetailerIntegrationRequest.ts +10 -0
  150. package/src/retailOrg/dtos/responses/ActivateRetailerIntegrationResponse.ts +5 -0
  151. package/src/retailOrg/dtos/validation/RetailerValidationDto.ts +4 -0
  152. package/src/retailOrg/enums/RetailIntegrationSystemEnum.ts +4 -0
  153. package/src/retailOrg/index.ts +3 -0
  154. package/src/retailWizard/dtos/Sale.ts +25 -0
  155. package/src/retailWizard/dtos/WizardReservedLine.ts +3 -0
  156. package/src/retailWizard/dtos/WizardSession.ts +3 -0
  157. package/src/retailWizard/enums/CentralCancelStatusEnum.ts +18 -0
  158. package/src/retailWizard/enums/CentralLiveCheckEnum.ts +10 -0
  159. package/src/retailWizard/enums/CentralSyncStatusEnum.ts +7 -1
  160. package/src/retailWizard/enums/RetailCentralOutboundMessageTypeEnum.ts +5 -0
  161. package/src/retailWizard/enums/WizardLineStatusEnum.ts +2 -0
  162. package/src/retailWizard/events/RetailCentralOutboundMessage.ts +24 -0
  163. package/src/retailWizard/index.ts +4 -0
@@ -0,0 +1,92 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import {
5
+ ActivateRetailerIntegrationRequest,
6
+ ActivateRetailerIntegrationResponse,
7
+ RetailIntegrationSystemEnum,
8
+ Retailer,
9
+ RetailerStatusEnum,
10
+ RetailerTypeEnum,
11
+ RetailerValidationDto,
12
+ } from '../../../../src/retailOrg/index';
13
+
14
+ const base = {
15
+ retailerId: 'ret_001',
16
+ parentId: 'ROOT',
17
+ type: RetailerTypeEnum.CHAIN,
18
+ name: 'Tiendas del Centro',
19
+ legalName: 'Tiendas del Centro SA de CV',
20
+ rfc: 'VEN123456ABC',
21
+ contactEmail: 'contacto@tdc.mx',
22
+ contactPhone: '+525512345678',
23
+ address: { city: 'CDMX', region: 'CDMX', zipCode: '01000' },
24
+ status: RetailerStatusEnum.ACTIVE,
25
+ createdAt: '2026-07-14T10:00:00.000Z',
26
+ updatedAt: '2026-07-14T10:00:00.000Z',
27
+ createdBy: 'user_1',
28
+ updatedBy: 'user_1',
29
+ };
30
+ const flag = {
31
+ integrationSystem: RetailIntegrationSystemEnum.ZENTRAL,
32
+ integrationActivatedAt: '2026-10-25T10:00:00.000Z',
33
+ integrationActivatedBy: 'user_1',
34
+ };
35
+ const errorsOf = async <T extends object>(cls: new () => T, plain: object) =>
36
+ (await validate(plainToInstance(cls, plain))).map(e => e.property);
37
+
38
+ describe('RetailIntegrationSystemEnum', () => {
39
+ it('solo trae ZENTRAL', () => {
40
+ expect(Object.values(RetailIntegrationSystemEnum)).toEqual(['ZENTRAL']);
41
+ });
42
+ });
43
+
44
+ describe('Retailer con bandera de integración', () => {
45
+ it('sin bandera sigue siendo válido', async () => {
46
+ expect(await errorsOf(Retailer, base)).toEqual([]);
47
+ });
48
+
49
+ it('con bandera completa es válido', async () => {
50
+ expect(await errorsOf(Retailer, { ...base, ...flag })).toEqual([]);
51
+ });
52
+
53
+ it('rechaza un sistema fuera del enum y una fecha no ISO', async () => {
54
+ const errors = await errorsOf(Retailer, { ...base, ...flag, integrationSystem: 'OTRO', integrationActivatedAt: 'ayer' });
55
+ expect(errors).toEqual(expect.arrayContaining(['integrationSystem', 'integrationActivatedAt']));
56
+ });
57
+
58
+ it('rechaza un integrationActivatedBy que no es texto', async () => {
59
+ expect(await errorsOf(Retailer, { ...base, ...flag, integrationActivatedBy: 7 })).toContain('integrationActivatedBy');
60
+ });
61
+ });
62
+
63
+ describe('RetailerValidationDto', () => {
64
+ it('admite la bandera opcional', () => {
65
+ const dto: RetailerValidationDto = {
66
+ retailerId: 'ret_001', name: 'x', type: RetailerTypeEnum.CHAIN, status: RetailerStatusEnum.ACTIVE, parentId: 'ROOT',
67
+ integrationSystem: RetailIntegrationSystemEnum.ZENTRAL, integrationActivatedAt: flag.integrationActivatedAt,
68
+ };
69
+ expect(dto.integrationSystem).toBe('ZENTRAL');
70
+ });
71
+ });
72
+
73
+ describe('ActivateRetailerIntegrationRequest', () => {
74
+ it('acepta ZENTRAL', async () => {
75
+ expect(await errorsOf(ActivateRetailerIntegrationRequest, { integrationSystem: 'ZENTRAL' })).toEqual([]);
76
+ });
77
+
78
+ it('exige integrationSystem dentro del enum', async () => {
79
+ expect(await errorsOf(ActivateRetailerIntegrationRequest, {})).toContain('integrationSystem');
80
+ expect(await errorsOf(ActivateRetailerIntegrationRequest, { integrationSystem: 'OTRO' })).toContain('integrationSystem');
81
+ });
82
+ });
83
+
84
+ describe('ActivateRetailerIntegrationResponse', () => {
85
+ it('es el Retailer con la bandera obligatoria', async () => {
86
+ const response: ActivateRetailerIntegrationResponse = plainToInstance(Retailer, { ...base, ...flag }) as ActivateRetailerIntegrationResponse;
87
+ expect(response.integrationSystem).toBe(RetailIntegrationSystemEnum.ZENTRAL);
88
+ // @ts-expect-error la bandera es obligatoria en la respuesta
89
+ const missing: ActivateRetailerIntegrationResponse = { ...base };
90
+ expect(missing).toBeDefined();
91
+ });
92
+ });
@@ -0,0 +1,63 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validateSync } from 'class-validator';
4
+ import * as RetailWizard from '../../../src/retailWizard';
5
+ import { InventoryItemStatusEnum } from '../../../src/retailCatalog';
6
+ import type { WizardReservedLine, WizardSession } from '../../../src/retailWizard';
7
+
8
+ const validMessage = {
9
+ messageType: 'CENTRAL_SALE_REGISTER',
10
+ tenantId: 'tenant-1',
11
+ retailerId: 'retailer-1',
12
+ storeId: 'store-1',
13
+ saleId: 'sale-1',
14
+ };
15
+
16
+ const errorsOf = (plain: Record<string, unknown>) =>
17
+ validateSync(plainToInstance(RetailWizard.RetailCentralOutboundMessage, plain)).map((e) => e.property);
18
+
19
+ describe('retailWizard — consulta en vivo, cola de salida a Central y línea LOST', () => {
20
+ it('WizardSession acepta centralLiveCheck opcional', () => {
21
+ const checked: Pick<WizardSession, 'centralLiveCheck'> = {
22
+ centralLiveCheck: RetailWizard.CentralLiveCheckEnum.UNVERIFIED,
23
+ };
24
+ const empty: Pick<WizardSession, 'centralLiveCheck'> = {};
25
+ expect(checked.centralLiveCheck).toBe('UNVERIFIED');
26
+ expect(empty).toEqual({});
27
+ });
28
+
29
+ it('RetailCentralOutboundMessageTypeEnum expone registro y cancelación', () => {
30
+ expect(Object.values(RetailWizard.RetailCentralOutboundMessageTypeEnum)).toEqual([
31
+ 'CENTRAL_SALE_REGISTER', 'CENTRAL_SALE_CANCEL',
32
+ ]);
33
+ });
34
+
35
+ it('RetailCentralOutboundMessage valida un mensaje completo', () => {
36
+ expect(errorsOf(validMessage)).toEqual([]);
37
+ expect(errorsOf({ ...validMessage, messageType: 'CENTRAL_SALE_CANCEL' })).toEqual([]);
38
+ });
39
+
40
+ it('RetailCentralOutboundMessage rechaza messageType desconocido y campos vacíos', () => {
41
+ expect(errorsOf({ ...validMessage, messageType: 'SALE_COMPLETED' })).toEqual(['messageType']);
42
+ expect(errorsOf({ ...validMessage, saleId: '' })).toEqual(['saleId']);
43
+ expect(errorsOf({ messageType: 'CENTRAL_SALE_REGISTER' }).sort()).toEqual(
44
+ ['retailerId', 'saleId', 'storeId', 'tenantId'],
45
+ );
46
+ });
47
+
48
+ it('WizardLineStatusEnum suma LOST y conserva los anteriores', () => {
49
+ expect(Object.values(RetailWizard.WizardLineStatusEnum)).toEqual(['PENDING', 'RESERVED', 'RELEASING', 'LOST']);
50
+ });
51
+
52
+ it('WizardReservedLine acepta lostReason opcional con el estado que dejó Central', () => {
53
+ const lost: Pick<WizardReservedLine, 'status' | 'lostReason'> = {
54
+ status: RetailWizard.WizardLineStatusEnum.LOST,
55
+ lostReason: InventoryItemStatusEnum.SOLD,
56
+ };
57
+ const reserved: Pick<WizardReservedLine, 'status' | 'lostReason'> = {
58
+ status: RetailWizard.WizardLineStatusEnum.RESERVED,
59
+ };
60
+ expect(lost.lostReason).toBe('SOLD');
61
+ expect(reserved).toEqual({ status: 'RESERVED' });
62
+ });
63
+ });
@@ -0,0 +1,49 @@
1
+ import 'reflect-metadata';
2
+ import * as RetailWizard from '../../../src/retailWizard';
3
+ import type { Sale } from '../../../src/retailWizard';
4
+
5
+ describe('retailWizard — estados central de la venta', () => {
6
+ it('CentralSyncStatusEnum suma SENDING, ACCEPTED y REJECTED y conserva SENT', () => {
7
+ expect(Object.values(RetailWizard.CentralSyncStatusEnum)).toEqual([
8
+ 'PENDING', 'SENT', 'FAILED', 'N_A', 'SENDING', 'ACCEPTED', 'REJECTED',
9
+ ]);
10
+ });
11
+
12
+ it('CentralCancelStatusEnum expone los estados de la cancelación en Central', () => {
13
+ expect(Object.values(RetailWizard.CentralCancelStatusEnum)).toEqual([
14
+ 'PENDING', 'SENDING', 'ACCEPTED', 'REJECTED', 'FAILED', 'NOT_SENT',
15
+ ]);
16
+ });
17
+
18
+ it('CentralLiveCheckEnum expone el resultado de la consulta en vivo', () => {
19
+ expect(Object.values(RetailWizard.CentralLiveCheckEnum)).toEqual(['VERIFIED', 'UNVERIFIED']);
20
+ });
21
+
22
+ it('SaleExceptionTypeEnum no gana valores CENTRAL_*', () => {
23
+ expect(Object.values(RetailWizard.SaleExceptionTypeEnum).filter((v) => v.startsWith('CENTRAL_'))).toEqual([]);
24
+ });
25
+
26
+ it('Sale acepta los campos central* opcionales', () => {
27
+ const central: Pick<Sale,
28
+ | 'centralCancelStatus' | 'centralFirstAttemptAt' | 'centralRetryWindowStartAt' | 'centralLastAttemptAt'
29
+ | 'centralLeaseUntil' | 'centralAttempts' | 'centralLastErrorCode' | 'centralAcceptedAt'
30
+ | 'centralCancelFirstAttemptAt' | 'centralCancelRetryWindowStartAt' | 'centralCancelAcceptedAt'
31
+ | 'centralLiveCheck'> = {
32
+ centralCancelStatus: RetailWizard.CentralCancelStatusEnum.PENDING,
33
+ centralFirstAttemptAt: '2026-10-25T10:00:00.000Z',
34
+ centralRetryWindowStartAt: '2026-10-25T10:00:00.000Z',
35
+ centralLastAttemptAt: '2026-10-25T10:05:00.000Z',
36
+ centralLeaseUntil: '2026-10-25T10:08:00.000Z',
37
+ centralAttempts: 2,
38
+ centralLastErrorCode: 'INVALID_STORE',
39
+ centralAcceptedAt: '2026-10-25T10:06:00.000Z',
40
+ centralCancelFirstAttemptAt: '2026-10-26T10:00:00.000Z',
41
+ centralCancelRetryWindowStartAt: '2026-10-26T10:00:00.000Z',
42
+ centralCancelAcceptedAt: '2026-10-26T10:01:00.000Z',
43
+ centralLiveCheck: RetailWizard.CentralLiveCheckEnum.VERIFIED,
44
+ };
45
+ const empty: Pick<Sale, keyof typeof central> = {};
46
+ expect(Object.keys(central)).toHaveLength(12);
47
+ expect(empty).toEqual({});
48
+ });
49
+ });
@@ -11,8 +11,8 @@ import {
11
11
  import { MdmProviderEnum, ProductCategoryEnum, TrackingModeEnum } from '../../../src/retailCatalog';
12
12
 
13
13
  describe('enums del inventario multi-item', () => {
14
- it('WizardLineStatusEnum tiene los 3 estados de la línea', () => {
15
- expect(Object.values(WizardLineStatusEnum)).toEqual(['PENDING', 'RESERVED', 'RELEASING']);
14
+ it('WizardLineStatusEnum tiene los 4 estados de la línea', () => {
15
+ expect(Object.values(WizardLineStatusEnum)).toEqual(['PENDING', 'RESERVED', 'RELEASING', 'LOST']);
16
16
  });
17
17
  it('LinePaymentTypeEnum distingue crédito y contado', () => {
18
18
  expect(Object.values(LinePaymentTypeEnum)).toEqual(['CREDIT', 'CASH']);
@@ -1,8 +1,10 @@
1
1
  /**
2
- * Body del PUT que renombra un grupo. `tenantId`, `level` y el id del grupo viajan en el path.
2
+ * Body del PUT que renombra un grupo o lo mueve de padre. `tenantId`, `level` y el id del grupo viajan en el path.
3
3
  * `actedBy` es el cognitoSub de quien accionó en el backoffice — es lo único que queda en la auditoría.
4
4
  */
5
5
  export declare class UpdateLevelEntityRequest {
6
6
  displayName?: string;
7
+ /** Nuevo padre del grupo; el manager lo valida igual que en el alta. */
8
+ parentId?: string;
7
9
  actedBy: string;
8
10
  }
@@ -13,7 +13,7 @@ exports.UpdateLevelEntityRequest = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  /**
16
- * Body del PUT que renombra un grupo. `tenantId`, `level` y el id del grupo viajan en el path.
16
+ * Body del PUT que renombra un grupo o lo mueve de padre. `tenantId`, `level` y el id del grupo viajan en el path.
17
17
  * `actedBy` es el cognitoSub de quien accionó en el backoffice — es lo único que queda en la auditoría.
18
18
  */
19
19
  class UpdateLevelEntityRequest {
@@ -27,6 +27,13 @@ __decorate([
27
27
  (0, class_validator_1.MaxLength)(120),
28
28
  __metadata("design:type", String)
29
29
  ], UpdateLevelEntityRequest.prototype, "displayName", void 0);
30
+ __decorate([
31
+ (0, class_transformer_1.Expose)(),
32
+ (0, class_validator_1.IsOptional)(),
33
+ (0, class_validator_1.IsString)(),
34
+ (0, class_validator_1.IsNotEmpty)(),
35
+ __metadata("design:type", String)
36
+ ], UpdateLevelEntityRequest.prototype, "parentId", void 0);
30
37
  __decorate([
31
38
  (0, class_transformer_1.Expose)(),
32
39
  (0, class_validator_1.IsString)(),
@@ -6,4 +6,6 @@ export declare class ReturnStockRequest {
6
6
  /** Fecha de la venta; fija el día de negocio del contador DAY# que se descuenta. */
7
7
  soldAt: string;
8
8
  lines: ReturnStockLine[];
9
+ /** Primer intento de cancelar en Central; si viene, la pieza se libera por las dos mitades. */
10
+ centralCancelFirstAttemptAt?: string;
9
11
  }
@@ -36,3 +36,8 @@ __decorate([
36
36
  (0, class_transformer_1.Type)(() => ReturnStockLine_1.ReturnStockLine),
37
37
  __metadata("design:type", Array)
38
38
  ], ReturnStockRequest.prototype, "lines", void 0);
39
+ __decorate([
40
+ (0, class_validator_1.IsOptional)(),
41
+ (0, class_validator_1.IsISO8601)(),
42
+ __metadata("design:type", String)
43
+ ], ReturnStockRequest.prototype, "centralCancelFirstAttemptAt", void 0);
@@ -0,0 +1,9 @@
1
+ /** Body de PUT /private/inventory/{imei}/sell (privateSellInventory); venta de una pieza por IMEI. */
2
+ export declare class SellInventoryRequest {
3
+ /** Sesión del wizard titular de la reserva activa. */
4
+ sessionId: string;
5
+ /** Comprador al que se vende la pieza. */
6
+ customerId: string;
7
+ /** Venta a la que pertenece; sella la pieza con ella. */
8
+ saleId: string;
9
+ }
@@ -0,0 +1,32 @@
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.SellInventoryRequest = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ /** Body de PUT /private/inventory/{imei}/sell (privateSellInventory); venta de una pieza por IMEI. */
15
+ class SellInventoryRequest {
16
+ }
17
+ exports.SellInventoryRequest = SellInventoryRequest;
18
+ __decorate([
19
+ (0, class_validator_1.IsString)(),
20
+ (0, class_validator_1.IsNotEmpty)(),
21
+ __metadata("design:type", String)
22
+ ], SellInventoryRequest.prototype, "sessionId", void 0);
23
+ __decorate([
24
+ (0, class_validator_1.IsString)(),
25
+ (0, class_validator_1.IsNotEmpty)(),
26
+ __metadata("design:type", String)
27
+ ], SellInventoryRequest.prototype, "customerId", void 0);
28
+ __decorate([
29
+ (0, class_validator_1.IsString)(),
30
+ (0, class_validator_1.IsNotEmpty)(),
31
+ __metadata("design:type", String)
32
+ ], SellInventoryRequest.prototype, "saleId", void 0);
@@ -4,6 +4,6 @@ export declare class SellStockRequest {
4
4
  sessionId: string;
5
5
  retailerId: string;
6
6
  lines: StockLine[];
7
- /** Venta a la que pertenece; liga los MOV# de la TX con ella. */
8
- saleId?: string;
7
+ /** Venta a la que pertenece; sella las piezas y liga los MOV# de la TX con ella. */
8
+ saleId: string;
9
9
  }
@@ -33,7 +33,7 @@ __decorate([
33
33
  __metadata("design:type", Array)
34
34
  ], SellStockRequest.prototype, "lines", void 0);
35
35
  __decorate([
36
- (0, class_validator_1.IsOptional)(),
37
36
  (0, class_validator_1.IsString)(),
37
+ (0, class_validator_1.IsNotEmpty)(),
38
38
  __metadata("design:type", String)
39
39
  ], SellStockRequest.prototype, "saleId", void 0);
@@ -1,8 +1,14 @@
1
+ import type { WizardLineStatusEnum } from '../../../retailWizard/enums/WizardLineStatusEnum';
2
+ import type { InventoryItemStatusEnum } from '../../enums/InventoryItemStatusEnum';
1
3
  /** Vencimiento nuevo de una línea renovada. */
2
4
  export interface RenewedReservationLine {
3
5
  lineId: string;
4
6
  reservationId: string;
5
7
  expiresAt: string;
8
+ /** Solo presente si la renovación no pudo sostener la pieza (LOST). */
9
+ status?: WizardLineStatusEnum;
10
+ /** Solo en LOST: estado en que Central dejó la pieza (SOLD, IN_TRANSIT o DAMAGED). */
11
+ lostReason?: InventoryItemStatusEnum;
6
12
  }
7
13
  /** Response de privateRenewReservations. */
8
14
  export interface RenewReservationsResponse {
@@ -1,5 +1,6 @@
1
1
  /** Tipo de aviso que el wizard publica en la cola de inventario del catálogo. */
2
2
  export declare enum InventoryInboundMessageTypeEnum {
3
3
  SALE_APPLIED = "SALE_APPLIED",
4
- RETURN = "RETURN"
4
+ RETURN = "RETURN",
5
+ CENTRAL_SALE_ACCEPTED = "CENTRAL_SALE_ACCEPTED"
5
6
  }
@@ -6,4 +6,5 @@ var InventoryInboundMessageTypeEnum;
6
6
  (function (InventoryInboundMessageTypeEnum) {
7
7
  InventoryInboundMessageTypeEnum["SALE_APPLIED"] = "SALE_APPLIED";
8
8
  InventoryInboundMessageTypeEnum["RETURN"] = "RETURN";
9
+ InventoryInboundMessageTypeEnum["CENTRAL_SALE_ACCEPTED"] = "CENTRAL_SALE_ACCEPTED";
9
10
  })(InventoryInboundMessageTypeEnum || (exports.InventoryInboundMessageTypeEnum = InventoryInboundMessageTypeEnum = {}));
@@ -10,6 +10,7 @@
10
10
  * @property {string} DAMAGED - Dañada, fuera de stock vendible.
11
11
  * @property {string} IN_TRANSIT - En traspaso entre tiendas, fuera de stock vendible.
12
12
  * @property {string} HELD - Capturada por una sesión de venta; no vence hasta venderse o soltarse.
13
+ * @property {string} INACTIVE - Baja suave; fuera de stock vendible.
13
14
  */
14
15
  export declare enum InventoryItemStatusEnum {
15
16
  AVAILABLE = "AVAILABLE",
@@ -18,5 +19,6 @@ export declare enum InventoryItemStatusEnum {
18
19
  RETURNED = "RETURNED",
19
20
  DAMAGED = "DAMAGED",
20
21
  IN_TRANSIT = "IN_TRANSIT",
21
- HELD = "HELD"
22
+ HELD = "HELD",
23
+ INACTIVE = "INACTIVE"
22
24
  }
@@ -13,6 +13,7 @@ exports.InventoryItemStatusEnum = void 0;
13
13
  * @property {string} DAMAGED - Dañada, fuera de stock vendible.
14
14
  * @property {string} IN_TRANSIT - En traspaso entre tiendas, fuera de stock vendible.
15
15
  * @property {string} HELD - Capturada por una sesión de venta; no vence hasta venderse o soltarse.
16
+ * @property {string} INACTIVE - Baja suave; fuera de stock vendible.
16
17
  */
17
18
  var InventoryItemStatusEnum;
18
19
  (function (InventoryItemStatusEnum) {
@@ -23,4 +24,5 @@ var InventoryItemStatusEnum;
23
24
  InventoryItemStatusEnum["DAMAGED"] = "DAMAGED";
24
25
  InventoryItemStatusEnum["IN_TRANSIT"] = "IN_TRANSIT";
25
26
  InventoryItemStatusEnum["HELD"] = "HELD";
27
+ InventoryItemStatusEnum["INACTIVE"] = "INACTIVE";
26
28
  })(InventoryItemStatusEnum || (exports.InventoryItemStatusEnum = InventoryItemStatusEnum = {}));
@@ -0,0 +1,13 @@
1
+ import { InventoryInboundMessageTypeEnum } from '../enums/InventoryInboundMessageTypeEnum';
2
+ import { StockLine } from '../dtos/requests/StockLine';
3
+ /** Aviso de que Central registró la venta; el catálogo confirma sus accesorios pendientes. */
4
+ export declare class InventoryCentralSaleAcceptedMessage {
5
+ type: InventoryInboundMessageTypeEnum.CENTRAL_SALE_ACCEPTED;
6
+ tenantId: string;
7
+ retailerId: string;
8
+ storeId: string;
9
+ saleId: string;
10
+ lines: StockLine[];
11
+ /** Fecha en que Central aceptó la venta; es el acceptedAt del SKPEND#. */
12
+ acceptedAt: string;
13
+ }
@@ -0,0 +1,55 @@
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.InventoryCentralSaleAcceptedMessage = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const InventoryInboundMessageTypeEnum_1 = require("../enums/InventoryInboundMessageTypeEnum");
16
+ const StockLine_1 = require("../dtos/requests/StockLine");
17
+ /** Aviso de que Central registró la venta; el catálogo confirma sus accesorios pendientes. */
18
+ class InventoryCentralSaleAcceptedMessage {
19
+ }
20
+ exports.InventoryCentralSaleAcceptedMessage = InventoryCentralSaleAcceptedMessage;
21
+ __decorate([
22
+ (0, class_validator_1.Equals)(InventoryInboundMessageTypeEnum_1.InventoryInboundMessageTypeEnum.CENTRAL_SALE_ACCEPTED),
23
+ __metadata("design:type", String)
24
+ ], InventoryCentralSaleAcceptedMessage.prototype, "type", void 0);
25
+ __decorate([
26
+ (0, class_validator_1.IsString)(),
27
+ (0, class_validator_1.IsNotEmpty)(),
28
+ __metadata("design:type", String)
29
+ ], InventoryCentralSaleAcceptedMessage.prototype, "tenantId", void 0);
30
+ __decorate([
31
+ (0, class_validator_1.IsString)(),
32
+ (0, class_validator_1.IsNotEmpty)(),
33
+ __metadata("design:type", String)
34
+ ], InventoryCentralSaleAcceptedMessage.prototype, "retailerId", void 0);
35
+ __decorate([
36
+ (0, class_validator_1.IsString)(),
37
+ (0, class_validator_1.IsNotEmpty)(),
38
+ __metadata("design:type", String)
39
+ ], InventoryCentralSaleAcceptedMessage.prototype, "storeId", void 0);
40
+ __decorate([
41
+ (0, class_validator_1.IsString)(),
42
+ (0, class_validator_1.IsNotEmpty)(),
43
+ __metadata("design:type", String)
44
+ ], InventoryCentralSaleAcceptedMessage.prototype, "saleId", void 0);
45
+ __decorate([
46
+ (0, class_validator_1.IsArray)(),
47
+ (0, class_validator_1.ArrayMinSize)(1),
48
+ (0, class_validator_1.ValidateNested)({ each: true }),
49
+ (0, class_transformer_1.Type)(() => StockLine_1.StockLine),
50
+ __metadata("design:type", Array)
51
+ ], InventoryCentralSaleAcceptedMessage.prototype, "lines", void 0);
52
+ __decorate([
53
+ (0, class_validator_1.IsISO8601)(),
54
+ __metadata("design:type", String)
55
+ ], InventoryCentralSaleAcceptedMessage.prototype, "acceptedAt", void 0);
@@ -1,4 +1,5 @@
1
+ import type { InventoryCentralSaleAcceptedMessage } from './InventoryCentralSaleAcceptedMessage';
1
2
  import type { InventoryReturnMessage } from './InventoryReturnMessage';
2
3
  import type { InventorySaleAppliedMessage } from './InventorySaleAppliedMessage';
3
4
  /** Cualquier aviso de la cola de inventario; se discrimina por `type`. */
4
- export type InventoryInboundMessage = InventorySaleAppliedMessage | InventoryReturnMessage;
5
+ export type InventoryInboundMessage = InventorySaleAppliedMessage | InventoryReturnMessage | InventoryCentralSaleAcceptedMessage;
@@ -6,8 +6,6 @@ export declare class InventorySaleAppliedMessage extends SellStockRequest {
6
6
  /** La cola es compartida entre silos; el tenant elige las tablas. */
7
7
  tenantId: string;
8
8
  storeId: string;
9
- /** El ValidateIf anula el @IsOptional que hereda de SellStockRequest: aquí saleId es obligatorio. */
10
- saleId: string;
11
9
  /** Fecha de la venta; fecha el DAY# y el MOV#. */
12
10
  soldAt: string;
13
11
  }
@@ -31,12 +31,6 @@ __decorate([
31
31
  (0, class_validator_1.IsNotEmpty)(),
32
32
  __metadata("design:type", String)
33
33
  ], InventorySaleAppliedMessage.prototype, "storeId", void 0);
34
- __decorate([
35
- (0, class_validator_1.ValidateIf)(() => true),
36
- (0, class_validator_1.IsString)(),
37
- (0, class_validator_1.IsNotEmpty)(),
38
- __metadata("design:type", String)
39
- ], InventorySaleAppliedMessage.prototype, "saleId", void 0);
40
34
  __decorate([
41
35
  (0, class_validator_1.IsISO8601)(),
42
36
  __metadata("design:type", String)
@@ -46,6 +46,7 @@ export * from './dtos/requests/ReserveStockRequest';
46
46
  export * from './dtos/requests/RenewReservationsRequest';
47
47
  export * from './dtos/requests/SuggestPiecesQuery';
48
48
  export * from './dtos/requests/SellStockRequest';
49
+ export * from './dtos/requests/SellInventoryRequest';
49
50
  export * from './dtos/requests/ReleaseStockRequest';
50
51
  export * from './dtos/requests/ReturnStockRequest';
51
52
  export * from './dtos/requests/SyncInventoryRequest';
@@ -82,4 +83,5 @@ export * from './dtos/requests/HoldStockRequest';
82
83
  export * from './dtos/responses/HoldStockResponse';
83
84
  export * from './events/InventorySaleAppliedMessage';
84
85
  export * from './events/InventoryReturnMessage';
86
+ export * from './events/InventoryCentralSaleAcceptedMessage';
85
87
  export * from './events/InventoryInboundMessage';
@@ -70,6 +70,7 @@ __exportStar(require("./dtos/requests/ReserveStockRequest"), exports);
70
70
  __exportStar(require("./dtos/requests/RenewReservationsRequest"), exports);
71
71
  __exportStar(require("./dtos/requests/SuggestPiecesQuery"), exports);
72
72
  __exportStar(require("./dtos/requests/SellStockRequest"), exports);
73
+ __exportStar(require("./dtos/requests/SellInventoryRequest"), exports);
73
74
  __exportStar(require("./dtos/requests/ReleaseStockRequest"), exports);
74
75
  __exportStar(require("./dtos/requests/ReturnStockRequest"), exports);
75
76
  __exportStar(require("./dtos/requests/SyncInventoryRequest"), exports);
@@ -108,4 +109,5 @@ __exportStar(require("./dtos/requests/HoldStockRequest"), exports);
108
109
  __exportStar(require("./dtos/responses/HoldStockResponse"), exports);
109
110
  __exportStar(require("./events/InventorySaleAppliedMessage"), exports);
110
111
  __exportStar(require("./events/InventoryReturnMessage"), exports);
112
+ __exportStar(require("./events/InventoryCentralSaleAcceptedMessage"), exports);
111
113
  __exportStar(require("./events/InventoryInboundMessage"), exports);
@@ -0,0 +1,3 @@
1
+ import { RetailIntegrationErrorCodeEnum } from '../enums/RetailIntegrationErrorCodeEnum';
2
+ /** Status HTTP de cada code: 404 no existe · 409 conflicto de estado · 422 regla de negocio. */
3
+ export declare const RETAIL_INTEGRATION_ERROR_HTTP_STATUS: Readonly<Record<RetailIntegrationErrorCodeEnum, 404 | 409 | 422>>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RETAIL_INTEGRATION_ERROR_HTTP_STATUS = void 0;
4
+ const RetailIntegrationErrorCodeEnum_1 = require("../enums/RetailIntegrationErrorCodeEnum");
5
+ /** Status HTTP de cada code: 404 no existe · 409 conflicto de estado · 422 regla de negocio. */
6
+ exports.RETAIL_INTEGRATION_ERROR_HTTP_STATUS = {
7
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.ENTITY_MANAGED_BY_INTEGRATION]: 422,
8
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.RECONCILIATION_ALREADY_RUNNING]: 409,
9
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.RECONCILIATION_NOT_FOUND]: 404,
10
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.RESERVATION_LOST]: 409,
11
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.PRODUCT_NO_LONGER_SELLABLE]: 409,
12
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.STORE_NOT_OPERATIONAL]: 422,
13
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.CENTRAL_SYNC_NOT_RESENDABLE]: 409,
14
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.SALE_NOT_FOUND]: 404,
15
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.RETAILER_ALREADY_INTEGRATED]: 409,
16
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.RETAILER_NOT_INTEGRATED]: 422,
17
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.CREDIT_REQUIRES_MDM]: 422,
18
+ [RetailIntegrationErrorCodeEnum_1.RetailIntegrationErrorCodeEnum.RETAILER_INTEGRATION_MISMATCH]: 422,
19
+ };
@@ -18,3 +18,5 @@ export declare const RETAIL_ZIP_CODE_MAX_LENGTH = 10;
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;
21
+ /** Tope de identificadores por consulta de inventario en vivo. */
22
+ export declare const RETAIL_LIVE_CHECK_IDENTIFIERS_MAX = 50;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RETAIL_DECIMAL_PATTERN = exports.RETAIL_SKU_PATTERN = exports.RETAIL_ZIP_CODE_MAX_LENGTH = exports.RETAIL_ZIP_CODE_MIN_LENGTH = exports.RETAIL_STORE_CODE_MAX_LENGTH = exports.RETAIL_ZONE_ID_PATTERN = exports.RETAIL_ENTITY_ID_PATTERN = exports.RETAIL_TENANT_ID_PATTERN = exports.RETAIL_LIST_LIMIT_MAX = exports.RETAIL_LIST_LIMIT_MIN = exports.RETAIL_EVENT_ID_MAX_LENGTH = void 0;
3
+ exports.RETAIL_LIVE_CHECK_IDENTIFIERS_MAX = exports.RETAIL_DECIMAL_PATTERN = exports.RETAIL_SKU_PATTERN = exports.RETAIL_ZIP_CODE_MAX_LENGTH = exports.RETAIL_ZIP_CODE_MIN_LENGTH = exports.RETAIL_STORE_CODE_MAX_LENGTH = exports.RETAIL_ZONE_ID_PATTERN = exports.RETAIL_ENTITY_ID_PATTERN = exports.RETAIL_TENANT_ID_PATTERN = exports.RETAIL_LIST_LIMIT_MAX = exports.RETAIL_LIST_LIMIT_MIN = exports.RETAIL_EVENT_ID_MAX_LENGTH = void 0;
4
4
  /** Tope de `eventId`: el límite seguro de una llave de DynamoDB. */
5
5
  exports.RETAIL_EVENT_ID_MAX_LENGTH = 1024;
6
6
  /** Rango de `limit` en las listas paginadas del retailer. */
@@ -21,3 +21,5 @@ exports.RETAIL_ZIP_CODE_MAX_LENGTH = 10;
21
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}$/;
24
+ /** Tope de identificadores por consulta de inventario en vivo. */
25
+ exports.RETAIL_LIVE_CHECK_IDENTIFIERS_MAX = 50;
@@ -0,0 +1,6 @@
1
+ /** Cuerpo de `POST /private/retail/sales/cancel`; el `saleId` es el mismo del registro. */
2
+ export declare class CancelRetailSaleRequest {
3
+ saleId: string;
4
+ cancelledAt: string;
5
+ reason: string;
6
+ }
@@ -0,0 +1,32 @@
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.CancelRetailSaleRequest = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ const IsIsoDateTimeWithZone_1 = require("../validators/IsIsoDateTimeWithZone");
15
+ /** Cuerpo de `POST /private/retail/sales/cancel`; el `saleId` es el mismo del registro. */
16
+ class CancelRetailSaleRequest {
17
+ }
18
+ exports.CancelRetailSaleRequest = CancelRetailSaleRequest;
19
+ __decorate([
20
+ (0, class_validator_1.IsString)(),
21
+ (0, class_validator_1.Matches)(/\S/),
22
+ __metadata("design:type", String)
23
+ ], CancelRetailSaleRequest.prototype, "saleId", void 0);
24
+ __decorate([
25
+ (0, class_validator_1.Validate)(IsIsoDateTimeWithZone_1.IsIsoDateTimeWithZone),
26
+ __metadata("design:type", String)
27
+ ], CancelRetailSaleRequest.prototype, "cancelledAt", void 0);
28
+ __decorate([
29
+ (0, class_validator_1.IsString)(),
30
+ (0, class_validator_1.Matches)(/\S/),
31
+ __metadata("design:type", String)
32
+ ], CancelRetailSaleRequest.prototype, "reason", void 0);
@@ -0,0 +1,7 @@
1
+ import { RetailTenantQuery } from './RetailTenantQuery';
2
+ /** Query de `GET /private/retail/inventory/live-check`; `identifiers` llega como csv. */
3
+ export declare class CheckRetailInventoryRequest extends RetailTenantQuery {
4
+ storeId: string;
5
+ identifiers: string[];
6
+ sessionId: string;
7
+ }