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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            }

            try
            {
                DocumentApprovalDao.SaveAndFlush(da);

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

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

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

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

            return 0;
        }