protected string GetPackTitle(Pack pack)
        {
            string packTitle = "";

            if (pack.PackTypeId == 1)
            {
                packTitle = "Лекции - ";

                foreach (var group in pack.Groups)
                {
                    packTitle += group.Name + " ";
                }
            }
            else if (pack.PackTypeId == 2)
            {
                packTitle = "Лаб. работы - " + pack.Groups[0].Name;
            }

            return packTitle;
        }
 protected string GetCourseName(Pack pack)
 {
     var course = db.Courses.Find(pack.CourseId);
     return GetCourseName(course);
 }
        private void AppendLabsPackModel(Pack pack, PackViewModel packViewModel)
        {
            var actualWorks = pack.WorkProcs.Where(l => l.CurrentValue.State == 0).ToList();

            foreach (var wp in actualWorks)
            {
                Work work = db.Works.Find(wp.WorkId);

                string workTitle = work.ShortName;

                packViewModel.Header.Items.Add(new Item() { Id = wp.Id, Title = workTitle, Span = work.HasThemes ? 2 : 1, Type = 1 });
            }

            var group = pack.Groups[0];

            var students = group.Students.OrderBy(s => s.Surname).ToList();

            foreach (var student in students)
            {

                var studentRow = packViewModel.Rows.First(r => r.Item.Id == student.Id);

                foreach (var workProc in actualWorks)
                {
                    StudentWorkProc studentWorkProc = workProc.GetStudentWorkProc(student);

                    if(studentWorkProc == null)
                    {
                        studentRow.Items.Add(new Item() { Id = 0, Type = -1 });
                        continue;
                    }

                    Work work = db.Works.Find(studentWorkProc.WorkProc.WorkId);

                    if (work.HasThemes)
                    {
                        string themeName;

                        if (studentWorkProc.CurrentValue.WorkThemeId != null)
                        {
                            themeName = db.WorkThemes.Find(studentWorkProc.CurrentValue.WorkThemeId).Name;
                        }
                        else
                        {
                            themeName = "Нет темы";
                        }

                        studentRow.Items.Add(new Item()
                        {
                            Id = studentWorkProc.Id,
                            Type = 2,
                            Title = themeName
                        });
                    }

                    studentRow.Items.Add(new Item()
                    {
                        Id = studentWorkProc.Id,
                        Type = 1,
                        Title = GetStudentWorkProcTitle(studentWorkProc),
                        Progress = GetStudentWorkProcProgress(studentWorkProc)
                    });

                }
            }
        }
        public Course CreateCourse(int userId, NewCourseModel newCourseModel)
        {
            Course course = new Course()
            {
                UserId = userId,
                TermId = newCourseModel.TermId,
                Year = newCourseModel.Year,
                CourseStateId = 1
            };

            db.Courses.Add(course);

            var rand = new Random((int)new DateTime().Ticks);

            for (int i = 0; i < newCourseModel.WorksCount; i++)
            {
                Work work = new Work()
                {
                    Name = RandomString(9),
                    ShortName = RandomString(3),
                    WorkType = db.WorkTypes.Find(1),
                    WorkControlType = db.WorkControlTypes.Find(1),
                    Course = course
                };

                db.Works.Add(work);

                //create stages
                //int stagesCount = rand.Next(5) + 2;
                int stagesCount = 1;

                for (int s = 0; s < stagesCount; s++)
                {
                    WorkStage ws = new WorkStage()
                    {
                        Name = RandomString(10),
                        Work = work
                    };

                    db.WorkStages.Add(ws);

                    //bool addSubStages = rand.Next(10) > 7;
                    bool addSubStages = false;

                    if(addSubStages)
                    {
                        int substages = rand.Next(3) + 2;

                        for(int j = 0; j < substages; j++)
                        {
                            WorkStage subStage = new WorkStage()
                            {
                                Name = RandomString(10),
                                Work = work,
                                ParentStage = ws
                            };

                            db.WorkStages.Add(subStage);

                        }
                    }
                }

                course.Works.Add(work);
            }

            course.Packs = new List<Pack>();

            if (newCourseModel.LessonPackGroupIds != null)
            {
                Pack pack = new Pack()
                {
                    Course = course,
                    PackType = db.PackTypes.Find(1),
                    Groups = db.Groups.Where(g => newCourseModel.LessonPackGroupIds.Contains(g.Id)).ToList()
                };
                course.Packs.Add(pack);
            }

            if (newCourseModel.LabsGroupIds != null)
            {
                foreach (var groupId in newCourseModel.LabsGroupIds)
                {
                    Pack pack = new Pack()
                    {
                        Course = course,
                        PackType = db.PackTypes.Find(2),
                        Groups = db.Groups.Where(g => g.Id == groupId).ToList()
                    };
                    course.Packs.Add(pack);
                }
            }

            db.SaveChanges();

            return course;
        }
        private PackViewModel CreateLessonsPackModel(Pack pack, int groupIndex, string titleString)
        {
            var title = new Item() { Title = titleString };

            PackViewModel packViewModel = null;

            var actualLessons = pack.Lessons.Where(l => l.CurrentValue.State == 0).OrderBy(l => l.Date).ToList();

            var headerItems = actualLessons.Select(l => new Item() { Id = l.Id, Title = GetLessonTitle(l), Type = 0 }).ToList();

            var header = new Header() { Items = headerItems };

            //init rows

            List<Row> rows = new List<Row>();

            var group = pack.Groups[groupIndex];

            var students = group.Students.OrderBy(s => s.Surname).ToList();

            foreach (var student in students)
            {
                string studentTitle = GetStudentTitle(student);
                var studentRow = new Row()
                {
                    Item = new Item() { Id = student.Id, Title = studentTitle },
                    Items = new List<Item>()
                };

                foreach (var lesson in actualLessons)
                {
                    Visit visit = lesson.GetVisitForStudent(student);
                    //todo: предусмотреть возможность отсутствия посещения как такового

                    if (visit != null)
                    {
                        studentRow.Items.Add(new Item() { Id = visit.Id, Title = GetVisitTitle(visit), Value = (int)visit.CurrentValue.Value });
                    }
                    else
                    {
                        studentRow.Items.Add(new Item() { Id = 0, Type = -1 });
                    }

                }

                rows.Add(studentRow);
            }

            packViewModel = new PackViewModel() { Title = title, Header = header, Rows = rows };

            return packViewModel;
        }