@@ -399,6 +399,68 @@ func (db *DB) GetMissingAttendance(classID int, args *models.QueryContext) (int,
399399 return missingAttendanceCount , nil
400400}
401401
402+ func (db * DB ) GetActiveClassesForMissingAttendance (args * models.QueryContext , facilityID * uint ) ([]models.MissingAttendanceClass , error ) {
403+ var missClasses []models.MissingAttendanceClass
404+ classQuery := db .WithContext (args .Ctx ).
405+ Table ("program_classes c" ).
406+ Select ("c.id, c.name, f.name as facility_name" ).
407+ Joins ("JOIN facilities f ON f.id = c.facility_id" ).
408+ Where ("c.status = ?" , models .Active ).
409+ Where ("c.archived_at IS NULL" )
410+ if facilityID != nil {
411+ classQuery = classQuery .Where ("c.facility_id = ?" , * facilityID )
412+ }
413+ if err := classQuery .Find (& missClasses ).Error ; err != nil {
414+ return nil , newGetRecordsDBError (err , "program_classes" )
415+ }
416+ return missClasses , nil
417+ }
418+
419+ func (db * DB ) GetClassEventsWithOverrides (args * models.QueryContext , classIDs []uint ) ([]models.ProgramClassEvent , error ) {
420+ var events []models.ProgramClassEvent
421+ if err := db .WithContext (args .Ctx ).
422+ Model (& models.ProgramClassEvent {}).
423+ Preload ("Overrides" ).
424+ Preload ("RoomRef" ).
425+ Where ("class_id IN ?" , classIDs ).
426+ Find (& events ).Error ; err != nil {
427+ return nil , newGetRecordsDBError (err , "program_class_events" )
428+ }
429+ return events , nil
430+ }
431+
432+ type AttendanceCount struct {
433+ EventID uint `json:"event_id"`
434+ Date string `json:"date"`
435+ Count int64 `json:"count"`
436+ }
437+
438+ func (db * DB ) GetAttendanceCountsForEvents (args * models.QueryContext , eventIDs []uint , dates []string ) ([]AttendanceCount , error ) {
439+ var attendanceCounts []AttendanceCount
440+ if err := db .WithContext (args .Ctx ).
441+ Model (& models.ProgramClassEventAttendance {}).
442+ Select ("event_id, date, COUNT(*) as count" ).
443+ Where ("event_id IN ? AND date IN ?" , eventIDs , dates ).
444+ Group ("event_id, date" ).
445+ Scan (& attendanceCounts ).Error ; err != nil {
446+ return nil , newGetRecordsDBError (err , "program_class_event_attendance" )
447+ }
448+ return attendanceCounts , nil
449+ }
450+
451+ func (db * DB ) GetActiveEnrollmentsForClasses (args * models.QueryContext , classIDs []uint ) ([]models.ProgramClassEnrollment , error ) {
452+ var enrollments []models.ProgramClassEnrollment
453+ if err := db .WithContext (args .Ctx ).
454+ Model (& models.ProgramClassEnrollment {}).
455+ Select ("class_id, enrolled_at, enrollment_ended_at" ).
456+ Where ("class_id IN ?" , classIDs ).
457+ Where ("enrollment_status = ?" , models .Enrolled ).
458+ Find (& enrollments ).Error ; err != nil {
459+ return nil , newGetRecordsDBError (err , "program_class_enrollments" )
460+ }
461+ return enrollments , nil
462+ }
463+
402464func (db * DB ) CreateAttendanceAuditTrail (ctx context.Context , att * models.ProgramClassEventAttendance , adminID * uint , className string ) error {
403465
404466 sessionDateParsed , err := time .ParseInLocation ("2006-01-02" , att .Date , time .Local )
0 commit comments