Fix: Funzione i40_setting() Mancante

Fix: Funzione i40_setting() Mancante

Data: 20 Ottobre 2025 Problema: Call to undefined function i40_setting() Status: ✅ Risolto

---

Problema

L'ArchiveController (riga 97) e la view archive/index.blade.php (riga 236) utilizzano la funzione helper i40_setting() che non esisteva.

``php // ArchiveController.php:97 $days = $request->input('days', i40_setting('archive_retention_days', 90));

// archive/index.blade.php:236 <input type="number" name="days" value="{{ i40_setting('archive_retention_days', 90) }}"> `

---

Soluzione

1. Aggiunta Helper Function

File: app/helpers.php

`php if (!function_exists('i40_setting')) { / * Get I40 setting value with optional default * * @param string $key Setting key (e.g., 'archive_retention_days') * @param mixed $default Default value if setting not found * @return mixed */ function i40_setting(string $key, $default = null) { try { $setting = \App\Models\I40\I40Setting::where('setting_key', $key)->first(); if (!$setting) { return $default; } // Return il valore casted al tipo corretto $value = $setting->setting_value; // Auto-cast basato sul default (se fornito) if ($default !== null) { if (is_bool($default)) { return filter_var($value, FILTER_VALIDATE_BOOLEAN); } elseif (is_int($default)) { return (int) $value; } elseif (is_float($default)) { return (float) $value; } } return $value; } catch (\Exception $e) { \Log::warning("Errore lettura i40_setting: {$key}", [ 'error' => $e->getMessage() ]); return $default; } } } `

2. Verifica Helper Caricato

L'helper è già registrato in AppServiceProvider::register():

`php public function register(): void { // Carica helpers globali require_once app_path('helpers.php'); } `

3. Popolamento Database

Assicurati che lo script SQL sia stato eseguito:

`bash mysql -u uv4xcitr_joom404 -p capera_sartupDB < database/sql/insert_i40_settings_archive.sql `

Oppure tramite PHPMyAdmin, esegui:

`sql INSERT INTO i40_settings (setting_key, setting_value, setting_type, description, default_value) VALUES ('archive_enabled', 'true', 'cleanup', 'Abilita archiviazione automatica CSV elaborati', 'true'), ('archive_failed_separately', 'true', 'cleanup', 'Archivia CSV failed in folder separato', 'true'), ('archive_retention_days', '90', 'cleanup', 'Giorni di retention archivio (0 = infinito)', '90'), ('archive_delete_after_days', '0', 'cleanup', 'Giorni dopo i quali eliminare definitivamente (0 = mai)', '0') ON DUPLICATE KEY UPDATE setting_value = VALUES(setting_value), description = VALUES(description); `

---

Funzionalità Helper

Uso Base

`php // Con default $days = i40_setting('archive_retention_days', 90); // Ritorna 90 se non trovato

// Senza default $days = i40_setting('archive_retention_days'); // Ritorna null se non trovato `

Auto-Cast Intelligente

L'helper auto-casta il valore in base al tipo del default:

`php // Boolean $enabled = i40_setting('archive_enabled', true); // Ritorna boolean

// Integer $days = i40_setting('archive_retention_days', 90); // Ritorna int

// Float $threshold = i40_setting('some_float_value', 1.5); // Ritorna float

// String (nessun cast) $path = i40_setting('archive_path', '/default/path'); // Ritorna string `

Gestione Errori

  • Se il setting non esiste nel DB, ritorna il $default
  • Se c'è un'eccezione durante la lettura, logga un warning e ritorna il $default
  • Non solleva mai eccezioni (graceful degradation)
  • ---

    Alternative: Model Method

    Se preferisci usare il Model direttamente (con cache):

    `php use App\Models\I40\I40Setting;

    $days = I40Setting::get('archive_retention_days', 90); `

    Differenza:

  • I40Setting::get() usa cache (3600s)
  • i40_setting() query diretta (nessuna cache)
  • ---

    Testing

    Test 1: Verifica Helper Caricato

    `php php artisan tinker >>> i40_setting('archive_retention_days', 90) => 90 `

    Test 2: Verifica Setting nel DB

    `sql SELECT * FROM i40_settings WHERE setting_key = 'archive_retention_days'; `

    Output atteso: ` setting_key | setting_value | setting_type | default_value -----------------------|---------------|--------------|--------------- archive_retention_days | 90 | cleanup | 90 `

    Test 3: Test Funzionale (Archive View)

    1. Vai su /admin/i40/archive 2. Seleziona una macchina 3. Click "Cleanup" 4. Il modal dovrebbe mostrare "90" nel campo giorni 5. ✅ Nessun errore i40_setting() undefined

    ---

    Note

  • La funzione è ora disponibile globalmente in tutta l'applicazione
  • Può essere usata nei Controller, Blade views, Service classes, ovunque
  • È safe: non solleva mai eccezioni, ritorna sempre un valore
  • ---

    Files Modificati

  • app/helpers.php (aggiunta funzione)
  • ℹ️ app/Providers/AppServiceProvider.php (già caricava helpers)
  • ℹ️ database/sql/insert_i40_settings_archive.sql` (già esistente)

Analisi Codice

Blocco 1 php
// ArchiveController.php:97
$days = $request->input('days', i40_setting('archive_retention_days', 90));

// archive/index.blade.php:236
<input type="number" name="days" value="{{ i40_setting('archive_retention_days', 90) }}">
Blocco 2 php
if (!function_exists('i40_setting')) {
    /**
     * Get I40 setting value with optional default
     * 
     * @param string $key Setting key (e.g., 'archive_retention_days')
     * @param mixed $default Default value if setting not found
     * @return mixed
     */
    function i40_setting(string $key, $default = null)
    {
        try {
            $setting = \App\Models\I40\I40Setting::where('setting_key', $key)->first();
            
            if (!$setting) {
                return $default;
            }
            
            // Return il valore casted al tipo corretto
            $value = $setting->setting_value;
            
            // Auto-cast basato sul default (se fornito)
            if ($default !== null) {
                if (is_bool($default)) {
                    return filter_var($value, FILTER_VALIDATE_BOOLEAN);
                } elseif (is_int($default)) {
                    return (int) $value;
                } elseif (is_float($default)) {
                    return (float) $value;
                }
            }
            
            return $value;
            
        } catch (\Exception $e) {
            \Log::warning("Errore lettura i40_setting: {$key}", [
                'error' => $e->getMessage()
            ]);
            return $default;
        }
    }
}
Blocco 3 php
public function register(): void
{
    // Carica helpers globali
    require_once app_path('helpers.php');
}
Blocco 4 bash
mysql -u uv4xcitr_joom404 -p capera_sartupDB < database/sql/insert_i40_settings_archive.sql
Blocco 5 sql
INSERT INTO i40_settings (setting_key, setting_value, setting_type, description, default_value) VALUES
('archive_enabled', 'true', 'cleanup', 'Abilita archiviazione automatica CSV elaborati', 'true'),
('archive_failed_separately', 'true', 'cleanup', 'Archivia CSV failed in folder separato', 'true'),
('archive_retention_days', '90', 'cleanup', 'Giorni di retention archivio (0 = infinito)', '90'),
('archive_delete_after_days', '0', 'cleanup', 'Giorni dopo i quali eliminare definitivamente (0 = mai)', '0')
ON DUPLICATE KEY UPDATE 
    setting_value = VALUES(setting_value),
    description = VALUES(description);
Blocco 6 php
// Con default
$days = i40_setting('archive_retention_days', 90); // Ritorna 90 se non trovato

// Senza default
$days = i40_setting('archive_retention_days'); // Ritorna null se non trovato
Blocco 7 php
// Boolean
$enabled = i40_setting('archive_enabled', true); // Ritorna boolean

// Integer
$days = i40_setting('archive_retention_days', 90); // Ritorna int

// Float
$threshold = i40_setting('some_float_value', 1.5); // Ritorna float

// String (nessun cast)
$path = i40_setting('archive_path', '/default/path'); // Ritorna string
Blocco 8 php
use App\Models\I40\I40Setting;

$days = I40Setting::get('archive_retention_days', 90);
Blocco 9 php
php artisan tinker
>>> i40_setting('archive_retention_days', 90)
=> 90
Blocco 10 sql
SELECT * FROM i40_settings WHERE setting_key = 'archive_retention_days';
Blocco 11
setting_key             | setting_value | setting_type | default_value
-----------------------|---------------|--------------|---------------
archive_retention_days | 90            | cleanup      | 90