- 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
6.0 KiB
Riepilogo Completo - Implementazione MappedDestinationField
Data: 20 Ottobre 2025
📝 Sommario Modifiche
Implementato nuovo campo MappedDestinationField nella tabella KeyAssociations per tracciare il campo di destinazione custom mappato alla chiave sorgente.
✅ Modifiche Completate
1. Database Schema
File: CredentialManager/Models/KeyAssociation.cs
[MaxLength(200)]
public string? MappedDestinationField { get; set; }
Migration: 20251019220512_AddMappedDestinationFieldToKeyAssociation
- Colonna aggiunta e database aggiornato ✅
2. Logica di Popolamento
File: Data_Coupler/Pages/DataCoupler.razor.cs
Metodi Modificati:
CreateAssociationAsync()- Popola il campo durante trasferimenti Composite APIStartDataTransferOriginal()- Popola il campo durante trasferimenti standard
Logica Implementata:
string? mappedDestinationField = null;
if (fieldMappings.ContainsKey(sourceKeyField))
{
mappedDestinationField = fieldMappings[sourceKeyField];
}
3. Interfaccia Utente
File: Data_Coupler/Pages/KeyAssociations.razor
Modifiche:
- ✅ Colonna "Campo Mappato" aggiunta alla tabella
- ✅ Badge blu per campi presenti, "N/A" per null
- ✅ Campo aggiunto al popup dettagli
- ✅ Colonna aggiunta all'export CSV
4. Logging Diagnostico
Aggiunto logging dettagliato per troubleshooting:
Logger.LogDebug("MAPPING DEBUG: Tentativo di trovare mapping per sourceKeyField: '{SourceKeyField}'", sourceKeyField);
Logger.LogDebug("MAPPING DEBUG: Mappings disponibili: {Mappings}", ...);
Logger.LogDebug("MAPPING DEBUG: Trovato mapping: '{SourceKeyField}' -> '{MappedField}'", ...);
Logger.LogWarning("MAPPING DEBUG: Campo chiave '{SourceKeyField}' NON trovato nei mappings!", ...);
🔍 Diagnosi Problema NULL
Possibili Cause
-
Campo Chiave Non Mappato ⚠️
- L'utente seleziona un campo chiave che NON è stato incluso nei mapping
- Soluzione: Verificare che il campo chiave sia mappato
-
Case Sensitivity
- Il nome del campo potrebbe non corrispondere esattamente
- Soluzione: Verificare maiuscole/minuscole
-
Spazi o Caratteri
- Presenza di spazi all'inizio/fine
- Soluzione: Trim automatico durante mapping
Come Diagnosticare
- Abilitare logging Debug in
appsettings.Development.json:
{
"Logging": {
"LogLevel": {
"Data_Coupler.Pages.DataCoupler": "Debug"
}
}
}
-
Eseguire un trasferimento e monitorare i log
-
Cercare righe "MAPPING DEBUG":
- Se trovato:
MappedField: cardcode__c✅ - Se NON trovato:
Campo chiave 'X' NON trovato nei mappings!❌
- Se trovato:
-
Verificare database:
SELECT
SourceKeyField,
MappedDestinationField,
AdditionalInfo
FROM KeyAssociations
ORDER BY CreatedAt DESC
LIMIT 5;
📊 Esempio Funzionamento Corretto
Scenario SAP → Salesforce
Step 1: Creazione Mappings
CardCode → cardcode__c
CardName → Name
City → BillingCity
Step 2: Selezione Campo Chiave
Campo Chiave Sorgente: CardCode ✅ (presente nei mappings)
Step 3: Trasferimento
Log: MAPPING DEBUG: Trovato mapping: 'CardCode' -> 'cardcode__c'
Step 4: Associazione Creata
{
"SourceKeyField": "CardCode",
"DestinationKeyField": "Id",
"MappedDestinationField": "cardcode__c", ← POPOLATO!
"DestinationId": "001xx000003DGb2AAG"
}
⚠️ Scenario Problematico
Step 1: Mappings Incompleti
CardName → Name
City → BillingCity
(CardCode NON mappato!)
Step 2: Selezione Campo Chiave
Campo Chiave Sorgente: CardCode ❌ (NON presente nei mappings)
Step 3: Trasferimento
Log: MAPPING DEBUG: Campo chiave 'CardCode' NON trovato nei mappings!
Step 4: Associazione Creata
{
"SourceKeyField": "CardCode",
"DestinationKeyField": "Id",
"MappedDestinationField": null, ← RIMANE NULL!
"DestinationId": "001xx000003DGb2AAG"
}
NOTA: Il sistema ora dovrebbe impedire il trasferimento con l'errore:
"Il campo chiave 'CardCode' deve essere mappato. Crea un mapping per questo campo prima di procedere."
🎯 Testing Raccomandato
Test 1: Caso Positivo
1. Creare mapping che include il campo chiave
2. Selezionare il campo chiave
3. Eseguire trasferimento
4. Verificare: MappedDestinationField popolato ✅
Test 2: Caso Negativo (Dovrebbe essere Bloccato)
1. Creare mappings SENZA includere il campo chiave
2. Selezionare il campo chiave
3. Tentare trasferimento
4. Verificare: Errore mostrato, trasferimento bloccato ✅
Test 3: Retrocompatibilità
1. Verificare associazioni esistenti (create prima della modifica)
2. Confermare: MappedDestinationField = NULL
3. Verificare: Nessun errore nell'interfaccia ✅
📚 Documentazione Creata
- MAPPED_DESTINATION_FIELD_IMPLEMENTATION.md - Documentazione tecnica completa
- KEYASSOCIATIONS_PAGE_UPDATE.md - Modifiche interfaccia utente
- TROUBLESHOOTING_MAPPED_FIELD.md - Guida diagnosi problemi
- Questo file - Riepilogo generale
🔧 Prossimi Passi
- Fermare l'applicazione in esecuzione (se attiva)
- Ricompilare:
dotnet build Data_Coupler.sln - Avviare l'applicazione
- Creare un test case:
- Mappare un campo chiave
- Eseguire trasferimento
- Verificare logging
- Controllare database
- Analizzare i log per confermare funzionamento
- Riportare risultati per ulteriori fix se necessario
📋 Checklist Verifica
- Campo aggiunto al modello
- Migration creata e applicata
- Logica popolamento implementata
- UI aggiornata (tabella, dettagli, export)
- Logging diagnostico aggiunto
- Validazione campo mappato implementata
- Documentazione completa
- Test eseguiti e verificati ← DA FARE
- Conferma funzionamento ← DA VERIFICARE
Status: 🟡 IMPLEMENTATO - IN ATTESA DI TEST
Tutte le modifiche sono state implementate. Il sistema è pronto per il testing per verificare che il campo venga popolato correttamente.