Recherche et filtrage
Référence des *SearchRequest DTO exposés par l'API B2B. Aucun endpoint n'implémente de pagination serveur explicite — chaque recherche retourne l'ensemble complet des résultats filtrés. Ce guide décrit les filtres disponibles, les conventions de sérialisation, et les patterns pour les gros volumes.
Principe général : les filtres sont combinés en AND. Un filtre null = pas de filtrage sur ce champ.
1. Catalogue des filtres
B2BCampagneSearchRequest — ICampagnesClient.GetAllCampagnes
| Champ | Type | Sémantique |
|---|---|---|
Etat | string? | Exact (Brouillon, Planifie, VoteOuvert, Termine, Archive) |
Titre | string? | Contains (case-insensitive côté serveur) |
OuvertureApres | DateTime? | OuvertureDuVoteUtc >= Apres |
FermetureAvant | DateTime? | FermetureDuVoteUtc <= Avant |
B2BVotantSearchRequest — IVotantsClient.GetVotantsByCampagne
| Champ | Type | Sémantique |
|---|---|---|
Courriel | string? | Contains |
Identifiant | string? | Exact |
Nom | string? | Contains sur Nom ou Prenom |
DroitDeVote | bool? | Exact |
EstRadie | bool? | Exact |
AVote | bool? | Exact |
B2BListeElectoraleSearchRequest — IListeElectoraleClient.GetListeElectorale
| Champ | Type | Sémantique |
|---|---|---|
Identifiant | string? | Exact |
Courriel | string? | Contains |
Nom | string? | Contains sur Nom ou Prenom |
DroitDeVote | bool? | Exact |
AVote | bool? | Exact |
SyndicatIdExterne | string? | Exact |
B2BAdhesionSearchRequestV2 — ISignatureClient.SearchSignaturesV2
| Champ | Type | Sémantique |
|---|---|---|
Apres | DateTime? | DateSignature >= Apres |
Avant | DateTime? | DateSignature <= Avant |
IdExterneSyndicat | string? | Exact |
IdExterneEmploye | string? | Exact |
NoMembre | string? | Exact |
ASignatureManuscripte | bool? | true = seulement avec signature ; false = seulement sans |
AvecPaiement | bool? | true = lié à un paiement ; false = sans paiement |
B2BAdhesionSearchRequest (V1) — ISignatureClient.GetSignaturesDepuis
| Champ | Type | Sémantique |
|---|---|---|
Apres | DateTime? | DateSignature >= Apres |
IdExterne | string? | Exact (employé) |
V2 est recommandé — V1 n'accepte qu'une fenêtre « depuis ».
B2BConsentementSearchRequest — IConsentementClient.GetConsentementsDepuis
| Champ | Type | Sémantique |
|---|---|---|
Apres | DateTime? | DateConsentement >= Apres |
IdExterne | string? | Exact (employé) |
B2BEmploiSearchRequest — IEmploisClient.SearchEmplois
| Champ | Type | Sémantique |
|---|---|---|
IdExterneSyndicat | string? | Exact (via Employeur) |
IdExterneEmployeur | string? | Exact |
IdExterneEmploye | string? | Exact |
Matricule | string? | Exact |
Actif | bool? | true = DateFin IS NULL |
2. Sérialisation
Les *SearchRequest sont envoyés en query string ([FromQuery] côté contrôleur).
Dates
Format ISO 8601 avec offset. Le SDK utilise DateTime.ToString("O") :
?ouvertureApres=2026-04-01T00%3A00%3A00.0000000Z
Côté consommateur HTTP direct :
?apres=2026-04-24T00:00:00Z
Booléens
true / false (minuscules).
Chaînes
Encodage URL automatique côté SDK (Uri.EscapeDataString). Côté appel HTTP brut, encodez vous-même les caractères spéciaux.
Champs null
Non envoyés — c'est la différence entre "filtrer par valeur nulle" (impossible ici) et "ne pas filtrer ce champ".
3. Exemples
Fenêtre glissante pour signatures V2
var from = DateTime.UtcNow.AddDays(-1);
var to = DateTime.UtcNow;
var result = await signatureClient.SearchSignaturesV2(new B2BAdhesionSearchRequestV2
{
Apres = from,
Avant = to,
IdExterneSyndicat = "SYND001"
});
Votants actifs qui n'ont pas voté
var nonVotes = await votantsClient.GetVotantsByCampagne(campagneId, new B2BVotantSearchRequest
{
DroitDeVote = true,
EstRadie = false,
AVote = false
});
Campagnes planifiées ce trimestre
var result = await campagnesClient.GetAllCampagnes(new B2BCampagneSearchRequest
{
Etat = "Planifie",
OuvertureApres = new DateTime(DateTime.UtcNow.Year, (DateTime.UtcNow.Month - 1) / 3 * 3 + 1, 1),
FermetureAvant = new DateTime(DateTime.UtcNow.Year, (DateTime.UtcNow.Month - 1) / 3 * 3 + 4, 1)
});
Adhésions sans paiement ni signature manuscrite
var result = await signatureClient.SearchSignaturesV2(new B2BAdhesionSearchRequestV2
{
ASignatureManuscripte = false,
AvecPaiement = false
});
4. Pagination — absente côté serveur
Aucun endpoint B2B n'expose aujourd'hui de pageSize / pageNumber / curseur. Les recherches retournent l'ensemble des résultats filtrés. Conséquences :
- Un
GetAllEmployes()sur un client avec 100 000 membres est lent et gourmand en mémoire côté client et serveur. - Pas de tri exposé — l'ordre est déterminé côté MCM (habituellement
DateSignaturedesc pour les adhésions,Idpour les CRUD).
Stratégies de « pagination » côté consommateur
a. Fenêtre temporelle glissante (adhésions, consentements)
var cursor = DateTime.UtcNow.AddYears(-1);
var step = TimeSpan.FromDays(30);
while (cursor < DateTime.UtcNow)
{
var end = cursor + step;
var batch = await signatureClient.SearchSignaturesV2(new B2BAdhesionSearchRequestV2
{
Apres = cursor,
Avant = end > DateTime.UtcNow ? DateTime.UtcNow : end
});
if (batch.IsError) throw new Exception(batch.FirstError.Description);
await ProcessBatch(batch.Value);
cursor = end;
}
Attention aux chevauchements :
ApresetAvantsont inclusifs côté MCM. Pour éviter les doublons, décalez de 1 tick ou dédupliquez parIdUniqueAdhesion.
b. Filtrage par syndicat / employeur
Pour les listes indépendantes du temps (employés, emplois), segmentez par référentiel :
foreach (var syndicat in await syndicatsClient.GetAllSyndicats().Value)
{
var emplois = await emploisClient.SearchEmplois(new B2BEmploiSearchRequest
{
IdExterneSyndicat = syndicat.IdentifiantExterne,
Actif = true
});
// Traiter le sous-ensemble
}
c. Sync incrémental
Stockez LastProcessedAt de votre côté, passez-le en Apres à l'appel suivant. C'est le pattern standard pour les adhésions et les consentements.
5. Cohérence des lectures
L'API B2B lit depuis la base principale (pas de réplica décalé). Les écritures précédentes sont visibles immédiatement sur les lectures suivantes (read-after-write).
Exceptions :
- Stats de campagne (
GetCampagneStats) — peut utiliser un cache avec TTL court (≤ 30s) en haute charge. Les compteurs d'une campagne très récente peuvent légèrement décaler. - Recherches agrégées qui traversent plusieurs agrégats (ex. liste électorale) — cohérence éventuelle au niveau d'une seule transaction logique serveur.
En pratique : ne dépendez pas d'une cohérence globale entre endpoints ; validez votre état de votre côté après opérations critiques.
6. Recommandations volume
| Volume | Approche |
|---|---|
| < 1 000 enregistrements | Un seul appel, pas d'optimisation |
| 1 000 – 10 000 | Filtre serveur (date range, syndicat, etc.) — 1 à 5 appels |
| 10 000 – 100 000 | Sync incrémental, stocker un curseur, lots de 30 jours |
| > 100 000 | Contactez votre représentant MCM — un endpoint d'export/instantané peut être envisagé |
Voir aussi
- Référence HTTP — endpoints.md
ISignatureClient— signatures V2 avec filtres richesICampagnesClient- Guide — idempotence et retry