Ver código fonte

abbonamenti - creazione

ferrari 2 meses atrás
pai
commit
03ddf28d1f

+ 242 - 19
app/Http/Livewire/Member.php

@@ -45,7 +45,7 @@ class Member extends Component
     public function change($type)
     {
         $this->type = $type;
-            if ($type === 'corsi' && $this->dataId > 0) {
+        if ($type === 'corsi' && $this->dataId > 0) {
             $this->loadMemberCards();
             $this->loadMemberCertificates();
             // TODO $this->checkCourseAvailability();
@@ -164,6 +164,22 @@ class Member extends Component
         'birth_date' => 'before_or_equal:today'
     ];
 
+    /** Cambi Subscription */
+    public $member_subscriptions = [];
+
+    public $subscriptions;
+    public $subscription_exist;
+    public $subscription_subscriptions;
+
+    public $subscription_id;
+    public $subscription_course_subscription_id;
+    public $subscription_price;
+    public $subscription_subscription_price;
+    public $subscription_date_from;
+    public $subscription_date_to;
+    public $subscription_notes;
+    /** END - Cambi Subscription */
+
     public function resetFields()
     {
         $this->dataId = -1;
@@ -275,6 +291,21 @@ class Member extends Component
         $this->course_level_id = '';
         $this->course_type_id = '';
         $this->course_frequency_id = '';
+
+        $this->subscription_id = null;
+        $this->resetSubscriptionFields();
+    }
+
+    public function resetSubscriptionFields()
+    {
+        $this->subscription_exist = false;
+        $this->subscription_subscriptions = [];
+        $this->subscription_course_subscription_id = null;
+        $this->subscription_price = null;
+        $this->subscription_subscription_price = null;
+        $this->subscription_date_from = null;
+        $this->subscription_date_to = null;
+        $this->subscription_notes = null;
     }
 
     public function executeMultipleAction()
@@ -375,7 +406,6 @@ class Member extends Component
             }
 
             $this->course_subscriptions = \App\Models\CourseSubscription::select('*')->whereIn('id', $course_subscription_ids)->where('enabled', true)->get();
-
         } else {
             $this->course_price = 0;
             $this->course_subscription_price = 0;
@@ -554,12 +584,15 @@ class Member extends Component
             $this->showDetailF($_GET["member_detail"]);
             $this->refreshAfter = 1;
         }
+
+        $this->subscription_id = null;
+        $this->subscriptions = \App\Models\Subscription::where('enabled', 1)->get();
     }
 
-    public function boot(){
+    public function boot()
+    {
         $this->fileService = app(\App\Services\MemberFileService::class);
         app(abstract: TenantMiddleware::class)->setupTenantConnection();
-
     }
 
     public function updated()
@@ -776,6 +809,45 @@ class Member extends Component
         }
     }
 
+    public function updatedSubscriptionId()
+    {
+        $this->resetSubscriptionFields();
+
+        if ($this->subscription_id > 0 && $this->subscription_id != 'course') {
+            $subscription = \App\Models\Subscription::findOrFail($this->subscription_id);
+            $this->subscription_subscription_price = formatPrice($subscription->subscription_price);
+
+            // Controllo se l'utente ha già l'abbonamento
+            $this->subscription_exist = \App\Models\MemberSubscription::where('subscription_id', $this->subscription_id)->where('member_id', $this->dataId)->count() > 0;
+
+            $subscription_subscription_ids = [];
+            if ($subscription->prices != null) {
+                foreach (json_decode($subscription->prices) as $z) {
+                    $subscription_subscription_ids[] = $z->course_subscription_id;
+                }
+            }
+            $this->subscription_subscriptions = \App\Models\CourseSubscription::select('*')->whereIn('id', $subscription_subscription_ids)->where('enabled', true)->get();
+        } else {
+            $this->subscription_subscription_price = 0;
+            $this->subscription_exist = false;
+        }
+    }
+
+    public function updatedSubscriptionCourseSubscriptionId() {
+        if ($this->subscription_id > 0 && $this->subscription_id != 'course') {
+            $subscription = \App\Models\Subscription::findOrFail($this->subscription_id);
+
+            if ($subscription->prices != null) {
+                foreach (json_decode($subscription->prices) as $z) {
+                    if ($z->course_subscription_id == $this->subscription_course_subscription_id) {
+                        $this->subscription_price = $z->price;
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
     public function loadMemberCards()
     {
         $this->member_cards = \App\Models\MemberCard::where('member_id', $this->dataId)->get();
@@ -784,6 +856,7 @@ 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::where('member_id', $this->dataId)->get();
     }
 
     public function loadMemberCategories()
@@ -793,7 +866,7 @@ class Member extends Component
         foreach ($categories as $category) {
             $this->member_categories[$category->category_id] = $category;
         }
-        usort($this->member_categories, function($a, $b){
+        usort($this->member_categories, function ($a, $b) {
             return strcmp($a->category->getTree(), $b->category->getTree());
         });
     }
@@ -812,7 +885,7 @@ class Member extends Component
         foreach ($this->currentMember->categories as $category) {
             $categories[$category->category_id] = $category;
         }
-        usort($categories, function($a, $b){
+        usort($categories, function ($a, $b) {
             return strcmp($a->category->getTree(), $b->category->getTree());
         });
         $this->currentMember->categories = $categories;
@@ -910,7 +983,7 @@ class Member extends Component
             $rules['email'] = 'required';
             $rules['phone'] = 'required';
         }
-        
+
         $std_rules = $rules;
         // $rules = [
         //     'first_name' => 'required',
@@ -1204,10 +1277,10 @@ class Member extends Component
                 $this->emit('setIds', $this->nation_id, $this->birth_nation_id);
 
                 $this->emit('load-select');
-                
+
                 $this->emit('load-provinces', $this->nation_id, 'provinceClass');
                 $this->emit('load-provinces', $this->birth_nation_id, 'provinceBirthClass');
-                
+
                 $this->emit('load-cities', $this->province_id, 'cityClass');
                 $this->emit('load-cities', $this->birth_province_id, 'cityBirthClass');
 
@@ -1287,7 +1360,7 @@ class Member extends Component
             $rules['phone'] = 'required';
         }
 
-        
+
         $std_rules = $rules;
         // $rules = [
         //     'first_name' => 'required',
@@ -1682,7 +1755,8 @@ class Member extends Component
                             }
                         }
                     }
-                } catch (\Throwable $e) {}
+                } catch (\Throwable $e) {
+                }
             }
 
             // Creo i pagamenti in base alla tipologia
@@ -1714,12 +1788,9 @@ class Member extends Component
                 $mms = [];
                 $mms[] = date("n", strtotime($start));
                 for ($jj = 1; $jj < $r->months; $jj++) {
-                    if (date('Ymd', strtotime("+" . $jj . " months", strtotime($start))) < date("Ymd", strtotime($this->course_date_to)))
-                    {
+                    if (date('Ymd', strtotime("+" . $jj . " months", strtotime($start))) < date("Ymd", strtotime($this->course_date_to))) {
                         $mms[] = date('n', strtotime("+" . $jj . " months", strtotime($start)));
-                    }
-                    else
-                    {
+                    } else {
                         break;
                     }
                 }
@@ -1817,10 +1888,13 @@ class Member extends Component
                 }
 
                 $this->course_subscriptions = \App\Models\CourseSubscription::select('*')->whereIn('id', $course_subscription_ids)->where('enabled', true)->get();
-                
+
                 $this->courseDataId = $memberCourse->id;
                 $this->updateCourse = true;
                 $this->addCourse = false;
+
+                $this->subscription_id = 'course';
+
                 $this->emit('setEditCorso', true);
             }
         } catch (\Exception $ex) {
@@ -1869,7 +1943,7 @@ class Member extends Component
     {
         try {
             $member_course = \App\Models\MemberCourse::find($id);
-            
+
             $category = \App\Models\Course::findOrFail($member_course->course_id);
             if ($category) {
                 if ($category->category_id > 0) {
@@ -1884,6 +1958,156 @@ class Member extends Component
         }
     }
 
+    public function storeSubscription()
+    {
+        $this->validate(['subscription_id' => 'required']);
+        try {
+            $ms = new \App\Models\MemberSubscription();
+            $ms->member_id = $this->dataId;
+            $ms->subscription_id = $this->subscription_id;
+            $ms->date_from = $this->subscription_date_from;
+            $ms->date_to = $this->subscription_date_to;
+            $ms->course_subscription_id = $this->subscription_course_subscription_id;
+            $ms->price = currencyToDouble($this->subscription_price);
+            $ms->subscription_price = currencyToDouble($this->subscription_subscription_price);
+            $ms->notes = $this->subscription_notes;
+            $ms->save();
+
+            // Creo i pagamenti in base alla tipologia
+            if ($this->subscription_course_subscription_id) {
+                try {
+                    $r = \App\Models\CourseSubscription::findOrFail($this->subscription_course_subscription_id);
+                } catch (\Throwable $e) {
+                    $r = new \App\Models\CourseSubscription();
+                }
+            }
+
+            $start = $this->subscription_date_from;
+
+            // Creo il pagamento per l'iscrizione
+            $rate = new \App\Models\Rate();
+            $rate->member_id = $this->dataId;
+            $rate->member_subscription_id = $ms->id;
+            $rate->price = currencyToDouble($this->subscription_subscription_price);
+            $rate->date = $start;
+            $rate->months = json_encode([]);
+            $rate->note = '';
+            $rate->status = 0;
+            $rate->is_subscription = true;
+            $rate->save();
+            $go = true;
+            while ($go) {
+
+                $mms = [];
+                $mms[] = date("n", strtotime($start));
+                for ($jj = 1; $jj < $r->months; $jj++) {
+                    if (date('Ymd', strtotime("+" . $jj . " months", strtotime($start))) < date("Ymd", strtotime($this->course_date_to))) {
+                        $mms[] = date('n', strtotime("+" . $jj . " months", strtotime($start)));
+                    } else {
+                        break;
+                    }
+                }
+
+                $rate = new \App\Models\Rate();
+                $rate->member_id = $this->dataId;
+                $rate->member_subscription_id = $ms->id;
+                $rate->course_subscription_id = $this->subscription_course_subscription_id;
+                $rate->price = currencyToDouble($this->subscription_price);
+                $rate->date = $start;
+                $rate->months = json_encode($mms);
+                $rate->note = '';
+                $rate->status = 0;
+                $rate->save();
+
+                $start = date('Y-m-d', strtotime("+" . $r->months . " months", strtotime($start)));
+
+                if ($start > $this->course_date_to || $r->months == 0) {
+                    $go = false;
+                    break;
+                }
+            }
+
+            session()->flash('success, Abbonamento creato');
+            $this->resetCourseFields();
+            $this->addCourse = false;
+            $this->emit('setEditCorso', false);
+        } catch (\Exception $ex) {
+            session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
+        }
+    }
+
+    public function editSubscription($id)
+    {
+        try {
+            $memberSubscription = \App\Models\MemberSubscription::findOrFail($id);
+            if (!$memberSubscription) {
+                session()->flash('error', 'Abbonamento non trovato');
+            } else {
+                $this->subscription_id = $memberSubscription->subscription_id;
+
+                $subscription = \App\Models\Subscription::findOrFail($this->subscription_id);
+
+                $this->subscription_date_from = $memberSubscription->date_from;
+                $this->subscription_date_to = $memberSubscription->date_to;
+                $this->subscription_course_subscription_id = $memberSubscription->course_subscription_id;
+                $this->subscription_price = formatPrice($memberSubscription->price);
+                $this->subscription_subscription_price = formatPrice($memberSubscription->subscription_price);
+                $this->subscription_notes = $memberSubscription->notes;
+
+                $subscription_subscription_ids = [];
+                if ($subscription->prices != null) {
+                    foreach (json_decode($subscription->prices) as $z) {
+                        $subscription_subscription_ids[] = $z->course_subscription_id;
+                    }
+                }
+
+                $this->subscription_subscriptions = \App\Models\CourseSubscription::select('*')->whereIn('id', $subscription_subscription_ids)->where('enabled', true)->get();
+
+                $this->courseDataId = $memberSubscription->id;
+                $this->updateCourse = true;
+                $this->addCourse = false;
+
+                $this->emit('setEditCorso', true);
+            }
+        } catch (\Exception $ex) {
+            session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
+        }
+    }
+
+    public function updateSubscription()
+    {
+        $this->validate(['subscription_id' => 'required']);
+        try {
+            \App\Models\MemberSubscription::whereId($this->courseDataId)->update([
+                'member_id' => $this->dataId,
+                'subscription_id' => $this->subscription_id,
+                'date_from' => $this->subscription_date_from,
+                'date_to' => $this->subscription_date_to,
+                'course_subscription_id' => $this->subscription_course_subscription_id,
+                'price' => currencyToDouble($this->subscription_price),
+                'subscription_price' => currencyToDouble($this->subscription_subscription_price),
+                'notes' => $this->subscription_notes,
+            ]);
+            session()->flash('success', 'Abbonamento aggiornato');
+            $this->resetCourseFields();
+            $this->updateCourse = false;
+            $this->emit('setEditCorso', false);
+        } catch (\Exception $ex) {
+            session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
+        }
+    }
+
+    public function deleteSubscription($id)
+    {
+        try {
+            $member_subscription = \App\Models\MemberSubscription::find($id);
+            $member_subscription->delete();
+            session()->flash('success', "Abbonamento eliminato");
+        } catch (\Exception $e) {
+            session()->flash('error', 'Errore (' . $e->getMessage() . ')');
+        }
+    }
+
     public function addRow()
     {
         $this->course_when[] = array('day' => array(), 'from' => '', 'to' => '');
@@ -2434,7 +2658,6 @@ class Member extends Component
             session()->flash('success', 'Membro archiviato con successo');
 
             $this->emit('reload');
-
         } catch (\Exception $e) {
             session()->flash('error', 'Errore durante l\'archiviazione: ' . $e->getMessage());
             Log::error('Archive member error', [

+ 37 - 21
app/Http/Livewire/Rate.php

@@ -15,8 +15,11 @@ class Rate extends Component
 
     public $member_id = 0;
     public $member_course_id = 0;
+    public $member_subscription_id = 0;
+    public $rate_from = 'course';
 
     public $mc = null;
+    public $ms = null;
 
     public $filterStatus = '';
     public $hasFilter = false;
@@ -65,6 +68,7 @@ class Rate extends Component
         // Load members for the dropdown
         $this->member_id = isset($_GET["member_id"]) ? $_GET["member_id"] : 0;
         $this->member_course_id = isset($_GET["member_course_id"]) ? $_GET["member_course_id"] : 0;
+
         if ($this->member_id > 0 && $this->member_course_id > 0)
         {
             $this->mc = \App\Models\MemberCourse::findOrFail($this->member_course_id);
@@ -89,34 +93,47 @@ class Rate extends Component
             }
 
             $this->course_subscriptions = \App\Models\CourseSubscription::select('*')->whereIn('id', $course_subscription_ids)->where('enabled', true)->get();
+
+            $this->rate_from = 'course';
         }
 
-        //$this->course_subscriptions = \App\Models\CourseSubscription::select('*')->where('enabled', true)->get();
+        $this->member_subscription_id = isset($_GET["member_subscription_id"]) ? $_GET["member_subscription_id"] : 0;
+        if ($this->member_id > 0 && $this->member_subscription_id > 0)
+        {
+            $this->ms = \App\Models\MemberSubscription::findOrFail($this->member_subscription_id);
+            $this->detail = $this->ms->member->first_name . " " . $this->ms->member->last_name;
 
+            $this->price_list = [];
+            $s = $this->ms->subscription;
+            if ($s->prices != null)
+            {
+                foreach(json_decode($s->prices) as $z)
+                {
+                    $this->price_list[$z->course_subscription_id] = $z->price;
+                }
+            }
 
+            $course_subscription_ids = [];
+            if ($s->prices != null) {
+                foreach (json_decode($s->prices) as $z) {
+                    if ($z->price > 0)
+                        $course_subscription_ids[] = $z->course_subscription_id;
+                }
+            }
+
+            $this->course_subscriptions = \App\Models\CourseSubscription::select('*')->whereIn('id', $course_subscription_ids)->where('enabled', true)->get();
+            
+            $this->rate_from = 'subscription';
+        }
     }
 
     public function render()
     {
-
-        /*if ($this->hasFilter)
-        {
-            $r = \App\Models\Receipt::with('member');
-            if ($this->filterStatus != '')
-                $r = $r->where('status', $this->filterStatus);
-            if ($this->filterFrom != '')
-                $r = $r->where('date', '>=', $this->filterFrom);
-            if ($this->filterTo != '')
-                $r = $r->where('date', '<=', $this->filterTo);
-            if ($this->filteredMemberId != '')
-                $r = $r->where('member_id', $this->filteredMemberId);
-
-            $this->records = $r->get();
-        }
-        else
-        {*/
+        if ($this->member_id > 0 && $this->member_course_id > 0) {
             $this->records = \App\Models\Rate::with('member')->where('member_course_id', $this->member_course_id)->where('member_id', $this->member_id)->orderBy('date')->get();
-        //}
+        } elseif ($this->member_id > 0 && $this->member_subscription_id > 0) {
+            $this->records = \App\Models\Rate::with('member')->where('member_subscription_id', $this->member_subscription_id)->where('member_id', $this->member_id)->orderBy('date')->get();
+        }
 
         $this->disabled = [];
         foreach($this->records as $r)
@@ -126,8 +143,6 @@ class Rate extends Component
             }
         }
 
-        //$this->emit('load-data-table');
-
         return view('livewire.rate');
     }
 
@@ -171,6 +186,7 @@ class Rate extends Component
                     $rate = new \App\Models\Rate();
                     $rate->member_id = $this->member_id;
                     $rate->member_course_id = $this->member_course_id;
+                    $rate->member_subscription_id = $this->member_subscription_id;
                     $rate->course_subscription_id = $this->course_subscription_id;
                     $rate->price = currencyToDouble($this->price);
                     $rate->date = $this->date;

+ 92 - 12
app/Http/Livewire/RecordIN.php

@@ -50,7 +50,9 @@ class RecordIN extends Component
     }
 
     public $courseId = 0;
+    public $subscriptionId = 0;
     public $course = null;
+    public $subscription = null;
     public $rateId = 0;
     public $months = array();
 
@@ -75,7 +77,7 @@ class RecordIN extends Component
 
     public $currentReceip;
 
-    public $filterMember = 0, $filterPaymentMethod = 0, $filterCausals = 0, $fitlerCourses = 0, $filterFrom = '', $filterTo = '', $filterCommercial = 0;
+    public $filterMember = 0, $filterPaymentMethod = 0, $filterCausals = 0, $filterCourses = 0, $filterFrom = '', $filterTo = '', $filterCommercial = 0;
 
     public $hasFilter = false;
 
@@ -101,6 +103,7 @@ class RecordIN extends Component
 
     public $causals = array();
     public $courses = array();
+    public $subscriptions = array();
     public $payments = array();
     public $members = array();
     public $vats = array();
@@ -171,6 +174,9 @@ class RecordIN extends Component
             if (isset($row['course']) && is_array($row['course']) && isset($row['course']['id'])) {
                 $this->rows[$i]['course'] = \App\Models\Course::find($row['course']['id']);
             }
+            if (isset($row['subscription']) && is_array($row['subscription']) && isset($row['subscription']['id'])) {
+                $this->rows[$i]['subscription'] = \App\Models\Subscription::find($row['subscription']['id']);
+            }
         }
     }
 
@@ -268,11 +274,12 @@ class RecordIN extends Component
         $this->currentReceip = null;
         $this->parent = '';
         $this->courseId = 0;
+        $this->subscriptionId = 0;
         $this->rateId = 0;
         $this->backToRates = false;
         $this->months = array();
         $this->rows = array();
-        $this->rows[] = array('causal_id' => isset($_GET["causalId"]) ? $_GET["causalId"] : null, 'course_id' => null, 'course' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0, 'sconto' => 0);
+        $this->rows[] = array('causal_id' => isset($_GET["causalId"]) ? $_GET["causalId"] : null, 'course_id' => null, 'course' => null, 'subscription_id' => null, 'subscription' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0, 'sconto' => 0);
         $this->corrispettivo = [];
         $this->emit('load-data-table');
     }
@@ -348,6 +355,13 @@ class RecordIN extends Component
         }
     }
 
+    public function getSubscriptions($records, $indentation)
+    {
+        foreach ($records as $record) {
+            $this->subscriptions[] = array('id' => $record->id, 'name' => $record->name, 'text' => $record->name, 'level' => $indentation);
+        }
+    }
+
     public function mount()
     {
 
@@ -357,6 +371,7 @@ class RecordIN extends Component
 
         $this->causals = array();
         $this->courses = array();
+        $this->subscriptions = array();
 
         $this->multiMonthFrom = date("n");
         $this->multiYearFrom = date("Y");
@@ -370,6 +385,7 @@ class RecordIN extends Component
         $this->getCausale(\App\Models\Causal::select('id', 'name')->where('parent_id', null)->where('type', 'IN')->get(), 0);
 
         $this->getCourses(\App\Models\Course::where('parent_id', null)->get(), 0);
+        $this->getSubscriptions(\App\Models\Subscription::get(), 0);
 
         //$this->buildTree(\App\Models\Causal::all(), null);
 
@@ -404,13 +420,22 @@ class RecordIN extends Component
                 $this->edit($_GET["id"]);
             }
             $count = 0;
-            if (isset($_GET["courseId"])) {
+            if (isset($_GET["courseId"]) && $_GET["courseId"] > 0) {
+                $this->fromCourse = true;
                 $this->courseId = $_GET["courseId"];
                 $mc = \App\Models\MemberCourse::findOrFail($this->courseId);
                 $this->course = \App\Models\Course::findOrFail($mc->course_id);
                 $this->rows[0]['course_id'] = $this->course->id;
                 $this->rows[0]['course'] = $this->course;
             }
+            if (isset($_GET["subscriptionId"]) && $_GET["subscriptionId"] > 0) {
+                $this->fromCourse = true;
+                $this->subscriptionId = $_GET["subscriptionId"];
+                $ms = \App\Models\MemberSubscription::findOrFail($this->subscriptionId);
+                $this->subscription = \App\Models\Subscription::findOrFail($ms->subscription_id);
+                $this->rows[0]['subscription_id'] = $this->subscription->id;
+                $this->rows[0]['subscription'] = $this->subscription;
+            }
             if (isset($_GET["rateId"])) {
                 $this->rateId = $_GET["rateId"];
             }
@@ -492,21 +517,38 @@ class RecordIN extends Component
             if (isset($_GET["createSubscription"]) && $_GET["createSubscription"] == 1) {
 
                 $this->createSubscription = 1;
-                $this->courseId = $_GET["courseId"];
-                if ($this->courseId) {
+
+                if (isset($_GET["courseId"]) && $_GET["courseId"] > 0) {
+                    $this->courseId = $_GET["courseId"];
+                }
+                if (isset($_GET["subscriptionId"]) && $_GET["subscriptionId"] > 0) {
+                    $this->subscriptionId = $_GET["subscriptionId"];
+                }
+
+                if ($this->courseId && $this->courseId > 0) {
                     $mc = \App\Models\MemberCourse::findOrFail($this->courseId);
                     $this->course = \App\Models\Course::findOrFail($mc->course_id);
                 }
+                if ($this->subscriptionId && $this->subscriptionId > 0) {
+                    $ms = \App\Models\MemberSubscription::findOrFail($this->subscriptionId);
+                    $this->subscription = \App\Models\Subscription::findOrFail($ms->subscription_id);
+                }
                 $this->rateId = $_GET["rateId"];
                 $price = $_GET["subscription_price"] / 100 * 100;
                 $this->refreshAfter = 1;
                 if ($count == 1)
-                    $this->rows[] = array('causal_id' => null, 'course_id' => null, 'course' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0);
+                    $this->rows[] = array('causal_id' => null, 'course_id' => null, 'course' => null, 'subscription_id' => null, 'subscription' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0);
                 $this->rows[$count]["causal_id"] = null;
                 $this->rows[$count]["course_id"] = $this->course->id ?? null;
                 $this->rows[$count]["course"] = $this->course ?? null;
+                $this->rows[$count]["subscription_id"] = $this->subscription->id ?? null;
+                $this->rows[$count]["subscription"] = $this->subscription ?? null;
                 $this->rows[$count]["amount"] = formatPrice($price);
-                $this->rows[$count]["note"] = "Pagamento iscrizione " . $this->course->name;
+                $note = implode(", ", array_filter([
+                    $this->course ? $this->course->name : "",
+                    $this->subscription ? $this->subscription->name : ""
+                ]));
+                $this->rows[$count]["note"] = "Pagamento iscrizione " . $note;
                 if (isset($_GET["subCausalId"])) {
                     $this->refreshAfter = 1;
                     $this->rows[$count]["causal_id"] = $_GET["subCausalId"];
@@ -527,6 +569,7 @@ class RecordIN extends Component
         $this->filterPaymentMethod = 0;
         $this->filterCausals = 0;
         $this->filterCourses = 0;
+        $this->filterSubscriptions = 0;
         $this->filterTo = '';
         $this->filterFrom = '';
         $this->filterCommercial = 0;
@@ -592,15 +635,20 @@ class RecordIN extends Component
                         'deleted' => $this->deleted
                     ]);
                         
-                    if ($this->courseId) {
+                    if ($this->courseId && $this->courseId > 0) {
                         $mc = \App\Models\MemberCourse::findOrFail($this->courseId);
                         $this->course = \App\Models\Course::findOrFail($mc->course_id);
                     }
+                    if ($this->subscriptionId && $this->subscriptionId > 0) {
+                        $ms = \App\Models\MemberSubscription::findOrFail($this->subscriptionId);
+                        $this->subscription = \App\Models\Subscription::findOrFail($ms->subscription_id);
+                    }
 
                     \App\Models\RecordRow::create([
                         'record_id' => $record->id,
                         'causal_id' => $this->corrispettivo_causal_id,
                         'course_id' => $this->course->id ?? null,
+                        'subscription_id' => $this->subscription->id ?? null,
                         'note' => '',
                         'amount' => $price,
                         'vat_id' => null,
@@ -720,6 +768,7 @@ class RecordIN extends Component
                     'record_id' => $this->dataId,
                     'causal_id' => $row["causal_id"],
                     'course_id' => $row["course_id"],
+                    'subscription_id' => $row["subscription_id"],
                     'note' => $row["note"],
                     'amount' => $rowNet,
                     'prediscount_amount' => $rowAmount,
@@ -769,7 +818,10 @@ class RecordIN extends Component
             }
 
             if ($this->backToRates) {
-                return redirect()->to("/rates?member_id={$this->member_id}&member_course_id={$this->courseId}");
+                if ($this->courseId > 0)
+                    return redirect()->to("/rates?member_id={$this->member_id}&member_course_id={$this->courseId}");
+                if ($this->subscriptionId > 0)
+                    return redirect()->to("/rates?member_id={$this->member_id}&member_subscription_id={$this->subscriptionId}");
             }
 
             session()->flash('success', 'Movimento creato');
@@ -850,7 +902,7 @@ class RecordIN extends Component
                 $this->add = false;
 
                 $rows = \App\Models\RecordRow::where('record_id', $this->dataId)
-                    ->select('causal_id', 'course_id', 'note', 'commercial', 'when', 'amount', 'prediscount_amount', 'sconto', 'vat_id')
+                    ->select('causal_id', 'course_id', 'subscription_id', 'note', 'commercial', 'when', 'amount', 'prediscount_amount', 'sconto', 'vat_id')
                     ->get();
 
                 $this->rows = [];
@@ -873,10 +925,20 @@ class RecordIN extends Component
                         }
                     }
 
+                    $subscription = null;
+                    if ($r->subscription_id) {
+                        try {
+                            $subscription = \App\Models\Subscription::findOrFail($r->subscription_id);
+                        } catch (\Throwable $th) {
+                        }
+                    }
+
                     $this->rows[] = [
                         'causal_id' => $causalId,
                         'course_id' => $r->course_id,
                         'course' => $course,
+                        'subscription_id' => $r->subscription_id,
+                        'subscription' => $subscription,
                         'note' => $r->note,
                         'commercial' => $r->commercial,
                         'when' => json_decode($r->when),
@@ -1042,6 +1104,7 @@ class RecordIN extends Component
                     'record_id' => $this->dataId,
                     'causal_id' => $row["causal_id"],
                     'course_id' => $row["course_id"],
+                    'subscription_id' => $row["subscription_id"],
                     'note' => $row["note"],
                     'vat_id' => $row["vat_id"],
                     'amount' => $rowNet,
@@ -1070,7 +1133,10 @@ class RecordIN extends Component
             session()->flash('success', 'Movimento aggiornato');
 
             if ($this->backToRates) {
-                return redirect()->to("/rates?member_id={$this->member_id}&member_course_id={$this->courseId}");
+                if ($this->courseId > 0)
+                    return redirect()->to("/rates?member_id={$this->member_id}&member_course_id={$this->courseId}");
+                if ($this->subscriptionId > 0)
+                    return redirect()->to("/rates?member_id={$this->member_id}&member_subscription_id={$this->subscriptionId}");
             }
 
             $this->resetFields();
@@ -1164,6 +1230,19 @@ class RecordIN extends Component
                 $c->save();
             }
 
+            if ($r->member_subscription_id > 0) {
+                $months = json_decode($r->months);
+                $s = \App\Models\MemberSubscription::findOrFail($r->member_subscription_id);
+                $xxx = json_decode($s->months);
+                foreach ($xxx as $idx => $mm) {
+                    if (in_array($mm->m, $months)) {
+                        $xxx[$idx]->status = "";
+                    }
+                }
+                $s->months = json_encode($xxx);
+                $s->save();
+            }
+
             $r->deleted = true;
             $r->save();
 
@@ -1295,6 +1374,7 @@ class RecordIN extends Component
                         'receip_id' => $receipt->id,
                         'causal_id' => $row["causal_id"],
                         'course_id' => $row["course_id"],
+                        'subscription_id' => $row["subscription_id"],
                         'note' => $row["note"],
                         'vat_id' => $row["vat_id"],
                         'amount' => $rowNet,
@@ -1336,7 +1416,7 @@ class RecordIN extends Component
 
     public function addRow()
     {
-        $this->rows[] = array('causal_id' => null, 'course_id' => null, 'course' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0);
+        $this->rows[] = array('causal_id' => null, 'course_id' => null, 'course' => null, 'subscription_id' => null, 'subscription' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0);
         $this->emit('load-select');
     }
 

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

@@ -250,6 +250,7 @@ class Reports extends Component
             ->join('records', 'records_rows.record_id', '=', 'records.id')
             ->join('causals', 'records_rows.causal_id', '=', 'causals.id')
             ->leftJoin('courses', 'records_rows.course_id', '=', 'courses.id')
+            ->leftJoin('subscriptions', 'records_rows.subscription_id', '=', 'subscriptions.id')
             ->whereBetween('records.date', [$dateRange['start'], $dateRange['end']]);
 
         $query->where('records.type', 'IN');
@@ -261,13 +262,14 @@ class Reports extends Component
             'causals.name',
             'causals.parent_id',
             'courses.id as course_id',
+            'subscriptions.id as subscription_id',
             DB::raw('SUM(records_rows.amount) as total_amount')
         )
             ->where(function ($query) {
                 $query->where('causals.no_reports', '=', '0')
                     ->orWhereNull('causals.no_reports');
             })
-            ->groupBy('causals.id', 'causals.name', 'causals.parent_id', 'courses.id')
+            ->groupBy('causals.id', 'causals.name', 'causals.parent_id', 'courses.id', 'subscriptions.id')
             ->orderBy('total_amount', 'desc')
             ->limit($limit)
             ->get();
@@ -291,6 +293,10 @@ class Reports extends Component
                 $course = \App\Models\Course::find($causal->course_id);
                 $displayName .= " - " . $course->getDetailsName();
             }
+            if (isset($causal->subscription_id) && $causal->subscription_id) {
+                $subscription = \App\Models\Subscription::find($causal->subscription_id);
+                $displayName .= " - " . $subscription->name;
+            }
 
             $inData[] = [
                 'label' => $displayName,

+ 284 - 0
app/Http/Livewire/Subscription.php

@@ -0,0 +1,284 @@
+<?php
+
+namespace App\Http\Livewire;
+
+use App\Http\Middleware\TenantMiddleware;
+use Livewire\Component;
+use Illuminate\Support\Facades\Auth;
+
+class Subscription extends Component
+{
+
+    protected $listeners = ['setCausal' => 'setCausal', 'setSubscriptionCausal' => 'setSubscriptionCausal'];
+
+    public $records;
+
+    public $dataId;
+    public $update = false;
+    public $add = false;
+
+    public $name;
+    public $causal_id;
+    public $sub_causal_id;
+    public $subscription_price;
+    public $prices;
+    public $enabled;
+
+    public $msgPrices = '';
+
+    public $course_subscriptions = [];
+
+    public $typeIN = 'IN';
+    public $setSubscriptionCausal = 'setSubscriptionCausal';
+
+    protected $rules = [
+        'name' => 'required',
+        'subscription_price' => 'required|min:0|not_in:0'
+    ];
+
+    protected $messages = [
+        'name.required' => 'Il nome è obbligatorio',
+        'subscription_price.required' => 'Deve essere maggiore di zero',
+        'subscription_price.not_in' => 'Deve essere maggiore di zero',
+    ];
+
+    public function boot()
+    {
+        app(TenantMiddleware::class)->setupTenantConnection();
+    }
+
+    public function resetFields()
+    {
+        $this->name = '';
+        $this->causal_id = null;
+        $this->sub_causal_id = null;
+        $this->subscription_price = 0;
+        $this->prices = [];
+        $this->prices[] = array('course_subscription_id' => null, 'price' => 0);
+        $this->enabled = true;
+
+        $this->emit('load-data-table');
+    }
+
+
+    public function mount()
+    {
+        if (Auth::user()->level != env('LEVEL_ADMIN', 0))
+            return redirect()->to('/dashboard');
+
+        $this->course_subscriptions = \App\Models\CourseSubscription::select('*')->where('enabled', true)->get();
+    }
+
+    public function render()
+    {
+        $this->records = \App\Models\Subscription::all();
+
+        return view('livewire.subscription');
+    }
+
+    public function add()
+    {
+        $this->resetFields();
+
+        $this->add = true;
+        $this->update = false;
+
+        $this->emit('setEdit', true);
+    }
+
+    public function store()
+    {
+        $this->validate();
+        try {
+            $this->msgPrices = '';
+
+            if ($this->prices[0]['course_subscription_id'] == null)
+                $this->msgPrices = 'Devi inserire almeno un prezzo';
+
+            $subscriptions = array_column($this->prices, 'course_subscription_id');
+            $unique_subscriptions = array_unique($subscriptions);
+            if (count($subscriptions) != count($unique_subscriptions))
+                $this->msgPrices = 'Non è possibile aggiungere più volte la stessa tipologia di pagamento';
+
+            if ($this->msgPrices == '') {
+                $subscription = new \App\Models\Subscription();
+
+                $subscription->name = $this->name;
+                $subscription->subscription_price = currencyToDouble($this->subscription_price);
+                $subscription->prices = json_encode($this->prices);
+                $subscription->enabled = $this->enabled;
+
+                $causal = "PAGAMENTO ABBONAMENTO";
+                $cp = \App\Models\Causal::where('name', $causal)->first();
+                if (!$cp) {
+                    $cp = new \App\Models\Causal();
+                    $cp->name = $causal;
+                    $cp->type = "IN";
+                    $cp->parent_id = null;
+                    $cp->money = false;
+                    $cp->corrispettivo_fiscale = false;
+                    $cp->no_receipt = false;
+                    $cp->user_status = false;
+                    $cp->no_first = false;
+                    $cp->no_records = false;
+                    $cp->enabled = true;
+                    $cp->save();
+                }
+                $subscription->causal_id = $cp->id;
+
+                $causal = "PAGAMENTO ISCRIZIONE";
+                $ci = \App\Models\Causal::where('name', $causal)->first();
+                if (!$ci) {
+                    $ci = new \App\Models\Causal();
+                    $ci->name = $causal;
+                    $ci->type = "IN";
+                    $ci->parent_id = null;
+                    $ci->money = false;
+                    $ci->corrispettivo_fiscale = false;
+                    $ci->no_receipt = false;
+                    $ci->user_status = false;
+                    $ci->no_first = false;
+                    $ci->no_records = false;
+                    $ci->enabled = true;
+                    $ci->save();
+                }
+                $subscription->sub_causal_id = $ci->id;
+
+                $subscription->save();
+
+                session()->flash('success', 'Abbonamento creato');
+                $this->resetFields();
+                $this->add = false;
+                $this->emit('setEdit', false);
+            }
+        } catch (\Exception $ex) {
+            session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
+        }
+    }
+
+    public function edit($id)
+    {
+        $this->resetFields();
+
+        try {
+            $subscription = \App\Models\Subscription::findOrFail($id);
+
+            if (!$subscription) {
+                session()->flash('error', 'Abbonamento non trovato');
+            } else {
+                $this->name = $subscription->name;
+                $this->enabled = $subscription->enabled;
+                $this->causal_id = $subscription->causal_id;
+                $this->sub_causal_id = $subscription->sub_causal_id;
+                $this->subscription_price = formatPrice($subscription->subscription_price);
+                $this->prices = array();
+                if ($subscription->prices != null) {
+                    foreach (json_decode($subscription->prices) as $z) {
+                        $this->prices[] = array("course_subscription_id" => $z->course_subscription_id, "price" => $z->price);
+                    }
+                } else {
+                    $this->prices[] = array('course_subscription_id' => null, 'price' => 0);
+                }
+                $this->dataId = $subscription->id;
+                $this->update = true;
+                $this->add = false;
+            }
+            $this->emit('setEdit', true);
+        } catch (\Exception $ex) {
+            session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
+        }
+    }
+
+    public function update()
+    {
+        $this->validate();
+        try {
+            $this->msgPrices = '';
+
+            if ($this->prices[0]['course_subscription_id'] == null)
+                $this->msgPrices = 'Devi inserire almeno un prezzo';
+
+            $subscriptions = array_column($this->prices, 'course_subscription_id');
+            $unique_subscriptions = array_unique($subscriptions);
+            if (count($subscriptions) != count($unique_subscriptions))
+                $this->msgPrices = 'Non è possibile aggiungere più volte la stessa tipologia di pagamento';
+
+            if ($this->msgPrices == '') {
+                \App\Models\Subscription::whereId($this->dataId)->update([
+                    'name' => $this->name,
+                    'causal_id' => $this->causal_id,
+                    'sub_causal_id' => $this->sub_causal_id,
+                    'subscription_price' => currencyToDouble($this->subscription_price),
+                    'prices' => json_encode($this->prices),
+                    'enabled' => $this->enabled
+                ]);
+                session()->flash('success', 'Abbonamento aggiornato');
+                $this->resetFields();
+                $this->update = false;
+                $this->emit('setEdit', false);
+            }
+        } catch (\Exception $ex) {
+            session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
+        }
+    }
+
+    public function cancel()
+    {
+        $this->add = false;
+        $this->update = false;
+
+        $this->resetFields();
+
+        $this->emit('setEdit', false);
+    }
+
+    public function delete($id)
+    {
+        try {
+            \App\Models\Subscription::find($id)->delete();
+            session()->flash('success', "Abbonamento eliminato");
+
+            return redirect(request()->header('Referer'));
+        } catch (\Exception $e) {
+            session()->flash('error', 'Errore (' . $e->getMessage() . ')');
+        }
+    }
+
+    public function setCausal($id, $idx)
+    {
+        $this->causal_id = $id;
+    }
+
+    public function setSubscriptionCausal($id, $idx)
+    {
+        $this->sub_causal_id = $id;
+    }
+
+    public function duplicate($id, $isMultiple)
+    {
+        $subscription = \App\Models\Subscription::findOrFail($id);
+        $new_subscription = $subscription->replicate();
+        $new_subscription->save();
+
+        if (!$isMultiple)
+            $this->edit($new_subscription->id);
+    }
+
+    public function duplicateMultiple($ids)
+    {
+        foreach ($ids as $id) {
+            $this->duplicate($id, true);
+        }
+        return redirect()->to('/subscriptions');
+    }
+
+    public function addPrice()
+    {
+        $this->prices[] = array('course_subscription_id' => null, 'price' => 0);
+    }
+
+    public function delPrice($idx)
+    {
+        unset($this->prices[$idx]);
+    }
+}

+ 105 - 0
app/Http/Livewire/SubscriptionMember.php

@@ -0,0 +1,105 @@
+<?php
+
+namespace App\Http\Livewire;
+
+use App\Http\Middleware\TenantMiddleware;
+use Livewire\Component;
+
+class SubscriptionMember extends Component
+{
+    public $records = [];
+
+    public $subscription_id;
+    public $subscription = null;
+
+    public $filter = "";
+
+    public $filterSubscription = "";
+    public $chkCertificateType = "";
+    public $chkCertificateScadenza = 0;
+    public $fromYear = "";
+    public $toYear = "";
+    public $fromFromYear = "";
+    public $toToYear = "";
+    public $chkCard = [];
+    public $filterStatus = [];
+
+
+    public function boot()
+    {
+        app(TenantMiddleware::class)->setupTenantConnection();
+    }
+
+    public function mount($id)
+    {
+        $this->subscription_id = $id;
+        $this->subscription = \App\Models\Subscription::findOrFail($this->subscription_id);
+    }
+
+    public function render()
+    {
+        $this->filter = '';
+        $members = \App\Models\MemberSubscription::with('member');
+
+        if ($this->filterSubscription != "") {
+            $ids = \App\Models\MemberSubscription::where('subscribed', $this->filterSubscription == 1 ? true : false)->pluck('id');
+            $members = $members->whereIn('id', $ids);
+            $this->filter .= $this->filter != '' ? ', ' : '';
+            $this->filter .= "Pagata sottoscrizione: " . ($this->filterSubscription == 1 ? "SI" : "NO") . " ";
+        }
+        if ($this->chkCertificateType != "") {
+            $types = \App\Models\MemberCertificate::where('type', $this->chkCertificateType)->pluck('member_id');
+            $members = $members->whereIn('member_id', $types);
+        }
+        if ($this->chkCertificateScadenza > 0) {
+            if ($this->chkCertificateScadenza == "1")
+                $scad = \App\Models\MemberCertificate::where('expire_date', '<', date("Y-m-d"))->pluck('member_id');
+            if ($this->chkCertificateScadenza == "2")
+                $scad = \App\Models\MemberCertificate::whereBetween('expire_date', [date("Y-m-d"), date("Y-m-d", strtotime("+1 month"))])->pluck('member_id');
+            $members = $members->whereIn('member_id', $scad);
+        }
+        if ($this->fromYear != "") {
+            $m_ids = \App\Models\Member::where('birth_date', '<', date("Y-m-d", strtotime("-" . $this->fromYear . " year", time())))->pluck('id');
+            $members = $members->whereIn('member_id', $m_ids);
+        }
+        if ($this->toYear != "") {
+            $m_ids = \App\Models\Member::where('birth_date', '>', date("Y-m-d", strtotime("-" . $this->toYear . " year", time())))->pluck('id');
+            $members = $members->whereIn('member_id', $m_ids);
+        }
+        if ($this->fromFromYear != "") {
+            $m_ids = \App\Models\Member::whereYear('birth_date', '>=', $this->fromFromYear)->pluck('id');
+            $members = $members->whereIn('member_id', $m_ids);
+        }
+        if ($this->toToYear != "") {
+            $m_ids = \App\Models\Member::whereYear('birth_date', '<=', $this->toToYear)->pluck('id');
+            $members = $members->whereIn('member_id', $m_ids);
+        }
+        if (sizeof($this->chkCard) > 0) {
+            $card_ids = \App\Models\MemberCard::whereIn('card_id', $this->chkCard)->pluck('member_id');
+            $members = $members->whereIn('member_id', $card_ids);
+            $this->filter .= $this->filter != '' ? ', ' : '';
+            $this->filter .= "Tessera: ";
+            foreach ($this->chkCard as $card) {
+                $this->filter .= \App\Models\Card::findOrFail($card)->name . " ";
+            }
+        }
+
+        $aRet = [];
+        if (sizeof($this->filterStatus) > 0) {
+            foreach ($this->filterStatus as $s) {
+                foreach ($members->get() as $aaa) {
+                    $state = \App\Models\Member::findOrFail($aaa->member_id)->isActive();
+
+                    if ($state["status"] == $s)
+                        $aRet[] = $aaa;
+                }
+            }
+        } else {
+            $aRet = $members->get();
+        }
+
+        $this->records = $aRet;
+
+        return view('livewire.subscription_member');
+    }
+}

+ 16 - 0
app/Http/Livewire/SubscriptionMembers.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Http\Livewire;
+
+use Livewire\Component;
+
+class SubscriptionMembers extends Component
+{
+    public $records = [];
+
+    public function render()
+    {
+        $this->records = \App\Models\Subscription::where('enabled', true)->get();
+        return view('livewire.subscription_members');
+    }
+}

+ 52 - 0
app/Models/MemberSubscription.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class MemberSubscription extends Model
+{
+    use HasFactory;
+
+    protected $fillable = [
+        'member_id',
+        'subscription_id',
+        'date_from',
+        'date_to',
+        'price',
+        'course_subscription_id',
+        'subscription_price',
+        'notes'
+    ];
+
+    public function member()
+    {
+        return $this->belongsTo(Member::class);
+    }
+
+    public function subscription()
+    {
+        return $this->belongsTo(Subscription::class);
+    }
+
+    public function course_subscription()
+    {
+        return $this->belongsTo(CourseSubscription::class);
+    }
+
+    public function getStatus()
+    {
+        $status = 0;
+        $rates = \App\Models\Rate::where('member_subscription_id', $this->id)->orderBy('date')->get();
+        foreach($rates as $rate)
+        {
+            if ($rate->date > date("Y-m-d"))
+            {
+                break;
+            }
+            $status = $rate->status;
+        }
+        return $status;
+    }
+}

+ 6 - 1
app/Models/Rate.php

@@ -19,7 +19,8 @@ class Rate extends Model
         'note',
         'status',
         'record_id',
-        'is_subscription'
+        'is_subscription',
+        'member_subscription_id',
     ];
 
     public function member()
@@ -36,6 +37,10 @@ class Rate extends Model
     {
         return $this->belongsTo(MemberCourse::class, 'member_course_id');
     }
+    public function member_subscription()
+    {
+        return $this->belongsTo(MemberSubscription::class, 'member_subscription_id');
+    }
 
     public function course_subscription()
     {

+ 6 - 0
app/Models/ReceiptRow.php

@@ -28,6 +28,7 @@ class ReceiptRow extends Model
         'quantita',
         'prediscount_amount',
         'sconto',
+        'subscription_id',
     ];
 
     protected $casts = [
@@ -53,4 +54,9 @@ class ReceiptRow extends Model
     {
         return $this->belongsTo(Course::class);
     }
+
+    public function subscription()
+    {
+        return $this->belongsTo(Subscription::class, 'subscription_id');
+    }
 }

+ 6 - 0
app/Models/RecordRow.php

@@ -28,6 +28,7 @@ class RecordRow extends Model
         'numero_linea',
         'sconto',
         'prediscount_amount',
+        'subscription_id',
     ];
 
     public function causal()
@@ -39,5 +40,10 @@ class RecordRow extends Model
     {
         return $this->belongsTo(Course::class);
     }
+
+    public function subscription()
+    {
+        return $this->belongsTo(Subscription::class);
+    }
 }
 

+ 35 - 0
app/Models/Subscription.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Subscription extends Model
+{
+    use HasFactory;
+
+    protected $fillable = [
+        'name',
+        'causal_id',
+        'sub_causal_id',
+        'subscription_price',
+        'prices',
+        'enabled'
+    ];
+
+    public function getCount()
+    {
+        return \App\Models\MemberSubscription::where('subscription_id', $this->id)->count();
+    }
+
+    public function getCausal()
+    {
+        return $this->belongsTo(CourseSubscription::class);
+    }
+
+    public function getSubscriptionCausal()
+    {
+        return $this->belongsTo(CourseSubscription::class, 'sub_causal_id');
+    }
+}

+ 87 - 0
database/migrations/2025_11_26_132239_create_subscriptions_tables.php

@@ -0,0 +1,87 @@
+<?php
+
+use App\Database\Migrations\TenantMigration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends TenantMigration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('subscriptions', function (Blueprint $table) {
+            $table->id();
+            $table->string('name');
+            $table->unsignedBigInteger('causal_id')->nullable();
+            $table->unsignedBigInteger('sub_causal_id')->nullable();
+            $table->decimal('subscription_price', 8, 2);
+            $table->longText('prices')->nullable();
+            $table->boolean('enabled')->default(1);
+            $table->softDeletes();
+            $table->timestamps();
+
+            $table->foreign('causal_id')->nullable()->references('id')->on('causals')->onUpdate('cascade')->onDelete('cascade');
+            $table->foreign('sub_causal_id')->nullable()->references('id')->on('causals')->onUpdate('cascade')->onDelete('cascade');
+        });
+
+        Schema::table('records_rows', function (Blueprint $table) {
+            $table->unsignedBigInteger('subscription_id')->nullable();
+            $table->foreign('subscription_id')->nullable()->references('id')->on('subscriptions')->onUpdate('cascade')->onDelete('cascade');
+        });
+        Schema::table('receipts_rows', function (Blueprint $table) {
+            $table->unsignedBigInteger('subscription_id')->nullable();
+            $table->foreign('subscription_id')->nullable()->references('id')->on('subscriptions')->onUpdate('cascade')->onDelete('cascade');
+        });
+
+
+        Schema::create('member_subscriptions', function (Blueprint $table) {
+            $table->id();
+            $table->unsignedBigInteger('member_id');
+            $table->unsignedBigInteger('subscription_id');
+            $table->date('date_from')->nullable();
+            $table->date('date_to')->nullable();
+            $table->decimal('price', 8, 2);
+            $table->unsignedBigInteger('course_subscription_id')->nullable();
+            $table->decimal('subscription_price', 8, 2);
+            $table->string('notes')->nullable();
+            $table->timestamps();
+
+            $table->foreign('member_id')->nullable()->references('id')->on('members')->onUpdate('cascade')->onDelete('cascade');
+            $table->foreign('subscription_id')->nullable()->references('id')->on('subscriptions')->onUpdate('cascade')->onDelete('cascade');
+            $table->foreign('course_subscription_id')->nullable()->references('id')->on('course_subscriptions')->onUpdate('cascade')->onDelete('cascade');
+        });
+
+        Schema::table('rates', function (Blueprint $table) {
+            $table->unsignedBigInteger('member_subscription_id')->nullable();
+            $table->foreign('member_subscription_id')->nullable()->references('id')->on('member_subscriptions')->onUpdate('cascade')->onDelete('cascade');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('rates', function (Blueprint $table) {
+            $table->dropColumn('member_subscription_id');
+        });
+
+        Schema::dropIfExists('member_subscriptions');
+
+
+        Schema::table('records_rows', function (Blueprint $table) {
+            $table->dropColumn('subscription_id');
+        });
+        Schema::table('receipts_rows', function (Blueprint $table) {
+            $table->dropColumn('subscription_id');
+        });
+
+        Schema::dropIfExists('subscriptions');
+    }
+};

+ 12 - 2
resources/views/layouts/app.blade.php

@@ -228,6 +228,10 @@
                 print "Comunicazioni SMS";
             if (Request::is('email_comunications'))
                 print "Comunicazioni Email";
+            if (Request::is('subscriptions'))
+                print "Abbonamenti";
+            if (Request::is('subscription_member'))
+                print "Abbonamenti";
             @endphp
             </h3>
 
@@ -341,7 +345,7 @@
                     </div>
                     <div class="accordion-item">
                         <h2 class="accordion-header linkMenu" id="headingThree">
-                            <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="{{Request::is('course_member_one') || Request::is('course_member_two') || Request::is('course_list') || Request::is('course_member') ? 'true' : 'false'}}" aria-controls="collapseThree">
+                            <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="{{Request::is('course_member_one') || Request::is('course_member_two') || Request::is('subscription_member') || Request::is('course_list') || Request::is('course_member') ? 'true' : 'false'}}" aria-controls="collapseThree">
                                 <i class="fas fa-calendar"></i>
                                 <span>Corsi</span>
                             </button>
@@ -351,7 +355,7 @@
                         $iscritti_types[] = array('name' => 'Singoli', 'type' => 'standard');
                         $iscritti_types[] = array('name' => 'Personalizzati', 'type' => 'custom');   
                         @endphp
-                        <div id="collapseThree" class="accordion-collapse collapse {{Request::is('course_member_one') || Request::is('course_member_two') || Request::is('course_list') || Request::is('course_member') || Request::is('rates') ? 'show' : ''}}" aria-labelledby="headingThree" data-bs-parent="#accordionExample">
+                        <div id="collapseThree" class="accordion-collapse collapse {{Request::is('course_member_one') || Request::is('course_member_two') || Request::is('subscription_member') || Request::is('course_list') || Request::is('course_member') || Request::is('rates') ? '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 {{Request::is('course_member_one') || Request::is('course_member_two') || Request::is('course_member') ? "nav-item-active" : ""}}">
@@ -377,6 +381,12 @@
                                     </li>
                                     @endforeach
 
+                                    <li class="nav-item {{Request::is('subscription_member') ? "nav-item-active" : ""}}">
+                                        <a href="/subscription_member" class="nav-link d-flex align-items-center linkMenu">
+                                            <span class="ms-3 d-md-inline">Abbonamenti</span>
+                                        </a>
+                                    </li>
+
                                     @if(false)
                                         <li class="nav-item {{Request::is('course_list') ? "nav-item-active" : ""}}">
                                             <a href="/course_list" class="nav-link d-flex align-items-center linkMenu">

+ 1 - 1
resources/views/livewire/course_member_two.blade.php

@@ -9,7 +9,7 @@
 
     </header>
 
-    <a class="btn--ui lightGrey" href="/course_member_one"><i class="fa-solid fa-arrow-left"></i></a><br>
+    {{-- <a class="btn--ui lightGrey" href="/course_member_one"><i class="fa-solid fa-arrow-left"></i></a><br> --}}
 
     <section id="resume-table">
         <div class="compare--chart_wrapper d-none"></div>

+ 401 - 275
resources/views/livewire/member.blade.php

@@ -168,7 +168,7 @@
                             </div>
                         </div>
                         <div class="resume--tab_info corsi">
-                            <h2 class="title d-flex align-items-center mb-3 gap-4"><i class="fa-solid fa-chalkboard"></i>Corsi</h2>
+                            <h2 class="title d-flex align-items-center mb-3 gap-4"><i class="fa-solid fa-chalkboard"></i>Corsi e Abbonamenti</h2>
                             @foreach($currentMember->courses as $member_course)
                                 @php
                                     $course_year = date('Y', strtotime($member_course->date_from));
@@ -489,7 +489,7 @@
                             <div class="section--tab d-flex">
                                 <h4 style="cursor:pointer;{{$type == 'dati' ? 'border-bottom:2px solid var(--color-blu); color:var(--color-blu);' : ''}}" wire:click="change('dati')">Anagrafica</h4>
                                 <h4 style="cursor:pointer;{{$type == 'tesseramento' ? 'border-bottom:2px solid var(--color-blu); color:var(--color-blu);' : ''}}" wire:click="change('tesseramento')">Tesseramento</h4>
-                                <h4 style="cursor:pointer;{{$type == 'corsi' ? 'border-bottom:2px solid var(--color-blu); color:var(--color-blu);' : ''}}" wire:click="change('corsi')">Corsi</h4>
+                                <h4 style="cursor:pointer;{{$type == 'corsi' ? 'border-bottom:2px solid var(--color-blu); color:var(--color-blu);' : ''}}" wire:click="change('corsi')">Corsi e Abbonamenti</h4>
                                 <h4 style="cursor:pointer;{{$type == 'gruppi' ? 'border-bottom:2px solid var(--color-blu); color:var(--color-blu);' : ''}}" wire:click="change('gruppi')">Gruppi</h4>
                             </div>
                             <div class="row">
@@ -1064,347 +1064,462 @@
                                     @if($dataId > 0)
                                         @if(!$addCourse && !$updateCourse)
                                             @if($active["status"] != 1 && !$hasCertificate)
-                                                <div class="alert alert-info" role="alert">
-                                                    {{-- <strong>Attenzione:</strong> Per aggiungere corsi è necessario avere un tesseramento attivo o un certificato medico valido. --}}
-                                                    <strong>Info:</strong> Non sono presenti un tesseramento attivo o un certificato medico valido.
+                                                <div class="row mb-3">
+                                                    <div class="col-md-12">
+                                                        <div class="alert alert-info" role="alert">
+                                                            {{-- <strong>Attenzione:</strong> Per aggiungere corsi è necessario avere un tesseramento attivo o un certificato medico valido. --}}
+                                                            <strong>Info:</strong> Non sono presenti un tesseramento attivo o un certificato medico valido.
+                                                        </div>
+                                                    </div>
                                                 </div>
                                             @elseif($active["status"] != 1)
-                                                <div class="alert alert-info" role="alert">
-                                                    <strong>Info:</strong> Il tesseramento non è attivo, ma è presente un certificato medico valido.
+                                                <div class="row mb-3">
+                                                    <div class="col-md-12">
+                                                        <div class="alert alert-info" role="alert">
+                                                            <strong>Info:</strong> Il tesseramento non è attivo, ma è presente un certificato medico valido.
+                                                        </div>
+                                                    </div>
                                                 </div>
                                             @elseif(!$hasCertificate)
-                                                <div class="alert alert-info" role="alert">
-                                                    <strong>Info:</strong> Non è presente un certificato medico valido, ma il tesseramento è attivo.
+                                                <div class="row mb-3">
+                                                    <div class="col-md-12">
+                                                        <div class="alert alert-info" role="alert">
+                                                            <strong>Info:</strong> Non è presente un certificato medico valido, ma il tesseramento è attivo.
+                                                        </div>
+                                                    </div>
                                                 </div>
                                             @endif
-                                            <table class="table tablesaw tableHead tablesaw-stack tabella--corsi" id="tablesaw-350-2" style="min-width:800px">
-                                                <tbody id="checkall-target">
-                                                    @foreach($member_courses as $member_course)
-                                                        <tr>
-                                                            <td style="width:20%;" colspan="1">
-                                                                <b>{{$member_course->course->name}}</b><br>
-                                                            </td>
-                                                            <td style="width:20%;">
-                                                                {{$member_course->course->level->name ?? ""}}<br>
-                                                            </td>
-                                                            <td style="width:20%;">
-                                                                {{$member_course->course->frequency->name ?? ""}}<br>
-                                                            </td>
-                                                            <td style="width:20%">
-                                                                @php
-                                                                    $ok = false;
-                                                                @endphp
-                                                                @foreach(json_decode($member_course->when) as $xx => $x)
-                                                                    @if($xx > 0)
-                                                                        <br>
-                                                                    @endif
-                                                                    @foreach($x->day as $zz => $d)
-                                                                        {{$zz > 0 ? '- ' : ''}}{{$d}}
-                                                                    @endforeach
-                                                                    @if($x->from != '' && $x->to != '')
-                                                                        h {{$x->from}} - {{$x->to}}
-                                                                    @endif
-                                                                    @php
-                                                                        $ok = $x->from != '';
-                                                                    @endphp
-                                                                @endforeach
-                                                                @if(!$ok && $member_course->course->when != '')
-                                                                    @foreach(json_decode($member_course->course->when) as $xx => $x)
+                                            <div class="row">
+                                                <div class="col-md-12">
+                                                    <h4 class="text-uppercase">Abbonamenti</h4>
+                                                    @if ((is_array($member_subscriptions) && empty($member_subscriptions)) || $member_subscriptions->count() == 0)
+                                                    <div class="alert alert-warning" role="alert">
+                                                        Nessun abbonamento associato all'utente
+                                                    </div>
+                                                    @else
+                                                    <table class="table tablesaw tableHead tablesaw-stack tabella--abbonamenti" id="tablesaw-abbonamenti" style="min-width:800px">
+                                                        <tbody id="checkall-target">
+                                                            @foreach($member_subscriptions as $member_subscription)
+                                                                <tr>
+                                                                    <td style="width:30%;" colspan="1">
+                                                                        <b>{{$member_subscription->subscription->name}}</b><br>
+                                                                    </td>
+                                                                    <td style="width:40%;">
+                                                                        @if($member_subscription->notes != '')
+                                                                            <b>Note: </b>
+                                                                            {{$member_subscription->notes}}
+                                                                        @endif
+                                                                    </td>
+                                                                    <td style="text-align:right;width:15%;">
                                                                         @php
-                                                                            $ok = true;
+                                                                            $status = $member_subscription->getStatus();
                                                                         @endphp
-                                                                        @if($xx > 0)
-                                                                            <br>
-                                                                        @endif
-                                                                        @foreach($x->day as $zz => $d)
-                                                                            {{$zz > 0 ? '- ' : ''}}{{$d}}
-                                                                        @endforeach
-                                                                        @if($x->from != '')
-                                                                            h {{$x->from}} - {{$x->to}}
-                                                                        @endif
-                                                                    @endforeach
-                                                                @endif
-                                                            </td>
-                                                            <td style="text-align:right;width:5%;">
-                                                                @php
-                                                                    $status = $member_course->getStatus();
-                                                                @endphp
-                                                                <a href="/rates?member_id={{$member_course->member_id}}&member_course_id={{$member_course->id}}"><span class="badge tessera-badge {{$status == 0 ? 'due' : ($status == 1 ? 'active' : 'suspended')}}">{{$status == 0 ? 'Da pagare' : ($status == 1 ? 'Pagato' : 'Sospeso')}}</span></a>
-                                                            </td>
-                                                            <td style="text-align:right;width:15%;">
-                                                                <div class="row">
-                                                                    <div class="col-4">
-                                                                        <button style="float:left;" type="button" class="btn" wire:click="editCourse({{ $member_course->id }})" data-bs-toggle="popover"  data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Modifica"><i class="fa-regular fa-pen-to-square"></i></button>
-                                                                    </div>
-                                                                    <div class="col-4">
-                                                                        <button type="button" class="btn" onclick="confirm('Sei sicuro?') || event.stopImmediatePropagation()" wire:click="deleteCourse({{ $member_course->id }})" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Elimina"><i class="fa-regular fa-trash-can"></i></button>
-                                                                    </div>
-                                                                </div>
-                                                            </td>
-                                                            <td style="text-align:left;width:15%;padding-top:15px;">
-                                                                @if($member_course->notes != '')
-                                                                    <button type="button" class="btn" wire:click="showHideCourse({{ $member_course->id }})">
-                                                                        @if(in_array($member_course->id, $showCourse))
-                                                                            <i class="fa-solid fa-chevron-circle-up"></i>
-                                                                        @else
-                                                                            <i class="fa-solid fa-chevron-circle-down"></i>
-                                                                        @endif
-                                                                    </button>&nbsp;
-                                                                @endif
-                                                            </td>
-                                                        </tr>
-                                                        {{-- <tr>
-                                                            <td style="width:30%" colspan="2">
-                                                                {{date("d/m/Y", strtotime($member_course->date_from))}} - {{date("d/m/Y", strtotime($member_course->date_to))}}
-                                                            </td>
-                                                            <td style="width:30%"colspan="5">
-                                                                @php
-                                                                    $ok = false;
-                                                                @endphp
-                                                                @foreach(json_decode($member_course->when) as $xx => $x)
-                                                                    @if($xx > 0)
-                                                                        <br>
-                                                                    @endif
-                                                                    @foreach($x->day as $zz => $d)
-                                                                        {{$zz > 0 ? '-' : ''}}{{$d}}
-                                                                    @endforeach
-                                                                    @if($x->from != '' && $x->to != '')
-                                                                        h {{$x->from}} - {{$x->to}}
-                                                                    @endif
-                                                                    @php
-                                                                        $ok = $x->from != '';
-                                                                    @endphp
-                                                                @endforeach
-                                                                @if(!$ok && $member_course->course->when != '')
-                                                                    @foreach(json_decode($member_course->course->when) as $xx => $x)
+                                                                        <a href="/rates?member_id={{$member_subscription->member_id}}&member_subscription_id={{$member_subscription->id}}"><span class="badge tessera-badge {{$status == 0 ? 'due' : ($status == 1 ? 'active' : 'suspended')}}">{{$status == 0 ? 'Da pagare' : ($status == 1 ? 'Pagato' : 'Sospeso')}}</span></a>
+                                                                    </td>
+                                                                    <td style="text-align:right;width:15%;">
+                                                                        <div class="row">
+                                                                            <div class="col-4">
+                                                                                <button style="float:left;" type="button" class="btn" wire:click="editSubscription({{ $member_subscription->id }})" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Modifica"><i class="fa-regular fa-pen-to-square"></i></button>
+                                                                            </div>
+                                                                            <div class="col-4">
+                                                                                <button type="button" class="btn" onclick="confirm('Sei sicuro?') || event.stopImmediatePropagation()" wire:click="deleteSubscription({{ $member_subscription->id }})" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Elimina"><i class="fa-regular fa-trash-can"></i></button>
+                                                                            </div>
+                                                                        </div>
+                                                                    </td>
+                                                                </tr>
+                                                            @endforeach
+                                                        </tbody>
+                                                    </table>
+                                                    @endif
+                                                </div>
+
+                                                <div class="col-md-12 mt-5">
+                                                    <h4 class="text-uppercase">Corsi</h4>
+                                                    @if ((is_array($member_courses) && empty($member_courses)) || $member_courses->count() == 0)
+                                                    <div class="alert alert-warning" role="alert">
+                                                        Nessun corso associato all'utente
+                                                    </div>
+                                                    @else
+                                                    <table class="table tablesaw tableHead tablesaw-stack tabella--corsi" id="tablesaw-350-2" style="min-width:800px">
+                                                        <tbody id="checkall-target">
+                                                            @foreach($member_courses as $member_course)
+                                                                <tr>
+                                                                    <td style="width:20%;" colspan="1">
+                                                                        <b>{{$member_course->course->name}}</b><br>
+                                                                    </td>
+                                                                    <td style="width:20%;">
+                                                                        {{$member_course->course->level->name ?? ""}}<br>
+                                                                    </td>
+                                                                    <td style="width:20%;">
+                                                                        {{$member_course->course->frequency->name ?? ""}}<br>
+                                                                    </td>
+                                                                    <td style="width:20%">
                                                                         @php
-                                                                            $ok = true;
+                                                                            $ok = false;
                                                                         @endphp
-                                                                        @if($xx > 0)
-                                                                            <br>
-                                                                        @endif
-                                                                        @foreach($x->day as $zz => $d)
-                                                                            {{$zz > 0 ? '-' : ''}}{{$d}}
+                                                                        @foreach(json_decode($member_course->when) as $xx => $x)
+                                                                            @if($xx > 0)
+                                                                                <br>
+                                                                            @endif
+                                                                            @foreach($x->day as $zz => $d)
+                                                                                {{$zz > 0 ? '- ' : ''}}{{$d}}
+                                                                            @endforeach
+                                                                            @if($x->from != '' && $x->to != '')
+                                                                                h {{$x->from}} - {{$x->to}}
+                                                                            @endif
+                                                                            @php
+                                                                                $ok = $x->from != '';
+                                                                            @endphp
                                                                         @endforeach
-                                                                        @if($x->from != '')
-                                                                            h {{$x->from}} - {{$x->to}}
+                                                                        @if(!$ok && $member_course->course->when != '')
+                                                                            @foreach(json_decode($member_course->course->when) as $xx => $x)
+                                                                                @php
+                                                                                    $ok = true;
+                                                                                @endphp
+                                                                                @if($xx > 0)
+                                                                                    <br>
+                                                                                @endif
+                                                                                @foreach($x->day as $zz => $d)
+                                                                                    {{$zz > 0 ? '- ' : ''}}{{$d}}
+                                                                                @endforeach
+                                                                                @if($x->from != '')
+                                                                                    h {{$x->from}} - {{$x->to}}
+                                                                                @endif
+                                                                            @endforeach
                                                                         @endif
-                                                                    @endforeach
-                                                                @endif
-                                                            </td>
-                                                        </tr> --}}
-                                                        @if(in_array($member_course->id, $showCourse))
-                                                            @if(false)
-                                                                <tr>
-                                                                    <td colspan="5">
-                                                                        <a class="{{$this->getSubscriptionStatus($member_course->subscribed, $member_course->id)}}" wire:click="setCreateSubscription({{$member_course->subscribed}}, {{$member_course->id}})" style="float:none; width:150px;{{$this->getSubscriptionStatus($member_course->subscribed,$member_course->id) == 'blue' || $this->getSubscriptionStatus($member_course->subscribed,$member_course->id) == 'orange' || $this->getSubscriptionStatus($member_course->subscribed,$member_course->id) == 'yellow' ? 'cursor:pointer' : ''}}">Iscrizione</a><br>
-                                                                        <a class="{{$this->getMonthStatus(9, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(9, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(9, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Set</a>&nbsp;
-                                                                        <a class="{{$this->getMonthStatus(10, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(10, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(10, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Ott</a>&nbsp;
-                                                                        <a class="{{$this->getMonthStatus(11, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(11, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(11, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ?  'style=cursor:pointer' : ''}}>Nov</a>&nbsp;
-                                                                        <a class="{{$this->getMonthStatus(12, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(12, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(12, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ?  'style=cursor:pointer' : ''}}>Dic</a>&nbsp;
-                                                                        <a class="{{$this->getMonthStatus(1, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(1, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(1, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ?  'style=cursor:pointer' : ''}}>Gen</a>&nbsp;
-                                                                        <a class="{{$this->getMonthStatus(2, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(2, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(2, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ?  'style=cursor:pointer' : ''}}>Feb</a>&nbsp;
-                                                                        <a class="{{$this->getMonthStatus(3, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(3, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(3, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ?  'style=cursor:pointer' : ''}}>Mar</a>&nbsp;
-                                                                        <a class="{{$this->getMonthStatus(4, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(4, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(4, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Apr</a>&nbsp;
-                                                                        <a class="{{$this->getMonthStatus(5, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(5, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(5, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Mag</a>&nbsp;
-                                                                        <a class="{{$this->getMonthStatus(6, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(6, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(6, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Giu</a>&nbsp;
-                                                                        <a class="{{$this->getMonthStatus(7, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(7, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(7, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Lug</a>&nbsp;
-                                                                        <a class="{{$this->getMonthStatus(8, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(8, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(8, $member_course->months, $member_course->id) , ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Ago</a>&nbsp;
                                                                     </td>
-                                                                    <td>
-                                                                        <button type="button" class="btn" wire:click="editCourse({{ $member_course->id }})" data-bs-toggle="popover"  data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Modifica"><i class="fa-regular fa-pen-to-square"></i></button>&nbsp;
-                                                                        <button type="button" class="btn" onclick="confirm('Sei sicuro?') || event.stopImmediatePropagation()" wire:click="deleteCourse({{ $member_course->id }})" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Elimina"><i class="fa-regular fa-trash-can"></i></button>
+                                                                    <td style="text-align:right;width:5%;">
+                                                                        @php
+                                                                            $status = $member_course->getStatus();
+                                                                        @endphp
+                                                                        <a href="/rates?member_id={{$member_course->member_id}}&member_course_id={{$member_course->id}}"><span class="badge tessera-badge {{$status == 0 ? 'due' : ($status == 1 ? 'active' : 'suspended')}}">{{$status == 0 ? 'Da pagare' : ($status == 1 ? 'Pagato' : 'Sospeso')}}</span></a>
+                                                                    </td>
+                                                                    <td style="text-align:right;width:15%;">
+                                                                        <div class="row">
+                                                                            <div class="col-4">
+                                                                                <button style="float:left;" type="button" class="btn" wire:click="editCourse({{ $member_course->id }})" data-bs-toggle="popover"  data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Modifica"><i class="fa-regular fa-pen-to-square"></i></button>
+                                                                            </div>
+                                                                            <div class="col-4">
+                                                                                <button type="button" class="btn" onclick="confirm('Sei sicuro?') || event.stopImmediatePropagation()" wire:click="deleteCourse({{ $member_course->id }})" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Elimina"><i class="fa-regular fa-trash-can"></i></button>
+                                                                            </div>
+                                                                        </div>
+                                                                    </td>
+                                                                    <td style="text-align:left;width:15%;padding-top:15px;">
+                                                                        @if($member_course->notes != '')
+                                                                            <button type="button" class="btn" wire:click="showHideCourse({{ $member_course->id }})">
+                                                                                @if(in_array($member_course->id, $showCourse))
+                                                                                    <i class="fa-solid fa-chevron-circle-up"></i>
+                                                                                @else
+                                                                                    <i class="fa-solid fa-chevron-circle-down"></i>
+                                                                                @endif
+                                                                            </button>&nbsp;
+                                                                        @endif
                                                                     </td>
                                                                 </tr>
-                                                            @endif
-                                                            <tr>
-                                                                <td colspan="7">
-                                                                    @if($member_course->notes != '')
-                                                                        <b>Note</b><br>
-                                                                        {{$member_course->notes}}
-                                                                    @endif
-                                                                    @if($selectedCourseMember == $member_course->id)
-                                                                        @if(sizeof($payMonths) > 0 || $createSubscription)
-                                                                            <button class="btn--ui primary" style="color:white" wire:click="newPayment({{$member_course}})">Nuova entrata</button>&nbsp;
-                                                                            <button class="btn--ui primary" style="color:white" wire:click="block({{$member_course}})">Sospendi</button>
+                                                                {{-- <tr>
+                                                                    <td style="width:30%" colspan="2">
+                                                                        {{date("d/m/Y", strtotime($member_course->date_from))}} - {{date("d/m/Y", strtotime($member_course->date_to))}}
+                                                                    </td>
+                                                                    <td style="width:30%"colspan="5">
+                                                                        @php
+                                                                            $ok = false;
+                                                                        @endphp
+                                                                        @foreach(json_decode($member_course->when) as $xx => $x)
+                                                                            @if($xx > 0)
+                                                                                <br>
+                                                                            @endif
+                                                                            @foreach($x->day as $zz => $d)
+                                                                                {{$zz > 0 ? '-' : ''}}{{$d}}
+                                                                            @endforeach
+                                                                            @if($x->from != '' && $x->to != '')
+                                                                                h {{$x->from}} - {{$x->to}}
+                                                                            @endif
+                                                                            @php
+                                                                                $ok = $x->from != '';
+                                                                            @endphp
+                                                                        @endforeach
+                                                                        @if(!$ok && $member_course->course->when != '')
+                                                                            @foreach(json_decode($member_course->course->when) as $xx => $x)
+                                                                                @php
+                                                                                    $ok = true;
+                                                                                @endphp
+                                                                                @if($xx > 0)
+                                                                                    <br>
+                                                                                @endif
+                                                                                @foreach($x->day as $zz => $d)
+                                                                                    {{$zz > 0 ? '-' : ''}}{{$d}}
+                                                                                @endforeach
+                                                                                @if($x->from != '')
+                                                                                    h {{$x->from}} - {{$x->to}}
+                                                                                @endif
+                                                                            @endforeach
                                                                         @endif
-                                                                        @if(sizeof($suspendedMonths) > 0)
-                                                                            <button class="btn--ui primary" style="color:white" wire:click="reactivate({{$member_course}})">Riattiva</button>&nbsp;
-                                                                        @endif<br>
+                                                                    </td>
+                                                                </tr> --}}
+                                                                @if(in_array($member_course->id, $showCourse))
+                                                                    @if(false)
+                                                                        <tr>
+                                                                            <td colspan="5">
+                                                                                <a class="{{$this->getSubscriptionStatus($member_course->subscribed, $member_course->id)}}" wire:click="setCreateSubscription({{$member_course->subscribed}}, {{$member_course->id}})" style="float:none; width:150px;{{$this->getSubscriptionStatus($member_course->subscribed,$member_course->id) == 'blue' || $this->getSubscriptionStatus($member_course->subscribed,$member_course->id) == 'orange' || $this->getSubscriptionStatus($member_course->subscribed,$member_course->id) == 'yellow' ? 'cursor:pointer' : ''}}">Iscrizione</a><br>
+                                                                                <a class="{{$this->getMonthStatus(9, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(9, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(9, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Set</a>&nbsp;
+                                                                                <a class="{{$this->getMonthStatus(10, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(10, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(10, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Ott</a>&nbsp;
+                                                                                <a class="{{$this->getMonthStatus(11, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(11, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(11, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ?  'style=cursor:pointer' : ''}}>Nov</a>&nbsp;
+                                                                                <a class="{{$this->getMonthStatus(12, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(12, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(12, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ?  'style=cursor:pointer' : ''}}>Dic</a>&nbsp;
+                                                                                <a class="{{$this->getMonthStatus(1, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(1, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(1, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ?  'style=cursor:pointer' : ''}}>Gen</a>&nbsp;
+                                                                                <a class="{{$this->getMonthStatus(2, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(2, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(2, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ?  'style=cursor:pointer' : ''}}>Feb</a>&nbsp;
+                                                                                <a class="{{$this->getMonthStatus(3, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(3, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(3, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ?  'style=cursor:pointer' : ''}}>Mar</a>&nbsp;
+                                                                                <a class="{{$this->getMonthStatus(4, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(4, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(4, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Apr</a>&nbsp;
+                                                                                <a class="{{$this->getMonthStatus(5, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(5, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(5, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Mag</a>&nbsp;
+                                                                                <a class="{{$this->getMonthStatus(6, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(6, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(6, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Giu</a>&nbsp;
+                                                                                <a class="{{$this->getMonthStatus(7, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(7, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(7, $member_course->months, $member_course->id), ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Lug</a>&nbsp;
+                                                                                <a class="{{$this->getMonthStatus(8, $member_course->months, $member_course->id)}}" wire:click="setPayMonth(8, '{{ $member_course->months }}', {{$member_course->id}})" {{in_array($this->getMonthStatus(8, $member_course->months, $member_course->id) , ['blue', 'orange', 'yellow', 'orange half']) ? 'style=cursor:pointer' : ''}}>Ago</a>&nbsp;
+                                                                            </td>
+                                                                            <td>
+                                                                                <button type="button" class="btn" wire:click="editCourse({{ $member_course->id }})" data-bs-toggle="popover"  data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Modifica"><i class="fa-regular fa-pen-to-square"></i></button>&nbsp;
+                                                                                <button type="button" class="btn" onclick="confirm('Sei sicuro?') || event.stopImmediatePropagation()" wire:click="deleteCourse({{ $member_course->id }})" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Elimina"><i class="fa-regular fa-trash-can"></i></button>
+                                                                            </td>
+                                                                        </tr>
                                                                     @endif
-                                                                </td>
-                                                            </tr>
-                                                        @endif
-                                                    @endforeach
-                                                </tbody>
-                                            </table>
+                                                                    <tr>
+                                                                        <td colspan="7">
+                                                                            @if($member_course->notes != '')
+                                                                                <b>Note</b><br>
+                                                                                {{$member_course->notes}}
+                                                                            @endif
+                                                                            @if($selectedCourseMember == $member_course->id)
+                                                                                @if(sizeof($payMonths) > 0 || $createSubscription)
+                                                                                    <button class="btn--ui primary" style="color:white" wire:click="newPayment({{$member_course}})">Nuova entrata</button>&nbsp;
+                                                                                    <button class="btn--ui primary" style="color:white" wire:click="block({{$member_course}})">Sospendi</button>
+                                                                                @endif
+                                                                                @if(sizeof($suspendedMonths) > 0)
+                                                                                    <button class="btn--ui primary" style="color:white" wire:click="reactivate({{$member_course}})">Riattiva</button>&nbsp;
+                                                                                @endif<br>
+                                                                            @endif
+                                                                        </td>
+                                                                    </tr>
+                                                                @endif
+                                                            @endforeach
+                                                        </tbody>
+                                                    </table>
+                                                    @endif
+                                                </div>
+                                            </div>
                                             @if($dataId > 0)
+                                            <div class="row mt-5">
+                                                <div class="col-md-12">
                                                 {{-- @if ($active["status"] == 1 || $hasCertificate) --}}
                                                     <button class="btn--ui primary" wire:click.prevent="addCourse()" style="max-width:200px">Aggiungi</button>
                                                 {{-- @else --}}
                                                     {{-- <button class="btn--ui lightGrey" disabled style="max-width:200px">Aggiungi corso (non disponibile)</button>
                                                     <small class="text-muted d-block mt-1">Completa prima il tesseramento o carica un certificato medico valido</small> --}}
                                                 {{-- @endif --}}
+                                                </div>
+                                            </div>
                                             @endif
                                         @else
                                             <div class="form--wrapper">
                                                 <form class="form--utente">
-                                                    <div class="row ">
-                                                        <div class="col-12 mt-2">
-                                                            <label for="course_name" class="form-label">Tipo corso</label><br>
-                                                            <label class="form-radio-wrapper"><input type="radio" name="chkType" value="standard" wire:model="course_course_type">Singolo</label>
-                                                            <label class="form-radio-wrapper"><input type="radio" name="chkType" value="custom" wire:model="course_course_type">Personalizzato</label>
+                                                    <div class="row">
+                                                        <div class="col-4 mt-2">
+                                                            <label for="subscription_id" class="form-label">Abbonamento</label><br>
+                                                            <select id="subscription_id" class="form-select" aria-label="Abbonamento" wire:model="subscription_id" >
+                                                                <option value=""></option>
+                                                                <option value="course">Abbonamento corso singolo</option>
+                                                                @foreach($subscriptions as $subscription)
+                                                                    <option value="{{$subscription->id}}">{{$subscription->name}}</option>
+                                                                @endforeach
+                                                            </select>
                                                         </div>
-                                                        <div class="row mt-3">
-                                                            <div class="col-md-4">
-                                                                <label for="course_name" class="form-label">Corso</label>
-                                                                <select id="course_name" class="form-select" aria-label="Livello" wire:model="course_name" >
-                                                                    <option value="">
-                                                                    @foreach($course_names as $cn)
-                                                                        <option value="{{$cn}}">{{$cn}}
-                                                                    @endforeach
-                                                                </select>
+                                                    </div>
+                                                    @if($subscription_id == 'course')
+                                                        <div class="mt-4">
+                                                            <div class="col-12 mt-2">
+                                                                <label for="course_name" class="form-label">Tipo corso</label><br>
+                                                                <label class="form-radio-wrapper"><input type="radio" name="chkType" value="standard" wire:model="course_course_type">Singolo</label>
+                                                                <label class="form-radio-wrapper"><input type="radio" name="chkType" value="custom" wire:model="course_course_type">Personalizzato</label>
                                                             </div>
-                                                            @if(false)
-                                                                <label for="course_name" class="form-label">Corso</label>
-                                                                <select id="course_course_id" class="form-select @error('course_course_id') is-invalid @enderror" aria-label="Corso" wire:model="course_course_id" >
-                                                                    <option value="">
-                                                                    @foreach($courses as $c)
-                                                                        <option value="{{$c->id}}">{{$c->name}}
-                                                                    @endforeach
-                                                                </select>
-                                                            @endif
-                                                            @error('course_course_id')
-                                                                <div class="invalid-feedback">Devi selezionare un corso</div>
-                                                            @enderror
-                                                            @if($course_exist)
-                                                                <small style="color:red">Attenzione : il corso selezionato è già associato all'utente</small>
-                                                            @endif
-                                                            @if($course_name != '')
+                                                            <div class="row mt-3">
                                                                 <div class="col-md-4">
-                                                                    <label for="course_level_id" class="form-label">Livello</label>
-                                                                    <select id="course_level_id" class="form-select" aria-label="Livello" wire:model="course_level_id" >
+                                                                    <label for="course_name" class="form-label">Corso</label>
+                                                                    <select id="course_name" class="form-select" aria-label="Livello" wire:model="course_name" >
                                                                         <option value="">
-                                                                        @foreach($course_levels as $l)
-                                                                            <option value="{{$l->id}}">{{$l->name}}
+                                                                        @foreach($course_names as $cn)
+                                                                            <option value="{{$cn}}">{{$cn}}
                                                                         @endforeach
                                                                     </select>
                                                                 </div>
-                                                            @endif
-                                                            @if($course_level_id != '')
-                                                                <div class="col-md-4">
-                                                                    <label for="course_frequency_id" class="form-label">Frequenza</label>
-                                                                    <select id="course_frequency_id" class="form-select" aria-label="Tipologia" wire:model="course_frequency_id" >
+                                                                @error('course_course_id')
+                                                                    <div class="invalid-feedback">Devi selezionare un corso</div>
+                                                                @enderror
+                                                                @if($course_exist)
+                                                                    <small style="color:red">Attenzione : il corso selezionato è già associato all'utente</small>
+                                                                @endif
+                                                                @if($course_name != '')
+                                                                    <div class="col-md-4">
+                                                                        <label for="course_level_id" class="form-label">Livello</label>
+                                                                        <select id="course_level_id" class="form-select" aria-label="Livello" wire:model="course_level_id" >
+                                                                            <option value="">
+                                                                            @foreach($course_levels as $l)
+                                                                                <option value="{{$l->id}}">{{$l->name}}
+                                                                            @endforeach
+                                                                        </select>
+                                                                    </div>
+                                                                @endif
+                                                                @if($course_level_id != '')
+                                                                    <div class="col-md-4">
+                                                                        <label for="course_frequency_id" class="form-label">Frequenza</label>
+                                                                        <select id="course_frequency_id" class="form-select" aria-label="Tipologia" wire:model="course_frequency_id" >
+                                                                            <option value="">
+                                                                            @foreach($course_frequencies as $f)
+                                                                                <option value="{{$f->id}}">{{$f->name}}
+                                                                            @endforeach
+                                                                        </select>
+                                                                    </div>
+                                                                @endif
+                                                            </div>
+                                                        </div>
+                                                        @if($course_course_id > 0)
+                                                            <div class="row mt-4">
+                                                                <div class="col-md-6">
+                                                                    <label for="course_course_subscription_id" class="form-label">Pagamenti</label>
+                                                                    <select id="course_course_subscription_id" class="form-select  @error('course_course_subscription_id') is-invalid @enderror" aria-label="Pagamenti" wire:model="course_course_subscription_id">
                                                                         <option value="">
-                                                                        @foreach($course_frequencies as $f)
-                                                                            <option value="{{$f->id}}">{{$f->name}}
+                                                                        @foreach($course_subscriptions as $t)
+                                                                            <option value="{{$t["id"]}}">{{$t["name"]}}
                                                                         @endforeach
                                                                     </select>
                                                                 </div>
+                                                                <div class="col-md-6">
+                                                                    <label for="course_price" class="form-label">Costo</label>
+                                                                    <input class="form-control" type="text" id="course_price" placeholder="Costo" wire:model="course_price" onkeyup="onlyNumberAmount(this)">
+                                                                </div>
+                                                            </div>
+                                                            @if(false)
+                                                                <div class="row mt-4 course--duration">
+                                                                    <div class="col-md-12">
+                                                                        <label for="duration" class="form-label">Durata del corso</label>
+                                                                        <div class="d-flex course--duration_mounth">
+                                                                            @foreach($course_months_list as $cm)
+                                                                                <a class="{{$this->checkMonth($cm) ? 'selected' : 'notSelected'}}" wire:click="setMonth({{$cm}})">{{getMonthName($cm, true)}}</a>
+                                                                            @endforeach
+                                                                        </div>
+                                                                    </div>
+                                                                </div>
                                                             @endif
-                                                        </div>
-                                                    </div>
-                                                    @if($course_course_id > 0)
+                                                            <div class="row mt-4">
+                                                                <div class="col-md-6">
+                                                                    <label for="course_date_from" class="form-label">Data inizio</label>
+                                                                    <input class="form-control" type="date" id="course_date_from" wire:model="course_date_from">
+                                                                </div>
+                                                                <div class="col-md-6">
+                                                                    <label for="course_date_to" class="form-label">Data fine</label>
+                                                                    <input class="form-control" type="date" id="course_date_to" wire:model="course_date_to">
+                                                                </div>
+                                                            </div>
+                                                            <div class="row mt-4">
+                                                                <div class="col-md-6">
+                                                                    <label for="course_subscription_price" class="form-label">Costo iscrizione</label>
+                                                                    <input class="form-control" type="text" id="course_subscription_price" placeholder="Costo iscrizione" wire:model="course_subscription_price" onkeyup="onlyNumberAmount(this)">
+                                                                </div>
+                                                            </div>
+                                                            @if($course_course_type == 'custom')
+                                                                @foreach($course_when as $idW => $when)
+                                                                    <div class="row">
+                                                                        <div class="col-12">
+                                                                            <div class="day durata--corso d-flex">
+                                                                                <label for="" class="form-label">Giorno</label>
+                                                                                <div class="durata--corso_days mb-3">
+                                                                                    <a class="{{in_array('lun', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'lun')">Lun</a>
+                                                                                    <a class="{{in_array('mar', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'mar')">Mar</a>
+                                                                                    <a class="{{in_array('mer', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'mer')">Mer</a>
+                                                                                    <a class="{{in_array('gio', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'gio')">Gio</a>
+                                                                                    <a class="{{in_array('ven', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'ven')">Ven</a>
+                                                                                    <a class="{{in_array('sab', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'sab')">Sab</a>
+                                                                                    <a class="{{in_array('dom', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'dom')">Dom</a>
+                                                                                </div>
+                                                                                <div class="durata--corso_select">
+                                                                                    <div class="from--h me-3">
+                                                                                        <label for="" class="form-label">Dalle</label>
+                                                                                        <select class="form-select" wire:model="course_when.{{$idW}}.from">
+                                                                                            <option value="">--Seleziona--
+                                                                                            @for($c=6;$c<=23;$c++)
+                                                                                                <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00
+                                                                                                <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30
+                                                                                            @endfor
+                                                                                        </select>
+                                                                                    </div>
+                                                                                    <div class="to--h">
+                                                                                        <label for="" class="form-label">Alle</label>
+                                                                                        <select class="form-select" wire:model="course_when.{{$idW}}.to">
+                                                                                            <option value="">--Seleziona--
+                                                                                            @for($c=6;$c<=23;$c++)
+                                                                                                <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00
+                                                                                                <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30
+                                                                                            @endfor
+                                                                                        </select>
+                                                                                    </div>
+                                                                                </div>
+                                                                                <button class="btn--ui primary remove--day position-absolute" wire:click.prevent="delRow({{$idW}})"><i class="fa-solid fa-minus"></i></button>
+                                                                                <button class="btn--ui primary add--day position-absolute" wire:click.prevent="addRow()"><i class="fa-solid fa-plus"></i></button>
+                                                                            </div>
+                                                                        </div>
+                                                                    </div>
+                                                                @endforeach
+                                                            @endif
+                                                            <div class="row  mt-2">
+                                                                <div class="col-md-12">
+                                                                    <label for="course_date_from" class="form-label">Note</label>
+                                                                    <input class="form-control" type="text" id="course_note" placeholder="Note" wire:model="course_note">
+                                                                </div>
+                                                            </div>
+                                                        @endif
+                                                    @elseif($subscription_id != '')
                                                         <div class="row mt-4">
                                                             <div class="col-md-6">
-                                                                <label for="course_course_subscription_id" class="form-label">Pagamenti</label>
-                                                                <select id="course_course_subscription_id" class="form-select  @error('course_course_subscription_id') is-invalid @enderror" aria-label="Pagamenti" wire:model="course_course_subscription_id">
+                                                                <label for="subscription_course_subscription_id" class="form-label">Pagamenti</label>
+                                                                <select id="subscription_course_subscription_id" class="form-select  @error('subscription_course_subscription_id') is-invalid @enderror" aria-label="Pagamenti" wire:model="subscription_course_subscription_id">
                                                                     <option value="">
-                                                                    @foreach($course_subscriptions as $t)
+                                                                    @foreach($subscription_subscriptions as $t)
                                                                         <option value="{{$t["id"]}}">{{$t["name"]}}
                                                                     @endforeach
                                                                 </select>
                                                             </div>
                                                             <div class="col-md-6">
-                                                                <label for="course_price" class="form-label">Costo</label>
-                                                                <input class="form-control" type="text" id="course_price" placeholder="Costo" wire:model="course_price" onkeyup="onlyNumberAmount(this)">
+                                                                <label for="subscription_price" class="form-label">Costo</label>
+                                                                <input class="form-control" type="text" id="subscription_price" placeholder="Costo" wire:model="subscription_price" onkeyup="onlyNumberAmount(this)">
                                                             </div>
                                                         </div>
-                                                        @if(false)
-                                                            <div class="row mt-4 course--duration">
-                                                                <div class="col-md-12">
-                                                                    <label for="duration" class="form-label">Durata del corso</label>
-                                                                    <div class="d-flex course--duration_mounth">
-                                                                        @foreach($course_months_list as $cm)
-                                                                            <a class="{{$this->checkMonth($cm) ? 'selected' : 'notSelected'}}" wire:click="setMonth({{$cm}})">{{getMonthName($cm, true)}}</a>
-                                                                        @endforeach
-                                                                    </div>
-                                                                </div>
-                                                            </div>
-                                                        @endif
                                                         <div class="row mt-4">
                                                             <div class="col-md-6">
-                                                                <label for="course_date_from" class="form-label">Data inizio</label>
-                                                                <input class="form-control" type="date" id="course_date_from" wire:model="course_date_from">
+                                                                <label for="subscription_date_from" class="form-label">Data inizio</label>
+                                                                <input class="form-control" type="date" id="subscription_date_from" wire:model="subscription_date_from">
                                                             </div>
                                                             <div class="col-md-6">
-                                                                <label for="course_date_to" class="form-label">Data fine</label>
-                                                                <input class="form-control" type="date" id="course_date_to" wire:model="course_date_to">
+                                                                <label for="subscription_date_to" class="form-label">Data fine</label>
+                                                                <input class="form-control" type="date" id="subscription_date_to" wire:model="subscription_date_to">
                                                             </div>
                                                         </div>
                                                         <div class="row mt-4">
                                                             <div class="col-md-6">
-                                                                <label for="course_subscription_price" class="form-label">Costo iscrizione</label>
-                                                                <input class="form-control" type="text" id="course_subscription_price" placeholder="Costo iscrizione" wire:model="course_subscription_price" onkeyup="onlyNumberAmount(this)">
+                                                                <label for="subscription_subscription_price" class="form-label">Costo iscrizione</label>
+                                                                <input class="form-control" type="text" id="subscription_subscription_price" placeholder="Costo iscrizione" wire:model="subscription_subscription_price" onkeyup="onlyNumberAmount(this)">
                                                             </div>
                                                         </div>
-                                                        @if($course_course_type == 'custom')
-                                                            @foreach($course_when as $idW => $when)
-                                                                <div class="row">
-                                                                    <div class="col-12">
-                                                                        <div class="day durata--corso d-flex">
-                                                                            <label for="" class="form-label">Giorno</label>
-                                                                            <div class="durata--corso_days mb-3">
-                                                                                <a class="{{in_array('lun', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'lun')">Lun</a>
-                                                                                <a class="{{in_array('mar', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'mar')">Mar</a>
-                                                                                <a class="{{in_array('mer', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'mer')">Mer</a>
-                                                                                <a class="{{in_array('gio', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'gio')">Gio</a>
-                                                                                <a class="{{in_array('ven', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'ven')">Ven</a>
-                                                                                <a class="{{in_array('sab', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'sab')">Sab</a>
-                                                                                <a class="{{in_array('dom', $course_when[$idW]["day"]) ? 'selected' : 'notSelected'}}" wire:click="setDay({{$idW}}, 'dom')">Dom</a>
-                                                                            </div>
-                                                                            <div class="durata--corso_select">
-                                                                                <div class="from--h me-3">
-                                                                                    <label for="" class="form-label">Dalle</label>
-                                                                                    <select class="form-select" wire:model="course_when.{{$idW}}.from">
-                                                                                        <option value="">--Seleziona--
-                                                                                        @for($c=6;$c<=23;$c++)
-                                                                                            <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00
-                                                                                            <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30
-                                                                                        @endfor
-                                                                                    </select>
-                                                                                </div>
-                                                                                <div class="to--h">
-                                                                                    <label for="" class="form-label">Alle</label>
-                                                                                    <select class="form-select" wire:model="course_when.{{$idW}}.to">
-                                                                                        <option value="">--Seleziona--
-                                                                                        @for($c=6;$c<=23;$c++)
-                                                                                            <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:00
-                                                                                            <option value="{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30">{{str_pad($c, 2, "0", STR_PAD_LEFT)}}:30
-                                                                                        @endfor
-                                                                                    </select>
-                                                                                </div>
-                                                                            </div>
-                                                                            <button class="btn--ui primary remove--day position-absolute" wire:click.prevent="delRow({{$idW}})"><i class="fa-solid fa-minus"></i></button>
-                                                                            <button class="btn--ui primary add--day position-absolute" wire:click.prevent="addRow()"><i class="fa-solid fa-plus"></i></button>
-                                                                        </div>
-                                                                    </div>
-                                                                </div>
-                                                            @endforeach
-                                                        @endif
-                                                        <div class="row  mt-2">
+                                                        <div class="row mt-4">
                                                             <div class="col-md-12">
-                                                                <label for="course_date_from" class="form-label">Note</label>
-                                                                <input class="form-control" type="text" id="course_note" placeholder="Note" wire:model="course_note">
+                                                                <label for="subscription_notes" class="form-label">Note</label>
+                                                                <input class="form-control" type="text" id="subscription_notes" placeholder="Note" wire:model="subscription_notes">
                                                             </div>
                                                         </div>
                                                     @endif
                                                 </form>
                                             </div>
+
                                             <br>
-                                            <div class="row mt-2">
+                                            <div class="row mt-5">
                                                 <div class="col-md-12">
                                                     <button class="btn--ui lightGrey" wire:click.prevent="cancelCourse()">Annulla</button>
+
                                                     @if($course_course_id > 0)
                                                         @if($addCourse)
                                                             @if(!$course_exist)
@@ -1415,6 +1530,17 @@
                                                             <button class="btn--ui primary" wire:click.prevent="updateCourse()">Salva corso</button>
                                                         @endif
                                                     @endif
+
+                                                    @if($subscription_id > 0 && $subscription_id != 'course')
+                                                        @if($addCourse)
+                                                            @if(!$subscription_exist)
+                                                                <button class="btn--ui primary" wire:click.prevent="storeSubscription()">Salva abbonamento</button>
+                                                            @endif
+                                                        @endif
+                                                        @if($updateCourse)
+                                                            <button class="btn--ui primary" wire:click.prevent="updateSubscription()">Salva abbonamento</button>
+                                                        @endif
+                                                    @endif
                                                 </div>
                                             </div>
                                         @endif
@@ -1524,7 +1650,7 @@
                                         @endforeach
                                     </div>
                                     <div class="resume--tab_info gruppi corsi">
-                                        <h2 class="mb-3"><i class="fa-solid fa-chalkboard"></i><span>Corsi</span></h2>
+                                        <h2 class="mb-3"><i class="fa-solid fa-chalkboard"></i><span>Corsi e Abbonamenti</span></h2>
                                         @foreach($member_courses as $member_course)
                                             @php
                                                 $course_year = date('Y', strtotime($member_course->date_from));

+ 24 - 10
resources/views/livewire/rate.blade.php

@@ -8,7 +8,11 @@
         </div>
     </header>
 
+    @if ($rate_from == 'course')
     <a class="btn--ui lightGrey" href="/course_member?id={{$mc->course_id}}"><i class="fa-solid fa-arrow-left"></i></a><br>
+    @elseif($rate_from == 'subscription')
+    <a class="btn--ui lightGrey" href="/subscription_member/{{$ms->subscription_id}}"><i class="fa-solid fa-arrow-left"></i></a><br>
+    @endif
 
     <div class="showFilter" style="display:none" wire:ignore.self>
         <hr size="1">
@@ -136,21 +140,29 @@
                             @if($record->status == 0)
 
                                 <input type="hidden" id="memberId_{{$record->id}}" value="{{$record->member_id}}">
-                                <input type="hidden" id="causalId_{{$record->id}}" value="{{!$record->is_subscription ? $record->member_course->course->causal_id : ''}}">
-                                <input type="hidden" id="subCausalId_{{$record->id}}" value="{{$record->is_subscription ? $record->member_course->course->sub_causal_id : ''}}">
                                 <input type="hidden" id="createSubscription_{{$record->id}}" value="{{$record->is_subscription ? '1' : ''}}">
                                 <input type="hidden" id="months_{{$record->id}}" value="{{implode("|", json_decode($record->months))}}">
                                 <input type="hidden" id="price_{{$record->id}}" value="{{!$record->is_subscription ? $record->price : ''}}">
                                 <input type="hidden" id="subscription_price_{{$record->id}}" value="{{$record->is_subscription ? $record->price : ''}}">
-                                <input type="hidden" id="courseId_{{$record->id}}" value="{{$record->member_course_id}}">
                                 <input type="hidden" id="rateId_{{$record->id}}" value="{{$record->id}}">
 
-                                <a class="btn  u" href="/in?new=1&memberId={{$record->member_id}}&causalId={{!$record->is_subscription ? $record->member_course->course->causal_id : ''}}&subCausalId={{$record->is_subscription ? $record->member_course->course->sub_causal_id : ''}}&createSubscription={{$record->is_subscription ? '1' : ''}}&months={{implode("|", json_decode($record->months))}}&price={{!$record->is_subscription ? $record->price : ''}}&subscription_price={{$record->is_subscription ? $record->price : ''}}&courseId={{$record->member_course_id}}&rateId={{$record->id}}&backToRates" data-bs-toggle="popover"
-                                data-bs-trigger="hover focus" data-bs-placement="bottom"
-                                data-bs-content="Crea entrata"><i class="fa-regular fa-file-lines"></i></a>
-                                <a class="btn u" onclick="confirmDelete({{$record->id}})" data-bs-toggle="popover"
-                                    data-bs-trigger="hover focus" data-bs-placement="bottom"
-                                    data-bs-content="Elimina"><i class="fa-regular fa-trash-can"></i></button>
+                                @if ($rate_from == 'course')
+                                <input type="hidden" id="courseId_{{$record->id}}" value="{{$record->member_course_id}}">
+                                <input type="hidden" id="subscriptionId_{{$record->id}}" value="0">
+                                <input type="hidden" id="causalId_{{$record->id}}" value="{{!$record->is_subscription ? $record->member_course->course->causal_id : ''}}">
+                                <input type="hidden" id="subCausalId_{{$record->id}}" value="{{$record->is_subscription ? $record->member_course->course->sub_causal_id : ''}}">
+
+                                <a class="btn  u" href="/in?new=1&memberId={{$record->member_id}}&causalId={{!$record->is_subscription ? $record->member_course->course->causal_id : ''}}&subCausalId={{$record->is_subscription ? $record->member_course->course->sub_causal_id : ''}}&createSubscription={{$record->is_subscription ? '1' : ''}}&months={{implode("|", json_decode($record->months))}}&price={{!$record->is_subscription ? $record->price : ''}}&subscription_price={{$record->is_subscription ? $record->price : ''}}&courseId={{$record->member_course_id}}&subscriptionId=0&rateId={{$record->id}}&backToRates" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Crea entrata"><i class="fa-regular fa-file-lines"></i></a>
+                                @elseif($rate_from == 'subscription')
+                                <input type="hidden" id="courseId_{{$record->id}}" value="0">
+                                <input type="hidden" id="subscriptionId_{{$record->id}}" value="{{$record->member_subscription_id}}">
+                                <input type="hidden" id="causalId_{{$record->id}}" value="{{!$record->is_subscription ? $record->member_subscription->subscription->causal_id : ''}}">
+                                <input type="hidden" id="subCausalId_{{$record->id}}" value="{{$record->is_subscription ? $record->member_subscription->subscription->sub_causal_id : ''}}">
+
+                                <a class="btn  u" href="/in?new=1&memberId={{$record->member_id}}&causalId={{!$record->is_subscription ? $record->member_subscription->subscription->causal_id : ''}}&subCausalId={{$record->is_subscription ? $record->member_subscription->subscription->sub_causal_id : ''}}&createSubscription={{$record->is_subscription ? '1' : ''}}&months={{implode("|", json_decode($record->months))}}&price={{!$record->is_subscription ? $record->price : ''}}&subscription_price={{$record->is_subscription ? $record->price : ''}}&courseId=0&subscriptionId={{$record->member_subscription_id}}&rateId={{$record->id}}&backToRates" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Crea entrata"><i class="fa-regular fa-file-lines"></i></a>
+                                @endif
+
+                                <a class="btn u" onclick="confirmDelete({{$record->id}})" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Elimina"><i class="fa-regular fa-trash-can"></i></button>
                             @endif
                         </td>
                     </tr>
@@ -561,6 +573,7 @@
                     var price = '0';
                     var subscription_price = '';
                     var courseId = 0;
+                    var subscriptionId = 0;
                     var rateId = 0;
 
                     $('.chkIds').each(function () {
@@ -584,6 +597,7 @@
                                 price = parseFloat(price) + parseFloat($("#price_" + id).val());                            
                             }
                             courseId = $("#courseId_" + id).val();;
+                            subscriptionId = $("#subscriptionId_" + id).val();;
                             if (rateId != '') 
                                 rateId += ",";
                             rateId += $("#rateId_" + id).val();;
@@ -591,7 +605,7 @@
                             //ids.push($(this).val());
                     });
 
-                    document.location.href = "/in?new=1&memberId=" + memberId + "&causalId=" + causalId + "&subCausalId=" + subCausalId + "&createSubscription=" + createSubscription + "&months=" + months + "&price=" + price + "&subscription_price=" + subscription_price + "&courseId=" + courseId + "&rateId=" + rateId;
+                    document.location.href = "/in?new=1&memberId=" + memberId + "&causalId=" + causalId + "&subCausalId=" + subCausalId + "&createSubscription=" + createSubscription + "&months=" + months + "&price=" + price + "&subscription_price=" + subscription_price + "&courseId=" + courseId + "&subscriptionId=" + subscriptionId + "&rateId=" + rateId;
 
                     /*if (confirm('Sei sicuro?'))
                     {

+ 126 - 73
resources/views/livewire/records_in.blade.php

@@ -57,74 +57,92 @@
                         </div>
                     </div>
                 </div>
-                <div class="col-md-2">
+                <div class="col-md-10">
                     <div class="row">
-                        <div class="col-md-12" style="margin-bottom:10px;">
-                            <b>Tipologia</b>
-                        </div>
-                        <div class="col-12">
-                            <select name="filterCommercial" class="form-select filterCommercial">
-                                <option value="">Entrambe
-                                <option value="1">Commerciale
-                                <option value="2">Non commerciale
-                            </select>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-md-2">
-                    <div class="row">
-                        <div class="col-md-12" style="margin-bottom:10px;">
-                            <b>Utente</b>
-                        </div>
-                        <div class="col-12">
-                            <select name="search_member_id" class="form-select filterMember">
-                                <option value="">--Seleziona--
-                                @foreach($members as $member)
-                                    <option value="{{$member->id}}">{{$member->last_name}} {{$member->first_name}}
-                                @endforeach
-                            </select>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-md-2">
-                    <div class="row">
-                        <div class="col-md-12" style="margin-bottom:10px;">
-                            <b>Metodi di pagamento</b>
+                        <div class="col-md-3 mt-2">
+                            <div class="row">
+                                <div class="col-md-12" style="margin-bottom:10px;">
+                                    <b>Tipologia</b>
+                                </div>
+                                <div class="col-12">
+                                    <select name="filterCommercial" class="form-select filterCommercial">
+                                        <option value="">Entrambe
+                                        <option value="1">Commerciale
+                                        <option value="2">Non commerciale
+                                    </select>
+                                </div>
+                            </div>
                         </div>
-                        <div class="col-12">
-                            <select name="search_payment_method_id" class="form-select filterPaymentMethod" multiple="multiple">
-                                @foreach($payments as $payment)
-                                    <option value="{{$payment->id}}">{{$payment->name}}
-                                @endforeach
-                            </select>
+                        <div class="col-md-3 mt-2">
+                            <div class="row">
+                                <div class="col-md-12" style="margin-bottom:10px;">
+                                    <b>Utente</b>
+                                </div>
+                                <div class="col-12">
+                                    <select name="search_member_id" class="form-select filterMember">
+                                        <option value="">--Seleziona--
+                                        @foreach($members as $member)
+                                            <option value="{{$member->id}}">{{$member->last_name}} {{$member->first_name}}
+                                        @endforeach
+                                    </select>
+                                </div>
+                            </div>
                         </div>
-                    </div>
-                </div>
-                <div class="col-md-2">
-                    <div class="row">
-                        <div class="col-md-12" style="margin-bottom:10px;">
-                            <b>Causali</b>
+                        <div class="col-md-3 mt-2">
+                            <div class="row">
+                                <div class="col-md-12" style="margin-bottom:10px;">
+                                    <b>Metodi di pagamento</b>
+                                </div>
+                                <div class="col-12">
+                                    <select name="search_payment_method_id" class="form-select filterPaymentMethod" multiple="multiple">
+                                        @foreach($payments as $payment)
+                                            <option value="{{$payment->id}}">{{$payment->name}}
+                                        @endforeach
+                                    </select>
+                                </div>
+                            </div>
                         </div>
-                        <div class="col-12">
-                            <select name="search_causal_id" class="form-select filterCausals" multiple="multiple">
-                                @foreach($causals as $causal)
-                                    <option value="{{$causal["id"]}}">{!!$causal["name"]!!}
-                                @endforeach
-                            </select>
+                        <div class="col-md-3 mt-2">
+                            <div class="row">
+                                <div class="col-md-12" style="margin-bottom:10px;">
+                                    <b>Causali</b>
+                                </div>
+                                <div class="col-12">
+                                    <select name="search_causal_id" class="form-select filterCausals" multiple="multiple">
+                                        @foreach($causals as $causal)
+                                            <option value="{{$causal["id"]}}">{!!$causal["name"]!!}
+                                        @endforeach
+                                    </select>
+                                </div>
+                            </div>
                         </div>
-                    </div>
-                </div>
-                <div class="col-md-2">
-                    <div class="row">
-                        <div class="col-md-12" style="margin-bottom:10px;">
-                            <b>Corsi</b>
+                        <div class="col-md-3 mt-2">
+                            <div class="row">
+                                <div class="col-md-12" style="margin-bottom:10px;">
+                                    <b>Corsi</b>
+                                </div>
+                                <div class="col-12">
+                                    <select name="search_course_id" class="form-select filterCourses" multiple="multiple">
+                                        @foreach($courses as $course)
+                                            <option value="{{$course["id"]}}">{!!$course["name"]!!}
+                                        @endforeach
+                                    </select>
+                                </div>
+                            </div>
                         </div>
-                        <div class="col-12">
-                            <select name="search_course_id" class="form-select filterCourses" multiple="multiple">
-                                @foreach($courses as $course)
-                                    <option value="{{$course["id"]}}">{!!$course["name"]!!}
-                                @endforeach
-                            </select>
+                        <div class="col-md-3 mt-2">
+                            <div class="row">
+                                <div class="col-md-12" style="margin-bottom:10px;">
+                                    <b>Abbonamenti</b>
+                                </div>
+                                <div class="col-12">
+                                    <select name="search_subscription_id" class="form-select filterSubscriptions" multiple="multiple">
+                                        @foreach($subscriptions as $subscription)
+                                            <option value="{{$subscription["id"]}}">{!!$subscription["name"]!!}
+                                        @endforeach
+                                    </select>
+                                </div>
+                            </div>
                         </div>
                     </div>
                 </div>
@@ -151,7 +169,7 @@
                         <th scope="col">Nome</th>
                         <th scope="col">Commerciale</th>
                         <th scope="col">Causale</th>
-                        <th scope="col">Corso</th>
+                        <th scope="col">Corso/Abbonamento</th>
                         <th scope="col">Pagamento</th>
 
                         <th scope="col">Stato</th>
@@ -360,9 +378,9 @@
 
                             @foreach($rows as $idx => $row)
                                 <div class="row gx-2 mt-3" >
-                                    <div class="@if ($fromCourse || $row['course_id'])col-md-6 @endif col-xs-12">
+                                    <div class="@if ($fromCourse || $row['course_id'] || $row['subscription_id'])col-md-6 @endif col-xs-12">
                                         <span class="title-form d-block w-100">Causale</span>
-                                        @if ($fromCourse || $row['course_id'])
+                                        @if ($fromCourse || $row['course_id'] || $row['subscription_id'])
                                             {{$this->getCausal($rows[$idx]['causal_id'])}}<br>
                                         @else
                                             @if($this->dataId > 0 && !$isDuplicate)
@@ -377,13 +395,22 @@
                                         @endif
 
                                     </div>
-                                    @if ($fromCourse || (isset($row['course']) && $row['course'] != null))
-                                        <div class="col-md-6 col-xs-12">
-                                            <span class="title-form d-block w-100">Corso</span>
-                                            @if (isset($row['course']))
-                                                {{$row['course']->getDetailsName()}}
-                                            @endif
-                                        </div>
+                                    @if ($fromCourse)
+                                        @if (isset($row['course']) && $row['course'] != null)
+                                            <div class="col-md-6 col-xs-12">
+                                                <span class="title-form d-block w-100">Corso</span>
+                                                @if (isset($row['course']))
+                                                    {{$row['course']->getDetailsName()}}
+                                                @endif
+                                            </div>
+                                        @elseif (isset($row['subscription']) && $row['subscription'] != null)
+                                            <div class="col-md-6 col-xs-12">
+                                                <span class="title-form d-block w-100">Abbonamento</span>
+                                                @if (isset($row['subscription']))
+                                                    {{$row['subscription']->name}}
+                                                @endif
+                                            </div>
+                                        @endif
                                     @endif
                                 </div>
 
@@ -1060,6 +1087,11 @@
                 //var data = $('.filterCourses').select2("val");
                 //@this.set('filterCourses', data);
             });
+            $('.filterSubscriptions').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+            $('.filterSubscriptions').on('change', function (e) {
+                //var data = $('.filterSubscriptions').select2("val");
+                //@this.set('filterSubscriptions', data);
+            });
 
 
 
@@ -1084,6 +1116,11 @@
             //var data = $('.filterCourses').select2("val");
             //@this.set('filterCourses', data);
         });
+        $('.filterSubscriptions').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+        $('.filterSubscriptions').on('change', function (e) {
+            //var data = $('.filterSubscriptions').select2("val");
+            //@this.set('filterSubscriptions', data);
+        });
 
         window.livewire.on('saved', () => {
             $('#userModal').modal('hide');
@@ -1163,6 +1200,12 @@
                 $('.filterCourses').val(filterCourses);
                 $('.filterCourses').trigger('change');
             }
+            var filterSubscriptions = localStorage.getItem("filterSubscriptions");
+            if (filterSubscriptions)
+            {
+                $('.filterSubscriptions').val(filterSubscriptions);
+                $('.filterSubscriptions').trigger('change');
+            }
             var filterFrom = localStorage.getItem("filterFrom");
             if (filterFrom)
             {
@@ -1210,6 +1253,12 @@
                 $('.filterCourses').val(filterCourses);
                 $('.filterCourses').trigger('change');
             }
+            var filterSubscriptions = localStorage.getItem("filterSubscriptionsRecordIn");
+            if (filterSubscriptions && filterSubscriptions != "null" && filterSubscriptions != "undefined")
+            {
+                $('.filterSubscriptions').val(filterSubscriptions);
+                $('.filterSubscriptions').trigger('change');
+            }
             var filterFrom = localStorage.getItem("filterFromRecordIn");
             if (filterFrom && filterFrom != "null" && filterFrom != "undefined")
             {
@@ -1293,6 +1342,8 @@
             $('.filterCausals').trigger('change');
             $('.filterCourses').val('');
             $('.filterCourses').trigger('change');
+            $('.filterSubscriptions').val('');
+            $('.filterSubscriptions').trigger('change');
             $('.filterFrom').val('');
             $('.filterTo').val('');
             //localStorage.clear();
@@ -1314,6 +1365,7 @@
             var filterPaymentMethod = $('.filterPaymentMethod').val();
             var filterCausals = $('.filterCausals').val();
             var filterCourses = $('.filterCourses').val();
+            var filterSubscriptions = $('.filterSubscriptions').val();
             var filterFrom = $('.filterFrom').val();
             var filterTo = $('.filterTo').val();
 
@@ -1323,6 +1375,7 @@
             localStorage.setItem("filterPaymentMethodRecordIn", filterPaymentMethod);
             localStorage.setItem("filterCausalsRecordIn", filterCausals);
             localStorage.setItem("filterCoursesRecordIn", filterCourses);
+            localStorage.setItem("filterSubscriptionsRecordIn", filterSubscriptions);
             localStorage.setItem("filterFromRecordIn", filterFrom);
             localStorage.setItem("filterToRecordIn", filterTo);
 
@@ -1340,7 +1393,7 @@
                 serverSide: true,
                 processing: true,
                 ajax: {
-                    url : '/get_record_in?filterCommercial=' + filterCommercial + "&filterMember=" + filterMember + "&filterPaymentMethod=" + filterPaymentMethod + "&filterCausals=" + filterCausals + "&filterCourses=" + filterCourses + "&filterFrom=" + filterFrom + "&filterTo=" + filterTo,
+                    url : '/get_record_in?filterCommercial=' + filterCommercial + "&filterMember=" + filterMember + "&filterPaymentMethod=" + filterPaymentMethod + "&filterCausals=" + filterCausals + "&filterCourses=" + filterCourses + "&filterSubscriptions=" + filterSubscriptions + "&filterFrom=" + filterFrom + "&filterTo=" + filterTo,
                     dataSrc: function (json){
                         if(json.totals){
                             $(".totalDiv").html('Totale&nbsp;:&nbsp;<b>' + json.totals + '</b>');

+ 7 - 0
resources/views/livewire/settings.blade.php

@@ -61,6 +61,13 @@
                     </div>
                 </a>
                 <hr size="1">
+                <a href="/subscriptions">
+                    <div class="row">
+                        <div class="col-md-11 p-2"><h5>Abbonamenti</h5></div>
+                        <div class="col-md-1 p-2"><i class="fa-solid fa-chevron-right"></i></div>
+                    </div>
+                </a>
+                <hr size="1">
                 <a href="/course_durations">
                     <div class="row">
                         <div class="col-md-11 p-2"><h5>Durata</h5></div>

+ 318 - 0
resources/views/livewire/subscription.blade.php

@@ -0,0 +1,318 @@
+<div class="col card--ui" id="card--dashboard">
+
+    <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">@if(!$add && !$update)Abbonamenti @else Inserimento/modifica abbonamento @endif</h2>
+        </div>
+
+        @if(!$add && !$update)
+            <div class="title--section_addButton"  wire:click="add()" style="cursor: pointer;">
+                <div class="btn--ui entrata d-flex justify-items-between">
+                    <a href="#" wire:click="add()" style="color:white">Aggiungi</a>
+                </div>
+            </div>
+        @endif
+
+    </header>
+
+
+    @if(!$add && !$update)
+
+        <a class="btn--ui lightGrey" href="/settings?type=corsi"><i class="fa-solid fa-arrow-left"></i></a><br>
+
+        <section id="resume-table">
+            <table class="table tablesaw tableHead tablesaw-stack" id="tablesaw-350" width="100%">
+                <thead>
+                    <tr>
+                        <th  style="text-align:center" scope="col"><input type="checkbox" class="checkAll"></th>
+                        <th scope="col">Nome</th>
+                        <th scope="col">N° partecipanti</th>
+                        <th scope="col">...</th>
+                    </tr>
+                </thead>
+                <tbody id="checkall-target">
+                    @foreach($records as $record)
+                        <tr>
+                            <td style="text-align:center"><input type="checkbox" class="chkCourse" name="{{$record->id}}"></td>
+                            <td>{{$record->name}}</td>
+                            <td style="padding-right: 50px">{{$record->getCount()}}</td>
+                            <td>
+                                <button type="button" class="btn" wire:click="edit({{ $record->id }})" data-bs-toggle="popover"  data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Modifica"><i class="fa-regular fa-pen-to-square"></i></button>
+                                <button type="button" class="btn" onclick="confirm('Sei sicuro?') || event.stopImmediatePropagation()" wire:click="delete({{ $record->id }})" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Elimina"><i class="fa-regular fa-trash-can"></i></button>
+                                <button type="button" class="btn" wire:click="duplicate({{ $record->id }}, false)" data-bs-toggle="popover"  data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Duplica"><i class="fa-regular fa-copy"></i></button>
+                            </td>
+                        </tr>
+                    @endforeach
+                </tbody>
+            </table>
+        </section>
+
+    @else
+
+        <a class="btn--ui lightGrey" href="/subscriptions"><i class="fa-solid fa-arrow-left"></i></a><br>
+
+        <div class="container">
+
+            @if (session()->has('error'))
+                <div class="alert alert-danger" role="alert">
+                    {{ session()->get('error') }}
+                </div>
+            @endif
+
+            <div class="row">
+                <div class="col">
+
+                    <form action="">
+
+                        <div class="row mb-3 ">
+                            <div class="col-6 mt-2">
+                                <div class="form--item">
+                                    <label for="inputName" class="form-label">Nome</label>
+                                    <input class="form-control js-keyupTitle @error('name') is-invalid @enderror" type="text" id="name" placeholder="Nome" wire:model="name">
+                                    @error('name')
+                                        <div class="invalid-feedback">{{ $message }}</div>
+                                    @enderror
+                                </div>
+                            </div>
+
+                            <div class="col-6 mt-2">
+                                <div class="form--item">
+                                    <label for="enabled" class="form-label">Abilitato</label>
+                                    <input class="form-check-input form-control" style="width:22px; height:22px;" type="checkbox" id="enabled" wire:model="enabled">
+                                </div>
+                            </div>
+                            
+                            {{-- <div class="col-3 mt-2">
+                                <div class="form--item">
+                                    <label for="inputName" class="form-label">Data inizio</label>
+                                    <input class="form-control @error('date_from') is-invalid @enderror" type="date" placeholder="Data inizio" wire:model="date_from">
+                                </div>
+                            </div>
+                            <div class="col-3 mt-2">
+                                <div class="form--item">
+                                    <label for="inputName" class="form-label">Data fine</label>
+                                    <input class="form-control @error('date_to') is-invalid @enderror" type="date" placeholder="Data fine" wire:model="date_to">
+                                </div>
+                            </div> --}}
+
+                            <div class="col-6 mt-2">
+                                <div class="form--item">
+                                    <label for="inputName" class="form-label">Prezzo iscrizione</label>
+                                    <input class="form-control js-keyupTitle @error('subscription_price') is-invalid @enderror" type="text" id="subscription_price" onkeyup="onlyNumberAmount(this)" placeholder="€ 0,00" wire:model="subscription_price">
+                                    @error('subscription_price')
+                                        <div class="invalid-feedback">{{ $message }}</div>
+                                    @enderror
+                                </div>
+                            </div>
+
+                            <div class="col-6 mt-2">
+                                @foreach($prices as $idP => $p)
+                                    <div class="row mt-2 ">
+                                        <div class="col-6">
+                                            <label for="abb" class="form-label">Pagamento</label>
+                                            <select class="form-control" wire:model="prices.{{$idP}}.course_subscription_id">
+                                                <option value=""></option>
+                                                @foreach($course_subscriptions as $s)
+                                                    <option value="{{$s["id"]}}">{{$s["name"]}}
+                                                @endforeach
+                                            </select>
+                                        </div>
+                                        <div class="col-4">
+                                            <label for="price" class="form-label">Prezzo</label>
+                                            <input class="form-control " type="text" onkeyup="onlyNumberAmount(this)" placeholder="€ 0,00" wire:model="prices.{{$idP}}.price">
+                                        </div>
+                                        <div class="col-2">
+                                            @if($idP == 0)
+                                                <br><button class="btn--ui primary add--daye" wire:click.prevent="addPrice()"><i class="fa-solid fa-plus"></i></button>
+                                            @endif
+                                            @if($idP > 0)
+                                                <br><button class="btn--ui primary add--daye" wire:click.prevent="delPrice({{$idP}})"><i class="fa-solid fa-minus"></i></button>
+                                            @endif
+                                        </div>
+                                        <div class="col-12">
+                                            <span style="color:red">{{$msgPrices}}</span>
+                                        </div>
+                                    </div>
+                                @endforeach
+                            </div>
+                        </div>
+
+                        <div class="form--item mt-4">
+                            <button type="button" class="btn--ui lightGrey" onclick="annulla()">Annulla</button>
+                            @if($add)
+                                <button type="submit" class="btn--ui" wire:click.prevent="store()">Salva</button>
+                            @endif
+                            @if($update)
+                                <button type="submit" class="btn--ui" wire:click.prevent="update()">Salva</button>
+                            @endif
+                        </div>
+
+                    </form>
+                </div>
+            </div>
+        </div>
+
+    @endif
+</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>
+@endpush
+
+@push('scripts')
+    <script>
+        function onlyNumberAmount(input) {
+            let v = input.value.replace(/\D+/g, '');
+            if (v.length > 14) v = v.slice(0, 14);
+            input.value = "€ " + v.replace(/(\d)(\d\d)$/, "$1,$2").replace(/(^\d{1,3}|\d{3})(?=(?:\d{3})+(?:,|$))/g, '$1.');
+        }
+
+        var isEdit = false;
+
+        Livewire.on('setEdit', (x) =>
+        {
+            isEdit = x;
+            console.log(isEdit);
+        });
+
+        function annulla()
+        {
+            window.onbeforeunload = null;
+            document.location.href = '/courses';
+        }
+
+        window.onbeforeunload = function(){
+            if (isEdit)
+                return 'Cambiando pagina le eventuali modifiche andranno perse';
+
+        };
+
+        $(document).ready(function() {
+            loadDataTable();
+        } );
+
+        Livewire.on('load-data-table', () => {
+            loadDataTable();
+        });
+
+        function loadDataTable(){
+            let date = new Date();
+            let date_export = `${date.getFullYear()}${date.getMonth()}${date.getDate()}_`;
+
+            if ( $.fn.DataTable.isDataTable('#tablesaw-350') ) {
+                $('#tablesaw-350').DataTable().destroy();
+            }
+
+            $('#tablesaw-350').DataTable({
+                processing: true,
+                thead: {
+                'th': {'background-color': 'blue'}
+                },
+                layout: {
+                    topStart : null,
+                    topEnd : null,
+                    top1A: {
+                        buttons: [
+                            {
+                                extend: 'excelHtml5',
+                                text: '<i class="fa-solid fa-file-excel"></i>',
+                                action: newexportaction,
+                                title: date_export + 'Abbonamenti',
+                                exportOptions: {
+                                    columns: ":not(':last')"
+                                }
+                            },
+                            {
+                                extend: 'pdfHtml5',
+                                text: '<i class="fa-solid fa-file-pdf"></i>',
+                                action: newexportaction,
+                                title: date_export + 'Abbonamenti',
+                                exportOptions: {
+                                    columns: ":not(':last')"
+                                }
+                            },
+                            {
+                                extend: 'print',
+                                action: newexportaction,
+                                text: '<i class="fa-solid fa-print"></i>',
+                                title: date_export + 'Abbonamenti',
+                                exportOptions: {
+                                    columns: ":not(':last')"
+                                }
+                            }
+                        ],
+                    },
+                    top1B : {
+                        pageLength: {
+                            menu: [[10, 25, 50, 100, 100000], [10, 25, 50, 100, "Tutti"]]
+                        }
+                    },
+                    top1C :'search',
+                },
+                columnDefs: [
+                    {
+                        targets: 0,
+                        orderable: false
+                    }
+                ],
+                pagingType: 'numbers',
+                language: {
+                    url: "/assets/js/Italian.json"
+                },
+                fnInitComplete: function (oSettings, json) {
+                    var html = '&nbsp;<a href="#" class="addData btn--ui"><i class="fa-solid fa-plus"></i></a>';
+                    $(".dt-search").append(html);
+                    html = '&nbsp;<a href="#" class="duplicateData btn--ui" style="display:none"><i class="fa-solid fa-copy fa-lg" style="height:5px;"></i></a>';
+                    $(".dt-buttons").after(html);
+                }
+            });
+            $('#tablesaw-350 thead tr th').addClass('col');
+            $('#tablesaw-350 thead tr th').css("background-color", "#f6f8fa");
+
+            var subscriptions = [];
+            $(".chkCourse").click(function(){
+                var id = $(this).attr('name');
+                if(!subscriptions.includes(id)){
+                    subscriptions.push(id);
+                }else{
+                    subscriptions.splice(subscriptions.indexOf(id), 1);  //deleting
+                }
+                if (subscriptions.length > 0)
+                    $(".duplicateData").show();
+                else
+                    $(".duplicateData").hide();
+            });
+
+            $(document).ready(function() {
+                $(document).on("click",".addData",function() {
+                    $(".title--section_addButton").trigger("click");
+                });
+                $(document).on("click",".duplicateData",function() {
+                    @this.duplicateMultiple(subscriptions);
+                });
+            } );
+
+            var all = false;
+            $(".checkAll").click(function(){
+                all = !all;
+                subscriptions = [];
+                $('.chkCourse').each(function(){
+                    $(this).prop('checked', all);
+                    if (all)
+                        subscriptions.push($(this).attr('name'));
+                });
+                if (subscriptions.length > 0)
+                    $(".duplicateData").show();
+                else
+                    $(".duplicateData").hide();
+            });
+        }
+    </script>
+@endpush

+ 503 - 0
resources/views/livewire/subscription_member.blade.php

@@ -0,0 +1,503 @@
+<div class="col card--ui" id="card--dashboard">
+
+
+    <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">Iscritti agli abbonamenti</h2>
+        </div>
+
+    </header>
+
+    <a class="btn--ui lightGrey" href="/subscription_member"><i class="fa-solid fa-arrow-left"></i></a><br>
+
+    @if ($subscription)
+        <h3>{{$subscription->name ?? 'Abbonamento Sconosciuto'}}</h3>
+    @endif
+
+
+    <div class="showFilter" style="display:none" wire:ignore.self>
+        <hr size="1">
+        <div class="row g-3 mt-1">
+            <div class="col-md-3">
+                <div class="row">
+                    <div class="col-md-12" style="margin-bottom:10px;">
+                        <b>Tipologia di tesseramento</b>
+                    </div>
+                    <div class="col-12">
+                        <select class="form-select filterCards" multiple="multiple">
+                            @foreach(getCards() as $card)
+                                <option value="{{$card->id}}">{{$card->name}}
+                            @endforeach
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-3">
+                <div class="row">
+                    <div class="col-md-12" style="margin-bottom:10px;">
+                        <b>Stato tesseramento</b>
+                    </div>
+                    <div class="col-12">
+                        <select class="form-select filterStatus" multiple="multiple">
+                            <option value="2">Attivo
+                            <option value="1">Sospeso
+                            <option value="0">Non tesserato
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-3">
+                <div class="row">
+                    <div class="col-md-12" style="margin-bottom:10px;">
+                        <b>Certificato medico</b>
+                    </div>
+                    <div class="col-12">
+                        <select class="form-select filterCertificateScadenza" multiple="multiple">
+                            <option value="1">Scaduti
+                            <option value="2">In scadenza
+                            <option value="3">Non presenti
+                            <option value="4">Validi
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-3">
+                <div class="row">
+                    <div class="col-md-12" style="margin-bottom:10px;">
+                        <b>Tipologia certificato medico</b>
+                    </div>
+                    <div class="col-12">
+                        <select class="form-select filterCertificateType" multiple="multiple">
+                            <option value="N">Non agonistico
+                            <option value="A">Agonistico
+                        </select>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+        <div class="row g-3 mt-1">
+            <div class="col-md-3">
+                <div class="row">
+                    <div class="col-md-12" style="margin-bottom:10px;">
+                        <b>Età</b>
+                    </div>
+                    <div class="col-md-6">
+                        <div class="row align-items-center">
+                            <div class="col-auto"><label class="form-check-label ms-2">Da</label></div>
+                            <div class="col"><input class="form-control txt fromYear" type="number" min="0" step="1" name="fromYear"></div>
+                        </div>
+                    </div>
+                    <div class="col-md-6">
+                        <div class="row align-items-center">
+                            <div class="col-auto"><label class="form-check-label ms-2">A</label></div>
+                            <div class="col"><input class="form-control txt toYear" type="number" min="0" step="1" name="toYear"></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-3">
+                <div class="row">
+                    <div class="col-md-12" style="margin-bottom:10px;">
+                        <b>Anno di nascita</b>
+                    </div>
+                    <div class="col-md-6">
+                        <div class="row align-items-center">
+                            <div class="col-auto"><label class="form-check-label ms-2">Da</label></div>
+                            <div class="col"><input class="form-control txt fromFromYear" name="fromYearYear" type="number" min="0" step="1" name="fromFromYear"></div>
+                        </div>
+                    </div>
+                    <div class="col-md-6">
+                        <div class="row align-items-center">
+                            <div class="col-auto"><label class="form-check-label ms-2">A</label></div>
+                            <div class="col"><input class="form-control txt toToYear" type="number" min="0" step="1" name="toToYear"></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="row g-3 mt-2">
+            <div class="col-md-12" style="text-align:right">
+                <button class="btn--ui_outline light" onclick="reset()">RESET</button>
+                <button class="btn--ui" onclick="loadDataTable()">FILTRA</button>
+            </div>
+        </div>
+        <hr size="1">
+    </div>
+
+    <section id="resume-table">
+        <div class="compare--chart_wrapper d-none"></div>
+
+        <div id="filter">{{$filter}}</div>
+
+        <table class="table tablesaw tableHead tablesaw-stack" id="tablesaw-350" width="100%">
+            <thead>
+                <tr>
+                    <th scope="col">#</th>
+                    <th scope="col">Cognome</th>
+                    <th scope="col">Nome</th>
+                    <th scope="col">Certificato</th>
+                    <th scope="col">Stato</th>
+                    <th scope="col">...</th>
+                </tr>
+            </thead>
+            <tbody id="checkall-target">
+
+            </tbody>
+        </table>
+
+    </section>
+</div>
+
+@push('scripts')
+    <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
+    <style>
+        .select2-container--default .select2-selection--single {
+            background-color: #E9F0F5;
+            border: 0.0625rem solid #DFE5EB;
+            font-size: 0.75rem;
+        }
+
+        .select2-selection {
+            height: 38px !important;
+        }
+
+        .select2-selection__rendered {
+            padding-top: 3px;
+        }
+
+        .select2 {
+            width: 100% !important;
+        }
+    </style>
+    <script src="https://code.jquery.com/jquery-2.2.4.min.js"
+        integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
+    <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
+@endpush
+
+@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>
+
+
+    <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
+    <style>
+        .select2-container--default .select2-selection--single {
+            background-color: #E9F0F5;
+            border: 0.0625rem solid #DFE5EB;
+            font-size: 0.75rem;
+        }
+
+        .select2-selection {
+            height: 38px !important;
+        }
+
+        .select2-selection__rendered {
+            padding-top: 3px;
+        }
+
+        .select2 {
+            width: 100% !important;
+        }
+
+        .select2-selection--multiple {
+            overflow: hidden !important;
+            height: auto !important;
+        }
+
+        .select2-container {
+            box-sizing: border-box;
+            display: inline-block;
+            margin: 0;
+            position: relative;
+            vertical-align: middle;
+        }
+
+        .select2-container .select2-selection--single {
+            box-sizing: border-box;
+            cursor: pointer;
+            display: block;
+            height: 38px;
+            user-select: none;
+            -webkit-user-select: none;
+        }
+
+        .select2-container .select2-selection--single .select2-selection__rendered {
+            display: block;
+            padding-left: 8px;
+            padding-right: 20px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+        }
+
+        .select2-selection__choice__display {
+            color: #000000 !important;
+        }
+    </style>
+    <script src="https://code.jquery.com/jquery-2.2.4.min.js"
+        integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
+    <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></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 () {
+            loadDataTable();
+        });
+
+        $('.filterStatus').select2({ "language": { "noResults": function () { return "Nessun risultato"; } } });
+        $('.filterCertificateScadenza').select2({ "language": { "noResults": function () { return "Nessun risultato"; } } });
+        $('.filterCertificateType').select2({ "language": { "noResults": function () { return "Nessun risultato"; } } });
+        $('.filterCards').select2({ "language": { "noResults": function () { return "Nessun risultato"; } } });
+
+        Livewire.on('load-data-table', () => {
+            $('.filterStatus').select2({ "language": { "noResults": function () { return "Nessun risultato"; } } });
+            $('.filterCards').select2({ "language": { "noResults": function () { return "Nessun risultato"; } } });
+            $('.filterCertificateScadenza').select2({ "language": { "noResults": function () { return "Nessun risultato"; } } });
+            $('.filterCertificateType').select2({ "language": { "noResults": function () { return "Nessun risultato"; } } });
+            loadDataTable();
+        });
+
+        Livewire.on('destroy-data-table', () => {
+            $('#tablesaw-350').DataTable().destroy();
+        });
+
+        @if(isset($_GET["showFilters"]))
+            var filterStatus = localStorage.getItem("filterStatusSubscriptionMember");
+            if (filterStatus) {
+                $('.filterStatus').val(filterStatus).trigger('change');
+            }
+
+            var filterCards = localStorage.getItem("filterCardsSubscriptionMember");
+            if (filterCards) {
+                $('.filterCards').val(filterCards).trigger('change');
+            }
+
+            var filterCertificateScadenza = localStorage.getItem("filterCertificateScadenzaSubscriptionMember");
+            if (filterCertificateScadenza) {
+                $('.filterCertificateScadenza').val(filterCertificateScadenza).trigger('change');
+            }
+
+            var filterCertificateType = localStorage.getItem("filterCertificateTypeSubscriptionMember");
+            if (filterCertificateType) {
+                $('.filterCertificateType').val(filterCertificateType).trigger('change');
+            }
+
+            var fromYear = localStorage.getItem("fromYearSubscriptionMember");
+            if (fromYear) {
+                $('input[name="fromYear"]').val(fromYear);
+            }
+            var toYear = localStorage.getItem("toYearSubscriptionMember");
+            if (toYear) {
+                $('input[name="toYear"]').val(toYear);
+            }
+            var fromFromYear = localStorage.getItem("fromFromYearSubscriptionMember");
+            if (fromFromYear) {
+                $('input[name="fromYearYear"]').val(fromFromYear);
+            }
+
+            var toToYear = localStorage.getItem("toToYearSubscriptionMember");
+            if (toToYear) {
+                $('input[name="toToYear"]').val(toToYear);
+            }
+        @endif
+
+        function reset() {
+            $('.filterStatus').val(null).trigger("change");
+            $('.filterCards').val(null).trigger("change");
+            $('.filterCertificateScadenza').val(null).trigger("change");
+            $('.filterCertificateType').val(null).trigger("change");
+            $('.fromYear').val('');
+            $('.toYear').val('');
+            $('.fromFromYear').val('');
+            $('.toToYear').val('');
+            destroyDataTable();
+            loadDataTable();
+        }
+
+        function destroyDataTable() {
+            $('#tablesaw-350').DataTable().destroy();
+        }
+
+        var isFilter = false;
+        $(document).ready(function () {
+            $(document).on("click", ".showHideFilter", function () {
+                if (isFilter) {
+                    isFilter = false;
+                    $(".showFilter").hide();
+                }
+                else {
+                    isFilter = true;
+                    $(".showFilter").show();
+                }
+            });
+        });
+
+        function loadDataTable() {
+            if ($.fn.DataTable.isDataTable('#tablesaw-350')) {
+                $('#tablesaw-350').DataTable().destroy();
+            }
+
+            var filterStatus = $('.filterStatus').val();
+            localStorage.setItem("filterStatusSubscriptionMember", filterStatus);
+
+            var filterCards = $('.filterCards').val();
+            localStorage.setItem("filterCardsSubscriptionMember", filterCards);
+
+            var filterCertificateScadenza = $('.filterCertificateScadenza').val();
+            localStorage.setItem("filterCertificateScadenzaSubscriptionMember", filterCertificateScadenza);
+            console.log(filterCertificateScadenza);
+
+            var filterCertificateType = $('.filterCertificateType').val();
+            localStorage.setItem("filterCertificateTypeSubscriptionMember", filterCertificateType);
+
+            var fromYear = $('.fromYear').val();
+            localStorage.setItem("fromYearSubscriptionMember", fromYear);
+
+            var toYear = $('.toYear').val();
+            localStorage.setItem("toYearSubscriptionMember", toYear);
+
+            var fromFromYear = $('.fromFromYear').val();
+            localStorage.setItem("fromFromYearSubscriptionMember", fromFromYear);
+
+            var toToYear = $('.toToYear').val();
+            localStorage.setItem("toToYearSubscriptionMember", toToYear);
+
+            let date = new Date();
+            let date_export = `${date.getFullYear()}${date.getMonth()}${date.getDate()}_`;
+
+
+            $('#tablesaw-350').DataTable({
+                serverSide: true,
+                processing: true,
+                ajax: {
+                    url: '/get_subscription_members?filterStatus=' + filterStatus + '&filterCards=' + filterCards + '&filterCertificateScadenza=' + filterCertificateScadenza + '&filterCertificateType=' + filterCertificateType + '&fromYear=' + fromYear + '&toYear=' + toYear + '&fromFromYear=' + fromFromYear + '&toToYear=' + toToYear,
+                },
+                thead: {
+                    'th': { 'background-color': 'blue' }
+                },
+                columns: [
+                    { data: 'column_0' },
+                    {
+                        data: 'column_1',
+                        render: function (data, type, row) {
+                            var ret = '<a href="/members?member_detail=' + row["column_7"] + '&from=subscription_member">' + data + '</a>';
+                            return ret;
+                        }
+                    },
+                    {
+                        data: 'column_2',
+                        render: function (data, type, row) {
+                            var ret = '<a href="/members?member_detail=' + row["column_7"] + '&from=subscription_member">' + data + '</a>';
+                            return ret;
+                        }
+                    },
+                    {
+                        data: 'column_3',
+                        render: function (data, type, row) {
+                            var certInfo = data.split("|");
+                            var status = certInfo[0];
+                            var expireDate = certInfo[1] || "";
+                            var html = '<span class="tablesaw-cell-content d-flex align-items-center">';
+                            if (status === "0") {
+                                html += '<i class="ico--ui check suspended me-2"></i> ';
+                                html += 'Scaduto: ' + expireDate;
+                            } else if (status === "1") {
+                                html += '<i class="ico--ui check due me-2"></i>';
+                                html += 'In scadenza: ' + expireDate;
+                            } else if (status === "2") {
+                                html += '<i class="ico--ui check active me-2"></i>';
+                                html += 'Scadenza: ' + expireDate;
+                                html += '<span style="float:right"></span>';
+                            }else {
+                                console.log(status);
+                                html += '<i class="ico--ui check absent me-2"></i>';
+                                html += 'Non consegnato';
+                            }
+                            html += '</span>';
+                            return html;
+                        }
+                    },
+                    {
+                        data: 'column_4',
+                        render: function (data, type, row) {
+                            var html = '<span class="badge tessera-badge ' + (data == 0 ? 'due' : (data == 1 ? 'active' : 'suspended')) + '">' + (data == 0 ? 'Da pagare' : (data == 1 ? 'Pagato' : 'Sospeso')) + '</span>';
+                            return html;
+                        }
+                    },
+                    { 
+                        data: 'column_5',
+                        render: function (data, type, row) {
+                            var html = '<a href="/rates?member_id=' + row["column_7"] + '&member_subscription_id=' + data + '"><b> <i class="fa-solid fa-edit"></i></b></a>';
+                            return html;
+                        }
+                    }],
+                layout: {
+                    topStart: null,
+                    topEnd: null,
+                    top1A: {
+                        buttons: [
+                            {
+                                extend: 'excelHtml5',
+                                text: '<i class="fa-solid fa-file-excel"></i>',
+                                action: newexportaction,
+                                title: date_export + 'Iscritti abbonamenti',
+                                exportOptions: {
+                                    columns: ":not(':last')"
+                                }
+                            },
+                            {
+                                extend: 'pdfHtml5',
+                                text: '<i class="fa-solid fa-file-pdf"></i>',
+                                action: newexportaction,
+                                title: date_export + 'Iscritti abbonamenti',
+                                exportOptions: {
+                                    columns: ":not(':last')"
+                                }
+                            },
+                            {
+                                extend: 'print',
+                                action: newexportaction,
+                                text: '<i class="fa-solid fa-print"></i>',
+                                title: date_export + 'Iscritti abbonamenti',
+                                exportOptions: {
+                                    columns: ":not(':last')"
+                                }
+                            }
+                        ],
+                    },
+                    top1B: {
+                        pageLength: {
+                            menu: [[10, 25, 50, 100, 100000], [10, 25, 50, 100, "Tutti"]]
+                        }
+                    },
+                    top1C: 'search',
+                },
+                order: [[0, 'asc'], [1, 'asc']],
+                pagingType: 'numbers',
+                language: {
+                    url: "/assets/js/Italian.json"
+                },
+                fnInitComplete: function (oSettings, json) {
+                    var html = '&nbsp;<a href="#" class="showHideFilter btn--ui"><i class="fa-solid fa-sliders"></i></a>';
+                    $(".dt-search").append(html);
+                }
+            });
+
+            $('#tablesaw-350 thead tr th').addClass('col');
+            $('#tablesaw-350 thead tr th').css("background-color", "#f6f8fa");
+            $('#tablesaw-350').on('draw.dt', function () {
+                $('[data-bs-toggle="popover"]').popover()
+            });
+        }
+    </script>
+@endpush

+ 141 - 0
resources/views/livewire/subscription_members.blade.php

@@ -0,0 +1,141 @@
+<div class="col card--ui" id="card--dashboard">
+
+    <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">Durata corsi</h2>
+        </div>
+
+
+    </header>
+
+    <section id="resume-table">
+        <div class="compare--chart_wrapper d-none"></div>
+
+        <table class="table tablesaw tableHead tablesaw-stack" id="tablesaw-350" width="100%">
+            <thead>
+                <tr>
+                    <th scope="col">Nome</th>
+                    <th scope="col">N° partecipanti</th>
+                    <th scope="col">...</th>
+                </tr>
+            </thead>
+            <tbody id="checkall-target">
+                @foreach($records as $record)
+                    <tr>
+                        <td>{{$record->name}}</td>
+                        <td>{{$record->getCount()}}</td>
+                        <td>
+                            <a href="/subscription_member/{{$record->id}}" type="button" class="btn" ><b> <i class="fa-solid fa-chevron-right"></i></b></button>
+                        </td>
+                    </tr>
+                @endforeach
+            </tbody>
+        </table>
+    </section>
+</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>
+@endpush
+
+@push('scripts')
+    <script>
+
+        $(document).ready(function() {
+            loadDataTable();
+        } );
+
+        Livewire.on('load-data-table', () => {
+            loadDataTable();
+        });
+
+        function loadDataTable(){
+            let date = new Date();
+            let date_export = `${date.getFullYear()}${date.getMonth()}${date.getDate()}_`;
+
+            if ( $.fn.DataTable.isDataTable('#tablesaw-350') ) {
+                $('#tablesaw-350').DataTable().destroy();
+            }
+            $('#tablesaw-350').DataTable({
+                processing: true,
+                thead: {
+                'th': {'background-color': 'blue'}
+                },
+                layout: {
+                    topStart : null,
+                    topEnd : null,
+                    top1A: {
+                        // buttons: [
+                        //     {
+                        //         extend: 'collection',
+                        //         text: 'ESPORTA',
+                                buttons: [
+                                    {
+                                        extend: 'excelHtml5',
+                                        text: '<i class="fa-solid fa-file-excel"></i>',
+                                        action: newexportaction,
+                                        title: date_export + 'Abbonamenti',
+                                        exportOptions: {
+                                            columns: ":not(':last')"
+                                        }
+                                    },
+                                    {
+                                        extend: 'pdfHtml5',
+                                        text: '<i class="fa-solid fa-file-pdf"></i>',
+                                        action: newexportaction,
+                                        title: date_export + 'Abbonamenti',
+                                        exportOptions: {
+                                            columns: ":not(':last')"
+                                        }
+                                    },
+                                    {
+                                        extend: 'print',
+                                        action: newexportaction,
+                                        text: '<i class="fa-solid fa-print"></i>',
+                                        title: date_export + 'Abbonamenti',
+                                        exportOptions: {
+                                            columns: ":not(':last')"
+                                        }
+                                    }
+                                ],
+                        //         dropup: true
+                        //     }
+                        // ]
+                    },
+                    top1B : {
+                        pageLength: {
+                            menu: [[10, 25, 50, 100, 100000], [10, 25, 50, 100, "Tutti"]]
+                        }
+                    },
+                    top1C :'search',
+                },
+                pagingType: 'numbers',
+                "language": {
+                    "url": "/assets/js/Italian.json"
+                }/*,
+                "fnInitComplete": function (oSettings, json) {
+                    var html = '&nbsp;<a href="#" class="addData btn--ui"><i class="fa-solid fa-plus"></i></a>';
+                    $(".dt-search").append(html);
+                }*/
+            });
+            $('#tablesaw-350 thead tr th').addClass('col');
+            $('#tablesaw-350 thead tr th').css("background-color", "#f6f8fa");
+
+            $(document).ready(function() {
+                $(document).on("click",".addData",function() {
+                    $(".title--section_addButton").trigger("click")
+                });
+            } );
+
+        }
+
+    </script>
+@endpush
+

+ 3 - 0
resources/views/receipt.blade.php

@@ -143,6 +143,9 @@
         @if ($row->course)
             <b>Corso</b>: {{$row->course->getDetailsName()}}<br><br>
         @endif
+        @if ($row->subscription)
+            <b>Abbonamento</b>: {{$row->subscription->name}}<br><br>
+        @endif
         @if ($row->note != '')
             <b>Dettaglio causale</b>: {{$row->note}}<br><br>
         @endif

+ 263 - 2
routes/web.php

@@ -126,6 +126,9 @@ Route::group(['middleware' => 'tenant'], function () {
     Route::get('/sms_comunications', \App\Http\Livewire\SmsComunications::class);
     Route::get('/mail_comunications', \App\Http\Livewire\EmailComunications::class);
     Route::get('/members_archive', \App\Http\Livewire\MemberArchive::class);
+    Route::get('/subscriptions', \App\Http\Livewire\Subscription::class);
+    Route::get('/subscription_member', \App\Http\Livewire\SubscriptionMembers::class);
+    Route::get('/subscription_member/{id}', \App\Http\Livewire\SubscriptionMember::class);
 
 
     Route::get('/receipt/{id}', function ($id) {
@@ -901,7 +904,7 @@ Route::group(['middleware' => 'tenant'], function () {
             ->leftJoin('receipts', 'records.id', '=', 'receipts.record_id')
             ->where('records.type', 'IN');
 
-        $y = \App\Models\Record::select('records_rows.amount', 'records.member_id', 'records.corrispettivo_fiscale', 'records.deleted', 'records.financial_movement', 'records_rows.causal_id', 'records_rows.course_id', DB::raw('members.first_name as first_name'), DB::raw('members.last_name as last_name')) // , \DB::raw('SUM(records.id) As total'))
+        $y = \App\Models\Record::select('records_rows.amount', 'records.member_id', 'records.corrispettivo_fiscale', 'records.deleted', 'records.financial_movement', 'records_rows.causal_id', 'records_rows.course_id', 'records_rows.subscription_id', DB::raw('members.first_name as first_name'), DB::raw('members.last_name as last_name')) // , \DB::raw('SUM(records.id) As total'))
             ->leftJoin('members', 'records.member_id', '=', 'members.id')
             ->leftJoin('records_rows', 'records.id', '=', 'records_rows.record_id')
             //->leftJoin('receipts', 'records.id', '=', 'receipts.record_id')
@@ -1005,6 +1008,14 @@ Route::group(['middleware' => 'tenant'], function () {
             $x = $x->whereIn('records.id', $courses);
             $y = $y->whereIn('records.id', $courses);
         }
+        if ($_GET["filterSubscriptions"] != "null") {
+            $hasFilter = true;
+            $subscriptions = explode(",", $_GET["filterSubscriptions"]);
+
+            $subscriptions = \App\Models\RecordRow::whereIn('subscription_id', $subscriptions)->pluck('record_id');
+            $x = $x->whereIn('records.id', $subscriptions);
+            $y = $y->whereIn('records.id', $subscriptions);
+        }
         if ($_GET["filterFrom"] != '') {
             $hasFilter = true;
             $x = $x->where('records.date', '>=', $_GET["filterFrom"]);
@@ -1103,11 +1114,14 @@ Route::group(['middleware' => 'tenant'], function () {
 
             $causals = '';
             $courses = '';
+            $subscriptions = '';
             foreach ($r->rows as $row) {
                 $causals .= $row->causal->getTree() . "<br>";
 
                 if ($row->course)
                     $courses .= $row->course->getDetailsName() . "<br>";
+                if ($row->subscription)
+                    $subscriptions .= $row->subscription->name . "<br>";
             }
 
             $datas[] = array(
@@ -1119,7 +1133,7 @@ Route::group(['middleware' => 'tenant'], function () {
                 'last_name' => $r->last_name,
                 'commercial' => $r->financial_movement ? 'Movimento finanziario' : ($r->commercial ? 'SI' : 'NO'),
                 'causals' => $causals,
-                'courses' => $courses,
+                'courses' => $subscriptions . $courses,
                 'payment' => $r->payment_method->name,
                 //'payment_date' => date("d/m/Y", strtotime($r->date)),
                 'status' => $r->deleted ? 'Annullato' : '',
@@ -1971,6 +1985,253 @@ Route::group(['middleware' => 'tenant'], function () {
         return json_encode(array("data" => $ret, "recordsTotal" => sizeof($aRet), "recordsFiltered" => sizeof($aRet)));
     });
 
+    Route::get('/get_subscription_members', function () {
+        $datas = \App\Models\MemberSubscription::select('member_subscriptions.*', 'subscriptions.name as course_name', 'members.first_name', 'members.last_name', 'members.birth_date')
+            ->leftJoin('subscriptions', 'member_subscriptions.subscription_id', '=', 'subscriptions.id')
+            ->leftJoin('members', 'member_subscriptions.member_id', '=', 'members.id');
+
+        if (isset($_GET["search"]["value"]) && trim($_GET["search"]["value"]) != "") {
+            $v = str_replace("'", "\'", stripcslashes($_GET["search"]["value"]));
+
+            $member_ids = \App\Models\Member::where(function ($query) use ($v) {
+                    $query->whereRaw("CONCAT(first_name, ' ', last_name) like '%" . $v . "%'")
+                        ->orWhereRaw("CONCAT(last_name, ' ', first_name) like '%" . $v . "%'");
+                })
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->pluck('id');
+
+            $datas = $datas->whereIn('member_id', $member_ids);
+        }
+
+        if ($_GET["filterCertificateScadenza"] != "null") {
+            $scadenzaValues = explode(",", $_GET["filterCertificateScadenza"]);
+            $allScadIds = [];
+
+            foreach ($scadenzaValues as $filterValue) {
+                if ($filterValue == "1") {
+                    $memberLatestCerts = DB::table('member_certificates')
+                        ->select('member_id', DB::raw('MAX(expire_date) as latest_expire_date'))
+                        ->groupBy('member_id')
+                        ->get();
+
+                    $expiredMemberIds = [];
+                    foreach ($memberLatestCerts as $cert) {
+                        if (date('Y-m-d', strtotime($cert->latest_expire_date)) < date('Y-m-d')) {
+                            $expiredMemberIds[] = $cert->member_id;
+                        }
+                    }
+                    $allScadIds = array_merge($allScadIds, $expiredMemberIds);
+
+                    Log::info("Course members - Expired certificates filter - member count: " . count($expiredMemberIds));
+                } else if ($filterValue == "2") {
+                    $memberLatestCerts = DB::table('member_certificates')
+                        ->select('member_id', DB::raw('MAX(expire_date) as latest_expire_date'))
+                        ->groupBy('member_id')
+                        ->get();
+
+                    $expiringMemberIds = [];
+                    foreach ($memberLatestCerts as $cert) {
+                        $expireDate = date('Y-m-d', strtotime($cert->latest_expire_date));
+                        $today = date('Y-m-d');
+                        $oneMonthLater = date('Y-m-d', strtotime("+1 month"));
+
+                        if ($expireDate >= $today && $expireDate <= $oneMonthLater) {
+                            $expiringMemberIds[] = $cert->member_id;
+                        }
+                    }
+                    $allScadIds = array_merge($allScadIds, $expiringMemberIds);
+                } else if ($filterValue == "3") {
+                    $scadIds = \App\Models\Member::whereNotIn('id', \App\Models\MemberCertificate::pluck('member_id'))
+                        ->where(function($query) {
+                            $query->where('is_archived', false)
+                                ->orWhereNull('is_archived');
+                        })
+                        ->where(function($query) {
+                            $query->where('is_deleted', false)
+                                ->orWhereNull('is_deleted');
+                        })
+                        ->pluck('id')
+                        ->toArray();
+                    $allScadIds = array_merge($allScadIds, $scadIds);
+                } else if ($filterValue == "4") {
+                    $memberLatestCerts = DB::table('member_certificates')
+                        ->select('member_id', DB::raw('MAX(expire_date) as latest_expire_date'))
+                        ->groupBy('member_id')
+                        ->get();
+
+                    $validMemberIds = [];
+                    foreach ($memberLatestCerts as $cert) {
+                        $expireDate = date('Y-m-d', strtotime($cert->latest_expire_date));
+                        $oneMonthLater = date('Y-m-d', strtotime("+1 month"));
+
+                        if ($expireDate > $oneMonthLater) {
+                            $validMemberIds[] = $cert->member_id;
+                        }
+                    }
+                    $allScadIds = array_merge($allScadIds, $validMemberIds);
+                }
+            }
+
+            // Remove duplicates
+            $allScadIds = array_unique($allScadIds);
+            Log::info("Course members - Total members after filterCertificateScadenza: " . count($allScadIds));
+
+            // Apply filter using the collected IDs
+            $datas = $datas->whereIn('member_id', $allScadIds);
+        }
+
+        if ($_GET["fromYear"] != "") {
+            $m_ids = \App\Models\Member::where('birth_date', '<', date("Y-m-d", strtotime("-" . $_GET["fromYear"] . " year", time())))
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->pluck('id');
+            $datas = $datas->whereIn('member_id', $m_ids);
+        }
+
+        if ($_GET["toYear"] != "") {
+            $m_ids = \App\Models\Member::where('birth_date', '>', date("Y-m-d", strtotime("-" . $_GET["toYear"] . " year", time())))
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->pluck('id');
+            $datas = $datas->whereIn('member_id', $m_ids);
+        }
+
+        if ($_GET["fromFromYear"] != "") {
+            $m_ids = \App\Models\Member::whereYear('birth_date', '>=', $_GET["fromFromYear"])
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->pluck('id');
+            $datas = $datas->whereIn('member_id', $m_ids);
+        }
+
+        if ($_GET["toToYear"] != "") {
+            $m_ids = \App\Models\Member::whereYear('birth_date', '<=', $_GET["toToYear"])
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->pluck('id');
+            $datas = $datas->whereIn('member_id', $m_ids);
+        }
+
+        if ($_GET["filterCards"] != "null") {
+            $cards = explode(",", $_GET["filterCards"]);
+            $card_ids = \App\Models\MemberCard::whereIn('card_id', $cards)->pluck('member_id');
+            $datas = $datas->whereIn('member_id', $card_ids);
+        }
+
+        $aRet = [];
+        if (isset($_GET["order"])) {
+            $column = '';
+            if ($_GET["order"][0]["column"] == 1)
+                $column = 'last_name';
+            if ($_GET["order"][0]["column"] == 2)
+                $column = 'first_name';
+            if ($_GET["order"][0]["column"] == 3)
+                $column = 'certificate_expire_date';
+            // if ($_GET["order"][0]["column"] == 4)
+            //     $column = 'gender';
+            if ($column != '')
+                $datas = $datas->orderBy($column, $_GET["order"][0]["dir"]);
+            else
+                $datas = $datas->orderBy('last_name', 'ASC')->orderBy('first_name', 'ASC');
+        } else
+            $datas = $datas->orderBy('last_name', 'ASC')->orderBy('first_name', 'ASC');
+
+        if ($_GET["filterStatus"] != "null") {
+            $status = explode(",", $_GET["filterStatus"]);
+            foreach ($status as $s) {
+                foreach ($datas->get() as $aaa) {
+
+                    $state = \App\Models\Member::findOrFail($aaa->member_id)->isActive();
+                    if ($state["status"] == $s)
+                        $aRet[] = $aaa;
+                }
+            }
+        } else
+            $aRet = $datas->get();
+
+        $ret = [];
+        foreach ($aRet as $idx => $r) {
+            $certificate = \App\Models\MemberCertificate::where('member_id', $r->member_id)
+                ->orderBy('expire_date', 'desc')
+                ->first();
+
+            $certificateInfo = "";
+            if ($certificate) {
+                // Format: status|expire_date|type
+                // Status: 0 = expired, 1 = expiring soon, 2 = valid
+                $today = new DateTime();
+                $expireDate = new DateTime($certificate->expire_date);
+                $oneMonthFromNow = (new DateTime())->modify('+1 month');
+
+                $status = "2"; // Default to valid
+                if ($expireDate < $today) {
+                    $status = "0"; // Expired
+                } elseif ($expireDate < $oneMonthFromNow) {
+                    $status = "1"; // Expiring soon
+                }
+
+                $certificateInfo = $status . "|" . date("d/m/Y", strtotime($certificate->expire_date)) . "|" . $certificate->type;
+            }
+
+            $status = 0;
+            $payed = 0;
+            $rates = \App\Models\Rate::where('member_course_id', $r->id)->where('date', '<', date("Y-m-d"))->get();
+            foreach($rates as $rate)
+            {
+                if ($rate->date > date("Y-m-d"))
+                {
+                    break;
+                }
+                $status = $rate->status;
+                if ($rate->status == 1)
+                    $payed += 1;
+            }
+            if ($status == 1 && $payed != sizeof($rates))
+                $status = 0;
+
+            $ret[] = array(
+                "column_0" => $idx + 1,
+                "column_1" => $r->last_name,
+                "column_2" => $r->first_name,
+                "column_3" => $certificateInfo,
+                "column_4" => $status,
+                "column_5" => $r->id,
+                "column_7" => $r->member_id,
+            );
+        }
+
+        if (isset($_GET["start"]))
+            $ret = array_slice($ret, $_GET["start"], $_GET["length"]);
+
+        return json_encode(array("data" => $ret, "recordsTotal" => sizeof($aRet), "recordsFiltered" => sizeof($aRet)));
+    });
+
     Route::get('/get_receipts', function () {
         $baseQuery = \App\Models\Receipt::select('receipts.id')
             ->leftJoin('members', 'receipts.member_id', '=', 'members.id');