@yoryoboy/bi-mcp 1.2.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 (61) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/index.js +302 -2
  3. package/dist/index.js.map +2 -2
  4. package/dist/mcp-use.json +2 -2
  5. package/dist/src/services/vtex/vtex-catalog-write.js +233 -0
  6. package/dist/src/services/vtex/vtex-catalog-write.js.map +7 -0
  7. package/dist/src/services/vtex/vtex-orders-write.js +152 -0
  8. package/dist/src/services/vtex/vtex-orders-write.js.map +7 -0
  9. package/dist/src/services/vtex/vtex-pricing-write.js +24 -0
  10. package/dist/src/services/vtex/vtex-pricing-write.js.map +7 -0
  11. package/dist/src/services/vtex/vtex-write.js +38 -0
  12. package/dist/src/services/vtex/vtex-write.js.map +7 -0
  13. package/dist/src/tools/vtex/activate-sku.js +53 -0
  14. package/dist/src/tools/vtex/activate-sku.js.map +7 -0
  15. package/dist/src/tools/vtex/add-order-tracking.js +103 -0
  16. package/dist/src/tools/vtex/add-order-tracking.js.map +7 -0
  17. package/dist/src/tools/vtex/associate-specification.js +60 -0
  18. package/dist/src/tools/vtex/associate-specification.js.map +7 -0
  19. package/dist/src/tools/vtex/attach-catalog-image.js +63 -0
  20. package/dist/src/tools/vtex/attach-catalog-image.js.map +7 -0
  21. package/dist/src/tools/vtex/cancel-order.js +67 -0
  22. package/dist/src/tools/vtex/cancel-order.js.map +7 -0
  23. package/dist/src/tools/vtex/create-brand.js +69 -0
  24. package/dist/src/tools/vtex/create-brand.js.map +7 -0
  25. package/dist/src/tools/vtex/create-category.js +81 -0
  26. package/dist/src/tools/vtex/create-category.js.map +7 -0
  27. package/dist/src/tools/vtex/create-product-with-sku.js +120 -0
  28. package/dist/src/tools/vtex/create-product-with-sku.js.map +7 -0
  29. package/dist/src/tools/vtex/create-product.js +111 -0
  30. package/dist/src/tools/vtex/create-product.js.map +7 -0
  31. package/dist/src/tools/vtex/create-sku.js +103 -0
  32. package/dist/src/tools/vtex/create-sku.js.map +7 -0
  33. package/dist/src/tools/vtex/create-specification-value.js +53 -0
  34. package/dist/src/tools/vtex/create-specification-value.js.map +7 -0
  35. package/dist/src/tools/vtex/create-specification.js +85 -0
  36. package/dist/src/tools/vtex/create-specification.js.map +7 -0
  37. package/dist/src/tools/vtex/deactivate-sku.js +53 -0
  38. package/dist/src/tools/vtex/deactivate-sku.js.map +7 -0
  39. package/dist/src/tools/vtex/delete-fixed-price.js +53 -0
  40. package/dist/src/tools/vtex/delete-fixed-price.js.map +7 -0
  41. package/dist/src/tools/vtex/index.js +20 -0
  42. package/dist/src/tools/vtex/index.js.map +2 -2
  43. package/dist/src/tools/vtex/invoice-order.js +84 -0
  44. package/dist/src/tools/vtex/invoice-order.js.map +7 -0
  45. package/dist/src/tools/vtex/toggle-unlimited-quantity.js +65 -0
  46. package/dist/src/tools/vtex/toggle-unlimited-quantity.js.map +7 -0
  47. package/dist/src/tools/vtex/update-inventory.js +34 -19
  48. package/dist/src/tools/vtex/update-inventory.js.map +2 -2
  49. package/dist/src/tools/vtex/update-lead-time.js +34 -17
  50. package/dist/src/tools/vtex/update-lead-time.js.map +2 -2
  51. package/dist/src/tools/vtex/update-product-basic-fields.js +71 -0
  52. package/dist/src/tools/vtex/update-product-basic-fields.js.map +7 -0
  53. package/dist/src/tools/vtex/update-sku-basic-fields.js +92 -0
  54. package/dist/src/tools/vtex/update-sku-basic-fields.js.map +7 -0
  55. package/dist/src/tools/vtex/update-sku-price.js +81 -0
  56. package/dist/src/tools/vtex/update-sku-price.js.map +7 -0
  57. package/dist/src/tools/vtex/upsert-fixed-price.js +69 -0
  58. package/dist/src/tools/vtex/upsert-fixed-price.js.map +7 -0
  59. package/dist/src/tools/vtex/write-helpers.js +73 -0
  60. package/dist/src/tools/vtex/write-helpers.js.map +7 -0
  61. package/package.json +1 -1
@@ -0,0 +1,233 @@
1
+ import { getVtexApiClients } from "./vtex-api.js";
2
+ function pickRecord(source, keys) {
3
+ const picked = {};
4
+ for (const key of keys) {
5
+ if (key in source) {
6
+ picked[key] = source[key];
7
+ }
8
+ }
9
+ return picked;
10
+ }
11
+ async function getProduct(profileId, productId) {
12
+ const { vtexApi } = await getVtexApiClients(profileId);
13
+ const response = await vtexApi.get(`/api/catalog/pvt/product/${productId}`);
14
+ return response.data;
15
+ }
16
+ async function createProduct(profileId, payload) {
17
+ const { vtexApi } = await getVtexApiClients(profileId);
18
+ const response = await vtexApi.post("/api/catalog/pvt/product", payload);
19
+ return response.data;
20
+ }
21
+ async function updateProduct(profileId, productId, payload) {
22
+ const { vtexApi } = await getVtexApiClients(profileId);
23
+ const response = await vtexApi.put(`/api/catalog/pvt/product/${productId}`, payload);
24
+ return response.data;
25
+ }
26
+ function buildProductUpdatePayload(current, updates) {
27
+ const payload = pickRecord(current, [
28
+ "Name",
29
+ "DepartmentId",
30
+ "CategoryId",
31
+ "BrandId",
32
+ "LinkId",
33
+ "RefId",
34
+ "IsVisible",
35
+ "Description",
36
+ "DescriptionShort",
37
+ "ReleaseDate",
38
+ "KeyWords",
39
+ "Title",
40
+ "IsActive",
41
+ "TaxCode",
42
+ "MetaTagDescription",
43
+ "SupplierId",
44
+ "ShowWithoutStock",
45
+ "AdWordsRemarketingCode",
46
+ "LomadeeCampaignCode",
47
+ "Score"
48
+ ]);
49
+ if (updates.name !== void 0) payload.Name = updates.name;
50
+ if (updates.categoryId !== void 0) payload.CategoryId = updates.categoryId;
51
+ if (updates.brandId !== void 0) payload.BrandId = updates.brandId;
52
+ if (updates.description !== void 0) payload.Description = updates.description;
53
+ if (updates.descriptionShort !== void 0) payload.DescriptionShort = updates.descriptionShort;
54
+ if (updates.title !== void 0) payload.Title = updates.title;
55
+ if (updates.linkId !== void 0) payload.LinkId = updates.linkId;
56
+ if (updates.refId !== void 0) payload.RefId = updates.refId;
57
+ if (updates.isVisible !== void 0) payload.IsVisible = updates.isVisible;
58
+ if (updates.isActive !== void 0) payload.IsActive = updates.isActive;
59
+ if (updates.keyWords !== void 0) payload.KeyWords = updates.keyWords;
60
+ if (updates.releaseDate !== void 0) payload.ReleaseDate = updates.releaseDate;
61
+ if (updates.metaTagDescription !== void 0) {
62
+ payload.MetaTagDescription = updates.metaTagDescription;
63
+ }
64
+ if (updates.showWithoutStock !== void 0) {
65
+ payload.ShowWithoutStock = updates.showWithoutStock;
66
+ }
67
+ return payload;
68
+ }
69
+ async function getSku(profileId, skuId) {
70
+ const { vtexApi } = await getVtexApiClients(profileId);
71
+ const response = await vtexApi.get(`/api/catalog/pvt/stockkeepingunit/${skuId}`);
72
+ return response.data;
73
+ }
74
+ async function createSku(profileId, payload) {
75
+ const { vtexApi } = await getVtexApiClients(profileId);
76
+ const response = await vtexApi.post("/api/catalog/pvt/stockkeepingunit", payload);
77
+ return response.data;
78
+ }
79
+ async function updateSku(profileId, skuId, payload) {
80
+ const { vtexApi } = await getVtexApiClients(profileId);
81
+ const response = await vtexApi.put(`/api/catalog/pvt/stockkeepingunit/${skuId}`, payload);
82
+ return response.data;
83
+ }
84
+ function buildSkuUpdatePayload(current, updates) {
85
+ const payload = pickRecord(current, [
86
+ "ProductId",
87
+ "IsActive",
88
+ "ActivateIfPossible",
89
+ "Name",
90
+ "RefId",
91
+ "PackagedHeight",
92
+ "PackagedLength",
93
+ "PackagedWidth",
94
+ "PackagedWeightKg",
95
+ "Height",
96
+ "Length",
97
+ "Width",
98
+ "WeightKg",
99
+ "CubicWeight",
100
+ "IsKit",
101
+ "CreationDate",
102
+ "RewardValue",
103
+ "EstimatedDateArrival",
104
+ "ManufacturerCode",
105
+ "CommercialConditionId",
106
+ "MeasurementUnit",
107
+ "UnitMultiplier",
108
+ "ModalType",
109
+ "KitItensSellApart",
110
+ "Videos"
111
+ ]);
112
+ if (updates.name !== void 0) payload.Name = updates.name;
113
+ if (updates.refId !== void 0) payload.RefId = updates.refId;
114
+ if (updates.packagedHeight !== void 0) payload.PackagedHeight = updates.packagedHeight;
115
+ if (updates.packagedLength !== void 0) payload.PackagedLength = updates.packagedLength;
116
+ if (updates.packagedWidth !== void 0) payload.PackagedWidth = updates.packagedWidth;
117
+ if (updates.packagedWeightKg !== void 0) payload.PackagedWeightKg = updates.packagedWeightKg;
118
+ if (updates.height !== void 0) payload.Height = updates.height;
119
+ if (updates.length !== void 0) payload.Length = updates.length;
120
+ if (updates.width !== void 0) payload.Width = updates.width;
121
+ if (updates.weightKg !== void 0) payload.WeightKg = updates.weightKg;
122
+ if (updates.measurementUnit !== void 0) payload.MeasurementUnit = updates.measurementUnit;
123
+ if (updates.unitMultiplier !== void 0) payload.UnitMultiplier = updates.unitMultiplier;
124
+ if (updates.manufacturerCode !== void 0) payload.ManufacturerCode = updates.manufacturerCode;
125
+ if (updates.commercialConditionId !== void 0) {
126
+ payload.CommercialConditionId = updates.commercialConditionId;
127
+ }
128
+ if (updates.isActive !== void 0) payload.IsActive = updates.isActive;
129
+ if (updates.activateIfPossible !== void 0) {
130
+ payload.ActivateIfPossible = updates.activateIfPossible;
131
+ }
132
+ return payload;
133
+ }
134
+ async function getSkuEans(profileId, skuId) {
135
+ const { vtexApi } = await getVtexApiClients(profileId);
136
+ const response = await vtexApi.get(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean`);
137
+ const data = response.data;
138
+ if (Array.isArray(data)) {
139
+ return data.map((item) => String(item)).filter(Boolean);
140
+ }
141
+ if (data == null) {
142
+ return [];
143
+ }
144
+ return [String(data)];
145
+ }
146
+ async function createSkuEan(profileId, skuId, ean) {
147
+ const { vtexApi } = await getVtexApiClients(profileId);
148
+ await vtexApi.post(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean/${ean}`);
149
+ }
150
+ async function deleteAllSkuEans(profileId, skuId) {
151
+ const { vtexApi } = await getVtexApiClients(profileId);
152
+ await vtexApi.delete(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean`);
153
+ }
154
+ async function createBrand(profileId, payload) {
155
+ const { vtexApi } = await getVtexApiClients(profileId);
156
+ const response = await vtexApi.post("/api/catalog/pvt/brand", payload);
157
+ return response.data;
158
+ }
159
+ async function getBrand(profileId, brandId) {
160
+ const { vtexApi } = await getVtexApiClients(profileId);
161
+ const response = await vtexApi.get(`/api/catalog/pvt/brand/${brandId}`);
162
+ return response.data;
163
+ }
164
+ async function createCategory(profileId, payload) {
165
+ const { vtexApi } = await getVtexApiClients(profileId);
166
+ const response = await vtexApi.post("/api/catalog/pvt/category", payload);
167
+ return response.data;
168
+ }
169
+ async function getCategory(profileId, categoryId) {
170
+ const { vtexApi } = await getVtexApiClients(profileId);
171
+ const response = await vtexApi.get(`/api/catalog/pvt/category/${categoryId}`);
172
+ return response.data;
173
+ }
174
+ async function createSpecification(profileId, payload) {
175
+ const { vtexApi } = await getVtexApiClients(profileId);
176
+ const response = await vtexApi.post("/api/catalog/pvt/specification", payload);
177
+ return response.data;
178
+ }
179
+ async function createSpecificationValue(profileId, payload) {
180
+ const { vtexApi } = await getVtexApiClients(profileId);
181
+ const response = await vtexApi.post(
182
+ "/api/catalog/pvt/specificationvalue",
183
+ payload
184
+ );
185
+ return response.data;
186
+ }
187
+ async function associateProductSpecification(profileId, productId, payload) {
188
+ const { vtexApi } = await getVtexApiClients(profileId);
189
+ const response = await vtexApi.post(
190
+ `/api/catalog/pvt/product/${productId}/specification`,
191
+ payload
192
+ );
193
+ return response.data;
194
+ }
195
+ async function associateSkuSpecification(profileId, skuId, payload) {
196
+ const { vtexApi } = await getVtexApiClients(profileId);
197
+ const response = await vtexApi.post(
198
+ `/api/catalog/pvt/stockkeepingunit/${skuId}/specification`,
199
+ payload
200
+ );
201
+ return response.data;
202
+ }
203
+ async function createSkuFile(profileId, skuId, payload) {
204
+ const { vtexApi } = await getVtexApiClients(profileId);
205
+ const response = await vtexApi.post(
206
+ `/api/catalog/pvt/stockkeepingunit/${skuId}/file`,
207
+ payload
208
+ );
209
+ return response.data;
210
+ }
211
+ export {
212
+ associateProductSpecification,
213
+ associateSkuSpecification,
214
+ buildProductUpdatePayload,
215
+ buildSkuUpdatePayload,
216
+ createBrand,
217
+ createCategory,
218
+ createProduct,
219
+ createSku,
220
+ createSkuEan,
221
+ createSkuFile,
222
+ createSpecification,
223
+ createSpecificationValue,
224
+ deleteAllSkuEans,
225
+ getBrand,
226
+ getCategory,
227
+ getProduct,
228
+ getSku,
229
+ getSkuEans,
230
+ updateProduct,
231
+ updateSku
232
+ };
233
+ //# sourceMappingURL=vtex-catalog-write.js.map
@@ -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
+ }
@@ -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
+ }
@@ -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
+ }
@@ -0,0 +1,38 @@
1
+ class VtexOperationError extends Error {
2
+ constructor(message, code, details) {
3
+ super(message);
4
+ this.code = code;
5
+ this.details = details;
6
+ this.name = "VtexOperationError";
7
+ }
8
+ }
9
+ function buildConfirmationRequiredResult(operation, details) {
10
+ return {
11
+ success: false,
12
+ error_code: "EXPLICIT_CONFIRMATION_REQUIRED",
13
+ message: "This VTEX operation is high-risk and requires explicit user confirmation before execution.",
14
+ operation,
15
+ risk_level: "high",
16
+ details
17
+ };
18
+ }
19
+ function buildWriteSuccessResult(params) {
20
+ return {
21
+ success: true,
22
+ profile_id: params.profileId,
23
+ operation: params.operation,
24
+ resource_id: params.resourceId,
25
+ risk_level: params.riskLevel,
26
+ confirmed: params.confirmed,
27
+ message: params.message,
28
+ summary: params.summary,
29
+ confirmation_note: params.confirmationNote,
30
+ details: params.details
31
+ };
32
+ }
33
+ export {
34
+ VtexOperationError,
35
+ buildConfirmationRequiredResult,
36
+ buildWriteSuccessResult
37
+ };
38
+ //# sourceMappingURL=vtex-write.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/services/vtex/vtex-write.ts"],
4
+ "sourcesContent": ["export type VtexWriteRiskLevel = \"low\" | \"high\";\n\nexport type VtexWriteErrorCode =\n | \"EXPLICIT_CONFIRMATION_REQUIRED\"\n | \"INVALID_ORDER_STATE\"\n | \"RESOURCE_NOT_FOUND\"\n | \"INVALID_OPERATION\";\n\nexport interface VtexWriteSummary extends Record<string, unknown> {\n before?: Record<string, unknown> | null;\n after?: Record<string, unknown> | null;\n}\n\nexport interface VtexWriteResult extends Record<string, unknown> {\n success: boolean;\n profile_id?: string;\n operation: string;\n resource_id?: string;\n risk_level: VtexWriteRiskLevel;\n confirmed?: boolean;\n message: string;\n summary?: VtexWriteSummary;\n confirmation_note?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface VtexWriteErrorResult extends Record<string, unknown> {\n success: false;\n error_code: VtexWriteErrorCode;\n message: string;\n operation: string;\n risk_level: VtexWriteRiskLevel;\n details?: Record<string, unknown>;\n}\n\nexport class VtexOperationError extends Error {\n constructor(\n message: string,\n public readonly code: VtexWriteErrorCode,\n public readonly details?: Record<string, unknown>\n ) {\n super(message);\n this.name = \"VtexOperationError\";\n }\n}\n\nexport function buildConfirmationRequiredResult(\n operation: string,\n details?: Record<string, unknown>\n): VtexWriteErrorResult {\n return {\n success: false,\n error_code: \"EXPLICIT_CONFIRMATION_REQUIRED\",\n message: \"This VTEX operation is high-risk and requires explicit user confirmation before execution.\",\n operation,\n risk_level: \"high\",\n details,\n };\n}\n\nexport function buildWriteSuccessResult(params: {\n profileId: string;\n operation: string;\n resourceId?: string;\n riskLevel: VtexWriteRiskLevel;\n confirmed?: boolean;\n message: string;\n summary?: VtexWriteSummary;\n confirmationNote?: string;\n details?: Record<string, unknown>;\n}): VtexWriteResult {\n return {\n success: true,\n profile_id: params.profileId,\n operation: params.operation,\n resource_id: params.resourceId,\n risk_level: params.riskLevel,\n confirmed: params.confirmed,\n message: params.message,\n summary: params.summary,\n confirmation_note: params.confirmationNote,\n details: params.details,\n };\n}\n"],
5
+ "mappings": "AAmCO,MAAM,2BAA2B,MAAM;AAAA,EAC5C,YACE,SACgB,MACA,SAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,gCACd,WACA,SACsB;AACtB,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,QAUpB;AAClB,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,aAAa,OAAO;AAAA,IACpB,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,mBAAmB,OAAO;AAAA,IAC1B,SAAS,OAAO;AAAA,EAClB;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ import {
3
+ buildSkuUpdatePayload,
4
+ getSku,
5
+ updateSku
6
+ } from "../../services/vtex/vtex-catalog-write.js";
7
+ import {
8
+ buildWriteSuccessResponse,
9
+ handleVtexWriteError,
10
+ resolveVtexWriteProfile,
11
+ vtexProfileIdSchemaField
12
+ } from "./write-helpers.js";
13
+ const activateSkuSchema = z.object({
14
+ profileId: vtexProfileIdSchemaField,
15
+ skuId: z.string().min(1).describe("VTEX SKU identifier to activate.")
16
+ });
17
+ async function activateSkuHandler({
18
+ profileId,
19
+ skuId
20
+ }) {
21
+ try {
22
+ const profileResolution = await resolveVtexWriteProfile(profileId);
23
+ if (!profileResolution.ok) {
24
+ return profileResolution.response;
25
+ }
26
+ const resolvedProfileId = profileResolution.value.profileId;
27
+ const beforeSku = await getSku(resolvedProfileId, skuId);
28
+ const afterSku = await updateSku(
29
+ resolvedProfileId,
30
+ skuId,
31
+ buildSkuUpdatePayload(beforeSku, { isActive: true })
32
+ );
33
+ return buildWriteSuccessResponse({
34
+ profileId: resolvedProfileId,
35
+ operation: "activate_sku",
36
+ resourceId: skuId,
37
+ riskLevel: "low",
38
+ message: "SKU activated successfully.",
39
+ before: beforeSku,
40
+ after: afterSku,
41
+ details: {
42
+ sku_id: skuId
43
+ }
44
+ });
45
+ } catch (err) {
46
+ return handleVtexWriteError(err, `Failed to activate SKU ${skuId}`);
47
+ }
48
+ }
49
+ export {
50
+ activateSkuHandler,
51
+ activateSkuSchema
52
+ };
53
+ //# sourceMappingURL=activate-sku.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/vtex/activate-sku.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport {\n buildSkuUpdatePayload,\n getSku,\n updateSku,\n} from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nexport const activateSkuSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier to activate.\"),\n});\n\nexport async function activateSkuHandler({\n profileId,\n skuId,\n}: z.infer<typeof activateSkuSchema>) {\n try {\n const profileResolution = await resolveVtexWriteProfile(profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const resolvedProfileId = profileResolution.value.profileId;\n const beforeSku = await getSku(resolvedProfileId, skuId);\n const afterSku = await updateSku(\n resolvedProfileId,\n skuId,\n buildSkuUpdatePayload(beforeSku, { isActive: true })\n );\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"activate_sku\",\n resourceId: skuId,\n riskLevel: \"low\",\n message: \"SKU activated successfully.\",\n before: beforeSku,\n after: afterSku,\n details: {\n sku_id: skuId,\n },\n });\n } catch (err) {\n return handleVtexWriteError(err, `Failed to activate SKU ${skuId}`);\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,WAAW;AAAA,EACX,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,kCAAkC;AACtE,CAAC;AAED,eAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA;AACF,GAAsC;AACpC,MAAI;AACF,UAAM,oBAAoB,MAAM,wBAAwB,SAAS;AACjE,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,oBAAoB,kBAAkB,MAAM;AAClD,UAAM,YAAY,MAAM,OAAO,mBAAmB,KAAK;AACvD,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA,sBAAsB,WAAW,EAAE,UAAU,KAAK,CAAC;AAAA,IACrD;AAEA,WAAO,0BAA0B;AAAA,MAC/B,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,qBAAqB,KAAK,0BAA0B,KAAK,EAAE;AAAA,EACpE;AACF;",
6
+ "names": []
7
+ }