a5f8943c72
- Aggiunta validazione percorsi file prima del salvataggio profili - Implementati metodi di lettura file CSV e Excel per schedulazioni - Supporto doppia modalità: caricamento browser (preview) e percorso manuale (schedulazione) - Gestione completa deletion sync anche per file CSV/Excel - Rilevamento automatico separatori CSV (virgola, punto e virgola, tab, pipe) - Supporto formati Excel legacy (.xls) e moderni (.xlsx) - Abilitati profili file nella UI di schedulazione - Logging dettagliato per troubleshooting - Documentazione completa in CSV_SCHEDULING_IMPLEMENTATION.md - Aggiornati README.md e copilot-instructions.md con nuove feature - Rimosso testo 'TEST' dalla pagina di login
411 lines
13 KiB
Markdown
411 lines
13 KiB
Markdown
# Implementazione Schedulazione File CSV/Excel
|
||
|
||
## Data
|
||
24 Gennaio 2026
|
||
|
||
## Panoramica
|
||
Implementata la funzionalità completa di schedulazione per profili che utilizzano file CSV o Excel come sorgente dati. Precedentemente questa funzionalità era disattivata per motivi di sicurezza, ora è completamente funzionale con validazioni appropriate.
|
||
|
||
## Modifiche Implementate
|
||
|
||
### 1. Validazione File CSV nel Salvataggio Profilo
|
||
**File**: `Data_Coupler/Pages/DataCoupler.razor.cs`
|
||
|
||
**Modifica**: Aggiunta validazione nel metodo `OnProfileSaved` per verificare che:
|
||
- Il file CSV/Excel specificato esista nel filesystem
|
||
- Il file sia leggibile dall'applicazione
|
||
|
||
**Implementazione**:
|
||
```csharp
|
||
// Validazione specifica per file CSV
|
||
if (profile.SourceType == "file" && !string.IsNullOrEmpty(profile.SourceFilePath))
|
||
{
|
||
// Verifica esistenza
|
||
if (!System.IO.File.Exists(profile.SourceFilePath))
|
||
{
|
||
await JSRuntime.InvokeVoidAsync("alert",
|
||
"Errore: Il file non esiste o non è accessibile.");
|
||
return;
|
||
}
|
||
|
||
// Verifica leggibilità
|
||
try
|
||
{
|
||
using var fs = System.IO.File.OpenRead(profile.SourceFilePath);
|
||
fs.Close();
|
||
}
|
||
catch (Exception fileEx)
|
||
{
|
||
await JSRuntime.InvokeVoidAsync("alert",
|
||
$"Errore: Il file non può essere letto. Dettagli: {fileEx.Message}");
|
||
return;
|
||
}
|
||
}
|
||
```
|
||
|
||
**Benefici**:
|
||
- Previene errori durante l'esecuzione schedulata
|
||
- Fornisce feedback immediato all'utente in fase di configurazione
|
||
- Verifica i permessi di lettura del file
|
||
|
||
---
|
||
|
||
### 2. Implementazione Lettura File per Schedulazioni
|
||
**File**: `Data_Coupler/Services/ScheduledProfileExecutionService.cs`
|
||
|
||
**Modifica**: Implementati i seguenti metodi per la lettura di file CSV e Excel:
|
||
|
||
#### Metodi Implementati:
|
||
|
||
1. **`GetAllRecordsFromFileAsync`** - Metodo principale
|
||
- Determina il tipo di file (CSV, XLSX, XLS)
|
||
- Verifica esistenza del file
|
||
- Delega alla funzione appropriata
|
||
|
||
2. **`ReadCsvFileAsync`** - Lettura file CSV
|
||
- Rilevamento automatico del separatore (`,`, `;`, `\t`, `|`)
|
||
- Parsing corretto con gestione virgolette
|
||
- Supporto per file di grandi dimensioni
|
||
|
||
3. **`ReadExcelFileAsync`** - Lettura file Excel
|
||
- Supporto per formati `.xlsx` e `.xls`
|
||
- Utilizzo di `ExcelDataReader` library
|
||
- Registrazione encoding provider (`System.Text.CodePagesEncodingProvider`)
|
||
- Lettura del primo foglio Excel
|
||
|
||
4. **Helper Methods**:
|
||
- `DetectCsvSeparator`: Rilevamento automatico separatore CSV
|
||
- `ParseCsvLine`: Parsing linea CSV con gestione quote e escape
|
||
|
||
**Esempio di utilizzo**:
|
||
```csharp
|
||
private async Task<IEnumerable<Dictionary<string, object>>> GetAllRecordsFromSourceAsync(
|
||
DataCouplerProfile profile, IDatabaseManager? databaseManager)
|
||
{
|
||
if (profile.SourceType.ToLower() == "file")
|
||
{
|
||
return await GetAllRecordsFromFileAsync(profile);
|
||
}
|
||
// ... altri tipi
|
||
}
|
||
```
|
||
|
||
**Caratteristiche**:
|
||
- Supporto completo per CSV con separatori multipli
|
||
- Gestione corretta di campi con virgolette e caratteri speciali
|
||
- Parsing robusto con logging dettagliato
|
||
- Compatibilità con file Excel legacy (.xls) e moderni (.xlsx)
|
||
|
||
---
|
||
|
||
### 3. Abilitazione Profili File nella Schedulazione
|
||
**File**: `Data_Coupler/Pages/Scheduling.razor`
|
||
|
||
**Modifica**: Rimosso il filtro `Where(p => p.SourceType != "file")` che escludeva i profili file dalla lista di schedulazione.
|
||
|
||
**Prima**:
|
||
```csharp
|
||
@foreach (var profile in availableProfiles.Where(p => p.SourceType != "file"))
|
||
{
|
||
<option value="@profile.Id">@profile.Name</option>
|
||
}
|
||
```
|
||
|
||
**Dopo**:
|
||
```csharp
|
||
@foreach (var profile in availableProfiles)
|
||
{
|
||
<option value="@profile.Id">@profile.Name @(profile.SourceType == "file" ? "(File)" : "")</option>
|
||
}
|
||
```
|
||
|
||
**Miglioramenti UI**:
|
||
- Etichetta `(File)` per identificare profili con file
|
||
- Messaggio informativo aggiornato:
|
||
> ℹ️ I profili con file CSV/Excel come sorgente sono ora supportati per le schedulazioni.
|
||
> Il file specificato nel profilo verrà letto ad ogni esecuzione.
|
||
|
||
---
|
||
|
||
### 4. Gestione Cancellazioni per File CSV
|
||
**Implementazione**: La gestione delle cancellazioni opzionali funziona automaticamente anche per i profili file grazie all'architettura esistente.
|
||
|
||
**Flusso**:
|
||
1. I record vengono letti dal file CSV/Excel
|
||
2. Vengono trasformati in `Dictionary<string, object>` come i record database
|
||
3. Il sistema di associazioni (`KeyAssociationService`) traccia i record
|
||
4. Se abilitato, il `DeletionSyncService` sincronizza le eliminazioni
|
||
|
||
**Compatibilità**:
|
||
- ✅ Supporto completo per `EnableDeletionSync` flag
|
||
- ✅ Tracking chiavi sorgente (`SourceKeyField`)
|
||
- ✅ Sistema di associazioni record
|
||
- ✅ Pre-discovery di record esistenti
|
||
|
||
---
|
||
|
||
## Gestione File per Schedulazioni
|
||
|
||
### Due Modalità di Caricamento
|
||
|
||
#### 1. **Caricamento Browser** (per Preview)
|
||
- **Scopo**: Configurare mapping e vedere anteprima dati
|
||
- **Funzionamento**:
|
||
- File caricato tramite browser (InputFile component)
|
||
- Processato in memoria
|
||
- **Non salvato sul server**
|
||
- **Uso**: Solo per configurazione iniziale del profilo
|
||
|
||
#### 2. **Percorso Manuale** (per Schedulazione) ⭐
|
||
- **Scopo**: Specificare posizione file per schedulazioni
|
||
- **Funzionamento**:
|
||
- Utente inserisce percorso completo (es: `C:\Data\products.csv`)
|
||
- Sistema valida esistenza e leggibilità
|
||
- Percorso salvato nel profilo
|
||
- **Uso**: **Obbligatorio** per profili che devono essere schedulati
|
||
|
||
### Esempi di Percorsi Validi
|
||
|
||
**Windows**:
|
||
```
|
||
C:\Data\products.csv
|
||
\\server\share\customers.xlsx
|
||
D:\ImportFiles\orders.csv
|
||
```
|
||
|
||
**Linux/Container**:
|
||
```
|
||
/data/products.csv
|
||
/mnt/share/customers.xlsx
|
||
/app/import/orders.csv
|
||
```
|
||
|
||
### Workflow Completo
|
||
|
||
1. **Configurazione Iniziale**:
|
||
- Carica file da browser per preview
|
||
- Configura mapping campi vedendo i dati reali
|
||
- **Importante**: Questo file è solo temporaneo
|
||
|
||
2. **Preparazione Schedulazione**:
|
||
- Posiziona il file nella location definitiva sul server
|
||
- Inserisci il percorso completo nel campo "Percorso File sul Server"
|
||
- Clicca "Valida e Carica" per verificare
|
||
- Salva il profilo
|
||
|
||
3. **Esecuzione Schedulata**:
|
||
- Il sistema legge il file dal percorso salvato
|
||
- Il file deve esistere e essere accessibile
|
||
- Aggiornamenti al file vengono letti automaticamente
|
||
|
||
### Considerazioni Importanti
|
||
|
||
**Sicurezza**:
|
||
- Il file deve essere accessibile dal processo dell'applicazione
|
||
- Verificare permessi di lettura sulla directory
|
||
- Per ambienti multi-utente, considerare ACL appropriati
|
||
|
||
**Percorsi Relativi vs Assoluti**:
|
||
- **Consigliato**: Percorsi assoluti per chiarezza
|
||
- Se si usano percorsi relativi, sono relativi alla working directory dell'applicazione
|
||
|
||
**Aggiornamento File**:
|
||
- Il sistema legge sempre il file corrente dal percorso
|
||
- Per aggiornare i dati, basta sovrascrivere il file nella stessa posizione
|
||
- Non serve modificare il profilo se il percorso rimane invariato
|
||
|
||
**Deployment Container**:
|
||
- Montare volumi per directory contenenti i file
|
||
- Esempio docker-compose:
|
||
```yaml
|
||
volumes:
|
||
- /host/data:/data # Monta directory host in /data nel container
|
||
```
|
||
- Nel profilo usare: `/data/products.csv`
|
||
|
||
**Best Practices**:
|
||
- ✅ Usare una directory dedicata per file di import (es: `/data/imports/`)
|
||
- ✅ Nominare i file in modo descrittivo
|
||
- ✅ Implementare rotazione/backup dei file
|
||
- ✅ Monitorare spazio disco
|
||
- ❌ Non usare directory temporanee che vengono pulite
|
||
- ❌ Non usare percorsi di rete senza verifica connessione
|
||
|
||
---
|
||
|
||
## Funzionamento Completo
|
||
|
||
### Creazione Profilo con File CSV
|
||
1. L'utente seleziona "File" come tipo sorgente
|
||
2. **Opzione A - Caricamento Browser (per preview)**:
|
||
- Carica un file CSV/Excel tramite browser
|
||
- Il file viene processato in memoria per preview
|
||
- Permette di configurare il mapping vedendo i dati reali
|
||
- **Non viene salvato sul server** - solo per anteprima
|
||
|
||
3. **Opzione B - Percorso Manuale (richiesto per schedulazione)**:
|
||
- Inserisce il percorso completo del file sul server (es: `C:\Data\products.csv`)
|
||
- Clicca "Valida e Carica" per:
|
||
- Verificare che il file esista
|
||
- Verificare che sia leggibile
|
||
- Caricare preview per configurare mapping
|
||
- Il percorso viene salvato nel profilo
|
||
|
||
4. L'utente configura il mapping campi
|
||
5. **Salvataggio**: Il sistema valida che il file sia accessibile e leggibile
|
||
6. Il **percorso completo originale** del file viene salvato in `SourceFilePath`
|
||
|
||
**Nota Importante**: Per le schedulazioni è **necessario** specificare il percorso file manualmente. Il file deve essere accessibile dal server nella posizione specificata.
|
||
|
||
### Schedulazione Profilo File
|
||
1. L'utente crea una nuova schedulazione
|
||
2. Seleziona un profilo con `SourceType = "file"`
|
||
3. Configura la frequenza (giornaliera, settimanale, intervallo, ecc.)
|
||
4. Abilita opzionalmente `EnableDeletionSync` per sincronizzare eliminazioni
|
||
|
||
### Esecuzione Schedulata
|
||
1. Il background service avvia l'esecuzione alla schedulazione prevista
|
||
2. `ScheduledProfileExecutionService.ExecuteProfileAsync` viene chiamato
|
||
3. Il servizio legge il file dal percorso salvato usando `GetAllRecordsFromFileAsync`
|
||
4. I record vengono trasformati e inviati alla destinazione REST
|
||
5. Il sistema di associazioni traccia i record per evitare duplicati
|
||
6. Se configurato, vengono sincronizzate le eliminazioni
|
||
|
||
---
|
||
|
||
## Sicurezza e Validazioni
|
||
|
||
### Validazioni Implementate:
|
||
- ✅ Verifica esistenza file prima del salvataggio profilo
|
||
- ✅ Verifica permessi di lettura file
|
||
- ✅ Gestione eccezioni durante la lettura file
|
||
- ✅ Logging dettagliato per troubleshooting
|
||
- ✅ Validazione formato file (CSV, XLSX, XLS)
|
||
|
||
### Considerazioni di Sicurezza:
|
||
- Il file deve essere accessibile dal processo dell'applicazione
|
||
- Percorsi assoluti sono salvati nel database
|
||
- Per ambienti containerizzati, montare volumi con i file
|
||
- Permessi filesystem devono consentire lettura
|
||
|
||
---
|
||
|
||
## Formati File Supportati
|
||
|
||
### CSV
|
||
- **Separatori**: `,` (virgola), `;` (punto e virgola), `\t` (tab), `|` (pipe)
|
||
- **Rilevamento automatico**: Sì
|
||
- **Gestione quote**: Supporto completo per campi tra virgolette
|
||
- **Escape caratteri**: Supporto per `""` (double quote escape)
|
||
- **Dimensione massima**: 50 MB (configurabile)
|
||
|
||
### Excel
|
||
- **Formati**: `.xlsx` (Office Open XML), `.xls` (Binary Format)
|
||
- **Fogli multipli**: Legge il primo foglio per default
|
||
- **Header**: Prima riga utilizzata come intestazione
|
||
- **Dimensione massima**: 50 MB (configurabile)
|
||
|
||
---
|
||
|
||
## Esempi di Utilizzo
|
||
|
||
### Esempio 1: Schedulazione Giornaliera CSV
|
||
```
|
||
Profilo: "Import Prodotti da CSV"
|
||
- Sorgente: File CSV (products.csv)
|
||
- Destinazione: REST API (Salesforce)
|
||
- SourceKeyField: "ProductCode"
|
||
- UseRecordAssociations: true
|
||
|
||
Schedulazione: "Import Prodotti Quotidiano"
|
||
- Tipo: Daily (Giornaliera)
|
||
- Ora: 08:00
|
||
- EnableDeletionSync: false
|
||
```
|
||
|
||
**Comportamento**: Ogni giorno alle 08:00, il sistema legge `products.csv`, trasforma i dati secondo il mapping configurato, e li invia a Salesforce. I record esistenti vengono aggiornati, i nuovi creati.
|
||
|
||
### Esempio 2: Sincronizzazione con Eliminazioni
|
||
```
|
||
Profilo: "Sincronizza Clienti Excel"
|
||
- Sorgente: File Excel (customers.xlsx)
|
||
- Destinazione: REST API (SAP Business One)
|
||
- SourceKeyField: "CustomerID"
|
||
- UseRecordAssociations: true
|
||
|
||
Schedulazione: "Sync Clienti Settimanale"
|
||
- Tipo: Weekly (Settimanale)
|
||
- Giorno: Lunedì
|
||
- Ora: 06:00
|
||
- EnableDeletionSync: true
|
||
```
|
||
|
||
**Comportamento**: Ogni lunedì alle 06:00, il sistema:
|
||
1. Legge `customers.xlsx`
|
||
2. Sincronizza i clienti con SAP Business One
|
||
3. Identifica clienti eliminati dal file
|
||
4. Elimina i corrispondenti record in SAP B1
|
||
|
||
---
|
||
|
||
## Testing e Validazione
|
||
|
||
### Test Consigliati:
|
||
1. **Test file CSV con separatori diversi**
|
||
- Comma-separated
|
||
- Semicolon-separated
|
||
- Tab-separated
|
||
|
||
2. **Test file Excel**
|
||
- Formato .xlsx moderno
|
||
- Formato .xls legacy
|
||
- Fogli con molte colonne/righe
|
||
|
||
3. **Test errori**
|
||
- File non esistente
|
||
- File senza permessi di lettura
|
||
- File corrotto
|
||
- File troppo grande
|
||
|
||
4. **Test schedulazione**
|
||
- Esecuzione immediata manuale
|
||
- Esecuzione automatica schedulata
|
||
- Verifica storico esecuzioni
|
||
- Test con `EnableDeletionSync` attivo
|
||
|
||
---
|
||
|
||
## Limitazioni Note
|
||
|
||
1. **Fogli Excel**: Attualmente viene letto solo il primo foglio del file Excel
|
||
2. **Dimensione file**: Limite di 50 MB per sicurezza (configurabile in codice)
|
||
3. **Percorsi assoluti**: I file devono essere accessibili tramite percorso assoluto
|
||
4. **Encoding**: Supporto per encoding standard (UTF-8, Windows-1252)
|
||
|
||
---
|
||
|
||
## Prossimi Sviluppi Potenziali
|
||
|
||
- [ ] Supporto per lettura di fogli Excel multipli
|
||
- [ ] Configurazione dinamica del foglio Excel da leggere
|
||
- [ ] Supporto per file remoti (HTTP, FTP, Azure Blob)
|
||
- [ ] Cache intelligente per file grandi non modificati
|
||
- [ ] Validazione schema file prima dell'esecuzione
|
||
- [ ] Notifiche in caso di file non trovato durante schedulazione
|
||
|
||
---
|
||
|
||
## Conclusioni
|
||
|
||
L'implementazione della schedulazione per file CSV/Excel è ora completa e robusta. La funzionalità include:
|
||
|
||
✅ Validazione completa del file in fase di configurazione
|
||
✅ Lettura affidabile di CSV con separatori multipli
|
||
✅ Supporto per file Excel moderni e legacy
|
||
✅ Integrazione completa con sistema di associazioni
|
||
✅ Supporto per sincronizzazione eliminazioni opzionale
|
||
✅ Logging dettagliato per troubleshooting
|
||
✅ Error handling robusto
|
||
|
||
Gli utenti possono ora schedulare trasferimenti dati da file CSV/Excel esattamente come farebbero con sorgenti database, con le stesse funzionalità avanzate di tracking record e sincronizzazione.
|