|
|
|
|
@ -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..<endDate |
|
|
|
|
return dateInterval.range.overlaps(range) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|