# Pilotage Chambéry BD

Application interne Laravel de gestion des invitations, de la logistique et du planning du festival Chambéry BD. L’interface est intégralement en français, responsive, et repose sur Blade, Tailwind CSS et Alpine.js.

## Installation locale

Prérequis : PHP 8.3 ou supérieur avec SQLite et Zip, Composer, Node.js et npm.

```bash
composer install
cp .env.example .env
php artisan key:generate
touch database/database.sqlite
php artisan migrate --seed
npm install
npm run build
php artisan serve
```

Ouvrir ensuite `http://127.0.0.1:8000`. Pour travailler avec le rechargement automatique :

```bash
composer run dev
```

La base SQLite convient à la démonstration. En production, configurer PostgreSQL ou MySQL dans `.env`, puis exécuter `php artisan migrate --force`. Le disque `local` pointe vers `storage/app/private` et conserve les pièces jointes hors du répertoire public.

## Comptes de démonstration

Le seeder crée des données entièrement fictives pour les éditions 2025 et 2026. Mot de passe commun en environnement local : `ChamberyBD-demo-2026`.

| Profil | Adresse |
|---|---|
| Administrateur | `admin@chamberybd.test` |
| Responsable auteurs | `auteurs@chamberybd.test` |
| Responsable programmation | `programmation@chamberybd.test` |
| Chauffeur | `chauffeur@chamberybd.test` |
| Libraire officiel | `libraire@chamberybd.test` |

Les identifiants de démonstration doivent être remplacés avant toute utilisation avec des données réelles.

## Modèle métier

`authors` contient l’identité pérenne. `participations` porte le dossier annuel, avec une contrainte unique `(edition_id, author_id)`. Les accompagnants, présences, échanges, transports, chambres, missions et états logistiques restent attachés à ce dossier ou à son édition. Copier une sélection d’une ancienne édition crée uniquement de nouveaux dossiers « à inviter » ; aucune donnée logistique ou sensible n’est recopiée.

Une activité collective reste un seul enregistrement relié à plusieurs participations. Une chambre partagée reste également un seul enregistrement relié à plusieurs occupants. Les éditions archivées sont en lecture seule pour tous les profils, sauf l’administrateur qui peut les rouvrir.

## Droits d’accès

Les rôles sont cumulables. Chaque rôle agrège des permissions séparées par action et module : consultation et gestion des auteurs, invitations, logistique, données sensibles, planning, transferts, récompenses, documents et exports. Un compte peut être limité à une liste d’éditions. Les contrôles sont appliqués dans les Form Requests, contrôleurs, téléchargements et exports ; les vues masquent aussi les actions indisponibles.

- Le libraire accède aux auteurs, activités publiques et récompenses, sans accompagnants, alimentation, billets, réservations ou notes internes.
- Le chauffeur voit uniquement ses missions et peut en modifier le statut.
- Les fichiers utilisent des routes authentifiées et le droit du dossier parent.
- Les préférences alimentaires, allergies et besoins particuliers sont chiffrés par les casts Eloquent.
- Les changements métier majeurs sont consignés dans `audit_logs`, en excluant les valeurs sensibles.

## Calcul des disponibilités

`App\Services\AvailabilityService` est la source de vérité côté serveur. Il utilise des intervalles semi-ouverts : `10:00–11:00` et `11:00–12:00` sont contigus. Pour une activité, la plage occupée comprend la préparation, la marge de trajet avant et la marge après. Le service croise :

- les fenêtres de présence et indisponibilités du dossier annuel ;
- les autres activités non annulées de chaque auteur ;
- les segments de transport et les missions de transfert ;
- les horaires publics configurés pour les types qui les exigent ;
- les affectations de chauffeurs, véhicules et leur capacité.

Un transfert lié à l’activité contrôlée n’est pas compté une seconde fois lorsqu’il matérialise sa marge de déplacement. Une présence inconnue produit un contrôle incomplet. La confirmation est refusée tant qu’un conflit ou une présence inconnue subsiste. Les écritures de planning verrouillent les participations concernées et utilisent un numéro de version pour détecter une modification concurrente.

## Documents et exports

L’application génère réellement : planning PDF et Excel, liste des hôtels, feuilles de route chauffeurs et récapitulatif individuel auteur. Chaque document indique l’édition et l’heure de génération. Les exports publics retirent les activités internes ; les exports logistiques nécessitent la permission interne.

## Vérification

```bash
php artisan test --compact
vendor/bin/pint --dirty --format agent
npm run build
```

Les tests couvrent l’unicité des dossiers annuels, la reprise d’historique, les activités collectives, les conflits et marges, les créneaux contigus, les dédicaces hors horaires, les annulations, les chambres partagées, les nuitées, les missions, les droits par édition, les fichiers privés et les alertes après modification d’un transport.

## Hypothèses et limites de cette version

- Les échanges d’invitation sont saisis manuellement et l’envoi des documents reste manuel.
- Les fuseaux des transports sont stockés explicitement ; l’interface utilise Europe/Paris par défaut.
- Les affectations de dédicaces sont manuelles, sans moteur d’optimisation.
- Une modification de transport ou d’activité source signale les missions à revalider sans modifier silencieusement leur horaire.
- Le portail auteur, les réservations prestataires, la synchronisation de messagerie, le suivi temps réel et la comptabilité restent hors périmètre.
