Files
pta/app/Views/partials/administration.php
2026-08-25 15:12:11 +02:00

164 lines
8.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Administration : horaires de couverture attendus des lieux, et jetons d'accès
* des agents et des responsables de lieu.
* Modules JS : `coverage` et `accessTokens`.
*
* Partiel de contenu inclus par la vue de page homonyme. Les identifiants HTML
* posés ici sont les points d'ancrage du module JS : les renommer casse le
* module sans aucune erreur visible.
*
* V7.14 : les agents et les lieux d'affectation ont quitté cet écran pour la
* page « Management ». Ne restent ici que les règles de couverture, qui ne
* décrivent ni une personne ni un lieu mais une EXIGENCE DE PRÉSENCE — le
* paramètre que contrôle l'onglet « Couverture ».
*
* V7.27 : s'y ajoute la distribution des JETONS DE TERRAIN. Le Service Enfance
* équipe ses agents et ses responsables de lieu sans passer par la DSI, mais
* RIEN AU-DELÀ : les comptes Service Enfance et DSI n'apparaissent pas ici et
* sont refusés par le serveur (AccessAccountController). Les classes `dsi-*`
* sont réutilisées telles quelles — elles ne portent qu'une mise en forme, et
* les deux écrans montrent la même chose : des comptes et des jetons.
*/
?>
<section id="assignment-view" class="app-view page-content">
<section class="card coverage-settings-card">
<div class="section-heading">
<div>
<h2>Horaires de couverture des lieux</h2>
<p class="section-subtitle">Définissez les périodes pendant lesquelles un nombre minimum d’agents doit être physiquement présent. Seules les affectations « Heure de travail » comptent comme présence.</p>
</div>
</div>
<div class="selection-grid overview-filters">
<label class="field">
<span>Lieu d’affectation</span>
<select id="coverage-rules-structure">
<option value="">Choisir un lieu d’affectation</option>
<?php foreach ($structures as $structure): ?>
<option value="<?= (int) $structure['id_structure'] ?>"><?= htmlspecialchars($structure['nom']) ?></option>
<?php endforeach; ?>
</select>
</label>
<div class="overview-filter-actions">
<button id="load-coverage-rules" class="button button-secondary filter-button" type="button">Charger</button>
</div>
</div>
<div id="coverage-rules-message" class="message" role="status" aria-live="polite"></div>
<div id="coverage-rules-editor" class="coverage-rules-editor">
<div class="empty-state">Choisissez un lieu pour configurer les plages où une présence minimale est obligatoire.</div>
</div>
<div class="coverage-rules-actions">
<button id="save-coverage-rules" class="button button-primary" type="button" disabled>Enregistrer les horaires de couverture</button>
</div>
</section>
<!--
Jetons d'accès de terrain (V7.27).
Panneau des jetons fraîchement produits : c'est la SEULE occasion de
les lire, la base n'en conserve qu'une empreinte. Il reste ouvert
tant qu'il n'a pas été explicitement refermé, pour laisser le temps
de les recopier ou de les imprimer.
-->
<section id="access-token-panel" class="card dsi-token-panel" hidden>
<div class="section-heading">
<div>
<h2>Jetons à transmettre</h2>
<p class="section-subtitle">Ces jetons ne seront plus jamais affichés : la base n’en garde qu’une empreinte. Copiez-les, remettez-les à leurs titulaires, puis refermez ce panneau.</p>
</div>
<div class="button-group">
<button id="access-token-copy" class="button button-secondary" type="button">Tout copier</button>
<button id="access-token-close" class="button button-secondary" type="button">Fermer</button>
</div>
</div>
<div id="access-token-list" class="dsi-token-list"></div>
<div id="access-token-message" class="message" role="status" aria-live="polite"></div>
</section>
<section class="card">
<div class="section-heading">
<div>
<h2>Jetons d’accès des agents et des responsables</h2>
<p class="section-subtitle">Un compte par agent et par lieu d’affectation. Chacun se connecte avec son jeton : il n’y a pas de mot de passe pour ces deux rôles. Les comptes Service Enfance et DSI ne se gèrent pas ici — ils relèvent de la DSI.</p>
</div>
<button id="access-generate-missing" class="button button-secondary" type="button">
Générer les jetons manquants <span id="access-missing-count" class="nav-count-badge" hidden>0</span>
</button>
</div>
<form id="access-account-form" class="admin-form">
<div class="admin-form-grid">
<label class="field">
<span>Type de compte</span>
<select id="access-account-role" required>
<option value="AGENT">Agent</option>
<option value="RESPONSABLE_STRUCTURE">Responsable de structure</option>
</select>
</label>
<label class="field" id="access-account-agent-field">
<span>Agent titulaire</span>
<select id="access-account-agent"><option value="">Choisir un agent sans compte</option></select>
</label>
<label class="field" id="access-account-structure-field" hidden>
<span>Lieu titulaire</span>
<select id="access-account-structure"><option value="">Choisir un lieu sans compte</option></select>
</label>
<label class="field admin-field-wide">
<span>Commentaire (facultatif)</span>
<input id="access-account-comment" type="text" maxlength="255" placeholder="Ex. remplacement congé maternité, jusqu’en septembre">
</label>
</div>
<p id="access-account-hint" class="hint"></p>
<div class="admin-form-actions">
<div id="access-account-message" class="message" role="status" aria-live="polite"></div>
<button class="button button-primary" type="submit">Créer le compte et générer son jeton</button>
</div>
</form>
<div class="selection-grid overview-filters">
<label class="field">
<span>Type</span>
<select id="access-filter-role">
<option value="">Agents et responsables</option>
<option value="AGENT">Agents</option>
<option value="RESPONSABLE_STRUCTURE">Responsables de structure</option>
</select>
</label>
<label class="field">
<span>État</span>
<select id="access-filter-state">
<option value="">Tous</option>
<option value="1">Actifs</option>
<option value="0">Désactivés</option>
</select>
</label>
<label class="field">
<span>Rechercher</span>
<input id="access-filter-search" type="search" maxlength="80" placeholder="Nom, matricule ou début de jeton">
</label>
<div class="overview-filter-actions">
<button id="access-accounts-refresh" class="button button-secondary filter-button" type="button">Actualiser</button>
</div>
</div>
<div id="access-accounts-message" class="message" role="status" aria-live="polite"></div>
<div class="table-scroll">
<table class="planning-table dsi-accounts-table">
<thead>
<tr>
<th>Titulaire</th>
<th>Type</th>
<th>Jeton</th>
<th>Dernière connexion</th>
<th>État</th>
<th>Actions</th>
</tr>
</thead>
<tbody id="access-accounts-body">
<tr><td colspan="6">Chargement des comptes…</td></tr>
</tbody>
</table>
</div>
</section>
</section>