public ActionResult Edit(EditCurriculumViewModel cvm) { if (ModelState.IsValid) { Curriculum curriculum = db.Curricula.Where(o => o.Id == cvm.Curriculum.Id) .Include(o => o.Student) .FirstOrDefault(); //Curriculum curriculum = db.GetFromDatabase<Curriculum>(cvm.Curriculum.Id); curriculum.Naam = cvm.Curriculum.Naam; var oldList = curriculum.Topics; List <Topic> newList = new List <Topic>(); foreach (int id in cvm.TopicIds) { newList.Add(db.GetFromDatabase <Topic>(id)); var curriculumTopic = db.CurriculumTopics.Where(ct => ct.Topic.Id == id && ct.Curriculum.Id == curriculum.Id).FirstOrDefault(); // if null means a new curriculumtopic needs to be added. if (curriculumTopic == null) { Topic topic = db.GetFromDatabase <Topic>(id); CurriculumTopic t = new CurriculumTopic { TopicId = topic.Id, Topic = topic, Curriculum = curriculum, CurriculumId = curriculum.Id }; oldList.Add(t); } } // oldList has more items than newlist so we need to remove items. if (oldList.Count > newList.Count) { List <CurriculumTopic> removeList = new List <CurriculumTopic>(); foreach (var curriculumTopic1 in oldList) { var a = newList.Where(t => t.Id == curriculumTopic1.TopicId).FirstOrDefault(); if (a == null) { // verwijder curriculumtopic uit oudelijst var curriculumTopic = db.CurriculumTopics.Where(ct => ct.Curriculum.Id == curriculum.Id && ct.Topic.Id == curriculumTopic1.TopicId).FirstOrDefault(); removeList.Add(curriculumTopic); } } foreach (var item in removeList) { oldList.Remove(item); } } db.Entry(curriculum).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction("Details", "Student", new { id = curriculum.Student.Id })); } //curriculumTemplateViewModel.AlleTopics = db.Topics.ToList(); return(View()); }
public ActionResult Create([Bind(Include = "StudentId,CurriculumTemplateId")] CurriculumViewModel curriculumViewModel) { if (ModelState.IsValid) { Student student = db.GetFromDatabase <Student>(curriculumViewModel.StudentId); var curriculumTemplate = db.GetFromDatabase <CurriculumTemplate>(curriculumViewModel.CurriculumTemplateId); var topics = curriculumTemplate.Topics; Curriculum curriculum = new Curriculum(); curriculum.Naam = curriculumTemplate.Naam; foreach (var topic in topics) { //var topic1 = db.GetFromDatabase<Topic>(topic.Id); CurriculumTopic t = new CurriculumTopic { TopicId = topic.Id, Topic = topic, Curriculum = curriculum, CurriculumId = curriculum.Id }; curriculum.Topics.Add(t); } curriculum.Student = student; student.Curricula.Add(curriculum); db.Curricula.Add(curriculum); db.Entry(student).State = EntityState.Modified; db.SaveChanges(); //// COMMENT: This code can probably be removed //if (curriculumViewModel.StudentId != 0) // return RedirectToAction("Details", "Student", new { id = curriculumViewModel.StudentId }); return(RedirectToAction("Details", "Student", new { id = curriculumViewModel.StudentId })); } return(View()); //curriculumTemplateViewModel.AlleTopics = db.Topics.Where(t => !t.IsDeleted).ToList(); //curriculumTemplateViewModel.AlleTopics = db.Topics.ToList(); //return View(curriculumTemplateViewModel); }
public string ImportCourse(ScheduleCourse scheduleCourse) { string msg; _Logger.DebugFormat("Importiere Fach: {0}", scheduleCourse.Name); _report.AppendFormat("<h1>Erzeuge LV \"{0} ({1})\" - [{2}]</h1>", scheduleCourse.Name, scheduleCourse.ShortName, scheduleCourse.CourseId); _report.AppendLine(); var db = new TimeTableDbContext(); var organiser = db.Organisers.SingleOrDefault(s => s.Id == _orgId); var sem = db.Semesters.SingleOrDefault(s => s.Id == _semId); long msStart = sw.ElapsedMilliseconds; var course = new Course { ExternalSource = "JSON", ExternalId = scheduleCourse.CourseId, Organiser = organiser, ShortName = scheduleCourse.ShortName, Name = scheduleCourse.Name, Description = scheduleCourse.Description, Occurrence = CreateDefaultOccurrence(scheduleCourse.SeatRestriction ?? 0), IsInternal = true, }; // Kurs sofort speichern, damit die ID gesichert ist db.Activities.Add(course); db.SaveChanges(); long msEnd = sw.ElapsedMilliseconds; _Logger.DebugFormat("Dauer: {0}ms", msEnd - msStart); msStart = msEnd; _report.AppendLine("<h2>Bezeichnungen</h2>"); _report.AppendLine("<table>"); _report.AppendFormat("<tr><td>Name</td><td>{0}</td></tr>", course.Name); _report.AppendFormat("<tr><td>Kurzname</td><td>{0}</td></tr>", course.ShortName); _report.AppendFormat("<tr><td>Beschreibung</td><td>{0}</td></tr>", course.Description); _report.AppendLine("</table>"); // jetzt die Gruppen foreach (var scheduleGroup in scheduleCourse.Groups) { // Fakultät ermitteln var org = db.Organisers.SingleOrDefault(x => x.ShortName.Equals(scheduleGroup.FacultyName)); // Studiengang innerhalb der Fakultät ermitteln var curr = org.Curricula.SingleOrDefault(x => x.ShortName.Equals(scheduleGroup.CurriculumShortName)); if (curr == null) { curr = new TimeTable.Data.Curriculum { ShortName = scheduleGroup.CurriculumShortName, Name = scheduleGroup.CurriculumName, Organiser = org }; db.Curricula.Add(curr); db.SaveChanges(); } // Studiengruppe innerhalb des Studiengangs ermitteln var groupName = scheduleGroup.GroupName; // Sonderlocke FK 11 // aus der LV-Nummer das Semester raussuchen /* OHI 20180720: wieder ausgebaut, weil Schnittstelle jetzt sauber befüllt ist * if (org.ShortName.Equals("FK 11")) * { * if (!string.IsNullOrEmpty(course.ShortName)) * { * groupName = course.ShortName[1].ToString(); * * } * else * { * groupName = "#N.V."; * } * } */ var currGroup = curr.CurriculumGroups.SingleOrDefault(x => x.Name.Equals(groupName)); if (currGroup == null) { currGroup = new CurriculumGroup { Curriculum = curr, Name = groupName, IsSubscribable = true, }; db.CurriculumGroups.Add(currGroup); db.SaveChanges(); } // Kapazitätsgruppe innerhalb der Studiengruppe ermitteln CapacityGroup capGroup = null; if (string.IsNullOrEmpty(scheduleGroup.SubGroupName)) { capGroup = currGroup.CapacityGroups.SingleOrDefault(x => string.IsNullOrEmpty(x.Name)); if (capGroup == null) { capGroup = new CapacityGroup { CurriculumGroup = currGroup, Name = string.Empty, InSS = scheduleGroup.SemesterName.StartsWith("SS"), InWS = scheduleGroup.SemesterName.StartsWith("WS") }; db.CapacityGroups.Add(capGroup); db.SaveChanges(); } } else { capGroup = currGroup.CapacityGroups.SingleOrDefault(x => !string.IsNullOrEmpty(x.Name) && x.Name.Equals(scheduleGroup.SubGroupName)); if (capGroup == null) { capGroup = new CapacityGroup { CurriculumGroup = currGroup, Name = scheduleGroup.SubGroupName, InSS = scheduleGroup.SemesterName.StartsWith("SS"), InWS = scheduleGroup.SemesterName.StartsWith("WS") }; db.CapacityGroups.Add(capGroup); db.SaveChanges(); } } // Semester ermitteln var semester = db.Semesters.SingleOrDefault(x => x.Name.Equals(scheduleGroup.SemesterName)); if (semester.Id == sem.Id) { // jetzt können wir die Semestergruppe ermitteln var semGroup = db.SemesterGroups.SingleOrDefault(x => x.Semester.Id == semester.Id && x.CapacityGroup.Id == capGroup.Id); if (semGroup == null) { semGroup = new SemesterGroup { Semester = semester, CapacityGroup = capGroup, IsAvailable = false // zu Beginn nicht freigegeben }; db.SemesterGroups.Add(semGroup); db.SaveChanges(); } course.SemesterGroups.Add(semGroup); semGroup.Activities.Add(course); // zu jeder Semestergruppe gibt es dann noch eine // Gruppe für Platzverlosung var occGroup = course.Occurrence.Groups.SingleOrDefault( gg => gg.SemesterGroups.Any(s => s.Id == semGroup.Id)); if (occGroup == null) { occGroup = new OccurrenceGroup { Capacity = 0, FitToCurriculumOnly = true, Occurrence = course.Occurrence }; occGroup.SemesterGroups.Add(semGroup); semGroup.OccurrenceGroups.Add(occGroup); course.Occurrence.Groups.Add(occGroup); db.OccurrenceGroups.Add(occGroup); } // NEU: Chapter und Topics if (!string.IsNullOrEmpty(scheduleGroup.ChapterName) && !string.IsNullOrEmpty(scheduleGroup.TopicName)) { var chapter = curr.Chapters.FirstOrDefault(x => x.Name.Equals(scheduleGroup.ChapterName)); if (chapter == null) { chapter = new CurriculumChapter { Curriculum = curr, Name = scheduleGroup.ChapterName }; db.CurriculumChapters.Add(chapter); } var topic = chapter.Topics.FirstOrDefault(x => x.Name.Equals(scheduleGroup.TopicName)); if (topic == null) { topic = new CurriculumTopic { Chapter = chapter, Name = scheduleGroup.TopicName }; db.CurriculumTopics.Add(topic); } var semTopic = db.SemesterTopics.FirstOrDefault(x => x.Semester.Id == sem.Id && x.Topic.Id == topic.Id); if (semTopic == null) { semTopic = new SemesterTopic { Semester = sem, Topic = topic, }; db.SemesterTopics.Add(semTopic); } semTopic.Activities.Add(course); } } // else => Semestergruppe wird nicht angelegt } db.SaveChanges(); if (!course.SemesterGroups.Any()) { _Logger.ErrorFormat("Kurs {0} ohne Gruppe", scheduleCourse.CourseId); } // zum Schluss die Termine _report.AppendLine("<h2>Neue Termine</h2>"); _report.AppendLine("<table>"); foreach (var scheduleDate in scheduleCourse.Dates) { // Der Tag var occDate = scheduleDate.Begin.Date; bool isVorlesung = true; foreach (var sd in _semester.Dates) { // Wenn der Termin in eine vorlesungsfreie Zeit fällt, dann nicht importieren if (sd.From.Date <= occDate.Date && occDate.Date <= sd.To.Date && sd.HasCourses == false) { isVorlesung = false; } } if (isVorlesung) { var occ = new ActivityDate { Begin = scheduleDate.Begin, End = scheduleDate.End, Activity = course, Occurrence = CreateDefaultOccurrence(), }; _report.AppendLine("<tr>"); _report.AppendFormat("<td>{0}</td><td>{1}</td><td>{2}</td>", occ.Begin.ToShortDateString(), occ.Begin.ToShortTimeString(), occ.End.ToShortTimeString()); _report.AppendFormat("<td>"); foreach (var scheduleDateRoom in scheduleDate.Rooms) { _report.AppendFormat("<p>{0}", scheduleDateRoom.RoomNumber); if (!string.IsNullOrEmpty(scheduleDateRoom.RoomNumber)) { var room = db.Rooms.SingleOrDefault(r => r.Number.Equals(scheduleDateRoom.RoomNumber)); if (room == null) { room = new Room { Number = scheduleDateRoom.RoomNumber, Capacity = 0, Description = string.Empty, Owner = string.Empty, }; db.Rooms.Add(room); db.SaveChanges(); _numRooms++; _report.AppendFormat(" !!!NEUER RAUM!!!"); } var assignment = db.RoomAssignments.SingleOrDefault(x => x.Room.Id == room.Id && x.Organiser.Id == organiser.Id); if (assignment == null) { assignment = new RoomAssignment { Organiser = organiser, InternalNeedConfirmation = false, // offen für interne ExternalNeedConfirmation = true // geschlossen für externe }; room.Assignments.Add(assignment); db.RoomAssignments.Add(assignment); db.SaveChanges(); } occ.Rooms.Add(room); _report.AppendFormat("</p>"); } } _report.AppendFormat("</td>"); _report.AppendFormat("<td>"); foreach (var scheduleDateLecturer in scheduleDate.Lecturers) { _report.AppendFormat("<p>{0} ({1})", scheduleDateLecturer.Name, scheduleDateLecturer.ShortName); var lecturer = organiser.Members.SingleOrDefault(l => l.ShortName.Equals(scheduleDateLecturer.ShortName)); if (lecturer == null) { lecturer = new OrganiserMember { ShortName = scheduleDateLecturer.ShortName, Name = scheduleDateLecturer.Name, Role = String.Empty, Description = String.Empty }; organiser.Members.Add(lecturer); db.Members.Add(lecturer); db.SaveChanges(); _numLecturers++; _report.AppendFormat(" !!!NEUER DOZENT!!!"); } occ.Hosts.Add(lecturer); _report.AppendFormat("</p>"); } _report.AppendFormat("</td>"); db.ActivityDates.Add(occ); _report.AppendLine(); _report.AppendLine("</tr>"); } } _report.AppendLine("</table>"); db.SaveChanges(); msEnd = sw.ElapsedMilliseconds; _Logger.DebugFormat("Dauer {0}ms", msEnd - msStart); msg = $"Kurs {course.ShortName} mit Terminen importiert"; return(msg); }
public static void Create(PdfViewModel pdfvm, Curriculum curriculum) { // CuriculumModel curriculum = db.Curiculums.Include("StudentId").Where(m => m.CuriculumId == pdfvm.curriculumId).FirstOrDefault(); List <CurriculumTopic> curriculumTopics = curriculum.Topics.ToList(); Student student = curriculum.Student; // TODO: Sort and group topics by first Certification SortedDictionary <string, List <Topic> > groupedTopics = new SortedDictionary <string, List <Topic> >(); foreach (var topic in curriculumTopics) { string first = String.Empty; if (topic.Topic.Certificeringen.Count != 0) { first = topic.Topic.Certificeringen.First().Naam; } if (!groupedTopics.ContainsKey(first)) { groupedTopics.Add(first, new List <Topic>()); groupedTopics[first].Add(topic.Topic); } else { groupedTopics[first].Add(topic.Topic); } } PdfDocument document = new PdfDocument(); PdfPage page = document.AddPage(); XGraphics gfx = XGraphics.FromPdfPage(page); var tf = new XTextFormatter(gfx); XStringFormat stringFormat = new XStringFormat(); stringFormat.LineAlignment = XLineAlignment.Near; stringFormat.Alignment = XStringAlignment.Near; var basepath = AppDomain.CurrentDomain.BaseDirectory; var path = String.Concat(basepath, "App_Data\\logo_itvitae_learning_liggend.png"); //var path = Server.MapPath(@"~/App_Data/logo_itvitae_learning_liggend.png"); XImage logo = XImage.FromFile(path); gfx.DrawImage(logo, new XPoint(430, 5)); //Fonts XFont Calibri20Bold = new XFont("calibri", 20, XFontStyle.Bold); XFont Calibri20BoldItalic = new XFont("calibri", 20, XFontStyle.BoldItalic); XFont LabelFont = new XFont("calibri", 11, XFontStyle.Regular); //Title Header gfx.DrawString("Persoonlijk Curriculum", Calibri20Bold, XBrushes.Black, new XRect(0, 20, page.Width, 0), XStringFormats.Center); gfx.DrawString("ITvitae learning", Calibri20BoldItalic, XBrushes.Black, new XRect(0, 41, page.Width, 0), XStringFormats.Center); //XImage ITvitaeLogo = XImage.FromFile(string.Empty); //gfx.DrawImage(ITvitaeLogo, new XRect(0, 0, 0, 0)); //30-100-30 -100 -75-100-30 -100 -30 //0 |30 |130|160|260|335|435|465|565|595 //Student Info int col1x = 30; int col2x = 135; int col3x = 335; int col4x = 435; int colwidth = 100; int rowheight = 12; int row1 = 60; int row2 = 80; int row3 = 100; DrawLabel("Naam:", col1x, row1, colwidth, rowheight, gfx); DrawLabel(student.VolledigeNaam, col2x, row1, colwidth, rowheight, gfx); DrawLabel("Geboortedatum:", col1x, row2, colwidth, rowheight, gfx); DrawLabel(pdfvm.DoB.ToShortDateString(), col2x, row2, colwidth, rowheight, gfx); DrawLabel("StartDatum:", col1x, row3, colwidth, rowheight, gfx); DrawLabel(pdfvm.StartDate.ToShortDateString(), col2x, row3, colwidth, rowheight, gfx); DrawLabel("Einddatum:", col3x, row3, colwidth, rowheight, gfx); DrawLabel(pdfvm.EndDate.ToShortDateString(), col4x, row3, colwidth, rowheight, gfx); DrawLabel("Niveau:", col3x, row1, colwidth, rowheight, gfx); DrawLabel(pdfvm.Niveau, col4x, row1, colwidth, rowheight, gfx); DrawLabel("Richting:", col3x, row2, colwidth, rowheight, gfx); DrawLabel(pdfvm.Course, col4x, row2, colwidth, rowheight, gfx); //Topics //595 into 3 columns starting on Y = 150 int YPointer = 150; int topicColumnWidth = 159; int topicColumn1 = 30; int topicColumn2 = 30 + topicColumnWidth; int topicColumn3 = 2 * topicColumnWidth + 60; XFont certFont = new XFont("calibri", 11, XFontStyle.Regular); XPen pen = new XPen(XColors.LightGray); //Add headers DrawLabel("Modules", topicColumn1, YPointer, topicColumnWidth, rowheight, gfx); if (pdfvm.Leerdoel) { DrawLabel("Leerdoelen", topicColumn2, YPointer, topicColumnWidth, rowheight, gfx); } if (pdfvm.Certificeringen) { DrawLabel("Certificeringen", topicColumn3, YPointer, topicColumnWidth, rowheight, gfx); } YPointer += rowheight; //List<Topic> topics = curriculum.Topics.ToList(); List <CurriculumTopic> topics = curriculum.Topics.ToList(); for (int i = 0; i < curriculum.Topics.Count; i++) { List <DrawStringListItem> drawList = new List <DrawStringListItem>(); //Update YPointer; YPointer += 4; CurriculumTopic topic = topics[i]; //measure topic XSize topicSize = gfx.MeasureString(topic.Topic.NaamCode, certFont); //make rect int rectWidth = topicColumnWidth; double rectRows = 1; int CertYPointer = 0; if (topicSize.Width > topicColumnWidth) { rectRows = topicSize.Width / topicColumnWidth; if (rectRows % 1 > 0) { rectRows++; } rectRows = Math.Floor(rectRows); } //check if new page is needed if (YPointer + (rowheight * rectRows) > 780) { gfx = NewPage(document, out page, gfx, out tf, out YPointer, logo); } //Make topicrect XRect topicRect = new XRect(topicColumn1, 0, rectWidth, rowheight * rectRows); //Add string to drawlist drawList.Add(new DrawStringListItem(topic.Topic.NaamCode, certFont, XBrushes.Black, topicRect)); if (pdfvm.Leerdoel) { //measure leerdoel XSize leerdoelSize = gfx.MeasureString(topic.Topic.Leerdoel, certFont); //make rect if (leerdoelSize.Width / topicColumnWidth > rectRows) { rectRows = leerdoelSize.Width / topicColumnWidth; if (rectRows % 1 > 0) { rectRows++; } rectRows = Math.Floor(rectRows); } //check if new page is needed if (YPointer + (rowheight * rectRows) > 780) { gfx = NewPage(document, out page, gfx, out tf, out YPointer, logo); } XRect leerdoelRect = new XRect(topicColumn2, 0, rectWidth, rowheight * rectRows); //update height and y pointer drawList.Add(new DrawStringListItem(topic.Topic.Leerdoel, certFont, XBrushes.Black, leerdoelRect)); } if (pdfvm.Certificeringen) { List <Certificering> certs = topic.Topic.Certificeringen.ToList(); for (int j = 0; j < certs.Count; j++) { //measure each cert XSize certSize = gfx.MeasureString(certs[j].Naam, certFont); //make rect for each cert double certRows = 1; if (certSize.Width / topicColumnWidth > certRows) { certRows = certSize.Width / topicColumnWidth; if (certRows % 1 > 0) { certRows++; } certRows = Math.Floor(certRows); } XRect certRect = new XRect(topicColumn3, CertYPointer, rectWidth, rowheight * certRows); //Add each cert to drawlist drawList.Add(new DrawStringListItem(certs[j].Naam, certFont, XBrushes.Black, certRect)); //update CertYPointer for the next cert CertYPointer += rowheight * (int)certRows; } //Check if certs go over the footer if (YPointer + CertYPointer > 780) { gfx = NewPage(document, out page, gfx, out tf, out YPointer, logo); } } //Draw all the things relative to YPointer gfx.DrawLine(pen, topicColumn1, YPointer - 2, topicColumn3 + topicColumnWidth, YPointer - 2); foreach (var item in drawList) { XRect r = new XRect(item.Rect.X, item.Rect.Y + YPointer, item.Rect.Width, item.Rect.Height); tf.DrawString(item.Text, item.Font, item.Brush, r); } YPointer += (rowheight * (int)rectRows) > CertYPointer ? (rowheight * (int)rectRows) : CertYPointer; } //add footers gfx.Dispose(); int pageNumber = 1; int outOf = document.Pages.Count; foreach (PdfPage pdfPage in document.Pages) { gfx = XGraphics.FromPdfPage(pdfPage); int footerY = 802; XFont footerFont = new XFont("verdana", 10, XFontStyle.Italic); gfx.DrawLine(pen, 0, footerY, page.Width, footerY); gfx.DrawString($"Pagina {pageNumber}/{outOf}", footerFont, XBrushes.SlateGray, new XPoint(455, footerY + 20)); gfx.DrawString("Versie 1.0", footerFont, XBrushes.SlateGray, new XPoint(65, footerY + 20)); pageNumber++; } string filename = student + $"{ DateTime.Now.Millisecond.ToString()}.pdf"; // $"Hello_{DateTime.Now.Millisecond.ToString()}.pdf"; document.Save(filename); Process.Start(filename); }