private XmlDocument GetPreparedXml(SingleRequest request)
        {
            XmlDocument xml         = new XmlDocument();
            XmlElement  elementRows = xml.CreateElement("rows");
            List <RequestCommunication> communicationsList = request.Communication ?? new List <RequestCommunication>();

            foreach (RequestCommunication communication in communicationsList)
            {
                XmlElement elementRow = xml.CreateElement("row");
                XmlElement elementCommunicationTypeId = xml.CreateElement("CommunicationTypeId");
                elementCommunicationTypeId.InnerText = communication.CommunicationTypeId.ToString();
                XmlElement elementNumber = xml.CreateElement("Number");
                elementNumber.InnerText = communication.Number;
                elementRow.AppendChild(elementCommunicationTypeId);
                elementRow.AppendChild(elementNumber);
                AddElementsToRow(xml, elementRow, request);
                elementRows.AppendChild(elementRow);
            }
            if (communicationsList.Count < 1)
            {
                XmlElement elementRow = xml.CreateElement("row");
                AddElementsToRow(xml, elementRow, request);
                elementRows.AppendChild(elementRow);
            }
            xml.AppendChild(elementRows);
            return(xml);
        }
        private void AddElementsToRow(XmlDocument xml, XmlElement elementRow, SingleRequest request)
        {
            XmlElement elementName = xml.CreateElement("Name");

            elementName.InnerText = request.Name;
            elementRow.AppendChild(elementName);
            if (request.Id != Guid.Empty)
            {
                XmlElement elementId = xml.CreateElement("Id");
                elementId.InnerText = request.Id.ToString();
                elementRow.AppendChild(elementId);
            }
        }
        private bool SetLocalDuplicate(string entitySchemaName, List <Guid> notDuplicateList,
                                       SingleRequest request)
        {
            List <Guid> duplicates = getDuplicates(entitySchemaName, request);

            if (duplicates.Count == 0)
            {
                return(true);
            }
            if (notDuplicateList == null)
            {
                notDuplicateList = new List <Guid>();
            }
            List <Guid> checkeds = new List <Guid>();

            if (request.Id != Guid.Empty && duplicates.Count > 0)
            {
                var esqChecked = new EntitySchemaQuery(UserConnection.EntitySchemaManager,
                                                       string.Format("Vw{0}Duplicate", entitySchemaName));
                var entityColumn = esqChecked.AddColumn("Entity2");
                esqChecked.Filters.Add(esqChecked.CreateFilterWithParameters(FilterComparisonType.Equal,
                                                                             "Entity1", request.Id));
                esqChecked.Filters.Add(esqChecked.CreateFilterWithParameters(FilterComparisonType.Equal,
                                                                             "Entity2", duplicates.Cast <object>()));
                var checkedEntities = esqChecked.GetEntityCollection(UserConnection);
                if (checkedEntities.Count > 0)
                {
                    foreach (Entity entity in checkedEntities)
                    {
                        var  entityIdColumn = entity.Schema.Columns.GetByName(entityColumn.Name);
                        Guid entityId       = entity.GetTypedColumnValue <Guid>(entityIdColumn.ColumnValueName);
                        checkeds.Add(entityId);
                    }
                }
            }
            foreach (Guid objectId in duplicates)
            {
                Guid status = new Guid("F19D417E-F36B-1410-918D-20CF308CCED1");
                if (notDuplicateList.Contains(objectId))
                {
                    status = new Guid("00401284-F36B-1410-918D-20CF308CCED1");
                }
                string entityDuplicateName = string.Format("{0}Duplicate", entitySchemaName);
                if (checkeds.Contains(objectId))
                {
                    if (notDuplicateList.Contains(objectId))
                    {
                        var updateFront = new Update(UserConnection, entityDuplicateName)
                                          .Set("StatusOfDuplicateId", Column.Parameter(status))
                                          .Where("Entity1Id").IsEqual(Column.Parameter(request.Id))
                                          .And("Entity2Id").IsEqual(Column.Parameter(objectId));
                        updateFront.Execute();
                        var updateBack = new Update(UserConnection, entityDuplicateName)
                                         .Set("StatusOfDuplicateId", Column.Parameter(status))
                                         .Where("Entity2Id").IsEqual(Column.Parameter(request.Id))
                                         .And("Entity1Id").IsEqual(Column.Parameter(objectId));
                        updateFront.Execute();
                    }
                }
                else
                {
                    EntitySchema duplicateSchema      = UserConnection.EntitySchemaManager.GetInstanceByName(entityDuplicateName);
                    Entity       duplicateEntityFirst = duplicateSchema.CreateEntity(UserConnection);
                    duplicateEntityFirst.SetDefColumnValues();
                    duplicateEntityFirst.SetColumnValue("CreatedOn", DateTime.Now);
                    duplicateEntityFirst.SetColumnValue("Entity1Id", request.Id);
                    duplicateEntityFirst.SetColumnValue("Entity2Id", objectId);
                    duplicateEntityFirst.SetColumnValue("StatusOfDuplicateId", status);
                    duplicateEntityFirst.Save();

                    /*Entity duplicateEntitySecond = duplicateSchema.CreateEntity(userConnection);
                     * duplicateEntitySecond.SetDefColumnValues();
                     * duplicateEntitySecond.SetColumnValue("CreatedOn", DateTime.Now);
                     * duplicateEntitySecond.SetColumnValue("Entity1Id", objectId);
                     * duplicateEntitySecond.SetColumnValue("Entity2Id", request.Id);
                     * duplicateEntitySecond.SetColumnValue("StatusOfDuplicateId", status);
                     * duplicateEntitySecond.Save();*/
                }
            }
            return(true);
        }
        private List <Guid> getDuplicates(string entitySchemaName, SingleRequest request)
        {
            List <Guid> responce             = new List <Guid>();
            List <Guid> checkeds             = new List <Guid>();
            bool        searchByModifiedOnly = (bool)getSettingsParameter(entitySchemaName, "SearchByModifiedOnly");

            if (request.Id != Guid.Empty)
            {
                var esqChecked = new EntitySchemaQuery(UserConnection.EntitySchemaManager,
                                                       string.Format("Vw{0}Duplicate", entitySchemaName));
                var entityColumn = esqChecked.AddColumn("Entity2");
                esqChecked.Filters.Add(esqChecked.CreateFilterWithParameters(FilterComparisonType.Equal,
                                                                             "Entity1", request.Id));
                esqChecked.Filters.Add(esqChecked.CreateFilterWithParameters(FilterComparisonType.Equal,
                                                                             "StatusOfDuplicate", "00401284-F36B-1410-918D-20CF308CCED1"));
                var checkedEntities = esqChecked.GetEntityCollection(UserConnection);
                if (checkedEntities.Count > 0)
                {
                    foreach (Entity entity in checkedEntities)
                    {
                        var  entityIdColumn = entity.Schema.Columns.GetByName(entityColumn.Name);
                        Guid entityId       = entity.GetTypedColumnValue <Guid>(entityIdColumn.ColumnValueName);
                        checkeds.Add(entityId);
                    }
                }
            }

            var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager,
                                            entitySchemaName);
            var idColumn     = esq.AddColumn(esq.RootSchema.GetPrimaryColumnName());
            var filtersGroup = new EntitySchemaQueryFilterCollection(esq, LogicalOperationStrict.Or);
            var nameFilter   = esq.CreateFilterWithParameters(FilterComparisonType.Equal,
                                                              "Name", request.Name);

            filtersGroup.Add(nameFilter);
            if (entitySchemaName == "Account" && request.AlternativeName != null && request.AlternativeName.Length > 0)
            {
                filtersGroup.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal,
                                                                "AlternativeName", request.AlternativeName));
            }
            esq.Filters.Add(filtersGroup);
            if (request.Id != Guid.Empty)
            {
                esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.NotEqual,
                                                               esq.RootSchema.GetPrimaryColumnName(), request.Id));
            }
            var entities = esq.GetEntityCollection(UserConnection);

            if (entities.Count > 0)
            {
                foreach (Entity entity in entities)
                {
                    Guid entityId = entity.GetTypedColumnValue <Guid>(idColumn.Name);
                    if (!checkeds.Contains(entityId))
                    {
                        responce.Add(entityId);
                    }
                }
            }
            if (request.Communication != null && request.Communication.Count > 0)
            {
                List <string> numbers = new List <string>();
                foreach (RequestCommunication item in request.Communication)
                {
                    numbers.Add(item.Number);
                }
                var esqCom = new EntitySchemaQuery(UserConnection.EntitySchemaManager,
                                                   string.Format("{0}Communication", entitySchemaName));
                var objectIdColumn = esqCom.AddColumn(esqCom.RootSchema.GetPrimaryColumnName());
                var objectColumn   = esqCom.AddColumn(entitySchemaName);
                if (entitySchemaName == "Contact")
                {
                    esqCom.Filters.Add(esqCom.CreateFilterWithParameters(FilterComparisonType.NotEqual,
                                                                         "CommunicationType", new object[] { "3DDDB3CC-53EE-49C4-A71F-E9E257F59E49",
                                                                                                             "9A7AB41B-67CC-DF11-9B2A-001D60E938C6" }));
                }
                esqCom.Filters.Add(esqCom.CreateFilterWithParameters(FilterComparisonType.Equal, "Number", numbers));
                esqCom.Filters.Add(esqCom.CreateFilterWithParameters(FilterComparisonType.NotEqual, entitySchemaName, request.Id));
                var entitiesCom = esqCom.GetEntityCollection(UserConnection);
                if (entitiesCom.Count > 0)
                {
                    foreach (Entity entity in entitiesCom)
                    {
                        var  objectEsqColumn = entity.Schema.Columns.GetByName(objectColumn.Name);
                        Guid entityId        = entity.GetTypedColumnValue <Guid>(objectEsqColumn.ColumnValueName);
                        if (!responce.Contains(entityId) && !checkeds.Contains(entityId) && entityId != Guid.Empty)
                        {
                            responce.Add(entityId);
                        }
                    }
                }
            }
            return(responce);
        }
 public bool SetContactDuplicates(bool isNotDuplicate, List <Guid> notDuplicateList, SingleRequest request)
 {
     return(SetLocalDuplicate("Contact", notDuplicateList, request));
 }
 public List <Guid> FindContactDuplicates(SingleRequest request)
 {
     return(getDuplicates("Contact", request));
 }
 public List <Guid> FindAccountDuplicates(SingleRequest request)
 {
     return(getDuplicates("Account", request));
 }