# Paramètres (`/params`) Page admin centralisant toute la configuration applicative. Toutes les valeurs sont persistées dans `data/settings.json` sauf la section « Correspondances classe → profession » qui vit dans son propre fichier `data/profession_mapping.json`. ## Sections ### Application - **URL de base** : utilisée pour générer les liens dans les emails (reset mot de passe, enrôlement). Ex : `https://dashboard.eptm-automation.ch`. Stocké dans `settings.app_base_url`. ### Correspondances classe → profession Mapping `préfixe de classe → profession` utilisé pour pré-remplir le champ « Profession » sur les avis de retenue, et pour `ApprentiFiche.profession`. - Tableau des mappings actuels (suppression possible) - Chips jaunes listant les classes en base **sans correspondance** — clic pour pré-remplir le formulaire - Bouton « Ajouter / mettre à jour » : insère ou remplace - Bouton « Appliquer aux fiches existantes » : recalcule `ApprentiFiche.profession` pour tous les apprentis selon le mapping actuel (logging dans `operations.log`) ### Horaires de classe (« Absent toute la journée ») Définit pour chaque classe + chaque jour de la semaine : - Le **type de jour** : Théorie / Pratique / Matu / — - Les **périodes de cours** (1 à 10) UI : dropdown classe + grille 5 colonnes (Lun → Ven) × 10 cases. Le bouton « Absent toute la journée » sur la fiche apprenti utilise ce mapping pour marquer comme `N` uniquement les périodes correspondantes au jour de la semaine sélectionné. Le **badge** (Théorie/Pratique/Matu) s'affiche aussi dans le panneau d'édition. Stocké dans `settings.class_schedule` : ```json { "AUTOMAT 1": { "MON": { "type": "theorie", "periods": [1, 2, 3, 4] }, "TUE": { "type": "pratique", "periods": [5, 6, 7, 8] } } } ``` ### Avis de sanction - **Texte de description par défaut** (champ `TexteDescription` du PDF) - **Chef de section** par défaut (champ `CS`) Repris à la création de chaque avis de sanction si l'utilisateur ne saisit rien d'autre. ### Configuration email - **Serveur SMTP** + **port** - **Login** + **mot de passe** SMTP - **Expéditeur** (header From) - **Email admin (feedback in-app)** : destinataire des notifications du chat feedback Brevo (smtp-relay.brevo.com) est utilisé en prod. ### Connexion Escada (synchro automatique) - **Identifiant Escada** (email Keycloak) - **Mot de passe Escada** - **Clé secrète 2FA (TOTP)** — format Base32 Permettent à la sync automatique (cron) et à la sync manuelle de se connecter sans intervention. Le code TOTP est généré à la volée par `pyotp.TOTP(secret).now()`. > Ces identifiants servent uniquement aux tâches automatiques. Pour l'enrôlement self-service d'un user, c'est l'user qui saisit ses propres creds dans le popup de profil (cf. doc Auth). ### Template email Template appliqué à l'envoi de récap d'absences depuis la fiche apprenti : - **Objet** : par défaut `Document EPTM — {nom_complet} ({classe})` - **Corps** : par défaut un message court avec `{prenom}` + `{classe}` Variables disponibles : `{prenom}`, `{nom}`, `{nom_complet}`, `{classe}`, `{nb_absences}`, `{nb_excusees}`, `{nb_non_excusees}`, `{nb_a_traiter}`, `{semestre}`, `{date_du_jour}`. ## Fichier `data/settings.json` Structure typique : ```json { "app_base_url": "https://dashboard.eptm-automation.ch", "texte_sanction": "Selon le règlement de l'EM, ...", "chef_section": "Patrick Rausis", "smtp_host": "smtp-relay.brevo.com", "smtp_port": 587, "smtp_login": "...", "smtp_password": "...", "smtp_sender": "EPTM Automation ", "feedback_admin_email": "admin@eptm-automation.ch", "escada_username": "...", "escada_password": "...", "totp_secret": "...", "email_subject": "Document EPTM — {nom_complet} ({classe})", "email_body": "Bonjour {prenom}, ...", "class_schedule": { ... } } ``` Audit minimal : chaque modification depuis `/params` est sauvegardée d'un coup (toute la clé concernée). Pas de versioning ; un backup ponctuel de `data/settings.json` suffit.