Qonto transaction ids run ~67 chars (<org>-<n>-<n>-transaction-<uuid>) but Dolibarr stores num_payment in varchar(50) (llx_paiement.num_paiement, llx_paiementfourn.num_paiement) — POSTing a payment with the raw id fails HTTP 400 "value too long for type character varying(50)". Parade proven live on the sandbox (2026-07-11): store the UUID suffix (globally unique, ~37 chars). Wise ids (short numerics) are unaffected. Writer side — payment-record.sh strips everything through "transaction-" before POST, announces the normalization on stderr, REFUSES (never truncates) ids still >50 chars after normalization, and emits the normalized num in the output JSON. Reader side — bank-match.sh PASS 0 (exact tx-id, erp#28) now compares BOTH sides in raw AND canonical short form: Qonto feed ids are carried long+short, payment nums are normalized on compare — so nums stored short (the varchar(50) form) and historical long-form nums both keep matching. Wise ids untouched. Proven offline (no credentials, no network, no sandbox/prod writes): - arcodange-bank-reco/tests/run-tests.sh — new bank-match --fixtures offline mode: long feed id ↔ short num, long ↔ long (back-compat), Wise numeric, each Δ+19d outside the ±7d window so only PASS 0 can pair them (exit 0, 3×[tx-id]); plus the empty-num negative (exit 1, 0 matched). - dolibarr-sandbox-write/tests/run-tests.sh — payment-record via a stubbed dol-write.sh (DOL_WRITE hook): long→short in POST body + output JSON, Wise untouched, >50-after-normalization refused BEFORE any POST, citing varchar(50). Both SKILL.md document the canonical short form + the varchar(50) constraint. Co-Authored-By: Claude Fable 5 <[email protected]>
28 lines
984 B
Bash
Executable File
28 lines
984 B
Bash
Executable File
#!/usr/bin/env bash
|
|
# Offline stand-in for dol-write.sh, used ONLY by tests/run-tests.sh (injected via
|
|
# the DOL_WRITE env hook). Records the POST body under $STUB_STATE, then serves it
|
|
# back as the payments list on GET so payment-record.sh can correlate. Never talks
|
|
# to any host — sandbox and prod are both out of reach by construction.
|
|
set -euo pipefail
|
|
STATE="${STUB_STATE:?stub-dol-write.sh: STUB_STATE not set}"
|
|
METHOD="$1"; ENDPOINT="$2"; BODY="${3:-}"
|
|
case "${METHOD}" in
|
|
POST)
|
|
printf '%s' "${BODY}" > "${STATE}/post_body.json"
|
|
printf '%s\n' "${ENDPOINT}" > "${STATE}/post_endpoint"
|
|
echo "77"
|
|
;;
|
|
GET)
|
|
python3 - "${STATE}/post_body.json" <<'PY'
|
|
import json, sys
|
|
body = json.load(open(sys.argv[1]))
|
|
print(json.dumps([{"num": body.get("num_payment", ""),
|
|
"date": "2026-06-20 12:00:00",
|
|
"fk_bank_line": "556"}]))
|
|
PY
|
|
;;
|
|
*)
|
|
echo "stub-dol-write.sh: unexpected method ${METHOD}" >&2; exit 2
|
|
;;
|
|
esac
|