ソースを参照

modifiche grafiche report presenze

ferrari 4 ヶ月 前
コミット
2f48a9d01e

+ 59 - 36
app/Http/Livewire/PresenceReport.php

@@ -15,7 +15,8 @@ class PresenceReport extends Component
 
     public $member_ids = [];
 
-    
+
+    public $courses = [];
     public $courts = [];
     public $instructors = [];
     public $motivations = [];
@@ -23,7 +24,7 @@ class PresenceReport extends Component
     public $court_filter;
     public $instructor_filter;
     public $motivation_filter;
-    
+
 
     public $members = [];
 
@@ -31,34 +32,47 @@ class PresenceReport extends Component
 
     public $ids = [];
 
+    public $course_id;
+    public $from;
+    public $to;
+    public $court_id;
+    public $instructor_id;
+
     public function mount()
     {
-
         $this->courts = \App\Models\Court::select('*')->where('enabled', true)->get();
         $this->instructors = \App\Models\User::select('*')->where('level', 2)->where('enabled', true)->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 . " 00:00:00";
-        $to = $this->date . " 23:59:59";
+        $from = $this->date . " " . $this->from;
+        $to = $this->date . " " . $this->to;
 
-        $calendars = \App\Models\Calendar::where('from', '>=', $from)->where('to', '<=', $to)->orderBy('from')->get();
+        $calendars = \App\Models\Calendar::where('from', '>=', $from)->where('from', '<=', $to)->orderBy('from')->get();
 
-        foreach($calendars as $calendar)
-        {
+        foreach ($calendars as $calendar) {
 
-            $presences = \App\Models\Presence::where('calendar_id', $calendar->id)->where('status', '<>', 99)->pluck('member_id')->toArray();
+            $presences = \App\Models\Presence::where('calendar_id', $calendar->id)->where('status', '<>', 99);
+            if (!is_null($this->court_id)) {
+                $presences = $presences->where('court_id', $this->court_id);
+            }
+            if (!is_null($this->instructor_id)) {
+                $presences = $presences->where('instructor_id', $this->instructor_id);
+            }
+            $presences = $presences->pluck('member_id')->toArray();
             $presences_annullate = \App\Models\Presence::where('calendar_id', $calendar->id)->where('status', 99)->pluck('member_id')->toArray();
 
             $days = ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'];
@@ -68,56 +82,61 @@ class PresenceReport extends Component
             $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)->pluck('id')->toArray();
+            $courses = \App\Models\Course::where('name', $calendar->name)->where('date_from', '<=', $calendar->from)->where('date_to', '>=', $calendar->to);
+            if (!is_null($this->course_id)) {
+                $courses = $courses->where('id', $this->course_id);
+            }
+            $courses = $courses->pluck('id')->toArray();
 
             // Elenco utenti iscritti al corso "padre"
-            $members = \App\Models\MemberCourse::where('when', 'like', "%" . $d . "%")->where('when', 'like', '%"from":"' . $h . '"%')->whereIn('course_id', $courses)->get();
-            foreach($members as $member)
-            {
+            // $members = \App\Models\MemberCourse::where('when', 'like', "%" . $d . "%")->where('when', 'like', '%"from":"' . $h . '"%')->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)
-                {
+                if ($presence) {
                     $court = $presence->court ? $presence->court->name : "";
                     $instructor = $presence->instructor ? $presence->instructor->name : "";
                     $motivation = $presence->motivation ? $presence->motivation->name : "";
                 }
 
                 $status = '';
-                if (in_array($member->member->id, $presences))
-                {
-                    $status = "<span style=\"color:#0c6197\">Prezenza ordinaria</span>";
-                }
-                else
-                {
-                    if (in_array($member->member->id, $presences_annullate))
-                    {
-                        $status = "<span style=\"color:gray\">Annullata</span>";
-                    }
-                    else
-                    {
-                        if (date("Ymd") > date("Ymd", strtotime($calendar->from)))
-                        {
-                            $status = "<span style=\"color:red\">Assenza</span>";
+                if (in_array($member->member->id, $presences)) {
+                    $status = "<span class='fw-bold' style='color:#0c6197'>Presente</span>";
+                } else {
+                    if (in_array($member->member->id, $presences_annullate)) {
+                        $status = "<span class='fw-bold' style='color:gray'>Annullata</span>";
+                    } else {
+                        if (date("Ymd") > date("Ymd", strtotime($calendar->from))) {
+                            $status = "<span class='fw-bold' style='color:red'>Assente</span>";
                         }
                     }
                 }
 
-                if ($calendar->status == 99)
-                {
-                    $status = "<span style=\"color:gray\">Annullata</span>";
+                if ($calendar->status == 99) {
+                    $status = "<span class='fw-bold' style='color:gray'>Annullata</span>";
                 }
 
                 $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);
-
             }
 
+            array_push($this->courses, $calendar->course_id);
         }
 
+        $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');
     }
 
@@ -131,4 +150,8 @@ class PresenceReport extends Component
         $this->date = date("Y-m-d", strtotime("+1 day", strtotime($this->date)));
     }
 
+    public function today()
+    {
+        $this->date = date("Y-m-d");
+    }
 }

+ 34 - 0
public/css/presence_report.css

@@ -0,0 +1,34 @@
+.report-table {
+    width: 100%;
+    border-spacing: 0;
+    border-collapse: separate;
+    border-radius: 8px;
+    overflow: hidden;
+    border: 1px solid #8d9aa4;
+}
+
+.report-table thead {
+    width: 100%;
+    background-color: #f6f8fa;
+}
+
+.report-table tbody {
+    width: 100%;
+}
+
+.report-table thead td {
+    padding: 15px 35px;
+    text-transform: uppercase;
+    font-weight: bold;
+}
+
+.report-table tbody td {
+    padding: 15px 35px;
+    text-transform: uppercase;
+    font-size: 14px;
+    border-bottom: 1px solid #c1c9cf;
+}
+
+.report-table tbody > tr:last-of-type td {
+    border-bottom: none;
+}

+ 9 - 4
resources/views/layouts/app.blade.php

@@ -315,7 +315,7 @@
                                     Corsi
                                 </button>
                             </h2>
-                            <div id="collapseThree" class="accordion-collapse collapse {{Request::is('course_list') || Request::is('course_member') || Request::is('calendar') ? 'show' : ''}}" aria-labelledby="headingThree" data-bs-parent="#accordionExample">
+                            <div id="collapseThree" class="accordion-collapse collapse {{Request::is('course_list') || Request::is('course_member') || Request::is('calendar') || Request::is('presence_reports') ? 'show' : ''}}" aria-labelledby="headingThree" data-bs-parent="#accordionExample">
                                 <div class="accordion-body">
                                     <ul class="nav nav-pills flex-column align-items-center align-items-sm-start w-100" id="menu-contabilita" style="margin-top:0px;">
                                         <li class="nav-item" style="{{Request::is('course_member') ? 'background-color: #c5d9e6;' : ''}}">
@@ -323,14 +323,19 @@
                                                 <span class="ms-3 d-md-inline">Iscritti</span>
                                             </a>
                                         </li>
+                                        <li class="nav-item" style="{{Request::is('course_list') ? 'background-color: #c5d9e6;' : ''}}">
+                                            <a href="/course_list" class="nav-link d-flex align-items-center linkMenu">
+                                                <span class="ms-3 d-md-inline">Pagamenti</span>
+                                            </a>
+                                        </li>
                                         <li class="nav-item" style="{{Request::is('calendar') ? 'background-color: #c5d9e6;' : ''}}">
                                             <a href="/calendar" class="nav-link d-flex align-items-center linkMenu">
                                                 <span class="ms-3 d-md-inline">Calendario</span>
                                             </a>
                                         </li>
-                                        <li class="nav-item" style="{{Request::is('course_list') ? 'background-color: #c5d9e6;' : ''}}">
-                                            <a href="/course_list" class="nav-link d-flex align-items-center linkMenu">
-                                                <span class="ms-3 d-md-inline">Pagamenti</span>
+                                        <li class="nav-item" style="{{Request::is('presence_reports') ? 'background-color: #c5d9e6;' : ''}}">
+                                            <a href="/presence_reports" class="nav-link d-flex align-items-center linkMenu">
+                                                <span class="ms-3 d-md-inline">Presenze</span>
                                             </a>
                                         </li>
                                     </ul>

+ 105 - 52
resources/views/livewire/presence_report.blade.php

@@ -1,59 +1,114 @@
 <div class="col card--ui" id="card--dashboard">
-    
+
     <a class="btn--ui lightGrey" href="/settings?type=corsi"><i class="fa-solid fa-arrow-left"></i></a><br>
 
-    <header id="title--section" style="display:none !important"  class="d-flex align-items-center justify-content-between">
+    <header id="title--section" style="display:none !important" class="d-flex align-items-center justify-content-between">
         <div class="title--section_name d-flex align-items-center justify-content-between">
             <i class="ico--ui title_section utenti me-2"></i>
             <h2 class="primary">Presenze</h2>
         </div>
     </header>
 
-    <br><br>
-    <a wire:click="prev()"> < </a>&nbsp;&nbsp;&nbsp;{{date("d/m/Y", strtotime($date))}}&nbsp;&nbsp;&nbsp;<a wire:click="next()"> > </a>
+    <br>
+
+    <div class="row">
+        <div class="col-auto">
+            <a class="btn--ui btn-primary" style="cursor:pointer;" wire:click="today()">Oggi</a>
+        </div>
+        <div class="col d-flex justify-content-center align-items-center gap-4">
+            <a style="cursor:pointer;" wire:click="prev()">
+                <i class="fa-solid fa-chevron-left"></i>
+            </a>
+            @php
+                $date_title = \Illuminate\Support\Carbon::parse($date)->locale('it-IT')->translatedFormat("j F Y");
+            @endphp
+            <h4 class="text-uppercase m-0">{{$date_title}}</h4>
+            <a style="cursor:pointer;" wire:click="next()">
+                <i class="fa-solid fa-chevron-right"></i>
+            </a>
+        </div>
+        <div class="col-auto">
+            <a class="btn--ui btn-primary" style="cursor:pointer;">Alert assenze</a>
+        </div>
+    </div>
+
     <br><br>
 
     <div class="row">
-        <div class="col-3">
-            Corso<br>
+        <div class="col-lg-3 col-md-12 d-flex gap-3 align-items-center mb-3">
+            <label class="form-label fw-medium text-uppercase mb-0" for="course_id">Corso</label>
+            <select wire:model="course_id" id="course_id" class="form-select">
+                <option value=""></option>
+                @foreach($courses as $course)
+                <option value="{{$course->id}}">{{$course->name}}
+                @endforeach
+            </select>
         </div>
-        <div class="col-3">
-            Orario<br>
+        <div class="col-auto d-flex gap-3 align-items-center mb-3">
+            <label for="from" class="form-label fw-medium text-uppercase mb-0" style="white-space:nowrap;">Ora inizio</label>
+            <select wire:model="from" class="form-select" id="from" style="width: fit-content">
+                <option value=""></option>
+                @for($c=6;$c<=23;$c++)
+                    <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00:00">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00</option>
+                    <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30:00">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30</option>
+                @endfor
+            </select>
+        </div>
+        <div class="col-auto d-flex gap-3 align-items-center mb-3">
+            <label for="to" class="form-label fw-medium text-uppercase mb-0" style="white-space:nowrap;">Ora fine</label>
+            <select wire:model="to" class="form-select" id="to" style="width: fit-content">
+                <option value=""></option>
+                @for($c=6;$c<=23;$c++)
+                    <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00:59">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00</option>
+                    <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30:59">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30</option>
+                @endfor
+            </select>
         </div>
-        <div class="col-3">
-            Campo<br>
-            <select wire:model="court_id">
+        <div class="col-lg-2 col-md-12 d-flex gap-3 align-items-center mb-3">
+            <label class="form-label fw-medium text-uppercase mb-0" for="court_id">Campo</label>
+            <select wire:model="court_id" id="court_id" class="form-select">
                 <option value=""></option>
                 @foreach($courts as $court)
-                    <option value="{{$court->id}}">{{$court->name}}
+                <option value="{{$court->id}}">{{$court->name}}
                 @endforeach
             </select>
         </div>
-        <div class="col-3">
-            Istruttore<br>
+        <div class="col-lg-3 col-md-12 d-flex gap-3 align-items-center mb-3">
+            <label class="form-label fw-medium text-uppercase mb-0" for="instructor_id">Istruttore</label>
+            <select wire:model="instructor_id" id="instructor_id" class="form-select">
+                <option value=""></option>
+                @foreach($instructors as $instructor)
+                <option value="{{$instructor->id}}">{{$instructor->name}}
+                @endforeach
+            </select>
         </div>
     </div>
 
     <br><br>
 
     @foreach($records as $course => $records)
-        <h3>{{$course}}</h3>
-        @foreach($records as $time => $presences)
+    <div class="row mb-5">
+        <div class="col-12 mb-3">
+            <h3 class="primary">{{$course}}</h3>
+        </div>
+        <div class="col-12 mb-4">
+            @foreach($records as $time => $presences)
             <div class="row">
-                <div class="col-2">
-                    {{$time}}
-                </div>
-                <div class="col-10">
-                    <table width="100%">
-                        <tr>
-                            <td>Cognome</td>
-                            <td>Nome</td>
-                            <td>Campo</td>
-                            <td>Istruttore</td>
-                            <td>Stato</td>
-                            <td>Motivazione</td>
-                        </tr>
-                        @foreach($presences as $presence)
+                <div class="col-1 align-items-center d-flex fs-5 fw-bold justify-content-center">{{$time}}</div>
+                <div class="col-11">
+                    <table class="report-table">
+                        <thead>
+                            <tr>
+                                <td>Cognome</td>
+                                <td>Nome</td>
+                                <td>Campo</td>
+                                <td>Istruttore</td>
+                                <td>Stato</td>
+                                <td>Motivazione</td>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            @foreach($presences as $presence)
                             <tr>
                                 <td>{{$presence["last_name"]}}</td>
                                 <td>{{$presence["first_name"]}}</td>
@@ -62,36 +117,34 @@
                                 <td>{!!$presence["status"]!!}</td>
                                 <td>{{$presence["motivation"]}}</td>
                             </tr>
-                        @endforeach
+                            @endforeach
+                        </tbody>
                     </table>
                 </div>
-            </div>            
-            <hr>
+            </div>
         @endforeach
-        <hr>
+        </div>
+    </div>
     @endforeach
-    
+
 </div>
 
-@push('scripts')
-    <link href="/css/datatables.css" rel="stylesheet" />
-    <script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
-    <script src="/assets/js/datatables.js"></script>
-    <script src="https://cdn.datatables.net/buttons/3.0.2/js/buttons.dataTables.js"></script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
+@push('css')
+<link href="/css/presence_report.css" rel="stylesheet" />
 @endpush
 
 @push('scripts')
-    <script>
-
-        $(document).ready(function() {
-            
-        } );
-
-        
-
-    </script>
+<link href="/css/datatables.css" rel="stylesheet" />
+<script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
+<script src="/assets/js/datatables.js"></script>
+<script src="https://cdn.datatables.net/buttons/3.0.2/js/buttons.dataTables.js"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
 @endpush
 
+@push('scripts')
+<script>
+    $(document).ready(function() {});
+</script>
+@endpush