feat(payment): first-class transaction_id when recording a règlement #27

Merged
arcodange merged 1 commits from claude/dolibarr-payment-txn-integrate into main 2026-06-30 00:34:33 +02:00
Owner

Suite de #26 — l'id de transaction devient un champ first-class lors de l'enregistrement d'un paiement, pour que chaque règlement soit lié au mouvement bancaire réel dès l'écriture.

  • transaction_id est le champ canonique (l'id de transaction du feed Qonto/Wise) ; num reste un alias rétro-compatible. Il est stocké sur la ligne bancaire du paiement (llx_bank.num_chq) — la clé de rapprochement.
  • Enregistrer sans transaction_id → avertissement stderr (le paiement passe quand même, mais ne se rapprochera pas automatiquement) — incite l'agent à toujours le fournir.
  • Sortie normalisée : {id, bank_transaction_id, transaction_id}.
  • Promote : les ops payment des manifestes portent transaction_id ; promote-plan l'affiche (tx=… ou tx=MISSING).

Prouvé en live

client    : {"id":15,"bank_transaction_id":38,"transaction_id":"QONTO-TXN-AAA"}
alias num : {"id":16,"bank_transaction_id":39,"transaction_id":"QONTO-TXN-BBB"}
sans tx   : WARNING … won't auto-reconcile   → {"id":17,…,"transaction_id":""}
fournisseur:{"id":17,"bank_transaction_id":41,"transaction_id":"WISE-TXN-CCC"}
promote   : plan → tx=WISE-TX-2026-042 ; apply → paiement enregistré

Prochaine étape (PR suivante) : apprendre à bank-match à préférer un match exact num_chq ↔ id-transaction-feed — le lien est désormais posé à l'écriture.

🤖 Generated with Claude Code

Suite de [#26](https://gitea.arcodange.lab/arcodange-org/erp/pulls/26) — l'id de transaction devient un champ **first-class** lors de l'enregistrement d'un paiement, pour que chaque règlement soit lié au mouvement bancaire réel dès l'écriture. - **`transaction_id`** est le champ canonique (l'id de transaction du feed Qonto/Wise) ; **`num`** reste un alias rétro-compatible. Il est stocké sur la ligne bancaire du paiement (`llx_bank.num_chq`) — la clé de rapprochement. - Enregistrer **sans** `transaction_id` → avertissement stderr (le paiement passe quand même, mais ne se rapprochera pas automatiquement) — incite l'agent à toujours le fournir. - Sortie normalisée : `{id, bank_transaction_id, transaction_id}`. - Promote : les ops `payment` des manifestes portent `transaction_id` ; `promote-plan` l'affiche (`tx=…` ou `tx=MISSING`). ### Prouvé en live ``` client : {"id":15,"bank_transaction_id":38,"transaction_id":"QONTO-TXN-AAA"} alias num : {"id":16,"bank_transaction_id":39,"transaction_id":"QONTO-TXN-BBB"} sans tx : WARNING … won't auto-reconcile → {"id":17,…,"transaction_id":""} fournisseur:{"id":17,"bank_transaction_id":41,"transaction_id":"WISE-TXN-CCC"} promote : plan → tx=WISE-TX-2026-042 ; apply → paiement enregistré ``` Prochaine étape (PR suivante) : apprendre à `bank-match` à préférer un match exact `num_chq` ↔ id-transaction-feed — le lien est désormais posé à l'écriture. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
arcodange added 1 commit 2026-06-30 00:34:27 +02:00
Make the originating bank transaction id a first-class input on payment-record.sh
so every règlement is tied to the real bank movement at write time.

- `transaction_id` is the canonical field (the Qonto/Wise feed tx id); `num` stays
  as a back-compat alias. It's stored on the payment's bank line (llx_bank.num_chq),
  the reconciliation key.
- Recording WITHOUT a transaction_id prints a stderr warning (still posts, but won't
  auto-reconcile) — nudges the agent to always carry it.
- Output normalises to {id, bank_transaction_id, transaction_id}.
- Promote: manifests' payment ops carry transaction_id; promote-plan shows it
  (tx=… or tx=MISSING).

Proven live: customer + supplier record with transaction_id; the `num` alias maps
to the same field; the no-tx warning fires; promote plan/apply carry it through.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
arcodange merged commit 01e3eaac5e into main 2026-06-30 00:34:33 +02:00
arcodange deleted branch claude/dolibarr-payment-txn-integrate 2026-06-30 00:34:34 +02:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: arcodange-org/erp#27