Luca Parisio 9 månader sedan
förälder
incheckning
284b473621

+ 14 - 11
app/Http/Livewire/Member.php

@@ -142,7 +142,7 @@ class Member extends Component
     public $filterCertAgonistic = 0;
     public $filterCertScaduto = 0;
     public $filterCertInScadenza = 0;
-
+    public $already_existing = false;
     protected $rules = [
         'first_name' => 'required',
         'last_name' => 'required',
@@ -211,6 +211,7 @@ class Member extends Component
         $this->age = '';
 
         $this->error_fc = false;
+        $this->already_existing = false;
 
         $this->isSaving = false;
 
@@ -498,7 +499,7 @@ class Member extends Component
 
         $this->getCategories(\App\Models\Category::select('id', 'name')->where('parent_id', null)->get(), 0);
 
-        
+
 
         // $this->getCourses(\App\Models\Course::select('id', 'name')->where('parent_id', null)->get(), 0);
 
@@ -767,11 +768,11 @@ class Member extends Component
             // Carico gli abbonamenti e i mesi
             $period = \Carbon\CarbonPeriod::create($c->date_from, '1 month', $c->date_to);
             $this->course_months_list = [];
-            foreach ($period as $dt) 
+            foreach ($period as $dt)
             {
                 $this->course_months_list[] = $dt->format("m");
             }
-            
+
             $this->course_price_list = [];
             if ($c->prices != null)
             {
@@ -853,7 +854,6 @@ class Member extends Component
             'address' => 'required',
             'zip_code' => 'required',
             'nation_id' => 'required',
-            'fiscal_code' => 'required',
             'birth_date' => 'before_or_equal:today',
             'gender' => 'required'
         ];
@@ -861,6 +861,7 @@ class Member extends Component
         if ($this->isBirthItaly) {
             $rules['birth_province_id'] = 'required';
             $rules['birth_city_id'] = 'required';
+            $rules['fiscal_code'] = 'required';
         } else {
             $rules['birth_place'] = 'required';
         }
@@ -890,10 +891,12 @@ class Member extends Component
 
         $this->emit('setErrorMsg', $zzz);
 
-        $existingMember = \App\Models\Member::where('fiscal_code', $this->fiscal_code)->first();
-        if ($existingMember) {
-            $this->addError('fiscal_code', 'Codice fiscale già presente.');
-            return;
+        if (!empty($this->fiscal_code)) {
+            $existingMember = \App\Models\Member::where('fiscal_code', $this->fiscal_code)->first();
+            if ($existingMember) {
+                $this->already_existing = true;
+                return;
+            }
         }
         
         $this->validate($rules);
@@ -1960,7 +1963,7 @@ class Member extends Component
                     foreach ($record->rows as $row)
                     {
 
-                        
+
                         if ($row->causal_id == $c->causal_id && !str_contains(strtolower($row->note), 'iscrizione'))
                         {
                             $tot = sizeof(json_decode($row->when));
@@ -2049,7 +2052,7 @@ class Member extends Component
                             }
                         }
                     }
-                        
+
                     if ($mm->status == "2")
                         $this->suspendedMonths[] = $m;
                 }

+ 3 - 1
app/Http/Livewire/RecordIN.php

@@ -580,7 +580,9 @@ class RecordIN extends Component
                 'type' => $this->type,
                 'amount' => 0,
                 'financial_movement' => $this->financial_movement,
-                'deleted' => $this->deleted
+                'deleted' => $this->deleted,
+                'numero_fattura' => '',
+                'amount' => 0
             ]);
             $this->dataId = $record->id;
 

+ 46 - 27
app/Http/Livewire/RecordOUT.php

@@ -14,7 +14,10 @@ class RecordOUT extends Component
 {
     use WithFileUploads;
 
-    protected $listeners = ['setCausal' => 'setCausal'];
+    protected $listeners = [
+        'setCausal' => 'setCausal',
+        'closeImportModal' => 'closeImportModal',
+    ];
 
     public $sortField = 'date';
     public $sortAsc = false;
@@ -159,6 +162,8 @@ class RecordOUT extends Component
         $this->isImportModalOpen = false;
         $this->reset(['selectedCausal', 'receiptFiles']);
         $this->resetValidation();
+        $this->dispatchBrowserEvent('closeModal');
+
     }
 
     public function hydrate()
@@ -201,18 +206,42 @@ class RecordOUT extends Component
 
     public function loadImportCausals()
     {
-        $causals = \App\Models\Causal::select('id', 'name')
+        $causals = \App\Models\Causal::select('id', 'name', 'parent_id')
             ->where('type', 'OUT')
             ->orderBy('name')
             ->get();
 
         $this->importCausals = [];
+        $this->buildCausalTree($causals);
+    }
+
+    private function buildCausalTree($causals, $parentId = null, $level = 0)
+    {
         foreach ($causals as $causal) {
-            $this->importCausals[] = [
-                'id' => $causal->id,
-                'name' => $causal->getTree()
-            ];
+            if ($causal->parent_id == $parentId) {
+                $dotString = str_repeat('● ', $level);
+                $this->importCausals[] = [
+                    'id' => $causal->id,
+                    'name' => $dotString . $causal->name
+                ];
+
+                $this->buildCausalTree($causals, $causal->id, $level + 1);
+            }
+        }
+    }
+
+    private function getCausalLevel($causal, $level = 0)
+    {
+        if ($causal->parent_id == null) {
+            return $level;
         }
+
+        $parent = \App\Models\Causal::find($causal->parent_id);
+        if (!$parent) {
+            return $level;
+        }
+
+        return $this->getCausalLevel($parent, $level + 1);
     }
 
     public function getCausal($causal)
@@ -395,7 +424,7 @@ class RecordOUT extends Component
             $this->add = false;
             $this->emit('setEdit', false);
         } catch (\Exception $ex) {
-            session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
+            $this->emit('flash-error', 'Errore (' . $ex->getMessage() . ')');
         }
     }
 
@@ -410,7 +439,7 @@ class RecordOUT extends Component
         try {
             $record = \App\Models\Record::findOrFail($id);
             if (!$record) {
-                session()->flash('error', 'Movimento non trovato');
+                $this->emit('flash-error', 'Movimento non trovato');
             } else {
                 $this->member_id = $record->member_id;
                 $this->supplier_id = $record->supplier_id;
@@ -455,7 +484,7 @@ class RecordOUT extends Component
                 }
             }
         } catch (\Exception $ex) {
-            session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
+            $this->emit('flash-error', 'Errore (' . $ex->getMessage() . ')');
         }
     }
 
@@ -484,16 +513,13 @@ class RecordOUT extends Component
             ->keyBy('id')
             ->toArray();
 
-            // Delete existing rows
             \App\Models\RecordRow::where('record_id', $this->dataId)->delete();
 
-            // Insert updated rows
             foreach ($this->rows as $row) {
                 foreach ($row["when"] as $x => $y) {
                     $row["when"][$x]['period'] = $row["when"][$x]['month'] . "-" . $row["when"][$x]['year'];
                 }
 
-                // Get imponibile and aliquota_iva values if they exist
                 $imponibile = null;
                 if (isset($row["imponibile"]) && $row["imponibile"] !== null && $row["imponibile"] !== '') {
                     $imponibile = $this->currencyToDouble($row["imponibile"]);
@@ -508,7 +534,6 @@ class RecordOUT extends Component
 
                 $amount = $this->currencyToDouble($row["amount"]);
 
-                // Calculate imposta (amount - imponibile) if imponibile exists
                 $imposta = null;
                 if ($imponibile !== null) {
                     $imposta = $amount - $imponibile;
@@ -525,7 +550,7 @@ class RecordOUT extends Component
                     'imponibile' => $imponibile,
                     'aliquota_iva' => $aliquota_iva,
                     'imposta' => $imposta,
-                    'divisa' => 'EUR', // Assuming the currency is always EUR
+                    'divisa' => 'EUR',
                 ];
 
                 if (isset($row["id"]) && isset($existingRows[$row["id"]])) {
@@ -548,7 +573,7 @@ class RecordOUT extends Component
             $this->update = false;
             $this->emit('setEdit', false);
         } catch (\Exception $ex) {
-            session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
+            $this->emit('flash-error', 'Errore (' . $ex->getMessage() . ')');
         }
     }
 
@@ -566,7 +591,7 @@ class RecordOUT extends Component
             \App\Models\Record::find($id)->delete();
             session()->flash('success', "Movimento eliminato");
         } catch (\Exception $e) {
-            session()->flash('error', 'Errore (' . $e->getMessage() . ')');
+            $this->emit('flash-error','Errore (' . $e->getMessage() . ')');
         }
     }
 
@@ -577,7 +602,7 @@ class RecordOUT extends Component
                 \App\Models\Record::find($id)->delete();
             }
         } catch (\Exception $e) {
-            session()->flash('error', 'Errore (' . $e->getMessage() . ')');
+            $this->emit('flash-error','Errore (' . $e->getMessage() . ')');
         }
         $this->multipleAction = '';
     }
@@ -763,12 +788,6 @@ class RecordOUT extends Component
                     // Crea il record row
                     $this->createRecordRow($record->id, $fatturaData);
 
-                    // Crea la ricevuta
-                    //$receipt = $this->createReceipt($record->id, $supplier->id, $paymentMethodId, $fatturaData);
-
-                    // Crea le righe della ricevuta
-                    // $this->createReceiptRows($receipt->id, $fatturaData);
-
                     $importCount++;
                     Log::info("Fattura importata con successo: {$fatturaData['numeroFattura']}, Fornitore: {$fatturaData['denominazione']}");
                 } catch (\Exception $e) {
@@ -778,17 +797,17 @@ class RecordOUT extends Component
 
                 $progress = ($index + 1) / $totalFiles * 100;
                 $this->emit('update-progress', $progress);
+
             }
 
             $this->showResultMessages($importCount, $errorsCount);
         } catch (\Exception $e) {
             Log::error('Errore durante l\'importazione dei file XML: ' . $e->getMessage());
-            session()->flash('error', 'Errore durante l\'importazione: ' . $e->getMessage());
+            $this->emit('flash-error', 'Errore durante l\'importazione: ' . $e->getMessage());
         } finally {
-            $this->emit('import-finished');
-
             $this->closeImportModal();
             $this->emit('load-data-table');
+
         }
     }
     /**
@@ -1434,7 +1453,7 @@ class RecordOUT extends Component
             }
             session()->flash('message', $message);
         } else {
-            session()->flash('error', 'Nessuna fattura importata. Controlla i file XML e riprova.');
+            $this->emit('flash-error','Nessuna fattura importata. Controlla i file XML e riprova.');
         }
     }
 }

+ 2 - 1
app/Models/Record.php

@@ -24,7 +24,8 @@ class Record extends Model
         'corrispettivo_fiscale',
         'deleted',
         'financial_movement',
-        'amount'
+        'amount',
+        'numero_fattura',
     ];
 
     public function member()

+ 2 - 2
public/css/style.css

@@ -16270,11 +16270,11 @@ table.tablesaw tbody tr td .primary {
 }
 
 .table--lista_utenti tbody tr td:nth-child(4), .table--lista_utenti tbody tr td:nth-child(5) {
-  text-align: center;
+  text-align: left;
   padding-right: 30px;
 }
 .table--lista_entrate tbody tr td:nth-child(5) {
-  text-align: center;
+  text-align: left;
   padding-right: 30px;
 }
 

+ 6 - 5
resources/views/livewire/member.blade.php

@@ -589,9 +589,10 @@
                                                         @if($this->error_fc)
                                                             <span style="color:red;font-size:12px">Dati mancanti</span>
                                                         @endif
-                                                        @error('fiscal_code')
-                                                        <div class="invalid-feedback">{{ $message }}</div>
-                                                    @enderror
+                                                        @if($this->already_existing)
+                                                            <span style="color:red;font-size:12px">Codice fiscale già esistente</span>
+                                                         @endif
+
                                                     </div>
 
                                                     <div class="col-xl-6">
@@ -1354,7 +1355,7 @@
                                                                 <input class="form-control" type="text" id="course_subscription_price" placeholder="Costo iscrizione" wire:model="course_subscription_price" onkeyup="onlyNumberAmount(this)">
                                                             </div>
                                                         </div>
-                                                        
+
                                                         @if($course_course_type == 'custom')
                                                             @foreach($course_when as $idW => $when)
                                                                 <div class="row">
@@ -1410,7 +1411,7 @@
                                                                 <input class="form-control" type="text" id="course_note" placeholder="Note" wire:model="course_note">
                                                             </div>
                                                         </div>
-                                                    
+
                                                     @endif
 
                                                 </form>

+ 51 - 17
resources/views/livewire/records_out.blade.php

@@ -32,7 +32,7 @@
         <div class="modal-dialog">
             <div class="modal-content">
                 <div class="modal-header">
-                    <h5 class="modal-title" id="importModalLabel">Importa Ricevute</h5>
+                    <h5 class="modal-title" id="importModalLabel">Importa Fatture Passive</h5>
                     <button type="button" class="btn-close" onclick="closeImportModal()" aria-label="Close"></button>
                 </div>
                 <div class="modal-body">
@@ -54,14 +54,17 @@
                             <input type="file" class="form-control" id="receiptFiles" wire:model="receiptFiles" multiple>
                             @error('receiptFiles.*') <span class="text-danger">{{ $message }}</span> @enderror
                             <small class="form-text text-muted">Massimo {{ ini_get('max_file_uploads') }} file consentiti.</small>
+
                         </div>
                         <div class="progress mb-2" wire:ignore>
                             <div class="progress-bar" role="progressbar" style="width: 0%" aria-valuenow="0"
                                  aria-valuemin="0" aria-valuemax="100">0%
                             </div>
                         </div>
-                        <button type="submit" class="btn--ui">Importa</button>
-                        <button type="button" class="btn--ui lightGrey" onclick="closeImportModal()">Annulla</button>
+                        <div class="d-flex justify-content-end">
+                            <button type="button" class="btn--ui lightGrey me-2" onclick="closeImportModal()">Annulla</button>
+                            <button type="submit" class="btn--ui" @if(count($receiptFiles) > ini_get('max_file_uploads') || empty($selectedCausal)) disabled @endif>Importa</button>
+                        </div>
                     </form>
                 </div>
             </div>
@@ -1083,7 +1086,6 @@
             });
         }
 
-    // Function to open the modal
     function openImportModal() {
         const importModal = new bootstrap.Modal(document.getElementById('importModal'));
         importModal.show();
@@ -1109,6 +1111,7 @@
 
     function closeImportModal() {
         const importModal = bootstrap.Modal.getInstance(document.getElementById('importModal'));
+        console.log("closing");
         if (importModal) {
             importModal.hide();
         }
@@ -1122,30 +1125,61 @@
         progressBar.style.width = `${progress}%`;
         progressBar.setAttribute('aria-valuenow', progress);
         progressBar.textContent = `${progress}%`;
+        progressBar.style.backgroundColor = progress === 100 ? '#0C6197' : '#0C6197';
     });
 
-    Livewire.on('import-started', () => {
-        window.selectedCausalValue = $('.import-causal-select').val();
-
-        $('.import-causal-select').prop('disabled', true);
-    });
-
-    Livewire.on('import-finished', () => {
-        $('.import-causal-select').prop('disabled', false);
-        $('.import-causal-select').val(window.selectedCausalValue).trigger('change');
-
-    });
 
     function onlyNumberPercent(input) {
         let v = input.value.replace(/[^\d]/g, '');
         if (v.length > 3) v = v.slice(0, 3);
-
-        // Ensure percentage doesn't exceed 100
         if (parseInt(v) > 100) v = '100';
 
         input.value = v + "%";
     }
 
+    document.addEventListener('closeModal', function() {
+        setTimeout(function() {
+            const importModal = bootstrap.Modal.getInstance(document.getElementById('importModal'));
+            if (importModal) {
+                importModal.hide();
+            }
+
+            setTimeout(function() {
+                window.location.reload();
+            }, 1500);
+        }, 300);
+    });
+
+    Livewire.on('flash-error', message => {
+            const alert = document.createElement('div');
+            alert.classList.add('alert', 'alert-danger', 'alert-dismissible', 'fade', 'show');
+            alert.setAttribute('role', 'alert');
+            alert.textContent = message;
+
+            const closeButton = document.createElement('button');
+            closeButton.setAttribute('type', 'button');
+            closeButton.classList.add('btn-close');
+            closeButton.setAttribute('data-bs-dismiss', 'alert');
+            closeButton.setAttribute('aria-label', 'Close');
+            alert.appendChild(closeButton);
+
+            const accountingExit = document.getElementById('accountingExit'); // Or any other suitable container
+            if (accountingExit) {
+                accountingExit.prepend(alert);
+            } else {
+                // If accountingExit is not found, prepend to the main container
+                const mainContainer = document.querySelector('.col.card--ui'); // Adjust selector as needed
+                if (mainContainer) {
+                    mainContainer.prepend(alert);
+                } else {
+                    console.error('Could not find a suitable container for the alert.');
+                }
+            }
+
+            setTimeout(() => {
+                alert.remove();
+            }, 5000); // Remove after 5 seconds
+        });
     </script>
 
 @endpush

+ 2 - 1
resources/views/receipt.blade.php

@@ -76,7 +76,8 @@
     $total = 0;
     @endphp
     @foreach($receipt->rows as $row)
-        <b>Descrizione</b>: {{@$row->causal->getTree()}} {{$row->note != '' ? ('(' . $row->note . ')') : ''}}<br><br>
+        <b>Causale</b>: {{@$row->causal->getTree()}}<br><br>
+        <b>Dettaglio causale</b>: {{$row->note != '' ? $row->note : ''}}<br><br>
         <b>Importo</b>: {{formatPrice($row->amount)}}<br><br>
         @php
         $total += $row->amount;

+ 9 - 1
routes/web.php

@@ -741,10 +741,18 @@ Route::get('/get_record_out', function () {
     foreach ($x as $idx => $r) {
 
         $causals = '';
+        $causalCount = 0;
         foreach ($r->rows as $row) {
-            $causals .= $row->causal->getTree() . "<br>";
+            $causals .= $row->causal->getTree();
+            $causalCount++;
+            if ($causalCount % 2 == 0) {
+                $causals .= "<br>";
+            } else if ($causalCount < count($r->rows)) {
+                $causals .= " / ";
+            }
         }
 
+
         $datas[] = array(
             //'id' => $r->id,
             'date' => $r->date,