public static CatalogModel GetCBOMV2CatalogModel(string salesOrg, string cbomOrg, string companyId)
        {
            // 1. Get all records include Root, catalogs, components from DB
            List <CBOMV2Model.CBOMV2Catalog> catalogRecords = CBOMV2Model.GetCBOMV2CatalogRecords(salesOrg, cbomOrg, companyId);

            CBOMV2Model.CBOMV2Catalog rootRecord = catalogRecords.Where(d => d.CatalogName.Equals(cbomOrg + "_Root")).FirstOrDefault();
            catalogRecords.RemoveAll(d => d.CatalogType == CatalogType.Component && !isPartOrdereable((d.CatalogName.Contains("/") ? d.CatalogName.Split('/')[0] : d.CatalogName), salesOrg));

            // 2. Convert DB records to standard ViewModel CatalogModel
            CatalogModel rootModel = new CatalogModel(rootRecord.Id, "", "", 2, salesOrg, cbomOrg, rootRecord.CatalogName, "", CatalogType.Root, rootRecord.HieId);

            if (catalogRecords != null && catalogRecords.Count > 0)
            {
                CBOMV2CatalogData2Model(catalogRecords, rootModel);
            }

            return(rootModel);
        }
        public static ConfiguratorModel GetCBOMV2ConfiguratorModel(string rootId, string salesOrg, string cbomOrg)
        {
            // 1. Get all records include Root, categories, components from DB
            List <CBOMV2Model.CBOMV2Category> categoryRecords = CBOMV2Model.GetCBOMV2CategoryData(rootId, salesOrg, cbomOrg);

            CBOMV2Model.CheckSharedCategory(new List <String>(), ref categoryRecords);
            categoryRecords.RemoveAll(item => (item.CategoryType == CategoryType.Component || item.CategoryType == CategoryType.SharedComponent) && !isPartOrdereable(item.CategoryName, salesOrg));
            CBOMV2Model.CBOMV2Category rootRecord = (from q in categoryRecords where (q.Id.Equals(rootId) || q.Level == 2) select q).ToList().FirstOrDefault();

            // 2. Convert DB records to ConfiguratorRecord which contains whole tree structure
            ConfiguratorRecord rootNode = new ConfiguratorRecord(rootRecord.Id, rootRecord.CategoryName, rootRecord.CategoryDesc, 0, CategoryType.Root, 1, 1, true, false, true, false, rootRecord.HieId);

            CBOMV2ConfiguratorData2Model(categoryRecords, rootNode);

            // 3. Add rootNode to standard ViewModel ConfiguratorModel
            ConfiguratorModel rootModel = new ConfiguratorModel(salesOrg, cbomOrg, 2, "", "", rootNode);

            return(rootModel);
        }