Aller au contenu
Candidater

Journal des modifications

Les évolutions de Cohez.io, de la plus récente à la plus ancienne.

93 versions correspondent à « inscription ».

Versions 91 à 93 sur 93

0.2.1.0 - 2026-04-07

Ajouts

  • Système de design Cohez.io — identité visuelle définie et codée : polices Fraunces (titres) + Geist (interface) + Geist Mono (données financières), chargées via Bunny Fonts (GDPR-compliant). Palette de couleurs basée sur le vert sauge (#2D6A4F) comme couleur brand, fond crème #FAF9F7, neutrals chauds — différenciant dans la catégorie face au bleu corporate omniprésent (AssoConnect, HelloAsso).
  • Composant EmptyState (@/components/ui/empty-state) — état vide réutilisable : icône Lucide + titre + description + slot pour CTA optionnel. Appliqué sur les listes de membres, groupes, réunions.
  • Composant ConfirmDialog (@/components/ui/confirm-dialog) — dialogue de confirmation avant toute action destructive. Remplace entièrement les confirm() natifs (qui bloquent les events browser). Utilisé pour la désactivation/suppression de membres et groupes.
  • FlashToast (@/components/layout/FlashToast) — notification toast bottom-right consommant automatiquement flash.success et flash.error depuis les props Inertia partagées. Intégré dans AppSidebarLayout.
  • Bannière alerte impayés sur le tableau de bord — si des inscriptions non payées existent, une bannière rouge s'affiche en haut de page avec un lien direct vers la liste filtrée.
  • DESIGN.md — documentation complète du design system : couleurs avec rationale, typographie, espacement, border radius, motion, composants, patterns UI, responsive, accessibilité et journal de décisions.

Modifications

  • Dashboard — agenda de la semaine en empty state explicite quand aucune réunion n'est planifiée ; bannière impayés avec filtre URL correct.
  • Pages membres et groupes — états vides cohérents avec le composant EmptyState au lieu de textes inline.
  • Wizard d'inscription — garde contre 0 campagnes disponibles avec empty state explicite ; correction de l'affichage du récapitulatif sur mobile.

Corrections

  • Suppression du </div> en trop dans le wizard d'inscription (registrations/Create.vue).
  • Le lien "impayés" du dashboard utilisait un format de query params incorrect pour Wayfinder ({ status: 'unpaid' } → { query: { status: 'unpaid' } }).
  • FlashToast : ajout du onUnmounted pour nettoyer le timer, ajout de break-words sur le message pour éviter l'overflow sur les messages longs.

0.2.0.0 - 2026-04-03

Ajouts

  • Responsables légaux pour membres mineurs — les membres peuvent être marqués comme mineurs (toggle sur la fiche membre). Le secrétaire peut ensuite associer un ou plusieurs responsables légaux (parent, tuteur légal, autre…) via une interface dédiée : recherche de personne existante, création d'une nouvelle personne, ou sélection depuis le wizard d'inscription. Chaque responsable légal porte un type de relation, un indicateur "contact principal" et des notes libres.
  • Gestion complète des responsables légaux depuis la fiche membre : ajout, modification (type de relation, contact principal, notes) et retrait — sans supprimer la personne sous-jacente.
  • Support des mineurs dans le wizard d'inscription — lors de la création d'un nouveau membre mineur via le wizard, il est désormais possible d'ajouter directement ses responsables légaux à l'étape 2, en sélectionnant des personnes existantes.
  • Création de membre inline dans le wizard d'inscription — il n'est plus nécessaire de créer un membre avant de l'inscrire. Le wizard propose un toggle "Membre existant / Nouveau membre" à l'étape 2. En mode "Nouveau membre", le formulaire complet s'affiche directement, et la création du membre + l'inscription sont atomiques (une seule transaction).
  • Trait MemberValidationRules — les règles de validation des membres sont centralisées dans un trait partagé entre StoreMemberRequest et StoreRegistrationRequest (avec système de préfixe), éliminant la duplication.

Corrections

  • Correction du DTO CreateMemberRequest — la création d'un membre sans email (avec seulement un téléphone) provoquait une InvalidArgumentException. Le champ email est désormais nullable dans le DTO et l'use case.
  • Protection contre les doublons de responsables légaux — ajouter deux fois la même personne comme responsable légal depuis le wizard d'inscription retourne désormais une erreur de validation (422) au lieu d'une erreur serveur 500.
  • Recherche de personnes — les requêtes de moins de 2 caractères retournent une liste vide (évite l'exposition inutile de données personnelles).
  • Recherche insensible à la casse — la recherche de membres et de responsables légaux fonctionne désormais quelle que soit la casse (ex. "bec" trouve "BECQUE"). Corrige un comportement PostgreSQL où LIKE est case-sensitive.
  • Syntaxe Vue invalide dans MemberForm — :errors?= provoquait une erreur Vite bloquant l'affichage du formulaire. Corrigé en :errors=.
  • Wayfinder dans LegalGuardianSection — le toggle "mineur" utilisait route() (Ziggy, non disponible) au lieu de Wayfinder. Corrigé.
  • Input.vue accepte null — les champs optionnels typés string | null (nom, téléphone, date de naissance…) ne provoquent plus d'erreurs TypeScript.

Unreleased

Ajouts

Synchronisation automatique du statut d'inscription - 2026-03-19

Le statut d'une inscription (RegistrationStatus) se met désormais à jour automatiquement lorsque les paiements associés évoluent, sans intervention manuelle de l'administrateur.

Comportement :

  • Paiement reçu couvrant le montant total → Validated / PaidPartial → Paid
  • Paiement reçu couvrant partiellement → Validated → PaidPartial
  • Paiement rejeté ramenant le solde à zéro → Paid / PaidPartial → Validated
  • Paiement rejeté laissant un solde partiel → Paid → PaidPartial
  • Les inscriptions en Draft ou Cancelled ne sont jamais auto-transitionnées

Architecture :

  • PaymentObserver (app/Observers/PaymentObserver.php) : écoute Payment::created et Payment::updated
  • RegistrationStatus::canTransitionTo() étendu pour autoriser les transitions de retour depuis Paid et PaidPartial (nécessaires lors des rejets)
  • Enregistrement dans AppServiceProvider::boot() au même niveau que PersonObserver et UserObserver
  • 10 tests feature dans tests/Feature/Observers/PaymentObserverTest.php

Groupes Organisationnels - 2026-02-13

Ajout d'un système de gestion de groupes organisationnels pour structurer les membres de l'association (Bureau, CA, Commissions, etc.).

Fonctionnalités:

  • CRUD complet des groupes (création, édition, suppression, consultation)
  • Gestion des membres par groupe (ajout/retrait)
  • Support du statut actif/inactif pour archiver des groupes
  • Personnalisation visuelle avec couleur d'identification
  • Slug unique pour identification technique
  • Navigation dédiée dans la sidebar

Architecture:

  • Modèle OrganizationalGroup avec relations multi-tenant:
    • tenant_id pour isolation des données
    • persons relation many-to-many via table pivot
    • created_by et updated_by pour traçabilité
    • Query scopes (forTenant, active, inactive)
  • Migration create_organizational_groups_table:
    • Contraintes d'intégrité référentielle
    • Unicité du nom et slug par tenant
    • Protection par foreign keys avec cascade
    • Table pivot organizational_group_person
  • Controller OrganizationalGroupController avec:
    • Pagination sur la liste (15 éléments/page)
    • Transactions DB pour intégrité des données
    • Endpoint availablePersons pour sélection de membres
    • Gestion des doublons avec exceptions spécifiques
  • Policy OrganizationalGroupPolicy:
    • Permission MANAGE_SETTINGS requise
    • Isolation stricte par tenant
    • Support AdminUser avec accès total
  • Factory et Seeder pour développement et tests

Interface:

  • Pages Vue avec Inertia v2:
    • groups/Index.vue - Liste avec grille et stats
    • groups/Create.vue - Formulaire avec auto-génération du slug
    • groups/Edit.vue - Édition avec switch actif/inactif
    • groups/Show.vue - Détails avec liste des membres
  • Composant AddPersonDialog.vue:
    • Recherche en temps réel par nom/email
    • Sélection depuis personnes disponibles
    • Intégration Wayfinder pour routes typées
  • Composant UI Switch.vue (Reka UI)
  • Structure de layout standardisée (flex flex-1 flex-col gap-4 p-4)
  • Support complet du dark mode
  • Types TypeScript générés automatiquement

Tests:

  • 66 tests complets (14 modèle + 26 policy + 26 controller) avec 187 assertions:
    • Relations et méthodes du modèle
    • Query scopes et casts
    • Règles d'autorisation (AdminUser, User avec permissions)
    • CRUD complet avec validations
    • Gestion des personnes (ajout, retrait, disponibles)
    • Isolation tenant et unicité des contraintes
    • Backward compatibility et null safety
  • Suite complète: 946 tests passent

Améliorations et corrections (2026-02-15):

  • Pagination sur la liste des membres (15 éléments/page) pour cohérence avec groupes
  • Création composants UI Table avec Reka UI (Table, TableHeader, TableBody, TableRow, TableHead, TableCell)
  • Correction typage TypeScript pour pagination Laravel (LengthAwarePaginator<int, TValue>)
  • Correction ESLint (v-html sur composants)
  • Migration tests unitaires vers tests feature (ListMembersQuery maintenant compatible avec pagination DB)
  • Corrections PHPStan (annotations génériques, vérifications null redondantes)

Commits:

c570ba8 feat(groups): add organizational groups backend infrastructure
9f4acd9 feat(groups): add organizational groups frontend (Vue/Inertia)
0818406 Update .gitignore: add /.claude/worktrees to exclude directory
72ac5e1 feat(groups): add navigation link to organizational groups
5a8d2f3 fix(groups): correct critical bugs in UI components
f943d91 refactor(groups): align pages layout with application standards
56a3d33 fix(groups): correct pagination typing and add Table components with Reka UI
1f83a8e feat(members): add pagination to members list for consistency and performance
7ee05a8 fix(members): adjust focus-visible class order for consistency with Tailwind conventions
cc4244a fix(phpstan): correct type annotations and remove redundant null checks in ListMembersQuery
d36706c test(members): fix tests for pagination support

Types d'Utilisateurs (MEMBER/EMPLOYEE) - 2026-02-05

Ajout d'un système de différenciation entre membres adhérents et personnel salarié.

Fonctionnalités:

  • Enum UserType avec deux valeurs: MEMBER (membre adhérent) et EMPLOYEE (personnel)
  • Les employés peuvent accéder au système sans être des membres de l'association
  • Section "Personnel" dédiée dans les paramètres (/settings/staff)
  • Interface de création et gestion des comptes employés
  • Scopes pour filtrer les utilisateurs par type: User::members() et User::employees()

Architecture:

  • Migration add_user_type_to_users_table:
    • Colonne user_type (enum: 'member' | 'employee')
    • Colonnes first_name et last_name pour les employés
    • member_id devient nullable (NULL pour les employés)
    • Backfill automatique de tous les users existants en MEMBER
    • Validation d'intégrité des données avant migration
  • Modèle User étendu avec:
    • Cast user_type vers enum
    • Méthodes isMember() et isEmployee()
    • Accessor display_name intelligent (membre ou user selon le type)
    • Scopes members() et employees()
  • Use Case CreateEmployee pour la création d'employés
  • Factory UserFactory avec état employee()

Interface:

  • Controller StaffController avec CRUD complet
  • Form Request CreateEmployeeRequest avec validation
  • Pages Vue:
    • Staff/Index.vue - Liste des employés avec rôles
    • Staff/Create.vue - Formulaire de création
  • Types TypeScript UserType et Employee
  • Routes Wayfinder générées automatiquement

Tests:

  • 40+ tests ajoutés couvrant:
    • Enum (valeurs, labels, helpers)
    • Model (types, scopes, accessors)
    • Factory (états MEMBER/EMPLOYEE)
    • Use Cases (création, validations, exceptions)
    • Controller (CRUD, permissions, isolation tenant)
    • Intégration (null safety, backward compatibility)

Documentation:

Rétrocompatibilité:

  • ✅ 100% compatible: tous les users existants deviennent automatiquement MEMBER
  • ✅ Aucun changement de comportement pour l'existant
  • ✅ Tous les tests passent (680 passed)

Commits:

9239a5e feat(identity): add UserType enum for MEMBER and EMPLOYEE
0b8c432 fix(tests): add user_type to manual User::create calls
7ea7d43 feat(identity): add Staff frontend pages and types
1a2ac47 feat(identity): add Staff controller for employee management
f5732f8 feat(identity): add CreateEmployee use case
803d9c3 feat(identity): add employee state to UserFactory
6734c12 feat(identity): enhance User model with type support
450e26e feat(identity): add user_type column to support employees
ece1f30 fix(identity): add null-safe access for member properties
bb65dd1 test(identity): complete UserType enum unit tests