Example #1
0
        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);
        }
Example #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);
        }
Example #3
0
        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);
        }