/// <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="entity">Сущьность</param> /// <param name="model">Модель</param> private void ChangeEntityProperties(StaffMovements entity, StaffMovementsEditModel model) { #region Тот случай, когда сохранять заявку не нужно //Если нажали кнопку отмена, то возвращаемся в черновик и всё. В остальных случаях продолжаем работать if (model.IsCancelAvailable && model.IsCancelButtonPressed) { ChangeEntityStatusToTemp(entity); return; } #endregion #region Стандартные поля заявки, нужно заполнять только если заявка новая if (model.Id == 0) { //Если идентификатор = 0, значит заявка новая, нужно сохранить основные поля. //Дата создания entity.CreateDate = model.CreateDate; //Создатель entity.Creator = UserDao.Load(model.Creator.Id); if ((CurrentUser.UserRole & (UserRole.Manager | UserRole.PersonnelManager)) > 0) { entity.SendDate = DateTime.Now; if (model.RequestType == 2) { entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.SourceManager); } else { entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.TargetManager); } } //Сотрудник entity.User = UserDao.Load(model.User.Id); //Статус // сначала черновик entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Temp); //Данные исходной позиции var sourcelink = StaffEstablishedPostUserLinksDao.QueryExpression(x => x.User.Id == entity.User.Id && x.IsUsed); entity.SourceStaffEstablishedPostRequest = sourcelink.First(); entity.SourcePosition = entity.User.Position; entity.SourceDepartment = entity.User.Department; entity.SourceManager = GetManagerForDepartment(entity.SourceDepartment); //Если запрещено редактировать подразделение на момент создания заявки, то нужно сохранить исходное if (!model.IsDepartmentEditable) { entity.TargetDepartment = entity.SourceDepartment; entity.TargetManager = entity.SourceManager; } if (!model.IsPositionEditable) { entity.TargetPosition = entity.SourcePosition; entity.TargetStaffEstablishedPostRequest = entity.SourceStaffEstablishedPostRequest; } //Тип заявки entity.Type = StaffMovementsTypesDao.Load(model.RequestType); //Данные заявки, создаём и сохраняем entity.Data = new StaffMovementsData(); entity.Data.Grade = model.Grade; entity.Data.HoursType = ScheduleDao.Load(model.HoursType); entity.Data.Salary = model.TargetSalaryCount; StaffMovementsDataDao.SaveAndFlush(entity.Data); //Сохраняем надбавки SaveAdditions(entity, model); //Документы, создаём сразу все. var docs = new List<StaffMovementsDocs>(); docs.Add(new StaffMovementsDocs { DocType = (int)StaffMovementsDocsTypes.AdditionalAgreementDoc, Request = entity }); docs.Add(new StaffMovementsDocs { DocType = (int)StaffMovementsDocsTypes.MaterialLiabilityDoc, Request = entity }); docs.Add(new StaffMovementsDocs { DocType = (int)StaffMovementsDocsTypes.MovementNote, Request = entity }); docs.Add(new StaffMovementsDocs { DocType = (int)StaffMovementsDocsTypes.MovementOrderDoc, Request = entity }); docs.Add(new StaffMovementsDocs { DocType = (int)StaffMovementsDocsTypes.RequirementsOrderDoc, Request = entity }); docs.Add(new StaffMovementsDocs { DocType = (int)StaffMovementsDocsTypes.ServiceOrderDoc, Request = entity }); entity.Docs = docs; } #endregion #region Данные о переводе, заполняет персонаж или руководитель if (model.IsDepartmentEditable) { if (entity.TargetDepartment != null && entity.TargetDepartment.Id != model.TargetDepartmentId) { entity.TargetManagerAccept = null; entity.TargetChief = null; entity.TargetChiefAccept = null; } entity.TargetDepartment = DepartmentDao.Load(model.TargetDepartmentId); entity.TargetManager = GetManagerForDepartment(entity.TargetDepartment); } if (model.IsPositionEditable) { entity.TargetStaffEstablishedPostRequest = StaffEstablishedPostUserLinksDao.Load(model.UserLinkId); entity.TargetPosition = entity.TargetStaffEstablishedPostRequest.StaffEstablishedPost.Position; } #endregion #region Общее if (model.StatusId <= 1 || model.IsManagerEditable || model.IsPersonnelManagerEditable || model.IsPersonnelManagerBankAcceptAvailable) { entity.MovementDate = model.MovementDate; entity.MovementTempTo = model.MovementTempTo; entity.Data.MovementReason = model.MovementReason; } #endregion #region Для руководителей if (model.IsManagerEditable) { entity.IsTempMoving = model.IsTempMoving; entity.Data.MovementCondition = model.MovementCondition;//Условие перевода entity.Data.Conjunction = model.Conjunction; entity.Data.PyrusLink = model.PyrusLink; entity.Data.Salary = model.TargetSalaryCount; entity.Data.Grade = model.Grade;//Грейд entity.Data.HoursType = ScheduleDao.Load(model.HoursType);//График работы entity.Data.TargetCasingType = model.TargetCasingType; SaveAdditions(entity, model); } #endregion #region Для кадров if (model.IsPersonnelManagerEditable) { entity.Data.Grade = model.Grade;//Грейд entity.Data.HoursType = ScheduleDao.Load(model.HoursType);//График работы entity.Data.TargetCasingType = model.TargetCasingType; entity.Data.Salary = model.TargetSalaryCount; //entity.Data.AccessGroup = AccessGroupDao.Load(model.AccessGroup);//Группа доступа //Ставим галочки в документах if (model.IsDocsEditable) { StaffMovementsDocsDao.Update(x => x.Request.Id == entity.Id && x.DocType == (int)StaffMovementsDocsTypes.MovementNote, y => y.IsRequired = model.MovementNoteIsRequired); } //Сохраняем надбавки SaveAdditions(entity, model); } #endregion #region Согласования, утверждения, отмены и изменение статуса switch (model.StatusId) { case 1: if (model.ISRejectAvailable && model.IsRejectButtonPressed) { //Если нажали кнопку отказа, то отказ и всё поезд ушёл. entity.DeleteDate = DateTime.Now; entity.RejectDate = DateTime.Now; entity.RejectedBy = UserDao.Load(CurrentUser.Id); entity.RejectReason = StaffMovementsRejectReasonDao.Load((int)StaffMovementsRejectReasonEnum.UserReject); entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Canceled); if (entity.TargetStaffEstablishedPostRequest.ReserveType != null && entity.TargetStaffEstablishedPostRequest.DocId == entity.Id) { entity.TargetStaffEstablishedPostRequest.ReserveType = null; entity.TargetStaffEstablishedPostRequest.DocId = null; } } if (model.IsAcceptButtonPressed && model.IsUserAcceptAvailable) { //Если согласовано пользователем entity.SendDate = DateTime.Now; if (entity.Type.Id == 2) { entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.SourceManager); } else { entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.TargetManager); } } if (model.IsAcceptButtonPressed && model.IsSourceManagerAcceptAvailable) { //Если согласовано отпускающим руководителем entity.SendDate = DateTime.Now; entity.SourceManagerAccept = DateTime.Now; entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.TargetManager); if (entity.SourceManager != null && entity.SourceManager.Id != CurrentUser.Id) { //DocumentApprovalDao DocumentApproval newapprove = new DocumentApproval(); newapprove.ApprovalType = (int)ApprovalTypeEnum.StaffMovements; newapprove.ApproveUser = entity.SourceManager; newapprove.AssistantUser = UserDao.Load(CurrentUser.Id); newapprove.CreateDate = DateTime.Now; newapprove.DocId = entity.Id; newapprove.Number = 1; DocumentApprovalDao.SaveAndFlush(newapprove); } } if (model.IsAcceptButtonPressed && model.IsTargetManagerAcceptAvailable) { //Если согласовано принимающим руководителем entity.SendDate = DateTime.Now; entity.SourceManagerAccept = DateTime.Now; entity.TargetManagerAccept = DateTime.Now; //entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.PersonelManagerBank); entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Chief);//После принимающего идёт вышестоящий if (entity.TargetManager != null && entity.TargetManager.Id != CurrentUser.Id) { //DocumentApprovalDao DocumentApproval newapprove = new DocumentApproval(); newapprove.ApprovalType = (int)ApprovalTypeEnum.StaffMovements; newapprove.ApproveUser = entity.TargetManager; newapprove.AssistantUser = UserDao.Load(CurrentUser.Id); newapprove.CreateDate = DateTime.Now; newapprove.DocId = entity.Id; newapprove.Number = 2; DocumentApprovalDao.SaveAndFlush(newapprove); } entity.TargetStaffEstablishedPostRequest.DocId = entity.Id; entity.TargetStaffEstablishedPostRequest.ReserveType = (int)StaffReserveTypeEnum.StaffMovements; } break; case 2: if (model.ISRejectAvailable && model.IsRejectButtonPressed) { //Если нажали кнопку отказа, то отказ и всё поезд ушёл. entity.DeleteDate = DateTime.Now; entity.RejectDate = DateTime.Now; entity.RejectedBy = UserDao.Load(CurrentUser.Id); entity.RejectReason = StaffMovementsRejectReasonDao.Load((int)StaffMovementsRejectReasonEnum.SourceManagerReject); entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Canceled); if (entity.TargetStaffEstablishedPostRequest.ReserveType != null && entity.TargetStaffEstablishedPostRequest.DocId == entity.Id) { entity.TargetStaffEstablishedPostRequest.ReserveType = null; entity.TargetStaffEstablishedPostRequest.DocId = null; } } if (model.IsAcceptButtonPressed && model.IsSourceManagerAcceptAvailable) { //Если согласовано отпускающим руководителем if (entity.SourceManager != null && entity.SourceManager.Id != CurrentUser.Id) { //DocumentApprovalDao DocumentApproval newapprove = new DocumentApproval(); newapprove.ApprovalType =(int) ApprovalTypeEnum.StaffMovements; newapprove.ApproveUser = entity.SourceManager; newapprove.AssistantUser = UserDao.Load(CurrentUser.Id); newapprove.CreateDate = DateTime.Now; newapprove.DocId = entity.Id; newapprove.Number = 1; DocumentApprovalDao.SaveAndFlush(newapprove); } entity.SourceManagerAccept = DateTime.Now; entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.TargetManager); } break; case 3: if (model.ISRejectAvailable && model.IsRejectButtonPressed) { //Если нажали кнопку отказа, то отказ и всё поезд ушёл. entity.DeleteDate = DateTime.Now; entity.RejectDate = DateTime.Now; entity.RejectedBy = UserDao.Load(CurrentUser.Id); entity.RejectReason = StaffMovementsRejectReasonDao.Load((int)StaffMovementsRejectReasonEnum.TargetManagerReject); entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Canceled); if (entity.TargetStaffEstablishedPostRequest.ReserveType != null && entity.TargetStaffEstablishedPostRequest.DocId == entity.Id) { entity.TargetStaffEstablishedPostRequest.ReserveType = null; entity.TargetStaffEstablishedPostRequest.DocId = null; } } if (model.IsAcceptButtonPressed && model.IsTargetManagerAcceptAvailable) { //Если согласовано принимающим руководителем, в таком случае нужну забронировать вакансию if (entity.TargetManager != null && entity.TargetManager.Id != CurrentUser.Id) { //DocumentApprovalDao DocumentApproval newapprove = new DocumentApproval(); newapprove.ApprovalType = (int)ApprovalTypeEnum.StaffMovements; newapprove.ApproveUser = entity.TargetManager; newapprove.AssistantUser = UserDao.Load(CurrentUser.Id); newapprove.CreateDate = DateTime.Now; newapprove.DocId = entity.Id; newapprove.Number = 2; DocumentApprovalDao.SaveAndFlush(newapprove); } entity.TargetManagerAccept = DateTime.Now; entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Chief);//После принимающего идёт вышестоящий //entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.PersonelManagerBank); entity.TargetStaffEstablishedPostRequest.DocId = entity.Id; entity.TargetStaffEstablishedPostRequest.ReserveType = (int)StaffReserveTypeEnum.StaffMovements; } break; case 4: case 5: if (model.IsStopButtonAvailable && model.IsStopButtonPressed) { //Если нажали кнопку приостановки согласования entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Blocked); //Тут еще нужно отправить письмо с угрозами руководителям и сотруднику } if (model.ISRejectAvailable && model.IsRejectButtonPressed) { //Если нажали кнопку отказа, то отказ и всё поезд ушёл. entity.DeleteDate = DateTime.Now; entity.RejectDate = DateTime.Now; entity.RejectedBy = UserDao.Load(CurrentUser.Id); entity.RejectReason = StaffMovementsRejectReasonDao.Load((int)StaffMovementsRejectReasonEnum.PersonnelManagerBankReject); entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Canceled); if (entity.TargetStaffEstablishedPostRequest.ReserveType != null && entity.TargetStaffEstablishedPostRequest.DocId == entity.Id) { entity.TargetStaffEstablishedPostRequest.ReserveType = null; entity.TargetStaffEstablishedPostRequest.DocId = null; } } if (model.IsPersonnelManagerBankAcceptAvailable && model.IsAcceptButtonPressed) { //Если согласовано кадровиком банка entity.PersonnelManagerBank = UserDao.Load(CurrentUser.Id); entity.PersonnelManagerBankAccept = DateTime.Now; //entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Chief); entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Approved);//перевод оформлен } break; case 6: if (model.ISRejectAvailable && model.IsRejectButtonPressed) { //Если нажали кнопку отказа, то отказ и всё поезд ушёл. entity.DeleteDate = DateTime.Now; entity.RejectDate = DateTime.Now; entity.RejectedBy = UserDao.Load(CurrentUser.Id); entity.RejectReason = StaffMovementsRejectReasonDao.Load((int)StaffMovementsRejectReasonEnum.ChiefManagerReject); entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Canceled); if (entity.TargetStaffEstablishedPostRequest.ReserveType != null && entity.TargetStaffEstablishedPostRequest.DocId == entity.Id) { entity.TargetStaffEstablishedPostRequest.ReserveType = null; entity.TargetStaffEstablishedPostRequest.DocId = null; } } if (model.IsChiefAcceptAvailable && model.IsAcceptButtonPressed) { //Если согласовано вышестоящим руководителем entity.TargetChief = UserDao.Load(CurrentUser.Id); entity.TargetChiefAccept = DateTime.Now; entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Personnel); } break; case 7: if (model.ISRejectAvailable && model.IsRejectButtonPressed) { //Если нажали кнопку отказа, то отказ и всё поезд ушёл. entity.DeleteDate = DateTime.Now; entity.RejectDate = DateTime.Now; entity.RejectedBy = UserDao.Load(CurrentUser.Id); entity.RejectReason = StaffMovementsRejectReasonDao.Load((int)StaffMovementsRejectReasonEnum.PersonnelManagerReject); entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Canceled); if (entity.TargetStaffEstablishedPostRequest.ReserveType != null && entity.TargetStaffEstablishedPostRequest.DocId == entity.Id) { entity.TargetStaffEstablishedPostRequest.ReserveType = null; entity.TargetStaffEstablishedPostRequest.DocId = null; } } if (model.IsPersonnelManagerAcceptAvailable && model.IsAcceptButtonPressed) { //Если согласовано кадровиком entity.PersonnelManager = UserDao.Load(CurrentUser.Id); entity.PersonnelManagerAccept = DateTime.Now; //entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Approved); var check = StaffMovementsDao.CheckIfPersonnalChargeChanges(entity.Id); entity.Status = check ? StaffMovementsStatusDao.Load((int)StaffMovementsStatus.PersonelManagerBank) //После кадровика идёт кадровик банк : StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Approved); //Если нет изменений надбавок, то перевод оформлен } break; case 8: if (model.ISRejectAvailable && model.IsRejectButtonPressed) { //Если нажали кнопку отказа, то отказ и всё поезд ушёл. entity.DeleteDate = DateTime.Now; entity.RejectDate = DateTime.Now; entity.RejectedBy = UserDao.Load(CurrentUser.Id); entity.RejectReason = StaffMovementsRejectReasonDao.Load((int)StaffMovementsRejectReasonEnum.TargetManagerReject); entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Canceled); if (entity.TargetStaffEstablishedPostRequest.ReserveType != null && entity.TargetStaffEstablishedPostRequest.DocId == entity.Id) { entity.TargetStaffEstablishedPostRequest.ReserveType = null; entity.TargetStaffEstablishedPostRequest.DocId = null; } } //Проверяем все документы, если у обязательного документа нет вложения - не выходим из этого статуса bool accept = true; foreach (var doc in entity.Docs) { if (doc.IsRequired && doc.Attachment == null) accept = false; } if (accept) entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.DocsApproved); break; case 9: //Проверяем все документы, если у обязательного документа нет вложения - нужно вернутся обратно bool accept_ = true; foreach (var doc in entity.Docs) { if (doc.IsRequired && doc.Attachment == null) accept_ = false; } if (!accept_) entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.ChiefControl); if (model.ISRejectAvailable && model.IsRejectButtonPressed) { //Если нажали кнопку отказа, то отказ и всё поезд ушёл. entity.DeleteDate = DateTime.Now; entity.RejectDate = DateTime.Now; entity.RejectedBy = UserDao.Load(CurrentUser.Id); entity.RejectReason = StaffMovementsRejectReasonDao.Load((int)StaffMovementsRejectReasonEnum.PersonnelManagerReject); entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Canceled); if (entity.TargetStaffEstablishedPostRequest.ReserveType != null && entity.TargetStaffEstablishedPostRequest.DocId == entity.Id) { entity.TargetStaffEstablishedPostRequest.ReserveType = null; entity.TargetStaffEstablishedPostRequest.DocId = null; } } if (model.IsConfirmButtonAvailable && model.IsConfirmButtonPressed) { //Заявка подтверждена. все щасливы, ждём выгрузки в одноэс //entity.PersonnelManager = UserDao.Load(CurrentUser.Id); //entity.PersonnelManagerAccept = DateTime.Now; entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Approved); } break; case 10: break; case 11: break; } #endregion }
/// <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; }