diff --git a/cmd/csv.go b/cmd/csv.go index 13f02de..abcaf45 100644 --- a/cmd/csv.go +++ b/cmd/csv.go @@ -13,8 +13,10 @@ var ( Use: "csv", Short: "csv [subcommand]", Long: `Generate various CSVs. - draft [program] - generate csv for program - exahm - csv for EXaHM/SEB exams.`, + draft [program] - generate csv for program + exahm - csv for EXaHM/SEB exams + lba-repeater - csv for LBA repeater exams + `, Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { plexams := initPlexamsConfig() @@ -43,6 +45,16 @@ var ( os.Exit(1) } + case "lba-repeater": + if len(Csvfile) == 0 { + Csvfile = "Prüfungsplanung_LBA_Repeater_FK07.csv" + } + fmt.Printf("generating %s\n", Csvfile) + err := plexams.CsvForLBARepeater(Csvfile) + if err != nil { + os.Exit(1) + } + default: fmt.Println("pdf called with unknown sub command") } diff --git a/plexams/csv.go b/plexams/csv.go index f36c5c0..2bf1545 100644 --- a/plexams/csv.go +++ b/plexams/csv.go @@ -112,7 +112,7 @@ func (p *Plexams) CsvForProgram(program, filename string) error { type CsvExamEXaHM struct { Ancode int `csv:"Ancode"` Module string `csv:"Modul"` - MainExamer string `csv:"Erstprüfer:in"` + MainExamer string `csv:"Erstprüfender"` ExamDate string `csv:"Termin"` MaxDuration int `csv:"Maximale Länge"` Students int `csv:"Anmeldungen"` @@ -179,3 +179,79 @@ func (p *Plexams) CsvForEXaHM(filename string) error { return os.WriteFile(filename, b, 0644) } + +type CsvLBARepeater struct { + Ancode int `csv:"Ancode"` + Module string `csv:"Modul"` + MainExamer string `csv:"Erstprüfender"` + EmailMainExamer string `csv:"E-Mail Erstprüfender"` + ExamDate string `csv:"Termin"` + Invigilators string `csv:"Aufsichten"` + EmailsInvigilators string `csv:"E-Mails Aufsichten"` +} + +func (p *Plexams) CsvForLBARepeater(filename string) error { + ctx := context.Background() + plannedExams, err := p.PlannedExams(ctx) + if err != nil { + log.Error().Err(err).Msg("cannot get planned exams") + return err + } + + var csvEntries []CsvLBARepeater + for _, exam := range plannedExams { + if !exam.ZpaExam.IsRepeaterExam { + continue + } + + mainExamer, err := p.GetTeacher(ctx, exam.ZpaExam.MainExamerID) + if err != nil { + log.Error().Err(err).Msg("cannot get main examiner") + return err + } + + if !mainExamer.IsLBA { + continue + } + + examDate := "fehlt" + if exam.PlanEntry != nil { + starttime := p.getSlotTime(exam.PlanEntry.DayNumber, exam.PlanEntry.SlotNumber) + examDate = starttime.Local().Format("02.01.06, 15:04 Uhr") + } + + invigilators, invigilatorEmails := "", "" + + invigs := set.NewSet[int]() + for _, room := range exam.PlannedRooms { + invigilator, err := p.GetInvigilatorForRoom(ctx, room.RoomName, exam.PlanEntry.DayNumber, exam.PlanEntry.SlotNumber) + if err != nil { + log.Error().Err(err).Msg("cannot get invigilator") + return err + } + if invigs.Contains(invigilator.ID) { + continue + } + invigilators += invigilator.Shortname + ", " + invigilatorEmails += invigilator.Email + ", " + invigs.Add(invigilator.ID) + } + + csvEntries = append(csvEntries, CsvLBARepeater{ + Ancode: exam.Ancode, + Module: exam.ZpaExam.Module, + MainExamer: exam.ZpaExam.MainExamer, + EmailMainExamer: mainExamer.Email, + ExamDate: examDate, + Invigilators: invigilators, + EmailsInvigilators: invigilatorEmails, + }) + } + + b, err := csvutil.Marshal(csvEntries) + if err != nil { + log.Error().Err(err).Msg("error when marshaling to csv") + } + + return os.WriteFile(filename, b, 0644) +} diff --git a/plexams/invigilators.go b/plexams/invigilators.go index aee24f9..e08cb21 100644 --- a/plexams/invigilators.go +++ b/plexams/invigilators.go @@ -676,6 +676,10 @@ func (p *Plexams) MakeSelfInvigilations(ctx context.Context) ([]*model.Invigilat return invigilations, nil } +func (p *Plexams) GetInvigilatorForRoom(ctx context.Context, name string, day, time int) (*model.Teacher, error) { + return p.dbClient.GetInvigilatorForRoom(ctx, name, day, time) +} + // TODO: rewrite me func (p *Plexams) RoomsWithInvigilationsForSlot(ctx context.Context, day int, time int) (*model.InvigilationSlot, error) { rooms, err := p.PlannedRoomsInSlot(ctx, day, time) @@ -719,7 +723,7 @@ func (p *Plexams) RoomsWithInvigilationsForSlot(ctx context.Context, day int, ti for _, name := range keys { roomsForExam := roomMap[name] - invigilator, err := p.dbClient.GetInvigilatorForRoom(ctx, name, day, time) + invigilator, err := p.GetInvigilatorForRoom(ctx, name, day, time) if err != nil { log.Error().Err(err).Int("day", day).Int("slot", time).Str("room", name). Msg("cannot get invigilator for rooms in slot")