コード例 #1
0
        protected override void OnBeforeItemUpdate(DBItemOperation operationProperties)
        {
            if (operationProperties == null)
            {
                throw new Exception(string.Format("Ошибка в обработчике '{0}', параметр '{1}'", "DepartamentsOnStageHandler", "DBItemOperation"));
            }

            DBItem item = operationProperties.Item;

            if (item == null)
            {
                throw new Exception(string.Format("Ошибка получения '{0}' в обработчике '{1}'", "item", "DepartamentsOnStageHandler"));
            }

            //только при создании
            if (!item.IsNewOrContextCreated)
            {
                return;
            }

            string currentStage = item.GetStringValue(Consts.Handlers.DepartamentsOnStageHandler.FieldNameStage);

            if (currentStage != Consts.Handlers.DepartamentsOnStageHandler.StagePreparation && currentStage != Consts.Handlers.DepartamentsOnStageHandler.StageAdd)
            {
                return;
            }

            int itemCompanyID = item.GetLookupID(Consts.Handlers.DepartamentsOnStageHandler.FieldNameCompany);

            if (itemCompanyID == 0)
            {
                return;
            }

            //Получаем пользователя
            int userID = item.GetLookupID(Consts.Handlers.DepartamentsOnStageHandler.FieldNameInitor);

            if (userID == 0)
            {
                return;
            }

            DBUser user = item.Site.GetUser(userID);

            if (user == null)
            {
                throw new Exception(string.Format("Ошибка получения '{0}' в обработчике '{1}'", "DBUser", "DepartamentsOnStageHandler"));
            }

            DBItem userItem = user.UserItem;

            if (userItem == null)
            {
                throw new Exception(string.Format("Ошибка получения '{0}' в обработчике '{1}'", "DBUser.DBItem", "DepartamentsOnStageHandler"));
            }

            //Получаем подразделения в карточке пользователя
            List <DBItem> userDepartaments    = userItem.GetLookupItems(Consts.Handlers.DepartamentsOnStageHandler.FieldNameDepartamentExtra);
            DBItem        userDepartamentItem = userItem.GetLookupItem(Consts.Handlers.DepartamentsOnStageHandler.FieldNameDepartament);

            if (userDepartamentItem != null)
            {
                userDepartaments.Add(userDepartamentItem);
            }

            //Удаляем не актуальные подразделения
            userDepartaments = userDepartaments.Where(t => !t.GetValue <bool>(Consts.Handlers.DepartamentsOnStageHandler.FieldNameDepartamentActual)).ToList();
            if (userDepartaments == null || userDepartaments.Count == 0)
            {
                item.SetValue(Consts.Handlers.DepartamentsOnStageHandler.FieldNameDepartament, null);
                return;
            }

            //Словарь где key это  это ID компании, value это ID подразделения
            Dictionary <int, int[]> userDepartamentInfo = userDepartaments.GroupBy(t => t.GetLookupID(Consts.Handlers.DepartamentsOnStageHandler.FieldNameCompany), t => t.ID)
                                                          .ToDictionary(t => t.Key, t => t.ToArray());

            //Если у пользователя нет подразделений для компании из карточки ИЛИ таких подразделений более 1 то поле "Подразделение" очищается
            int[] value;
            if (!userDepartamentInfo.TryGetValue(itemCompanyID, out value) || value.Length > 1)
            {
                item.SetValue(Consts.Handlers.DepartamentsOnStageHandler.FieldNameDepartament, null);
                return;
            }

            //Если одно подразделение по компании из карточки то его и проставляем в поле "Подразделение"
            item.SetValue(Consts.Handlers.DepartamentsOnStageHandler.FieldNameDepartament, value.First());
        }