Skip to content

Planificateur de tâches (Time Blocking) dans Mon espace#174

Merged
Cyril-CB merged 3 commits into
mainfrom
claude/task-manager-time-blocking-3vbbam
Jun 30, 2026
Merged

Planificateur de tâches (Time Blocking) dans Mon espace#174
Cyril-CB merged 3 commits into
mainfrom
claude/task-manager-time-blocking-3vbbam

Conversation

@Cyril-CB

@Cyril-CB Cyril-CB commented Jun 30, 2026

Copy link
Copy Markdown
Owner

Résumé

Ajout d'un gestionnaire de tâches inspiré de FlowSavvy (épuré et simple) dans le menu Mon espace, avec calendrier et Time Blocking. L'organisation du planning est automatique, gérée par optimisation sous contraintes via un moteur Python intégré (placement glouton + équilibrage de charge).

ℹ️ Choix technique : plutôt que Google OR-Tools (dépendance native lourde qui complique le packaging .exe Windows), le moteur est écrit en Python pur, sans nouvelle dépendance. L'architecture isole le moteur (planificateur_engine.py) pour pouvoir brancher OR-Tools plus tard sans réécrire le reste.

Périmètre (phase 1)

  • Tâches : durée estimée, échéance (optionnelle), priorité (normale par défaut), préférence matin / après-midi, possibilité de découpage, taille de bloc minimum.
  • Événements fixes (rendez-vous, réunions) : bloqués en priorité par le moteur.
  • Bouton « Replanifier » + replanification automatique à chaque ajout.
  • Optimisation : équilibrage de la charge par jour ; micro-pauses (5 min/h les journées chargées, 15 min/2 h sinon) pour un planning humainement acceptable ; respect des horaires de travail ; répartition sensée des longues missions (≥ 3 h) sur plusieurs jours sans blocs minuscules.
  • Tâches récurrentes (quotidien / hebdomadaire / mensuel) placées là où il reste de la place.
  • Suivi depuis le calendrier : marquer effectuée, reporter, planifier la fin (créer une tâche pour le reste), modifier, supprimer.
  • Code couleur selon la proximité de l'échéance.
  • Vues jour / semaine / mois avec navigation simple.

Horaires de travail (sans ressaisie)

Les horaires sont repris automatiquement du planning théorique du salarié (table planning_theorique, menu Mon planning) — aucune double saisie. Ils sont résolus par date pour tenir compte des périodes (scolaire / vacances) et de l'alternance. Un horaire par défaut (lun.–ven. 9h–12h30 / 13h30–17h30) s'applique uniquement si aucun planning n'est défini.

Sécurité & confidentialité

  • Planning strictement privé : toutes les requêtes sont filtrées par user_id ; aucune route n'expose le planning d'un autre utilisateur (même la direction n'y a pas accès).
  • Accès réservé au comptable pour la phase de test (constante PROFILS_AUTORISES, facile à étendre).
  • Protection CSRF conservée (jeton X-CSRFToken sur les appels AJAX), validation stricte des entrées côté serveur.

Détails techniques

  • planificateur_engine.py : moteur d'optimisation pur (aucun accès base, horaires indexés par date), donc testable et remplaçable.
  • blueprints/planificateur.py : routes (page + API JSON), replanification, génération des occurrences récurrentes, résolution des horaires depuis le planning, contrôle d'accès.
  • templates/planificateur.html : UI calendrier (vanilla JS) jour/semaine/mois, modales d'ajout/édition, récurrences, détail.
  • Schéma : migration 0049_module_planificateur + tables ajoutées à init_db() (planif_taches, planif_blocs, planif_recurrences). Pas de table d'horaires : ils proviennent du planning existant.
  • Menu : lien ajouté dans « Mon espace » (profil comptable) ; blueprint enregistré dans app.py.

Tests

  • 28 tests ajoutés (tests/test_planificateur.py) : moteur (horaires, événements fixes, découpage, équilibrage, échéances, récurrences, micro-pauses, capacité, préférences, urgence) + routes (contrôle d'accès, création/replanification/suivi, horaires issus du planning, confidentialité).
  • 623 tests au total au vert (python3 -m pytest).
  • Vérification visuelle des vues semaine / mois et de la modale d'ajout, avec et sans planning théorique.

À noter

  • Aucune nouvelle dépendance dans requirements.txt.
  • Les suppressions gèrent manuellement les lignes enfants (le PRAGMA foreign_keys n'est pas actif sur cette base, comme pour le module Salles).

🤖 Generated with Claude Code

https://claude.ai/code/session_014HMmo12Zzmj91wAzVeKMf5

claude added 2 commits June 30, 2026 20:25
Nouveau module de gestion de taches personnel inspire de FlowSavvy, avec
planification automatique par optimisation sous contraintes (moteur Python
integre, sans dependance lourde).

- Taches (duree estimee, echeance optionnelle, priorite, preference matin /
  apres-midi, decoupage possible) et evenements fixes (rendez-vous, reunions)
- Moteur d'optimisation : equilibrage de la charge par jour, micro-pauses sur
  les journees chargees, respect des horaires de travail, blocage prioritaire
  des evenements fixes, repartition des longues missions sur plusieurs jours,
  taches recurrentes (quotidien / hebdo / mensuel) placees la ou il reste de
  la place
- Bouton Replanifier + replanification automatique a chaque ajout
- Suivi depuis le calendrier : marquer effectuee, reporter, planifier la fin,
  modifier, supprimer ; code couleur selon la proximite de l'echeance ;
  vues jour / semaine / mois avec navigation simple
- Horaires de travail configurables par jour de la semaine
- Planning strictement prive (filtre par utilisateur, aucun acces transversal),
  accessible au comptable en phase de test

Schema : migration 0049 (planif_taches, planif_blocs, planif_recurrences,
planif_horaires). Moteur pur (planificateur_engine.py) teste independamment
+ tests d'integration des routes (controle d'acces, confidentialite).
26 tests ajoutes, 621 tests au total au vert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014HMmo12Zzmj91wAzVeKMf5
…ssaisie)

Les salaries n'ont plus a saisir leurs horaires dans le planificateur : ils
sont desormais repris automatiquement du planning theorique (table
planning_theorique, menu « Mon planning »), resolus par date pour tenir compte
des periodes (scolaire / vacances) et de l'alternance. Un horaire par defaut
(lun-ven 9h-12h30 / 13h30-17h30) s'applique si aucun planning n'est defini.

- Suppression de la table planif_horaires, du bouton et de la modale
  « Horaires », et de la route /api/horaires
- Le moteur prend desormais des horaires indexes par date (et non par jour de
  semaine), pour gerer les horaires variables
- /api/blocs renvoie aussi les horaires de la plage (plages de travail du
  calendrier) ; indication dans l'UI que les horaires viennent de Mon planning
- Tests adaptes + nouveaux tests (horaires issus du planning, repli par defaut)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014HMmo12Zzmj91wAzVeKMf5
@Cyril-CB Cyril-CB marked this pull request as ready for review June 30, 2026 20:50

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0f838c5b7e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread blueprints/planificateur.py Outdated
Comment thread blueprints/planificateur.py Outdated
Comment thread blueprints/planificateur.py
Trois corrections suite a la revue automatique :

- Cloture d'une tache sous-planifiee : une tache dont les blocs ne couvrent pas
  toute la duree (capacite insuffisante) n'est plus marquee « faite » quand ses
  blocs visibles sont coches. On compare le temps realise a la duree estimee
  avant de cloturer, pour ne pas perdre le reliquat.
- « Planifier la fin » : on conserve les blocs deja realises mais on LIBERE les
  creneaux futurs non realises (au lieu de tous les marquer faits) avant de
  creer la tache « suite ». Evite la surevaluation du travail accompli et le
  double comptage de la capacite.
- Suppression d'un creneau d'evenement fixe : refusee cote serveur (un creneau
  verrouille ne peut etre supprime seul, sinon l'evenement reste en base sans
  bloquer son horaire). L'UI ne propose plus que « Supprimer l'evenement ».

Tests ajoutes pour les trois cas. 626 tests au vert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014HMmo12Zzmj91wAzVeKMf5
@Cyril-CB Cyril-CB merged commit ba49144 into main Jun 30, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants