From ec8955f9b7d8b265c934b20ea94bee8e904fa7d8 Mon Sep 17 00:00:00 2001 From: Carmine Savino Date: Mon, 19 Jan 2026 08:24:22 +0100 Subject: [PATCH] Refactor documentation: Update README.md with Laravel branding and restructure content; add new DOCUMENTAZIONE.md for comprehensive project details. --- DOCUMENTAZIONE.md | 701 +++++++++++++++++ .../Controllers/Admin/ArticoloController.php | 76 +- app/Models/Articolo.php | 3 +- database/seeders/ArticoloSeeder.php | 2 + readme.md | 720 +----------------- 5 files changed, 819 insertions(+), 683 deletions(-) create mode 100644 DOCUMENTAZIONE.md diff --git a/DOCUMENTAZIONE.md b/DOCUMENTAZIONE.md new file mode 100644 index 0000000..3a55539 --- /dev/null +++ b/DOCUMENTAZIONE.md @@ -0,0 +1,701 @@ +# Documentazione Progetto HTT QRCode + +## πŸ“‹ Indice +1. [Panoramica del Progetto](#panoramica-del-progetto) +2. [Struttura del Progetto](#struttura-del-progetto) +3. [Bootstrap e Installazione](#bootstrap-e-installazione) +4. [Architettura dell'Applicazione](#architettura-dellapplicazione) +5. [Modifica di Elementi della Pagina](#modifica-di-elementi-della-pagina) +6. [FunzionalitΓ  Principali](#funzionalitΓ -principali) +7. [Database e Modelli](#database-e-modelli) +8. [Sviluppo e Debug](#sviluppo-e-debug) + +--- + +## πŸ“– Panoramica del Progetto + +**HTT QRCode** Γ¨ un'applicazione web Laravel per la gestione di articoli industriali con generazione e scansione di codici QR. L'applicazione permette di: + +- βœ… Gestire un catalogo di articoli con parametri tecnici +- βœ… Generare QR Code univoci per ogni articolo +- βœ… Stampare etichette con QR Code in formato PDF +- βœ… Scansionare QR Code per visualizzare informazioni pubbliche +- βœ… Importare articoli da file Excel +- βœ… Autenticazione utenti con Laravel Breeze + +### Stack Tecnologico + +- **Backend**: Laravel 12 (PHP 8.2+) +- **Frontend**: Blade Templates + TailwindCSS 3 + Alpine.js +- **Database**: SQLite (default) / MySQL +- **QR Code**: SimpleSoftwareIO/simple-qrcode +- **PDF**: Barryvdh/laravel-dompdf +- **Excel**: PHPOffice/PhpSpreadsheet +- **Build Tool**: Vite + +--- + +## πŸ—οΈ Struttura del Progetto + +``` +htt-qrcode/ +β”œβ”€β”€ app/ +β”‚ β”œβ”€β”€ Http/ +β”‚ β”‚ β”œβ”€β”€ Controllers/ +β”‚ β”‚ β”‚ β”œβ”€β”€ Admin/ +β”‚ β”‚ β”‚ β”‚ └── ArticoloController.php # CRUD articoli + QR Code +β”‚ β”‚ β”‚ β”œβ”€β”€ ProfileController.php # Gestione profilo utente +β”‚ β”‚ β”‚ └── PublicArticoloController.php # Scanner pubblico +β”‚ β”‚ └── Requests/ # Form Request validation +β”‚ β”œβ”€β”€ Models/ +β”‚ β”‚ β”œβ”€β”€ Articolo.php # Model principale +β”‚ β”‚ └── User.php # Model utente +β”‚ └── Providers/ +β”‚ └── AppServiceProvider.php +β”‚ +β”œβ”€β”€ database/ +β”‚ β”œβ”€β”€ migrations/ +β”‚ β”‚ β”œβ”€β”€ 0001_01_01_000000_create_users_table.php +β”‚ β”‚ └── 2026_01_17_134622_create_articolos_table.php +β”‚ └── seeders/ +β”‚ β”œβ”€β”€ AdminUserSeeder.php # Crea utente admin +β”‚ β”œβ”€β”€ ArticoloSeeder.php # Import Excel + dati fake +β”‚ └── DatabaseSeeder.php +β”‚ +β”œβ”€β”€ resources/ +β”‚ β”œβ”€β”€ views/ +β”‚ β”‚ β”œβ”€β”€ admin/ +β”‚ β”‚ β”‚ └── articoli/ +β”‚ β”‚ β”‚ β”œβ”€β”€ index.blade.php # Lista articoli +β”‚ β”‚ β”‚ β”œβ”€β”€ create.blade.php # Form creazione +β”‚ β”‚ β”‚ β”œβ”€β”€ edit.blade.php # Form modifica +β”‚ β”‚ β”‚ β”œβ”€β”€ show.blade.php # Dettaglio articolo +β”‚ β”‚ β”‚ └── pdf-qrcodes.blade.php # Template PDF QR +β”‚ β”‚ β”œβ”€β”€ public/ +β”‚ β”‚ β”‚ β”œβ”€β”€ scanner.blade.php # Pagina scanner +β”‚ β”‚ β”‚ └── articolo.blade.php # Vista pubblica articolo +β”‚ β”‚ β”œβ”€β”€ layouts/ +β”‚ β”‚ β”‚ β”œβ”€β”€ app.blade.php # Layout principale +β”‚ β”‚ β”‚ └── guest.blade.php # Layout pubblico +β”‚ β”‚ └── components/ # Componenti Blade riutilizzabili +β”‚ β”œβ”€β”€ css/ +β”‚ β”‚ └── app.css # TailwindCSS +β”‚ └── js/ +β”‚ β”œβ”€β”€ app.js # Entry point JavaScript +β”‚ └── bootstrap.js # Axios config +β”‚ +β”œβ”€β”€ routes/ +β”‚ β”œβ”€β”€ web.php # Rotte principali +β”‚ β”œβ”€β”€ auth.php # Rotte autenticazione (Breeze) +β”‚ └── console.php +β”‚ +β”œβ”€β”€ public/ +β”‚ β”œβ”€β”€ index.php # Entry point Laravel +β”‚ └── build/ # Assets compilati da Vite +β”‚ +β”œβ”€β”€ config/ # File di configurazione +β”œβ”€β”€ storage/ # File storage e cache +β”œβ”€β”€ tests/ # Test automatici +β”œβ”€β”€ vendor/ # Dipendenze Composer +β”‚ +β”œβ”€β”€ .env.example # Template variabili ambiente +β”œβ”€β”€ composer.json # Dipendenze PHP +β”œβ”€β”€ package.json # Dipendenze JavaScript +β”œβ”€β”€ artisan # CLI Laravel +β”œβ”€β”€ vite.config.js # Configurazione Vite +└── tailwind.config.js # Configurazione TailwindCSS +``` + +--- + +## πŸš€ Bootstrap e Installazione + +### Prerequisiti + +Assicurati di avere installato: + +- **PHP 8.2+** con estensioni: `pdo`, `mbstring`, `xml`, `gd`, `zip` +- **Composer** (https://getcomposer.org/) +- **Node.js 18+** e **npm** (https://nodejs.org/) +- **Git** + +### Installazione Passo-Passo + +#### 1. Clona il Repository + +```bash +cd /path/to/your/projects +git clone htt-qrcode +cd htt-qrcode +``` + +#### 2. Installa le Dipendenze PHP + +```bash +composer install +``` + +Questo installerΓ  tutte le dipendenze definite in `composer.json`: +- Laravel Framework +- Laravel Breeze (autenticazione) +- SimpleSoftwareIO QR Code +- Barryvdh DomPDF +- PHPOffice PhpSpreadsheet + +#### 3. Configura l'Ambiente + +```bash +# Copia il file .env.example in .env +cp .env.example .env + +# Genera la chiave dell'applicazione +php artisan key:generate +``` + +#### 4. Configura il Database + +Apri il file `.env` e configura il database. Per SQLite (default): + +```env +DB_CONNECTION=sqlite +``` + +Crea il file database: + +```bash +touch database/database.sqlite +``` + +Per MySQL: + +```env +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=htt_qrcode +DB_USERNAME=root +DB_PASSWORD=your_password +``` + +#### 5. Esegui le Migrazioni + +```bash +php artisan migrate +``` + +Questo creerΓ  le tabelle: +- `users` - Utenti del sistema +- `articoli` - Articoli con QR Code +- `cache`, `jobs`, `sessions` - Tabelle di sistema + +#### 6. Popola il Database (Opzionale) + +```bash +# Crea un utente admin e articoli di esempio +php artisan db:seed + +# Solo utente admin (email: admin@example.com, password: password) +php artisan db:seed --class=AdminUserSeeder + +# Solo articoli di esempio +php artisan db:seed --class=ArticoloSeeder +``` + +#### 7. Installa le Dipendenze Frontend + +```bash +npm install +``` + +Questo installerΓ : +- Vite +- TailwindCSS +- Alpine.js +- Axios + +#### 8. Compila gli Asset + +```bash +# Per sviluppo (con hot reload) +npm run dev + +# Per produzione +npm run build +``` + +#### 9. Avvia il Server di Sviluppo + +In terminali separati: + +```bash +# Terminal 1: Server PHP +php artisan serve + +# Terminal 2: Vite (hot reload) +npm run dev +``` + +**OPPURE** usa il comando composer personalizzato che avvia tutto insieme: + +```bash +composer run dev +``` + +Questo comando avvia automaticamente: +- Server PHP (porta 8000) +- Queue listener +- Log tail (pail) +- Vite dev server + +#### 10. Accedi all'Applicazione + +Apri il browser e vai a: + +- **Homepage**: http://localhost:8000 +- **Login**: http://localhost:8000/login +- **Dashboard**: http://localhost:8000/dashboard (richiede autenticazione) + +**Credenziali default** (se hai eseguito il seeder): +- Email: `admin@example.com` +- Password: `password` + +--- + +## πŸ›οΈ Architettura dell'Applicazione + +### Pattern MVC (Model-View-Controller) + +Laravel segue il pattern MVC: + +#### **Model** (app/Models/) +```php +// Articolo.php - Rappresenta un articolo nel database +class Articolo extends Model +{ + protected $fillable = ['codice_articolo', 'ciclo', 'descrizione', ...]; + + // Generazione automatica QR Code alla creazione + protected static function boot() { ... } +} +``` + +#### **Controller** (app/Http/Controllers/) +```php +// ArticoloController.php - Gestisce le richieste CRUD +class ArticoloController extends Controller +{ + public function index() // GET /admin/articoli + public function create() // GET /admin/articoli/create + public function store() // POST /admin/articoli + public function show() // GET /admin/articoli/{id} + public function edit() // GET /admin/articoli/{id}/edit + public function update() // PUT /admin/articoli/{id} + public function destroy() // DELETE /admin/articoli/{id} +} +``` + +#### **View** (resources/views/) +```blade + + + @foreach ($articoli as $articolo) + + {{ $articolo->codice_articolo }} + ... + + @endforeach + +``` + +### Flusso delle Richieste + +1. **Richiesta HTTP** β†’ `routes/web.php` +2. **Middleware** (autenticazione, CSRF) β†’ filtra la richiesta +3. **Controller** β†’ elabora la logica +4. **Model** β†’ interagisce con il database +5. **View** β†’ renderizza l'HTML +6. **Risposta HTTP** β†’ ritorna al browser + +### Rotte Principali + +```php +// routes/web.php + +// Rotte pubbliche +Route::get('/', ...); // Homepage +Route::get('/scanner', ...); // Scanner QR pubblico +Route::get('/articolo/{qr_code}', ...); // Vista articolo pubblico + +// Rotte autenticate +Route::middleware('auth')->group(function () { + Route::resource('admin/articoli', ArticoloController::class); + Route::get('admin/articoli/{id}/qrcode', ...); // Genera QR + Route::get('admin/articoli/{id}/qrcode/download', ...); // Download QR + Route::get('admin/articoli-print-qrcodes', ...); // Stampa PDF + Route::post('admin/articoli-import', ...); // Import Excel +}); +``` + +--- + +## 🎨 Modifica di Elementi della Pagina + +### Esempio Pratico: Modificare il Pulsante "Nuovo Articolo" + +Seguiamo un esempio concreto per capire come modificare la UI dell'applicazione. + +#### Obiettivo +Cambiare il colore e il testo del pulsante "Nuovo Articolo" nella pagina index degli articoli. + +#### Passo 1: Individua il File + +Il file Γ¨: `resources/views/admin/articoli/index.blade.php` + +Puoi trovarlo: +- Guardando la route: `Route::resource('admin/articoli', ...)` β†’ metodo `index()` +- Il controller ritorna: `view('admin.articoli.index')` β†’ `resources/views/admin/articoli/index.blade.php` + +#### Passo 2: Trova l'Elemento + +Apri `resources/views/admin/articoli/index.blade.php` e cerca il pulsante (linea ~16): + +```blade + + + Nuovo Articolo + +``` + +#### Passo 3: Modifica l'Elemento + +**Prima** (blu): +```blade +class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" ++ Nuovo Articolo +``` + +**Dopo** (verde con icona): +```blade +class="bg-green-600 hover:bg-green-800 text-white font-bold py-2 px-4 rounded shadow-lg" +βž• Aggiungi Articolo +``` + +#### Passo 4: Salva e Verifica + +1. Salva il file +2. Se hai `npm run dev` attivo, Vite rileva automaticamente il cambiamento +3. Ricarica la pagina nel browser +4. Il pulsante sarΓ  ora verde con il nuovo testo! + +### Anatomia delle Classi TailwindCSS + +``` +bg-green-600 β†’ Background verde +hover:bg-green-800 β†’ Background verde scuro al passaggio del mouse +text-white β†’ Testo bianco +font-bold β†’ Testo in grassetto +py-2 β†’ Padding verticale (sopra/sotto) +px-4 β†’ Padding orizzontale (sinistra/destra) +rounded β†’ Bordi arrotondati +shadow-lg β†’ Ombra grande +``` + +### Altri Esempi Comuni + +#### 1. Modificare il Titolo della Pagina + +**File**: `resources/views/admin/articoli/index.blade.php` (linea ~4) + +```blade + +

+ {{ __('Gestione Articoli') }} +

+ + +

+ πŸ“¦ Catalogo Articoli +

+``` + +#### 2. Cambiare i Colori delle Righe della Tabella + +**File**: `resources/views/admin/articoli/index.blade.php` (linea ~73) + +```blade + + + + + +``` + +#### 3. Modificare il Placeholder della Ricerca + +**File**: `resources/views/admin/articoli/index.blade.php` (linea ~35) + +```blade + +placeholder="Cerca per codice, descrizione o ciclo..." + + +placeholder="πŸ” Inserisci il codice articolo o una parola chiave..." +``` + +#### 4. Aggiungere un Messaggio di Benvenuto + +**File**: `resources/views/admin/articoli/index.blade.php` + +Aggiungi dopo il tag `...`: + +```blade +
+
+

πŸ‘‹ Benvenuto nel gestionale!

+

Gestisci i tuoi articoli e genera QR Code in pochi click.

+
+
+``` + +### Workflow di Modifica Completo + +``` +1. Identifica la rotta β†’ routes/web.php +2. Trova il controller β†’ app/Http/Controllers/ +3. Individua la view β†’ resources/views/ +4. Modifica il template Blade +5. (Opzionale) Modifica il CSS β†’ resources/css/app.css +6. (Opzionale) Aggiungi JS β†’ resources/js/app.js +7. Salva e verifica nel browser +``` + +--- + +## βš™οΈ FunzionalitΓ  Principali + +### 1. Gestione Articoli (CRUD) + +- **Crea**: Form con validazione per tutti i campi +- **Leggi**: Lista paginata con ricerca +- **Aggiorna**: Modifica dati esistenti +- **Elimina**: Cancellazione con conferma + +### 2. QR Code + +**Generazione Automatica**: +```php +// Model Articolo.php - boot() method +$articolo->qr_code = $articolo->id . '-' . time(); +// Esempio: "42-1737235200" +``` + +**Download Singolo**: +- PNG 300x300px, error correction H +- Formato nome: `qr-{codice_articolo}.png` + +**Stampa Multipla**: +- Selezione multipla con checkbox +- PDF A4 con griglia di QR Code +- Template: `resources/views/admin/articoli/pdf-qrcodes.blade.php` + +### 3. Import Excel + +**Formato Supportato**: XLSX, XLS + +**Colonne Richieste**: +``` +UBICAZIONE +β”œβ”€β”€ Codice Articolo (obbligatorio) +β”œβ”€β”€ Ciclo +β”œβ”€β”€ Diametro +β”œβ”€β”€ Descrizione +β”œβ”€β”€ Posizione +└── Quantita + +PARAMETRI TECNOLOGICI +β”œβ”€β”€ Tipo Lavorazione +β”œβ”€β”€ Materiale da lavorare +β”œβ”€β”€ Maximum Thickness +β”œβ”€β”€ Speed RPM +β”œβ”€β”€ Feed +β”œβ”€β”€ Max Thrust A +β”œβ”€β”€ Min Torque A +└── Quantita Fori +``` + +**ModalitΓ **: +- **Merge** (default): aggiorna esistenti, crea nuovi +- **Clean Import**: elimina tutto e re-importa + +### 4. Scanner Pubblico + +- Accessibile senza autenticazione +- Route: `/scanner` +- Utilizza API HTML5 per fotocamera +- Reindirizza a `/articolo/{qr_code}` dopo scansione + +--- + +## πŸ’Ύ Database e Modelli + +### Tabella `articoli` + +```sql +CREATE TABLE articoli ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + codice_articolo VARCHAR(255) UNIQUE NOT NULL, + ciclo VARCHAR(255), + diametro VARCHAR(255), + descrizione TEXT, + posizione VARCHAR(255), + quantita INTEGER DEFAULT 0, + tipo_lavorazione VARCHAR(255), + materiale_lavorare VARCHAR(255), + maximum_thickness VARCHAR(255), + speed_rpm INTEGER, + feed DECIMAL(8,2), + max_thrust_a VARCHAR(255), + min_torque_a VARCHAR(255), + quantita_fori INTEGER, + qr_code VARCHAR(255) UNIQUE, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +``` + +### Model Eloquent + +```php +// Query Builder Examples + +// Tutti gli articoli +Articolo::all(); + +// Paginati +Articolo::paginate(15); + +// Con ricerca +Articolo::where('codice_articolo', 'like', "%{$search}%") + ->orWhere('descrizione', 'like', "%{$search}%") + ->get(); + +// Trova per QR Code +Articolo::where('qr_code', $qrCode)->firstOrFail(); + +// Crea nuovo +Articolo::create([ + 'codice_articolo' => 'ART001', + 'descrizione' => 'Descrizione...', + ... +]); + +// Aggiorna +$articolo->update(['quantita' => 100]); + +// Elimina +$articolo->delete(); +``` + +--- + +## πŸ› οΈ Sviluppo e Debug + +### Comandi Artisan Utili + +```bash +# Crea controller +php artisan make:controller NomeController + +# Crea model con migration +php artisan make:model NomeModel -m + +# Crea migration +php artisan make:migration create_nome_table + +# Esegui migrazioni +php artisan migrate + +# Rollback ultima migrazione +php artisan migrate:rollback + +# Reset database +php artisan migrate:fresh --seed + +# Crea seeder +php artisan make:seeder NomeSeeder + +# Pulisci cache +php artisan cache:clear +php artisan config:clear +php artisan view:clear + +# Lista rotte +php artisan route:list + +# Avvia Tinker (REPL) +php artisan tinker +``` + +### Debug con Laravel Debugbar + +Installa (opzionale): + +```bash +composer require barryvdh/laravel-debugbar --dev +``` + +Mostra query SQL, variabili, performance, ecc. + +### Logs + +```bash +# Monitora i log in tempo reale +php artisan pail + +# Oppure +tail -f storage/logs/laravel.log +``` + +### Testing + +```bash +# Esegui tutti i test +php artisan test + +# Test specifico +php artisan test --filter NomeTest +``` + +### Vite + HMR (Hot Module Replacement) + +Durante lo sviluppo, Vite rileva automaticamente le modifiche a: +- `resources/css/app.css` +- `resources/js/app.js` +- `resources/views/**/*.blade.php` + +E ricarica il browser automaticamente! + +--- + +## πŸ“š Risorse Aggiuntive + +- **Laravel Docs**: https://laravel.com/docs/12.x +- **Tailwind CSS**: https://tailwindcss.com/docs +- **Alpine.js**: https://alpinejs.dev/ +- **Simple QR Code**: https://www.simplesoftwareio.com/docs/simple-qrcode +- **DomPDF**: https://github.com/barryvdh/laravel-dompdf + +--- + +## 🀝 Supporto + +Per problemi o domande: + +1. Controlla i log: `storage/logs/laravel.log` +2. Verifica le variabili in `.env` +3. Consulta la documentazione Laravel +4. Usa `php artisan tinker` per testare query + +--- + +**Buon sviluppo! πŸš€** diff --git a/app/Http/Controllers/Admin/ArticoloController.php b/app/Http/Controllers/Admin/ArticoloController.php index 7235370..baf1f2c 100644 --- a/app/Http/Controllers/Admin/ArticoloController.php +++ b/app/Http/Controllers/Admin/ArticoloController.php @@ -8,6 +8,7 @@ use Barryvdh\DomPDF\Facade\Pdf; use Database\Seeders\ArticoloSeeder; use Illuminate\Http\Request; use SimpleSoftwareIO\QrCode\Facades\QrCode; +use \PhpOffice\PhpSpreadsheet\IOFactory; class ArticoloController extends Controller { @@ -172,7 +173,7 @@ class ArticoloController extends Controller try { $seeder = new ArticoloSeeder(); - $result = $seeder->importFromExcel($file->getPathname(), $cleanImport); + $result = $this->importFromExcel($file->getPathname(), $cleanImport); $message = "Import completato! "; $message .= "Articoli importati: {$result['imported']}, "; @@ -194,5 +195,78 @@ class ArticoloController extends Controller 'message' => 'Errore durante l\'importazione: ' . $e->getMessage(), ], 500); } + } + + /** + * Import articoli from Excel file. + */ + public function importFromExcel(string $filePath, bool $cleanImport = false): array + { + $spreadsheet = IOFactory::load($filePath); + $worksheet = $spreadsheet->getActiveSheet(); + $rows = $worksheet->toArray(); + + $imported = 0; + $updated = 0; + $errors = []; + + // If clean import, delete all existing records + if ($cleanImport) { + Articolo::truncate(); + } + + // Skip header rows (first 2 rows) + foreach (array_slice($rows, 2) as $index => $row) { + // Skip empty rows + if (empty($row[0])) { + continue; + } + + try { + $exists = Articolo::where('codice_articolo', $row[0])->exists(); + + 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, + ] + ); + + if ($exists && !$cleanImport) { + $updated++; + } else { + $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, + 'errors' => $errors, + 'total' => Articolo::count(), + ]; } } diff --git a/app/Models/Articolo.php b/app/Models/Articolo.php index d73f328..6155c4e 100644 --- a/app/Models/Articolo.php +++ b/app/Models/Articolo.php @@ -3,7 +3,6 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; - class Articolo extends Model { protected $table = 'articoli'; @@ -50,4 +49,6 @@ class Articolo extends Model { return $this->qr_code; } + + } diff --git a/database/seeders/ArticoloSeeder.php b/database/seeders/ArticoloSeeder.php index 00eafe8..36bd381 100644 --- a/database/seeders/ArticoloSeeder.php +++ b/database/seeders/ArticoloSeeder.php @@ -13,6 +13,7 @@ class ArticoloSeeder extends Seeder */ public function run(): void { + /* $filePath = base_path('STRUTTURA DATABASE.xlsx'); if (!file_exists($filePath)) { @@ -21,6 +22,7 @@ class ArticoloSeeder extends Seeder } $this->importFromExcel($filePath); + */ } diff --git a/readme.md b/readme.md index 3a55539..0165a77 100644 --- a/readme.md +++ b/readme.md @@ -1,701 +1,59 @@ -# Documentazione Progetto HTT QRCode +

Laravel Logo

-## πŸ“‹ Indice -1. [Panoramica del Progetto](#panoramica-del-progetto) -2. [Struttura del Progetto](#struttura-del-progetto) -3. [Bootstrap e Installazione](#bootstrap-e-installazione) -4. [Architettura dell'Applicazione](#architettura-dellapplicazione) -5. [Modifica di Elementi della Pagina](#modifica-di-elementi-della-pagina) -6. [FunzionalitΓ  Principali](#funzionalitΓ -principali) -7. [Database e Modelli](#database-e-modelli) -8. [Sviluppo e Debug](#sviluppo-e-debug) +

+Build Status +Total Downloads +Latest Stable Version +License +

---- +## About Laravel -## πŸ“– Panoramica del Progetto +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: -**HTT QRCode** Γ¨ un'applicazione web Laravel per la gestione di articoli industriali con generazione e scansione di codici QR. L'applicazione permette di: +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). -- βœ… Gestire un catalogo di articoli con parametri tecnici -- βœ… Generare QR Code univoci per ogni articolo -- βœ… Stampare etichette con QR Code in formato PDF -- βœ… Scansionare QR Code per visualizzare informazioni pubbliche -- βœ… Importare articoli da file Excel -- βœ… Autenticazione utenti con Laravel Breeze +Laravel is accessible, powerful, and provides tools required for large, robust applications. -### Stack Tecnologico +## Learning Laravel -- **Backend**: Laravel 12 (PHP 8.2+) -- **Frontend**: Blade Templates + TailwindCSS 3 + Alpine.js -- **Database**: SQLite (default) / MySQL -- **QR Code**: SimpleSoftwareIO/simple-qrcode -- **PDF**: Barryvdh/laravel-dompdf -- **Excel**: PHPOffice/PhpSpreadsheet -- **Build Tool**: Vite +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. You can also check out [Laravel Learn](https://laravel.com/learn), where you will be guided through building a modern Laravel application. ---- +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. -## πŸ—οΈ Struttura del Progetto +## Laravel Sponsors -``` -htt-qrcode/ -β”œβ”€β”€ app/ -β”‚ β”œβ”€β”€ Http/ -β”‚ β”‚ β”œβ”€β”€ Controllers/ -β”‚ β”‚ β”‚ β”œβ”€β”€ Admin/ -β”‚ β”‚ β”‚ β”‚ └── ArticoloController.php # CRUD articoli + QR Code -β”‚ β”‚ β”‚ β”œβ”€β”€ ProfileController.php # Gestione profilo utente -β”‚ β”‚ β”‚ └── PublicArticoloController.php # Scanner pubblico -β”‚ β”‚ └── Requests/ # Form Request validation -β”‚ β”œβ”€β”€ Models/ -β”‚ β”‚ β”œβ”€β”€ Articolo.php # Model principale -β”‚ β”‚ └── User.php # Model utente -β”‚ └── Providers/ -β”‚ └── AppServiceProvider.php -β”‚ -β”œβ”€β”€ database/ -β”‚ β”œβ”€β”€ migrations/ -β”‚ β”‚ β”œβ”€β”€ 0001_01_01_000000_create_users_table.php -β”‚ β”‚ └── 2026_01_17_134622_create_articolos_table.php -β”‚ └── seeders/ -β”‚ β”œβ”€β”€ AdminUserSeeder.php # Crea utente admin -β”‚ β”œβ”€β”€ ArticoloSeeder.php # Import Excel + dati fake -β”‚ └── DatabaseSeeder.php -β”‚ -β”œβ”€β”€ resources/ -β”‚ β”œβ”€β”€ views/ -β”‚ β”‚ β”œβ”€β”€ admin/ -β”‚ β”‚ β”‚ └── articoli/ -β”‚ β”‚ β”‚ β”œβ”€β”€ index.blade.php # Lista articoli -β”‚ β”‚ β”‚ β”œβ”€β”€ create.blade.php # Form creazione -β”‚ β”‚ β”‚ β”œβ”€β”€ edit.blade.php # Form modifica -β”‚ β”‚ β”‚ β”œβ”€β”€ show.blade.php # Dettaglio articolo -β”‚ β”‚ β”‚ └── pdf-qrcodes.blade.php # Template PDF QR -β”‚ β”‚ β”œβ”€β”€ public/ -β”‚ β”‚ β”‚ β”œβ”€β”€ scanner.blade.php # Pagina scanner -β”‚ β”‚ β”‚ └── articolo.blade.php # Vista pubblica articolo -β”‚ β”‚ β”œβ”€β”€ layouts/ -β”‚ β”‚ β”‚ β”œβ”€β”€ app.blade.php # Layout principale -β”‚ β”‚ β”‚ └── guest.blade.php # Layout pubblico -β”‚ β”‚ └── components/ # Componenti Blade riutilizzabili -β”‚ β”œβ”€β”€ css/ -β”‚ β”‚ └── app.css # TailwindCSS -β”‚ └── js/ -β”‚ β”œβ”€β”€ app.js # Entry point JavaScript -β”‚ └── bootstrap.js # Axios config -β”‚ -β”œβ”€β”€ routes/ -β”‚ β”œβ”€β”€ web.php # Rotte principali -β”‚ β”œβ”€β”€ auth.php # Rotte autenticazione (Breeze) -β”‚ └── console.php -β”‚ -β”œβ”€β”€ public/ -β”‚ β”œβ”€β”€ index.php # Entry point Laravel -β”‚ └── build/ # Assets compilati da Vite -β”‚ -β”œβ”€β”€ config/ # File di configurazione -β”œβ”€β”€ storage/ # File storage e cache -β”œβ”€β”€ tests/ # Test automatici -β”œβ”€β”€ vendor/ # Dipendenze Composer -β”‚ -β”œβ”€β”€ .env.example # Template variabili ambiente -β”œβ”€β”€ composer.json # Dipendenze PHP -β”œβ”€β”€ package.json # Dipendenze JavaScript -β”œβ”€β”€ artisan # CLI Laravel -β”œβ”€β”€ vite.config.js # Configurazione Vite -└── tailwind.config.js # Configurazione TailwindCSS -``` +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). ---- +### Premium Partners -## πŸš€ Bootstrap e Installazione +- **[Vehikl](https://vehikl.com)** +- **[Tighten Co.](https://tighten.co)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Redberry](https://redberry.international/laravel-development)** +- **[Active Logic](https://activelogic.com)** -### Prerequisiti +## Contributing -Assicurati di avere installato: +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). -- **PHP 8.2+** con estensioni: `pdo`, `mbstring`, `xml`, `gd`, `zip` -- **Composer** (https://getcomposer.org/) -- **Node.js 18+** e **npm** (https://nodejs.org/) -- **Git** +## Code of Conduct -### Installazione Passo-Passo +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). -#### 1. Clona il Repository +## Security Vulnerabilities -```bash -cd /path/to/your/projects -git clone htt-qrcode -cd htt-qrcode -``` +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. -#### 2. Installa le Dipendenze PHP +## License -```bash -composer install -``` - -Questo installerΓ  tutte le dipendenze definite in `composer.json`: -- Laravel Framework -- Laravel Breeze (autenticazione) -- SimpleSoftwareIO QR Code -- Barryvdh DomPDF -- PHPOffice PhpSpreadsheet - -#### 3. Configura l'Ambiente - -```bash -# Copia il file .env.example in .env -cp .env.example .env - -# Genera la chiave dell'applicazione -php artisan key:generate -``` - -#### 4. Configura il Database - -Apri il file `.env` e configura il database. Per SQLite (default): - -```env -DB_CONNECTION=sqlite -``` - -Crea il file database: - -```bash -touch database/database.sqlite -``` - -Per MySQL: - -```env -DB_CONNECTION=mysql -DB_HOST=127.0.0.1 -DB_PORT=3306 -DB_DATABASE=htt_qrcode -DB_USERNAME=root -DB_PASSWORD=your_password -``` - -#### 5. Esegui le Migrazioni - -```bash -php artisan migrate -``` - -Questo creerΓ  le tabelle: -- `users` - Utenti del sistema -- `articoli` - Articoli con QR Code -- `cache`, `jobs`, `sessions` - Tabelle di sistema - -#### 6. Popola il Database (Opzionale) - -```bash -# Crea un utente admin e articoli di esempio -php artisan db:seed - -# Solo utente admin (email: admin@example.com, password: password) -php artisan db:seed --class=AdminUserSeeder - -# Solo articoli di esempio -php artisan db:seed --class=ArticoloSeeder -``` - -#### 7. Installa le Dipendenze Frontend - -```bash -npm install -``` - -Questo installerΓ : -- Vite -- TailwindCSS -- Alpine.js -- Axios - -#### 8. Compila gli Asset - -```bash -# Per sviluppo (con hot reload) -npm run dev - -# Per produzione -npm run build -``` - -#### 9. Avvia il Server di Sviluppo - -In terminali separati: - -```bash -# Terminal 1: Server PHP -php artisan serve - -# Terminal 2: Vite (hot reload) -npm run dev -``` - -**OPPURE** usa il comando composer personalizzato che avvia tutto insieme: - -```bash -composer run dev -``` - -Questo comando avvia automaticamente: -- Server PHP (porta 8000) -- Queue listener -- Log tail (pail) -- Vite dev server - -#### 10. Accedi all'Applicazione - -Apri il browser e vai a: - -- **Homepage**: http://localhost:8000 -- **Login**: http://localhost:8000/login -- **Dashboard**: http://localhost:8000/dashboard (richiede autenticazione) - -**Credenziali default** (se hai eseguito il seeder): -- Email: `admin@example.com` -- Password: `password` - ---- - -## πŸ›οΈ Architettura dell'Applicazione - -### Pattern MVC (Model-View-Controller) - -Laravel segue il pattern MVC: - -#### **Model** (app/Models/) -```php -// Articolo.php - Rappresenta un articolo nel database -class Articolo extends Model -{ - protected $fillable = ['codice_articolo', 'ciclo', 'descrizione', ...]; - - // Generazione automatica QR Code alla creazione - protected static function boot() { ... } -} -``` - -#### **Controller** (app/Http/Controllers/) -```php -// ArticoloController.php - Gestisce le richieste CRUD -class ArticoloController extends Controller -{ - public function index() // GET /admin/articoli - public function create() // GET /admin/articoli/create - public function store() // POST /admin/articoli - public function show() // GET /admin/articoli/{id} - public function edit() // GET /admin/articoli/{id}/edit - public function update() // PUT /admin/articoli/{id} - public function destroy() // DELETE /admin/articoli/{id} -} -``` - -#### **View** (resources/views/) -```blade - - - @foreach ($articoli as $articolo) - - {{ $articolo->codice_articolo }} - ... - - @endforeach - -``` - -### Flusso delle Richieste - -1. **Richiesta HTTP** β†’ `routes/web.php` -2. **Middleware** (autenticazione, CSRF) β†’ filtra la richiesta -3. **Controller** β†’ elabora la logica -4. **Model** β†’ interagisce con il database -5. **View** β†’ renderizza l'HTML -6. **Risposta HTTP** β†’ ritorna al browser - -### Rotte Principali - -```php -// routes/web.php - -// Rotte pubbliche -Route::get('/', ...); // Homepage -Route::get('/scanner', ...); // Scanner QR pubblico -Route::get('/articolo/{qr_code}', ...); // Vista articolo pubblico - -// Rotte autenticate -Route::middleware('auth')->group(function () { - Route::resource('admin/articoli', ArticoloController::class); - Route::get('admin/articoli/{id}/qrcode', ...); // Genera QR - Route::get('admin/articoli/{id}/qrcode/download', ...); // Download QR - Route::get('admin/articoli-print-qrcodes', ...); // Stampa PDF - Route::post('admin/articoli-import', ...); // Import Excel -}); -``` - ---- - -## 🎨 Modifica di Elementi della Pagina - -### Esempio Pratico: Modificare il Pulsante "Nuovo Articolo" - -Seguiamo un esempio concreto per capire come modificare la UI dell'applicazione. - -#### Obiettivo -Cambiare il colore e il testo del pulsante "Nuovo Articolo" nella pagina index degli articoli. - -#### Passo 1: Individua il File - -Il file Γ¨: `resources/views/admin/articoli/index.blade.php` - -Puoi trovarlo: -- Guardando la route: `Route::resource('admin/articoli', ...)` β†’ metodo `index()` -- Il controller ritorna: `view('admin.articoli.index')` β†’ `resources/views/admin/articoli/index.blade.php` - -#### Passo 2: Trova l'Elemento - -Apri `resources/views/admin/articoli/index.blade.php` e cerca il pulsante (linea ~16): - -```blade - - + Nuovo Articolo - -``` - -#### Passo 3: Modifica l'Elemento - -**Prima** (blu): -```blade -class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" -+ Nuovo Articolo -``` - -**Dopo** (verde con icona): -```blade -class="bg-green-600 hover:bg-green-800 text-white font-bold py-2 px-4 rounded shadow-lg" -βž• Aggiungi Articolo -``` - -#### Passo 4: Salva e Verifica - -1. Salva il file -2. Se hai `npm run dev` attivo, Vite rileva automaticamente il cambiamento -3. Ricarica la pagina nel browser -4. Il pulsante sarΓ  ora verde con il nuovo testo! - -### Anatomia delle Classi TailwindCSS - -``` -bg-green-600 β†’ Background verde -hover:bg-green-800 β†’ Background verde scuro al passaggio del mouse -text-white β†’ Testo bianco -font-bold β†’ Testo in grassetto -py-2 β†’ Padding verticale (sopra/sotto) -px-4 β†’ Padding orizzontale (sinistra/destra) -rounded β†’ Bordi arrotondati -shadow-lg β†’ Ombra grande -``` - -### Altri Esempi Comuni - -#### 1. Modificare il Titolo della Pagina - -**File**: `resources/views/admin/articoli/index.blade.php` (linea ~4) - -```blade - -

- {{ __('Gestione Articoli') }} -

- - -

- πŸ“¦ Catalogo Articoli -

-``` - -#### 2. Cambiare i Colori delle Righe della Tabella - -**File**: `resources/views/admin/articoli/index.blade.php` (linea ~73) - -```blade - - - - - -``` - -#### 3. Modificare il Placeholder della Ricerca - -**File**: `resources/views/admin/articoli/index.blade.php` (linea ~35) - -```blade - -placeholder="Cerca per codice, descrizione o ciclo..." - - -placeholder="πŸ” Inserisci il codice articolo o una parola chiave..." -``` - -#### 4. Aggiungere un Messaggio di Benvenuto - -**File**: `resources/views/admin/articoli/index.blade.php` - -Aggiungi dopo il tag `...`: - -```blade -
-
-

πŸ‘‹ Benvenuto nel gestionale!

-

Gestisci i tuoi articoli e genera QR Code in pochi click.

-
-
-``` - -### Workflow di Modifica Completo - -``` -1. Identifica la rotta β†’ routes/web.php -2. Trova il controller β†’ app/Http/Controllers/ -3. Individua la view β†’ resources/views/ -4. Modifica il template Blade -5. (Opzionale) Modifica il CSS β†’ resources/css/app.css -6. (Opzionale) Aggiungi JS β†’ resources/js/app.js -7. Salva e verifica nel browser -``` - ---- - -## βš™οΈ FunzionalitΓ  Principali - -### 1. Gestione Articoli (CRUD) - -- **Crea**: Form con validazione per tutti i campi -- **Leggi**: Lista paginata con ricerca -- **Aggiorna**: Modifica dati esistenti -- **Elimina**: Cancellazione con conferma - -### 2. QR Code - -**Generazione Automatica**: -```php -// Model Articolo.php - boot() method -$articolo->qr_code = $articolo->id . '-' . time(); -// Esempio: "42-1737235200" -``` - -**Download Singolo**: -- PNG 300x300px, error correction H -- Formato nome: `qr-{codice_articolo}.png` - -**Stampa Multipla**: -- Selezione multipla con checkbox -- PDF A4 con griglia di QR Code -- Template: `resources/views/admin/articoli/pdf-qrcodes.blade.php` - -### 3. Import Excel - -**Formato Supportato**: XLSX, XLS - -**Colonne Richieste**: -``` -UBICAZIONE -β”œβ”€β”€ Codice Articolo (obbligatorio) -β”œβ”€β”€ Ciclo -β”œβ”€β”€ Diametro -β”œβ”€β”€ Descrizione -β”œβ”€β”€ Posizione -└── Quantita - -PARAMETRI TECNOLOGICI -β”œβ”€β”€ Tipo Lavorazione -β”œβ”€β”€ Materiale da lavorare -β”œβ”€β”€ Maximum Thickness -β”œβ”€β”€ Speed RPM -β”œβ”€β”€ Feed -β”œβ”€β”€ Max Thrust A -β”œβ”€β”€ Min Torque A -└── Quantita Fori -``` - -**ModalitΓ **: -- **Merge** (default): aggiorna esistenti, crea nuovi -- **Clean Import**: elimina tutto e re-importa - -### 4. Scanner Pubblico - -- Accessibile senza autenticazione -- Route: `/scanner` -- Utilizza API HTML5 per fotocamera -- Reindirizza a `/articolo/{qr_code}` dopo scansione - ---- - -## πŸ’Ύ Database e Modelli - -### Tabella `articoli` - -```sql -CREATE TABLE articoli ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - codice_articolo VARCHAR(255) UNIQUE NOT NULL, - ciclo VARCHAR(255), - diametro VARCHAR(255), - descrizione TEXT, - posizione VARCHAR(255), - quantita INTEGER DEFAULT 0, - tipo_lavorazione VARCHAR(255), - materiale_lavorare VARCHAR(255), - maximum_thickness VARCHAR(255), - speed_rpm INTEGER, - feed DECIMAL(8,2), - max_thrust_a VARCHAR(255), - min_torque_a VARCHAR(255), - quantita_fori INTEGER, - qr_code VARCHAR(255) UNIQUE, - created_at TIMESTAMP, - updated_at TIMESTAMP -); -``` - -### Model Eloquent - -```php -// Query Builder Examples - -// Tutti gli articoli -Articolo::all(); - -// Paginati -Articolo::paginate(15); - -// Con ricerca -Articolo::where('codice_articolo', 'like', "%{$search}%") - ->orWhere('descrizione', 'like', "%{$search}%") - ->get(); - -// Trova per QR Code -Articolo::where('qr_code', $qrCode)->firstOrFail(); - -// Crea nuovo -Articolo::create([ - 'codice_articolo' => 'ART001', - 'descrizione' => 'Descrizione...', - ... -]); - -// Aggiorna -$articolo->update(['quantita' => 100]); - -// Elimina -$articolo->delete(); -``` - ---- - -## πŸ› οΈ Sviluppo e Debug - -### Comandi Artisan Utili - -```bash -# Crea controller -php artisan make:controller NomeController - -# Crea model con migration -php artisan make:model NomeModel -m - -# Crea migration -php artisan make:migration create_nome_table - -# Esegui migrazioni -php artisan migrate - -# Rollback ultima migrazione -php artisan migrate:rollback - -# Reset database -php artisan migrate:fresh --seed - -# Crea seeder -php artisan make:seeder NomeSeeder - -# Pulisci cache -php artisan cache:clear -php artisan config:clear -php artisan view:clear - -# Lista rotte -php artisan route:list - -# Avvia Tinker (REPL) -php artisan tinker -``` - -### Debug con Laravel Debugbar - -Installa (opzionale): - -```bash -composer require barryvdh/laravel-debugbar --dev -``` - -Mostra query SQL, variabili, performance, ecc. - -### Logs - -```bash -# Monitora i log in tempo reale -php artisan pail - -# Oppure -tail -f storage/logs/laravel.log -``` - -### Testing - -```bash -# Esegui tutti i test -php artisan test - -# Test specifico -php artisan test --filter NomeTest -``` - -### Vite + HMR (Hot Module Replacement) - -Durante lo sviluppo, Vite rileva automaticamente le modifiche a: -- `resources/css/app.css` -- `resources/js/app.js` -- `resources/views/**/*.blade.php` - -E ricarica il browser automaticamente! - ---- - -## πŸ“š Risorse Aggiuntive - -- **Laravel Docs**: https://laravel.com/docs/12.x -- **Tailwind CSS**: https://tailwindcss.com/docs -- **Alpine.js**: https://alpinejs.dev/ -- **Simple QR Code**: https://www.simplesoftwareio.com/docs/simple-qrcode -- **DomPDF**: https://github.com/barryvdh/laravel-dompdf - ---- - -## 🀝 Supporto - -Per problemi o domande: - -1. Controlla i log: `storage/logs/laravel.log` -2. Verifica le variabili in `.env` -3. Consulta la documentazione Laravel -4. Usa `php artisan tinker` per testare query - ---- - -**Buon sviluppo! πŸš€** +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).