warn overlapping plage ouvertures conflicts on RDVs creation
Created by: adipasquale
Screenshots
agent rdv wizard tunnel step 3
rdvs show
(ca apparait de la meme maniere dans la liste des RDVs)
calendar
Implementation
TimeSlot
J'ai créé un petit modele hors AR qui represente un créneau temporel : TimeSlot
. C'est un datetime de début + un datetime de fin. Il a deux comportements :
- il valide que les datetimes appartiennent à la même journée et sont consécutifs
- on peut calculer si deux time slots se chevauchent ou non avec
#intersects?
Un Creneau
peut etre vu comme un TimeSlot
qualifié car il correspond a une plage d'ouverture + une duree de rdv etc
Dans les specs j'ai essayé de bien découper ce que je teste et de mocker le niveau en dessous a chaque fois pour limiter les responsabilités de chaque test. c'est a dire que d'un coté je teste que les dates se chevauchent, puis d'un autre que les horaires se chevauchent par ex.
plage_ouverture.covers_date?
cette nouvelle methode est responsable de dire si une PO aura une occurence à une certaine date. Elle s'appuie sur la méthode #include?
de Montrose, qui malheureusement n'a pas l'air de fonctionner pour des recurrences d'intervalles > 1 cf https://github.com/rossta/montrose/pull/132.
Dans cette PR j'ai un peu contourné le pb en ignorant explicitement ces plages d'ouvertures. Je pense que c'est OK car en prod il y en a moins de 5% dans ce cas (mais non negligeable qd meme). On pourra corriger ce pb upstream dans montrose plus tard, je n'ai pas trouvé le fix hyper rapidement donc je préfère ne pas y passer trop de temps (cette PR a déjà pris pas mal de temps)
bug lors creation rdv pour un autre agent
il y avait un bug lors d'une erreur de validation a la derniere etape du tunnel de prise de rdv agent. lorsqu'un agent créé un rdv pour un autre agent, on perdait le contexte de l'agent visé s'il y avait une erreur de validation. Le bug venait d'un manquement lors de l'instanciation de AgentRdvWizard
dans la branche else
du rdv.save
dans le rdvs#create
irb(main):009:0> PlageOuverture.not_expired.where.not(recurrence: nil).to_a.select { (_1.recurrence.to_h[:interval] || 1) > 1 }.count
=> 104
irb(main):010:0> PlageOuverture.not_expired.count
=> 2862