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,229 @@
|
||||
# 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`
|
||||
|
||||
```csharp
|
||||
[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 API
|
||||
- `StartDataTransferOriginal()` - Popola il campo durante trasferimenti standard
|
||||
|
||||
**Logica Implementata**:
|
||||
```csharp
|
||||
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:
|
||||
|
||||
```csharp
|
||||
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
|
||||
|
||||
1. **Campo Chiave Non Mappato** ⚠️
|
||||
- L'utente seleziona un campo chiave che NON è stato incluso nei mapping
|
||||
- Soluzione: Verificare che il campo chiave sia mappato
|
||||
|
||||
2. **Case Sensitivity**
|
||||
- Il nome del campo potrebbe non corrispondere esattamente
|
||||
- Soluzione: Verificare maiuscole/minuscole
|
||||
|
||||
3. **Spazi o Caratteri**
|
||||
- Presenza di spazi all'inizio/fine
|
||||
- Soluzione: Trim automatico durante mapping
|
||||
|
||||
### Come Diagnosticare
|
||||
|
||||
1. **Abilitare logging Debug** in `appsettings.Development.json`:
|
||||
```json
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Data_Coupler.Pages.DataCoupler": "Debug"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
2. **Eseguire un trasferimento** e monitorare i log
|
||||
|
||||
3. **Cercare righe "MAPPING DEBUG"**:
|
||||
- Se trovato: `MappedField: cardcode__c` ✅
|
||||
- Se NON trovato: `Campo chiave 'X' NON trovato nei mappings!` ❌
|
||||
|
||||
4. **Verificare database**:
|
||||
```sql
|
||||
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**
|
||||
```json
|
||||
{
|
||||
"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**
|
||||
```json
|
||||
{
|
||||
"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
|
||||
|
||||
1. **MAPPED_DESTINATION_FIELD_IMPLEMENTATION.md** - Documentazione tecnica completa
|
||||
2. **KEYASSOCIATIONS_PAGE_UPDATE.md** - Modifiche interfaccia utente
|
||||
3. **TROUBLESHOOTING_MAPPED_FIELD.md** - Guida diagnosi problemi
|
||||
4. **Questo file** - Riepilogo generale
|
||||
|
||||
## 🔧 Prossimi Passi
|
||||
|
||||
1. **Fermare l'applicazione in esecuzione** (se attiva)
|
||||
2. **Ricompilare**: `dotnet build Data_Coupler.sln`
|
||||
3. **Avviare l'applicazione**
|
||||
4. **Creare un test case**:
|
||||
- Mappare un campo chiave
|
||||
- Eseguire trasferimento
|
||||
- Verificare logging
|
||||
- Controllare database
|
||||
5. **Analizzare i log** per confermare funzionamento
|
||||
6. **Riportare risultati** per ulteriori fix se necessario
|
||||
|
||||
## 📋 Checklist Verifica
|
||||
|
||||
- [x] Campo aggiunto al modello
|
||||
- [x] Migration creata e applicata
|
||||
- [x] Logica popolamento implementata
|
||||
- [x] UI aggiornata (tabella, dettagli, export)
|
||||
- [x] Logging diagnostico aggiunto
|
||||
- [x] Validazione campo mappato implementata
|
||||
- [x] 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.
|
||||
Reference in New Issue
Block a user