|
|
@@ -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) {
|