private NavSubdivision getSubdivision(UserConnection userConnection, string name) { var esq = new EntitySchemaQuery(userConnection.EntitySchemaManager, "NavSubdivision"); esq.UseAdminRights = false; esq.AddAllSchemaColumns(); esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "NavName", name)); var collection = esq.GetEntityCollection(userConnection); NavSubdivision result; if (collection.IsEmpty()) { _logger.Info("Подразделение не " + name + " найдено."); result = new NavSubdivision(userConnection); result.UseAdminRights = false; result.SetDefColumnValues(); result.NavName = name; result.Save(); _logger.Info("Создали новую запись в Бд."); } else { result = (NavSubdivision)collection.First(); } return(result); }
public bool Evaluate(UserConnection userConnection, AdElement element, Entity relatedEntity, Entity handler) { var contact = (Contact)relatedEntity; if (element.Attributes.ContainsKey(handler.GetTypedColumnValue <string>("NavAdAttributeName"))) { _logger.Info("Парсим подразделения контакта"); char[] separator = Core.Configuration.SysSettings.GetValue(userConnection.AppConnection.SystemUserConnection, "ContactDepartmentSeparator").ToString().ToArray(); var departmentsAD = element.Attributes[handler.GetTypedColumnValue <string>("NavAdAttributeName")].Value // значение атрибута в AD .Split(separator) // делим по разделителю на департаменты .Select(d => d.Trim()) // очищаем от лишних пробелов .Where(d => d.IsNotEmpty()) // убираем из выборки пустые значения .ToArray(); if (departmentsAD.Length == 0) { _logger.Warn("Контакт не состоит ни в одном подразделении"); } var departmentsRecords = GetDepartmentsRecords(userConnection, contact); _logger.Info("Создаем запись или обновляем порядковый номер в развязочной таблице"); for (int i = 0; i < departmentsAD.Length; i++) { // получаем департамент из БД NavSubdivision subdivision = getSubdivision(userConnection, departmentsAD[i]); // если контакт не привязан к подразделению создаем запись в развязочной таблице NavSubdivisionEmployee subEmployee = departmentsRecords.FirstOrDefault(record => record.NavSubdivisionNavName == departmentsAD[i]); if (subEmployee == null) { subEmployee = CreateSubEmployee(userConnection, contact, subdivision, i); } else { subEmployee.NavNumber = i; } subEmployee.Save(false); } // убираем контакт из подразделения, в котором его нет var exSubEmploees = departmentsRecords.Where(subEmployee => !departmentsAD.Contains(subEmployee.NavSubdivisionNavName)); foreach (var exSubEmploee in exSubEmploees) { _logger.Warn("Контак в AD больше не состоит в подразделении \"" + exSubEmploee.NavSubdivisionNavName); exSubEmploee.Delete(); } } else { _logger.Info("Департамента в атрибуте LDAP " + handler.GetTypedColumnValue <string>("NavAdAttributeName") + " нет"); var departmentsRecords = GetDepartmentsRecords(userConnection, contact); // убираем контакт из подразделений, т.к. атрибут в AD отсутствует foreach (var exSubEmploee in departmentsRecords) { _logger.Warn("Контак в AD больше не состоит в подразделении \"" + exSubEmploee.NavSubdivisionNavName); exSubEmploee.Delete(); } } return(true); }
private NavSubdivisionEmployee CreateSubEmployee(UserConnection userConnection, Contact contact, NavSubdivision subdivision, int subdivisonNumber) { _logger.Info("Создаем новую запись в развязочной таблице"); var subEmployee = new NavSubdivisionEmployee(userConnection); subEmployee.UseAdminRights = false; subEmployee.SetDefColumnValues(); subEmployee.NavContactId = contact.Id; subEmployee.NavSubdivisionNavName = subdivision.NavName; subEmployee.NavNumber = subdivisonNumber; subEmployee.NavSubdivisionId = subdivision.Id; subEmployee.NavSynchronizedWithLDAP = true; subdivision.Save(); _logger.Info("Создалась новая запись."); return(subEmployee); }