/// <summary>
        /// Возвращает объект рабочей программы дисциплины.
        /// Если rabProgramId равно null,
        /// создаёт и возвращает новый объект
        /// </summary>
        /// <param name="eduPlanId"></param>
        /// <param name="disciplineId"></param>
        /// <param name="rabProgramId"></param>
        /// <param name="userName"></param>
        /// <returns></returns>
        public async Task <RabProgram> GetRabProgramByUserNameAsync(int eduPlanId, int disciplineId, int?rabProgramId, string userName)
        {
            var discipline = await GetDisciplineByUserNameAsync(eduPlanId, disciplineId, userName);

            if (discipline == null)
            {
                return(null);
            }

            RabProgram rabProgram = new RabProgram();

            rabProgram.Discipline   = discipline;
            rabProgram.DisciplineId = discipline.DisciplineId;
            if (rabProgramId == null || rabProgramId == 0)
            {
                return(rabProgram);
            }

            rabProgram = discipline.RabPrograms.FirstOrDefault(a => a.RabProgramId == rabProgramId);
            if (rabProgram == null)
            {
                return(null);
            }

            return(rabProgram);
        }
        /// <summary>
        /// Обновление файла листа переутверждения рабочей программы
        /// </summary>
        /// <param name="rabProgram"></param>
        /// <param name="uploadedFile"></param>
        /// <returns></returns>
        public async Task <RabProgram> UpdateRabProgramListPereutverjdeniyaAsync(RabProgram rabProgram, IFormFile uploadedFile)
        {
            if (rabProgram == null || uploadedFile == null)
            {
                return(null);
            }
            rabProgram = await _eduPlanRepository.UpdateRabProgramListPereutverjdeniyaAsync(rabProgram, uploadedFile);

            return(rabProgram);
        }
        /// <summary>
        /// Удаление листа переутверждения рабочей программы учебной дисциплины
        /// </summary>
        /// <param name="EduPlanId"></param>
        /// <param name="DisciplineId"></param>
        /// <param name="RabProgramId"></param>
        /// <returns></returns>
        public async Task <IActionResult> RabProgramListPereutverjdeniyaRemove(int EduPlanId, int DisciplineId, int RabProgramId)
        {
            RabProgram rabProgram = await _metodKomissiyaRepository.GetRabProgramByUserNameAsync(EduPlanId, DisciplineId, RabProgramId, User.Identity.Name);

            if (rabProgram == null)
            {
                return(NotFound());
            }

            return(View(rabProgram));
        }
        public async Task <IActionResult> RabProgramListPereutverjdeniyaCreateOrEdit(int EduPlanId, int DisciplineId, int?RabProgramId, IFormFile uploadedFile)
        {
            RabProgram rabProgram = await _metodKomissiyaRepository.GetRabProgramByUserNameAsync(EduPlanId, DisciplineId, RabProgramId, User.Identity.Name);

            if (rabProgram != null)
            {
                await _metodKomissiyaRepository.UpdateRabProgramListPereutverjdeniyaAsync(rabProgram, uploadedFile);
            }

            return(RedirectToAction(nameof(EduPlanPreview), new { id = EduPlanId }));
        }
        /// <summary>
        /// Добавление / редактирование аннотации учебной дисциплины
        /// </summary>
        /// <param name="EduPlanId"></param>
        /// <param name="DisciplineId"></param>
        /// <param name="RabProgramId"></param>
        /// <returns></returns>
        public async Task <IActionResult> RabProgramCreateOrEdit(int EduPlanId, int DisciplineId, int?RabProgramId)
        {
            RabProgram rabProgram = await _metodKomissiyaRepository.GetRabProgramByUserNameAsync(EduPlanId, DisciplineId, RabProgramId, User.Identity.Name);

            if (rabProgram == null)
            {
                return(NotFound());
            }
            ViewBag.EduPlanId = EduPlanId;
            return(View(rabProgram));
        }
        /// <summary>
        /// Удаляет лист переутверждения рабочей программы, если она доступна пользователю
        /// </summary>
        /// <param name="eduPlanId"></param>
        /// <param name="disciplineId"></param>
        /// <param name="rabProgramId"></param>
        /// <param name="userName"></param>
        /// <returns></returns>
        public async Task RemoveRabProgramListPereutverjdeniyaByUserNameAsync(int eduPlanId, int disciplineId, int rabProgramId, string userName)
        {
            RabProgram rabProgram = await GetRabProgramByUserNameAsync(eduPlanId, disciplineId, rabProgramId, userName);

            if (rabProgram == null)
            {
                return;
            }

            await _eduPlanRepository.RemoveRabProgramListPereutverjdeniyaAsync(rabProgram);
        }
        public async Task <IActionResult> Edit(int id,
                                               [Bind("RabProgramId,DisciplineId,FileModelId")] RabProgram rabProgram,
                                               IFormFile uploadedFile,
                                               int?EduPlanId)
        {
            if (id != rabProgram.RabProgramId)
            {
                return(NotFound());
            }

            if (ModelState.IsValid)
            {
                if (uploadedFile != null)
                {
                    FileModel fileModel = await KisVuzDotNetCore2.Models.Files.Files.LoadFile(_context, _appEnvironment, uploadedFile, "Рабочая программа", FileDataTypeEnum.RabProgrammaDisciplini);

                    await _context.SaveChangesAsync();

                    int?fileToRemoveId = rabProgram.FileModelId;
                    rabProgram.FileModelId = fileModel.Id;
                    await _context.SaveChangesAsync();

                    KisVuzDotNetCore2.Models.Files.Files.RemoveFile(_context, _appEnvironment, fileToRemoveId);
                }

                try
                {
                    _context.Update(rabProgram);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!RabProgramExists(rabProgram.RabProgramId))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index), new { EduPlanId }));
            }
            ViewData["DisciplineId"] = new SelectList(_context.Disciplines, "DisciplineId", "DisciplineId", rabProgram.DisciplineId);
            ViewData["FileModelId"]  = new SelectList(_context.Files, "Id", "Id", rabProgram.FileModelId);
            return(View(rabProgram));
        }
        public async Task <IActionResult> Create([Bind("RabProgramId,DisciplineId,FileModelId")] RabProgram rabProgram, IFormFile uploadedFile, int?EduPlanId)
        {
            if (ModelState.IsValid && uploadedFile != null)
            {
                FileModel fileModel = await KisVuzDotNetCore2.Models.Files.Files.LoadFile(_context, _appEnvironment, uploadedFile, "Рабочая программа", FileDataTypeEnum.RabProgrammaDisciplini);

                rabProgram.FileModelId = fileModel.Id;
                _context.Add(rabProgram);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index), new { EduPlanId }));
            }

            var eduPlans = _context.EduPlans
                           .Where(p => p.EduPlanId == EduPlanId)
                           .Include(p => p.BlokDiscipl)
                           .ThenInclude(bd => bd.BlokDisciplChast)
                           .ThenInclude(bdc => bdc.Disciplines)
                           .ThenInclude(d => d.DisciplineName);
            List <Discipline> disciplinesByEduPlan = new List <Discipline>();

            foreach (var plan in eduPlans)
            {
                foreach (var blokDiscipl in plan.BlokDiscipl)
                {
                    foreach (var blokDisciplChast in blokDiscipl.BlokDisciplChast)
                    {
                        foreach (var discipline in blokDisciplChast.Disciplines)
                        {
                            disciplinesByEduPlan.Add(discipline);
                        }
                    }
                }
            }

            ViewData["DisciplineId"] = new SelectList(disciplinesByEduPlan, "DisciplineId", "DisciplineName.DisciplineNameName");
            ViewBag.EduPlanId        = EduPlanId;

            return(View(rabProgram));
        }