@yoryoboy/bi-mcp 1.1.0 → 1.3.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 (126) hide show
  1. package/README.md +126 -9
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/index.js +332 -2
  4. package/dist/index.js.map +2 -2
  5. package/dist/mcp-use.json +2 -2
  6. package/dist/scripts/_helpers.js +44 -0
  7. package/dist/scripts/_helpers.js.map +7 -0
  8. package/dist/scripts/admin-profile-delete.js +72 -0
  9. package/dist/scripts/admin-profile-delete.js.map +7 -0
  10. package/dist/scripts/admin-profile-list.js +24 -0
  11. package/dist/scripts/admin-profile-list.js.map +7 -0
  12. package/dist/scripts/admin-profile-upsert.js +25 -0
  13. package/dist/scripts/admin-profile-upsert.js.map +7 -0
  14. package/dist/scripts/admin-vtex-list.js +28 -0
  15. package/dist/scripts/admin-vtex-list.js.map +7 -0
  16. package/dist/scripts/admin-vtex-upsert.js +73 -0
  17. package/dist/scripts/admin-vtex-upsert.js.map +7 -0
  18. package/dist/scripts/admin-vtex-validate.js +55 -0
  19. package/dist/scripts/admin-vtex-validate.js.map +7 -0
  20. package/dist/scripts/run-migrations.js +50 -0
  21. package/dist/scripts/run-migrations.js.map +7 -0
  22. package/dist/scripts/test-db-connection.js +19 -0
  23. package/dist/scripts/test-db-connection.js.map +7 -0
  24. package/dist/src/config/profile-store.js +86 -0
  25. package/dist/src/config/profile-store.js.map +7 -0
  26. package/dist/src/config/vtex-crypto.js +43 -0
  27. package/dist/src/config/vtex-crypto.js.map +7 -0
  28. package/dist/src/config/vtex-profile-store.js +132 -0
  29. package/dist/src/config/vtex-profile-store.js.map +7 -0
  30. package/dist/src/config/vtex.js +27 -21
  31. package/dist/src/config/vtex.js.map +2 -2
  32. package/dist/src/db/client.js +58 -0
  33. package/dist/src/db/client.js.map +7 -0
  34. package/dist/src/services/vtex/vtex-api.js +24 -8
  35. package/dist/src/services/vtex/vtex-api.js.map +2 -2
  36. package/dist/src/services/vtex/vtex-catalog-write.js +233 -0
  37. package/dist/src/services/vtex/vtex-catalog-write.js.map +7 -0
  38. package/dist/src/services/vtex/vtex-catalog.js +5 -3
  39. package/dist/src/services/vtex/vtex-catalog.js.map +2 -2
  40. package/dist/src/services/vtex/vtex-logistics.js +18 -9
  41. package/dist/src/services/vtex/vtex-logistics.js.map +2 -2
  42. package/dist/src/services/vtex/vtex-orders-write.js +152 -0
  43. package/dist/src/services/vtex/vtex-orders-write.js.map +7 -0
  44. package/dist/src/services/vtex/vtex-orders.js +13 -7
  45. package/dist/src/services/vtex/vtex-orders.js.map +2 -2
  46. package/dist/src/services/vtex/vtex-pricing-write.js +24 -0
  47. package/dist/src/services/vtex/vtex-pricing-write.js.map +7 -0
  48. package/dist/src/services/vtex/vtex-pricing.js +5 -3
  49. package/dist/src/services/vtex/vtex-pricing.js.map +2 -2
  50. package/dist/src/services/vtex/vtex-write.js +38 -0
  51. package/dist/src/services/vtex/vtex-write.js.map +7 -0
  52. package/dist/src/tools/config/check-database-connection.js +59 -0
  53. package/dist/src/tools/config/check-database-connection.js.map +7 -0
  54. package/dist/src/tools/config/index.js +3 -0
  55. package/dist/src/tools/config/index.js.map +7 -0
  56. package/dist/src/tools/config/list-profiles.js +26 -0
  57. package/dist/src/tools/config/list-profiles.js.map +7 -0
  58. package/dist/src/tools/index.js +1 -0
  59. package/dist/src/tools/index.js.map +2 -2
  60. package/dist/src/tools/vtex/activate-sku.js +53 -0
  61. package/dist/src/tools/vtex/activate-sku.js.map +7 -0
  62. package/dist/src/tools/vtex/add-order-tracking.js +103 -0
  63. package/dist/src/tools/vtex/add-order-tracking.js.map +7 -0
  64. package/dist/src/tools/vtex/associate-specification.js +60 -0
  65. package/dist/src/tools/vtex/associate-specification.js.map +7 -0
  66. package/dist/src/tools/vtex/attach-catalog-image.js +63 -0
  67. package/dist/src/tools/vtex/attach-catalog-image.js.map +7 -0
  68. package/dist/src/tools/vtex/cancel-order.js +67 -0
  69. package/dist/src/tools/vtex/cancel-order.js.map +7 -0
  70. package/dist/src/tools/vtex/computed-price.js +12 -1
  71. package/dist/src/tools/vtex/computed-price.js.map +2 -2
  72. package/dist/src/tools/vtex/create-brand.js +69 -0
  73. package/dist/src/tools/vtex/create-brand.js.map +7 -0
  74. package/dist/src/tools/vtex/create-category.js +81 -0
  75. package/dist/src/tools/vtex/create-category.js.map +7 -0
  76. package/dist/src/tools/vtex/create-product-with-sku.js +120 -0
  77. package/dist/src/tools/vtex/create-product-with-sku.js.map +7 -0
  78. package/dist/src/tools/vtex/create-product.js +111 -0
  79. package/dist/src/tools/vtex/create-product.js.map +7 -0
  80. package/dist/src/tools/vtex/create-sku.js +103 -0
  81. package/dist/src/tools/vtex/create-sku.js.map +7 -0
  82. package/dist/src/tools/vtex/create-specification-value.js +53 -0
  83. package/dist/src/tools/vtex/create-specification-value.js.map +7 -0
  84. package/dist/src/tools/vtex/create-specification.js +85 -0
  85. package/dist/src/tools/vtex/create-specification.js.map +7 -0
  86. package/dist/src/tools/vtex/deactivate-sku.js +53 -0
  87. package/dist/src/tools/vtex/deactivate-sku.js.map +7 -0
  88. package/dist/src/tools/vtex/delete-fixed-price.js +53 -0
  89. package/dist/src/tools/vtex/delete-fixed-price.js.map +7 -0
  90. package/dist/src/tools/vtex/index.js +21 -0
  91. package/dist/src/tools/vtex/index.js.map +2 -2
  92. package/dist/src/tools/vtex/inventory-check.js +15 -2
  93. package/dist/src/tools/vtex/inventory-check.js.map +2 -2
  94. package/dist/src/tools/vtex/invoice-order.js +84 -0
  95. package/dist/src/tools/vtex/invoice-order.js.map +7 -0
  96. package/dist/src/tools/vtex/order-details.js +16 -2
  97. package/dist/src/tools/vtex/order-details.js.map +2 -2
  98. package/dist/src/tools/vtex/orders-summary.js +11 -1
  99. package/dist/src/tools/vtex/orders-summary.js.map +2 -2
  100. package/dist/src/tools/vtex/product-offers.js +15 -2
  101. package/dist/src/tools/vtex/product-offers.js.map +2 -2
  102. package/dist/src/tools/vtex/profile-resolution.js +57 -0
  103. package/dist/src/tools/vtex/profile-resolution.js.map +7 -0
  104. package/dist/src/tools/vtex/sku-offers.js +16 -2
  105. package/dist/src/tools/vtex/sku-offers.js.map +2 -2
  106. package/dist/src/tools/vtex/sku-price.js +12 -2
  107. package/dist/src/tools/vtex/sku-price.js.map +2 -2
  108. package/dist/src/tools/vtex/toggle-unlimited-quantity.js +65 -0
  109. package/dist/src/tools/vtex/toggle-unlimited-quantity.js.map +7 -0
  110. package/dist/src/tools/vtex/update-inventory.js +40 -14
  111. package/dist/src/tools/vtex/update-inventory.js.map +2 -2
  112. package/dist/src/tools/vtex/update-lead-time.js +40 -12
  113. package/dist/src/tools/vtex/update-lead-time.js.map +2 -2
  114. package/dist/src/tools/vtex/update-product-basic-fields.js +71 -0
  115. package/dist/src/tools/vtex/update-product-basic-fields.js.map +7 -0
  116. package/dist/src/tools/vtex/update-sku-basic-fields.js +92 -0
  117. package/dist/src/tools/vtex/update-sku-basic-fields.js.map +7 -0
  118. package/dist/src/tools/vtex/update-sku-price.js +81 -0
  119. package/dist/src/tools/vtex/update-sku-price.js.map +7 -0
  120. package/dist/src/tools/vtex/upsert-fixed-price.js +69 -0
  121. package/dist/src/tools/vtex/upsert-fixed-price.js.map +7 -0
  122. package/dist/src/tools/vtex/warehouse-inventory.js +12 -1
  123. package/dist/src/tools/vtex/warehouse-inventory.js.map +2 -2
  124. package/dist/src/tools/vtex/write-helpers.js +73 -0
  125. package/dist/src/tools/vtex/write-helpers.js.map +7 -0
  126. package/package.json +12 -2
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/services/vtex/vtex-catalog-write.ts"],
4
+ "sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport interface VtexProductBasicFieldsInput {\n name?: string;\n categoryId?: number;\n brandId?: number;\n description?: string;\n descriptionShort?: string;\n title?: string;\n linkId?: string;\n refId?: string;\n isVisible?: boolean;\n isActive?: boolean;\n keyWords?: string;\n releaseDate?: string;\n metaTagDescription?: string;\n showWithoutStock?: boolean;\n}\n\nexport interface VtexSkuBasicFieldsInput {\n name?: string;\n refId?: string;\n ean?: string;\n packagedHeight?: number;\n packagedLength?: number;\n packagedWidth?: number;\n packagedWeightKg?: number;\n height?: number;\n length?: number;\n width?: number;\n weightKg?: number;\n measurementUnit?: string;\n unitMultiplier?: number;\n manufacturerCode?: string;\n commercialConditionId?: number;\n isActive?: boolean;\n activateIfPossible?: boolean;\n}\n\nfunction pickRecord(source: Record<string, unknown>, keys: string[]): Record<string, unknown> {\n const picked: Record<string, unknown> = {};\n for (const key of keys) {\n if (key in source) {\n picked[key] = source[key];\n }\n }\n return picked;\n}\n\nexport async function getProduct(profileId: string, productId: string): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/product/${productId}`);\n return response.data;\n}\n\nexport async function createProduct(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/product\", payload);\n return response.data;\n}\n\nexport async function updateProduct(\n profileId: string,\n productId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.put<Record<string, unknown>>(`/api/catalog/pvt/product/${productId}`, payload);\n return response.data;\n}\n\nexport function buildProductUpdatePayload(\n current: Record<string, unknown>,\n updates: VtexProductBasicFieldsInput\n): Record<string, unknown> {\n const payload = pickRecord(current, [\n \"Name\",\n \"DepartmentId\",\n \"CategoryId\",\n \"BrandId\",\n \"LinkId\",\n \"RefId\",\n \"IsVisible\",\n \"Description\",\n \"DescriptionShort\",\n \"ReleaseDate\",\n \"KeyWords\",\n \"Title\",\n \"IsActive\",\n \"TaxCode\",\n \"MetaTagDescription\",\n \"SupplierId\",\n \"ShowWithoutStock\",\n \"AdWordsRemarketingCode\",\n \"LomadeeCampaignCode\",\n \"Score\",\n ]);\n\n if (updates.name !== undefined) payload.Name = updates.name;\n if (updates.categoryId !== undefined) payload.CategoryId = updates.categoryId;\n if (updates.brandId !== undefined) payload.BrandId = updates.brandId;\n if (updates.description !== undefined) payload.Description = updates.description;\n if (updates.descriptionShort !== undefined) payload.DescriptionShort = updates.descriptionShort;\n if (updates.title !== undefined) payload.Title = updates.title;\n if (updates.linkId !== undefined) payload.LinkId = updates.linkId;\n if (updates.refId !== undefined) payload.RefId = updates.refId;\n if (updates.isVisible !== undefined) payload.IsVisible = updates.isVisible;\n if (updates.isActive !== undefined) payload.IsActive = updates.isActive;\n if (updates.keyWords !== undefined) payload.KeyWords = updates.keyWords;\n if (updates.releaseDate !== undefined) payload.ReleaseDate = updates.releaseDate;\n if (updates.metaTagDescription !== undefined) {\n payload.MetaTagDescription = updates.metaTagDescription;\n }\n if (updates.showWithoutStock !== undefined) {\n payload.ShowWithoutStock = updates.showWithoutStock;\n }\n\n return payload;\n}\n\nexport async function getSku(profileId: string, skuId: string): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/stockkeepingunit/${skuId}`);\n return response.data;\n}\n\nexport async function createSku(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/stockkeepingunit\", payload);\n return response.data;\n}\n\nexport async function updateSku(\n profileId: string,\n skuId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.put<Record<string, unknown>>(`/api/catalog/pvt/stockkeepingunit/${skuId}`, payload);\n return response.data;\n}\n\nexport function buildSkuUpdatePayload(\n current: Record<string, unknown>,\n updates: VtexSkuBasicFieldsInput\n): Record<string, unknown> {\n const payload = pickRecord(current, [\n \"ProductId\",\n \"IsActive\",\n \"ActivateIfPossible\",\n \"Name\",\n \"RefId\",\n \"PackagedHeight\",\n \"PackagedLength\",\n \"PackagedWidth\",\n \"PackagedWeightKg\",\n \"Height\",\n \"Length\",\n \"Width\",\n \"WeightKg\",\n \"CubicWeight\",\n \"IsKit\",\n \"CreationDate\",\n \"RewardValue\",\n \"EstimatedDateArrival\",\n \"ManufacturerCode\",\n \"CommercialConditionId\",\n \"MeasurementUnit\",\n \"UnitMultiplier\",\n \"ModalType\",\n \"KitItensSellApart\",\n \"Videos\",\n ]);\n\n if (updates.name !== undefined) payload.Name = updates.name;\n if (updates.refId !== undefined) payload.RefId = updates.refId;\n if (updates.packagedHeight !== undefined) payload.PackagedHeight = updates.packagedHeight;\n if (updates.packagedLength !== undefined) payload.PackagedLength = updates.packagedLength;\n if (updates.packagedWidth !== undefined) payload.PackagedWidth = updates.packagedWidth;\n if (updates.packagedWeightKg !== undefined) payload.PackagedWeightKg = updates.packagedWeightKg;\n if (updates.height !== undefined) payload.Height = updates.height;\n if (updates.length !== undefined) payload.Length = updates.length;\n if (updates.width !== undefined) payload.Width = updates.width;\n if (updates.weightKg !== undefined) payload.WeightKg = updates.weightKg;\n if (updates.measurementUnit !== undefined) payload.MeasurementUnit = updates.measurementUnit;\n if (updates.unitMultiplier !== undefined) payload.UnitMultiplier = updates.unitMultiplier;\n if (updates.manufacturerCode !== undefined) payload.ManufacturerCode = updates.manufacturerCode;\n if (updates.commercialConditionId !== undefined) {\n payload.CommercialConditionId = updates.commercialConditionId;\n }\n if (updates.isActive !== undefined) payload.IsActive = updates.isActive;\n if (updates.activateIfPossible !== undefined) {\n payload.ActivateIfPossible = updates.activateIfPossible;\n }\n\n return payload;\n}\n\nexport async function getSkuEans(profileId: string, skuId: string): Promise<string[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean`);\n const data = response.data;\n\n if (Array.isArray(data)) {\n return data.map((item) => String(item)).filter(Boolean);\n }\n\n if (data == null) {\n return [];\n }\n\n return [String(data)];\n}\n\nexport async function createSkuEan(\n profileId: string,\n skuId: string,\n ean: string\n): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.post(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean/${ean}`);\n}\n\nexport async function deleteAllSkuEans(profileId: string, skuId: string): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.delete(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean`);\n}\n\nexport async function createBrand(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/brand\", payload);\n return response.data;\n}\n\nexport async function getBrand(profileId: string, brandId: string): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/brand/${brandId}`);\n return response.data;\n}\n\nexport async function createCategory(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/category\", payload);\n return response.data;\n}\n\nexport async function getCategory(\n profileId: string,\n categoryId: string\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/category/${categoryId}`);\n return response.data;\n}\n\nexport async function createSpecification(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/specification\", payload);\n return response.data;\n}\n\nexport async function createSpecificationValue(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\n \"/api/catalog/pvt/specificationvalue\",\n payload\n );\n return response.data;\n}\n\nexport async function associateProductSpecification(\n profileId: string,\n productId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\n `/api/catalog/pvt/product/${productId}/specification`,\n payload\n );\n return response.data;\n}\n\nexport async function associateSkuSpecification(\n profileId: string,\n skuId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\n `/api/catalog/pvt/stockkeepingunit/${skuId}/specification`,\n payload\n );\n return response.data;\n}\n\nexport async function createSkuFile(\n profileId: string,\n skuId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\n `/api/catalog/pvt/stockkeepingunit/${skuId}/file`,\n payload\n );\n return response.data;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,11 +1,13 @@
1
- import { vtexApi } from "./vtex-api.js";
2
- async function getProductOffers(productId) {
1
+ import { getVtexApiClients } from "./vtex-api.js";
2
+ async function getProductOffers(profileId, productId) {
3
+ const { vtexApi } = await getVtexApiClients(profileId);
3
4
  const response = await vtexApi.get(
4
5
  `/api/catalog_system/pub/products/offers/${productId}`
5
6
  );
6
7
  return response.data;
7
8
  }
8
- async function getSkuOffers(productId, skuId) {
9
+ async function getSkuOffers(profileId, productId, skuId) {
10
+ const { vtexApi } = await getVtexApiClients(profileId);
9
11
  const response = await vtexApi.get(
10
12
  `/api/catalog_system/pub/products/offers/${productId}/sku/${skuId}`
11
13
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/services/vtex/vtex-catalog.ts"],
4
- "sourcesContent": ["import { vtexApi } from \"./vtex-api.js\";\n\nexport type ProductOffersResponse = Record<string, unknown>[];\n\nexport async function getProductOffers(productId: string): Promise<ProductOffersResponse> {\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}`\n );\n\n return response.data;\n}\n\nexport async function getSkuOffers(productId: string, skuId: string): Promise<ProductOffersResponse> {\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}/sku/${skuId}`\n );\n\n return response.data;\n}\n"],
5
- "mappings": "AAAA,SAAS,eAAe;AAIxB,eAAsB,iBAAiB,WAAmD;AACxF,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,2CAA2C,SAAS;AAAA,EACtD;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,aAAa,WAAmB,OAA+C;AACnG,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,2CAA2C,SAAS,QAAQ,KAAK;AAAA,EACnE;AAEA,SAAO,SAAS;AAClB;",
4
+ "sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport type ProductOffersResponse = Record<string, unknown>[];\n\nexport async function getProductOffers(\n profileId: string,\n productId: string\n): Promise<ProductOffersResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}`\n );\n\n return response.data;\n}\n\nexport async function getSkuOffers(\n profileId: string,\n productId: string,\n skuId: string\n): Promise<ProductOffersResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}/sku/${skuId}`\n );\n\n return response.data;\n}\n"],
5
+ "mappings": "AAAA,SAAS,yBAAyB;AAIlC,eAAsB,iBACpB,WACA,WACgC;AAChC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,2CAA2C,SAAS;AAAA,EACtD;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,aACpB,WACA,WACA,OACgC;AAChC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,2CAA2C,SAAS,QAAQ,KAAK;AAAA,EACnE;AAEA,SAAO,SAAS;AAClB;",
6
6
  "names": []
7
7
  }
@@ -1,10 +1,15 @@
1
1
  import axios from "axios";
2
- import { vtexApi } from "./vtex-api.js";
2
+ import { getVtexApiClients } from "./vtex-api.js";
3
3
  const RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([408, 429, 500, 502, 503, 504]);
4
4
  const DEFAULT_BATCH_CONCURRENCY = 10;
5
5
  const DEFAULT_MAX_RETRIES = 2;
6
6
  const DEFAULT_BASE_RETRY_DELAY_MS = 250;
7
- async function getInventoryBySku(skuId) {
7
+ async function getInventoryBySku(profileId, skuId) {
8
+ const { vtexApi } = await getVtexApiClients(profileId);
9
+ const response = await vtexApi.get(`/api/logistics/pvt/inventory/skus/${skuId}`);
10
+ return response.data;
11
+ }
12
+ async function getInventoryBySkuWithClient(vtexApi, skuId) {
8
13
  const response = await vtexApi.get(`/api/logistics/pvt/inventory/skus/${skuId}`);
9
14
  return response.data;
10
15
  }
@@ -67,7 +72,7 @@ function isInventoryFetchError(error) {
67
72
  }
68
73
  return "skuId" in error && "attempts" in error && "retryable" in error && typeof error.skuId === "string";
69
74
  }
70
- async function getInventoryBySkuWithRetry(skuId, options) {
75
+ async function getInventoryBySkuWithRetry(vtexApi, skuId, options) {
71
76
  const maxRetries = Math.max(0, Math.floor(options.maxRetries ?? DEFAULT_MAX_RETRIES));
72
77
  const baseRetryDelayMs = Math.max(
73
78
  50,
@@ -77,7 +82,7 @@ async function getInventoryBySkuWithRetry(skuId, options) {
77
82
  while (true) {
78
83
  attempts += 1;
79
84
  try {
80
- const document = await getInventoryBySku(skuId);
85
+ const document = await getInventoryBySkuWithClient(vtexApi, skuId);
81
86
  return { skuId, document };
82
87
  } catch (error) {
83
88
  const retryable = isRetryableRequestError(error);
@@ -91,7 +96,8 @@ async function getInventoryBySkuWithRetry(skuId, options) {
91
96
  }
92
97
  }
93
98
  }
94
- async function getInventoryBySkuBatch(skuIds, options = {}) {
99
+ async function getInventoryBySkuBatch(profileId, skuIds, options = {}) {
100
+ const { vtexApi } = await getVtexApiClients(profileId);
95
101
  const maxConcurrency = Math.max(
96
102
  1,
97
103
  Math.floor(options.maxConcurrency ?? DEFAULT_BATCH_CONCURRENCY)
@@ -101,7 +107,7 @@ async function getInventoryBySkuBatch(skuIds, options = {}) {
101
107
  for (let start = 0; start < skuIds.length; start += maxConcurrency) {
102
108
  const chunk = skuIds.slice(start, start + maxConcurrency);
103
109
  const settledChunk = await Promise.allSettled(
104
- chunk.map((skuId) => getInventoryBySkuWithRetry(skuId, options))
110
+ chunk.map((skuId) => getInventoryBySkuWithRetry(vtexApi, skuId, options))
105
111
  );
106
112
  settledChunk.forEach((result, index) => {
107
113
  const skuId = chunk[index];
@@ -129,16 +135,19 @@ async function getInventoryBySkuBatch(skuIds, options = {}) {
129
135
  }
130
136
  return { successful, failed };
131
137
  }
132
- async function getInventoryByWarehouse(skuId, warehouseId) {
138
+ async function getInventoryByWarehouse(profileId, skuId, warehouseId) {
139
+ const { vtexApi } = await getVtexApiClients(profileId);
133
140
  const response = await vtexApi.get(
134
141
  `/api/logistics/pvt/inventory/items/${skuId}/warehouses/${warehouseId}`
135
142
  );
136
143
  return response.data;
137
144
  }
138
- async function updateInventoryQuantity(skuId, warehouseId, payload) {
145
+ async function updateInventoryQuantity(profileId, skuId, warehouseId, payload) {
146
+ const { vtexApi } = await getVtexApiClients(profileId);
139
147
  await vtexApi.patch(`/api/logistics/pvt/inventory/skus/${skuId}/warehouses/${warehouseId}/quantity`, payload);
140
148
  }
141
- async function updateInventoryLeadTime(skuId, warehouseId, payload) {
149
+ async function updateInventoryLeadTime(profileId, skuId, warehouseId, payload) {
150
+ const { vtexApi } = await getVtexApiClients(profileId);
142
151
  await vtexApi.patch(`/api/logistics/pvt/inventory/skus/${skuId}/warehouses/${warehouseId}/lead-time`, payload);
143
152
  }
144
153
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/services/vtex/vtex-logistics.ts"],
4
- "sourcesContent": ["import axios from \"axios\";\nimport { vtexApi } from \"./vtex-api.js\";\n\nexport interface WarehouseBalance {\n warehouseId?: string;\n warehouseName?: string;\n totalQuantity?: number;\n reservedQuantity?: number;\n availableQuantity?: number;\n isUnlimited?: boolean;\n hasUnlimitedQuantity?: boolean;\n timeToRefill?: string;\n dateOfSupplyUtc?: string;\n leadTime?: string;\n}\n\nexport interface InventoryBySkuResponse {\n skuId?: string;\n balance?: WarehouseBalance[];\n}\n\nexport interface InventoryByWarehouseItem {\n skuId?: string;\n warehouseId?: string;\n totalQuantity?: number;\n reservedQuantity?: number;\n availableQuantity?: number;\n isUnlimited?: boolean;\n keepSellingAfterExpiration?: boolean;\n}\n\nexport interface UpdateInventoryQuantityPayload {\n quantity: number;\n unlimitedQuantity: boolean;\n dateUtcOnBalanceSystem?: string;\n}\n\nexport interface UpdateLeadTimePayload {\n leadTime: string;\n}\n\nexport interface GetInventoryBatchOptions {\n maxConcurrency?: number;\n maxRetries?: number;\n baseRetryDelayMs?: number;\n}\n\nexport interface InventoryBatchSuccess {\n skuId: string;\n document: InventoryBySkuResponse;\n}\n\nexport interface InventoryBatchFailure {\n skuId: string;\n message: string;\n statusCode?: number;\n attempts: number;\n retryable: boolean;\n}\n\nexport interface InventoryBatchResult {\n successful: InventoryBatchSuccess[];\n failed: InventoryBatchFailure[];\n}\n\ninterface InventoryFetchError extends Error {\n skuId: string;\n statusCode?: number;\n attempts: number;\n retryable: boolean;\n}\n\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\nconst DEFAULT_BATCH_CONCURRENCY = 10;\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_BASE_RETRY_DELAY_MS = 250;\n\nexport async function getInventoryBySku(skuId: string): Promise<InventoryBySkuResponse> {\n const response = await vtexApi.get<InventoryBySkuResponse>(`/api/logistics/pvt/inventory/skus/${skuId}`);\n return response.data;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction parseRetryAfterMs(headerValue: unknown): number | undefined {\n if (Array.isArray(headerValue)) {\n return parseRetryAfterMs(headerValue[0]);\n }\n\n if (typeof headerValue === \"number\" && Number.isFinite(headerValue)) {\n return Math.max(0, Math.floor(headerValue * 1000));\n }\n\n if (typeof headerValue !== \"string\") {\n return undefined;\n }\n\n const trimmedValue = headerValue.trim();\n if (!trimmedValue) {\n return undefined;\n }\n\n const seconds = Number(trimmedValue);\n if (Number.isFinite(seconds)) {\n return Math.max(0, Math.floor(seconds * 1000));\n }\n\n const absoluteDateMs = Date.parse(trimmedValue);\n if (Number.isNaN(absoluteDateMs)) {\n return undefined;\n }\n\n return Math.max(0, absoluteDateMs - Date.now());\n}\n\nfunction computeBackoffDelayMs(attempt: number, baseDelayMs: number): number {\n const exponential = baseDelayMs * 2 ** Math.max(0, attempt - 1);\n const jitter = Math.floor(Math.random() * 150);\n return exponential + jitter;\n}\n\nfunction isRetryableRequestError(error: unknown): boolean {\n if (!axios.isAxiosError(error)) {\n return false;\n }\n\n if (!error.response?.status) {\n return true;\n }\n\n return RETRYABLE_STATUS_CODES.has(error.response.status);\n}\n\nfunction toInventoryFetchError(\n skuId: string,\n source: unknown,\n attempts: number,\n retryable: boolean\n): InventoryFetchError {\n const statusCode = axios.isAxiosError(source) ? source.response?.status : undefined;\n const message =\n source instanceof Error\n ? source.message\n : typeof source === \"string\"\n ? source\n : \"Unexpected error while fetching inventory details\";\n\n const error = new Error(message) as InventoryFetchError;\n error.skuId = skuId;\n error.statusCode = statusCode;\n error.attempts = attempts;\n error.retryable = retryable;\n return error;\n}\n\nfunction isInventoryFetchError(error: unknown): error is InventoryFetchError {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return (\n \"skuId\" in error &&\n \"attempts\" in error &&\n \"retryable\" in error &&\n typeof (error as Partial<InventoryFetchError>).skuId === \"string\"\n );\n}\n\nasync function getInventoryBySkuWithRetry(\n skuId: string,\n options: GetInventoryBatchOptions\n): Promise<InventoryBatchSuccess> {\n const maxRetries = Math.max(0, Math.floor(options.maxRetries ?? DEFAULT_MAX_RETRIES));\n const baseRetryDelayMs = Math.max(\n 50,\n Math.floor(options.baseRetryDelayMs ?? DEFAULT_BASE_RETRY_DELAY_MS)\n );\n let attempts = 0;\n\n while (true) {\n attempts += 1;\n\n try {\n const document = await getInventoryBySku(skuId);\n return { skuId, document };\n } catch (error) {\n const retryable = isRetryableRequestError(error);\n\n if (!retryable || attempts > maxRetries) {\n throw toInventoryFetchError(skuId, error, attempts, retryable);\n }\n\n const retryAfterHeader = axios.isAxiosError(error)\n ? error.response?.headers?.[\"retry-after\"]\n : undefined;\n const retryAfterMs = parseRetryAfterMs(retryAfterHeader);\n const delayMs = retryAfterMs ?? computeBackoffDelayMs(attempts, baseRetryDelayMs);\n await sleep(delayMs);\n }\n }\n}\n\nexport async function getInventoryBySkuBatch(\n skuIds: string[],\n options: GetInventoryBatchOptions = {}\n): Promise<InventoryBatchResult> {\n const maxConcurrency = Math.max(\n 1,\n Math.floor(options.maxConcurrency ?? DEFAULT_BATCH_CONCURRENCY)\n );\n const successful: InventoryBatchSuccess[] = [];\n const failed: InventoryBatchFailure[] = [];\n\n for (let start = 0; start < skuIds.length; start += maxConcurrency) {\n const chunk = skuIds.slice(start, start + maxConcurrency);\n const settledChunk = await Promise.allSettled(\n chunk.map((skuId) => getInventoryBySkuWithRetry(skuId, options))\n );\n\n settledChunk.forEach((result, index) => {\n const skuId = chunk[index];\n\n if (result.status === \"fulfilled\") {\n successful.push(result.value);\n return;\n }\n\n if (isInventoryFetchError(result.reason)) {\n failed.push({\n skuId: result.reason.skuId,\n message: result.reason.message,\n statusCode: result.reason.statusCode,\n attempts: result.reason.attempts,\n retryable: result.reason.retryable,\n });\n return;\n }\n\n failed.push({\n skuId,\n message:\n result.reason instanceof Error\n ? result.reason.message\n : \"Unexpected error while fetching inventory details\",\n attempts: 1,\n retryable: false,\n });\n });\n }\n\n return { successful, failed };\n}\n\nexport async function getInventoryByWarehouse(\n skuId: string,\n warehouseId: string\n): Promise<InventoryByWarehouseItem[]> {\n const response = await vtexApi.get<InventoryByWarehouseItem[]>(\n `/api/logistics/pvt/inventory/items/${skuId}/warehouses/${warehouseId}`\n );\n return response.data;\n}\n\nexport async function updateInventoryQuantity(\n skuId: string,\n warehouseId: string,\n payload: UpdateInventoryQuantityPayload\n): Promise<void> {\n await vtexApi.patch(`/api/logistics/pvt/inventory/skus/${skuId}/warehouses/${warehouseId}/quantity`, payload);\n}\n\nexport async function updateInventoryLeadTime(\n skuId: string,\n warehouseId: string,\n payload: UpdateLeadTimePayload\n): Promise<void> {\n await vtexApi.patch(`/api/logistics/pvt/inventory/skus/${skuId}/warehouses/${warehouseId}/lead-time`, payload);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import axios from \"axios\";\nimport type { AxiosInstance } from \"axios\";\n\nimport { getVtexApiClients } from \"./vtex-api.js\";\n\nexport interface WarehouseBalance {\n warehouseId?: string;\n warehouseName?: string;\n totalQuantity?: number;\n reservedQuantity?: number;\n availableQuantity?: number;\n isUnlimited?: boolean;\n hasUnlimitedQuantity?: boolean;\n timeToRefill?: string;\n dateOfSupplyUtc?: string;\n leadTime?: string;\n}\n\nexport interface InventoryBySkuResponse {\n skuId?: string;\n balance?: WarehouseBalance[];\n}\n\nexport interface InventoryByWarehouseItem {\n skuId?: string;\n warehouseId?: string;\n totalQuantity?: number;\n reservedQuantity?: number;\n availableQuantity?: number;\n isUnlimited?: boolean;\n keepSellingAfterExpiration?: boolean;\n}\n\nexport interface UpdateInventoryQuantityPayload {\n quantity: number;\n unlimitedQuantity: boolean;\n dateUtcOnBalanceSystem?: string;\n}\n\nexport interface UpdateLeadTimePayload {\n leadTime: string;\n}\n\nexport interface GetInventoryBatchOptions {\n maxConcurrency?: number;\n maxRetries?: number;\n baseRetryDelayMs?: number;\n}\n\nexport interface InventoryBatchSuccess {\n skuId: string;\n document: InventoryBySkuResponse;\n}\n\nexport interface InventoryBatchFailure {\n skuId: string;\n message: string;\n statusCode?: number;\n attempts: number;\n retryable: boolean;\n}\n\nexport interface InventoryBatchResult {\n successful: InventoryBatchSuccess[];\n failed: InventoryBatchFailure[];\n}\n\ninterface InventoryFetchError extends Error {\n skuId: string;\n statusCode?: number;\n attempts: number;\n retryable: boolean;\n}\n\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\nconst DEFAULT_BATCH_CONCURRENCY = 10;\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_BASE_RETRY_DELAY_MS = 250;\n\nexport async function getInventoryBySku(\n profileId: string,\n skuId: string\n): Promise<InventoryBySkuResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<InventoryBySkuResponse>(`/api/logistics/pvt/inventory/skus/${skuId}`);\n return response.data;\n}\n\nasync function getInventoryBySkuWithClient(\n vtexApi: AxiosInstance,\n skuId: string\n): Promise<InventoryBySkuResponse> {\n const response = await vtexApi.get<InventoryBySkuResponse>(`/api/logistics/pvt/inventory/skus/${skuId}`);\n return response.data;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction parseRetryAfterMs(headerValue: unknown): number | undefined {\n if (Array.isArray(headerValue)) {\n return parseRetryAfterMs(headerValue[0]);\n }\n\n if (typeof headerValue === \"number\" && Number.isFinite(headerValue)) {\n return Math.max(0, Math.floor(headerValue * 1000));\n }\n\n if (typeof headerValue !== \"string\") {\n return undefined;\n }\n\n const trimmedValue = headerValue.trim();\n if (!trimmedValue) {\n return undefined;\n }\n\n const seconds = Number(trimmedValue);\n if (Number.isFinite(seconds)) {\n return Math.max(0, Math.floor(seconds * 1000));\n }\n\n const absoluteDateMs = Date.parse(trimmedValue);\n if (Number.isNaN(absoluteDateMs)) {\n return undefined;\n }\n\n return Math.max(0, absoluteDateMs - Date.now());\n}\n\nfunction computeBackoffDelayMs(attempt: number, baseDelayMs: number): number {\n const exponential = baseDelayMs * 2 ** Math.max(0, attempt - 1);\n const jitter = Math.floor(Math.random() * 150);\n return exponential + jitter;\n}\n\nfunction isRetryableRequestError(error: unknown): boolean {\n if (!axios.isAxiosError(error)) {\n return false;\n }\n\n if (!error.response?.status) {\n return true;\n }\n\n return RETRYABLE_STATUS_CODES.has(error.response.status);\n}\n\nfunction toInventoryFetchError(\n skuId: string,\n source: unknown,\n attempts: number,\n retryable: boolean\n): InventoryFetchError {\n const statusCode = axios.isAxiosError(source) ? source.response?.status : undefined;\n const message =\n source instanceof Error\n ? source.message\n : typeof source === \"string\"\n ? source\n : \"Unexpected error while fetching inventory details\";\n\n const error = new Error(message) as InventoryFetchError;\n error.skuId = skuId;\n error.statusCode = statusCode;\n error.attempts = attempts;\n error.retryable = retryable;\n return error;\n}\n\nfunction isInventoryFetchError(error: unknown): error is InventoryFetchError {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return (\n \"skuId\" in error &&\n \"attempts\" in error &&\n \"retryable\" in error &&\n typeof (error as Partial<InventoryFetchError>).skuId === \"string\"\n );\n}\n\nasync function getInventoryBySkuWithRetry(\n vtexApi: AxiosInstance,\n skuId: string,\n options: GetInventoryBatchOptions\n): Promise<InventoryBatchSuccess> {\n const maxRetries = Math.max(0, Math.floor(options.maxRetries ?? DEFAULT_MAX_RETRIES));\n const baseRetryDelayMs = Math.max(\n 50,\n Math.floor(options.baseRetryDelayMs ?? DEFAULT_BASE_RETRY_DELAY_MS)\n );\n let attempts = 0;\n\n while (true) {\n attempts += 1;\n\n try {\n const document = await getInventoryBySkuWithClient(vtexApi, skuId);\n return { skuId, document };\n } catch (error) {\n const retryable = isRetryableRequestError(error);\n\n if (!retryable || attempts > maxRetries) {\n throw toInventoryFetchError(skuId, error, attempts, retryable);\n }\n\n const retryAfterHeader = axios.isAxiosError(error)\n ? error.response?.headers?.[\"retry-after\"]\n : undefined;\n const retryAfterMs = parseRetryAfterMs(retryAfterHeader);\n const delayMs = retryAfterMs ?? computeBackoffDelayMs(attempts, baseRetryDelayMs);\n await sleep(delayMs);\n }\n }\n}\n\nexport async function getInventoryBySkuBatch(\n profileId: string,\n skuIds: string[],\n options: GetInventoryBatchOptions = {}\n): Promise<InventoryBatchResult> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const maxConcurrency = Math.max(\n 1,\n Math.floor(options.maxConcurrency ?? DEFAULT_BATCH_CONCURRENCY)\n );\n const successful: InventoryBatchSuccess[] = [];\n const failed: InventoryBatchFailure[] = [];\n\n for (let start = 0; start < skuIds.length; start += maxConcurrency) {\n const chunk = skuIds.slice(start, start + maxConcurrency);\n const settledChunk = await Promise.allSettled(\n chunk.map((skuId) => getInventoryBySkuWithRetry(vtexApi, skuId, options))\n );\n\n settledChunk.forEach((result, index) => {\n const skuId = chunk[index];\n\n if (result.status === \"fulfilled\") {\n successful.push(result.value);\n return;\n }\n\n if (isInventoryFetchError(result.reason)) {\n failed.push({\n skuId: result.reason.skuId,\n message: result.reason.message,\n statusCode: result.reason.statusCode,\n attempts: result.reason.attempts,\n retryable: result.reason.retryable,\n });\n return;\n }\n\n failed.push({\n skuId,\n message:\n result.reason instanceof Error\n ? result.reason.message\n : \"Unexpected error while fetching inventory details\",\n attempts: 1,\n retryable: false,\n });\n });\n }\n\n return { successful, failed };\n}\n\nexport async function getInventoryByWarehouse(\n profileId: string,\n skuId: string,\n warehouseId: string\n): Promise<InventoryByWarehouseItem[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<InventoryByWarehouseItem[]>(\n `/api/logistics/pvt/inventory/items/${skuId}/warehouses/${warehouseId}`\n );\n return response.data;\n}\n\nexport async function updateInventoryQuantity(\n profileId: string,\n skuId: string,\n warehouseId: string,\n payload: UpdateInventoryQuantityPayload\n): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.patch(`/api/logistics/pvt/inventory/skus/${skuId}/warehouses/${warehouseId}/quantity`, payload);\n}\n\nexport async function updateInventoryLeadTime(\n profileId: string,\n skuId: string,\n warehouseId: string,\n payload: UpdateLeadTimePayload\n): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.patch(`/api/logistics/pvt/inventory/skus/${skuId}/warehouses/${warehouseId}/lead-time`, payload);\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAGlB,SAAS,yBAAyB;AAuElC,MAAM,yBAAyB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AACrE,MAAM,4BAA4B;AAClC,MAAM,sBAAsB;AAC5B,MAAM,8BAA8B;AAEpC,eAAsB,kBACpB,WACA,OACiC;AACjC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAA4B,qCAAqC,KAAK,EAAE;AACvG,SAAO,SAAS;AAClB;AAEA,eAAe,4BACb,SACA,OACiC;AACjC,QAAM,WAAW,MAAM,QAAQ,IAA4B,qCAAqC,KAAK,EAAE;AACvG,SAAO,SAAS;AAClB;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,kBAAkB,aAA0C;AACnE,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,WAAO,kBAAkB,YAAY,CAAC,CAAC;AAAA,EACzC;AAEA,MAAI,OAAO,gBAAgB,YAAY,OAAO,SAAS,WAAW,GAAG;AACnE,WAAO,KAAK,IAAI,GAAG,KAAK,MAAM,cAAc,GAAI,CAAC;AAAA,EACnD;AAEA,MAAI,OAAO,gBAAgB,UAAU;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,YAAY,KAAK;AACtC,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,YAAY;AACnC,MAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,WAAO,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,GAAI,CAAC;AAAA,EAC/C;AAEA,QAAM,iBAAiB,KAAK,MAAM,YAAY;AAC9C,MAAI,OAAO,MAAM,cAAc,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,GAAG,iBAAiB,KAAK,IAAI,CAAC;AAChD;AAEA,SAAS,sBAAsB,SAAiB,aAA6B;AAC3E,QAAM,cAAc,cAAc,KAAK,KAAK,IAAI,GAAG,UAAU,CAAC;AAC9D,QAAM,SAAS,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG;AAC7C,SAAO,cAAc;AACvB;AAEA,SAAS,wBAAwB,OAAyB;AACxD,MAAI,CAAC,MAAM,aAAa,KAAK,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,UAAU,QAAQ;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,uBAAuB,IAAI,MAAM,SAAS,MAAM;AACzD;AAEA,SAAS,sBACP,OACA,QACA,UACA,WACqB;AACrB,QAAM,aAAa,MAAM,aAAa,MAAM,IAAI,OAAO,UAAU,SAAS;AAC1E,QAAM,UACJ,kBAAkB,QACd,OAAO,UACP,OAAO,WAAW,WAChB,SACA;AAER,QAAM,QAAQ,IAAI,MAAM,OAAO;AAC/B,QAAM,QAAQ;AACd,QAAM,aAAa;AACnB,QAAM,WAAW;AACjB,QAAM,YAAY;AAClB,SAAO;AACT;AAEA,SAAS,sBAAsB,OAA8C;AAC3E,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO;AAAA,EACT;AAEA,SACE,WAAW,SACX,cAAc,SACd,eAAe,SACf,OAAQ,MAAuC,UAAU;AAE7D;AAEA,eAAe,2BACb,SACA,OACA,SACgC;AAChC,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,cAAc,mBAAmB,CAAC;AACpF,QAAM,mBAAmB,KAAK;AAAA,IAC5B;AAAA,IACA,KAAK,MAAM,QAAQ,oBAAoB,2BAA2B;AAAA,EACpE;AACA,MAAI,WAAW;AAEf,SAAO,MAAM;AACX,gBAAY;AAEZ,QAAI;AACF,YAAM,WAAW,MAAM,4BAA4B,SAAS,KAAK;AACjE,aAAO,EAAE,OAAO,SAAS;AAAA,IAC3B,SAAS,OAAO;AACd,YAAM,YAAY,wBAAwB,KAAK;AAE/C,UAAI,CAAC,aAAa,WAAW,YAAY;AACvC,cAAM,sBAAsB,OAAO,OAAO,UAAU,SAAS;AAAA,MAC/D;AAEA,YAAM,mBAAmB,MAAM,aAAa,KAAK,IAC7C,MAAM,UAAU,UAAU,aAAa,IACvC;AACJ,YAAM,eAAe,kBAAkB,gBAAgB;AACvD,YAAM,UAAU,gBAAgB,sBAAsB,UAAU,gBAAgB;AAChF,YAAM,MAAM,OAAO;AAAA,IACrB;AAAA,EACF;AACF;AAEA,eAAsB,uBACpB,WACA,QACA,UAAoC,CAAC,GACN;AAC/B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,iBAAiB,KAAK;AAAA,IAC1B;AAAA,IACA,KAAK,MAAM,QAAQ,kBAAkB,yBAAyB;AAAA,EAChE;AACA,QAAM,aAAsC,CAAC;AAC7C,QAAM,SAAkC,CAAC;AAEzC,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,gBAAgB;AAClE,UAAM,QAAQ,OAAO,MAAM,OAAO,QAAQ,cAAc;AACxD,UAAM,eAAe,MAAM,QAAQ;AAAA,MACjC,MAAM,IAAI,CAAC,UAAU,2BAA2B,SAAS,OAAO,OAAO,CAAC;AAAA,IAC1E;AAEA,iBAAa,QAAQ,CAAC,QAAQ,UAAU;AACtC,YAAM,QAAQ,MAAM,KAAK;AAEzB,UAAI,OAAO,WAAW,aAAa;AACjC,mBAAW,KAAK,OAAO,KAAK;AAC5B;AAAA,MACF;AAEA,UAAI,sBAAsB,OAAO,MAAM,GAAG;AACxC,eAAO,KAAK;AAAA,UACV,OAAO,OAAO,OAAO;AAAA,UACrB,SAAS,OAAO,OAAO;AAAA,UACvB,YAAY,OAAO,OAAO;AAAA,UAC1B,UAAU,OAAO,OAAO;AAAA,UACxB,WAAW,OAAO,OAAO;AAAA,QAC3B,CAAC;AACD;AAAA,MACF;AAEA,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SACE,OAAO,kBAAkB,QACrB,OAAO,OAAO,UACd;AAAA,QACN,UAAU;AAAA,QACV,WAAW;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,YAAY,OAAO;AAC9B;AAEA,eAAsB,wBACpB,WACA,OACA,aACqC;AACrC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,sCAAsC,KAAK,eAAe,WAAW;AAAA,EACvE;AACA,SAAO,SAAS;AAClB;AAEA,eAAsB,wBACpB,WACA,OACA,aACA,SACe;AACf,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,QAAQ,MAAM,qCAAqC,KAAK,eAAe,WAAW,aAAa,OAAO;AAC9G;AAEA,eAAsB,wBACpB,WACA,OACA,aACA,SACe;AACf,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,QAAQ,MAAM,qCAAqC,KAAK,eAAe,WAAW,cAAc,OAAO;AAC/G;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,152 @@
1
+ import { getVtexApiClients } from "./vtex-api.js";
2
+ import { getOrderDocument } from "./vtex-orders.js";
3
+ import { VtexOperationError } from "./vtex-write.js";
4
+ function toStringArray(value) {
5
+ if (!Array.isArray(value)) {
6
+ return [];
7
+ }
8
+ return value.map((item) => item == null ? void 0 : String(item)).filter((item) => Boolean(item));
9
+ }
10
+ function readInvoiceNumbers(document) {
11
+ const invoiceData = document.invoiceData;
12
+ if (!invoiceData || typeof invoiceData !== "object") {
13
+ return [];
14
+ }
15
+ const invoices = Array.isArray(invoiceData.invoices) ? invoiceData.invoices : [];
16
+ const fromInvoices = invoices.map((invoice) => {
17
+ const number = invoice.invoiceNumber ?? invoice.number ?? invoice.invoiceId ?? invoice.receipt;
18
+ return number == null ? void 0 : String(number);
19
+ }).filter((item) => Boolean(item));
20
+ const outputInvoices = toStringArray(invoiceData.invoiceOutput);
21
+ return Array.from(/* @__PURE__ */ new Set([...fromInvoices, ...outputInvoices]));
22
+ }
23
+ async function getOrderStateSnapshot(profileId, orderId, reason) {
24
+ const document = await getOrderDocument(profileId, orderId, reason);
25
+ return {
26
+ orderId,
27
+ status: document.status == null ? void 0 : String(document.status),
28
+ state: document.state == null ? void 0 : String(document.state),
29
+ allowCancellation: typeof document.allowCancellation === "boolean" ? document.allowCancellation : void 0,
30
+ invoicedDate: document.invoicedDate == null ? void 0 : String(document.invoicedDate),
31
+ invoiceNumbers: readInvoiceNumbers(document)
32
+ };
33
+ }
34
+ function isCanceledStatus(snapshot) {
35
+ const states = [snapshot.status, snapshot.state].filter(Boolean).map((value) => String(value).toLowerCase());
36
+ return states.some((value) => value.includes("cancel"));
37
+ }
38
+ function ensureOrderCanBeCanceled(snapshot) {
39
+ if (isCanceledStatus(snapshot)) {
40
+ throw new VtexOperationError("Order is already canceled.", "INVALID_ORDER_STATE", {
41
+ status: snapshot.status,
42
+ state: snapshot.state
43
+ });
44
+ }
45
+ if (snapshot.allowCancellation === false) {
46
+ throw new VtexOperationError(
47
+ "VTEX reports that this order can no longer be canceled.",
48
+ "INVALID_ORDER_STATE",
49
+ {
50
+ status: snapshot.status,
51
+ state: snapshot.state
52
+ }
53
+ );
54
+ }
55
+ if (snapshot.invoicedDate) {
56
+ throw new VtexOperationError(
57
+ "Order is already invoiced, so VTEX no longer allows cancellation.",
58
+ "INVALID_ORDER_STATE",
59
+ {
60
+ invoiced_date: snapshot.invoicedDate
61
+ }
62
+ );
63
+ }
64
+ }
65
+ function ensureOrderCanBeInvoiced(snapshot) {
66
+ if (isCanceledStatus(snapshot)) {
67
+ throw new VtexOperationError("Canceled orders cannot be invoiced.", "INVALID_ORDER_STATE", {
68
+ status: snapshot.status,
69
+ state: snapshot.state
70
+ });
71
+ }
72
+ if (snapshot.invoicedDate || snapshot.invoiceNumbers.length > 0) {
73
+ throw new VtexOperationError("Order already contains invoice data.", "INVALID_ORDER_STATE", {
74
+ invoiced_date: snapshot.invoicedDate,
75
+ invoice_numbers: snapshot.invoiceNumbers
76
+ });
77
+ }
78
+ }
79
+ function ensureOrderCanReceiveTracking(snapshot, invoiceNumber) {
80
+ if (isCanceledStatus(snapshot)) {
81
+ throw new VtexOperationError(
82
+ "Canceled orders cannot receive tracking updates.",
83
+ "INVALID_ORDER_STATE",
84
+ {
85
+ status: snapshot.status,
86
+ state: snapshot.state
87
+ }
88
+ );
89
+ }
90
+ if (!snapshot.invoicedDate && snapshot.invoiceNumbers.length === 0) {
91
+ throw new VtexOperationError(
92
+ "Order is not invoiced yet, so tracking cannot be added.",
93
+ "INVALID_ORDER_STATE",
94
+ {
95
+ status: snapshot.status,
96
+ state: snapshot.state
97
+ }
98
+ );
99
+ }
100
+ if (snapshot.invoiceNumbers.length > 0 && !snapshot.invoiceNumbers.includes(invoiceNumber)) {
101
+ throw new VtexOperationError(
102
+ "The provided invoice number is not present in VTEX for this order.",
103
+ "INVALID_OPERATION",
104
+ {
105
+ provided_invoice_number: invoiceNumber,
106
+ known_invoice_numbers: snapshot.invoiceNumbers
107
+ }
108
+ );
109
+ }
110
+ }
111
+ async function cancelOrder(profileId, orderId, reason) {
112
+ const { vtexApi } = await getVtexApiClients(profileId);
113
+ await vtexApi.post(`/api/oms/pvt/orders/${orderId}/cancel`, reason ? { reason } : {});
114
+ }
115
+ async function invoiceOrder(profileId, orderId, payload) {
116
+ const { vtexApi } = await getVtexApiClients(profileId);
117
+ await vtexApi.post(`/api/oms/pvt/orders/${orderId}/invoice`, payload);
118
+ }
119
+ async function updatePartialInvoiceTracking(profileId, orderId, invoiceNumber, payload) {
120
+ const { vtexApi } = await getVtexApiClients(profileId);
121
+ await vtexApi.patch(`/api/oms/pvt/orders/${orderId}/invoice/${invoiceNumber}`, payload);
122
+ }
123
+ async function updateOrderTrackingStatus(profileId, orderId, invoiceNumber, payload) {
124
+ const { vtexApi } = await getVtexApiClients(profileId);
125
+ await vtexApi.put(`/api/oms/pvt/orders/${orderId}/invoice/${invoiceNumber}/tracking`, payload);
126
+ }
127
+ async function validateOrderForCancellation(profileId, orderId, reason) {
128
+ const snapshot = await getOrderStateSnapshot(profileId, orderId, reason);
129
+ ensureOrderCanBeCanceled(snapshot);
130
+ return snapshot;
131
+ }
132
+ async function validateOrderForInvoice(profileId, orderId, reason) {
133
+ const snapshot = await getOrderStateSnapshot(profileId, orderId, reason);
134
+ ensureOrderCanBeInvoiced(snapshot);
135
+ return snapshot;
136
+ }
137
+ async function validateOrderForTracking(profileId, orderId, invoiceNumber, reason) {
138
+ const snapshot = await getOrderStateSnapshot(profileId, orderId, reason);
139
+ ensureOrderCanReceiveTracking(snapshot, invoiceNumber);
140
+ return snapshot;
141
+ }
142
+ export {
143
+ cancelOrder,
144
+ getOrderStateSnapshot,
145
+ invoiceOrder,
146
+ updateOrderTrackingStatus,
147
+ updatePartialInvoiceTracking,
148
+ validateOrderForCancellation,
149
+ validateOrderForInvoice,
150
+ validateOrderForTracking
151
+ };
152
+ //# sourceMappingURL=vtex-orders-write.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/services/vtex/vtex-orders-write.ts"],
4
+ "sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\nimport { getOrderDocument } from \"./vtex-orders.js\";\nimport { VtexOperationError } from \"./vtex-write.js\";\n\nexport interface VtexInvoiceItemInput {\n id: string;\n price: number;\n quantity: number;\n description?: string;\n}\n\nexport interface VtexInvoicePayload {\n type: \"Output\" | \"Input\";\n issuanceDate: string;\n invoiceNumber: string;\n invoiceValue: string;\n items: VtexInvoiceItemInput[];\n invoiceKey?: string;\n invoiceUrl?: string;\n invoiceOrderNumber?: string;\n courier?: string;\n trackingNumber?: string;\n trackingUrl?: string;\n}\n\nexport interface VtexPartialInvoicePayload {\n trackingNumber: string;\n trackingUrl?: string | null;\n courier?: string | null;\n dispatchedDate: string;\n}\n\nexport interface VtexTrackingEventInput {\n city: string;\n state: string;\n description: string;\n date: string;\n}\n\nexport interface VtexTrackingStatusPayload {\n isDelivered: boolean;\n deliveredDate?: string | null;\n events: VtexTrackingEventInput[];\n}\n\nexport interface VtexOrderStateSnapshot {\n orderId: string;\n status?: string;\n state?: string;\n allowCancellation?: boolean;\n invoicedDate?: string;\n invoiceNumbers: string[];\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .map((item) => (item == null ? undefined : String(item)))\n .filter((item): item is string => Boolean(item));\n}\n\nfunction readInvoiceNumbers(document: Record<string, unknown>): string[] {\n const invoiceData = document.invoiceData;\n if (!invoiceData || typeof invoiceData !== \"object\") {\n return [];\n }\n\n const invoices = Array.isArray((invoiceData as Record<string, unknown>).invoices)\n ? ((invoiceData as Record<string, unknown>).invoices as Array<Record<string, unknown>>)\n : [];\n\n const fromInvoices = invoices\n .map((invoice) => {\n const number =\n invoice.invoiceNumber ??\n invoice.number ??\n invoice.invoiceId ??\n invoice.receipt;\n\n return number == null ? undefined : String(number);\n })\n .filter((item): item is string => Boolean(item));\n\n const outputInvoices = toStringArray((invoiceData as Record<string, unknown>).invoiceOutput);\n return Array.from(new Set([...fromInvoices, ...outputInvoices]));\n}\n\nexport async function getOrderStateSnapshot(\n profileId: string,\n orderId: string,\n reason?: string\n): Promise<VtexOrderStateSnapshot> {\n const document = await getOrderDocument(profileId, orderId, reason);\n\n return {\n orderId,\n status: document.status == null ? undefined : String(document.status),\n state: document.state == null ? undefined : String(document.state),\n allowCancellation:\n typeof document.allowCancellation === \"boolean\" ? document.allowCancellation : undefined,\n invoicedDate: document.invoicedDate == null ? undefined : String(document.invoicedDate),\n invoiceNumbers: readInvoiceNumbers(document),\n };\n}\n\nfunction isCanceledStatus(snapshot: VtexOrderStateSnapshot): boolean {\n const states = [snapshot.status, snapshot.state]\n .filter(Boolean)\n .map((value) => String(value).toLowerCase());\n\n return states.some((value) => value.includes(\"cancel\"));\n}\n\nfunction ensureOrderCanBeCanceled(snapshot: VtexOrderStateSnapshot): void {\n if (isCanceledStatus(snapshot)) {\n throw new VtexOperationError(\"Order is already canceled.\", \"INVALID_ORDER_STATE\", {\n status: snapshot.status,\n state: snapshot.state,\n });\n }\n\n if (snapshot.allowCancellation === false) {\n throw new VtexOperationError(\n \"VTEX reports that this order can no longer be canceled.\",\n \"INVALID_ORDER_STATE\",\n {\n status: snapshot.status,\n state: snapshot.state,\n }\n );\n }\n\n if (snapshot.invoicedDate) {\n throw new VtexOperationError(\n \"Order is already invoiced, so VTEX no longer allows cancellation.\",\n \"INVALID_ORDER_STATE\",\n {\n invoiced_date: snapshot.invoicedDate,\n }\n );\n }\n}\n\nfunction ensureOrderCanBeInvoiced(snapshot: VtexOrderStateSnapshot): void {\n if (isCanceledStatus(snapshot)) {\n throw new VtexOperationError(\"Canceled orders cannot be invoiced.\", \"INVALID_ORDER_STATE\", {\n status: snapshot.status,\n state: snapshot.state,\n });\n }\n\n if (snapshot.invoicedDate || snapshot.invoiceNumbers.length > 0) {\n throw new VtexOperationError(\"Order already contains invoice data.\", \"INVALID_ORDER_STATE\", {\n invoiced_date: snapshot.invoicedDate,\n invoice_numbers: snapshot.invoiceNumbers,\n });\n }\n}\n\nfunction ensureOrderCanReceiveTracking(snapshot: VtexOrderStateSnapshot, invoiceNumber: string): void {\n if (isCanceledStatus(snapshot)) {\n throw new VtexOperationError(\n \"Canceled orders cannot receive tracking updates.\",\n \"INVALID_ORDER_STATE\",\n {\n status: snapshot.status,\n state: snapshot.state,\n }\n );\n }\n\n if (!snapshot.invoicedDate && snapshot.invoiceNumbers.length === 0) {\n throw new VtexOperationError(\n \"Order is not invoiced yet, so tracking cannot be added.\",\n \"INVALID_ORDER_STATE\",\n {\n status: snapshot.status,\n state: snapshot.state,\n }\n );\n }\n\n if (snapshot.invoiceNumbers.length > 0 && !snapshot.invoiceNumbers.includes(invoiceNumber)) {\n throw new VtexOperationError(\n \"The provided invoice number is not present in VTEX for this order.\",\n \"INVALID_OPERATION\",\n {\n provided_invoice_number: invoiceNumber,\n known_invoice_numbers: snapshot.invoiceNumbers,\n }\n );\n }\n}\n\nexport async function cancelOrder(\n profileId: string,\n orderId: string,\n reason?: string\n): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.post(`/api/oms/pvt/orders/${orderId}/cancel`, reason ? { reason } : {});\n}\n\nexport async function invoiceOrder(\n profileId: string,\n orderId: string,\n payload: VtexInvoicePayload\n): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.post(`/api/oms/pvt/orders/${orderId}/invoice`, payload);\n}\n\nexport async function updatePartialInvoiceTracking(\n profileId: string,\n orderId: string,\n invoiceNumber: string,\n payload: VtexPartialInvoicePayload\n): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.patch(`/api/oms/pvt/orders/${orderId}/invoice/${invoiceNumber}`, payload);\n}\n\nexport async function updateOrderTrackingStatus(\n profileId: string,\n orderId: string,\n invoiceNumber: string,\n payload: VtexTrackingStatusPayload\n): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.put(`/api/oms/pvt/orders/${orderId}/invoice/${invoiceNumber}/tracking`, payload);\n}\n\nexport async function validateOrderForCancellation(\n profileId: string,\n orderId: string,\n reason?: string\n): Promise<VtexOrderStateSnapshot> {\n const snapshot = await getOrderStateSnapshot(profileId, orderId, reason);\n ensureOrderCanBeCanceled(snapshot);\n return snapshot;\n}\n\nexport async function validateOrderForInvoice(\n profileId: string,\n orderId: string,\n reason?: string\n): Promise<VtexOrderStateSnapshot> {\n const snapshot = await getOrderStateSnapshot(profileId, orderId, reason);\n ensureOrderCanBeInvoiced(snapshot);\n return snapshot;\n}\n\nexport async function validateOrderForTracking(\n profileId: string,\n orderId: string,\n invoiceNumber: string,\n reason?: string\n): Promise<VtexOrderStateSnapshot> {\n const snapshot = await getOrderStateSnapshot(profileId, orderId, reason);\n ensureOrderCanReceiveTracking(snapshot, invoiceNumber);\n return snapshot;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,14 +1,16 @@
1
1
  import axios from "axios";
2
- import { vtexApi } from "./vtex-api.js";
2
+ import { getVtexApiClients } from "./vtex-api.js";
3
3
  const RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([408, 429, 500, 502, 503, 504]);
4
4
  const DEFAULT_BATCH_CONCURRENCY = 10;
5
5
  const DEFAULT_MAX_RETRIES = 2;
6
6
  const DEFAULT_BASE_RETRY_DELAY_MS = 250;
7
- async function listOrders(params) {
7
+ async function listOrders(profileId, params) {
8
+ const { vtexApi } = await getVtexApiClients(profileId);
8
9
  const response = await vtexApi.get("/api/oms/pvt/orders", { params });
9
10
  return response.data;
10
11
  }
11
- async function getOrderDocument(orderId, reason) {
12
+ async function getOrderDocument(profileId, orderId, reason) {
13
+ const { vtexApi } = await getVtexApiClients(profileId);
12
14
  const response = await vtexApi.get(`/api/orders/pvt/document/${orderId}`, {
13
15
  params: reason ? { reason } : void 0
14
16
  });
@@ -73,7 +75,7 @@ function isOrderDocumentFetchError(error) {
73
75
  }
74
76
  return "orderId" in error && "attempts" in error && "retryable" in error && typeof error.orderId === "string";
75
77
  }
76
- async function getOrderDocumentWithRetry(orderId, options) {
78
+ async function getOrderDocumentWithRetry(vtexApi, orderId, options) {
77
79
  const maxRetries = Math.max(0, Math.floor(options.maxRetries ?? DEFAULT_MAX_RETRIES));
78
80
  const baseRetryDelayMs = Math.max(
79
81
  50,
@@ -83,7 +85,10 @@ async function getOrderDocumentWithRetry(orderId, options) {
83
85
  while (true) {
84
86
  attempts += 1;
85
87
  try {
86
- const document = await getOrderDocument(orderId, options.reason);
88
+ const response = await vtexApi.get(`/api/orders/pvt/document/${orderId}`, {
89
+ params: options.reason ? { reason: options.reason } : void 0
90
+ });
91
+ const document = response.data;
87
92
  return { orderId, document };
88
93
  } catch (error) {
89
94
  const retryable = isRetryableRequestError(error);
@@ -97,7 +102,8 @@ async function getOrderDocumentWithRetry(orderId, options) {
97
102
  }
98
103
  }
99
104
  }
100
- async function getOrderDocumentsBatch(orderIds, options = {}) {
105
+ async function getOrderDocumentsBatch(profileId, orderIds, options = {}) {
106
+ const { vtexApi } = await getVtexApiClients(profileId);
101
107
  const maxConcurrency = Math.max(
102
108
  1,
103
109
  Math.floor(options.maxConcurrency ?? DEFAULT_BATCH_CONCURRENCY)
@@ -107,7 +113,7 @@ async function getOrderDocumentsBatch(orderIds, options = {}) {
107
113
  for (let start = 0; start < orderIds.length; start += maxConcurrency) {
108
114
  const chunk = orderIds.slice(start, start + maxConcurrency);
109
115
  const settledChunk = await Promise.allSettled(
110
- chunk.map((orderId) => getOrderDocumentWithRetry(orderId, options))
116
+ chunk.map((orderId) => getOrderDocumentWithRetry(vtexApi, orderId, options))
111
117
  );
112
118
  settledChunk.forEach((result, index) => {
113
119
  const orderId = chunk[index];
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/services/vtex/vtex-orders.ts"],
4
- "sourcesContent": ["import axios from \"axios\";\nimport { vtexApi } from \"./vtex-api.js\";\n\nexport interface VtexOrderListItem {\n orderId: string;\n creationDate?: string;\n status?: string;\n totalValue?: number;\n currencyCode?: string;\n paymentNames?: string;\n salesChannel?: string;\n origin?: string;\n totalItems?: number;\n lastChange?: string;\n orderIsComplete?: boolean;\n authorizedDate?: string;\n paymentApprovedDate?: string;\n readyForHandlingDate?: string;\n}\n\nexport interface VtexOrdersPaging {\n total?: number;\n pages?: number;\n currentPage?: number;\n perPage?: number;\n}\n\nexport interface VtexOrdersListResponse {\n list: VtexOrderListItem[];\n paging: VtexOrdersPaging;\n stats?: unknown;\n}\n\nexport interface ListOrdersParams {\n page?: number;\n per_page?: number;\n orderBy?: string;\n f_creationDate?: string;\n f_invoicedDate?: string;\n f_status?: string;\n f_salesChannel?: string;\n f_paymentNames?: string;\n f_UtmSource?: string;\n q?: string;\n}\n\nexport interface GetOrderDocumentsBatchOptions {\n reason?: string;\n maxConcurrency?: number;\n maxRetries?: number;\n baseRetryDelayMs?: number;\n}\n\nexport interface OrderDocumentSuccess {\n orderId: string;\n document: Record<string, unknown>;\n}\n\nexport interface OrderDocumentFailure {\n orderId: string;\n message: string;\n statusCode?: number;\n attempts: number;\n retryable: boolean;\n}\n\nexport interface OrderDocumentsBatchResult {\n successful: OrderDocumentSuccess[];\n failed: OrderDocumentFailure[];\n}\n\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\nconst DEFAULT_BATCH_CONCURRENCY = 10;\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_BASE_RETRY_DELAY_MS = 250;\n\nexport async function listOrders(params: ListOrdersParams): Promise<VtexOrdersListResponse> {\n const response = await vtexApi.get<VtexOrdersListResponse>(\"/api/oms/pvt/orders\", { params });\n return response.data;\n}\n\nexport async function getOrderDocument(\n orderId: string,\n reason?: string\n): Promise<Record<string, unknown>> {\n const response = await vtexApi.get<Record<string, unknown>>(`/api/orders/pvt/document/${orderId}`, {\n params: reason ? { reason } : undefined,\n });\n\n return response.data;\n}\n\ninterface OrderDocumentFetchError extends Error {\n orderId: string;\n statusCode?: number;\n attempts: number;\n retryable: boolean;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction parseRetryAfterMs(headerValue: unknown): number | undefined {\n if (Array.isArray(headerValue)) {\n return parseRetryAfterMs(headerValue[0]);\n }\n\n if (typeof headerValue === \"number\" && Number.isFinite(headerValue)) {\n return Math.max(0, Math.floor(headerValue * 1000));\n }\n\n if (typeof headerValue !== \"string\") {\n return undefined;\n }\n\n const trimmedValue = headerValue.trim();\n if (!trimmedValue) {\n return undefined;\n }\n\n const seconds = Number(trimmedValue);\n if (Number.isFinite(seconds)) {\n return Math.max(0, Math.floor(seconds * 1000));\n }\n\n const absoluteDateMs = Date.parse(trimmedValue);\n if (Number.isNaN(absoluteDateMs)) {\n return undefined;\n }\n\n return Math.max(0, absoluteDateMs - Date.now());\n}\n\nfunction computeBackoffDelayMs(attempt: number, baseDelayMs: number): number {\n const exponential = baseDelayMs * 2 ** Math.max(0, attempt - 1);\n const jitter = Math.floor(Math.random() * 150);\n return exponential + jitter;\n}\n\nfunction isRetryableRequestError(error: unknown): boolean {\n if (!axios.isAxiosError(error)) {\n return false;\n }\n\n if (!error.response?.status) {\n return true;\n }\n\n return RETRYABLE_STATUS_CODES.has(error.response.status);\n}\n\nfunction toOrderDocumentFetchError(\n orderId: string,\n source: unknown,\n attempts: number,\n retryable: boolean\n): OrderDocumentFetchError {\n const statusCode = axios.isAxiosError(source) ? source.response?.status : undefined;\n const message =\n source instanceof Error\n ? source.message\n : typeof source === \"string\"\n ? source\n : \"Unexpected error while fetching order details\";\n\n const error = new Error(message) as OrderDocumentFetchError;\n error.orderId = orderId;\n error.statusCode = statusCode;\n error.attempts = attempts;\n error.retryable = retryable;\n return error;\n}\n\nfunction isOrderDocumentFetchError(error: unknown): error is OrderDocumentFetchError {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return (\n \"orderId\" in error &&\n \"attempts\" in error &&\n \"retryable\" in error &&\n typeof (error as Partial<OrderDocumentFetchError>).orderId === \"string\"\n );\n}\n\nasync function getOrderDocumentWithRetry(\n orderId: string,\n options: GetOrderDocumentsBatchOptions\n): Promise<OrderDocumentSuccess> {\n const maxRetries = Math.max(0, Math.floor(options.maxRetries ?? DEFAULT_MAX_RETRIES));\n const baseRetryDelayMs = Math.max(\n 50,\n Math.floor(options.baseRetryDelayMs ?? DEFAULT_BASE_RETRY_DELAY_MS)\n );\n let attempts = 0;\n\n while (true) {\n attempts += 1;\n\n try {\n const document = await getOrderDocument(orderId, options.reason);\n return { orderId, document };\n } catch (error) {\n const retryable = isRetryableRequestError(error);\n\n if (!retryable || attempts > maxRetries) {\n throw toOrderDocumentFetchError(orderId, error, attempts, retryable);\n }\n\n const retryAfterHeader = axios.isAxiosError(error)\n ? error.response?.headers?.[\"retry-after\"]\n : undefined;\n const retryAfterMs = parseRetryAfterMs(retryAfterHeader);\n const delayMs = retryAfterMs ?? computeBackoffDelayMs(attempts, baseRetryDelayMs);\n await sleep(delayMs);\n }\n }\n}\n\nexport async function getOrderDocumentsBatch(\n orderIds: string[],\n options: GetOrderDocumentsBatchOptions = {}\n): Promise<OrderDocumentsBatchResult> {\n const maxConcurrency = Math.max(\n 1,\n Math.floor(options.maxConcurrency ?? DEFAULT_BATCH_CONCURRENCY)\n );\n const successful: OrderDocumentSuccess[] = [];\n const failed: OrderDocumentFailure[] = [];\n\n for (let start = 0; start < orderIds.length; start += maxConcurrency) {\n const chunk = orderIds.slice(start, start + maxConcurrency);\n const settledChunk = await Promise.allSettled(\n chunk.map((orderId) => getOrderDocumentWithRetry(orderId, options))\n );\n\n settledChunk.forEach((result, index) => {\n const orderId = chunk[index];\n\n if (result.status === \"fulfilled\") {\n successful.push(result.value);\n return;\n }\n\n if (isOrderDocumentFetchError(result.reason)) {\n failed.push({\n orderId: result.reason.orderId,\n message: result.reason.message,\n statusCode: result.reason.statusCode,\n attempts: result.reason.attempts,\n retryable: result.reason.retryable,\n });\n return;\n }\n\n failed.push({\n orderId,\n message:\n result.reason instanceof Error\n ? result.reason.message\n : \"Unexpected error while fetching order details\",\n attempts: 1,\n retryable: false,\n });\n });\n }\n\n return { successful, failed };\n}\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,eAAe;AAsExB,MAAM,yBAAyB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AACrE,MAAM,4BAA4B;AAClC,MAAM,sBAAsB;AAC5B,MAAM,8BAA8B;AAEpC,eAAsB,WAAW,QAA2D;AAC1F,QAAM,WAAW,MAAM,QAAQ,IAA4B,uBAAuB,EAAE,OAAO,CAAC;AAC5F,SAAO,SAAS;AAClB;AAEA,eAAsB,iBACpB,SACA,QACkC;AAClC,QAAM,WAAW,MAAM,QAAQ,IAA6B,4BAA4B,OAAO,IAAI;AAAA,IACjG,QAAQ,SAAS,EAAE,OAAO,IAAI;AAAA,EAChC,CAAC;AAED,SAAO,SAAS;AAClB;AASA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,kBAAkB,aAA0C;AACnE,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,WAAO,kBAAkB,YAAY,CAAC,CAAC;AAAA,EACzC;AAEA,MAAI,OAAO,gBAAgB,YAAY,OAAO,SAAS,WAAW,GAAG;AACnE,WAAO,KAAK,IAAI,GAAG,KAAK,MAAM,cAAc,GAAI,CAAC;AAAA,EACnD;AAEA,MAAI,OAAO,gBAAgB,UAAU;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,YAAY,KAAK;AACtC,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,YAAY;AACnC,MAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,WAAO,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,GAAI,CAAC;AAAA,EAC/C;AAEA,QAAM,iBAAiB,KAAK,MAAM,YAAY;AAC9C,MAAI,OAAO,MAAM,cAAc,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,GAAG,iBAAiB,KAAK,IAAI,CAAC;AAChD;AAEA,SAAS,sBAAsB,SAAiB,aAA6B;AAC3E,QAAM,cAAc,cAAc,KAAK,KAAK,IAAI,GAAG,UAAU,CAAC;AAC9D,QAAM,SAAS,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG;AAC7C,SAAO,cAAc;AACvB;AAEA,SAAS,wBAAwB,OAAyB;AACxD,MAAI,CAAC,MAAM,aAAa,KAAK,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,UAAU,QAAQ;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,uBAAuB,IAAI,MAAM,SAAS,MAAM;AACzD;AAEA,SAAS,0BACP,SACA,QACA,UACA,WACyB;AACzB,QAAM,aAAa,MAAM,aAAa,MAAM,IAAI,OAAO,UAAU,SAAS;AAC1E,QAAM,UACJ,kBAAkB,QACd,OAAO,UACP,OAAO,WAAW,WAChB,SACA;AAER,QAAM,QAAQ,IAAI,MAAM,OAAO;AAC/B,QAAM,UAAU;AAChB,QAAM,aAAa;AACnB,QAAM,WAAW;AACjB,QAAM,YAAY;AAClB,SAAO;AACT;AAEA,SAAS,0BAA0B,OAAkD;AACnF,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO;AAAA,EACT;AAEA,SACE,aAAa,SACb,cAAc,SACd,eAAe,SACf,OAAQ,MAA2C,YAAY;AAEnE;AAEA,eAAe,0BACb,SACA,SAC+B;AAC/B,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,cAAc,mBAAmB,CAAC;AACpF,QAAM,mBAAmB,KAAK;AAAA,IAC5B;AAAA,IACA,KAAK,MAAM,QAAQ,oBAAoB,2BAA2B;AAAA,EACpE;AACA,MAAI,WAAW;AAEf,SAAO,MAAM;AACX,gBAAY;AAEZ,QAAI;AACF,YAAM,WAAW,MAAM,iBAAiB,SAAS,QAAQ,MAAM;AAC/D,aAAO,EAAE,SAAS,SAAS;AAAA,IAC7B,SAAS,OAAO;AACd,YAAM,YAAY,wBAAwB,KAAK;AAE/C,UAAI,CAAC,aAAa,WAAW,YAAY;AACvC,cAAM,0BAA0B,SAAS,OAAO,UAAU,SAAS;AAAA,MACrE;AAEA,YAAM,mBAAmB,MAAM,aAAa,KAAK,IAC7C,MAAM,UAAU,UAAU,aAAa,IACvC;AACJ,YAAM,eAAe,kBAAkB,gBAAgB;AACvD,YAAM,UAAU,gBAAgB,sBAAsB,UAAU,gBAAgB;AAChF,YAAM,MAAM,OAAO;AAAA,IACrB;AAAA,EACF;AACF;AAEA,eAAsB,uBACpB,UACA,UAAyC,CAAC,GACN;AACpC,QAAM,iBAAiB,KAAK;AAAA,IAC1B;AAAA,IACA,KAAK,MAAM,QAAQ,kBAAkB,yBAAyB;AAAA,EAChE;AACA,QAAM,aAAqC,CAAC;AAC5C,QAAM,SAAiC,CAAC;AAExC,WAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS,gBAAgB;AACpE,UAAM,QAAQ,SAAS,MAAM,OAAO,QAAQ,cAAc;AAC1D,UAAM,eAAe,MAAM,QAAQ;AAAA,MACjC,MAAM,IAAI,CAAC,YAAY,0BAA0B,SAAS,OAAO,CAAC;AAAA,IACpE;AAEA,iBAAa,QAAQ,CAAC,QAAQ,UAAU;AACtC,YAAM,UAAU,MAAM,KAAK;AAE3B,UAAI,OAAO,WAAW,aAAa;AACjC,mBAAW,KAAK,OAAO,KAAK;AAC5B;AAAA,MACF;AAEA,UAAI,0BAA0B,OAAO,MAAM,GAAG;AAC5C,eAAO,KAAK;AAAA,UACV,SAAS,OAAO,OAAO;AAAA,UACvB,SAAS,OAAO,OAAO;AAAA,UACvB,YAAY,OAAO,OAAO;AAAA,UAC1B,UAAU,OAAO,OAAO;AAAA,UACxB,WAAW,OAAO,OAAO;AAAA,QAC3B,CAAC;AACD;AAAA,MACF;AAEA,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SACE,OAAO,kBAAkB,QACrB,OAAO,OAAO,UACd;AAAA,QACN,UAAU;AAAA,QACV,WAAW;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,YAAY,OAAO;AAC9B;",
4
+ "sourcesContent": ["import axios from \"axios\";\nimport type { AxiosInstance } from \"axios\";\n\nimport { getVtexApiClients } from \"./vtex-api.js\";\n\nexport interface VtexOrderListItem {\n orderId: string;\n creationDate?: string;\n status?: string;\n totalValue?: number;\n currencyCode?: string;\n paymentNames?: string;\n salesChannel?: string;\n origin?: string;\n totalItems?: number;\n lastChange?: string;\n orderIsComplete?: boolean;\n authorizedDate?: string;\n paymentApprovedDate?: string;\n readyForHandlingDate?: string;\n}\n\nexport interface VtexOrdersPaging {\n total?: number;\n pages?: number;\n currentPage?: number;\n perPage?: number;\n}\n\nexport interface VtexOrdersListResponse {\n list: VtexOrderListItem[];\n paging: VtexOrdersPaging;\n stats?: unknown;\n}\n\nexport interface ListOrdersParams {\n page?: number;\n per_page?: number;\n orderBy?: string;\n f_creationDate?: string;\n f_invoicedDate?: string;\n f_status?: string;\n f_salesChannel?: string;\n f_paymentNames?: string;\n f_UtmSource?: string;\n q?: string;\n}\n\nexport interface GetOrderDocumentsBatchOptions {\n reason?: string;\n maxConcurrency?: number;\n maxRetries?: number;\n baseRetryDelayMs?: number;\n}\n\nexport interface OrderDocumentSuccess {\n orderId: string;\n document: Record<string, unknown>;\n}\n\nexport interface OrderDocumentFailure {\n orderId: string;\n message: string;\n statusCode?: number;\n attempts: number;\n retryable: boolean;\n}\n\nexport interface OrderDocumentsBatchResult {\n successful: OrderDocumentSuccess[];\n failed: OrderDocumentFailure[];\n}\n\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\nconst DEFAULT_BATCH_CONCURRENCY = 10;\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_BASE_RETRY_DELAY_MS = 250;\n\nexport async function listOrders(\n profileId: string,\n params: ListOrdersParams\n): Promise<VtexOrdersListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<VtexOrdersListResponse>(\"/api/oms/pvt/orders\", { params });\n return response.data;\n}\n\nexport async function getOrderDocument(\n profileId: string,\n orderId: string,\n reason?: string\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<Record<string, unknown>>(`/api/orders/pvt/document/${orderId}`, {\n params: reason ? { reason } : undefined,\n });\n\n return response.data;\n}\n\ninterface OrderDocumentFetchError extends Error {\n orderId: string;\n statusCode?: number;\n attempts: number;\n retryable: boolean;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction parseRetryAfterMs(headerValue: unknown): number | undefined {\n if (Array.isArray(headerValue)) {\n return parseRetryAfterMs(headerValue[0]);\n }\n\n if (typeof headerValue === \"number\" && Number.isFinite(headerValue)) {\n return Math.max(0, Math.floor(headerValue * 1000));\n }\n\n if (typeof headerValue !== \"string\") {\n return undefined;\n }\n\n const trimmedValue = headerValue.trim();\n if (!trimmedValue) {\n return undefined;\n }\n\n const seconds = Number(trimmedValue);\n if (Number.isFinite(seconds)) {\n return Math.max(0, Math.floor(seconds * 1000));\n }\n\n const absoluteDateMs = Date.parse(trimmedValue);\n if (Number.isNaN(absoluteDateMs)) {\n return undefined;\n }\n\n return Math.max(0, absoluteDateMs - Date.now());\n}\n\nfunction computeBackoffDelayMs(attempt: number, baseDelayMs: number): number {\n const exponential = baseDelayMs * 2 ** Math.max(0, attempt - 1);\n const jitter = Math.floor(Math.random() * 150);\n return exponential + jitter;\n}\n\nfunction isRetryableRequestError(error: unknown): boolean {\n if (!axios.isAxiosError(error)) {\n return false;\n }\n\n if (!error.response?.status) {\n return true;\n }\n\n return RETRYABLE_STATUS_CODES.has(error.response.status);\n}\n\nfunction toOrderDocumentFetchError(\n orderId: string,\n source: unknown,\n attempts: number,\n retryable: boolean\n): OrderDocumentFetchError {\n const statusCode = axios.isAxiosError(source) ? source.response?.status : undefined;\n const message =\n source instanceof Error\n ? source.message\n : typeof source === \"string\"\n ? source\n : \"Unexpected error while fetching order details\";\n\n const error = new Error(message) as OrderDocumentFetchError;\n error.orderId = orderId;\n error.statusCode = statusCode;\n error.attempts = attempts;\n error.retryable = retryable;\n return error;\n}\n\nfunction isOrderDocumentFetchError(error: unknown): error is OrderDocumentFetchError {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return (\n \"orderId\" in error &&\n \"attempts\" in error &&\n \"retryable\" in error &&\n typeof (error as Partial<OrderDocumentFetchError>).orderId === \"string\"\n );\n}\n\nasync function getOrderDocumentWithRetry(\n vtexApi: AxiosInstance,\n orderId: string,\n options: GetOrderDocumentsBatchOptions\n): Promise<OrderDocumentSuccess> {\n const maxRetries = Math.max(0, Math.floor(options.maxRetries ?? DEFAULT_MAX_RETRIES));\n const baseRetryDelayMs = Math.max(\n 50,\n Math.floor(options.baseRetryDelayMs ?? DEFAULT_BASE_RETRY_DELAY_MS)\n );\n let attempts = 0;\n\n while (true) {\n attempts += 1;\n\n try {\n const response = await vtexApi.get<Record<string, unknown>>(`/api/orders/pvt/document/${orderId}`, {\n params: options.reason ? { reason: options.reason } : undefined,\n });\n const document = response.data;\n return { orderId, document };\n } catch (error) {\n const retryable = isRetryableRequestError(error);\n\n if (!retryable || attempts > maxRetries) {\n throw toOrderDocumentFetchError(orderId, error, attempts, retryable);\n }\n\n const retryAfterHeader = axios.isAxiosError(error)\n ? error.response?.headers?.[\"retry-after\"]\n : undefined;\n const retryAfterMs = parseRetryAfterMs(retryAfterHeader);\n const delayMs = retryAfterMs ?? computeBackoffDelayMs(attempts, baseRetryDelayMs);\n await sleep(delayMs);\n }\n }\n}\n\nexport async function getOrderDocumentsBatch(\n profileId: string,\n orderIds: string[],\n options: GetOrderDocumentsBatchOptions = {}\n): Promise<OrderDocumentsBatchResult> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const maxConcurrency = Math.max(\n 1,\n Math.floor(options.maxConcurrency ?? DEFAULT_BATCH_CONCURRENCY)\n );\n const successful: OrderDocumentSuccess[] = [];\n const failed: OrderDocumentFailure[] = [];\n\n for (let start = 0; start < orderIds.length; start += maxConcurrency) {\n const chunk = orderIds.slice(start, start + maxConcurrency);\n const settledChunk = await Promise.allSettled(\n chunk.map((orderId) => getOrderDocumentWithRetry(vtexApi, orderId, options))\n );\n\n settledChunk.forEach((result, index) => {\n const orderId = chunk[index];\n\n if (result.status === \"fulfilled\") {\n successful.push(result.value);\n return;\n }\n\n if (isOrderDocumentFetchError(result.reason)) {\n failed.push({\n orderId: result.reason.orderId,\n message: result.reason.message,\n statusCode: result.reason.statusCode,\n attempts: result.reason.attempts,\n retryable: result.reason.retryable,\n });\n return;\n }\n\n failed.push({\n orderId,\n message:\n result.reason instanceof Error\n ? result.reason.message\n : \"Unexpected error while fetching order details\",\n attempts: 1,\n retryable: false,\n });\n });\n }\n\n return { successful, failed };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,24 @@
1
+ import { getVtexApiClients } from "./vtex-api.js";
2
+ async function updateSkuPrice(profileId, itemId, payload) {
3
+ const { vtexPricingApi } = await getVtexApiClients(profileId);
4
+ await vtexPricingApi.put(`/pricing/prices/${itemId}`, payload);
5
+ }
6
+ async function patchFixedPrices(profileId, itemId, payload) {
7
+ const { vtexPricingApi } = await getVtexApiClients(profileId);
8
+ await vtexPricingApi.patch(`/pricing/prices/${itemId}/fixed`, payload);
9
+ }
10
+ async function upsertFixedPricesForPriceTable(profileId, itemId, priceTableId, payload) {
11
+ const { vtexPricingApi } = await getVtexApiClients(profileId);
12
+ await vtexPricingApi.post(`/pricing/prices/${itemId}/fixed/${priceTableId}`, payload);
13
+ }
14
+ async function deleteFixedPricesForPriceTable(profileId, itemId, priceTableId) {
15
+ const { vtexPricingApi } = await getVtexApiClients(profileId);
16
+ await vtexPricingApi.delete(`/pricing/prices/${itemId}/fixed/${priceTableId}`);
17
+ }
18
+ export {
19
+ deleteFixedPricesForPriceTable,
20
+ patchFixedPrices,
21
+ updateSkuPrice,
22
+ upsertFixedPricesForPriceTable
23
+ };
24
+ //# sourceMappingURL=vtex-pricing-write.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/services/vtex/vtex-pricing-write.ts"],
4
+ "sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport interface VtexFixedPriceInput {\n minQuantity: number;\n value: number;\n listPrice?: number;\n dateRange?: {\n from: string;\n to: string;\n };\n}\n\nexport interface VtexSkuPriceWritePayload {\n basePrice?: number;\n costPrice?: number;\n markup?: number;\n listPrice?: number;\n fixedPrices?: Array<{\n tradePolicyId: string;\n value: number;\n listPrice?: number;\n minQuantity: number;\n dateRange?: {\n from: string;\n to: string;\n };\n }>;\n}\n\nexport async function updateSkuPrice(\n profileId: string,\n itemId: string,\n payload: VtexSkuPriceWritePayload\n): Promise<void> {\n const { vtexPricingApi } = await getVtexApiClients(profileId);\n await vtexPricingApi.put(`/pricing/prices/${itemId}`, payload);\n}\n\nexport async function patchFixedPrices(\n profileId: string,\n itemId: string,\n payload: VtexFixedPriceInput[]\n): Promise<void> {\n const { vtexPricingApi } = await getVtexApiClients(profileId);\n await vtexPricingApi.patch(`/pricing/prices/${itemId}/fixed`, payload);\n}\n\nexport async function upsertFixedPricesForPriceTable(\n profileId: string,\n itemId: string,\n priceTableId: string,\n payload: VtexFixedPriceInput[]\n): Promise<void> {\n const { vtexPricingApi } = await getVtexApiClients(profileId);\n await vtexPricingApi.post(`/pricing/prices/${itemId}/fixed/${priceTableId}`, payload);\n}\n\nexport async function deleteFixedPricesForPriceTable(\n profileId: string,\n itemId: string,\n priceTableId: string\n): Promise<void> {\n const { vtexPricingApi } = await getVtexApiClients(profileId);\n await vtexPricingApi.delete(`/pricing/prices/${itemId}/fixed/${priceTableId}`);\n}\n"],
5
+ "mappings": "AAAA,SAAS,yBAAyB;AA6BlC,eAAsB,eACpB,WACA,QACA,SACe;AACf,QAAM,EAAE,eAAe,IAAI,MAAM,kBAAkB,SAAS;AAC5D,QAAM,eAAe,IAAI,mBAAmB,MAAM,IAAI,OAAO;AAC/D;AAEA,eAAsB,iBACpB,WACA,QACA,SACe;AACf,QAAM,EAAE,eAAe,IAAI,MAAM,kBAAkB,SAAS;AAC5D,QAAM,eAAe,MAAM,mBAAmB,MAAM,UAAU,OAAO;AACvE;AAEA,eAAsB,+BACpB,WACA,QACA,cACA,SACe;AACf,QAAM,EAAE,eAAe,IAAI,MAAM,kBAAkB,SAAS;AAC5D,QAAM,eAAe,KAAK,mBAAmB,MAAM,UAAU,YAAY,IAAI,OAAO;AACtF;AAEA,eAAsB,+BACpB,WACA,QACA,cACe;AACf,QAAM,EAAE,eAAe,IAAI,MAAM,kBAAkB,SAAS;AAC5D,QAAM,eAAe,OAAO,mBAAmB,MAAM,UAAU,YAAY,EAAE;AAC/E;",
6
+ "names": []
7
+ }
@@ -1,9 +1,11 @@
1
- import { vtexPricingApi } from "./vtex-api.js";
2
- async function getSkuPrice(itemId) {
1
+ import { getVtexApiClients } from "./vtex-api.js";
2
+ async function getSkuPrice(profileId, itemId) {
3
+ const { vtexPricingApi } = await getVtexApiClients(profileId);
3
4
  const response = await vtexPricingApi.get(`/pricing/prices/${itemId}`);
4
5
  return response.data;
5
6
  }
6
- async function getComputedPrice(itemId, priceTableId, params) {
7
+ async function getComputedPrice(profileId, itemId, priceTableId, params) {
8
+ const { vtexPricingApi } = await getVtexApiClients(profileId);
7
9
  const response = await vtexPricingApi.get(
8
10
  `/pricing/prices/${itemId}/computed/${priceTableId}`,
9
11
  { params }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/services/vtex/vtex-pricing.ts"],
4
- "sourcesContent": ["import { vtexPricingApi } from \"./vtex-api.js\";\n\nexport interface SkuFixedPrice {\n value?: number;\n listPrice?: number;\n minQuantity?: number;\n dateRange?: {\n from?: string;\n to?: string;\n };\n tradePolicyId?: string;\n}\n\nexport interface SkuPriceResponse {\n itemId: string;\n listPrice: number;\n costPrice: number;\n markup: number;\n basePrice: number;\n fixedPrices: SkuFixedPrice[];\n}\n\nexport interface ComputedPriceParams {\n categoryId: number;\n brandId: number;\n quantity: number;\n}\n\nexport interface ComputedPriceResponse {\n tradePolicyId: string;\n listPrice: number;\n costPrice?: number;\n sellingPrice: number;\n priceValidUntil: string;\n}\n\nexport async function getSkuPrice(itemId: string): Promise<SkuPriceResponse> {\n const response = await vtexPricingApi.get<SkuPriceResponse>(`/pricing/prices/${itemId}`);\n return response.data;\n}\n\nexport async function getComputedPrice(\n itemId: string,\n priceTableId: string,\n params: ComputedPriceParams\n): Promise<ComputedPriceResponse> {\n const response = await vtexPricingApi.get<ComputedPriceResponse>(\n `/pricing/prices/${itemId}/computed/${priceTableId}`,\n { params }\n );\n\n return response.data;\n}\n"],
5
- "mappings": "AAAA,SAAS,sBAAsB;AAoC/B,eAAsB,YAAY,QAA2C;AAC3E,QAAM,WAAW,MAAM,eAAe,IAAsB,mBAAmB,MAAM,EAAE;AACvF,SAAO,SAAS;AAClB;AAEA,eAAsB,iBACpB,QACA,cACA,QACgC;AAChC,QAAM,WAAW,MAAM,eAAe;AAAA,IACpC,mBAAmB,MAAM,aAAa,YAAY;AAAA,IAClD,EAAE,OAAO;AAAA,EACX;AAEA,SAAO,SAAS;AAClB;",
4
+ "sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport interface SkuFixedPrice {\n value?: number;\n listPrice?: number;\n minQuantity?: number;\n dateRange?: {\n from?: string;\n to?: string;\n };\n tradePolicyId?: string;\n}\n\nexport interface SkuPriceResponse {\n itemId: string;\n listPrice: number;\n costPrice: number;\n markup: number;\n basePrice: number;\n fixedPrices: SkuFixedPrice[];\n}\n\nexport interface ComputedPriceParams {\n categoryId: number;\n brandId: number;\n quantity: number;\n}\n\nexport interface ComputedPriceResponse {\n tradePolicyId: string;\n listPrice: number;\n costPrice?: number;\n sellingPrice: number;\n priceValidUntil: string;\n}\n\nexport async function getSkuPrice(\n profileId: string,\n itemId: string\n): Promise<SkuPriceResponse> {\n const { vtexPricingApi } = await getVtexApiClients(profileId);\n const response = await vtexPricingApi.get<SkuPriceResponse>(`/pricing/prices/${itemId}`);\n return response.data;\n}\n\nexport async function getComputedPrice(\n profileId: string,\n itemId: string,\n priceTableId: string,\n params: ComputedPriceParams\n): Promise<ComputedPriceResponse> {\n const { vtexPricingApi } = await getVtexApiClients(profileId);\n const response = await vtexPricingApi.get<ComputedPriceResponse>(\n `/pricing/prices/${itemId}/computed/${priceTableId}`,\n { params }\n );\n\n return response.data;\n}\n"],
5
+ "mappings": "AAAA,SAAS,yBAAyB;AAoClC,eAAsB,YACpB,WACA,QAC2B;AAC3B,QAAM,EAAE,eAAe,IAAI,MAAM,kBAAkB,SAAS;AAC5D,QAAM,WAAW,MAAM,eAAe,IAAsB,mBAAmB,MAAM,EAAE;AACvF,SAAO,SAAS;AAClB;AAEA,eAAsB,iBACpB,WACA,QACA,cACA,QACgC;AAChC,QAAM,EAAE,eAAe,IAAI,MAAM,kBAAkB,SAAS;AAC5D,QAAM,WAAW,MAAM,eAAe;AAAA,IACpC,mBAAmB,MAAM,aAAa,YAAY;AAAA,IAClD,EAAE,OAAO;AAAA,EACX;AAEA,SAAO,SAAS;AAClB;",
6
6
  "names": []
7
7
  }