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

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 (114) hide show
  1. package/.medusa/server/development/erp-order-payload-example.js +76 -0
  2. package/.medusa/server/src/api/admin/middlewares.js +2 -6
  3. package/.medusa/server/src/api/erp/webhook/config.js +6 -32
  4. package/.medusa/server/src/api/middlewares.js +1 -3
  5. package/.medusa/server/src/api/store/middleware.js +1 -3
  6. package/.medusa/server/src/modules/erp/service.js +1 -59
  7. package/.medusa/server/src/modules/extended-product/models/extended-product.js +9 -89
  8. package/.medusa/server/src/modules/extended-variant/models/extended-variant.js +12 -145
  9. package/.medusa/server/src/modules/raw-master/models/raw-master.js +1 -2
  10. package/.medusa/server/src/modules/shape-master/models/shape-master.js +1 -2
  11. package/.medusa/server/src/modules/shipping-info-master/models/shipping-info-master.js +2 -2
  12. package/.medusa/server/src/subscribers/cutomer-updated.js +2 -1
  13. package/.medusa/server/src/subscribers/party-master.js +2 -2
  14. package/.medusa/server/src/workflows/create-or-update-product-options/steps/create-update-product-options.js +2 -39
  15. package/.medusa/server/src/workflows/helpers/product-helper.js +111 -425
  16. package/.medusa/server/src/workflows/inward-master/helper/index.js +39 -88
  17. package/.medusa/server/src/workflows/party-master/steps/delete-party.js +7 -4
  18. package/.medusa/server/src/workflows/party-master/steps/fetch-party-master.js +2 -1
  19. package/.medusa/server/src/workflows/party-master/workflows/create-or-update-party-master.js +49 -1
  20. package/.medusa/server/src/workflows/party-master/workflows/index.js +1 -2
  21. package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-deletion.js +189 -307
  22. package/.medusa/server/src/workflows/party-style-master/workflows/create-or-update-party-style-master.js +4 -120
  23. package/.medusa/server/src/workflows/raw-master/steps/delete-raw.js +11 -9
  24. package/.medusa/server/src/workflows/shape-master/steps/delete-shape.js +9 -9
  25. package/package.json +1 -1
  26. package/.medusa/server/src/api/admin/masters/[master]/[id]/route.js +0 -121
  27. package/.medusa/server/src/api/admin/masters/[master]/route.js +0 -33
  28. package/.medusa/server/src/api/admin/masters/middlewares.js +0 -35
  29. package/.medusa/server/src/api/admin/masters/query-config.js +0 -14
  30. package/.medusa/server/src/api/admin/masters/search-middleware.js +0 -16
  31. package/.medusa/server/src/api/admin/masters/utils.js +0 -108
  32. package/.medusa/server/src/api/admin/masters/validators.js +0 -28
  33. package/.medusa/server/src/api/admin/variant-options/sync/route.js +0 -313
  34. package/.medusa/server/src/api/pos/gold-rate/middleware.js +0 -13
  35. package/.medusa/server/src/api/pos/gold-rate/route.js +0 -96
  36. package/.medusa/server/src/api/pos/middleware.js +0 -13
  37. package/.medusa/server/src/api/store/gold-rate/current/route.js +0 -70
  38. package/.medusa/server/src/api/store/gold-rate/historical/route.js +0 -108
  39. package/.medusa/server/src/api/store/gold-rate/middleware.js +0 -19
  40. package/.medusa/server/src/api/store/gold-rate/validators.js +0 -37
  41. package/.medusa/server/src/jobs/process-variant-option-sync.js +0 -521
  42. package/.medusa/server/src/modules/category-group-master/migrations/Migration20251031061116.js +0 -14
  43. package/.medusa/server/src/modules/category-group-master/migrations/Migration20251104045912.js +0 -14
  44. package/.medusa/server/src/modules/category-master/migrations/Migration20251031061327.js +0 -14
  45. package/.medusa/server/src/modules/category-master/migrations/Migration20251104045755.js +0 -14
  46. package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251031061432.js +0 -14
  47. package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251104050102.js +0 -14
  48. package/.medusa/server/src/modules/collection-master/migrations/Migration20251031060941.js +0 -14
  49. package/.medusa/server/src/modules/collection-master/migrations/Migration20251104050012.js +0 -14
  50. package/.medusa/server/src/modules/discount-master/migrations/Migration20251031061523.js +0 -14
  51. package/.medusa/server/src/modules/discount-master/migrations/Migration20251104050153.js +0 -14
  52. package/.medusa/server/src/modules/extended-product/migrations/Migration20251103182726.js +0 -14
  53. package/.medusa/server/src/modules/extended-product/migrations/Migration20251119062526.js +0 -16
  54. package/.medusa/server/src/modules/extended-product/migrations/Migration20251202055742.js +0 -14
  55. package/.medusa/server/src/modules/extended-product/migrations/Migration20251202064200.js +0 -16
  56. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251119063328.js +0 -20
  57. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120045708.js +0 -14
  58. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120051832.js +0 -14
  59. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120052514.js +0 -14
  60. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251202055952.js +0 -14
  61. package/.medusa/server/src/modules/item-size-master/index.js +0 -13
  62. package/.medusa/server/src/modules/item-size-master/migrations/Migration20251031111036.js +0 -17
  63. package/.medusa/server/src/modules/item-size-master/models/item-size-master.js +0 -14
  64. package/.medusa/server/src/modules/item-size-master/service.js +0 -10
  65. package/.medusa/server/src/modules/party-master/migrations/Migration20251031061657.js +0 -14
  66. package/.medusa/server/src/modules/party-master/migrations/Migration20251104050242.js +0 -14
  67. package/.medusa/server/src/modules/promocode-master/migrations/Migration20251031061829.js +0 -14
  68. package/.medusa/server/src/modules/promocode-master/migrations/Migration20251104050332.js +0 -14
  69. package/.medusa/server/src/modules/quality-master/index.js +0 -13
  70. package/.medusa/server/src/modules/quality-master/migrations/Migration20251031095211.js +0 -16
  71. package/.medusa/server/src/modules/quality-master/migrations/Migration20251105045114.js +0 -14
  72. package/.medusa/server/src/modules/quality-master/models/quality-master.js +0 -17
  73. package/.medusa/server/src/modules/quality-master/service.js +0 -10
  74. package/.medusa/server/src/modules/raw-master/migrations/Migration20251031061912.js +0 -14
  75. package/.medusa/server/src/modules/shape-master/migrations/Migration20251031062019.js +0 -14
  76. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251031062128.js +0 -14
  77. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251104050501.js +0 -14
  78. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251203083315.js +0 -16
  79. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251031062303.js +0 -14
  80. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251104050743.js +0 -14
  81. package/.medusa/server/src/modules/tone-master/index.js +0 -13
  82. package/.medusa/server/src/modules/tone-master/migrations/Migration20251031104320.js +0 -16
  83. package/.medusa/server/src/modules/tone-master/models/tone-master.js +0 -15
  84. package/.medusa/server/src/modules/tone-master/service.js +0 -10
  85. package/.medusa/server/src/modules/variant-option-sync-queue/index.js +0 -13
  86. package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251101082220.js +0 -19
  87. package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251103123857.js +0 -16
  88. package/.medusa/server/src/modules/variant-option-sync-queue/models/variant-option-sync-queue.js +0 -23
  89. package/.medusa/server/src/modules/variant-option-sync-queue/service.js +0 -49
  90. package/.medusa/server/src/utils/build-redis-key.js +0 -30
  91. package/.medusa/server/src/workflows/helpers/update-variant-option-metadata.js +0 -105
  92. package/.medusa/server/src/workflows/helpers/variant-helper.js +0 -212
  93. package/.medusa/server/src/workflows/item-size-master/create-or-update-item-size-master.js +0 -51
  94. package/.medusa/server/src/workflows/item-size-master/index.js +0 -15
  95. package/.medusa/server/src/workflows/item-size-master/steps/create-item-size.js +0 -21
  96. package/.medusa/server/src/workflows/item-size-master/steps/delete-item-size.js +0 -23
  97. package/.medusa/server/src/workflows/item-size-master/steps/fetch-item-size-master.js +0 -55
  98. package/.medusa/server/src/workflows/item-size-master/steps/update-item-size.js +0 -36
  99. package/.medusa/server/src/workflows/party-master/workflows/delete-party-master.js +0 -60
  100. package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-variant-update.js +0 -367
  101. package/.medusa/server/src/workflows/quality-master/create-or-update-quality-master.js +0 -58
  102. package/.medusa/server/src/workflows/quality-master/index.js +0 -30
  103. package/.medusa/server/src/workflows/quality-master/steps/create-quality.js +0 -22
  104. package/.medusa/server/src/workflows/quality-master/steps/delete-quality.js +0 -20
  105. package/.medusa/server/src/workflows/quality-master/steps/fetch-quality-master.js +0 -54
  106. package/.medusa/server/src/workflows/quality-master/steps/update-quality.js +0 -37
  107. package/.medusa/server/src/workflows/raw-master/create-or-update-raw-master.js +0 -58
  108. package/.medusa/server/src/workflows/shape-master/create-or-update-shape-master.js +0 -53
  109. package/.medusa/server/src/workflows/tone-master/create-or-update-tone-master.js +0 -52
  110. package/.medusa/server/src/workflows/tone-master/index.js +0 -30
  111. package/.medusa/server/src/workflows/tone-master/steps/create-tone.js +0 -22
  112. package/.medusa/server/src/workflows/tone-master/steps/delete-tone.js +0 -20
  113. package/.medusa/server/src/workflows/tone-master/steps/fetch-tone-master.js +0 -54
  114. package/.medusa/server/src/workflows/tone-master/steps/update-tone.js +0 -37
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updateProductOptionsAfterDeletionStep = void 0;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
5
  const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
- const core_flows_1 = require("@medusajs/medusa/core-flows");
7
6
  const utils_2 = require("@medusajs/framework/utils");
8
7
  const utils_3 = require("@medusajs/framework/utils");
9
8
  exports.updateProductOptionsAfterDeletionStep = (0, workflows_sdk_1.createStep)("update-product-options-after-deletion", async (input, { container }) => {
@@ -13,345 +12,228 @@ exports.updateProductOptionsAfterDeletionStep = (0, workflows_sdk_1.createStep)(
13
12
  return new workflows_sdk_1.StepResponse([]);
14
13
  }
15
14
  const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
16
- console.log(`Updating product options for ${input.productIds.length} products after deletion`);
17
- // Get products with their options
18
- const { data: products } = await query.graph({
15
+ console.log(`Updating product options for ${input.productIds.length} products`);
16
+ // Get the products that had variants deleted
17
+ const { data: productsWithDeletedVariants } = await query.graph({
19
18
  entity: "product",
20
19
  fields: ["id", "external_id", "options.*"],
21
20
  filters: {
22
21
  id: input.productIds,
23
22
  },
24
23
  });
25
- if (!products || !products.length) {
24
+ if (!productsWithDeletedVariants || !productsWithDeletedVariants.length) {
26
25
  console.log("No products found for the provided IDs");
27
26
  return new workflows_sdk_1.StepResponse([]);
28
27
  }
29
- // Get all remaining variants for these products with extended variant data
30
- const { data: variants } = await query.graph({
31
- entity: "product_variant",
32
- fields: [
33
- "id",
34
- "product_id",
35
- "extended_variant.id",
36
- "extended_variant.item_size",
37
- "extended_variant.party_style_details.*",
38
- ],
28
+ console.log(`Found ${productsWithDeletedVariants.length} products to update`);
29
+ // Get remaining variants for these products
30
+ const { data: remainingVariants } = await query.graph({
31
+ entity: "variant",
32
+ fields: ["id", "product_id", "metadata.external_id"],
39
33
  filters: {
40
34
  product_id: input.productIds,
41
35
  },
42
36
  });
43
- console.log(`Found ${variants?.length || 0} remaining variants`);
44
- // If no variants remain, set products to draft with Default option
45
- if (!variants || variants.length === 0) {
46
- const productsToUpdate = products.map((product) => ({
47
- id: product.id,
48
- options: [
49
- {
50
- title: "Default",
51
- values: ["Default"],
52
- },
37
+ console.log(`Found ${remainingVariants?.length || 0} remaining variants`);
38
+ // Get extended variants data for the remaining variants
39
+ let remainingExtendedVariants;
40
+ try {
41
+ const result = await query.graph({
42
+ entity: "extended_variant",
43
+ fields: [
44
+ "id",
45
+ "mapping_id",
46
+ "party_style_id",
47
+ "style_id",
48
+ "item_size",
49
+ "metal",
50
+ "metal_purity",
51
+ "metal_color",
52
+ "party_style_details.raw_type",
53
+ "party_style_details.is_base",
54
+ "party_style_details.qly_code",
55
+ "party_style_details.raw_code",
56
+ "party_style_details.tone_code",
53
57
  ],
54
- }));
55
- // Update products with Default option
56
- if (productsToUpdate.length > 0) {
57
- await (0, core_flows_1.updateProductsWorkflow)(container).run({
58
- input: {
59
- products: productsToUpdate,
60
- },
61
- });
62
- // Set status to draft separately if needed
63
- const productService = container.resolve(utils_2.Modules.PRODUCT);
64
- for (const product of productsToUpdate) {
65
- await productService.updateProducts(product.id, {
66
- status: utils_3.ProductUtils.ProductStatus.DRAFT,
67
- });
68
- }
69
- }
70
- return new workflows_sdk_1.StepResponse(productsToUpdate);
58
+ filters: {
59
+ mapping_id: (remainingVariants || []).map((v) => v.id),
60
+ },
61
+ });
62
+ remainingExtendedVariants = result.data;
63
+ console.log(`Found ${remainingExtendedVariants?.length || 0} remaining extended variants`);
71
64
  }
72
- // Get extended variant IDs
73
- const extendedVariantIds = variants
74
- .map((v) => v.extended_variant?.id)
75
- .filter(Boolean);
76
- // Get extended variants with party_style_details
77
- const { data: extendedVariants } = await query.graph({
78
- entity: "extended_variant",
79
- fields: ["id", "item_size", "stock_type", "party_style_details.*"],
80
- filters: {
81
- id: extendedVariantIds,
82
- },
83
- });
84
- // Load master maps
85
- const { data: rawMasterArr } = await query.graph({
86
- entity: "raw_master",
87
- fields: ["id", "title", "raw_code"],
88
- });
89
- const { data: qualityMasterArr } = await query.graph({
90
- entity: "quality_master",
91
- fields: ["id", "title", "qly_code"],
92
- });
93
- const { data: toneMasterArr } = await query.graph({
94
- entity: "tone_master",
95
- fields: ["id", "title", "tone_code"],
96
- });
97
- const { data: itemSizeMasterArr } = await query.graph({
98
- entity: "item_size_master",
99
- fields: ["id", "title", "item_size_code"],
100
- });
101
- const { data: shapeMasterArr } = await query.graph({
102
- entity: "shape_master",
103
- fields: ["id", "title", "shape_code"],
104
- });
105
- const rawMasterMap = new Map();
106
- rawMasterArr?.forEach((x) => rawMasterMap.set(x.raw_code, x.title));
107
- const qualityMasterMap = new Map();
108
- qualityMasterArr?.forEach((x) => qualityMasterMap.set(x.qly_code, x.title));
109
- const toneMasterMap = new Map();
110
- toneMasterArr?.forEach((x) => toneMasterMap.set(x.tone_code, x.title));
111
- const itemSizeMasterMap = new Map();
112
- itemSizeMasterArr?.forEach((x) => itemSizeMasterMap.set(x.item_size_code, x.title));
113
- const shapeMasterMap = new Map();
114
- shapeMasterArr?.forEach((x) => shapeMasterMap.set(x.shape_code, x.title));
115
- const masterMaps = {
116
- rawMasterMap,
117
- qualityMasterMap,
118
- toneMasterMap,
119
- itemSizeMasterMap,
120
- shapeMasterMap,
121
- };
122
- // Recalculate variant options from extended variant data
123
- const variantsToUpdate = [];
124
- const productOptionsMap = new Map();
125
- for (const variant of variants) {
126
- const productId = variant.product_id;
127
- if (!productId)
65
+ catch (error) {
66
+ console.error("Error fetching extended variants:", error);
67
+ console.log("Falling back to empty array for extended variants");
68
+ remainingExtendedVariants = [];
69
+ }
70
+ // Update product options for each affected product using the same approach as create-or-update-party-style-master
71
+ const productsToUpdate = [];
72
+ for (const product of productsWithDeletedVariants) {
73
+ console.log(`Processing product ${product.id} (${product.external_id})`);
74
+ // Get variants for this specific product
75
+ const productVariants = (remainingVariants || []).filter((variant) => variant.product_id === product.id);
76
+ if (productVariants.length === 0) {
77
+ console.log(`No variants left for product ${product.id}, setting Default option only and status to draft`);
78
+ // No variants left, remove all options except Default and set status to draft
79
+ productsToUpdate.push({
80
+ id: product.id,
81
+ options: [
82
+ {
83
+ title: "Default",
84
+ values: ["Default"],
85
+ },
86
+ ],
87
+ status: utils_3.ProductUtils.ProductStatus.DRAFT, // Set status to draft when no variants exist
88
+ });
128
89
  continue;
129
- const product = products?.find((p) => p.id === productId);
130
- const extendedVariant = extendedVariants?.find((ev) => ev.id === variant.extended_variant?.id);
131
- if (!product || !extendedVariant)
90
+ }
91
+ // Get extended variants for this product's variants
92
+ const productExtendedVariants = (remainingExtendedVariants || []).filter((extVariant) => productVariants.some((variant) => variant.id === extVariant.mapping_id));
93
+ if (productExtendedVariants.length === 0) {
94
+ console.log(`No extended variants found for product ${product.id}, setting Default option only`);
95
+ // No extended variants found, use Default option
96
+ productsToUpdate.push({
97
+ id: product.id,
98
+ options: [
99
+ {
100
+ title: "Default",
101
+ values: ["Default"],
102
+ },
103
+ ],
104
+ status: utils_3.ProductUtils.ProductStatus.DRAFT, // Set status to draft when no extended variants exist
105
+ });
132
106
  continue;
133
- // Initialize product options map if not exists
134
- if (!productOptionsMap.has(productId)) {
135
- productOptionsMap.set(productId, new Map());
136
107
  }
137
- const productOptionMap = productOptionsMap.get(productId);
138
- // Generate options from extended variant data
139
- const variantOptions = {};
140
- // Detect solitaire styles based on stock_type
141
- const stockType = extendedVariant?.stock_type;
142
- const isSolitaire = stockType === "LG SOLITAIRE" || stockType === "SOLITAIRE";
143
- // Size
144
- if (extendedVariant.item_size) {
145
- const sizeTitle = (masterMaps.itemSizeMasterMap.get(extendedVariant.item_size) ||
146
- String(extendedVariant.item_size)).trim();
147
- const sizeOption = product.options?.find((opt) => opt.title === "Size");
148
- if (sizeOption) {
149
- variantOptions["Size"] = sizeTitle;
150
- if (!productOptionMap.has("Size")) {
151
- productOptionMap.set("Size", new Set());
152
- }
153
- productOptionMap.get("Size").add(sizeTitle);
108
+ console.log(`Processing ${productExtendedVariants.length} extended variants for product ${product.id}`);
109
+ // Use the same approach as create-or-update-party-style-master
110
+ // Calculate new options based on remaining variants
111
+ const newOptions = [];
112
+ // Collect all unique option values from remaining variants
113
+ const optionValues = {
114
+ metals: new Set(),
115
+ metalColors: new Set(),
116
+ diamondQualities: new Set(),
117
+ sizes: new Set(),
118
+ };
119
+ productExtendedVariants.forEach((extVariant) => {
120
+ // Safely access properties with null checks
121
+ // Use direct fields from ExtendedVariant model
122
+ if (extVariant.item_size) {
123
+ optionValues.sizes.add(String(extVariant.item_size));
154
124
  }
155
- }
156
- // Process party_style_details for metals, metal colors, diamond qualities, shapes and solitaire carat
157
- if (extendedVariant.party_style_details) {
158
- for (const detail of extendedVariant.party_style_details) {
159
- // Metal options
160
- if (detail.raw_type === "Metal" && detail.is_base) {
161
- const qualityTitle = (masterMaps.qualityMasterMap.get(detail.qly_code) ||
162
- detail.qly_code).trim();
163
- const rawTitle = (masterMaps.rawMasterMap.get(detail.raw_code) || detail.raw_code).trim();
164
- const metalValue = `${qualityTitle} ${rawTitle}`.trim();
165
- const metalOption = product.options?.find((opt) => opt.title === "Metal");
166
- if (metalOption) {
167
- variantOptions["Metal"] = metalValue;
168
- if (!productOptionMap.has("Metal")) {
169
- productOptionMap.set("Metal", new Set());
170
- }
171
- productOptionMap.get("Metal").add(metalValue);
172
- }
173
- // Metal Color
174
- if (detail.tone_code) {
175
- let colorTitle = masterMaps.toneMasterMap.get(detail.tone_code) ||
176
- detail.tone_code;
177
- // Fallback to static mappings if not in master
178
- if (!masterMaps.toneMasterMap.has(detail.tone_code)) {
179
- if (detail.tone_code === "R")
180
- colorTitle = "Rose";
181
- else if (detail.tone_code === "Y")
182
- colorTitle = "Yellow";
183
- else if (detail.tone_code === "W")
184
- colorTitle = "White";
185
- else if (detail.tone_code === "YRW")
186
- colorTitle = "YELLOW/ROSE/WHITE";
187
- else if (detail.tone_code === "YW")
188
- colorTitle = "YELLOW/WHITE";
189
- else if (detail.tone_code === "RW")
190
- colorTitle = "ROSE/WHITE";
191
- else if (detail.tone_code === "BU")
192
- colorTitle = "BLUE";
193
- else if (detail.tone_code === "BL")
194
- colorTitle = "BLACK";
195
- }
196
- colorTitle = colorTitle.trim();
197
- const metalColorOption = product.options?.find((opt) => opt.title === "Metal Color");
198
- if (metalColorOption) {
199
- variantOptions["Metal Color"] = colorTitle;
200
- if (!productOptionMap.has("Metal Color")) {
201
- productOptionMap.set("Metal Color", new Set());
202
- }
203
- productOptionMap.get("Metal Color").add(colorTitle);
125
+ // Don't use raw metal fields - we'll get them from party_style_details
126
+ // if (extVariant.metal) {
127
+ // optionValues.metals.add(extVariant.metal);
128
+ // }
129
+ // if (extVariant.metal_color) {
130
+ // optionValues.metalColors.add(extVariant.metal_color);
131
+ // }
132
+ // Process party style details if available
133
+ if (extVariant.party_style_details) {
134
+ extVariant.party_style_details.forEach((detail) => {
135
+ if (detail?.raw_type === "Metal" && detail?.is_base) {
136
+ if (detail.qly_code && detail.raw_code) {
137
+ optionValues.metals.add(`${detail.qly_code}KT ${detail.raw_code}`);
204
138
  }
139
+ // Map tone code to color name
140
+ if (detail.tone_code === "R")
141
+ optionValues.metalColors.add("Rose");
142
+ else if (detail.tone_code === "Y")
143
+ optionValues.metalColors.add("Yellow");
144
+ else if (detail.tone_code === "W")
145
+ optionValues.metalColors.add("White");
146
+ else if (detail.tone_code === "YRW")
147
+ optionValues.metalColors.add("YELLOW/ROSE/WHITE");
148
+ else if (detail.tone_code === "YW")
149
+ optionValues.metalColors.add("YELLOW/WHITE");
150
+ else if (detail.tone_code === "RW")
151
+ optionValues.metalColors.add("ROSE/WHITE");
152
+ else if (detail.tone_code === "BU")
153
+ optionValues.metalColors.add("BLUE");
154
+ else if (detail.tone_code === "BL")
155
+ optionValues.metalColors.add("BLACK");
205
156
  }
206
- }
207
- // Diamond Quality
208
- if (detail.raw_type === "Diamond" &&
209
- detail.tone_code &&
210
- detail.qly_code &&
211
- detail.is_base) {
212
- const toneTitle = (masterMaps.toneMasterMap.get(detail.tone_code) ||
213
- detail.tone_code).trim();
214
- const qualityTitle = (masterMaps.qualityMasterMap.get(detail.qly_code) ||
215
- detail.qly_code).trim();
216
- const diamondValue = `${toneTitle} ${qualityTitle}`.trim();
217
- const diamondOption = product.options?.find((opt) => opt.title === "Diamond Quality");
218
- if (diamondOption) {
219
- variantOptions["Diamond Quality"] = diamondValue;
220
- if (!productOptionMap.has("Diamond Quality")) {
221
- productOptionMap.set("Diamond Quality", new Set());
222
- }
223
- productOptionMap.get("Diamond Quality").add(diamondValue);
224
- }
225
- }
226
- // Shape and Carat logic aligned with helper
227
- if (isSolitaire &&
228
- detail.raw_type === "Diamond" &&
229
- detail.raw_code === "LGS" &&
230
- detail.is_base) {
231
- const shapeTitle = (masterMaps.shapeMasterMap.get(detail.shape_code) ||
232
- String(detail.shape_code || "")).trim();
233
- if (shapeTitle) {
234
- const shapeOption = product.options?.find((opt) => opt.title === "Shape");
235
- if (shapeOption) {
236
- variantOptions["Shape"] = shapeTitle;
237
- if (!productOptionMap.has("Shape")) {
238
- productOptionMap.set("Shape", new Set());
239
- }
240
- productOptionMap.get("Shape").add(shapeTitle);
241
- }
242
- }
243
- const weightStr = String(detail?.weight || "").trim();
244
- if (weightStr) {
245
- variantOptions["Carat"] = weightStr;
246
- if (!productOptionMap.has("Carat")) {
247
- productOptionMap.set("Carat", new Set());
248
- }
249
- productOptionMap.get("Carat").add(weightStr);
157
+ if (detail?.raw_type === "Diamond" &&
158
+ detail?.tone_code &&
159
+ detail?.qly_code &&
160
+ detail?.is_base) {
161
+ optionValues.diamondQualities.add(`${detail.tone_code}/${detail.qly_code}`);
250
162
  }
251
- }
163
+ });
252
164
  }
165
+ });
166
+ // Build options array - ensure proper structure
167
+ // Only add Default option when no variants exist
168
+ if (productExtendedVariants.length === 0) {
169
+ newOptions.push({
170
+ title: "Default",
171
+ values: ["Default"],
172
+ });
253
173
  }
254
- // Ensure variant options keys are in a consistent alphabetical order
255
- const sortedVariantOptions = {};
256
- const sortedKeys = Object.keys(variantOptions).sort((a, b) => a.localeCompare(b));
257
- for (const key of sortedKeys) {
258
- sortedVariantOptions[key] = variantOptions[key];
174
+ // Add other options only if they have values
175
+ if (optionValues.metals.size > 0) {
176
+ newOptions.push({
177
+ title: "Metal",
178
+ values: Array.from(optionValues.metals),
179
+ });
259
180
  }
260
- variantsToUpdate.push({
261
- variant: {
262
- id: variant.id,
263
- options: sortedVariantOptions,
264
- },
265
- });
266
- }
267
- // STEP 1: Update products FIRST with all option values that will be used
268
- // This ensures option values exist before assigning them to variants
269
- const productsToUpdate = Array.from(productOptionsMap.entries()).map(([productId, optionsMap]) => {
270
- const options = Array.from(optionsMap.entries())
271
- .sort(([a], [b]) => a.localeCompare(b))
272
- .map(([title, values]) => ({
273
- title,
274
- values: Array.from(values).sort((x, y) => x.localeCompare(y)),
275
- }));
276
- return {
277
- id: productId,
278
- options,
279
- };
280
- });
281
- console.log("productsToUpdate (before variant update)", JSON.stringify(productsToUpdate, null, 2));
282
- if (productsToUpdate.length > 0) {
283
- await (0, core_flows_1.updateProductsWorkflow)(container).run({
284
- input: {
285
- products: productsToUpdate,
286
- },
181
+ if (optionValues.metalColors.size > 0) {
182
+ newOptions.push({
183
+ title: "Metal Color",
184
+ values: Array.from(optionValues.metalColors),
185
+ });
186
+ }
187
+ if (optionValues.diamondQualities.size > 0) {
188
+ newOptions.push({
189
+ title: "Diamond Quality",
190
+ values: Array.from(optionValues.diamondQualities),
191
+ });
192
+ }
193
+ if (optionValues.sizes.size > 0) {
194
+ newOptions.push({
195
+ title: "Size",
196
+ values: Array.from(optionValues.sizes),
197
+ });
198
+ }
199
+ console.log(`Calculated ${newOptions.length} options for product ${product.id}:`, newOptions);
200
+ // Get current product options for reference (but we won't merge them)
201
+ const { data: currentProductOptions } = await query.graph({
202
+ entity: "product_option",
203
+ fields: ["id", "title", "values.*"],
204
+ filters: { product_id: product.id },
287
205
  });
288
- }
289
- // STEP 2: Update variants with recalculated options (now that product options exist)
290
- if (variantsToUpdate.length > 0) {
291
- console.log(`Updating ${variantsToUpdate.length} variants with recalculated options`);
292
- await (0, core_flows_1.updateProductVariantsWorkflow)(container).run({
293
- input: {
294
- product_variants: variantsToUpdate.map((v) => v.variant),
295
- },
206
+ console.log(`Current product options for ${product.id}:`, currentProductOptions);
207
+ // Don't merge with existing options - replace them entirely
208
+ // This ensures options only reflect current variants
209
+ let finalOptions = newOptions;
210
+ console.log(`Final options for ${product.id}:`, finalOptions);
211
+ productsToUpdate.push({
212
+ id: product.id,
213
+ options: finalOptions,
296
214
  });
297
215
  }
298
- // STEP 3: Recalculate product options from all updated variants to ensure consistency
299
- // Get all variants again after update to collect latest option values
300
- const { data: updatedVariants } = await query.graph({
301
- entity: "product_variant",
302
- fields: ["id", "product_id", "options.*", "options.option.title"],
303
- filters: {
304
- product_id: input.productIds,
305
- },
306
- });
307
- // Group options by product_id, then by title within each product
308
- const finalProductOptionsMap = new Map();
309
- updatedVariants.forEach((variant) => {
310
- const productId = variant.product_id;
311
- if (!productId)
312
- return;
313
- if (!finalProductOptionsMap.has(productId)) {
314
- finalProductOptionsMap.set(productId, new Map());
216
+ // Update products with new options
217
+ if (productsToUpdate.length > 0) {
218
+ console.log(`Updating ${productsToUpdate.length} products with new options`);
219
+ const productService = container.resolve(utils_2.Modules.PRODUCT);
220
+ // Update each product individually
221
+ for (const productUpdate of productsToUpdate) {
222
+ await productService.updateProducts(productUpdate.id, {
223
+ options: productUpdate.options,
224
+ status: productUpdate.status, // Apply status update
225
+ });
315
226
  }
316
- const optionsMap = finalProductOptionsMap.get(productId);
317
- variant.options?.forEach((optionValue) => {
318
- const title = optionValue.option?.title;
319
- const value = optionValue.value;
320
- if (title && value) {
321
- if (!optionsMap.has(title)) {
322
- optionsMap.set(title, new Set());
323
- }
324
- optionsMap.get(title).add(value);
325
- }
326
- });
327
- });
328
- // Convert to products array format for final update
329
- const finalProductsToUpdate = Array.from(finalProductOptionsMap.entries()).map(([productId, optionsMap]) => {
330
- const options = Array.from(optionsMap.entries())
331
- .sort(([a], [b]) => a.localeCompare(b))
332
- .map(([title, values]) => ({
333
- title,
334
- values: Array.from(values).sort((x, y) => x.localeCompare(y)),
335
- }));
336
- return {
337
- id: productId,
338
- options,
339
- };
340
- });
341
- console.log("finalProductsToUpdate (after variant update)", JSON.stringify(finalProductsToUpdate, null, 2));
342
- // Final update of products with all option values from updated variants
343
- if (finalProductsToUpdate.length > 0) {
344
- await (0, core_flows_1.updateProductsWorkflow)(container).run({
345
- input: {
346
- products: finalProductsToUpdate,
347
- },
348
- });
227
+ console.log("Product options update completed successfully");
228
+ }
229
+ else {
230
+ console.log("No products to update");
349
231
  }
350
- return new workflows_sdk_1.StepResponse(finalProductsToUpdate);
232
+ return new workflows_sdk_1.StepResponse(productsToUpdate);
351
233
  }
352
234
  catch (error) {
353
235
  console.error("Error updating product options after deletion:", error);
354
236
  throw error;
355
237
  }
356
238
  });
357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXByb2R1Y3Qtb3B0aW9ucy1hZnRlci1kZWxldGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvcGFydHktc3R5bGUtbWFzdGVyL3N0ZXBzL3VwZGF0ZS1wcm9kdWN0LW9wdGlvbnMtYWZ0ZXItZGVsZXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXNFO0FBQ3RFLHFFQUE2RTtBQUM3RSw0REFHcUM7QUFDckMscURBQW9EO0FBQ3BELHFEQUF5RDtBQU81QyxRQUFBLHFDQUFxQyxHQUFHLElBQUEsMEJBQVUsRUFDN0QsdUNBQXVDLEVBQ3ZDLEtBQUssRUFBRSxLQUFpRCxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUN6RSxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7WUFDeEUsT0FBTyxJQUFJLDRCQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakUsT0FBTyxDQUFDLEdBQUcsQ0FDVCxnQ0FBZ0MsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLDBCQUEwQixDQUNsRixDQUFDO1FBRUYsa0NBQWtDO1FBQ2xDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzNDLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDO1lBQzFDLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEVBQUUsS0FBSyxDQUFDLFVBQVU7YUFDckI7U0FDRixDQUFDLENB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
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXByb2R1Y3Qtb3B0aW9ucy1hZnRlci1kZWxldGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvcGFydHktc3R5bGUtbWFzdGVyL3N0ZXBzL3VwZGF0ZS1wcm9kdWN0LW9wdGlvbnMtYWZ0ZXItZGVsZXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXNFO0FBQ3RFLHFFQUE2RTtBQUM3RSxxREFBb0Q7QUFDcEQscURBQXlEO0FBUzVDLFFBQUEscUNBQXFDLEdBQUcsSUFBQSwwQkFBVSxFQUM3RCx1Q0FBdUMsRUFDdkMsS0FBSyxFQUFFLEtBQWlELEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3pFLElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMERBQTBELENBQUMsQ0FBQztZQUN4RSxPQUFPLElBQUksNEJBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqRSxPQUFPLENBQUMsR0FBRyxDQUNULGdDQUFnQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sV0FBVyxDQUNuRSxDQUFDO1FBRUYsNkNBQTZDO1FBQzdDLE1BQU0sRUFBRSxJQUFJLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDOUQsTUFBTSxFQUFFLFNBQVM7WUFDakIsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUM7WUFDMUMsT0FBTyxFQUFFO2dCQUNQLEVBQUUsRUFBRSxLQUFLLENBQUMsVUFBVTthQUNyQjtTQUNGLENBQUMsQ0FBQztRQUVILElBQUks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