protected bool ValidateModel(GeneralInfoModel model)
        {
            // Если не установлен флаг отсутствия отчества, то отчество должно быть заполнено
            if (!model.IsPatronymicAbsent && string.IsNullOrEmpty(model.Patronymic))
            {
                ModelState.AddModelError("Patronymic", "Обязательное поле, если не отмечен флаг \"Отчество отсутствует\"");
            }
            // Вид застрахованного лица только для граждан других государств
            // Срок действия справки не может быть меньше текущего дня
            if (model.DisabilityCertificateExpirationDate.HasValue && model.DisabilityCertificateExpirationDate < DateTime.Now)
            {
                ModelState.AddModelError("DisabilityCertificateExpirationDate", "Некорректный срок действия справки");
            }

            ValidateFileLength(model.PhotoFile, "PhotoFile", 2);
            ValidateFileLength(model.INNScanFile, "INNScanFile", 2);
            ValidateFileLength(model.SNILSScanFile, "SNILSScanFile", 2);
            ValidateFileLength(model.DisabilityCertificateScanFile, "DisabilityCertificateScanFile", 2);

            if (!model.IsGIDraft)
            {
                //GeneralInfoModel mt = EmploymentBl.GetGeneralInfoModel(model.UserId);
                //закомментарены проверки на наличие сканов из-зи новой страницы
                ////должен быть скан инн и снилс
                //if (!string.IsNullOrEmpty(model.INN))
                //{
                //    if (model.INNScanFile == null && string.IsNullOrEmpty(mt.INNScanAttachmentFilename))
                //    {
                //        ModelState.AddModelError("INNScanFile", "Не выбран файл скана ИНН для загрузки!");
                //    }
                //}
                //if (model.SNILSScanFile == null && string.IsNullOrEmpty(mt.SNILSScanAttachmentFilename))
                //{
                //    ModelState.AddModelError("SNILSScanFile", "Не выбран файл скана СНИЛС для загрузки!");
                //}

                ////скан справки по инвалидости, если какие-то из полей заполнены
                //if (!string.IsNullOrEmpty(model.DisabilityCertificateSeries) || !string.IsNullOrEmpty(model.DisabilityCertificateNumber) || model.DisabilityCertificateDateOfIssue.HasValue ||
                //    model.DisabilityCertificateExpirationDate.HasValue || (model.DisabilityDegreeId.HasValue && model.DisabilityDegreeId != 0) || model.IsDisabilityTermLess)
                //{
                //    if (model.DisabilityCertificateScanFile == null && string.IsNullOrEmpty(mt.DisabilityCertificateScanAttachmentFilename))
                //    {
                //        ModelState.AddModelError("DisabilityCertificateScanFile", "Не выбран файл скана справки об инвалидности для загрузки!");
                //    }
                //}

                if (!model.IsValidate)
                {
                    ModelState.AddModelError("AgreedToPersonalDataProcessing", "Подтвердите правильность предоставленных данных! Подтвердив правильность предоставленных данных, Вы не сможете больше вносить изменения в данную часть анкеты!");
                }
            }

            return ModelState.IsValid;
        }
        public ActionResult GeneralInfo(GeneralInfoModel model)
        {
            string error = String.Empty;
            string SPPath = AuthenticationService.CurrentUser.Id.ToString();

            if (ValidateModel(model))
            {
                model.IsDraft = model.IsGIDraft;
                EmploymentBl.ProcessSaving<GeneralInfoModel, GeneralInfo>(model, out error);
                //ViewBag.Error = error;
                model = EmploymentBl.GetGeneralInfoModel(model.UserId);
                ModelState.AddModelError("AgreedToPersonalDataProcessing", string.IsNullOrEmpty(error) ? "Данные сохранены!" : error);
            }
            else
            {   //так как при использования вкладок, страницу приходится перезагружать с потерей данных, то передаем модель с библиотекой ошибок через переменную сессии
                model = EmploymentBl.GetGeneralInfoModel(model);
                if (Session["GeneralInfoM" + SPPath] != null)
                    Session.Remove("GeneralInfoM" + SPPath);
                if (Session["GeneralInfoM" + SPPath] == null)
                    Session.Add("GeneralInfoM" + SPPath, model);
            }

            if (Session["GeneralInfoMS" + SPPath] != null)
                Session.Remove("GeneralInfoMS" + SPPath);
            if (Session["GeneralInfoMS" + SPPath] == null)
            {
                ModelStateDictionary mst = ModelState;
                Session.Add("GeneralInfoMS" + SPPath, mst);
            }

            //для кадровиков при обновлении встаем на нужную вкладку
            //такая же схема применяется для всех страниц анкеты
            if ((AuthenticationService.CurrentUser.UserRole & UserRole.PersonnelManager) > 0 && EmploymentBl.IsUnlimitedEditAvailable())
                return Redirect("PersonnelInfo?id=" + model.UserId + "&IsCandidateInfoAvailable=true&IsBackgroundCheckAvailable=true&IsManagersAvailable=true&IsPersonalManagersAvailable=true&TabIndex=1");
            else
                return model.IsFinal && !EmploymentBl.IsUnlimitedEditAvailable() ? View("GeneralInfoReadOnly", model) : View(model);
        }