|
|
|
|
@ -217,7 +217,7 @@ final class MatchScheduler : ModelObject, Storable { |
|
|
|
|
|
|
|
|
|
let rotationStartDate: Date = startingDate.addingTimeInterval(timeIntervalToAdd) |
|
|
|
|
let courtsUnavailable = courtsUnavailable(startDate: rotationStartDate, duration: match.matchFormat.getEstimatedDuration(additionalEstimationDuration), courtsUnavailability: courtsUnavailability) |
|
|
|
|
if courtIndex >= numberOfCourtsAvailablePerRotation - courtsUnavailable { |
|
|
|
|
if courtIndex >= numberOfCourtsAvailablePerRotation - courtsUnavailable.count { |
|
|
|
|
return false |
|
|
|
|
} else { |
|
|
|
|
return teamsPerRotation[rotationIndex]!.allSatisfy({ match.containsTeamId($0) == false }) == true |
|
|
|
|
@ -441,9 +441,12 @@ final class MatchScheduler : ModelObject, Storable { |
|
|
|
|
} else if let first = availableMatchs.first { |
|
|
|
|
let duration = first.matchFormat.getEstimatedDuration(additionalEstimationDuration) |
|
|
|
|
let courtsUnavailable = courtsUnavailable(startDate: rotationStartDate, duration: duration, courtsUnavailability: courtsUnavailability) |
|
|
|
|
if courtsUnavailable == numberOfCourtsAvailablePerRotation { |
|
|
|
|
|
|
|
|
|
if courtsUnavailable.count == numberOfCourtsAvailablePerRotation { |
|
|
|
|
print("issue") |
|
|
|
|
issueFound = true |
|
|
|
|
} else { |
|
|
|
|
courts = Array(Set(courts).subtracting(Set(courtsUnavailable))) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -477,7 +480,7 @@ final class MatchScheduler : ModelObject, Storable { |
|
|
|
|
let roundObject = match.roundObject! |
|
|
|
|
let courtsUnavailable = courtsUnavailable(startDate: rotationStartDate, duration: match.matchFormat.getEstimatedDuration(additionalEstimationDuration), courtsUnavailability: courtsUnavailability) |
|
|
|
|
print("courtsUnavailable \(courtsUnavailable)") |
|
|
|
|
if courtPosition >= availableCourts - courtsUnavailable { |
|
|
|
|
if courtPosition >= availableCourts - courtsUnavailable.count { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -560,7 +563,7 @@ final class MatchScheduler : ModelObject, Storable { |
|
|
|
|
if let first = availableMatchs.first { |
|
|
|
|
let duration = first.matchFormat.getEstimatedDuration(additionalEstimationDuration) |
|
|
|
|
let courtsUnavailable = courtsUnavailable(startDate: minimumTargetedEndDate, duration: duration, courtsUnavailability: courtsUnavailability) |
|
|
|
|
if courtsUnavailable < availableCourts { |
|
|
|
|
if courtsUnavailable.count < availableCourts { |
|
|
|
|
dispatchCourts(availableCourts: availableCourts, courts: freeCourts, availableMatchs: &availableMatchs, slots: &slots, rotationIndex: rotationIndex, rotationStartDate: minimumTargetedEndDate, freeCourtPerRotation: &freeCourtPerRotation, courtsUnavailability: courtsUnavailability) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -664,14 +667,14 @@ final class MatchScheduler : ModelObject, Storable { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func courtsUnavailable(startDate: Date, duration: Int, courtsUnavailability: [DateInterval]?) -> Int { |
|
|
|
|
func courtsUnavailable(startDate: Date, duration: Int, courtsUnavailability: [DateInterval]?) -> [Int] { |
|
|
|
|
let endDate = startDate.addingTimeInterval(Double(duration) * 60) |
|
|
|
|
guard let courtsUnavailability else { return 0 } |
|
|
|
|
guard let courtsUnavailability else { return [] } |
|
|
|
|
let groupedBy = Dictionary(grouping: courtsUnavailability, by: { $0.courtIndex }) |
|
|
|
|
let courts = groupedBy.keys |
|
|
|
|
return courts.filter { |
|
|
|
|
courtUnavailable(courtIndex: $0, from: startDate, to: endDate, source: courtsUnavailability) |
|
|
|
|
}.count |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func courtUnavailable(courtIndex: Int, from startDate: Date, to endDate: Date, source: [DateInterval]) -> Bool { |
|
|
|
|
|