Configurazione Sistema Industria 4.0

Configurazione Sistema Industria 4.0

🎯 Panoramica

La vista "Configurazione" permette di gestire tutti i parametri di sistema per l'import e l'elaborazione CSV delle macchine Industria 4.0.

Accesso

  • Menu: Industria 4.0 β†’ Configurazione
  • Route: admin.i40.settings.index
  • URL: /admin/i40/settings
  • Permessi: admin o super-admin
  • ---

    πŸ“Š Database

    Tabella: i40_settings

    ``sql CREATE TABLE i40_settings ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, setting_key VARCHAR(100) UNIQUE, setting_value JSON, setting_type ENUM('validation', 'processing', 'cleanup', 'retry', 'notification'), description TEXT, default_value JSON, updated_by INT UNSIGNED, created_at TIMESTAMP, updated_at TIMESTAMP ); `

    Installazione

    `bash

    Esegui SQL

    mysql -u root -p capera_sartupDB < database/sql/create_i40_settings_table.sql

    Aggiorna voce menΓΉ

    mysql -u root -p capera_sartupDB < database/sql/update_menu_configurazione_route.sql
    `

    ---

    🎨 Interfaccia Utente

    Layout a Tab

    La vista Γ¨ organizzata in 5 tab:

    1. Validazione - Come validare i CSV in arrivo 2. Elaborazione - Come elaborare i CSV validati 3. Pulizia - Gestione file dopo elaborazione 4. Retry - Tentativi automatici in caso di errore 5. Notifiche - Canali e destinatari notifiche

    FunzionalitΓ  per Tab

    Ogni tab ha:

  • βœ… Opzioni principali (radio button o checkbox)
  • βœ… Campi avanzati (input numerici, text)
  • βœ… Descrizioni contestuali
  • βœ… Pulsante "Ripristina Default" dedicato
  • βœ… Pulsante "Salva" globale
  • ---

    βš™οΈ Categorie Impostazioni

    1️⃣ VALIDAZIONE

    validation.mode (string)

  • Valori: auto | manual
  • Default: auto
  • Descrizione: ModalitΓ  validazione CSV
  • validation.auto_validate_on_arrival (boolean)

  • Default: true
  • Descrizione: Valida automaticamente quando CSV arriva
  • validation.block_invalid (boolean)

  • Default: true
  • Descrizione: Blocca CSV non validi (impedisci elaborazione)
  • validation.notify_on_invalid (boolean)

  • Default: true
  • Descrizione: Notifica quando CSV non Γ¨ valido
  • ---

    2️⃣ ELABORAZIONE

    processing.mode (string)

  • Valori: auto | manual
  • Default: manual
  • Descrizione: ModalitΓ  elaborazione CSV
  • processing.auto_process_validated (boolean)

  • Default: false
  • Descrizione: Elabora automaticamente CSV validati
  • processing.concurrent_limit (integer)

  • Default: 5
  • Range: 1-20
  • Descrizione: Numero massimo CSV elaborati contemporaneamente
  • processing.notify_on_complete (boolean)

  • Default: true
  • Descrizione: Notifica quando elaborazione completata
  • processing.notify_on_error (boolean)

  • Default: true
  • Descrizione: Notifica quando elaborazione fallisce
  • ---

    3️⃣ PULIZIA

    cleanup.delete_after_processing (boolean)

  • Default: false
  • Descrizione: Elimina file CSV dopo elaborazione completata
  • cleanup.archive_before_delete (boolean)

  • Default: true
  • Descrizione: Archivia CSV prima di eliminare
  • cleanup.archive_path (string)

  • Default: archive/csv_I40
  • Descrizione: Path archivio CSV (relativo a storage/app/)
  • cleanup.retention_days (integer)

  • Default: 90
  • Range: 1-3650
  • Descrizione: Giorni di retention CSV elaborati
  • cleanup.auto_cleanup_enabled (boolean)

  • Default: false
  • Descrizione: Abilita pulizia automatica vecchi CSV
  • ---

    4️⃣ RETRY

    retry.mode (string)

  • Valori: auto | manual
  • Default: manual
  • Descrizione: ModalitΓ  retry elaborazioni fallite
  • retry.max_attempts (integer)

  • Default: 3
  • Range: 1-10
  • Descrizione: Numero massimo tentativi automatici
  • retry.delay_minutes (integer)

  • Default: 15
  • Range: 1-1440
  • Descrizione: Minuti di attesa tra tentativi
  • retry.exponential_backoff (boolean)

  • Default: true
  • Descrizione: Usa backoff esponenziale (15min, 30min, 60min...)
  • ---

    5️⃣ NOTIFICHE

    notification.channels (array)

  • Default: ["email", "database"]
  • Descrizione: Canali notifica attivi
  • notification.email_recipients (array)

  • Default: ["admin@sartup.it"]
  • Descrizione: Email destinatari notifiche
  • notification.notify_roles (array)

  • Default: ["admin", "super-admin"]
  • Descrizione: Ruoli da notificare
  • ---

    πŸ’» Utilizzo nel Codice

    Helper Globale

    `php // Leggi setting $mode = i40_setting('validation.mode'); // 'auto' o 'manual' $autoValidate = i40_setting('validation.auto_validate_on_arrival', true);

    // Imposta setting i40_setting_set('processing.mode', 'auto'); `

    Metodi Diretti del Model

    `php use App\Models\I40\I40Setting;

    // Ottieni singolo valore $value = I40Setting::get('validation.mode', 'auto');

    // Imposta valore I40Setting::set('validation.mode', 'manual', auth()->id());

    // Ottieni tutti i setting di un tipo $validationSettings = I40Setting::getByType('validation');

    // Ripristina default $setting = I40Setting::where('setting_key', 'validation.mode')->first(); $setting->restoreDefault();

    // Ripristina tutti i default di un tipo $restored = I40Setting::restoreDefaultsByType('validation');

    // Invalida cache I40Setting::clearCache(); `

    ---

    πŸ”„ Esempi di Utilizzo

    Esempio 1: Validazione Automatica

    `php // Quando arriva un nuovo CSV public function onCsvArrival($csvImport) { if (i40_setting('validation.auto_validate_on_arrival') === true) { // Avvia validazione dispatch(new ValidateCsvJob($csvImport->id)); } } `

    Esempio 2: Elaborazione Automatica

    `php // Dopo validazione completata public function afterValidation($csvImport) { if ($csvImport->is_valid && i40_setting('processing.mode') === 'auto' && i40_setting('processing.auto_process_validated') === true) { // Verifica limite concorrenza $running = CsvImport::where('status', 'processing')->count(); $limit = i40_setting('processing.concurrent_limit', 5); if ($running < $limit) { dispatch(new ProcessCsvJob($csvImport->id)); } } } `

    Esempio 3: Cleanup dopo Elaborazione

    `php // Dopo elaborazione completata public function afterProcessing($csvImport) { if (i40_setting('cleanup.delete_after_processing') === true) { // Archivia prima se richiesto if (i40_setting('cleanup.archive_before_delete') === true) { $archivePath = i40_setting('cleanup.archive_path', 'archive/csv_I40'); Storage::move( $csvImport->file_path, "{$archivePath}/" . basename($csvImport->file_path) ); } // Elimina file originale Storage::delete($csvImport->file_path); } } `

    Esempio 4: Retry Automatico

    `php // Elaborazione fallita public function onProcessingFailed($csvImport) { if (i40_setting('retry.mode') === 'auto') { $maxAttempts = i40_setting('retry.max_attempts', 3); if ($csvImport->retry_count < $maxAttempts) { // Calcola delay $baseDelay = i40_setting('retry.delay_minutes', 15); if (i40_setting('retry.exponential_backoff') === true) { $delay = $baseDelay * pow(2, $csvImport->retry_count); } else { $delay = $baseDelay; } // Incrementa contatore $csvImport->increment('retry_count'); $csvImport->update(['last_retry_at' => now()]); // Schedule retry dispatch(new ProcessCsvJob($csvImport->id)) ->delay(now()->addMinutes($delay)); } } } `

    ---

    🎯 Workflow Completo

    Scenario: CSV Arriva da API

    ` 1. CSV depositato in connettore_I40/csv_I40_1_5/ ↓ 2. CsvImport record creato (status: pending) ↓ 3. if (validation.auto_validate_on_arrival === true) β”œβ”€ Avvia validazione β”‚ β”œβ”€ OK β†’ status: validated β”‚ └─ KO β†’ status: failed + validation_errors ↓ 4. if (processing.mode === 'auto' && is_valid) β”œβ”€ Verifica concurrent_limit └─ Avvia elaborazione ↓ 5. Elaborazione β”œβ”€ status: processing β”œβ”€ Processa righe β”‚ β”œβ”€ Successo β†’ status: completed β”‚ └─ Errore β†’ status: failed ↓ 6. if (status === 'failed' && retry.mode === 'auto') β”œβ”€ if (retry_count < max_attempts) └─ Schedule retry con delay ↓ 7. if (status === 'completed' && cleanup.delete_after_processing) β”œβ”€ if (cleanup.archive_before_delete) β†’ Archivia └─ Elimina file ↓ 8. if (notify_on_complete) β†’ Invia notifiche `

    ---

    πŸ”§ Manutenzione

    Aggiungere Nuovo Setting

    `sql INSERT INTO i40_settings (setting_key, setting_value, setting_type, description, default_value) VALUES ( 'processing.timeout_seconds', '300', 'processing', 'Timeout elaborazione CSV in secondi', '300' ); `

    Poi aggiorna la vista per includere il nuovo campo.

    Modificare Descrizione

    `sql UPDATE i40_settings SET description = 'Nuova descrizione piΓΉ chiara' WHERE setting_key = 'validation.mode'; `

    Cache Management

    `php // Invalida cache per un setting Cache::forget('i40_setting_validation.mode');

    // Invalida tutta la cache settings I40Setting::clearCache(); `

    ---

    πŸ“‹ Checklist Setup

  • [ ] Esegui create_i40_settings_table.sql
  • [ ] Esegui update_menu_configurazione_route.sql
  • [ ] Verifica accesso a /admin/i40/settings
  • [ ] Testa salvataggio impostazioni
  • [ ] Testa ripristino default
  • [ ] Verifica che helper i40_setting() funzioni
  • ---

    πŸš€ File Implementati

    Backend

  • βœ… app/Models/I40/I40Setting.php - Model con caching
  • βœ… app/Http/Controllers/Admin/I40/I40SettingsController.php - Controller
  • βœ… app/helpers.php - Helper globale i40_setting()
  • βœ… routes/i40.php - Routes configurazione
  • Frontend

  • βœ… resources/views/admin/i40/settings/index.blade.php - Vista con tab Bootstrap
  • Database

  • βœ… database/sql/create_i40_settings_table.sql - Schema + dati iniziali
  • βœ… database/sql/update_menu_configurazione_route.sql` - Aggiorna menΓΉ

---

πŸ“– Prossimi Sviluppi

Questi settings saranno utilizzati in:

1. Coda d'Import - Determina comportamento validazione/elaborazione 2. Jobs Background - Rispetta concurrent_limit e retry policy 3. Notifiche - Invia alert secondo configurazione 4. Cleanup Scheduler - Pulizia automatica secondo retention

---

Ultimo aggiornamento: 17 Ottobre 2025

Analisi Codice

Blocco 1 sql
CREATE TABLE i40_settings (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    setting_key VARCHAR(100) UNIQUE,
    setting_value JSON,
    setting_type ENUM('validation', 'processing', 'cleanup', 'retry', 'notification'),
    description TEXT,
    default_value JSON,
    updated_by INT UNSIGNED,
    created_at TIMESTAMP,
    updated_at TIMESTAMP
);
Blocco 2 bash
# Esegui SQL
mysql -u root -p capera_sartupDB < database/sql/create_i40_settings_table.sql

# Aggiorna voce menΓΉ
mysql -u root -p capera_sartupDB < database/sql/update_menu_configurazione_route.sql
Blocco 3 php
// Leggi setting
$mode = i40_setting('validation.mode'); // 'auto' o 'manual'
$autoValidate = i40_setting('validation.auto_validate_on_arrival', true);

// Imposta setting
i40_setting_set('processing.mode', 'auto');
Blocco 4 php
use App\Models\I40\I40Setting;

// Ottieni singolo valore
$value = I40Setting::get('validation.mode', 'auto');

// Imposta valore
I40Setting::set('validation.mode', 'manual', auth()->id());

// Ottieni tutti i setting di un tipo
$validationSettings = I40Setting::getByType('validation');

// Ripristina default
$setting = I40Setting::where('setting_key', 'validation.mode')->first();
$setting->restoreDefault();

// Ripristina tutti i default di un tipo
$restored = I40Setting::restoreDefaultsByType('validation');

// Invalida cache
I40Setting::clearCache();
Blocco 5 php
// Quando arriva un nuovo CSV
public function onCsvArrival($csvImport)
{
    if (i40_setting('validation.auto_validate_on_arrival') === true) {
        // Avvia validazione
        dispatch(new ValidateCsvJob($csvImport->id));
    }
}
Blocco 6 php
// Dopo validazione completata
public function afterValidation($csvImport)
{
    if ($csvImport->is_valid 
        && i40_setting('processing.mode') === 'auto'
        && i40_setting('processing.auto_process_validated') === true) {
        
        // Verifica limite concorrenza
        $running = CsvImport::where('status', 'processing')->count();
        $limit = i40_setting('processing.concurrent_limit', 5);
        
        if ($running < $limit) {
            dispatch(new ProcessCsvJob($csvImport->id));
        }
    }
}
Blocco 7 php
// Dopo elaborazione completata
public function afterProcessing($csvImport)
{
    if (i40_setting('cleanup.delete_after_processing') === true) {
        
        // Archivia prima se richiesto
        if (i40_setting('cleanup.archive_before_delete') === true) {
            $archivePath = i40_setting('cleanup.archive_path', 'archive/csv_I40');
            Storage::move(
                $csvImport->file_path, 
                "{$archivePath}/" . basename($csvImport->file_path)
            );
        }
        
        // Elimina file originale
        Storage::delete($csvImport->file_path);
    }
}
Blocco 8 php
// Elaborazione fallita
public function onProcessingFailed($csvImport)
{
    if (i40_setting('retry.mode') === 'auto') {
        $maxAttempts = i40_setting('retry.max_attempts', 3);
        
        if ($csvImport->retry_count < $maxAttempts) {
            // Calcola delay
            $baseDelay = i40_setting('retry.delay_minutes', 15);
            
            if (i40_setting('retry.exponential_backoff') === true) {
                $delay = $baseDelay * pow(2, $csvImport->retry_count);
            } else {
                $delay = $baseDelay;
            }
            
            // Incrementa contatore
            $csvImport->increment('retry_count');
            $csvImport->update(['last_retry_at' => now()]);
            
            // Schedule retry
            dispatch(new ProcessCsvJob($csvImport->id))
                ->delay(now()->addMinutes($delay));
        }
    }
}
Blocco 9
1. CSV depositato in connettore_I40/csv_I40_1_5/
   ↓
2. CsvImport record creato (status: pending)
   ↓
3. if (validation.auto_validate_on_arrival === true)
   β”œβ”€ Avvia validazione
   β”‚  β”œβ”€ OK β†’ status: validated
   β”‚  └─ KO β†’ status: failed + validation_errors
   ↓
4. if (processing.mode === 'auto' && is_valid)
   β”œβ”€ Verifica concurrent_limit
   └─ Avvia elaborazione
   ↓
5. Elaborazione
   β”œβ”€ status: processing
   β”œβ”€ Processa righe
   β”‚  β”œβ”€ Successo β†’ status: completed
   β”‚  └─ Errore β†’ status: failed
   ↓
6. if (status === 'failed' && retry.mode === 'auto')
   β”œβ”€ if (retry_count < max_attempts)
   └─ Schedule retry con delay
   ↓
7. if (status === 'completed' && cleanup.delete_after_processing)
   β”œβ”€ if (cleanup.archive_before_delete) β†’ Archivia
   └─ Elimina file
   ↓
8. if (notify_on_complete) β†’ Invia notifiche
Blocco 10 sql
INSERT INTO i40_settings (setting_key, setting_value, setting_type, description, default_value) 
VALUES (
    'processing.timeout_seconds', 
    '300', 
    'processing', 
    'Timeout elaborazione CSV in secondi', 
    '300'
);
Blocco 11 sql
UPDATE i40_settings 
SET description = 'Nuova descrizione piΓΉ chiara' 
WHERE setting_key = 'validation.mode';
Blocco 12 php
// Invalida cache per un setting
Cache::forget('i40_setting_validation.mode');

// Invalida tutta la cache settings
I40Setting::clearCache();