- Modificato OnDatabaseCredentialChanged per rilevare connessioni ODBC e forzare useCustomQuery = true
- Aggiunto metodo helper IsOdbcConnection() per verificare tipo credenziale
- Modificata UI DataCoupler.razor:
* Nascosto pulsante 'Connetti e Scopri Schema' per ODBC
* Mostrato messaggio esplicativo per ODBC
* Resa sezione Query Custom sempre visibile per ODBC (senza discovery)
* Nascosta sezione Lista Tabelle per ODBC
- Modificato ValidateCustomQuery per creare temporaneamente DatabaseManager per ODBC
- ODBC ora bypassa completamente il discovery e va diretto a query custom
- Aggiunta persistenza campi ODBC (OdbcDsnName, OdbcMode) in CredentialEntity
- Creata migration EF Core per nuovi campi database
- Aggiornato mapping credenziali per caricare/salvare dati ODBC
- Creato OdbcDatabaseManager dedicato (bypass EF Core che non supporta ODBC)
- Aggiornato DataConnectionFactory per usare OdbcDatabaseManager con connessioni ODBC
- Fix auto-load DSN: sostituito @onchange con @bind-Value:after in dropdown tipo database
- Fix test connessione SAP HANA: rimossa query SELECT 1 che causava errori sintassi
- Implementati tutti i metodi IDatabaseManager in OdbcDatabaseManager
- Supporto completo per discovery schema, tabelle e query ODBC
Risolve problema DbContext non configurato per ODBC e abilita connessioni ODBC complete.
- Aggiunto MinVer per calcolo automatico versione da git tags
- Creato modello VersionInfo e servizio VersionService
- Integrato display versione nel NavMenu (Data_Coupler v2.1.0)
- Aggiornato workflow Gitea Actions (Linux e Windows) per generare version.json
- Risolto problema inconsistenza versioning tra container Linux e Windows
- Documentazione completa: VERSIONING_SYSTEM.md e MINVER_SETUP.md
- Versione ora calcolata automaticamente da git tags (Semantic Versioning)
- 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
- Disabilitata completamente la sincronizzazione eliminazioni nei trasferimenti manuali (DataCoupler.razor.cs)
- Aggiunto campo EnableDeletionSync al modello ProfileSchedule (default: false)
- Implementata logica condizionale in ScheduledProfileExecutionService per deletion sync
- Aggiunta sezione 'Opzioni Avanzate' nell'interfaccia schedulazione con warning
- Creata migration Entity Framework AddEnableDeletionSyncToProfileSchedule
- Aggiornato BackupModels per supporto backup/restore del nuovo campo
- Aggiornata documentazione README.md e copilot-instructions.md
- La deletion sync è ora disponibile solo per schedulazioni con configurazione esplicita per massima sicurezza
Creato AssociationService per eliminare duplicazione codice e migliorare manutenibilità
Nuovo servizio:
- Data_Coupler/Services/AssociationService.cs (276 righe)
* Interfaccia IAssociationService con metodi pubblici
* PreDiscoveryRequest DTO per parametri configurabili
* FindOrCreateAssociationAsync(): ricerca locale + Pre-Discovery REST
* IsPreDiscoveryAssociation(): verifica marker associazioni Pre-Discovery
Refactoring DataCoupler.razor.cs:
- Injected IAssociationService nel componente
- StartDataTransferOriginal(): ridotto da 98 a 20 righe (-78)
- StartDataTransferWithComposite(): ridotto da 93 a 20 righe (-73)
- Verifica Pre-Discovery: ridotto da 20 a 2 righe (-18)
- Sostituito logica inline con chiamate al servizio centralizzato
Refactoring ScheduledProfileExecutionService.cs:
- Injected IAssociationService nel costruttore
- ExecuteDataTransferWithCompositeAsync(): ridotto da 99 a 20 righe (-79)
- Verifica Pre-Discovery: ridotto da 20 a 2 righe (-18)
- Parametro IsScheduledTransfer=true per tracciabilità
Dependency Injection:
- Registrato IAssociationService in Program.cs come Scoped
- Disponibile per dependency injection in tutti i componenti
Vantaggi:
- Eliminata duplicazione: 3 implementazioni → 1 servizio centralizzato
- Codice ridotto di 266 righe (330 → 64 nelle chiamate)
- Manutenibilità: modifiche future in un solo file
- Testabilità: interfaccia facilmente mockabile per unit test
- Riusabilità: servizio disponibile per futuri componenti
- Separazione responsabilità: logica associazioni isolata
Comportamento invariato:
- Nessuna modifica alla logica Pre-Discovery esistente
- Compatibilità completa con database e API
- Stessi marker e metadata nelle associazioni create
Docs: PRE_DISCOVERY_REFACTORING.md
Build: ✅ Successo (0 errori, 25 warning pre-esistenti)
- Fix FindEntitiesByKeysAsync: SOQL query universale al posto di External ID GET
* Disabilitato External ID GET (funziona solo per campi marcati External ID)
* Query SOQL come metodo primario funzionante per tutti i campi
* Logging dettagliato per diagnostica ricerche Salesforce
- Pre-Discovery nei trasferimenti manuali (DataCoupler.razor.cs)
* Ricerca automatica nella destinazione quando KeyAssociation non esiste
* Creazione associazione con marker CreatedBy="PreDiscovery"
* Aggiornamento forzato senza controllo hash per associazioni Pre-Discovery
* Supporto parallel processing thread-safe
- Pre-Discovery nei trasferimenti schedulati (ScheduledProfileExecutionService.cs)
* Logica identica a trasferimenti manuali
* Marker aggiuntivo ScheduledTransfer=true per tracciabilità
* Aggiornamento forzato per prima sincronizzazione
- Sistema aggiornamento forzato
* Verifica AdditionalInfo per identificare associazioni Pre-Discovery
* Skip controllo hash per associazioni appena scoperte
* Garantisce sincronizzazione dati al primo trasferimento
Vantaggi:
- Prevenzione automatica duplicati in Salesforce
- Recupero record esistenti senza associazioni
- Parità funzionale tra esecuzioni manuali e schedulate
- Performance ottimizzate con controllo hash per esecuzioni successive
Docs: PRE_DISCOVERY_SYSTEM.md, PRE_DISCOVERY_FORCED_UPDATE.md, SALESFORCE_FIND_ENTITIES_FIX.md
- 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
BREAKING CHANGE: Tutte le pagine ora richiedono autenticazione
Nuove funzionalità:
- Sistema di login con password hardcoded (admin123)
- Form di login full-screen con gradiente viola
- Protezione automatica di tutte le route
- Pulsante logout visibile in tutte le pagine
- Gestione thread-safe eventi autenticazione con InvokeAsync()
Componenti:
- AuthenticationService: servizio Singleton per gestione stato
- Login.razor: pagina login con validazione e messaggi errore
- App.razor: routing condizionale basato su autenticazione
- MainLayout.razor: pulsante logout integrato
Fix tecnici:
- Risolto errore "Dispatcher not associated" usando InvokeAsync()
- Implementato pattern corretto per eventi cross-thread in Blazor Server
- Aggiunto Dispose per prevenire memory leak
Aggiunta funzionalità completa per l'eliminazione sicura delle credenziali
con rimozione automatica di tutti i dati associati.
Modifiche principali:
Backend:
- Aggiunta interfaccia ICredentialService.DeleteCredentialCascadeAsync()
- Implementato CredentialService.DeleteCredentialCascadeAsync() con gestione transazionale
- Aggiornata IDataConnectionCredentialService con metodi cascade delete
- Implementati wrapper in DataConnectionCredentialService
Eliminazione cascata gestisce:
- Execution histories delle schedulazioni
- Profile schedules associate ai profili
- Data Coupler profiles che usano le credenziali
- Key associations per credenziali REST
- Credenziale stessa
Frontend (CredentialManagement.razor):
- Aggiunto modale Bootstrap di conferma eliminazione con design danger
- Messaggio di attenzione chiaro che elenca cosa verrà eliminato
- Refactoring metodo DeleteCredential() per usare modale invece di confirm JS
- Aggiunti metodi CloseDeleteConfirmModal() e ConfirmDeleteCredential()
Sicurezza:
- Eliminazione fisica (hard delete) con transazione database
- Rollback automatico in caso di errore
- Logging dettagliato di ogni operazione
- Conferma esplicita dell'utente richiesta
- Aggiunge classe CachedRestClient per tracciare client con hash delle credenziali
- Implementa verifica automatica delle credenziali dal database tramite hash SHA256
- Mantiene cache dei client REST autenticati preservando lo stato di autenticazione
- Invalida automaticamente la cache quando le credenziali cambiano nel database
- Aggiunge logging dettagliato per debug dell'autenticazione Salesforce
- Migliora mappatura credenziali Salesforce con validazione Password e ClientSecret
BREAKING CHANGE: Le credenziali REST vengono sempre verificate dal database
mantenendo performance attraverso cache intelligente basata su hash crittografico
Fixes: risolve problemi di "invalid_client_id" intermittenti e _accessToken null
- Aggiunge configurazione JsonSerializerOptions per garantire compatibilità con Salesforce
- Implementa normalizzazione automatica di valori numerici con virgola decimale (es. "0,00" → 0.00)
- Sostituisce PostAsJsonAsync con StringContent personalizzato per controllo completo della serializzazione
- Aggiunge metodi NormalizeNumericValues e IsNumericWithComma per conversione formato decimale
- Aggiorna TransformValue per utilizzare InvariantCulture nelle conversioni numeriche
- Applica normalizzazione in CreateEntityAsync e metodi Composite (BatchCreate/BatchUpdate)
- Aggiunge logging dettagliato per tracciare le normalizzazioni numeriche
Risolve: "Impossibile deserializzare l'istanza di double da VALUE_STRING valore 0,00"
- Il problema era causato dall'invio di valori decimali nel formato italiano (virgola)
invece del formato americano (punto) richiesto da Salesforce API
- La soluzione garantisce che tutti i valori numerici vengano sempre serializzati
nel formato corretto per Salesforce indipendentemente dalla cultura locale
- Aggiunge colonna "Hash Dati" nella tabella delle associazioni con visualizzazione troncata
- Implementa generazione hash SHA256 che include signature dei mapping per rilevare modifiche configurazione
- Modifica logica trasferimento per saltare record con hash identico (ottimizzazione prestazioni)
- Corregge UpdateAssociationAsync per persistere correttamente Data_Hash e LastVerifiedAt nel database
- Aggiorna hash solo in caso di trasferimento riuscito, mantenendo coerenza tra Salesforce e database locale
- Migliora logging per debug del sistema di hash e associazioni
Risolve il problema dei trasferimenti continui quando i mapping cambiano e ottimizza le prestazioni saltando record non modificati.
- Parallelizzazione analisi record con Task.WhenAll e ConcurrentBag
- Aggiunta metodi thread-safe per operazioni database (SaveAssociationParallelAsync, FindAssociationByKeyValueParallelAsync, DeleteAssociationParallelAsync)
- Implementazione DbContext separati per evitare race conditions Entity Framework
- Ottimizzazione performance: riduzione tempo esecuzione da sequenziale a parallelo
- Logging dettagliato con tracking tempi esecuzione e distinzione operazioni parallele
- Aggiornamento interfacce IKeyAssociationService e IDataConnectionCredentialService
- Miglioramento gestione errori con thread-safety completa
Performance: 5-10x più veloce per grandi dataset con parallelizzazione end-to-end
- Rimosso limite TOP 1000 in EFCoreDatabaseManager.GetAllRecordsAsync
- Eliminati controlli di sicurezza con limiti automatici in DataCoupler
- Aggiornata documentazione per riflettere estrazione senza limiti
- Supporto completo per dataset di grandi dimensioni
- Mantenuto batching automatico Salesforce (25 record/batch) in parallelo
Ora il sistema supporta l'estrazione completa di tabelle e query custom
senza restrizioni artificiali, ideale per migrazioni e use cases enterprise.
- Estrazione logica database in DatabaseMethod.cs con tutte le proprietà e metodi protected
- Estrazione logica REST API in RESTMethod.cs con gestione completa delle connessioni
- Creazione DataCouplerModels.cs per modelli condivisi (TransferResult)
- Pulizia file principale DataCoupler.razor.cs mantenendo solo orchestrazione generale
- Rimozione codice duplicato e miglioramento separazione delle responsabilità
- Compilazione verificata senza errori per l'intera soluzione
Struttura finale:
- DataCoupler.razor.cs: gestione file, profili, UI e coordinamento
- DatabaseMethod.cs: connessioni DB, query custom, discovery tabelle/schemi
- RESTMethod.cs: autenticazione REST, discovery entità, metadata
- DataCouplerModels.cs: modelli comuni per
- Implementato supporto per percorsi database specifici per OS (Windows, Linux, macOS)
- Rimossi file temporanei e di test non necessari dal CredentialManager
- Aggiunto supporto per directory di sistema standard per il database delle credenziali
- Mantenuto il codice legacy commentato per retrocompatibilità
- Aggiunte cartelle di test per future implementazioni
- Aggiunto campo SourceCustomQuery al modello DataCouplerProfile e DTO
- Creata migrazione database per la nuova colonna SourceCustomQuery
- Aggiornato DataCouplerProfileService per gestire il mapping della query custom
- Modificato ProfileSaver per includere la query custom nel salvataggio
- Implementata logica di caricamento profili con supporto query custom:
* Popolamento automatico della textbox con query salvata
* Validazione ed esecuzione automatica della query al caricamento
* Caricamento anteprima dati e mapping dopo validazione query
* Gestione priorità: query custom ha precedenza sulla selezione tabella
- Aggiornato DataCoupler.razor per passare la query custom al ProfileSaver
- Corretto salvataggio profili esistenti per includere SourceCustomQuery
Il sistema ora permette di salvare e ripristinare completamente le configurazioni
con query SQL personalizzate, mantenendo il comportamento esistente per le
✨ Nuove funzionalità:
- Aggiunto campo SourceDatabaseName nella tabella DataCouplerProfiles
- Implementato recupero automatico del nome database dalle credenziali
- Migliorata applicazione profili con supporto database specifico
- Aggiornata logica di connessione database con selezione database
🔧 Modifiche tecniche:
- Aggiunta migration per colonna SourceDatabaseName
- Estesi modelli DataCouplerProfile e DataCouplerProfileDto
- Aggiornato DataCouplerProfileService per gestire nuovo campo
- Modificato ProfileSaver per recupero automatico database name
- Implementato metodo ConnectToDatabaseWithSpecificDatabase
🐛 Correzioni:
- Migliorata gestione connessioni database multi-database
- Corretta formattazione codice e spaziature
- Rimosse linee vuote eccessive nel codice sorgente
🧪
- Aggiunto metodo GetCredentialIdByNameAsync in CredentialService per recuperare ID credenziali per nome
- Implementata gestione robusta dei profili duplicati con riattivazione, sovrascrittura e auto-rinomina
- Migliorata logica di caricamento profili con simulazione workflow utente e logging dettagliato
- Fixata gestione errori UNIQUE constraint nel salvataggio profili
- Aggiunto supporto per salvataggio ID credenziali reali invece di placeholder
- Implementato metodo GetProfileByNameIncludingInactiveAsync per gestire profili inattivi
- Aggiunto logging esteso per debug e troubleshooting
- Integrato componente ProfileSaver nella UI principale
- Risolti errori di compilazione e validazione build completa
- Migliorata gestione errori con feedback utente per credenziali/entità mancanti
- Sostituito EnsureCreatedAsync con MigrateAsync nel DatabaseInitializer
- Aggiunta gestione automatica delle migrazioni pendenti al startup
- Migliorata verifica delle tabelle includendo DataCouplerProfiles
- Rimossa logica obsoleta di ApplyMigrationsAsync
- Risolto errore "no such table: DataCouplerProfiles" nel salvataggio profili
Questo fix garantisce che tutte le migrazioni vengano applicate correttamente,
permettendo il corretto funzionamento del sistema di salvataggio
- Refactoring logica connessione database per gestire database specificato/non specificato
- Implementazione selezione database tramite modale quando necessario
- Aggiunta discovery robusta di tabelle, colonne e preview dati
- Implementazione validazione completa query custom (solo SELECT, blocco SQL injection)
- Aggiunta preview paginata dati per query custom
- Implementazione mapping automatico dei campi
- Implementazione auto-selezione chiave primaria:
* Per tabelle database: rilevamento automatico PK
* Per query custom: ricerca pattern comuni (id, key, etc.)
* Per file Excel/CSV: ricerca pattern italiani (codice, numero, etc.)
- Aggiunta logging dettagliato per debugging e tracciamento flusso
- Implementazione sistema associazioni con fallback robusto
- Miglioramento gestione errori e validazioni input utente
- Test funzionali completi e validazione end-to-end
Il sistema ora supporta completamente il flusso di estrazione dati da database/file
verso API REST con gestione automatica delle chiavi e mapping intelligente.
- Modifica IsDatabaseSpecifiedInConnectionString per verificare prima il campo DatabaseName della credenziale
- Aggiunge logging dettagliato per debugging del processo di connessione database
- Corregge il flusso di connessione per evitare il modale quando il database è già specificato
- Migliora la gestione degli errori nel caricamento tabelle dal database specificato
- Rimuove codice non raggiungibile nella logica di connessione database
Il bug precedente mostrava sempre il modale di selezione database anche quando
il database era specificato nel campo DatabaseName della credenziale, ora la
verifica segue la logica corretta:
1. Controlla se DatabaseName è valorizzato nella credenziale
2. Solo se vuoto, verifica i parametri Database=/Initial Catalog= nella connection string
- Corretto metodo ValidateCustomQuery per utilizzare CreateLimitedQuery con sintassi specifica per ogni tipo di database
- Rimosso uso diretto di "LIMIT 1" che causava errori su SQL Server e Oracle
- Implementato supporto per sintassi corretta: TOP (SQL Server), ROWNUM (Oracle), LIMIT (MySQL/PostgreSQL/SQLite), FETCH FIRST (DB2)
- Aggiunto messaggio di successo verde nella UI per query valide
- Migliorata gestione degli errori nella validazione con logging dettagliato
- La validazione ora funziona correttamente su tutti i database supportati (SQL Server, Oracle, MySQL, PostgreSQL, SQLite, DB2, SAP HANA)
- Aggiunge nuova pagina ProfilesManagement (/profiles) con dashboard completo
- Implementa statistiche profili (totali, attivi, recenti, non utilizzati)
- Aggiunge filtri avanzati per ricerca e ordinamento profili
- Implementa visualizzazione dettagli profili con mappature campi
- Aggiunge funzionalità di eliminazione profili con conferma
- Implementa esportazione profili in formato JSON
- Aggiunge sistema di notifiche toast per feedback utente
- Integra navigazione nel menu principale
- Risolve errori di compilazione e duplicazione file
- Migliora UX con design responsive e interfaccia moderna
- Implementato discovery intelligente database vs schemi per ogni DBMS
- Aggiornate query SQL per mostrare solo database effettivi (non ruoli/schemi di sistema)
- Aggiunta UI modal per selezione database con riconnessione automatica
- Aggiunta UI modal fallback per selezione schema quando necessario
- Migliorate query discovery per SQL Server, PostgreSQL, MySQL e Oracle
- Implementata logica di riconnessione automatica al database selezionato
- Aggiornati testi e descrizioni dell'interfaccia per maggiore chiarezza
- Gestione prioritaria: database disponibili fallback su schemi se necessario
Fixes: Menu selezione mostrava ruoli invece dei database reali
- Creata nuova libreria Components con componenti Blazor riutilizzabili
* ProfileSelector: dropdown per selezione profili salvati
* ProfileSaver: componente per salvare configurazioni correnti come profili
* ProfileManagement: modale per gestione profili salvati
* ProfileQuickActions: bottoni azioni rapide per operazioni sui profili
- Esteso CredentialManager con entità e servizi per DataCouplerProfile
* Aggiunto modello DataCouplerProfile con configurazioni mapping e metadati
* Implementata migrazione Entity Framework per memorizzazione profili
* Creato DataCouplerProfileService per operazioni CRUD
* Aggiunto CredentialDbContextFactory per operazioni database design-time
- Migliorato componente principale DataCoupler con integrazione profili
* Integrata funzionalità caricamento/salvataggio profili
* Aggiunto selettore profili nella parte superiore dell'interfaccia
* Mantenuta retrocompatibilità con funzionalità esistenti
* Migliorata esperienza utente con gestione configurazioni salvate
- Aggiornata struttura progetto e dipendenze
* Aggiunto progetto Components alla soluzione
* Aggiornati riferimenti progetti e import
* Rimosso progetto obsoleto TestDatabaseFix
Questo aggiornamento migliora significativamente il flusso di lavoro permettendo agli utenti di salvare, caricare e gestire configurazioni complete di accoppiamento dati come
**Refactoring: Separazione logica C# da markup Razor nel componente DataCoupler**
**Modifiche principali:**
- Spostamento di tutta la logica C# dal file DataCoupler.razor al file DataCoupler.razor.cs come partial class
- Rimozione completa del blocco @code dal file .razor mantenendo solo il markup HTML/Razor
- Aggiunta delle using directive mancanti (System.Data, System.Text, ExcelDataReader, ecc.)
- Correzione delle firme dei metodi e degli handler di eventi per la compatibilità Blazor
- Sistemazione delle proprietà di iniezione dei servizi [Inject] nel code-behind
- Risoluzione di tutti gli errori di compilazione relativi alla separazione dei file
**Miglioramenti strutturali:**
- Migliore separazione delle responsabilità tra presentazione e logica business
- Struttura del codice più pulita e manutenibile seguendo le best practice Blazor
- Codice più facilmente testabile con la logica isolata nel file .cs
- Rimozione di codice duplicato e ottimizzazione delle funzioni di utilità
**File modificati:**
- Data_Coupler/Pages/DataCoupler.razor: Pulizia markup, rimozione blocco @code
- Data_Coupler/Pages/DataCoupler.razor.cs: Implementazione completa della logica C# come partial class
Questo refactoring migliora significativamente la struttura del codice seguendo le convenzioni standard di Blazor per la separazione tra markup e logica applicativa.
- Implementato controllo di sicurezza per bloccare query non SELECT
- Aggiunta funzione IsSelectQuery() con validazione robusta
- Bloccate operazioni pericolose: INSERT, UPDATE, DELETE, DROP, CREATE, ALTER, TRUNCATE, EXEC, etc.
- Implementata pulizia query per prevenire bypass tramite commenti SQL
- Aggiunto controllo per multiple statements separati da ;
- Aggiunto avviso di sicurezza nell'interfaccia utente
- Implementato logging di sicurezza per audit e debug
- Controllo applicato sia in validazione che in esecuzione per doppia protezione
Il sistema ora garantisce che solo query SELECT possano essere eseguite,
mantenendo la sicurezza del database e prevenendo operazioni di modifica non autorizzate.
BREAKING CHANGE: Rimosso completamente il vecchio sistema RecordAssociation
Modifiche principali:
- Sostituito RecordAssociation con KeyAssociation basato sui valori delle chiavi
- Implementata logica robusta di UPDATE vs INSERT basata su associazioni esistenti
- Aggiunta normalizzazione delle chiavi (.Trim()) per consistenza
- Implementato fallback nella ricerca associazioni per maggiore affidabilità
- Sostituita verifica pre-UPDATE con tentativo diretto più efficiente
Componenti modificati:
- Nuovo modello: KeyAssociation.cs con campi ottimizzati
- Nuovo servizio: KeyAssociationService.cs con metodi completi
- Aggiornato: DataCoupler.razor con logica migliorata di gestione associazioni
- Aggiornato: CredentialDbContext per gestire solo KeyAssociations
- Aggiornati: tutti i servizi di interfaccia per supportare il nuovo sistema
- Creata: pagina KeyAssociations.razor per gestione associazioni
- Aggiornato: NavMenu.razor con link alla gestione associazioni
Miglioramenti tecnici:
- Logica di UPDATE più robusta: tenta direttamente l'aggiornamento invece di verificare prima l'esistenza
- Gestione errori migliorata con cleanup automatico delle associazioni non valide
- Debug logging estensivo per troubleshooting
- Fallback nella ricerca associazioni se parametri specifici falliscono
- Normalizzazione valori chiave per prevenire problemi di whitespace
Risultato:
Il sistema ora previene correttamente i duplicati utilizzando le associazioni per decidere
se fare INSERT (nuovo record) o UPDATE (record esistente) basandosi sui valori delle chiavi.
Database:
- Creata migrazione EF per rimuovere RecordAssociations e aggiungere KeyAssociations
- Eliminati file e codice legacy non più necessari
- Rimossi messaggi di successo per validazione query per ridurre ingombro visivo
- Eliminati alert informativi delle colonne rilevate dalla query
- Rimossa notificazione "Query validata!" nella sezione mapping
- Mantenuti solo i messaggi di errore quando necessario
- Migliorata UX con interfaccia più pulita e focalizzata sull'essenziale
- Funzionalità di estrazione colonne e mapping completamente preservata
- Aggiunge modello RecordAssociation con migrazione database
- Implementa servizio CRUD completo per gestione associazioni
- Crea interfaccia utente avanzata per visualizzazione e gestione
- Aggiunge funzionalità di filtro, paginazione e ricerca
- Implementa azioni di massa (eliminazione, validazione, pulizia)
- Aggiunge esportazione CSV delle associazioni
- Integra validazione automatica degli ID destinazione
- Implementa logica upsert robusta con controllo validità associazioni
- Aggiunge selezione manuale chiavi per sorgenti non-database
- Migliora UI con statistiche, modali di conferma e feedback operazioni
- Refactoring completo logica trasferimento dati per utilizzare associazioni
- Aggiunge rilevamento automatico Primary Key per connessioni database
- Rimuove completamente il fallback automatico per lato sorgente
- Implementa selezione manuale obbligatoria per file e sorgenti non-DB
- Migliora UI con suggerimenti intelligenti e feedback visivo
- Aggiunge validazione multi-livello (UI, pre-transfer, runtime)
- Introduce metodo GetPrimaryKeyFieldAsync in IDatabaseManager
- Modifica GenerateSourceKey per richiedere sempre campo specifico
- Implementa controllo IsTransferButtonEnabled per validazione form
Breaking changes:
- La generazione automatica delle chiavi sorgente è stata rimossa
- Il campo chiave sorgente è ora obbligatorio quando si usa il sistema associazioni
Fixes: Risolve problema di discovery schema vuoto con selezione database
- Aggiunge selezione tipo fonte dati (database o file) nella UI
- Implementa caricamento e parsing di file Excel (.xlsx, .xls) usando ExcelDataReader
- Implementa parsing CSV con rilevamento automatico separatore (,;|\t)
- Aggiunge preview paginato dei dati file con controlli navigazione
- Estende mapping campi per supportare sia database che file
- Corregge errori strutturali HTML/Razor e gestione chiavi dizionario
- Migliora logica trasferimento dati per fonti multiple
- Aggiunge supporto encoding per file Excel legacy (.xls)
Modifiche principali:
- DataCoupler.razor: UI completa per gestione file + correzioni strutturali
- Data_Coupler.csproj: Dipendenze ExcelDataReader per supporto Excel
- Program.cs: Registrazione provider encoding per compatibilità .xls
Il sistema ora supporta completamente sia database che file come fonte dati
con parsing robusto, preview interattivo e mapping flessibile.
- Modificato GetAllRecordsAsync per utilizzare la stessa connection string del discovery schema
- Aggiunto metodo CreateConnection per creare connessioni DB appropriate per tipo
- Migliorata gestione nomi tabelle con schema (es. "dbo.OCRD")
- Rimossi metodi obsoleti di creazione entità (UpdateEntityData, CreateNewEntity)
- Eliminati riferimenti a variabili non dichiarate (newEntityData, isCreatingEntity)
- Aggiunto logging debug per connection string e query SQL
- Completata implementazione trasferimento dati da database a REST API
Il trasferimento dati ora utilizza la stessa connessione per discovery e estrazione,
risolvendo problemi di accesso alle tabelle durante l'operazione di upsert.
Sostituita Windows ProtectedData con AES-256-GCM per compatibilità multi-macchina.
Aggiunta interfaccia migrazione guidata per credenziali legacy e gestione errori completa.
- Nuovo: Servizio crittografia AES con derivazione chiavi PBKDF2
- Nuovo: Interfaccia Blazor migrazione con rilevamento credenziali
- Nuovo: Documentazione utente per risoluzione problemi
- Fix: Errori compilazione e problemi binding componenti
- Miglioramento: Credenziali portabili funzionano su qualsiasi macchina dopo migrazione una-tantum
Completamente retrocompatibile - credenziali
NUOVE FUNZIONALITÀ:
- Aggiunto modulo CredentialManager per gestione centralizzata credenziali
- Implementata UI Blazor per gestione credenziali (CredentialManagement.razor)
- Supporto completo per credenziali database (SQL Server, MySQL, PostgreSQL, Oracle, SQLite, DB2, SAP HANA)
- Gestione unificata REST API con supporto specifico per SAP B1 Service Layer e Salesforce
- Test reali di connessione per database, SAP B1 e Salesforce OAuth2
- Selezione dinamica tipo servizio REST (Generico, SAP B1, Salesforce) con campi specifici
- Persistenza sicura di credenziali con crittografia password e campi sensibili
COMPONENTI AGGIUNTI:
- CredentialManager/Models/: CredentialEntity, CredentialModels (DatabaseCredential, RestApiCredential, SapB1ServiceLayerCredential, SalesforceCredential)
- CredentialManager/Services/: CredentialService, EncryptionService, DatabaseInitializer
- CredentialManager/Data/: CredentialDbContext con Entity Framework
- DataConnection/CredentialManagement/: Interfacce e servizi di integrazione
- Data_Coupler/Pages/CredentialManagement.razor: UI completa per gestione credenziali
MIGLIORAMENTI UI:
- Form dinamica per REST API con campi specifici per tipo servizio
- Validazione campi obbligatori per Salesforce (ClientId, ClientSecret, SecurityToken)
- Test connessione in tempo reale dalla modale di inserimento/modifica
- Rimozione sezioni separate per SAP B1 e Salesforce (ora unificate in REST API)
- Gestione stato loading durante operazioni async
PERSISTENZA AVANZATA:
- Campo RestServiceType aggiunto a CredentialEntity con migrazione automatica
- Serializzazione campi specifici Salesforce/SAP B1 in AdditionalParameters JSON
- Mapping bidirezionale tra entità database e modelli business
- Gestione nullability e conversioni tipo sicure
SICUREZZA:
- Crittografia AES-256 per password e token sensibili
- Gestione sicura ConnectionString database
- Validazione input e sanitizzazione dati
TESTING E CONNETTIVITÀ:
- Test autenticazione reale SAP B1 Service Layer
- Test OAuth2 Salesforce con supporto Connected App
- Test connettività database multi-provider
- Logging dettagliato per debugging e monitoraggio
CONFIGURAZIONE:
- Dependency injection per tutti i servizi
- Configurazione Entity Framework con SQLite
- Tasks VS Code per build e run
- Gestione connection string centralizzata
CORREZIONI:
- Risolti errori nullability in CredentialService
- Aggiunto using Microsoft.JSInterop per IJSRuntime
- Fix compilazione e warning
Files modificati: 35+ file tra nuovi e aggiornati