@devx-commerce/plugin-gati
Version:
Gati ERP integration for Medusa
326 lines • 31.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
const core_flows_1 = require("@medusajs/medusa/core-flows");
const product_helper_1 = require("../helpers/product-helper");
const fetch_styles_1 = require("./steps/fetch-styles");
/**
* Main workflow for handling StyleMst operations
* This workflow:
* 1. Fetches style data from ERP
* 2. Gets required sales channels and shipping profiles
* 3. Conditionally creates products based on operation type
*
* @param input - Contains operation type, datafor type, and transaction IDs
*/
const styleMstWorkflow = (0, workflows_sdk_1.createWorkflow)("style-mst", (input) => {
// Step 1: Fetch style data from ERP system
const styleData = (0, fetch_styles_1.fetchStyleData)(input);
// Step 2: Get all sales channels for product creation
const { data: salesChannels } = (0, core_flows_1.useQueryGraphStep)({
entity: "sales_channel",
fields: ["id", "name"],
}).config({ name: "sales-channels" });
// Step 3: Get shipping profile for product creation
const { data: shippingProfiles } = (0, core_flows_1.useQueryGraphStep)({
entity: "shipping_profile",
fields: ["id"],
pagination: {
take: 1,
},
}).config({ name: "shipping-profile" });
const externalIdsFilters = (0, workflows_sdk_1.transform)({
styleData,
}, (data) => {
return data.styleData.map((product) => `${product.StyleId}`);
});
const externalCollectionFilters = (0, workflows_sdk_1.transform)({
styleData,
}, (data) => {
return data.styleData.map((product) => {
const collection = product?.StyleMstCollection?.find((collection) => collection.CollectionGroupName.toLowerCase() === "collection")?.Collection;
return collection;
});
});
const externalCollectionGroupFilters = (0, workflows_sdk_1.transform)({
styleData,
}, (data) => {
return data.styleData
.map((product) => {
return product?.StyleMstCollection?.filter((collection) => collection.CollectionGroupName.toLowerCase() !== "collection")?.map((collection) => collection.CollectionGroupNo);
})
.flat()
.filter(Boolean);
});
const externalCollectionCategoryFilters = (0, workflows_sdk_1.transform)({
styleData,
}, (data) => {
return data.styleData
.map((product) => {
return product?.StyleMstCollection?.filter((collection) => collection.CollectionGroupName.toLowerCase() !== "collection")?.map((collection) => collection.DesgNo);
})
.flat()
.filter(Boolean);
});
const externalCategoryGroupFilters = (0, workflows_sdk_1.transform)({
styleData,
}, (data) => {
return data.styleData.map((product) => product?.GrpGroupNo);
});
const externalCategoryFilters = (0, workflows_sdk_1.transform)({
styleData,
}, (data) => {
return data.styleData.map((product) => product?.GrpNo);
});
const externalSubCategoryFilters = (0, workflows_sdk_1.transform)({
styleData,
}, (data) => {
return data.styleData.map((product) => product?.SubItmNo);
});
const combinedCategoryFilters = (0, workflows_sdk_1.transform)({
externalCategoryFilters,
externalSubCategoryFilters,
}, (data) => [
...data.externalCategoryFilters,
...data.externalSubCategoryFilters,
]);
// @ts-ignore
const { data: existingProducts } = (0, core_flows_1.useQueryGraphStep)({
entity: "product",
fields: ["id", "external_id", "variants.*"],
filters: {
// @ts-ignore
external_id: externalIdsFilters,
},
}).config({ name: "existing-products" });
const { data: existingCollection } = (0, core_flows_1.useQueryGraphStep)({
entity: "collection_master",
fields: ["*"],
filters: {
collection_code: externalCollectionFilters,
},
}).config({ name: "existing-collection" });
const { data: existingCategoryGroup } = (0, core_flows_1.useQueryGraphStep)({
entity: "category_group_master",
fields: ["*"],
filters: {
grp_no: externalCategoryGroupFilters,
},
}).config({ name: "existing-category-group" });
const { data: existingCategory } = (0, core_flows_1.useQueryGraphStep)({
entity: "category_master",
fields: ["*"],
filters: {
grp_no: combinedCategoryFilters,
},
}).config({ name: "existing-category" });
const { data: existingSubCategory } = (0, core_flows_1.useQueryGraphStep)({
entity: "sub_category_master",
fields: ["*"],
filters: {
sub_item_no: externalSubCategoryFilters,
},
}).config({ name: "existing-sub-category" });
const { data: existingCollectionGroup } = (0, core_flows_1.useQueryGraphStep)({
entity: "collection_group_master",
fields: ["*"],
filters: {
collection_group_no: externalCollectionGroupFilters,
},
}).config({ name: "existing-collection-group" });
const { data: existingCollectionCategory } = (0, core_flows_1.useQueryGraphStep)({
entity: "collection_master",
fields: ["*"],
filters: {
collection_no: externalCollectionCategoryFilters,
},
}).config({ name: "existing-collection-category" });
(0, workflows_sdk_1.when)(input, (input) => {
return input.operation === "add" || input.operation === "update";
}).then(() => {
const { productsToCreate, productsToUpdate } = (0, workflows_sdk_1.transform)({
styleData,
shippingProfiles,
salesChannels,
existingProducts,
existingCollection,
existingCategoryGroup,
existingCategory,
existingSubCategory,
existingCollectionGroup,
existingCollectionCategory,
}, (data) => {
const productsToCreate = [];
const productsToUpdate = [];
data.styleData.forEach((styleData) => {
// Calculate costs based on raw codes
const { metal_total_cost, diamond_total_cost, stone_total_cost, cpf_total_cost, metal_total_amount, diamond_total_amount, stone_total_amount, cpf_total_amount, } = (0, product_helper_1.calculateStyleCostsAndAmounts)(styleData.StyleMstDetail);
const productTitle = styleData.StyleMstExploration?.find((exploration) => exploration.ExplorationCode === "Product Name")?.ExplorationValue ||
`Style ${styleData.StyleCode}-${styleData.StyleId}`;
const productDescription = styleData.StyleMstExploration?.find((exploration) => exploration.ExplorationCode === "PD")?.ExplorationValue || "";
const productAvailabilityInOnline = styleData.StyleMstExploration?.find((exploration) => exploration.ExplorationCode.toLowerCase() === "web indicator")?.ExplorationValue.toLowerCase() === "true";
const { baseMetal, baseMetalPurity, baseMetalColor } = (0, product_helper_1.getBaseMetalDetails)(styleData.StyleMstDetail);
let collectionId = "";
const categoryIds = [];
const collection = styleData?.StyleMstCollection?.find((collection) => collection.CollectionGroupName.toLowerCase() === "collection")?.Collection;
if (styleData.GrpGroupNo) {
const existingCategoryGroupData = data.existingCategoryGroup.find((c) => c.grp_no === styleData.GrpGroupNo);
if (existingCategoryGroupData) {
categoryIds.push(existingCategoryGroupData?.mapping_id);
}
}
if (styleData.GrpNo) {
const existingCategoryData = data.existingCategory.find((c) => c.grp_no === styleData.GrpNo);
if (existingCategoryData) {
categoryIds.push(existingCategoryData?.mapping_id);
}
}
if (styleData.SubItmNo) {
const existingSubCategoryData = data.existingSubCategory.find((c) => c.sub_item_no === styleData.SubItmNo);
if (existingSubCategoryData) {
categoryIds.push(existingSubCategoryData?.mapping_id);
}
}
const categories = styleData?.StyleMstCollection?.filter((collection) => collection.CollectionGroupName.toLowerCase() !== "collection")?.map((collection) => collection.DesgNo);
if (categories?.length > 0) {
for (const category of categories) {
const existingCollectionCategoryData = data.existingCollectionCategory.find((c) => c.collection_no === category);
if (existingCollectionCategoryData) {
categoryIds.push(existingCollectionCategoryData?.mapping_id);
}
}
}
const categoriesByGroup = styleData?.StyleMstCollection?.filter((collection) => collection.CollectionGroupName.toLowerCase() !== "collection")?.map((collection) => collection.CollectionGroupNo);
if (categoriesByGroup?.length > 0) {
for (const category of categoriesByGroup) {
const existingCollectionGroupData = data.existingCollectionGroup.find((c) => c.collection_group_no === category);
if (existingCollectionGroupData) {
categoryIds.push(existingCollectionGroupData?.mapping_id);
}
}
}
if (collection) {
const existingCollectionData = data.existingCollection.find((c) => c.collection_code === collection);
if (existingCollectionData) {
collectionId = existingCollectionData?.mapping_id;
}
}
const onlineSalesChannelId = data.salesChannels.find((channel) => channel.name.toLowerCase() === "online")?.id || "";
const offlineSalesChannelId = data.salesChannels.find((channel) => channel.name.toLowerCase() === "offline")?.id || "";
const width = parseFloat(styleData.StyleMstExploration.find((i) => i.ExplorationName.toLowerCase() === "width")?.ExplorationValue?.split(" ")[0] || "0");
const height = parseFloat(styleData.StyleMstExploration.find((i) => i.ExplorationName.toLowerCase() === "height")?.ExplorationValue?.split(" ")[0] || "0");
//TODO: Add category ids
const product = {
external_id: `${styleData.StyleId}`,
title: productTitle || "",
description: productDescription || styleData.WebDescription || "",
status: "draft",
options: [
{
title: "Default",
values: ["Default"],
},
],
origin_country: "IN",
material: styleData.StyleMstDetail.find((i) => i.RawType === "Metal" && i.IsBase)?.RawCode || "",
height,
width,
handle: (0, product_helper_1.toKebabCase)([productTitle, styleData.StyleCode]),
variants: [],
shipping_profile_id: data.shippingProfiles[0].id,
category_ids: categoryIds.filter(Boolean),
sales_channels: [
{
id: productAvailabilityInOnline
? onlineSalesChannelId
: offlineSalesChannelId,
},
],
};
const existingProduct = data.existingProducts.find((p) => p.external_id === product.external_id);
if (collectionId) {
product.collection_id = collectionId;
}
if (existingProduct) {
product.id = existingProduct.id;
product.status = existingProduct.status;
product.title = existingProduct.title;
product.description = existingProduct.description;
product.handle = existingProduct.handle;
}
const extendedProductData = (0, product_helper_1.getExtendedProductData)(styleData, { baseMetal, baseMetalPurity, baseMetalColor }, {
metal_total_cost,
diamond_total_cost,
stone_total_cost,
cpf_total_cost,
metal_total_amount,
diamond_total_amount,
stone_total_amount,
cpf_total_amount,
});
const styleDetails = (0, product_helper_1.getStyleDetailLines)(styleData?.StyleMstDetail || []);
const styleExploration = (0, product_helper_1.getStyleExplorationLines)(styleData?.StyleMstExploration || []);
const styleCollection = (0, product_helper_1.getStyleCollectionLines)(styleData?.StyleMstCollection || []);
if (existingProduct) {
productsToUpdate.push({
product: product,
additional_data: {
extendedProductData,
styleDetails,
styleExploration,
styleCollection,
},
});
}
else {
productsToCreate.push({
product: product,
additional_data: {
extendedProductData,
styleDetails,
styleExploration,
styleCollection,
},
});
}
});
return {
productsToCreate: {
products: productsToCreate.map((p) => p.product),
additional_data: productsToCreate.reduce((acc, p) => {
const externalId = p?.product?.external_id;
if (externalId) {
acc[externalId] = p.additional_data;
}
return acc;
}, {}),
},
productsToUpdate: {
products: productsToUpdate.map((p) => p.product),
additional_data: productsToUpdate.reduce((acc, p) => {
const externalId = p?.product?.external_id;
if (externalId) {
acc[externalId] = p.additional_data;
}
return acc;
}, {}),
},
};
});
core_flows_1.createProductsWorkflow.runAsStep({
input: {
...productsToCreate,
},
});
core_flows_1.updateProductsWorkflow.runAsStep({
input: {
...productsToUpdate,
},
});
});
return new workflows_sdk_1.WorkflowResponse({
success: true,
});
});
exports.default = styleMstWorkflow;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2NyZWF0ZS1vci11cGRhdGUtc3R5bGUtbWFzdGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEscUVBSzJDO0FBQzNDLDREQUlxQztBQUdyQyw4REFRbUM7QUFFbkMsdURBQXNEO0FBRXREOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDhCQUFjLEVBQUMsV0FBVyxFQUFFLENBQUMsS0FBb0IsRUFBRSxFQUFFO0lBQzVFLDJDQUEyQztJQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFBLDZCQUFjLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEMsc0RBQXNEO0lBQ3RELE1BQU0sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBQSw4QkFBaUIsRUFBQztRQUNoRCxNQUFNLEVBQUUsZUFBZTtRQUN2QixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0tBQ3ZCLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBRXRDLG9EQUFvRDtJQUNwRCxNQUFNLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBQSw4QkFBaUIsRUFBQztRQUNuRCxNQUFNLEVBQUUsa0JBQWtCO1FBQzFCLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQztRQUNkLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRSxDQUFDO1NBQ1I7S0FDRixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUV4QyxNQUFNLGtCQUFrQixHQUFHLElBQUEseUJBQVMsRUFDbEM7UUFDRSxTQUFTO0tBQ1YsRUFDRCxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ1AsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FB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