Files
Data-Coupler/CredentialManager/Models/KeyAssociation.cs
T
Alessio Dal Santo 20a514068a feat: implementa campo Data_Hash per ottimizzazione trasferimenti
- 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.
2025-07-21 10:59:50 +02:00

99 lines
2.8 KiB
C#

using System.ComponentModel.DataAnnotations;
namespace CredentialManager.Models;
/// <summary>
/// Entità per memorizzare le associazioni basate sui valori delle chiavi
/// Un'associazione lega un valore di chiave a un record di destinazione,
/// indipendentemente dalla sorgente che ha generato quel valore
/// </summary>
public class KeyAssociation
{
[Key]
public int Id { get; set; }
/// <summary>
/// Valore della chiave che identifica univocamente l'oggetto business
/// (es: "CUST001", "12345", "ABC-DEF-GHI")
/// </summary>
[Required]
[MaxLength(500)]
public string KeyValue { get; set; } = string.Empty;
/// <summary>
/// Nome del campo chiave nella sorgente
/// (es: "CustomerCode", "ID", "ArticleNumber")
/// </summary>
[Required]
[MaxLength(200)]
public string SourceKeyField { get; set; } = string.Empty;
/// <summary>
/// Nome del campo chiave nella destinazione
/// (es: "CardCode", "DocEntry", "ItemCode")
/// </summary>
[Required]
[MaxLength(200)]
public string DestinationKeyField { get; set; } = string.Empty;
/// <summary>
/// Nome dell'entità di destinazione
/// </summary>
[Required]
[MaxLength(200)]
public string DestinationEntity { get; set; } = string.Empty;
/// <summary>
/// ID del record di destinazione
/// </summary>
[Required]
[MaxLength(200)]
public string DestinationId { get; set; } = string.Empty;
/// <summary>
/// Nome della credenziale REST utilizzata per la destinazione
/// </summary>
[Required]
[MaxLength(100)]
public string RestCredentialName { get; set; } = string.Empty;
/// <summary>
/// Data e ora della creazione dell'associazione
/// </summary>
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
/// <summary>
/// Data e ora dell'ultimo aggiornamento
/// </summary>
public DateTime? UpdatedAt { get; set; }
/// <summary>
/// Data e ora dell'ultima verifica che il record di destinazione esiste ancora
/// </summary>
public DateTime? LastVerifiedAt { get; set; }
/// <summary>
/// Indica se l'associazione è ancora attiva
/// </summary>
public bool IsActive { get; set; } = true;
/// <summary>
/// Informazioni aggiuntive sui record che hanno contribuito a questa associazione
/// </summary>
[MaxLength(2000)]
public string? SourcesInfo { get; set; }
/// <summary>
/// Informazioni aggiuntive in formato JSON
/// </summary>
[MaxLength(2000)]
public string? AdditionalInfo { get; set; }
/// <summary>
/// Hash SHA256 dei dati dei campi sorgente mappati.
/// Utilizzato per rilevare cambiamenti nei dati sorgente e ottimizzare il trasferimento
/// </summary>
[MaxLength(64)]
public string? Data_Hash { get; set; }
}