courts = \App\Models\Court::select('*')->where('enabled', true)->get();
$this->instructors = \App\Models\User::select('*')->where('level', 2)->where('enabled', true)->orderBy('name', 'asc')->get();
$this->motivations = \App\Models\Motivation::select('*')->where('enabled', true)->where('type', 'del')->get();
$this->from = "00:00:00";
$this->to = "23:59:59";
$this->date = date("Y-m-d");
setlocale(LC_ALL, 'it_IT');
}
public function render()
{
setlocale(LC_ALL, 'it_IT');
$this->records = [];
$this->courses = [];
$from = $this->date . " " . $this->from;
$to = $this->date . " " . $this->to;
$calendars = \App\Models\Calendar::where('from', '>=', $from)->where('from', '<=', $to)->orderBy('from')->get();
if (!is_null($this->court_id) && $this->court_id > 0)
$this->court_name = \App\Models\Court::findOrFail($this->court_id)->name;
else
$this->court_name = '';
if (!is_null($this->instructor_id) && $this->instructor_id > 0)
$this->instructor_name = \App\Models\User::findOrFail($this->instructor_id)->name;
else
$this->instructor_name = '';
foreach ($calendars as $calendar) {
$presences = \App\Models\Presence::where('calendar_id', $calendar->id)->where('status', '<>', 99);
$presences_annullate = \App\Models\Presence::where('calendar_id', $calendar->id)->where('status', 99);
// filtra per campo court_id
if (!is_null($this->court_id) && $this->court_id > 0) {
$presences->where('court_id', $this->court_id);
$presences_annullate->where('court_id', $this->court_id);
}
// filtra per campo istructor_id/user_id
if (!is_null($this->instructor_id) && $this->instructor_id > 0) {
$presences->where(function ($query) {
$query->where('instructor_id', $this->instructor_id)
->orWhere('user_id', $this->instructor_id);
});
$presences_annullate->where(function ($query) {
$query->where('instructor_id', $this->instructor_id)
->orWhere('user_id', $this->instructor_id);
});
}
// filtra per campo search (nome/cognome)
if (!is_null($this->search) && $this->search != "") {
$search_value = $this->search;
$presences->whereHas('member', function ($q) use ($search_value) {
$q->where(function ($qq) use ($search_value) {
$qq->whereRaw("CONCAT(TRIM(first_name), ' ', TRIM(last_name)) LIKE ?", ["%{$search_value}%"])
->orWhereRaw("CONCAT(TRIM(last_name), ' ', TRIM(first_name)) LIKE ?", ["%{$search_value}%"]);
});
});
$presences_annullate->whereHas('member', function ($q) use ($search_value) {
$q->where(function ($qq) use ($search_value) {
$qq->whereRaw("CONCAT(TRIM(first_name), ' ', TRIM(last_name)) LIKE ?", ["%{$search_value}%"])
->orWhereRaw("CONCAT(TRIM(last_name), ' ', TRIM(first_name)) LIKE ?", ["%{$search_value}%"]);
});
});
}
$presences = $presences->pluck('member_id')->toArray();
$presences_annullate = $presences_annullate->pluck('member_id')->toArray();
$days = ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'];
$dow = date('w', strtotime($calendar->from));
$d = $days[$dow];
$h = date('H:i', strtotime($calendar->from));
// Elenco corsi per tipologia in base al calendario
$courses = \App\Models\Course::where('name', $calendar->name)->where('date_from', '<=', $calendar->from)->where('date_to', '>=', $calendar->to);
if (!is_null($this->course_name)) {
$courses = $courses->where('name', $this->course_name);
}
$courses = $courses->pluck('id')->toArray();
$mids = [];
$months = date("n", strtotime($calendar->from));
// Elenco utenti iscritti al corso "padre"
$members = \App\Models\MemberCourse::where('when', 'like', "%" . $d . "%")
->where('when', 'like', '%"from":"' . $h . '"%')
->whereDate('date_from', '<=', $calendar->from)
->whereDate('date_to', '>=', $calendar->from)
->whereNot('months', 'like', '%"m":' . $months . ',"status":2%')
->whereIn('course_id', $courses)->get();
//$members = \App\Models\MemberCourse::where('when', 'like', "%" . $d . "%")->where('when', 'like', '%"from":"' . $h . '"%')->whereIn('member_id', $presences)->whereIn('course_id', $courses)->get();
foreach ($members as $member) {
$court = '';
$instructor = '';
$motivation = '';
$presence = \App\Models\Presence::where('member_id', $member->member->id)->where('calendar_id', $calendar->id)->first();
if ($presence) {
$court = $presence->court ? $presence->court->name : "";
$instructor = [
$presence->user ? $presence->user->name : "",
$presence->instuctor && $presence->instructor !== $presence->user ? $presence->instuctor->name : "",
];
$instructor = implode(", ", array_filter($instructor));
$motivation = $presence->motivation ? $presence->motivation->name : "";
}
$status = '';
if (in_array($member->member->id, $presences)) {
$status = "Presente";
} else {
if (in_array($member->member->id, $presences_annullate)) {
$status = "Annullata";
} else {
if (date("Ymd") > date("Ymd", strtotime($calendar->from))) {
$status = "Assente";
}
}
}
if ($calendar->status == 99) {
$status = "Annullata";
}
$show = true;
if ($this->court_name != '')
$show = $this->court_name == $court;
if ($show && $this->instructor_name != '')
$show = $this->instructor_name == $instructor;
if ($show)
{
$this->records[$calendar->name][$h][] = array(
"last_name" => $member->member->last_name,
"first_name" => $member->member->first_name,
"court" => $court,
"instructor" => $instructor,
"status" => $status,
'motivation' => $motivation
);
$mids[] = $member->member->id;
}
}
$presences_recuperi = \App\Models\Presence::where('calendar_id', $calendar->id)->whereNotIn('member_id', $mids);
if (!is_null($this->court_id) && $this->court_id > 0) {
$presences_recuperi->where('court_id', $this->court_id);
}
if (!is_null($this->instructor_id) && $this->instructor_id > 0) {
$presences_recuperi->where(function ($query) {
$query->where('instructor_id', $this->instructor_id)
->orWhere('user_id', $this->instructor_id);
});
}
if (!is_null($this->search) && $this->search != "") {
$search_value = $this->search;
$presences_recuperi->whereHas('member', function ($q) use ($search_value) {
$q->where(function ($qq) use ($search_value) {
$qq->whereRaw("CONCAT(TRIM(first_name), ' ', TRIM(last_name)) LIKE ?", ["%{$search_value}%"])
->orWhereRaw("CONCAT(TRIM(last_name), ' ', TRIM(first_name)) LIKE ?", ["%{$search_value}%"]);
});
});
}
$presences_recuperi = $presences_recuperi->get();
foreach ($presences_recuperi as $p) {
$court = $p->court ? $p->court->name : "";
$instructor = [
$p->user ? $p->user->name : "",
$p->instuctor && $p->instructor !== $p->user ? $p->instuctor->name : "",
];
$instructor = implode(", ", array_filter($instructor));
$motivation = $p->motivation ? $p->motivation->name : "";
$status = "Recupero";
$this->records[$calendar->name][$h][] = array(
"last_name" => $p->member->last_name,
"first_name" => $p->member->first_name,
"court" => $court,
"instructor" => $instructor,
"status" => $status,
'motivation' => $motivation
);
}
/*
$calendar_recuperi = \App\Models\Calendar::where('manual', 1)->where('id', $calendar->id)->pluck('id')->toArray();
$presences_recuperi = \App\Models\Presence::whereIn('calendar_id', $calendar_recuperi)->where('member_id', $this->dataId)->get();
foreach($presences_recuperi as $p)
{
$this->member_presences[] = array('calendar_id' => $p->calendar->id, 'from' => $p->calendar->from, 'to' => $p->calendar->to, 'status' => 'Recupero');//\App\Models\Presence::where('member_id', $this->dataId)->get();
$this->recuperi += 1;
}
*/
//array_push($this->courses, $calendar->course_id);
// sort records per cognome-nome
if (isset($this->records[$calendar->name]) && isset($this->records[$calendar->name][$h])) {
usort($this->records[$calendar->name][$h], function($a, $b) {
$last_name_compare = strcmp($a['last_name'], $b['last_name']);
$first_name_compare = strcmp($a['first_name'], $b['first_name']);
return $last_name_compare != 0 ? $last_name_compare : $first_name_compare;
});
}
}
$this->courses = \App\Models\Calendar::orderBy('name')->groupBy('name')->pluck('name')->toArray();
/*$this->courses = array_unique($this->courses);
$this->courses = array_map(function ($course_id) {
try {
return \App\Models\Course::findOrFail($course_id);
} catch (\Throwable $e) {
return null;
}
}, $this->courses);
$this->courses = array_filter($this->courses);*/
return view('livewire.presence_report');
}
public function prev()
{
$this->date = date("Y-m-d", strtotime("-1 day", strtotime($this->date)));
}
public function next()
{
$this->date = date("Y-m-d", strtotime("+1 day", strtotime($this->date)));
}
public function today()
{
$this->date = date("Y-m-d");
}
}