feat: add functionality for declaring non-working days and their impact on leave balances
This commit is contained in:
1 parent
bc8570d8ca
commit
4de2b9e63f
6 files changed
+127
-10
No files matched your search
+24
@@ -0,0 +1,24 @@
|
||||
# 01 — Saisir, sauvegarder et figer les jours déjà posés
|
||||
|
||||
**What to build:** L’utilisateur déclare ses jours non travaillés directement dans le calendrier, les retrouve après rechargement et obtient un calcul qui garde ces dates et types fixes sans débiter à nouveau ses soldes restants.
|
||||
|
||||
**Blocked by:** None — can start immediately.
|
||||
|
||||
**Status:** ready-for-agent
|
||||
|
||||
**GitLab:** [#61](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/61)
|
||||
|
||||
Source : [issue #13](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/13), entretien et spécification de développement. Respecter le glossaire du domaine et les ADR 0002, 0005, 0006 et 0007.
|
||||
|
||||
- [ ] Un mode explicite « Saisir les jours déjà posés » présente l’horizon actuellement choisi et permet de sélectionner CP, RTT ou Autre. Autre couvre toutes les autres raisons de ne pas travailler ; ANY reste uniquement un sélecteur de règle.
|
||||
- [ ] Un clic sur une date admissible ajoute le type sélectionné ; un deuxième clic avec ce type supprime la déclaration ; un clic avec un autre type la remplace. Une date porte au maximum une déclaration.
|
||||
- [ ] Seuls les jours du lundi au vendredi hors jours fériés français nationaux sont admissibles. Les commandes et les cases sont utilisables au clavier ; le type et le marquage immédiat « Déjà posé » sont accessibles aux lecteurs d’écran et reconnaissables sans la seule couleur.
|
||||
- [ ] Les déclarations sont sauvegardées automatiquement dans le navigateur, indépendamment des soldes et de l’horizon, puis restaurées avant le calcul initial. En l’absence de déclarations sauvegardées, la liste est vide. Changer d’horizon conserve les dates hors de la période affichée et leurs types.
|
||||
- [ ] Ajouter, supprimer ou remplacer une déclaration ne modifie aucune quantité de solde. Une déclaration n’exige pas de solde source et ne devient pas un placement consommant un droit.
|
||||
- [ ] Les clics de saisie ne lancent pas de calcul. Calculer soumet les déclarations avec les autres saisies ; en consultation, le résultat précédent conserve son horizon et ses déclarations jusqu’au résultat du nouveau calcul. Modifier les saisies après soumission ne change pas le contexte de ce calcul.
|
||||
- [ ] Le chemin de calcul direct et le worker utilisent les mêmes déclarations. Aucun nouveau placement, déplacement d’optimisation ou déplacement hypothétique ne peut occuper une date déclarée ; aucune déclaration ne peut être déplacée, supprimée ou retypée par ces opérations.
|
||||
- [ ] Le calendrier de consultation identifie les déclarations du résultat comme des saisies utilisateur, avec leur type et sans débit ni décision d’optimisation fictifs. Les explications, la trace originale et les comparaisons des nouveaux placements conservent les données du calcul qui les a produits.
|
||||
- [ ] Une annulation avec un meilleur plan valide conserve ses déclarations fixes ; une annulation sans plan conserve le résultat incomplet existant. Les données malformées relèvent d’une entrée invalide, et une requête sans déclaration conserve le comportement existant.
|
||||
- [ ] Les tests de comportement couvrent les trois opérations de saisie, l’accessibilité, les dates interdites, la restauration et la conservation hors horizon, l’absence de modification des soldes, la soumission explicite et l’immuabilité du résultat. Un scénario de planification sans règle vérifie l’absence de chevauchement par le chemin direct et le worker, y compris dans un plan annulé et une comparaison de date.
|
||||
|
||||
Les périodes de repos et les contributions aux règles seront ajoutées par les tickets suivants. Ce ticket est démontrable avec des règles désactivées : déclarer une date, calculer des congés restants, constater qu’elle reste fixe et ne reçoit aucun nouveau placement, puis recharger la page.
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
# 02 — Optimiser les périodes de repos autour des jours déclarés
|
||||
|
||||
**What to build:** Le calcul reconnaît le repos déjà prévu et organise les congés restants autour des jours non travaillés déclarés. Le calendrier et ses explications montrent les périodes complètes, même lorsqu’aucun congé supplémentaire n’a été placé.
|
||||
|
||||
**Blocked by:**
|
||||
|
||||
- 01 — Saisir, sauvegarder et figer les jours déjà posés ([#61](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/61)).
|
||||
|
||||
**Status:** ready-for-agent
|
||||
|
||||
**GitLab:** [#62](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/62)
|
||||
|
||||
Source : [issue #13](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/13), entretien et spécification de développement. Respecter les définitions de période de repos, gain en jours non travaillés, séquence de travail et semaine de jour férié du glossaire, ainsi que les ADR 0006 et 0007.
|
||||
|
||||
- [ ] Un vendredi ordinaire déclaré Autre, sans solde ni règle, produit une période vendredi–dimanche de trois jours. Cette période existe sans nouveau placement et ne provoque aucun débit.
|
||||
- [ ] Les déclarations, nouveaux placements, week-ends et jours fériés adjacents forment des périodes contiguës fusionnées. Chaque date contribue une seule fois à leur durée ; l’origine et le type des déclarations restent distincts des placements.
|
||||
- [ ] Une déclaration interrompt une séquence de travail comme un jour de congé placé. Les week-ends et jours fériés intermédiaires conservent leur comportement existant : ils ne comptent pas comme jours travaillés et ne coupent pas seuls une séquence.
|
||||
- [ ] Une déclaration adjacente hors horizon peut prolonger une période qui prend ancrage dans l’horizon, avec les jours non travaillés contigus. Les autres déclarations hors horizon restent enregistrées sans créer de placements ou de périodes isolées extérieurs au plan.
|
||||
- [ ] Les nouveaux placements restent limités à l’horizon soumis. Les horizons passés et de plusieurs années conservent leurs limites explicites ; les jours de contexte hors horizon sont identifiés comme tels dans le calendrier.
|
||||
- [ ] Une véritable semaine de jour férié peut être complétée par des déclarations seules ou combinées à des placements. Sa valeur suit la définition existante ; une déclaration ne devient jamais un jour férié national.
|
||||
- [ ] L’optimiseur utilise ces périodes et coupures pour les objectifs et les placements de soutien existants, en conservant leur ordre lexicographique. Le gain en jours non travaillés compte les week-ends et jours fériés distincts couverts, sans compter un jour déclaré comme un nouveau gain en lui-même.
|
||||
- [ ] Les périodes affichées, les métriques, les explications stables, les évaluations de la trace originale et les comparaisons hypothétiques utilisent les mêmes déclarations fixes. Le meilleur plan valide retenu lors d’une interruption présente les mêmes périodes et métriques que ce plan complet aurait présentées.
|
||||
- [ ] Les tests de comportement couvrent vendredi–dimanche sans solde, une période mixte fusionnée, les séquences de travail, les limites d’horizon avec déclarations adjacentes, une semaine de jour férié complétée et l’ordre des objectifs. Ils vérifient aussi la cohérence du calendrier, des explications et d’une comparaison après modification des saisies courantes.
|
||||
|
||||
Ce ticket est démontrable en déclarant un vendredi, puis en ajoutant des congés disponibles : le repos déjà prévu apparaît dans le résultat et influence l’organisation des nouveaux placements.
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
# 03 — Compter les jours déclarés dans les règles de période
|
||||
|
||||
**What to build:** Une règle TIME_WINDOW reconnaît les jours non travaillés déjà déclarés de type compatible et ne demande au calcul que les congés supplémentaires nécessaires. Le résultat explique ces contributions sans leur attribuer un débit de solde.
|
||||
|
||||
**Blocked by:**
|
||||
|
||||
- 01 — Saisir, sauvegarder et figer les jours déjà posés ([#61](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/61)).
|
||||
|
||||
**Status:** ready-for-agent
|
||||
|
||||
**GitLab:** [#63](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/63)
|
||||
|
||||
Source : [issue #13](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/13), entretien et spécification de développement. Respecter les quantités, fenêtres inclusives, obligations conjointes, priorités et contributions partagées du glossaire, ainsi que l’ADR 0007.
|
||||
|
||||
- [ ] Dans une semaine ordinaire, avec quatre CP restants, un mercredi déclaré CP et une obligation de cinq CP du lundi au vendredi, le calcul ajoute quatre CP et débite uniquement ces quatre jours.
|
||||
- [ ] Les déclarations compatibles contribuent aux obligations exactes et aux préférences demandant jusqu’à une quantité donnée, dans l’intersection entre la fenêtre inclusive de la règle et l’horizon soumis. Une déclaration extérieure à ces limites ne contribue pas à la règle.
|
||||
- [ ] CP, RTT et Autre satisfont uniquement leur type ou ANY. Un RTT déclaré ne satisfait pas une demande de CP ; le calcul conserve sa date et son type et cherche d’autres jours disponibles si la règle le demande.
|
||||
- [ ] Une règle entièrement satisfaite par les déclarations n’ajoute aucun placement pour elle. Une règle partiellement satisfaite ne provoque aucun nouveau débit pour les jours déclarés.
|
||||
- [ ] Un même jour déclaré peut contribuer à plusieurs règles compatibles, y compris des obligations et préférences simultanées. La satisfaction conjointe des obligations et l’ordre des préférences restent ceux du planificateur existant.
|
||||
- [ ] Si les déclarations compatibles dépassent la quantité d’une obligation exacte, seules les contributions nécessaires à cette quantité sont attribuées à la règle ; toutes les dates et tous les types déclarés restent fixes. Par exemple, trois CP déclarés dans une fenêtre exigeant deux CP satisfont la règle sans nouveau placement ni suppression d’une déclaration.
|
||||
- [ ] Le résultat et ses explications distinguent les contributions des déclarations de celles des placements consommant un solde. La trace originale ne présente aucun débit fictif. Une comparaison déplace seulement le placement choisi et conserve les déclarations et les obligations satisfaites du calcul d’origine.
|
||||
- [ ] Une demande valide mais conjointement impossible reste un conflit de planification expliqué ; une entrée malformée reste une entrée invalide. Des déclarations de type incompatible ne sont pas transformées pour satisfaire une obligation, y compris dans un plan valide retenu à l’annulation.
|
||||
- [ ] Les tests de comportement couvrent le cas cinq CP dont un déclaré, une règle entièrement satisfaite sans solde, les trois types et ANY, le partage entre règles, les fenêtres inclusives, les conflits typés, les contributions en surplus et les explications/comparaisons conservant le contexte soumis.
|
||||
|
||||
Le traitement des déclarations en surplus a été confirmé pendant le découpage : attribuer à l’obligation sa quantité demandée et conserver toutes les dates déclarées.
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
# 04 — Appliquer les motifs IF_THEN et les droits acquis aux jours déclarés
|
||||
|
||||
**What to build:** Les jours non travaillés déclarés participent aux motifs de règles autour des jours fériés et peuvent générer des droits acquis utilisables plus tard dans le plan, sans ajouter une seconde fois les droits déjà disponibles dans les soldes de l’entreprise.
|
||||
|
||||
**Blocked by:**
|
||||
|
||||
- 02 — Optimiser les périodes de repos autour des jours déclarés ([#62](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/62)).
|
||||
- 03 — Compter les jours déclarés dans les règles de période ([#63](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/63)).
|
||||
|
||||
**Status:** ready-for-agent
|
||||
|
||||
**GitLab:** [#64](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/64)
|
||||
|
||||
Source : [issue #13](https://gitlab.nessar.fr/nessar/vac-optimizer/-/work_items/13), entretien et spécification de développement. Respecter les occurrences et modes IF_THEN, les droits acquis et l’ordre des objectifs du glossaire, ainsi que les ADR sur les artefacts du même calcul et l’ADR 0007.
|
||||
|
||||
- [ ] Les motifs IF_THEN utilisent les véritables jours fériés français nationaux et les modes before, after, around et auto existants. Une déclaration ne crée pas une occurrence de jour férié et ne permet pas de déplacer le motif hors de ses limites admissibles.
|
||||
- [ ] Une déclaration compatible occupe sa position normale dans le motif et réduit le nombre de nouveaux placements nécessaires. Une déclaration incompatible ne peut être retypée ou déplacée, ni être sautée pour reporter la position demandée sur un jour plus éloigné. Les obligations restent obligatoires pour chaque occurrence ; les préférences conservent leur exigence de motif complet et leurs priorités.
|
||||
- [ ] Un motif peut être entièrement déclaré ou combiner déclarations et nouveaux placements. Une même déclaration peut contribuer à ce motif et à une règle TIME_WINDOW compatible ; seuls les nouveaux placements consomment des soldes.
|
||||
- [ ] Chaque occurrence satisfaite d’une règle qui génère des congés peut produire son droit acquis, qu’elle soit satisfaite par des déclarations, des placements ou les deux. Un droit n’est ajouté qu’une fois par occurrence de cette règle dans le calcul.
|
||||
- [ ] Sa disponibilité est le lendemain de la fin de la période de repos génératrice complète, y compris ses déclarations et jours adjacents ; son expiration reste un an après sa disponibilité. Une prolongation de la période impose de réévaluer ces bornes et de conserver uniquement un plan dont les placements financés restent compatibles.
|
||||
- [ ] Le calcul capture une seule fois la date du jour en Europe/Paris à son lancement. Le chemin direct, le worker, le résultat et ses artefacts utilisent cette même date. Il n’existe aucune date de relevé supplémentaire à saisir ou à conserver comme paramètre utilisateur.
|
||||
- [ ] Un droit disponible aujourd’hui ou auparavant est supposé déjà inclus dans les soldes reportés et n’y est pas ajouté à nouveau. Seuls les droits disponibles strictement après cette date sont ajoutés. Cette limite s’applique aussi aux droits générés par des placements seuls, sans empêcher les règles de reconnaître des occurrences passées.
|
||||
- [ ] Un droit futur peut financer des placements ultérieurs compatibles, notamment la partie restante d’une obligation TIME_WINDOW comportant déjà une déclaration. Il ne peut financer un placement avant sa disponibilité, après son expiration ou avant la fin de sa période génératrice.
|
||||
- [ ] Le résultat, les explications stables, la trace originale et les comparaisons rendent compréhensibles les contributions fixes et l’origine des droits acquis. Une édition ultérieure, un changement de date du jour ou une livraison tardive des artefacts ne change ni la date de référence ni les déclarations du calcul affiché. Les comparaisons conservent la provenance des droits et les contraintes de disponibilité.
|
||||
- [ ] Une annulation conserve les déclarations et droits cohérents du meilleur plan valide trouvé. Une demande valide impossible du fait des types, motifs ou disponibilités reste un conflit expliqué, distinct d’une entrée invalide et d’un calcul interrompu.
|
||||
- [ ] Les tests de comportement utilisent une horloge fixée et couvrent les motifs déclarés et mixtes, les types et ANY, le partage entre familles de règles, les disponibilités hier/aujourd’hui/demain, un lancement près du changement de date en Europe/Paris, une période génératrice prolongée et une chaîne de financement. Les scénarios existants sur des horizons historiques conservent des attentes indépendantes du jour d’exécution.
|
||||
- [ ] La vérification intégrée soumet ces données depuis le calendrier, compare le chemin direct et le worker, puis consulte les explications, la trace et une comparaison après une édition des saisies ou une livraison tardive. Elle couvre aussi un plan interrompu avec des déclarations et des droits acquis.
|
||||
|
||||
Ce ticket termine le parcours de #13 : des CP déjà posés autour d’un jour férié génèrent un droit encore futur, qui finance le complément d’une règle de période tout en conservant toutes les dates déclarées.
|
||||
Reference in new issue
Block a user