Aller au contenu principal

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

B2BCampagneSearchRequestICampagnesClient.GetAllCampagnes

ChampTypeSémantique
Etatstring?Exact (Brouillon, Planifie, VoteOuvert, Termine, Archive)
Titrestring?Contains (case-insensitive côté serveur)
OuvertureApresDateTime?OuvertureDuVoteUtc >= Apres
FermetureAvantDateTime?FermetureDuVoteUtc <= Avant

B2BVotantSearchRequestIVotantsClient.GetVotantsByCampagne

ChampTypeSémantique
Courrielstring?Contains
Identifiantstring?Exact
Nomstring?Contains sur Nom ou Prenom
DroitDeVotebool?Exact
EstRadiebool?Exact
AVotebool?Exact

B2BListeElectoraleSearchRequestIListeElectoraleClient.GetListeElectorale

ChampTypeSémantique
Identifiantstring?Exact
Courrielstring?Contains
Nomstring?Contains sur Nom ou Prenom
DroitDeVotebool?Exact
AVotebool?Exact
SyndicatIdExternestring?Exact

B2BAdhesionSearchRequestV2ISignatureClient.SearchSignaturesV2

ChampTypeSémantique
ApresDateTime?DateSignature >= Apres
AvantDateTime?DateSignature <= Avant
IdExterneSyndicatstring?Exact
IdExterneEmployestring?Exact
NoMembrestring?Exact
ASignatureManuscriptebool?true = seulement avec signature ; false = seulement sans
AvecPaiementbool?true = lié à un paiement ; false = sans paiement

B2BAdhesionSearchRequest (V1) — ISignatureClient.GetSignaturesDepuis

ChampTypeSémantique
ApresDateTime?DateSignature >= Apres
IdExternestring?Exact (employé)

V2 est recommandé — V1 n'accepte qu'une fenêtre « depuis ».

B2BConsentementSearchRequestIConsentementClient.GetConsentementsDepuis

ChampTypeSémantique
ApresDateTime?DateConsentement >= Apres
IdExternestring?Exact (employé)

B2BEmploiSearchRequestIEmploisClient.SearchEmplois

ChampTypeSémantique
IdExterneSyndicatstring?Exact (via Employeur)
IdExterneEmployeurstring?Exact
IdExterneEmployestring?Exact
Matriculestring?Exact
Actifbool?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 DateSignature desc pour les adhésions, Id pour 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 : Apres et Avant sont inclusifs côté MCM. Pour éviter les doublons, décalez de 1 tick ou dédupliquez par IdUniqueAdhesion.

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

VolumeApproche
< 1 000 enregistrementsUn seul appel, pas d'optimisation
1 000 – 10 000Filtre serveur (date range, syndicat, etc.) — 1 à 5 appels
10 000 – 100 000Sync incrémental, stocker un curseur, lots de 30 jours
> 100 000Contactez votre représentant MCM — un endpoint d'export/instantané peut être envisagé

Voir aussi