La saisie astreinte devient une liste d'événements (début, fin, description,
nombre illimité, fin antérieure au début = intervention à cheval sur minuit).
Ces heures ne comptent jamais dans la semaine : elles sont décomptées à part
par pas de 15 minutes, toute tranche entamée comptant en totalité, et rangées
dans des compteurs selon le jour et l'heure (Nuit ×1,5, Journée semaine ×1,
Samedi ×1,5, Dimanche/férié ×2 ; jours fériés français calculés
automatiquement, règles ajustables dans config.json via astreinte_facteurs).
Le détail par événement et les totaux pondérés s'affichent sous le bandeau de
la semaine, et les exports .ods gagnent les colonnes Astreinte brute et
pondérée. Le retour au bureau (fin du dernier événement + 11h de repos) est
désormais dérivé des événements.
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
70 lines
3.6 KiB
HTML
70 lines
3.6 KiB
HTML
<div id="soldes-section" hx-swap-oob="true">
|
||
<div class="soldes">
|
||
<div class="solde-item">
|
||
<div class="solde-eyebrow">Travaillé</div>
|
||
<div class="solde-num neutral">{{ result.total_travaille }}</div>
|
||
</div>
|
||
<div class="solde-item">
|
||
<div class="solde-eyebrow">Dû par jour</div>
|
||
<div class="solde-num neutral">{{ result.heures_jour }}</div>
|
||
</div>
|
||
<div class="solde-item">
|
||
<div class="solde-eyebrow">Dû cette semaine</div>
|
||
<div class="solde-num neutral">{{ result.total_du }}</div>
|
||
</div>
|
||
<div class="solde-item {% if result.solde_min > 0 %}item-pos{% elif result.solde_min < 0 %}item-neg{% endif %}">
|
||
<div class="solde-eyebrow">Solde semaine</div>
|
||
<div class="solde-num {% if result.solde_min > 0 %}pos{% elif result.solde_min < 0 %}neg{% endif %}">
|
||
{% if result.solde_min > 0 %}+{% endif %}{{ result.solde }}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% if result.slots_restants > 0 %}
|
||
<div class="reste-info">
|
||
{% if result.extra_min > 0 %}
|
||
Reste à faire : <strong>{{ result.reste }}</strong>
|
||
sur {{ result.slots_restants }} demi-journée{{ 's' if result.slots_restants > 1 else '' }} restante{{ 's' if result.slots_restants > 1 else '' }}
|
||
— à rattraper : <strong class="reste-extra">+{{ result.extra }}</strong> (~+{{ result.moyenne_extra }} chacune)
|
||
{% elif result.avance_min > 0 %}
|
||
Reste à faire : <strong>{{ result.reste }}</strong>
|
||
sur {{ result.slots_restants }} demi-journée{{ 's' if result.slots_restants > 1 else '' }} restante{{ 's' if result.slots_restants > 1 else '' }}
|
||
— avance à écouler : <strong>{{ result.avance }}</strong>, répartie sur les départs du soir pour finir la semaine à 0.
|
||
{% elif result.reste_min > 0 %}
|
||
Reste à faire : <strong>{{ result.reste }}</strong>
|
||
sur {{ result.slots_restants }} demi-journée{{ 's' if result.slots_restants > 1 else '' }} restante{{ 's' if result.slots_restants > 1 else '' }}
|
||
— le rythme habituel suffit, rien à rattraper.
|
||
{% else %}
|
||
Vous êtes à jour ou en avance — rien à rattraper cette semaine.
|
||
{% endif %}
|
||
</div>
|
||
{% elif result.solde_min < 0 %}
|
||
<div class="reste-info">
|
||
Semaine terminée avec <strong class="reste-extra">{{ result.solde }}</strong> de manque —
|
||
complétez ou corrigez les saisies, ou rattrapez sur une autre semaine.
|
||
</div>
|
||
{% endif %}
|
||
{% if result.astreinte and result.astreinte.actif %}
|
||
<div class="as-decompte">
|
||
<div class="as-decompte-title">Astreinte — tranches de 15 min entamées, comptées entières (compteur séparé, hors heures de semaine)</div>
|
||
{% for j in result.astreinte.jours %}
|
||
<div class="as-jour">
|
||
<span class="as-jour-date">{{ j.date[8:] }}/{{ j.date[5:7] }}</span>
|
||
{% for ev in j.events %}
|
||
<div class="as-ev">
|
||
<span class="as-ev-h">{{ ev.debut }} → {{ ev.fin }}</span>
|
||
{% if ev.desc %}<span class="as-ev-desc">{{ ev.desc }}</span>{% endif %}
|
||
<span class="as-ev-q">{{ ev.tranches }} tr. = {{ ev.min_h }}</span>
|
||
{% for d in ev.details %}<span class="as-ev-cat">{{ d.nom }} ×{{ d.facteur_txt }}</span>{% if not loop.last %} + {% endif %}{% endfor %}
|
||
<span class="as-ev-pond">pondéré → {{ ev.pondere_h }}</span>
|
||
</div>
|
||
{% endfor %}
|
||
</div>
|
||
{% endfor %}
|
||
<div class="as-totaux">
|
||
{% for c in result.astreinte.categories %}<span class="as-cat">{{ c.nom }} : {{ c.min_h }} ×{{ c.facteur_txt }} = {{ c.pondere_h }}</span>{% endfor %}
|
||
<span class="as-grand">total {{ result.astreinte.total_h }} → {{ result.astreinte.total_pondere_h }} pondérées</span>
|
||
</div>
|
||
</div>
|
||
{% endif %}
|
||
</div>
|