Projet

Général

Profil

Development #62801

Garde partagée, permettre de configurer les règles de garde pendant les vacances

Ajouté par Valentin Deniaud il y a environ 2 ans. Mis à jour il y a environ 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
15 mars 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Tous les jugements de garde alternée spécifient une règle de garde pendant les vacances, par exemple http://www.cdad-yvelines.justice.fr/wp-content/uploads/2019/10/2-MODELE-CONVENTION-PARENTALE-GARDE-ALTERNEE.pdf (page 2).

Les dates des vacances scolaires changent tous les ans et sont connues environ un an à l'avance (avec le twist qu'elles peuvent changer en cours d'année).

On ne peut pas raisonnablement demander aux agents d'aller ressaisir ça tous les ans sur tous les agendas. Il faut donc un objet qui contienne les dates des vacances connues jusqu'à présent, auquel on attache des règles de garde.

La difficulté ici c'est de savoir comment récupérer les vacances.

Les ICS officiels sont dispo ici : https://www.data.gouv.fr/en/datasets/le-calendrier-scolaire/

À noter :
  • La seule chose qui caractérise, disons, les vacances de la Toussaint, comme les vacances de la Toussaint est leur nom, il n'y a pas d'identifiant.
  • Il y a des choses dont on ne veut pas comme « Vacances d'Été (Enseignants) ».
On pourrait donc imaginer le fonctionnement :
  • Un feature flag fait apparaître « Configurer les vacances scolaires » dans le menu kebab de l'accueil
  • Sur cette page on peut importer un ICS
  • L'import parse les évènements, les dépuplique suivant leur nom
  • Page intermédiaire permettant de cocher les évènements à effectivement importer
  • Après validation la page de configuration affiche les dates des vacances connues à partir de l'année en cours
  • Chaque année il faut passer sur cette page réimporter le fichier
    • Si un des libellés a changé, il y a une page intermédiaire de rattachement comme pour un changement de wf
  • Si la date des vacances change ça se gère un peu pareil par réimport

Fichiers


Demandes liées

Lié à Passerelle - Development #63013: Connecteur vacances scolairesFermé21 mars 2022

Actions

Révisions associées

Révision dcec0f2d (diff)
Ajouté par Valentin Deniaud il y a environ 2 ans

agendas: add time period exception groups (#62801)

Révision 7d0511aa (diff)
Ajouté par Valentin Deniaud il y a environ 2 ans

agendas: add shared custody holiday rules (#62801)

Révision 22d3a7e0 (diff)
Ajouté par Valentin Deniaud il y a environ 2 ans

agendas: exceptional custody periods should override holiday rules (#62801)

Révision 5ca2fa0e (diff)
Ajouté par Valentin Deniaud il y a environ 2 ans

agendas: add command to update shared custody holiday rules (#62801)

Historique

#1

Mis à jour par Valentin Deniaud il y a environ 2 ans

Bon j'ai commencé à regarder et ça va faire beaucoup de code ad hoc bizarre (pour gérer les histoires liées à l'absence d'identifiant, à la mise à jour)...

Typiquement quand on a une URL officielle comme ça et des données un peu pourries on fait un connecteur, est-ce que ça ne pourrait pas être le cas ici ?

D'un côté il y aurait passerelle où on instancie le connecteur, avec l'URL copiée depuis data.gouv.fr mais on peut éventuellement mettre autre chose. On maintient un mapping explicite (nom, identifiant) : le jour où un nom change, hop commit pour ajouter un nouveau mapping (nouveau_nom, identifiant). Périodiquement on recharge le fichier et on ajoute/met à jour les nouvelles dates.

Côté chrono il n'y a quasiment plus rien à faire, on indique l'URL du connecteur, comme il garantit des identifiants stables on peut jouer l'ajout des nouvelles dates automatiquement.

#2

Mis à jour par Valentin Deniaud il y a environ 2 ans

La solution précédente permettrait un modèle de données propre :
  • Objet Holiday qui contient l'identifiant des vacances (« grandes-vacances », « noel ») et libellé correspondant
  • Objet HolidayPeriod lié à un objet Holiday, indique les dates des vacances pour une année et contient juste une date de début et une date de fin
  • Objet HolidayCustodyRules lié à (gardien, agenda, holiday) qui contient les règles de garde pendant ces vacances

Dans le formulaire de création d'un HolidayCustodyRules on a un select alimenté par les objets Holiday. À l'enregistrement, pour chaque dates connues (HolidayPeriod) on crée en base des objets SharedCustodyPeriod qui correspondent. À l'édition, on les vire et on les recrée. Enfin il y aura le cron qui viendra au moins une fois par an ajouter les nouvelles dates (on a déjà ça pour les jours fériés), ça sera facile de créer les nouvelles périodes qui vont bien.

Mais est-ce qu'on veut de ce modèle de données propre pour un truc aussi spécifique ?

Sur ce, encore un plan alternatif :
  • Traiter #52370 pour pouvoir synchroniser un ICS depuis un calendrier d'indispo
  • Créer un calendrier d'indispo dont le slug serait « vacances »
  • Synchroniser dedans le ICS de data.gouv.fr ou un ICS alternatif avec les vacances ou créer les vacances à la mano
  • Avoir un écran où indiquer le slug du calendrier d'indipo contenant les vacances

Le seul truc spécifique Publik Famille garde partagée est le dernier point, et c'est flexible grâce à l'intermédiaire du calendrier d'indispo, en plus on peut visualiser facilement les dates.

Il faudrait sûrement aussi développer un truc générique « désactiver une exception » pour pallier aux vacances dont on ne veut pas comme noté dans la description.

Du modèle de données ci-dessus, on ne garderait que HolidayCustodyRules, cette fois-ci lié à (gardien, agenda, calendrier d'indipo) qui contient les règles de garde et le libellé des vacances.

Dans le formulaire de création d'un HolidayCustodyRules on a un select alimenté par les libellés dédupliqués des exceptions du calendrier d'indispo. À l'enregistrement, on récupère les exceptions correspondant au libellé et pour chaque exception on crée en base des objets SharedCustodyPeriod qui correspondent. À l'édition, on les vire et on les recrée. Enfin il y aura le cron qui viendra au moins une fois par an ajouter les nouvelles dates et on se sentira peut-être mal à l'aise de n'avoir que des libellés à se mettre sous la dent.

Mais en gros ça revient au même avec d'un côté trucs spécifiques et liens sur foreign keys et de l'autre trucs génériques et lien sur libellés genre « Vacances d'Été (Élèves) » (gloups, aller on pourra passer un coup de slugify dessus).

#3

Mis à jour par Valentin Deniaud il y a environ 2 ans

#5

Mis à jour par Valentin Deniaud il y a environ 2 ans

Au final, fonctionnement hybride par rapport aux hypothèses ci-dessus :
  • Instancier un connecteur « Vacances scolaires » dans passerelle
  • Créer un calendrier d'indispo qui doit avoir pour slug « chrono-holidays »¹
  • L'alimenter par l'endpoint /holidays.ics du connecteur
  • Ça débloque la section « Règles pendant les vacances » d'un agenda de garde
  • On y trouve un formulaire avec un select alimenté depuis les vacances contenues dans la calendrier d'indispo

¹ Ça serait bien de trouver mieux que ce slug imposé, je n'avais pas trop d'inspiration pour faire autrement et c'était la solution la plus simple pour avancer.

0001 : on crée des groupes d'exception automatiquement depuis la catégorie liée au vevent d'un ICS. Le truc un peu bancal c'est que la catégorie est utilisée pour spécifier un slug, il manque donc le libellé : on prend donc celui du premier vevent en supposant qu'ils s'appellent tous pareil.
0002 : tout ce qu'il faut pour ajouter des règles spécifiques aux vacances.
0003 : il faut toujours qu'on puisse ajouter des périodes de garde exceptionnelles et qu'elles s'appliquent par dessus les règles des vacances.
0004 : la mise à jour pour prendre en compte les éventuelles nouvelles dates.

#6

Mis à jour par Lauréline Guérin il y a environ 2 ans

0002:

        if periodicity in ('first-half', 'second-half'):
            qs = qs.filter(
                periodicity__in=(periodicity, '', 'first-and-third-quarters', 'second-and-fourth-quarters')
            )
        elif periodicity in ('first-and-third-quarters', 'second-and-fourth-quarters'):
            qs = qs.filter(periodicity__in=(periodicity, '', 'first-half', 'second-half'))

Ca revient pas à exclure l'autre valeur ?
if periodicity == 'first-half':
    qs = qs.exclude(periodicity='second-half')
# etc

ok ça fait 4 if à écrire, mais c'est peut-être un peu plus facile à lire ? :)
(ou alors juste ajouter un commentaire)

Pour le form d'ajout de règles pour les vacances, ça serait pratique de pouvoir dire "toutes les vacances" et que ça crée automatiquement une règle par vacances, plutôt que de devoir écrire la même règle 5 fois. (ça peut être dans un autre ticket)

Je testais un peu l'ajout de règles de vacances et leur affichage sur la vue mensuelle. (cf screenshot)
J'ai un soucis sur l'affichage du mois de septembre, on y voit août et septembre. (cf screenshot)

note: c'est bizarre le changement de garde le dimanche, c'est la règle qu'on doit suivre ? Peut-être que ça pourrait se paramétrer ? (ça peut être dans un autre ticket)
note 2: sur la vue mensuelle du calendrier de garde, faire apparaître les vacances scolaires pour aider la lecture ? (ça peut être dans un autre ticket)

#7

Mis à jour par Valentin Deniaud il y a environ 2 ans

Lauréline Guerin a écrit :

ok ça fait 4 if à écrire, mais c'est peut-être un peu plus facile à lire ? :)

Ouep totalement, branche à jour avec ça.

Pour le form d'ajout de règles pour les vacances, ça serait pratique de pouvoir dire "toutes les vacances" et que ça crée automatiquement une règle par vacances, plutôt que de devoir écrire la même règle 5 fois. (ça peut être dans un autre ticket)

On garde l'idée sous le coude et on attend de voir ce qu'en dit Stéphane : dans la grande majorité des cas il n'y aura que les grandes vacances + Noël à configurer, et l'objectif à terme est de contrôler tout ça par API.

Je testais un peu l'ajout de règles de vacances et leur affichage sur la vue mensuelle. (cf screenshot)
J'ai un soucis sur l'affichage du mois de septembre, on y voit août et septembre. (cf screenshot)

Yup je m'en étais aperçu pareil en testant, ça a été corrigé par #63328, j'ai rebasé la branche.

note: c'est bizarre le changement de garde le dimanche, c'est la règle qu'on doit suivre ? Peut-être que ça pourrait se paramétrer ? (ça peut être dans un autre ticket)

Oui je pense aussi que ça devra se paramétrer à terme, pour le moment je me base sur ce que dit le pdf « la deuxième moitié commence le samedi à 14h » et comme on a pas encore de notion de moitié j'ai décidé d'inclure tout le samedi.

À ce propos le calcul des quinzaines pour les vacances d'été est un enfer dès lors qu'elles ne commencent pas le samedi, on trouve mille sujets de gens perdus sur les forums et personne ne s'organise pareil. Difficile d'avancer plus loin sans retour métier, mais il faut s'attendre à devoir revoir ça.

note 2: sur la vue mensuelle du calendrier de garde, faire apparaître les vacances scolaires pour aider la lecture ? (ça peut être dans un autre ticket)

Bonne idée, faisons ça dans un autre ticket !

#8

Mis à jour par Lauréline Guérin il y a environ 2 ans

  • Statut changé de Solution proposée à Solution validée
#9

Mis à jour par Valentin Deniaud il y a environ 2 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 41e9180ba83f4c50411e01f62038f43ab5c8d9a1
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Tue Mar 29 16:28:39 2022 +0200

    agendas: add command to update shared custody holiday rules (#62801)

commit 403e4cd8fbb76fa9b538fb67c7b3ddbef3cbfe43
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Thu Mar 24 17:04:53 2022 +0100

    agendas: exceptional custody periods should override holiday rules (#62801)

commit 3ca5b784be01a2d49724a33631962706173f3906
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Thu Mar 24 17:05:17 2022 +0100

    agendas: add shared custody holiday rules (#62801)

commit bbd22d0597bb3a2848395ef0d398891d94a2ffd0
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Wed Mar 23 16:46:56 2022 +0100

    agendas: add time period exception groups (#62801)
#10

Mis à jour par Transition automatique il y a environ 2 ans

  • Statut changé de Résolu (à déployer) à Solution déployée
#11

Mis à jour par Transition automatique il y a presque 2 ans

Automatic expiration

Formats disponibles : Atom PDF