fix(profile): cotisations TNS en 641, pas 646 — et charge sociale immuable

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]>
This commit is contained in:
2026-08-13 18:49:18 +02:00
co-authored by Claude Opus 5
parent 9253ac8d4c
commit 8fe740896b
4 changed files with 379 additions and 27 deletions
@@ -6,32 +6,58 @@ fois, elle doit en coûter deux minutes ensuite.
## Pourquoi ce n'est pas une facture fournisseur
L'URSSAF n'est pas un fournisseur. Sa cotisation va au compte **646**
(cotisations personnelles du dirigeant), pas au compte fournisseur — l'inscrire
en facture fournisseur pollue le grand livre auxiliaire, les balances âgées et
les états de dettes fournisseurs.
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.
**645 contre 646**, la distinction qui décide de tout :
## Quel compte — et pourquoi ce n'est pas 646
| Compte | Pour qui |
| --- | --- |
| 645 | cotisations **patronales sur salaires** — suppose des salariés |
| **646** | cotisations **personnelles du dirigeant TNS** |
> [!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é.
Arcodange n'a aucun salarié et Gabriel est gérant associé unique d'une SARLU,
donc **TNS** : tout va en 646. Le compte 645 doit rester vide.
| 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** |
Dans Dolibarr, cela se pilote par le **type de charge**, jamais par une saisie
manuelle du compte :
Contrepartie **431** (Sécurité sociale), soldée par **512** au paiement.
Régularisation à la clôture : 641 contre **4286** (autres charges à payer).
- `Securite sociale (URSSAF / MSA)` → régime salarié → 645
- **`Securite sociale des indépendants (URSSAF)`** → TNS → 646 ← **celui-ci**
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 code comptable de chaque type vit dans **Configuration → Dictionnaires →
> Types de charges sociales**. Vérifier une fois que la ligne « indépendants »
> porte bien 646 : si elle porte autre chose, le bon type enverra quand même
> l'écriture au mauvais compte. Non vérifié à ce jour.
> **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
@@ -67,6 +93,19 @@ a réellement eu lieu — jamais par anticipation.
- **Garde d'hôte** : `guard.ts` refuse 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 son `UPDATE` ;
> 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.ts` conserve le cas de
> reproduction et diagnostique l'erreur.
>
> Relire la date **avant** de soumettre : `--dry-run` l'affiche.
## Les quatre pièges, tous rencontrés
1. **La date est un piège à double fond.** Le champ visible `ech` est décoratif :
@@ -97,8 +136,32 @@ 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.
```bash
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}
JSON
```
**`subdir` doit ê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=tax` avec `ref` renvoie 500, c'est normal.
- Le calendrier `fleet/profile/calendar.yaml` porte les échéances URSSAF 2026 :
493,00 (22/05) + 1 215,00 (05/08) + 1 333,00 (05/11) = **3 041,00 €**.
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