@devx-commerce/plugin-gati 0.0.2-beta.1 → 0.0.2-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 (28) hide show
  1. package/.medusa/server/src/api/erp/webhook/route.js +11 -14
  2. package/.medusa/server/src/links/extended-product.js +10 -0
  3. package/.medusa/server/src/links/extended-variant.js +10 -0
  4. package/.medusa/server/src/modules/erp/service.js +1 -1
  5. package/.medusa/server/src/modules/extended-product/index.js +13 -0
  6. package/.medusa/server/src/modules/extended-product/migrations/Migration20250426103546.js +21 -0
  7. package/.medusa/server/src/modules/extended-product/models/extended-product.js +116 -0
  8. package/.medusa/server/src/modules/extended-product/service.js +11 -0
  9. package/.medusa/server/src/modules/extended-variant/index.js +13 -0
  10. package/.medusa/server/src/modules/extended-variant/migrations/Migration20250430062016.js +27 -0
  11. package/.medusa/server/src/modules/extended-variant/models/extended-variant.js +130 -0
  12. package/.medusa/server/src/modules/extended-variant/service.js +12 -0
  13. package/.medusa/server/src/workflows/create-extended-product-from-product/index.js +56 -0
  14. package/.medusa/server/src/workflows/create-extended-product-from-product/steps/create-extended-product.js +18 -0
  15. package/.medusa/server/src/workflows/create-extended-product-from-product/steps/create-style-detail-lines.js +25 -0
  16. package/.medusa/server/src/workflows/create-or-update-party-style-master/index.js +22 -0
  17. package/.medusa/server/src/workflows/create-or-update-party-style-master/steps/fetch-party-styles.js +70 -0
  18. package/.medusa/server/src/workflows/create-or-update-style-master/index.js +24 -97
  19. package/.medusa/server/src/workflows/create-or-update-style-master/steps/fetch-styles.js +70 -0
  20. package/.medusa/server/src/workflows/helpers/product-helper.js +165 -7
  21. package/.medusa/server/src/workflows/hooks/product-created.js +16 -0
  22. package/.medusa/server/src/workflows/hooks/product-updated.js +16 -0
  23. package/.medusa/server/src/workflows/types/index.js +9 -1
  24. package/.medusa/server/src/workflows/update-extended-product-from-product/index.js +31 -0
  25. package/.medusa/server/src/workflows/update-extended-product-from-product/steps/update-extended-product-from-product.js +36 -0
  26. package/.medusa/server/src/workflows/update-extended-product-from-product/steps/update-extended-product-with-field.js +15 -0
  27. package/package.json +1 -1
  28. package/.medusa/server/src/workflows/create-or-update-style-master/steps/index.js +0 -68
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateExtendedProductFromProductWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ const update_extended_product_from_product_1 = require("./steps/update-extended-product-from-product");
7
+ exports.updateExtendedProductFromProductWorkflow = (0, workflows_sdk_1.createWorkflow)("update-extended-product-from-product", (input) => {
8
+ const { data: products } = (0, core_flows_1.useQueryGraphStep)({
9
+ entity: "product",
10
+ fields: ["extended_product.*", "extended_product.style_details.*"],
11
+ filters: {
12
+ id: input.product.id,
13
+ },
14
+ });
15
+ const updated = (0, workflows_sdk_1.when)({
16
+ input,
17
+ products,
18
+ }, (data) => data.products[0].extended_product !== undefined &&
19
+ data.input.additional_data?.extendedProductData !== undefined).then(() => {
20
+ return (0, update_extended_product_from_product_1.updateExtendedProductStep)({
21
+ existingProduct: products[0],
22
+ extendedProduct: input.additional_data
23
+ ?.extendedProductData,
24
+ styleDetails: input.additional_data?.styleDetails,
25
+ });
26
+ });
27
+ return new workflows_sdk_1.WorkflowResponse({
28
+ updated,
29
+ });
30
+ });
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3VwZGF0ZS1leHRlbmRlZC1wcm9kdWN0LWZyb20tcHJvZHVjdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxRUFJMkM7QUFDM0MsNERBQWdFO0FBR2hFLHVHQUF5RjtBQVU1RSxRQUFBLHdDQUF3QyxHQUFHLElBQUEsOEJBQWMsRUFDcEUsc0NBQXNDLEVBQ3RDLENBQUMsS0FBZ0QsRUFBRSxFQUFFO0lBQ25ELE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBQSw4QkFBaUIsRUFBQztRQUMzQyxNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxrQ0FBa0MsQ0FBQztRQUNsRSxPQUFPLEVBQUU7WUFDUCxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1NBQ3JCO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLEdBQUcsSUFBQSxvQkFBSSxFQUNsQjtRQUNFLEtBQUs7UUFDTCxRQUFRO0tBQ1QsRUFDRCxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTO1FBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLG1CQUFtQixLQUFLLFNBQVMsQ0FDaEUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1YsT0FBTyxJQUFBLGdFQUF5QixFQUFDO1lBQy9CLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzVCLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtnQkFDcEMsRUFBRSxtQkFBa0M7WUFDdEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsWUFBaUM7U0FDdkUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksZ0NBQWdCLENBQUM7UUFDMUIsT0FBTztLQUNSLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FDRixDQUFDIn0=
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateExtendedProductStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const extended_product_1 = require("../../../modules/extended-product");
6
+ exports.updateExtendedProductStep = (0, workflows_sdk_1.createStep)("update-extended-product", async ({ extendedProduct, styleDetails, existingProduct, }, { container }) => {
7
+ const extendedProductService = container.resolve(extended_product_1.EXTENDED_PRODUCT_MODULE);
8
+ const prevData = await extendedProductService.retrieveExtendedProduct(existingProduct.extended_product.id, {
9
+ relations: ["style_details"],
10
+ });
11
+ await extendedProductService.deleteStyleDetailsLines(prevData.style_details.map((i) => i.id));
12
+ const formattedLines = styleDetails.map((line) => ({
13
+ ...line,
14
+ extended_product: existingProduct.extended_product.id,
15
+ }));
16
+ const linesResult = await extendedProductService.createStyleDetailsLines([
17
+ ...formattedLines,
18
+ ]);
19
+ const custom = await extendedProductService.updateExtendedProducts({
20
+ id: existingProduct?.extended_product?.id,
21
+ ...extendedProduct,
22
+ style_date: new Date(extendedProduct.style_date),
23
+ style_details: linesResult.map((i) => i.id),
24
+ });
25
+ return new workflows_sdk_1.StepResponse(custom, prevData);
26
+ }, async (prevData, { container }) => {
27
+ if (!prevData) {
28
+ return;
29
+ }
30
+ const extendedProductService = container.resolve(extended_product_1.EXTENDED_PRODUCT_MODULE);
31
+ await extendedProductService.updateExtendedProducts({
32
+ ...prevData,
33
+ style_details: prevData.style_details.map((detail) => detail.id),
34
+ });
35
+ });
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWV4dGVuZGVkLXByb2R1Y3QtZnJvbS1wcm9kdWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy91cGRhdGUtZXh0ZW5kZWQtcHJvZHVjdC1mcm9tLXByb2R1Y3Qvc3RlcHMvdXBkYXRlLWV4dGVuZGVkLXByb2R1Y3QtZnJvbS1wcm9kdWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE2RTtBQUM3RSx3RUFBNEU7QUFVL0QsUUFBQSx5QkFBeUIsR0FBRyxJQUFBLDBCQUFVLEVBQ2pELHlCQUF5QixFQUN6QixLQUFLLEVBQ0gsRUFDRSxlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsR0FDZ0IsRUFDakMsRUFBRSxTQUFTLEVBQUUsRUFDYixFQUFFO0lBQ0YsTUFBTSxzQkFBc0IsR0FBMkIsU0FBUyxDQUFDLE9BQU8sQ0FDdEUsMENBQXVCLENBQ3hCLENBQUM7SUFFRixNQUFNLFFBQVEsR0FBRyxNQUFNLHNCQUFzQixDQUFDLHVCQUF1QixDQUNuRSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUNuQztRQUNFLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQztLQUM3QixDQUNGLENBQUM7SUFFRixNQUFNLHNCQUFzQixDQUFDLHVCQUF1QixDQUNsRCxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUN4QyxDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRCxHQUFHLElBQUk7UUFDUCxnQkFBZ0IsRUFBRSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtLQUN0RCxDQUFDLENBQUMsQ0FBQztJQUVKLE1BQU0sV0FBVyxHQUFHLE1BQU0sc0JBQXNCLENBQUMsdUJBQXVCLENBQUM7UUFDdkUsR0FBRyxjQUFjO0tBQ2xCLENBQUMsQ0FBQztJQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQXNCLENBQUMsc0JBQXNCLENBQUM7UUFDakUsRUFBRSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFO1FBQ3pDLEdBQUcsZUFBZTtRQUNsQixVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztRQUNoRCxhQUFhLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUM1QyxDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksNEJBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDNUMsQ0FBQyxFQUNELEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxzQkFBc0IsR0FBMkIsU0FBUyxDQUFDLE9BQU8sQ0FDdEUsMENBQXVCLENBQ3hCLENBQUM7SUFFRixNQUFNLHNCQUFzQixDQUFDLHNCQUFzQixDQUFDO1FBQ2xELEdBQUcsUUFBUTtRQUNYLGFBQWEsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztLQUNqRSxDQUFDLENBQUM7QUFDTCxDQUFDLENBQ0YsQ0FBQyJ9
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateExtendedProductWithFieldStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const extended_product_1 = require("../../../modules/extended-product");
6
+ exports.updateExtendedProductWithFieldStep = (0, workflows_sdk_1.createStep)("update-extended-product-with-field", async ({ id, data }, { container }) => {
7
+ const extendedProductModuleService = container.resolve(extended_product_1.EXTENDED_PRODUCT_MODULE);
8
+ const prevData = await extendedProductModuleService.retrieveExtendedProduct(id);
9
+ const extendedProduct = await extendedProductModuleService.updateExtendedProducts({
10
+ id,
11
+ ...data,
12
+ });
13
+ return new workflows_sdk_1.StepResponse(extendedProduct, prevData);
14
+ });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWV4dGVuZGVkLXByb2R1Y3Qtd2l0aC1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvdXBkYXRlLWV4dGVuZGVkLXByb2R1Y3QtZnJvbS1wcm9kdWN0L3N0ZXBzL3VwZGF0ZS1leHRlbmRlZC1wcm9kdWN0LXdpdGgtZmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTZFO0FBQzdFLHdFQUE0RTtBQVEvRCxRQUFBLGtDQUFrQyxHQUFHLElBQUEsMEJBQVUsRUFDMUQsb0NBQW9DLEVBQ3BDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQWtDLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sNEJBQTRCLEdBQ2hDLFNBQVMsQ0FBQyxPQUFPLENBQUMsMENBQXVCLENBQUMsQ0FBQztJQUU3QyxNQUFNLFFBQVEsR0FBRyxNQUFNLDRCQUE0QixDQUFDLHVCQUF1QixDQUN6RSxFQUFFLENBQ0gsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUNuQixNQUFNLDRCQUE0QixDQUFDLHNCQUFzQixDQUFDO1FBQ3hELEVBQUU7UUFDRixHQUFHLElBQUk7S0FDUixDQUFDLENBQUM7SUFFTCxPQUFPLElBQUksNEJBQVksQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUNGLENBQUMifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devx-commerce/plugin-gati",
3
- "version": "0.0.2-beta.1",
3
+ "version": "0.0.2-beta.3",
4
4
  "description": "Gati ERP integration for Medusa",
5
5
  "author": "devx commerce",
6
6
  "license": "MIT",
@@ -1,68 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchStyleData = void 0;
4
- const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
- const BATCH_SIZE = 50; // Process 50 items at a time
6
- const MAX_RETRIES = 3;
7
- const RETRY_DELAY = 1000; // 1 second delay between retries
8
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
9
- const processBatch = async (erpService, datafor, batch, retryCount = 0) => {
10
- try {
11
- const results = await Promise.all(batch.map(async (transactionId) => {
12
- try {
13
- return await erpService.getMasterData(datafor, transactionId);
14
- }
15
- catch (error) {
16
- console.error(`Error fetching data for ID ${transactionId}:`, error);
17
- return null;
18
- }
19
- }));
20
- // Filter out failed requests
21
- const successfulResults = results.filter((result) => result !== null);
22
- // If we have failed requests and haven't exceeded max retries, retry them
23
- if (results.length !== successfulResults.length &&
24
- retryCount < MAX_RETRIES) {
25
- const failedIds = batch.filter((_, index) => results[index] === null);
26
- console.log(`Retrying ${failedIds.length} failed requests (attempt ${retryCount + 1})`);
27
- await sleep(RETRY_DELAY);
28
- const retryResults = await processBatch(erpService, datafor, failedIds, retryCount + 1);
29
- return [...successfulResults, ...retryResults];
30
- }
31
- return successfulResults;
32
- }
33
- catch (error) {
34
- console.error("Batch processing error:", error);
35
- if (retryCount < MAX_RETRIES) {
36
- console.log(`Retrying entire batch (attempt ${retryCount + 1})`);
37
- await sleep(RETRY_DELAY);
38
- return processBatch(erpService, datafor, batch, retryCount + 1);
39
- }
40
- throw error;
41
- }
42
- };
43
- /**
44
- * Step to fetch style data from ERP system
45
- * This step processes data in batches to avoid timeouts and handle large datasets
46
- * @param input - Contains datafor type and array of transaction IDs
47
- * @param container - Dependency injection container to resolve services
48
- */
49
- exports.fetchStyleData = (0, workflows_sdk_1.createStep)("fetch-style-data", async (input, { container }) => {
50
- const erpService = container.resolve("erp");
51
- const { datafor, data } = input;
52
- // Split data into batches
53
- const batches = [];
54
- for (let i = 0; i < data.length; i += BATCH_SIZE) {
55
- batches.push(data.slice(i, i + BATCH_SIZE));
56
- }
57
- console.log(`Processing ${data.length} items in ${batches.length} batches`);
58
- // Process each batch sequentially
59
- const allResults = [];
60
- for (let i = 0; i < batches.length; i++) {
61
- console.log(`Processing batch ${i + 1}/${batches.length}`);
62
- const batchResults = await processBatch(erpService, datafor, batches[i]);
63
- allResults.push(...batchResults);
64
- }
65
- console.log(`Successfully processed ${allResults.length} items`);
66
- return new workflows_sdk_1.StepResponse(allResults);
67
- });
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2NyZWF0ZS1vci11cGRhdGUtc3R5bGUtbWFzdGVyL3N0ZXBzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE2RTtBQUk3RSxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsQ0FBQyw2QkFBNkI7QUFDcEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLGlDQUFpQztBQUUzRCxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVoRixNQUFNLFlBQVksR0FBRyxLQUFLLEVBQ3hCLFVBQTRCLEVBQzVCLE9BQWUsRUFDZixLQUFlLEVBQ2YsVUFBVSxHQUFHLENBQUMsRUFDRSxFQUFFO0lBQ2xCLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDL0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxVQUFVLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixhQUFhLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDckUsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLDZCQUE2QjtRQUM3QixNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENB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