Prechádzať zdrojové kódy

records_out - aggiunto campo Utente

ferrari 1 mesiac pred
rodič
commit
70932e401e

+ 158 - 5
app/Http/Livewire/RecordOUT.php

@@ -6,7 +6,7 @@ use Livewire\Component;
 class RecordOUT extends Component
 {
 
-    protected $listeners = ['setCausal' => 'setCausal'];
+    protected $listeners = ['setCausal' => 'setCausal','refreshMembers' => 'refreshMembers'];
 
     public $sortField ='date';
     public $sortAsc = false;
@@ -59,15 +59,26 @@ class RecordOUT extends Component
 
     public $selectId = 0;
 
+    public $parent = null;
+    public $newMemberFirstName = '';
+    public $newMemberLastName = '';
+    public $newMemberEmail = '';
+    public $newMemberToComplete = false;
+    public $newMemberFiscalCode = '';
+    public $newMemberFiscalCodeExist = false;
+    public $newMemberExists = false;
+
     public $causals = array();
     public $payments = array();
     public $banks = array();
+    public $members = array();
     public $suppliers = array();
 
     public $rows = array();
 
     protected $rules = [
-        'supplier_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'
@@ -76,7 +87,8 @@ class RecordOUT extends Component
     ];
 
     protected $messages = [
-        'supplier_id.required' => 'Il fornitore è obbligatorio',
+        'member_id.required_without' => 'Devi compilare almeno uno tra membro e fornitore',
+        'supplier_id.required_without' => 'Devi compilare almeno uno tra membro e fornitore',
         'payment_method_id.required' => 'Il metodo di pagamento è obbligatorio',
         'rows.*.amount.required' => 'L\'importo è obbligatorio',
         'rows.*.causal_id.required' => 'La causale è obbligatoria'
@@ -114,6 +126,15 @@ class RecordOUT extends Component
         $this->type = 'OUT';
         //$this->note = '';
         //$this->amount = null;
+        $this->newMemberFiscalCodeExist = false;
+        $this->parent = '';
+        $this->newMemberFirstName = '';
+        $this->newMemberLastName = '';
+        $this->newMemberEmail = '';
+        $this->newMemberToComplete = false;
+        $this->newMemberFiscalCode = '';
+        $this->newMemberFiscalCodeExist = false;
+        $this->newMemberExists = false;
         $this->commercial = 1;
         $this->rows = array();
         $this->rows[] = array('causal_id' => null, 'when' => array(array('month' => date("n"), 'year' => date("Y"), 'period' => '')),  'amount' => null, 'note' => '', 'commercial' => 0);
@@ -158,11 +179,50 @@ class RecordOUT extends Component
 
         $this->getCausale(\App\Models\Causal::select('id', 'name')->where('parent_id', null)->where('type', 'OUT')->orderBy('name')->get(), 0);
 
+        $this->refreshMembers();
         $this->suppliers = \App\Models\Supplier::select('name','id')->orderBy('name')->get();
         $this->payments = \App\Models\PaymentMethod::select('id', 'name')->whereIn('type', array('ALL', 'OUT'))->where('enabled', true)->orderBy('name')->get();
         $this->banks = \App\Models\Bank::select('id', 'name')->where('enabled', true)->whereIn('visibility', array('ALL', 'OUT'))->orderBy('name')->get();
     }
 
+    public function refreshMembers()
+    {
+        if ($this->add || $this->update)
+        {
+            if($this->commercial){
+                $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])
+                    ->where(function($query) {
+                        $query->where('is_archived', false)
+                            ->orWhereNull('is_archived');
+                    })
+                    ->where(function($query) {
+                        $query->where('is_deleted', false)
+                            ->orWhereNull('is_deleted');
+                    })->orderBy('last_name')->orderBy('first_name')->get();
+            } else {
+                $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])->where('current_status', 2)->orWhere('current_status', 1)
+                    ->where(function($query) {
+                        $query->where('is_archived', false)
+                            ->orWhereNull('is_archived');
+                    })
+                    ->where(function($query) {
+                        $query->where('is_deleted', false)
+                            ->orWhereNull('is_deleted');
+                    })->orderBy('last_name')->orderBy('first_name')->get();
+            }
+        }
+        else
+            $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->orderBy('last_name')->orderBy('first_name')->get();
+    }
+
     public function updatedPaymentMethodId() {
         if ($this->payment_method_id) {
             $payment_method = \App\Models\PaymentMethod::findOrFail($this->payment_method_id);
@@ -170,6 +230,11 @@ class RecordOUT extends Component
         }
     }
 
+    public function updatedCommercial($value)
+    {
+        $this->emitSelf('refreshMembers');
+    }
+
     public function getCausal($causal)
     {
         $ret = '';
@@ -385,6 +450,7 @@ class RecordOUT extends Component
                 session()->flash('error','Movimento non trovato');
             } else {
                 $this->member_id = $record->member_id;
+                $this->parent = $record->member->parent;
                 $this->supplier_id = $record->supplier_id;
                 //$this->causal_id = $record->causal_id;
                 $this->payment_method_id = $record->payment_method_id;
@@ -482,7 +548,7 @@ class RecordOUT extends Component
             \App\Models\Record::find($id)->delete();
             session()->flash('success',"Movimento eliminato");
         }catch(\Exception $e){
-            session()->flash('error','Errore (' . $ex->getMessage() . ')');
+            session()->flash('error','Errore (' . $e->getMessage() . ')');
         }
     }
 
@@ -494,7 +560,7 @@ class RecordOUT extends Component
                 \App\Models\Record::find($id)->delete();
             }
         }catch(\Exception $e){
-            session()->flash('error','Errore (' . $ex->getMessage() . ')');
+            session()->flash('error','Errore (' . $e->getMessage() . ')');
         }
         $this->multipleAction = '';
     }
@@ -632,4 +698,91 @@ class RecordOUT extends Component
         $this->multiP = false;
     }
 
+    
+    public function createMember()
+    {
+        $this->newMemberFiscalCodeExist = false;
+        $this->validate([
+            // 'newMemberFiscalCode'=>'required|max:16',
+            'newMemberFirstName'=>'required',
+            'newMemberLastName'=>'required',
+            //'newMemberEmail'=>'required',
+        ]);
+
+        // Check fiscal code exist
+        $exist = false;
+        if ($this->newMemberFiscalCode != '')
+        {
+            $check = \App\Models\Member::where('fiscal_code', $this->newMemberFiscalCode)
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->get();
+            $exist = $check->count() > 0;
+        }
+        if (!$exist)
+        {
+            $member = \App\Models\Member::create([
+                'first_name' => strtoupper($this->newMemberFirstName),
+                'last_name' => strtoupper($this->newMemberLastName),
+                'email' => strtoupper($this->newMemberEmail),
+                'to_complete' => $this->newMemberToComplete,
+                'fiscal_code' => $this->newMemberFiscalCode,
+                'status' => true
+            ]);
+            $this->member_id = $member->id;
+            $this->members = \App\Models\Member::select(['id', 'first_name', 'last_name', 'fiscal_code'])
+                ->where(function($query) {
+                    $query->where('is_archived', false)
+                        ->orWhereNull('is_archived');
+                })
+                ->where(function($query) {
+                    $query->where('is_deleted', false)
+                        ->orWhereNull('is_deleted');
+                })->get();
+            // $this->emit('reloadMembers');
+            $this->emit('refresh');
+            $this->newMemberFirstName = '';
+            $this->newMemberLastName = '';
+            $this->newMemberEmail = '';
+            $this->newMemberToComplete = false;
+            $this->newMemberFiscalCode = '';
+            $this->emit('saved');
+            //$this->validate();
+            $this->selectId++;
+        }
+        else
+        {
+            $this->newMemberFiscalCodeExist = true;
+        }
+    }
+
+    public function updatedSupplierId() {
+        if (!$this->supplier_id) {
+            $this->supplier_id = null;
+        }
+    }
+    public function updatedMemberId() {
+        
+        if ($this->member_id > 0)
+        {
+            $member = \App\Models\Member::findOrFail($this->member_id);
+            if (!$member->isAdult())
+            {
+                if($member->father_name != '')
+                    $this->parent = $member->father_name . " (C.F. " . $member->father_fiscal_code . ")";
+                else if($member->mother_name != '')
+                    $this->parent = $member->mother_name . " (C.F. " . $member->mother_fiscal_code . ")";
+                else
+                    $this->parent = '';
+            }
+            $this->newMemberFirstName = '';
+            $this->newMemberLastName = '';
+            $this->newMemberEmail = '';
+            $this->newMemberToComplete = false;
+            $this->newMemberFiscalCode = '';
+            $this->newMemberFiscalCodeExist = false;
+        }
+        $this->emit('refresh');
+    }
 }

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

@@ -394,7 +394,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->supplier->name }}@endif</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}}">{{ $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>

+ 125 - 13
resources/views/livewire/records_out.blade.php

@@ -66,6 +66,21 @@
                         </div>
                     </div>
                 </div>
+                <div class="col-md-2">
+                    <div class="row">
+                        <div class="col-md-12" style="margin-bottom:10px;">
+                            <b>Utente</b>
+                        </div>
+                        <div class="col-12">
+                            <select name="search_supplier_id" class="form-select filterMember">
+                                <option value="">--Seleziona--
+                                @foreach($members as $member)
+                                    <option value="{{$member->id}}">{{$member->last_name}} {{$member->first_name}}
+                                @endforeach
+                            </select>
+                        </div>
+                    </div>
+                </div>
                 <div class="col-md-2">
                     <div class="row">
                         <div class="col-md-12" style="margin-bottom:10px;">
@@ -142,6 +157,7 @@
                         <!--<th scope="col"></th>-->
                         <th scope="col">Data pagamento</th>
                         <th scope="col">Importo</th>
+                        <th scope="col">Utente</th>
                         <th scope="col">Fornitore</th>
                         <th scope="col">Causale</th>
                         <th scope="col">Pagamento</th>
@@ -232,6 +248,29 @@
                                     <input id="date" type="date" class="form-control"  wire:model="date">
                                 </div>
                             </div>
+                            
+                            <div class="col-md-6"></div>
+
+                            <div class="col-md-6">
+                                <span class="title-form d-block w-100">Utente</span>
+                                <select name="member_id" class="form-select memberClass @error('member_id') is-invalid @enderror" aria-label="Seleziona una persona" wire:model="member_id" {{$this->dataId > 0 ? 'disabled' : ''}}  >
+                                    <option value="">--Seleziona--
+                                    @foreach($members as $member)
+                                        <option value="{{$member->id}}">{{$member->last_name}} {{$member->first_name}} ({{$member->fiscal_code}})
+                                    @endforeach
+                                </select>
+                                @error('member_id')
+                                    <div class="invalid-feedback">{{ $message }}</div>
+                                @enderror
+                                <br><br>
+                            </div>
+
+                            <div class="col-md-6">
+                                @if($this->dataId == 0)
+                                    <span class="title-form d-block w-100">&nbsp;</span>
+                                    <button type="button" class="btn--ui primary" data-bs-toggle="modal" data-bs-target="#userModal" style="width:50px">&nbsp;<i class="fa-solid fa-plus"></i></button>
+                                @endif
+                            </div>
 
                             <div class="col-12">
                                 <span class="title-form d-block w-100">Fornitore</span>
@@ -504,6 +543,58 @@
             @endif
         </section>
 
+        <div  wire:ignore.self class="modal fade" id="userModal" tabindex="-1" aria-labelledby="userModalLabel" aria-hidden="true">
+            <div class="modal-dialog">
+                <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title" id="userModalLabel">Inserimento nuovo utente</h5>
+                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+                </div>
+                <div class="modal-body">
+                    @if($newMemberExists)
+                    <div class="alert alert-warning" role="alert">
+                        Un utente con lo stesso nome e cognome è già presente a database
+                    </div>
+                    @endif
+                    <div class="row">
+                        <div class="col-md-6">
+                            <label for="newMemberFirstName" class="form-label">Nome</label>
+                            <input class="form-control @error('newMemberFirstName') is-invalid @enderror" type="text" id="newMemberFirstName" placeholder="Nome" wire:model.lazy="newMemberFirstName">
+                        </div>
+                        <div class="col-md-6">
+                            <label for="newMemberLastName" class="form-label">Cognome</label>
+                            <input class="form-control @error('newMemberLastName') is-invalid @enderror" type="text" id="newMemberLastName" placeholder="Cognome" wire:model.lazy="newMemberLastName">
+                        </div>
+                    </div>
+                    <div class="row mt-2">
+                        <div class="col-md-6">
+                            <label for="newMemberEmail" class="form-label">Email</label>
+                            <input class="form-control @error('newMemberEmail') is-invalid @enderror" type="text" id="newMemberEmail" placeholder="Email" wire:model="newMemberEmail">
+                        </div>
+                        <div class="col-md-6">
+                            <label for="newMemberFiscalCode" class="form-label">Codice fiscale</label>
+                            <input class="form-control @error('newMemberFiscalCode') is-invalid @enderror" type="text" id="newMemberFiscalCode" placeholder="Codice fiscale" maxlength="16" wire:model="newMemberFiscalCode">
+                            @if($newMemberFiscalCodeExist)
+                                <span style="color:red">Il codice fiscale inserito esiste</span>
+                            @endif
+                        </div>
+                    </div>
+                    <div class="row mt-2">
+                        <div class="col-md-6">
+                            <input type="checkbox" id="newMemberToComplete" wire:model="newMemberToComplete">
+                            <label for="newMemberToComplete" class="form-label">Tesserato</label>
+                        </div>
+                        <div class="col-md-6"></div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button class="btn--ui lightGrey" onclick="annulla()">annulla</a>
+                    <button type="button" class="btn--ui btn-primary" wire:click.prevent="createMember()">Salva</button>
+                </div>
+                </div>
+            </div>
+        </div>
+
     @endif
 </div>
 
@@ -574,20 +665,23 @@
         }
         window.livewire.on('refresh', () => {
             $('.causalClass').select2({
-                    matcher: function(params, data) {
-                        return matchStart(params, data);
-                    }
-                });
+                matcher: function(params, data) {
+                    return matchStart(params, data);
+                }
+            });
+            $('.memberClass').select2({
+                tags: false
+            });
             $('.supplierClass').select2({
-                    /*matcher: function(params, data) {
-                        return matchStart(params, data);
-                    }*/
-                });
+                /*matcher: function(params, data) {
+                    return matchStart(params, data);
+                }*/
+            });
             $('.paymentClass').select2({
-                    matcher: function(params, data) {
-                        return matchStart(params, data);
-                    }
-                });
+                matcher: function(params, data) {
+                    return matchStart(params, data);
+                }
+            });
         });
 
         $(document).ready(function(){
@@ -636,6 +730,15 @@
                 var data = $('.supplierClass').select2("val");
                 @this.set('supplier_id', data);
             });
+
+            $('.memberClass').select2({
+                tags: false
+            });            
+            $('.memberClass').on('change', function (e) {
+                loadDiv();
+                var data = $('.memberClass').select2("val");
+                @this.set('member_id', data);
+            });
             $('.paymentClass').select2({
                     matcher: function(params, data) {
                         return matchStart(params, data);
@@ -700,6 +803,10 @@
             if (v.length > 14) v = v.slice(0, 14);
             input.value = "€ " + v.replace(/(\d)(\d\d)$/, "$1,$2").replace(/(^\d{1,3}|\d{3})(?=(?:\d{3})+(?:,|$))/g, '$1.');
         }
+
+        window.livewire.on('saved', () => {
+            $('#userModal').modal('hide');
+        });
     </script>
 
     <link href="/css/datatables.css" rel="stylesheet" />
@@ -844,6 +951,7 @@
                 $('#tablesaw-350').DataTable().destroy();
             }
 
+            var filterMember = $('.filterMember').val();
             var filterSupplier = $('.filterSupplier').val();
             var filterPaymentMethod = $('.filterPaymentMethod').val();
             var filterCausals = $('.filterCausals').val();
@@ -851,6 +959,7 @@
             var filterFrom = $('.filterFrom').val();
             var filterTo = $('.filterTo').val();
 
+            localStorage.setItem("filterMemberRecordOut", filterMember);
             localStorage.setItem("filterSupplierRecordOut", filterSupplier);
             localStorage.setItem("filterPaymentMethodRecordOut", filterPaymentMethod);
             localStorage.setItem("filterCausalsRecordOut", filterCausals);
@@ -862,7 +971,7 @@
                 //searching: false,
                 stateSave: true,
                 ajax: {
-                    url : "/get_record_out?filterSupplier=" + filterSupplier + "&filterPaymentMethod=" + filterPaymentMethod + "&filterOrigins=" + filterOrigins + "&filterCausals=" + filterCausals + "&filterFrom=" + filterFrom + "&filterTo=" + filterTo,
+                    url : "/get_record_out?filterMember=" + filterMember + "&filterSupplier=" + filterSupplier + "&filterPaymentMethod=" + filterPaymentMethod + "&filterOrigins=" + filterOrigins + "&filterCausals=" + filterCausals + "&filterFrom=" + filterFrom + "&filterTo=" + filterTo,
                     dataSrc: function (json){
                         if(json.totals){
                             $(".totalDiv").html('Totale&nbsp;:&nbsp;<b>' + json.totals + '</b>');
@@ -894,6 +1003,7 @@
                         }, className: "numericCol"
                     },
                     { data: 'total', className: "numericCol" },
+                    { data: 'member' },
                     { data: 'supplier' },
                     { data: 'causals' },
                     { data: 'payment' },
@@ -1015,11 +1125,13 @@
         function loadDiv()
         {
             $("select").prop('disabled',true);
+            $("select[name='member_id']").prop('disabled',true);
             $("select[name='supplier_id']").prop('disabled',true);
             $("select[name='payment_method_id']").prop('disabled',true);
             setTimeout(() => {
                 $("select").prop('disabled',false);
                 $("select[name='payment_method_id']").prop('disabled',false);
+                $("select[name='member_id']").prop('disabled',false);
                 $("select[name='supplier_id']").prop('disabled',false);
             }, 1000);
         }

+ 6 - 1
routes/web.php

@@ -777,6 +777,10 @@ Route::get('/get_record_out', function () {
         $x = $x->where('supplier_id', $_GET["filterSupplier"]);
         $hasFilter = true;
     }
+    if ($_GET["filterMember"] > 0) {
+        $x = $x->where('member_id', $_GET["filterMember"]);
+        $hasFilter = true;
+    }
     /*if ($_GET["filterPaymentMethod"] > 0)
         {
             $x = $x->where('payment_method_id', $_GET["filterPaymentMethod"]);
@@ -854,7 +858,8 @@ Route::get('/get_record_out', function () {
             //'id' => $r->id,
             'date' => $r->date,
             'total' => formatPrice($r->getTotal()),
-            'supplier' => $r->supplier->name,
+            'member' => $r->member ? ($r->member->last_name . " " . $r->member->first_name) : '-',
+            'supplier' => $r->supplier ? $r->supplier->name : '-',
             'causals' => $causals,
             'payment' => $r->payment_method->name,
             'origin' => $r->origin?->name,