Jelajahi Sumber

absence_report - modificata logica per motivation_course_id

ferrari 1 bulan lalu
induk
melakukan
628ff18298
1 mengubah file dengan 30 tambahan dan 13 penghapusan
  1. 30 13
      app/Http/Livewire/AbsenceReport.php

+ 30 - 13
app/Http/Livewire/AbsenceReport.php

@@ -63,7 +63,7 @@ class AbsenceReport extends Component
                     })
                     ->get();
 
-                $courseCalendars = \App\Models\Calendar::where('course_id', $course->id)->where('from', '<=', $limit)->get();
+                $courseCalendars = \App\Models\Calendar::where('course_id', $course->id)->where('from', '<=', $limit)->where('status', '<>', 99)->get();
 
                 $calendarIndex = [];
                 foreach ($courseCalendars as $cal) {
@@ -76,11 +76,20 @@ class AbsenceReport extends Component
 
                 $memberIds = $course_members->pluck('member_id')->unique()->values();
 
-                $presences = \App\Models\Presence::whereIn('calendar_id', $courseCalendars->pluck('id'))->where('status', '<>', 99)->whereIn('member_id', $memberIds)->get();
+                $makeups = \App\Models\Presence::query()
+                    ->join('calendars', 'presences.calendar_id', '=', 'calendars.id')
+                    ->where('presences.motivation_course_id', $course->id)
+                    ->whereIn('presences.member_id', $memberIds)
+                    ->where('presences.status', '<>', 99)
+                    ->where('calendars.from', '<=', $limit)
+                    ->where('calendars.status', '<>', 99)
+                    ->selectRaw('presences.member_id, MAX(calendars.from) as last_makeup_from')
+                    ->groupBy('presences.member_id')
+                    ->get();
 
-                $presenceIndex = [];
-                foreach ($presences as $p) {
-                    $presenceIndex[$p->member_id . '|' . $p->calendar_id] = true;
+                $lastMakeupByMember = [];
+                foreach ($makeups as $m) {
+                    $lastMakeupByMember[$m->member_id] = Carbon::parse($m->last_makeup_from);
                 }
 
                 $this->record_assenze[$course->id] = [
@@ -135,20 +144,28 @@ class AbsenceReport extends Component
 
                     usort($memberCalendars, fn($a, $b) => $b->to <=> $a->to);
 
+                    $mid = $course_member->member_id;
+                    $lastAttendance = $lastMakeupByMember[$mid] ?? null;
                     foreach ($memberCalendars as $calendar) {
-                        $pKey = $course_member->member_id . '|' . $calendar->id;
+                        $lessonFrom = Carbon::parse($calendar->from);
 
+                        if ($lastAttendance && $lessonFrom->lte($lastAttendance)) {
+                            break;
+                        }
+
+                        $pKey = $mid . '|' . $calendar->id;
                         $hasPresence = isset($presenceIndex[$pKey]);
 
-                        if (!$hasPresence) {
-                            $this->record_assenze[$course->id]['members'][$course_member->id]['count']++;
-                            $this->record_assenze[$course->id]['members'][$course_member->id]['dates'][] = [
-                                'calendar_id' => $calendar->id,
-                                'date' => Carbon::parse($calendar->from)->translatedFormat('d/m'),
-                            ];
-                        } else {
+                        if ($hasPresence) {
                             break;
                         }
+
+                        // assenza vera
+                        $this->record_assenze[$course->id]['members'][$course_member->id]['count']++;
+                        $this->record_assenze[$course->id]['members'][$course_member->id]['dates'][] = [
+                            'calendar_id' => $calendar->id,
+                            'date' => $lessonFrom->translatedFormat('d/m'),
+                        ];
                     }
 
                     if ($this->record_assenze[$course->id]['members'][$course_member->id]['count'] < 2) {