/// <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; } }
/// <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; }
/// <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; }
/// <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; }
/// <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 + " - Член правления банка" }); }
/// <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; }
/// <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; }