# SATM — Système de Suivi et d'Attribution des Dossiers de Transit

Application Symfony (monolithique) de suivi en temps réel des dossiers de transit (BL), avec workflow d'état, traçabilité complète, alertes automatiques et vues par rôle. Voir `SATM_Cahier_des_charges.pdf` pour les spécifications d'origine.

## Stack

- Symfony 7.4, Doctrine ORM (MySQL/MariaDB), Symfony Workflow, Symfony Security (Voters), Symfony Notifier/Mailer, Symfony Scheduler.
- Twig, intégration du template **Datta Able** (Tailwind) — sources dans `design/DattaAble-1.0.0/`, assets compilés copiés dans `public/assets/`.
- Export Excel (PhpSpreadsheet) et PDF (Dompdf).

## Installation

1. **Base de données** : MySQL/MariaDB doit tourner sur `127.0.0.1:3306` (ici via XAMPP : `C:\xampp\mysql\bin\mysqld.exe`, non ajouté au PATH par défaut). La base `satm` doit exister (`CREATE DATABASE satm CHARACTER SET utf8mb4;`).
2. `composer install`
3. Copier/adapter `.env` si besoin (`DATABASE_URL`, `MAILER_DSN`). En dev, `MAILER_DSN=null://null` (les emails sont "envoyés" silencieusement, sans SMTP réel — seules les notifications in-app sont visibles).
4. `php bin/console doctrine:migrations:migrate`
5. `php bin/console doctrine:fixtures:load` (données de démonstration, voir comptes ci-dessous)
6. Lancer le serveur : `symfony server:start` ou `php -S 127.0.0.1:8000 -t public`

## Comptes de démonstration

Mot de passe pour tous : `Passer123!`

| Rôle | Email |
|---|---|
| Administrateur | admin@satm.local |
| Chef Logistique | chef.logistique@satm.local |
| Contremaître | contremaitre1@satm.local / contremaitre2@satm.local |
| Chef Transit | chef.transit@satm.local |

## Cycle de vie d'un BL

`facturation → bad → bae → pret_gate → livraison → cloture` (Symfony Workflow, state machine `bl_workflow` dans `config/packages/workflow.yaml`).

- Le passage en `bad` exige une date de fin BAD.
- Les dossiers `express` (`typeDossier`) peuvent sauter directement de `bad` à `livraison`.
- Retour en arrière possible (ex. `bae → bad`), avec motif obligatoire, tracé dans `HistoriqueBl`.
- Chaque transition est historisée (qui, quand, ancien/nouvel état, motif) et déclenche des notifications in-app (+ email).

## Alertes automatiques

Commande : `php bin/console app:check-alerts`
- Dépassement de la date de fin BAD → notification + email au contremaître et aux chefs logistique.
- Inactivité prolongée (seuil paramétrable dans **Administration → Paramétrage**, défaut 48h) → notification.

Planification automatique via Symfony Scheduler (toutes les 15 min) : lancer un worker en tâche de fond avec :
```
php bin/console messenger:consume scheduler_default -vv
```
En production sur Windows, ce worker peut être enregistré comme tâche planifiée / service (ex. via NSSM ou le Planificateur de tâches Windows).

## Points laissés ouverts par le cahier des charges (choix faits pour cette v1)

- Retour en arrière : autorisé avec motif obligatoire.
- Notifications : email + in-app (pas de SMS).
- Documents joints : hors périmètre v1.
- Multi-client : hors périmètre v1.
- Règles précises de saut d'état : mécanisme `typeDossier` (standard/express), extensible si le client précise d'autres cas.

## Limites connues

- Git n'est pas installé sur cette machine : le dépôt n'a pas été initialisé (`git init` à faire manuellement si besoin).
- Pas de suite de tests automatisés (hors périmètre du temps imparti) ; la vérification a été faite manuellement de bout en bout (voir historique de session).
