199 lines
6.5 KiB
PHP
199 lines
6.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Articolo;
|
|
use Barryvdh\DomPDF\Facade\Pdf;
|
|
use Database\Seeders\ArticoloSeeder;
|
|
use Illuminate\Http\Request;
|
|
use SimpleSoftwareIO\QrCode\Facades\QrCode;
|
|
|
|
class ArticoloController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$query = Articolo::query();
|
|
|
|
if ($request->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);
|
|
}
|
|
}
|
|
}
|