paca_championship
Raz 10 months ago
parent bd2ba72560
commit 7a2cf4edea
  1. 23
      PadelClub/Data/PlayerRegistration.swift
  2. 36
      PadelClub/Data/TeamRegistration.swift
  3. 16
      PadelClub/Data/Tournament.swift
  4. 13
      PadelClub/Utils/FileImportManager.swift
  5. 2
      PadelClub/Views/Navigation/Umpire/PadelClubView.swift
  6. 9
      PadelClub/Views/Tournament/Screen/InscriptionManagerView.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
}

@ -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()
}

@ -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()
}

@ -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"

@ -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()

@ -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()

Loading…
Cancel
Save