Jelajahi Sumber

corsi - modificata associazione causale

ferrari 2 bulan lalu
induk
melakukan
0835d16e11

+ 18 - 1
app/Http/Livewire/Causals.php

@@ -20,6 +20,7 @@ class Causals extends Component
     public $idx = -1;
     public $causal_id = null;
     public $show_hidden = true;
+    public $show_course_causals = true;
 
     public function boot()
     {
@@ -75,16 +76,23 @@ class Causals extends Component
     {
         $reset = false;
 
-        // Build query with visibility filter
         $visibilityFilter = function($query) {
             return $query;
         };
+        $courseFilter = function($query) {
+            return $query;
+        };
 
         if ($this->show_hidden == false) {
             $visibilityFilter = function($query) {
                 return $query->where('hidden', false);
             };
         }
+        if ($this->show_course_causals == false) {
+            $courseFilter = function($query) {
+                return $query->whereNotIn('name', ['PAGAMENTO CORSO', 'PAGAMENTO ISCRIZIONE']);
+            };
+        }
 
         if ($this->level_1_id > 0) {
             $this->level_2 = \App\Models\Causal::where('parent_id', $this->level_1_id)
@@ -92,6 +100,9 @@ class Causals extends Component
                 ->where(function($query) use ($visibilityFilter) {
                     return $visibilityFilter($query);
                 })
+                ->where(function($query) use ($courseFilter) {
+                    return $courseFilter($query);
+                })
                 ->orderBy('name')
                 ->get();
 
@@ -107,6 +118,9 @@ class Causals extends Component
                 ->where(function($query) use ($visibilityFilter) {
                     return $visibilityFilter($query);
                 })
+                ->where(function($query) use ($courseFilter) {
+                    return $courseFilter($query);
+                })
                 ->orderBy('name')
                 ->get();
 
@@ -126,6 +140,9 @@ class Causals extends Component
             ->where(function($query) use ($visibilityFilter) {
                 return $visibilityFilter($query);
             })
+            ->where(function($query) use ($courseFilter) {
+                return $courseFilter($query);
+            })
             ->orderBy('name')
             ->get();
 

+ 15 - 10
app/Http/Livewire/Course.php

@@ -244,7 +244,8 @@ class Course extends Component
                 // Creo le causali di pagamento
                 //$causal = "PAGAMENTO CORSO [nome corso]-LIVELLO-FREQUENZA-ANNO-[tipo abbonamento]-[mese inizio]/[mese fine]
 
-                $causal = "PAGAMENTO CORSO " . $this->name . " - " . $lev . " - " . $freq . " - " . $this->year . " - " . $mFrom . "/" . $mTo;
+                // $causal = "PAGAMENTO CORSO " . $this->name . " - " . $lev . " - " . $freq . " - " . $this->year . " - " . $mFrom . "/" . $mTo;
+                $causal = "PAGAMENTO CORSO";
                 $cp = \App\Models\Causal::where('name', $causal)->first();
                 if (!$cp)
                 {
@@ -263,7 +264,8 @@ class Course extends Component
                 }
                 $course->causal_id = $cp->id;
 
-                $causal = "PAGAMENTO ISCRIZIONE " . $this->name . " - " . $lev . " - " . $freq . " - " . $this->year . " - " . $mFrom . "/" . $mTo;
+                // $causal = "PAGAMENTO ISCRIZIONE " . $this->name . " - " . $lev . " - " . $freq . " - " . $this->year . " - " . $mFrom . "/" . $mTo;
+                $causal = "PAGAMENTO ISCRIZIONE";
                 $ci = \App\Models\Causal::where('name', $causal)->first();
                 if (!$ci)
                 {
@@ -447,14 +449,17 @@ class Course extends Component
     public function duplicate($id, $isMultiple){
         $course = \App\Models\Course::findOrFail($id);
         $newCourse = $course->replicate();
-        $newYear = date("Y") . "-" . (date("Y") + 1);
-        if ($course->year != '')
-        {
-            // list($u, $y) = explode("-", $course->year);
-            // $newYear = ($u + 1) . "-" . ($u + 2);
-            $newYear = $course->year;
-        }
-        $newCourse->year = $newYear;
+        // $newYear = date("Y") . "-" . (date("Y") + 1);
+        // if ($course->year != '')
+        // {
+        //     // list($u, $y) = explode("-", $course->year);
+        //     // $newYear = ($u + 1) . "-" . ($u + 2);
+        //     $newYear = $course->year;
+        // }
+        // $newCourse->year = $newYear;
+        $newCourse->date_from = null;
+        $newCourse->date_to = null;
+        $newCourse->year = null;
         $newCourse->save();
         if (!$isMultiple)
             $this->edit($newCourse->id);

+ 2 - 13
app/Http/Livewire/Dashboard.php

@@ -532,12 +532,7 @@ class Dashboard extends Component
                 $frequencyName = $course->frequency?->name ?? '';
                 $typeName = $course->getFormattedTypeField() ?? '';
 
-                $courseNameParts = [$courseName];
-                if ($levelName) $courseNameParts[] = $levelName;
-                // if ($typeName) $courseNameParts[] = $typeName;
-                if ($frequencyName) $courseNameParts[] = $frequencyName;
-
-                $fullCourseName = implode(' - ', $courseNameParts);
+                $fullCourseName = $course->getDetailsName();
 
                 return [
                     'time' => $todaySchedule['from'] . ' - ' . $todaySchedule['to'],
@@ -630,13 +625,7 @@ class Dashboard extends Component
                 $frequencyName = is_object($course->frequency) ? $course->frequency->name : '';
                 $typeName = $course->getFormattedTypeField() ?? '';
 
-                // Build display name with level and frequency
-                $displayNameParts = [$courseName];
-                if ($levelName) $displayNameParts[] = $levelName;
-                // if ($typeName) $displayNameParts[] = $typeName;
-                if ($frequencyName) $displayNameParts[] = $frequencyName;
-
-                $displayName = implode(' - ', $displayNameParts);
+                $displayName = $course->getDetailsName();
 
                 // Assegna colori basati sul nome del corso
                 $color = $this->getCourseColor($courseName);

+ 54 - 7
app/Http/Livewire/RecordIN.php

@@ -50,6 +50,7 @@ class RecordIN extends Component
     }
 
     public $courseId = 0;
+    public $course = null;
     public $rateId = 0;
     public $months = array();
 
@@ -74,7 +75,7 @@ class RecordIN extends Component
 
     public $currentReceip;
 
-    public $filterMember = 0, $filterPaymentMethod = 0, $filterCausals = 0, $filterFrom = '', $filterTo = '', $filterCommercial = 0;
+    public $filterMember = 0, $filterPaymentMethod = 0, $filterCausals = 0, $fitlerCourses = 0, $filterFrom = '', $filterTo = '', $filterCommercial = 0;
 
     public $hasFilter = false;
 
@@ -99,6 +100,7 @@ class RecordIN extends Component
     public $newMemberFiscalCodeExist = false;
 
     public $causals = array();
+    public $courses = array();
     public $payments = array();
     public $members = array();
     public $vats = array();
@@ -164,6 +166,12 @@ class RecordIN extends Component
     public function hydrate()
     {
         $this->emit('load-select');
+
+        foreach ($this->rows as $i => $row) {
+            if (isset($row['course']) && is_array($row['course']) && isset($row['course']['id'])) {
+                $this->rows[$i]['course'] = \App\Models\Course::find($row['course']['id']);
+            }
+        }
     }
 
     /*public function updated() {
@@ -264,7 +272,7 @@ class RecordIN extends Component
         $this->backToRates = false;
         $this->months = array();
         $this->rows = array();
-        $this->rows[] = array('causal_id' => isset($_GET["causalId"]) ? $_GET["causalId"] : null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0, 'sconto' => 0);
+        $this->rows[] = array('causal_id' => isset($_GET["causalId"]) ? $_GET["causalId"] : null, 'course_id' => null, 'course' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0, 'sconto' => 0);
         $this->corrispettivo = [];
         $this->emit('load-data-table');
     }
@@ -331,6 +339,15 @@ class RecordIN extends Component
         }
     }
 
+    public function getCourses($records, $indentation)
+    {
+        foreach ($records as $record) {
+            $this->courses[] = array('id' => $record->id, 'name' => $record->getDetailsName(), 'text' => $record->getDetailsName(), 'level' => $indentation);
+            if (count($record->childs))
+                $this->getCourses($record->childs, $indentation + 1);
+        }
+    }
+
     public function mount()
     {
 
@@ -339,6 +356,7 @@ class RecordIN extends Component
         }
 
         $this->causals = array();
+        $this->courses = array();
 
         $this->multiMonthFrom = date("n");
         $this->multiYearFrom = date("Y");
@@ -351,6 +369,8 @@ class RecordIN extends Component
 
         $this->getCausale(\App\Models\Causal::select('id', 'name')->where('parent_id', null)->where('type', 'IN')->get(), 0);
 
+        $this->getCourses(\App\Models\Course::where('parent_id', null)->get(), 0);
+
         //$this->buildTree(\App\Models\Causal::all(), null);
 
         $this->refreshMembers();
@@ -387,7 +407,8 @@ class RecordIN extends Component
             if (isset($_GET["courseId"])) {
                 $this->courseId = $_GET["courseId"];
                 $mc = \App\Models\MemberCourse::findOrFail($this->courseId);
-                $course = \App\Models\Course::findOrFail($mc->course_id);
+                $this->course = \App\Models\Course::findOrFail($mc->course_id);
+                $this->rows[0]['course'] = $this->course;
             }
             if (isset($_GET["rateId"])) {
                 $this->rateId = $_GET["rateId"];
@@ -471,14 +492,20 @@ class RecordIN extends Component
 
                 $this->createSubscription = 1;
                 $this->courseId = $_GET["courseId"];
+                if ($this->courseId) {
+                    $mc = \App\Models\MemberCourse::findOrFail($this->courseId);
+                    $this->course = \App\Models\Course::findOrFail($mc->course_id);
+                }
                 $this->rateId = $_GET["rateId"];
                 $price = $_GET["subscription_price"] / 100 * 100;
                 $this->refreshAfter = 1;
                 if ($count == 1)
-                    $this->rows[] = array('causal_id' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0);
+                    $this->rows[] = array('causal_id' => null, 'course_id' => null, 'course' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0);
                 $this->rows[$count]["causal_id"] = null;
+                $this->rows[$count]["course_id"] = $this->course->id ?? null;
+                $this->rows[$count]["course"] = $this->course ?? null;
                 $this->rows[$count]["amount"] = formatPrice($price);
-                $this->rows[$count]["note"] = "Pagamento iscrizione " . $course->name;
+                $this->rows[$count]["note"] = "Pagamento iscrizione " . $this->course->name;
                 if (isset($_GET["subCausalId"])) {
                     $this->refreshAfter = 1;
                     $this->rows[$count]["causal_id"] = $_GET["subCausalId"];
@@ -498,6 +525,7 @@ class RecordIN extends Component
         $this->filterMember = 0;
         $this->filterPaymentMethod = 0;
         $this->filterCausals = 0;
+        $this->filterCourses = 0;
         $this->filterTo = '';
         $this->filterFrom = '';
         $this->filterCommercial = 0;
@@ -562,10 +590,16 @@ class RecordIN extends Component
                         'financial_movement' => $this->financial_movement,
                         'deleted' => $this->deleted
                     ]);
+                        
+                    if ($this->courseId) {
+                        $mc = \App\Models\MemberCourse::findOrFail($this->courseId);
+                        $this->course = \App\Models\Course::findOrFail($mc->course_id);
+                    }
 
                     \App\Models\RecordRow::create([
                         'record_id' => $record->id,
                         'causal_id' => $this->corrispettivo_causal_id,
+                        'course_id' => $this->course->id ?? null,
                         'note' => '',
                         'amount' => $price,
                         'vat_id' => null,
@@ -684,6 +718,7 @@ class RecordIN extends Component
                 \App\Models\RecordRow::create([
                     'record_id' => $this->dataId,
                     'causal_id' => $row["causal_id"],
+                    'course_id' => $row["course_id"],
                     'note' => $row["note"],
                     'amount' => $rowNet,
                     'prediscount_amount' => $rowAmount,
@@ -814,7 +849,7 @@ class RecordIN extends Component
                 $this->add = false;
 
                 $rows = \App\Models\RecordRow::where('record_id', $this->dataId)
-                    ->select('causal_id', 'note', 'commercial', 'when', 'amount', 'prediscount_amount', 'sconto', 'vat_id')
+                    ->select('causal_id', 'course_id', 'note', 'commercial', 'when', 'amount', 'prediscount_amount', 'sconto', 'vat_id')
                     ->get();
 
                 $this->rows = [];
@@ -829,8 +864,18 @@ class RecordIN extends Component
                         }
                     }
 
+                    $course = null;
+                    if ($r->course_id) {
+                        try {
+                            $course = \App\Models\Course::findOrFail($r->course_id);
+                        } catch (\Throwable $th) {
+                        }
+                    }
+
                     $this->rows[] = [
                         'causal_id' => $causalId,
+                        'course_id' => $r->course_id,
+                        'course' => $course,
                         'note' => $r->note,
                         'commercial' => $r->commercial,
                         'when' => json_decode($r->when),
@@ -995,6 +1040,7 @@ class RecordIN extends Component
                 \App\Models\RecordRow::create([
                     'record_id' => $this->dataId,
                     'causal_id' => $row["causal_id"],
+                    'course_id' => $row["course_id"],
                     'note' => $row["note"],
                     'vat_id' => $row["vat_id"],
                     'amount' => $rowNet,
@@ -1247,6 +1293,7 @@ class RecordIN extends Component
                     \App\Models\ReceiptRow::create([
                         'receip_id' => $receipt->id,
                         'causal_id' => $row["causal_id"],
+                        'course_id' => $row["course_id"],
                         'note' => $row["note"],
                         'vat_id' => $row["vat_id"],
                         'amount' => $rowNet,
@@ -1288,7 +1335,7 @@ class RecordIN extends Component
 
     public function addRow()
     {
-        $this->rows[] = array('causal_id' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0);
+        $this->rows[] = array('causal_id' => null, 'course_id' => null, 'course' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'vat_id' => null, 'note' => '', 'commercial' => 0);
         $this->emit('load-select');
     }
 

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

@@ -249,6 +249,7 @@ class Reports extends Component
         $query = DB::table('records_rows')
             ->join('records', 'records_rows.record_id', '=', 'records.id')
             ->join('causals', 'records_rows.causal_id', '=', 'causals.id')
+            ->leftJoin('courses', 'records_rows.course_id', '=', 'courses.id')
             ->whereBetween('records.date', [$dateRange['start'], $dateRange['end']]);
 
         $query->where('records.type', 'IN');
@@ -259,13 +260,14 @@ class Reports extends Component
             'causals.id',
             'causals.name',
             'causals.parent_id',
+            'courses.id as course_id',
             DB::raw('SUM(records_rows.amount) as total_amount')
         )
             ->where(function ($query) {
                 $query->where('causals.no_reports', '=', '0')
                     ->orWhereNull('causals.no_reports');
             })
-            ->groupBy('causals.id', 'causals.name', 'causals.parent_id')
+            ->groupBy('causals.id', 'causals.name', 'causals.parent_id', 'courses.id')
             ->orderBy('total_amount', 'desc')
             ->limit($limit)
             ->get();
@@ -284,6 +286,12 @@ class Reports extends Component
 
             //$displayName = strlen($treeName) > 30 ? substr($treeName, 0, 27) . '...' : $treeName;
             $displayName = $treeName;
+
+            if (isset($causal->course_id) && $causal->course_id) {
+                $course = \App\Models\Course::find($causal->course_id);
+                $displayName .= " - " . $course->getDetailsName();
+            }
+
             $inData[] = [
                 'label' => $displayName,
                 'value' => $causal->total_amount,

+ 15 - 0
app/Models/Course.php

@@ -141,4 +141,19 @@ class Course extends Model
     {
         return ucfirst($this->attributes['type'] ?? 'No Type');
     }
+
+    public function getDetailsName() {
+        $courseName = $this->name ?? 'Corso Sconosciuto';
+        $levelName = is_object($this->level) ? $this->level->name : '';
+        $frequencyName = is_object($this->frequency) ? $this->frequency->name : '';
+        $typeName = $this->getFormattedTypeField() ?? '';
+
+        // Build display name with level and frequency
+        $displayNameParts = [$courseName];
+        if ($levelName) $displayNameParts[] = $levelName;
+        // if ($typeName) $displayNameParts[] = $typeName;
+        if ($frequencyName) $displayNameParts[] = $frequencyName;
+
+        return implode(' - ', $displayNameParts);
+    }
 }

+ 6 - 0
app/Models/ReceiptRow.php

@@ -14,6 +14,7 @@ class ReceiptRow extends Model
     protected $fillable = [
         'receip_id',
         'causal_id',
+        'course_id',
         'when',
         'amount',
         'note',
@@ -47,4 +48,9 @@ class ReceiptRow extends Model
     {
         return $this->belongsTo(Receipt::class, 'receip_id', 'id');
     }
+
+    public function course()
+    {
+        return $this->belongsTo(Course::class);
+    }
 }

+ 5 - 0
app/Models/RecordRow.php

@@ -14,6 +14,7 @@ class RecordRow extends Model
     protected $fillable = [
         'record_id',
         'causal_id',
+        'course_id',
         'when',
         'amount',
         'vat_id',
@@ -34,5 +35,9 @@ class RecordRow extends Model
         return $this->belongsTo(Causal::class);
     }
 
+    public function course()
+    {
+        return $this->belongsTo(Course::class);
+    }
 }
 

+ 33 - 0
database/migrations/2025_11_14_145909_add_course_id_to_records_rows.php

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

+ 33 - 0
database/migrations/2025_11_17_114817_add_course_id_to_receipts_rows.php

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

+ 2 - 2
resources/views/livewire/course.blade.php

@@ -175,13 +175,13 @@
                             <div class="col-3 mt-2">
                                 <div class="form--item">
                                     <label for="inputName" class="form-label">Data inizio</label>
-                                    <input class="form-control @error('name') is-invalid @enderror" type="date" placeholder="Data inizio" wire:model="date_from">
+                                    <input class="form-control @error('date_from') is-invalid @enderror" type="date" placeholder="Data inizio" wire:model="date_from">
                                 </div>
                             </div>
                             <div class="col-3 mt-2">
                                 <div class="form--item">
                                     <label for="inputName" class="form-label">Data fine</label>
-                                    <input class="form-control @error('name') is-invalid @enderror" type="date" placeholder="Data fine" wire:model="date_to">
+                                    <input class="form-control @error('date_to') is-invalid @enderror" type="date" placeholder="Data fine" wire:model="date_to">
                                 </div>
                             </div>
                             @if(false)

+ 3 - 3
resources/views/livewire/member_archive.blade.php

@@ -292,7 +292,7 @@
     <script>
         function restoreData(id)
         {
-            if (confirm('Sei sicuro? L\'utente verrà riattivato.'))
+            if (confirm('Sei sicuro? L\'utente verrà ripristinato.'))
                 @this.restore(id);
         }
 
@@ -523,8 +523,8 @@
                     {
                         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="Riattiva"><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-solid fa-trash"></i></button>';
+                            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;
                         }
                     },

+ 64 - 12
resources/views/livewire/records_in.blade.php

@@ -114,6 +114,20 @@
                         </div>
                     </div>
                 </div>
+                <div class="col-md-2">
+                    <div class="row">
+                        <div class="col-md-12" style="margin-bottom:10px;">
+                            <b>Corsi</b>
+                        </div>
+                        <div class="col-12">
+                            <select name="search_course_id" class="form-select filterCourses" multiple="multiple">
+                                @foreach($courses as $course)
+                                    <option value="{{$course["id"]}}">{!!$course["name"]!!}
+                                @endforeach
+                            </select>
+                        </div>
+                    </div>
+                </div>
             </div>
             <div class="row g-3">
                 <div class="col-md-12" style="text-align:right">
@@ -137,6 +151,7 @@
                         <th scope="col">Nome</th>
                         <th scope="col">Commerciale</th>
                         <th scope="col">Causale</th>
+                        <th scope="col">Corso</th>
                         <th scope="col">Pagamento</th>
 
                         <th scope="col">Stato</th>
@@ -344,22 +359,32 @@
                             </div>
 
                             @foreach($rows as $idx => $row)
-
                                 <div class="row gx-2 mt-3" >
-                                    <span class="title-form d-block w-100">Causale</span>
-                                    <div class="col-md-12">
-
-                                        @if($this->dataId > 0 && !$isDuplicate)
+                                    <div class="@if ($fromCourse || $row['course_id'])col-md-6 @endif col-xs-12">
+                                        <span class="title-form d-block w-100">Causale</span>
+                                        @if ($fromCourse || $row['course_id'])
                                             {{$this->getCausal($rows[$idx]['causal_id'])}}<br>
                                         @else
-                                            <livewire:causals :type="$typeIN" :idx="$idx" :show_hidden=0 :causal_id="$rows[$idx]['causal_id']" :wire:key="$idx"/>
-                                        @endif
+                                            @if($this->dataId > 0 && !$isDuplicate)
+                                                {{$this->getCausal($rows[$idx]['causal_id'])}}<br>
+                                            @else
+                                                <livewire:causals :type="$typeIN" :idx="$idx" :show_hidden=0 :show_course_causals=0 :causal_id="$rows[$idx]['causal_id']" :wire:key="$idx"/>
+                                            @endif
 
-                                        @error('rows.'. $idx . '.causal_id')
-                                            <span style="argin-top: 0.25rem; font-size: 0.875em; color: var(--bs-form-invalid-color);">{{ $message }}</span>
-                                        @enderror
+                                            @error('rows.'. $idx . '.causal_id')
+                                                <span style="argin-top: 0.25rem; font-size: 0.875em; color: var(--bs-form-invalid-color);">{{ $message }}</span>
+                                            @enderror
+                                        @endif
 
                                     </div>
+                                    @if ($fromCourse || (isset($row['course']) && $row['course'] != null))
+                                        <div class="col-md-6 col-xs-12">
+                                            <span class="title-form d-block w-100">Corso</span>
+                                            @if (isset($row['course']))
+                                                {{$row['course']->getDetailsName()}}
+                                            @endif
+                                        </div>
+                                    @endif
                                 </div>
 
                                 <div class="row gx-2 mt-3">
@@ -560,7 +585,7 @@
 
                             @endforeach
 
-                            @if($this->dataId == 0)
+                            @if($this->dataId == 0 && !$fromCourse)
                             <br>
                             <button type="button" class="btn--ui primary" wire:click.prevent="addRow()">
                                 Aggiungi causale
@@ -1030,6 +1055,11 @@
                 //var data = $('.filterCausals').select2("val");
                 //@this.set('filterCausals', data);
             });
+            $('.filterCourses').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+            $('.filterCourses').on('change', function (e) {
+                //var data = $('.filterCourses').select2("val");
+                //@this.set('filterCourses', data);
+            });
 
 
 
@@ -1049,6 +1079,11 @@
             //var data = $('.filterCausals').select2("val");
             //@this.set('filterCausals', data);
         });
+        $('.filterCourses').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+        $('.filterCourses').on('change', function (e) {
+            //var data = $('.filterCourses').select2("val");
+            //@this.set('filterCourses', data);
+        });
 
         window.livewire.on('saved', () => {
             $('#userModal').modal('hide');
@@ -1122,6 +1157,12 @@
                 $('.filterCausals').val(filterCausals);
                 $('.filterCausals').trigger('change');
             }
+            var filterCourses = localStorage.getItem("filterCourses");
+            if (filterCourses)
+            {
+                $('.filterCourses').val(filterCourses);
+                $('.filterCourses').trigger('change');
+            }
             var filterFrom = localStorage.getItem("filterFrom");
             if (filterFrom)
             {
@@ -1163,6 +1204,12 @@
                 $('.filterCausals').val(filterCausals);
                 $('.filterCausals').trigger('change');
             }
+            var filterCourses = localStorage.getItem("filterCoursesRecordIn");
+            if (filterCourses && filterCourses != "null" && filterCourses != "undefined")
+            {
+                $('.filterCourses').val(filterCourses);
+                $('.filterCourses').trigger('change');
+            }
             var filterFrom = localStorage.getItem("filterFromRecordIn");
             if (filterFrom && filterFrom != "null" && filterFrom != "undefined")
             {
@@ -1244,6 +1291,8 @@
             $('.filterPaymentMethod').trigger('change');
             $('.filterCausals').val('');
             $('.filterCausals').trigger('change');
+            $('.filterCourses').val('');
+            $('.filterCourses').trigger('change');
             $('.filterFrom').val('');
             $('.filterTo').val('');
             //localStorage.clear();
@@ -1264,6 +1313,7 @@
             var filterMember = $('.filterMember').val();
             var filterPaymentMethod = $('.filterPaymentMethod').val();
             var filterCausals = $('.filterCausals').val();
+            var filterCourses = $('.filterCourses').val();
             var filterFrom = $('.filterFrom').val();
             var filterTo = $('.filterTo').val();
 
@@ -1272,6 +1322,7 @@
             localStorage.setItem("filterMemberRecordIn", filterMember);
             localStorage.setItem("filterPaymentMethodRecordIn", filterPaymentMethod);
             localStorage.setItem("filterCausalsRecordIn", filterCausals);
+            localStorage.setItem("filterCoursesRecordIn", filterCourses);
             localStorage.setItem("filterFromRecordIn", filterFrom);
             localStorage.setItem("filterToRecordIn", filterTo);
 
@@ -1289,7 +1340,7 @@
                 serverSide: true,
                 processing: true,
                 ajax: {
-                    url : '/get_record_in?filterCommercial=' + filterCommercial + "&filterMember=" + filterMember + "&filterPaymentMethod=" + filterPaymentMethod + "&filterCausals=" + filterCausals + "&filterFrom=" + filterFrom + "&filterTo=" + filterTo,
+                    url : '/get_record_in?filterCommercial=' + filterCommercial + "&filterMember=" + filterMember + "&filterPaymentMethod=" + filterPaymentMethod + "&filterCausals=" + filterCausals + "&filterCourses=" + filterCourses + "&filterFrom=" + filterFrom + "&filterTo=" + filterTo,
                     dataSrc: function (json){
                         if(json.totals){
                             $(".totalDiv").html('Totale&nbsp;:&nbsp;<b>' + json.totals + '</b>');
@@ -1326,6 +1377,7 @@
                     { data: 'first_name' },
                     { data: 'commercial' },
                     { data: 'causals', "orderable": false, },
+                    { data: 'courses', "orderable": false, },
                     { data: 'payment', "orderable": false, },
                     //{ data: 'payment_date', "orderable": false, },
                     { data: 'status', "orderable": false, },

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

@@ -140,6 +140,9 @@
 
     @foreach($receipt->rows as $row)
         <b>Causale</b>: {{@$row->causal->getTree()}}<br><br>
+        @if ($row->course)
+            <b>Corso</b>: {{$row->course->getDetailsName()}}<br><br>
+        @endif
         @if ($row->note != '')
             <b>Dettaglio causale</b>: {{$row->note}}<br><br>
         @endif

+ 27 - 1
routes/web.php

@@ -870,7 +870,7 @@ Route::group(['middleware' => 'tenant'], function () {
             ->leftJoin('receipts', 'records.id', '=', 'receipts.record_id')
             ->where('records.type', 'IN');
 
-        $y = \App\Models\Record::select('records_rows.amount', 'records.member_id', 'records.corrispettivo_fiscale', 'records.deleted', 'records.financial_movement', 'records_rows.causal_id', DB::raw('members.first_name as first_name'), DB::raw('members.last_name as last_name')) // , \DB::raw('SUM(records.id) As total'))
+        $y = \App\Models\Record::select('records_rows.amount', 'records.member_id', 'records.corrispettivo_fiscale', 'records.deleted', 'records.financial_movement', 'records_rows.causal_id', 'records_rows.course_id', DB::raw('members.first_name as first_name'), DB::raw('members.last_name as last_name')) // , \DB::raw('SUM(records.id) As total'))
             ->leftJoin('members', 'records.member_id', '=', 'members.id')
             ->leftJoin('records_rows', 'records.id', '=', 'records_rows.record_id')
             //->leftJoin('receipts', 'records.id', '=', 'receipts.record_id')
@@ -953,6 +953,27 @@ Route::group(['middleware' => 'tenant'], function () {
             $x = $x->whereIn('records.id', $causals);
             $y = $y->whereIn('records.id', $causals);
         }
+        if ($_GET["filterCourses"] != "null") {
+            $hasFilter = true;
+            $courses = explode(",", $_GET["filterCourses"]);
+
+            // Per ogni corso, se ha dei figli allora aggiungo i corsi figli
+            foreach ($courses as $c) {
+                $childs = \App\Models\Course::where('parent_id', $c)->get();
+                foreach ($childs as $cc) {
+                    $courses[] = $cc->id;
+                    $childss = \App\Models\Course::where('parent_id', $cc->id)->get();
+                    foreach ($childss as $ccc) {
+                        $courses[] = $ccc->id;
+                    }
+                }
+            }
+
+            //$courses = \App\Models\RecordRow::where('course_id', $_GET["filtercourses"])->pluck('record_id');
+            $courses = \App\Models\RecordRow::whereIn('course_id', $courses)->pluck('record_id');
+            $x = $x->whereIn('records.id', $courses);
+            $y = $y->whereIn('records.id', $courses);
+        }
         if ($_GET["filterFrom"] != '') {
             $hasFilter = true;
             $x = $x->where('records.date', '>=', $_GET["filterFrom"]);
@@ -1042,8 +1063,12 @@ Route::group(['middleware' => 'tenant'], function () {
         foreach ($x as $idx => $r) {
 
             $causals = '';
+            $courses = '';
             foreach ($r->rows as $row) {
                 $causals .= $row->causal->getTree() . "<br>";
+
+                if ($row->course)
+                    $courses .= $row->course->getDetailsName() . "<br>";
             }
 
             $datas[] = array(
@@ -1055,6 +1080,7 @@ Route::group(['middleware' => 'tenant'], function () {
                 'last_name' => $r->last_name,
                 'commercial' => $r->financial_movement ? 'Movimento finanziario' : ($r->commercial ? 'SI' : 'NO'),
                 'causals' => $causals,
+                'courses' => $courses,
                 'payment' => $r->payment_method->name,
                 //'payment_date' => date("d/m/Y", strtotime($r->date)),
                 'status' => $r->deleted ? 'Annullato' : '',