Explorar el Código

dashboard - visualizzazione corsi odierni + corsi attivi + abbonamenti attivi + calcolo corsi con più iscritti

ferrari hace 4 semanas
padre
commit
b54479dd18

+ 162 - 117
app/Http/Livewire/Dashboard.php

@@ -32,6 +32,10 @@ class Dashboard extends Component
     public $paid = 0;
 
     public $courses = [];
+    public $active_member_courses = [];
+    public $active_member_courses_count = 0;
+    public $active_courses = 0;
+    public $active_subscriptions = 0;
     public $fields = [];
     public $recentUsers = [];
     public $recentTransactions = [];
@@ -442,130 +446,167 @@ class Dashboard extends Component
                 'today_name' => $todayName
             ]);
 
-            $memberCourses = \App\Models\MemberCourse::with(['course.level', 'course.frequency', 'member'])
-                ->whereIn('status', [0, 1])
-                ->whereHas('course', function ($query) {
-                    $query->whereNotNull('when');
-                })
-                ->get();
-
-            Log::info('Total member courses found', [
-                'count' => $memberCourses->count()
-            ]);
-
-            $activeCourses = $memberCourses->filter(function ($memberCourse) use ($todayName) {
-                try {
-                    $whenData = json_decode($memberCourse->course->when, true);
-
-                    if (!is_array($whenData)) {
-                        return false;
-                    }
-
-                    foreach ($whenData as $schedule) {
-                        if (
-                            isset($schedule['day']) &&
-                            is_array($schedule['day']) &&
-                            in_array($todayName, $schedule['day'])
-                        ) {
-                            return true;
-                        }
-                    }
-                } catch (\Exception $e) {
-                    Log::debug('Error parsing course schedule', [
-                        'member_course_id' => $memberCourse->id,
-                        'course_id' => $memberCourse->course->id,
-                        'when' => $memberCourse->course->when,
-                        'error' => $e->getMessage()
-                    ]);
-                }
-                return false;
-            });
-
-            Log::info('Active courses found for today', [
-                'count' => $activeCourses->count(),
-                'course_ids' => $activeCourses->pluck('course.id')->toArray()
-            ]);
-
-            $this->courses = $activeCourses->map(function ($memberCourse) use ($todayName) {
-                $whenData = json_decode($memberCourse->course->when, true);
-
-                Log::debug('Processing course schedule', [
-                    'member_course_id' => $memberCourse->id,
-                    'course_id' => $memberCourse->course->id,
-                    'course_name' => $memberCourse->course->name,
-                    'when_data' => $whenData,
-                    'looking_for_day' => $todayName
-                ]);
-
-                $todaySchedule = null;
-
-                if (is_array($whenData)) {
-                    foreach ($whenData as $schedule) {
-                        if (
-                            isset($schedule['day']) &&
-                            is_array($schedule['day']) &&
-                            in_array($todayName, $schedule['day'])
-                        ) {
-                            $todaySchedule = $schedule;
-                            Log::debug('Found matching schedule', [
-                                'schedule' => $schedule,
-                                'course_id' => $memberCourse->course->id
-                            ]);
-                            break;
-                        }
+            // $memberCourses = \App\Models\MemberCourse::with(['course.level', 'course.frequency', 'member'])
+            //     ->whereIn('status', [0, 1])
+            //     ->whereHas('course', function ($query) {
+            //         $query->whereNotNull('when');
+            //     })
+            //     ->get();
+
+            // Log::info('Total member courses found', [
+            //     'count' => $memberCourses->count()
+            // ]);
+
+            // $activeCourses = $memberCourses->filter(function ($memberCourse) use ($todayName) {
+            //     try {
+            //         $whenData = json_decode($memberCourse->course->when, true);
+
+            //         if (!is_array($whenData)) {
+            //             return false;
+            //         }
+
+            //         foreach ($whenData as $schedule) {
+            //             if (
+            //                 isset($schedule['day']) &&
+            //                 is_array($schedule['day']) &&
+            //                 in_array($todayName, $schedule['day'])
+            //             ) {
+            //                 return true;
+            //             }
+            //         }
+            //     } catch (\Exception $e) {
+            //         Log::debug('Error parsing course schedule', [
+            //             'member_course_id' => $memberCourse->id,
+            //             'course_id' => $memberCourse->course->id,
+            //             'when' => $memberCourse->course->when,
+            //             'error' => $e->getMessage()
+            //         ]);
+            //     }
+            //     return false;
+            // });
+
+            // Log::info('Active courses found for today', [
+            //     'count' => $activeCourses->count(),
+            //     'course_ids' => $activeCourses->pluck('course.id')->toArray()
+            // ]);
+
+            // $this->courses = $activeCourses->map(function ($memberCourse) use ($todayName) {
+            //     $whenData = json_decode($memberCourse->course->when, true);
+
+            //     Log::debug('Processing course schedule', [
+            //         'member_course_id' => $memberCourse->id,
+            //         'course_id' => $memberCourse->course->id,
+            //         'course_name' => $memberCourse->course->name,
+            //         'when_data' => $whenData,
+            //         'looking_for_day' => $todayName
+            //     ]);
+
+            //     $todaySchedule = null;
+
+            //     if (is_array($whenData)) {
+            //         foreach ($whenData as $schedule) {
+            //             if (
+            //                 isset($schedule['day']) &&
+            //                 is_array($schedule['day']) &&
+            //                 in_array($todayName, $schedule['day'])
+            //             ) {
+            //                 $todaySchedule = $schedule;
+            //                 Log::debug('Found matching schedule', [
+            //                     'schedule' => $schedule,
+            //                     'course_id' => $memberCourse->course->id
+            //                 ]);
+            //                 break;
+            //             }
+            //         }
+            //     }
+
+            //     if (!$todaySchedule) {
+            //         Log::debug('No matching schedule found for today', [
+            //             'course_id' => $memberCourse->course->id,
+            //             'when_data' => $whenData
+            //         ]);
+            //         return null;
+            //     }
+
+            //     $days = implode('-', array_map('ucfirst', $todaySchedule['day']));
+            //     $course = $memberCourse->course;
+
+            //     $courseName = $course->name ?? 'Corso Sconosciuto';
+            //     $levelName = $course->level?->name ?? '';
+            //     $frequencyName = $course->frequency?->name ?? '';
+            //     $typeName = $course->getFormattedTypeField() ?? '';
+
+            //     $fullCourseName = $course->getDetailsName();
+
+            //     return [
+            //         'time' => $todaySchedule['from'] . ' - ' . $todaySchedule['to'],
+            //         'course_name' => $courseName,
+            //         'full_name' => $fullCourseName,
+            //         'level_name' => $levelName,
+            //         'type_name' => $typeName,
+            //         'frequency_name' => $frequencyName,
+            //         'days' => $days,
+            //         'type' => $course->type ?? 'Standard',
+            //         'from_time' => $todaySchedule['from'],
+            //         'course_id' => $course->id,
+            //         'member_course_id' => $memberCourse->id
+            //     ];
+            // })->filter()->unique('course_id')->values();
+
+            // $sortedCourses = $this->courses->sortBy('from_time')->take(5)->values();
+
+            // Log::info('Courses sorted by time', [
+            //     'sorted_courses' => $sortedCourses->map(function ($course) {
+            //         return [
+            //             'time' => $course['time'],
+            //             'from_time' => $course['from_time'],
+            //             'course_name' => $course['course_name'],
+            //             'course_id' => $course['course_id']
+            //         ];
+            //     })->toArray()
+            // ]);
+
+            // $this->courses = $sortedCourses->map(function ($course) {
+            //     unset($course['from_time'], $course['member_course_id'], $course['course_id']);
+            //     return $course;
+            // })->toArray();
+
+            $now = date('Y-m-d');
+            $day = substr(Carbon::now()->locale('it_IT')->dayName, 0, 3);
+            $this->courses = \App\Models\Course::where('enabled', true)->where('date_from', '<=', $now)->where('date_to', '>=', $now)->whereJsonContains('when', ['day' => $day])->get()->map(function ($t) use ($day) {
+                $when = json_decode($t->when, true);
+                $time = '';
+                foreach ($when as $w) {
+                    if (in_array($day, $w['day'])) {
+                        $time = $w['from'] . ' - ' . $w['to'];
                     }
                 }
-
-                if (!$todaySchedule) {
-                    Log::debug('No matching schedule found for today', [
-                        'course_id' => $memberCourse->course->id,
-                        'when_data' => $whenData
-                    ]);
-                    return null;
-                }
-
-                $days = implode('-', array_map('ucfirst', $todaySchedule['day']));
-                $course = $memberCourse->course;
-
-                $courseName = $course->name ?? 'Corso Sconosciuto';
-                $levelName = $course->level?->name ?? '';
-                $frequencyName = $course->frequency?->name ?? '';
-                $typeName = $course->getFormattedTypeField() ?? '';
-
-                $fullCourseName = $course->getDetailsName();
-
                 return [
-                    'time' => $todaySchedule['from'] . ' - ' . $todaySchedule['to'],
-                    'course_name' => $courseName,
-                    'full_name' => $fullCourseName,
-                    'level_name' => $levelName,
-                    'type_name' => $typeName,
-                    'frequency_name' => $frequencyName,
-                    'days' => $days,
-                    'type' => $course->type ?? 'Standard',
-                    'from_time' => $todaySchedule['from'],
-                    'course_id' => $course->id,
-                    'member_course_id' => $memberCourse->id
+                    'full_name' => $t->getDetailsName(),
+                    'course_name' => ($t->discipline?->name ? $t->discipline->name . " - " : "") . $t->name,
+                    'time' => $time,
                 ];
-            })->filter()->unique('course_id')->values();
+            })->sortBy([['time', 'asc'], ['course_name', 'asc']], SORT_NATURAL)->toArray();
+            $this->courses = array_values($this->courses);
 
-            $sortedCourses = $this->courses->sortBy('from_time')->take(5)->values();
+            $member_courses = \App\Models\MemberCourse::where('date_from', '<=', $now)->where('date_to', '>=', $now)->get();
+            foreach ($member_courses as $member_course) {
+                if (!isset($this->active_member_courses[$member_course->course_id])) {
+                    $this->active_member_courses[$member_course->course_id] = ['name' => $member_course->course->getDetailsName(), 'count' => 0];
+                }
+                $this->active_member_courses[$member_course->course_id]['count']++;
+                $this->active_member_courses_count++;
+            }
+            usort($this->active_member_courses, function ($a, $b) {
+                if ($a['count'] == $b['count']) {
+                    return strcmp($a['name'], $b['name']);
+                }
+                return $a['count'] < $b['count'];
+            });
 
-            Log::info('Courses sorted by time', [
-                'sorted_courses' => $sortedCourses->map(function ($course) {
-                    return [
-                        'time' => $course['time'],
-                        'from_time' => $course['from_time'],
-                        'course_name' => $course['course_name'],
-                        'course_id' => $course['course_id']
-                    ];
-                })->toArray()
-            ]);
+            $this->active_courses = \App\Models\Course::where('enabled', true)->where('date_from', '<=', $now)->where('date_to', '>=', $now)->count();
 
-            $this->courses = $sortedCourses->map(function ($course) {
-                unset($course['from_time'], $course['member_course_id'], $course['course_id']);
-                return $course;
-            })->toArray();
+            $this->active_subscriptions = \App\Models\MemberSubscription::where('date_from', '<=', $now)->where('date_to', '>=', $now)->count();
 
             $endTime = microtime(true);
             Log::info('Courses data loaded successfully', [
@@ -580,6 +621,10 @@ class Dashboard extends Component
                 'line' => $e->getLine()
             ]);
             $this->courses = [];
+            $this->active_member_courses = [];
+            $this->active_member_courses_count = 0;
+            $this->active_courses = 0;
+            $this->active_subscriptions = 0;
         }
     }
 

+ 7 - 1
app/Http/Livewire/Member.php

@@ -877,7 +877,13 @@ class Member extends Component
     public function loadMemberCourses()
     {
         $this->member_courses = \App\Models\MemberCourse::where('member_id', $this->dataId)->get();
-        $this->member_subscriptions = \App\Models\MemberSubscription::join('subscriptions', 'subscription_id', 'subscriptions.id')->where('member_id', $this->dataId)->orderBy('date_from', 'desc')->orderBy('date_to', 'desc')->orderBy('subscriptions.name', 'asc')->get();
+        $this->member_subscriptions = \App\Models\MemberSubscription::with('subscription')
+            ->where('member_id', $this->dataId)
+            ->orderByDesc('date_from')
+            ->orderByDesc('date_to')
+            ->get()
+            ->sortBy(fn ($item) => $item->subscription?->name)
+            ->values();
     }
 
     public function loadMemberCategories()

+ 1 - 1
public/css/new_style.css

@@ -581,7 +581,7 @@ body .dashboard-container .stat-icon {
 }
 
 body .dashboard-container .courses-list {
-    max-height: 300px;
+    max-height: 247px;
     overflow-y: auto;
 }
 

+ 19 - 10
resources/views/livewire/dashboard.blade.php

@@ -79,7 +79,7 @@
                         <div class="course-time">{{$course_time}}</div>
                         <div class="course-divider"></div>
                         <div class="course-name">{{$course['full_name'] ?? $course['course_name']}}</div>
-                        <div class="course-days">{{$course['days']}}</div>
+                        {{-- <div class="course-days">{{$course['days']}}</div> --}}
                     </div>
                     @endforeach
                 </div>
@@ -92,12 +92,21 @@
                 </div>
                 @endif
             </div>
-            <div class="dashboard-card dashboard-stat">
-                <div class="dashboard-card-header">
-                    <div class="dashboard-card-title">Corsi attivi</div>
-                    <i class="dashboard-card-icon fa-solid fa-book-open"></i>
+            <div class="d-flex flex-column gap-4">
+                <div class="dashboard-card dashboard-stat">
+                    <div class="dashboard-card-header">
+                        <div class="dashboard-card-title">Corsi attivi</div>
+                        <i class="dashboard-card-icon fa-solid fa-book-open"></i>
+                    </div>
+                    <div class="dashboard-card-value">{{$active_courses}}</div>
+                </div>
+                <div class="dashboard-card dashboard-stat">
+                    <div class="dashboard-card-header">
+                        <div class="dashboard-card-title">Abbonamenti attivi</div>
+                        <i class="dashboard-card-icon fa-solid fa-book-open"></i>
+                    </div>
+                    <div class="dashboard-card-value">{{$active_subscriptions}}</div>
                 </div>
-                <div class="dashboard-card-value">{{count($courses)}}</div>
             </div>
             
             {{-- campi e sale --}}
@@ -149,16 +158,16 @@
         <!-- Courses Participation Section -->
         <div class="dashboard-card">
             <div class="dashboard-card-title">Corsi con più iscritti</div>
-            @if(count($coursesParticipation) > 0)
+            @if(count($active_member_courses) > 0)
             <div style="padding: 20px 0 0;">
-                @foreach($coursesParticipation as $course)
+                @foreach($active_member_courses as $course)
                 <div style="margin-bottom: 30px;">
                     <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 5px;">
-                        <span style="font-weight: bold; color: var(--color-text); font-size: 13px;">{{$course['course_name']}}</span>
+                        <span style="font-weight: bold; color: var(--color-text); font-size: 13px;">{{$course['name']}}</span>
                         {{-- <span style="font-size: 12px; color: #666;">{{$course['participants']}} partecipanti</span> --}}
                     </div>
                     <div class="participation-bar">
-                        <div class="participation-fill {{$course['color']}}" style="width: {{$course['percentage']}}%"></div>
+                        <div class="participation-fill" style="width: {{($course['count'] * 100) / $active_member_courses_count}}%"></div>
                     </div>
                 </div>
                 @endforeach