Exemple #1
0
        /// <summary>
        /// Deletes the catalog node.
        /// </summary>
        /// <param name="catalogNodeId">The catalog node id.</param>
        /// <param name="catalogId">The catalog id.</param>
        /// <param name="catalogNodeDto">The catalog node Dto.</param>
        /// <param name="catalogDto">The catalog Dto.</param>
        internal static void DeleteNodeRecursive(int catalogNodeId, int catalogId, ref CatalogNodeDto catalogNodeDto, ref CatalogRelationDto catalogRelationDto)
        {
            CatalogNodeDto.CatalogNodeRow row = catalogNodeDto.CatalogNode.FindByCatalogNodeId(catalogNodeId);
            if (row != null)
            {
                DataRow[] catalogRelations = catalogRelationDto.CatalogNodeRelation.Select(String.Format("CatalogId = {0} AND ParentNodeId = {1}", catalogId, catalogNodeId));
                foreach (DataRow catalogRelation in catalogRelations)
                {
                    catalogRelation.Delete();
                }

                DataRow[] nodeEntryRelations = catalogRelationDto.NodeEntryRelation.Select(String.Format("CatalogId = {0} AND CatalogNodeId = {1}", catalogId, catalogNodeId));
                foreach (DataRow nodeEntryRelation in nodeEntryRelations)
                {
                    nodeEntryRelation.Delete();
                }

                row.Delete();

                DataRow[] catalogNodes = catalogNodeDto.CatalogNode.Select(String.Format("ParentNodeId = {0}", catalogNodeId));
                if (catalogNodes.Length > 0)
                {
                    foreach (DataRow catalogNode in catalogNodes)
                    {
                        DeleteNodeRecursive((int)catalogNode["CatalogNodeId"], catalogId, ref catalogNodeDto, ref catalogRelationDto);
                    }
                }
            }
        }
Exemple #2
0
 /// <summary>
 /// Loads the node.
 /// </summary>
 /// <param name="admin">The admin.</param>
 /// <param name="row">The row.</param>
 /// <param name="responseGroup">The response group.</param>
 private static void LoadNode(CatalogNodeAdmin admin, CatalogNodeDto.CatalogNodeRow row, CatalogNodeResponseGroup responseGroup)
 {
     if (responseGroup.ContainsGroup(CatalogNodeResponseGroup.ResponseGroup.CatalogNodeFull) || responseGroup.ContainsGroup(CatalogNodeResponseGroup.ResponseGroup.Assets))
     {
         // Load Associations
         admin.LoadAssets(row.CatalogNodeId);
     }
 }
Exemple #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CatalogNode"/> class.
        /// </summary>
        /// <param name="input">The input.</param>
        public CatalogNode(CatalogNodeDto.CatalogNodeRow input)
        {
            // Populate basic parameters
            this.ID              = input.Code;
            this.Name            = input.Name;
            this.IsActive        = input.IsActive;
            this.StartDate       = input.StartDate;
            this.EndDate         = input.EndDate;
            this.DisplayTemplate = input.TemplateName;
            this.ParentNodeId    = input.ParentNodeId;
            this.CatalogId       = input.CatalogId;
            this.CatalogNodeId   = input.CatalogNodeId;

            // Populate attributes
            this.ItemAttributes = new ItemAttributes();

            // Cycle through columns
            ObjectHelper.CreateAttributes(this.ItemAttributes, input);

            // Populate SEO
            CatalogNodeDto.CatalogItemSeoRow[] seoRows = input.GetCatalogItemSeoRows();
            if (seoRows.Length > 0)
            {
                ArrayList seoList = new ArrayList();
                foreach (CatalogNodeDto.CatalogItemSeoRow seoRow in seoRows)
                {
                    Seo seo = new Seo();
                    seo.Description  = seoRow.IsDescriptionNull() ? "" : seoRow.Description;
                    seo.Keywords     = seoRow.IsKeywordsNull() ? "" : seoRow.Keywords;
                    seo.LanguageCode = seoRow.LanguageCode;
                    seo.Title        = seoRow.IsTitleNull() ? "" : seoRow.Title;
                    seo.Uri          = seoRow.Uri;
                    seoList.Add(seo);
                }

                this.SeoInfo = (Seo[])seoList.ToArray(typeof(Seo));
            }

            // Populate Assets
            CatalogNodeDto.CatalogItemAssetRow[] assetRows = input.GetCatalogItemAssetRows();
            if (assetRows.Length > 0)
            {
                List <ItemAsset> assets = new List <ItemAsset>();
                foreach (CatalogNodeDto.CatalogItemAssetRow assetRow in assetRows)
                {
                    ItemAsset asset = new ItemAsset();
                    asset.AssetKey  = assetRow.AssetKey;
                    asset.AssetType = assetRow.AssetType;
                    asset.GroupName = assetRow.GroupName;
                    asset.SortOrder = assetRow.SortOrder;
                    assets.Add(asset);
                }

                this.Assets = assets.ToArray();
            }
        }
        /// <summary>
        /// Creates a line item.
        /// Code copied from OrderHelper.cs.
        /// </summary>
        /// <param name="random">A Random object seeded from the start of test method.</param>
        /// <returns></returns>
        private LineItem createLineItem(Random random, Guid shippingMethod, String shippingMethodName)
        {
            CatalogDto catalogs = CatalogContext.Current.GetCatalogDto();

            CatalogEntryDto.CatalogEntryRow entry = null;
            bool   found       = false;
            string catalogName = String.Empty;

            int seed = 0;

            while (!found)
            {
                seed = random.Next(catalogs.Catalog.Count - 1);
                CatalogDto.CatalogRow catalog = catalogs.Catalog[seed];
                catalogName = catalog.Name;

                // Get Catalog Nodes
                CatalogNodeDto nodes = CatalogContext.Current.GetCatalogNodesDto(catalogName);

                // Pick random node
                if (nodes.CatalogNode.Count > 0)
                {
                    seed = random.Next(nodes.CatalogNode.Count - 1);

                    CatalogNodeDto.CatalogNodeRow node = nodes.CatalogNode[seed];

                    CatalogEntryDto entryDto = CatalogContext.Current.GetCatalogEntriesDto(catalogName, node.CatalogNodeId);

                    if (entryDto.CatalogEntry.Count > 0)
                    {
                        seed  = random.Next(entryDto.CatalogEntry.Count - 1);
                        entry = entryDto.CatalogEntry[seed];
                        if (entry.IsActive)
                        {
                            found = true;
                        }
                    }
                }
            }

            LineItem lineItem = new LineItem();

            lineItem.DisplayName        = entry.Name;
            lineItem.CatalogEntryId     = entry.Code;
            lineItem.ShippingMethodId   = shippingMethod;
            lineItem.ShippingMethodName = shippingMethodName;
            lineItem.ShippingAddressId  = "Home";
            // Choose a random quantity for chosen product.
            int quantity = random.Next(1, 7);

            lineItem.Quantity    = quantity;
            lineItem.CatalogNode = catalogName;
            lineItem.Discounts.Add(OrderHelper.CreateLineItemDiscount());
            return(lineItem);
        }
Exemple #5
0
        /// <summary>
        /// Handles the RowChanged event of the CatalogNode control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.Data.DataRowChangeEventArgs"/> instance containing the event data.</param>
        void CatalogNode_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            CatalogNodeDto.CatalogNodeDataTable table = (CatalogNodeDto.CatalogNodeDataTable)sender;

            CatalogNodeDto.CatalogNodeRow row = (CatalogNodeDto.CatalogNodeRow)table.Rows[0];
            if (row.CatalogNodeId > 0)
            {
                MetaDataTab.MetaClassId = row.MetaClassId;
                MetaDataTab.ObjectId    = row.CatalogNodeId;
            }
        }
Exemple #6
0
        /// <summary>
        /// Creates the line item.
        /// </summary>
        /// <returns></returns>
        public static LineItem CreateLineItem()
        {
            CatalogDto catalogs = CatalogContext.Current.GetCatalogDto();

            CatalogEntryDto.CatalogEntryRow entry = null;
            bool   found       = false;
            string catalogName = String.Empty;
            Random random      = new Random();

            int seed = 0;

            while (!found)
            {
                seed = random.Next(catalogs.Catalog.Count - 1);
                CatalogDto.CatalogRow catalog = catalogs.Catalog[seed];
                catalogName = catalog.Name;

                // Get Catalog Nodes
                CatalogNodeDto nodes = CatalogContext.Current.GetCatalogNodesDto(catalogName);

                // Pick random node
                if (nodes.CatalogNode.Count > 0)
                {
                    seed = random.Next(nodes.CatalogNode.Count - 1);

                    CatalogNodeDto.CatalogNodeRow node = nodes.CatalogNode[seed];

                    CatalogEntryDto entryDto = CatalogContext.Current.GetCatalogEntriesDto(catalogName, node.CatalogNodeId);

                    if (entryDto.CatalogEntry.Count > 0)
                    {
                        seed  = random.Next(entryDto.CatalogEntry.Count - 1);
                        entry = entryDto.CatalogEntry[seed];
                        if (entry.IsActive)
                        {
                            found = true;
                        }
                    }
                }
            }

            LineItem lineItem = new LineItem();

            lineItem.DisplayName        = entry.Name;
            lineItem.CatalogEntryId     = entry.Code;
            lineItem.ShippingMethodId   = new Guid("17995798-a2cc-43ad-81e8-bb932f6827e4");
            lineItem.ShippingMethodName = "Online Download";
            lineItem.ShippingAddressId  = "Home";
            lineItem.ListPrice          = 100;
            lineItem.Quantity           = 2;
            lineItem.CatalogNode        = catalogName;
            lineItem.Discounts.Add(CreateLineItemDiscount());
            return(lineItem);
        }
Exemple #7
0
        /// <summary>
        /// Handles the RowChanged event of the CatalogNode control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.Data.DataRowChangeEventArgs"/> instance containing the event data.</param>
        void CatalogNode_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            CatalogNodeDto.CatalogNodeDataTable table = (CatalogNodeDto.CatalogNodeDataTable)sender;

            CatalogNodeDto.CatalogNodeRow row = (CatalogNodeDto.CatalogNodeRow)table.Rows[0];
            if (row.CatalogNodeId > 0)
            {
                MetaDataTab.MetaClassId = row.MetaClassId;
                MetaDataTab.ObjectId    = row.CatalogNodeId;
                MetaDataTab.SaveChanges(null);
            }
            //throw new Exception("The method or operation is not implemented.");
        }
        public static CatalogNodeDto CreateNode(
            string code      = "NODECODE",
            bool active      = true,
            string name      = "NODENAME",
            int?parentNodeId = null,
            string seoUri    = "")
        {
            var catalogNodeDto =
                CatalogContext.Current.GetCatalogNodeDto(
                    code,
                    new CatalogNodeResponseGroup(CatalogNodeResponseGroup.ResponseGroup.CatalogNodeInfo));

            if (catalogNodeDto.CatalogNode.Count == 0)
            {
                var metaClass = MetaClass.Load(CatalogContext.MetaDataContext, "CatalogNodeEx");
                CatalogNodeDto.CatalogNodeRow catalogNodeRow = catalogNodeDto.CatalogNode.NewCatalogNodeRow();
                catalogNodeRow.CatalogId     = RootCatalogId;
                catalogNodeRow.StartDate     = DateTime.Now;
                catalogNodeRow.EndDate       = DateTime.Now.AddYears(2);
                catalogNodeRow.Name          = name;
                catalogNodeRow.Code          = code;
                catalogNodeRow.ParentNodeId  = parentNodeId ?? DefaultCatalogNodeId;
                catalogNodeRow.IsActive      = active;
                catalogNodeRow.SortOrder     = 0;
                catalogNodeRow.ApplicationId = AppContext.Current.ApplicationId;
                // hardcoded for now
                catalogNodeRow.TemplateName = "NodeEntriesTemplate";
                catalogNodeRow.MetaClassId  = metaClass.Id;
                catalogNodeDto.CatalogNode.AddCatalogNodeRow(catalogNodeRow);

                if (!string.IsNullOrEmpty(seoUri))
                {
                    var newSeoRow = catalogNodeDto.CatalogItemSeo.NewCatalogItemSeoRow();
                    newSeoRow.ApplicationId = AppContext.Current.ApplicationId;
                    newSeoRow.CatalogNodeId = catalogNodeDto.CatalogNode[0].CatalogNodeId;
                    newSeoRow.Description   = "DESCRIPTION";
                    newSeoRow.LanguageCode  = "en";
                    newSeoRow.Uri           = seoUri;
                    if (newSeoRow.RowState == DataRowState.Detached)
                    {
                        catalogNodeDto.CatalogItemSeo.AddCatalogItemSeoRow(newSeoRow);
                    }
                }

                CatalogContext.Current.SaveCatalogNode(catalogNodeDto);
            }
            return(catalogNodeDto);
        }
Exemple #9
0
        /// <summary>
        /// Saves the changes.
        /// </summary>
        /// <param name="context">The context.</param>
        public void SaveChanges(IDictionary context)
        {
            CatalogNodeDto dto = (CatalogNodeDto)context["CatalogNodeDto"];

            CatalogNodeDto.CatalogNodeRow row = null;

            if (dto.CatalogNode == null || dto.CatalogNode.Count == 0)
            {
                row = dto.CatalogNode.NewCatalogNodeRow();
                row.ApplicationId = CatalogConfiguration.Instance.ApplicationId;
            }
            else
            {
                row = dto.CatalogNode[0];
                if (row.MetaClassId != Int32.Parse(MetaClassList.SelectedValue))
                {
                    MetaObject.Delete(CatalogContext.MetaDataContext, row.CatalogNodeId, row.MetaClassId);
                }
            }

            row.Name      = Name.Text;
            row.StartDate = AvailableFrom.Value.ToUniversalTime();
            row.EndDate   = ExpiresOn.Value.ToUniversalTime();
            row.Code      = CodeText.Text;
            row.SortOrder = Int32.Parse(SortOrder.Text);
            row.IsActive  = IsCatalogNodeActive.IsSelected;

            if (ParentCatalogId > 0)
            {
                row.CatalogId = ParentCatalogId;

                if ((ParentCatalogNodeId > 0 && ParentCatalogNodeId != row.CatalogNodeId) || ParentCatalogNodeId == 0)
                {
                    row.ParentNodeId = ParentCatalogNodeId;
                }
            }

            row.TemplateName = DisplayTemplate.SelectedValue;
            row.MetaClassId  = Int32.Parse(MetaClassList.SelectedValue);

            if (row.RowState == DataRowState.Detached)
            {
                dto.CatalogNode.Rows.Add(row);
            }

            dto.CatalogNode.RowChanged += new DataRowChangeEventHandler(CatalogNode_RowChanged);
        }
Exemple #10
0
 public static FindDocumentBuilder.CatalogNodeInfo GetCatalogNode(int catalogNodeId, Dictionary <int, FindDocumentBuilder.CatalogInfo> catalogs, Dictionary <int, FindDocumentBuilder.CatalogNodeInfo> catalogNodes)
 {
     FindDocumentBuilder.CatalogNodeInfo catalogNodeInfo;
     if (!catalogNodes.TryGetValue(catalogNodeId, out catalogNodeInfo))
     {
         CatalogNodeDto.CatalogNodeRow catalogNodeRow = FindDocumentBuilder.CatalogSystem.GetCatalogNodeDto(catalogNodeId).CatalogNode.Single <CatalogNodeDto.CatalogNodeRow>();
         catalogNodeInfo = new FindDocumentBuilder.CatalogNodeInfo()
         {
             CatalogNodeId     = catalogNodeId,
             CatalogNodeCode   = FindDocumentBuilder.FormatStructureElement(catalogNodeRow.Code),
             Catalog           = FindDocumentBuilder.CatalogInfo.GetCatalog(catalogNodeRow.CatalogId, catalogs),
             ParentCatalogNode = (FindDocumentBuilder.CatalogNodeInfo)null
         };
         catalogNodes.Add(catalogNodeId, catalogNodeInfo);
         if (catalogNodeRow.ParentNodeId > 0)
         {
             catalogNodeInfo.ParentCatalogNode = FindDocumentBuilder.CatalogNodeInfo.GetCatalogNode(catalogNodeRow.ParentNodeId, catalogs, catalogNodes);
         }
     }
     return(catalogNodeInfo);
 }
Exemple #11
0
        /// <summary>
        /// Loads the node.
        /// </summary>
        /// <param name="row">The row.</param>
        /// <param name="recursive">if set to <c>true</c> [recursive].</param>
        /// <param name="responseGroup">The response group.</param>
        /// <returns></returns>
        internal static CatalogNode LoadNode(/*CatalogNodeDto dto,*/ CatalogNodeDto.CatalogNodeRow row, bool recursive, CatalogNodeResponseGroup responseGroup)
        {
            CatalogNode node = null;

            // Load node
            if (row != null)
            {
                node = new CatalogNode(row);
            }
            else
            {
                node = new CatalogNode();
            }

            // Populate children
            if (responseGroup.ContainsGroup(CatalogNodeResponseGroup.ResponseGroup.CatalogNodeFull) || responseGroup.ContainsGroup(CatalogNodeResponseGroup.ResponseGroup.Children))
            {
                CatalogNodeDto childrenDto = GetCatalogNodesDto(row.CatalogId, row.CatalogNodeId, responseGroup);
                CatalogNodes   nodes       = LoadNodes(childrenDto, node, recursive, responseGroup);
                node.Children = nodes;
            }

            return(node);
        }
        /// <summary>
        /// Clones the catalog node.
        /// </summary>
        /// <param name="parentCatalogId">The parent catalog id.</param>
        /// <param name="parentCatalogNodeId">The parent catalog node id.</param>
        /// <param name="catalogNodeId">The catalog node id.</param>
        private void CloneCatalogNode(int parentCatalogId, int parentCatalogNodeId, int catalogNodeId)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                CatalogNodeDto catalogNodeDto = CatalogContext.Current.GetCatalogNodeDto(catalogNodeId);
                if (catalogNodeDto.CatalogNode.Count > 0)
                {
                    CatalogNodeDto newCatalogNodeDto = new CatalogNodeDto();
                    newCatalogNodeDto.CatalogNode.ImportRow(catalogNodeDto.CatalogNode[0]);
                    newCatalogNodeDto.CatalogNode[0].SetAdded();
                    newCatalogNodeDto.CatalogNode[0].ParentNodeId = parentCatalogNodeId;
                    newCatalogNodeDto.CatalogNode[0].Code         = Guid.NewGuid().ToString();

                    if (catalogNodeDto.CatalogItemSeo.Count > 0)
                    {
                        foreach (CatalogNodeDto.CatalogItemSeoRow row in catalogNodeDto.CatalogItemSeo.Rows)
                        {
                            newCatalogNodeDto.CatalogItemSeo.ImportRow(row);
                            newCatalogNodeDto.CatalogItemSeo[newCatalogNodeDto.CatalogItemSeo.Count - 1].SetAdded();
                            newCatalogNodeDto.CatalogItemSeo[newCatalogNodeDto.CatalogItemSeo.Count - 1].Uri = Guid.NewGuid().ToString() + ".aspx";
                        }
                    }

                    if (newCatalogNodeDto.HasChanges())
                    {
                        CatalogContext.Current.SaveCatalogNode(newCatalogNodeDto);
                    }

                    if (newCatalogNodeDto.CatalogNode.Count > 0)
                    {
                        CatalogNodeDto.CatalogNodeRow node = newCatalogNodeDto.CatalogNode[0];
                        int newCatalogNodeId = node.CatalogNodeId;
                        int metaClassId      = node.MetaClassId;

                        // load list of MetaFields for MetaClass
                        MetaClass           metaClass  = MetaClass.Load(CatalogContext.MetaDataContext, metaClassId);
                        MetaFieldCollection metaFields = metaClass.MetaFields;

                        // cycle through each language and get meta objects
                        CatalogContext.MetaDataContext.UseCurrentUICulture = false;
                        string[] languages = GetCatalogLanguages(parentCatalogId);
                        if (languages != null)
                        {
                            foreach (string language in languages)
                            {
                                CatalogContext.MetaDataContext.UseCurrentUICulture = false;
                                CatalogContext.MetaDataContext.Language            = language;

                                MetaObject metaObject = MetaObject.Load(CatalogContext.MetaDataContext, catalogNodeDto.CatalogNode[0].CatalogNodeId, metaClassId);

                                MetaObject newMetaObject = MetaObject.NewObject(CatalogContext.MetaDataContext, newCatalogNodeId, metaClassId, FrameworkContext.Current.Profile.UserName);

                                foreach (MetaField metaField in metaFields)
                                {
                                    // skip system MetaFields
                                    if (!metaField.IsUser)
                                    {
                                        continue;
                                    }

                                    switch (metaField.DataType)
                                    {
                                    case MetaDataType.File:
                                    case MetaDataType.Image:
                                    case MetaDataType.ImageFile:
                                        MetaFile metaFile = (MetaFile)metaObject[metaField];
                                        if (metaFile != null)
                                        {
                                            newMetaObject[metaField] = new MetaFile(metaFile.Name, metaFile.ContentType, metaFile.Buffer);
                                        }
                                        break;

                                    default:
                                        if (metaObject[metaField] != null)
                                        {
                                            newMetaObject[metaField] = metaObject[metaField];
                                        }
                                        break;
                                    }
                                }
                                newMetaObject.AcceptChanges(CatalogContext.MetaDataContext);
                            }
                        }
                        CatalogContext.MetaDataContext.UseCurrentUICulture = false;

                        CatalogNodeDto childCatalogNodesDto = CatalogContext.Current.GetCatalogNodesDto(parentCatalogId, catalogNodeId);
                        if (childCatalogNodesDto.CatalogNode.Count > 0)
                        {
                            for (int i = 0; i < childCatalogNodesDto.CatalogNode.Count; i++)
                            {
                                CloneCatalogNode(parentCatalogId, newCatalogNodeDto.CatalogNode[0].CatalogNodeId, childCatalogNodesDto.CatalogNode[i].CatalogNodeId);
                            }
                        }

                        CatalogEntryDto catalogEntriesDto = CatalogContext.Current.GetCatalogEntriesDto(parentCatalogId, catalogNodeDto.CatalogNode[0].CatalogNodeId);
                        if (catalogEntriesDto.CatalogEntry.Count > 0)
                        {
                            for (int i = 0; i < catalogEntriesDto.CatalogEntry.Count; i++)
                            {
                                CloneNodeEntry(parentCatalogId, catalogNodeId, catalogEntriesDto.CatalogEntry[i].CatalogEntryId, parentCatalogId, newCatalogNodeDto.CatalogNode[0].CatalogNodeId);
                            }
                        }
                    }
                }

                scope.Complete();
            }
        }
Exemple #13
0
        protected override int CreateSystemRow(FillDataMode Mode, int RowIndex, params object[] Item)
        {
            int    i = 0;
            object objSysRowAction = Item[i++];
            //CatalogNode
            object objCode         = Item[i++];
            object objParentCode   = Item[i++];
            object objName         = Item[i++];
            object objStartDate    = Item[i++];
            object objEndDate      = Item[i++];
            object objTemplateName = Item[i++];
            object objIsActive     = Item[i++];
            object objSortOrder    = Item[i++];
            //SEO
            object objSeoTitle       = Item[i++];
            object objSeoUrl         = Item[i++];
            object objSeoDescription = Item[i++];
            object objSeoKeywords    = Item[i++];

            CatalogNodeDto.CatalogNodeRow nodeRow = null;

            try
            {
                RowAction sysRowAction = RowAction.Default;

                if (objSysRowAction != null)
                {
                    sysRowAction = GetRowActionEnum((string)objSysRowAction);
                }

                string Code;
                if (!String.IsNullOrEmpty((string)objCode))
                {
                    Code = (string)objCode;
                }
                else
                {
                    throw new AbsentValue("Code");
                }

                int parentNodeId = 0;
                if (objParentCode != null)
                {
                    if (!objParentCode.Equals(String.Empty))
                    {
                        CatalogNodeDto parentNodeDto = CatalogNodeManager.GetCatalogNodeDto((string)objParentCode, new CatalogNodeResponseGroup(CatalogNodeResponseGroup.ResponseGroup.CatalogNodeInfo));
                        if (parentNodeDto.CatalogNode.Count > 0)
                        {
                            parentNodeId = parentNodeDto.CatalogNode[0].CatalogNodeId;
                        }
                    }
                }

                bool           bIsNew         = false;
                CatalogNodeDto catalogNodeDto = CatalogNodeManager.GetCatalogNodeDto(Code, new CatalogNodeResponseGroup(CatalogNodeResponseGroup.ResponseGroup.CatalogNodeFull));
                if (catalogNodeDto.CatalogNode.Count > 0)
                {
                    if (sysRowAction == RowAction.Insert)
                    {
                        throw new MDPImportException(String.Format("The Catalog Node with Code '{0}' already exists.", Code));
                    }

                    nodeRow = catalogNodeDto.CatalogNode[0];

                    if (sysRowAction == RowAction.Delete)
                    {
                        CatalogContext.Current.DeleteCatalogNode(nodeRow.CatalogNodeId, nodeRow.CatalogId);
                        return(0);
                    }

                    if (objParentCode != null && parentNodeId > -1)
                    {
                        nodeRow.ParentNodeId = parentNodeId;
                    }
                }
                else
                {
                    if (sysRowAction == RowAction.Update)
                    {
                        throw new MDPImportException(String.Format("The Catalog Node with code '{0}' does not exists.", Code));
                    }

                    if (sysRowAction == RowAction.Delete)
                    {
                        throw new MDPImportException(String.Format("The Catalog Node with code '{0}' does not exists.", Code));
                    }

                    nodeRow = catalogNodeDto.CatalogNode.NewCatalogNodeRow();
                    nodeRow.ApplicationId = CatalogConfiguration.Instance.ApplicationId;
                    nodeRow.CatalogId     = _CatalogId;
                    nodeRow.Code          = Code;
                    nodeRow.ParentNodeId  = parentNodeId;
                    nodeRow.Name          = String.Empty;
                    nodeRow.StartDate     = DateTime.UtcNow;
                    nodeRow.EndDate       = DateTime.UtcNow.AddYears(3);
                    nodeRow.TemplateName  = String.Empty;
                    nodeRow.IsActive      = false;
                    nodeRow.SortOrder     = 0;
                    bIsNew = true;
                }

                if (objName != null)
                {
                    nodeRow.Name = (string)objName;
                }

                if (objStartDate != null)
                {
                    nodeRow.StartDate = ((DateTime)objStartDate).ToUniversalTime();
                }

                if (objEndDate != null)
                {
                    nodeRow.EndDate = ((DateTime)objEndDate).ToUniversalTime();
                }

                if (objTemplateName != null)
                {
                    nodeRow.TemplateName = (string)objTemplateName;
                }

                if (objIsActive != null)
                {
                    nodeRow.IsActive = (bool)objIsActive;
                }

                if (objSortOrder != null)
                {
                    nodeRow.SortOrder = (int)objSortOrder;
                }

                int oldMetaClassId = 0;
                if (!_isSystemClass && _metaClassId > 0)
                {
                    if (!bIsNew)
                    {
                        oldMetaClassId = nodeRow.MetaClassId;
                    }

                    nodeRow.MetaClassId = _metaClassId;
                }
                else if (bIsNew)
                {
                    throw new MDPImportException("The new category cannot be created without metaclass definition.");
                }

                if (bIsNew)
                {
                    catalogNodeDto.CatalogNode.AddCatalogNodeRow(nodeRow);
                }

                //SEO
                CatalogNodeDto.CatalogItemSeoRow catalogItemSeoRow = null;
                bool bSeoIsNew = false;
                if (!String.IsNullOrEmpty(this.Context.Language))
                {
                    if (catalogNodeDto.CatalogItemSeo.Count > 0)
                    {
                        DataRow[] drs = catalogNodeDto.CatalogItemSeo.Select(String.Format("LanguageCode LIKE '{0}' AND CatalogNodeId = {1}", this.Context.Language, nodeRow.CatalogNodeId));
                        if (drs.Length > 0)
                        {
                            catalogItemSeoRow = (CatalogNodeDto.CatalogItemSeoRow)drs[0];
                        }
                    }

                    if (catalogItemSeoRow == null)
                    {
                        catalogItemSeoRow = catalogNodeDto.CatalogItemSeo.NewCatalogItemSeoRow();
                        catalogItemSeoRow.ApplicationId = CatalogConfiguration.Instance.ApplicationId;
                        catalogItemSeoRow.LanguageCode  = this.Context.Language.ToLower();
                        catalogItemSeoRow.CatalogNodeId = nodeRow.CatalogNodeId;
                        catalogItemSeoRow.Description   = String.Empty;
                        catalogItemSeoRow.Keywords      = String.Empty;
                        bSeoIsNew = true;
                    }

                    if (objSeoTitle != null)
                    {
                        catalogItemSeoRow.Title = (string)objSeoTitle;
                    }

                    if (objSeoUrl != null)
                    {
                        catalogItemSeoRow.Uri = (string)objSeoUrl;
                    }
                    else if (bSeoIsNew)
                    {
                        // Auto generate the URL if empty
                        string name = catalogNodeDto.CatalogNode[0].Name;
                        string url  = String.Format("{0}.aspx", CommerceHelper.CleanUrlField(name));

                        int index = 1;
                        while (CatalogContext.Current.GetCatalogEntryByUriDto(url, this.Context.Language).CatalogEntry.Count != 0 || CatalogContext.Current.GetCatalogNodeDto(url, this.Context.Language).CatalogNode.Count != 0)
                        {
                            url = String.Format("{0}-{1}.aspx", CommerceHelper.CleanUrlField(name), index.ToString());
                            index++;
                        }

                        catalogItemSeoRow.Uri = url;
                    }


                    if (objSeoDescription != null)
                    {
                        catalogItemSeoRow.Description = (string)objSeoDescription;
                    }

                    if (objSeoKeywords != null)
                    {
                        catalogItemSeoRow.Keywords = (string)objSeoKeywords;
                    }

                    if (bSeoIsNew)
                    {
                        catalogNodeDto.CatalogItemSeo.AddCatalogItemSeoRow(catalogItemSeoRow);
                    }
                }

                using (TransactionScope tx = new TransactionScope())
                {
                    // Save modifications
                    if (catalogNodeDto.HasChanges())
                    {
                        CatalogContext.Current.SaveCatalogNode(catalogNodeDto);
                    }

                    if (!bIsNew && !_isSystemClass && oldMetaClassId != nodeRow.MetaClassId)
                    {
                        MetaObject.Delete(this.Context, nodeRow.CatalogNodeId, oldMetaClassId);
                        MetaObject obj = MetaObject.NewObject(this.Context, nodeRow.CatalogNodeId, nodeRow.MetaClassId);
                        obj.AcceptChanges(this.Context);
                    }

                    tx.Complete();
                }
            }
            catch (Exception ex)
            {
                throw new MDPImportException(ex.Message, null, RowIndex, null, null, Item);
            }

            return(nodeRow.CatalogNodeId);
        }