{% extends '@App/app.html.twig' %} {% block title %}Demandes de changement{% endblock %} {% block page_header %}{% endblock %} {% block content %} {% set self_service = is_self_service|default(false) %} {% set metrics = metrics|default({pending: 0, approved7: 0, refused7: 0, swapRate: 0, total: 0}) %} {% set filters = filters|default({}) %} {% set type_labels = {swap: 'Échange de shift', time_change: 'Modif. horaires', unavailable: 'Indisponibilité', other: 'Autre'} %} {% set type_tones = {swap: 'unavailable', time_change: 'swap', unavailable: 'time', other: 'other'} %} {% set status_labels = {submitted: 'En attente', pending: 'En attente', in_review: 'En cours', approved: 'Approuvée', refused: 'Rejetée', cancelled: 'Annulée'} %} {% set status_tones = {submitted: 'pending', pending: 'pending', in_review: 'pending', approved: 'approved', refused: 'refused', cancelled: 'cancelled'} %} {% set month_names = ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Juin', 'Juil', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc'] %} {% set day_names = ['Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim'] %}

Demandes de changement

Gérez les requêtes d'échange de shifts et les modifications d'horaires soumises par vos collaborateurs.

En attente {{ metrics.pending }}
Approuvées (7j) {{ metrics.approved7 }}
Rejetées (7j) {{ metrics.refused7 }}
Taux d'échange {{ metrics.swapRate }}%
Afficher : Toutes Mes validations
{% for request in requests %} {% set assignment = request.assignment %} {% set shift = assignment ? assignment.shift : null %} {% set employee = request.salarie %} {% set photo = employee and employee.photo ? employee.photo|trim : null %} {% set avatar = photo ? (photo starts with 'http://' or photo starts with 'https://' ? photo : asset(photo starts with '/' ? photo|slice(1) : photo)) : null %} {% set type_tone = type_tones[request.type]|default('other') %} {% set status_tone = status_tones[request.status]|default('pending') %} {% else %} {% endfor %}
Salarié Type de demande Shift concerné Remplaçant / Nouveau Date demande Statut Actions
{% if avatar %}{{ employee }}{% else %}{{ employee ? (employee.prenom|first ~ employee.nom|first)|upper : '?' }}{% endif %}
{{ employee ?: 'Salarié inconnu' }} {{ employee and employee.employeeService ? employee.employeeService.nom : 'Service non renseigné' }}{% if employee and employee.etablissement %} - {{ employee.etablissement.nom }}{% endif %}
{{ type_labels[request.type]|default(request.type|capitalize) }} {% if assignment %} {{ day_names[assignment.plannedStartAt|date('N') - 1] }}. {{ assignment.plannedStartAt|date('d') }} {{ month_names[assignment.plannedStartAt|date('n') - 1] }} {{ assignment.plannedStartAt|date('H:i') }} - {{ assignment.plannedEndAt|date('H:i') }}{% if shift %} ({{ shift.title }}){% endif %} {% else %} Shift non renseigné {% endif %} {% if request.type == 'time_change' and request.requestedStartAt and request.requestedEndAt %} {{ request.requestedStartAt|date('H:i') }} - {{ request.requestedEndAt|date('H:i') }} {{ request.reason|default('Nouvel horaire')|length > 28 ? request.reason|slice(0, 28) ~ '...' : request.reason|default('Nouvel horaire') }} {% elseif request.replacementSalarie %} {{ request.replacementSalarie }} {% else %} Non spécifié {% endif %} {{ request.createdAt|date('d/m/Y, H:i') }} {{ status_labels[request.status]|default(request.status|capitalize) }} {% if request.status in ['submitted', 'pending', 'in_review'] %}
{% else %} Détails {% endif %}
Aucune demande de changement.
Affichage de 1-{{ requests|length }} sur {{ metrics.total }} demandes

Politique d'échange

Le délai de prévenance actuel est fixé à 48 heures. Toute demande soumise moins de 48h avant le début du shift nécessite une validation exceptionnelle.

Modifier les règles de validation →

Suggestion automatique

Planify vérifie les règles de repos et les chevauchements avant chaque approbation. Les conflits bloquants empêchent la validation.

Voir les conflits →
{% endblock %}