From 4842ad45729601a65678c04fa61b8ce35f8fc73d Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Thu, 16 Oct 2025 09:19:39 +0200 Subject: [PATCH] improve export data capability for teams / players --- PadelClubData/Data/PlayerRegistration.swift | 33 +++++++++++++++++---- PadelClubData/Data/TeamRegistration.swift | 27 ++++++++++++----- PadelClubData/Data/Tournament.swift | 13 ++++++-- PadelClubData/Utils/ExportFormat.swift | 20 +++++++++++++ 4 files changed, 76 insertions(+), 17 deletions(-) diff --git a/PadelClubData/Data/PlayerRegistration.swift b/PadelClubData/Data/PlayerRegistration.swift index 9d4511f..4f9bd7d 100644 --- a/PadelClubData/Data/PlayerRegistration.swift +++ b/PadelClubData/Data/PlayerRegistration.swift @@ -56,12 +56,23 @@ final public class PlayerRegistration: BasePlayerRegistration, SideStorable { return nil } - public func pasteData(_ exportFormat: ExportFormat = .rawText) -> String { - switch exportFormat { - case .rawText: - return [firstName.capitalized, lastName.capitalized, licenceId?.computedLicense].compactMap({ $0 }).joined(separator: exportFormat.separator()) - case .csv: - return [lastName.uppercased() + " " + firstName.capitalized].joined(separator: exportFormat.separator()) + public func pasteData(_ exportFormat: ExportFormat = .rawText, type: ExportType) -> String { + switch type { + case .payment: + switch exportFormat { + case .rawText: + return [firstName.capitalized, lastName.capitalized, hasPaidOnline() ? "Payé [X]" : "Payé  [ ]"].compactMap({ $0 }).joined(separator: exportFormat.separator()) + case .csv: + return [lastName.uppercased() + " " + firstName.capitalized].joined(separator: exportFormat.separator()) + } + case .sharing: + switch exportFormat { + case .rawText: + return [firstName.capitalized, lastName.capitalized, licenceId?.computedLicense].compactMap({ $0 }).joined(separator: exportFormat.separator()) + case .csv: + return [lastName.uppercased() + " " + firstName.capitalized, hasPaid() ? "Payé" : "", hasPaidOnline() ? "En ligne" : ""] + .joined(separator: exportFormat.separator()) + } } } @@ -212,6 +223,16 @@ final public class PlayerRegistration: BasePlayerRegistration, SideStorable { registrationStatus = .confirmed } + public func hasMail() -> Bool { + var mails = [email, contactEmail].compactMap({ $0 }) + return mails.isEmpty == false && mails.anySatisfy({ $0.isValidEmail() }) + } + + public func hasMobilePhone() -> Bool { + var phones = [phoneNumber, contactPhoneNumber].compactMap({ $0 }) + return phones.isEmpty == false && phones.anySatisfy({ $0.isPhoneNumber() }) + } + public func paidAmount(_ tournament: Tournament, accountForGiftOrForfeit: Bool = false) -> Double { if accountForGiftOrForfeit == false, paymentType == .gift { return 0.0 diff --git a/PadelClubData/Data/TeamRegistration.swift b/PadelClubData/Data/TeamRegistration.swift index 50d0890..9cd28e2 100644 --- a/PadelClubData/Data/TeamRegistration.swift +++ b/PadelClubData/Data/TeamRegistration.swift @@ -378,14 +378,20 @@ final public class TeamRegistration: BaseTeamRegistration, SideStorable { resetBracketPosition() } - public func pasteData(_ exportFormat: ExportFormat = .rawText, _ index: Int = 0) -> String { + public func pasteData(_ exportFormat: ExportFormat = .rawText, type: ExportType, _ index: Int = 0) -> String { switch exportFormat { case .rawText: - return [playersPasteData(exportFormat), formattedInscriptionDate(exportFormat), name] - .compactMap({ $0 }).joined(separator: exportFormat.newLineSeparator()) + switch type { + case .sharing: + return [playersPasteData(exportFormat, type: type), formattedInscriptionDate(exportFormat), name] + .compactMap({ $0 }).joined(separator: exportFormat.newLineSeparator()) + case .payment: + return [playersPasteData(exportFormat, type: type), name] + .compactMap({ $0 }).joined(separator: exportFormat.newLineSeparator()) + } case .csv: return [ - index.formatted(), playersPasteData(exportFormat), + index.formatted(), playersPasteData(exportFormat, type: type), isWildCard() ? "WC" : weight.formatted(), ].joined(separator: exportFormat.separator()) } @@ -435,15 +441,20 @@ final public class TeamRegistration: BaseTeamRegistration, SideStorable { } } - public func playersPasteData(_ exportFormat: ExportFormat = .rawText) -> String { + public func playersPasteData(_ exportFormat: ExportFormat = .rawText, type: ExportType) -> String { switch exportFormat { case .rawText: - return players().map { $0.pasteData(exportFormat) }.joined( + return players().map { $0.pasteData(exportFormat, type: type) }.joined( separator: exportFormat.newLineSeparator()) case .csv: return players().map { - [$0.pasteData(exportFormat), isWildCard() ? "WC" : $0.computedRank.formatted()] - .joined(separator: exportFormat.separator()) + switch type { + case .sharing: + [$0.pasteData(exportFormat, type: type), isWildCard() ? "WC" : $0.computedRank.formatted()] + .joined(separator: exportFormat.separator()) + case .payment: + $0.pasteData(exportFormat, type: type) + } }.joined(separator: exportFormat.separator()) } } diff --git a/PadelClubData/Data/Tournament.swift b/PadelClubData/Data/Tournament.swift index eab1575..f421757 100644 --- a/PadelClubData/Data/Tournament.swift +++ b/PadelClubData/Data/Tournament.swift @@ -271,17 +271,24 @@ defer { return Store.main.findById(event) } - public func pasteDataForImporting(_ exportFormat: ExportFormat = .rawText) -> String { + public func pasteDataForImporting(_ exportFormat: ExportFormat = .rawText, type: ExportType) -> String { let _selectedSortedTeams = selectedSortedTeams() let selectedSortedTeams = _selectedSortedTeams + waitingListSortedTeams(selectedSortedTeams: _selectedSortedTeams) switch exportFormat { case .rawText: - return (selectedSortedTeams.compactMap { $0.pasteData(exportFormat) } + ["Liste d'attente"] + waitingListTeams(in: selectedSortedTeams, includingWalkOuts: true).compactMap { $0.pasteData(exportFormat) }).joined(separator: exportFormat.newLineSeparator(2)) + let waitingList = waitingListTeams(in: selectedSortedTeams, includingWalkOuts: true) + var stats = [String]() + if type == .payment, isAnimation(), minimumPlayerPerTeam == 1 { + stats += ["\(self.selectedPlayers().count.formatted()) personnes"] + } else { + stats += [selectedSortedTeams.count.formatted() + " équipes"] + } + return (stats + selectedSortedTeams.compactMap { $0.pasteData(exportFormat, type: type) } + (waitingList.isEmpty == false ? ["Liste d'attente"] : []) + waitingList.compactMap { $0.pasteData(exportFormat, type: type) }).joined(separator: exportFormat.newLineSeparator(1)) case .csv: let headers = ["N°", "Nom Prénom", "rang", "Nom Prénom", "rang", "poids", "Paire"].joined(separator: exportFormat.separator()) var teamPaste = [headers] for (index, team) in selectedSortedTeams.enumerated() { - var teamData = team.pasteData(exportFormat, index + 1) + var teamData = team.pasteData(exportFormat, type: type, index + 1) teamData.append(exportFormat.separator()) teamData.append(team.teamLastNames().joined(separator: " / ")) teamPaste.append(teamData) diff --git a/PadelClubData/Utils/ExportFormat.swift b/PadelClubData/Utils/ExportFormat.swift index bea2a1d..c4f8990 100644 --- a/PadelClubData/Utils/ExportFormat.swift +++ b/PadelClubData/Utils/ExportFormat.swift @@ -35,3 +35,23 @@ public enum ExportFormat: Int, Identifiable, CaseIterable { return Array(repeating: "\n", count: count).joined() } } + +public enum ExportType: Int, Identifiable, CaseIterable { + public var id: Int { self.rawValue } + + case sharing + case payment + + public func localizedString() -> String { + switch self { + case .sharing: + return "inscriptions" + case .payment: + return "pointage" + } + } + + public func newLineSeparator(_ count: Int = 1) -> String { + return Array(repeating: "\n", count: count).joined() + } +}