Setup Coda d'Import CSV

Setup Coda d'Import CSV

๐ŸŽฏ Panoramica

La Coda d'Import รจ il sistema centrale per gestire i CSV che arrivano dalle macchine Industria 4.0. Permette di:

  • Scansionare cartelle per nuovi CSV
  • Validare CSV contro profili
  • Elaborare CSV (import dati)
  • Gestire errori e retry
  • Monitorare stato elaborazioni
  • Modalitร : MANUALE (Ora)

    Tutte le operazioni richiedono click utente. Nessun processo automatico.

    ---

    ๐Ÿ“Š Database

    Tabella: csv_imports

    Traccia ogni CSV dal momento dell'arrivo fino al completamento (o fallimento).

    Campi Principali:

  • machine_id, profile_id - Associazioni
  • filename, file_path, file_hash - Info file
  • source_channel - Provenienza (upload, api, watch_folder...)
  • status - pendingโ†’validatingโ†’validatedโ†’processingโ†’completed
  • is_valid - Risultato validazione (NULL/TRUE/FALSE)
  • rows_total, rows_processed, rows_failed - Statistiche
  • retry_count - Numero tentativi
  • validated_by, processed_by - Chi ha eseguito (NULL = automatico)
  • Installazione

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

    ---

    ๐Ÿ—๏ธ Architettura

    Services (Business Logic)

    CsvScannerService

    `php scanForNewCsvs() // Scansiona tutte le cartelle scanMachinePath($machine) // Scansiona path specifico registerCsv($file, ...) // Registra CSV in database getScanStats() // Statistiche scansione `

    Cosa fa: Trova CSV nelle cartelle connettore_I40/csv_I40_X_Y/ e li registra in csv_imports.

    CsvValidatorService

    `php validate($csvImport): ValidationResult `

    Cosa fa: 1. Verifica file esista 2. Legge CSV con League\Csv 3. Verifica colonne corrispondano al profilo 4. Conta righe 5. Restituisce ValidationResult (isValid, errors, rowsCount)

    โญ RIUSABILE: Chiamato sia da Controller (manuale) che da Job (futuro automatico)

    CsvProcessorService

    `php process($csvImport): ProcessingResult `

    Cosa fa: 1. Legge CSV validato 2. Elabora riga per riga 3. Importa dati (TODO: definire destinazione) 4. Restituisce ProcessingResult (success, rowsProcessed, rowsFailed)

    โญ RIUSABILE: Chiamato sia da Controller (manuale) che da Job (futuro automatico)

    ---

    ๐ŸŽฎ Controller

    CsvImportsController
    </h3></p><p>| Metodo | Route | Descrizione |
    |--------|-------|-------------|
    | </code>index()<code> | GET </code>/csv-imports<code> | Lista CSV con filtri |
    | </code>scanNewCsvs()<code> | POST </code>/csv-imports/scan<code> | Scansiona manualmente |
    | </code>show($id)<code> | GET </code>/csv-imports/{id}<code> | Dettagli JSON |
    | </code>validate($id)<code> | POST </code>/csv-imports/{id}/validate<code> | Valida CSV |
    | </code>process($id)<code> | POST </code>/csv-imports/{id}/process<code> | Elabora CSV |
    | </code>pause($id)<code> | POST </code>/csv-imports/{id}/pause<code> | Metti in pausa |
    | </code>resume($id)<code> | POST </code>/csv-imports/{id}/resume<code> | Riprendi |
    | </code>retry($id)<code> | POST </code>/csv-imports/{id}/retry<code> | Riprova |
    | </code>destroy($id)<code> | DELETE </code>/csv-imports/{id}<code> | Elimina |</p><p>---</p><p><h2>๐ŸŽจ Vista</h2></p><p><h3>Layout</h3></p><p></code>`<code>
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  [๐Ÿ” Scansiona Nuovi CSV] [โš™๏ธ Configurazione]              โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚  ๐Ÿ“Š [In Attesa: 12] [Validati: 45] [Pausa: 3] [Falliti: 2]โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚  Filtri: [Macchina โ–ผ] [Stato โ–ผ] [Canale โ–ผ]                โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚  ๐Ÿ“‹ Tabella CSV                                             โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
    `
    </p><p><h3>Azioni per Stato</h3></p><p>| Stato | Azioni Disponibili |
    |-------|--------------------|
    | </code>pending<code> | ๐Ÿ‘๏ธ Dettagli, โœ“ Valida, โธ๏ธ Pausa, ๐Ÿ—‘๏ธ Elimina |
    |
    validated
    | ๐Ÿ‘๏ธ Dettagli, โ–ถ๏ธ Elabora, โธ๏ธ Pausa, ๐Ÿ—‘๏ธ Elimina |
    |
    paused | ๐Ÿ‘๏ธ Dettagli, โ–ถ๏ธ Riprendi, ๐Ÿ—‘๏ธ Elimina | | failed | ๐Ÿ‘๏ธ Dettagli, ๐Ÿ”„ Riprova, ๐Ÿ—‘๏ธ Elimina | | completed | ๐Ÿ‘๏ธ Dettagli, ๐Ÿ—‘๏ธ Elimina |

    ---

    ๐Ÿ”„ Stati del CSV

    `

    pending โ†’ validating โ†’ validated โ†’ processing โ†’ completed
       โ†“          โ†“            โ†“           โ†“
     failed โ† failed      paused โ†   failed
       โ†‘                    โ†“           โ†‘
       โ””โ”€โ”€โ”€ retry โ”€โ”€โ”€โ”€โ”€โ”€โ”€ resume โ”€โ”€โ”€ retry
    `

    Descrizione Stati:

    1. pending - Appena trovato, in attesa validazione 2. validating - Validazione in corso 3. validated - Validato OK, pronto per elaborazione 4. paused - Messo in pausa dall'utente 5. processing - Elaborazione in corso 6. completed - Elaborazione completata con successo 7. failed - Validazione o elaborazione fallita

    ---

    ๐Ÿš€ Workflow Utente

    1. Scansiona Nuovi CSV

    ` Click "Scansiona Nuovi CSV" โ†“ Sistema cerca in tutte le cartelle csv_I40_X_Y/ โ†“ Registra nuovi CSV trovati (status: pending) โ†“ Toast: "Trovati X nuovi CSV!" `

    </p><p><h3>2. Valida CSV</h3></p><p></code>`<code>
    Click โœ“ su riga CSV pending
        โ†“
    CsvValidatorService::validate()
        โ”œโ”€ Verifica colonne
        โ”œโ”€ Conta righe
        โ””โ”€ Cerca errori
        โ†“
    Status: validated (OK) o failed (KO)
        โ†“
    Toast: &quot;CSV validato!&quot; o &quot;Validazione fallita: X errori&quot;
    `
    </p><p><h3>3. Elabora CSV</h3></p><p></code>`<code>
    Click โ–ถ๏ธ su riga CSV validated
        โ†“
    CsvProcessorService::process()
        โ”œโ”€ Legge righe
        โ”œโ”€ Importa dati (TODO)
        โ””โ”€ Traccia successi/fallimenti
        โ†“
    Status: completed (OK) o failed (KO)
        โ†“
    Toast: &quot;Elaborazione completata! X righe importate&quot;
    `
    </p><p><h3>4. Gestione Errori</h3></p><p></code>`<code>
    Se failed:
        โ”œโ”€ Click ๐Ÿ‘๏ธ โ†’ Vedi errori dettagliati
        โ”œโ”€ Correggi CSV manualmente
        โ”œโ”€ Click ๐Ÿ”„ Riprova
        โ””โ”€ Oppure ๐Ÿ—‘๏ธ Elimina
    `

    ---

    ๐Ÿ“‹ Installazione

    1. Database

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

    2. Voce Menรน

    `sql UPDATE menu_items SET route_name = 'admin.i40.csv-imports.index' WHERE label = 'Coda d\'import' AND parent_id = (SELECT id FROM (SELECT id FROM menu_items WHERE label = 'Industria 4.0') AS tmp); `

    3. Test

    ` /admin/i40/csv-imports `

    ---

    ๐Ÿงช Test Manuale

    Prepara CSV di Test

    `bash

    1. Trova una cartella CSV esistente

    ls -la storage/app/connettore_I40/

    2. Copia un CSV di test

    cp test.csv storage/app/connettore_I40/csv_I40_1_1/sample.csv
    `

    Testa Workflow

    1. Vai a /admin/i40/csv-imports 2. Click "Scansiona Nuovi CSV" 3. Dovresti vedere sample.csv in coda (status: pending) 4. Click โœ“ per validare 5. Se OK: Click โ–ถ๏ธ per elaborare 6. Click ๐Ÿ‘๏ธ per vedere dettagli

    ---

    ๐Ÿ”ง Troubleshooting

    CSV Non Trovati dalla Scansione

    Verifica: `bash

    1. Cartelle esistono?

    ls -la storage/app/connettore_I40/

    2. CSV presenti?

    find storage/app/connettore_I40/ -name "*.csv"

    3. Permessi corretti?

    chmod -R 755 storage/app/connettore_I40/
    `

    Validazione Sempre Fallisce

    Verifica:

  • Profilo ha colonne definite?
  • CSV ha header se has_header = 1?
  • Delimitatore corretto nel profilo?
  • Encoding corretto?
  • Debug: `php // In CsvValidatorService, aggiungi: Log::debug('CSV Headers: ' . json_encode($csvHeaders)); Log::debug('Expected: ' . json_encode($expectedColumns)); `

    ---

    ๐Ÿ“‚ File Implementati

    Backend

  • โœ… app/Models/I40/CsvImport.php
  • โœ… app/Services/I40/CsvScannerService.php
  • โœ… app/Services/I40/CsvValidatorService.php
  • โœ… app/Services/I40/CsvProcessorService.php
  • โœ… app/Http/Controllers/Admin/I40/CsvImportsController.php
  • Routes

  • โœ… routes/i40.php (gruppo csv-imports)
  • Views

  • โœ… resources/views/admin/i40/csv-imports/index.blade.php
  • Database

  • โœ… database/sql/create_csv_imports_table.sql
  • ---

    ๐Ÿš€ Prossimi Sviluppi

    Fase 1 (Completata): Gestione Manuale โœ…

  • Scansione manuale
  • Validazione manuale
  • Elaborazione manuale
  • Fase 2 (Futuro): Upload Web

  • Form upload CSV diretto
  • Selezione macchina/profilo
  • Salvataggio automatico in cartella corretta
  • Fase 3 (Futuro): Automazione

  • Jobs per elaborazione background
  • Queue Worker
  • Scheduler per scansione automatica
  • Fase 4 (Futuro): Logica Import

  • Definire dove vanno i dati elaborati
  • Implementare CsvProcessorService::importRow()`
  • Gestione transazioni

---

Ultimo aggiornamento: 17 Ottobre 2025

Analisi Codice

Blocco 1 bash
mysql -u root -p capera_sartupDB < database/sql/create_csv_imports_table.sql
Blocco 2 php
scanForNewCsvs()           // Scansiona tutte le cartelle
scanMachinePath($machine)  // Scansiona path specifico
registerCsv($file, ...)    // Registra CSV in database
getScanStats()             // Statistiche scansione
Blocco 3 php
validate($csvImport): ValidationResult
Blocco 4 php
process($csvImport): ProcessingResult
Blocco 5
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  [๐Ÿ” Scansiona Nuovi CSV] [โš™๏ธ Configurazione]              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  ๐Ÿ“Š [In Attesa: 12] [Validati: 45] [Pausa: 3] [Falliti: 2]โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Filtri: [Macchina โ–ผ] [Stato โ–ผ] [Canale โ–ผ]                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  ๐Ÿ“‹ Tabella CSV                                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
Blocco 6
pending โ†’ validating โ†’ validated โ†’ processing โ†’ completed
   โ†“          โ†“            โ†“           โ†“
 failed โ† failed      paused โ†   failed
   โ†‘                    โ†“           โ†‘
   โ””โ”€โ”€โ”€ retry โ”€โ”€โ”€โ”€โ”€โ”€โ”€ resume โ”€โ”€โ”€ retry
Blocco 7
Click "Scansiona Nuovi CSV"
    โ†“
Sistema cerca in tutte le cartelle csv_I40_X_Y/
    โ†“
Registra nuovi CSV trovati (status: pending)
    โ†“
Toast: "Trovati X nuovi CSV!"
Blocco 8
Click โœ“ su riga CSV pending
    โ†“
CsvValidatorService::validate()
    โ”œโ”€ Verifica colonne
    โ”œโ”€ Conta righe
    โ””โ”€ Cerca errori
    โ†“
Status: validated (OK) o failed (KO)
    โ†“
Toast: "CSV validato!" o "Validazione fallita: X errori"
Blocco 9
Click โ–ถ๏ธ su riga CSV validated
    โ†“
CsvProcessorService::process()
    โ”œโ”€ Legge righe
    โ”œโ”€ Importa dati (TODO)
    โ””โ”€ Traccia successi/fallimenti
    โ†“
Status: completed (OK) o failed (KO)
    โ†“
Toast: "Elaborazione completata! X righe importate"
Blocco 10
Se failed:
    โ”œโ”€ Click ๐Ÿ‘๏ธ โ†’ Vedi errori dettagliati
    โ”œโ”€ Correggi CSV manualmente
    โ”œโ”€ Click ๐Ÿ”„ Riprova
    โ””โ”€ Oppure ๐Ÿ—‘๏ธ Elimina
Blocco 11 bash
mysql -u root -p capera_sartupDB < database/sql/create_csv_imports_table.sql
Blocco 12 sql
UPDATE menu_items 
SET route_name = 'admin.i40.csv-imports.index'
WHERE label = 'Coda d\'import' 
  AND parent_id = (SELECT id FROM (SELECT id FROM menu_items WHERE label = 'Industria 4.0') AS tmp);
Blocco 13
/admin/i40/csv-imports
Blocco 14 bash
# 1. Trova una cartella CSV esistente
ls -la storage/app/connettore_I40/

# 2. Copia un CSV di test
cp test.csv storage/app/connettore_I40/csv_I40_1_1/sample.csv
Blocco 15 bash
# 1. Cartelle esistono?
ls -la storage/app/connettore_I40/

# 2. CSV presenti?
find storage/app/connettore_I40/ -name "*.csv"

# 3. Permessi corretti?
chmod -R 755 storage/app/connettore_I40/
Blocco 16 php
// In CsvValidatorService, aggiungi:
Log::debug('CSV Headers: ' . json_encode($csvHeaders));
Log::debug('Expected: ' . json_encode($expectedColumns));