3 000 USD manquants, découverts en assemblant le dossier client complet. La cartographie des cycles ne laisse pas de doute : M1, M2 et M4 ont chacun leur part fixe ET leur part différée ; M3 n'avait que sa part fixe (FAC008, réglée le 20/07). La facture pro forma PR2607-0001, remise au client en juillet, annonçait pourtant l'émission de cette part différée pour le 24/08/2026 — soit le jour même. C'est la date retenue : la numérotation reste chronologique au sens de l'article 289 du CGI, et l'échéance reste au 23/10/2026, trois mois après la fin du cycle M3. Le retard est écrit dans la note de la facture plutôt que masqué par une date d'émission rétroactive, qui elle romprait la chronologie. LE JUGE A POSÉ LA BONNE QUESTION. Il demandait si le différé de trois mois court depuis l'émission ou depuis la fin du cycle — les deux lectures ne divergent que pour M3, dont la facture est tardive : 23/10 contre 24/11. La pro forma tranche en toutes lettres et dans ses deux versions : « émise le 24/08/2026, à échéance du 23/10/2026 », et « paiement différé à 3 mois DE LA PRESTATION ». Retenir une autre date reviendrait à s'écarter d'une annonce déjà faite au client. Preuve en 02b-preuve-echeance.txt. CE QUI A ÉTÉ RETIRÉ DU CHANGE-SET EN COURS DE ROUTE. Une première version ajoutait la clause de pénalités L.441-10 à FAC001, FAC002 et FAC003, qui en sont dépourvues. L'opérateur a précisé le circuit réel : pendant la phase d'audit (janvier-février 2026), c'est WISE qui a émis les factures, en reprenant les identifiants internes de Dolibarr. Ces trois-là ONT donc été transmises au client. Modifier leur note aujourd'hui ferait diverger le registre interne du document que le client détient — l'inverse du but recherché. Le défaut de mention est réel mais historique, sur des factures réglées : consigné, pas réécrit. Depuis avril 2026 en revanche, KissMetrics vire le montant sur le compte Wise sans recevoir aucune facture. C'est ce qui a permis de reprendre FAC004, FAC006 et FAC009 plus tôt dans la journée, et c'est le dossier du 24/08 qui porte ces factures au client pour la première fois. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
ERP
CLI — bin/arcodange
Read-only operational CLI for the Arcodange Dolibarr at erp.arcodange.lab. One entry point, subcommands per domain:
bin/arcodange ping # Dolibarr version + liveness
bin/arcodange whoami # confirm auth as ai_agent
bin/arcodange invoice list # KissMetrics invoices with payment state
bin/arcodange invoice audit 12 # JSON facts + PDF mandatory-mention audit
bin/arcodange payments state # per-invoice TTC vs payments reconciliation
bin/arcodange payments timeline --year 2026 # cash receipts with cumulative balance
bin/arcodange tva summary # CA3-ready collectée − déductible per month
bin/arcodange thirdparty audit-all # completeness audit, country-aware
bin/arcodange templates inspect 1 # recurring template health (frequency, next fire, …)
bin/arcodange snapshot --out /tmp/erp.json # full state dump with content_hash
bin/arcodange help # full command tree
Read-only by design. The underlying API key (ai_agent) has no write permissions; corrections go through the Dolibarr UI.
Credentials. Reads .claude/skills/dolibarr/.env (mode 600, gitignored). Setup instructions: .claude/skills/dolibarr/README.md.
Source of behaviour. Each subcommand delegates to a script under .claude/skills/<skill>/scripts/. The skills' SKILL.md files document the business logic and are also discoverable by Claude Code via skill triggers.
Dolibarr
Premiers démarrages
Si l'application log au démarrage l'erreur suivante:
Importing custom SQL from update_table_ownership.sql ...
sed: couldn't open temporary file /var/www/scripts/before-starting.d/sedwHcRlQ: Read-only file system
Il faudra prendre la main du shell du pod et executer:
kubectl exec -n erp `kubectl get pod -n erp -l app.kubernetes.io/name=erp -o=name` -c erp -- sh -c 'PGPASSWORD=${DOLI_DB_PASSWORD} psql -U ${DOLI_DB_USER} -h ${DOLI_DB_HOST} -p ${DOLI_DB_HOST_PORT} ${DOLI_DB_NAME} \
-f /var/www/scripts/before-starting.d/update_table_ownership.sql'
Sous peine de ne plus avoir les droits de consulter la base de données une fois les crédentials mis à jour par vault. Dans ce cas executer la commande mais avec les credentials d'admin postgres.