Aller au contenu
Candidater

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 transcript de la réunion et est visible dans le compte-rendu final.
  • Provider de transcription configurable : config/ai.php expose default_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 cookie XSRF-TOKEN via l'en-tête X-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 du finally de handle() — é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-label statique 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 live dans l'interface : les pages Index et Show affichent maintenant le statut live avec un badge warning ; le type TypeScript est mis à jour en conséquence.
  • Validation storeAction : le champ responsible_user_id est désormais validé et limité aux utilisateurs du tenant courant.
  • emailReport atomique : l'envoi est protégé contre les doublons par un UPDATE … WHERE NULL atomique 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 relation actions.
  • Réponse updateAgendaItem : charge désormais actions.responsible avant de sérialiser, évitant les erreurs côté client.
  • Clé de pagination v-for dans 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 passer yarn build avant d'être mergées. Évite les merge silencieux avec un build Vite cassé.
  • Patches manuels appliqués : vue 3.5.28→3.5.32, reka-ui 2.8.0→2.9.6, eslint 9.39.2→9.39.4, vite 7.3.1→7.3.2, prettier 3.8.1→3.8.3, dompurify 3.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 : MeetingReport manquait le trait BelongsToTenant — les comptes-rendus n'étaient pas filtrés par tenant. Migration de backfill ajoutée (tenant_id sur meeting_reports).
  • Injection cross-réunion : il était possible d'envoyer l'ID d'un participant d'une autre réunion dans updateAttendance. La validation Rule::exists scopée sur meeting_id bloque 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 Validated en Draft via updateOrCreate. 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 vite v7 → v8 et laravel-vite-plugin v2 → v3. Le build Rolldown remplace Rollup comme bundler interne. Adaptation de manualChunks en 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-laravel v2 → v3 et @inertiajs/vue3 v2 → v3. Le comportement de navigation SPA, les titres de page, les formulaires useForm et le panneau d'administration Filament sont inchangés. La configuration config/inertia.php est enrichie des nouvelles options v3 (SSR error handling, expose_shared_prop_keys, history.encrypt).
  • Correction de déploiement : inertiajs/inertia-laravel déplacé de require-dev vers require dans composer.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 null vide un champ nullable (ligne 2, région…). Auparavant, la logique ?? ancienne_valeur empê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-startTime au lieu de dayOfWeek seul, é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 personId au lieu de id (l'identifiant du membre) et retournait une 404.