protected override Entity GetRecord(UserConnection userConnection, AdElement adElement) { if (!adElement.Attributes.ContainsKey(_AdIdAttribute)) { throw new Exception("� �������� AD ����������� �������� �������� " + _AdIdAttribute + " ��� ������������� � ���������."); } string adIdentificator = adElement.Attributes[_AdIdAttribute].Value; var esq = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Contact"); esq.AddAllSchemaColumns(); esq.UseAdminRights = false; esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, _EntityAdAttribute, adIdentificator)); var entity = esq.GetEntityCollection(userConnection).FirstOrDefault(); // ���� ������� �� ������, �� ������� ����� if (entity == null) { entity = new Contact(userConnection); entity.UseAdminRights = false; entity.SetDefColumnValues(); // ��������� ���� � �� entity.SetColumnValue(_EntityAdAttribute, adIdentificator); entity.Save(false); } entity.UseAdminRights = false; return(entity); }
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); }
public bool Evaluate(UserConnection userConnection, AdElement element, Entity relatedEntity, Entity handler) { _logger.Info(handler.GetColumnDisplayValue(handler.Schema.Columns.GetByName("NavHandler"))); // проверяем, что из AD мы получили значение нужного атрибута var existsInAD = element.Attributes.ContainsKey(handler.GetTypedColumnValue <string>("NavAdAttributeName")); var hasValueInAD = false; var adValue = string.Empty; object setValue = null; if (existsInAD) { adValue = element.Attributes[handler.GetTypedColumnValue <string>("NavAdAttributeName")].Value; _logger.Info("Приводим значение атрибута к типу, записываемому в БД"); // определяем тип к которому нужно привести и приводим string typeName = AdAttributesHelper.GetXmlElement("type", handler.GetTypedColumnValue <string>("NavHandlerParameterXML")); if (typeName.IsEmpty()) { _logger.Warn("Не удалось прочитать значение xml-элемента <type>"); } switch (typeName.Trim().ToLower()) { case "bool": string revertParam = AdAttributesHelper.GetXmlElement("revert", handler.GetTypedColumnValue <string>("NavHandlerParameterXML")); bool revert = revertParam == "true"; setValue = getBoolValue(adValue); if (revert) { setValue = !(bool)setValue; } break; case "date": setValue = getDateValue(adValue); break; default: setValue = adValue; break; } hasValueInAD = (setValue != null); } if (hasValueInAD) { // Если атрибут существует в AD и у него есть значение _logger.Info("Значение атрибута LDAP [" + handler.GetTypedColumnValue <string>("NavAdAttributeName") + "] = \"" + adValue + "\""); } else { // Если атрибут отсутствует в AD или пустует, удаляем соотвутствующие данные из системы _logger.Info("Значение атрибута в LDAP отсутствует или пустое. Очищаем поле " + handler.GetTypedColumnValue <string>("NavAdAttributeName")); } relatedEntity.SetColumnValue(handler.GetTypedColumnValue <string>("NavEntityFieldName"), setValue); _logger.Info("Сохраняем запись"); relatedEntity.Save(false); return(true); }
public bool Evaluate(UserConnection userConnection, AdElement element, Entity relatedEntity, Entity handler) { _logger.Info("Добавляем средство связи " + handler.GetTypedColumnValue <string>("NavAdAttributeName")); string adValue = AdAttributesHelper.GetAdValue(element, (NavAdAttributesHandlers)handler); var contact = (Contact)relatedEntity; Guid communicationTypeId = GetCommunicationType(userConnection, handler.GetTypedColumnValue <string>("NavAdAttributeName")); ContactCommunication[] contactCommunications = GetContactCommunications(userConnection, contact, communicationTypeId); if (adValue != null) { char[] separator = Core.Configuration.SysSettings.GetValue(userConnection.AppConnection.SystemUserConnection, "ContactCommunicationSeparator").ToString().ToArray(); var communicationValues = adValue.Split(separator).Select(s => s.Trim()).ToList(); // обрабатываем уже существующие в bpm средства связи foreach (var cm in contactCommunications) { if (!communicationValues.Contains(cm.Number)) { cm.Delete(); } else { communicationValues.Remove(cm.Number); } } // создаем отсутствующие записи foreach (var cv in communicationValues) { var contactCommunication = new ContactCommunication(userConnection); contactCommunication.UseAdminRights = false; contactCommunication.SetDefColumnValues(); contactCommunication.ContactId = contact.Id; contactCommunication.CommunicationTypeId = communicationTypeId; contactCommunication.NavSynchronizedWithLDAP = true; contactCommunication.Number = cv; contactCommunication.Save(false); } } else { foreach (var cm in contactCommunications) { cm.Delete(); } } return(true); }
/// <summary> /// Получаем из элемента AD значение из атрибута, указанном в записи обработчика в БД /// </summary> /// <param name="element">Элемент, полученныей из AD</param> /// <param name="handler">Запись обработчика в БД</param> /// <returns>строковое значение атрибута</returns> public static string GetAdValue(AdElement element, NavAdAttributesHandlers handler) { _logger.Info("Получаем из элемента AD значение из атрибута, указанном в записи обработчика в БД " + handler.NavAdAttributeName); string adValue = null; // проверяем, что из AD мы получили значение нужного атрибута if (element.Attributes.ContainsKey(handler.NavAdAttributeName)) { adValue = element.Attributes[handler.NavAdAttributeName].Value; } else { _logger.Warn("В элементе AD не найден атрибут " + handler.NavAdAttributeName); } return(adValue); }
public bool Evaluate(UserConnection userConnection, AdElement element, Entity relatedEntity, Entity handler) { string adValue = AdAttributesHelper.GetAdValue(element, (NavAdAttributesHandlers)handler); if (adValue != null) { // получаем данные о справочнике, на который смотрит колонка в основном объекте var NavEntityFieldName = handler.GetTypedColumnValue <string>("NavEntityFieldName"); if (NavEntityFieldName.IsEmpty()) { throw new Exception("Не заполнено поле NavEntityFieldName"); } var lookupColumn = relatedEntity.Schema.Columns.GetByName(NavEntityFieldName); var entitySchema = lookupColumn.ReferenceSchema; string schemaName = entitySchema.Name; var searchColumn = AdAttributesHelper.GetXmlElement("searchcolumn", handler.GetTypedColumnValue <string>("NavHandlerParameterXML")); if (searchColumn.IsEmpty()) { searchColumn = entitySchema.GetPrimaryDisplayColumnName(); } Entity lookupValue = AdAttributesHelper.GetLookupValue(userConnection, adValue, schemaName, searchColumn); if (lookupValue == null) { lookupValue = AdAttributesHelper.CreateLookupValue(userConnection, adValue, schemaName, searchColumn); } // Если атрибут существует в AD и у него есть значение _logger.Info("Записываем в поле " + relatedEntity.Schema.Caption + "." + handler.GetTypedColumnValue <string>("NavEntityFieldName") + " = \"" + lookupValue.PrimaryDisplayColumnValue + "\"(" + lookupValue.PrimaryColumnValue + ")"); relatedEntity.SetColumnValue(handler.GetTypedColumnValue <string>("NavEntityFieldName") + "Id", lookupValue.PrimaryColumnValue); } else { // Если атрибут отсутствует в AD, удаляем соотвутствующие данные из системы _logger.Info("Очищаем поле (отсутствует в AD) " + relatedEntity.Schema.Caption + "." + handler.GetTypedColumnValue <string>("NavEntityFieldName")); relatedEntity.SetColumnValue(handler.GetTypedColumnValue <string>("NavEntityFieldName") + "Id", null); } _logger.Info("Сохраняем запись"); relatedEntity.Save(false); return(true); }
public bool Evaluate(UserConnection userConnection, AdElement element, Entity relatedEntity, Entity handler) { _logger.Info("Получаем из элемента AD поток байтов из атрибута, указанном в записи обработчика в БД " + handler.GetTypedColumnValue <string>("NavAdAttributeName")); byte[] adValue = null; // проверяем, что из AD мы получили значение нужного атрибута if (element.Attributes.ContainsKey(handler.GetTypedColumnValue <string>("NavAdAttributeName"))) { adValue = element.Attributes[handler.GetTypedColumnValue <string>("NavAdAttributeName")].BinaryItems[0]; } else { _logger.Warn("В элементе AD не найден атрибут " + handler.GetTypedColumnValue <string>("NavAdAttributeName")); } _logger.Info("Очищаем поле " + relatedEntity.Schema.Caption + "." + handler.GetTypedColumnValue <string>("NavEntityFieldName") + " для удаления старого изображения"); relatedEntity.SetColumnValue(handler.GetTypedColumnValue <string>("NavEntityFieldName") + "Id", null); _logger.Info("Сохраняем запись"); relatedEntity.Save(false); if (adValue != null) { _logger.Info("Записываем в поле " + relatedEntity.Schema.Caption + "." + handler.GetTypedColumnValue <string>("NavEntityFieldName") + " файл с изображением"); var image = new SysImage(userConnection); image.SetDefColumnValues(); image.Name = "Photo.bmp"; image.MimeType = "image/bmp"; image.SetColumnValue("Data", adValue); image.Save(false); relatedEntity.SetColumnValue(handler.GetTypedColumnValue <string>("NavEntityFieldName") + "Id", image.PrimaryColumnValue); _logger.Info("Сохраняем запись"); relatedEntity.Save(false); } return(true); }
/// <summary> /// Синхронизирует полученный элемент из AD с сущностями bpm'online /// </summary> /// <param name="userConnection"></param> /// <param name="adElement"></param> public void ProceedHandlers(UserConnection userConnection, AdElement adElement) { _logger.Info("Получаем запись сущности, синхронизируемого с элементом AD"); var relatedEntity = GetRecord(userConnection, adElement); _logger.Info("Получаем данные всех обработчиков из БД"); var handlersEntities = GetHandlersEntities(userConnection); _logger.Info("Обрабатываем каждый из обработчиков"); foreach (var handlerEntity in handlersEntities) { _logger.Info("Получаем метод обработчика по названию"); IAdAttributeHandler handlerMethod = getHandlerMethod(handlerEntity.GetTypedColumnValue <string>("NavHandler_Code")); // GetTypedColumnValue<string>("NavHandlerName")); if (handlerMethod != null) { bool proceed = true; try { proceed = handlerMethod.Evaluate(userConnection, adElement, relatedEntity, handlerEntity); } catch (Exception ex) { _logger.Error("Ошибка при попытке выполнить " + handlerEntity.GetTypedColumnValue <string>("Name") + ". Метод " + handlerEntity.GetColumnDisplayValue(handlerEntity.Schema.Columns.GetByName("NavHandler")) + " завершился с ошибкой." + Environment.NewLine + ex.ToString()); } if (!proceed) { break; } } else { _logger.Info("Не удалось найти метод " + handlerEntity.GetColumnDisplayValue(handlerEntity.Schema.Columns.GetByName("NavHandler"))); } } }
public bool Evaluate(UserConnection userConnection, AdElement element, Entity relatedEntity, Entity handler) { _logger.Info("Читаем адрес контакта"); var contact = (Contact)relatedEntity; Guid? countryId = null; Guid? cityId = null; string addr = null; string room = null; string zip = null; // Страна string countryAttr = AdAttributesHelper.GetXmlElement("country", handler.GetTypedColumnValue <string>("NavHandlerParameterXML")); if (countryAttr.IsNotEmpty() && element.Attributes.ContainsKey(countryAttr)) { string countryName = element.Attributes[countryAttr].Value; var country = (Country)AdAttributesHelper.GetOrCreateEntityByDisplayValue(userConnection, "Country", countryName); countryId = country.Id; _logger.Info("Страна = " + countryName); } // Город string cityAttr = AdAttributesHelper.GetXmlElement("city", handler.GetTypedColumnValue <string>("NavHandlerParameterXML")); if (cityAttr.IsNotEmpty() && element.Attributes.ContainsKey(cityAttr)) { string cityName = element.Attributes[cityAttr].Value; var city = (City)AdAttributesHelper.GetOrCreateEntityByDisplayValue(userConnection, "City", cityName); cityId = city.Id; _logger.Info("Город = " + cityName); } // Улица, дом string addrAttr = AdAttributesHelper.GetXmlElement("address", handler.GetTypedColumnValue <string>("NavHandlerParameterXML")); if (addrAttr.IsNotEmpty() && element.Attributes.ContainsKey(addrAttr)) { addr = element.Attributes[addrAttr].Value; _logger.Info("Адрес = " + addr); } // postalCode string zipAttr = AdAttributesHelper.GetXmlElement("postalCode", handler.GetTypedColumnValue <string>("NavHandlerParameterXML")); if (zipAttr.IsNotEmpty() && element.Attributes.ContainsKey(zipAttr)) { zip = element.Attributes[zipAttr].Value; _logger.Info("zip = " + zip); } ContactAddress address = GetContactAddress(userConnection, contact); if (countryId != null || cityId != null || addr != null || zip != null) { _logger.Info("Сохраняем адрес контакта"); address.SetColumnValue("CountryId", countryId); address.SetColumnValue("CityId", cityId); address.Address = addr; address.Zip = zip; try { address.Save(false); } catch (Exception ex) { _logger.Error("Ошибка при сохранении адреса " + ex.ToString()); } } else { _logger.Info("Удаляем адрес контакта"); try { address.Delete(); } catch (Exception ex) { _logger.Error("Ошибка при удалении адреса " + ex.ToString()); } } return(true); }
/// <summary> /// Получает из БД сущность /// </summary> /// <param name="userConnection"></param> /// <param name="adElement"></param> /// <returns></returns> protected abstract Entity GetRecord(UserConnection userConnection, AdElement adElement);