示例#1
0
        /// <summary>
        /// Определяем состояние согласования заявки.
        /// </summary>
        /// <param name="model">Модель</param>
        /// <param name="entity">Данные заявки</param>
        protected void SetApprovalFlags(StaffDepartmentRequestModel model, StaffDepartmentRequest entity)
        {
            User curUser = UserDao.Get(AuthenticationService.CurrentUser.Id);//текущий пользователь

            //заполняем списки согласовантов
            GetApprovalLists(model, entity);

            model.IsImportance = true;
            //за согласовантов могут отработать кураторы и кадровики банка.
            model.IsCurator = (AuthenticationService.CurrentUser.UserRole == UserRole.Inspector);
            model.IsPersonnelBank = (AuthenticationService.CurrentUser.UserRole == UserRole.ConsultantPersonnel);
            model.IsConsultant = (AuthenticationService.CurrentUser.UserRole == UserRole.ConsultantOutsourcing);
            model.IsTaxCollector = (AuthenticationService.CurrentUser.UserRole == UserRole.TaxCollector);
            model.IsOrder = (AuthenticationService.CurrentUser.UserRole == UserRole.StaffListOrder);
            model.IsSoftAdmin = (AuthenticationService.CurrentUser.UserRole == UserRole.SoftAdmin);

            model.IsAgreeButtonAvailable = false;

            //разбираемся с состоянием птиц
            //выбираем из согласования не архивные записи.
            IList<DocumentApproval> DocApproval = DocumentApprovalDao.GetDocumentApproval(entity.Id, (int)ApprovalTypeEnum.StaffDepartmentRequest);

            //для новых/автоматически сформированных заявок
            if (DocApproval == null || DocApproval.Where(x => x.IsImportance).Count() == 0)
            {
                model.IsInitiatorApproveAvailable = entity.IsUsed ? false : (model.Initiators.Count != 0 && (model.IsCurator || model.IsPersonnelBank || model.IsConsultant || model.Initiators.Where(x => x.Id == curUser.Id).Count() != 0) ? true : false);
                model.IsTopManagerApproveAvailable = false;
                model.IsBoardMemberApproveAvailable = false;
                model.IsAgreeButtonAvailable = model.IsInitiatorApproveAvailable;
            }
            else
            {
                //потом проводим слесарную обработку по состоянию согласования
                //обязательные согласованты
                foreach (DocumentApproval item in DocApproval.OrderBy(x => x.Number))
                {
                    string PyrusNumber = entity.StaffRequestPyrusTasks.Where(x => x.DocumentApproval.Number == item.Number).Count() != 0 ? entity.StaffRequestPyrusTasks.Where(x => x.DocumentApproval.Number == item.Number).Single().NumberTask : string.Empty;
                    if (item.IsImportance)
                    {
                        switch (item.Number)
                        {
                            case 1://инициатор
                                model.IsInitiatorApprove = true;
                                model.IsInitiatorApproveAvailable = false;
                                model.InitiatorApproveName = "Заявка создана " + item.CreateDate.Value.ToShortDateString() + " " + (item.AssistantUser == null ? "Инициатор: " + item.ApproveUser.Name + " - " + item.ApproveUser.Position.Name
                                    : "Автор заявки: " + item.AssistantUser.Name + "; Инициатор: " + item.ApproveUser.Name + " - " + item.ApproveUser.Position.Name);
                                model.InitiatorId = item.AssistantUser == null ? item.ApproveUser.Id : item.AssistantUser.Id;
                                //entity.StaffRequestPyrusTasks.Where(x => x.DocumentApproval.Number == 1)
                                if (!string.IsNullOrEmpty(PyrusNumber))
                                {
                                    model.InitiatorPyrusName = "Задача в Пайрус № " + PyrusNumber;
                                    model.InitiatorPyrusRef = @"https://pyrus.com/t#id" + PyrusNumber;
                                }

                                //открываем согласование для следующего участника процесса
                                if (entity.DepartmentAccessory != null)
                                {
                                    if (entity.DepartmentAccessory.Id == 2 || entity.DepartmentAccessory.Id == 6)//кураторы согласуют фронты и бэкфронты
                                    {
                                        model.IsCuratorApproveAvailable = model.IsCurator || model.IsConsultant ? true : false;
                                        model.IsAgreeButtonAvailable = model.IsCuratorApproveAvailable;
                                    }
                                    else
                                    {
                                        model.IsPersonnelBankApproveAvailable = model.IsPersonnelBank || model.IsConsultant ? true : false;
                                        model.IsAgreeButtonAvailable = model.IsPersonnelBankApproveAvailable;
                                    }
                                }
                                break;
                            case 2://куратор
                                model.IsCuratorApprove = true;
                                model.IsCuratorApproveAvailable = false;
                                model.CuratorApproveName = "Заявка проверена " + item.CreateDate.Value.ToShortDateString() + " " + "Куратор: " + item.ApproveUser.Name;
                                if (!string.IsNullOrEmpty(PyrusNumber))
                                {
                                    model.CuratorPyrusName = "Задача в Пайрус № " + PyrusNumber;
                                    model.CuratorPyrusRef = @"https://pyrus.com/t#id" + PyrusNumber;
                                }

                                //открываем согласование для следующего участника процесса
                                if (entity.DepartmentAccessory != null)
                                {
                                    if (entity.DepartmentAccessory.Id == 1)//кадровики согласуют только бэк
                                    {
                                        model.IsPersonnelBankApproveAvailable = model.IsPersonnelBank || model.IsConsultant ? true : false;
                                        model.IsAgreeButtonAvailable = model.IsPersonnelBankApproveAvailable;
                                    }
                                    else
                                    {
                                        model.IsTopManagerApproveAvailable = model.TopManagers.Count != 0 && (model.IsCurator || model.IsPersonnelBank || model.IsConsultant || model.TopManagers.Where(x => x.Id == curUser.Id).Count() != 0) ? true : false;
                                        model.IsAgreeButtonAvailable = model.IsTopManagerApproveAvailable;
                                    }
                                }
                                break;
                            case 3://кадровик
                                model.IsPersonnelBankApprove = true;
                                model.IsPersonnelBankApproveAvailable = false;
                                model.PersonnelBankApproveName = "Заявка проверена " + item.CreateDate.Value.ToShortDateString() + " " + "Кадровик банка: " + item.ApproveUser.Name;
                                if (!string.IsNullOrEmpty(PyrusNumber))
                                {
                                    model.PersonnelBankPyrusName = "Задача в Пайрус № " + PyrusNumber;
                                    model.PersonnelBankPyrusRef = @"https://pyrus.com/t#id" + PyrusNumber;
                                }

                                //открываем согласование для следующего участника процесса
                                model.IsTopManagerApproveAvailable = model.TopManagers.Count != 0 && (model.IsCurator || model.IsPersonnelBank || model.IsConsultant || model.TopManagers.Where(x => x.Id == curUser.Id).Count() != 0) ? true : false;
                                model.IsAgreeButtonAvailable = model.IsTopManagerApproveAvailable;
                                break;
                            case 5://вышестоящий руководитель
                                model.IsTopManagerApprove = true;
                                model.IsTopManagerApproveAvailable = false;
                                model.TopManagerApproveName = "Заявка согласована " + item.CreateDate.Value.ToShortDateString() + " " + (item.AssistantUser == null ? "Согласовант: " + item.ApproveUser.Name + " - " + item.ApproveUser.Position.Name
                                    : "Согласовал: " + item.AssistantUser.Name + "; Согласовант: " + item.ApproveUser.Name + " - " + item.ApproveUser.Position.Name);
                                model.TopManagerId = item.AssistantUser == null ? item.ApproveUser.Id : item.AssistantUser.Id;
                                if (!string.IsNullOrEmpty(PyrusNumber))
                                {
                                    model.TopManagerPyrusName = "Задача в Пайрус № " + PyrusNumber;
                                    model.TopManagerPyrusRef = @"https://pyrus.com/t#id" + PyrusNumber;
                                }

                                //открываем согласование для следующего участника процесса
                                model.IsBoardMemberApproveAvailable = model.BoardMembers.Count != 0 && (model.IsCurator || model.IsPersonnelBank || model.IsConsultant || model.BoardMembers.Where(x => x.Id == curUser.Id).Count() != 0) ? true : false;
                                model.IsAgreeButtonAvailable = model.IsBoardMemberApproveAvailable;
                                break;
                            case 6://член правления
                                model.IsBoardMemberApprove = true;
                                model.IsBoardMemberApproveAvailable = false;
                                model.BoardMemberApproveName = "Заявка утверждена " + item.CreateDate.Value.ToShortDateString() + " " + (item.AssistantUser == null ? "Утвердил: " + item.ApproveUser.Name + " - Член правления банка"// + item.ApproveUser.Position.Name
                                    : "Утвердил: " + item.AssistantUser.Name + "; Утверждающий: " + item.ApproveUser.Name + " - Член правления банка");
                                model.BoardMemberId = item.AssistantUser == null ? item.ApproveUser.Id : item.AssistantUser.Id;
                                model.IsAgreeButtonAvailable = false;

                                if (!string.IsNullOrEmpty(PyrusNumber))
                                {
                                    model.BoardMemberPyrusName = "Задача в Пайрус № " + PyrusNumber;
                                    model.BoardMemberPyrusRef = @"https://pyrus.com/t#id" + PyrusNumber;
                                }
                                break;
                        }
                    }
                    else
                    {
                        model.IsTaxCollectorApproveAvailable = model.IsTaxCollector || model.IsConsultant ? true : false;
                        model.IsOrderApproveAvailable = model.IsOrder || model.IsConsultant ? true : false;

                        switch (item.Number)
                        {
                            case 4://налоговик
                                model.IsTaxCollectorApprove = true;
                                model.IsTaxCollectorApproveAvailable = false;
                                model.TaxCollectorApproveName = "Заявка согласована " + item.CreateDate.Value.ToShortDateString() + " " + "Налоговик: " + item.ApproveUser.Name;
                                //если попали сюда, значит согласование данной цепочки уже прошло, задраиваем люки
                                //model.IsAgreeButtonAvailable = model.IsTaxCollectorApproveAvailable;
                                break;
                            case 7://приказы
                                model.IsOrderApprove = true;
                                model.IsOrderApproveAvailable = false;
                                model.OrderApproveName = "Приказы составлены " + item.CreateDate.Value.ToShortDateString() + " " + "Ответственный за составление приказов: " + item.ApproveUser.Name;
                                //если попали сюда, значит согласование данной цепочки уже прошло, задраиваем люки
                                //model.IsAgreeButtonAvailable = model.IsOrderApproveAvailable;
                                break;
                        }
                    }
                }

            }

            //налоговик
            if (model.IsTaxCollector && DocApproval.Where(x => x.Number == 4).Count() == 0)
            {
                //model.IsTaxCollectorApprove = true;
                model.IsTaxCollectorApproveAvailable = true;
                model.IsAgreeButtonAvailable = model.IsTaxCollectorApproveAvailable;
                model.IsImportance = false;
            }

            //приказы
            if (model.IsOrder && DocApproval.Where(x => x.Number == 7).Count() == 0)
            {
                //model.IsOrderApprove = true;
                model.IsOrderApproveAvailable = true;
                model.IsAgreeButtonAvailable = model.IsOrderApproveAvailable;
                model.IsImportance = false;
            }

            //для администратора ПО банка
            if (model.IsSoftAdmin || model.IsCurator || model.IsConsultant)
            {
                model.IsSoftAdminApprove = true;
                model.IsSoftAdminApproveAvailable = true;
                if (model.IsSoftAdmin)
                {
                    model.IsDraftButtonAvailable = false;
                    model.IsAgreeButtonAvailable = false;
                    model.IsImportance = false;
                }
            }

            if (UserRole.Manager != AuthenticationService.CurrentUser.UserRole && UserRole.Inspector != AuthenticationService.CurrentUser.UserRole
                    && UserRole.ConsultantOutsourcing != AuthenticationService.CurrentUser.UserRole && UserRole.ConsultantPersonnel != AuthenticationService.CurrentUser.UserRole
                    && UserRole.Director != AuthenticationService.CurrentUser.UserRole && UserRole.TaxCollector != AuthenticationService.CurrentUser.UserRole)
            {
                model.IsAgreeButtonAvailable = false;
            }

            if (entity.DeleteDate.HasValue)
            {
                model.IsDraftButtonAvailable = false;
                model.IsAgreeButtonAvailable = false;
            }
        }
示例#2
0
        /// <summary>
        /// Проверка на возможность создать код Финград для подразделения в текущей заявке.
        /// </summary>
        /// <param name="entity">Проверяемая заявка.</param>
        /// <param name="error">Переменная для сообщений.</param>
        /// <returns></returns>
        protected bool ValidateDepartmentRequest(StaffDepartmentRequest entity, out string error)
        {
            error = string.Empty;

            if (entity.RequestType.Id != 3)//создание/редактирование
            {
                if (entity.DepartmentAccessory == null)
                {
                    error = "Укажите принадлежность подразделения в разделе с общими реквизитами!";
                    return false;
                }
                //проверка на возможность сформировать код для подразделения (только для фронтов)
                if (entity.DepartmentAccessory.Id == 2)
                {
                    if (!StaffDepartmentRequestDao.IsEnableCreateCode(entity.ParentDepartment.Id))
                    {
                        error = "Невозможно создать код для данного подразделения! Проверьте наличие кодов и связей для всей ветки подразделений в справочнике кодировок.";
                        return false;
                    }
                }
            }
            else//закрытие
            {
                //проверяем наличие сотрудников в подразделении по ветке вниз
                if (!StaffDepartmentRequestDao.IsEnableCloseDepartment(entity.Department.Id))
                {
                    error = "Данное подразделение нельзя закрыть, так как в нем работают сотрудники!";
                    return false;
                }

                if (entity.ItemLevel == 7 && !entity.DepartmentManagerDetails[0].CloseDate.HasValue)
                {
                    error = "Укажите дату закрытия подразделения!";
                    return false;
                }
            }

            return true;
        }
示例#3
0
        /// <summary>
        /// Сохраняем изменения в справочнике подразделений.
        /// </summary>
        /// <param name="entity">Текущая заявка.</param>
        /// <param name="curUser">текущий пользователь.</param>
        /// <param name="error">Сообщение об ошибке.</param>
        /// <returns></returns>
        protected bool SaveDepartmentReference(StaffDepartmentRequest entity, User curUser, out string error)
        {
            error = string.Empty;
            //bool IsParentChange = false;
            //IList<Department> ChildDeps = null;

            Department dep = entity.Department != null ? DepartmentDao.Get(entity.Department.Id) : new Department();
            //родительское подразделение
            Department ParentDep = entity.ParentDepartment != null ? DepartmentDao.Get(entity.ParentDepartment.Id) : new Department();
            //если заявка на создание, создаем новую запись и делаем в заявке на нее ссылку
            if (entity.RequestType.Id == 1 || entity.RequestType.Id == 4)
            {
                dep.Code = null;
                dep.Name = entity.Name;
                dep.Code1C = null;
                dep.ParentId = ParentDep.Code1C;
                dep.Path = ParentDep.Path + "__new";
                dep.ItemLevel = (ParentDep.ItemLevel + 1) != entity.ItemLevel ? ParentDep.ItemLevel + 1 : entity.ItemLevel;
                dep.CodeSKD = null;
                dep.Priority = 99;//искусственное значение
                dep.IsUsed = true;
                dep.DepartmentAccessory = entity.DepartmentAccessory;
                //dep.FingradCode = "";//формируем код ниже
                dep.Creator = curUser;
                dep.CreateDate = DateTime.Now;
            }

            //если заявка на редактирование/удаление, редактируем текущую запись в справочнике
            if (entity.RequestType.Id != 1 && entity.RequestType.Id != 4)
            {
                if (entity.RequestType.Id == 2)
                {
                    ////если меняется родитель запоминаем, чтобы у подчиненых подразделений изменить путь
                    //if (dep.ParentId.Value != ParentDep.Code1C)
                    //{
                    //    IsParentChange = true;
                    //    ChildDeps = DepartmentDao.GetChildDepartments(dep);//собираем подчиненные подразделения для подразделения у которого меняется родитель
                    //}

                    dep.Name = entity.Name;
                    dep.ParentId = ParentDep.Code1C;
                    dep.Path = ParentDep.ItemLevel != entity.ItemLevel ? ParentDep.Path + "__new" : dep.Path;
                    dep.ItemLevel = (ParentDep.ItemLevel + 1) != entity.ItemLevel ? ParentDep.ItemLevel + 1 : entity.ItemLevel;
                    dep.IsUsed = true;
                }
                else if (entity.RequestType.Id == 3)
                {
                    dep.IsUsed = false; //делаем неактивной текущую запись в справочнике
                }
                dep.Editor = curUser;
                dep.EditDate = DateTime.Now;
            }

            try
            {
                DepartmentDao.SaveAndFlush(dep);

                if (entity.Department == null)
                    entity.Department = new Department();

                //если нет кода или изменился родитель, то надо подкорректировать путь
                dep.Path = ParentDep.Path + (dep.Code1C.HasValue ? dep.Code1C.Value.ToString() : dep.Id.ToString()) + ".";

                ////меняем пути у подчиненных подразделений
                ////РАБОТАЕТ НА ОДНОМ УРОВНЕ, ДОРАБОТАТЬ, ЧТОБЫ ИЗМЕНЯЛИСЬ ПУТИ У ВСЕЙ ВЕТКИ
                //if (IsParentChange)
                //{
                //    foreach (Department item in ChildDeps)
                //    {
                //        item.Path = dep.Path + item.Id.ToString() + ".";
                //        DepartmentDao.SaveAndFlush(item);
                //    }
                //}

                //только при добавлении надо заполнить эти поля, так как в структуре на поле Code1C ссылается поле ParentId, то есть значения в поле Code1C должны быть уникальными
                if (entity.RequestType.Id == 1 || entity.RequestType.Id == 4)
                {
                    dep.Code = dep.Id.ToString();
                    dep.Code1C = dep.Id;
                }

                //у текущей заявки делаем ссылку на новое подразделение и ставим признак использования
                entity.Department = dep;

                //создаем код для подразделения

                if (entity.RequestType.Id != 3)
                {
                    if (entity.DepartmentAccessory.Id == 2 || entity.DepartmentAccessory.Id == 6)
                    {
                        if (!CreateCodeForDepartment(entity, dep, curUser, out error))
                        {
                            error = string.IsNullOrEmpty(error) || string.IsNullOrWhiteSpace(error) ? "Произошла ошибка при формировании кода подразделения!" : error;
                            DepartmentDao.RollbackTran();
                            return false;
                        }
                    }
                }

                //архивируем изменения
                DepartmentArchive da = new DepartmentArchive()
                {
                    Department = dep,
                    Code = dep.Code,
                    Name = dep.Name,
                    Code1C = dep.Code1C,
                    ParentId = dep.ParentId,
                    Path = dep.Path,
                    ItemLevel = dep.ItemLevel,
                    Priority = dep.Priority,
                    IsUsed = dep.IsUsed,
                    Creator = curUser,
                    CreateDate = DateTime.Now
                };

                DepartmentArchiveDao.SaveAndFlush(da);
            }
            catch (Exception ex)
            {
                DepartmentDao.RollbackTran();
                DepartmentArchiveDao.RollbackTran();
                error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message);
                return false;
            }

            return true;
        }
示例#4
0
        /// <summary>
        /// Сохраняем согласования.
        /// </summary>
        /// <param name="model">Модель</param>
        /// <param name="entity">Текущая заявка.</param>
        /// <param name="curUser">текущий пользователь.</param>
        /// <param name="error">Сообщение об ошибке.</param>
        /// <returns></returns>
        protected int SaveDepartmentApprovals(StaffDepartmentRequestModel model, StaffDepartmentRequest entity, User curUser, out string error)
        {
            //возвращает значения от 1 до 4 - этап согласования прошел успешно, 0 - согласование завершено, заявка утверждена, -1 - ошибка при сохранении данных

            //только после утверждения заявки можно редактировать справочник подразделений.
            error = string.Empty;

            //в каждой ветке определяемся с участниками групповухи под кодовым названием согласование/утверждение заявки для подразделения
            //текущим пользователем может быть куратор ии кадровик, которые могут действовать за согласовантов
            User Assistant = AuthenticationService.CurrentUser.UserRole == UserRole.Inspector
                || AuthenticationService.CurrentUser.UserRole == UserRole.ConsultantPersonnel
                || AuthenticationService.CurrentUser.UserRole == UserRole.ConsultantOutsourcing
                || AuthenticationService.CurrentUser.UserRole == UserRole.TaxCollector ? curUser : null;//куратор/кадровик банка/консультант РК

            //список руководителей по по ветке
            IList<User> Initiators = DepartmentDao.GetDepartmentManagers(entity.ParentDepartment.Id, true)
                .OrderByDescending<User, int?>(manager => manager.Level)
                .ToList<User>();

            bool IsInitiator = Initiators.Where(x => x.Id == AuthenticationService.CurrentUser.Id).Count() != 0 ? true : false;
            bool IsTopManager = Initiators.Where(x => x.Id == AuthenticationService.CurrentUser.Id && x.Level <= 3).Count() != 0 ? true : false;
            bool IsBoardMember = AuthenticationService.CurrentUser.UserRole == UserRole.Director;
            bool IsCurator = (AuthenticationService.CurrentUser.UserRole == UserRole.Inspector);
            bool IsPersonnelBank = (AuthenticationService.CurrentUser.UserRole == UserRole.ConsultantPersonnel);
            bool IsConsultant = (AuthenticationService.CurrentUser.UserRole == UserRole.ConsultantOutsourcing);
            bool IsTaxCollector = (AuthenticationService.CurrentUser.UserRole == UserRole.TaxCollector);
            bool IsStaffListOrder = (AuthenticationService.CurrentUser.UserRole == UserRole.StaffListOrder);

            //вышестоящее руководство
            model.TopManagers = Initiators.Where(x => x.Level <= 3).ToList().ConvertAll(x => new IdNameDto { Id = x.Id, Name = x.Name + " - " + x.Position.Name });

            //выбираем из согласования не архивные записи.
            IList<DocumentApproval> DocApproval = DocumentApprovalDao.GetDocumentApproval(entity.Id, (int)ApprovalTypeEnum.StaffDepartmentRequest);
            DocumentApproval da = new DocumentApproval();

            da.ApprovalType = (int)ApprovalTypeEnum.StaffDepartmentRequest;
            da.DocId = entity.Id;
            da.IsArchive = false;
            da.CreateDate = DateTime.Now;

            if (model.IsImportance)//обязательное согласование
            {
                if (DocApproval.Where(x => x.Number == 1).Count() == 0 && (IsInitiator || IsCurator || IsPersonnelBank || IsConsultant))//инициатор, куратор, кадровик, консультант
                {
                    //если иницатор не выбран, это значит, что инициатор действует сам
                    User Initiator = model.InitiatorId != 0 ? UserDao.Get(model.InitiatorId) : curUser;//инициатор

                    da.ApproveUser = Initiator;
                    da.AssistantUser = Assistant;
                    da.Number = 1;
                    da.IsImportance = true;
                    error = "Заявка создана!";
                }

                if (DocApproval.Where(x => x.Number == 1).Count() == 1 && DocApproval.Where(x => x.Number == 2).Count() == 0 && (entity.DepartmentAccessory.Id == 2 || entity.DepartmentAccessory.Id == 6) && IsCurator)//только фронты и БэкФронты
                {
                    da.ApproveUser = curUser;
                    da.AssistantUser = null;
                    da.Number = 2;
                    da.IsImportance = true;
                    error = "Заявка проверена куратором!";
                }

                //if (DocApproval.Where(x => x.Number == 2).Count() == 1 && DocApproval.Where(x => x.Number == 3).Count() == 0)
                if (DocApproval.Where(x => x.Number == 1).Count() == 1 && DocApproval.Where(x => x.Number == 3).Count() == 0 && entity.DepartmentAccessory.Id == 1 && IsPersonnelBank)//только бэки
                {
                    da.ApproveUser = curUser;
                    da.AssistantUser = null;
                    da.Number = 3;
                    da.IsImportance = true;
                    error = "Заявка проверена кадровиком банка!";
                }

                if (DocApproval.Where(x => x.Number == 3 || x.Number == 2).Count() == 1 && DocApproval.Where(x => x.Number == 5).Count() == 0 && (IsTopManager || IsCurator || IsPersonnelBank || IsConsultant))//высший руководитель, куратор, кадровик, консультант
                {
                    //если согласовант не выбран, это значит, что он действует сам
                    User TopManager = model.TopManagerId != 0 ? UserDao.Get(model.TopManagerId) : curUser;//высший руководитель

                    da.ApproveUser = TopManager;
                    da.AssistantUser = Assistant;
                    da.Number = 5;
                    da.IsImportance = true;
                    error = "Заявка согласована!";
                }

                if (DocApproval.Where(x => x.Number == 5).Count() == 1 && DocApproval.Where(x => x.Number == 6).Count() == 0 && (IsBoardMember || IsCurator || IsPersonnelBank || IsConsultant))//член правления, куратор, кадровик, консультант
                {
                    //если утверждающий не выбран, это значит, что он действует сам
                    User BoardMember = model.BoardMemberId != 0 ? UserDao.Get(model.BoardMemberId) : curUser;//член правления

                    da.ApproveUser = BoardMember;
                    da.AssistantUser = Assistant;
                    da.IsImportance = true;
                    da.Number = 6;
                    error = "Заявка утверждена!";
                }

            }
            else   //согласование специалистами
            {
                if (DocApproval.Where(x => x.Number == 7).Count() == 0 && (IsStaffListOrder || IsConsultant))
                {
                    da.ApproveUser = curUser;
                    da.AssistantUser = null;
                    da.Number = 7;
                    error = "Приказ составлен!";
                }

                if (DocApproval.Where(x => x.Number == 4).Count() == 0 && (IsTaxCollector || IsConsultant))
                {
                    da.ApproveUser = curUser;
                    da.AssistantUser = null;
                    da.Number = 4;
                    error = "Заявка согласована налоговиком!";
                }

            }

            try
            {
                DocumentApprovalDao.SaveAndFlush(da);

                //сохраняем здачу пайруса
                if (!string.IsNullOrEmpty(model.PyrusNumber))
                {
                    entity.StaffRequestPyrusTasks.Add(new StaffRequestPyrusTasks()
                    {
                        DepRequest = entity,
                        DocumentApproval = da,
                        NumberTask = model.PyrusNumber,
                        Creator = curUser,
                        CreateDate = DateTime.Now
                    });
                }

                if (da.Number == 1)
                {
                    entity.DateSendToApprove = DateTime.Now;
                    return da.Number;
                }

                if (da.Number > 1 && da.Number < 6)
                    return da.Number;

                if (da.Number == 6)
                {
                    entity.DateState = DateTime.Now;
                }
            }
            catch (Exception ex)
            {
                DocumentApprovalDao.RollbackTran();
                error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message);
                return -1;
            }

            return 0;
        }
示例#5
0
        /// <summary>
        /// Процедура заполняет списки согласовантов, на случай, если за них согласовывают кураторы или кадровики банка.
        /// </summary>
        /// <param name="model">Модель</param>
        /// <param name="entity">Данные заявки.</param>
        protected void GetApprovalLists(StaffDepartmentRequestModel model, StaffDepartmentRequest entity)
        {
            //если заявка на создание, то подразделения еще нет, есть только родительское
            Department Parentdep = null;
            if (entity.RequestType.Id != 1 && entity.Department != null)
                Parentdep = DepartmentDao.GetByCode(entity.Department.ParentId.ToString());//родительское подразделение
            else
                Parentdep = DepartmentDao.Get(entity.ParentDepartment.Id);

            //относительно родительского ищем руководителей
            //помним, что начальника может не быть в родительском подразделении, по этому ищем вверх по ветке всех руководителей
            IList<User> Initiators = DepartmentDao.GetDepartmentManagersWithManualLinks(model.DepartmentId != 0 ? model.DepartmentId : model.ParentId)//DepartmentDao.GetDepartmentManagers(Parentdep.Id, true)
                .OrderByDescending<User, int?>(manager => manager.Level)
                .ToList<User>();

            if (entity.Creator != null) //у заявок созданных при переходе нет создателя
            {
                ////если инициатором является куратор или кадровик банка, то по ветке подразделения находим руководителей на уровень выше создаваемого подразделения
                if (entity.Creator.Id == AuthenticationService.CurrentUser.Id && AuthenticationService.CurrentUser.UserRole == UserRole.Manager)
                {
                    model.Initiators = Initiators.Where(x => x.Id == AuthenticationService.CurrentUser.Id).ToList().ConvertAll(x => new IdNameDto { Id = x.Id, Name = x.Name + " - " + x.Position.Name });
                }
                else
                {
                    model.Initiators = Initiators.Where(x => x.Level >= 3).ToList().ConvertAll(x => new IdNameDto { Id = x.Id, Name = x.Name + " - " + x.Position.Name });
                    //если не определился инициатор, то используем тяжелую артеллерию
                    if (model.Initiators == null || model.Initiators.Count == 0)
                        model.Initiators = Initiators.Where(x => x.Level >= 2).ToList().ConvertAll(x => new IdNameDto { Id = x.Id, Name = x.Name + " - " + x.Position.Name });
                    //если создатель заявки руководитель, то позиционируемся на нем
                    if (entity.Creator.UserRole == UserRole.Manager)
                        model.InitiatorId = entity.Creator.Id;
                }
            }

            //вышестоящее руководство
            model.TopManagers = Initiators.Where(x => x.Level <= 3).ToList().ConvertAll(x => new IdNameDto { Id = x.Id, Name = x.Name + " - " + x.Position.Name });

            //члены правления
            model.BoardMembers = UserDao.GetUsersWithRole(UserRole.Director)
                .Where(x => x.IsActive && x.DirectorsRight.Count != 0)
                .ToList()
                .ConvertAll(x => new IdNameDto { Id = x.Id, Name = x.Name + " - Член правления банка" });
        }
示例#6
0
        /// <summary>
        /// Процедура создания кода для подразделения.
        /// </summary>
        /// <param name="entity">Заявка для подразделения</param>
        /// <param name="dep">Подразделение, для которго надо создать код.</param>
        /// <param name="curUser">Текущий пользователь.</param>
        /// <param name="error">Переменная для сообщений.</param>
        /// <returns></returns>
        protected bool CreateCodeForDepartment(StaffDepartmentRequest entity, Department dep, User curUser, out string error)
        {
            error = string.Empty;
            string Code = string.Empty;

            if (entity.ItemLevel == 1 || entity.ItemLevel > 7)
            {
                error = "Создание подразделения такого уровня не предусмотрено программой!";
                return true;
            }

            //в заявках на изменение код создается только для точек 7 иуровня
            if (entity.RequestType.Id == 2 && entity.ItemLevel <= 6)
            {
                return true;
            }

            StaffDepartmentBranch br = new StaffDepartmentBranch();
            StaffDepartmentManagement mn = new StaffDepartmentManagement();

            switch (entity.ItemLevel)
            {
                case 2://филиал
                    StaffDepartmentBranch Depbr = new StaffDepartmentBranch()
                    {
                        Code = StaffDepartmentBranchDao.GetNewBranchCode(),
                        Name = dep.Name,
                        Department = dep,
                        Creator = curUser,
                        CreateDate = DateTime.Now
                    };

                    try
                    {
                        StaffDepartmentBranchDao.SaveAndFlush(Depbr);
                    }
                    catch (Exception ex)
                    {
                        StaffDepartmentBranchDao.RollbackTran();
                        error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message);
                        return false;
                    }
                    break;
                case 3://дирекция
                    br = StaffDepartmentBranchDao.GetDepartmentBranchByDeparment(DepartmentDao.GetParentDepartmentWithLevel(dep, dep.ItemLevel.Value - 1));
                    if (br == null)
                    {
                        error = "Для данной точки не определен филиал! Проверьте данные в справочнике кодировки.";
                        return false;
                    }

                    StaffDepartmentManagement Depm = new StaffDepartmentManagement()
                    {
                        Code = StaffDepartmentManagementDao.GetNewManagementCode(br),//сделать
                        Name = dep.Name,
                        DepartmentBranch = br,
                        Department = dep,
                        Creator = curUser,
                        CreateDate = DateTime.Now
                    };

                    try
                    {
                        StaffDepartmentManagementDao.SaveAndFlush(Depm);
                    }
                    catch (Exception ex)
                    {
                        StaffDepartmentManagementDao.RollbackTran();
                        error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message);
                        return false;
                    }
                    break;
                case 4://управление
                    mn = StaffDepartmentManagementDao.GetDepartmentManagementByDeparment(DepartmentDao.GetParentDepartmentWithLevel(dep, dep.ItemLevel.Value - 1));

                    if (mn == null)
                    {
                        error = "Для данной точки не определена дирекция! Проверьте данные в справочнике кодировки.";
                        return false;
                    }

                    StaffDepartmentAdministration Depa = new StaffDepartmentAdministration()
                    {
                        Code = StaffDepartmentAdministrationDao.GetNewAdministrationCode(mn),
                        Name = dep.Name,
                        DepartmentManagement = mn,
                        Department = dep,
                        Creator = curUser,
                        CreateDate = DateTime.Now
                    };

                    try
                    {
                        StaffDepartmentAdministrationDao.SaveAndFlush(Depa);
                    }
                    catch (Exception ex)
                    {
                        StaffDepartmentAdministrationDao.RollbackTran();
                        error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message);
                        return false;
                    }
                    break;
                case 5://бизнес-группа
                    StaffDepartmentAdministration adm = StaffDepartmentAdministrationDao.GetDepartmentAdministrationByDeparment(DepartmentDao.GetParentDepartmentWithLevel(dep, dep.ItemLevel.Value - 1));

                    if (adm == null)
                    {
                        error = "Для данной точки не определено управление! Проверьте данные в справочнике кодировки.";
                        return false;
                    }

                    StaffDepartmentBusinessGroup Depbg = new StaffDepartmentBusinessGroup()
                    {
                        Code = StaffDepartmentBusinessGroupDao.GetNewBusinessGroupCode(adm),
                        Name = dep.Name,
                        DepartmentAdministration = adm,
                        Department = dep,
                        Creator = curUser,
                        CreateDate = DateTime.Now
                    };

                    try
                    {
                        StaffDepartmentBusinessGroupDao.SaveAndFlush(Depbg);
                    }
                    catch (Exception ex)
                    {
                        StaffDepartmentBusinessGroupDao.RollbackTran();
                        error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message);
                        return false;
                    }
                    break;
                case 6://рп-привязка
                    StaffDepartmentBusinessGroup bg = StaffDepartmentBusinessGroupDao.GetDepartmentBusinessGroupByDeparment(DepartmentDao.GetParentDepartmentWithLevel(dep, dep.ItemLevel.Value - 1));

                    if (bg == null)
                    {
                        error = "Для данной точки не определена бизнес-группа! Проверьте данные в справочнике кодировки.";
                        return false;
                    }

                    StaffDepartmentRPLink Deprp = new StaffDepartmentRPLink()
                    {
                        Code = StaffDepartmentRPLinkDao.GetNewRPLinkCode(bg),
                        Name = dep.Name,
                        DepartmentBG = bg,
                        Department = dep,
                        Creator = curUser,
                        CreateDate = DateTime.Now
                    };

                    try
                    {
                        StaffDepartmentRPLinkDao.SaveAndFlush(Deprp);
                    }
                    catch (Exception ex)
                    {
                        StaffDepartmentRPLinkDao.RollbackTran();
                        error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message);
                        return false;
                    }
                    break;
                case 7://подразделение (точка)
                    //создаем код только для фронтов и бэкфронтов
                    if (entity.DepartmentAccessory.Id == 2 || entity.DepartmentAccessory.Id == 6)
                    {
                        br = StaffDepartmentBranchDao.GetDepartmentBranchByDeparment(DepartmentDao.GetParentDepartmentWithLevel(dep, dep.ItemLevel.Value - 1));
                        if (br == null)
                        {
                            error = "Для данной точки не определен филиал! Проверьте данные в справочнике кодировки.";
                            return false;
                        }

                        mn = StaffDepartmentManagementDao.GetDepartmentManagementByDeparment(DepartmentDao.GetParentDepartmentWithLevel(dep, dep.ItemLevel.Value - 1));
                        if (mn == null)
                        {
                            error = "Для данной точки не определена дирекция! Проверьте данные в справочнике кодировки.";
                            return false;
                        }

                        StaffDepartmentRPLink rp = StaffDepartmentRPLinkDao.GetDepartmentRPLinkByDeparment(DepartmentDao.GetParentDepartmentWithLevel(dep, dep.ItemLevel.Value - 1));
                        if (rp == null)
                        {
                            error = "Для данной точки не определена РП-привязка! Проверьте данные в справочнике кодировки.";
                            return false;
                        }

                        entity.DepartmentManagerDetails[0].DepCode = StaffDepartmentRequestDao.GetNewFinDepCode(br, mn, rp);
                        dep.FingradCode = entity.DepartmentManagerDetails[0].DepCode;

                        try
                        {
                            DepartmentDao.SaveAndFlush(dep);
                        }
                        catch (Exception ex)
                        {
                            DepartmentDao.RollbackTran();
                            error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message);
                            return false;
                        }
                    }
                    break;
            }

            return true;
        }
示例#7
0
        /// <summary>
        /// Процедура сохранения новой заявки для подразделения.
        /// </summary>
        /// <param name="model">Модель заявки.</param>
        /// <param name="error">Сообщенио об ошибке.</param>
        /// <returns></returns>
        public bool SaveNewDepartmentRequest(StaffDepartmentRequestModel model, out string error)
        {
            //несогласованная заявка для штатной единицы должна быть только одна
            if (model.RequestTypeId != 1)//для редактирования и сокращения
            {
                if (!StaffDepartmentRequestDao.CheckEnabeldCreateNewRequest(model.DepartmentId, model.Id))
                {
                    error = "Создать новую заявку для данного подразделения невозможно, так как для него уже существует неутвержденная заявка!";
                    return false;
                }
            }

            error = string.Empty;
            StaffDepartmentRequest entity;// = StaffDepartmentRequestDao.Load(model.Id.HasValue ? model.Id.Value : 0);
            User curUser = UserDao.Load(AuthenticationService.CurrentUser.Id);

            if (model.Id == 0)
            {
                //поля общих реквизитов
                entity = new StaffDepartmentRequest
                {
                    RequestType = StaffDepartmentRequestTypesDao.Load(model.RequestTypeId),
                    DateRequest = DateTime.Now,
                    Department = model.DepartmentId == 0 ? null : DepartmentDao.Get(model.DepartmentId),
                    ParentDepartment = model.ParentId == 0 ? null : DepartmentDao.Load(model.ParentId),
                    DepNext = model.DepNextId == 0 ? null : DepartmentDao.Load(model.DepNextId),
                    DepDeposit = model.DepDepositId == 0 ? null : DepartmentDao.Load(model.DepDepositId),
                    ItemLevel = model.ItemLevel.Value,
                    Name = model.Name,
                    DepartmentAccessory = model.BFGId == 0 ? null : StaffDepartmentAccessoryDao.Load(model.BFGId),
                    OrderNumber = model.OrderNumber,
                    OrderDate = model.OrderDate,
                    BeginAccountDate = model.BeginAccountDate,
                    IsTaxAdminAccount = model.IsTaxAdminAccount,
                    IsEmployeAvailable = model.IsEmployeAvailable,
                    IsPlan = model.IsPlan,
                    IsUsed = false,
                    IsDraft = true,
                    IsTaxRequest = false,
                    Creator = curUser,
                    CreateDate = DateTime.Now
                };

                //юридический адрес
                if (!string.IsNullOrEmpty(model.LegalAddress))
                {
                    RefAddresses la = new RefAddresses();
                    la.Address = model.LegalAddress;
                    la.PostIndex = model.LegalPostIndex;
                    la.RegionCode = model.LegalRegionCode;
                    if (!string.IsNullOrEmpty(model.LegalRegionCode))
                    {
                        KladrDto kd = KladrDao.GetKladrByCode(model.LegalRegionCode).Single();
                        la.RegionName = kd.Name + " " + kd.ShortName;
                    }
                    la.AreaCode = model.LegalAreaCode;
                    if (!string.IsNullOrEmpty(model.LegalAreaCode))
                    {
                        KladrDto kd = KladrDao.GetKladrByCode(model.LegalAreaCode).Single();
                        la.AreaName = kd.Name + " " + kd.ShortName;
                    }
                    la.CityCode = model.LegalCityCode;
                    if (!string.IsNullOrEmpty(model.LegalCityCode))
                    {
                        KladrDto kd = KladrDao.GetKladrByCode(model.LegalCityCode).Single();
                        la.CityName = kd.Name + " " + kd.ShortName;
                    }
                    la.SettlementCode = model.LegalSettlementCode;
                    if (!string.IsNullOrEmpty(model.LegalSettlementCode))
                    {
                        KladrDto kd = KladrDao.GetKladrByCode(model.LegalSettlementCode).Single();
                        la.SettlementName = kd.Name + " " + kd.ShortName;
                    }
                    la.StreetCode = model.LegalStreetCode;
                    if (!string.IsNullOrEmpty(model.LegalStreetCode))
                    {
                        KladrDto kd = KladrDao.GetKladrByCode(model.LegalStreetCode).Single();
                        la.StreetName = kd.Name + " " + kd.ShortName;
                    }
                    la.HouseType = model.LegalHouseType;
                    la.HouseNumber = model.LegalHouseNumber;
                    la.BuildType = model.LegalBuildType;
                    la.BuildNumber = model.LegalBuildNumber;
                    la.FlatType = model.LegalFlatType;
                    la.FlatNumber = model.LegalFlatNumber;
                    la.IsUsed = true;
                    la.Creator = curUser;
                    la.CreateDate = DateTime.Now;

                    RefAddressesDao.SaveAndFlush(la);

                    entity.LegalAddress = la;
                }

                //entity.ParentDepartment = model.ParentId == 0 ? null : DepartmentDao.Load(model.ParentId);
                //entity.DepNext = model.DepNextId == 0 ? null : DepartmentDao.Load(model.DepNextId);

                //поля ЦБ реквизитов
                entity.DepartmentCBDetails = new List<StaffDepartmentCBDetails>();
                entity.DepartmentCBDetails.Add(new StaffDepartmentCBDetails
                {
                    DepRequest = entity,
                    ATMCountTotal = model.ATMCountTotal,
                    ATMCashInStarted = model.ATMCashInStarted,
                    ATMCashInCount = model.ATMCashInCount,
                    ATMCount = model.ATMCount,
                    DepCashin = model.DepCachinId == 0 ? null : DepartmentDao.Load(model.DepCachinId),
                    DepATM = model.DepATMId == 0 ? null : DepartmentDao.Load(model.DepATMId),
                    CashInStartedDate = model.CashInStartedDate,
                    ATMStartedDate = model.ATMStartedDate,
                    Creator = curUser,
                    CreateDate = DateTime.Now
                });

                //поля управленческих реквизитов
                entity.DepartmentManagerDetails = new List<StaffDepartmentManagerDetails>();
                StaffDepartmentManagerDetails dmd = new StaffDepartmentManagerDetails();
                dmd.DepRequest = entity;
                dmd.NameShort = model.NameShort;
                dmd.DepartmentReasons = !model.ReasonId.HasValue || model.ReasonId.Value == 0 ? null : StaffDepartmentReasonsDao.Load(model.ReasonId.Value);

                //фактический адрес
                if (!string.IsNullOrEmpty(model.FactAddress))
                {
                    RefAddresses fa = new RefAddresses();
                    fa.Address = model.FactAddress;
                    fa.PostIndex = model.FactPostIndex;
                    fa.RegionCode = model.FactRegionCode;
                    if (!string.IsNullOrEmpty(model.FactRegionCode))
                    {
                        KladrDto kd = KladrDao.GetKladrByCode(model.FactRegionCode).Single();
                        fa.RegionName = kd.Name + " " + kd.ShortName;
                    }
                    fa.AreaCode = model.FactAreaCode;
                    if (!string.IsNullOrEmpty(model.FactAreaCode))
                    {
                        KladrDto kd = KladrDao.GetKladrByCode(model.FactAreaCode).Single();
                        fa.AreaName = kd.Name + " " + kd.ShortName;
                    }
                    fa.CityCode = model.FactCityCode;
                    if (!string.IsNullOrEmpty(model.FactCityCode))
                    {
                        KladrDto kd = KladrDao.GetKladrByCode(model.FactCityCode).Single();
                        fa.CityName = kd.Name + " " + kd.ShortName;
                    }
                    fa.SettlementCode = model.FactSettlementCode;
                    if (!string.IsNullOrEmpty(model.FactSettlementCode))
                    {
                        KladrDto kd = KladrDao.GetKladrByCode(model.FactSettlementCode).Single();
                        fa.SettlementName = kd.Name + " " + kd.ShortName;
                    }
                    fa.StreetCode = model.FactStreetCode;
                    if (!string.IsNullOrEmpty(model.FactStreetCode))
                    {
                        KladrDto kd = KladrDao.GetKladrByCode(model.FactStreetCode).Single();
                        fa.StreetName = kd.Name + " " + kd.ShortName;
                    }
                    fa.HouseType = model.FactHouseType;
                    fa.HouseNumber = model.FactHouseNumber;
                    fa.BuildType = model.FactBuildType;
                    fa.BuildNumber = model.FactBuildNumber;
                    fa.FlatType = model.FactFlatType;
                    fa.FlatNumber = model.FactFlatNumber;
                    fa.IsUsed = true;
                    fa.Creator = curUser;
                    fa.CreateDate = DateTime.Now;

                    RefAddressesDao.SaveAndFlush(fa);

                    dmd.FactAddress = fa;
                }

                dmd.DepStatus = model.DepStatus;
                dmd.DepartmentType = !model.DepTypeId.HasValue || model.DepTypeId.Value == 0 ? null : StaffDepartmentTypesDao.Load(model.DepTypeId.Value);
                dmd.SKB_GE = !model.SKB_GE_Id.HasValue || model.SKB_GE_Id.Value == 0 ? null : StaffDepartmentSKB_GEDao.Load(model.SKB_GE_Id.Value);
                dmd.OpenDate = model.OpenDate;
                dmd.CloseDate = model.CloseDate;
                dmd.OperationMode = model.OperationMode;
                dmd.OperationModeCash = model.OperationModeCash;
                dmd.OperationModeATM = model.OperationModeATM;
                dmd.OperationModeCashIn = model.OperationModeCashIn;
                dmd.BeginIdleDate = model.BeginIdleDate;
                dmd.EndIdleDate = model.EndIdleDate;
                dmd.RentPlace = !model.RentPlaceId.HasValue || model.RentPlaceId.Value == 0 ? null : StaffDepartmentRentPlaceDao.Load(model.RentPlaceId.Value);
                dmd.AgreementDetails = model.AgreementDetails;
                dmd.DivisionArea = model.DivisionArea;
                dmd.AmountPayment = model.AmountPayment;
                dmd.Phone = model.Phone;
                dmd.IsBlocked = model.IsBlocked;
                dmd.NetShopIdentification = !model.NetShopId.HasValue || model.NetShopId.Value == 0 ? null : StaffNetShopIdentificationDao.Load(model.NetShopId.Value);
                dmd.CashDeskAvailable = !model.CDAvailableId.HasValue || model.CDAvailableId.Value == 0 ? null : StaffDepartmentCashDeskAvailableDao.Load(model.CDAvailableId.Value);
                dmd.IsLegalEntity = model.IsLegalEntity;
                dmd.PlanEPCount = model.PlanEPCount;
                dmd.PlanSalaryFund = model.PlanSalaryFund;
                dmd.Note = model.Note;
                dmd.Creator = curUser;
                dmd.CreateDate = DateTime.Now;

                //режим работы
                dmd.DepOperationModes = new List<StaffDepartmentOperationModes>();
                if (model.OperationModes != null)
                {
                    foreach (var item in model.OperationModes)
                    {
                        dmd.DepOperationModes.Add(new StaffDepartmentOperationModes
                        {
                            DepartmentManagerDetail = dmd,
                            ModeType = item.ModeType,
                            WeekDay = item.WeekDay,
                            WorkBegin = item.WorkBegin,
                            WorkEnd = item.WorkEnd,
                            BreakBegin = item.BreakBegin,
                            BreakEnd = item.BreakEnd,
                            IsWorkDay = item.IsWorkDay,
                            Creator = curUser,
                            CreateDate = DateTime.Now
                        });
                    }
                }

                //операции
                dmd.DepartmentOperationGroup = model.OperGroupId == 0 ? null : StaffDepartmentOperationGroupsDao.Get(model.OperGroupId);
                //foreach (var item in model.Operations.Where(x => x.IsUsed == true))
                //{
                //    dmd.DepOperations.Add(new StaffDepartmentOperationLinks {
                //        DepartmentManagerDetail = dmd,
                //        DepartmentOperation = StaffDepartmentOperationsDao.Load(item.OperationId),
                //        Creator = curUser,
                //        CreateDate = DateTime.Now
                //    });
                //}

                //коды программ
                //могут редактировать только администраторы ПО банка (переменная определяется в процедуре определения состояния согласования)
                if (model.IsSoftAdminApproveAvailable)
                {
                    dmd.ProgramCodes = new List<StaffProgramCodes>();
                    if (model.ProgramCodes != null)
                    {
                        foreach (var item in model.ProgramCodes.Where(x => x.Code != null))
                        {
                            dmd.ProgramCodes.Add(new StaffProgramCodes
                            {
                                DepartmentManagerDetail = dmd,
                                Program = StaffProgramReferenceDao.Load(item.ProgramId),
                                Code = item.Code,
                                Creator = curUser,
                                CreateDate = DateTime.Now
                            });
                        }
                    }
                }

                //ориентиры
                dmd.DepartmentLandmarks = new List<StaffDepartmentLandmarks>();
                if (model.DepLandmarks != null)
                {
                    foreach (var item in model.DepLandmarks.Where(x => x.Description != null))
                    {
                        dmd.DepartmentLandmarks.Add(new StaffDepartmentLandmarks
                        {
                            DepartmentManagerDetail = dmd,
                            LandmarkTypes = StaffLandmarkTypesDao.Load(item.LandmarkId),
                            Description = item.Description,
                            Creator = curUser,
                            CreateDate = DateTime.Now
                        });
                    }
                }

                //entity.DepartmentManagerDetails.Add(dmd);
                entity.DepartmentManagerDetails.Add(dmd);

                try
                {
                    StaffDepartmentRequestDao.SaveAndFlush(entity);
                    model.Id = entity.Id;
                    error = "Данные сохранены!";
                    return true;
                }
                catch (Exception ex)
                {
                    StaffDepartmentRequestDao.RollbackTran();
                    RefAddressesDao.RollbackTran();
                    error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message);
                    return false;
                }
            }
            //если не по той ветке пошли
            error = "Произошла ошибка при сохранении данных! Обратитесь к разработчикам!";
            return false;
        }