@devx-commerce/plugin-gati 0.0.34 → 0.0.35-beta.3

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/.medusa/server/src/api/admin/masters/[master]/[id]/route.js +121 -0
  2. package/.medusa/server/src/api/admin/masters/[master]/route.js +33 -0
  3. package/.medusa/server/src/api/admin/masters/middlewares.js +35 -0
  4. package/.medusa/server/src/api/admin/masters/query-config.js +14 -0
  5. package/.medusa/server/src/api/admin/masters/search-middleware.js +16 -0
  6. package/.medusa/server/src/api/admin/masters/utils.js +108 -0
  7. package/.medusa/server/src/api/admin/masters/validators.js +28 -0
  8. package/.medusa/server/src/api/admin/middlewares.js +6 -2
  9. package/.medusa/server/src/api/admin/variant-options/recalculate/route.js +446 -0
  10. package/.medusa/server/src/api/admin/variant-options/sync/route.js +329 -0
  11. package/.medusa/server/src/api/erp/webhook/config.js +37 -6
  12. package/.medusa/server/src/api/erp/webhook/route.js +10 -137
  13. package/.medusa/server/src/api/middlewares.js +3 -1
  14. package/.medusa/server/src/api/pos/gold-rate/middleware.js +13 -0
  15. package/.medusa/server/src/api/pos/gold-rate/route.js +96 -0
  16. package/.medusa/server/src/api/pos/middleware.js +13 -0
  17. package/.medusa/server/src/api/store/gold-rate/current/route.js +70 -0
  18. package/.medusa/server/src/api/store/gold-rate/historical/route.js +108 -0
  19. package/.medusa/server/src/api/store/gold-rate/middleware.js +19 -0
  20. package/.medusa/server/src/api/store/gold-rate/validators.js +37 -0
  21. package/.medusa/server/src/api/store/middleware.js +3 -1
  22. package/.medusa/server/src/jobs/process-erp-events.js +205 -0
  23. package/.medusa/server/src/jobs/process-variant-option-sync.js +536 -0
  24. package/.medusa/server/src/jobs/sync-order-erp.js +2 -2
  25. package/.medusa/server/src/modules/category-group-master/migrations/Migration20251031061116.js +14 -0
  26. package/.medusa/server/src/modules/category-group-master/migrations/Migration20251104045912.js +14 -0
  27. package/.medusa/server/src/modules/category-master/migrations/Migration20251031061327.js +14 -0
  28. package/.medusa/server/src/modules/category-master/migrations/Migration20251104045755.js +14 -0
  29. package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251031061432.js +14 -0
  30. package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251104050102.js +14 -0
  31. package/.medusa/server/src/modules/collection-master/migrations/Migration20251031060941.js +14 -0
  32. package/.medusa/server/src/modules/collection-master/migrations/Migration20251104050012.js +14 -0
  33. package/.medusa/server/src/modules/discount-master/migrations/Migration20251031061523.js +14 -0
  34. package/.medusa/server/src/modules/discount-master/migrations/Migration20251104050153.js +14 -0
  35. package/.medusa/server/src/modules/erp/service.js +59 -2
  36. package/.medusa/server/src/modules/extended-product/migrations/Migration20251103182726.js +14 -0
  37. package/.medusa/server/src/modules/extended-product/migrations/Migration20251119062526.js +16 -0
  38. package/.medusa/server/src/modules/extended-product/migrations/Migration20251202055742.js +14 -0
  39. package/.medusa/server/src/modules/extended-product/migrations/Migration20251202064200.js +16 -0
  40. package/.medusa/server/src/modules/extended-product/models/extended-product.js +89 -9
  41. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251119063328.js +20 -0
  42. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120045708.js +14 -0
  43. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120051832.js +14 -0
  44. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120052514.js +14 -0
  45. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251202055952.js +14 -0
  46. package/.medusa/server/src/modules/extended-variant/models/extended-variant.js +145 -12
  47. package/.medusa/server/src/modules/item-size-master/index.js +13 -0
  48. package/.medusa/server/src/modules/item-size-master/migrations/Migration20251031111036.js +17 -0
  49. package/.medusa/server/src/modules/item-size-master/models/item-size-master.js +14 -0
  50. package/.medusa/server/src/modules/item-size-master/service.js +10 -0
  51. package/.medusa/server/src/modules/party-master/migrations/Migration20251031061657.js +14 -0
  52. package/.medusa/server/src/modules/party-master/migrations/Migration20251104050242.js +14 -0
  53. package/.medusa/server/src/modules/promocode-master/migrations/Migration20251031061829.js +14 -0
  54. package/.medusa/server/src/modules/promocode-master/migrations/Migration20251104050332.js +14 -0
  55. package/.medusa/server/src/modules/quality-master/index.js +13 -0
  56. package/.medusa/server/src/modules/quality-master/migrations/Migration20251031095211.js +16 -0
  57. package/.medusa/server/src/modules/quality-master/migrations/Migration20251105045114.js +14 -0
  58. package/.medusa/server/src/modules/quality-master/models/quality-master.js +17 -0
  59. package/.medusa/server/src/modules/quality-master/service.js +10 -0
  60. package/.medusa/server/src/modules/raw-master/migrations/Migration20251031061912.js +14 -0
  61. package/.medusa/server/src/modules/raw-master/models/raw-master.js +2 -1
  62. package/.medusa/server/src/modules/shape-master/migrations/Migration20251031062019.js +14 -0
  63. package/.medusa/server/src/modules/shape-master/models/shape-master.js +2 -1
  64. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251031062128.js +14 -0
  65. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251104050501.js +14 -0
  66. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251203083315.js +16 -0
  67. package/.medusa/server/src/modules/shipping-info-master/models/shipping-info-master.js +2 -2
  68. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251031062303.js +14 -0
  69. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251104050743.js +14 -0
  70. package/.medusa/server/src/modules/tone-master/index.js +13 -0
  71. package/.medusa/server/src/modules/tone-master/migrations/Migration20251031104320.js +16 -0
  72. package/.medusa/server/src/modules/tone-master/models/tone-master.js +15 -0
  73. package/.medusa/server/src/modules/tone-master/service.js +10 -0
  74. package/.medusa/server/src/modules/variant-option-sync-queue/index.js +13 -0
  75. package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251101082220.js +19 -0
  76. package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251103123857.js +16 -0
  77. package/.medusa/server/src/modules/variant-option-sync-queue/models/variant-option-sync-queue.js +23 -0
  78. package/.medusa/server/src/modules/variant-option-sync-queue/service.js +49 -0
  79. package/.medusa/server/src/subscribers/party-master.js +35 -34
  80. package/.medusa/server/src/utils/build-redis-key.js +30 -0
  81. package/.medusa/server/src/workflows/create-or-update-product-options/steps/create-update-product-options.js +39 -2
  82. package/.medusa/server/src/workflows/helpers/product-helper.js +444 -115
  83. package/.medusa/server/src/workflows/helpers/update-variant-option-metadata.js +105 -0
  84. package/.medusa/server/src/workflows/helpers/variant-helper.js +215 -0
  85. package/.medusa/server/src/workflows/hooks/product-updated.js +6 -11
  86. package/.medusa/server/src/workflows/inward-master/helper/index.js +88 -40
  87. package/.medusa/server/src/workflows/inward-master/steps/create-inward-exploration-lines.js +1 -2
  88. package/.medusa/server/src/workflows/inward-master/steps/create-inward-extra-charges-lines.js +1 -2
  89. package/.medusa/server/src/workflows/inward-master/workflows/update-inward.js +6 -2
  90. package/.medusa/server/src/workflows/item-size-master/create-or-update-item-size-master.js +51 -0
  91. package/.medusa/server/src/workflows/item-size-master/index.js +15 -0
  92. package/.medusa/server/src/workflows/item-size-master/steps/create-item-size.js +21 -0
  93. package/.medusa/server/src/workflows/item-size-master/steps/delete-item-size.js +23 -0
  94. package/.medusa/server/src/workflows/item-size-master/steps/fetch-item-size-master.js +55 -0
  95. package/.medusa/server/src/workflows/item-size-master/steps/update-item-size.js +36 -0
  96. package/.medusa/server/src/workflows/orders/steps/sync-order-to-erp.js +3 -2
  97. package/.medusa/server/src/workflows/orders/utils/order-helper.js +6 -5
  98. package/.medusa/server/src/workflows/orders/workflows/sync-order-to-erp.js +27 -2
  99. package/.medusa/server/src/workflows/party-master/steps/delete-party.js +3 -7
  100. package/.medusa/server/src/workflows/party-master/steps/fetch-party-master.js +2 -1
  101. package/.medusa/server/src/workflows/party-master/workflows/create-or-update-party-master.js +2 -50
  102. package/.medusa/server/src/workflows/party-master/workflows/delete-party-master.js +60 -0
  103. package/.medusa/server/src/workflows/party-master/workflows/index.js +2 -1
  104. package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-deletion.js +79 -195
  105. package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-variant-update.js +447 -0
  106. package/.medusa/server/src/workflows/party-style-master/workflows/create-or-update-party-style-master.js +126 -4
  107. package/.medusa/server/src/workflows/quality-master/create-or-update-quality-master.js +58 -0
  108. package/.medusa/server/src/workflows/quality-master/index.js +30 -0
  109. package/.medusa/server/src/workflows/quality-master/steps/create-quality.js +22 -0
  110. package/.medusa/server/src/workflows/quality-master/steps/delete-quality.js +20 -0
  111. package/.medusa/server/src/workflows/quality-master/steps/fetch-quality-master.js +54 -0
  112. package/.medusa/server/src/workflows/quality-master/steps/update-quality.js +37 -0
  113. package/.medusa/server/src/workflows/raw-master/create-or-update-raw-master.js +58 -0
  114. package/.medusa/server/src/workflows/raw-master/steps/delete-raw.js +9 -11
  115. package/.medusa/server/src/workflows/shape-master/create-or-update-shape-master.js +53 -0
  116. package/.medusa/server/src/workflows/shape-master/steps/delete-shape.js +9 -9
  117. package/.medusa/server/src/workflows/tone-master/create-or-update-tone-master.js +52 -0
  118. package/.medusa/server/src/workflows/tone-master/index.js +30 -0
  119. package/.medusa/server/src/workflows/tone-master/steps/create-tone.js +22 -0
  120. package/.medusa/server/src/workflows/tone-master/steps/delete-tone.js +20 -0
  121. package/.medusa/server/src/workflows/tone-master/steps/fetch-tone-master.js +54 -0
  122. package/.medusa/server/src/workflows/tone-master/steps/update-tone.js +37 -0
  123. package/.medusa/server/src/workflows/update-extended-product-from-product/index.js +6 -8
  124. package/.medusa/server/src/workflows/update-extended-variant-from-variant/workflows/update-extended-variant-status-from-variant.js +9 -3
  125. package/package.json +1 -1
  126. package/.medusa/server/development/erp-order-payload-example.js +0 -76
@@ -0,0 +1,447 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateProductOptionsAfterVariantUpdateStep = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
7
+ const update_variant_option_metadata_1 = require("../../helpers/update-variant-option-metadata");
8
+ exports.updateProductOptionsAfterVariantUpdateStep = (0, workflows_sdk_1.createStep)("update-product-options-after-variant-update", async (input, { container }) => {
9
+ try {
10
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
11
+ // Get products with their options
12
+ const { data: products } = await query.graph({
13
+ entity: "product",
14
+ fields: ["id", "options.*"],
15
+ filters: {
16
+ id: input.productIds,
17
+ },
18
+ });
19
+ // Get all variants for these products with extended variant data and existing options
20
+ const { data: variants } = await query.graph({
21
+ entity: "product_variant",
22
+ fields: [
23
+ "id",
24
+ "product_id",
25
+ "extended_variant.id",
26
+ "extended_variant.item_size",
27
+ "extended_variant.party_style_details.*",
28
+ "options.*",
29
+ "options.option.title",
30
+ ],
31
+ filters: {
32
+ product_id: input.productIds,
33
+ },
34
+ });
35
+ // Get extended variant IDs
36
+ const extendedVariantIds = variants
37
+ .map((v) => v.extended_variant?.id)
38
+ .filter(Boolean);
39
+ // Get extended variants with party_style_details
40
+ const { data: extendedVariants } = await query.graph({
41
+ entity: "extended_variant",
42
+ fields: ["id", "item_size", "stock_type", "party_style_details.*"],
43
+ filters: {
44
+ id: extendedVariantIds,
45
+ },
46
+ });
47
+ // Load master maps
48
+ const { data: rawMasterArr } = await query.graph({
49
+ entity: "raw_master",
50
+ fields: ["id", "title", "raw_code"],
51
+ });
52
+ const { data: qualityMasterArr } = await query.graph({
53
+ entity: "quality_master",
54
+ fields: ["id", "title", "qly_code"],
55
+ });
56
+ const { data: toneMasterArr } = await query.graph({
57
+ entity: "tone_master",
58
+ fields: ["id", "title", "tone_code"],
59
+ });
60
+ const { data: itemSizeMasterArr } = await query.graph({
61
+ entity: "item_size_master",
62
+ fields: ["id", "title", "item_size_code"],
63
+ });
64
+ const { data: shapeMasterArr } = await query.graph({
65
+ entity: "shape_master",
66
+ fields: ["id", "title", "shape_code"],
67
+ });
68
+ const rawMasterMap = new Map();
69
+ rawMasterArr?.forEach((x) => rawMasterMap.set(x.raw_code, x.title));
70
+ const qualityMasterMap = new Map();
71
+ qualityMasterArr?.forEach((x) => qualityMasterMap.set(x.qly_code, x.title));
72
+ const toneMasterMap = new Map();
73
+ toneMasterArr?.forEach((x) => toneMasterMap.set(x.tone_code, x.title));
74
+ const itemSizeMasterMap = new Map();
75
+ itemSizeMasterArr?.forEach((x) => itemSizeMasterMap.set(x.item_size_code, x.title));
76
+ const shapeMasterMap = new Map();
77
+ shapeMasterArr?.forEach((x) => shapeMasterMap.set(x.shape_code, x.title));
78
+ const masterMaps = {
79
+ rawMasterMap,
80
+ qualityMasterMap,
81
+ toneMasterMap,
82
+ itemSizeMasterMap,
83
+ shapeMasterMap,
84
+ };
85
+ // Recalculate variant options from extended variant data
86
+ const variantsToUpdate = [];
87
+ const productOptionsMap = new Map();
88
+ // Track raw values for metadata updates
89
+ const rawValueMappings = [];
90
+ for (const variant of variants) {
91
+ const productId = variant.product_id;
92
+ if (!productId)
93
+ continue;
94
+ const product = products?.find((p) => p.id === productId);
95
+ const extendedVariant = extendedVariants?.find((ev) => ev.id === variant.extended_variant?.id);
96
+ if (!product || !extendedVariant)
97
+ continue;
98
+ // Initialize product options map if not exists
99
+ if (!productOptionsMap.has(productId)) {
100
+ productOptionsMap.set(productId, new Map());
101
+ }
102
+ const productOptionMap = productOptionsMap.get(productId);
103
+ // Start with existing variant options to ensure all product options are represented
104
+ const variantOptions = {};
105
+ if (variant.options) {
106
+ for (const optionValue of variant.options) {
107
+ const optionTitle = optionValue.option?.title;
108
+ const optionValueStr = optionValue.value;
109
+ if (optionTitle && optionValueStr) {
110
+ variantOptions[optionTitle] = optionValueStr;
111
+ }
112
+ }
113
+ }
114
+ // Now update/override with new values from extended variant data
115
+ // Detect solitaire styles based on stock_type
116
+ const stockType = extendedVariant
117
+ ?.stock_type;
118
+ const isSolitaire = stockType === "LG SOLITAIRE" || stockType === "SOLITAIRE";
119
+ // Size
120
+ if (extendedVariant.item_size) {
121
+ const sizeTitle = (masterMaps.itemSizeMasterMap.get(extendedVariant.item_size) ||
122
+ String(extendedVariant.item_size)).trim();
123
+ const sizeOption = product.options?.find((opt) => opt.title === "Size");
124
+ if (sizeOption) {
125
+ variantOptions["Size"] = sizeTitle;
126
+ if (!productOptionMap.has("Size")) {
127
+ productOptionMap.set("Size", new Set());
128
+ }
129
+ productOptionMap.get("Size").add(sizeTitle);
130
+ // Track raw value for metadata
131
+ rawValueMappings.push({
132
+ variantId: variant.id,
133
+ optionTitle: "Size",
134
+ optionValue: sizeTitle,
135
+ rawValue: extendedVariant.item_size,
136
+ });
137
+ }
138
+ }
139
+ // Process party_style_details for metals, metal colors, diamond qualities, shapes and solitaire carat
140
+ if (extendedVariant.party_style_details) {
141
+ // First, find diamond details for processing
142
+ const diamondDetails = extendedVariant.party_style_details.filter((detail) => detail.raw_type === "Diamond" &&
143
+ detail.tone_code &&
144
+ detail.qly_code);
145
+ const baseDiamondDetail = diamondDetails.find((detail) => detail.is_base);
146
+ const diamondDetailToUse = baseDiamondDetail || diamondDetails[0];
147
+ // For solitaire shapes/carat, find LGS diamond details
148
+ const lgsDiamondDetails = extendedVariant.party_style_details.filter((detail) => isSolitaire &&
149
+ detail.raw_type === "Diamond" &&
150
+ detail.raw_code === "LGS");
151
+ const baseLgsDiamondDetail = lgsDiamondDetails.find((detail) => detail.is_base);
152
+ const lgsDiamondDetailToUse = baseLgsDiamondDetail || lgsDiamondDetails[0];
153
+ for (const detail of extendedVariant.party_style_details) {
154
+ // Metal options
155
+ if (detail.raw_type === "Metal" && detail.is_base) {
156
+ const qualityTitle = (masterMaps.qualityMasterMap.get(detail.qly_code) ||
157
+ detail.qly_code).trim();
158
+ const rawTitle = (masterMaps.rawMasterMap.get(detail.raw_code) || detail.raw_code).trim();
159
+ const metalValue = `${qualityTitle} ${rawTitle}`.trim();
160
+ const metalOption = product.options?.find((opt) => opt.title === "Metal");
161
+ if (metalOption && metalValue) {
162
+ variantOptions["Metal"] = metalValue;
163
+ if (!productOptionMap.has("Metal")) {
164
+ productOptionMap.set("Metal", new Set());
165
+ }
166
+ productOptionMap.get("Metal").add(metalValue);
167
+ // Track raw values for metadata (combine raw_code and qly_code)
168
+ rawValueMappings.push({
169
+ variantId: variant.id,
170
+ optionTitle: "Metal",
171
+ optionValue: metalValue,
172
+ rawValue: `${detail.qly_code || ""}:${detail.raw_code || ""}`.trim(),
173
+ });
174
+ }
175
+ // Metal Color
176
+ if (detail.tone_code) {
177
+ let colorTitle = masterMaps.toneMasterMap.get(detail.tone_code) ||
178
+ detail.tone_code;
179
+ // Fallback to static mappings if not in master
180
+ if (!masterMaps.toneMasterMap.has(detail.tone_code)) {
181
+ if (detail.tone_code === "R")
182
+ colorTitle = "Rose";
183
+ else if (detail.tone_code === "Y")
184
+ colorTitle = "Yellow";
185
+ else if (detail.tone_code === "W")
186
+ colorTitle = "White";
187
+ else if (detail.tone_code === "YRW")
188
+ colorTitle = "YELLOW/ROSE/WHITE";
189
+ else if (detail.tone_code === "YW")
190
+ colorTitle = "YELLOW/WHITE";
191
+ else if (detail.tone_code === "RW")
192
+ colorTitle = "ROSE/WHITE";
193
+ else if (detail.tone_code === "BU")
194
+ colorTitle = "BLUE";
195
+ else if (detail.tone_code === "BL")
196
+ colorTitle = "BLACK";
197
+ }
198
+ colorTitle = colorTitle.trim();
199
+ const metalColorOption = product.options?.find((opt) => opt.title === "Metal Color");
200
+ if (metalColorOption && colorTitle) {
201
+ variantOptions["Metal Color"] = colorTitle;
202
+ if (!productOptionMap.has("Metal Color")) {
203
+ productOptionMap.set("Metal Color", new Set());
204
+ }
205
+ productOptionMap.get("Metal Color").add(colorTitle);
206
+ // Track raw value for metadata
207
+ rawValueMappings.push({
208
+ variantId: variant.id,
209
+ optionTitle: "Metal Color",
210
+ optionValue: colorTitle,
211
+ rawValue: detail.tone_code || "",
212
+ });
213
+ }
214
+ }
215
+ }
216
+ // Diamond Quality
217
+ if (diamondDetailToUse &&
218
+ detail === diamondDetailToUse) {
219
+ const toneTitle = (masterMaps.toneMasterMap.get(detail.tone_code) ||
220
+ detail.tone_code).trim();
221
+ const qualityTitle = (masterMaps.qualityMasterMap.get(detail.qly_code) ||
222
+ detail.qly_code).trim();
223
+ const diamondValue = `${toneTitle} ${qualityTitle}`.trim();
224
+ const diamondOption = product.options?.find((opt) => opt.title === "Diamond Quality");
225
+ if (diamondOption && diamondValue && toneTitle && qualityTitle) {
226
+ variantOptions["Diamond Quality"] = diamondValue;
227
+ if (!productOptionMap.has("Diamond Quality")) {
228
+ productOptionMap.set("Diamond Quality", new Set());
229
+ }
230
+ productOptionMap.get("Diamond Quality").add(diamondValue);
231
+ // Track raw values for metadata (combine tone_code and qly_code)
232
+ rawValueMappings.push({
233
+ variantId: variant.id,
234
+ optionTitle: "Diamond Quality",
235
+ optionValue: diamondValue,
236
+ rawValue: `${detail.tone_code || ""}:${detail.qly_code || ""}`.trim(),
237
+ });
238
+ }
239
+ }
240
+ // Shape and Carat logic aligned with helper
241
+ if (lgsDiamondDetailToUse &&
242
+ detail === lgsDiamondDetailToUse) {
243
+ const shapeTitle = (masterMaps.shapeMasterMap.get(detail.shape_code) ||
244
+ String(detail.shape_code || "")).trim();
245
+ if (shapeTitle) {
246
+ const shapeOption = product.options?.find((opt) => opt.title === "Shape");
247
+ if (shapeOption) {
248
+ variantOptions["Shape"] = shapeTitle;
249
+ if (!productOptionMap.has("Shape")) {
250
+ productOptionMap.set("Shape", new Set());
251
+ }
252
+ productOptionMap.get("Shape").add(shapeTitle);
253
+ // Track raw value for metadata
254
+ rawValueMappings.push({
255
+ variantId: variant.id,
256
+ optionTitle: "Shape",
257
+ optionValue: shapeTitle,
258
+ rawValue: detail.shape_code || "",
259
+ });
260
+ }
261
+ }
262
+ const weightStr = String(detail?.weight || "").trim();
263
+ if (weightStr) {
264
+ variantOptions["Carat"] = weightStr;
265
+ if (!productOptionMap.has("Carat")) {
266
+ productOptionMap.set("Carat", new Set());
267
+ }
268
+ productOptionMap.get("Carat").add(weightStr);
269
+ // Track raw value for metadata (weight is already the raw value)
270
+ rawValueMappings.push({
271
+ variantId: variant.id,
272
+ optionTitle: "Carat",
273
+ optionValue: weightStr,
274
+ rawValue: weightStr,
275
+ });
276
+ }
277
+ }
278
+ }
279
+ }
280
+ // Ensure all product options are present in variant options
281
+ // MedusaJS requires all product options to have values when updating variants
282
+ if (product.options && product.options.length > 0) {
283
+ for (const productOption of product.options) {
284
+ const optionTitle = productOption.title;
285
+ if (optionTitle && !variantOptions[optionTitle]) {
286
+ // If option is missing, log a warning
287
+ // The existing options should have been preserved above, but if still missing,
288
+ // this variant might be in an invalid state
289
+ console.warn(`Variant ${variant.id} is missing option "${optionTitle}" for product ${productId}. This may cause update to fail.`);
290
+ }
291
+ }
292
+ }
293
+ // Ensure variant options keys are in a consistent alphabetical order
294
+ // Filter out any undefined, null, or empty string values
295
+ const sortedVariantOptions = {};
296
+ const sortedKeys = Object.keys(variantOptions).sort((a, b) => a.localeCompare(b));
297
+ for (const key of sortedKeys) {
298
+ const value = variantOptions[key];
299
+ // Only include non-empty, non-undefined, non-null values
300
+ if (value && typeof value === "string" && value.trim().length > 0) {
301
+ sortedVariantOptions[key] = value.trim();
302
+ }
303
+ }
304
+ // Only add variant if it has at least one option value
305
+ // and validate that all required product options are present
306
+ const hasAllRequiredOptions = !product.options ||
307
+ product.options.length === 0 ||
308
+ product.options.every((opt) => !opt.title || sortedVariantOptions[opt.title]);
309
+ if (hasAllRequiredOptions && Object.keys(sortedVariantOptions).length > 0) {
310
+ variantsToUpdate.push({
311
+ variant: {
312
+ id: variant.id,
313
+ options: sortedVariantOptions,
314
+ },
315
+ });
316
+ }
317
+ else {
318
+ console.warn(`Skipping variant ${variant.id} - missing required options. Product has ${product.options?.length || 0} options, variant has ${Object.keys(sortedVariantOptions).length} options.`);
319
+ }
320
+ }
321
+ // STEP 1: Update products FIRST with all option values that will be used
322
+ // This ensures option values exist before assigning them to variants
323
+ const productsToUpdate = Array.from(productOptionsMap.entries()).map(([productId, optionsMap]) => {
324
+ const options = Array.from(optionsMap.entries())
325
+ .sort(([a], [b]) => a.localeCompare(b))
326
+ .map(([title, values]) => ({
327
+ title,
328
+ values: Array.from(values).sort((x, y) => x.localeCompare(y)),
329
+ }));
330
+ return {
331
+ id: productId,
332
+ options,
333
+ };
334
+ });
335
+ if (productsToUpdate.length > 0) {
336
+ await (0, core_flows_1.updateProductsWorkflow)(container).run({
337
+ input: {
338
+ products: productsToUpdate,
339
+ },
340
+ });
341
+ }
342
+ // STEP 2: Update variants with recalculated options (now that product options exist)
343
+ if (variantsToUpdate.length > 0) {
344
+ console.log(`Updating ${variantsToUpdate.length} variants with recalculated options`);
345
+ // Validate all variants have all required options before updating
346
+ const validatedVariants = variantsToUpdate.filter((v) => {
347
+ const variant = v.variant;
348
+ const variantData = variants.find((variantData) => variantData.id === variant.id);
349
+ const product = variantData ? products?.find((p) => p.id === variantData.product_id) : null;
350
+ if (!product || !product.options)
351
+ return true; // Can't validate, allow through
352
+ const requiredOptions = product.options.map((opt) => opt.title).filter(Boolean);
353
+ const providedOptions = Object.keys(variant.options || {});
354
+ // Check if all required options are present and have non-empty values
355
+ const hasAllOptions = requiredOptions.every((optTitle) => providedOptions.includes(optTitle) &&
356
+ variant.options[optTitle] &&
357
+ typeof variant.options[optTitle] === "string" &&
358
+ variant.options[optTitle].trim().length > 0);
359
+ if (!hasAllOptions) {
360
+ console.warn(`Skipping variant ${variant.id}: Missing required options. Required: ${requiredOptions.join(", ")}, Provided: ${providedOptions.join(", ")}`);
361
+ return false;
362
+ }
363
+ // Check for undefined values
364
+ const hasUndefinedValues = Object.values(variant.options || {}).some((val) => val === undefined || val === null);
365
+ if (hasUndefinedValues) {
366
+ console.warn(`Skipping variant ${variant.id}: Contains undefined/null option values`);
367
+ return false;
368
+ }
369
+ return true;
370
+ });
371
+ if (validatedVariants.length === 0) {
372
+ console.warn("No valid variants to update after validation");
373
+ return new workflows_sdk_1.StepResponse([]);
374
+ }
375
+ if (validatedVariants.length < variantsToUpdate.length) {
376
+ console.warn(`Filtered out ${variantsToUpdate.length - validatedVariants.length} invalid variants`);
377
+ }
378
+ await (0, core_flows_1.updateProductVariantsWorkflow)(container).run({
379
+ input: {
380
+ product_variants: validatedVariants.map((v) => v.variant),
381
+ },
382
+ });
383
+ // Update variant option metadata with raw values
384
+ if (rawValueMappings.length > 0) {
385
+ console.log(`Updating metadata for ${rawValueMappings.length} variant options with raw values`);
386
+ await (0, update_variant_option_metadata_1.updateVariantOptionMetadata)(container, rawValueMappings);
387
+ }
388
+ }
389
+ // STEP 3: Recalculate product options from all updated variants to ensure consistency
390
+ // Get all variants again after update to collect latest option values
391
+ const { data: updatedVariants } = await query.graph({
392
+ entity: "product_variant",
393
+ fields: ["id", "product_id", "options.*", "options.option.title"],
394
+ filters: {
395
+ product_id: input.productIds,
396
+ },
397
+ });
398
+ // Group options by product_id, then by title within each product
399
+ const finalProductOptionsMap = new Map();
400
+ updatedVariants.forEach((variant) => {
401
+ const productId = variant.product_id;
402
+ if (!productId)
403
+ return;
404
+ if (!finalProductOptionsMap.has(productId)) {
405
+ finalProductOptionsMap.set(productId, new Map());
406
+ }
407
+ const optionsMap = finalProductOptionsMap.get(productId);
408
+ variant.options?.forEach((optionValue) => {
409
+ const title = optionValue.option?.title;
410
+ const value = optionValue.value;
411
+ if (title && value) {
412
+ if (!optionsMap.has(title)) {
413
+ optionsMap.set(title, new Set());
414
+ }
415
+ optionsMap.get(title).add(value);
416
+ }
417
+ });
418
+ });
419
+ // Convert to products array format for final update
420
+ const finalProductsToUpdate = Array.from(finalProductOptionsMap.entries()).map(([productId, optionsMap]) => {
421
+ const options = Array.from(optionsMap.entries())
422
+ .sort(([a], [b]) => a.localeCompare(b))
423
+ .map(([title, values]) => ({
424
+ title,
425
+ values: Array.from(values).sort((x, y) => x.localeCompare(y)),
426
+ }));
427
+ return {
428
+ id: productId,
429
+ options,
430
+ };
431
+ });
432
+ // Final update of products with all option values from updated variants
433
+ if (finalProductsToUpdate.length > 0) {
434
+ await (0, core_flows_1.updateProductsWorkflow)(container).run({
435
+ input: {
436
+ products: finalProductsToUpdate,
437
+ },
438
+ });
439
+ }
440
+ return new workflows_sdk_1.StepResponse(finalProductsToUpdate);
441
+ }
442
+ catch (error) {
443
+ console.error("Error updating product options after variant update:", error);
444
+ throw error;
445
+ }
446
+ });
447
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXByb2R1Y3Qtb3B0aW9ucy1hZnRlci12YXJpYW50LXVwZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvcGFydHktc3R5bGUtbWFzdGVyL3N0ZXBzL3VwZGF0ZS1wcm9kdWN0LW9wdGlvbnMtYWZ0ZXItdmFyaWFudC11cGRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXNFO0FBQ3RFLHFFQUE2RTtBQUM3RSw0REFHcUM7QUFDckMsaUdBR3NEO0FBTXpDLFFBQUEsMENBQTBDLEdBQUcsSUFBQSwwQkFBVSxFQUNsRSw2Q0FBNkMsRUFDN0MsS0FBSyxFQUNILEtBQXNELEVBQ3RELEVBQUUsU0FBUyxFQUFFLEVBQ2IsRUFBRTtJQUNGLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakUsa0NBQWtDO1FBQ2xDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzNDLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUM7WUFDM0IsT0FBTyxFQUFFO2dCQUNQLEVBQUUsRUFBRSxLQUFLLENBQUMsVUFBVTthQUNyQjtTQUNGLENBQUMsQ0FBQztRQUVILHNGQUFzRjtRQUN0RixNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMzQyxNQUFNLEVBQUUsaUJBQWlCO1lBQ3pCLE1BQU0sRUFBRTtnQkFDTixJQUFJO2dCQUNKLFlBQVk7Z0JBQ1oscUJBQXFCO2dCQUNyQiw0QkFBNEI7Z0JBQzVCLHdDQUF3QztnQkFDeEMsV0FBVztnQkFDWCxzQkFBc0I7YUFDdkI7WUFDRCxPQUFPLEVBQUU7Z0JB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