ISyncClient
Client pour la synchronisation en lot des données entre votre système et MCM. Permet de synchroniser syndicats (avec employeurs imbriqués), employés (avec emplois et adhésions) et objets de consentement en une seule opération.
public interface ISyncClient : IBaseClient
Méthodes
Sync
Synchronise les données en lot (V2).
Task<ErrorOr<B2BSyncEmployesResultV2>> Sync(
ICollection<B2BUpdateSyndicatDtoV2> syndicatDtos,
ICollection<B2BUpsertEmployeDtoV2> employeDtos,
ICollection<B2BUpdateObjetConsentementDto> objetConsentementDtos)
Paramètres:
| Nom | Type | Description |
|---|---|---|
syndicatDtos | ICollection<B2BUpdateSyndicatDtoV2> | Syndicats à synchroniser (avec employeurs imbriqués) |
employeDtos | ICollection<B2BUpsertEmployeDtoV2> | Employés à synchroniser (avec emplois et adhésions) |
objetConsentementDtos | ICollection<B2BUpdateObjetConsentementDto> | Objets de consentement à synchroniser |
Retour: B2BSyncEmployesResultV2 contenant le résultat détaillé par entité (syndicats, employeurs, employés, emplois, adhésions, objets de consentement).
La synchronisation utilise un comportement "upsert" : les enregistrements existants sont mis à jour et les nouveaux sont créés.
En V2, les employeurs sont imbriqués dans les syndicats (B2BUpdateSyndicatDtoV2.Employeurs) et les emplois/adhésions sont imbriqués dans les employés (B2BUpsertEmployeDtoV2.Emplois, B2BUpsertEmployeDtoV2.Adhesions). Cette structure reflète les relations du domaine.
Exemple complet:
public class SyncService
{
private readonly ISyncClient _syncClient;
private readonly ILogger<SyncService> _logger;
public SyncService(ISyncClient syncClient, ILogger<SyncService> logger)
{
_syncClient = syncClient;
_logger = logger;
}
public async Task<bool> SynchroniserDonneesAsync()
{
// Préparer les syndicats avec leurs employeurs imbriqués
var syndicats = new List<B2BUpdateSyndicatDtoV2>
{
new()
{
IdentifiantExterne = "SYND-001",
Nom = "Syndicat des travailleurs",
Employeurs =
[
new()
{
IdExterne = "EMPL-001",
Nom = "Entreprise ABC Inc."
},
new()
{
IdExterne = "EMPL-002",
Nom = "Entreprise XYZ Ltée"
}
]
}
};
// Préparer les employés avec emplois et adhésions imbriqués
var employes = new List<B2BUpsertEmployeDtoV2>
{
new()
{
IdExterne = "EMP-001",
Prenom = "Jean",
Nom = "Dupont",
NoMembre = "M-001",
Courriel = "jean.dupont@example.com",
Emplois =
[
new()
{
IdentifiantExterne = "EMPLOI-001",
IdentifiantExterneEmployeur = "EMPL-001",
Matricule = "MAT-001",
DateDebut = new DateTime(2024, 1, 1)
}
],
Adhesions =
[
new()
{
IdentifiantExterneSyndicat = "SYND-001",
DateSignature = new DateTime(2024, 1, 15)
}
]
}
};
var objetsConsentement = new List<B2BUpdateObjetConsentementDto>
{
new()
{
IdExterne = "CONSENT-001",
Nom = "Communications marketing"
}
};
// Exécuter la synchronisation
var result = await _syncClient.Sync(syndicats, employes, objetsConsentement);
if (result.IsError)
{
_logger.LogError("Erreur de synchronisation: {Error}",
result.FirstError.Description);
return false;
}
// Analyser le résultat détaillé par entité
var syncResult = result.Value;
_logger.LogInformation(
"Syndicats - Ajoutés: {Added}, Modifiés: {Updated}, Erreurs: {Errors}",
syncResult.Syndicats.AddCount,
syncResult.Syndicats.UpdateCount,
syncResult.Syndicats.Erreurs.Count);
_logger.LogInformation(
"Employeurs - Ajoutés: {Added}, Modifiés: {Updated}, Erreurs: {Errors}",
syncResult.Employeurs.AddCount,
syncResult.Employeurs.UpdateCount,
syncResult.Employeurs.Erreurs.Count);
_logger.LogInformation(
"Employés - Ajoutés: {Added}, Modifiés: {Updated}, Erreurs: {Errors}",
syncResult.Employes.AddCount,
syncResult.Employes.UpdateCount,
syncResult.Employes.Erreurs.Count);
_logger.LogInformation(
"Emplois - Ajoutés: {Added}, Modifiés: {Updated}, Erreurs: {Errors}",
syncResult.Emplois.AddCount,
syncResult.Emplois.UpdateCount,
syncResult.Emplois.Erreurs.Count);
_logger.LogInformation(
"Adhésions - Ajoutés: {Added}, Modifiés: {Updated}, Erreurs: {Errors}",
syncResult.Adhesions.AddCount,
syncResult.Adhesions.UpdateCount,
syncResult.Adhesions.Erreurs.Count);
return true;
}
}
Bonnes pratiques
Synchronisation par lots
Pour de grandes quantités de données, divisez en lots :
public async Task SyncEnLotsAsync(IEnumerable<B2BUpsertEmployeDtoV2> tousLesEmployes)
{
const int tailleLot = 100;
var lots = tousLesEmployes
.Select((e, i) => new { Employe = e, Index = i })
.GroupBy(x => x.Index / tailleLot)
.Select(g => g.Select(x => x.Employe).ToList());
foreach (var lot in lots)
{
var result = await _syncClient.Sync(
Array.Empty<B2BUpdateSyndicatDtoV2>(),
lot,
Array.Empty<B2BUpdateObjetConsentementDto>());
if (result.IsError)
{
_logger.LogError("Erreur lot: {Error}", result.FirstError.Description);
// Décider si on continue ou arrête
}
// Optionnel: délai entre les lots
await Task.Delay(100);
}
}
Synchronisation incrémentale
Utilisez les dates de modification pour sync incrémentale :
public async Task SyncIncrementaleAsync(DateTime dernierSync)
{
// Récupérer seulement les employés modifiés depuis dernierSync
var employesModifies = await _votreRepository
.GetEmployesModifiesDepuis(dernierSync);
await _syncClient.Sync(
Array.Empty<B2BUpdateSyndicatDtoV2>(),
employesModifies.ToList(),
Array.Empty<B2BUpdateObjetConsentementDto>());
}
Types associés
B2BUpdateSyndicatDtoV2- DTO syndicat V2 avec employeurs imbriquésB2BUpsertEmployeDtoV2- DTO employé V2 avec emplois et adhésionsB2BUpdateObjetConsentementDto- DTO objet consentementB2BSyncEmployesResultV2- Résultat de synchronisation V2B2BSyncResult- Résultat par entité (compteurs et erreurs)