fix(heimdall): supprimer la carte Valkyrie annule la résa et libère le créneau #27

Merged
kevin merged 1 commit from fix/heimdall-cancel-frees-slot into main 2026-07-20 11:58:14 +00:00
Owner

Problème

Trouvé par Kevin au premier vrai cycle d'annulation : supprimer la carte d'un RDV sur le board Valkyrie (corbeille) ne libérait pas le créneau côté site. Pire : la réservation restait confirmed en base, donc le créneau était à la fois masqué de /slots ET impossible à re-réserver (contrainte unique user_id+slot_start, qui ne regarde pas le status).

Fix

  • delete_card (corbeille et définitif) et delete_project : les réservations Heimdall liées aux cartes origin=heimdall sont effacées — pas marquées cancelled, la contrainte unique bloquerait sinon le re-booking du créneau. Import paresseux du modèle Heimdall, no-op si le plugin est absent. Restaurer une carte depuis la corbeille ne ressuscite pas la réservation (documenté dans le code).
  • Migration 0015_heimdall_cancel_repair (idempotente) : efface les réservations orphelines déjà en prod (carte disparue ou en corbeille) — le créneau de mercredi revient tout seul au déploiement.
  • 3 tests : soft-delete → résa effacée + créneau réaffiché + re-réservable (201) ; suppression définitive ; suppression du board entier. Suite heimdall + corbeille : 17 verts en local (SQLite).

Choix de conception

Effacer plutôt que marquer : (1) la contrainte unique rend un cancelled inutilisable sans passer à un index partiel (migration plus lourde) ; (2) RGPD-minimisant — les données du prospect partent à l'annulation ; (3) les quotas anti-abus ne sont pas affectés (l'annulation est réservée au propriétaire via son board).

## Problème Trouvé par Kevin au premier vrai cycle d'annulation : supprimer la carte d'un RDV sur le board Valkyrie (corbeille) ne libérait pas le créneau côté site. Pire : la réservation restait `confirmed` en base, donc le créneau était à la fois masqué de `/slots` ET impossible à re-réserver (contrainte unique `user_id+slot_start`, qui ne regarde pas le `status`). ## Fix - **`delete_card`** (corbeille **et** définitif) et **`delete_project`** : les réservations Heimdall liées aux cartes `origin=heimdall` sont **effacées** — pas marquées `cancelled`, la contrainte unique bloquerait sinon le re-booking du créneau. Import paresseux du modèle Heimdall, no-op si le plugin est absent. Restaurer une carte depuis la corbeille ne ressuscite pas la réservation (documenté dans le code). - **Migration `0015_heimdall_cancel_repair`** (idempotente) : efface les réservations orphelines déjà en prod (carte disparue ou en corbeille) — le créneau de mercredi revient tout seul au déploiement. - **3 tests** : soft-delete → résa effacée + créneau réaffiché + re-réservable (201) ; suppression définitive ; suppression du board entier. Suite heimdall + corbeille : 17 verts en local (SQLite). ## Choix de conception Effacer plutôt que marquer : (1) la contrainte unique rend un `cancelled` inutilisable sans passer à un index partiel (migration plus lourde) ; (2) RGPD-minimisant — les données du prospect partent à l'annulation ; (3) les quotas anti-abus ne sont pas affectés (l'annulation est réservée au propriétaire via son board).
fix(heimdall): supprimer la carte Valkyrie annule la résa et libère le créneau
All checks were successful
CI / Backend — pytest (pull_request) Successful in 47s
CI / i18n — usage → locales (pull_request) Successful in 5s
4013fc2202
Trouvé par Kevin au premier vrai cycle d'annulation : la carte RDV
supprimée (corbeille) laissait la réservation confirmed en base — créneau
masqué sur le site ET impossible à re-réserver (contrainte unique
user_id+slot_start, insensible au status).

- delete_card (corbeille ET définitif) + delete_project : les résas
  Heimdall liées aux cartes origin=heimdall sont EFFACÉES (pas marquées
  cancelled, la contrainte unique bloquerait le re-booking) — import
  paresseux, no-op si le plugin est absent.
- Migration 0015 idempotente : répare les orphelines déjà en prod
  (carte disparue ou en corbeille) au déploiement.
- 3 tests : soft-delete → résa effacée + créneau réaffiché + re-réservable ;
  définitif ; suppression du board entier.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Wipvj4HzrdWiPpRL3QEww
kevin merged commit 9820e06f82 into main 2026-07-20 11:58:14 +00:00
kevin deleted branch fix/heimdall-cancel-frees-slot 2026-07-20 11:58:14 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
kevin/Gungnir!27
No description provided.