ferrari 2 месяцев назад
Родитель
Сommit
a7a37c56dc

+ 22 - 6
app/Http/Livewire/CourseList.php

@@ -115,9 +115,17 @@ class CourseList extends Component
         {
             $v = str_replace("'", "\'", stripcslashes($this->search));
             $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 . "%'");
-            })->pluck('id');
+                    $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');
             /*
             $v = str_replace("'", "\'", stripcslashes($_GET["search"]["value"]));
             $member_ids = \App\Models\Member::where(function ($query) use ($v) {
@@ -142,9 +150,17 @@ class CourseList extends Component
                 {
                     $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 . "%'");
-                    })->pluck('id');
+                            $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');
                     /*
                     $v = str_replace("'", "\'", stripcslashes($_GET["search"]["value"]));
                     $member_ids = \App\Models\Member::where(function ($query) use ($v) {

+ 36 - 4
app/Http/Livewire/CourseMember.php

@@ -169,22 +169,54 @@ class CourseMember extends Component
         }
         if ($this->fromYear != "")
         {
-            $m_ids = \App\Models\Member::where('birth_date', '<', date("Y-m-d", strtotime("-" . $this->fromYear . " year", time())))->pluck('id');
+            $m_ids = \App\Models\Member::where('birth_date', '<', date("Y-m-d", strtotime("-" . $this->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 ($this->toYear != "")
         {
-            $m_ids = \App\Models\Member::where('birth_date', '>', date("Y-m-d", strtotime("-" . $this->toYear . " year", time())))->pluck('id');
+            $m_ids = \App\Models\Member::where('birth_date', '>', date("Y-m-d", strtotime("-" . $this->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 ($this->fromFromYear != "")
         {
-            $m_ids = \App\Models\Member::whereYear('birth_date', '>=', $this->fromFromYear)->pluck('id');
+            $m_ids = \App\Models\Member::whereYear('birth_date', '>=', $this->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 ($this->toToYear != "")
         {
-            $m_ids = \App\Models\Member::whereYear('birth_date', '<=', $this->toToYear)->pluck('id');
+            $m_ids = \App\Models\Member::whereYear('birth_date', '<=', $this->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["toYear"] != "")

+ 9 - 1
app/Http/Livewire/Dashboard.php

@@ -53,7 +53,15 @@ class Dashboard extends Component
         }
         //$this->totTodayOut = \App\Models\Record::where('type', 'OUT')->where('date', date("Y-m-d"))->rows->sum('amount');
 
-        $this->members = \App\Models\Member::whereBetween('created_at', [date("y-m-d", strtotime('-7 days')), date("Y-m-d 23:59:59")])->select(\DB::raw("COUNT(*) as total, created_at"))->groupBy('created_at')->get();
+        $this->members = \App\Models\Member::whereBetween('created_at', [date("y-m-d", strtotime('-7 days')), date("Y-m-d 23:59:59")])
+            ->where(function($query) {
+                $query->where('is_archived', false)
+                    ->orWhereNull('is_archived');
+            })
+            ->where(function($query) {
+                $query->where('is_deleted', false)
+                    ->orWhereNull('is_deleted');
+            })->select(\DB::raw("COUNT(*) as total, created_at"))->groupBy('created_at')->get();
 
         $this->in = \App\Models\Record::where('type', 'IN')->whereBetween('date', [date("y-m-d", strtotime('-7 days')), date("Y-m-d 23:59:59")])->select(\DB::raw("SUM(amount) as total, date"))->groupBy('date')->get();
         $this->out = \App\Models\Record::where('type', 'OUT')->whereBetween('date', [date("y-m-d", strtotime('-7 days')), date("Y-m-d 23:59:59")])->select(\DB::raw("SUM(amount) as total, date"))->groupBy('date')->get();

+ 28 - 0
app/Http/Livewire/Member.php

@@ -2615,6 +2615,34 @@ class Member extends Component
         }
         return $ret;
     }
+    public function archive($id)
+    {
+        try {
+            $member = \App\Models\Member::findOrFail($id);
+
+            $member->update([
+                'is_archived' => true,
+                'archived_date' => now(),
+                'status' => 'archived',
+
+                'enabled' => false
+            ]);
+
+            updateMemberData($id);
+
+            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', [
+                'member_id' => $id,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
+        }
+    }
 }
 
 class codicefiscale

+ 134 - 0
app/Http/Livewire/MemberArchive.php

@@ -0,0 +1,134 @@
+<?php
+
+namespace App\Http\Livewire;
+
+use Livewire\Component;
+use Illuminate\Support\Facades\Log;
+
+use DateTime;
+
+class MemberArchive extends Component
+{
+    public $categories = [];
+
+    public function mount()
+    {
+        $this->categories = [];
+        $this->getCategories(\App\Models\Category::select('id', 'name')->where('parent_id', null)->orderBy('name')->get(), 0);
+    }
+
+    public function render()
+    {
+        return view('livewire.member_archive');
+    }
+
+    public function getCategories($records, $indentation)
+    {
+        foreach ($records as $record) {
+            $this->categories[] = array('id' => $record->id, 'name' => $record->getTree());
+            if (count($record->childs))
+                $this->getCategories($record->childs, $indentation + 1);
+        }
+    }
+    public function restore($id)
+    {
+        try {
+            $member = \App\Models\Member::findOrFail($id);
+
+            $member->update([
+                'is_archived' => false,
+                'archived_date' => null,
+                'status' => '',
+                'enabled' => true
+            ]);
+
+            updateMemberData($id);
+
+            session()->flash('success', 'Membro riattivato con successo');
+
+            $this->emit('reload');
+        } catch (\Exception $e) {
+            session()->flash('error', 'Errore durante la riattivazione: ' . $e->getMessage());
+            Log::error('Restore member error', [
+                'member_id' => $id,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
+        }
+    }
+
+    public function archive($id)
+    {
+        try {
+            $member = \App\Models\Member::findOrFail($id);
+
+            $member->update([
+                'is_deleted' => true,
+                'deleted_date' => now(),
+
+                'first_name' => 'Nome Archiviato',
+                'last_name' => 'Cognome Archiviato',
+
+                'fiscal_code' => null,
+                'email' => null,
+                'phone' => null,
+                'phone2' => null,
+                'phone3' => null,
+                'address' => null,
+                'zip_code' => null,
+
+                'birth_place' => null,
+                'birth_date' => null,
+                'birth_city_id' => null,
+                'birth_province_id' => null,
+                'birth_nation_id' => null,
+
+                'nation_id' => null,
+                'province_id' => null,
+                'city_id' => null,
+
+                'document_type' => null,
+                'document_number' => null,
+                'document_from' => null,
+                'document_expire_date' => null,
+                'document_files' => null,
+
+                'father_name' => null,
+                'mother_name' => null,
+                'father_email' => null,
+                'mother_email' => null,
+                'father_phone' => null,
+                'mother_phone' => null,
+                'father_fiscal_code' => null,
+                'mother_fiscal_code' => null,
+                'father_doc_number' => null,
+                'father_doc_type' => null,
+                'mother_doc_number' => null,
+                'mother_doc_type' => null,
+                'father_document_files' => null,
+                'mother_document_files' => null,
+
+                'image' => null,
+
+                'gender' => null,
+                'status' => 'archived',
+                'exclude_from_records' => true,
+
+                'enabled' => false
+            ]);
+
+            updateMemberData($id);
+
+            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', [
+                'member_id' => $id,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
+        }
+    }
+}

+ 49 - 9
app/Http/Livewire/Presence.php

@@ -45,7 +45,15 @@ class Presence extends Component
         $this->instructor_id = $this->calendar->instructor_id;
         $this->motivation_manual_id = $this->calendar->motivation_manual_id;
         $this->manual = $this->calendar->manual;
-        $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])->orderBy('last_name')->orderBy('first_name')->get();
+        $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])
+            ->where(function($query) {
+                $query->where('is_archived', false)
+                    ->orWhereNull('is_archived');
+            })
+            ->where(function($query) {
+                $query->where('is_deleted', false)
+                    ->orWhereNull('is_deleted');
+            })->orderBy('last_name')->orderBy('first_name')->get();
         $this->note = $this->calendar->note;
         $this->courts = \App\Models\Court::select('*')->where('enabled', true)->get();
         $this->instructors = \App\Models\User::select('*')->where('level', 2)->where('enabled', true)->orderBy('name', 'asc')->get();
@@ -106,11 +114,27 @@ class Presence extends Component
             if ($this->filter != '') {
                 $filter = $this->filter;
                 $members = \App\Models\Member::whereIn('id', $members_courses)->where(function ($query) use ($filter) {
-                    $query->whereRaw("CONCAT(first_name, ' ', last_name) like '%" . $filter . "%'")
-                        ->orWhereRaw("CONCAT(last_name, ' ', first_name) like '%" . $filter . "%'");
-                })->orderBy('last_name')->orderBy('first_name')->get();
+                        $query->whereRaw("CONCAT(first_name, ' ', last_name) like '%" . $filter . "%'")
+                            ->orWhereRaw("CONCAT(last_name, ' ', first_name) like '%" . $filter . "%'");
+                    })
+                    ->where(function($query) {
+                        $query->where('is_archived', false)
+                            ->orWhereNull('is_archived');
+                    })
+                    ->where(function($query) {
+                        $query->where('is_deleted', false)
+                            ->orWhereNull('is_deleted');
+                    })->orderBy('last_name')->orderBy('first_name')->get();
             } else
-                $members = \App\Models\Member::whereIn('id', $members_courses)->orderBy('last_name')->orderBy('first_name')->get();
+                $members = \App\Models\Member::whereIn('id', $members_courses)
+                    ->where(function($query) {
+                        $query->where('is_archived', false)
+                            ->orWhereNull('is_archived');
+                    })
+                    ->where(function($query) {
+                        $query->where('is_deleted', false)
+                            ->orWhereNull('is_deleted');
+                    })->orderBy('last_name')->orderBy('first_name')->get();
 
             // $presences = \App\Models\Presence::where('calendar_id', $this->calendar->id)->pluck('member_id')->toArray();
             // $my_presences = \App\Models\Presence::where('calendar_id', $this->calendar->id)->where('user_id', \Auth::user()->id)->pluck('member_id')->toArray();
@@ -128,11 +152,27 @@ class Presence extends Component
         if ($this->filter != '') {
             $filter = $this->filter;
             $members = \App\Models\Member::whereIn('id', $members_presences)->where(function ($query) use ($filter) {
-                $query->whereRaw("CONCAT(first_name, ' ', last_name) like '%" . $filter . "%'")
-                    ->orWhereRaw("CONCAT(last_name, ' ', first_name) like '%" . $filter . "%'");
-            })->get();
+                    $query->whereRaw("CONCAT(first_name, ' ', last_name) like '%" . $filter . "%'")
+                        ->orWhereRaw("CONCAT(last_name, ' ', first_name) like '%" . $filter . "%'");
+                })
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->get();
         } else
-            $members = \App\Models\Member::whereIn('id', $members_presences)->get();
+            $members = \App\Models\Member::whereIn('id', $members_presences)
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->get();
 
         foreach ($members as $member) {
             //$this->member_ids[] = $member->id;

+ 9 - 1
app/Http/Livewire/Record.php

@@ -77,7 +77,15 @@ class Record extends Component
 
         $this->getCausals(\App\Models\Causal::select('id', 'name')->where('parent_id', null)->get(), 0);
 
-        $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])->orderBy('last_name')->orderBy('first_name')->get();
+        $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])
+            ->where(function($query) {
+                $query->where('is_archived', false)
+                    ->orWhereNull('is_archived');
+            })
+            ->where(function($query) {
+                $query->where('is_deleted', false)
+                    ->orWhereNull('is_deleted');
+            })->orderBy('last_name')->orderBy('first_name')->get();
 
         $this->payments = \App\Models\PaymentMethod::select('id', 'name', 'type')->where('enabled', true)->where('money', false)->get();
 

+ 45 - 5
app/Http/Livewire/RecordIN.php

@@ -209,13 +209,37 @@ class RecordIN extends Component
         if ($this->add || $this->update)
         {
             if($this->commercial){
-                $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])->orderBy('last_name')->orderBy('first_name')->get();
+                $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])
+                    ->where(function($query) {
+                        $query->where('is_archived', false)
+                            ->orWhereNull('is_archived');
+                    })
+                    ->where(function($query) {
+                        $query->where('is_deleted', false)
+                            ->orWhereNull('is_deleted');
+                    })->orderBy('last_name')->orderBy('first_name')->get();
             } else {
-                $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])->where('current_status', 2)->orWhere('current_status', 1)->orderBy('last_name')->orderBy('first_name')->get();
+                $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])->where('current_status', 2)->orWhere('current_status', 1)
+                    ->where(function($query) {
+                        $query->where('is_archived', false)
+                            ->orWhereNull('is_archived');
+                    })
+                    ->where(function($query) {
+                        $query->where('is_deleted', false)
+                            ->orWhereNull('is_deleted');
+                    })->orderBy('last_name')->orderBy('first_name')->get();
             }
         }
         else
-            $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])->orderBy('last_name')->orderBy('first_name')->get();
+            $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->orderBy('last_name')->orderBy('first_name')->get();
     }
 
     public function resetFields(){
@@ -944,7 +968,15 @@ class RecordIN extends Component
         $exist = false;
         if ($this->newMemberFiscalCode != '')
         {
-            $check = \App\Models\Member::where('fiscal_code', $this->newMemberFiscalCode)->get();
+            $check = \App\Models\Member::where('fiscal_code', $this->newMemberFiscalCode)
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->get();
             $exist = $check->count() > 0;
         }
         if (!$exist)
@@ -958,7 +990,15 @@ class RecordIN extends Component
                 'status' => true
             ]);
             $this->member_id = $member->id;
-            $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])->get();
+            $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->get();
             // $this->emit('reloadMembers');
             $this->emit('refresh');
             $this->newMemberFirstName = '';

+ 5 - 1
app/Models/Member.php

@@ -53,7 +53,11 @@ class Member extends Model
         'current_status',
         'certificate',
         'certificate_date',
-        'to_complete'
+        'to_complete',
+        'is_archived',
+        'archived_date',
+        'is_deleted',
+        'deleted_date',
     ];
     public function nation()
     {

+ 38 - 0
database/migrations/2025_11_24_150237_add_archived_fields_members.php

@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('members', function (Blueprint $table) {
+            $table->boolean('is_archived')->nullable();
+            $table->timestamp('archived_date')->nullable()->after('is_archived');
+            $table->boolean('is_deleted')->nullable();
+            $table->timestamp('deleted_date')->nullable()->after('is_deleted');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('members', function (Blueprint $table) {
+            $table->dropColumn('is_archived');
+            $table->dropColumn('archived_date');
+            $table->dropColumn('is_deleted');
+            $table->dropColumn('deleted_date');
+        });
+    }
+};

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

@@ -148,6 +148,8 @@
                 print "Dashboard";
             if (Request::is('members'))
                 print "Utenti";
+            if (Request::is('members_archive'))
+                print "Archivio utenti";
             if (Request::is('suppliers'))
                 print "Fornitori";
             if (Request::is('in'))
@@ -244,11 +246,11 @@
                     <div id="accordionExample" style="width:100%">
                         <div class="accordion-item">
                             <h2 class="accordion-header linkMenu" id="headingOne" style="margin-top:50px;">
-                                <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne" aria-expanded="{{Request::is('members') || Request::is('suppliers') ? 'true' : 'false'}}" aria-controls="collapseOne">
+                                <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne" aria-expanded="{{Request::is('members') || Request::is('suppliers') || Request::is('members_archive') ? 'true' : 'false'}}" aria-controls="collapseOne">
                                     Anagrafiche
                                 </button>
                             </h2>
-                            <div id="collapseOne" class="accordion-collapse collapse {{Request::is('members') || Request::is('suppliers') ? 'show' : ''}}" aria-labelledby="headingOne" data-bs-parent="#accordionExample">
+                            <div id="collapseOne" class="accordion-collapse collapse {{Request::is('members') || Request::is('suppliers') || Request::is('members_archive') ? 'show' : ''}}" aria-labelledby="headingOne" 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-anagrafica" style="margin-top:0px;">
                                         <li class="nav-item" style="{{Request::is('members') ? 'background-color: #c5d9e6;' : ''}}">
@@ -263,6 +265,11 @@
                                                 </a>
                                             </li>
                                         @endif
+                                        <li class="nav-item {{Request::is('members_archive') ? "nav-item-active" : ""}}">
+                                            <a href="/members_archive" class="nav-link d-flex align-items-center linkMenu">
+                                                <span class="ms-3 d-md-inline">Archivio</span>
+                                            </a>
+                                        </li>
                                     </ul>
                                 </div>
                             </div>

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

@@ -2282,6 +2282,12 @@
                 @this.delete(id);
         }
 
+        function archiveData(id)
+        {
+            if (confirm('Sei sicuro? L\'utente non sarà più visibile ma potrà essere ripristinato dalla sezione Archivio.'))
+                @this.archive(id);
+        }
+
 
         var isFilter = false;
         $(document).ready(function() {
@@ -2524,6 +2530,7 @@
                         data: "action",
                         render: function (data){
                             var ret = '<button type="button" class="btn" onclick="editData(' + data + ')" 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;';
+                            ret += '<button type="button" class="btn" onclick="archiveData(' + data + ')" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Archivia"><i class="fa-regular fa-folder-closed"></i></button>';
                             return ret;
                         }
                     },

+ 613 - 0
resources/views/livewire/member_archive.blade.php

@@ -0,0 +1,613 @@
+<div>
+    <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" style="display:none !important">
+            <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">Archivio utenti</h2>
+            </div>
+        </header>
+
+        <section id="subheader" class="d-flex align-items-center justify-content-between">
+            @if(false)
+            <form action="" class="search--form d-flex align-items-center">
+                <div class="input-group mb-3">
+                    <input type="text" class="form-control" placeholder="Cerca utente" aria-label="cerca utent" aria-describedby="button-addon2" wire:model="search">
+                    @if($showReset)
+                        <button class="btn--ui" type="button" id="button-addon2" onclick="reset()"><i class="ico--ui search"></i>Reset</button>
+                    @else
+                        <button class="btn--ui" type="button" id="button-addon2" wire:click="search()"><i class="ico--ui search"></i>Cerca</button>
+                    @endif
+                </div>
+            </form>
+            @endif
+        </section>
+
+        <div class="showFilter" style="display:none">
+            <hr size="1">
+            <div class="row g-3">
+                <div class="col-md-3">
+                    <div class="row">
+                        <div class="col-md-12" style="margin-bottom:10px;">
+                            <b>Età</b>
+                        </div>
+                        <div class="col-12">
+                            <div class="row mb-2">
+                                <div class="col-3"><label class="form-check-label ms-2" >Da</label></div>
+                                <div class="col-9"><input class="form-control " type="number" name="txtFromYear"></div>
+                            </div>
+                        </div>
+                        <div class="col-12">
+                            <div class="row">
+                                <div class="col-3"><label class="form-check-label ms-2" >A</label></div>
+                                <div class="col-9"><input class="form-control " type="number"  name="txtToYear"></div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <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 name="filterCards" class="form-select filterCards">
+                                <option value="">Tutte
+                                @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 name="filterStatus" 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>Gruppo di interesse</b>
+                        </div>
+                        <div class="col-12">
+                            <select name="filterCategories" class="form-select filterCategories" multiple="multiple">
+                                <option value="">Tutte</option>
+                                @foreach($categories as $category)
+                                    <option value="{{$category["id"]}}">
+                                        {!! str_repeat('&bull; ', $category["indentation"] ?? 0) !!}{{$category["name"]}}
+                                    </option>
+                                @endforeach
+                            </select>
+                        </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-12">
+                            <div class="row mb-2">
+                                <div class="col-3"><label class="form-check-label ms-2" >Da</label></div>
+                                <div class="col-9"><input class="form-control " type="number" name="txtFromYearYear"></div>
+                            </div>
+                        </div>
+                        <div class="col-12">
+                            <div class="row">
+                                <div class="col-3"><label class="form-check-label ms-2" >A</label></div>
+                                <div class="col-9"><input class="form-control " type="number"  name="txtToYearYear"></div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-3">
+                    <div class="row">
+                        <div class="col-md-12" style="margin-bottom:10px;">
+                            <b>Scadenza certificato medico</b>
+                        </div>
+                        <div class="col-12">
+                            <select name="filterScadenza" class="form-select filterScadenza" multiple="multiple">
+                                <option value="1">Scaduti
+                                <option value="2">In scadenza
+                                <option value="3">Non consegnato
+                                <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 name="filterCertificateType" class="form-select filterCertificateType" multiple="multiple">
+                                <option value="">Tutti
+                                <option value="N">Non agonistico
+                                <option value="A">Agonistico
+                            </select>
+                        </div>
+                    </div>
+                </div>
+
+            </div>
+            <div class="row g-3">
+                <div class="col-md-12" style="text-align:right">
+                    <button class="btn--ui lightGrey" onclick="reset()" onclick="destroyDataTable()">Reset</button>
+                    <button class="btn--ui" onclick="loadDataTable()">FILTRA</button>
+                </div>
+            </div>
+            <hr size="1">
+        </div>
+        <section id="anagrafiche--utenti">
+            <div class="compare--chart_wrapper d-none"></div>
+            <table class="table tablesaw tableHead tablesaw-stack table--lista_utenti tableHead" width="100%" id="tablesaw-350" width="100%">
+                <thead>
+                    <tr>
+                        <th scope="col" style="text-align: center">Cognome</th>
+                        <th scope="col">Nome</th>
+                        <th scope="col">Telefono</th>
+                        <th scope="col" style="text-align: center">Età</th>
+                        <th scope="col" style="text-align: center">Anno</th>
+                        <th scope="col">Tesseramento</th>
+                        <th scope="col">Certificato</th>
+                        <th scope="col">...</th>
+                    </tr>
+                </thead>
+                <tbody id="checkall-target"></tbody>
+            </table>
+        </section>
+    </div>
+</div>
+@push('scripts')
+    <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
+    <style>
+        table.tableHead thead
+        {
+            position: sticky;
+            z-index: 100;
+            top: 0;
+        }
+        .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;
+        }
+        a.notSelected
+        {
+            display: flex;
+            margin-right:10px;
+            float:left;
+            height: 2.5rem !important;
+            width:50px;
+            align-items: center;
+            justify-content: center;
+            color: var(--color-blu);
+            background-color: #d3dce1 !important;
+            padding: 0 1.25rem;
+            font-size: 0.875rem;
+            font-family: greycliff-cf, sans-serif;
+            border-radius: 1.875rem !important;
+            -webkit-border-radius: 1.875rem !important;
+            -moz-border-radius: 1.875rem !important;
+            -webkit-transition: all 0.3s ease-in-out;
+            -moz-transition: all 0.3s ease-in-out;
+            -o-transition: all 0.3s ease-in-out;
+            transition: all 0.3s ease-in-out;
+            border: none;
+        }
+        a.selected
+        {
+            display: flex;
+            margin-right:10px;
+            float:left;
+            height: 2.5rem !important;
+            width:50px;
+            align-items: center;
+            justify-content: center;
+            color: #fff;
+            background-color: var(--color-blu) !important;
+            padding: 0 1.25rem;
+            font-size: 0.875rem;
+            font-family: greycliff-cf, sans-serif;
+            border-radius: 1.875rem !important;
+            -webkit-border-radius: 1.875rem !important;
+            -moz-border-radius: 1.875rem !important;
+            -webkit-transition: all 0.3s ease-in-out;
+            -moz-transition: all 0.3s ease-in-out;
+            -o-transition: all 0.3s ease-in-out;
+            transition: all 0.3s ease-in-out;
+            border: none;
+        }
+        div.day
+        {
+            margin-top:20px;
+            color: var(--color-blu);
+            background-color: #ffffff !important;
+            padding: 20px;
+            border-radius: 1.875rem !important;
+            -webkit-border-radius: 1.875rem !important;
+            -moz-border-radius: 1.875rem !important;
+            -webkit-transition: all 0.3s ease-in-out;
+            -moz-transition: all 0.3s ease-in-out;
+            -o-transition: all 0.3s ease-in-out;
+            transition: all 0.3s ease-in-out;
+            border: 2px solid #d3dce1;
+        }
+        .btn--ui.lightGrey, .btn--ui.extraLightGrey
+        {
+            -webkit-border-radius: 0.5rem !important;
+            background-color:#ffffff !important;
+            border: 1px solid grey;
+            color: black;
+            font-weight:normal;
+        }
+
+        .persistent-invalid
+        {
+            border-color: #dc3545 !important;
+            padding-right: calc(1.5em + 0.75rem) !important;
+            background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") !important;
+            background-repeat: no-repeat !important;
+            background-position: right calc(0.375em + 0.1875rem) center !important;
+            background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) !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="/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 restoreData(id)
+        {
+            if (confirm('Sei sicuro? L\'utente verrà ripristinato.'))
+                @this.restore(id);
+        }
+
+        function archiveData(id)
+        {
+            if (confirm('Sei sicuro? Tutti i dati relativi a questo utente verranno archiviati e non saranno più visibili.'))
+                @this.archive(id);
+        }
+
+        var isFilter = false;
+        $(document).ready(function() {
+            $(document).on("click",".showHideFilter",function() {
+                if (isFilter)
+                {
+                    isFilter = false;
+                    $(".showFilter").hide();
+                }
+                else
+                {
+                    isFilter = true;
+                    $(".showFilter").show();
+                }
+            });
+        } );
+
+        $(document).ready(function() {
+            loadFilters();
+            loadDataTable();
+        } );
+
+        function destroyDataTable()
+        {
+            $('#tablesaw-350').DataTable().destroy();
+        }
+
+        $('.filterCards').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+        $('.filterStatus').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+        $('.filterScadenza').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+        $('.filterCertificateType').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+        $('.filterCategories').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+
+        function loadFilters() {
+            let show = false;
+            var filterStatus = localStorage.getItem("filterStatusMember");
+            if (filterStatus != null && filterStatus != "null" && filterStatus != "undefined" && filterStatus)
+            {
+                $('.filterStatus').val(filterStatus).trigger('change');
+                show = true;
+            }
+            var filterCards = localStorage.getItem("filterCardsMember");
+            if (filterCards != null && filterCards != "null" && filterCards != "undefined" && filterCards)
+            {
+                $('.filterCards').val(filterCards).trigger('change');
+                show = true;
+            }
+            var filterScadenza = localStorage.getItem("filterScadenzaMember");
+            if (filterScadenza != null && filterScadenza != "null" && filterScadenza != "undefined" && filterScadenza)
+            {
+                $('.filterScadenza').val(filterScadenza).trigger('change');
+                show = true;
+            }
+            var filterCertificateType = localStorage.getItem("filterCertificateTypeMember");
+            if (filterCertificateType != null && filterCertificateType != "null" && filterCertificateType != "undefined" && filterCertificateType)
+            {
+                $('.filterCertificateType').val(filterCertificateType).trigger('change');
+                show = true;
+            }
+            var filterCategories = localStorage.getItem("filterCategoriesMember");
+            if (filterCategories != null && filterCategories != "null" && filterCategories != "undefined" && filterCategories)
+            {
+                $('.filterCategories').val(filterCategories).trigger('change');
+                show = true;
+            }
+            var fromYear = localStorage.getItem("fromYearMember");
+            if (fromYear != null && fromYear != "null" && fromYear != "undefined" && fromYear)
+            {
+                $('input[name="txtFromYear"]').val(fromYear);
+                show = true;
+            }
+            var toYear = localStorage.getItem("toYearMember");
+            if (toYear != null && toYear != "null" && toYear != "undefined" && toYear)
+            {
+                $('input[name="txtToYear"]').val(toYear);
+                show = true;
+            }
+            var fromYearYear = localStorage.getItem("fromYearYearMember");
+            if (fromYearYear != null && fromYearYear != "null" && fromYearYear != "undefined" && fromYearYear)
+            {
+                $('input[name="txtFromYearYear"]').val(fromYearYear);
+                show = true;
+            }
+
+            var toYearYear = localStorage.getItem("toYearYearMember");
+            if (toYearYear != null && toYearYear != "null" && toYearYear != "undefined" && toYearYear)
+            {
+                $('input[name="txtToYearYear"]').val(toYearYear);
+                show = true;
+            }
+
+            if (show) {
+                $('.showHideFilter').trigger('click');
+            }
+        }
+
+        $(document).on("keypress", $('.filterCategories'), function (e) {
+
+            setTimeout(() => {
+                $(".select2-results__option").each(function(){
+                    var txt = $(this).html();
+                    var count = (txt.match(/-/g) || []).length;
+                    $(this).addClass('paddingLeftSelect' + count);
+                });
+            }, 100);
+        });
+
+        $('.filterCategories').on('select2:open', function (e) {
+            setTimeout(() => {
+                $(".select2-results__option").each(function(){
+                    var txt = $(this).html();
+                    var count = (txt.match(/-/g) || []).length;
+                    $(this).addClass('paddingLeftSelect' + count);
+                });
+            }, 100);
+        });
+
+        function reset()
+        {
+            $('.filterCards').val('').trigger('change');
+            $('.filterStatus').val('').trigger('change');
+            $('.filterScadenza').val('-1').trigger('change');
+            $('.filterCertificateType').val('-1').trigger('change');
+            $('.filterCategories').val('-1').trigger('change');
+
+
+            $('input[name="txtFromYear"]').val('');
+            $('input[name="txtToYear"]').val('');
+
+            $('input[name="txtFromYearYear"]').val('');
+            $('input[name="txtToYearYear"]').val('');
+            loadDataTable();
+        }
+
+        function loadDataTable() {
+            let date = new Date();
+            let date_export = `${date.getFullYear()}${date.getMonth()}${date.getDate()}_`;
+
+            const url = '/get_members?cards=' + $('.filterCards').val() + "&filterCategories=" + $('.filterCategories').val() + "&filterCertificateType=" + $('.filterCertificateType').val() + "&filterScadenza=" + $('.filterScadenza').val() + "&filterStatus=" + $('.filterStatus').val() + "&fromYear=" + $('input[name="txtFromYear"]').val() + "&toYear=" + $('input[name="txtToYear"]').val() + "&fromYearYear=" + $('input[name="txtFromYearYear"]').val() + "&toYearYear=" + $('input[name="txtToYearYear"]').val() + "&archived=1";
+
+            localStorage.setItem("filterCardsMember", $('.filterCards').val());
+            localStorage.setItem("filterCategoriesMember", $('.filterCategories').val());
+            localStorage.setItem("filterCertificateTypeMember", $('.filterCertificateType').val());
+            localStorage.setItem("filterScadenzaMember", $('.filterScadenza').val());
+            localStorage.setItem("filterStatusMember", $('.filterStatus').val());
+            localStorage.setItem("fromYearMember", $('input[name="txtFromYear"]').val());
+            localStorage.setItem("toYearMember", $('input[name="txtToYear"]').val());
+            localStorage.setItem("fromYearYearMember", $('input[name="txtFromYearYear"]').val());
+            localStorage.setItem("toYearYearMember", $('input[name="txtToYearYear"]').val());
+
+            if ($.fn.dataTable.isDataTable('#tablesaw-350')) {
+                $('#tablesaw-350').DataTable().destroy();
+            }
+
+            const pageLength = 10;
+
+            const dataTable = $('#tablesaw-350').DataTable({
+                serverSide: true,
+                processing: true,
+                ajax: url,
+                columns: [
+                    {
+                        data: "last_name",
+                        render: function (data){
+                            const d = data.split("|");
+                            var ret = d[0];
+                            return ret;
+                        }
+                    },
+                    {
+                        data: "first_name",
+                        render: function (data){
+                            const d = data.split("|");
+                            var ret = d[0];
+                            return ret;
+                        }
+                    },
+                    { data: "phone"},
+                    { data: "age", "type": "num", className:"dt-type-numeric"},
+                    { data: "year", className:"dt-type-numeric"},
+                    {
+                        data: "status",
+                        render: function (data){
+                            const d = data.split("|");
+                            var ret = '<span class="tablesaw-cell-content"><span class="badge tessera-badge ' + d[0] + '">' + d[1] + '</span></span>';
+                            return ret;
+                        }
+                    },
+                    {
+                        data: "certificate",
+                        render: function (data){
+                            var ret = '';
+                            if (data != "") {
+                                const d = data.split("|");
+                                ret += '<span class="tablesaw-cell-content d-flex align-items-center">';
+                                if (d[0] == "0") {
+                                    ret += '<i class="ico--ui check suspended me-2"></i>';
+                                    ret += 'Scaduto : ';
+                                }
+                                if (d[0] == "1") {
+                                    ret += '<i class="ico--ui check due me-2"></i>';
+                                    ret += 'In scadenza : ';
+                                }
+                                if (d[0] == "2") {
+                                    ret += '<i class="ico--ui check active me-2"></i>';
+                                    ret += 'Scadenza : ';
+                                }
+                                ret += d[1];
+                                ret += '</span>';
+                            }
+                            if(data == ""){
+                                ret += '<span class="tablesaw-cell-content d-flex align-items-center">';
+                                ret += '<i class="ico--ui check absent me-2"></i>';
+                                ret += 'Non consegnato';
+                                ret += '</span>';
+                            }
+                            return ret;
+                        }
+                    },
+                    {
+                        data: "action",
+                        render: function (data) {
+                            var ret = '<button type="button" class="btn" onclick="restoreData(' + data + ')" data-bs-toggle="popover"  data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Ripristina"><i class="fa-solid fa-rotate-left"></i></button>&nbsp;';
+                            ret += '<button type="button" class="btn" onclick="archiveData(' + data + ')" 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>';
+                            return ret;
+                        }
+                    },
+                ],
+                fixedHeader: false,
+                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 + 'Utenti archiviati',
+                                        exportOptions: {
+                                            columns: ":not(':last')",
+                                            page: 'all'
+                                        }
+                                    },
+                                    {
+                                        extend: 'pdfHtml5',
+                                        text: '<i class="fa-solid fa-file-pdf"></i>',
+                                        action: newexportaction,
+                                        title: date_export + 'Utenti archiviati',
+                                        exportOptions: {
+                                            columns: ":not(':last')"
+                                        },
+                                        customize: function(doc) {
+                                            doc.styles.tableHeader.alignment = 'left';
+                                        }
+                                    },
+                                    {
+                                        extend: 'print',
+                                        action: newexportaction,
+                                        text: '<i class="fa-solid fa-print"></i>',
+                                        title: date_export + 'Utenti archiviati',
+                                        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 style="cursor:pointer" class="showHideFilter btn--ui"><i class="fa-solid fa-sliders"></i></a>';
+                    html += '&nbsp;<a style="cursor:pointer" class="addData btn--ui"><i class="fa-solid fa-plus"></i></a>';
+                    $(".dt-search").append(html);
+                    
+                    loadFilters();
+                }
+            });
+
+            $('#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()
+            });
+        }
+
+        Livewire.on('reload', (x) =>
+        {
+            location.reload();
+        });
+    </script>
+@endpush

+ 124 - 17
routes/web.php

@@ -94,6 +94,7 @@ Route::group(['middleware' => 'auth'], function () {
     Route::get('/courts', \App\Http\Livewire\Court::class);
     Route::get('/motivations', \App\Http\Livewire\Motivation::class);
     Route::get('/reports', \App\Http\Livewire\Reports::class);
+    Route::get('/members_archive', \App\Http\Livewire\MemberArchive::class);
 });
 
 Route::get('/receipt/{id}', function ($id) {
@@ -178,8 +179,20 @@ Route::get('/get_members', function () {
 
     $datas = [];
 
+    $archived = (isset($_GET['archived']) && $_GET['archived'] == 1) ? true : false;
+
     // $datas = \App\Models\Member::select('members.*')->where('id', '>', 0);
-    $x = \App\Models\Member::select('id', 'first_name', 'last_name', 'phone', 'birth_date', 'to_complete', 'current_status', 'certificate', 'certificate_date')->where('id', '>', 0);
+    $x = \App\Models\Member::select('id', 'first_name', 'last_name', 'phone', 'birth_date', 'to_complete', 'current_status', 'certificate', 'certificate_date')
+        ->where('id', '>', 0)
+        ->where(function($query) use($archived) {
+            $query->where('is_archived', $archived);
+            if (!$archived)
+                $query->orWhereNull('is_archived');
+        })
+        ->where(function($query) {
+            $query->where('is_deleted', false)
+                ->orWhereNull('is_deleted');
+        });
 
     if (isset($_GET["search"]["value"]) && $_GET["search"]["value"] != "") {
         $v = str_replace("'", "\'", stripcslashes($_GET["search"]["value"]));
@@ -286,7 +299,17 @@ Route::get('/get_members', function () {
                 }
                 $scadIds = $expiringMemberIds;
             } else if ($filterValue == "3") {
-                $scadIds = \App\Models\Member::whereNotIn('id', \App\Models\MemberCertificate::pluck('member_id'))->pluck('id')->toArray();
+                $scadIds = \App\Models\Member::whereNotIn('id', \App\Models\MemberCertificate::pluck('member_id'))
+                    ->where(function($query) use($archived) {
+                        $query->where('is_archived', $archived);
+                        if (!$archived)
+                            $query->orWhereNull('is_archived');
+                    })
+                    ->where(function($query) {
+                        $query->where('is_deleted', false)
+                            ->orWhereNull('is_deleted');
+                    })
+                    ->pluck('id')->toArray();
             } else if ($filterValue == "4") {
                 $memberLatestCerts = DB::table('member_certificates')
                     ->select('member_id', DB::raw('MAX(expire_date) as latest_expire_date'))
@@ -315,7 +338,19 @@ Route::get('/get_members', function () {
 
     if ($_GET["filterStatus"] != "null") {
         $status = explode(",", $_GET["filterStatus"]);
-        $members = \App\Models\Member::all();
+        // $members = \App\Models\Member::all();
+        // Only get non-archived members for status filtering
+        $members = \App\Models\Member::where(function($query) use($archived) {
+            $query->where(function($q) use($archived) {
+                $q->where('is_archived', $archived);
+                if (!$archived)
+                    $q->orWhereNull('is_archived');
+            })
+            ->where(function($q) {
+                $q->where('is_deleted', false)
+                    ->orWhereNull('is_deleted');
+            });
+        })->get();
         foreach ($status as $s) {
             foreach ($members as $m) {
                 $state = $m->getStatus();
@@ -603,7 +638,15 @@ Route::get('/get_record_in', function () {
             $excludeCausals[] = $e->id;
         }*/
 
-    $exclude_from_records = \App\Models\Member::where('exclude_from_records', true)->pluck('id')->toArray();
+    $exclude_from_records = \App\Models\Member::where('exclude_from_records', true)
+        ->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();
 
     // Pagamento money
     $moneys = \App\Models\PaymentMethod::where('money', true)->pluck('id')->toArray();
@@ -831,9 +874,17 @@ Route::get('/get_course_list', function () {
         if ($_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 . "%'");
-            })->pluck('id');
+                    $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');
             /*
                 $v = str_replace("'", "\'", stripcslashes($_GET["search"]["value"]));
                 $member_ids = \App\Models\Member::where(function ($query) use ($v) {
@@ -1206,9 +1257,17 @@ Route::get('/get_course_members', function () {
         $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 . "%'");
-        })->pluck('id');
+                $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');
 
         /*$member_ids = \App\Models\Member::where(function ($query) use ($v) {
                 $query->where('first_name', 'like', '%' . $v . '%')
@@ -1322,6 +1381,14 @@ Route::get('/get_course_members', function () {
                 $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);
@@ -1353,21 +1420,53 @@ Route::get('/get_course_members', function () {
     }
 
     if ($_GET["fromYear"] != "") {
-        $m_ids = \App\Models\Member::where('birth_date', '<', date("Y-m-d", strtotime("-" . $_GET["fromYear"] . " year", time())))->pluck('id');
+        $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())))->pluck('id');
+        $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"])->pluck('id');
+        $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"])->pluck('id');
+        $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") {
@@ -1490,9 +1589,17 @@ Route::get('/get_receipts', function () {
     if (isset($_GET["search"]["value"]) && !empty($_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 . "%'");
-        })->pluck('id');
+                $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');
         $baseQuery = $baseQuery->whereIn('receipts.member_id', $member_ids);
     }