L'horaire de l'email récapitulatif se configure maintenant sur /destinataires (raccourcis courants + expression cron personnalisée) au lieu de .env, avec reprogrammation immédiate sans redémarrage. Stocké en base (ParametrePlanification) plutôt que dans un fichier de config. Défaut changé pour tous les lundis à 9h. Les exemples et le code n'utilisent que des noms de jours (mon, tue, ...) dans les expressions cron : vérifié empiriquement qu'APScheduler ne suit pas la convention Unix pour les jours numériques (0=lundi chez lui, pas 0=dimanche), ce qui rendrait "0 9 * * 1" trompeur.
71 lines
2.8 KiB
HTML
71 lines
2.8 KiB
HTML
{% extends "base.html" %}
|
|
{% block titre %}Alertes - Gestion de stock IT{% endblock %}
|
|
{% block contenu %}
|
|
<h1>Destinataires des alertes de stock bas</h1>
|
|
|
|
<form method="get" action="/destinataires" class="barre-recherche">
|
|
<input type="search" name="q" value="{{ q }}" placeholder="Rechercher un email…">
|
|
{% if q %}<a href="/destinataires" class="lien-effacer">Effacer</a>{% endif %}
|
|
</form>
|
|
|
|
<ul class="liste-resultats">
|
|
{% for destinataire in destinataires %}
|
|
<li>
|
|
<span>{{ destinataire.email }}</span>
|
|
<form method="post" action="/destinataires/{{ destinataire.id }}/supprimer" class="formulaire-inline">
|
|
<button type="submit" class="bouton-danger">Supprimer</button>
|
|
</form>
|
|
</li>
|
|
{% else %}
|
|
<li class="liste-vide">
|
|
{% if q %}Aucun destinataire ne correspond à « {{ q }} ».{% else %}Aucun destinataire configuré : aucune alerte ne sera envoyée.{% endif %}
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
|
|
<form method="post" action="/destinataires" class="formulaire-inline">
|
|
<input type="email" name="email" placeholder="email@clinique.local" required>
|
|
<button type="submit">Ajouter</button>
|
|
</form>
|
|
|
|
<h2>Résumé périodique du stock</h2>
|
|
<p class="etiquette-sous-titre">
|
|
Un email récapitulatif (stock bas en premier, puis le reste du stock) est
|
|
envoyé automatiquement selon l'horaire ci-dessous, aux destinataires listés
|
|
plus haut.
|
|
{% if prochaine_execution %}
|
|
Prochain envoi : {{ prochaine_execution.strftime("%d/%m/%Y à %H:%M") }}.
|
|
{% endif %}
|
|
</p>
|
|
|
|
{% if erreur_cron %}
|
|
<p class="message-erreur">{{ erreur_cron }}</p>
|
|
{% endif %}
|
|
|
|
{% set exemples_valeurs = exemples_cron | map(attribute=0) | list %}
|
|
<form method="post" action="/destinataires/planification" class="formulaire-inline formulaire-planification">
|
|
<select name="expression_cron">
|
|
{% for expression, description in exemples_cron %}
|
|
<option value="{{ expression }}" {{ "selected" if expression == expression_cron else "" }}>
|
|
{{ description }} ({{ expression }})
|
|
</option>
|
|
{% endfor %}
|
|
{% if expression_cron not in exemples_valeurs %}
|
|
<option value="{{ expression_cron }}" selected>Personnalisé ({{ expression_cron }})</option>
|
|
{% endif %}
|
|
</select>
|
|
<button type="submit">Appliquer</button>
|
|
</form>
|
|
|
|
<form method="post" action="/destinataires/planification" class="formulaire-inline">
|
|
<input type="text" name="expression_cron" value="{{ expression_cron }}" class="champ-cron" placeholder="0 9 * * mon">
|
|
<button type="submit">Enregistrer une expression personnalisée</button>
|
|
</form>
|
|
<p class="etiquette-sous-titre">
|
|
Format cron : minute (0-59) heure (0-23) jour (1-31) mois (1-12) jour de la
|
|
semaine. Utilisez les noms de jours (mon, tue, wed, thu, fri, sat, sun),
|
|
pas de chiffres — leur numérotation ne suit pas le cron Unix habituel et
|
|
prête à confusion.
|
|
</p>
|
|
{% endblock %}
|