Statut : stable (canonique) Public cible : contributeur, métier Dernière vérification : 2026-05-01 Sources de vérité :
app/models/*.rb,db/schema.rb,migrations/vocabulary_migration.md.
Source de vérité unique pour le vocabulaire du domaine. Toute nouvelle PR (code, doc, UI, tests) doit utiliser ce vocabulaire. Les termes listés en section « Termes interdits » sont rejetés en revue. Utilisé pendant la migration
phase0→phase4.
- Définition : entité CRM unique. Source de vérité pour l'identité (nom, email, téléphone, adresse) et pour tout l'historique financier (adhésions, cotisations, paiements, dons). Soft-delete via
Person#archive!(concernSoftDeletable) avec garde-fouhas_financial_data?. - Cycle de vie : créée à la première interaction (inscription web, papier, paiement IRL). Persiste même quand le compte web est supprimé.
- Usage correct :
- « Créer une personne via
People::PersonCreator». - « La personne
Person#full_namea payé son adhésion en cash ».
- « Créer une personne via
- À éviter :
- « Créer un utilisateur sans compte web » → utiliser « créer une personne ».
- Confondre
PersonavecUser.
- Définition : compte d'authentification web (email, mot de passe, rôle système). Chaque
Userest obligatoirement relié à unePerson(belongs_to :person,person_idNOT NULL) ; unePersonpeut exister sansUser(adhésion papier, mineurs, etc.). Tous les attributs de profil (full_name,phone…) sont délégués versPerson. - Cycle de vie : créé via
People::UserAccountCreatorou callback surUser(personne minimale) puis enrichissement CRM ; rattachement explicite viaPeople::AttachUserToPerson/People::AccountLinker. La suppression du compte (User#destroy) coupe l'accès web mais laisse intact lePersonet son historique (tant que les flux RGPD ne désactivent pas autrement). - Usage correct :
- « Cette personne n'a pas encore de compte web ».
- « Le compte web a été archivé, la fiche personne reste active ».
- À éviter :
- « Utilisateur » employé pour désigner la fiche métier (utiliser « personne »).
- Considérer
Usercomme la source de vérité.
- Définition : contrat annuel donnant à une
Personle statut de membre de l'association, lié à unMembershipType(Basic / Cirque Plein / Cirque Réduit). Statuts :pending → active → inactive → expired. Une seule adhésion active par personne (validation d'overlap). - Cycle de vie : créée via
People::MembershipCreator, upgrade viaPeople::MembershipUpgrader(plein tarif du nouveau type, pas de prorata), renouvellement viaPerson#renew_membership!(nouveau numéro d'adhérent annuel). - Usage correct :
- « Adhésion Cirque Tarif Réduit active jusqu'au 31/12/2026 ».
- « Upgrade Basic → Circus : 7 € (plein tarif Cirque Réduit) ».
- À éviter :
- « Abonnement » pour parler d'une adhésion.
- Confondre adhésion (statut associatif annuel) et cotisation (accès cirque).
- Définition : catalogue versionné des tarifs d'adhésion (
category: :basic | :circus | :event). Versionnage viaversion,effective_from,effective_until. - Usage correct :
- « Le
MembershipTypeCirque Tarif Réduit est à 7 € depuis le 01/01/2026 ».
- « Le
- À éviter :
- « Article d'adhésion » (concept introduit dans certains seeds, non canonique).
- Définition : catalogue versionné des formules d'accès cirque. Quatre durées :
:day(journée),:trimester(≈90 j),:annual(1 an),:pack10(10 séances). Versionnage identique àMembershipType. - Disponibilité :
ContributionFormula.available_for(person)ne retourne que les formules autorisées (actuellement : exige une adhésion Cirque active). - Usage correct :
- « La formule Pack 10 coûte 30 € et donne 10 séances ».
- « Trois formules sont actives : Journée (4 €), Trimestre (60 €), Annuel (120 €) ».
- À éviter :
- « Plan d'abonnement » → utiliser « formule de cotisation ».
SubscriptionPlandans la nouvelle documentation, sauf historique de migration.- « Article de cotisation » (concept seed non canonique).
- Définition : instance achetée par une
Person, dérivée d'uneContributionFormula. Matérialise le droit d'accès cirque effectivement payé.- Pack 10 :
sessions_remaininginitialisé àsessions_count(10 par défaut), pas d'expiration (expires_at = nil). - Trimestre / Annuel :
sessions_remaining = nil, expiration viaexpires_at. - Day : usage unique,
sessions_remainingvaut1puis0, expiration à la fin du jour d'achat.
- Pack 10 :
- Cycle de vie : créée via
People::ContributionCreator. Suspension automatique si l'adhésion Cirque expire ; réactivation à la souscription d'une nouvelle adhésion active. - Règles d'upgrade :
- Pack 10 → Trimestre / Annuel : Pack 10 suspendu (sessions conservées), nouvelle cotisation au plein tarif, pas de prorata.
- Trimestre → Annuel : prorata temporel actuel, à confirmer métier.
- Day non upgradable.
- Usage correct :
- « La cotisation Pack 10 d'Alice a 7 séances restantes ».
- « Bob a une cotisation Annuelle qui expire le 15/06/2027 ».
- À éviter :
BookOfEntrydans la nouvelle documentation, sauf historique de migration.- « Carnet » sauf pour spécifier le sous-type Pack 10. « Cotisation Pack 10 » est préféré.
- « Subscription » (anglicisme commercial — cf. § 1.7).
- « Abonnement » (terme commercial inadapté à une asso loi 1901).
- Définition : transaction financière unique regroupant une ou plusieurs
PaymentLine. Méthodes ::cash,:card,:cheque,:transfer,:offered. Statuts ::pending → :success | :cancel. Anonymisation RGPD viaPayment#anonymize!. - Usage correct :
- « Paiement de 17 € : 7 € adhésion + 10 € cotisation ».
- « Paiement offert (
:offered) avecoffer_reasonobligatoire ».
- Définition : ligne polymorphique d'un paiement. Référence un item via
item_type+item_id. - Valeurs canoniques de
item_type:"Membership"→ adhésion créée par ce paiement."MembershipType"→ renouvellement / achat sur le catalogue."ContributionFormula"→ achat d'une cotisation."Contribution"→ cotisation existante."Donation"→ don. Les nouvelles lignes utilisent"Donation"; vérifier les données historiquesitem_type: "Payment"avant suppression de compatibilité.
- Invariant : la somme des lignes =
payment.total_cents. - À éviter :
item_type: "Payment"pour un don dans toute nouvelle documentation ou code (utiliser"Donation").
- Définition : paiement volontaire sans contrepartie, conservé pour reçu fiscal éventuel.
- Représentation actuelle :
PaymentLineavecitem_type: "Donation"(création viaPeople::PaymentRecorder). - À vérifier : présence éventuelle de lignes historiques
item_type: "Payment"en production — voir payments.md. - Usage correct :
- « Don de 5 € lors d'une adhésion ».
- « Le paiement contient deux lignes : adhésion + don ».
- À éviter :
- Confondre un don avec une cotisation ou une adhésion.
- Représenter un nouveau don avec
item_type: "Payment".
- Définition : trace de présence d'une
Person, soit pour l'entraînement libre quotidien, soit pour un événement. - Règles :
- Entraînement libre : unicité
person_id + date(pas d'event_id). Décrémente la cotisation utilisée (Contribution#use_session!) si applicable. - Événement : unicité
person_id + event_id.
- Entraînement libre : unicité
- Définition : conteneur d'
Attendancepour un jour ou un événement. Statuts ::open,:close,:archived. La liste « training » quotidienne est créée parAttendanceListManagement::DailyListGenerator(skip lundi).
- Définition : événement organisé (cours, stage, performance), avec date, catégorie. Inscriptions via
EventAttendee(Person ↔ Event).
- Définition : accueil d’un projet créatif au sein du lieu (cirque, arts graphiques, etc.), à distinguer de l’adhésion ou de la cotisation cirque.
- Usage correct : tout libellé public (pages Contact, FAQ, Adhérer, partenaires) utilise cette formulation.
- Code / formulaire de contact : valeur de catégorie
creative_hosting; le slug legacyresidenceest encore accepté et normalisé verscreative_hosting. Boîte mail :CONTACT_EMAIL_CREATIVE_HOSTING, avec repli surCONTACT_EMAIL_RESIDENCEsi la nouvelle variable n’est pas définie. - À éviter : « résidence » pour désigner ce dispositif (terme legacy en communication).
- Définition : table dédiée, indépendante de
Person. Une entrée newsletter peut exister sansPerson. Liaison automatique si l'email correspond à unePerson. - Usage correct :
- « S'inscrire à la newsletter via
People::NewsletterSignup».
- « S'inscrire à la newsletter via
- Note importante : dans le contexte newsletter, le terme anglais « subscription / unsubscription » est légitime (sens mailing). Ne pas le remplacer par « cotisation » dans ce contexte.
| Terme à proscrire | Terme cible | Raison |
|---|---|---|
subscription (sens cotisation cirque) |
contribution |
Ambiguïté avec abonnement Stripe / abonnement mailing. Inadapté à une asso 1901. |
SubscriptionPlan (en doc) |
ContributionFormula |
Nom legacy ; en doc on préfère le nom canonique avec alias entre parenthèses si nécessaire. |
book_of_entry, BookOfEntry (en doc) |
contribution, Contribution |
Legacy : ne désigne plus que les Pack 10, mais conceptuellement c'est l'instance d'une cotisation. |
abonnement |
cotisation |
Terme commercial inadapté. |
inferior_rights |
subordinate_roles |
Logique inversée trompeuse (ne lit pas comme « rôles subordonnés »). |
item_type: "Payment" (pour un don) |
item_type: "Donation" |
Hack polymorphique masquant la nature du don. |
| « article d'adhésion » / « article de cotisation » | « type d'adhésion » / « formule de cotisation » | Concept non canonique introduit dans les seeds. |
UserMembership |
Membership (lié à Person) |
Modèle déprécié — adhésion appartient à Person, pas User. |
| « carnet d'entrées » (sauf Pack 10) | « cotisation » | Le carnet est un sous-type, pas le concept général. |
Le terme
subscriptiondans le contexte newsletter (mailing) est conservé : il s'agit du vocabulaire technique standard du domaine emailing.
| Terme français | Terme anglais (code) | Statut | Note |
|---|---|---|---|
| Personne | Person |
canonique | source de vérité CRM |
| Compte web | User |
canonique | optionnel pour une Person (pas toujours de compte) ; obligatoire pour un User (toujours une Person liée) |
| Adhésion | Membership |
canonique | annuel |
| Type d'adhésion | MembershipType |
canonique | catalogue versionné |
| Cotisation | Contribution |
canonique | instance achetée |
| Formule de cotisation | ContributionFormula |
canonique | catalogue versionné |
| Paiement | Payment |
canonique | transaction multi-lignes |
| Ligne de paiement | PaymentLine |
canonique | polymorphique |
| Don | Donation |
cible (legacy : item_type: "Payment") |
reçu fiscal |
| Présence | Attendance |
canonique | entraînement / événement |
| Liste de présence | AttendanceList |
canonique | quotidienne ou événement |
| Événement | Event |
canonique | inscriptions via EventAttendee |
| Temps d’accueil en création | formulaire contact : creative_hosting (residence legacy) |
canonique (UI FR) | env : CONTACT_EMAIL_CREATIVE_HOSTING (+ fallback CONTACT_EMAIL_RESIDENCE) |
| Inscription événement | EventAttendee |
canonique | jointure Person × Event |
| Numéro d'adhérent | member_number |
canonique | format 25U001 / 25C001 |
| Newsletter | NewsletterSubscriber |
canonique | table indépendante |
- Adhésion ≠ cotisation. L'adhésion est annuelle, donne un statut. La cotisation est un droit d'accès cirque payé séparément (Pack 10, Trimestre, Annuel, Journée).
- Une cotisation ne peut exister sans adhésion Cirque active.
- Un don n'est ni une adhésion, ni une cotisation. C'est une
PaymentLineà part entière. PersonetUserne fusionnent jamais implicitement. Toute liaison passe parPeople::AccountLinker.- Newsletter ≠ cotisation. Le mot anglais « subscription » dans ce contexte est autorisé.
- Les anciens noms
SubscriptionPlanetBookOfEntryne restent utiles que pour lire l'historique de migration.
- domain_model.md — diagramme du modèle de domaine cible.
- payments.md — détail Payment / PaymentLine / Donation et dette technique.
- migrations/vocabulary_migration.md — mapping ancien → nouveau et statut par phase.
- domain/business_logic.md — règles métier détaillées par domaine.
- architecture/services.md — services et orchestrateurs (
People::*).