Les cotisations entrent dans les comptes - #55
Merged
Merged
Conversation
Encaisser une cotisation dans l'onglet Adhérents ne créait aucune écriture : accounting_entries n'avait aucune clé vers un adhérent, et le service des adhérents n'importait rien de la comptabilité. Le trésorier était donc devant deux mauvais choix — ressaisir chaque cotisation à la main, dans deux tables que rien ne réconcilie et qui divergent dès la première correction, ou ne rien saisir, et laisser la principale recette récurrente de l'association absente du résultat présenté en assemblée. Le rapprochement se fait par parts, dans une table de liaison, et non par une colonne member_id sur l'écriture. Un encaissement groupé est le cas courant et non l'exception : HelloAsso reverse en un seul virement les adhésions de plusieurs familles, comme une remise de chèques en banque. Une écriture couvre donc N adhérents, chacun pour sa part. Deux gestes, les deux qui se présentent dans l'année : - POINTER un encaissement déjà enregistré. On choisit la recette, on coche les familles qu'elle couvre, et le total coché se compare en permanence à son montant : c'est le seul moyen de voir qu'il manque une famille, ou qu'on en a cochée une de trop. Le remplissage automatique ne prend que des règlements reçus à la date de l'encaissement ou avant — atteindre le bon total en piochant une famille qui n'a pas payé donnerait un bandeau vert mensonger. - REPRENDRE ce qui a été encaissé avant que ce rapprochement existe, en une écriture groupée ou une par adhérent, datée du règlement porté sur la fiche. Sans cette reprise, la comptabilité démarre avec un trou sur l'année en cours. Les garde-fous : seule une recette peut couvrir des cotisations, la somme des parts ne dépasse jamais le montant de l'écriture — mais peut rester en deçà, un virement portant aussi des billets ou un don — un adhérent n'apparaît qu'une fois par écriture, et les écritures de reprise naissent en brouillon, à relire puis valider. Les affectations restent modifiables sur une écriture validée, alors que l'écriture elle-même est immuable. Ce n'est pas une entorse : rattacher une adhésion ne change ni le montant, ni la date, ni le compte. C'est la marque de rapprochement qu'on porte en face d'une ligne de relevé. Rien n'écrit jamais dans les fiches des adhérents. La page Adhérents signale en revanche ce qui n'est pas encore passé aux comptes, sinon le décalage s'accumule en silence jusqu'à l'assemblée générale. Vérifié sur une instance réelle, sur un jeu de 12 familles à 30 € : le virement HelloAsso de 150 € du 8 septembre se pointe sur les 5 règlements du 5, et laisse ceux du 12 et du 15 pour le reversement suivant ; la reprise porte les 4 restants en un brouillon groupé de 120 € ; le rapprochement retombe alors à 270 € encaissés pour 270 € comptabilisés. Les six garde-fous répondent, la suppression d'un brouillon emporte ses parts sans toucher aux fiches, et aucun débordement de 320 à 1280 px. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD
flocom
force-pushed
the
claude/remove-apel-sensitive-data-73l5iu
branch
from
September 18, 2026 08:23
c73a44e to
e20c537
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Le trou
Encaisser une cotisation dans l'onglet Adhérents ne créait aucune écriture :
accounting_entriesa une clé vers un événement, mais aucune vers un adhérent ;src/lib/services/adherents.tsn'importait rien de la comptabilité ;getAccountingSummary()ne somme queaccounting_entries.Le trésorier était donc devant deux mauvais choix : ressaisir chaque cotisation à la main — l'argent compté deux fois, dans deux tables que rien ne réconcilie, et qui divergent dès la première correction — ou ne rien saisir, et laisser la principale recette récurrente de l'association absente du résultat présenté en assemblée générale.
Le modèle : des parts, pas une colonne
Une table de liaison
membership_payments (entry_id, member_id, amount_cents), et non unmember_idsur l'écriture. L'encaissement groupé est le cas courant et non l'exception : HelloAsso reverse en un seul virement les adhésions de plusieurs familles, exactement comme une remise de chèques. Une écriture couvre donc N adhérents, chacun pour sa part.La somme des parts ne dépasse jamais le montant de l'écriture, mais peut rester en deçà : un même virement peut porter des cotisations, des billets de kermesse et un don, et seule la part « cotisations » se rattache ici.
Deux gestes
Pointer un encaissement — le cas HelloAsso. On choisit la recette, on coche les familles qu'elle couvre, et le total coché se compare en permanence à son montant : c'est le seul moyen de voir qu'il manque une famille, ou qu'on en a cochée une de trop.
Le remplissage automatique ne prend que des règlements reçus à la date de l'encaissement ou avant. Atteindre le bon total en piochant une famille qui n'a pas payé donnerait un bandeau vert mensonger — c'est précisément l'erreur qu'un pointage doit empêcher. (Première version prise en défaut là-dessus pendant les essais, puis corrigée.)
Reprise initiale — ce qui a été encaissé avant que ce rapprochement existe, en une écriture groupée ou une par adhérent, datée du règlement porté sur la fiche. Sans elle, la comptabilité démarre avec un trou sur l'année en cours.
Les garde-fous
400Seule une recette peut couvrir des cotisations.400Les parts totalisent 180,00 € pour une écriture de 150,00 €.400Un adhérent ne peut apparaître deux fois sur la même écriture.400400404Les écritures de reprise naissent en brouillon : une reprise de masse validée d'emblée serait immuable, donc irrattrapable en cas d'erreur de sélection.
Un point qui mérite explication
Les affectations restent modifiables sur une écriture validée, alors que l'écriture elle-même est immuable. Ce n'est pas une entorse : rattacher une adhésion ne change ni le montant, ni la date, ni le compte. C'est la marque de rapprochement qu'on porte en face d'une ligne de relevé, une fois qu'on a compris à quoi elle correspond.
Et rien n'écrit jamais dans les fiches des adhérents — la comptabilité ne doit pas se remplir dans le dos du trésorier. La page Adhérents signale en revanche ce qui n'est pas encore passé aux comptes, sinon le décalage s'accumule en silence jusqu'à l'AG.
Vérifications
Sur une instance réelle, migration
0024appliquée, jeu de 12 familles à 30 € (5 réglées le 05/09, 3 le 12/09, 1 le 15/09, 3 impayées) :npx tsc --noEmit,npx eslint src --max-warnings=0,npm run build: verts.Un outil MCP en lecture,
get_membership_reconciliation, expose le même rapprochement.🤖 Generated with Claude Code
https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD
Generated by Claude Code