# Suivis — calcul centralisé, synchronisation et envoi journalier progressif

## Calcul officiel sur 100

Chaque note est d'abord ramenée sur 100, puis pondérée par le coefficient du type de suivi :

```text
moyenne = somme((note / barème × 100) × coefficient) / somme(coefficients)
```

Exemple :

```text
Discipline : 16/20, coef. 1 = 80 × 1
Hygiène : 18/20, coef. 1 = 90 × 1
Évaluation Qur'an : 14/20, coef. 2 = 70 × 2
Évaluation Motoon : 18/20, coef. 2 = 90 × 2

Total standardisé : 490/600
Moyenne : 81,67/100
```

Le même service est utilisé pour :

- les totaux journaliers ;
- le classement journalier ;
- la TV ;
- les résultats de période ;
- les PDF individuels et généraux ;
- les statistiques utilisées pour l'envoi des PDF.

Seuls les types actifs, notés, visibles aux parents et appartenant aux catégories `PEDAGOGIE`, `AADAB` ou `ACTIVITES` entrent dans le résultat officiel.

## Synchroniser les anciens coefficients

Simulation recommandée :

```bash
APP_ENV=prod APP_DEBUG=0 php bin/console app:suivis:sync-coefficients --school=alqiyam --dry-run
```

Application réelle :

```bash
APP_ENV=prod APP_DEBUG=0 php bin/console app:suivis:sync-coefficients --school=alqiyam
```

Pour une période seulement :

```bash
APP_ENV=prod APP_DEBUG=0 php bin/console app:suivis:sync-coefficients --school=alqiyam --from=2026-06-01 --to=2026-06-30
```

Les barèmes historiques ne sont pas remplacés par défaut. Pour les synchroniser aussi :

```bash
APP_ENV=prod APP_DEBUG=0 php bin/console app:suivis:sync-coefficients --school=alqiyam --sync-baremes
```

## PDF de période

La génération et l'envoi des PDF de période continuent d'utiliser tous les suivis présents sur la période, même s'ils ne sont pas encore publiés aux parents. La publication parent n'est donc pas une condition de génération du PDF.

## Publication journalière et WhatsApp

La publication reste réservée à l'administrateur :

1. les suivis sont publiés dans le portail parent ;
2. la page de synthèse s'ouvre ;
3. une modal lance l'envoi progressif ;
4. chaque numéro WhatsApp est traité séparément ;
5. une pause de 5 secondes est appliquée entre tous les numéros ;
6. le journal affiche élève, parent, numéro masqué, réussite ou erreur.

Le message contient la présence, le résultat sur 100, le rang, les principaux éléments et le lien vers la fiche enfant dans le portail parent.
