# Site de Maud Gaquère — psychologue clinicienne (Guadeloupe)

Site vitrine avec back-office sur mesure.
**Symfony 7.4 · PHP 8.3 · MySQL 8.4 · Twig · Webpack Encore · Docker**

---

## Démarrer en local

```bash
docker compose up -d
npm install && npm run dev

docker compose exec php php bin/console doctrine:migrations:migrate
docker compose exec php php bin/console doctrine:fixtures:load
```

| Service | Adresse |
|---|---|
| Site | <http://localhost:8080> |
| Back-office | <http://localhost:8080/admin> |
| phpMyAdmin | <http://localhost:8081> |
| MailHog | <http://localhost:8025> |

Compte d'administration des fixtures : `admin@salam-gp.com` / `Admin1234!`

> Les ports sont surchargeables pour cohabiter avec les autres projets de la
> machine : `GAQUERE_HTTP_PORT=8090 docker compose up -d`

## Tests

```bash
docker compose exec php php bin/console --env=test doctrine:database:create --if-not-exists
docker compose exec php php bin/console --env=test doctrine:migrations:migrate --no-interaction
docker compose exec php php bin/console --env=test doctrine:fixtures:load --no-interaction
docker compose exec php php bin/phpunit
```

43 tests, 104 assertions.

---

## Contrainte de design

Les maquettes de `design-reference/` **font foi** pour toute la présentation :
structure, couleurs, espacements, animations. Le code les reproduit sans
initiative. Quand le cahier des charges et une maquette divergent, la maquette
l'emporte et l'écart est consigné dans `TODO.md`.

Seule transformation de forme admise : les maquettes expriment les survols par
un attribut propriétaire `style-hover` que les navigateurs ignorent ; il est
transcrit en règles `:hover` (classes `.mgh-*` dans `assets/styles/app.css`),
valeur pour valeur.

Scripts de contrôle :

```bash
bash design-reference/check-pages.sh   # marqueurs structurels par page
bash design-reference/check-seo.sh     # titles, descriptions, JSON-LD
bash design-reference/check-admin.sh   # accès back-office
bash design-reference/check-webp.sh    # négociation de contenu WebP
```

---

## Structure

```
assets/            front (Webpack Encore) — app.js et admin.js
config/            configuration Symfony
deploy/            guides et script de déploiement OVH
design-reference/  maquettes .dc.html + scripts de contrôle
docs/              guides Maud, formation, exploitation
infra/             domaine, e-mails, Doctolib, Git/SSH
src/
  Command/         purge RGPD
  Controller/      site public + Admin/
  Entity/          Page, Atelier, Faq, Contact, DemandeAtelier, MediaFile, User
  Form/            formulaires publics + Admin/
  Service/         contact, demandes, hCaptcha, médias
templates/         gabarits Twig
tools/             conversion WebP
```

---

## Points à connaître

- **Les e-mails partent synchronement.** Le routage asynchrone par défaut de
  Symfony supposerait un worker permanent, fragile sur mutualisé OVH : les
  messages resteraient en file sans que personne ne le voie.
- **Le CSRF est adossé à la session.** Symfony 7.4 active par défaut un CSRF
  sans état qui exige un script fourni par `stimulus-bundle`, désinstallé au
  profit d'Encore.
- **Les images sont servies en WebP par négociation de contenu** (nginx en
  local, `.htaccess` en production) : 10,2 Mo → 890 Ko, sans modifier une
  seule URL des gabarits.
- **Ne jamais charger les fixtures en production** : elles purgent la base.

---

## Documentation

| Fichier | Pour qui |
|---|---|
| `TODO.md` | écarts assumés et points en suspens |
| `docs/GUIDE_BACKOFFICE_MAUD.md` | Maud |
| `docs/FORMATION_PLAN.md` | séance de prise en main |
| `deploy/DEPLOYMENT_GUIDE.md` | mise en production |
| `deploy/VERIFICATION_PROD.md` | après chaque déploiement |
| `CHECKLIST_RECETTE_CLIENT.md` | validation avec Maud |
| `AUDIT_ACCESSIBILITE.md` | conformité WCAG |
| `CHECKLIST_RESPONSIVE.md` | tests d'affichage |

Suivi des tâches : [pipeline Notion](https://app.notion.com/p/78ba32181f324b9a8dd844071601fd80)
