{% extends "base.html" %} {% block title %}Horaires et suivi annuel — GMAO{% endblock %} {% block content %}

Horaires et suivi des heures

Période comptable : {{ period_start.strftime('%d/%m/%Y') }} au {{ period_end.strftime('%d/%m/%Y') }}.

À réaliser

{{ '%d h %02d'|format(required_minutes // 60, required_minutes % 60) }}

1607 h moins pénibilité
Prévu par calendrier

{{ '%d h %02d'|format(planned_minutes // 60, planned_minutes % 60) }}

Réalisé saisi

{{ '%d h %02d'|format(actual_minutes // 60, actual_minutes % 60) }}

Solde réalisé / dû

{{ '%d h %02d'|format((balance_minutes|abs) // 60, (balance_minutes|abs) % 60) }}

{% if balance_minutes > 0 %}heures à faire{% else %}heures en excédent{% endif %}
Récapitulatif mensuelLes heures de travail prévues excluent les permanences, affichées séparément.
{% for item in monthly_summary %}{% else %}{% endfor %}
MoisTravail prévuPermanencesRetardsHeures supplémentairesFormations
{{ months[item.month.month] }} {{ item.month.year }}{{ '%d h %02d'|format(item.planned // 60, item.planned % 60) }}{{ '%d h %02d'|format(item.permanence // 60, item.permanence % 60) }}{{ '%d h %02d'|format(item.retard // 60, item.retard % 60) }}{{ '%d h %02d'|format(item.supplementaire // 60, item.supplementaire % 60) }}{{ '%d h %02d'|format(item.formation // 60, item.formation % 60) }}
Aucune donnée pour cette période.
Objectif annuel {{ year }}
Horaires types (maximum 6){{ templates|length }}/6
{% for template in templates %}
{{ template.name }}
{{ template.start_time.strftime('%H:%M') }}–{{ template.end_time.strftime('%H:%M') }}{% if template.lunch_start %} · pause {{ template.lunch_start.strftime('%H:%M') }}–{{ template.lunch_end.strftime('%H:%M') }}{% endif %} · durée : {{ template.duration_minutes // 60 }} h {{ '%02d'|format(template.duration_minutes % 60) }}
{% else %}

Aucun profil défini.

{% endfor %} {% if templates|length < 6 %}
{% endif %}
Affectation par jour
{% for day_num, day_name in days.items() %}
{{ day_name }}
{% endfor %}
Importer les calendriers
Changer de zone remplace les périodes scolaires importées pour l’autre zone.
Permanences dans les vacancesSélectionnez plusieurs dates puis l’horaire type à appliquer.
{% for group in permanence_groups %}
{{ group.closure.name }} ({{ group.closure.start_date.strftime('%d/%m/%Y') }} au {{ group.closure.end_date.strftime('%d/%m/%Y') }})
{% for option in group.options %}
{% endfor %}
{% else %}
Aucune période de vacances importée pour cette période. Importez d’abord le calendrier scolaire.
{% endfor %}
{% set selected_permanences = permanence_options|selectattr('entry')|list %}
Récapitulatif des permanences
{% if selected_permanences %}
{% for option in selected_permanences %}{% endfor %}
DateVacancesHoraire typeHoraires détaillés
{{ days.get(option.date.weekday()) }}
{{ option.date.strftime('%d/%m/%Y') }}
{{ option.closure.name }}{{ option.entry.template.name if option.entry.template else 'Horaire personnalisé' }}{{ option.entry.start_time.strftime('%H:%M') }}–{{ option.entry.end_time.strftime('%H:%M') }}{% if option.entry.lunch_start and option.entry.lunch_end %}
Pause {{ option.entry.lunch_start.strftime('%H:%M') }}–{{ option.entry.lunch_end.strftime('%H:%M') }}{% endif %}
{% else %}

Aucune permanence enregistrée pour cette période.

{% endif %}
Saisir un retard ou une heure supplémentaire
Historique {{ year }}
{% for entry in entries[:50] %}{% else %}{% endfor %}
DateTypePrévuRéaliséÉcartNote
{{ entry.work_date.strftime('%d/%m/%Y') }}{{ entry.entry_type }}{{ entry.planned_minutes }} min{{ entry.actual_minutes }} min{{ '+' if entry.variance_minutes > 0 else '' }}{{ entry.variance_minutes }} min{{ entry.note or '—' }}
Aucune saisie.
{% endblock %}