From 5ca9f8f462f914c7cd9a4d18124fc7b35c6a9e6a Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Wed, 12 Jun 2024 18:12:40 +0200 Subject: [PATCH] wip --- PadelClub/Data/MatchScheduler.swift | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/PadelClub/Data/MatchScheduler.swift b/PadelClub/Data/MatchScheduler.swift index fb32e7a..c9be128 100644 --- a/PadelClub/Data/MatchScheduler.swift +++ b/PadelClub/Data/MatchScheduler.swift @@ -463,7 +463,7 @@ class MatchScheduler : ModelObject, Storable { let roundObject = match.roundObject! let courtsUnavailable = courtsUnavailable(startDate: rotationStartDate, duration: match.matchFormat.getEstimatedDuration(additionalEstimationDuration), courtsUnavailability: courtsUnavailability) print("courtsUnavailable \(courtsUnavailable)") - if courtIndex >= availableCourts - courtsUnavailable { + if courtPosition >= availableCourts - courtsUnavailable { return false } @@ -542,6 +542,11 @@ class MatchScheduler : ModelObject, Storable { }.sorted(by: \.1).map { $0.0 } } + let courtsUnavailable = courtsUnavailable(at: minimumTargetedEndDate, courtsUnavailability: courtsUnavailability) + + if let courtsUnavailable, courtsUnavailable == availableCourts { + minimumTargetedEndDate.addTimeInterval(3600) + } dispatchCourts(availableCourts: availableCourts, courts: freeCourts, availableMatchs: &availableMatchs, slots: &slots, rotationIndex: rotationIndex, rotationStartDate: minimumTargetedEndDate, freeCourtPerRotation: &freeCourtPerRotation, courtsUnavailability: courtsUnavailability) } } @@ -650,11 +655,24 @@ class MatchScheduler : ModelObject, Storable { courtUnavailable(courtIndex: $0, from: startDate, to: endDate, source: courtsUnavailability) }.count } + + func courtsUnavailable(at startDate: Date, courtsUnavailability: [DateInterval]?) -> Int? { + guard let courtsUnavailability else { return nil } + let groupedBy = Dictionary(grouping: courtsUnavailability, by: { $0.courtIndex }) + let courts = groupedBy.keys + return courts.filter { courtIndex in + let courtLockedSchedule = courtsUnavailability.filter({ $0.courtIndex == courtIndex }) + return courtLockedSchedule.anySatisfy({ dateInterval in + dateInterval.range.contains(startDate) + }) + }.count + } func courtUnavailable(courtIndex: Int, from startDate: Date, to endDate: Date, source: [DateInterval]) -> Bool { let courtLockedSchedule = source.filter({ $0.courtIndex == courtIndex }) return courtLockedSchedule.anySatisfy({ dateInterval in - dateInterval.isDateInside(startDate) || dateInterval.isDateInside(endDate) + let range = startDate..