Parcourir la source

pagina aziende missing logo discipline e date

FabioFratini il y a 10 mois
Parent
commit
14014c1f30

+ 332 - 0
app/Http/Livewire/Azienda.php

@@ -0,0 +1,332 @@
+<?php
+
+namespace App\Http\Livewire;
+
+use Livewire\Component;
+use Livewire\WithFileUploads;
+use Illuminate\Support\Str;
+
+use App\Models\Azienda as AziendaModel;
+
+class Azienda extends Component
+{
+    use WithFileUploads;
+
+    public $update = false;
+    public $azienda;
+    public $ragione_sociale;
+    public $nome_associazione;
+    public $tipologia;
+    public $discipline;
+    public $logo;
+    public $temp_logo;
+    public $sede_legale_nazione;
+    public $sede_legale_provincia;
+    public $sede_legale_comune;
+    public $sede_legale_indirizzo;
+    public $sede_legale_cap;
+    public $same_address = false;
+    public $sede_operativa_nazione;
+    public $sede_operativa_provincia;
+    public $sede_operativa_comune;
+    public $sede_operativa_indirizzo;
+    public $sede_operativa_cap;
+    public $email;
+    public $pec;
+    public $telefono;
+    public $cellulare;
+    public $partita_iva;
+    public $codice_fiscale;
+    public $codice_sdi;
+    public $chiusura_anno_fiscale;
+    public $scadenza_abbonamenti;
+    public $scadenza_pagamenti_uscita;
+
+    public $search = '';
+    public $selectedDisciplines = [];
+    public $disciplineId = '';
+    public $disciplines = [];
+    public $activeTab = 'generale';
+
+    protected $rules = [
+        'ragione_sociale' => 'required|string|max:255',
+        'email' => 'required|email|max:255',
+        'pec' => 'required|email|max:255',
+        'cellulare' => 'required|string|max:20',
+    ];
+
+    public function resetFields()
+    {
+        $this->ragione_sociale = null;
+        $this->nome_associazione = null;
+        $this->tipologia = null;
+        $this->discipline = null;
+        $this->temp_logo = null;
+
+        $this->sede_legale_nazione = null;
+        $this->sede_legale_provincia = null;
+        $this->sede_legale_comune = null;
+        $this->sede_legale_indirizzo = null;
+        $this->sede_legale_cap = null;
+
+        $this->same_address = false;
+        $this->sede_operativa_nazione = null;
+        $this->sede_operativa_provincia = null;
+        $this->sede_operativa_comune = null;
+        $this->sede_operativa_indirizzo = null;
+        $this->sede_operativa_cap = null;
+
+        $this->email = null;
+        $this->pec = null;
+        $this->telefono = null;
+        $this->cellulare = null;
+
+        $this->partita_iva = null;
+        $this->codice_fiscale = null;
+        $this->codice_sdi = null;
+
+        $this->chiusura_anno_fiscale = null;
+        $this->scadenza_abbonamenti = null;
+        $this->scadenza_pagamenti_uscita = null;
+    }
+
+    public function mount()
+    {
+        $this->azienda = AziendaModel::first();
+
+        if ($this->azienda) {
+            $this->ragione_sociale = $this->azienda->ragione_sociale;
+            $this->nome_associazione = $this->azienda->nome_associazione;
+            $this->tipologia = $this->azienda->tipologia;
+            $this->discipline = $this->azienda->discipline;
+            $this->logo = $this->azienda->logo;
+
+            $this->sede_legale_nazione = $this->azienda->sede_legale_nazione;
+            $this->sede_legale_provincia = $this->azienda->sede_legale_provincia;
+            $this->sede_legale_comune = $this->azienda->sede_legale_comune;
+            $this->sede_legale_indirizzo = $this->azienda->sede_legale_indirizzo;
+            $this->sede_legale_cap = $this->azienda->sede_legale_cap;
+
+            $this->sede_operativa_nazione = $this->azienda->sede_operativa_nazione;
+            $this->sede_operativa_provincia = $this->azienda->sede_operativa_provincia;
+            $this->sede_operativa_comune = $this->azienda->sede_operativa_comune;
+            $this->sede_operativa_indirizzo = $this->azienda->sede_operativa_indirizzo;
+            $this->sede_operativa_cap = $this->azienda->sede_operativa_cap;
+
+            $this->email = $this->azienda->email;
+            $this->pec = $this->azienda->pec;
+            $this->telefono = $this->azienda->telefono;
+            $this->cellulare = $this->azienda->cellulare;
+
+            $this->partita_iva = $this->azienda->partita_iva;
+            $this->codice_fiscale = $this->azienda->codice_fiscale;
+            $this->codice_sdi = $this->azienda->codice_sdi;
+
+            $this->chiusura_anno_fiscale = $this->azienda->chiusura_anno_fiscale;
+            $this->scadenza_abbonamenti = $this->azienda->scadenza_abbonamenti;
+            $this->scadenza_pagamenti_uscita = $this->azienda->scadenza_pagamenti_uscita;
+
+            if (
+                $this->sede_legale_nazione == $this->sede_operativa_nazione &&
+                $this->sede_legale_provincia == $this->sede_operativa_provincia &&
+                $this->sede_legale_comune == $this->sede_operativa_comune &&
+                $this->sede_legale_indirizzo == $this->sede_operativa_indirizzo &&
+                $this->sede_legale_cap == $this->sede_operativa_cap
+            ) {
+                $this->same_address = true;
+            }
+
+            if ($this->azienda && $this->azienda->disciplines) {
+                $this->selectedDisciplines = array_map('trim', explode(';', $this->azienda->disciplines));
+            }
+        } else {
+            $this->update = true;
+            $this->resetFields();
+        }
+        $this->loadDisciplines();
+    }
+
+    public function render()
+    {
+        return view('livewire.azienda');
+    }
+
+    public function updatedSameAddress()
+    {
+        if ($this->same_address) {
+            $this->sede_operativa_nazione = $this->sede_legale_nazione;
+            $this->sede_operativa_provincia = $this->sede_legale_provincia;
+            $this->sede_operativa_comune = $this->sede_legale_comune;
+            $this->sede_operativa_indirizzo = $this->sede_legale_indirizzo;
+            $this->sede_operativa_cap = $this->sede_legale_cap;
+        } else {
+            $this->sede_operativa_nazione = null;
+            $this->sede_operativa_provincia = null;
+            $this->sede_operativa_comune = null;
+            $this->sede_operativa_indirizzo = null;
+            $this->sede_operativa_cap = null;
+        }
+    }
+
+    public function updatedSedeOperativaNazione()
+    {
+        $this->checkAddressDifference();
+    }
+
+    public function updatedSedeOperativaProvincia()
+    {
+        $this->checkAddressDifference();
+    }
+
+    public function updatedSedeOperativaComune()
+    {
+        $this->checkAddressDifference();
+    }
+
+    public function updatedSedeOperativaIndirizzo()
+    {
+        $this->checkAddressDifference();
+    }
+
+    public function updatedSedeOperativaCap()
+    {
+        $this->checkAddressDifference();
+    }
+
+    public function checkAddressDifference()
+    {
+        if (
+            $this->sede_legale_nazione == $this->sede_operativa_nazione &&
+            $this->sede_legale_provincia == $this->sede_operativa_provincia &&
+            $this->sede_legale_comune == $this->sede_operativa_comune &&
+            $this->sede_legale_indirizzo == $this->sede_operativa_indirizzo &&
+            $this->sede_legale_cap == $this->sede_operativa_cap
+        ) {
+            $this->same_address = true;
+        } else {
+            $this->same_address = false;
+        }
+    }
+
+    public function setTab($tab)
+    {
+        $this->activeTab = $tab;
+    }
+
+    public function edit()
+    {
+        $this->update = true;
+    }
+
+    public function save()
+    {
+        $this->validate();
+
+        try {
+            $data = [
+                'ragione_sociale' => $this->ragione_sociale,
+                'nome_associazione' => $this->nome_associazione,
+                'tipologia' => $this->tipologia,
+                'disciplines' => implode('; ', $this->selectedDisciplines),
+
+                'sede_legale_nazione' => $this->sede_legale_nazione,
+                'sede_legale_provincia' => $this->sede_legale_provincia,
+                'sede_legale_comune' => $this->sede_legale_comune,
+                'sede_legale_indirizzo' => $this->sede_legale_indirizzo,
+                'sede_legale_cap' => $this->sede_legale_cap,
+
+                'sede_operativa_nazione' => $this->sede_operativa_nazione,
+                'sede_operativa_provincia' => $this->sede_operativa_provincia,
+                'sede_operativa_comune' => $this->sede_operativa_comune,
+                'sede_operativa_indirizzo' => $this->sede_operativa_indirizzo,
+                'sede_operativa_cap' => $this->sede_operativa_cap,
+
+                'email' => $this->email,
+                'pec' => $this->pec,
+                'telefono' => $this->telefono,
+                'cellulare' => $this->cellulare,
+
+                'partita_iva' => $this->partita_iva,
+                'codice_fiscale' => $this->codice_fiscale,
+                'codice_sdi' => $this->codice_sdi,
+
+                'chiusura_anno_fiscale' => $this->chiusura_anno_fiscale,
+                'scadenza_abbonamenti' => $this->scadenza_abbonamenti,
+                'scadenza_pagamenti_uscita' => $this->scadenza_pagamenti_uscita,
+            ];
+
+            if ($this->temp_logo) {
+                $folderName = Str::slug($this->nome_associazione);
+
+                $path = 'img/' . $folderName;
+                $fullPath = storage_path('app/public/' . $path);
+
+                if (!file_exists($fullPath)) {
+                    mkdir($fullPath, 0755, true);
+                }
+
+                $logoPath = $this->temp_logo->store($path, 'public');
+                $data['logo'] = $logoPath;
+            }
+            if ($this->azienda) {
+                $this->azienda->update($data);
+                session()->flash('message', 'Dati aziendali aggiornati con successo!');
+            } else {
+                $this->azienda = AziendaModel::create($data);
+                session()->flash('message', 'Dati aziendali creati con successo!');
+            }
+
+            $this->update = false;
+        } catch (\Exception $ex) {
+            session()->flash('error', 'Errore: ' . $ex->getMessage());
+        }
+    }
+
+    public function getSelectedDisciplineNamesProperty()
+    {
+        if (empty($this->selectedDisciplines)) {
+            return [];
+        }
+
+        return \App\Models\Discipline::whereIn('id', $this->selectedDisciplines)
+            ->pluck('name')
+            ->toArray();
+    }
+
+    public function cancel()
+    {
+        $this->resetFields();
+        $this->mount();
+        $this->update = false;
+    }
+
+    public function loadDisciplines()
+    {
+        $this->disciplines = \App\Models\Discipline::select('id', 'name')->get();
+    }
+
+    public function addDiscipline()
+    {
+        if (!empty($this->disciplineId)) {
+            $discipline = \App\Models\Discipline::find($this->disciplineId);
+
+            if ($discipline && !in_array($discipline->name, $this->selectedDisciplines)) {
+                $this->selectedDisciplines[] = $discipline->name;
+                $this->disciplineId = '';
+            }
+        }
+    }
+
+    public function removeDiscipline($index)
+    {
+        if (isset($this->selectedDisciplines[$index])) {
+            unset($this->selectedDisciplines[$index]);
+            $this->selectedDisciplines = array_values($this->selectedDisciplines);
+        }
+    }
+
+    public function updatedSearch()
+    {
+        $this->loadDisciplines();
+    }
+}

+ 74 - 0
app/Models/Azienda.php

@@ -0,0 +1,74 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Azienda extends Model
+{
+    use HasFactory;
+
+    protected $fillable = [
+        'ragione_sociale',
+        'nome_associazione',
+        'tipologia',
+        'logo',
+
+        'sede_legale_nazione',
+        'sede_legale_provincia',
+        'sede_legale_comune',
+        'sede_legale_indirizzo',
+        'sede_legale_cap',
+
+        'sede_operativa_nazione',
+        'sede_operativa_provincia',
+        'sede_operativa_comune',
+        'sede_operativa_indirizzo',
+        'sede_operativa_cap',
+
+        'email',
+        'pec',
+        'telefono',
+        'cellulare',
+
+        'partita_iva',
+        'codice_fiscale',
+        'codice_sdi',
+
+        'chiusura_anno_fiscale',
+        'scadenza_abbonamenti',
+        'scadenza_pagamenti_uscita',
+    ];
+
+    protected $casts = [
+        'chiusura_anno_fiscale' => 'date',
+        'scadenza_abbonamenti' => 'date',
+        'scadenza_pagamenti_uscita' => 'date',
+    ];
+
+
+    /**
+     * Get the logo URL attribute.
+     *
+     * @return string|null
+     */
+    public function getLogoUrlAttribute()
+    {
+        if ($this->logo) {
+            return asset('storage/' . $this->logo);
+        }
+
+        return null;
+    }
+
+    /**
+     * Get a formatted list of discipline names.
+     *
+     * @return string
+     */
+    public function getDisciplineListAttribute()
+    {
+        return $this->disciplines->pluck('name')->implode(', ');
+    }
+}

+ 12 - 0
app/Models/Discipline.php

@@ -12,8 +12,20 @@ class Discipline extends Model
     protected $fillable = [
         'name',
         'enabled',
+        'code',
+        'sport'
     ];
 
+    public function scopeOfSport($query, $sport)
+    {
+        return $query->where('sport', $sport);
+    }
+
+    public function getFullNameAttribute()
+    {
+        return "{$this->sport} - {$this->name} ({$this->code})";
+    }
+
     public function canDelete()
     {
         return true;

+ 39 - 0
database/migrations/2025_04_04_101800_add_fields_discipline_table.php

@@ -0,0 +1,39 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('disciplines', function (Blueprint $table) {
+            if (!Schema::hasColumn('disciplines', 'code')) {
+                $table->string('code')->nullable()->after('id');
+
+            }
+
+            if (!Schema::hasColumn('disciplines', 'sport')) {
+                $table->string('sport')->nullable()->after('code');
+            }
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('disciplines', function (Blueprint $table) {
+            $table->dropColumn('code', 'sport');
+        });
+    }
+};

+ 68 - 0
database/migrations/2025_04_04_130150_create_aziendas_table.php

@@ -0,0 +1,68 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('aziendas', function (Blueprint $table) {
+            $table->id();
+
+            // General information
+            $table->string('ragione_sociale');
+            $table->string('nome_associazione')->nullable();
+            $table->string('tipologia')->nullable();
+            $table->string('logo')->nullable();
+
+            // Legal address
+            $table->string('sede_legale_nazione')->nullable();
+            $table->string('sede_legale_provincia')->nullable();
+            $table->string('sede_legale_comune')->nullable();
+            $table->string('sede_legale_indirizzo')->nullable();
+            $table->string('sede_legale_cap')->nullable();
+
+            // Operational address
+            $table->string('sede_operativa_nazione')->nullable();
+            $table->string('sede_operativa_provincia')->nullable();
+            $table->string('sede_operativa_comune')->nullable();
+            $table->string('sede_operativa_indirizzo')->nullable();
+            $table->string('sede_operativa_cap')->nullable();
+
+            // Contacts
+            $table->string('email');
+            $table->string('pec');
+            $table->string('telefono')->nullable();
+            $table->string('cellulare');
+
+            // Fiscal data
+            $table->string('partita_iva')->nullable();
+            $table->string('codice_fiscale')->nullable();
+            $table->string('codice_sdi')->nullable();
+
+            // Accounting configuration
+            $table->date('chiusura_anno_fiscale')->nullable();
+            $table->date('scadenza_abbonamenti')->nullable();
+            $table->date('scadenza_pagamenti_uscita')->nullable();
+
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('aziendas');
+    }
+};

+ 28 - 0
database/migrations/2025_04_04_135831_add_field_discipline_to_aziendas_table.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('aziendas', function (Blueprint $table) {
+            if (Schema::hasColumn('aziendas', 'discipline')) {
+                $table->dropColumn('discipline');
+            }
+
+            $table->text('discipline')->nullable();
+        });
+    }
+    public function down()
+    {
+
+    }
+};

+ 1 - 0
routes/web.php

@@ -81,6 +81,7 @@ Route::group(['middleware' => 'auth'], function () {
     Route::get('/users', \App\Http\Livewire\User::class);
     Route::get('/profile', \App\Http\Livewire\Profile::class);
     Route::get('/reports', \App\Http\Livewire\Reports::class);
+    Route::get('/azienda', \App\Http\Livewire\Azienda::class);
 });
 
 Route::get('/receipt/{id}', function ($id) {