Journal des modifications
Les évolutions de Cohez.io, de la plus récente à la plus ancienne.
173 versions publiées.
Versions 151 à 160 sur 173
0.5.1.0 — 2026-04-28
Ajouts
- Transcription en temps réel (Voxtral) : pendant une réunion en direct, le bouton micro capture l'audio par chunks de 4 s et les envoie à Mistral Voxtral via un job en file d'attente. La transcription s'accumule dans le champ
transcriptde la réunion et est visible dans le compte-rendu final. - Provider de transcription configurable :
config/ai.phpexposedefault_for_transcription(valeur par défaut :mistral) pour faciliter le changement de provider sans toucher au code. - Transcription dans le compte-rendu : si une transcription est disponible, elle est incluse dans le compte-rendu généré (section dédiée, formatée en bloc citation pour éviter toute injection Markdown).
- Robustesse micro : les chunks vides (micro muet, coupure réseau) sont filtrés avant envoi — aucune requête inutile vers l'API, pas de transcription parasite. Capture du segment EBML WebM garantie avant le filtre de taille.
Corrections
- CSRF 419 sur
transcribe-chunk: Inertia ne génère pas de balise<meta name="csrf-token">— corrigé en lisant le cookieXSRF-TOKENvia l'en-têteX-XSRF-TOKEN(mécanisme natif Laravel/Sanctum). - Isolation tenant sur le job de transcription : la clause
WHERE tenant_id = ?garantit qu'un job ne peut pas écrire dans la réunion d'un autre tenant même en cas de collision d'ID. - Stockage privé des chunks audio : forçage du disque
local(privé) pour les fichiers audio temporaires — ils n'étaient pas exposés via URL publique dans le précédent comportement, mais cette garantie est maintenant explicite. - Nettoyage des fichiers audio orphelins : le fichier temporaire est désormais supprimé dans
failed()en plus dufinallydehandle()— évite l'accumulation sur le FS Bucket en cas de SIGKILL du worker. - Throttle
liveTranscript: le polling de transcription est limité à 30 req/min pour limiter la charge base de données. - Validation MIME des chunks : liste blanche stricte (
audio/webm,audio/ogg,audio/wav, etc.) — les formats non reconnus reçoivent une 422. - Race condition post-arrêt enregistrement : les chunks reçus après l'appel à
stopRecording()sont ignorés pour éviter les doubles uploads. - Accessibilité bouton micro : suppression de l'
aria-labelstatique qui écrasait le texte dynamique visible (violation WCAG 2.5.3).
0.5.0.0 — 2026-04-23
Ajouts
- Réunion en direct (Live) : nouvelle page de conduite de réunion en temps réel avec timer, navigation entre points de l'ordre du jour et affichage du temps écoulé. Chaque point peut être démarré, décidé et clôturé individuellement.
- Actions de réunion : les animateurs peuvent créer des actions (tâches) sur chaque point de l'ordre du jour en séance, avec titre, responsable et date d'échéance.
- Compte-rendu automatique : à la clôture d'une réunion, un compte-rendu Markdown est généré automatiquement à partir des décisions et actions enregistrées. La date de la prochaine réunion peut être saisie lors de la clôture.
- Export PDF du compte-rendu : les CR validés sont exportables en PDF avec mise en forme professionnelle (logo, titre, présences, ordre du jour, décisions, actions).
- Envoi email du compte-rendu : envoi idempotent du CR validé à tous les participants disposant d'une adresse email, avec protection contre les doublons d'envoi.
- Recherche de décisions : nouvelle page de recherche full-text (GIN index PostgreSQL) dans les décisions de toutes les réunions clôturées.
- Actions sur fiche membre : la fiche d'un membre affiche désormais les actions de réunion qui lui sont assignées, avec lien vers la réunion concernée.
- Enrichissement de l'ordre du jour : chaque point de l'ordre du jour accepte une durée estimée (1–480 min) et un responsable utilisateur ; le formulaire de création/édition expose ces champs.
Modifications
- Formulaire d'édition des réunions : l'ordre du jour est masqué et exclu de la soumission pour les réunions en cours (
live) ou clôturées (completed), évitant les erreurs 422. - Statut
livedans l'interface : les pages Index et Show affichent maintenant le statutliveavec un badgewarning; le type TypeScript est mis à jour en conséquence. - Validation
storeAction: le champresponsible_user_idest désormais validé et limité aux utilisateurs du tenant courant. emailReportatomique : l'envoi est protégé contre les doublons par unUPDATE … WHERE NULLatomique plutôt qu'une lecture puis écriture.- Email CR : le contenu Markdown du compte-rendu est converti en HTML avant envoi, les destinataires voient le texte formaté plutôt que la syntaxe brute.
Corrections
- Watcher Vue (
AgendaItemPanel) :[...undefined]corrigé en[...(item.actions ?? [])]lorsque la réponse API ne retourne pas la relationactions. - Réponse
updateAgendaItem: charge désormaisactions.responsibleavant de sérialiser, évitant les erreurs côté client. - Clé de pagination
v-fordans Decisions.vue rendue unique (label + url).
Unreleased — Maintenance infrastructure
Modifications (infrastructure)
- Dependabot activé : patches et mises à jour mineures Composer + npm créées automatiquement chaque lundi, groupées par écosystème (Laravel/Filament/Spatie, Vue/Vite, ESLint/TypeScript). Limite de 2 PRs ouvertes par écosystème. Les majors sont exclus et planifiés manuellement.
- CI — gate
yarn build: toutes les PRs (y compris Dependabot npm) doivent passeryarn buildavant d'être mergées. Évite les merge silencieux avec un build Vite cassé. - Patches manuels appliqués :
vue3.5.28→3.5.32,reka-ui2.8.0→2.9.6,eslint9.39.2→9.39.4,vite7.3.1→7.3.2,prettier3.8.1→3.8.3,dompurify3.3.3→3.4.0, ainsi que les dépendances Composer (Filament, Spatie, etc.). - Politique lots majors : 4 lots planifiés — Lot A Inertia v3 (mai 2026), Lot B Vite v8 (juin), Lot C TypeScript v6 + ESLint (juillet), Lot D Filament v5 (Q4). Issues GitHub #76–#79 créées avec checklists de migration.
- Documentation : Docs/Development/Dependencies.md documente la politique complète, les couplages à respecter et la procédure par lot.
0.4.7.0 - 2026-04-22
Corrections
- Sécurité multi-tenant :
MeetingReportmanquait le traitBelongsToTenant— les comptes-rendus n'étaient pas filtrés par tenant. Migration de backfill ajoutée (tenant_idsurmeeting_reports). - Injection cross-réunion : il était possible d'envoyer l'ID d'un participant d'une autre réunion dans
updateAttendance. La validationRule::existsscopée surmeeting_idbloque désormais ces requêtes au niveau FormRequest. - N+1 sur la présence : les mises à jour de présence faisaient une requête SQL par participant. Remplacé par
batchUpdateAttendance()qui groupe les UPDATE par statut. - Dégradation du statut de rapport : fermer une réunion avec des notes écrasait silencieusement un rapport
ValidatedenDraftviaupdateOrCreate. Remplacé par un create/update explicite qui préserve le statut existant. - Double validation : il était possible de valider un rapport déjà validé. Garde
abort_unless(Draft)ajoutée. - Contenu vide validé : un rapport sans contenu (ou contenu en espaces) pouvait être validé. Garde
abort_if(blank())ajoutée. - Annulation impossible : tenter d'annuler une réunion déjà terminée ou annulée renvoyait une erreur non gérée. Retourne maintenant 422.
- Réactivité Vue : le contenu du rapport ne se synchronisait pas après une navigation Inertia. Watch ajouté sur
props.meeting.report?.content.
0.4.6.0 - 2026-04-21
Modifications
- Migration Vite v8 (Lot B) : mise à jour de
vitev7 → v8 etlaravel-vite-pluginv2 → v3. Le build Rolldown remplace Rollup comme bundler interne. Adaptation demanualChunksen fonction (requis par Rolldown — la forme objet n'est plus acceptée). Aucune modification des pages Vue ni de la configuration Inertia.
0.4.5.0 - 2026-04-21
Modifications
- Migration Inertia v3 (Lot A) : mise à jour de
inertia-laravelv2 → v3 et@inertiajs/vue3v2 → v3. Le comportement de navigation SPA, les titres de page, les formulairesuseFormet le panneau d'administration Filament sont inchangés. La configurationconfig/inertia.phpest enrichie des nouvelles options v3 (SSR error handling,expose_shared_prop_keys,history.encrypt). - Correction de déploiement :
inertiajs/inertia-laraveldéplacé derequire-devversrequiredanscomposer.json— le package est une dépendance runtime nécessaire en production.
0.4.4.0 - 2026-04-17
Ajouts
- Reçus de paiement PDF : téléchargement et envoi par email depuis la fiche inscription. Le reçu inclut les coordonnées de l'association, les informations de l'adhérent et du payeur, le détail des paiements reçus et les informations réglementaires (RNA, SIRET).
- Email "Votre reçu de paiement" : l'adhérent (ou le payeur s'il est renseigné) reçoit le reçu en pièce jointe avec un message récapitulatif.
- Adresse postale de l'association : les champs adresse, code postal et ville sont maintenant configurables dans les paramètres de l'association et utilisés dans les reçus PDF.
0.4.3.0 - 2026-04-16
Ajouts
- Fiche membre — onglet Activités — nouvel onglet listant les inscriptions du membre, groupées par saison. Chaque inscription affiche le nom de l'activité, les créneaux horaires (jour, heure, durée, salle) et le statut de l'inscription. Un lien vers la fiche cours est disponible pour les utilisateurs ayant accès aux paramètres.
- Fiche membre — onglet Payeur (modifier) — deux boutons d'édition permettent désormais de modifier directement l'adresse de facturation et la méthode de paiement préférée via des dialogues modaux, sans quitter la fiche membre.
Corrections
- Payeur — effacement des champs adresse — lors de la mise à jour de l'adresse de facturation, envoyer une valeur
nullvide un champ nullable (ligne 2, région…). Auparavant, la logique?? ancienne_valeurempêchait de vider ces champs. - Activités — clés de créneaux horaires — les clés de rendu Vue pour les créneaux utilisent désormais
dayOfWeek-startTimeau lieu dedayOfWeekseul, évitant les doublons lorsqu'un cours a deux plages horaires le même jour.
0.4.2.0 - 2026-04-16
Modifications
- Fiche membre — onglet Identité — les informations sont désormais organisées en cartes distinctes : Identité (prénom, nom, date de naissance), Contact (email, téléphone), Adresse, Consentements RGPD, et Responsables légaux. Auparavant, email et téléphone étaient regroupés avec le prénom/nom sous "Informations personnelles".
- Fiche membre — onglet Identité — la section "Responsables légaux" est maintenant intégrée directement dans l'onglet Identité (au lieu d'être affichée en dehors des onglets, en bas de page), ce qui améliore la cohérence de navigation.
- Fiche membre — onglet Adhérent — la carte "Documents acceptés" (statuts de l'association, règlement intérieur) est fusionnée avec la carte "Historique" sous le titre "Documents & Historique". La carte "Payeurs associés" occupe désormais toute la largeur.
- Libellés — "Type d'abonnement" renommé en "Type d'adhésion" dans l'onglet Adhérent.
Corrections
- Consentements RGPD — la date de mise à jour affiche "Aucune mise à jour enregistrée" lorsqu'aucune date n'est renseignée, au lieu du texte grammaticalement incorrect "Mis à jour le Non renseigné".
0.4.1.1 - 2026-04-15
Ajouts
- Badge compteur de membres financés — l'onglet "Payeur" de la fiche membre affiche maintenant un badge indiquant le nombre de membres financés par ce payeur, directement sur l'intitulé de l'onglet.
Corrections
- Lien payeur dans la fiche adhérent — le clic sur une carte payeur dans l'onglet "Payeurs associés" d'une fiche membre navigue maintenant correctement vers la fiche de ce membre. Auparavant, le lien pointait vers
/persons/{id}(route inexistante) et retournait une 404. Un payeur sans compte adhérent affiche une carte non-cliquable (cursor-default) au lieu d'un lien cassé vers#. - Lien membres financés dans l'onglet payeur — le clic sur un membre financé dans l'onglet "Payeur" d'une fiche navigue maintenant correctement vers la fiche de ce membre adhérent. Le lien utilisait
personIdau lieu deid(l'identifiant du membre) et retournait une 404.