UNPKG

@devx-commerce/plugin-gati

Version:

Gati ERP integration for Medusa

599 lines 57.7 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeProductOptions = exports.createProductOptionsForPartyStyleId = exports.createProductOptionsStepFromData = exports.getPartyStyleExplorationLines = exports.getPartyStyleDetailLines = exports.getStyleCollectionLines = exports.getStyleExplorationLines = exports.getStyleDetailLines = exports.getExtendedVariantData = exports.getExtendedProductData = exports.getBaseMetalDetails = exports.calculateStyleCostsAndAmounts = exports.genderMapper = exports.toKebabCase = void 0;
const types_1 = require("../types");
const toKebabCase = (strings) => {
    return strings
        .filter(Boolean)
        .join("-")
        .toLowerCase()
        .replace(/\s+/g, "-") // Replace spaces with hyphens
        .replace(/[^a-z0-9-]/g, "")
        .replace(/-{2,}/g, "-");
};
exports.toKebabCase = toKebabCase;
const genderMapper = (gender) => {
    const genderMap = {
        MN: types_1.Gender.MN,
        WN: types_1.Gender.WN,
        UN: types_1.Gender.UN,
        KD: types_1.Gender.KD,
    };
    return genderMap[gender] || types_1.Gender.UN;
};
exports.genderMapper = genderMapper;
const calculateStyleCostsAndAmounts = (styleDetails) => {
    const metalTotalCost = styleDetails
        .filter((detail) => detail.RawType === "Metal")
        .reduce((acc, detail) => acc + detail.CostAmount, 0);
    const diamondTotalCost = styleDetails
        .filter((detail) => detail.RawType === "Diamond")
        .reduce((acc, detail) => acc + detail.CostAmount, 0);
    const stoneTotalCost = styleDetails
        .filter((detail) => detail.RawType === "Stone" || detail.RawType === "Stone(Color Stone)")
        .reduce((acc, detail) => acc + detail.CostAmount, 0);
    const cpfTotalCost = styleDetails
        .filter((detail) => detail.RawType === "Metal")
        .reduce((acc, detail) => acc + detail.CPFCostAmt, 0);
    const metalTotalAmount = styleDetails
        .filter((detail) => detail.RawType === "Metal")
        .reduce((acc, detail) => acc + detail.Amount, 0);
    const diamondTotalAmount = styleDetails
        .filter((detail) => detail.RawType === "Diamond")
        .reduce((acc, detail) => acc + detail.Amount, 0);
    const stoneTotalAmount = styleDetails
        .filter((detail) => detail.RawType === "Stone" || detail.RawType === "Stone(Color Stone)")
        .reduce((acc, detail) => acc + detail.Amount, 0);
    const cpfTotalAmount = styleDetails
        .filter((detail) => detail.RawType === "Metal")
        .reduce((acc, detail) => acc + detail.CPFAmt, 0);
    return {
        metal_total_cost: metalTotalCost,
        diamond_total_cost: diamondTotalCost,
        stone_total_cost: stoneTotalCost,
        cpf_total_cost: cpfTotalCost,
        metal_total_amount: metalTotalAmount,
        diamond_total_amount: diamondTotalAmount,
        stone_total_amount: stoneTotalAmount,
        cpf_total_amount: cpfTotalAmount,
    };
};
exports.calculateStyleCostsAndAmounts = calculateStyleCostsAndAmounts;
const getBaseMetalDetails = (styleDetails) => {
    const baseMetalDetail = styleDetails.find((detail) => detail.RawType === "Metal" && detail.IsBase);
    return {
        baseMetal: baseMetalDetail?.RawCode || "",
        baseMetalPurity: baseMetalDetail?.QlyCode || "",
        baseMetalColor: baseMetalDetail?.ToneCode || "",
    };
};
exports.getBaseMetalDetails = getBaseMetalDetails;
const getExtendedProductData = (styleData, baseMetalDetails, styleCalculations) => {
    return {
        style_id: styleData.StyleId,
        style_date: styleData.StyleDate,
        style_code: styleData.StyleCode,
        style_alias_no: styleData.StyleAliasNo,
        grp_group_no: styleData.GrpGroupNo,
        category_group_name: styleData.CategoryGroupName,
        category_group_code: styleData.CategoryGroupCode,
        grp_no: styleData.GrpNo,
        category: styleData.Category || "",
        category_code: styleData.CategoryCode,
        sub_itm_no: styleData.SubItmNo,
        sub_category: styleData.SubCategory || "",
        sub_category_code: styleData.SubCategoryCode,
        manufacturer: styleData.Manufacturer || "",
        manufacturer_no: styleData.ManufacturerNo || "",
        make_type_no: styleData.MakeTypeNo,
        make_type: styleData.MakeType || "",
        make_type_code: styleData.MakeTypeCode,
        stock_type_no: styleData.StockTypeNo,
        stock_type: styleData.StockType || "",
        stock_type_code: styleData.StockTypeCode,
        item_size_id: styleData.ItemSizeId,
        item_size: styleData.ItemSize || "",
        item_size_name: styleData.ItemSizeName,
        brand_no: styleData.BrandNo,
        brand: styleData.Brand || "",
        brand_name: styleData.BrandName,
        gender_no: styleData.GenderNo,
        gender: (0, exports.genderMapper)(styleData.Gender),
        gender_name: styleData.GenderName,
        shape_code: styleData.StyleMstDetail.find((detail) => detail.IsCenterStone && detail.IsBase)?.ShapeCode || "",
        is_complete: styleData.IsComplete || false,
        restricted: styleData.Restricted || false,
        currency: styleData.Currency || "INR",
        rate_chart: styleData.RateChart || "",
        discount_markup: styleData.DiscountMarkup || "",
        cost: styleData.Cost || 0,
        mrp: styleData.Mrp || 0,
        hsn_code: styleData.HSN || "",
        gross_weight: styleData.GrossWt || 0,
        net_weight: styleData.NetWt || 0,
        wax_weight: styleData.WaxWt || 0,
        model_weight: styleData.ModelWt || 0,
        metal: baseMetalDetails.baseMetal,
        metal_purity: baseMetalDetails.baseMetalPurity,
        metal_color: baseMetalDetails.baseMetalColor,
        total_diamond_pcs: styleData.TotDiamondPcs || 0,
        total_diamond_weight: styleData.TotDiamondWt || 0,
        total_client_diamond_pcs: styleData.TotClientDiamondPcs || 0,
        total_client_diamond_weight: styleData.TotClientDiamondWt || 0,
        total_stone_pcs: styleData.TotStonePcs || 0,
        total_stone_weight: styleData.TotStoneWt || 0,
        total_cz_pcs: styleData.TotCzPcs || 0,
        total_cz_weight: styleData.TotCzWt || 0,
        web_description: styleData.WebDescription || "",
        remarks: styleData.Remarks || "",
        customer_remarks: styleData.CustomerRemarks || "",
        special_remarks: styleData.SpecialRemarks || "",
        metal_total_cost: styleCalculations.metal_total_cost,
        diamond_total_cost: styleCalculations.diamond_total_cost,
        stone_total_cost: styleCalculations.stone_total_cost,
        cpf_total_cost: styleCalculations.cpf_total_cost,
        metal_total_amount: styleCalculations.metal_total_amount,
        diamond_total_amount: styleCalculations.diamond_total_amount,
        stone_total_amount: styleCalculations.stone_total_amount,
        cpf_total_amount: styleCalculations.cpf_total_amount,
    };
};
exports.getExtendedProductData = getExtendedProductData;
const getExtendedVariantData = (styleData, baseMetalDetails, styleCalculations) => {
    return {
        images: [],
        thumbnail: "",
        party_style_id: styleData.PartyStyleId,
        party_style_date: styleData.PartyStyleDate,
        party_style_code: styleData.PartyStyleCode,
        party_style_alias_no: styleData.PartyStyleAliasNo,
        party_style_sku_no: styleData.PartyStyleSKUNo,
        style_id: styleData.StyleId,
        style_code: styleData.StyleCode,
        grp_group_no: styleData.GrpGroupNo,
        category_group_name: styleData.CategoryGroupName,
        category_group_code: styleData.CategoryGroupCode,
        grp_no: styleData.GrpNo,
        category: styleData.Category || "",
        category_code: styleData.CategoryCode,
        sub_itm_no: styleData.SubItmNo,
        sub_category: styleData.SubCategory || "",
        sub_category_code: styleData.SubCategoryCode,
        manufacturer: styleData.Manufacturer || "",
        manufacturer_no: styleData.ManufacturerNo || "",
        make_type: styleData.MakeType || "",
        make_type_no: styleData.MakeTypeNo,
        make_type_code: styleData.MakeTypeCode,
        stock_type_no: styleData.StockTypeNo,
        stock_type: styleData.StockType || "",
        stock_type_code: styleData.StockTypeCode,
        item_size_id: styleData.ItemSizeId,
        item_size: styleData.ItemSize || "",
        item_size_name: styleData.ItemSizeName,
        brand_no: styleData.BrandNo,
        brand: styleData.Brand || "",
        brand_name: styleData.BrandName || "",
        gender_no: styleData.GenderNo,
        gender: (0, exports.genderMapper)(styleData.Gender),
        gender_name: styleData.GenderName,
        shape_code: styleData.PartyStyleMstDetail.find((detail) => detail.IsCenterStone && detail.IsBase)?.ShapeCode || "",
        is_complete: styleData.IsComplete || false,
        restricted: styleData.Restricted || false,
        currency: styleData.Currency || "INR",
        rate_chart: styleData.RateChart || "",
        discount_markup: styleData.DiscountMarkup || "",
        cost: styleData.Cost || 0,
        mrp: styleData.Mrp || 0,
        hsn_code: styleData.HSN || "",
        gross_weight: styleData.GrossWt || 0,
        net_weight: styleData.NetWt || 0,
        wax_weight: styleData.WaxWt || 0,
        model_weight: styleData.ModelWt || 0,
        metal: baseMetalDetails.baseMetal,
        metal_purity: baseMetalDetails.baseMetalPurity,
        metal_color: baseMetalDetails.baseMetalColor,
        total_diamond_pcs: styleData.TotDiamondPcs || 0,
        total_diamond_weight: styleData.TotDiamondWt || 0,
        total_client_diamond_pcs: styleData.TotClientDiamondPcs || 0,
        total_client_diamond_weight: styleData.TotClientDiamondWt || 0,
        total_stone_pcs: styleData.TotStonePcs || 0,
        total_stone_weight: styleData.TotStoneWt || 0,
        total_cz_pcs: styleData.TotCzPcs || 0,
        total_cz_weight: styleData.TotCzWt || 0,
        web_description: styleData.WebDescription || "",
        remarks: styleData.Remarks || "",
        customer_remarks: styleData.CustomerRemarks || "",
        special_remarks: styleData.SpecialRemarks || "",
        metal_total_cost: styleCalculations.metal_total_cost,
        diamond_total_cost: styleCalculations.diamond_total_cost,
        stone_total_cost: styleCalculations.stone_total_cost,
        cpf_total_cost: styleCalculations.cpf_total_cost,
        metal_total_amount: styleCalculations.metal_total_amount,
        diamond_total_amount: styleCalculations.diamond_total_amount,
        stone_total_amount: styleCalculations.stone_total_amount,
        cpf_total_amount: styleCalculations.cpf_total_amount,
    };
};
exports.getExtendedVariantData = getExtendedVariantData;
const getStyleDetailLines = (data) => {
    return data.map((detail) => {
        return {
            style_id: detail.StyleId,
            style_mst_detail_id: detail.StyleMstDetailId,
            item_id: detail.ItemId,
            item_name: detail.ItemName || "",
            item_code: detail.ItemCode || "",
            raw_type: detail.RawType || "",
            material_group: detail.MaterialGroup || "",
            raw_no: detail.RawNo || 0,
            raw_code: detail.RawCode || "",
            shape_no: detail.ShapeNo || 0,
            shape_code: detail.ShapeCode || "",
            qly_no: detail.QlyNo || 0,
            qly_code: detail.QlyCode || "",
            tone_no: detail.ToneNo || 0,
            tone_code: detail.ToneCode || "",
            description: detail.Description || "",
            size: detail.Size || "",
            size_no: detail.SizeNo || 0,
            size_name: detail.SizeName || "",
            accessories: detail.Accessories || "",
            accessories_id: detail.AccessoriesId || 0,
            accessories_name: detail.AccessoriesName || "",
            setting: detail.Setting || "",
            smd_set_no: detail.SMDSetNo || 0,
            setting_name: detail.SettingName || "",
            is_base: detail.IsBase || false,
            is_center_stone: detail.IsCenterStone || false,
            pieces: detail.Pieces || 0,
            weight: detail.Weight || 0,
            min_weight: detail.MinWeight || 0,
            max_weight: detail.MaxWeight || 0,
            stone_wt: detail.StoneWt || 0,
            default_wt: detail.DefaultWt || 0,
            raw_formula: detail.RawFormula || "",
            cost_rate: detail.CostRate || 0,
            cost_amount: detail.CostAmount || 0,
            hand_cost_rate: detail.HandCostRate || 0,
            hand_cost_amount: detail.HandCostAmount || 0,
            set_cost_rate: detail.SetCostRate || 0,
            set_cost_amount: detail.SetCostAmount || 0,
            loss_cost_per: detail.LossCostPer || 0,
            loss_cost_per_is_fix: detail.LossCostPerIsFix || false,
            loss_cost_weight: detail.LossCostWeight || 0,
            loss_cost_amt: detail.LossCostAmt || 0,
            cpf_cost_rate: detail.CPFCostRate || 0,
            cpf_cost_is_fix: detail.CPFCostIsFix || false,
            cpf_cost_amt: detail.CPFCostAmt || 0,
            rate: detail.Rate || 0,
            amount: detail.Amount || 0,
            hand_rate: detail.HandRate || 0,
            hand_amount: detail.HandAmount || 0,
            set_rate: detail.SetRate || 0,
            set_amount: detail.SetAmount || 0,
            loss_per: detail.LossPer || 0,
            loss_per_is_fix: detail.LossPerIsFix || false,
            loss_weight: detail.LossWeight || 0,
            loss_amt: detail.LossAmt || 0,
            cpf_rate: detail.CPFRate || 0,
            cpf_is_fix: detail.CPFIsFix || false,
            cpf_amt: detail.CPFAmt || 0,
        };
    });
};
exports.getStyleDetailLines = getStyleDetailLines;
const getStyleExplorationLines = (data) => {
    return data.map((detail) => {
        return {
            style_id: detail.StyleId,
            exploration_id: detail.ExplorationId,
            exploration_name: detail.ExplorationName || "",
            exploration_code: detail.ExplorationCode || "",
            exploration_value: detail.ExplorationValue || "",
        };
    });
};
exports.getStyleExplorationLines = getStyleExplorationLines;
const getStyleCollectionLines = (data) => {
    return data.map((detail) => {
        return {
            style_id: detail.StyleId,
            desg_no: detail.DesgNo,
            collection_name: detail.CollectionName || "",
            collection_group_no: detail.CollectionGroupNo,
            collection_group_name: detail.CollectionGroupName || "",
            collection_group_code: detail.CollectionGroupCode || "",
        };
    });
};
exports.getStyleCollectionLines = getStyleCollectionLines;
const getPartyStyleDetailLines = (data) => {
    return data.map((detail) => {
        return {
            party_style_id: detail.PartyStyleId,
            party_style_mst_detail_id: detail.PartyStyleMstDetailId,
            item_code: detail.ItemCode || "",
            item_id: detail.ItemId || 0,
            item_name: detail.ItemName || "",
            raw_type: detail.RawType || "",
            material_group: detail.MaterialGroup || "",
            raw_no: detail.RawNo || 0,
            raw_code: detail.RawCode || "",
            shape_no: detail.ShapeNo || 0,
            shape_code: detail.ShapeCode || "",
            qly_no: detail.QlyNo || 0,
            qly_code: detail.QlyCode || "",
            tone_no: detail.ToneNo || 0,
            tone_code: detail.ToneCode || "",
            description: detail.Description || "",
            size_no: detail.SizeNo || 0,
            size: detail.Size || "",
            size_name: detail.SizeName || "",
            accessories_id: detail.AccessoriesId || 0,
            accessories: detail.Accessories || "",
            accessories_name: detail.AccessoriesName || "",
            smd_set_no: detail.SMDSetNo || 0,
            setting: detail.Setting || "",
            setting_name: detail.SettingName || "",
            is_base: detail.IsBase || false,
            is_center_stone: detail.IsCenterStone || false,
            pieces: detail.Pieces || 0,
            weight: detail.Weight || 0,
            min_weight: detail.MinWeight || 0,
            max_weight: detail.MaxWeight || 0,
            stone_wt: detail.StoneWt || 0,
            default_wt: detail.DefaultWt || 0,
            raw_formula: detail.RawFormula || "",
            cost_rate: detail.CostRate || 0,
            cost_amount: detail.CostAmount || 0,
            hand_cost_rate: detail.HandCostRate || 0,
            hand_cost_amount: detail.HandCostAmount || 0,
            set_cost_rate: detail.SetCostRate || 0,
            set_cost_amount: detail.SetCostAmount || 0,
            loss_cost_per: detail.LossCostPer || 0,
            loss_cost_per_is_fix: detail.LossCostPerIsFix || false,
            loss_cost_weight: detail.LossCostWeight || 0,
            loss_cost_amt: detail.LossCostAmt || 0,
            cpf_cost_rate: detail.CPFCostRate || 0,
            cpf_cost_is_fix: detail.CPFCostIsFix || false,
            cpf_cost_amt: detail.CPFCostAmt || 0,
            rate: detail.Rate || 0,
            amount: detail.Amount || 0,
            hand_rate: detail.HandRate || 0,
            hand_amount: detail.HandAmount || 0,
            set_rate: detail.SetRate || 0,
            set_amount: detail.SetAmount || 0,
            loss_per: detail.LossPer || 0,
            loss_per_is_fix: detail.LossPerIsFix || false,
            loss_weight: detail.LossWeight || 0,
            loss_amt: detail.LossAmt || 0,
            cpf_rate: detail.CPFRate || 0,
            cpf_is_fix: detail.CPFIsFix || false,
            cpf_amt: detail.CPFAmt || 0,
        };
    });
};
exports.getPartyStyleDetailLines = getPartyStyleDetailLines;
const getPartyStyleExplorationLines = (data) => {
    return data.map((detail) => {
        return {
            party_style_id: detail.PartyStyleId,
            exploration_code: detail.ExplorationCode || "",
            exploration_value: detail.ExplorationValue || "",
        };
    });
};
exports.getPartyStyleExplorationLines = getPartyStyleExplorationLines;
const createProductOptionsStepFromData = (partyStyles) => {
    // Group all styles by StyleId
    const stylesByStyleId = new Map();
    partyStyles?.forEach((style) => {
        const styleId = String(style.StyleId);
        if (!stylesByStyleId.has(styleId)) {
            stylesByStyleId.set(styleId, []);
        }
        stylesByStyleId.get(styleId).push(style);
    });
    // Process each style group
    return Array.from(stylesByStyleId.entries()).map(([styleId, styles]) => {
        // Create sets to store unique values for each option type
        const options = {
            metals: new Set(),
            metalColors: new Set(),
            diamondQualities: new Set(),
            sizes: new Set(),
        };
        // Track if all styles in the group have each option type
        const optionAvailability = {
            metals: true,
            metalColors: true,
            diamondQualities: true,
            sizes: true,
        };
        // First, check option availability across all styles in this group
        styles.forEach((style) => {
            // Check Size availability
            if (!style.ItemSize) {
                optionAvailability.sizes = false;
            }
            // Check other options availability
            let hasMetals = false;
            let hasMetalColors = false;
            let hasDiamondQualities = false;
            style.PartyStyleMstDetail.forEach((detail) => {
                if (detail.RawType === "Metal" && detail.IsBase) {
                    hasMetals = true;
                    hasMetalColors = true;
                }
                if (detail.RawType === "Diamond") {
                    hasDiamondQualities = true;
                }
            });
            if (!hasMetals)
                optionAvailability.metals = false;
            if (!hasMetalColors)
                optionAvailability.metalColors = false;
            if (!hasDiamondQualities)
                optionAvailability.diamondQualities = false;
        });
        // Now gather values only for available options
        styles.forEach((style) => {
            // Only collect size data if all items have it
            if (optionAvailability.sizes && style.ItemSize) {
                options.sizes.add(String(style.ItemSize));
            }
            // Process other options
            style.PartyStyleMstDetail.forEach((detail) => {
                if (optionAvailability.metals &&
                    detail.RawType === "Metal" &&
                    detail.IsBase) {
                    options.metals.add(`${detail.QlyCode}K ${detail.RawCode}`);
                    // Map ToneCode to color name if metal colors are available
                    if (optionAvailability.metalColors) {
                        if (detail.ToneCode === "R")
                            options.metalColors.add("Rose");
                        else if (detail.ToneCode === "Y")
                            options.metalColors.add("Yellow");
                        else if (detail.ToneCode === "W")
                            options.metalColors.add("White");
                        else if (detail.ToneCode === "YRW")
                            options.metalColors.add("YELLOW/ROSE/WHITE");
                        else if (detail.ToneCode === "YW")
                            options.metalColors.add("YELLOW/WHITE");
                        else if (detail.ToneCode === "RW")
                            options.metalColors.add("ROSE/WHITE");
                        else if (detail.ToneCode === "BU")
                            options.metalColors.add("BLUE");
                        else if (detail.ToneCode === "BL")
                            options.metalColors.add("BLACK");
                    }
                }
                if (optionAvailability.diamondQualities &&
                    detail.RawType === "Diamond") {
                    options.diamondQualities.add(`${detail.ToneCode}/${detail.QlyCode}`);
                }
            });
        });
        const optionsArray = [];
        if (optionAvailability.metals && options.metals.size > 0) {
            optionsArray.push({ title: "Metal", values: Array.from(options.metals) });
        }
        if (optionAvailability.metalColors && options.metalColors.size > 0) {
            optionsArray.push({
                title: "Metal Color",
                values: Array.from(options.metalColors),
            });
        }
        if (optionAvailability.diamondQualities &&
            options.diamondQualities.size > 0) {
            optionsArray.push({
                title: "Diamond Quality",
                values: Array.from(options.diamondQualities),
            });
        }
        if (optionAvailability.sizes && options.sizes.size > 0) {
            optionsArray.push({ title: "Size", values: Array.from(options.sizes) });
        }
        return {
            styleId,
            options: optionsArray,
        };
    });
};
exports.createProductOptionsStepFromData = createProductOptionsStepFromData;
const createProductOptionsForPartyStyleId = (partyStyle, existingProduct) => {
    const options = {
        metals: new Set(),
        metalColors: new Set(),
        diamondQualities: new Set(),
        sizes: new Set(),
    };
    // Size
    if (partyStyle.ItemSize)
        options.sizes.add(String(partyStyle.ItemSize));
    // Track if this style has each option type
    let hasMetalOption = false;
    let hasDiamondOption = false;
    partyStyle.PartyStyleMstDetail.forEach((detail) => {
        if (detail.RawType === "Metal" && detail.IsBase) {
            hasMetalOption = true;
            options.metals.add(`${detail.QlyCode}K ${detail.RawCode}`);
            // Map ToneCode to color name
            if (detail.ToneCode === "R")
                options.metalColors.add("Rose");
            else if (detail.ToneCode === "Y")
                options.metalColors.add("Yellow");
            else if (detail.ToneCode === "W")
                options.metalColors.add("White");
            else if (detail.ToneCode === "YRW")
                options.metalColors.add("YELLOW/ROSE/WHITE");
            else if (detail.ToneCode === "YW")
                options.metalColors.add("YELLOW/WHITE");
            else if (detail.ToneCode === "RW")
                options.metalColors.add("ROSE/WHITE");
            else if (detail.ToneCode === "BU")
                options.metalColors.add("BLUE");
            else if (detail.ToneCode === "BL")
                options.metalColors.add("BLACK");
        }
        if (detail.RawType === "Diamond") {
            hasDiamondOption = true;
            options.diamondQualities.add(`${detail.ToneCode}/${detail.QlyCode}`);
        }
    });
    // Prepare result object with only options that exist
    const result = {};
    // Only add options if they exist in the data
    if (hasMetalOption &&
        options.metals.size > 0 &&
        existingProduct.options.find((option) => option.title === "Metal")) {
        result["Metal"] = Array.from(options.metals)[0];
    }
    if (hasMetalOption &&
        options.metalColors.size > 0 &&
        existingProduct.options.find((option) => option.title === "Metal Color")) {
        result["Metal Color"] = Array.from(options.metalColors)[0];
    }
    if (hasDiamondOption &&
        options.diamondQualities.size > 0 &&
        existingProduct.options.find((option) => option.title === "Diamond Quality")) {
        result["Diamond Quality"] = Array.from(options.diamondQualities)[0];
    }
    if (partyStyle.ItemSize &&
        options.sizes.size > 0 &&
        existingProduct.options.find((option) => option.title === "Size")) {
        result["Size"] = Array.from(options.sizes)[0];
    }
    return result;
};
exports.createProductOptionsForPartyStyleId = createProductOptionsForPartyStyleId;
const mergeProductOptions = (currentOptions, filteredOptions) => {
    const mergedOptions = [];
    // Create a map of existing options by title, excluding Default
    const existingOptionsMap = new Map(currentOptions
        .filter((opt) => opt.title !== "Default")
        .map((opt) => [opt.title, opt.values.map((v) => v.value)]));
    // Process all options (both existing and new)
    const allOptions = new Map();
    // Add existing options
    for (const [title, values] of existingOptionsMap.entries()) {
        allOptions.set(title, new Set(values));
    }
    // Add new options and merge values
    for (const filteredOpt of filteredOptions) {
        const existingValues = allOptions.get(filteredOpt.title) || new Set();
        // Add new values to the set
        filteredOpt.values.forEach((value) => existingValues.add(value));
        allOptions.set(filteredOpt.title, existingValues);
    }
    // Convert back to the required format
    for (const [title, values] of allOptions.entries()) {
        mergedOptions.push({
            title,
            values: Array.from(values),
        });
    }
    return mergedOptions;
};
exports.mergeProductOptions = mergeProductOptions;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2hlbHBlcnMvcHJvZHVjdC1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU0Esb0NBTWtCO0FBRVgsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFpQixFQUFVLEVBQUU7SUFDdkQsT0FBTyxPQUFPO1NBQ1gsTUFBTSxDQUFDLE9BQU8sQ0FBQztTQUNmLElBQUksQ0FBQyxHQUFHLENBQUM7U0FDVCxXQUFXLEVBQUU7U0FDYixPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLDhCQUE4QjtTQUNuRCxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztTQUMxQixPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQztBQVJXLFFBQUEsV0FBVyxlQVF0QjtBQUVLLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBYyxFQUFVLEVBQUU7SUFDckQsTUFBTSxTQUFTLEdBQTJCO1FBQ3hDLEVBQUUsRUFBRSxjQUFNLENBQUMsRUFBRTtRQUNiLEVBQUUsRUFBRSxjQUFNLENBQUMsRUFBRTtRQUNiLEVBQUUsRUFBRSxjQUFNLENBQUMsRUFBRTtRQUNiLEVBQUUsRUFBRSxjQUFNLENBQUMsRUFBRTtLQUNkLENBQUM7SUFDRixPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxjQUFNLENBQUMsRUFBRSxDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQVJXLFFBQUEsWUFBWSxnQkFRdkI7QUFFSyxNQUFNLDZCQUE2QixHQUFHLENBQzNDLFlBQTRELEVBQ3pDLEVBQUU7SUFDckIsTUFBTSxjQUFjLEdBQUcsWUFBWTtTQUNoQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDO1NBQzlDLE1BQU0sQ0FBQyxDQUFDLEdBQUcs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