Push build improvements

multistore
Laurent 1 year ago
parent 367fbc6fea
commit 6e26222300
  1. 2
      PadelClub.xcodeproj/project.pbxproj
  2. 2
      PadelClub/Data/MonthData.swift
  3. 69
      PadelClub/Data/Tournament.swift
  4. 4
      PadelClub/Utils/ContactManager.swift
  5. 19
      PadelClub/Views/Round/RoundView.swift
  6. 7
      PadelClub/Views/User/UserCreationView.swift

@ -1882,6 +1882,7 @@
); );
MARKETING_VERSION = 0.1; MARKETING_VERSION = 0.1;
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
OTHER_SWIFT_FLAGS = "-Xfrontend -warn-long-function-bodies=5 -Xfrontend -warn-long-expression-type-checking=20 -Xfrontend -warn-long-function-bodies=50";
PRODUCT_BUNDLE_IDENTIFIER = app.padelclub; PRODUCT_BUNDLE_IDENTIFIER = app.padelclub;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
@ -1919,6 +1920,7 @@
); );
MARKETING_VERSION = 0.1; MARKETING_VERSION = 0.1;
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
OTHER_SWIFT_FLAGS = "-Xfrontend -warn-long-function-bodies=5 -Xfrontend -warn-long-expression-type-checking=20 -Xfrontend -warn-long-function-bodies=50";
PRODUCT_BUNDLE_IDENTIFIER = app.padelclub; PRODUCT_BUNDLE_IDENTIFIER = app.padelclub;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;

@ -32,7 +32,7 @@ class MonthData : ModelObject, Storable {
} }
func total() -> Int { func total() -> Int {
(maleCount ?? 0) + (femaleCount ?? 0) return (maleCount ?? 0) + (femaleCount ?? 0)
} }
static func calculateCurrentUnrankedValues(mostRecentDateAvailable: Date) async { static func calculateCurrentUnrankedValues(mostRecentDateAvailable: Date) async {

@ -348,7 +348,8 @@ class Tournament : ModelObject, Storable {
} }
func groupStages() -> [GroupStage] { func groupStages() -> [GroupStage] {
return Store.main.filter { $0.tournament == self.id }.sorted(by: \.index) let groupStages: [GroupStage] = DataStore.shared.groupStages.filter { $0.tournament == self.id }
return groupStages.sorted(by: \.index)
} }
func allRounds() -> [Round] { func allRounds() -> [Round] {
@ -713,8 +714,11 @@ class Tournament : ModelObject, Storable {
} }
func getActiveRound(withSeeds: Bool = false) -> Round? { func getActiveRound(withSeeds: Bool = false) -> Round? {
let rounds = rounds() let rounds: [Round] = self.rounds()
let round = rounds.filter({ $0.hasStarted() && $0.hasEnded() == false }).sorted(by: \.index).reversed().first ?? rounds.last(where: { $0.hasEnded() }) ?? rounds.first let unfinishedRounds: [Round] = rounds.filter { $0.hasStarted() && $0.hasEnded() == false }
let sortedRounds: [Round] = unfinishedRounds.sorted(by: \.index).reversed()
let round = sortedRounds.first ?? rounds.last(where: { $0.hasEnded() }) ?? rounds.first
if withSeeds { if withSeeds {
if round?.seeds().isEmpty == false { if round?.seeds().isEmpty == false {
@ -728,13 +732,14 @@ class Tournament : ModelObject, Storable {
} }
func getPlayedMatchDateIntervals(in event: Event) -> [DateInterval] { func getPlayedMatchDateIntervals(in event: Event) -> [DateInterval] {
allMatches().filter { $0.courtIndex != nil && $0.startDate != nil }.map { match in let allMatches: [Match] = self.allMatches().filter { $0.courtIndex != nil && $0.startDate != nil }
return allMatches.map { match in
DateInterval(event: event.id, courtIndex: match.courtIndex!, startDate: match.startDate!, endDate: match.estimatedEndDate(additionalEstimationDuration)!) DateInterval(event: event.id, courtIndex: match.courtIndex!, startDate: match.startDate!, endDate: match.estimatedEndDate(additionalEstimationDuration)!)
} }
} }
func allRoundMatches() -> [Match] { func allRoundMatches() -> [Match] {
allRounds().flatMap { $0._matches() } return allRounds().flatMap { $0._matches() }
} }
func allMatches() -> [Match] { func allMatches() -> [Match] {
@ -776,15 +781,27 @@ class Tournament : ModelObject, Storable {
let wcBracket = _teams.filter { $0.wildCardBracket }.sorted(using: _currentSelectionSorting, order: .ascending) let wcBracket = _teams.filter { $0.wildCardBracket }.sorted(using: _currentSelectionSorting, order: .ascending)
let groupStageSpots = groupStageSpots() let groupStageSpots: Int = self.groupStageSpots()
var bracketSeeds = min(teamCount, _completeTeams.count) - groupStageSpots - wcBracket.count var bracketSeeds: Int = min(teamCount, _completeTeams.count) - groupStageSpots - wcBracket.count
var groupStageTeamCount = groupStageSpots - wcGroupStage.count var groupStageTeamCount: Int = groupStageSpots - wcGroupStage.count
if groupStageTeamCount < 0 { groupStageTeamCount = 0 } if groupStageTeamCount < 0 { groupStageTeamCount = 0 }
if bracketSeeds < 0 { bracketSeeds = 0 } if bracketSeeds < 0 { bracketSeeds = 0 }
if prioritizeClubMembers { if prioritizeClubMembers {
let bracketTeams = (_completeTeams.filter { $0.hasMemberOfClub(clubName) } + _completeTeams.filter { $0.hasMemberOfClub(clubName) == false }.sorted(using: defaultSorting, order: .ascending)).prefix(bracketSeeds).sorted(using: _currentSelectionSorting, order: .ascending) + wcBracket var bracketTeams: [TeamRegistration] = []
bracketTeams.append(contentsOf: _completeTeams.filter { $0.hasMemberOfClub(clubName) })
let others: [TeamRegistration] = _completeTeams.filter { $0.hasMemberOfClub(clubName) == false }
let sortedOthers: [TeamRegistration] = others.sorted(using: defaultSorting, order: .ascending)
bracketTeams.append(contentsOf: sortedOthers)
bracketTeams = bracketTeams
.prefix(bracketSeeds)
.sorted(using: _currentSelectionSorting, order: .ascending)
bracketTeams.append(contentsOf: wcBracket)
// let bracketTeams: [TeamRegistration] = (_completeTeams.filter { $0.hasMemberOfClub(clubName) } + _completeTeams.filter { $0.hasMemberOfClub(clubName) == false }.sorted(using: defaultSorting, order: .ascending)).prefix(bracketSeeds).sorted(using: _currentSelectionSorting, order: .ascending) + wcBracket
let groupStageTeamsNoFiltering = Set(_completeTeams).subtracting(bracketTeams) let groupStageTeamsNoFiltering = Set(_completeTeams).subtracting(bracketTeams)
let groupStageTeams = (groupStageTeamsNoFiltering.filter { $0.hasMemberOfClub(clubName) } + groupStageTeamsNoFiltering.filter { $0.hasMemberOfClub(clubName) == false }.sorted(using: defaultSorting, order: .ascending)).prefix(groupStageTeamCount).sorted(using: _currentSelectionSorting, order: .ascending) + wcGroupStage let groupStageTeams = (groupStageTeamsNoFiltering.filter { $0.hasMemberOfClub(clubName) } + groupStageTeamsNoFiltering.filter { $0.hasMemberOfClub(clubName) == false }.sorted(using: defaultSorting, order: .ascending)).prefix(groupStageTeamCount).sorted(using: _currentSelectionSorting, order: .ascending) + wcGroupStage
@ -804,11 +821,11 @@ class Tournament : ModelObject, Storable {
} }
func bracketCut() -> Int { func bracketCut() -> Int {
max(0, teamCount - groupStageCut()) return max(0, teamCount - groupStageCut())
} }
func groupStageCut() -> Int { func groupStageCut() -> Int {
groupStageSpots() return groupStageSpots()
} }
func cutLabel(index: Int) -> String { func cutLabel(index: Int) -> String {
@ -822,11 +839,11 @@ class Tournament : ModelObject, Storable {
} }
func unsortedTeamsWithoutWO() -> [TeamRegistration] { func unsortedTeamsWithoutWO() -> [TeamRegistration] {
Store.main.filter { $0.tournament == self.id && $0.walkOut == false } return Store.main.filter { $0.tournament == self.id && $0.walkOut == false }
} }
func walkoutTeams() -> [TeamRegistration] { func walkoutTeams() -> [TeamRegistration] {
Store.main.filter { $0.tournament == self.id && $0.walkOut == true } return Store.main.filter { $0.tournament == self.id && $0.walkOut == true }
} }
func duplicates(in players: [PlayerRegistration]) -> [PlayerRegistration] { func duplicates(in players: [PlayerRegistration]) -> [PlayerRegistration] {
@ -841,15 +858,15 @@ class Tournament : ModelObject, Storable {
} }
func unsortedPlayers() -> [PlayerRegistration] { func unsortedPlayers() -> [PlayerRegistration] {
unsortedTeams().flatMap { $0.unsortedPlayers() } return self.unsortedTeams().flatMap { $0.unsortedPlayers() }
} }
func selectedPlayers() -> [PlayerRegistration] { func selectedPlayers() -> [PlayerRegistration] {
selectedSortedTeams().flatMap { $0.unsortedPlayers() }.sorted(by: \.computedRank) return self.selectedSortedTeams().flatMap { $0.unsortedPlayers() }.sorted(by: \.computedRank)
} }
func players() -> [PlayerRegistration] { func players() -> [PlayerRegistration] {
unsortedTeams().flatMap { $0.unsortedPlayers() }.sorted(by: \.computedRank) return self.unsortedTeams().flatMap { $0.unsortedPlayers() }.sorted(by: \.computedRank)
} }
func unrankValue(for malePlayer: Bool) -> Int? { func unrankValue(for malePlayer: Bool) -> Int? {
@ -867,12 +884,12 @@ class Tournament : ModelObject, Storable {
//todo //todo
var clubName: String? { var clubName: String? {
eventObject()?.clubObject()?.name return self.eventObject()?.clubObject()?.name
} }
//todo //todo
func significantPlayerCount() -> Int { func significantPlayerCount() -> Int {
2 return 2
} }
func inadequatePlayers(in players: [PlayerRegistration]) -> [PlayerRegistration] { func inadequatePlayers(in players: [PlayerRegistration]) -> [PlayerRegistration] {
@ -911,7 +928,7 @@ class Tournament : ModelObject, Storable {
} }
func playersWithoutValidLicense(in players: [PlayerRegistration]) -> [PlayerRegistration] { func playersWithoutValidLicense(in players: [PlayerRegistration]) -> [PlayerRegistration] {
let licenseYearValidity = licenseYearValidity() let licenseYearValidity = self.licenseYearValidity()
return players.filter({ return players.filter({
($0.isImported() && $0.isValidLicenseNumber(year: licenseYearValidity) == false) || ($0.isImported() == false && ($0.licenceId == nil || $0.formattedLicense().isLicenseNumber == false || $0.licenceId?.isEmpty == true)) ($0.isImported() && $0.isValidLicenseNumber(year: licenseYearValidity) == false) || ($0.isImported() == false && ($0.licenceId == nil || $0.formattedLicense().isLicenseNumber == false || $0.licenceId?.isEmpty == true))
}) })
@ -1060,7 +1077,7 @@ class Tournament : ModelObject, Storable {
ids.insert(finalist) ids.insert(finalist)
} }
let others : [Round] = rounds.flatMap { round in let others: [Round] = rounds.flatMap { round in
round.loserRoundsAndChildren().filter { $0.isRankDisabled() == false && $0.hasNextRound() == false } round.loserRoundsAndChildren().filter { $0.isRankDisabled() == false && $0.hasNextRound() == false }
}.compactMap({ $0 }) }.compactMap({ $0 })
@ -1101,7 +1118,6 @@ class Tournament : ModelObject, Storable {
} }
} }
return teams return teams
} }
@ -1244,13 +1260,14 @@ class Tournament : ModelObject, Storable {
//return qualifiedTeams().count == qualifiedFromGroupStage() + groupStageAdditionalQualified //return qualifiedTeams().count == qualifiedFromGroupStage() + groupStageAdditionalQualified
} }
func paymentMethodMessage() -> String? { fileprivate func _paymentMethodMessage() -> String? {
return DataStore.shared.user.summonsAvailablePaymentMethods ?? ContactType.defaultAvailablePaymentMethods return DataStore.shared.user.summonsAvailablePaymentMethods ?? ContactType.defaultAvailablePaymentMethods
} }
var entryFeeMessage: String { var entryFeeMessage: String {
if let entryFee { if let entryFee {
return ["Inscription: " + entryFee.formatted(.currency(code: "EUR")) + " par joueur.", paymentMethodMessage()].compactMap { $0 }.joined(separator: "\n") let message: String = "Inscription: \(entryFee.formatted(.currency(code: "EUR"))) par joueur."
return [message, self._paymentMethodMessage()].compactMap { $0 }.joined(separator: "\n")
} else { } else {
return "Inscription: gratuite." return "Inscription: gratuite."
} }
@ -1551,7 +1568,8 @@ class Tournament : ModelObject, Storable {
} }
func addTeam(_ players: Set<PlayerRegistration>, registrationDate: Date? = nil, name: String? = nil) -> TeamRegistration { func addTeam(_ players: Set<PlayerRegistration>, registrationDate: Date? = nil, name: String? = nil) -> TeamRegistration {
let team = TeamRegistration(tournament: id, registrationDate: registrationDate ?? Date(), name: name) let date: Date = registrationDate ?? Date()
let team = TeamRegistration(tournament: id, registrationDate: date, name: name)
team.setWeight(from: Array(players), inTournamentCategory: tournamentCategory) team.setWeight(from: Array(players), inTournamentCategory: tournamentCategory)
players.forEach { player in players.forEach { player in
player.teamRegistration = team.id player.teamRegistration = team.id
@ -1686,7 +1704,8 @@ class Tournament : ModelObject, Storable {
private let _currentSelectionSorting : [MySortDescriptor<TeamRegistration>] = [.keyPath(\.weight), .keyPath(\.registrationDate!)] private let _currentSelectionSorting : [MySortDescriptor<TeamRegistration>] = [.keyPath(\.weight), .keyPath(\.registrationDate!)]
private func _matchSchedulers() -> [MatchScheduler] { private func _matchSchedulers() -> [MatchScheduler] {
return Store.main.filter(isIncluded: { $0.tournament == self.id }) return DataStore.shared.matchSchedulers.filter { $0.tournament == self.id }
// DataStore.shared.matchSchedulers.filter(isIncluded: { $0.tournament == self.id })
} }
func matchScheduler() -> MatchScheduler? { func matchScheduler() -> MatchScheduler? {

@ -30,8 +30,8 @@ enum ContactType: Identifiable {
} }
extension ContactType { extension ContactType {
static let defaultCustomMessage = "Il est conseillé de vous présenter 10 minutes avant de jouer.\nMerci de me confirmer votre présence avec votre nom et de prévenir votre partenaire." static let defaultCustomMessage: String = "Il est conseillé de vous présenter 10 minutes avant de jouer.\nMerci de me confirmer votre présence avec votre nom et de prévenir votre partenaire."
static let defaultAvailablePaymentMethods = "Règlement possible par chèque ou espèces." static let defaultAvailablePaymentMethods: String = "Règlement possible par chèque ou espèces."
static func callingCustomMessage(source: String? = nil, tournament: Tournament?, startDate: Date?, roundLabel: String) -> String { static func callingCustomMessage(source: String? = nil, tournament: Tournament?, startDate: Date?, roundLabel: String) -> String {
let tournamentCustomMessage = source ?? DataStore.shared.user.summonsMessageBody ?? defaultCustomMessage let tournamentCustomMessage = source ?? DataStore.shared.user.summonsMessageBody ?? defaultCustomMessage

@ -21,21 +21,24 @@ struct RoundView: View {
@State private var availableSeedGroup: SeedInterval? @State private var availableSeedGroup: SeedInterval?
@State private var showPrintScreen: Bool = false @State private var showPrintScreen: Bool = false
var round: Round
private func _getAvailableSeedGroup() async { private func _getAvailableSeedGroup() async {
availableSeedGroup = tournament.seedGroupAvailable(atRoundIndex: round.index) availableSeedGroup = tournament.seedGroupAvailable(atRoundIndex: round.index)
} }
private func _getSpaceLeft() async { private func _getSpaceLeft() async {
spaceLeft.removeAll() self.spaceLeft.removeAll()
seedSpaceLeft.removeAll() self.seedSpaceLeft.removeAll()
round.displayableMatches().forEach({ let displayableMatches: [Match] = self.round.displayableMatches()
let count = $0.teamScores.count displayableMatches.forEach { match in
let count: Int = match.teamScores.count
if count == 0 { if count == 0 {
seedSpaceLeft.append($0) seedSpaceLeft.append(match)
} else if count == 1 { } else if count == 1 {
spaceLeft.append($0) spaceLeft.append(match)
}
} }
})
} }
var showVisualDrawView: Binding<Bool> { Binding( var showVisualDrawView: Binding<Bool> { Binding(
@ -47,8 +50,6 @@ struct RoundView: View {
} }
)} )}
var round: Round
var body: some View { var body: some View {
List { List {
let displayableMatches = round.displayableMatches().sorted(by: \.index) let displayableMatches = round.displayableMatches().sorted(by: \.index)

@ -151,7 +151,8 @@ struct UserCreationFormView: View {
} }
do { do {
let userCreationForm = UserCreationForm( let country: String = self.countries[self.selectedCountryIndex]
let userCreationForm: UserCreationForm = UserCreationForm(
user: DataStore.shared.user, // local user user: DataStore.shared.user, // local user
username: self.username, username: self.username,
password: self.password1, password: self.password1,
@ -159,9 +160,9 @@ struct UserCreationFormView: View {
lastName: self.lastName, lastName: self.lastName,
email: self.email, email: self.email,
phone: self.phone, phone: self.phone,
country: self.countries[self.selectedCountryIndex]) country: country)
let service = try Store.main.service() let service: Services = try Store.main.service()
let _: User = try await service.createAccount(user: userCreationForm) let _: User = try await service.createAccount(user: userCreationForm)
DispatchQueue.main.async { DispatchQueue.main.async {

Loading…
Cancel
Save