Calculer les créneaux libres
Un créneau libre dépend de beaucoup de choses : plages d'ouverture, fermetures exceptionnelles, rendez-vous existants, durée de la prestation, délai minimum avant réservation. Et tout doit rester juste en heure de Paris, changements d'heure compris.
Une classe pure, sans Spring ni base de données, donc simple à tester unitairement. Elle raisonne en instants absolus : les dates sont calculées en heure de Paris puis stockées en UTC.
// Pour chaque plage d'ouverture du jour (ex. 9h-12h, puis 14h-19h)
for (OpeningRange range : ranges) {
// Instants absolus : un jour de changement d'heure dure 23 h ou 25 h
Instant rangeEnd = date.atTime(range.closesAt()).atZone(zone).toInstant();
Instant start = date.atTime(range.opensAt()).atZone(zone).toInstant();
while (!start.plus(serviceDuration).isAfter(rangeEnd)) {
Instant end = start.plus(serviceDuration);
if (!start.isBefore(notBefore) && isFree(start, end, busy)) slots.add(…);
start = start.plus(step); // pas de 15 minutes
}
}







