/// <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="entity">сущность</param> /// <param name="model">модель</param> private void SaveAdditions(StaffMovements entity, StaffMovementsEditModel model) { foreach (var addition in model.AdditionsToEdit) { if (!entity.Additions.Any(x => x.ExtraCharges != null && x.ExtraCharges.Id == addition.Type.Id)) { entity.Additions.Add(new StaffPostChargeLinks { CreateDate = DateTime.Now, Creator = UserDao.Load(CurrentUser.Id), EditDate = DateTime.Now, Editor = UserDao.Load(CurrentUser.Id), ExtraChargeActions = StaffExtraChargeActionsDao.Load(addition.Action), ExtraCharges = StaffExtraChargesDao.Load(addition.Type.Id), IsActive = false, Salary = addition.Value, Staff = UserDao.Load(model.User.Id), StaffMovements = entity }); } else { var ad = entity.Additions.Where(x => x.ExtraCharges.Id == addition.Type.Id).First(); ad.Salary = addition.Value; ad.ExtraChargeActions = StaffExtraChargeActionsDao.Load(addition.Action); } } }
/// <summary> /// Сохранение модели /// </summary> /// <param name="model"></param> public void SaveModel(StaffMovementsEditModel model) { StaffMovements entity; if (model.Id == 0) { //Если идентификатор = 0, то нужно создать новую сущность entity = new StaffMovements(); } else { //Загружаем сущьность если идентификатор отличен от 0 entity = StaffMovementsDao.Load(model.Id); } //Меняем поля и сохраняем //файлики if (model.IsDocsAddAvailable && model.Id > 0) SaveFiles(model); ChangeEntityProperties(entity, model); StaffMovementsDao.SaveAndFlush(entity); //файлики только для первого раза if (model.IsDocsAddAvailable && model.Id == 0 && entity.Id > 0) { model.Id = entity.Id;//Нужно присвоить модели идентификатор SaveFiles(model); } }
/// <summary> /// Возвращаем заявку в черновик /// </summary> /// <param name="entity">сущность заявки</param> private void ChangeEntityStatusToTemp(StaffMovements entity) { entity.Status = StaffMovementsStatusDao.Load((int)StaffMovementsStatus.Temp); entity.SendDate = null; entity.SourceManagerAccept = null; entity.TargetManagerAccept = null; entity.PersonnelManagerBankAccept = null; entity.TargetChiefAccept = null; //entity.TargetStaffEstablishedPostRequest.re if (entity.TargetStaffEstablishedPostRequest.ReserveType != null && entity.TargetStaffEstablishedPostRequest.DocId == entity.Id) { entity.TargetStaffEstablishedPostRequest.ReserveType = null; entity.TargetStaffEstablishedPostRequest.DocId = null; } try { DocumentApprovalDao.Update(x => x.DocId == entity.Id && x.ApprovalType == (int)ApprovalTypeEnum.StaffMovements, y => y.IsArchive = true); } catch (Exception) { } entity.PersonnelManagerAccept = null; }