diff --git a/PadelClub/Data/PlayerRegistration.swift b/PadelClub/Data/PlayerRegistration.swift index adcadf8..61508b6 100644 --- a/PadelClub/Data/PlayerRegistration.swift +++ b/PadelClub/Data/PlayerRegistration.swift @@ -43,7 +43,7 @@ final class PlayerRegistration: ModelObject, Storable { var clubCode: String? var sourceName: String? - var isNVEQ: Bool = false + var isNveq: Bool = false func localizedSourceLabel() -> String { switch source { @@ -183,7 +183,7 @@ final class PlayerRegistration: ModelObject, Storable { isVerified(), "=\"" + formattedLicense() + "\"", "\(computedRank)", - isNVEQ ? "NVEQ" : "EQ", + isNveq ? "NVEQ" : "EQ", ] .joined(separator: exportFormat.separator()) return values @@ -231,7 +231,15 @@ final class PlayerRegistration: ModelObject, Storable { } func isLicenceOK() -> Bool { - licenceId?.trimmed.strippedLicense != nil + guard let licenceId else { return false } + let licenceIdTrimmed = licenceId.trimmed + guard licenceIdTrimmed.strippedLicense != nil else { return false } + + if licenceIdTrimmed.hasLicenseKey() { + return licenceIdTrimmed.isLicenseNumber + } else { + return true + } } func isNameOK() -> Bool { @@ -452,7 +460,7 @@ final class PlayerRegistration: ModelObject, Storable { case _captain = "captain" case _clubCode = "clubCode" case _sourceName = "sourceName" - case _isNVEQ = "isNVEQ" + case _isNveq = "isNveq" } init(from decoder: Decoder) throws { @@ -483,7 +491,7 @@ final class PlayerRegistration: ModelObject, Storable { birthdate = try container.decodeIfPresent(String.self, forKey: ._birthdate) source = try container.decodeIfPresent(PlayerDataSource.self, forKey: ._source) clubCode = try container.decodeIfPresent(String.self, forKey: ._clubCode) - isNVEQ = try container.decodeIfPresent(Bool.self, forKey: ._isNVEQ) ?? false + isNveq = try container.decodeIfPresent(Bool.self, forKey: ._isNveq) ?? false sourceName = try container.decodeIfPresent(String.self, forKey: ._sourceName) } @@ -514,7 +522,7 @@ final class PlayerRegistration: ModelObject, Storable { try container.encode(coach, forKey: ._coach) try container.encode(clubCode, forKey: ._clubCode) try container.encode(sourceName, forKey: ._sourceName) - try container.encode(isNVEQ, forKey: ._isNVEQ) + try container.encode(isNveq, forKey: ._isNveq) } enum PlayerDataSource: Int, Codable { diff --git a/PadelClub/Data/TeamRegistration.swift b/PadelClub/Data/TeamRegistration.swift index 070ccf0..63503cd 100644 --- a/PadelClub/Data/TeamRegistration.swift +++ b/PadelClub/Data/TeamRegistration.swift @@ -449,7 +449,7 @@ final class TeamRegistration: ModelObject, Storable { let players = players() -// if teamIndex <= 16, players.filter({ $0.isNVEQ }).count > 2 { +// if teamIndex <= 16, players.filter({ $0.isNveq }).count > 2 { // alerts.append(.tooManyNVEQ(self)) // // } @@ -480,7 +480,7 @@ final class TeamRegistration: ModelObject, Storable { } func nveqCountFormatted() -> String { - players().filter({ $0.isNVEQ }).count.formatted() + players().filter({ $0.isNveq }).count.formatted() } func playerCountFormatted() -> String { diff --git a/PadelClub/Extensions/String+Extensions.swift b/PadelClub/Extensions/String+Extensions.swift index 00c03b7..28c2bc8 100644 --- a/PadelClub/Extensions/String+Extensions.swift +++ b/PadelClub/Extensions/String+Extensions.swift @@ -124,6 +124,15 @@ extension String { return false } + func hasLicenseKey() -> Bool { + if let match = self.firstMatch(of: /[0-9]{6,8}[A-Z]/) { + return true + } else { + return false + } + } + + var licenseKey: String? { if let intValue = Int(self) { var value = intValue diff --git a/PadelClub/Utils/FileImportManager.swift b/PadelClub/Utils/FileImportManager.swift index ee971ab..3b5712e 100644 --- a/PadelClub/Utils/FileImportManager.swift +++ b/PadelClub/Utils/FileImportManager.swift @@ -483,7 +483,7 @@ class FileImportManager { let player = PlayerRegistration(importedPlayer: found) player.setComputedRank(in: tournament) player.sourceName = lastName - player.isNVEQ = status == "NVEQ" + player.isNveq = status == "NVEQ" player.clubCode = found.clubCode if isVerified { player.source = .frenchFederationVerified @@ -492,7 +492,7 @@ class FileImportManager { } else { let player = PlayerRegistration(firstName: firstName, lastName: lastName, licenceId: licenceId, rank: rank, sex: sex, clubName: club, phoneNumber: phoneNumber, email: email) player.sourceName = lastName - player.isNVEQ = status == "NVEQ" + player.isNveq = status == "NVEQ" if isVerified { player.source = .frenchFederationVerified } @@ -793,7 +793,7 @@ enum ChampionshipAlert: LocalizedError { extension PlayerRegistration { func errorDescription(championshipAlert: ChampionshipAlert) -> String? { - var message = lastName + " -> " + var message = self.playerLabel() + " - " + self.formattedLicense() + " -> " switch championshipAlert { case .clubCodeInvalid, .tooManyNVEQ, .tooManyPlayers: return nil @@ -807,7 +807,7 @@ extension PlayerRegistration { } case .playerLicenseInvalid: if let licenceId { - message += "LICENCE NOK : " + licenceId + message += "LICENSE MISSTYPE" } else { message += "aucune licence" } diff --git a/PadelClub/Views/Navigation/Umpire/PadelClubView.swift b/PadelClub/Views/Navigation/Umpire/PadelClubView.swift index cb84323..40d0195 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=0DB857387EF49025B1A0559774FFFEBA; datadome=yp6ACsLMYiE4WEK2rf31mwP2xtk5EPcVjEKEhjO0qslv89_AOhlUVrMbokM~Rsp3Nfr_KxchUoLdRJvWScouGa8VzSixfwTLigI29EvJ8LbSj1OGmYgaO4kSW0WZU5YD; AWSALB=HQBL6o2O7dDDLA/e/Qt7dWBxG0X7qrzHFNZ6kFgjO18BsOFcLd4m77EbVc8u7jmKH3qdhV3TmsARJpWNWNt3ZzL1kg+tDeKoyFkWKFbqsmFykZEuoQXxI5y+Gswp; AWSALBCORS=HQBL6o2O7dDDLA/e/Qt7dWBxG0X7qrzHFNZ6kFgjO18BsOFcLd4m77EbVc8u7jmKH3qdhV3TmsARJpWNWNt3ZzL1kg+tDeKoyFkWKFbqsmFykZEuoQXxI5y+Gswp; xtan=-; xtant=1; tc_cj_v2=%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQMMORPMMMQNNZZZ%5D777m_iZZZ%22**%22%27%20ZZZKQMMQMPMPMKOPZZZ%5D; tc_cj_v2_cmp=; tc_cj_v2_med=; 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=38707D1E3B920F1EF299827B0DAA7482; AWSALB=0KnoZyXR3dBQyIFtnwMkKwq2fqe4raRSsuD5cz/b0tR2DBXsQ5joyZ5jce0hgr0ZzWH/HJbhUC1L6VS+QbQipIVq7UJllGPpxd7OLjdXcfobfOjsVtpowVa/mHTo; AWSALBCORS=0KnoZyXR3dBQyIFtnwMkKwq2fqe4raRSsuD5cz/b0tR2DBXsQ5joyZ5jce0hgr0ZzWH/HJbhUC1L6VS+QbQipIVq7UJllGPpxd7OLjdXcfobfOjsVtpowVa/mHTo; datadome=4uk4nr8fscpV3E1JEKoO_xAZiFP2Mvb7EJojErst8cZ6MQ0C~0CwqDK8N2h8fFHvysKIsI70rHScAPsn5ZEJXXjSFwi8iPpGu26RbQ6h4dD2IHOI~1CXhx9Ac8oqGziX; xtan=-; xtant=1; tc_cj_v2=%5Ecl_%5Dny%5B%5D%5D_mmZZZZZZKQMMORPMMMQNNZZZ%5D777m_iZZZ%22**%22%27%20ZZZKQMMQMPMPMKOPZZZ%5D; tc_cj_v2_cmp=; tc_cj_v2_med=; 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") 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 e06335b..e453218 100644 --- a/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift +++ b/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift @@ -867,7 +867,7 @@ struct InscriptionManagerView: View { Button("Récupérer les non-classés") { Task { - for player in tournament.players().filter({ $0.isUnranked() }) { + for player in tournament.players().filter({ $0.isUnranked() && $0.source == nil }) { do { if let playerData = try await player.fetchUnrankPlayerData() { player.lastName = playerData.nom