@devx-commerce/plugin-gati 0.0.34 → 0.0.35-beta.2
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.
- package/.medusa/server/src/api/admin/masters/[master]/[id]/route.js +121 -0
- package/.medusa/server/src/api/admin/masters/[master]/route.js +33 -0
- package/.medusa/server/src/api/admin/masters/middlewares.js +35 -0
- package/.medusa/server/src/api/admin/masters/query-config.js +14 -0
- package/.medusa/server/src/api/admin/masters/search-middleware.js +16 -0
- package/.medusa/server/src/api/admin/masters/utils.js +108 -0
- package/.medusa/server/src/api/admin/masters/validators.js +28 -0
- package/.medusa/server/src/api/admin/middlewares.js +6 -2
- package/.medusa/server/src/api/admin/variant-options/recalculate/route.js +446 -0
- package/.medusa/server/src/api/admin/variant-options/sync/route.js +329 -0
- package/.medusa/server/src/api/erp/webhook/config.js +37 -6
- package/.medusa/server/src/api/erp/webhook/route.js +10 -137
- package/.medusa/server/src/api/middlewares.js +3 -1
- package/.medusa/server/src/api/pos/gold-rate/middleware.js +13 -0
- package/.medusa/server/src/api/pos/gold-rate/route.js +96 -0
- package/.medusa/server/src/api/pos/middleware.js +13 -0
- package/.medusa/server/src/api/store/gold-rate/current/route.js +70 -0
- package/.medusa/server/src/api/store/gold-rate/historical/route.js +108 -0
- package/.medusa/server/src/api/store/gold-rate/middleware.js +19 -0
- package/.medusa/server/src/api/store/gold-rate/validators.js +37 -0
- package/.medusa/server/src/api/store/middleware.js +3 -1
- package/.medusa/server/src/jobs/process-erp-events.js +205 -0
- package/.medusa/server/src/jobs/process-variant-option-sync.js +536 -0
- package/.medusa/server/src/jobs/sync-order-erp.js +2 -2
- package/.medusa/server/src/modules/category-group-master/migrations/Migration20251031061116.js +14 -0
- package/.medusa/server/src/modules/category-group-master/migrations/Migration20251104045912.js +14 -0
- package/.medusa/server/src/modules/category-master/migrations/Migration20251031061327.js +14 -0
- package/.medusa/server/src/modules/category-master/migrations/Migration20251104045755.js +14 -0
- package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251031061432.js +14 -0
- package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251104050102.js +14 -0
- package/.medusa/server/src/modules/collection-master/migrations/Migration20251031060941.js +14 -0
- package/.medusa/server/src/modules/collection-master/migrations/Migration20251104050012.js +14 -0
- package/.medusa/server/src/modules/discount-master/migrations/Migration20251031061523.js +14 -0
- package/.medusa/server/src/modules/discount-master/migrations/Migration20251104050153.js +14 -0
- package/.medusa/server/src/modules/erp/service.js +59 -1
- package/.medusa/server/src/modules/extended-product/migrations/Migration20251103182726.js +14 -0
- package/.medusa/server/src/modules/extended-product/migrations/Migration20251119062526.js +16 -0
- package/.medusa/server/src/modules/extended-product/migrations/Migration20251202055742.js +14 -0
- package/.medusa/server/src/modules/extended-product/migrations/Migration20251202064200.js +16 -0
- package/.medusa/server/src/modules/extended-product/models/extended-product.js +89 -9
- package/.medusa/server/src/modules/extended-variant/migrations/Migration20251119063328.js +20 -0
- package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120045708.js +14 -0
- package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120051832.js +14 -0
- package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120052514.js +14 -0
- package/.medusa/server/src/modules/extended-variant/migrations/Migration20251202055952.js +14 -0
- package/.medusa/server/src/modules/extended-variant/models/extended-variant.js +145 -12
- package/.medusa/server/src/modules/item-size-master/index.js +13 -0
- package/.medusa/server/src/modules/item-size-master/migrations/Migration20251031111036.js +17 -0
- package/.medusa/server/src/modules/item-size-master/models/item-size-master.js +14 -0
- package/.medusa/server/src/modules/item-size-master/service.js +10 -0
- package/.medusa/server/src/modules/party-master/migrations/Migration20251031061657.js +14 -0
- package/.medusa/server/src/modules/party-master/migrations/Migration20251104050242.js +14 -0
- package/.medusa/server/src/modules/promocode-master/migrations/Migration20251031061829.js +14 -0
- package/.medusa/server/src/modules/promocode-master/migrations/Migration20251104050332.js +14 -0
- package/.medusa/server/src/modules/quality-master/index.js +13 -0
- package/.medusa/server/src/modules/quality-master/migrations/Migration20251031095211.js +16 -0
- package/.medusa/server/src/modules/quality-master/migrations/Migration20251105045114.js +14 -0
- package/.medusa/server/src/modules/quality-master/models/quality-master.js +17 -0
- package/.medusa/server/src/modules/quality-master/service.js +10 -0
- package/.medusa/server/src/modules/raw-master/migrations/Migration20251031061912.js +14 -0
- package/.medusa/server/src/modules/raw-master/models/raw-master.js +2 -1
- package/.medusa/server/src/modules/shape-master/migrations/Migration20251031062019.js +14 -0
- package/.medusa/server/src/modules/shape-master/models/shape-master.js +2 -1
- package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251031062128.js +14 -0
- package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251104050501.js +14 -0
- package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251203083315.js +16 -0
- package/.medusa/server/src/modules/shipping-info-master/models/shipping-info-master.js +2 -2
- package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251031062303.js +14 -0
- package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251104050743.js +14 -0
- package/.medusa/server/src/modules/tone-master/index.js +13 -0
- package/.medusa/server/src/modules/tone-master/migrations/Migration20251031104320.js +16 -0
- package/.medusa/server/src/modules/tone-master/models/tone-master.js +15 -0
- package/.medusa/server/src/modules/tone-master/service.js +10 -0
- package/.medusa/server/src/modules/variant-option-sync-queue/index.js +13 -0
- package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251101082220.js +19 -0
- package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251103123857.js +16 -0
- package/.medusa/server/src/modules/variant-option-sync-queue/models/variant-option-sync-queue.js +23 -0
- package/.medusa/server/src/modules/variant-option-sync-queue/service.js +49 -0
- package/.medusa/server/src/subscribers/cutomer-updated.js +2 -1
- package/.medusa/server/src/subscribers/party-master.js +35 -34
- package/.medusa/server/src/utils/build-redis-key.js +30 -0
- package/.medusa/server/src/workflows/create-or-update-product-options/steps/create-update-product-options.js +39 -2
- package/.medusa/server/src/workflows/helpers/product-helper.js +445 -115
- package/.medusa/server/src/workflows/helpers/update-variant-option-metadata.js +105 -0
- package/.medusa/server/src/workflows/helpers/variant-helper.js +215 -0
- package/.medusa/server/src/workflows/hooks/product-updated.js +6 -11
- package/.medusa/server/src/workflows/inward-master/helper/index.js +88 -39
- package/.medusa/server/src/workflows/inward-master/workflows/update-inward.js +6 -2
- package/.medusa/server/src/workflows/item-size-master/create-or-update-item-size-master.js +51 -0
- package/.medusa/server/src/workflows/item-size-master/index.js +15 -0
- package/.medusa/server/src/workflows/item-size-master/steps/create-item-size.js +21 -0
- package/.medusa/server/src/workflows/item-size-master/steps/delete-item-size.js +23 -0
- package/.medusa/server/src/workflows/item-size-master/steps/fetch-item-size-master.js +55 -0
- package/.medusa/server/src/workflows/item-size-master/steps/update-item-size.js +36 -0
- package/.medusa/server/src/workflows/orders/steps/sync-order-to-erp.js +3 -2
- package/.medusa/server/src/workflows/orders/utils/order-helper.js +6 -5
- package/.medusa/server/src/workflows/orders/workflows/sync-order-to-erp.js +27 -2
- package/.medusa/server/src/workflows/party-master/steps/delete-party.js +4 -7
- package/.medusa/server/src/workflows/party-master/steps/fetch-party-master.js +2 -1
- package/.medusa/server/src/workflows/party-master/workflows/create-or-update-party-master.js +2 -50
- package/.medusa/server/src/workflows/party-master/workflows/delete-party-master.js +60 -0
- package/.medusa/server/src/workflows/party-master/workflows/index.js +2 -1
- package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-deletion.js +80 -195
- package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-variant-update.js +448 -0
- package/.medusa/server/src/workflows/party-style-master/workflows/create-or-update-party-style-master.js +126 -4
- package/.medusa/server/src/workflows/quality-master/create-or-update-quality-master.js +58 -0
- package/.medusa/server/src/workflows/quality-master/index.js +30 -0
- package/.medusa/server/src/workflows/quality-master/steps/create-quality.js +22 -0
- package/.medusa/server/src/workflows/quality-master/steps/delete-quality.js +20 -0
- package/.medusa/server/src/workflows/quality-master/steps/fetch-quality-master.js +54 -0
- package/.medusa/server/src/workflows/quality-master/steps/update-quality.js +37 -0
- package/.medusa/server/src/workflows/raw-master/create-or-update-raw-master.js +58 -0
- package/.medusa/server/src/workflows/raw-master/steps/delete-raw.js +9 -11
- package/.medusa/server/src/workflows/shape-master/create-or-update-shape-master.js +53 -0
- package/.medusa/server/src/workflows/shape-master/steps/delete-shape.js +9 -9
- package/.medusa/server/src/workflows/style-master/workflows/create-or-update-style-master.js +2 -2
- package/.medusa/server/src/workflows/tone-master/create-or-update-tone-master.js +52 -0
- package/.medusa/server/src/workflows/tone-master/index.js +30 -0
- package/.medusa/server/src/workflows/tone-master/steps/create-tone.js +22 -0
- package/.medusa/server/src/workflows/tone-master/steps/delete-tone.js +20 -0
- package/.medusa/server/src/workflows/tone-master/steps/fetch-tone-master.js +54 -0
- package/.medusa/server/src/workflows/tone-master/steps/update-tone.js +37 -0
- package/.medusa/server/src/workflows/update-extended-product-from-product/index.js +6 -8
- package/.medusa/server/src/workflows/update-extended-variant-from-variant/workflows/update-extended-variant-status-from-variant.js +9 -3
- package/package.json +1 -1
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = processVariantOptionSync;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
7
|
+
const variant_option_sync_queue_1 = require("../modules/variant-option-sync-queue");
|
|
8
|
+
const variant_helper_1 = require("../workflows/helpers/variant-helper");
|
|
9
|
+
const update_variant_option_metadata_1 = require("../workflows/helpers/update-variant-option-metadata");
|
|
10
|
+
/**
|
|
11
|
+
/**
|
|
12
|
+
* This function processes queued variant/product option sync records
|
|
13
|
+
* (triggered by changes to master tables like Raw, Quality, Tone, Size).
|
|
14
|
+
*
|
|
15
|
+
* - It fetches all pending queue records,
|
|
16
|
+
* - Determines all affected variants and their products,
|
|
17
|
+
* - Regenerates option values for each variant based on master data,
|
|
18
|
+
* - Updates products to ensure their option lists include all required values,
|
|
19
|
+
* - Updates the product variants with the correct options,
|
|
20
|
+
* - Marks each queue record as complete or failed.
|
|
21
|
+
*/
|
|
22
|
+
async function processVariantOptionSync(container) {
|
|
23
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
24
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
25
|
+
const syncQueueService = container.resolve(variant_option_sync_queue_1.VARIANT_OPTION_SYNC_QUEUE_MODULE);
|
|
26
|
+
logger.info("------Starting variant option sync job------");
|
|
27
|
+
// Maximum records to process per run to balance efficiency and memory
|
|
28
|
+
const MAX_RECORDS_PER_RUN = 250;
|
|
29
|
+
let pendingRecords = [];
|
|
30
|
+
try {
|
|
31
|
+
// Process all pending records in one run to avoid redundant recalculations
|
|
32
|
+
const { data: records } = await query.graph({
|
|
33
|
+
entity: "variant_option_sync_queue",
|
|
34
|
+
fields: [
|
|
35
|
+
"id",
|
|
36
|
+
"master_type",
|
|
37
|
+
"master_code",
|
|
38
|
+
"master_id",
|
|
39
|
+
"old_title",
|
|
40
|
+
"new_title",
|
|
41
|
+
],
|
|
42
|
+
filters: {
|
|
43
|
+
status: "pending",
|
|
44
|
+
},
|
|
45
|
+
pagination: {
|
|
46
|
+
take: MAX_RECORDS_PER_RUN,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
pendingRecords = records || [];
|
|
50
|
+
if (!pendingRecords || pendingRecords.length === 0) {
|
|
51
|
+
logger.info("------No pending variant option sync records found------");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
logger.info(`------Found ${pendingRecords.length} pending records to process (max ${MAX_RECORDS_PER_RUN} per run)------`);
|
|
55
|
+
// Build master maps once for all records
|
|
56
|
+
const { data: rawMasterArr } = await query.graph({
|
|
57
|
+
entity: "raw_master",
|
|
58
|
+
fields: ["id", "title", "raw_code"],
|
|
59
|
+
});
|
|
60
|
+
const { data: qualityMasterArr } = await query.graph({
|
|
61
|
+
entity: "quality_master",
|
|
62
|
+
fields: ["id", "title", "qly_code"],
|
|
63
|
+
});
|
|
64
|
+
const { data: toneMasterArr } = await query.graph({
|
|
65
|
+
entity: "tone_master",
|
|
66
|
+
fields: ["id", "title", "tone_code"],
|
|
67
|
+
});
|
|
68
|
+
const { data: itemSizeMasterArr } = await query.graph({
|
|
69
|
+
entity: "item_size_master",
|
|
70
|
+
fields: ["id", "title", "item_size_code"],
|
|
71
|
+
});
|
|
72
|
+
const { data: shapeMasterArr } = await query.graph({
|
|
73
|
+
entity: "shape_master",
|
|
74
|
+
fields: ["id", "title", "shape_code"],
|
|
75
|
+
});
|
|
76
|
+
const rawMasterMap = new Map();
|
|
77
|
+
rawMasterArr?.forEach((x) => rawMasterMap.set(x.raw_code, x.title));
|
|
78
|
+
const qualityMasterMap = new Map();
|
|
79
|
+
qualityMasterArr?.forEach((x) => qualityMasterMap.set(x.qly_code, x.title));
|
|
80
|
+
const toneMasterMap = new Map();
|
|
81
|
+
toneMasterArr?.forEach((x) => toneMasterMap.set(x.tone_code, x.title));
|
|
82
|
+
const itemSizeMasterMap = new Map();
|
|
83
|
+
itemSizeMasterArr?.forEach((x) => itemSizeMasterMap.set(x.item_size_code, x.title));
|
|
84
|
+
const shapeMasterMap = new Map();
|
|
85
|
+
shapeMasterArr?.forEach((x) => shapeMasterMap.set(x.shape_code, x.title));
|
|
86
|
+
const masterMaps = {
|
|
87
|
+
rawMasterMap,
|
|
88
|
+
qualityMasterMap,
|
|
89
|
+
toneMasterMap,
|
|
90
|
+
itemSizeMasterMap,
|
|
91
|
+
shapeMasterMap,
|
|
92
|
+
};
|
|
93
|
+
// STEP 1: Collect all affected products across all records
|
|
94
|
+
// Update all records to processing status
|
|
95
|
+
await syncQueueService.updateVariantOptionSyncQueues(pendingRecords.map((r) => ({
|
|
96
|
+
id: r.id,
|
|
97
|
+
status: "processing",
|
|
98
|
+
})));
|
|
99
|
+
logger.info(`------Processing ${pendingRecords.length} pending records in ------`);
|
|
100
|
+
// Collect all affected products across all records
|
|
101
|
+
const affectedProductsSet = new Set();
|
|
102
|
+
const recordAffectedVariantCounts = new Map();
|
|
103
|
+
for (const record of pendingRecords) {
|
|
104
|
+
logger.info(`------Finding affected variants for record ${record.id}: ${record.master_type} - ${record.master_code}------`);
|
|
105
|
+
// Find affected variants
|
|
106
|
+
const affectedVariants = await (0, variant_helper_1.findVariantsAffectedByMasterUpdate)(query, record.master_type, record.master_code);
|
|
107
|
+
if (affectedVariants.length === 0) {
|
|
108
|
+
logger.info(`------No affected variants found for ${record.master_type} - ${record.master_code}------ (record id: ${record.id})`);
|
|
109
|
+
recordAffectedVariantCounts.set(record.id, 0);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// Collect affected product IDs (this is what we actually need)
|
|
113
|
+
affectedVariants.forEach((v) => affectedProductsSet.add(v.productId));
|
|
114
|
+
// Store only the count, not the full array to save memory
|
|
115
|
+
recordAffectedVariantCounts.set(record.id, affectedVariants.length);
|
|
116
|
+
logger.info(`------Found ${affectedVariants.length} affected variants for record ${record.id}------`);
|
|
117
|
+
}
|
|
118
|
+
const productIds = Array.from(affectedProductsSet);
|
|
119
|
+
if (productIds.length === 0) {
|
|
120
|
+
logger.info("------No affected products found, marking all records as completed------");
|
|
121
|
+
// Mark all records as completed with 0 affected variants
|
|
122
|
+
await syncQueueService.updateVariantOptionSyncQueues(pendingRecords.map((r) => ({
|
|
123
|
+
id: r.id,
|
|
124
|
+
status: "completed",
|
|
125
|
+
affected_variant_count: 0,
|
|
126
|
+
processed_at: new Date(),
|
|
127
|
+
})));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
logger.info(`------Found ${productIds.length} unique products affected across all records------`);
|
|
131
|
+
// STEP 2: Process products in batches
|
|
132
|
+
const PRODUCT_BATCH_SIZE = 5;
|
|
133
|
+
const productBatches = [];
|
|
134
|
+
for (let i = 0; i < productIds.length; i += PRODUCT_BATCH_SIZE) {
|
|
135
|
+
productBatches.push(productIds.slice(i, i + PRODUCT_BATCH_SIZE));
|
|
136
|
+
}
|
|
137
|
+
logger.info(`------Processing ${productIds.length} products in ${productBatches.length} batches of ${PRODUCT_BATCH_SIZE}------`);
|
|
138
|
+
// Process each product batch
|
|
139
|
+
for (let productBatchIndex = 0; productBatchIndex < productBatches.length; productBatchIndex++) {
|
|
140
|
+
const productBatch = productBatches[productBatchIndex];
|
|
141
|
+
logger.info(`------Processing product batch ${productBatchIndex + 1}/${productBatches.length} (${productBatch.length} products)------`);
|
|
142
|
+
// Get product all options for this batch
|
|
143
|
+
const { data: products } = await query.graph({
|
|
144
|
+
entity: "product",
|
|
145
|
+
fields: ["id", "external_id", "options.*"],
|
|
146
|
+
filters: {
|
|
147
|
+
id: productBatch,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
// Get all variants for products in this batch
|
|
151
|
+
const { data: variants } = await query.graph({
|
|
152
|
+
entity: "product_variant",
|
|
153
|
+
fields: [
|
|
154
|
+
"id",
|
|
155
|
+
"product_id",
|
|
156
|
+
"extended_variant.id",
|
|
157
|
+
"extended_variant.item_size",
|
|
158
|
+
"extended_variant.party_style_details.*",
|
|
159
|
+
],
|
|
160
|
+
filters: {
|
|
161
|
+
product_id: productBatch,
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
logger.info(`------Found ${variants?.length || 0} variants for product batch ${productBatchIndex + 1}------`);
|
|
165
|
+
if (!variants || variants.length === 0) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
// Get extended variant IDs
|
|
169
|
+
const extendedVariantIds = variants
|
|
170
|
+
.map((v) => v.extended_variant?.id)
|
|
171
|
+
.filter(Boolean);
|
|
172
|
+
// Get extended variants with party_style_details in batches
|
|
173
|
+
const EXTENDED_VARIANT_BATCH_SIZE = 100;
|
|
174
|
+
const extendedVariantBatches = [];
|
|
175
|
+
for (let i = 0; i < extendedVariantIds.length; i += EXTENDED_VARIANT_BATCH_SIZE) {
|
|
176
|
+
extendedVariantBatches.push(extendedVariantIds.slice(i, i + EXTENDED_VARIANT_BATCH_SIZE));
|
|
177
|
+
}
|
|
178
|
+
const allExtendedVariants = [];
|
|
179
|
+
for (let evBatchIndex = 0; evBatchIndex < extendedVariantBatches.length; evBatchIndex++) {
|
|
180
|
+
const evBatch = extendedVariantBatches[evBatchIndex];
|
|
181
|
+
const { data: extendedVariants } = await query.graph({
|
|
182
|
+
entity: "extended_variant",
|
|
183
|
+
fields: ["id", "item_size", "stock_type", "party_style_details.*"],
|
|
184
|
+
filters: {
|
|
185
|
+
id: evBatch,
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
if (extendedVariants) {
|
|
189
|
+
allExtendedVariants.push(...extendedVariants);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
logger.info(`------Found ${allExtendedVariants.length} extended variants for product batch ${productBatchIndex + 1}------`);
|
|
193
|
+
// Calculate variant options for this batch
|
|
194
|
+
const productOptionsMap = new Map();
|
|
195
|
+
const variantsToUpdate = [];
|
|
196
|
+
// Track raw values for metadata updates
|
|
197
|
+
const rawValueMappings = [];
|
|
198
|
+
for (const variant of variants) {
|
|
199
|
+
const productId = variant.product_id;
|
|
200
|
+
if (!productId)
|
|
201
|
+
continue;
|
|
202
|
+
const product = products?.find((p) => p.id === productId);
|
|
203
|
+
const extendedVariant = allExtendedVariants.find((ev) => ev.id === variant.extended_variant?.id);
|
|
204
|
+
if (!product || !extendedVariant)
|
|
205
|
+
continue;
|
|
206
|
+
// Initialize product options map if not exists
|
|
207
|
+
if (!productOptionsMap.has(productId)) {
|
|
208
|
+
productOptionsMap.set(productId, new Map());
|
|
209
|
+
}
|
|
210
|
+
const productOptionMap = productOptionsMap.get(productId);
|
|
211
|
+
// Generate options from extended variant data
|
|
212
|
+
const variantOptions = {};
|
|
213
|
+
// Detect solitaire styles based on stock_type
|
|
214
|
+
const stockType = extendedVariant?.stock_type;
|
|
215
|
+
const isSolitaire = stockType === "LG SOLITAIRE" || stockType === "SOLITAIRE";
|
|
216
|
+
// Size
|
|
217
|
+
if (extendedVariant.item_size) {
|
|
218
|
+
const sizeTitle = (masterMaps.itemSizeMasterMap.get(extendedVariant.item_size) ||
|
|
219
|
+
String(extendedVariant.item_size)).trim();
|
|
220
|
+
const sizeOption = product.options?.find((opt) => opt.title === "Size");
|
|
221
|
+
if (sizeOption) {
|
|
222
|
+
variantOptions["Size"] = sizeTitle;
|
|
223
|
+
if (!productOptionMap.has("Size")) {
|
|
224
|
+
productOptionMap.set("Size", new Set());
|
|
225
|
+
}
|
|
226
|
+
productOptionMap.get("Size").add(sizeTitle);
|
|
227
|
+
// Track raw value for metadata
|
|
228
|
+
rawValueMappings.push({
|
|
229
|
+
variantId: variant.id,
|
|
230
|
+
optionTitle: "Size",
|
|
231
|
+
optionValue: sizeTitle,
|
|
232
|
+
rawValue: extendedVariant.item_size,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Process party_style_details for metals, metal colors, diamond qualities, shapes and solitaire carat
|
|
237
|
+
if (extendedVariant.party_style_details) {
|
|
238
|
+
// First, find diamond details for processing
|
|
239
|
+
const diamondDetails = extendedVariant.party_style_details.filter((detail) => detail.raw_type === "Diamond" &&
|
|
240
|
+
detail.tone_code &&
|
|
241
|
+
detail.qly_code);
|
|
242
|
+
const baseDiamondDetail = diamondDetails.find((detail) => detail.is_base);
|
|
243
|
+
const diamondDetailToUse = baseDiamondDetail || diamondDetails[0];
|
|
244
|
+
// For solitaire shapes/carat, find LGS diamond details
|
|
245
|
+
const lgsDiamondDetails = extendedVariant.party_style_details.filter((detail) => isSolitaire &&
|
|
246
|
+
detail.raw_type === "Diamond" &&
|
|
247
|
+
detail.raw_code === "LGS");
|
|
248
|
+
const baseLgsDiamondDetail = lgsDiamondDetails.find((detail) => detail.is_base);
|
|
249
|
+
const lgsDiamondDetailToUse = baseLgsDiamondDetail || lgsDiamondDetails[0];
|
|
250
|
+
for (const detail of extendedVariant.party_style_details) {
|
|
251
|
+
// Metal options
|
|
252
|
+
if (detail.raw_type === "Metal" && detail.is_base) {
|
|
253
|
+
const qualityTitle = (masterMaps.qualityMasterMap.get(detail.qly_code) ||
|
|
254
|
+
detail.qly_code).trim();
|
|
255
|
+
const rawTitle = (masterMaps.rawMasterMap.get(detail.raw_code) || detail.raw_code).trim();
|
|
256
|
+
const metalValue = `${qualityTitle} ${rawTitle}`.trim();
|
|
257
|
+
const metalOption = product.options?.find((opt) => opt.title === "Metal");
|
|
258
|
+
if (metalOption) {
|
|
259
|
+
variantOptions["Metal"] = metalValue;
|
|
260
|
+
if (!productOptionMap.has("Metal")) {
|
|
261
|
+
productOptionMap.set("Metal", new Set());
|
|
262
|
+
}
|
|
263
|
+
productOptionMap.get("Metal").add(metalValue);
|
|
264
|
+
// Track raw values for metadata (combine raw_code and qly_code)
|
|
265
|
+
rawValueMappings.push({
|
|
266
|
+
variantId: variant.id,
|
|
267
|
+
optionTitle: "Metal",
|
|
268
|
+
optionValue: metalValue,
|
|
269
|
+
rawValue: `${detail.qly_code || ""}:${detail.raw_code || ""}`.trim(),
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
// Metal Color
|
|
273
|
+
if (detail.tone_code) {
|
|
274
|
+
let colorTitle = masterMaps.toneMasterMap.get(detail.tone_code) ||
|
|
275
|
+
detail.tone_code;
|
|
276
|
+
// Fallback to static mappings if not in master
|
|
277
|
+
if (!masterMaps.toneMasterMap.has(detail.tone_code)) {
|
|
278
|
+
if (detail.tone_code === "R")
|
|
279
|
+
colorTitle = "Rose";
|
|
280
|
+
else if (detail.tone_code === "Y")
|
|
281
|
+
colorTitle = "Yellow";
|
|
282
|
+
else if (detail.tone_code === "W")
|
|
283
|
+
colorTitle = "White";
|
|
284
|
+
else if (detail.tone_code === "YRW")
|
|
285
|
+
colorTitle = "YELLOW/ROSE/WHITE";
|
|
286
|
+
else if (detail.tone_code === "YW")
|
|
287
|
+
colorTitle = "YELLOW/WHITE";
|
|
288
|
+
else if (detail.tone_code === "RW")
|
|
289
|
+
colorTitle = "ROSE/WHITE";
|
|
290
|
+
else if (detail.tone_code === "BU")
|
|
291
|
+
colorTitle = "BLUE";
|
|
292
|
+
else if (detail.tone_code === "BL")
|
|
293
|
+
colorTitle = "BLACK";
|
|
294
|
+
}
|
|
295
|
+
colorTitle = colorTitle.trim();
|
|
296
|
+
const metalColorOption = product.options?.find((opt) => opt.title === "Metal Color");
|
|
297
|
+
if (metalColorOption) {
|
|
298
|
+
variantOptions["Metal Color"] = colorTitle;
|
|
299
|
+
if (!productOptionMap.has("Metal Color")) {
|
|
300
|
+
productOptionMap.set("Metal Color", new Set());
|
|
301
|
+
}
|
|
302
|
+
productOptionMap.get("Metal Color").add(colorTitle);
|
|
303
|
+
// Track raw value for metadata
|
|
304
|
+
rawValueMappings.push({
|
|
305
|
+
variantId: variant.id,
|
|
306
|
+
optionTitle: "Metal Color",
|
|
307
|
+
optionValue: colorTitle,
|
|
308
|
+
rawValue: detail.tone_code || "",
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Diamond Quality
|
|
314
|
+
if (diamondDetailToUse &&
|
|
315
|
+
detail === diamondDetailToUse) {
|
|
316
|
+
const toneTitle = (masterMaps.toneMasterMap.get(detail.tone_code) ||
|
|
317
|
+
detail.tone_code).trim();
|
|
318
|
+
const qualityTitle = (masterMaps.qualityMasterMap.get(detail.qly_code) ||
|
|
319
|
+
detail.qly_code).trim();
|
|
320
|
+
const diamondValue = `${toneTitle} ${qualityTitle}`.trim();
|
|
321
|
+
const diamondOption = product.options?.find((opt) => opt.title === "Diamond Quality");
|
|
322
|
+
if (diamondOption) {
|
|
323
|
+
variantOptions["Diamond Quality"] = diamondValue;
|
|
324
|
+
if (!productOptionMap.has("Diamond Quality")) {
|
|
325
|
+
productOptionMap.set("Diamond Quality", new Set());
|
|
326
|
+
}
|
|
327
|
+
productOptionMap.get("Diamond Quality").add(diamondValue);
|
|
328
|
+
// Track raw values for metadata (combine tone_code and qly_code)
|
|
329
|
+
rawValueMappings.push({
|
|
330
|
+
variantId: variant.id,
|
|
331
|
+
optionTitle: "Diamond Quality",
|
|
332
|
+
optionValue: diamondValue,
|
|
333
|
+
rawValue: `${detail.tone_code || ""}:${detail.qly_code || ""}`.trim(),
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Shape and Carat logic
|
|
338
|
+
if (lgsDiamondDetailToUse &&
|
|
339
|
+
detail === lgsDiamondDetailToUse) {
|
|
340
|
+
// Use the shape from the LGS base diamond detail
|
|
341
|
+
const shapeTitle = (masterMaps.shapeMasterMap.get(detail.shape_code) ||
|
|
342
|
+
String(detail.shape_code || "")).trim();
|
|
343
|
+
if (shapeTitle) {
|
|
344
|
+
const shapeOption = product.options?.find((opt) => opt.title === "Shape");
|
|
345
|
+
if (shapeOption) {
|
|
346
|
+
variantOptions["Shape"] = shapeTitle;
|
|
347
|
+
if (!productOptionMap.has("Shape")) {
|
|
348
|
+
productOptionMap.set("Shape", new Set());
|
|
349
|
+
}
|
|
350
|
+
productOptionMap.get("Shape").add(shapeTitle);
|
|
351
|
+
// Track raw value for metadata
|
|
352
|
+
rawValueMappings.push({
|
|
353
|
+
variantId: variant.id,
|
|
354
|
+
optionTitle: "Shape",
|
|
355
|
+
optionValue: shapeTitle,
|
|
356
|
+
rawValue: detail.shape_code || "",
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// Carat from detail weight
|
|
361
|
+
const weightStr = String(detail?.weight || "").trim();
|
|
362
|
+
if (weightStr) {
|
|
363
|
+
variantOptions["Carat"] = weightStr;
|
|
364
|
+
if (!productOptionMap.has("Carat")) {
|
|
365
|
+
productOptionMap.set("Carat", new Set());
|
|
366
|
+
}
|
|
367
|
+
productOptionMap.get("Carat").add(weightStr);
|
|
368
|
+
// Track raw value for metadata (weight is already the raw value)
|
|
369
|
+
rawValueMappings.push({
|
|
370
|
+
variantId: variant.id,
|
|
371
|
+
optionTitle: "Carat",
|
|
372
|
+
optionValue: weightStr,
|
|
373
|
+
rawValue: weightStr,
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// Get the product's required option titles
|
|
380
|
+
const productOptionTitles = product.options?.map((opt) => opt.title) || [];
|
|
381
|
+
// Sort variant options keys alphabetically for consistent ordering
|
|
382
|
+
const sortedVariantOptions = {};
|
|
383
|
+
const sortedKeys = Object.keys(variantOptions).sort((a, b) => a.localeCompare(b));
|
|
384
|
+
for (const key of sortedKeys) {
|
|
385
|
+
sortedVariantOptions[key] = variantOptions[key];
|
|
386
|
+
}
|
|
387
|
+
// Validate: Check if we have all required options for the product
|
|
388
|
+
// Skip variants with incomplete options to prevent batch failure
|
|
389
|
+
const hasAllOptions = productOptionTitles.every((title) => sortedVariantOptions[title] !== undefined);
|
|
390
|
+
if (!hasAllOptions) {
|
|
391
|
+
logger.warn(`------Variant ${variant.id} has incomplete options. ` +
|
|
392
|
+
`Product requires: [${productOptionTitles.join(", ")}], ` +
|
|
393
|
+
`Variant has: [${Object.keys(sortedVariantOptions).join(", ")}]. ` +
|
|
394
|
+
`Skipping to prevent batch failure.------`);
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
variantsToUpdate.push({
|
|
398
|
+
variant: {
|
|
399
|
+
id: variant.id,
|
|
400
|
+
options: sortedVariantOptions,
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
// Update products for this batch FIRST
|
|
405
|
+
const productsToUpdate = Array.from(productOptionsMap.entries()).map(([productId, optionsMap]) => {
|
|
406
|
+
const options = Array.from(optionsMap.entries())
|
|
407
|
+
.sort(([titleA], [titleB]) => titleA.localeCompare(titleB)) // Sort option titles alphabetically
|
|
408
|
+
.map(([title, values]) => ({
|
|
409
|
+
title,
|
|
410
|
+
values: Array.from(values).sort((a, b) => a.localeCompare(b)), // Sort option values alphabetically
|
|
411
|
+
}));
|
|
412
|
+
return {
|
|
413
|
+
id: productId,
|
|
414
|
+
options,
|
|
415
|
+
};
|
|
416
|
+
});
|
|
417
|
+
if (productsToUpdate.length > 0) {
|
|
418
|
+
logger.info(`------Updating ${productsToUpdate.length} products in batch ${productBatchIndex + 1}------`);
|
|
419
|
+
await (0, core_flows_1.updateProductsWorkflow)(container).run({
|
|
420
|
+
input: {
|
|
421
|
+
products: productsToUpdate,
|
|
422
|
+
},
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
// Update all variants for this batch at once
|
|
426
|
+
if (variantsToUpdate.length > 0) {
|
|
427
|
+
logger.info(`------Updating ${variantsToUpdate.length} variants for product batch ${productBatchIndex + 1}------`);
|
|
428
|
+
await (0, core_flows_1.updateProductVariantsWorkflow)(container).run({
|
|
429
|
+
input: {
|
|
430
|
+
product_variants: variantsToUpdate.map((v) => v.variant),
|
|
431
|
+
},
|
|
432
|
+
});
|
|
433
|
+
logger.info(`------Completed variant updates for product batch ${productBatchIndex + 1}------`);
|
|
434
|
+
// Update variant option metadata with raw values
|
|
435
|
+
if (rawValueMappings.length > 0) {
|
|
436
|
+
logger.info(`------Updating metadata for ${rawValueMappings.length} variant options in batch ${productBatchIndex + 1}------`);
|
|
437
|
+
await (0, update_variant_option_metadata_1.updateVariantOptionMetadata)(container, rawValueMappings);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
logger.info(`------Completed processing all product batches------`);
|
|
442
|
+
// Final consistency check - recalculate product options from all updated variants
|
|
443
|
+
logger.info(`------Performing final consistency check for all ${productIds.length} products------`);
|
|
444
|
+
// Process final recalculation in batches
|
|
445
|
+
for (let productBatchIndex = 0; productBatchIndex < productBatches.length; productBatchIndex++) {
|
|
446
|
+
const productBatch = productBatches[productBatchIndex];
|
|
447
|
+
// Get all variants again after update to collect latest option values
|
|
448
|
+
const { data: updatedVariants } = await query.graph({
|
|
449
|
+
entity: "product_variant",
|
|
450
|
+
fields: ["id", "product_id", "options.*", "options.option.title"],
|
|
451
|
+
filters: {
|
|
452
|
+
product_id: productBatch,
|
|
453
|
+
},
|
|
454
|
+
});
|
|
455
|
+
// Group options by product_id, then by title within each product
|
|
456
|
+
const finalProductOptionsMap = new Map();
|
|
457
|
+
updatedVariants.forEach((variant) => {
|
|
458
|
+
const productId = variant.product_id;
|
|
459
|
+
if (!productId)
|
|
460
|
+
return;
|
|
461
|
+
if (!finalProductOptionsMap.has(productId)) {
|
|
462
|
+
finalProductOptionsMap.set(productId, new Map());
|
|
463
|
+
}
|
|
464
|
+
const optionsMap = finalProductOptionsMap.get(productId);
|
|
465
|
+
variant.options?.forEach((optionValue) => {
|
|
466
|
+
const title = optionValue.option?.title;
|
|
467
|
+
const value = optionValue.value;
|
|
468
|
+
if (title && value) {
|
|
469
|
+
if (!optionsMap.has(title)) {
|
|
470
|
+
optionsMap.set(title, new Set());
|
|
471
|
+
}
|
|
472
|
+
optionsMap.get(title).add(value);
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
// Convert to products array format for final update
|
|
477
|
+
const finalProductsToUpdate = Array.from(finalProductOptionsMap.entries()).map(([productId, optionsMap]) => {
|
|
478
|
+
const options = Array.from(optionsMap.entries())
|
|
479
|
+
.sort(([titleA], [titleB]) => titleA.localeCompare(titleB)) // Sort option titles alphabetically
|
|
480
|
+
.map(([title, values]) => ({
|
|
481
|
+
title,
|
|
482
|
+
values: Array.from(values).sort((a, b) => a.localeCompare(b)), // Sort option values alphabetically
|
|
483
|
+
}));
|
|
484
|
+
return {
|
|
485
|
+
id: productId,
|
|
486
|
+
options,
|
|
487
|
+
};
|
|
488
|
+
});
|
|
489
|
+
// Final update of products with all option values from updated variants
|
|
490
|
+
if (finalProductsToUpdate.length > 0) {
|
|
491
|
+
logger.info(`------Final update of ${finalProductsToUpdate.length} products in batch ${productBatchIndex + 1}------`);
|
|
492
|
+
await (0, core_flows_1.updateProductsWorkflow)(container).run({
|
|
493
|
+
input: {
|
|
494
|
+
products: finalProductsToUpdate,
|
|
495
|
+
},
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
logger.info(`------Final consistency check completed for all products------`);
|
|
500
|
+
// STEP 7: Mark all records as completed
|
|
501
|
+
const recordsToComplete = [];
|
|
502
|
+
for (const record of pendingRecords) {
|
|
503
|
+
const affectedCount = recordAffectedVariantCounts.get(record.id) || 0;
|
|
504
|
+
recordsToComplete.push({
|
|
505
|
+
id: record.id,
|
|
506
|
+
status: "completed",
|
|
507
|
+
affected_variant_count: affectedCount,
|
|
508
|
+
processed_at: new Date(),
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
await syncQueueService.updateVariantOptionSyncQueues(recordsToComplete);
|
|
512
|
+
logger.info(`------Completed processing ${pendingRecords.length} records------`);
|
|
513
|
+
logger.info("------Variant option sync job completed------");
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
logger.error("------Error in variant option sync job:------", error);
|
|
517
|
+
// Mark all records as failed
|
|
518
|
+
try {
|
|
519
|
+
await syncQueueService.updateVariantOptionSyncQueues(pendingRecords.map((r) => ({
|
|
520
|
+
id: r.id,
|
|
521
|
+
status: "failed",
|
|
522
|
+
error_message: error?.message || "Unknown error",
|
|
523
|
+
processed_at: new Date(),
|
|
524
|
+
})));
|
|
525
|
+
}
|
|
526
|
+
catch (updateError) {
|
|
527
|
+
logger.error("------Error marking records as failed:------", updateError);
|
|
528
|
+
}
|
|
529
|
+
throw error;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
exports.config = {
|
|
533
|
+
name: "process-variant-option-sync",
|
|
534
|
+
schedule: "0 2 * * *", // Every day at 2:00 AM
|
|
535
|
+
};
|
|
536
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy12YXJpYW50LW9wdGlvbi1zeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2pvYnMvcHJvY2Vzcy12YXJpYW50LW9wdGlvbi1zeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQThCQSwyQ0Fzc0JDO0FBbnVCRCxxREFBc0U7QUFDdEUsNERBR3FDO0FBRXJDLG9GQUF3RjtBQUN4Rix3RUFHNkM7QUFDN0Msd0dBRzZEO0FBRzdEOzs7Ozs7Ozs7OztJQVdJO0FBQ1csS0FBSyxVQUFVLHdCQUF3QixDQUNwRCxTQUEwQjtJQUUxQixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsTUFBTSxnQkFBZ0IsR0FBa0MsU0FBUyxDQUFDLE9BQU8sQ0FDdkUsNERBQWdDLENBQ2pDLENBQUM7SUFFRixNQUFNLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFFNUQsc0VBQXNFO0lBQ3RFLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0lBRWhDLElBQUksY0FBYyxHQUFVLEVBQUUsQ0FBQztJQUUvQixJQUFJLENBQUM7UUFDSCwyRUFBMkU7UUFDM0UsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDMUMsTUFBTSxFQUFFLDJCQUEyQjtZQUNuQyxNQUFNLEVBQUU7Z0JBQ04sSUFBSTtnQkFDSixhQUFhO2dCQUNiLGFBQWE7Z0JBQ2IsV0FBVztnQkFDWCxXQUFXO2dCQUNYLFdBQVc7YUFDWjtZQUNELE9BQU8sRUFBRTtnQkFDUCxNQUFNLEVBQUUsU0FBUzthQUNsQjtZQUNELFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsbUJBQW1CO2FB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
|
|
@@ -18,7 +18,7 @@ async function syncOrderErp(container) {
|
|
|
18
18
|
pagination: { skip: 0, take: 100 },
|
|
19
19
|
});
|
|
20
20
|
console.log("Pushing orders to ERP", orders.length);
|
|
21
|
-
const capturedOrders = orders.filter((o) => o
|
|
21
|
+
const capturedOrders = orders.filter((o) => o?.payment_collections[0]?.status === "completed");
|
|
22
22
|
console.log("capturedOrders", capturedOrders);
|
|
23
23
|
for (const order of capturedOrders) {
|
|
24
24
|
await (0, orders_1.syncOrderToErpWorkflow)(container).run({
|
|
@@ -32,4 +32,4 @@ exports.config = {
|
|
|
32
32
|
name: "sync-order-erp",
|
|
33
33
|
schedule: "*/5 * * * *", // Every 5 minutes
|
|
34
34
|
};
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1vcmRlci1lcnAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy9zeW5jLW9yZGVyLWVycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSwrQkE2QkM7QUFoQ0QscURBQXNFO0FBQ3RFLGdEQUE2RDtBQUU5QyxLQUFLLFVBQVUsWUFBWSxDQUFDLFNBQTBCO0lBQ25FLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekMsTUFBTSxFQUFFLE9BQU87UUFDZixNQUFNLEVBQUU7WUFDTixJQUFJO1lBQ0osWUFBWTtZQUNaLHVCQUF1QjtZQUN2QixnQ0FBZ0M7U0FDakM7UUFDRCxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO1FBQzlCLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtLQUNuQyxDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVwRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUNsQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sS0FBSyxXQUFXLENBQzlELENBQUM7SUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRTlDLEtBQUssTUFBTSxLQUFLLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFBLCtCQUFzQixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMxQyxLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO2FBQ25CO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLFFBQVEsRUFBRSxhQUFhLEVBQUUsa0JBQWtCO0NBQzVDLENBQUMifQ==
|
package/.medusa/server/src/modules/category-group-master/migrations/Migration20251031061116.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20251031061116 = void 0;
|
|
4
|
+
const migrations_1 = require("@mikro-orm/migrations");
|
|
5
|
+
class Migration20251031061116 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`alter table if exists "category_group_master" add column if not exists "title" text null;`);
|
|
8
|
+
}
|
|
9
|
+
async down() {
|
|
10
|
+
this.addSql(`alter table if exists "category_group_master" drop column if exists "title";`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.Migration20251031061116 = Migration20251031061116;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTEwMzEwNjExMTYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYXRlZ29yeS1ncm91cC1tYXN0ZXIvbWlncmF0aW9ucy9NaWdyYXRpb24yMDI1MTAzMTA2MTExNi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzREFBa0Q7QUFFbEQsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUUzQyxLQUFLLENBQUMsRUFBRTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsMkZBQTJGLENBQUMsQ0FBQztJQUMzRyxDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO0lBQzlGLENBQUM7Q0FFRjtBQVZELDBEQVVDIn0=
|
package/.medusa/server/src/modules/category-group-master/migrations/Migration20251104045912.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20251104045912 = void 0;
|
|
4
|
+
const migrations_1 = require("@mikro-orm/migrations");
|
|
5
|
+
class Migration20251104045912 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`alter table if exists "category_group_master" drop column if exists "title";`);
|
|
8
|
+
}
|
|
9
|
+
async down() {
|
|
10
|
+
this.addSql(`alter table if exists "category_group_master" add column if not exists "title" text null;`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.Migration20251104045912 = Migration20251104045912;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTExMDQwNDU5MTIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYXRlZ29yeS1ncm91cC1tYXN0ZXIvbWlncmF0aW9ucy9NaWdyYXRpb24yMDI1MTEwNDA0NTkxMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzREFBa0Q7QUFFbEQsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUUzQyxLQUFLLENBQUMsRUFBRTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsOEVBQThFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQywyRkFBMkYsQ0FBQyxDQUFDO0lBQzNHLENBQUM7Q0FFRjtBQVZELDBEQVVDIn0=
|