# Lambec Trans Express — site & CMS

Site vitrine + espace de gestion (clients, planning, documents) pour
l'activité de conduite PL/SPL indépendante.

PHP 8.1+ · SQLite · aucune dépendance externe, aucun Composer.

---

## Démarrage rapide

```bash
php bin/install.php
```

Le script crée la base, y charge le contenu par défaut, crée le compte
d'administration et **affiche un mot de passe généré — notez-le, il ne sera
plus affiché**. Il est relançable sans risque : les données existantes sont
préservées.

Puis ouvrez `/admin`.

### En local sous Laragon

Le fichier `.claude/launch.json` lance déjà le serveur intégré de PHP :

```bash
php -S localhost:8123 -t public bin/dev-router.php
```

Pour un vrai hôte virtuel Laragon (`http://lambec.test`), pointez la racine
du site sur le sous-dossier `public/`.

---

## Arborescence

```
lambec/
├── public/          ← RACINE WEB (document root)
│   ├── index.php        contrôleur frontal : toutes les requêtes passent ici
│   ├── .htaccess        URL propres, HTTPS, redirections des anciennes pages
│   └── assets/          CSS, JS et images
├── app/
│   ├── bootstrap.php    autoloader, session, base, gestion des erreurs
│   ├── routes.php       table des routes
│   ├── helpers.php      fonctions de vue (échappement, dates, montants)
│   ├── Core/            routeur, base, vues, authentification, validation
│   ├── Controllers/     un contrôleur par domaine
│   ├── Models/          accès aux données
│   └── Views/           gabarits PHP (site, admin, documents A4)
├── config/
│   ├── config.php       configuration commune
│   └── local.php        surcharges du poste de dev — NE PAS METTRE EN LIGNE
├── database/
│   ├── schema.sql       structure des tables
│   ├── seed.php         contenu initial (textes, CGV, services)
│   ├── migrations/      évolutions de structure, appliquées une seule fois
│   └── lambec.sqlite    LA BASE — à sauvegarder régulièrement
├── storage/             journaux d'erreurs et sauvegardes
├── bin/                 scripts en ligne de commande
└── _legacy/             anciennes pages HTML, conservées pour référence
```

**`public/` est la seule partie exposée au web.** Le reste — dont la base de
données — est hors d'atteinte depuis un navigateur.

---

## Déploiement sur Plesk

1. **Envoyez tout le dossier** sauf `_legacy/`, `.claude/` et
   `config/local.php`.

2. **Réglez la racine du site sur `public`**
   Plesk → Sites Web & Domaines → *lambec.fr* → **Paramètres d'hébergement** →
   champ *Racine du document* : remplacez `httpdocs` par `httpdocs/public`.

   > Si vous ne pouvez pas la modifier, le site fonctionne quand même : des
   > fichiers `.htaccess` interdisent l'accès à `app/`, `config/`, `database/`
   > et `storage/`. Déplacer la racine reste nettement plus sûr.

3. **Vérifiez la version de PHP**
   Plesk → *PHP* → PHP 8.1 ou supérieur, avec `pdo_sqlite` et `mbstring`.

4. **Droits d'écriture** sur `database/`, `storage/logs/`,
   `storage/backups/` et `public/uploads/` (le propriétaire doit être
   l'utilisateur du site).

5. **Installez** — via SSH :
   ```bash
   php bin/install.php --email=contact@lambec.fr
   ```
   Sans accès SSH, Plesk propose *Outils & Paramètres → Planificateur de
   tâches* pour exécuter la commande une seule fois.

6. **Activez HTTPS** (Let's Encrypt dans Plesk). Le `.htaccess` force déjà la
   redirection vers HTTPS et vers le domaine sans `www`.

7. **Supprimez `config/local.php`** s'il a été envoyé par erreur : il force le
   mode débogage, qui affiche les erreurs aux visiteurs.

---

## Sauvegardes

**Toute l'application tient dans un fichier : `database/lambec.sqlite`.**
Clients, missions, factures, contenu du site : tout est là.

Depuis l'administration : **Réglages → Télécharger une sauvegarde**. Le
fichier obtenu est une copie cohérente, même si vous travaillez pendant la
sauvegarde. Les 10 dernières sont conservées côté serveur.

Sauvegarde automatique quotidienne (Plesk → Tâches planifiées) :

```bash
php -r "copy('/var/www/vhosts/lambec.fr/httpdocs/database/lambec.sqlite', '/var/www/vhosts/lambec.fr/backups/lambec-'.date('Y-m-d').'.sqlite');"
```

---

## Commandes disponibles

| Commande | Effet |
|---|---|
| `php bin/install.php` | Installe la base, applique les migrations en attente |
| `php bin/install.php --email=x@y.fr` | Choisit l'adresse de connexion |
| `php bin/install.php --password=…` | Impose un mot de passe (réinitialisation) |
| `php bin/install.php --reset-content` | Réinjecte les textes par défaut (**écrase vos modifications**) |
| `php bin/check.php` | Vérifie que rien n'est cassé (base jetable, vraies données intactes) |
| `php bin/check.php --url=… --email=… --password=…` | Vérifie en plus que toutes les pages répondent |

`bin/check.php` est à lancer après chaque modification du code, et avant chaque
mise en ligne. Les conventions à respecter pour modifier sans rien casser sont
dans [CLAUDE.md](CLAUDE.md).

---

## Anciennes URL

Les adresses `.html` d'origine redirigent en 301 vers les nouvelles, afin de
ne perdre ni les liens partagés ni le référencement acquis :

| Ancienne | Nouvelle |
|---|---|
| `/index.html`, `/index-old.html` | `/` |
| `/cgv.html` | `/cgv` |
| `/cus.html` | `/conditions-utilisation` |
| `/pcml.html` | `/mentions-legales` |

`ccp.html`, `facture.html` et `etat-des-lieux.html` étaient des gabarits à
remplir à la main : ils sont désormais générés depuis l'administration et
n'ont plus d'URL publique.

---

## Sécurité

- Mots de passe hachés en bcrypt (coût 12)
- Jeton anti-CSRF sur chaque formulaire de modification
- Blocage 15 minutes après 5 tentatives de connexion échouées
- Toutes les requêtes SQL sont préparées
- Toute valeur affichée passe par `e()` (échappement HTML)
- Cookie de session `HttpOnly`, `SameSite=Lax`, `Secure` en HTTPS
- `/admin` exclu de l'indexation (`robots.txt` + balise `noindex`)
