Aggiungi campi per immagini e diametro del foro nel modello Articolo e nelle relative migrazioni; aggiorna i form e le viste per gestire i nuovi campi

This commit is contained in:
2026-05-18 16:23:12 +02:00
parent f3a1d816b7
commit 83412247a7
11 changed files with 373 additions and 33 deletions

View File

@@ -5,8 +5,8 @@ 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 Illuminate\Support\Facades\Storage;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use \PhpOffice\PhpSpreadsheet\IOFactory;
@@ -40,6 +40,7 @@ class ArticoloController extends Controller
$validated = $request->validate([
'codice_articolo' => 'required|string|max:255|unique:articoli',
'ciclo' => 'nullable|string|max:255',
'hole_diameter' => 'nullable|string|max:255',
'diametro' => 'nullable|string|max:255',
'descrizione' => 'nullable|string',
'posizione' => 'nullable|string|max:255',
@@ -75,6 +76,7 @@ class ArticoloController extends Controller
$validated = $request->validate([
'codice_articolo' => 'required|string|max:255|unique:articoli,codice_articolo,' . $articolo->id,
'ciclo' => 'nullable|string|max:255',
'hole_diameter' => 'nullable|string|max:255',
'diametro' => 'nullable|string|max:255',
'descrizione' => 'nullable|string',
'posizione' => 'nullable|string|max:255',
@@ -87,8 +89,36 @@ class ArticoloController extends Controller
'max_thrust_a' => 'nullable|string|max:255',
'min_torque_a' => 'nullable|string|max:255',
'quantita_fori' => 'nullable|integer|min:0',
'immagine_articolo' => 'nullable|image|mimes:jpeg,png,jpg,gif,webp|max:4096',
'immagine_thrust' => 'nullable|image|mimes:jpeg,png,jpg,gif,webp|max:4096',
'immagine_tourque' => 'nullable|image|mimes:jpeg,png,jpg,gif,webp|max:4096',
'rimuovi_immagine_articolo' => 'nullable|boolean',
'rimuovi_immagine_thrust' => 'nullable|boolean',
'rimuovi_immagine_tourque' => 'nullable|boolean',
]);
$imageFields = ['immagine_articolo', 'immagine_thrust', 'immagine_tourque'];
foreach ($imageFields as $field) {
$removeKey = 'rimuovi_' . $field;
if ($request->boolean($removeKey)) {
if ($articolo->$field) {
Storage::disk('public')->delete($articolo->$field);
}
$validated[$field] = null;
} elseif ($request->hasFile($field)) {
if ($articolo->$field) {
Storage::disk('public')->delete($articolo->$field);
}
$validated[$field] = $request->file($field)->store('articoli', 'public');
} else {
unset($validated[$field]);
}
unset($validated[$removeKey]);
}
$articolo->update($validated);
return redirect()->route('admin.articoli.show', $articolo)
@@ -164,7 +194,7 @@ class ArticoloController extends Controller
public function import(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xlsx,xls',
'file' => 'required|file|mimetypes:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,application/octet-stream',
'clean_import' => 'nullable|boolean',
]);
@@ -172,7 +202,6 @@ class ArticoloController extends Controller
$cleanImport = $request->boolean('clean_import', false);
try {
$seeder = new ArticoloSeeder();
$result = $this->importFromExcel($file->getPathname(), $cleanImport);
$message = "Import completato! ";
@@ -216,6 +245,11 @@ class ArticoloController extends Controller
}
// Skip header rows (first 2 rows)
// Column layout (v2): 0=Codice Articolo, 1=Immagine Articolo (skip), 2=Ciclo,
// 3=Hole Diameter, 4=Diametro, 5=Descrizione, 6=Posizione, 7=Quantità,
// 8=Tipo lavorazione, 9=Materiale, 10=Max Thickness, 11=Speed RPM, 12=Feed,
// 13=Max Thrust A, 14=Immagine Thrust (skip), 15=Min Torque A,
// 16=Immagine Tourque (skip), 17=Quantità fori
foreach (array_slice($rows, 2) as $index => $row) {
// Skip empty rows
if (empty($row[0])) {
@@ -228,19 +262,20 @@ class ArticoloController extends Controller
Articolo::updateOrCreate(
['codice_articolo' => $row[0]],
[
'ciclo' => $row[1] ?? null,
'diametro' => $row[2] ?? null,
'descrizione' => $row[3] ?? null,
'posizione' => $row[4] ?? null,
'quantita' => is_numeric($row[5]) ? (int) $row[5] : 0,
'tipo_lavorazione' => $row[6] ?? null,
'materiale_lavorare' => $row[7] ?? null,
'maximum_thickness' => $row[8] ?? null,
'speed_rpm' => is_numeric($row[9]) ? (int) $row[9] : null,
'feed' => is_numeric($row[10]) ? (float) $row[10] : null,
'max_thrust_a' => $row[11] ?? null,
'min_torque_a' => $row[12] ?? null,
'quantita_fori' => is_numeric($row[13]) ? (int) $row[13] : null,
'ciclo' => $row[2] ?? null,
'hole_diameter' => $row[3] ?? null,
'diametro' => $row[4] ?? null,
'descrizione' => $row[5] ?? null,
'posizione' => $row[6] ?? null,
'quantita' => is_numeric($row[7]) ? (int) round((float) $row[7]) : 0,
'tipo_lavorazione' => $row[8] ?? null,
'materiale_lavorare' => $row[9] ?? null,
'maximum_thickness' => $row[10] ?? null,
'speed_rpm' => is_numeric($row[11]) ? (int) round((float) $row[11]) : null,
'feed' => is_numeric($row[12]) ? round((float) $row[12], 2) : null,
'max_thrust_a' => $row[13] ?? null,
'min_torque_a' => $row[15] ?? null,
'quantita_fori' => is_numeric($row[17]) ? (int) round((float) $row[17]) : null,
]
);
@@ -250,18 +285,11 @@ class ArticoloController extends Controller
$imported++;
}
if (isset($this->command)) {
$this->command->info('Importato articolo: ' . $row[0]);
}
} catch (\Exception $e) {
$errors[] = "Riga " . ($index + 3) . ": " . $e->getMessage();
}
}
if (isset($this->command)) {
$this->command->info('Import completato! Totale articoli: ' . Articolo::count());
}
return [
'imported' => $imported,
'updated' => $updated,