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

fix categoria datatable, bacheca e contenuto bacheca

marcofalabretti 1 день назад
Родитель
Сommit
f0593a8787

+ 27
- 0
app/DataTables/AttivitaDataTableEditor.php Просмотреть файл

94
     $data['is_attiva'] = isset($data['is_attiva']) ? true : false;
94
     $data['is_attiva'] = isset($data['is_attiva']) ? true : false;
95
     return $data;
95
     return $data;
96
   }
96
   }
97
+
98
+  public function created(Model $model, array $data): Model
99
+  {
100
+    $model->categorie_contabili()->create([
101
+      'nome' => 'Vendita',
102
+      'descrizione' => 'Vendita di prodotti e servizi',
103
+      'colore' => '#61db0f',
104
+    ]);
105
+    $model->categorie_contabili()->create([
106
+      'nome' => 'Acquisto',
107
+      'descrizione' => 'Acquisto di prodotti e servizi',
108
+      'colore' => '#dc3545',
109
+    ]);
110
+    $model->categorie_contabili()->create([
111
+      'nome' => 'Spese generali',
112
+      'descrizione' => 'Spese generali',
113
+      'colore' => '#dc3545',
114
+    ]);
115
+    $model->categorie_contabili()->create([
116
+      'nome' => 'Utenze',
117
+      'descrizione' => 'Spese per utenze (Luce, Acqua, Gas, Telefono)',
118
+      'colore' => '#dc3545',
119
+    ]);
120
+
121
+    return $model;
122
+  }
123
+
97
   public function messages(): array
124
   public function messages(): array
98
   {
125
   {
99
     return $this->messages;
126
     return $this->messages;

+ 3
- 4
app/DataTables/BachecaDataTable.php Просмотреть файл

43
      */
43
      */
44
     public function query(Bacheca $model): QueryBuilder
44
     public function query(Bacheca $model): QueryBuilder
45
     {
45
     {
46
-        return $model->newQuery()->where('attivita_id', session()->get('attivita_attuale'));
46
+        return $model->newQuery()->where('attivita_id', $this->attivita_id);
47
     }
47
     }
48
 
48
 
49
     /**
49
     /**
76
                     ->editor(
76
                     ->editor(
77
                         Editor::make()
77
                         Editor::make()
78
                             ->fields([
78
                             ->fields([
79
-                                Fields\Select2::make('attivita_id')->label('Attività')
80
-                                ->options(Attivita::all()->pluck('id', 'nome'))
81
-                                ->default(session()->get('attivita_attuale')),
79
+                                Fields\Hidden::make('attivita_id')->label('Attività')
80
+                                ->default($this->attivita_id),
82
                                 Fields\Text::make('nome')->label('Nome'),
81
                                 Fields\Text::make('nome')->label('Nome'),
83
                                 Fields\Text::make('descrizione')->label('Descrizione'),
82
                                 Fields\Text::make('descrizione')->label('Descrizione'),
84
                                 Fields\Image::make('immagine')->label('Immagine'),
83
                                 Fields\Image::make('immagine')->label('Immagine'),

+ 12
- 2
app/DataTables/CategoriacontabileDataTableEditor.php Просмотреть файл

21
     'nome.required' => 'Il nome è richiesto',
21
     'nome.required' => 'Il nome è richiesto',
22
     'descrizione.required' => 'La descrizione è richiesta',
22
     'descrizione.required' => 'La descrizione è richiesta',
23
     'is_attiva.required' => 'Indicare una delle due opzioni',
23
     'is_attiva.required' => 'Indicare una delle due opzioni',
24
+    'nome.unique' => 'Categoria già esistente',
24
   ];
25
   ];
25
 
26
 
26
   /**
27
   /**
31
   public function createRules(): array
32
   public function createRules(): array
32
   {
33
   {
33
     return [
34
     return [
34
-      'nome'  => 'required|unique:categoria_contabile,nome',
35
+      'nome'  => [
36
+        'required',
37
+        Rule::unique('categoria_contabile', 'nome')
38
+            ->where('attivita_id', $data['attivita_id'] ?? null),
39
+      ],
35
       'descrizione' => 'nullable',
40
       'descrizione' => 'nullable',
36
       'is_attiva' => 'boolean',
41
       'is_attiva' => 'boolean',
37
     ];
42
     ];
50
   public function editRules(Model $model): array
55
   public function editRules(Model $model): array
51
   {
56
   {
52
     return [
57
     return [
53
-      'nome'  => 'required|unique:categoria_contabile,nome,'.$model->id,
58
+      'nome' => [
59
+        'required',
60
+        Rule::unique('categoria_contabile', 'nome')
61
+        ->where('attivita_id', $model->attivita_id)
62
+        ->ignore($model->id),
63
+      ],
54
       'descrizione' => 'nullable',
64
       'descrizione' => 'nullable',
55
       'is_attiva' => 'boolean',
65
       'is_attiva' => 'boolean',
56
     ];
66
     ];

+ 5
- 2
app/DataTables/ContenutoBachecaDataTable.php Просмотреть файл

46
      */
46
      */
47
     public function query(ContenutoBacheca $model): QueryBuilder
47
     public function query(ContenutoBacheca $model): QueryBuilder
48
     {
48
     {
49
+        $model = $model->newQuery()->where('attivita_id', $this->attivita_id);
49
         if($this->bacheca_id){
50
         if($this->bacheca_id){
50
-            return $model->newQuery()->join('bacheca_has_contenuto', 'contenuto_bacheca.id', '=', 'bacheca_has_contenuto.contenuto_id')->where('bacheca_has_contenuto.bacheca_id', $this->bacheca_id);
51
+            return $model->join('bacheca_has_contenuto', 'contenuto_bacheca.id', '=', 'bacheca_has_contenuto.contenuto_id')->where('bacheca_has_contenuto.bacheca_id', $this->bacheca_id);
51
         }
52
         }
52
-        return $model->newQuery();
53
+        return $model;
53
     }
54
     }
54
 
55
 
55
     /**
56
     /**
78
                     ->editor(
79
                     ->editor(
79
                         Editor::make()
80
                         Editor::make()
80
                             ->fields([
81
                             ->fields([
82
+                                Fields\Hidden::make('attivita_id')->label('Attività')
83
+                                ->default($this->attivita_id?? Session::get('attivita_attuale')),
81
                                 Fields\Text::make('nome')->label('Nome'),
84
                                 Fields\Text::make('nome')->label('Nome'),
82
                                 Fields\Text::make('descrizione')->label('Descrizione'),
85
                                 Fields\Text::make('descrizione')->label('Descrizione'),
83
                                 Fields\File::make('immagine')->label('Immagine'),
86
                                 Fields\File::make('immagine')->label('Immagine'),

+ 6
- 2
app/DataTables/MonitorDataTable.php Просмотреть файл

52
      */
52
      */
53
     public function query(Dispositivo $model): QueryBuilder
53
     public function query(Dispositivo $model): QueryBuilder
54
     {
54
     {
55
-        return $model->newQuery()->where('tipo', Dispositivo::MONITOR);
55
+        if($this->attivita_id){
56
+            return $model->newQuery()->where('tipo', Dispositivo::MONITOR)->where('attivita_id', $this->attivita_id);
57
+        }else{
58
+            return $model->newQuery()->whereRaw('1 = 0');
59
+        }
56
     }
60
     }
57
 
61
 
58
     /**
62
     /**
78
                     ->editor(
82
                     ->editor(
79
                         Editor::make()
83
                         Editor::make()
80
                             ->fields([
84
                             ->fields([
85
+                                Fields\Hidden::make('attivita_id')->label('Attività')->default($this->attivita_id),
81
                                 Fields\Text::make('nome')->label('Nome'),
86
                                 Fields\Text::make('nome')->label('Nome'),
82
                                 Fields\Boolean::make('is_attivo')->label('Attivo')->default(true),
87
                                 Fields\Boolean::make('is_attivo')->label('Attivo')->default(true),
83
                                 Fields\Hidden::make('tipo')->label('Tipo')->default(Dispositivo::MONITOR),
88
                                 Fields\Hidden::make('tipo')->label('Tipo')->default(Dispositivo::MONITOR),
84
-                                Fields\Select2::make('attivita_id')->label('Attività')->options(Attivita::where('is_attiva', true)->pluck('id', 'nome')),
85
                                 Fields\Text::make('licenza')->label('Licenza'),
89
                                 Fields\Text::make('licenza')->label('Licenza'),
86
                                 Fields\Text::make('ubicazione')->label('Ubicazione'),
90
                                 Fields\Text::make('ubicazione')->label('Ubicazione'),
87
                                 Fields\Text::make('note')->label('Note'),
91
                                 Fields\Text::make('note')->label('Note'),

+ 2
- 0
app/Http/Controllers/BachecaController.php Просмотреть файл

8
 use App\DataTables\BachecaDataTableEditor;
8
 use App\DataTables\BachecaDataTableEditor;
9
 use Illuminate\Support\Facades\Auth;
9
 use Illuminate\Support\Facades\Auth;
10
 use App\DataTables\ContenutoBachecaDataTable;
10
 use App\DataTables\ContenutoBachecaDataTable;
11
+use Illuminate\Support\Facades\Session;
11
 
12
 
12
 class BachecaController extends Controller
13
 class BachecaController extends Controller
13
 {
14
 {
29
     
30
     
30
     public function index(BachecaDataTable $dataTable)
31
     public function index(BachecaDataTable $dataTable)
31
     {
32
     {
33
+        $dataTable->attivita_id = Session::get('attivita_attuale');
32
         return $dataTable->render('bacheca.index');
34
         return $dataTable->render('bacheca.index');
33
     }
35
     }
34
     
36
     

+ 1
- 0
app/Http/Controllers/ContenutoBachecaController.php Просмотреть файл

29
     
29
     
30
     public function index(ContenutoBachecaDataTable $dataTable)
30
     public function index(ContenutoBachecaDataTable $dataTable)
31
     {
31
     {
32
+        $dataTable->attivita_id = Session::get('attivita_attuale');
32
         return $dataTable->render('contenuto_bacheca.index');
33
         return $dataTable->render('contenuto_bacheca.index');
33
     }
34
     }
34
     
35
     

+ 2
- 0
app/Http/Controllers/MonitorController.php Просмотреть файл

10
 use App\DataTables\MonitorDataTableEditor;
10
 use App\DataTables\MonitorDataTableEditor;
11
 use Illuminate\Support\Facades\Auth;
11
 use Illuminate\Support\Facades\Auth;
12
 use Carbon\Carbon;
12
 use Carbon\Carbon;
13
+use Illuminate\Support\Facades\Session;
13
 
14
 
14
 
15
 
15
 class MonitorController extends Controller
16
 class MonitorController extends Controller
32
     
33
     
33
     public function index(MonitorDataTable $dataTable)
34
     public function index(MonitorDataTable $dataTable)
34
     {
35
     {
36
+        $dataTable->attivita_id = Session::get('attivita_attuale');
35
         return $dataTable->render('monitor.index');
37
         return $dataTable->render('monitor.index');
36
     }
38
     }
37
     public function store(MonitorDataTableEditor $editor)
39
     public function store(MonitorDataTableEditor $editor)

+ 5
- 0
app/Models/AbstractModels/AbstractAttivita.php Просмотреть файл

131
     {
131
     {
132
         return $this->hasMany('\App\Models\MetodoPagamento', 'attivita_id', 'id');
132
         return $this->hasMany('\App\Models\MetodoPagamento', 'attivita_id', 'id');
133
     }
133
     }
134
+
135
+    public function categorie_contabili()
136
+    {
137
+        return $this->hasMany('\App\Models\Categoriacontabile', 'attivita_id', 'id');
138
+    }
134
 }
139
 }

+ 2
- 0
app/Models/AbstractModels/AbstractCategoriacontabile.php Просмотреть файл

41
         'is_attiva' => 'boolean',
41
         'is_attiva' => 'boolean',
42
         'colore' => 'string',
42
         'colore' => 'string',
43
         'info' => 'json',
43
         'info' => 'json',
44
+        'attivita_id' => 'integer',
44
         'created_at' => 'datetime',
45
         'created_at' => 'datetime',
45
         'updated_at' => 'datetime'
46
         'updated_at' => 'datetime'
46
     ];
47
     ];
57
         'is_attiva',
58
         'is_attiva',
58
         'colore',
59
         'colore',
59
         'info',
60
         'info',
61
+        'attivita_id',
60
         'created_at',
62
         'created_at',
61
         'updated_at'
63
         'updated_at'
62
     ];
64
     ];

+ 15
- 1
app/Models/AbstractModels/AbstractContenutoBacheca.php Просмотреть файл

39
         'nome' => 'string',
39
         'nome' => 'string',
40
         'descrizione' => 'string',
40
         'descrizione' => 'string',
41
         'immagine' => 'string',
41
         'immagine' => 'string',
42
+        'attivita_id' => 'integer',
42
         'created_at' => 'datetime',
43
         'created_at' => 'datetime',
43
         'updated_at' => 'datetime'
44
         'updated_at' => 'datetime'
44
     ];  
45
     ];  
52
         'nome',
53
         'nome',
53
         'descrizione',
54
         'descrizione',
54
         'immagine',
55
         'immagine',
56
+        'attivita_id',
55
         'created_at',
57
         'created_at',
56
         'updated_at'
58
         'updated_at'
57
     ];
59
     ];
58
-    
60
+
61
+    public function attivita()
62
+    {
63
+        return $this->belongsTo('\App\Models\Attivita', 'attivita_id', 'id');
64
+    }
65
+    public function bacheca_has_contenuto()
66
+    {
67
+        return $this->hasMany('\App\Models\BachecaHasContenuto', 'contenuto_id', 'id');
68
+    }
69
+    public function bacheche()
70
+    {
71
+        return $this->belongsToMany('\App\Models\Bacheca', 'bacheca_has_contenuto', 'contenuto_id', 'bacheca_id');
72
+    }
59
 }
73
 }

+ 30
- 0
database/migrations/2026_06_17_201520_fix_categoria_contabiles.php Просмотреть файл

1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::table('categoria_contabile', function (Blueprint $table) {
15
+            $table->dropUnique(['nome']);
16
+            $table->unique(['attivita_id', 'nome']);
17
+        });
18
+    }
19
+
20
+    /**
21
+     * Reverse the migrations.
22
+     */
23
+    public function down(): void
24
+    {
25
+        Schema::table('categoria_contabile', function (Blueprint $table) {
26
+            $table->dropUnique(['attivita_id', 'nome']);
27
+            $table->unique(['nome']);
28
+        });
29
+    }
30
+};

+ 30
- 0
database/migrations/2026_06_17_204059_fix_contenuto_bacheca.php Просмотреть файл

1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::table('contenuto_bacheca', function (Blueprint $table) {
15
+            $table->bigInteger('attivita_id')->unsigned()->nullable()->after('id');
16
+            $table->foreign('attivita_id')->references('id')->on('attivita')->onDelete('cascade');
17
+        });
18
+    }
19
+
20
+    /**
21
+     * Reverse the migrations.
22
+     */
23
+    public function down(): void
24
+    {
25
+        Schema::table('contenuto_bacheca', function (Blueprint $table) {
26
+            $table->dropForeign(['attivita_id']);
27
+            $table->dropColumn('attivita_id');
28
+        });
29
+    }
30
+};

+ 1
- 0
database/seeders/DatabaseSeeder.php Просмотреть файл

19
     $this->call(AllergeneSeed::class);
19
     $this->call(AllergeneSeed::class);
20
     $this->call(TombolaSeed::class);
20
     $this->call(TombolaSeed::class);
21
     $this->call(MetodoPagamentoSeed::class);
21
     $this->call(MetodoPagamentoSeed::class);
22
+    $this->call(CategoriaContabileSeed::class);
22
     // Per ogni attività: cucine seed + almeno 9 piatti per cucina (anche cucine già esistenti con stessa attività).
23
     // Per ogni attività: cucine seed + almeno 9 piatti per cucina (anche cucine già esistenti con stessa attività).
23
     $this->call(AttivitaCucinaPiattiSeeder::class);
24
     $this->call(AttivitaCucinaPiattiSeeder::class);
24
 
25
 

+ 1
- 1
resources/menu/verticalMenu.json Просмотреть файл

239
       "icon": "menu-icon icon-base bx bx-cog",
239
       "icon": "menu-icon icon-base bx bx-cog",
240
       "slug": "configurazione.index",
240
       "slug": "configurazione.index",
241
       "url": "admin/configurazione",
241
       "url": "admin/configurazione",
242
-      "can": "permission:view-configurazione | role:amministratore",
242
+      "can": "permission:view-configurazione | role:amministratore | role:superadmin",
243
       "submenu": [
243
       "submenu": [
244
         {
244
         {
245
           "name": "Allergeni",
245
           "name": "Allergeni",

Загрузка…
Отмена
Сохранить