Przeglądaj źródła

Variante piatto con stampe

marcofalabretti 1 miesiąc temu
rodzic
commit
3800dc5644

+ 139
- 0
app/DataTables/VariantePiattoDataTable.php Wyświetl plik

1
+<?php
2
+
3
+namespace App\DataTables;
4
+
5
+use App\Models\VariantePiatto;
6
+use App\Models\Piatto;
7
+use App\Models\Cucina;
8
+use Illuminate\Database\Eloquent\Builder as QueryBuilder;
9
+use Yajra\DataTables\EloquentDataTable;
10
+use Yajra\DataTables\Html\Builder as HtmlBuilder;
11
+use Yajra\DataTables\Html\Button;
12
+use Yajra\DataTables\Html\Column;
13
+use Yajra\DataTables\Html\Editor\Editor;
14
+use Yajra\DataTables\Html\Editor\Fields;
15
+use Yajra\DataTables\Services\DataTable;
16
+use Illuminate\Support\Facades\Auth;
17
+
18
+class VariantePiattoDataTable extends DataTable
19
+{
20
+    public bool $dashboard = false;
21
+
22
+    public ?int $attivita_id = null;
23
+
24
+    public ?int $cucina_id = null;
25
+
26
+    public function __construct()
27
+    {
28
+        $this->dataTableVariable = 'dataTable_variante_piatto';
29
+        $this->dashboard = request()->boolean('dashboard')
30
+            || request()->routeIs('variante-piatto.datatable');
31
+    }
32
+
33
+    protected function isDashboard(): bool
34
+    {
35
+        return $this->dashboard || request()->routeIs('variante-piatto.datatable');
36
+    }
37
+    /**
38
+     * Build the DataTable class.
39
+     *
40
+     * @param QueryBuilder<VariantePiatto> $query Results from query() method.
41
+     */
42
+    public function dataTable(QueryBuilder $query): EloquentDataTable
43
+    {
44
+        return (new EloquentDataTable($query))
45
+            ->addColumn('action', function($entity){
46
+                return view('variante_piatto.menu', ['entity' => $entity, 'dashboard' => $this->isDashboard()]);
47
+            })
48
+            ->addColumn('prezzo_display', function($entity){
49
+                return '€ ' . number_format($entity->prezzo, 2, ',', '.');
50
+            })
51
+            ->setRowId('id');
52
+    }
53
+
54
+    /**
55
+     * Get the query source of dataTable.
56
+     *
57
+     * @return QueryBuilder<VariantePiatto>
58
+     */
59
+    public function query(VariantePiatto $model): QueryBuilder
60
+    {
61
+        $query = $model->newQuery()->where('attivita_id', $this->attivita_id);
62
+        if (isset($this->cucina_id)) {
63
+            $query->where('cucina_id', $this->cucina_id);
64
+        }
65
+        // if (isset($this->cucina_id)) {
66
+        //     $query->whereHas('piatto', function ($q) {
67
+        //         $q->where('cucina_id', $this->cucina_id);
68
+        //     });
69
+        // }
70
+
71
+        return $query;
72
+    }
73
+
74
+    /**
75
+     * Optional method if you want to use the html builder.
76
+     */
77
+    public function html(): HtmlBuilder
78
+    {
79
+        $buttons = [];
80
+        if (Auth::user()->can('create-variante-piatto')) {
81
+            array_push($buttons, Button::make('create')
82
+                ->editor('editor')
83
+                ->formTitle('Crea nuova variante piatto')
84
+                ->className('btn btn-sm btn-primary mb-4')
85
+                ->text('<i class="fas fa-plus"></i> Nuova variante'));
86
+        }
87
+        $builder = $this->builder()
88
+                    ->setTableId($this->dataTableVariable)
89
+                    ->columns($this->getColumns())
90
+                    ->orderBy(1)
91
+                    ->responsive()
92
+                    ->editor(Editor::make()
93
+                        ->ajax(route('variante-piatto.store'))
94
+                        ->fields([
95
+                            Fields\Hidden::make('attivita_id')->label('Attività')->default($this->attivita_id),
96
+                            Fields\Text::make('prezzo')->label('Prezzo'),
97
+                            Fields\Text::make('label')->label('Nome'),
98
+                            Fields\Select2::make('piatto_id')->label('Piatto')->options(Piatto::where('attivita_id', $this->attivita_id)->pluck('id', 'nome')),
99
+                            Fields\Select2::make('cucina_id')->label('Cucina')->options(Cucina::where('attivita_id', $this->attivita_id)->pluck('id', 'nome')),
100
+                        ])
101
+                    )
102
+                    ->language(asset('assets/Italian.json'))
103
+                    ->dom(count($buttons) == 0 ? 'rtip' : 'Bfrtip')
104
+                    ->selectStyleSingle()
105
+                    ->buttons($buttons);
106
+
107
+        if ($this->isDashboard()) {
108
+            $builder->minifiedAjax(route('variante-piatto.index'), null, array_filter([
109
+                'dashboard' => 1,
110
+                'cucina_id' => $this->cucina_id,
111
+            ]));
112
+        } else {
113
+            $builder->minifiedAjax();
114
+        }
115
+
116
+        return $builder;
117
+    }
118
+
119
+    /**
120
+     * Get the dataTable columns definition.
121
+     */
122
+    public function getColumns(): array
123
+    {
124
+        return [
125
+            Column::make('id')->visible(false),
126
+            Column::make('label')->title('Nome')->searchable()->responsivePriority(1),
127
+            Column::make('prezzo')->data('prezzo_display')->title('Prezzo')->addClass('text-center'),
128
+            Column::computed('action')->title('')->width('10%')->addClass('text-center')->responsivePriority(1),
129
+        ];
130
+    }
131
+
132
+    /**
133
+     * Get the filename for export.
134
+     */
135
+    protected function filename(): string
136
+    {
137
+        return 'VariantePiatto_' . date('YmdHis');
138
+    }
139
+}

+ 106
- 0
app/DataTables/VariantePiattoDataTableEditor.php Wyświetl plik

1
+<?php
2
+
3
+namespace App\DataTables;
4
+
5
+use App\Models\VariantePiatto;
6
+use Illuminate\Database\Eloquent\Model;
7
+use Illuminate\Validation\Rule;
8
+use Yajra\DataTables\DataTablesEditor;
9
+use Illuminate\Http\Request;
10
+use Illuminate\Validation\ValidationException;
11
+use Storage;
12
+use Illuminate\Support\Str;
13
+
14
+class VariantePiattoDataTableEditor extends DataTablesEditor
15
+{
16
+  protected $model = VariantePiatto::class;
17
+  // protected $uploadDir = '';
18
+  // protected $disk = 'modelliRicevute';
19
+
20
+  protected $messages = [
21
+    'label.required' => 'Il nome è richiesto',
22
+    'prezzo.required' => 'Il prezzo è richiesto',
23
+    'is_attivo.required' => 'Indicare una delle due opzioni',
24
+    'piatto_id.required' => 'Il piatto è richiesto',
25
+    'cucina_id.required' => 'La cucina è richiesta',
26
+    'attivita_id.required' => 'L\'attività è richiesta',
27
+    'attivita_id.exists' => 'L\'attività non è valida',
28
+    'piatto_id.exists' => 'Il piatto non è valido',
29
+    'cucina_id.exists' => 'La cucina non è valida',
30
+  ];
31
+
32
+  /**
33
+  * Get create action validation rules.
34
+  *
35
+  * @return array
36
+  */
37
+  public function createRules(): array
38
+  {
39
+    return [
40
+      'label'  => 'required',
41
+      'attivita_id' => 'required|exists:attivita,id',
42
+      'prezzo' => 'required',
43
+      'is_attivo' => 'boolean',
44
+      'piatto_id' => 'nullable|exists:piatto,id',
45
+      'cucina_id' => 'required|exists:cucina,id',
46
+    ];
47
+  }
48
+
49
+  public function createMessages(): array{
50
+    return $this->messages;
51
+  }
52
+
53
+  /**
54
+  * Get edit action validation rules.
55
+  *
56
+  * @param Model $model
57
+  * @return array
58
+  */
59
+  public function editRules(Model $model): array
60
+  {
61
+    return [
62
+      'label'  => 'required',
63
+      'attivita_id' => 'required|exists:attivita,id',
64
+      'prezzo' => 'required',
65
+      'is_attivo' => 'boolean',
66
+      'piatto_id' => 'nullable|exists:piatto,id',
67
+      'cucina_id' => 'required|exists:cucina,id',
68
+    ];
69
+
70
+  }
71
+
72
+  public function editMessages(): array{
73
+    return $this->messages;
74
+  }
75
+
76
+  /**
77
+  * Get remove action validation rules.
78
+  *
79
+  * @param Model $model
80
+  * @return array
81
+  */
82
+  public function removeRules(Model $model): array
83
+  {
84
+    return [];
85
+  }
86
+
87
+  public function creating(Model $model, array $data): array
88
+  {
89
+    // $model->roles()->sync([$data['ruolo_id']]);
90
+    $data['is_attivo'] = isset($data['is_attivo']) ? true : false;
91
+    return $data;
92
+  }
93
+
94
+  public function updating(Model $model, array $data): array
95
+  {
96
+    // dd($data['ruolo']);
97
+    // $model->roles()->sync([$data['ruolo_id']]);
98
+    $data['is_attivo'] = isset($data['is_attivo']) ? true : false;
99
+    return $data;
100
+  }
101
+  public function messages(): array
102
+  {
103
+    return $this->messages;
104
+  }
105
+
106
+}

+ 108
- 0
app/Http/Controllers/VariantePiattoController.php Wyświetl plik

1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use Illuminate\Http\Request;
6
+use App\Models\VariantePiatto;
7
+use App\DataTables\VariantePiattoDataTable;
8
+use App\DataTables\VariantePiattoDataTableEditor;
9
+use Illuminate\Support\Facades\Session;
10
+use Illuminate\Support\Facades\Auth;
11
+
12
+class VariantePiattoController extends Controller
13
+{
14
+    public static $permission_group = "Varianti Piatto";
15
+    public static $permissions = [
16
+        'view-variante-piatto' => 'Vedi',
17
+        'create-variante-piatto' => 'Crea',
18
+        'edit-variante-piatto' => 'Modifica',
19
+        'delete-variante-piatto' => 'Elimina',
20
+    ];
21
+
22
+    public static function middleware(): array
23
+    {
24
+        return [
25
+            new Middleware('permission:view-variante-piatto', only: ['index']),
26
+            new Middleware('permission:create-variante-piatto|edit-variante-piatto|delete-variante-piatto', only: ['store', 'update', 'destroy']),
27
+        ];
28
+    }
29
+
30
+    public function index(VariantePiattoDataTable $dataTable)
31
+    {
32
+        $dataTable->attivita_id = Session::get('attivita_attuale');
33
+
34
+        if (request()->boolean('dashboard')) {
35
+            $dataTable->dashboard = true;
36
+        }
37
+
38
+        if (request()->has('cucina_id')) {
39
+            $dataTable->cucina_id = (int) request()->get('cucina_id');
40
+        }
41
+
42
+        return $dataTable->render('variante_piatto.index');
43
+    }
44
+
45
+    public function store(VariantePiattoDataTableEditor $editor)
46
+    {
47
+        $request = request();
48
+        $input = $request->all();
49
+        if($request->has('action')){
50
+          switch($input['action']){
51
+            case 'create':
52
+              if(!Auth::user()->can('create-variante-piatto')) return;
53
+              break;
54
+            case 'edit':
55
+              if(!Auth::user()->can('edit-variante-piatto')) return;
56
+              break;
57
+            case 'remove':
58
+              if(!Auth::user()->can('delete-variante-piatto')) return;
59
+              break;
60
+          }
61
+        }
62
+        return $editor->process($request);
63
+    }
64
+
65
+    public function datatable(VariantePiattoDataTable $dataTable , Request $request){
66
+        $dataTable->attivita_id = Session::get('attivita_attuale');
67
+  
68
+        if(request()->has('cucina_id')){
69
+          $dataTable->cucina_id = request()->get('cucina_id');
70
+        }
71
+        if(request()->has('dashboard')){
72
+          $dataTable->dashboard = true;
73
+        }
74
+  
75
+          return $dataTable->render('variante_piatto.datatable');
76
+      }
77
+
78
+    public function list(Request $request){
79
+        $attivita = \App\Models\Attivita::find(Session::get('attivita_attuale'));
80
+        if(!$attivita){
81
+          return response()->json([
82
+            'success' => false,
83
+            'message' => 'Attività non trovata',
84
+          ]);
85
+        }
86
+        $rigaOrdine = \App\Models\RigaOrdine::find($request->riga_ordine_id);
87
+        if(!$rigaOrdine){
88
+          return response()->json([
89
+            'success' => false,
90
+            'message' => 'Riga ordine non trovata',
91
+          ]);
92
+        }
93
+    
94
+      $variantiCucina = VariantePiatto::query()
95
+      ->where('attivita_id', $attivita->id)
96
+      ->where('cucina_id',$rigaOrdine->piatto->cucina->id);
97
+
98
+      $variantiPiatto = VariantePiatto::query()
99
+      ->where('attivita_id', $attivita->id)
100
+      ->where('piatto_id',$rigaOrdine->piatto->id);
101
+
102
+
103
+      return response()->json([
104
+        'variantiCucina' => $variantiCucina->get(),
105
+        'variantiPiatto' => $variantiPiatto->get(),
106
+      ]);
107
+    }
108
+}

+ 69
- 0
app/Models/AbstractModels/AbstractRigaOrdineHasVariante.php Wyświetl plik

1
+<?php
2
+/**
3
+ * Model object generated by: Skipper (http://www.skipper18.com)
4
+ * Do not modify this file manually.
5
+ */
6
+
7
+namespace App\Models\AbstractModels;
8
+
9
+abstract class AbstractRigaOrdineHasVariante extends \Illuminate\Foundation\Auth\User
10
+{
11
+    /**  
12
+     * The table associated with the model.
13
+     * 
14
+     * @var string
15
+     */
16
+    protected $table = 'riga_ordine_has_variante';
17
+    
18
+    /**  
19
+     * Primary key type.
20
+     * 
21
+     * @var string
22
+     */
23
+    protected $keyType = 'bigInteger';
24
+    
25
+    /**  
26
+     * The model's default values for attributes.
27
+     * 
28
+     * @var array
29
+     */
30
+    // protected $attributes = ['is_gruppo' => 0];
31
+    
32
+    /**  
33
+     * The attributes that should be cast to native types.
34
+     * 
35
+     * @var array
36
+     */
37
+    protected $casts = [
38
+        'id' => 'integer',
39
+        'riga_ordine_id' => 'integer',
40
+        'variante_id' => 'integer',
41
+        'nota' => 'string',
42
+        'created_at' => 'datetime',
43
+        'updated_at' => 'datetime'
44
+    ];
45
+
46
+    /**  
47
+     * The attributes that are mass assignable.
48
+     * 
49
+     * @var array
50
+     */
51
+    protected $fillable = [
52
+        'id',
53
+        'riga_ordine_id',
54
+        'variante_id',
55
+        'nota',
56
+        'created_at',
57
+        'updated_at'
58
+    ];
59
+    
60
+    public function riga_ordine()
61
+    {
62
+        return $this->belongsTo('\App\Models\RigaOrdine', 'riga_ordine_id', 'id');
63
+    }
64
+
65
+    public function variante_piatto()
66
+    {
67
+        return $this->belongsTo('\App\Models\VariantePiatto', 'variante_id', 'id');
68
+    }
69
+}

+ 10
- 0
app/Models/RigaOrdineHasVariante.php Wyświetl plik

1
+<?php
2
+
3
+namespace App\Models;
4
+
5
+use Illuminate\Database\Eloquent\Relations\Pivot;
6
+
7
+class RigaOrdineHasVariante extends \App\Models\AbstractModels\AbstractRigaOrdineHasVariante
8
+{
9
+    //
10
+}

+ 6
- 1
app/Services/Stampa/CreaComandaCucina.php Wyświetl plik

20
      */
20
      */
21
     public function perOrdine(Ordine $ordine, int $cucina_id): array
21
     public function perOrdine(Ordine $ordine, int $cucina_id): array
22
     {
22
     {
23
-        $ordine->loadMissing(['righe_ordine.piatto', 'dispositivo']);
23
+        $ordine->loadMissing(['righe_ordine.piatto', 'dispositivo', 'righe_ordine.has_variante.variante_piatto']);
24
         $cucina = Cucina::find($cucina_id);
24
         $cucina = Cucina::find($cucina_id);
25
         if ($cucina === null) {
25
         if ($cucina === null) {
26
             Log::error('--- CreaComandaCucina --- Cucina non trovata id: '.$cucina_id);
26
             Log::error('--- CreaComandaCucina --- Cucina non trovata id: '.$cucina_id);
186
                 }
186
                 }
187
                 $printer->setTextSize(1, 1);
187
                 $printer->setTextSize(1, 1);
188
             }
188
             }
189
+            if($riga->has_variante->isNotEmpty()){
190
+                foreach($riga->has_variante as $variante){
191
+                    $printer->text(">> ".$variante->variante_piatto->label."\n");
192
+                }
193
+            }
189
 
194
 
190
             $printer->text("\n");
195
             $printer->text("\n");
191
         }
196
         }

+ 34
- 0
database/migrations/2026_06_21_223039_create_riga_ordine_has_variante_table.php Wyświetl plik

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::create('riga_ordine_has_variante', function (Blueprint $table) {
15
+            $table->id();
16
+            $table->bigInteger('riga_ordine_id')->unsigned()->nullable();
17
+            $table->foreign('riga_ordine_id')->references('id')->on('riga_ordine')->onDelete('cascade');
18
+            $table->bigInteger('variante_id')->unsigned()->nullable();
19
+            $table->foreign('variante_id')->references('id')->on('variante_piatto')->onDelete('cascade');
20
+            $table->string('nota')->nullable();
21
+            $table->timestamps();
22
+
23
+            $table->unique(['riga_ordine_id', 'variante_id']);
24
+        });
25
+    }
26
+
27
+    /**
28
+     * Reverse the migrations.
29
+     */
30
+    public function down(): void
31
+    {
32
+        Schema::dropIfExists('riga_ordine_has_variante');
33
+    }
34
+};

+ 9
- 0
resources/views/variante_piatto/datatable.blade.php Wyświetl plik

1
+
2
+
3
+
4
+<div class="card-body pt-0">
5
+        {{ $dataTable_variante_piatto->table(['class' => 'table table-bordered']) }}
6
+      </div>
7
+
8
+
9
+ @include('variante_piatto.datatable_script') 

+ 55
- 0
resources/views/variante_piatto/datatable_script.blade.php Wyświetl plik

1
+
2
+
3
+{{$dataTable_variante_piatto->scripts(attributes: ['type' => 'module'])}}
4
+
5
+
6
+<script type="module">
7
+  $(document).ready(function(){
8
+    // Editor edit
9
+    $("#dataTable_variante_piatto").on('click', 'a.editor_edit', function (e) {
10
+      e.preventDefault();
11
+      window.LaravelDataTables["dataTable_variante_piatto-editor"].edit( $(this).closest('tr'), {
12
+        title: 'Modifica',
13
+        buttons: 'Aggiorna',
14
+      });
15
+    });
16
+
17
+    // Editor delete
18
+    $("#dataTable_variante_piatto").on('click', 'a.editor_delete', function (e) {
19
+      e.preventDefault();
20
+      window.LaravelDataTables["dataTable_variante_piatto-editor"].remove($(this).closest('tr'), {
21
+        title: 'Cancella record',
22
+        message: 'Sei sicuro di voler eliminare il record selezionato?',
23
+        buttons: 'Cancella record'
24
+      });
25
+    } );
26
+
27
+    $("#dataTable_variante_piatto").on('dblclick', 'tbody td', function (e) {
28
+      window.LaravelDataTables["dataTable_variante_piatto-editor"].edit( $(this).closest('tr'), {
29
+        title: 'Modifica',
30
+        buttons: 'Aggiorna',
31
+      });
32
+    });
33
+
34
+  });
35
+
36
+</script>
37
+
38
+<script>
39
+  function initComplete_variante_piatto(){
40
+    $('div.dt-buttons button').removeClass('btn-secondary');
41
+    $('div.dt-search').addClass('mt-0 mb-4');
42
+    $('div.btn-group').removeClass('btn-group');
43
+    return;
44
+  }
45
+
46
+  function aggiornaVariantePiattoDataTable(categoria_id) {
47
+  const dt = window.LaravelDataTables["dataTable_variante_piatto"];
48
+  dt.settings()[0].ajax.data = function(d) {
49
+    d.cucina_id = cucina_id;
50
+  };
51
+  dt.ajax.reload();
52
+}
53
+
54
+
55
+</script>

+ 23
- 0
resources/views/variante_piatto/menu.blade.php Wyświetl plik

1
+<?php
2
+use Illuminate\Support\Facades\Auth;
3
+?>
4
+
5
+<div class="dropdown">
6
+    <button type="button" class="btn p-0 dropdown-toggle hide-arrow" data-bs-toggle="dropdown" aria-expanded="false">
7
+        <i class="bx bx-dots-vertical-rounded fs-large"></i>
8
+    </button>
9
+    <div class="dropdown-menu">
10
+
11
+        @if(Auth::user()->can('edit-variante-piatto'))
12
+        <a href="#" class="dropdown-item editor_edit">
13
+            <i class="bx bx-edit-alt me-1"></i> Modifica
14
+        </a>
15
+        @endif
16
+
17
+        @if(Auth::user()->can('delete-variante-piatto'))
18
+        <a href="#" class="dropdown-item editor_delete text-danger">
19
+            <i class="bx bx-trash me-1 text-danger"></i> Elimina
20
+        </a>
21
+        @endif
22
+    </div>
23
+</div>

Ładowanie…
Anuluj
Zapisz