Просмотр исходного кода

aggiunto campo Fornitore a entrate + aggiornate le tabelle collegate + filtri + esportazioni

ferrari 1 месяц назад
Родитель
Сommit
9a423ce2d8

+ 8 - 0
app/Http/Livewire/Receipt.php

@@ -5,6 +5,7 @@ namespace App\Http\Livewire;
 use Livewire\Component;
 use Barryvdh\DomPDF\Facade\Pdf;
 use App\Models\Member;
+use App\Models\Supplier;
 
 class Receipt extends Component
 {
@@ -15,12 +16,16 @@ class Receipt extends Component
     public $filterFrom = '', $filterTo = '';
 
     public $filteredMemberId = '';
+    public $filteredSupplierId = '';
     public $members = [];
+    public $suppliers = [];
 
     public function mount()
     {
         // Load members for the dropdown
         $this->members = Member::orderBy('last_name')->orderBy('first_name')->get();
+        // Load suppliers for the dropdown
+        $this->suppliers = Supplier::query()->where('enabled', true)->orderBy('name')->get();
     }
 
     public function updatedFilterFrom()
@@ -47,6 +52,8 @@ class Receipt extends Component
                 $r = $r->where('date', '<=', $this->filterTo);
             if ($this->filteredMemberId != '')
                 $r = $r->where('member_id', $this->filteredMemberId);
+            if ($this->filteredSupplierId != '')
+                $r = $r->where('supplier_id', $this->filteredSupplierId);
 
             $this->records = $r->get();
         }
@@ -81,6 +88,7 @@ class Receipt extends Component
         $this->filterTo = '';
         $this->filterFrom = '';
         $this->filteredMemberId = '';
+        $this->filteredSupplierId = '';
         $this->hasFilter = false;
     }
 

+ 30 - 2
app/Http/Livewire/Record.php

@@ -36,11 +36,13 @@ class Record extends Component
     public $filterOrigins = null;
     public $filterDestinations = null;
     public $filterMember = null;
+    public $filterSupplier = null;
     public $isFiltering = false;
     public array $recordDatas = [];
     public array $labels = [];
     public array $causals = [];
     public $members = array();
+    public $suppliers = array();
     public $sendViaEmail = false;
     public $exportEmailAddress = '';
     public $exportEmailSubject = 'Prima Nota - Export';
@@ -94,6 +96,7 @@ class Record extends Component
                     ->orWhereNull('is_deleted');
             })->orderBy('last_name')->orderBy('first_name')->get();
 
+        $this->suppliers = \App\Models\Supplier::select(['id', 'name', 'fiscal_code'])->where('enabled', true)->orderBy('name')->get();
         $this->payments = \App\Models\PaymentMethod::select('id', 'name', 'type')->where('enabled', true)->where('money', false)->get();
         $this->origins = \App\Models\Bank::select('id', 'name')->where('enabled', true)->whereIn('visibility', ['OUT', 'ALL'])->get();
         $this->destinations = \App\Models\Bank::select('id', 'name')->where('enabled', true)->whereIn('visibility', ['IN', 'ALL'])->get();
@@ -189,6 +192,11 @@ class Record extends Component
             Log::info('generateExportDataAndTotals: Member filter applied', ['member_id' => $this->filterMember]);
         }
 
+        if ($this->filterSupplier != null && $this->filterSupplier > 0) {
+            $datas->where('supplier_id', $this->filterSupplier);
+            Log::info('generateExportDataAndTotals: Supplier filter applied', ['supplier_id' => $this->filterSupplier]);
+        }
+
         Log::info('generateExportDataAndTotals: Executing query');
         $queryStart = microtime(true);
 
@@ -420,6 +428,9 @@ class Record extends Component
         if ($this->filterMember != null && $this->filterMember > 0) {
             $datas->where('member_id', $this->filterMember);
         }
+        if ($this->filterSupplier != null && $this->filterSupplier > 0) {
+            $datas->where('supplier_id', $this->filterSupplier);
+        }
         $datas = $datas->orderBy('date', 'ASC')
             ->orderBy('records.created_at', 'ASC')
             ->orderBy('records_rows.id', 'ASC')
@@ -462,6 +473,7 @@ class Record extends Component
         $this->filterOrigins = [];
         $this->filterDestinations = [];
         $this->filterMember = null;
+        $this->filterSupplier = null;
 
         $today = date("Y-m-d");
         $this->fromDate = $today;
@@ -691,6 +703,11 @@ class Record extends Component
 
             $financial_movements->whereRaw('0 = 1');
         }
+        if ($this->filterSupplier != null && $this->filterSupplier > 0) {
+            $datas->where('supplier_id', $this->filterSupplier);
+
+            $financial_movements->whereRaw('0 = 1');
+        }
         $datas = $datas->orderBy('date', 'ASC')
             ->orderBy('records.created_at', 'ASC')
             ->orderBy('records_rows.id', 'ASC')
@@ -1188,6 +1205,10 @@ class Record extends Component
             $query->where('member_id', $this->filterMember);
         }
 
+        if ($this->filterSupplier != null && $this->filterSupplier > 0) {
+            $query->where('supplier_id', $this->filterSupplier);
+        }
+
         return $query->count();
     }
 
@@ -1197,6 +1218,12 @@ class Record extends Component
         return $member ? $member->last_name . ' ' . $member->first_name : 'Sconosciuto';
     }
 
+    private function getSupplierName($supplierId)
+    {
+        $supplier = \App\Models\Supplier::find($supplierId);
+        return $supplier ? $supplier->name : 'Sconosciuto';
+    }
+
     private function getCausalsNames($causalIds)
     {
         if (!is_array($causalIds)) {
@@ -1286,6 +1313,7 @@ class Record extends Component
             // Prepare filter descriptions for the job
             $filterDescriptions = [
                 'member' => $this->filterMember ? $this->getMemberName($this->filterMember) : null,
+                'supplier' => $this->filterSupplier ? $this->getSupplierName($this->filterSupplier) : null,
                 'causals' => $this->filterCausals ? $this->getCausalsNames($this->filterCausals) : null,
                 'payment_methods' => $this->filterPaymentMethods ? $this->getPaymentMethodsNames($this->filterPaymentMethods) : null,
                 'origins' => $this->filterOrigins ? $this->getOriginsNames($this->filterOrigins) : null,
@@ -1851,9 +1879,9 @@ class Record extends Component
                 $activeWorksheet->setCellValue('C' . $idx, $record->causal_name);
 
                 // Nominativo
-                if ($isIn && isset($record->member)) {
+                if (isset($record->member)) {
                     $nominativo = $record->member->first_name . ' ' . $record->member->last_name;
-                } elseif ($isOut && isset($record->supplier)) {
+                } elseif (isset($record->supplier)) {
                     $nominativo = $record->supplier->name;
                 } else {
                     $nominativo = '';

+ 26 - 10
app/Http/Livewire/RecordIN.php

@@ -103,25 +103,30 @@ class RecordIN extends Component
     public $banks = array();
     public $members = array();
     public $vats = array();
+    public $suppliers = array();
 
     public $rows = array();
 
     protected $rules = [
-        'member_id' => 'required',
+        'member_id' => ['nullable', 'required_without:supplier_id'],
+        'supplier_id' => ['nullable', 'required_without:member_id'],
         'payment_method_id' => 'required',
         'rows.*.causal_id' => 'required',
         'rows.*.amount' => 'required'
     ];
 
     protected $messages = [
-        'member_id.required' => 'La persona è obbligatorio',
+        'member_id.required_without' => 'Devi compilare almeno uno tra utente e fornitore',
+        'supplier_id.required_without' => 'Devi compilare almeno uno tra utente e fornitore',
         'payment_method_id.required' => 'Il metodo di pagamento è obbligatorio',
         'rows.*.causal_id.required' => 'La causale è obbligatoria',
         'rows.*.amount.required' => 'L\'importo è obbligatorio',
     ];
 
     public function updatedMemberId() {
-        
+        if (!$this->member_id) {
+            $this->member_id = null;
+        }
         if ($this->member_id > 0)
         {
             $member = \App\Models\Member::findOrFail($this->member_id);
@@ -393,6 +398,7 @@ class RecordIN extends Component
         //$this->buildTree(\App\Models\Causal::all(), null);
 
         $this->refreshMembers();
+        $this->suppliers = \App\Models\Supplier::select('name','id')->orderBy('name')->get();
         $this->payments = \App\Models\PaymentMethod::select('id', 'name')->where('enabled', true)->whereIn('type', array('ALL', 'IN'))->orderBy('name')->get();
         $this->banks = \App\Models\Bank::select('id', 'name')->where('enabled', true)->whereIn('visibility', array('ALL', 'IN'))->orderBy('name')->get();
         $this->vats = \App\Models\Vat::select('id', 'name', 'value')->orderBy('value')->get();
@@ -552,7 +558,8 @@ class RecordIN extends Component
         $this->emit('refresh');
 
         $rules = [
-            'member_id' => 'required'
+            'member_id' => ['nullable', 'required_without:supplier_id'],
+            'supplier_id' => ['nullable', 'required_without:member_id'],
         ];
 
         $this->validate($rules);
@@ -571,7 +578,7 @@ class RecordIN extends Component
 
                     $record = \App\Models\Record::create([
                         'member_id' => $this->member_id,
-                        'supplier_id' => null,
+                        'supplier_id' => $this->supplier_id,
                         'payment_method_id' => $p->id,
                         'destination_id' => $destination_id,
                         'commercial' => $this->commercial,
@@ -622,8 +629,10 @@ class RecordIN extends Component
         }
         if ($f)
             $rules["member_id"] = 'required';*/
-        if(!$this->commercial)
-            $rules["member_id"] = 'required';
+        if(!$this->commercial) {
+            $rules['member_id'] = ['nullable', 'required_without:supplier_id'];
+            $rules['supplier_id'] = ['nullable', 'required_without:member_id'];
+        }
         //dd($this->getErrorBag());
 
         /*$validator =  Validator::make($request->all(), $rules);
@@ -812,8 +821,10 @@ class RecordIN extends Component
             'rows.*.amount' => 'required'
         ];
 
-        if(!$this->commercial)
-            $rules["member_id"] = 'required';
+        if(!$this->commercial) {
+            $rules['member_id'] = ['nullable', 'required_without:supplier_id'];
+            $rules['supplier_id'] = ['nullable', 'required_without:member_id'];
+        }
 
         $this->validate($rules);
 
@@ -1310,7 +1321,12 @@ class RecordIN extends Component
     {
         //$pdf = PDF::loadView('pdf/receipt', array('datas' => $datas, 'from' => $x, 'to' => $y, 'who' => '', 'matricola' => $matricola));
         $pdf = PDF::loadView('receipt', array('receipt' => $this->currentReceip));//->output();
-        $pdfName = "Ricevuta_" . $this->currentReceip->member->last_name . "_" . $this->currentReceip->number . "_" . $this->currentReceip->year . ".pdf";
+        $pdfName = "Ricevuta_" . $this->currentReceip->number . "_" . $this->currentReceip->year . ".pdf";
+        if ($this->currentReceip->member) {
+            $pdfName = "Ricevuta_" . $this->currentReceip->member->last_name . "_" . $this->currentReceip->number . "_" . $this->currentReceip->year . ".pdf";
+        } elseif ($this->currentReceip->supplier) {
+            $pdfName = "Ricevuta_" . $this->currentReceip->supplier->name . "_" . $this->currentReceip->number . "_" . $this->currentReceip->year . ".pdf";
+        }
         return $pdf->stream();
         /*return response()->streamDownload(
             fn () => print($pdf),

+ 2 - 2
app/Http/Livewire/RecordOUT.php

@@ -87,8 +87,8 @@ class RecordOUT extends Component
     ];
 
     protected $messages = [
-        'member_id.required_without' => 'Devi compilare almeno uno tra membro e fornitore',
-        'supplier_id.required_without' => 'Devi compilare almeno uno tra membro e fornitore',
+        'member_id.required_without' => 'Devi compilare almeno uno tra utente e fornitore',
+        'supplier_id.required_without' => 'Devi compilare almeno uno tra utente e fornitore',
         'payment_method_id.required' => 'Il metodo di pagamento è obbligatorio',
         'rows.*.amount.required' => 'L\'importo è obbligatorio',
         'rows.*.causal_id.required' => 'La causale è obbligatoria'

+ 6 - 2
app/Jobs/ExportPrimaNota.php

@@ -211,9 +211,9 @@ class ExportPrimaNota implements ShouldQueue
                 $activeWorksheet->setCellValue('C' . $idx, $record->causal_name);
 
                 // Nominativo
-                if ($isIn && isset($record->member)) {
+                if (isset($record->member)) {
                     $nominativo = $record->member->first_name . ' ' . $record->member->last_name;
-                } elseif ($isOut && isset($record->supplier)) {
+                } elseif (isset($record->supplier)) {
                     $nominativo = $record->supplier->name;
                 } else {
                     $nominativo = '';
@@ -912,6 +912,10 @@ class ExportPrimaNota implements ShouldQueue
             $descriptions[] = "Utente: {$this->filters['member']}";
         }
 
+        if (!empty($this->filters['supplier'])) {
+            $descriptions[] = "Fornitore: {$this->filters['supplier']}";
+        }
+
         if (!empty($this->filters['causals'])) {
             $descriptions[] = "Causali: " . (is_array($this->filters['causals']) ? implode(', ', $this->filters['causals']) : $this->filters['causals']);
         }

+ 26 - 3
app/helpers.php

@@ -91,12 +91,17 @@ function getConfiguration($field)
 function sendReceiptEmail($receipt)
 {
     $pdf = PDF::loadView('receipt', array('receipt' => $receipt));
-    $pdfName = "Ricevuta_" . $receipt->member->last_name . "_" . $receipt->number . "_" . $receipt->year . ".pdf";
+    $pdfName = "Ricevuta_" . $receipt->number . "_" . $receipt->year . ".pdf";
+    if ($receipt->member) {
+        $pdfName = "Ricevuta_" . $receipt->member->last_name . "_" . $receipt->number . "_" . $receipt->year . ".pdf";
+    } elseif ($receipt->supplier) {
+        $pdfName = "Ricevuta_" . $receipt->supplier->name . "_" . $receipt->number . "_" . $receipt->year . ".pdf";
+    }
     //$pdfName = "Ricevuta_" . $receipt->number . "_" . $receipt->year . ".pdf";
     Storage::put('public/pdf/' . $pdfName, $pdf->output());
     $email = '';
-    $member = \App\Models\Member::findOrFail($receipt->member_id);
-    if ($member->no_send_mail == null || !$member->no_send_mail)
+    $member = $receipt->member;
+    if ($member && ($member->no_send_mail == null || !$member->no_send_mail))
     {
         if ($member->isAdult())
             $email = $member->email;
@@ -127,6 +132,24 @@ function sendReceiptEmail($receipt)
             }
         }
     }
+
+    $supplier = $receipt->supplier;
+    if ($supplier)
+    {
+        $email = $supplier->referent_email;
+        if ($email != '')
+        {
+            try
+            {
+                Mail::to($email)->bcc(env('MAIL_CCN', ''))->send(new \App\Mail\ReceipEmail([
+                    'pdf' => 'public/pdf/' . $pdfName,
+                    'number' => $receipt->number . "/" . $receipt->year
+                ]));
+            } catch (Exception $e) {
+                //echo 'Caught exception: ',  $e->getMessage(), "\n";
+            }
+        }
+    }
 }
 
 function sendReceiptDeleteEmail($receipt)

+ 2 - 2
public/css/style.css

@@ -16273,11 +16273,11 @@ table.tablesaw tbody tr td .primary {
   text-align: center;
   padding-right: 30px;
 }
-.table--lista_entrate tbody tr td:nth-child(5) {
+.table--lista_entrate tbody tr td:nth-child(6) {
   text-align: center;
   padding-right: 30px;
 }
-.table--lista_ricevute tbody tr td:nth-child(7) {
+.table--lista_ricevute tbody tr td:nth-child(8) {
   text-align: right !important;
   padding-right: 30px;
 }

+ 35 - 4
resources/views/livewire/receipt.blade.php

@@ -72,6 +72,22 @@
                     </div>
                 </div>
             </div>
+            <div class="col-md-3">
+                <div class="row">
+                    <div class="col-md-12" style="margin-bottom:10px;">
+                        <b>Fornitore</b>
+                    </div>
+                    <div class="col-12">
+                        <select class="form-select filterSupplier" wire:model="filteredSupplierId">
+                            <option value="">--Seleziona Fornitore--</option>
+                            @foreach($suppliers as $supplier)
+                                <option value="{{ $supplier->id }}">{{ $supplier->name }}
+                                </option>
+                            @endforeach
+                        </select>
+                    </div>
+                </div>
+            </div>
         </div>
         <div class="row g-3">
             <div class="col-md-12" style="text-align:right">
@@ -92,6 +108,7 @@
                     <th scope="col">N°</th>
                     <th scope="col">Cognome</th>
                     <th scope="col">Nome</th>
+                    <th scope="col">Fornitore</th>
                     <th scope="col">Stato</th>
                     <th scope="col">Data</th>
                     <th scope="col">Importo</th>
@@ -104,8 +121,8 @@
                         <tr>
                             <td>{{$record->year}}</td>
                             <td>{{$record->number}}</td>
-                            <td>{{$record->type == 'IN' ? ($record->member->last_name) : 'Uscita'}}</td>
-                            <td>{{$record->type == 'IN' ? ($record->member->first_name) : ''}}</td>
+                            <td>{{$record->type == 'IN' ? ($record->member ? $record->member->last_name : '') : 'Uscita'}}</td>
+                            <td>{{$record->type == 'IN' ? ($record->member ? $record->member->first_name : '') : ''}}</td>
                             <td>
                                 <span class="tablesaw-cell-content">
                                     <span class="badge tessera-badge {{$record->status == 1 ? 'active' : 'suspended'}}">{{$record->status == 1 ? 'Attivo' : 'Annullata'}}</span>
@@ -234,11 +251,15 @@ $(document).ready(function () {
         $('.filterMember').select2({
             "language": { "noResults": function () { return "Nessun risultato"; } }
         });
+        $('.filterSupplier').select2({
+            "language": { "noResults": function () { return "Nessun risultato"; } }
+        });
 
 
         Livewire.on('load-data-table', () => {
             $('.filterStatus').select2({ "language": { "noResults": function () { return "Nessun risultato"; } } });
             $('.filterMember').select2({ "language": { "noResults": function () { return "Nessun risultato"; } } });
+            $('.filterSupplier').select2({ "language": { "noResults": function () { return "Nessun risultato"; } } });
 
             loadDataTable();
         });
@@ -318,6 +339,11 @@ $(document).ready(function () {
             $('.filterMember').val(filterMember).trigger('change');
         }
 
+        var filterSupplier = localStorage.getItem("filterSupplierReceipt");
+        if (filterSupplier && filterSupplier !== "null" && filterSupplier !== "undefined") {
+            $('.filterSupplier').val(filterSupplier).trigger('change');
+        }
+
         isFilter = true;
         loadDataTable();
 
@@ -327,6 +353,7 @@ $(document).ready(function () {
             $(".yesterdayButton").addClass("lightGrey");
             $('.filterStatus').val(null).trigger("change");
             $('.filterMember').val(null).trigger("change");
+            $('.filterSupplier').val(null).trigger("change");
             $('.filterFrom').val('');
             $('.filterTo').val('');
             destroyDataTable();
@@ -348,16 +375,17 @@ $(document).ready(function () {
             var filterTo = $('.filterTo').val();
             localStorage.setItem("filterToReeipt", filterTo);
 
-
             var filterMember = $('.filterMember').val();
             localStorage.setItem("filterMemberReceipt", filterMember);
 
+            var filterSupplier = $('.filterSupplier').val();
+            localStorage.setItem("filterSupplierReceipt", filterSupplier);
 
             $('#tablesaw-350').DataTable({
                 serverSide: true,
                 stateSave: true,
                 ajax: {
-                    url: '/get_receipts?filterStatus=' + filterStatus + '&filterFrom=' + filterFrom + '&filterTo=' + filterTo + '&filterMember=' + filterMember,
+                    url: '/get_receipts?filterStatus=' + filterStatus + '&filterFrom=' + filterFrom + '&filterTo=' + filterTo + '&filterMember=' + filterMember + '&filterSupplier=' + filterSupplier,
                     dataSrc: function (json) {
                         if(json.totals){
                             totals = json.totals;
@@ -381,6 +409,9 @@ $(document).ready(function () {
                     {
                         data: 'first_name'
                     },
+                    {
+                        data: 'supplier_name'
+                    },
                     {
                         data: "status",
                         render: function (data){

+ 36 - 1
resources/views/livewire/records.blade.php

@@ -19,6 +19,15 @@
                     @endforeach
                 </select>
             </div>
+            <div class="col-md-3">
+                Fornitore
+                <select name="search_supplier_id" class="form-select filterSupplier" wire:model.delay="filterSupplier">
+                    <option value="">--Seleziona--
+                    @foreach($suppliers as $supplier)
+                        <option value="{{$supplier->id}}">{{$supplier->name}}
+                    @endforeach
+                </select>
+            </div>
             <div class="col-md-3">
                 Causale
                 <select name="search_causal_id[]" class="form-select filterCausals me-2" multiple="multiple" wire:model.delay="filterCausals">
@@ -394,7 +403,7 @@
                                 <td style="background-color: {{$count % 2 == 0 ? 'white' : '#f2f4f7'}}">{{ date("d/m/Y", strtotime($record->date)) }}</td>
                                 <td style="background-color: {{$bg}}">{{ in_array($record->type, ['MOVE_IN','MOVE_OUT']) ? '' : ($record->commercial ? 'Commerciale' : 'Non commerciale') }}</td>
                                 <td style="background-color: {{$bg}}; width:22%; white-space:pre-line;">{{ $record->causal_name }}</td>
-                                <td style="background-color: {{$bg}}; width:22%">@if($record->type === 'IN'){{ $record->member->first_name }} {{ $record->member->last_name }}@elseif($record->type === 'OUT' && $record->member){{ $record->member->first_name }} {{ $record->member->last_name }}@elseif($record->type === 'OUT' && $record->supplier){{ @$record->supplier->name }}@endif</td>
+                                <td style="background-color: {{$bg}}; width:22%">@if($record->member){{ $record->member->first_name }} {{ $record->member->last_name }}@elseif($record->supplier){{ $record->supplier->name }}@endif</td>
                                 <td style="background-color: {{$bg}}">{{ $record->deleted ? 'Annullata' : '' }}</td>
                                 <td style="background-color: {{$bg}}; text-align:right; color:green">{{ in_array($record->type, ['IN','MOVE_IN']) ? formatPrice($record->amount) : '' }}</td>
                                 <td style="background-color: {{$bg}}; text-align:right; color:red">{{ in_array($record->type, ['OUT','MOVE_OUT']) ? formatPrice($record->amount) : '' }}</td>
@@ -1389,6 +1398,11 @@
                     $(this).select2('close');
                 }
             });
+            $('.filterSupplier').each(function() {
+                if ($(this).hasClass('select2-hidden-accessible')) {
+                    $(this).select2('close');
+                }
+            });
         }
 
         function filter() {
@@ -1397,6 +1411,7 @@
             @this.set('filterOrigins', $('.filterOrigins').select2("val"));
             @this.set('filterDestinations', $('.filterDestinations').select2("val"));
             @this.set('filterMember', $('.filterMember').select2("val"));
+            @this.set('filterSupplier', $('.filterSupplier').select2("val"));
 
             @this.applyFilters();
         }
@@ -1569,6 +1584,24 @@
                         $('#causalsModal').modal('hide');
                     }
                 });
+
+                if (!$('.filterSupplier').hasClass('select2-hidden-accessible')) {
+                    $('.filterSupplier').select2({
+                        "language": {"noResults": function(){return "Nessun risultato";}},
+                        "dropdownParent": $('body'),
+                        "width": "100%"
+                    });
+                }
+                $('.filterSupplier').off('change.customHandler').on('change.customHandler', function (e) {
+                    var data = $('.filterSupplier').select2("val");
+                    // @this.set('filterSupplier', data);
+                });
+
+                $('.filterSupplier').off('select2:open.customHandler').on('select2:open.customHandler', function (e) {
+                    if ($('#causalsModal').hasClass('show')) {
+                        $('#causalsModal').modal('hide');
+                    }
+                });
             });
         }
 
@@ -1687,6 +1720,7 @@
 
         Livewire.on('filters-reset', () => {
             $('.filterMember').val('').trigger('change');
+            $('.filterSupplier').val('').trigger('change');
             $('.filterCausals').val('').trigger('change');
             $('.filterPaymentMethods').val('').trigger('change');
             $('.filterOrigins').val('').trigger('change');
@@ -2018,6 +2052,7 @@
 
         function resetFiltersWithMonthPicker() {
             $('.filterMember').val('').trigger('change');
+            $('.filterSupplier').val('').trigger('change');
             $('.filterCausals').val('').trigger('change');
             $('.filterPaymentMethods').val('').trigger('change');
             $('.filterOrigins').val('').trigger('change');

+ 81 - 4
resources/views/livewire/records_in.blade.php

@@ -72,7 +72,7 @@
                     </div>
                 </div>
                 <div class="col-md-2">
-                    <div class="row">
+                    <div class="row mb-3">
                         <div class="col-md-12" style="margin-bottom:10px;">
                             <b>Utente</b>
                         </div>
@@ -85,6 +85,20 @@
                             </select>
                         </div>
                     </div>
+
+                    <div class="row">
+                        <div class="col-md-12" style="margin-bottom:10px;">
+                            <b>Fornitore</b>
+                        </div>
+                        <div class="col-12">
+                            <select name="search_supplier_id" class="form-select filterSupplier">
+                                <option value="">--Seleziona--
+                                @foreach($suppliers as $supplier)
+                                    <option value="{{$supplier->id}}">{{$supplier->name}}
+                                @endforeach
+                            </select>
+                        </div>
+                    </div>
                 </div>
                 <div class="col-md-2">
                     <div class="row">
@@ -149,6 +163,7 @@
                         <th scope="col">Importo</th>
                         <th scope="col">Cognome</th>
                         <th scope="col">Nome</th>
+                        <th scope="col">Fornitore</th>
                         <th scope="col">Commerciale</th>
                         <th scope="col">Causale</th>
                         <th scope="col">Pagamento</th>
@@ -235,8 +250,6 @@
                                 @error('member_id')
                                     <div class="invalid-feedback">{{ $message }}</div>
                                 @enderror
-                                <br><br>
-
                             </div>
                             <div class="col-md-6">
                                 @if($this->dataId == 0 && !$isDuplicate)
@@ -265,6 +278,21 @@
                                     <span class="tablesaw-cell-content"><span class="badge tessera-badge {{$class}}">{{$text}}</span></span>
                                 @endif
                             </div>
+
+                            <div class="col-md-6 mt-3">
+                                <span class="title-form d-block w-100">Fornitore</span>
+
+                                <select name="supplier_id" class="form-select supplierClass @error('supplier_id') is-invalid @enderror" aria-label="Seleziona un fornitore" wire:model="supplier_id" {{$this->dataId > 0 && !$isDuplicate ? 'disabled' : ''}}>
+                                    <option value="">--Seleziona--
+                                    @foreach($suppliers as $supplier)
+                                        <option value="{{$supplier->id}}">{{$supplier->name}}
+                                    @endforeach
+                                </select>
+                                @error('supplier_id')
+                                    <div class="invalid-feedback">{{ $message }}</div>
+                                @enderror
+                                <br><br>
+                            </div>
                         </div>
 
                         @if(false)
@@ -936,6 +964,11 @@
                 $('.memberClass').select2({
                     tags: false
                 });
+                $('.supplierClass').select2({
+                    /*matcher: function(params, data) {
+                        return matchStart(params, data);
+                    }*/
+                });
                 $('.paymentClass').select2({
                     matcher: function(params, data) {
                         return matchStart(params, data);
@@ -952,6 +985,11 @@
             $('.memberClass').select2({
                 tags: false
             });
+            $('.supplierClass').select2({
+                /*matcher: function(params, data) {
+                    return matchStart(params, data);
+                }*/
+            });
             $('.paymentClass').select2({
                 matcher: function(params, data) {
                     return matchStart(params, data);
@@ -1012,6 +1050,16 @@
                 var data = $('.memberClass').select2("val");
                 @this.set('member_id', data);
             });
+            $('.supplierClass').select2({
+                /*matcher: function(params, data) {
+                    return matchStart(params, data);
+                }*/
+            });
+            $('.supplierClass').on('change', function (e) {
+                loadDiv();
+                var data = $('.supplierClass').select2("val");
+                @this.set('supplier_id', data);
+            });
             $('.paymentClass').select2({
                 matcher: function(params, data) {
                     return matchStart(params, data);
@@ -1029,6 +1077,12 @@
                 @this.set('filterMember', data);
                 @this.search();
             });*/
+            $('.filterSupplier').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+            /*$('.filterSupplier').on('change', function (e) {
+                var data = $('.filterSupplier').select2("val");
+                @this.set('filterSupplier', data);
+                @this.search();
+            });*/
 
             $('.filterPaymentMethod').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
             $('.filterPaymentMethod').on('change', function (e) {
@@ -1087,6 +1141,12 @@
             @this.set('filterMember', data);
             @this.search();
         });*/
+        $('.filterSupplier').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+        /*$('.filterSupplier').on('change', function (e) {
+            var data = $('.filterSupplier').select2("val");
+            @this.set('filterSupplier', data);
+            @this.search();
+        });*/
         //$('.filterPaymentMethod').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
 
 
@@ -1129,6 +1189,12 @@
                 $('.filterMember').val(filterMember);
                 $('.filterMember').trigger('change');
             }
+            var filterSupplier = localStorage.getItem("filterSupplier");
+            if (filterSupplier)
+            {
+                $('.filterSupplier').val(filterSupplier);
+                $('.filterSupplier').trigger('change');
+            }
             var filterPaymentMethod = localStorage.getItem("filterPaymentMethod");
             if (filterPaymentMethod)
             {
@@ -1181,6 +1247,12 @@
                 $('.filterMember').val(filterMember);
                 $('.filterMember').trigger('change');
             }
+            var filterSupplier = localStorage.getItem("filterSupplierRecordIn");
+            if (filterSupplier && filterSupplier != "null" && filterSupplier != "undefined")
+            {
+                $('.filterSupplier').val(filterSupplier);
+                $('.filterSupplier').trigger('change');
+            }
             var filterPaymentMethod = localStorage.getItem("filterPaymentMethodRecordIn");
             
             if (filterPaymentMethod && filterPaymentMethod != "null" && filterPaymentMethod != "undefined")
@@ -1294,6 +1366,8 @@
             $('.filterCommercial').val('').trigger('change');
             $('.filterMember').val('');
             $('.filterMember').trigger('change');
+            $('.filterSupplier').val('');
+            $('.filterSupplier').trigger('change');
             $('.filterPaymentMethod').val('');
             $('.filterPaymentMethod').trigger('change');
             $('.filterCausals').val('');
@@ -1316,6 +1390,7 @@
             // filterCommercial = $('input[name="filterCommercial"]:checked').val();
             var filterCommercial = $('.filterCommercial').val();
             var filterMember = $('.filterMember').val();
+            var filterSupplier = $('.filterSupplier').val();
             var filterPaymentMethod = $('.filterPaymentMethod').val();
             var filterCausals = $('.filterCausals').val();
             var filterDestinations = $('.filterDestinations').val();
@@ -1325,6 +1400,7 @@
                 // Salvo i filtri della ricerca
             localStorage.setItem("filterCommercialRecordIn", filterCommercial);
             localStorage.setItem("filterMemberRecordIn", filterMember);
+            localStorage.setItem("filterSupplierRecordIn", filterSupplier);
             localStorage.setItem("filterPaymentMethodRecordIn", filterPaymentMethod);
             localStorage.setItem("filterCausalsRecordIn", filterCausals);
             localStorage.setItem("filterDestinationsRecordIn", filterDestinations);
@@ -1345,7 +1421,7 @@
                 serverSide: true,
                 stateSave: true,
                 ajax: {
-                    url : '/get_record_in?filterCommercial=' + filterCommercial + "&filterMember=" + filterMember + "&filterPaymentMethod=" + filterPaymentMethod + "&filterDestinations=" + filterDestinations + "&filterCausals=" + filterCausals + "&filterFrom=" + filterFrom + "&filterTo=" + filterTo,
+                    url : '/get_record_in?filterCommercial=' + filterCommercial + "&filterMember=" + filterMember + "&filterSupplier=" + filterSupplier + "&filterPaymentMethod=" + filterPaymentMethod + "&filterDestinations=" + filterDestinations + "&filterCausals=" + filterCausals + "&filterFrom=" + filterFrom + "&filterTo=" + filterTo,
                     dataSrc: function (json){
                         if(json.totals){
                             
@@ -1381,6 +1457,7 @@
                     { data: 'total', className: "numericCol" },
                     { data: 'last_name' },
                     { data: 'first_name' },
+                    { data: 'supplier_name' },
                     { data: 'commercial' },
                     { data: 'causals', "orderable": false, },
                     { data: 'payment', "orderable": false, },

+ 18 - 0
resources/views/livewire/records_out.blade.php

@@ -755,6 +755,11 @@
                 //var data = $('.filterSupplier').select2("val");
                 //@this.set('filterSupplier', data);
             });
+            $('.filterMember').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+            $('.filterMember').on('change', function (e) {
+                //var data = $('.filterMember').select2("val");
+                //@this.set('filterMember', data);
+            });
             $('.filterPaymentMethod').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
             $('.filterPaymentMethod').on('change', function (e) {
                 //var data = $('.filterPaymentMethod').select2("val");
@@ -782,6 +787,11 @@
             //var data = $('.filterSupplier').select2("val");
             //@this.set('filterSupplier', data);
         });
+        $('.filterMember').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
+        $('.filterMember').on('change', function (e) {
+            //var data = $('.filterMember').select2("val");
+            //@this.set('filterMember', data);
+        });
         $('.filterPaymentMethod').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
         $('.filterPaymentMethod').on('change', function (e) {
             //var data = $('.filterPaymentMethod').select2("val");
@@ -828,6 +838,12 @@
                 $('.filterSupplier').val(filterSupplier);
                 $('.filterSupplier').trigger('change');
             }
+            var filterMember = localStorage.getItem("filterMemberRecordOut");
+            if (filterMember && filterMember != "null" && filterMember != "undefined")
+            {
+                $('.filterMember').val(filterMember);
+                $('.filterMember').trigger('change');
+            }
             var filterPaymentMethod = localStorage.getItem("filterPaymentMethodRecordOut");
             if (filterPaymentMethod && filterPaymentMethod != "null" && filterPaymentMethod != "undefined")
             {
@@ -933,6 +949,8 @@
             $(".yesterdayButton").addClass("lightGrey");
             $('.filterSupplier').val('');
             $('.filterSupplier').trigger('change');
+            $('.filterMember').val('');
+            $('.filterMember').trigger('change');
             $('.filterPaymentMethod').val('');
             $('.filterPaymentMethod').trigger('change');
             $('.filterCausals').val('');

+ 25 - 6
resources/views/receipt.blade.php

@@ -32,16 +32,19 @@
     <hr><br>
 
     <b>Intestata a</b><br><br>
-    @if(!$receipt->member->isAdult())
+    @if($receipt->member && !$receipt->member->isAdult())
         <b>Genitore</b>: {{$receipt->parent}}<br><br>
     @endif
-    @if($receipt->member->last_name != '')
+    @if($receipt->member && $receipt->member->last_name != '')
         <b>Cognome</b>: {{$receipt->member->last_name}}<br><br>
     @endif
-    @if($receipt->member->first_name != '')
+    @if($receipt->member && $receipt->member?->first_name != '')
         <b>Nome</b>: {{$receipt->member->first_name}}<br><br>
     @endif
-    @if(@$receipt->member->birth_city->name != '' || @$receipt->member->birth_province->name != '' || @$receipt->member->birth_date != '')
+    @if($receipt->supplier)
+        <b>Fornitore</b>: {{$receipt->supplier->name}}<br><br>
+    @endif
+    @if($receipt->member && (@$receipt->member->birth_city->name != '' || @$receipt->member->birth_province->name != '' || @$receipt->member->birth_date != ''))
         <b>Nato/a a</b>:
             @if(@$receipt->member->birth_city->name != '')
                 {{@$receipt->member->birth_city->name}}
@@ -54,7 +57,7 @@
             @endif
         <br><br>
     @endif
-    @if($receipt->member->address != '' || @$receipt->member->city->name != ''  || @$receipt->member->province->name != '')
+    @if($receipt->member && ($receipt->member->address != '' || @$receipt->member->city->name != ''  || @$receipt->member->province->name != ''))
         <b>Residente in</b>:
             @if($receipt->member->address != '')
                 {{$receipt->member->address}}
@@ -67,9 +70,25 @@
             @endif
             <br><br>
     @endif
-    @if($receipt->member->fiscal_code != '')
+    @if($receipt->supplier && ($receipt->supplier->address != '' || @$receipt->supplier->city->name != ''  || @$receipt->supplier->province->name != ''))
+        <b>Residente in</b>:
+            @if($receipt->supplier->address != '')
+                {{$receipt->supplier->address}}
+            @endif
+            @if(@$receipt->supplier->city->name != '')
+                {{@$receipt->supplier->city->name}}
+            @endif
+            @if(@$receipt->supplier->province->name != '')
+                ({{@$receipt->supplier->province->name}})
+            @endif
+            <br><br>
+    @endif
+    @if($receipt->member && ($receipt->member->fiscal_code != ''))
         <b>Codice Fiscale</b>: {{$receipt->member->fiscal_code}}<br><br>
     @endif
+    @if($receipt->supplier && ($receipt->supplier->fiscal_code != ''))
+        <b>Codice Fiscale</b>: {{$receipt->supplier->fiscal_code}}<br><br>
+    @endif
     <hr><br>
 
     @php

+ 39 - 9
routes/web.php

@@ -511,14 +511,16 @@ Route::get('/get_record_in', function () {
 
     $datas = [];
 
-    $x = \App\Models\Record::select('records.*', DB::raw('members.first_name as first_name'), DB::raw('members.last_name as last_name'), DB::raw('payment_methods.name as payment'), DB::raw('receipts.created_at as receipt_date')) // , \DB::raw('SUM(records.id) As total'))
+    $x = \App\Models\Record::select('records.*', DB::raw('members.first_name as first_name'), DB::raw('members.last_name as last_name'), DB::raw('suppliers.name as supplier_name'), DB::raw('payment_methods.name as payment'), DB::raw('receipts.created_at as receipt_date')) // , \DB::raw('SUM(records.id) As total'))
         ->leftJoin('members', 'records.member_id', '=', 'members.id')
+        ->leftJoin('suppliers', 'records.supplier_id', '=', 'suppliers.id')
         ->leftJoin('payment_methods', 'records.payment_method_id', '=', 'payment_methods.id')
         ->leftJoin('receipts', 'records.id', '=', 'receipts.record_id')
         ->where('records.type', 'IN');
 
-    $y = \App\Models\Record::select('records_rows.record_id', 'records_rows.amount', 'records.member_id', 'records.corrispettivo_fiscale', 'records.commercial', 'records.deleted', 'records.financial_movement', 'records_rows.causal_id', 'records.payment_method_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.record_id', 'records_rows.amount', 'records.member_id', 'records.corrispettivo_fiscale', 'records.commercial', 'records.deleted', 'records.financial_movement', 'records_rows.causal_id', 'records.payment_method_id', DB::raw('members.first_name as first_name'), DB::raw('members.last_name as last_name'), DB::raw('suppliers.name as supplier_name')) // , \DB::raw('SUM(records.id) As total'))
         ->leftJoin('members', 'records.member_id', '=', 'members.id')
+        ->leftJoin('suppliers', 'records.supplier_id', '=', 'suppliers.id')
         ->leftJoin('records_rows', 'records.id', '=', 'records_rows.record_id')
         //->leftJoin('receipts', 'records.id', '=', 'receipts.record_id')
         ->where('records.type', 'IN');
@@ -532,12 +534,14 @@ Route::get('/get_record_in', function () {
             $v = str_replace("'", "\'", stripcslashes($_GET["search"]["value"]));
             $x = $x->where(function ($query) use ($v) {
                 $query->whereRaw("CONCAT(first_name, ' ', last_name) like '%" . $v . "%'")
-                    ->orWhereRaw("CONCAT(last_name, ' ', first_name) like '%" . $v . "%'");
+                    ->orWhereRaw("CONCAT(last_name, ' ', first_name) like '%" . $v . "%'")
+                    ->orWhereRaw("suppliers.name like '%" . $v . "%'");
             });
 
             $y = $y->where(function ($query) use ($v) {
                 $query->whereRaw("CONCAT(first_name, ' ', last_name) like '%" . $v . "%'")
-                    ->orWhereRaw("CONCAT(last_name, ' ', first_name) like '%" . $v . "%'");
+                    ->orWhereRaw("CONCAT(last_name, ' ', first_name) like '%" . $v . "%'")
+                    ->orWhereRaw("suppliers.name like '%" . $v . "%'");
             });
         }
 
@@ -573,6 +577,11 @@ Route::get('/get_record_in', function () {
         $x = $x->where('records.member_id', $_GET["filterMember"]);
         $y = $y->where('records.member_id', $_GET["filterMember"]);
     }
+    if ($_GET["filterSupplier"] > 0) {
+        $hasFilter = true;
+        $x = $x->where('records.supplier_id', $_GET["filterSupplier"]);
+        $y = $y->where('records.supplier_id', $_GET["filterSupplier"]);
+    }
     if ($_GET["filterPaymentMethod"] != "null") {
         $hasFilter = true;
         $payments = explode(",", $_GET["filterPaymentMethod"]);
@@ -736,6 +745,7 @@ Route::get('/get_record_in', function () {
             'total' => formatPrice($r->getTotal()),
             'first_name' => $r->first_name,
             'last_name' => $r->last_name,
+            'supplier_name' => $r->supplier_name,
             'commercial' => $r->financial_movement ? 'Movimento finanziario' : ($r->commercial ? 'SI' : 'NO'),
             'causals' => $causals,
             'payment' => $r->payment_method->name,
@@ -1711,7 +1721,8 @@ Route::get('/get_course_members', function () {
 
 Route::get('/get_receipts', function () {
     $baseQuery = \App\Models\Receipt::select('receipts.id')
-        ->leftJoin('members', 'receipts.member_id', '=', 'members.id');
+        ->leftJoin('members', 'receipts.member_id', '=', 'members.id')
+        ->leftJoin('suppliers', 'receipts.supplier_id', '=', 'suppliers.id');
 
     if (isset($_GET["search"]["value"]) && !empty($_GET["search"]["value"])) {
         $v = str_replace("'", "\'", stripcslashes($_GET["search"]["value"]));
@@ -1727,7 +1738,16 @@ Route::get('/get_receipts', function () {
                 $query->where('is_deleted', false)
                     ->orWhereNull('is_deleted');
             })->pluck('id');
-        $baseQuery = $baseQuery->whereIn('receipts.member_id', $member_ids);
+        $supplier_ids = \App\Models\Supplier::where('name', 'like', '%' . $v . '%')
+            ->where(function ($query) {
+                $query->where('enabled', false)
+                    ->orWhereNull('enabled');
+            })->pluck('id');
+
+        $baseQuery = $baseQuery->where(function($query) use ($member_ids, $supplier_ids){
+            $query->whereIn('receipts.member_id', $member_ids);
+            $query->orWhereIn('receipts.supplier_id', $supplier_ids);
+        });
     }
 
     if (isset($_GET["filterStatus"]) && $_GET["filterStatus"] != '')
@@ -1742,6 +1762,10 @@ Route::get('/get_receipts', function () {
     if (isset($_GET["filterMember"]) && $_GET["filterMember"] != "")
         $baseQuery = $baseQuery->where('receipts.member_id', $_GET["filterMember"]);
 
+    if (isset($_GET["filterSupplier"]) && $_GET["filterSupplier"] != "")
+        $baseQuery = $baseQuery->where('receipts.supplier_id', $_GET["filterSupplier"]);
+
+
     $count = $baseQuery->count();
 
     $receiptIds = $baseQuery->pluck('receipts.id');
@@ -1755,9 +1779,11 @@ Route::get('/get_receipts', function () {
         'receipts.record_id',
         'members.first_name',
         'members.last_name',
+        DB::raw('suppliers.name AS supplier_name'),
         DB::raw('SUM(receipts_rows.amount) AS totals')
     )
         ->leftJoin('members', 'receipts.member_id', '=', 'members.id')
+        ->leftJoin('suppliers', 'receipts.supplier_id', '=', 'suppliers.id')
         ->leftJoin('receipts_rows', 'receipts.id', '=', 'receipts_rows.receip_id')
         ->whereIn('receipts.id', $receiptIds)
         ->groupBy(
@@ -1768,7 +1794,8 @@ Route::get('/get_receipts', function () {
             'receipts.created_at',
             'receipts.record_id',
             'members.first_name',
-            'members.last_name'
+            'members.last_name',
+            'suppliers.name'
         );
 
     if (isset($_GET["order"])) {
@@ -1782,10 +1809,12 @@ Route::get('/get_receipts', function () {
         if ($_GET["order"][0]["column"] == 3)
             $column = 'members.first_name';
         if ($_GET["order"][0]["column"] == 4)
-            $column = 'receipts.status';
+            $column = 'suppliers.name';
         if ($_GET["order"][0]["column"] == 5)
-            $column = 'receipts.created_at';
+            $column = 'receipts.status';
         if ($_GET["order"][0]["column"] == 6)
+            $column = 'receipts.created_at';
+        if ($_GET["order"][0]["column"] == 7)
             $column = 'totals';
 
         if ($column != '')
@@ -1809,6 +1838,7 @@ Route::get('/get_receipts', function () {
             'number' => $r->number,
             'last_name' => $r->last_name ?? '',
             'first_name' => $r->first_name ?? '',
+            'supplier_name' => $r->supplier_name ?? '',
             'status' => $r->status,
             'date' => date("d/m/Y", strtotime($r->created_at)),
             'totals' => formatPrice($r->totals),