Пример #1
0
        /// <summary>
        /// Сохраняем изменения в справочнике штатных единиц.
        /// </summary>
        /// <param name="entity">Текущая заявка.</param>
        /// <param name="curUser">текущий пользователь.</param>
        /// <param name="error">Сообщение об ошибке.</param>
        /// <returns></returns>
        protected bool SaveStaffEstablishedPostReference(StaffEstablishedPostRequest entity, User curUser, out string error)
        {
            error = string.Empty;
            StaffEstablishedPost sep = entity.StaffEstablishedPost != null ? StaffEstablishedPostDao.Get(entity.StaffEstablishedPost.Id) : new StaffEstablishedPost();
            //если заявка на создание, создаем новую запись и делаем в заявке на нее ссылку
            if (entity.RequestType.Id == 1 || entity.RequestType.Id == 4)
            {
                sep.Position = entity.Position;
                sep.Department = entity.Department;
                sep.Quantity = 0;// entity.Quantity;
                sep.Salary = entity.Salary;
                sep.IsUsed = true;
                sep.BeginAccountDate = entity.BeginAccountDate;
                sep.Creator = curUser;
                sep.CreateDate = DateTime.Now;
            }

            //изменилось количество изменяем количество связей
            if (!SaveStaffEstablishedPostChangeUserLinks(entity, sep, curUser, out error))
            {
                return false;
            }
            else
                sep.Quantity = entity.Quantity;

            //если заявка на редактирование/удаление, редактируем текущую запись в справочнике
            if (entity.RequestType.Id != 1 && entity.RequestType.Id != 4)
            {
                if (entity.RequestType.Id == 2)
                {
                    sep.Position = entity.Position;
                    //пока решили не менять количество в заявках наизменение
                    //sep.Quantity = entity.Quantity;
                    sep.Salary = entity.Salary;
                }
                else if (entity.RequestType.Id == 3 && entity.StaffEstablishedPost.EstablishedPostUserLinks.Where(x => !x.IsDismissal).Count() == 0)
                {
                    sep.IsUsed = false; //делаем неактивной текущую запись в справочнике, если больше нет в расстановке несокращенных записей
                }
                sep.BeginAccountDate = entity.BeginAccountDate;
                sep.Editor = curUser;
                sep.EditDate = DateTime.Now;
            }

            //для создания/изменения в надбавках делаем ссылку на штатную единицу
            if (entity.RequestType.Id != 3)
            {
                if (entity.PostChargeLinks.Count != 0)
                {
                    foreach (var item in entity.PostChargeLinks)
                    {
                        item.EstablishedPost = sep;
                        item.Editor = curUser;
                        item.EditDate = DateTime.Now;
                    }
                }
            }

            //архивируем изменения
            if (sep.EstablishedPostArchive == null)
                sep.EstablishedPostArchive = new List<StaffEstablishedPostArchive>();

            sep.EstablishedPostArchive.Add(new StaffEstablishedPostArchive {
                StaffEstablishedPost = sep,
                Position = sep.Position,
                Department = sep.Department,
                Quantity = sep.Quantity,
                Salary = sep.Salary,
                IsUsed = sep.IsUsed,
                BeginAccountDate = sep.BeginAccountDate,
                Priority = sep.Priority,
                Creator = curUser,
                CreateDate = DateTime.Now
            });

            try
            {
                StaffEstablishedPostDao.SaveAndFlush(sep);

                if (entity.StaffEstablishedPost == null)
                    entity.StaffEstablishedPost = new StaffEstablishedPost();

                entity.StaffEstablishedPost = sep;
                entity.DateSendToApprove = !entity.DateSendToApprove.HasValue ? DateTime.Now : entity.DateSendToApprove.Value;//отправлено на согласование
                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 == 3 || entity.RequestType.Id == 1)
                    entity.SendTo1C = DateTime.Now;
            }
            catch (Exception ex)
            {
                StaffEstablishedPostDao.RollbackTran();
                error = string.Format("Произошла ошибка при сохранении данных! Исключение:{0}", ex.GetBaseException().Message);
                return false;
            }

            return true;
        }
Пример #2
0
        /// <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;
            }
        }
Пример #3
0
        /// <summary>
        /// Меняем количество связей штатной единицы с сотрудниками.
        /// </summary>
        /// <param name="entity">Заявка</param>
        /// <param name="sep">Штатная единица</param>
        /// <param name="curUser">Текущий пользователь</param>
        /// <param name="error">Для сообщений</param>
        /// <returns></returns>
        protected bool SaveStaffEstablishedPostChangeUserLinks(StaffEstablishedPostRequest entity, StaffEstablishedPost sep, User curUser, out string error)
        {
            error = string.Empty;
            int CountLinks = sep.EstablishedPostUserLinks != null ? sep.EstablishedPostUserLinks.Count() : 0;
            //если количество штатных единиц увеличилось, то нужно добавить необходимое количество записей для связей
            if (entity.Quantity > CountLinks)
            {
                CountLinks = entity.Quantity - CountLinks;

                if(sep.EstablishedPostUserLinks == null)
                    sep.EstablishedPostUserLinks = new List<StaffEstablishedPostUserLinks>();

                for (int i = 0; i < CountLinks; i++)
                {
                    sep.EstablishedPostUserLinks.Add(new StaffEstablishedPostUserLinks()
                    {
                        StaffEstablishedPost = sep,
                        User = null,
                        IsUsed = true,
                        Creator = curUser,
                        CreateDate = DateTime.Now
                    });
                }
            }

            ////редактирование временных вакансий
            //if ((entity.RequestType.Id == 1 || entity.RequestType.Id == 2 || entity.RequestType.Id == 4) && sep.EstablishedPostUserLinks.Where(x => !x.IsDismissal && x.IsTemporary).Count() != 0)
            //{
            //    //на случай добавления временной вакансии
            //    CountLinks = sep.EstablishedPostUserLinks != null ? sep.EstablishedPostUserLinks.Count() : 0;
            //    if (entity.Quantity > CountLinks)
            //    {
            //        CountLinks = entity.Quantity - CountLinks;
            //        for (int i = 0; i < CountLinks; i++)
            //        {
            //            sep.EstablishedPostUserLinks.Add(new StaffEstablishedPostUserLinks()
            //            {
            //                StaffEstablishedPost = sep,
            //                User = null,
            //                IsUsed = true,
            //                Creator = curUser,
            //                CreateDate = DateTime.Now
            //            });
            //        }
            //    }

            //    foreach (var item in sep.EstablishedPostUserLinks
            //        .Where(x => x.IsUsed && x.IsDismissal))
            //    {
            //        item.IsUsed = false;
            //        item.Editor = curUser;
            //        item.EditDate = DateTime.Now;
            //    }
            //}

            //сокращение
            if ((entity.RequestType.Id == 3 || entity.RequestType.Id == 4) && sep.EstablishedPostUserLinks.Where(x => x.IsUsed && x.IsDismissal).Count() != 0)
            {
                //если частичное сокращение в расстановке, то меняем количество единиц в заявке
                if (sep.EstablishedPostUserLinks.Where(x => x.IsUsed && x.IsDismissal).Count() != 0 && sep.EstablishedPostUserLinks.Where(x => x.IsUsed && !x.IsDismissal).Count() != 0)
                {
                    entity.Quantity = sep.EstablishedPostUserLinks.Where(x => x.IsUsed && !x.IsDismissal).Count();
                }

                foreach (var item in sep.EstablishedPostUserLinks
                    .Where(x => x.IsUsed && x.IsDismissal))
                {
                    item.IsUsed = false;
                    item.Editor = curUser;
                    item.EditDate = DateTime.Now;
                }
            }

            return true;
        }
Пример #4
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;
        }
Пример #5
0
        /// <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 + " - Член правления банка" });
        }
Пример #6
0
        /// <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;
        }
Пример #7
0
        /// <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;
        }