@devx-commerce/plugin-gati
Version:
Gati ERP integration for Medusa
191 lines • 17.2 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
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 create_or_update_product_options_1 = __importDefault(require("../create-or-update-product-options"));
const product_helper_1 = require("../helpers/product-helper");
const fetch_party_styles_1 = require("./steps/fetch-party-styles");
/**
* Main workflow for handling PartyStyleMst operations
* This workflow:
* 1. Fetches PartyStyle data from ERP
* 2. Conditionally creates variants based on operation type
*
* @param input - Contains operation type, datafor type, and transaction IDs
*/
const partyStyleMstWorkflow = (0, workflows_sdk_1.createWorkflow)("party-style-mst", (input) => {
// Step 1: Fetch style data from ERP system
const partyStyleData = (0, fetch_party_styles_1.fetchPartyStyleData)(input);
const externalIdsFilters = (0, workflows_sdk_1.transform)({
partyStyleData,
}, (data) => {
return [
...new Set(data.partyStyleData.map((product) => `${product?.StyleId}`)),
];
});
const { data: existingProducts } = (0, core_flows_1.useQueryGraphStep)({
entity: "product",
fields: [
"id",
"external_id",
"variants.*",
"options.*",
"extended_product.*",
"extended_product.style_details.*",
"extended_product.style_explorations.*",
"extended_product.style_collections.*",
],
filters: {
external_id: externalIdsFilters,
},
}).config({ name: "existing-products" });
(0, workflows_sdk_1.when)(input, (input) => {
return input.operation === "add";
}).then(() => {
// Create product options
const productOptionsAllData = create_or_update_product_options_1.default.runAsStep({
input: {
existingProducts,
partyStyleData,
},
});
const { variantsToCreate, productsToUpdate } = (0, workflows_sdk_1.transform)({
partyStyleData,
existingProducts,
productOptionsAllData,
}, (data) => {
const variantsToCreate = [];
const productsToUpdate = [];
const existingProductIds = data.existingProducts.map((product) => product.external_id);
// First, collect all variant data for each product
const productVariantData = new Map();
data.partyStyleData
.filter((styleData) => existingProductIds.includes(String(styleData.StyleId)))
.forEach((styleData) => {
const existingProduct = data.existingProducts.find((p) => p.external_id === String(styleData.StyleId));
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.PartyStyleMstDetail);
const { baseMetal, baseMetalPurity, baseMetalColor } = (0, product_helper_1.getBaseMetalDetails)(styleData.PartyStyleMstDetail);
const extendedVariantData = (0, product_helper_1.getExtendedVariantData)(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,
});
// Collect variant data for each product
if (!productVariantData.has(existingProduct.id)) {
productVariantData.set(existingProduct.id, {
gross_weights: new Set(),
net_weights: new Set(),
prices: new Set(),
product: existingProduct,
});
}
const productData = productVariantData.get(existingProduct.id);
productData.gross_weights.add(extendedVariantData.gross_weight.toString());
productData.net_weights.add(extendedVariantData.net_weight.toString());
productData.prices.add(styleData.Mrp.toString());
// Create variant
const productOptions = (0, product_helper_1.createProductOptionsForPartyStyleId)(styleData, data.productOptionsAllData.find((option) => option.id === existingProduct.id));
const title = styleData.PartyStyleMstExploration.find((exploration) => exploration.ExplorationName.toLowerCase() === "product name")?.ExplorationValue;
const variant = {
product_id: existingProduct.id,
title: title ||
`${styleData.PartyStyleCode}-${styleData.PartyStyleId}-${styleData.StyleId}`,
sku: `${styleData.PartyStyleSKUNo}-${styleData.PartyStyleCode}` ||
`${styleData.PartyStyleCode}-${styleData.PartyStyleId}-${styleData.StyleId}`,
prices: [
{
amount: styleData.Mrp,
currency_code: "inr",
},
],
options: {
...productOptions,
},
manage_inventory: false,
metadata: {
external_id: `${styleData.PartyStyleId}`,
},
};
const styleDetails = (0, product_helper_1.getPartyStyleDetailLines)(styleData?.PartyStyleMstDetail);
const explorationDetails = (0, product_helper_1.getPartyStyleExplorationLines)(styleData?.PartyStyleMstExploration);
variantsToCreate.push({
variant: variant,
additional_data: {
extendedVariantData,
styleDetails,
explorationDetails,
},
});
});
// Now update products with all collected variant data
productVariantData.forEach((productData, productId) => {
const existingProduct = productData.product;
productsToUpdate.push({
product: existingProduct,
additional_data: {
extendedProductData: {
...existingProduct.extended_product,
gross_weights_range: Array.from(productData.gross_weights),
net_weights_range: Array.from(productData.net_weights),
prices_range: Array.from(productData.prices),
},
styleDetails: existingProduct?.extended_product?.style_details,
styleExplorations: existingProduct?.extended_product?.style_explorations,
styleCollections: existingProduct?.extended_product?.style_collections,
},
});
});
return {
variantsToCreate: {
product_variants: variantsToCreate.map((p) => p.variant),
additional_data: variantsToCreate.reduce((acc, p) => {
const externalId = p?.variant?.metadata?.external_id;
if (externalId) {
acc[externalId] = p.additional_data;
}
return acc;
}, {}),
},
productsToUpdate: {
products: productsToUpdate.map((p) => {
return {
id: p.product.id,
external_id: p.product.external_id,
options: data.productOptionsAllData.find((option) => option.id === p.product.id)?.options,
};
}),
additional_data: productsToUpdate.reduce((acc, p) => {
const externalId = p?.product?.external_id;
if (externalId) {
acc[externalId] = p.additional_data;
}
return acc;
}, {}),
},
};
});
core_flows_1.updateProductsWorkflow.runAsStep({
input: {
...productsToUpdate,
},
});
core_flows_1.createProductVariantsWorkflow.runAsStep({
input: {
...variantsToCreate,
},
});
});
return new workflows_sdk_1.WorkflowResponse({
success: true,
});
});
exports.default = partyStyleMstWorkflow;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2NyZWF0ZS1vci11cGRhdGUtcGFydHktc3R5bGUtbWFzdGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBSUEscUVBSzJDO0FBQzNDLDREQUlxQztBQUdyQywyR0FBdUY7QUFDdkYsOERBT21DO0FBRW5DLG1FQUFpRTtBQUVqRTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxJQUFBLDhCQUFjLEVBQzFDLGlCQUFpQixFQUNqQixDQUFDLEtBQXlCLEVBQUUsRUFBRTtJQUM1QiwyQ0FBMkM7SUFDM0MsTUFBTSxjQUFjLEdBQUcsSUFBQSx3Q0FBbUIsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUVsRCxNQUFNLGtCQUFrQixHQUFHLElBQUEseUJBQVMsRUFDbEM7UUFDRSxjQUFjO0tBQ2YsRUFDRCxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ1AsT0FBTztZQUNMLEdBQUcsSUFBSSxHQUFHLENBQ1IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQzVEO1NBQ0YsQ0FBQztJQUNKLENBQUMsQ0FDRixDQUFDO0lBRUYsTUFBTSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLElBQUEsOEJBQWlCLEVBQUM7UUFDbkQsTUFBTSxFQUFFLFNBQVM7UUFDakIsTUFBTSxFQUFFO1lBQ04sSUFBSTtZQUNKLGFBQWE7WUFDYixZQUFZO1lBQ1osV0FBVztZQUNYLG9CQUFvQjtZQUNwQixrQ0FBa0M7WUFDbEMsdUNBQXVDO1lBQ3ZDLHNDQUFzQztTQUN2QztRQUNELE9BQU8sRUFBRTtZQUNQLFdBQVcsRUFBRSxrQkFBa0I7U0FDaEM7S0FDRixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFt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