# SD Consulting v2

Réécriture complète de l'outil de ticketing/suivi de projet, sur une base PHP 8
saine, déployable sur mutualisé OVH (PHP + MySQL, déploiement FTP, sans CLI requise).

## Ce qui est en place (socle)

- **Cœur technique** : autoloader PSR-4, front controller + routeur, PDO (requêtes
  préparées partout), sessions sécurisées, protection CSRF, rendu de templates
  avec échappement systématique, messages flash.
- **Authentification** : login par mot de passe **haché** (`password_hash`),
  « se souvenir de moi » par token rotatif en base, réinitialisation par token
  email, journal de connexions, gestion **multi-projets** (sélecteur + rôles).
- **Modèle de données assaini** (`database/schema.sql`) : `users`, `clients`,
  `projects`, `memberships`, `tickets`, `comments`, `attachments`, `statuses`,
  `ticket_subscriptions`, `ticket_reads`, `remember_tokens`, `password_resets`,
  `login_log`.
- **Emails** via API Mailjet (cURL direct, sans SDK).
- **Migration** depuis l'ancienne base (`database/migrate_from_legacy.php`).

## Reste à construire (étapes suivantes)

- Module **tickets** (liste, filtres par statut, recherche, tri, détail).
- Module **commentaires** + éditeur riche **avec assainissement HTML** (anti-XSS).
- Module **pièces jointes** sécurisé (whitelist, stockage hors webroot, service
  contrôlé) + migration des fichiers `pics/` de la V1.
- **Notifications email** + abonnements + liens directs **signés** (remplacent le
  « lien magique » non sécurisé de la V1).
- **SSO externe** (`accessfromapp`) en version signée (HMAC + secret partagé).
- Back-office d'administration.

## Arborescence

```
v2/
├── config/          secrets (config.php, NON versionné) + modèle (config.sample.php)
├── src/             code applicatif (hors webroot)
│   ├── Core/        Database, Router, View, Auth, Csrf, Flash, Mailer
│   └── Controllers/
├── templates/       vues PHP (hors webroot)
├── storage/         uploads + logs (hors webroot)
├── database/        schema.sql + script de migration
├── public/          SEUL dossier exposé (index.php, .htaccess, assets)
└── routes.php
```

## Installation

1. **Config** : copier `config/config.sample.php` en `config/config.php` et remplir :
   - identifiants MySQL (⚠️ **faire tourner le mot de passe DB** de la V1, compromis) ;
   - `app_key` : `php -r "echo bin2hex(random_bytes(32));"` ;
   - clés **Mailjet** (régénérées, les anciennes sont compromises) ;
   - `sso_secret` (aléatoire).
2. **Base** : importer `database/schema.sql` (phpMyAdmin OVH ou CLI).
3. **Migration** (reprise des données V1) :
   - CLI : `php database/migrate_from_legacy.php --fresh`
   - ou web : `https://.../migrate_from_legacy.php?key=<app_key>&fresh=1`
     puis **supprimer le fichier** du serveur.

## Déploiement OVH mutualisé

- Pointer le **dossier racine du domaine** (multisite OVH) sur `…/v2/public`.
- Si ce n'est pas possible, les dossiers sensibles sont déjà protégés par des
  `.htaccess` « deny all » (config, src, templates, storage, database).
- HTTPS est forcé par `public/.htaccess`.

## Principes de sécurité (vs la V1)

- Plus aucun secret en clair dans le code → tout dans `config/config.php` (hors git).
- Requêtes préparées exclusivement (fin des injections SQL).
- Mots de passe hachés, jamais renvoyés ni affichés.
- Jetons CSRF sur tous les POST, échappement HTML en sortie.
- Liens d'accès direct = vrais tokens aléatoires (à venir), plus de formule devinable.
- Uploads : whitelist + stockage hors racine web (à venir avec le module).
