From 3cdbd43c13a2bf4e8d4c5e69c2e4f42acd24f260 Mon Sep 17 00:00:00 2001 From: PTA Date: Tue, 11 Aug 2026 16:16:45 +0200 Subject: [PATCH] Guide d'utilisation accessible depuis toute la navigation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les écrans expliquaient chacun leur propre action, mais rien ne racontait l'enchaînement : un nouvel utilisateur ne pouvait pas deviner qu'un lieu doit exister avant un agent, ni qu'un planning se saisit en brouillon avant d'être validé. La page « faq » déroule ce parcours complet, du paramétrage des lieux au suivi annuel, et répond aux questions qui reviennent (chevauchements, quota dépassé, planning validé à corriger). Son bouton d'accès est ancré à droite de la barre de navigation plutôt que rangé dans un groupe d'intention : le guide n'est pas une étape du travail, c'est un secours permanent. Il est donc volontairement absent de $navigation — c'est aussi ce qui l'empêche d'être repêché par le filet « Autres » et d'apparaître deux fois. La barre défilant horizontalement quand les onglets débordent, le bloc est en position sticky pour rester atteignable. La page reste soumise à la règle V7.8 : le droit vient de acces_role_page, ouvert aux trois rôles. Sans la migration, ni bouton ni page. Co-Authored-By: Claude Opus 5 --- CLAUDE.md | 6 + app/Controllers/PageController.php | 14 + app/Views/layouts/footer.php | 6 +- app/Views/layouts/header.php | 18 +- app/Views/pages/faq.php | 4 + app/Views/pages/role.php | 2 +- app/Views/partials/faq.php | 412 +++++++++++++++++++++++++++++ assets/style.css | 196 ++++++++++++++ database/migration_v7_9d_faq.sql | 30 +++ faq.php | 7 + 10 files changed, 690 insertions(+), 5 deletions(-) create mode 100644 app/Views/pages/faq.php create mode 100644 app/Views/partials/faq.php create mode 100644 database/migration_v7_9d_faq.sql create mode 100644 faq.php diff --git a/CLAUDE.md b/CLAUDE.md index e0d0d93..e23929c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -95,6 +95,12 @@ une migration SQL** (les pages autorisées sont lues en base, pas écrites en PH Une page absente des groupes reste affichée dans un groupe « Autres » : le filet évite qu'un oubli la rende inatteignable. Chaque page passe aussi un `pageSubtitle` décrivant l'action de l'écran. +Seule exception assumée : `faq` (guide d'utilisation) est **volontairement absente de `$navigation`** +et rendue par le bloc `.view-tab-help` ancré à droite de la barre, sous condition `$showHelpTab`. +L'omettre de `$navigation` est ce qui l'empêche d'être aussi repêchée par le filet « Autres » et +d'apparaître deux fois. Elle reste soumise à `acces_role_page` +(`database/migration_v7_9d_faq.sql`, les trois rôles) : sans migration, ni bouton ni page. + ### Chaîne d'un appel ``` diff --git a/app/Controllers/PageController.php b/app/Controllers/PageController.php index 8537d89..ef32ab9 100644 --- a/app/Controllers/PageController.php +++ b/app/Controllers/PageController.php @@ -202,6 +202,20 @@ final class PageController extends Controller ]); } + /** + * Guide d'utilisation. Page purement statique : aucun script, aucun appel + * API, aucune donnée métier. Elle suit malgré tout la règle des droits en + * base — tant que la migration n'est pas jouée, la page est refusée et le + * bouton d'accès n'apparaît pas dans la barre de navigation. + */ + public function faq(): void + { + $this->access->requirePage('faq'); + $this->renderPage('faq', 'Guide d’utilisation', 'faq', [ + 'pageSubtitle' => 'Le parcours complet, du paramétrage des lieux à la validation des plannings, et les réponses aux questions les plus fréquentes.', + ]); + } + private function renderPage(string $view, string $title, string $activePage, array $data = []): void { Security::sendHtmlHeaders(); diff --git a/app/Views/layouts/footer.php b/app/Views/layouts/footer.php index d5fdc2f..8c149f9 100644 --- a/app/Views/layouts/footer.php +++ b/app/Views/layouts/footer.php @@ -28,10 +28,10 @@ window.PTA_PAGE_CONFIG = $pageConfig, ], JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE) ?>; - + - + - + diff --git a/app/Views/layouts/header.php b/app/Views/layouts/header.php index a0144d6..8934d37 100644 --- a/app/Views/layouts/header.php +++ b/app/Views/layouts/header.php @@ -60,6 +60,14 @@ if ($ungrouped !== []) { $visiblePageCount = count($grouped) + count($ungrouped); $showGroupLabels = $visiblePageCount > 4; + +/** + * Le guide n'appartient à aucun groupe d'intention : ce n'est pas une étape du + * travail mais un secours permanent. Il est volontairement absent de + * $navigation — il ne doit apparaître qu'une seule fois, ancré à droite de la + * barre, et jamais repêché par le filet « Autres ». + */ +$showHelpTab = in_array('faq', $allowedPages, true); ?> @@ -67,7 +75,7 @@ $showGroupLabels = $visiblePageCount > 4; <?= htmlspecialchars($pageTitle) ?> — PTA - +
@@ -113,4 +121,12 @@ $showGroupLabels = $visiblePageCount > 4; + + + diff --git a/app/Views/pages/faq.php b/app/Views/pages/faq.php new file mode 100644 index 0000000..e530520 --- /dev/null +++ b/app/Views/pages/faq.php @@ -0,0 +1,4 @@ + Choisir votre accès — PTA - +
diff --git a/app/Views/partials/faq.php b/app/Views/partials/faq.php new file mode 100644 index 0000000..4f3b798 --- /dev/null +++ b/app/Views/partials/faq.php @@ -0,0 +1,412 @@ + 'Le parcours en un coup d’œil', + 'faq-roles' => 'Qui fait quoi : les trois rôles', + 'faq-lieux' => '1. Ajouter un lieu d’affectation', + 'faq-agents' => '2. Ajouter un agent', + 'faq-couverture' => '3. Définir les horaires d’ouverture', + 'faq-vacances' => '4. Renseigner les vacances scolaires', + 'faq-saisie' => '5. Saisir un planning pour un agent', + 'faq-validation' => '6. Contrôler et valider un planning', + 'faq-equipes' => '7. Composer les équipes', + 'faq-suivi' => '8. Suivre l’année et éditer les PDF', + 'faq-quota' => 'Comprendre le quota annuel et les motifs', + 'faq-questions' => 'Questions fréquentes', +]; +?> +
+
+ + +
+
+
+
+

Le parcours en un coup d’œil

+

PTA sert à répartir, sur toute l’année civile, les heures dues par chaque agent des accueils de loisirs. Le paramétrage se fait une fois, la saisie se répète chaque semaine.

+
+
+
    +
  1. 1Lieux d’affectationLes crèches, écoles et centres où travaillent les agents.
  2. +
  3. 2AgentsIdentité, poste, quotité de travail et lieu principal.
  4. +
  5. 3Horaires d’ouvertureLes plages où une présence minimale est obligatoire.
  6. +
  7. 4Vacances scolairesElles distinguent le périscolaire de l’extrascolaire.
  8. +
  9. 5Saisie des planningsSemaine par semaine, agent par agent, en brouillon.
  10. +
  11. 6Contrôle et validationLe Service Enfance valide et fige la semaine.
  12. +
  13. 7ÉquipesMercredis et vacances, avec contrôle de l’encadrement.
  14. +
  15. 8Suivi annuelQuotas, couverture, PTA détaillé et PDF.
  16. +
+

Les étapes 1 à 4 ne se font qu’une fois, puis à la marge (nouvel agent, nouveau lieu, nouvelle année scolaire). Le travail courant, ce sont les étapes 5 et 6.

+
+ +
+
+
+

Qui fait quoi : les trois rôles

+

Votre rôle détermine les onglets visibles et les actions autorisées. Il se choisit à l’ouverture de l’application et se change à tout moment par le bouton « Changer de rôle », en haut à droite.

+
+
+
+ + + + + + + + + + > + + + + + > + + + + + > + + + + + +
RôleCe qu’il voitCe qu’il peut faire
AgentSon propre planning et celui de son lieu de rattachement.Lecture seule. Aucune modification, aucune validation.
Responsable de structureSon lieu : la saisie, les agents qui y sont planifiés, la couverture.Saisir et corriger les horaires et motifs de son lieu, en brouillon uniquement.
Service EnfanceTous les lieux, tous les agents, tous les écrans.Paramétrer, saisir, composer les équipes, valider et rouvrir les plannings.
+
+

Un planning validé n’est plus modifiable par un responsable de structure : il faut demander au Service Enfance de le rouvrir, ce qui le repasse en brouillon.

+
+ +
+
+
+

1. Ajouter un lieu d’affectation

+

Onglet Administration — réservé au Service Enfance. Un lieu doit exister avant qu’un agent puisse y être rattaché ou planifié.

+
+
+
    +
  1. Ouvrez Administration, encadré « Ajouter un lieu d’affectation ».
  2. +
  3. Saisissez le code : un identifiant court et stable, sans espace, par exemple CRECHE_MATUSALEME. Il ne s’affiche que dans les tableaux techniques.
  4. +
  5. Saisissez le nom tel qu’il doit apparaître partout ailleurs, par exemple « Crèche Matusalème ».
  6. +
  7. Choisissez le type d’affectation : Périscolaire (autour du temps scolaire) ou Extrascolaire (mercredis et vacances). Ce choix appartient au lieu, pas à l’agent.
  8. +
  9. L’adresse est facultative et sert uniquement d’information.
  10. +
  11. Cliquez sur Ajouter le lieu. Il devient immédiatement sélectionnable dans tous les écrans.
  12. +
+
+ Le type d’affectation reste modifiable après coup dans le tableau « Paramètres des lieux d’affectation », juste en dessous du formulaire : choisissez la nouvelle valeur puis cliquez sur Enregistrer sur la ligne concernée. +
+
+ +
+
+
+

2. Ajouter un agent

+

Onglet Administration — réservé au Service Enfance. La fiche agent détermine son quota annuel et les motifs qu’on pourra lui affecter.

+
+
+
    +
  1. Matricule, nom, prénom : l’identité de l’agent. Le matricule doit être unique.
  2. +
  3. Poste PTA : la fonction occupée. Elle sert notamment à repérer les responsables dans les équipes.
  4. +
  5. Type de contrat : Permanent (soumis au PTA) ou Temporaire (hors périmètre PTA, planifiable mais sans annualisation).
  6. +
  7. Lieu d’affectation principal : le rattachement par défaut. Ce n’est pas une exclusivité — l’agent pourra être planifié sur d’autres lieux la même semaine.
  8. +
  9. Quotité de travail, en pourcentage. C’est elle qui proratise le quota annuel : 100 % = 1 607 h, 80 % = 1 285 h 36, etc.
  10. +
  11. Dates de contrat : information RH. Attention, la date de début ne décale pas l’année de référence, qui reste l’année civile complète.
  12. +
  13. Qualification et diplôme : le champ « Diplôme » ne s’active que si l’agent est déclaré diplômé. Cette information alimente le contrôle du taux de diplômés dans les équipes.
  14. +
  15. Droit à l’enveloppe de formation de 14 h : coché par défaut. Décoché, le motif « Formation » ne sera pas proposé pour cet agent lors de la saisie.
  16. +
  17. Observations utiles à la construction du PTA : disponibilités particulières, organisation connue… Ces notes se retrouvent sur l’écran « PTA détaillé ».
  18. +
  19. Cliquez sur Ajouter l’agent.
  20. +
+

Pour corriger une fiche existante, utilisez le tableau « Informations des agents » en bas de la page : le bouton Modifier ouvre la fiche complète, lieu principal compris.

+
+ +
+
+
+

3. Définir les horaires d’ouverture

+

Onglet Administration, encadré « Horaires de couverture des lieux ». Ces plages décrivent quand le lieu doit être tenu, et par combien d’agents au minimum.

+
+
+
    +
  1. Choisissez le lieu d’affectation puis cliquez sur Charger.
  2. +
  3. L’éditeur affiche une section par jour, du lundi au vendredi.
  4. +
  5. Sur un jour, cliquez sur + Ajouter une plage, puis renseignez l’heure de début, l’heure de fin et le nombre minimum d’agents attendus sur cette plage.
  6. +
  7. Répétez pour chaque plage d’ouverture réelle : par exemple 07:30–08:30 avec 2 agents, puis 11:30–13:30 avec 4 agents, puis 16:30–18:30 avec 3 agents.
  8. +
  9. Cliquez sur Enregistrer les horaires de couverture.
  10. +
+
+ Seules les affectations portant le motif « Heure de travail » comptent comme une présence sur ces plages. Une formation, un congé ou une absence ne couvrent pas le lieu — c’est le principe même du contrôle. +
+

Tant qu’un lieu n’a aucune plage configurée, il apparaît comme « non configuré » dans l’onglet Couverture : l’application ne peut alors rien contrôler pour lui, et le silence ne veut pas dire que tout va bien.

+
+ +
+
+
+

4. Renseigner les vacances scolaires

+

Onglet Vacances — réservé au Service Enfance. Ces périodes déterminent si une journée relève du périscolaire ou de l’extrascolaire.

+
+
+
    +
  1. Indiquez l’année civile souhaitée et lancez la recherche : PTA interroge l’API publique du ministère de l’Éducation nationale et agrège les deux années scolaires concernées.
  2. +
  3. Contrôlez les dates proposées. Elles restent modifiables : corrigez ce qui doit l’être avant d’enregistrer.
  4. +
  5. Cochez uniquement les périodes à conserver, puis enregistrez.
  6. +
  7. Si une période manque ou doit être adaptée aux besoins du service, utilisez le formulaire « Ajouter une période manuellement ».
  8. +
  9. Le tableau « Périodes enregistrées » est la référence réellement utilisée par l’application : c’est lui qui fait foi, pas la proposition de l’API.
  10. +
+

Cette étape est à refaire à chaque nouvelle année civile. Sans période enregistrée, PTA considère toutes les journées comme périscolaires.

+
+ +
+
+
+

5. Saisir un planning pour un agent

+

Onglet Saisie — Service Enfance et responsables de structure. Un planning, c’est un agent × une semaine × un lieu.

+
+
+
    +
  1. Sélection du planning. Choisissez le lieu, puis l’agent, puis la semaine. Les listes se débloquent dans cet ordre. Un responsable de structure a son lieu déjà imposé.
  2. +
  3. Lisez le bandeau de quota qui apparaît : quotité de l’agent, quota de la période, heures déjà affectées (validées et brouillons confondus) et reste à affecter.
  4. +
  5. Saisissez les affectations. Le tableau propose une ligne par jour, du lundi au vendredi. Sur chaque jour, renseignez une ou plusieurs plages horaires, chacune avec son propre motif. Les heures se saisissent par pas de 15 minutes.
  6. +
  7. Cliquez sur Appliquer les horaires renseignés : les plages basculent dans le planning de la semaine.
  8. +
  9. Vérifiez le planning global de l’agent, en dessous. Il montre toutes ses affectations de la semaine, y compris celles posées sur d’autres lieux. Le total des heures décomptées s’affiche à droite.
  10. +
  11. Pour corriger, cliquez sur un créneau pour le déplacer ou le dupliquer, ou faites-le glisser directement vers un autre jour.
  12. +
  13. Cliquez sur Enregistrer le brouillon. Le planning est conservé au statut BROUILLON et reste modifiable.
  14. +
+
+ Un même agent peut être planifié sur plusieurs lieux la même semaine. En revanche, deux créneaux ne peuvent jamais se chevaucher : une plage déjà posée ailleurs apparaît dans le planning global et bloque toute saisie qui l’empiéterait. +
+

Gagner du temps avec les semaines types

+

Quand une semaine se répète à l’identique, le Service Enfance peut l’enregistrer puis la rejouer :

+
    +
  • Enregistrer comme semaine type : mémorise la semaine affichée sous un nom.
  • +
  • Importer une semaine type : la rejoue sur la semaine en cours de saisie.
  • +
  • Appliquer sur une période : la rejoue sur plusieurs semaines d’un coup. Un aperçu annonce les conflits avant d’écrire quoi que ce soit — le mode « Compléter » refuse d’écraser, le mode « Remplacer » supprime les créneaux existants des jours concernés.
  • +
+
+ +
+
+
+

6. Contrôler et valider un planning

+

Onglets À valider et Saisie — la validation est réservée au Service Enfance.

+
+
+
    +
  1. Ouvrez À valider : la file de tous les brouillons contenant des affectations.
  2. +
  3. Cliquez sur un planning : l’écran de Saisie s’ouvre sur le bon agent et la bonne semaine, positionné sur la zone de validation.
  4. +
  5. Contrôlez les horaires, puis cliquez sur Valider le planning.
  6. +
+

La validation applique quatre contrôles bloquants et une alerte :

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NiveauContrôleConséquence
ErreurLe planning ne contient aucune affectation.La validation est refusée. Corrigez puis recommencez.
ErreurUne affectation est en dehors de la semaine sélectionnée.
ErreurDeux affectations du planning se chevauchent.
ErreurUne affectation chevauche un créneau déjà validé sur un autre lieu.
AlerteLe quota annuel de l’agent est dépassé.Une confirmation explicite est demandée. Le dépassement est possible, mais il doit être assumé.
+
+

Une fois validé, le planning est figé : le bouton Modifier le planning le rouvre et le repasse en brouillon, ce qui impose une nouvelle validation. Modifier un créneau validé depuis l’onglet « Par agent » produit exactement le même effet, automatiquement.

+
+ +
+
+
+

7. Composer les équipes

+

Onglet Équipes — réservé au Service Enfance. Une équipe couvre une période (mercredis, vacances) sur un lieu, et vérifie que l’encadrement est réglementaire.

+
+
+

Une équipe est indépendante des plannings hebdomadaires : elle répond à la question « qui encadre, sur cette période, et est-ce suffisant ? ».

+
    +
  1. Nommez l’équipe de façon parlante, par exemple « Vacances d’hiver — Équipe Matusalème ».
  2. +
  3. Choisissez son type : Mercredi périscolaire, Extrascolaire ou Périscolaire semaine. Un même agent peut appartenir à plusieurs types d’équipes dans l’année.
  4. +
  5. Choisissez le lieu, puis les dates de début et de fin de la période couverte.
  6. +
  7. Renseignez l’effectif d’enfants attendu, séparé en moins de 6 ans et 6 ans et plus.
  8. +
  9. Ajustez les ratios d’encadrement : par défaut 1 agent pour 8 enfants de moins de 6 ans, et 1 pour 12 au-delà. PTA en déduit le nombre d’agents requis.
  10. +
  11. Fixez le minimum d’agents et le pourcentage minimum de diplômés (50 % par défaut).
  12. +
  13. Créez l’équipe, puis ajoutez-y les agents depuis la liste « Équipes enregistrées ».
  14. +
+

À chaque modification, PTA recalcule ses contrôles :

+
    +
  • Erreur Encadrement insuffisant — moins d’agents affectés que requis par les ratios et le minimum.
  • +
  • Erreur Qualification insuffisante — le taux de diplômés est sous le seuil paramétré.
  • +
  • Alerte Responsable manquant — aucun agent de l’équipe n’occupe un poste de responsable.
  • +
  • Alerte Contrainte prioritaire — un agent a une préconisation médicale ou un temps partiel thérapeutique actif sur la période.
  • +
  • Info Préférence respectée — un agent avait exprimé un souhait pour ce lieu dans son PTA détaillé.
  • +
+

L’équipe passe ensuite de Brouillon à À contrôler puis Validée. Les contraintes prioritaires et les souhaits de lieu se saisissent dans l’onglet PTA détaillé de chaque agent.

+
+ +
+
+
+

8. Suivre l’année et éditer les PDF

+

Les écrans de consultation ne modifient rien : ils servent à contrôler, comparer et imprimer.

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OngletÀ quoi il sert
Tableau de bordLe point d’entrée du Service Enfance : brouillons les plus anciens à valider, plages de couverture déficitaires et suivi des quotas annuels.
CouvertureLes plages où le nombre d’agents en « Heure de travail » passe sous le minimum attendu du lieu, et les lieux encore non configurés.
Par lieuLe planning d’un lieu sur une semaine : agents rattachés et agents réellement planifiés. Lecture seule.
Par agentLe planning d’un agent mois par mois, tous lieux confondus, avec son quota. C’est ici qu’on corrige un créneau isolé ou qu’on duplique une semaine.
Vue annuelleL’annualisation d’un agent de janvier à décembre, et la validation de toute l’année en une seule fois.
PTA détailléLa fiche annuelle complète : répartition des heures, congés et JNT, contrôles métier, contraintes prioritaires, préférences et interdictions de lieu.
+
+

Les documents imprimables

+
    +
  • PDF de l’agent (7 semaines), depuis l’écran de saisie : le planning détaillé sur sept semaines à partir de la semaine affichée.
  • +
  • PDF du lieu, depuis la vue par lieu : la semaine complète d’un lieu, tous agents confondus.
  • +
  • Récapitulatif horaire et contrat, depuis la fiche agent : les heures travaillées et le suivi du quota annuel.
  • +
+
+ +
+
+
+

Comprendre le quota annuel et les motifs

+

C’est la mécanique centrale de l’application : tout le reste sert à la nourrir.

+
+
+
    +
  • Le quota suit l’année civile, du 1er janvier au 31 décembre — jamais l’année scolaire, jamais la date de contrat.
  • +
  • La référence est de 1 607 heures à 100 %, proratisée par la quotité de l’agent.
  • +
  • Les heures « déjà affectées » comptent les brouillons comme les plannings validés : le compteur ne ment pas en attendant la validation.
  • +
  • Chaque plage horaire porte un motif, et c’est le motif qui décide si les heures sont décomptées du quota.
  • +
+

Trois motifs ne sont pas décomptés du quota :

+
+ + + + + + + + + + + + + + + +
MotifDécompté du quota ?
Heure de travail, ALP matin, Restauration, ALP soir, Mercredi périscolaire, Temps extrascolaireOui
Préparation (périscolaire, extrascolaire, du lundi), Ménage de fondOui
Formation, Journée de fractionnement, AbsenceOui
Congé annuelNon
Autre absenceNon
Journée non travaillée (JNT)Non
+
+

Le motif « Formation » n’est proposé que pour les agents disposant du droit à l’enveloppe de formation de 14 h, coché sur leur fiche.

+
+ +
+
+
+

Questions fréquentes

+
+
+
+
Je ne vois pas l’onglet dont on me parle.
+
Les onglets dépendent du rôle sélectionné. Vérifiez le badge en haut à droite et, si nécessaire, utilisez « Changer de rôle ». Si l’onglet reste absent, votre rôle n’y a pas droit.
+ +
Impossible de choisir un agent dans l’écran de saisie.
+
Il faut d’abord choisir un lieu d’affectation : la liste des agents en dépend. La semaine ne se débloque qu’une fois l’agent choisi.
+ +
L’application refuse ma saisie pour cause de chevauchement.
+
L’agent a déjà une affectation sur ce créneau, éventuellement sur un autre lieu. Regardez le « Planning global de l’agent » : il affiche toutes ses affectations de la semaine, tous lieux confondus.
+ +
Le quota est dépassé, que faire ?
+
C’est une alerte, pas une erreur. Vous pouvez confirmer la validation en connaissance de cause, ou retirer des heures. Le dépassement reste visible dans le suivi des quotas.
+ +
Comment corriger un planning déjà validé ?
+
Seul le Service Enfance peut le rouvrir : bouton Modifier le planning dans l’écran de saisie. Le planning repasse en brouillon et devra être validé à nouveau. Toute modification d’un créneau validé depuis « Par agent » déclenche la même bascule.
+ +
Un agent doit travailler sur deux lieux la même semaine.
+
C’est prévu. Le lieu principal de la fiche agent n’est qu’un rattachement par défaut : saisissez simplement un planning sur chacun des lieux, tant que les horaires ne se chevauchent pas.
+ +
L’onglet Couverture ne signale rien pour un de mes lieux.
+
Ce lieu n’a probablement aucune plage d’ouverture configurée. Sans plage attendue, l’application n’a rien à comparer. Renseignez-les dans Administration → « Horaires de couverture des lieux ».
+ +
Les vacances scolaires affichées sont fausses.
+
Les dates proposées par l’API restent modifiables avant enregistrement, et le formulaire manuel permet d’ajouter ou de corriger une période. Seul le tableau « Périodes enregistrées » est utilisé par l’application.
+ +
Mes modifications n’apparaissent pas après enregistrement.
+
Rechargez la page avec Ctrl + F5. Si le problème persiste, un message d’erreur rouge s’affiche normalement sous le formulaire concerné : signalez son contenu à l’administrateur de l’application.
+
+
+
+
+
diff --git a/assets/style.css b/assets/style.css index b822612..aea12f1 100644 --- a/assets/style.css +++ b/assets/style.css @@ -2820,3 +2820,199 @@ textarea:disabled { .dashboard-list-meta { text-align: left; } .dashboard-list-action { width: 100%; justify-content: center; } } + +/* ============================================================ + PTA V7.10 - Guide d'utilisation (FAQ) + ============================================================ */ + +/* --- Bouton d'accès ancré à droite de la navigation --------- */ +/* La barre défile horizontalement quand les onglets débordent ; + `position: sticky` garde le guide visible quoi qu'il arrive. */ +.view-tab-help { + display: flex; + position: sticky; + right: 0; + align-items: center; + margin-left: auto; + padding-left: 0.55rem; + background: #f8fafc; + box-shadow: -14px 0 12px -10px rgba(15, 23, 42, 0.16); +} + +.view-tabs-grouped .view-tab-help { border-left: 1px solid #e2e8f0; } + +.view-tab-faq { + display: inline-flex; + align-items: center; + gap: 0.4rem; + color: #263238; + text-decoration: none; +} + +.view-tab-faq-mark { + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.35rem; + height: 1.35rem; + border-radius: 50%; + background: #263238; + color: #fff; + font-size: 0.78rem; + line-height: 1; +} + +.view-tab-faq:hover, +.view-tab-faq:focus-visible { background: #fff; } + +/* --- Mise en page du guide --------------------------------- */ +.faq-layout { + display: grid; + grid-template-columns: minmax(220px, 280px) minmax(0, 1fr); + align-items: start; + gap: 20px; +} + +.faq-summary { + position: sticky; + top: 18px; + padding: 18px 20px; +} + +.faq-summary-title { + margin: 0 0 10px; + color: #7b8794; + font-size: 0.7rem; + font-weight: 800; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.faq-summary-list { + margin: 0; + padding-left: 1.1rem; + color: #66737d; + font-size: 0.9rem; +} + +.faq-summary-list li { margin-bottom: 7px; } +.faq-summary-list a { color: #263238; text-decoration: none; } +.faq-summary-list a:hover, +.faq-summary-list a:focus-visible { text-decoration: underline; } + +.faq-summary-note { + margin: 14px 0 0; + padding-top: 12px; + border-top: 1px solid #eceff1; + color: #66737d; + font-size: 0.8rem; +} + +.faq-section { scroll-margin-top: 18px; } +.faq-section h3 { margin: 22px 0 8px; font-size: 1rem; } +.faq-section p { line-height: 1.55; } +.faq-section code { + padding: 1px 5px; + border-radius: 5px; + background: #eef1f4; + font-size: 0.86rem; +} +.faq-section kbd { + padding: 1px 6px; + border: 1px solid #cfd8dc; + border-bottom-width: 2px; + border-radius: 5px; + background: #f8fafc; + font-size: 0.82rem; +} + +/* --- Le parcours en huit étapes ---------------------------- */ +.faq-flow { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 12px; + margin: 0; + padding: 0; + list-style: none; +} + +.faq-flow li { + display: grid; + gap: 3px; + padding: 13px 15px; + border: 1px solid #e4e8eb; + border-radius: 12px; + background: #f9fbfc; +} + +.faq-flow-step { + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.6rem; + height: 1.6rem; + border-radius: 50%; + background: #263238; + color: #fff; + font-size: 0.8rem; + font-weight: 700; +} + +.faq-flow li small { color: #66737d; font-size: 0.82rem; line-height: 1.4; } + +/* --- Étapes numérotées et listes --------------------------- */ +.faq-steps { margin: 0; padding-left: 1.3rem; } +.faq-steps li { margin-bottom: 9px; line-height: 1.55; } +.faq-list { margin: 0 0 4px; padding-left: 1.3rem; } +.faq-list li { margin-bottom: 7px; line-height: 1.55; } + +.faq-callout { margin: 16px 0 0; } + +.faq-table th, +.faq-table td { vertical-align: top; line-height: 1.5; } +.faq-table tr.faq-row-current { background: #f2f7f4; } + +.faq-level { + display: inline-block; + padding: 2px 8px; + border-radius: 999px; + font-size: 0.74rem; + font-weight: 800; + letter-spacing: 0.03em; + text-transform: uppercase; + white-space: nowrap; +} +.faq-level-error { background: #fdecec; color: #a3212f; } +.faq-level-warning { background: #fffbeb; color: #7d5c00; } +.faq-level-info { background: #eef2f7; color: #37474f; } + +/* --- Questions / réponses ---------------------------------- */ +.faq-qa { margin: 0; } +.faq-qa dt { + margin-top: 16px; + font-weight: 700; +} +.faq-qa dt:first-child { margin-top: 0; } +.faq-qa dd { + margin: 5px 0 0; + padding-left: 13px; + border-left: 3px solid #e4e8eb; + color: #4b5563; + line-height: 1.55; +} + +@media (max-width: 1000px) { + .faq-layout { grid-template-columns: minmax(0, 1fr); } + .faq-summary { position: static; } +} + +@media (max-width: 900px) { + .view-tab-help { + position: static; + width: 100%; + margin-left: 0; + padding-left: 0; + box-shadow: none; + } + .view-tabs-grouped .view-tab-help { border-left: 0; } +} diff --git a/database/migration_v7_9d_faq.sql b/database/migration_v7_9d_faq.sql new file mode 100644 index 0000000..8440483 --- /dev/null +++ b/database/migration_v7_9d_faq.sql @@ -0,0 +1,30 @@ +-- ============================================================================ +-- PTA — Guide d'utilisation (page « faq ») +-- ============================================================================ +-- Appliquée automatiquement au démarrage par le service db-migrate. +-- Pour un import manuel sur une base existante : +-- SOURCE database/migration_v7_9d_faq.sql; +-- +-- Le guide suit la règle posée en V7.8 : une page absente de acces_role_page +-- est refusée. Il est ouvert aux trois rôles — c'est un secours, pas un droit +-- métier — et son bouton d'accès n'apparaît dans la barre de navigation que si +-- cette migration a été jouée. +-- +-- La page est purement statique : aucune table, aucune vue, aucune donnée +-- métier n'est touchée. L'ordre d'affichage est indicatif, le bouton étant +-- ancré à droite de la barre plutôt que rangé dans un groupe d'onglets. +-- ============================================================================ + +INSERT INTO acces_role_page (role, page, ordre_affichage) VALUES + ('AGENT', 'faq', 200), + ('RESPONSABLE_STRUCTURE', 'faq', 200), + ('SERVICE_ENFANCE', 'faq', 200) +ON DUPLICATE KEY UPDATE ordre_affichage = VALUES(ordre_affichage); + +-- ============================================================================ +-- Vérification après import : +-- SELECT role, page FROM v_acces_role_page WHERE page = 'faq'; +-- +-- Retour arrière : +-- DELETE FROM acces_role_page WHERE page = 'faq'; +-- ============================================================================ diff --git a/faq.php b/faq.php new file mode 100644 index 0000000..e9ddd24 --- /dev/null +++ b/faq.php @@ -0,0 +1,7 @@ +