Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions cmd/csv.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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")
}
Expand Down
78 changes: 77 additions & 1 deletion plexams/csv.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down Expand Up @@ -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)
}
6 changes: 5 additions & 1 deletion plexams/invigilators.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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")
Expand Down
Loading