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..