ソースを参照

presence - aggiunto campi per selezione corso inserimento utente al calendar

ferrari 1 ヶ月 前
コミット
46e29bcdd1

+ 171 - 15
app/Http/Livewire/Presence.php

@@ -29,6 +29,19 @@ class Presence extends Component
     public $motivations = [];
     public $motivations_add = [];
 
+    public $insertUser = 'exist';
+    public $course_limit;
+    public $motivation_course_id = null;
+    public $motivation_course_name = 0;
+    public $motivation_course_level = 0;
+    public $motivation_course_type = 0;
+    public $motivation_course_frequency = 0;
+
+    public $course_names = [];
+    public $course_levels = [];
+    public $course_types = [];
+    public $course_frequencies = [];
+
     public $members = [];
 
     public $newMembers = [];
@@ -45,7 +58,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();
@@ -54,6 +75,86 @@ class Presence extends Component
         $this->save_court_id = 0;
         $this->save_instructor_id = 0;
         $this->save_notes = '';
+
+        $this->insertUser = 'exist';
+        $this->course_limit = now()->endOfDay();
+
+        $this->course_names = \App\Models\Course::whereDate('date_from', '<=', $this->course_limit)->whereDate('date_to', '>=', $this->course_limit)->where('active', true)->where('enabled', true)->orderBy('name')->groupBy('name')->pluck('name');
+        $this->course_levels = [];
+        $this->course_types = [];
+        $this->course_frequencies = [];
+    }
+
+    function updatedMotivationCourseName() {
+        if ($this->motivation_course_name > 0 && $this->motivation_course_name != '') {
+            $this->motivation_course_id = null;
+            $this->motivation_course_level = 0;
+            $this->motivation_course_type = 0;
+            $this->motivation_course_frequency = 0;
+
+            $levels_ids = [];
+            $levels = \App\Models\Course::whereDate('date_from', '<=', $this->course_limit)->whereDate('date_to', '>=', $this->course_limit)->where('active', true)->where('enabled', true)->where('name', $this->motivation_course_name)->get();
+            foreach ($levels as $l) {
+                $levels_ids[] = $l->course_level_id;
+            }
+
+            $this->course_levels = \App\Models\CourseLevel::where('enabled', true)->whereIn('id', $levels_ids)->orderBy('name')->get();
+            $this->course_types = [];
+            $this->course_frequencies = [];
+        } else {
+            $this->course_levels = [];
+            $this->course_types = [];
+            $this->course_frequencies = [];
+        }
+    }
+
+    function updatedMotivationCourseLevel() {
+        if ($this->motivation_course_name > 0 && $this->motivation_course_name != '' && $this->motivation_course_level > 0 && $this->motivation_course_level != '') {
+            $this->motivation_course_id = null;
+            $this->motivation_course_type = 0;
+            $this->motivation_course_frequency = 0;
+
+            $type_ids = [];
+            $types = \App\Models\Course::whereDate('date_from', '<=', $this->course_limit)->whereDate('date_to', '>=', $this->course_limit)->where('active', true)->where('enabled', true)->where('name', $this->motivation_course_name)->where('course_level_id', $this->motivation_course_level)->get();
+            foreach ($types as $t) {
+                $type_ids[] = $t->course_type_id;
+            }
+
+            $this->course_types = \App\Models\CourseType::where('enabled', true)->whereIn('id', $type_ids)->orderBy('name')->get();
+            $this->course_frequencies = [];
+        } else {
+            $this->course_types = [];
+            $this->course_frequencies = [];
+        }
+    }
+
+    function updatedMotivationCourseType() {
+        if ($this->motivation_course_name > 0 && $this->motivation_course_name != '' && $this->motivation_course_level > 0 && $this->motivation_course_level != '' && $this->motivation_course_type > 0 && $this->motivation_course_type != '') {
+            $this->motivation_course_id = null;
+            $this->motivation_course_frequency = 0;
+
+            $frequency_ids = [];
+            $frequencies = \App\Models\Course::whereDate('date_from', '<=', $this->course_limit)->whereDate('date_to', '>=', $this->course_limit)->where('active', true)->where('enabled', true)->where('name', $this->motivation_course_name)->where('course_level_id', $this->motivation_course_level)->where('course_type_id', $this->motivation_course_type)->get();
+            foreach ($frequencies as $f) {
+                $frequency_ids[] = $f->course_frequency_id;
+            }
+
+            $this->course_frequencies = \App\Models\CourseFrequency::where('enabled', true)->whereIn('id', $frequency_ids)->orderBy('name')->get();
+        } else {
+            $this->course_frequencies = [];
+        }
+    }
+
+    function updatedMotivationCourseFrequency() {
+        if ($this->motivation_course_name > 0 && $this->motivation_course_name != '' && $this->motivation_course_level > 0 && $this->motivation_course_level != '' && $this->motivation_course_type > 0 && $this->motivation_course_type != '' && $this->motivation_course_frequency > 0 && $this->motivation_course_frequency != '') {
+            $this->motivation_course_id = null;
+
+            $course = \App\Models\Course::whereDate('date_from', '<=', $this->course_limit)->whereDate('date_to', '>=', $this->course_limit)->where('active', true)->where('enabled', true)->where('name', $this->motivation_course_name)->where('course_level_id', $this->motivation_course_level)->where('course_type_id', $this->motivation_course_type)->where('course_frequency_id', $this->motivation_course_frequency)->first();
+
+            $this->motivation_course_id = $course->id;
+        } else {
+            $this->motivation_course_id = null;
+        }
     }
 
     public function updatedNewMemberMotivationId()
@@ -106,11 +207,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 +245,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;
@@ -262,8 +395,9 @@ class Presence extends Component
         // Mappa degli ultimi motivation_id per ogni member_id dell'utente e calendario correnti
         $userId     = \Auth::user()->id;
         $calendarId = $this->calendar->id;
-        $lastEditData = \App\Models\Presence::query()
-            ->select('member_id', 'motivation_id')
+
+        $motivation_query = \App\Models\Presence::query()
+            ->select('member_id', 'motivation_id', 'motivation_course_id')
             ->where('calendar_id', $calendarId)
             ->where('user_id', $userId)
             ->where('status', '<>', 99)
@@ -276,9 +410,10 @@ class Presence extends Component
                     ->groupBy('member_id');
             })
             ->get()
-            ->keyBy('member_id')   // -> [member_id => (obj con motivation_id)]
-            ->map(fn($row) => $row->motivation_id)
-            ->toArray();
+            ->keyBy('member_id');
+
+        $motivationMap = $motivation_query->map(fn($row) => $row->motivation_id)->toArray();
+        $motivationCourseMap = $motivation_query->map(fn($row) => $row->motivation_course_id)->toArray();
 
         // Elimino tutti i dati correnti che devono essere sostituiti
         \App\Models\Presence::query()
@@ -294,7 +429,8 @@ class Presence extends Component
             $p->calendar_id = $calendarId;
 
             // Se per quel membro esisteva un motivation_id, lo riuso, altrimenti lo lascio null
-            $p->motivation_id = $lastEditData[$id] ?? null;
+            $p->motivation_id = $motivationMap[$id] ?? null;
+            $p->motivation_course_id = $motivationCourseMap[$id] ?? null;
             $p->user_id = $userId;
             $p->status = 0;
 
@@ -389,6 +525,7 @@ class Presence extends Component
                 $p->member_id = $member->id;
                 $p->calendar_id = $this->calendar->id;
                 $p->motivation_id = $this->newMemberMotivationId;
+                $p->motivation_course_id = $this->motivation_course_id;
                 $p->user_id = \Auth::user()->id;
                 $p->status = 0;
                 $p->court_id = null;
@@ -421,6 +558,7 @@ class Presence extends Component
                     $p->member_id = $m;
                     $p->calendar_id = $this->calendar->id;
                     $p->motivation_id = $this->newMemberMotivationId;
+                    $p->motivation_course_id = $this->motivation_course_id;
                     $p->user_id = \Auth::user()->id;
                     $p->status = 0;
                     $p->court_id = null;
@@ -444,6 +582,24 @@ class Presence extends Component
             $this->emit('reload');
             $this->emit('saved');
         }
+
+        $this->resetCreationFields();
+    }
+
+    public function resetCreationFields() {
+        $this->insertUser = 'new';
+        $this->motivation_course_id = null;
+        $this->motivation_course_name = null;
+        $this->motivation_course_level = null;
+        $this->motivation_course_type = null;
+        $this->motivation_course_frequency = null;
+        $this->newMemberMotivationId = null;
+        $this->newMemberFirstName = null;
+        $this->newMemberLastName = null;
+        $this->newMemberEmail = null;
+        $this->newMemberFiscalCode = null;
+
+        $this->emit('resetCreationForm');
     }
 
     public function createInstructor()

+ 6 - 0
app/Models/Presence.php

@@ -15,6 +15,7 @@ class Presence extends Model
         'member_course_id',
         'user_id',
         'motivation_id',
+        'motivation_course_id',
         'court_id',
         'instructor_id',
         'notes',
@@ -35,6 +36,11 @@ class Presence extends Model
         return $this->belongsTo(\App\Models\Motivation::class);
     }
 
+    public function motivationCourse()
+    {
+        return $this->belongsTo(\App\Models\Course::class, 'motivation_course_id');
+    }
+
     public function user()
     {
         return $this->belongsTo(\App\Models\User::class, 'user_id');

+ 36 - 0
database/migrations/2025_12_17_102852_add_motivation_course_id_to_presences_table.php

@@ -0,0 +1,36 @@
+<?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::table('presences', function (Blueprint $table) {
+            $table->unsignedBigInteger('motivation_course_id')->nullable()->after('motivation_id');
+
+            $table->foreign('motivation_course_id', 'presences_motivation_course_id_foreign')->references('id')->on('courses')->onUpdate('cascade')->onDelete('cascade');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('presences', function (Blueprint $table) {
+            $table->dropForeign('presences_motivation_course_id_foreign');
+            $table->dropColumn('motivation_course_id');
+        });
+    }
+};

+ 97 - 1
resources/views/livewire/presence.blade.php

@@ -237,9 +237,10 @@
                 </div>
                 <div class="modal-body">
                     <h3 class="text-primary"><input type="radio" name="chkType" value="1" checked onchange="change(1)"> Utente già registrato</h3>
+                    @if ($insertUser == 'exist')
                     <div class="existUser">
                         <div class="row mt-2 ">
-                            <div class="col-md-6">
+                            <div class="col-md-6" wire:ignore>
                                 <label for="member_id" class="form-label">Aggiungere una o più persone</label>
                                 <select name="member_id" class="form-select memberClass" aria-label="Seleziona una persona" multiple>
                                     <option value="">--Seleziona--
@@ -257,13 +258,57 @@
                                     @endforeach
                                 </select>
                             </div>
+                            <div class="col-md-6">
+                                <label for="motivation_course_name" class="form-label">Corso</label>
+                                <select class="form-select form-select-lg me-1 @error('motivation_course_name') is-invalid @enderror" id="motivation_course_name" wire:model="motivation_course_name">
+                                    <option value="">
+                                    @foreach($course_names as $m)
+                                        <option value="{{$m}}">{{$m}}</option>
+                                    @endforeach
+                                </select>
+                            </div>
+                            @if ($motivation_course_name)
+                                <div class="col-md-6">
+                                    <label for="motivation_course_level" class="form-label">Livello</label>
+                                    <select class="form-select form-select-lg me-1 @error('motivation_course_level') is-invalid @enderror" id="motivation_course_level" wire:model="motivation_course_level">
+                                        <option value="">
+                                            @foreach($course_levels as $m)
+                                            <option value="{{$m["id"]}}">{{$m["name"]}}</option>
+                                            @endforeach
+                                        </select>
+                                </div>
+                                @if ($motivation_course_level)
+                                    <div class="col-md-6">
+                                        <label for="motivation_course_type" class="form-label">Tipologia</label>
+                                        <select class="form-select form-select-lg me-1 @error('motivation_course_type') is-invalid @enderror" id="motivation_course_type" wire:model="motivation_course_type">
+                                            <option value="">
+                                            @foreach($course_types as $m)
+                                                <option value="{{$m["id"]}}">{{$m["name"]}}</option>
+                                            @endforeach
+                                        </select>
+                                    </div>
+                                    @if ($motivation_course_type)
+                                        <div class="col-md-6">
+                                            <label for="motivation_course_frequency" class="form-label">Frequenza</label>
+                                            <select class="form-select form-select-lg me-1 @error('motivation_course_frequency') is-invalid @enderror" id="motivation_course_frequency" wire:model="motivation_course_frequency">
+                                                <option value="">
+                                                @foreach($course_frequencies as $m)
+                                                    <option value="{{$m["id"]}}">{{$m["name"]}}</option>
+                                                @endforeach
+                                            </select>
+                                        </div>
+                                    @endif
+                                @endif
+                            @endif
                         </div>
                     </div>
+                    @endif
                     <br>
                     <hr>
                     <br>
                     <h3 class="text-primary"><input type="radio" name="chkType" value="2" onchange="change(2)"> Inserimento nuovo utente</h3>
                     <br>
+                    @if ($insertUser == 'new')
                     <div class="newUser">
                         @if($newMemberFiscalCodeExist)
                         <span style="color:red">Attenzione, utente esistente</span>
@@ -302,8 +347,51 @@
                                     @endforeach
                                 </select>
                             </div>
+                            <div class="col-md-6">
+                                <label for="motivation_course_name" class="form-label">Corso</label>
+                                <select class="form-select form-select-lg me-1 @error('motivation_course_name') is-invalid @enderror" id="motivation_course_name" wire:model="motivation_course_name">
+                                    <option value="">
+                                    @foreach($course_names as $m)
+                                        <option value="{{$m}}">{{$m}}</option>
+                                    @endforeach
+                                </select>
+                            </div>
+                            @if ($motivation_course_name)
+                                <div class="col-md-6">
+                                    <label for="motivation_course_level" class="form-label">Livello</label>
+                                    <select class="form-select form-select-lg me-1 @error('motivation_course_level') is-invalid @enderror" id="motivation_course_level" wire:model="motivation_course_level">
+                                        <option value="">
+                                            @foreach($course_levels as $m)
+                                            <option value="{{$m["id"]}}">{{$m["name"]}}</option>
+                                            @endforeach
+                                        </select>
+                                </div>
+                                @if ($motivation_course_level)
+                                    <div class="col-md-6">
+                                        <label for="motivation_course_type" class="form-label">Tipologia</label>
+                                        <select class="form-select form-select-lg me-1 @error('motivation_course_type') is-invalid @enderror" id="motivation_course_type" wire:model="motivation_course_type">
+                                            <option value="">
+                                            @foreach($course_types as $m)
+                                                <option value="{{$m["id"]}}">{{$m["name"]}}</option>
+                                            @endforeach
+                                        </select>
+                                    </div>
+                                    @if ($motivation_course_type)
+                                        <div class="col-md-6">
+                                            <label for="motivation_course_frequency" class="form-label">Frequenza</label>
+                                            <select class="form-select form-select-lg me-1 @error('motivation_course_frequency') is-invalid @enderror" id="motivation_course_frequency" wire:model="motivation_course_frequency">
+                                                <option value="">
+                                                @foreach($course_frequencies as $m)
+                                                    <option value="{{$m["id"]}}">{{$m["name"]}}</option>
+                                                @endforeach
+                                            </select>
+                                        </div>
+                                    @endif
+                                @endif
+                            @endif
                         </div>
                     </div>
+                    @endif
                 </div>
                 <div class="modal-footer">
                     <button class="btn--ui lightGrey" onclick="annulla()">annulla</a>
@@ -698,14 +786,22 @@
 
         function change(val) {
             if (val == 1) {
+                @this.insertUser = 'exist';
                 $(".existUser").css("display", "block");
                 $(".newUser").css("display", "none");
             } else if (val == 2) {
+                @this.insertUser = 'new';
                 $(".newUser").css("display", "block");
                 $(".existUser").css("display", "none");
             } 
             type = val;
         }
+
+        Livewire.on('resetCreationForm', () => {
+            @this.insertUser = 'exist';
+            $(".existUser").css("display", "block");
+            $(".newUser").css("display", "none");
+        });
         
 </script>
 @endpush