From 7a2cf4edeace3fbe11baadb9c073f8dde94b0866 Mon Sep 17 00:00:00 2001 From: Raz Date: Wed, 8 Jan 2025 08:51:10 +0100 Subject: [PATCH] wip --- PadelClub/Data/PlayerRegistration.swift | 23 +++++++++--- PadelClub/Data/TeamRegistration.swift | 36 +++++++++---------- PadelClub/Data/Tournament.swift | 16 +++++++-- PadelClub/Utils/FileImportManager.swift | 13 ++++--- .../Navigation/Umpire/PadelClubView.swift | 2 +- .../Screen/InscriptionManagerView.swift | 9 +++++ 6 files changed, 69 insertions(+), 30 deletions(-) diff --git a/PadelClub/Data/PlayerRegistration.swift b/PadelClub/Data/PlayerRegistration.swift index 61508b6..6d7eb81 100644 --- a/PadelClub/Data/PlayerRegistration.swift +++ b/PadelClub/Data/PlayerRegistration.swift @@ -194,8 +194,25 @@ final class PlayerRegistration: ModelObject, Storable { source == .frenchFederationVerified ? "ok" : "" } - func championshipAlerts(tournament: Tournament) -> [ChampionshipAlert] { + var duplicatePlayers: Int? + + func championshipAlerts(tournament: Tournament, allPlayers: [(String, String)]) -> [ChampionshipAlert] { var alerts = [ChampionshipAlert]() + + if duplicatePlayers == nil { + let teamClubCode = self.team()?.clubCode + let strippedLicense = self.licenceId?.strippedLicense + duplicatePlayers = allPlayers.count(where: { strippedLicense == $0.0 && teamClubCode != $0.1 }) + } + + if let duplicatePlayers { + if duplicatePlayers > 0 { + print("doublon found \(duplicatePlayers)") + alerts.append(.duplicate(duplicatePlayers, self)) + } + } + + if isUnranked() && source == nil { alerts.append(.unranked(self)) } else if source != .frenchFederationVerified { @@ -222,10 +239,6 @@ final class PlayerRegistration: ModelObject, Storable { return alerts } - func alertCount() -> Int { - return championshipAlerts(tournament: tournament()!).count - } - func isClubCodeOK() -> Bool { team()?.clubCode?.trimmed.canonicalVersion == clubCode?.trimmed.canonicalVersion } diff --git a/PadelClub/Data/TeamRegistration.swift b/PadelClub/Data/TeamRegistration.swift index 63503cd..f0e981e 100644 --- a/PadelClub/Data/TeamRegistration.swift +++ b/PadelClub/Data/TeamRegistration.swift @@ -379,7 +379,7 @@ final class TeamRegistration: ModelObject, Storable { resetBracketPosition() } - func pasteData(_ exportFormat: ExportFormat = .rawText, _ index: Int = 0) -> String { + func pasteData(_ exportFormat: ExportFormat = .rawText, _ index: Int = 0, allPlayers: [(String, String)] = []) -> String { switch exportFormat { case .rawText: return [playersPasteData(exportFormat), formattedInscriptionDate(exportFormat), name].compactMap({ $0 }).joined(separator: exportFormat.newLineSeparator()) @@ -388,8 +388,8 @@ final class TeamRegistration: ModelObject, Storable { case .championship: var baseValue: [String] = [ formattedInscriptionDate(exportFormat) ?? "", - alertCountFormatted(teamIndex: index), - alertDescription(teamIndex: index), + alertCountFormatted(teamIndex: index, allPlayers: allPlayers), + alertDescription(teamIndex: index, allPlayers: allPlayers), teamWeightFormatted(), jokerWeightFormatted(), playerCountFormatted(), @@ -435,13 +435,13 @@ final class TeamRegistration: ModelObject, Storable { players().filter({ $0.isUnranked() && $0.source == nil }).count.formatted() } - func alertDescription(teamIndex: Int) -> String { - let multiLineString = championshipAlerts(teamIndex: teamIndex, tournament: tournamentObject()!).compactMap({ $0.errorDescription }).joined(separator: "\n") + func alertDescription(teamIndex: Int, allPlayers: [(String, String)]) -> String { + let multiLineString = championshipAlerts(teamIndex: teamIndex, tournament: tournamentObject()!, allPlayers: allPlayers).compactMap({ $0.errorDescription }).joined(separator: "\n") let escapedString = "\"\(multiLineString.replacingOccurrences(of: "\"", with: "\"\""))\"" return escapedString } - func championshipAlerts(teamIndex: Int, tournament: Tournament) -> [ChampionshipAlert] { + func championshipAlerts(teamIndex: Int, tournament: Tournament, allPlayers: [(String, String)]) -> [ChampionshipAlert] { var alerts = [ChampionshipAlert]() if clubCode?.isValidCodeClub(62) == false { alerts.append(.clubCodeInvalid(self)) @@ -449,18 +449,18 @@ final class TeamRegistration: ModelObject, Storable { let players = players() -// if teamIndex <= 16, players.filter({ $0.isNveq }).count > 2 { -// alerts.append(.tooManyNVEQ(self)) -// -// } -// -// if teamIndex <= 16, players.count > 8 { -// alerts.append(.tooManyPlayers(self)) -// -// } + if teamIndex <= 16, players.filter({ $0.isNveq }).count > 2 { + alerts.append(.tooManyNVEQ(self)) + + } + + if teamIndex <= 16, players.count > 8 { + alerts.append(.tooManyPlayers(self)) + + } players.forEach { pr in - alerts.append(contentsOf: pr.championshipAlerts(tournament: tournament)) + alerts.append(contentsOf: pr.championshipAlerts(tournament: tournament, allPlayers: allPlayers)) } return alerts @@ -474,8 +474,8 @@ final class TeamRegistration: ModelObject, Storable { } } - func alertCountFormatted(teamIndex: Int) -> String { - let championshipAlertsCount = championshipAlerts(teamIndex: teamIndex, tournament: tournamentObject()!).count + func alertCountFormatted(teamIndex: Int, allPlayers: [(String, String)]) -> String { + let championshipAlertsCount = championshipAlerts(teamIndex: teamIndex, tournament: tournamentObject()!, allPlayers: allPlayers).count return championshipAlertsCount.formatted() } diff --git a/PadelClub/Data/Tournament.swift b/PadelClub/Data/Tournament.swift index 6aa56e1..ba4cafd 100644 --- a/PadelClub/Data/Tournament.swift +++ b/PadelClub/Data/Tournament.swift @@ -690,14 +690,26 @@ defer { "JOUEUR 10 - Ranking", "JOUEUR 10 - Statut", ].joined(separator: exportFormat.separator()) - var teamPaste = [headers] + var teamPaste = [headers] + let allLicenseIds = allLicenseIds() for (index, team) in selectedSortedTeams.enumerated() { - teamPaste.append(team.pasteData(exportFormat, index + 1)) + print("pasting team index \(index)") + teamPaste.append(team.pasteData(exportFormat, index + 1, allPlayers: allLicenseIds)) } return teamPaste.joined(separator: exportFormat.newLineSeparator()) } } + func allLicenseIds() -> [(String, String)] { + players().compactMap({ + if let id = $0.licenceId?.strippedLicense, let clubCode = $0.team()?.clubCode { + return (id, clubCode) + } else { + return nil + } + }) + } + func club() -> Club? { return eventObject()?.clubObject() } diff --git a/PadelClub/Utils/FileImportManager.swift b/PadelClub/Utils/FileImportManager.swift index debd398..04a3cdd 100644 --- a/PadelClub/Utils/FileImportManager.swift +++ b/PadelClub/Utils/FileImportManager.swift @@ -777,18 +777,21 @@ enum ChampionshipAlert: LocalizedError { case unranked(PlayerRegistration) case playerAgeInvalid(PlayerRegistration) case playerSexInvalid(PlayerRegistration) - + case duplicate(Int, PlayerRegistration) + var errorDescription: String? { switch self { + case .duplicate(_, let playerRegistration): + return playerRegistration.errorDescription(championshipAlert: self) case .clubCodeInvalid(let teamRegistration): if let clubCode = teamRegistration.clubCode { return "CODE NOK : \(clubCode)" } else { return "aucun code club" } - case .tooManyNVEQ(let teamRegistration): + case .tooManyNVEQ: return "TOO MANY NVEQ" - case .tooManyPlayers(let teamRegistration): + case .tooManyPlayers: return "TOO MANY PLAYERS" case .playerClubInvalid(let playerRegistration): return playerRegistration.errorDescription(championshipAlert: self) @@ -810,6 +813,8 @@ extension PlayerRegistration { func errorDescription(championshipAlert: ChampionshipAlert) -> String? { var message = self.playerLabel() + " - " + self.formattedLicense() + " -> " switch championshipAlert { + case .duplicate(let count, _): + message += "DOUBLON : " + count.formatted() case .clubCodeInvalid, .tooManyNVEQ, .tooManyPlayers: return nil case .unranked: @@ -821,7 +826,7 @@ extension PlayerRegistration { message += "aucun club" } case .playerLicenseInvalid: - if let licenceId { + if licenceId != nil { message += "LICENSE MISSTYPE" } else { message += "aucune licence" diff --git a/PadelClub/Views/Navigation/Umpire/PadelClubView.swift b/PadelClub/Views/Navigation/Umpire/PadelClubView.swift index 49cfb35..341c928 100644 --- a/PadelClub/Views/Navigation/Umpire/PadelClubView.swift +++ b/PadelClub/Views/Navigation/Umpire/PadelClubView.swift @@ -269,7 +269,7 @@ func fetchPlayerData(for licenseID: String) async throws -> [Player]? { request.setValue("XMLHttpRequest", forHTTPHeaderField: "X-Requested-With") // Add cookies if needed (example cookie header value shown, replace with valid cookies) - request.setValue("JSESSIONID=3F3FA6B65006ECB82BDE13DC967F9A69; AWSALB=02TQyp76WCX9Mb3T9gn2jXRsiW87dAa7BVK+2QrO1PBeZoMqRSRkLP57oIUBb8ZXX+1/V2SbQxS7DccXJ7ltAM0uH2QJJ6ozkHAoLHGhoIwenc45xGb8xhl7NQnM; AWSALBCORS=02TQyp76WCX9Mb3T9gn2jXRsiW87dAa7BVK+2QrO1PBeZoMqRSRkLP57oIUBb8ZXX+1/V2SbQxS7DccXJ7ltAM0uH2QJJ6ozkHAoLHGhoIwenc45xGb8xhl7NQnM; tc_cj_v2=%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQMMORPMMMQNNZZZ%5D777m_iZZZ%22**%22%27%20ZZZKQMMQMPMPMKOPZZZ%5D777%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQMONRLNRJRKPZZZ%5D; tc_cj_v2_cmp=; tc_cj_v2_med=; datadome=IqayPD8CsX1wdn7WEztZm0WkmQI5kUoY7BoHwRUdn0yoaKCy9io9E2EWvwVCCpYjMQKcJP9fjl_8QbqneO91bMACS89SQS5pG8u42ZPKuZO9FQTVq95INQBXJREO3Ksm; xtan=-; xtant=1; TCSESSION=12412015254641319805; incap_ses_1176_2712217=vdDULxWxfWqmwMCR8/1REL1bcWcAAAAApBZ9vm58pHhX5W6KOdLwAA==; nlbi_2712217=sIdMLO/23jYzlS3Ib9lUTgAAAAA35MukHyQ4MRuJCVxhdpk9; tCdebugLib=1; _pcid=%7B%22browserId%22%3A%22m42mi4kbtfuyj367%22%2C%22_t%22%3A%22mjr1fm32%7Cm42mi4r2%22%7D; _pctx=%7Bu%7DN4IgrgzgpgThIC4B2YA2qA05owMoBcBDfSREQpAeyRCwgEt8oBJAE0RXSwH18yBbAFYwAjADN%2BAZgCsAH34AWAEz96CmNJABfIA; _pprv=eyJjb25zZW50Ijp7IjAiOnsibW9kZSI6ImVzc2VudGlhbCJ9LCI3Ijp7Im1vZGUiOiJvcHQtaW4ifX0sInB1cnBvc2VzIjpudWxsLCJfdCI6Im1qcjFmbHdofG00Mm1pNGtoIn0%3D; TCID=124122155494907703483; TCPID=124115115191501043230; xtvrn=$548419$; visid_incap_2712217=PSfJngzoSuiowsuXXhvOu5K+7mUAAAAAQUIPAAAAAAAleL9ldvN/FC1VykkU9ret; SessionStatId=10.91.140.42.1662124965429001", forHTTPHeaderField: "Cookie") + request.setValue("JSESSIONID=C27A8C305B9B1A3E8DD70300AFB8980E; AWSALB=qZ18nw7AsrBeo+X8yPL5RPFGerM9nePHqhVS3EasXJ3vRSskWtrVlkSQS7rhugIkndpGm918I4UqvfxpaDJxjgsVwXY6AoC40AfUXdFosITMK9hLbxbLlqm/XK3/; AWSALBCORS=qZ18nw7AsrBeo+X8yPL5RPFGerM9nePHqhVS3EasXJ3vRSskWtrVlkSQS7rhugIkndpGm918I4UqvfxpaDJxjgsVwXY6AoC40AfUXdFosITMK9hLbxbLlqm/XK3/; datadome=phzBnXmnx632ekfRiFl~WQEPoMTPKvFn~OfNIMzjCyv9vbaigh9182wiJhvkRJvddV8EvlHyszjEovY0zYcQ2k45QCdLMPuKlBIVOTh~OWk1HF8EIszhio6USnidWq5Y; tc_cj_v2=%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQMMORPMMMQNNZZZ%5D777m_iZZZ%22**%22%27%20ZZZKQMMQMPMPMKOPZZZ%5D777%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQMPLNJNKJQQJZZZ%5D777m_iZZZ%22**%22%27%20ZZZKQMPLNJNLQOJKZZZ%5D; tc_cj_v2_cmp=; tc_cj_v2_med=; SSESS7ba44afc36c80c3faa2b8fa87e7742c5=EFTV9aCrNCaJM7Soo-1OemOQ0qdJXpp7cqiYrMSoQRQ; incap_ses_188_2712217=bHGnCqoz+kuioZ6sNumbAhntfGcAAAAAyRoEUqalcEb2ssM0ElLpsQ==; TCSESSION=1251114295811051390969; incap_ses_2222_2712217=TZW0OzHRREDHgyiHhyHWHtPae2cAAAAAZtkxEWEK6Umt8kLgVqiHxg==; nlbi_2712217=xjnrKu85cRfbMwOCb9lUTgAAAADQ43pUbl/hRFX1Q8fYrJlG; _pcid=%7B%22browserId%22%3A%22m42mi4kbtfuyj367%22%2C%22_t%22%3A%22mjr1fm32%7Cm42mi4r2%22%7D; _pctx=%7Bu%7DN4IgrgzgpgThIC4B2YA2qA05owMoBcBDfSREQpAeyRCwgEt8oBJAE0RXSwH18yBbAFYwAjADN%2BAZgCsAH34AWAEz96CmNJABfIA; _pprv=eyJjb25zZW50Ijp7IjAiOnsibW9kZSI6ImVzc2VudGlhbCJ9LCI3Ijp7Im1vZGUiOiJvcHQtaW4ifX0sInB1cnBvc2VzIjpudWxsLCJfdCI6Im1qcjFmbHdofG00Mm1pNGtoIn0%3D; xtan=-; xtant=1; TCID=124122155494907703483; TCPID=124115115191501043230; xtvrn=$548419$; visid_incap_2712217=PSfJngzoSuiowsuXXhvOu5K+7mUAAAAAQUIPAAAAAAAleL9ldvN/FC1VykkU9ret; SessionStatId=10.91.140.42.1662124965429001", forHTTPHeaderField: "Cookie") let (data, _) = try await URLSession.shared.data(for: request) let decoder = JSONDecoder() diff --git a/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift b/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift index b385bee..2faf3f0 100644 --- a/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift +++ b/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift @@ -58,6 +58,7 @@ struct InscriptionManagerView: View { @State private var totalUnrankedUnsourced: Double = 0 @State private var selectedSortedTeams: [TeamRegistration] = [] + @State private var shareFile: URL? var tournamentStore: TournamentStore { return self.tournament.tournamentStore @@ -946,6 +947,14 @@ struct InscriptionManagerView: View { tournament.updateWeights() _setHash() } + + Button("Generate file") { + self.shareFile = tournament.pasteDataForImporting(.championship).createFile(self.tournament.tournamentTitle()+"-inscriptions", .championship) + } + + if let shareFile { + ShareLink(item: shareFile) + } } header: { HStack { Spacer()