L'appel de cotisations URSSAF 2026 (PDF officiel du 09/07) a permis de qualifier l'imputation, restée explicitement ouverte dans le runbook. La réponse contredit ce qui y était écrit. Le compte 646 est réservé à l'entreprise individuelle et aux sociétés à l'IR : il ne s'applique pas à une SARL à l'IS. La prise en charge par la société des cotisations de son gérant majoritaire est un complément de rémunération — compte 641, sous-compte dédié, déductible. 645 et 631/633 restent vides : aucun salarié, l'opérateur n'est pas employeur. Piège corrigé au passage : la mention « CSG déductible fiscalement » de l'appel vise l'IR personnel du gérant (art. 62 CGI), pas l'IS de la société. Pour la SARL la CSG/CRDS est intégralement déductible — la réintégration annoncée dans un premier temps était un raisonnement d'entreprise individuelle mal transposé. Le runbook affirmait aussi que le type de charge Dolibarr pilotait le compte. Faux : la colonne « Code comptable » du dictionnaire est vide pour tous les types, TAXSSI compris (vérifié cellule par cellule), et le module comptabilité n'est pas déployé. La carte affiche « Code comptable: Inconnu ». L'ERP porte les faits, pas les écritures. Deux corrections de fond sur les dates et les montants : - les dates de l'échéancier sont des dates d'ÉCHÉANCE (le 5 du mois), pas de débit bancaire — 05/05 et non 22/05, ce qui rend visible le retard de 17 jours ; - les 3 041 EUR sont PROVISOIRES, assis sur un forfait début d'activité, et seront régularisés. L'assiette est la rémunération du gérant, jamais le CA. Enfin, découvert en tentant la correction de date : aucune charge sociale n'est modifiable sur ce déploiement. Toute édition, même du seul montant, échoue sur « multiple assignments to same column fk_user_modif » — ChargeSociales::update() génère un UPDATE que PostgreSQL rejette (42601) là où MySQL passe. Le défaut est propre à cet objet ; la mise à jour d'un tiers via REST fonctionne. La date doit donc être juste à la création. updateSocialCharge.ts conserve le cas de reproduction et diagnostique l'erreur au lieu de la subir. Le justificatif officiel est attaché aux trois charges de production. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
8.8 KiB
Runbook — enregistrer une charge sociale ou fiscale (URSSAF, CFE, TVA…)
Public : un agent, quel que soit son modèle, ou l'opérateur. Écrit pour être suivi sans redécouvrir le terrain — cette routine a coûté une heure la première fois, elle doit en coûter deux minutes ensuite.
Pourquoi ce n'est pas une facture fournisseur
L'URSSAF n'est pas un fournisseur. L'inscrire en facture fournisseur pollue le grand livre auxiliaire, les balances âgées et les états de dettes fournisseurs. C'est une charge sociale, saisie comme telle.
Quel compte — et pourquoi ce n'est pas 646
Important
Arcodange est une SARL à l'IS. Le compte est 641, pas 646. Le 646 (« cotisations sociales de l'exploitant ») est réservé à l'entreprise individuelle et aux sociétés à l'IR. Il ne s'applique pas à une société. Quand la société règle les cotisations personnelles de son gérant majoritaire, c'est un complément de rémunération : compte 641, dans un sous-compte dédié (
641150« Sécurité sociale des indépendants » par exemple), et c'est déductible du résultat de la société.
| Compte | Pour qui | Arcodange |
|---|---|---|
| 641 (sous-compte dédié) | rémunération + cotisations du gérant majoritaire TNS | ← celui-ci |
| 646 | cotisations de l'exploitant individuel / société à l'IR | sans objet |
| 645 | cotisations sur salaires | vide — aucun salarié |
| 631 / 633 | contributions de l'employeur (formation, apprentissage) | vide — Gabriel n'est pas employeur |
Contrepartie 431 (Sécurité sociale), soldée par 512 au paiement. Régularisation à la clôture : 641 contre 4286 (autres charges à payer).
L'appel URSSAF se comptabilise globalement dans ce sous-compte 641 : pas de ventilation entre cotisations, CFP et CSG/CRDS. En particulier, la contribution à la formation professionnelle d'un TNS n'est pas la participation employeur du compte 6333 — Arcodange n'emploie personne ; c'est une contribution personnelle, elle suit les cotisations.
Warning
Le piège CSG. L'appel URSSAF porte une mention « montant de CSG déductible fiscalement : N € ». Elle vise l'impôt sur le revenu personnel du gérant (art. 62 CGI), pas l'IS de la société. Pour la SARL, la CSG/CRDS est intégralement déductible : aucune réintégration extra-comptable. Ne pas transposer le raisonnement de l'entreprise individuelle, où la CSG non déductible se reclasse en compte de l'exploitant.
Ce que Dolibarr ne fait pas
Le type de charge ne pilote aucune écriture. Vérifié le 2026-08-13 dans
Configuration → Dictionnaires → Types de charges sociales ou fiscales
(/admin/dict.php?id=7) : la colonne « Code comptable » est vide pour tous
les types, TAXSSI compris. Le module comptabilité n'est pas déployé —
/accountancy/* répond 404.
Conséquence pratique : le choix du compte ne se joue pas dans l'ERP. Dolibarr
porte les faits (montant, échéance, justificatif) ; l'imputation vit dans le
grand livre de l'expert-comptable. Choisir le type
Securite sociale des indépendants (URSSAF) pour la lisibilité, sans croire
qu'il décide de quoi que ce soit.
La commande
cd test
DOLIBARR_ADDRESS=https://erp-sandbox.arcodange.lab \
deno run -A recordSocialCharge.ts \
--label "URSSAF 2026 — 2e échéance" \
--due 2026-08-05 --amount 1215.00 --period 2026-08-05
Production — double opt-in explicite, comme toute écriture de production :
DOLIBARR_ADDRESS=https://erp.arcodange.lab \
ARCO_ALLOW_PRODUCTION=erp.arcodange.lab \
ARCO_PROD_CONFIRM=I-UNDERSTAND-THIS-WRITES-PROD \
deno run -A recordSocialCharge.ts --label "…" --due … --amount … --period …
--dry-run affiche ce qui serait soumis sans rien écrire.
--type "CFE" (ou tout autre motif) pour une charge qui n'est pas URSSAF ; le
script liste les types disponibles s'il ne trouve pas de correspondance.
La charge est créée impayée. Le règlement s'enregistre séparément, quand il a réellement eu lieu — jamais par anticipation.
Ce que le script garantit
- Idempotent : il cherche d'abord la charge dans la liste (libellé + montant) et ne fait rien si elle existe. Un rejeu ne crée pas de doublon.
- Vérifié par lecture : après soumission il relit la liste, pas l'URL.
- Garde d'hôte :
guard.tsrefuse toute cible qui n'est pas la sandbox, sauf double opt-in production.
Caution
Une charge sociale est IMMUABLE sur ce déploiement. La date doit être juste du premier coup. Toute soumission du formulaire d'édition échoue — y compris en ne touchant que le montant :
ERROR 42601: multiple assignments to same column "fk_user_modif".ChargeSociales::update()affecte deux fois la même colonne dans sonUPDATE; MySQL l'accepte, PostgreSQL le rejette. Vérifié le 2026-08-13 en sandbox sur la date et sur le montant. Le défaut est propre à cet objet — la mise à jour d'un tiers via REST fonctionne.test/updateSocialCharge.tsconserve le cas de reproduction et diagnostique l'erreur.Relire la date avant de soumettre :
--dry-runl'affiche.
Les quatre pièges, tous rencontrés
- La date est un piège à double fond. Le champ visible
echest décoratif : le backend ne lit que les champs cachésechday/echmonth/echyear, alimentés par le datepicker jQuery. Remplir le champ texte soumet une date vide — et Dolibarr crée quand même l'enregistrement, avec une période aberrante (20/06/2000observé). Même chose pourperiod. - Le bouton n'a pas de
name. Le cibler parvalue="Ajouter". - L'URL après soumission ne porte pas d'
id. Vérifier par l'URL fait conclure à un échec sur une création réussie — c'est ainsi que quatre doublons sont apparus en sandbox pendant que le script affichait « non créée ». Toujours vérifier par la liste. - Les milliers s'affichent avec une espace insécable : 1215.00 devient « 1 215,00 ». Une comparaison littérale échoue au-delà de 999 €, et l'idempotence saute silencieusement. Comparer sans les espaces.
Pourquoi pas le pipeline de promotion
Dolibarr n'expose aucune API REST pour les charges sociales : /taxes,
/socialcontributions et /chargesociales répondent tous « API not found ». Le
module est actif (le droit 91 existe), seule l'API manque. Le pipeline
fleet/harness/promote/ parle REST : il ne peut pas porter cette opération.
Ce script en conserve la discipline — répétition sandbox, relecture du résultat, opt-in production explicite — mais pas le juge indépendant ni l'artefact de gate. Acceptable pour une opération à trois champs ; à ne pas généraliser.
Après l'enregistrement
- Rapprocher le prélèvement bancaire quand il apparaît (Qonto pour Arcodange).
- Attacher le justificatif à la charge. L'appel de cotisations est la pièce
qui la justifie ; sans lui la charge n'est qu'une affirmation.
curl -s -X POST https://erp.arcodange.lab/api/index.php/documents/upload \ -H "DOLAPIKEY: $(cat test/.ai_agent_prod_prod_write.key)" \ -H 'Content-Type: application/json' -d @- <<JSON {"filename":"URSSAF-appel-cotisations-2026.pdf","modulepart":"tax", "subdir":"<ID DE LA CHARGE>","filecontent":"<BASE64>","fileencoding":"base64", "overwriteifexists":1} JSONsubdirdoit être l'identifiant nu de la charge (2), rien d'autre. L'API accepte silencieusement n'importe quel chemin (sociales/2,tax/2…) et y dépose un fichier que l'onglet Documents ne montrera jamais. Vérifier sur/compta/sociales/document.php?id=<ID>: « Nombre de fichiers liés » doit passer à 1.modulepart=taxavecrefrenvoie 500, c'est normal. - Le calendrier
fleet/profile/calendar.yamlporte les échéances URSSAF 2026 : 493,00 (05/05) + 1 215,00 (05/08) + 1 333,00 (05/11) = 3 041,00 €. - Échéance ≠ prélèvement. L'appel donne des dates d'échéance au 5 du mois ; le débit bancaire tombe plus tard (22/05 pour l'échéance du 05/05). Enregistrer la charge à la date d'échéance — c'est elle qui fait foi et qui détermine un éventuel retard.
- Les montants sont provisoires. Tant que l'activité est en début d'activité, ils sont calculés sur une base forfaitaire et régularisés après déclaration des revenus. L'assiette est la rémunération du gérant, jamais le chiffre d'affaires — ne pas anticiper de régularisation à partir du CA encaissé.
- L'échéancier officiel n'est disponible que dans l'espace urssaf.fr : les notifications par mail ne contiennent aucun montant, et le transfert Gmail → Zoho remplace même leur contenu par un texte générique. Récupérer le PDF à la main reste nécessaire.