Coter et payer un avenant
La mécanique commune à tous les types — choisir le type et le motif, coter avec PATCH, payer, suivre.
Choisir le type — GET /provider/endorsement-types
curl -s "$API/provider/endorsement-types?size=100" -H "Authorization: Bearer $TOKEN"| Champ | Description |
|---|---|
id | → endorsementId du corps de cotation |
endorsementCode | Code du type (RENOUVELLEMENT, SUSPENSION, …) |
endorsementLabel, description | Libellés |
premiumImpact | INCREASE, DECREASE, NEUTRAL, RECALCULATE |
modifiableFields | Champs attendus dans le corps de cotation pour ce type |
selectedReasons | Motifs proposés, le cas échéant |
Seuls les types actifs sont renvoyés. Filtres : label, code, page, size (défaut 100).
Choisir le motif (si le type en demande un)
| Endpoint | Usage |
|---|---|
GET /provider/reason-types | Types de motifs : RESILIATION, SUSPENSION, CHANGEMENT_IMMATRICULATION, CHANGEMENT_ASSURE, MODIFICATION, DEMANDE_ANNULATION, ENDORSEMENT |
GET /provider/reasons/type/{typeIdOrCode} | Motifs d'un type, par id ou par code : …/type/RESILIATION |
GET /provider/reasons?filter[typeId]=… | Motifs paginés |
Le label du motif est envoyé dans selectedReason (ou cancellationReason pour la demande
d'annulation).
Coter — PATCH /provider/endorsements/{contractId}
Le corps contient toujours endorsementId (l'identifiant du type), plus les champs propres au
type. Toute clé supplémentaire est transmise telle quelle au traitement du type ; les clés inconnues
sont ignorées.
curl -s -X PATCH $API/provider/endorsements/1273be1c-9403-4bbf-a507-62b9bdbf6b30 \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"endorsementId": "<id du type CHANGEMENT_IMMATRICULATION>",
"vehicleId": "9e7258b6-2eb6-4969-b84c-cfa1343e0d71",
"newRegistrationNumber": "2547 ZR 64",
"selectedReason": "Changement de propriétaire"
}'Avant de coter, le serveur vérifie que le contrat est modifiable (pas de lien de paiement en
attente) et que son statut autorise ce type (INVALID_CONTRACT_STATUS sinon, avec le libellé du
statut et de l'avenant dans detail).
Réponse de la cotation
200 avec une enveloppe ActionResponse :
| Famille du type | data |
|---|---|
| Gratuit immédiat | Le contrat mis à jour |
| Gratuit différé | Le contrat (l'avenant est programmé) |
| Payant | Un EndorsementPaymentLink (endorsementId, premiumId, amount, paymentUrl, paymentReference, expiresAt, endorsement) |
| Ristourne (montant négatif) | Un EndorsementPaymentLink sans URL : le remboursement est pris en charge par le Pool |
id de l'enveloppe = identifiant de l'avenant créé.
Payer
| Endpoint | Usage |
|---|---|
POST /provider/endorsements/{endorsementId}/payment/init | Génère ou régénère le lien de paiement d'un avenant QUOTE (sans corps). Réutilise un lien encore valide pour le même montant |
POST /provider/endorsements/{endorsementId}/payment/resend | Renvoie le lien par EMAIL, SMS, WHATSAPP |
POST /provider/endorsements/{contractId}/payment/cancel | Annule les liens en attente du contrat ; les avenants redeviennent recotables |
Un avenant dont la prime est nulle ne peut pas lancer de paiement (INVALID_STATE). Le détail du
lien et du suivi est dans Paiement.
Suivre
| Endpoint | Contenu |
|---|---|
GET /provider/endorsements/{endorsementId} | { endorsement, premium } avec la prime et ses composants |
GET /provider/contracts/{contractId}/endorsements | Avenants d'un contrat |
GET /provider/endorsements?filter[status]=QUOTE | Tous les avenants visibles, filtrables (status, contract.id, reference, endorsementType.endorsementCode, premiumImpact…) |
GET /provider/endorsements/{endorsementId}/payments | Règlements |
GET /provider/endorsements/{endorsementId}/documents | Documents produits à l'émission |
Objet ContractEndorsement
| Champ | Description |
|---|---|
id, contractId, endorsementTypeId, endorsementCode | Identité |
reference | AV-<TYPE>-<horodatage> |
sequenceNumber | N° d'ordre (0 = affaire nouvelle) |
status, premiumImpact, premiumDelta, premiumId | Statut et incidence |
payload | Corps de cotation enrichi par le serveur (valeurs précédentes, dates calculées…) |
changes, vehicleChanges, vehiclesAdded, vehiclesRemoved | Différences appliquées |
effectiveDate, coverageStart, coverageEnd | Période de l'acte |
reasonCode, reasonComment | Motif |
paymentReference, paymentLink | Paiement |
issuedAt, cancelledAt, createdDate, lastModifiedDate | Dates |
Erreurs communes à tous les types
exception | Cause |
|---|---|
INVALID_ENDORSEMENT_TYPE | endorsementId inconnu ou type sans traitement disponible |
INVALID_CONTRACT_STATUS | Le statut du contrat n'autorise pas ce type |
CONTRACT_NOT_MODIFIABLE, PROPOSAL_LOCKED_FOR_PAYMENT | Un lien de paiement est en attente |
INVALID_DURATION_CONFIGURATION | Le contrat n'a pas de durée exploitable |
GENERIC_ERROR | Règle propre au type, lisible dans detail |