fix: Correzione salvataggio campo MappedDestinationField in KeyAssociations
- Aggiunto campo MappedDestinationField al modello KeyAssociation per tracciare il campo destinazione mappato alla chiave sorgente
- Creata migration AddMappedDestinationFieldToKeyAssociation per aggiungere la colonna al database
- Implementata logica di popolamento in CreateAssociationAsync e StartDataTransferOriginal per salvare il campo destinazione mappato
- Aggiornato SaveAssociationParallelAsync per includere MappedDestinationField nelle query SQL UPDATE e INSERT
- Corretti indici parametri nella query UPDATE (da {7-9} a {8-10}) per includere il nuovo campo
- Aggiunta visualizzazione campo nell'interfaccia KeyAssociations (tabella, dettagli, export CSV)
- Implementato controllo validazione per impedire trasferimenti se il campo chiave non è mappato
- Aggiunto logging diagnostico dettagliato per debug del mapping dei campi
- Aggiornato ScheduledProfileExecutionService per popolare MappedDestinationField nelle esecuzioni schedulate
- Rimosso file BackgroundServices.cs obsoleto
- Documentazione completa creata (4 markdown files)
Fixes: Campo MappedDestinationField rimaneva NULL perché le query SQL raw non includevano il nuovo campo
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
# Aggiornamento Pagina KeyAssociations - Campo MappedDestinationField
|
||||
|
||||
## Data: 20 Ottobre 2025
|
||||
|
||||
## Modifiche Implementate
|
||||
|
||||
### 1. Aggiornamento Header Tabella
|
||||
|
||||
Aggiunta nuova colonna "Campo Mappato" nell'header della tabella:
|
||||
|
||||
```html
|
||||
<th>Campo Sorgente</th>
|
||||
<th>Campo Destinazione</th>
|
||||
<th>Campo Mappato</th> <!-- NUOVO -->
|
||||
<th>Entità Destinazione</th>
|
||||
```
|
||||
|
||||
### 2. Visualizzazione nella Tabella
|
||||
|
||||
Aggiunta cella per visualizzare il campo mappato con badge colorato:
|
||||
|
||||
```razor
|
||||
<td>
|
||||
@if (!string.IsNullOrEmpty(association.MappedDestinationField))
|
||||
{
|
||||
<span class="badge bg-primary">@association.MappedDestinationField</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="text-muted">
|
||||
<i class="fas fa-minus"></i> N/A
|
||||
</span>
|
||||
}
|
||||
</td>
|
||||
```
|
||||
|
||||
**Caratteristiche:**
|
||||
- Badge blu (`bg-primary`) per i campi mappati presenti
|
||||
- Icona e testo "N/A" in grigio per campi non mappati (retrocompatibilità)
|
||||
- Gestione nullable del campo
|
||||
|
||||
### 3. Popup Dettagli Associazione
|
||||
|
||||
Aggiunto il campo nel popup di dettagli (metodo `ShowAssociationDetails`):
|
||||
|
||||
```csharp
|
||||
info += $"Campo Destinazione: {association.DestinationKeyField}\n";
|
||||
if (!string.IsNullOrEmpty(association.MappedDestinationField))
|
||||
info += $"Campo Mappato: {association.MappedDestinationField}\n";
|
||||
info += $"Entità: {association.DestinationEntity}\n";
|
||||
```
|
||||
|
||||
**Caratteristiche:**
|
||||
- Mostrato solo se presente (non mostra riga se null)
|
||||
- Posizionato logicamente dopo "Campo Destinazione"
|
||||
- Include anche l'hash dei dati se presente
|
||||
|
||||
### 4. Esportazione CSV
|
||||
|
||||
Aggiornata l'esportazione CSV per includere il nuovo campo:
|
||||
|
||||
**Header CSV:**
|
||||
```
|
||||
Valore Chiave,Campo Sorgente,Campo Destinazione,Campo Mappato,Entità Destinazione,...
|
||||
```
|
||||
|
||||
**Dati:**
|
||||
```csharp
|
||||
csv += $"\"{association.MappedDestinationField ?? ""}\",";
|
||||
```
|
||||
|
||||
**Caratteristiche:**
|
||||
- Colonna aggiunta tra "Campo Destinazione" e "Entità Destinazione"
|
||||
- Gestisce valori null con stringa vuota
|
||||
- Include anche l'hash dei dati nell'export
|
||||
|
||||
## Esempio Visivo
|
||||
|
||||
### Tabella Prima delle Modifiche
|
||||
| Valore Chiave | Campo Sorgente | Campo Destinazione | Entità | ID Destinazione |
|
||||
|---------------|----------------|-------------------|--------|-----------------|
|
||||
| C00001 | CardCode | Id | Account | 001xx... |
|
||||
|
||||
### Tabella Dopo le Modifiche
|
||||
| Valore Chiave | Campo Sorgente | Campo Destinazione | **Campo Mappato** | Entità | ID Destinazione |
|
||||
|---------------|----------------|-------------------|-------------------|--------|-----------------|
|
||||
| C00001 | CardCode | Id | **cardcode__c** | Account | 001xx... |
|
||||
|
||||
## Legenda dei Campi
|
||||
|
||||
Per chiarezza, ecco cosa rappresenta ogni campo:
|
||||
|
||||
| Campo | Descrizione | Esempio |
|
||||
|-------|-------------|---------|
|
||||
| **Campo Sorgente** | Nome del campo chiave nel sistema sorgente | `CardCode` |
|
||||
| **Campo Destinazione** | Nome del campo ID primario nella destinazione | `Id` |
|
||||
| **Campo Mappato** | Nome del campo custom destinazione mappato alla chiave sorgente | `cardcode__c` |
|
||||
| **Entità Destinazione** | Tipo di oggetto nella destinazione | `Account` |
|
||||
| **ID Destinazione** | Valore dell'ID del record creato | `001xx000003DGb2AAG` |
|
||||
|
||||
## Retrocompatibilità
|
||||
|
||||
Le modifiche sono completamente retrocompatibili:
|
||||
- ✅ Record esistenti senza `MappedDestinationField` mostrano "N/A"
|
||||
- ✅ L'esportazione CSV funziona anche con valori null
|
||||
- ✅ Il popup dettagli omette la riga se il campo è null
|
||||
- ✅ Nessuna modifica breaking ai componenti esistenti
|
||||
|
||||
## Testing
|
||||
|
||||
Per verificare le modifiche:
|
||||
|
||||
1. **Avviare l'applicazione**
|
||||
2. **Navigare a**: `/key-associations`
|
||||
3. **Verificare**:
|
||||
- La nuova colonna "Campo Mappato" è visibile nell'header
|
||||
- I record esistenti mostrano "N/A" se il campo è null
|
||||
- I nuovi record mostrano il campo mappato con badge blu
|
||||
- Il popup dettagli include "Campo Mappato" se presente
|
||||
- L'esportazione CSV include la nuova colonna
|
||||
|
||||
## Screenshot Esempio
|
||||
|
||||
### Visualizzazione Tabella
|
||||
```
|
||||
╔═══════════╦════════════════╦═══════════════════╦════════════════╦═════════╗
|
||||
║ Chiave ║ Campo Sorgente ║ Campo Destinazione║ Campo Mappato ║ Entità ║
|
||||
╠═══════════╬════════════════╬═══════════════════╬════════════════╬═════════╣
|
||||
║ C00001 ║ CardCode ║ Id ║ cardcode__c ║ Account ║
|
||||
║ ║ ║ ║ [Badge Blu] ║ ║
|
||||
╠═══════════╬════════════════╬═══════════════════╬════════════════╬═════════╣
|
||||
║ ITEM001 ║ ItemCode ║ Id ║ - N/A ║ Product ║
|
||||
║ ║ ║ ║ [Grigio] ║ ║
|
||||
╚═══════════╩════════════════╩═══════════════════╩════════════════╩═════════╝
|
||||
```
|
||||
|
||||
## File Modificati
|
||||
|
||||
- ✅ `Data_Coupler/Pages/KeyAssociations.razor` - Aggiornamento tabella, dettagli ed export
|
||||
|
||||
## Status: ✅ COMPLETATO
|
||||
|
||||
Tutte le modifiche sono state implementate e verificate senza errori di compilazione.
|
||||
Reference in New Issue
Block a user