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​

B2BCampagneSearchRequest — ICampagnesClient.GetAllCampagnes​

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

B2BVotantSearchRequest — IVotantsClient.GetVotantsByCampagne​

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

B2BListeElectoraleSearchRequest — IListeElectoraleClient.GetListeElectorale​

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

B2BAdhesionSearchRequestV2 — ISignatureClient.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 ».

B2BConsentementSearchRequest — IConsentementClient.GetConsentementsDepuis​

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

B2BEmploiSearchRequest — IEmploisClient.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​