Paiement reçu (payment)
Un payment est l'enregistrement Ormuz d'un paiement entrant vu sous l'angle comptable. Là où le psp_payment documente l'encaissement brut côté provider, le payment porte le statut de rapprochement : est-ce que ce montant a été appliqué sur des factures, et pour combien ?
Rôle
Le payment est le point d'entrée du rapprochement côté vendeur. Il peut provenir de plusieurs canaux — open banking, saisie manuelle, ou reversement PSP — et suit son propre statut de rapprochement indépendamment du statut d'encaissement du psp_payment sous-jacent.
Lorsqu'un payment réconciliable est appliqué sur une ou plusieurs factures via une payment_allocation, il met à jour leur settlement_status(partially_paid ou paid) et son propre statut passe à matched ou partially_matched. Un payout psp_with_allocations constitue l'exception : il n'est pas appliqué aux documents.
Identifiant et structure
Chaque payment porte un identifiant stable préfixé par pay_.
{
"object": "payment",
"id": "pay_2c4f8a1e9b3d7f6e",
"merchant_id": "mer_1a2b3c4d5e6f7a8b",
"buyer_id": "cmp_3a8f1d9c2b4e7f6a",
"type": "payment",
"source_payment_id": null,
"amount_refunded": 0,
"amount_refundable": 120000,
"reason": null,
"source_reference": "VIR-2026-06-17-00042",
"metadata": {},
"amount": 120000,
"currency": "eur",
"source": "open_banking",
"payment_method": "bank_transfer",
"status": "matched",
"payment_date": "2026-06-17",
"reference": "VIREMENT ACHETEUR REF 00042",
"import_batch_reference": null,
"created_at": "2026-06-17T14:00:00.000Z",
"updated_at": "2026-06-17T14:05:00.000Z"
}Champs
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant du paiement (préfixe pay_). |
object | string | Toujours "payment". |
merchant_id | string | Marchand créancier. |
buyer_id | string | null | Entreprise acheteuse (cmp_…). Peut être absent sur certains encaissements agrégés. |
type | enum | Nature du mouvement : payment, refund ou reversal. |
source_payment_id | string | null | Paiement parent pour un refund ou un reversal lié. |
amount_refunded | integer | Montant déjà remboursé sur un payment. |
amount_refundable | integer | Montant restant remboursable, calculé par la plateforme. |
reason | string | null | Motif d’un refund, reversal ou marquage explicite lorsque pertinent. |
source_reference | string | null | Référence dans le système source (ex. référence de virement bancaire). |
metadata | object | Map plate de scalaires `string | number | boolean`, selon la convention metadata de l’API. |
amount | integer | Montant total du paiement en centimes (≥ 0). |
currency | string | Code devise ISO 4217 en minuscules (ex. eur). |
source | enum | Canal d’entrée de la donnée : open_banking, manual, psp, psp_with_allocations. |
payment_method | string | null | Moyen de paiement, distinct de la source d’entrée dans Ormuz. |
status | enum | État de l’intention ou du rapprochement : draft, pending, matched, partially_matched, unmatched, reversed, failed ou cancelled. |
payment_date | date | Date d'opération du paiement (distinct de created_at qui est la date d'enregistrement). |
value_date | date | null | Date de valeur bancaire. C'est elle qui fait foi au rapprochement. |
reference | string | null | Motif du virement, 140 caractères (ISO 20022 RmtInf/Ustrd). Texte libre transmis sans altération. |
end_to_end_reference | string | null | Référence d'opération, 35 caractères (ISO 20022 PmtId/EndToEndId). Identifiant assigné par le donneur d'ordre. |
import_batch_reference | string | null | Référence du lot d'import lorsqu’aucune ressource ImportBatch n’existe. |
created_at | datetime | Date d'enregistrement dans la plateforme. |
updated_at | datetime | Date de dernière mise à jour. |
Source
La source qualifie l'origine du paiement et détermine les contraintes sur buyer_id et les psp_payments liés.
| source | buyer_id | psp_payment_ids | Description |
|---|---|---|---|
open_banking | Requis | — | Paiement détecté via une intégration open banking (relevé de compte bancaire). Le buyer est connu. |
manual | Requis | — | Paiement saisi manuellement par un opérateur. Le buyer est connu. |
psp | Interdit | — | Reversement PSP agrégé sans découpage par buyer. Aucun psp_payment lié. |
psp_with_allocations | Interdit | Requis | Reversement PSP avec la liste des PSP payments rapprochés individuellement. Le payout n’est jamais appliqué aux factures : leur settlement_status est déjà porté par les allocations des psp_payments. |
Motif et référence d'opération
reference et end_to_end_reference ne sont pas interchangeables : ce sont deux champs distincts de la norme ISO 20022, que le virement SEPA transporte côte à côte.
reference | end_to_end_reference | |
|---|---|---|
| Champ ISO 20022 | RmtInf/Ustrd | PmtId/EndToEndId |
| Taille | 140 caractères | 35 caractères |
| Nature | texte libre transmis au bénéficiaire sans altération | identifiant restitué dans le reporting aux deux companies |
| Nom courant | motif, libellé, communication | référence d'opération |
Sur un encaissement, c'est le payeur qui remplit les deux. Sa référence d'opération est la sienne, souvent inexploitable, et vaut fréquemment la valeur littérale NOTPROVIDED — le connecteur la normalise alors en null. C'est donc le motif qui porte le numéro de facture et sert au rapprochement.
Sur un décaissement (supplier_payment), Ormuz est donneur d'ordre : il assigne la référence d'opération, qui vaut le public_id par défaut. La banque la transporte et la restitue sur le relevé, ce qui en fait la clé de rapprochement du débit.
end_to_end_reference est nullable et sans contrainte d'unicité, délibérément : un index unique ferait collisionner tous les encaissements dépourvus de référence. Ce n'est pas non plus une clé d'idempotence — celle-ci passe par extension_object_mappings et une clé de repli propre à chaque connecteur.
La norme prévoit une troisième référence, la référence structurée du bénéficiaire (RmtInf/Strd/CdtrRefInf, ISO 11649 « RF », et ses équivalents nationaux : communication structurée belge, KID norvégien, viitenumero finlandais). Définie par le créancier sur sa facture et recopiée par le payeur, c'est la clé de rapprochement la plus fiable là où elle est en usage. Ormuz n'en émet pas : la relance porte sur le receivable et non sur la facture.
Statut de rapprochement
Le status porte deux phases selon la nature du mouvement. Un encaissement reçu commence normalement en pending puis évolue avec son rapprochement. Une intention de remboursement commence en draft et peut devenir pending lorsqu’un mouvement bancaire la matérialise, ou terminer en failed/cancelled avant exécution. Les statuts de rapprochement sont mis à jour dans la même transaction que les applications correspondantes.
| Statut | Description |
|---|---|
draft | Intention de remboursement créée avant matérialisation du mouvement bancaire. |
pending | Mouvement matérialisé et disponible pour rapprochement, ou paiement reçu pas encore entièrement appliqué. |
matched | Entièrement appliqué — le total des applications égale le montant du mouvement. |
partially_matched | Partiellement appliqué — un solde résiduel est encore ouvert. |
unmatched | Paiement entrant explicitement marqué comme non rapprochable. |
reversed | Paiement d’origine contre-passé par un mouvement distinct de type reversal. |
failed | Intention de remboursement qui n’a pas pu être matérialisée par le canal bancaire. |
cancelled | Intention de remboursement annulée avant sa matérialisation. |
L'événement reflète le statut obtenu après l'application : payment.matched lorsque le montant est entièrement rapproché, ou payment.partially_matched lorsqu'un solde reste à affecter.
PSP payments liés
Pour la source psp_with_allocations, une liste de psp_payments est fournie à la création via psp_payment_ids. Ces psp_payments doivent tous être en statut succeeded, appartenir au même marchand et à la même devise, et ne pas être déjà liés à un autre payment.
POST /v1/payments
{
"merchant_id": "mer_1a2b3c",
"amount": 360000,
"currency": "eur",
"source": "psp_with_allocations",
"payment_date": "2026-06-17",
"psp_payment_ids": [
"psp_7e3b9f",
"psp_4a1c8d",
"psp_9f2e6b"
]
}Le total des montants des psp_payments liés doit être compris dans une tolérance de ±5 % du montant du payment (pour absorber les frais de traitement PSP). Les psp_payments sont récupérables via GET /v1/payments/:id/psp-payments.
psp_with_allocations, chaque psp_payment porte déjà son allocation vers les factures et met à jour leur settlement_status. Le payout agrégé ne crée donc pas une seconde payment_allocation et ne modifie aucun document ; son statut est dérivé de celui de ses composants.Application sur les factures
Appliquer un payment sur des factures crée une payment_allocationqui décrit comment le montant est réparti. L'application est atomique et met à jour les statuts des factures dans la même transaction.
Effet sur le settlement_status
Chaque facture touchée par une application de type payment voit son settlement_status progresser, sans modifier son status de cycle de vie :
| Montant appliqué vs. montant TTC | settlement_status résultant |
|---|---|
| Total des applications = montant TTC de la facture | paid |
| Total des applications < montant TTC | partially_paid |
Le même axe de règlement est utilisé quelle que soit l'origine de l'encaissement. Il n'existe plus de statut de règlement distinct côté acheteur et côté vendeur.
Contraintes d'application
- Seuls les payments en statut
pendingoupartially_matchedpeuvent être appliqués. - Le total cumulé des applications ne peut pas dépasser le montant du payment.
- Les factures cibles doivent appartenir au même marchand et avoir la même devise.
- Pour les sources non-PSP avec un
buyer_id, les factures doivent appartenir au même buyer.
Remboursements
Un remboursement bancaire ou open-banking est représenté par un payment de type refundlié à son paiement source. Il commence en draft : Ormuz a réservé une intention de remboursement, mais aucun mouvement bancaire n’est encore considéré comme exécuté.
Cette séparation évite de confondre une décision du processus avec le fait financier final. Le montant remboursable du paiement source tient compte des remboursements déjà exécutés et des intentions actives afin qu’un processus concurrent ne puisse pas réserver deux fois la même capacité.
Les nodes Core refund_payment et create_credit_note_payment_refunds créent ces intentions. Le second part d’avoirs émis, retrouve les paiements réellement utilisés pour financer les factures concernées et peut produire un remboursement par avoir ou agréger par paiement source.
Les remboursements PSP suivent le même principe d’intention draft, mais sont portés parpsp_payment et exécutés par l’extension PSP correspondante.
Dans les processus
reconcile_payment
Ce helper applique un payment ou un psp_payment sur des créances selon une proposition d'allocation. Il utilise le type de l'objet reçu comme source de la payment_allocation. Les payments psp_with_allocations ne passent pas par ce node : leur statut est dérivé des psp_payments qu'ils regroupent.
Paramètres
{
"payment": "platform.payment | platform.psp_payment",
"receivable_allocation": "common.receivable_allocation"
}Sortie
{
"payment_allocation": "platform.payment_allocation"
}La receivable_allocation est typiquement produite par propose_payment_allocation.
Un reversement PSP agrégé (psp_with_allocations) ne se rapproche pas : il ne porte aucune information acheteur, et les factures ont déjà été soldées par les psp_payment qu'il reverse. Son statut est dérivé de ses composants — matched lorsque chacun d'eux est alloué.
fetch_payment
Helper générique pour récupérer un payment par identifiant dans un processus d'orchestration.
Év énements
| Événement | Déclencheur |
|---|---|
payment.received | Le paiement vient d'être créé. |
payment.matched | Le paiement est entièrement rapproché de ses cibles. |
payment.partially_matched | Le paiement est partiellement rapproché et conserve un solde résiduel. |
payment.unmatched | Le paiement a été marqué comme unmatched. |
payment.reversed | Le paiement a été contre-passé. |
payment_refund.created | Une intention de remboursement client est créée en draft. |
payment_refund.executed | Le remboursement client est matérialisé par le canal bancaire. |
payment_refund.failed | Le canal bancaire refuse de matérialiser le remboursement client. |
payment_refund.cancelled | L’intention de remboursement client est annulée avant matérialisation. |
payment_refund.matched | Le remboursement client est entièrement rapproché de ses cibles. |