filled('search')) { $search = $request->search; $query->where(function ($q) use ($search) { $q->where('codice_articolo', 'like', "%{$search}%") ->orWhere('descrizione', 'like', "%{$search}%") ->orWhere('ciclo', 'like', "%{$search}%"); }); } $articoli = $query->orderBy('created_at', 'desc')->paginate(15); return view('admin.articoli.index', compact('articoli')); } public function create() { return view('admin.articoli.create'); } public function store(Request $request) { $validated = $request->validate([ 'codice_articolo' => 'required|string|max:255|unique:articoli', 'ciclo' => 'nullable|string|max:255', 'diametro' => 'nullable|string|max:255', 'descrizione' => 'nullable|string', 'posizione' => 'nullable|string|max:255', 'quantita' => 'nullable|integer|min:0', 'tipo_lavorazione' => 'nullable|string|max:255', 'materiale_lavorare' => 'nullable|string|max:255', 'maximum_thickness' => 'nullable|string|max:255', 'speed_rpm' => 'nullable|integer|min:0', 'feed' => 'nullable|numeric|min:0', 'max_thrust_a' => 'nullable|string|max:255', 'min_torque_a' => 'nullable|string|max:255', 'quantita_fori' => 'nullable|integer|min:0', ]); $articolo = Articolo::create($validated); return redirect()->route('admin.articoli.show', $articolo) ->with('success', 'Articolo creato con successo.'); } public function show(Articolo $articolo) { return view('admin.articoli.show', compact('articolo')); } public function edit(Articolo $articolo) { return view('admin.articoli.edit', compact('articolo')); } public function update(Request $request, Articolo $articolo) { $validated = $request->validate([ 'codice_articolo' => 'required|string|max:255|unique:articoli,codice_articolo,' . $articolo->id, 'ciclo' => 'nullable|string|max:255', 'diametro' => 'nullable|string|max:255', 'descrizione' => 'nullable|string', 'posizione' => 'nullable|string|max:255', 'quantita' => 'nullable|integer|min:0', 'tipo_lavorazione' => 'nullable|string|max:255', 'materiale_lavorare' => 'nullable|string|max:255', 'maximum_thickness' => 'nullable|string|max:255', 'speed_rpm' => 'nullable|integer|min:0', 'feed' => 'nullable|numeric|min:0', 'max_thrust_a' => 'nullable|string|max:255', 'min_torque_a' => 'nullable|string|max:255', 'quantita_fori' => 'nullable|integer|min:0', ]); $articolo->update($validated); return redirect()->route('admin.articoli.show', $articolo) ->with('success', 'Articolo aggiornato con successo.'); } public function destroy(Articolo $articolo) { $articolo->delete(); return redirect()->route('admin.articoli.index') ->with('success', 'Articolo eliminato con successo.'); } public function qrCode(Articolo $articolo) { $qrCode = QrCode::format('svg') ->size(300) ->errorCorrection('H') ->generate($articolo->qr_url); return response($qrCode) ->header('Content-Type', 'image/svg+xml'); } public function downloadQrCode(Articolo $articolo) { $qrCode = QrCode::format('png') ->size(300) ->errorCorrection('H') ->generate($articolo->qr_url); return response($qrCode) ->header('Content-Type', 'image/png') ->header('Content-Disposition', 'attachment; filename="qr-' . $articolo->codice_articolo . '.png"'); } public function printQrCodes(Request $request) { $ids = explode(',', $request->get('ids', '')); $ids = array_filter($ids, fn($id) => is_numeric($id)); if (empty($ids)) { return redirect()->route('admin.articoli.index') ->with('error', 'Nessun articolo selezionato.'); } $articoli = Articolo::whereIn('id', $ids)->get(); // Generate QR codes as base64 for each article $articoliWithQr = $articoli->map(function ($articolo) { $qrCode = QrCode::format('png') ->size(100) // 100px ~ 10mm at 254 DPI ->errorCorrection('H') ->margin(0) ->generate($articolo->qr_url); return [ 'articolo' => $articolo, 'qr_base64' => base64_encode($qrCode), ]; }); $pdf = Pdf::loadView('admin.articoli.pdf-qrcodes', [ 'articoliWithQr' => $articoliWithQr, ]); $pdf->setPaper('a4', 'portrait'); return $pdf->stream('qrcodes.pdf'); } public function import(Request $request) { $request->validate([ 'file' => 'required|file|mimes:xlsx,xls', 'clean_import' => 'nullable|boolean', ]); $file = $request->file('file'); $cleanImport = $request->boolean('clean_import', false); try { $seeder = new ArticoloSeeder(); $result = $seeder->importFromExcel($file->getPathname(), $cleanImport); $message = "Import completato! "; $message .= "Articoli importati: {$result['imported']}, "; $message .= "Articoli aggiornati: {$result['updated']}, "; $message .= "Totale articoli: {$result['total']}"; if (!empty($result['errors'])) { $message .= ". Errori: " . count($result['errors']); } return response()->json([ 'success' => true, 'message' => $message, 'data' => $result, ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Errore durante l\'importazione: ' . $e->getMessage(), ], 500); } } }