/// <summary> /// Определяем состояние согласования заявки. /// </summary> /// <param name="model">Модель</param> /// <param name="entity">Данные заявки</param> protected void SetApprovalFlags(StaffEstablishedPostRequestModel model, StaffEstablishedPostRequest entity) { User curUser = UserDao.Get(AuthenticationService.CurrentUser.Id);//текущий пользователь //заполняем списки согласовантов if (entity.Creator != null) GetApprovalLists(model, entity); //за согласовантов могут отработать кураторы и кадровики банка. model.IsCurator = (AuthenticationService.CurrentUser.UserRole == UserRole.Inspector); model.IsPersonnelBank = (AuthenticationService.CurrentUser.UserRole == UserRole.ConsultantPersonnel); model.IsConsultant = (AuthenticationService.CurrentUser.UserRole == UserRole.ConsultantOutsourcing); //разбираемся с состоянием птиц //выбираем из согласования не архивные записи. IList<DocumentApproval> DocApproval = DocumentApprovalDao.GetDocumentApproval(entity.Id, (int)ApprovalTypeEnum.StaffEstablishedPostRequest); //для новых/автоматически сформированных заявок if (DocApproval == null || DocApproval.Count == 0) { model.IsInitiatorApproveAvailable = entity.IsUsed ? false : (model.Initiators.Count != 0 && (model.IsCurator || model.IsPersonnelBank || model.IsConsultant || (model.Initiators != null && 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; 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; if (!string.IsNullOrEmpty(PyrusNumber)) { model.InitiatorPyrusName = "Задача в Пайрус № " + PyrusNumber; model.InitiatorPyrusRef = @"https://pyrus.com/t#id" + PyrusNumber; } //открываем согласование для следующего участника процесса model.IsCuratorApproveAvailable = model.IsCurator || model.IsConsultant ? true : false; model.IsAgreeButtonAvailable = model.IsCuratorApproveAvailable; //открываем согласование для следующего участника процесса if (entity.Department.DepartmentAccessory != null) { if (entity.Department.DepartmentAccessory.Id == 2 || entity.Department.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; } //открываем согласование для следующего участника процесса model.IsPersonnelBankApproveAvailable = model.IsPersonnelBank || model.IsConsultant ? true : false; model.IsAgreeButtonAvailable = model.IsPersonnelBankApproveAvailable; 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 4://вышестоящий руководитель 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 5://член правления 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; } } } 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) { model.IsAgreeButtonAvailable = false; } if (entity.DeleteDate.HasValue) { model.IsDraftButtonAvailable = false; model.IsAgreeButtonAvailable = false; } }
/// <summary> /// Загрузка реквизитов инициатора и подразделения к заявкам для штатных единиц /// </summary> /// <param name="model">Заполняемая модель заявки.</param> /// <returns></returns> protected void GetDepRequestInfo(StaffEstablishedPostRequestModel model) { User curUser = UserDao.Load(model.UserId != 0 ? model.UserId : AuthenticationService.CurrentUser.Id); model.DepartmentName = curUser.Department != null ? curUser.Department.Name : string.Empty; model.RequestInitiator = curUser.Name + " - " + (curUser.Position != null ? curUser.Position.Name : string.Empty); if (model.DepartmentId != 0) { Department dep = DepartmentDao.Get(model.DepartmentId); model.DepartmentName = dep.Name; model.FingradCode = dep.FingradCode; int DepId = StaffDepartmentRequestDao.GetCurrentRequestId(dep != null ? dep.Id : 0); if (DepId != 0) { StaffDepartmentRequest DepEntity = StaffDepartmentRequestDao.Get(DepId); //model.IsBack = DepEntity.IsBack; if (DepEntity.LegalAddress != null) { model.LegalAddress = DepEntity.LegalAddress.Address; } model.IsTaxAdminAccount = DepEntity.IsTaxAdminAccount; model.IsEmployeAvailable = DepEntity.IsEmployeAvailable; model.AccessoryName = DepEntity.DepartmentAccessory != null ? DepEntity.DepartmentAccessory.Name : string.Empty; } //налоговые реквизиты //StaffDepartmentTaxDetails dt = StaffDepartmentTaxDetailsDao.Get(dep.Id); model.KPP = dep.DepartmentTaxDetails != null && dep.DepartmentTaxDetails.Count != 0 ? dep.DepartmentTaxDetails[0].KPP : string.Empty; model.OKTMO = dep.DepartmentTaxDetails != null && dep.DepartmentTaxDetails.Count != 0 ? dep.DepartmentTaxDetails[0].OKTMO : string.Empty; model.OKATO = dep.DepartmentTaxDetails != null && dep.DepartmentTaxDetails.Count != 0 ? dep.DepartmentTaxDetails[0].OKATO : string.Empty; model.RegionCode = dep.DepartmentTaxDetails != null && dep.DepartmentTaxDetails.Count != 0 ? dep.DepartmentTaxDetails[0].RegionCode : string.Empty; model.TaxAdminCode = dep.DepartmentTaxDetails != null && dep.DepartmentTaxDetails.Count != 0 ? dep.DepartmentTaxDetails[0].TaxAdminCode : string.Empty; model.TaxAdminName = dep.DepartmentTaxDetails != null && dep.DepartmentTaxDetails.Count != 0 ? dep.DepartmentTaxDetails[0].TaxAdminName : string.Empty; model.PostAddress = dep.DepartmentTaxDetails != null && dep.DepartmentTaxDetails.Count != 0 ? dep.DepartmentTaxDetails[0].PostAddress : string.Empty; } }
/// <summary> /// Сохраняем согласования. /// </summary> /// <param name="model">Модель</param> /// <param name="entity">Текущая заявка.</param> /// <param name="curUser">текущий пользователь.</param> /// <param name="error">Сообщение об ошибке.</param> /// <returns></returns> protected int SaveStaffEstablishedPostApprovals(StaffEstablishedPostRequestModel model, StaffEstablishedPostRequest 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 ? curUser : null;//куратор/кадровик банка/консультант РК //выбираем из согласования не архивные записи. IList<DocumentApproval> DocApproval = DocumentApprovalDao.GetDocumentApproval(entity.Id, (int)ApprovalTypeEnum.StaffEstablishedPostRequest); DocumentApproval da = new DocumentApproval(); da.ApprovalType = (int)ApprovalTypeEnum.StaffEstablishedPostRequest; da.DocId = entity.Id; da.IsArchive = false; da.CreateDate = DateTime.Now; switch (DocApproval.Count) { case 0: //если иницатор не выбран, это значит, что инициатор действует сам User Initiator = model.InitiatorId != 0 ? UserDao.Get(model.InitiatorId) : curUser;//инициатор da.ApproveUser = Initiator; da.AssistantUser = Assistant; da.Number = 1; error = "Заявка создана!"; break; case 1: da.ApproveUser = curUser; da.AssistantUser = null; da.Number = 2; error = "Заявка проверена куратором!"; break; case 2: da.ApproveUser = curUser; da.AssistantUser = null; da.Number = 3; error = "Заявка проверена кадровиком банка!"; break; case 3: //если согласовант не выбран, это значит, что он действует сам User TopManager = model.TopManagerId != 0 ? UserDao.Get(model.TopManagerId) : curUser;//высший руководитель da.ApproveUser = TopManager; da.AssistantUser = Assistant; da.Number = 4; error = "Заявка согласована!"; break; case 4: //если утверждающий не выбран, это значит, что он действует сам User BoardMember = model.BoardMemberId != 0 ? UserDao.Get(model.BoardMemberId) : curUser;//член правления da.ApproveUser = BoardMember; da.AssistantUser = Assistant; da.Number = 5; error = "Заявка утверждена!"; break; } try { DocumentApprovalDao.SaveAndFlush(da); //сохраняем здачу пайруса if (!string.IsNullOrEmpty(model.PyrusNumber)) { entity.StaffRequestPyrusTasks.Add(new StaffRequestPyrusTasks() { EPRequest = 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 < 5) return da.Number; if (da.Number == 5) { //entity.BeginAccountDate = DateTime.Now; entity.DateAccept = 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="error">Сообщенио об ошибке.</param> /// <returns></returns> public bool DeleteEstablishedPostRequest(StaffEstablishedPostRequestModel model, out string error) { error = string.Empty; StaffEstablishedPostRequest entity = StaffEstablishedPostRequestDao.Get(model.Id); if (entity == null) { error = "Заявка не найдена! Обратитесь к разработчикам!"; return false; } User curUser = UserDao.Load(AuthenticationService.CurrentUser.Id); //отклонение заявки if (model.IsDelete) { entity.IsUsed = false; entity.DeleteDate = DateTime.Now; entity.RejectUser = curUser; //если отклоняется заявка на сокращение, то в расстановке убираем все резервы и отметки if (entity.StaffEstablishedPost.EstablishedPostUserLinks.Where(x => x.IsUsed && x.IsDismissal).Count() != 0) { foreach(StaffEstablishedPostUserLinks ul in entity.StaffEstablishedPost.EstablishedPostUserLinks.Where(x => x.IsUsed && x.IsDismissal)) { ul.IsDismissal = false; ul.ReserveType = 0; ul.DocId = 0; ul.Editor = UserDao.Get(AuthenticationService.CurrentUser.Id); ul.EditDate = DateTime.Now; } } error = "Заявка отклонена!"; if (model.Id != 0) { try { StaffEstablishedPostRequestDao.SaveAndFlush(entity); model.Id = entity.Id; } catch (Exception ex) { StaffEstablishedPostRequestDao.RollbackTran(); error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message); return false; } } return true; } //если не по той ветке пошли error = "Произошла ошибка при сохранении данных! Обратитесь к разработчикам!"; return false; }
/// <summary> /// Процедура заполняет списки согласовантов, на случай, если за них согласовывают кураторы или кадровики банка. /// </summary> /// <param name="model">Модель</param> /// <param name="entity">Данные заявки.</param> protected void GetApprovalLists(StaffEstablishedPostRequestModel model, StaffEstablishedPostRequest entity) { //определяем родительское подразделение Department Parentdep = DepartmentDao.GetByCode(entity.Department.ParentId.ToString()); //относительно родительского ищем руководителей //помним, что начальника может не быть в родительском подразделении, по этому ищем вверх по ветке всех руководителей IList<User> Initiators = DepartmentDao.GetDepartmentManagersWithManualLinks(model.DepartmentId)//DepartmentDao.GetDepartmentManagers(Parentdep.Id, true) .OrderByDescending<User, int?>(manager => manager.Level) .ToList<User>(); ////если инициатором является куратор или кадровик банка, то по ветке подразделения находим руководителей на уровень выше создаваемого подразделения 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 (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="model">Модель заявки.</param> /// <param name="error">Сообщенио об ошибке.</param> /// <returns></returns> public bool SaveEditEstablishedPostRequest(StaffEstablishedPostRequestModel model, out string error) { error = string.Empty; ////начало теста //int aa = StaffEstablishedPostRequestDao.TestExecStoredProcedure(2); //error = aa.ToString(); //return false; ////конец теста //несогласованная заявка для штатной единицы должна быть только одна if (model.RequestTypeId != 1)//для редактирования и сокращения { if (!StaffEstablishedPostRequestDao.CheckEnabeldCreateNewRequest(model.SEPId, model.Id)) { error = "Редактировать/Согласовать данную заявку для данной штатной единицы невозможно, так как уже существует неутвержденная заявка!"; return false; } } StaffEstablishedPostRequest entity = StaffEstablishedPostRequestDao.Get(model.Id); if (entity == null) { error = "Заявка не найдена! Обратитесь к разработчикам!"; return false; } else { if (!model.IsDraft) { bool IsEnabled = false; //для подразделений уже давно существующих, смотрим наличие налоговых реквизитов if (entity.Department.DepartmentTaxDetails.Count != 0) { if ((!string.IsNullOrEmpty(entity.Department.DepartmentTaxDetails[0].TaxAdminCode) && !string.IsNullOrWhiteSpace(entity.Department.DepartmentTaxDetails[0].TaxAdminCode)) || (!string.IsNullOrEmpty(entity.Department.DepartmentTaxDetails[0].OKTMO) && !string.IsNullOrWhiteSpace(entity.Department.DepartmentTaxDetails[0].OKTMO)) || (!string.IsNullOrEmpty(entity.Department.DepartmentTaxDetails[0].KPP) && !string.IsNullOrWhiteSpace(entity.Department.DepartmentTaxDetails[0].KPP))) IsEnabled = true; } //для совсем свежих подразделений находим заявку и смотрим там соседа с налоговыми реквизитами if (!IsEnabled) { StaffDepartmentRequest sdr = StaffDepartmentRequestDao.Get(StaffDepartmentRequestDao.GetCurrentRequestId(entity.Department != null ? entity.Department.Id : 0)); if (sdr != null) { if (sdr.DepNext != null && sdr.DepNext.DepartmentTaxDetails.Count != 0) { if ((!string.IsNullOrEmpty(sdr.DepNext.DepartmentTaxDetails[0].TaxAdminCode) && !string.IsNullOrWhiteSpace(sdr.DepNext.DepartmentTaxDetails[0].TaxAdminCode)) || (!string.IsNullOrEmpty(sdr.DepNext.DepartmentTaxDetails[0].OKTMO) && !string.IsNullOrWhiteSpace(sdr.DepNext.DepartmentTaxDetails[0].OKTMO)) || (!string.IsNullOrEmpty(sdr.DepNext.DepartmentTaxDetails[0].KPP) && !string.IsNullOrWhiteSpace(sdr.DepNext.DepartmentTaxDetails[0].KPP))) IsEnabled = true; } } } if (!IsEnabled) { error = "Нельзя создать/изменить/сократить штатную единицу, так как данное подразделение не стоит на налоговом учете!"; return false; } if (entity.RequestType.Id == 3 && StaffEstablishedPostDao.GetEstablishedPostUsedForCheckToDismiss(entity.StaffEstablishedPost != null ? entity.StaffEstablishedPost.Id : 0) != 0) { error = "Нельзя сократить штатную единицу, так как она еще содержит работающих сотрудников!"; return false; } //if (entity.RequestType.Id == 3 && entity.StaffEstablishedPost.EstablishedPostUserLinks.Where(x => x.ReserveType.HasValue && x.ReserveType.Value != 0 && x.ReserveType.Value != 3).Count() != 0) //{ // error = "Нельзя сократить штатную единицу, так как она еще содержит забронированные позиции!"; // return false; //} //if (entity.Quantity < StaffEstablishedPostDao.GetEstablishedPostUsed(entity.StaffEstablishedPost != null ? entity.StaffEstablishedPost.Id : 0)) //{ // error = "Нельзя сократить штатную единицу, так как она еще содержит работающих сотрудников больше, чем указанное количество в заявке!"; // return false; //} } } User curUser = UserDao.Load(AuthenticationService.CurrentUser.Id); entity.RequestType = StaffEstablishedPostRequestTypesDao.Load(model.RequestTypeId); entity.DateRequest = DateTime.Now; entity.StaffEstablishedPost = model.RequestTypeId == 1 ? null : StaffEstablishedPostDao.Get(model.SEPId); entity.Position = PositionDao.Get(model.PositionId); entity.Department = model.DepartmentId != 0 ? DepartmentDao.Get(model.DepartmentId) : null; entity.Schedule = model.ScheduleId != 0 ? ScheduleDao.Get(model.ScheduleId) : null; entity.WorkingCondition = model.WCId != 0 ? StaffWorkingConditionsDao.Get(model.WCId) : null; //(model.RequestTypeId == 3 || model.RequestTypeId == 4) && model.Personnels.Where(x => x.UserId != 0 && x.IsDismissal).Count() == 0 if (model.RequestTypeId == 1 || model.RequestTypeId == 2) { entity.Quantity = model.Quantity; entity.Salary = model.Salary; } //entity.BeginAccountDate = model.BeginAccountDate; entity.Reason = model.ReasonId.HasValue ? AppointmentReasonDao.Get(model.ReasonId.Value) : null; entity.IsDraft = entity.IsUsed ? false : model.IsDraft; entity.Editor = curUser; entity.EditDate = DateTime.Now; entity.BeginAccountDate = model.BeginAccountDate; //при сокращении ставим метки в расстановке (до начала согласования) if ((entity.RequestType.Id == 2 || entity.RequestType.Id == 3 || entity.RequestType.Id == 4) && !entity.DateSendToApprove.HasValue && entity.StaffEstablishedPost != null) { foreach (StaffEstablishedPostUserLinks ul in entity.StaffEstablishedPost.EstablishedPostUserLinks) { if (model.Personnels.Where(x => x.Id == ul.Id && x.IsDismissal != ul.IsDismissal).Count() != 0) { StaffUserLinkDto item = model.Personnels.Where(x => x.Id == ul.Id && x.IsDismissal != ul.IsDismissal).FirstOrDefault(); if (entity.RequestType.Id == 3 && (item.ReserveType == 1 || item.ReserveType == 2) && item.IsDismissal) { error = "Помечена к сокращению забронированная позиция! Выполнение операции прервано!"; return false; } ul.IsDismissal = item.IsDismissal; ul.DateDistribNote = item.DateDistribNote; ul.DateReceivNote = item.DateReceivNote; ul.ReserveType = item.IsDismissal ? (int)StaffReserveTypeEnum.Dismissal : 0; ul.DocId = item.IsDismissal ? entity.Id : 0; ul.Editor = curUser; ul.EditDate = DateTime.Now; } } } //надбавки //сохраняем только при открытии и изменении до отправки на согласование if (model.RequestTypeId != 3 && !entity.DateSendToApprove.HasValue) { if (entity.PostChargeLinks == null) entity.PostChargeLinks = new List<StaffEstablishedPostChargeLinks>(); foreach (var item in model.PostChargeLinks) { StaffEstablishedPostChargeLinks pcl = new StaffEstablishedPostChargeLinks(); //если была запись и убрали значения, то удаляем if ((item.Id != 0 && item.Amount == 0) || (item.Id != 0 && item.IsNeeded && !item.IsUsed)) { pcl = entity.PostChargeLinks.Where(x => x.Id == item.Id).Single(); entity.PostChargeLinks.Remove(pcl); } //если не было записи и ввели значение, то добавляем if ((item.Id == 0 && item.Amount != 0) || (item.Id == 0 && item.IsNeeded && item.IsUsed)) { pcl.EstablishedPostRequest = entity; pcl.EstablishedPost = entity.StaffEstablishedPost; pcl.ExtraCharges = StaffExtraChargesDao.Get(item.ChargeId); pcl.Amount = item.Amount; pcl.IsUsed = item.IsUsed; pcl.ExtraChargeActions = StaffExtraChargeActionsDao.Get(item.ActionId); pcl.Creator = curUser; pcl.CreateDate = DateTime.Now; entity.PostChargeLinks.Add(pcl); } //запись была и есть код, то предпологаем, что это редактирование (только для надбавок с значением) if (item.Id != 0 /*&& item.Amount != 0*/) { entity.PostChargeLinks.Where(x => x.Id == item.Id).Single().EstablishedPost = entity.StaffEstablishedPost; entity.PostChargeLinks.Where(x => x.Id == item.Id).Single().Amount = item.Amount; entity.PostChargeLinks.Where(x => x.Id == item.Id).Single().ExtraChargeActions = StaffExtraChargeActionsDao.Get(item.ActionId); entity.PostChargeLinks.Where(x => x.Id == item.Id).Single().Editor = curUser; entity.PostChargeLinks.Where(x => x.Id == item.Id).Single().EditDate = DateTime.Now; } } } //создаем запись в справочнике штатных единиц. if (!model.IsDraft) { int Result = entity.RequestType.Id == 4 ? 0 : SaveStaffEstablishedPostApprovals(model, entity, curUser, out error); if (Result == -1) return false; if (Result == 0) { if (!SaveStaffEstablishedPostReference(entity, curUser, out error)) { return false; } //для первоначальных данных if (entity.RequestType.Id == 4) { entity.DateSendToApprove = DateTime.Now; entity.BeginAccountDate = entity.BeginAccountDate.HasValue ? entity.BeginAccountDate : DateTime.Now; entity.DateAccept = DateTime.Now; //если создается новая штатная единица и в ней нет сотрудников, то надо указать признак выгрузки в 1С, чтобы пустые заявки не попали в выгрузку кадровых перемещений. //или сокращаются пустые места в расстановке if (entity.StaffEstablishedPost.EstablishedPostUserLinks.Where(x => x.User != null).Count() == 0 && entity.StaffEstablishedPost.EstablishedPostUserLinks.Where(x => x.User != null && x.IsDismissal && x.IsUsed).Count() == 0) { entity.SendTo1C = DateTime.Now; } } //если уже была заявка, то у нее убираем признак использования, это для изменения/удаления if (entity.RequestType.Id != 1) { int OldRequestId = StaffEstablishedPostRequestDao.GetCurrentRequestId(entity.StaffEstablishedPost.Id); if (OldRequestId != 0) { StaffEstablishedPostRequest OldEntity = StaffEstablishedPostRequestDao.Get(OldRequestId); OldEntity.IsUsed = false; try { StaffEstablishedPostRequestDao.SaveAndFlush(OldEntity); } catch (Exception ex) { StaffEstablishedPostRequestDao.RollbackTran(); error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message); return false; } } } entity.IsUsed = true; error = "Заявка утверждена!"; } } if (model.Id != 0) { try { StaffEstablishedPostRequestDao.SaveAndFlush(entity); model.Id = entity.Id; if (model.IsDraft) error = "Данные сохранены!"; } catch (Exception ex) { StaffEstablishedPostRequestDao.RollbackTran(); error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message); return false; } return true; } //если не по той ветке пошли error = "Произошла ошибка при сохранении данных! Обратитесь к разработчикам!"; return false; }
/// <summary> /// Процедура сохранения новой заявки для штатной единицы. /// </summary> /// <param name="model">Модель заявки.</param> /// <param name="error">Сообщенио об ошибке.</param> /// <returns></returns> public bool SaveNewEstablishedPostRequest(StaffEstablishedPostRequestModel model, out string error) { error = string.Empty; StaffEstablishedPostRequest entity; User curUser = UserDao.Load(AuthenticationService.CurrentUser.Id); //несогласованная заявка для штатной единицы должна быть только одна if (model.RequestTypeId != 1)//для редактирования и сокращения { if (!StaffEstablishedPostRequestDao.CheckEnabeldCreateNewRequest(model.SEPId, model.Id)) { error = "Создать новую заявку для данной штатной единицы невозможно, так как уже существует неутвержденная заявка!"; return false; } } if (model.Id == 0) { entity = new StaffEstablishedPostRequest { RequestType = StaffEstablishedPostRequestTypesDao.Load(model.RequestTypeId), DateRequest = DateTime.Now, StaffEstablishedPost = model.RequestTypeId == 1 ? null : StaffEstablishedPostDao.Get(model.SEPId), Position = PositionDao.Get(model.PositionId), Department = model.DepartmentId != 0 ? DepartmentDao.Get(model.DepartmentId) : null, Schedule = model.ScheduleId != 0 ? ScheduleDao.Get(model.ScheduleId) : null, WorkingCondition = model.WCId != 0 ? StaffWorkingConditionsDao.Get(model.WCId) : null, Quantity = model.RequestTypeId != 3 ? model.Quantity : model.QuantityPrev, Salary = model.RequestTypeId != 3 ? model.Salary : model.SalaryPrev, BeginAccountDate = model.BeginAccountDate, IsUsed = false, IsDraft = true, Reason = model.ReasonId.HasValue ? AppointmentReasonDao.Get(model.ReasonId.Value) : null, Creator = curUser, CreateDate = DateTime.Now }; //надбавки entity.PostChargeLinks = new List<StaffEstablishedPostChargeLinks>(); foreach (var item in model.PostChargeLinks.Where(x => x.Amount != 0 || x.IsUsed)) { entity.PostChargeLinks.Add(new StaffEstablishedPostChargeLinks { EstablishedPostRequest = entity, EstablishedPost = entity.StaffEstablishedPost, ExtraCharges = StaffExtraChargesDao.Get(item.ChargeId), Amount = item.Amount, ExtraChargeActions = StaffExtraChargeActionsDao.Get(item.ActionId), IsUsed = item.IsUsed, Creator = curUser, CreateDate = DateTime.Now }); } //расстановка //при сокращении или вводе ременной вакансии ставим метки в расстановке if (entity.RequestType.Id == 2 || entity.RequestType.Id == 3 || (entity.RequestType.Id == 4 && (model.Personnels != null && model.Personnels.Count != 0))) { ////на случай добавления вакансии //if (entity.RequestType.Id == 2 || (entity.RequestType.Id == 4 && model.Personnels.Count != 0)) //{ // int CountLinks = entity.StaffEstablishedPost.EstablishedPostUserLinks != null ? entity.StaffEstablishedPost.EstablishedPostUserLinks.Count() : 0; // if (entity.Quantity > CountLinks) // { // CountLinks = entity.Quantity - CountLinks; // for (int i = 0; i < CountLinks; i++) // { // entity.StaffEstablishedPost.EstablishedPostUserLinks.Add(new StaffEstablishedPostUserLinks() // { // StaffEstablishedPost = entity.StaffEstablishedPost, // User = null, // IsUsed = false, // Creator = curUser, // CreateDate = DateTime.Now // }); // } // } //} foreach (StaffEstablishedPostUserLinks ul in entity.StaffEstablishedPost.EstablishedPostUserLinks) { if (model.Personnels.Where(x => x.Id == ul.Id).Count() != 0) { StaffUserLinkDto item = model.Personnels.Where(x => x.Id == ul.Id).FirstOrDefault(); if (entity.RequestType.Id == 3 || entity.RequestType.Id == 4) { ul.IsDismissal = item.IsDismissal;//model.Personnels.Where(x => x.Id == ul.Id).Single().IsDismissal; ul.DateDistribNote = item.DateDistribNote; ul.DateReceivNote = item.DateReceivNote; } ul.Editor = curUser; ul.EditDate = DateTime.Now; } } } try { StaffEstablishedPostRequestDao.SaveAndFlush(entity); model.Id = entity.Id; error = "Данные сохранены!"; return true; } catch (Exception ex) { StaffEstablishedPostRequestDao.RollbackTran(); error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message); return false; } } //если не по той ветке пошли error = "Произошла ошибка при сохранении данных! Обратитесь к разработчикам!"; return false; }
/// <summary> /// Загрузка справочников модели для заявок к штатным единицам. /// </summary> /// <param name="model">Модель заявки.</param> public void LoadDictionaries(StaffEstablishedPostRequestModel model) { //реквизиты инициатора model.RequestTypes = StaffEstablishedPostRequestTypesDao.LoadAll(); model.Reasons = AppointmentReasonDao.LoadAll(); model.Reasons.Insert(0, new AppointmentReason { Code = "", Id = 0, Name = "" }); model.Schedules = ScheduleDao.LoadAll().Where(x => x.Id == 37 || x.Id == 45 || x.Id == 48).ToList().ConvertAll(x => new SelectListItem { Value = x.Id.ToString(), Text = x.Name }); model.WorkConditions = StaffWorkingConditionsDao.LoadAllSorted().ToList().ConvertAll(x => new SelectListItem { Value = x.Id.ToString(), Text = x.Name }).OrderBy(x => Int32.Parse(x.Value)); model.PostChargeActions = StaffExtraChargeActionsDao.LoadAll().ToList().ConvertAll(x => new IdNameDto { Id = x.Id, Name = x.Name }); model.PostChargeActions.Insert(0, new IdNameDto { Id = 0, Name = "" }); GetDepRequestInfo(model); //список руководителей IList<User> managers = DepartmentDao.GetDepartmentManagersWithManualLinks(model.DepartmentId); //model.InitiatorId StringBuilder managersBuilder = new StringBuilder(); foreach (var manager in managers) { managersBuilder.AppendFormat("{0} ({1}), ", manager.Name, manager.Position == null ? "<не указана>" : manager.Position.Name); } model.Managers = managersBuilder.ToString(); //пытаемся показать правильную расстановку для штатной единицы StaffEstablishedPostRequest entity = StaffEstablishedPostRequestDao.Get(model.Id); if (entity != null) { if (entity.StaffEstablishedPost != null) { //поля UserId, Surname, IsPregnant определяем так же, как в функции показывающей штатную расстановку model.Personnels = entity.StaffEstablishedPost.EstablishedPostUserLinks .Where(x => x.IsUsed || (!x.IsUsed && x.ReserveType == 3 && x.DocId == entity.Id)).ToList() .ConvertAll(x => new StaffUserLinkDto { Id = x.Id ,SEPId = x.StaffEstablishedPost.Id ,UserId = x.User != null ? x.User.Id : 0 ,Surname = x.User != null && (!x.User.IsPregnant.HasValue || !x.User.IsPregnant.Value) && x.User.ChildVacation.Where(z => z.SendTo1C.HasValue && !z.DeleteDate.HasValue && z.BeginDate <= DateTime.Now && z.EndDate >= DateTime.Now).Count() == 0 ? x.User.Name : "" ,IsPregnant = x.User != null ? ((x.User.IsPregnant.HasValue && x.User.IsPregnant.Value) || x.User.ChildVacation.Where(z => z.SendTo1C.HasValue && !z.DeleteDate.HasValue && z.BeginDate <= DateTime.Now && z.EndDate >= DateTime.Now).Count() != 0 ? true : false) : false ,IsUsed = x.IsUsed ,ReserveType = x.ReserveType.HasValue ? x.ReserveType.Value : 0 ,DocId = x.DocId.HasValue ? x.DocId.Value : 0 ,IsDismissal = x.IsDismissal ,DateDistribNote = x.DateDistribNote ,DateReceivNote = x.DateReceivNote }).OrderBy(x => x.Surname).ToList(); } //согласование - расстановка флажков и т.д. SetApprovalFlags(model, entity); } else { model.IsCurator = (AuthenticationService.CurrentUser.UserRole == UserRole.Inspector); model.IsPersonnelBank = (AuthenticationService.CurrentUser.UserRole == UserRole.ConsultantPersonnel); model.IsConsultant = (AuthenticationService.CurrentUser.UserRole == UserRole.ConsultantOutsourcing); } if (model.Personnels == null) { model.Personnels = StaffEstablishedPostDao.GetStaffEstablishedArrangements(model.DepartmentId).Where(x => x.SEPId == model.SEPId).ToList() .ConvertAll(x => new StaffUserLinkDto { Id = x.Id ,SEPId = x.SEPId ,UserId = x.UserId ,Surname = x.Surname ,IsPregnant = x.IsPregnant ,IsUsed = true ,ReserveType = x.ReserveType ,DocId = x.DocId ,IsDismissal = x.IsDismissal ,DateDistribNote = x.DateDistribNote ,DateReceivNote = x.DateReceivNote }).OrderBy(x => x.Surname).ToList(); } //отображение куска структуры для этого подразделения Department CurDep = DepartmentDao.Get(model.DepartmentId); StaffDepartmentFingradStructureDto FinStructure = StaffDepartmentRPLinkDao.GetFingradStructureForDeparment(CurDep.ParentId.HasValue ? CurDep.ParentId.Value : 0); if (FinStructure != null) { model.ManagementCode = FinStructure.ManagementCode; model.ManagementName = FinStructure.ManagementName; model.ManagementNameSKD = FinStructure.ManagementNameSKD; model.AdminCode = FinStructure.AdminCode; model.AdminName = FinStructure.AdminName; model.AdminNameSKD = FinStructure.AdminNameSKD; model.BGCode = FinStructure.BGCode; model.BGName = FinStructure.BGName; model.BGNameSKD = FinStructure.BGNameSKD; model.RPLInkCode = FinStructure.RPLinkCode; model.RPLInkName = FinStructure.RPLinkName; model.RPLInkNameSKD = FinStructure.RPLinkNameSKD; } }
/// <summary> /// Заполняем модель заявки для штатной единицы. /// </summary> /// <param name="model">Модель заявки.</param> /// <returns></returns> public StaffEstablishedPostRequestModel GetEstablishedPostRequest(StaffEstablishedPostRequestModel model) { //готовая заявка грузиться по Id //создание заявки на создание ШЕ, идет по ветке где Id = 0 //создание заявки на изменение/удаление, нужно заполнить текущими даными, но с обнуленным Id, чтобы создалась новая заявка //для заявок на редактирование надо сделать поиск текущей заявки по Id штатной единицы, для того чтобы ее заполнить только данными, а Id самой заявки обнулить, чтобы запись добавилась, а не редактировалась bool IsRequestExists = model.Id == 0 ? false : true; if (model.Id == 0) model.Id = StaffEstablishedPostRequestDao.GetCurrentRequestId(model.SEPId); //заполняем заявку на все случаи жизни if (model.Id == 0) { Department CurDep = DepartmentDao.Get(model.DepartmentId); model.DateRequest = null; model.UserId = AuthenticationService.CurrentUser.Id; model.PositionId = 0; model.PositionName = string.Empty; model.Quantity = 0; model.Salary = 0; model.ReasonId = 0; model.ScheduleId = 0; model.WCId = 0; model.BeginAccountDate = DateTime.Now; model.EPInfo = string.Empty; model.ItemLevel = CurDep == null || !CurDep.ItemLevel.HasValue ? 0 : CurDep.ItemLevel.Value; //кнопки model.IsDraftButtonAvailable = true; model.IsAgreeButtonAvailable = false; } else { StaffEstablishedPostRequest PrevEntity = new StaffEstablishedPostRequest(); //для заявок на изменение нужно показать предыдущий оклад StaffEstablishedPostRequest entity = StaffEstablishedPostRequestDao.Get(model.Id); if (entity == null) //если нет заявки с таким идентификатором, грузим новую заявку на создание штатной единицы { model.Id = 0; return GetEstablishedPostRequest(model); } if (model.SEPId != 0) PrevEntity = StaffEstablishedPostRequestDao.GetPrevEstablishedPostRequest(model.SEPId, entity.Id); if (!IsRequestExists) { model.Id = 0; } model.IsUsed = entity.IsUsed; model.RequestTypeId = model.Id == 0 ? model.RequestTypeId : entity.RequestType.Id; model.UserId = entity.Creator != null ? entity.Creator.Id : 0; model.DateRequest = entity.DateRequest; model.DepartmentId = entity.Department != null ? entity.Department.Id : 0; model.ItemLevel = entity.Department != null ? entity.Department.ItemLevel.Value : 0; model.BFGId = entity.Department != null && entity.Department.DepartmentAccessory != null ? entity.Department.DepartmentAccessory.Id : 0; model.PositionId = entity.Position != null ? entity.Position.Id : 0; model.PositionName = entity.Position != null ? entity.Position.Name : string.Empty; model.Quantity = entity.Quantity; model.QuantityPrev = entity.Quantity; model.Salary = entity.Salary; model.SalaryPrev = PrevEntity != null ? PrevEntity.Salary : 0; model.ReasonId = entity.Reason == null ? 0 : entity.Reason.Id; model.ScheduleId = entity.Schedule == null ? 0 : entity.Schedule.Id; model.WCId = entity.WorkingCondition == null ? 0 : entity.WorkingCondition.Id; model.BeginAccountDate = model.Id == 0 ? model.BeginAccountDate : entity.BeginAccountDate; int UsersCount = StaffEstablishedPostDao.GetEstablishedPostUsed(entity.StaffEstablishedPost != null ? entity.StaffEstablishedPost.Id : 0); model.EPInfo = "Занято - " + (UsersCount).ToString() + "; Вакантно - " + (entity.Quantity - UsersCount).ToString(); //кнопки model.IsDraftButtonAvailable = entity.DeleteDate.HasValue ? false : true; model.IsAgreeButtonAvailable = entity.DeleteDate.HasValue ? false : !entity.DateAccept.HasValue; } model.PyrusNumber = ""; LoadDictionaries(model); //для новых заявок надо подгружать надбавки от текущего состояния штатной единицы, берем действующую заявку, иначе по заполняем по текущей заявке model.PostChargeLinks = StaffEstablishedPostChargeLinksDao.GetChargesForRequests(model.RequestTypeId != 1 && model.Id == 0 ? StaffEstablishedPostRequestDao.GetCurrentRequestId(model.SEPId) : model.Id).OrderBy(x => x.ChargeName).ToList(); return model; }
public ActionResult StaffEstablishedPostRequest(StaffEstablishedPostRequestModel model) { ViewBag.Title = model.RequestTypeId == 1 ? "Заявка на создание ШЕ" : (model.RequestTypeId == 2 ? "Заявка на изменение ШЕ" : "Заявка на сокращение ШЕ"); ModelState.Clear(); string error = string.Empty; bool IsComplete = false; if (ValidateModel(model)) { if (model.IsDraft) //сохранение черновика { if (!model.IsDelete) IsComplete = model.Id == 0 ? StaffListBl.SaveNewEstablishedPostRequest(model, out error) : StaffListBl.SaveEditEstablishedPostRequest(model, out error); else IsComplete = model.Id == 0 ? false : StaffListBl.DeleteEstablishedPostRequest(model, out error); if (!IsComplete) { StaffListBl.LoadDictionaries(model); ModelState.AddModelError("MessageStr", error); } else { model = StaffListBl.GetEstablishedPostRequest(model); ModelState.AddModelError("MessageStr", error); } } else { if (!StaffListBl.SaveEditEstablishedPostRequest(model, out error)) { StaffListBl.LoadDictionaries(model); ModelState.AddModelError("MessageStr", error); } else { model = StaffListBl.GetEstablishedPostRequest(model); ModelState.AddModelError("MessageStr", error); } } } else StaffListBl.LoadDictionaries(model); //для комментариев ViewBag.PlaceId = model.Id; ViewBag.PlaceTypeId = 4; return View(model); }
public ActionResult StaffEstablishedPostRequest(int RequestType, int? DepartmentId, int? SEPId, int? Id) { ModelState.Clear(); StaffEstablishedPostRequestModel model = new StaffEstablishedPostRequestModel(); ViewBag.Title = RequestType == 1 ? "Заявка на создание ШЕ" : (RequestType == 2 ? "Заявка на изменение ШЕ" : "Заявка на сокращение ШЕ"); model.RequestTypeId = RequestType; model.DepartmentId = DepartmentId.Value; model.SEPId = SEPId.HasValue ? SEPId.Value : 0; model.Id = Id.HasValue ? Id.Value : 0; model = StaffListBl.GetEstablishedPostRequest(model); //для комментариев ViewBag.PlaceId = model.Id; ViewBag.PlaceTypeId = 4; return View(model); }
protected bool ValidateModel(StaffEstablishedPostRequestModel model) { if (model.IsDraft) { if ((model.RequestTypeId == 1 || model.RequestTypeId == 2) && model.Quantity == 0) { ModelState.AddModelError("Quantity", "Укажите количество штатных единиц не равное 0!"); model.Quantity = model.QuantityPrev; model.Salary = model.SalaryPrev; } if (model.RequestTypeId == 2 && model.QuantityPrev > model.Quantity) ModelState.AddModelError("Quantity", "Изменение количества штатной единицы в меньшую сторону является сокращением! Создайте заявку на сокращение штатной единицы!"); } else { if(model.PositionId == 0) ModelState.AddModelError("PositionId", "Выберите должность!"); if (!model.BeginAccountDate.HasValue) ModelState.AddModelError("BeginAccountDate", "Укажите дату начала учета в системе!"); if (model.BeginAccountDate < new DateTime(2015, 12, 1)) ModelState.AddModelError("BeginAccountDate", "Дата начала учета в системе не может быть меньше 1 декабря 2015 года!"); if (model.RequestTypeId == 1 || model.RequestTypeId == 2) { if (model.Quantity <= 0) ModelState.AddModelError("Quantity", "Укажите количество!"); if (model.Salary <= 0) ModelState.AddModelError("Salary", "Укажите оклад!"); } if (model.PostChargeLinks.Where(x => x.ActionId == 0 && x.Amount != 0).Count() != 0) { int i = 1; foreach (var item in model.PostChargeLinks) { if (item.ActionId == 0) { ModelState.AddModelError("PostChargeLinks[" + (i - 1) + "].ActionId", "Укажите действие!"); } i += 1; } } if (model.Personnels != null) { if ((model.RequestTypeId == 3 || model.RequestTypeId == 4) && model.Personnels.Where(x => x.UserId != 0 && x.IsDismissal).Count() != 0) { int i = 1; foreach (var item in model.Personnels) { if (item.UserId != 0 && item.IsDismissal) { ModelState.AddModelError("Personnels[" + (i - 1) + "].IsDismissal", "На данный момент можно сократить свободные вакансии! Сокращение вакансия занятых сотрудниками в разработке и будет доступным в ближайшее время!"); } i += 1; } } } } if (!string.IsNullOrEmpty(model.PyrusNumber)) { try { Convert.ToInt32(model.PyrusNumber); } catch { ModelState.AddModelError("PyrusNumber", "Номер задачи в системе Пайрус должен состоять из цифр!"); ModelState.AddModelError("MessageStr", "Номер задачи в системе Пайрус должен состоять из цифр!"); } } return ModelState.IsValid; }