Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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")));
                }
            }
        }
Esempio n. 9
0
        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);