---
suivi: 1810
date: 2026-10-07
sujet: Salle de brainstorming
chantier: brainstorming
type: feature
statut: poussé
hash: baabb3bc
fichiers:
  - docs/suivi/SUIVI_1810_brainstorming_salle.md
  - app/Http/Controllers/BrainstormingController.php
  - app/Models/Alerte.php
  - app/Models/Brainstorming.php
  - app/Models/BrainstormingHistorique.php
  - app/Models/BrainstormingMessage.php
  - app/Models/BrainstormingParticipant.php
  - app/Models/BrainstormingPiece.php
  - app/Services/Brainstorming/BrainstormingPieceService.php
  - app/Services/Brainstorming/BrainstormingSalleService.php
  - app/Support/Brainstorming/BrainstormingDroits.php
  - app/Support/Brainstorming/BrainstormingVocabulaire.php
  - database/migrations/2026_10_07_160000_create_brainstorming_tables.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - resources/js/Layouts/AppShell.vue
  - resources/js/Pages/Brainstorming/Index.vue
  - resources/js/Pages/Brainstorming/Create.vue
  - resources/js/Pages/Brainstorming/Show.vue
  - routes/web.php
  - public/build/
  - tests/Unit/BrainstormingVocabulaireTest.php
---

# SUIVI #1810 — salle de brainstorming

Salle de discussion, sans agent. Plume, le cahier rédigé et les relances ne sont pas dans ce lot.

## Fiches lues

`SUIVI_1802_diag_brainstorming_reutilisation_aktor.md`, section LEÇON. Elle écarte les conversations Aktor (un propriétaire), le prompt, le quota et le bloc tâches. Ce lot n’appelle pas Anthropic, ne lit pas `assistant_conversations` et ne reprend pas le quota. Il reprend les jetons `@[Nom](azure_id)`, la cloche et Teams depuis la requête web.

Le dépôt par morceaux du foncier (`FoncierDocumentMorceauService`, `foncierMorceaux.js`) reste inchangé. Un service propre au brainstorming reprend la taille de morceau (5 Mo) et le plafond (100 Mo).

## Mapping

| Choix | Libellé affiché | Valeur postée | Libellé relu |
|---|---|---|---|
| État | Idées | idees | Idées |
| État | Discussion | discussion | Discussion |
| État | Synthèse | synthese | Synthèse |
| État | Cahier des charges prêt | cahier_pret | Cahier des charges prêt |
| État | Clos | clos | Clos |
| État (hors frise) | En attente de validation | en_attente_validation | En attente de validation |
| État (hors frise) | Refusé | refuse | Refusé |
| Onglet liste | En cours | en_cours | En cours |
| Onglet liste | Cahier des charges prêt | cahier_pret | Cahier des charges prêt |
| Onglet liste | Clos | clos | Clos |
| Onglet liste | Mes brainstormings | miens | Mes brainstormings |
| Délai de relance | Délai de relance (jours ouvrés) | delai_relance_jours (entier 1 à 30, défaut 3) | relance N jours ouvrés |

Le passage manuel des réglages ne propose que les cinq états de la frise. L’attente et le refus passent par Valider / Refuser.

## Règles posées

- Limite des discussions en cours (Idées, Discussion, Synthèse) : 3, ou 10 si la liste brute `m365GroupNames()` contient `GS_DIRECTION_GENERALE`. `hasM365Group()` n’est pas utilisé.
- Au-delà : état en attente. Cloche vers les comptes dont les groupes bruts contiennent `GS_DSI`. Rien ne s’écrit dans le fil avant validation.
- Lecture : créateur, participants, et `GS_ADMIN_ERP` (liste brute) pour tous. `GS_DSI` ouvre seulement ceux qui attendent une validation.
- Premier message d’un participant autre que le créateur : Idées devient Discussion.
- Mention `@Plume` enregistrée, texte « Plume arrivera bientôt », sans appel externe.
- Teams seulement hors console. Un échec Teams ne bloque pas le message.
- Menu Groupe, visible pour tout salarié connecté. Pas de menu Commercialisation séparé : Groupe est déjà le regroupement (META, Projets prospects, GED).

## Migration

`database/migrations/2026_10_07_160000_create_brainstorming_tables.php`

- brainstormings : createur_id, sujet, objectif, date_debut, date_fin_prevue, delai_relance_jours, etat, budget_ia_consomme (réservé, non utilisé), derniere_activite_le, timestamps, soft deletes.
- brainstorming_participants : brainstorming_id, user_id, derniere_lecture_le, unique (brainstorming_id, user_id).
- brainstorming_messages : brainstorming_id, user_id, auteur_type (personne, plume réservé), contenu, timestamps, soft deletes.
- brainstorming_pieces : brainstorming_id, message_id nullable, user_id, nom_original, chemin, mime, taille.
- brainstorming_historique : brainstorming_id, user_id, type, texte, created_at.

`down()` supprime dans l’ordre inverse.

## Bundles

Index-Cf6hdPcw.js, Create-G_b4o-es.js, Show-Bqzw-3zZ.js, coquille app-HRoJjndO.js.

## DÉPLOIEMENT-TEST

git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan route:clear
php artisan migrate --force
php artisan journal:sync

1. Créer « Gestion documentaire des opérations » avec 3 participants : visible chez eux seulement.
2. Compte standard avec 3 en cours : le 4e est en attente, cloche chez les comptes GS_DSI.
3. Compte dont les groupes bruts contiennent GS_DIRECTION_GENERALE : 10 sans validation.
4. Message avec @ : cloche et Teams chez le mentionné, non-lus à jour.
5. Capture collée, PDF glissé, fichier de 45 Mo : fil et onglet Documents.
6. Non-participant : refus. GS_ADMIN_ERP : accès.
7. Deux navigateurs : le message apparaît en moins de 10 s tant que l’onglet est visible.

## LEÇON

Ne pas brancher cette salle sur Aktor. Les groupes se lisent en brut : un admin ERP sans GS_DIRECTION_GENERALE reste à 3. Le service de morceaux foncier ne se généralise pas : le copier casse les chemins fonciers. Teams reste un appel web, journalisé s’il échoue, jamais bloquant.
