add a call all event method

fix registration issues number
main
Razmig Sarkissian 3 weeks ago
parent 7c3801cb51
commit ceaa03c41f
  1. 2
      PadelClub/Extensions/Tournament+Extensions.swift
  2. 4
      PadelClub/Views/Calling/CallSettingsView.swift
  3. 95
      PadelClub/Views/Calling/SendToAllView.swift
  4. 11
      PadelClub/Views/Cashier/Event/EventSettingsView.swift

@ -205,7 +205,7 @@ extension Tournament {
} }
func registrationIssues(selectedTeams: [TeamRegistration]) async -> Int { func registrationIssues(selectedTeams: [TeamRegistration]) async -> Int {
let players : [PlayerRegistration] = unsortedPlayers() let players : [PlayerRegistration] = selectedTeams.flatMap { $0.players() }
let callDateIssue : [TeamRegistration] = selectedTeams.filter { $0.callDate != nil && isStartDateIsDifferentThanCallDate($0) } let callDateIssue : [TeamRegistration] = selectedTeams.filter { $0.callDate != nil && isStartDateIsDifferentThanCallDate($0) }
let duplicates : [PlayerRegistration] = duplicates(in: players) let duplicates : [PlayerRegistration] = duplicates(in: players)
let problematicPlayers : [PlayerRegistration] = players.filter({ $0.sex == nil }) let problematicPlayers : [PlayerRegistration] = players.filter({ $0.sex == nil })

@ -96,11 +96,11 @@ struct CallSettingsView: View {
//#endif //#endif
} }
.sheet(isPresented: $showSendToAllView) { .sheet(isPresented: $showSendToAllView) {
SendToAllView(addLink: false) SendToAllView(tournament: tournament, addLink: false)
.tint(.master) .tint(.master)
} }
.sheet(isPresented: $addLink) { .sheet(isPresented: $addLink) {
SendToAllView(addLink: true) SendToAllView(tournament: tournament, addLink: true)
.tint(.master) .tint(.master)
} }
} }

@ -14,14 +14,16 @@ struct SendToAllView: View {
@Environment(\.dismiss) var dismiss @Environment(\.dismiss) var dismiss
@EnvironmentObject var dataStore: DataStore @EnvironmentObject var dataStore: DataStore
@Environment(Tournament.self) var tournament: Tournament
@EnvironmentObject var networkMonitor: NetworkMonitor @EnvironmentObject var networkMonitor: NetworkMonitor
@State private var contactType: ContactType? = nil @State private var contactType: ContactType? = nil
@State private var contactMethod: Int = 1 @State private var contactMethod: Int = 1
@State private var contactRecipients: Set<String> = Set() @State private var contactRecipients: Set<String> = Set()
@State private var sentError: ContactManagerError? = nil @State private var sentError: ContactManagerError? = nil
let addLink: Bool var event: Event?
var tournament: Tournament?
var addLink: Bool
// @State var cannotPayForTournament: Bool = false // @State var cannotPayForTournament: Bool = false
@State private var pageLink: PageLink = .matches @State private var pageLink: PageLink = .matches
@State private var includeWaitingList: Bool = false @State private var includeWaitingList: Bool = false
@ -33,8 +35,18 @@ struct SendToAllView: View {
@State var summonParamByMessage: Bool = false @State var summonParamByMessage: Bool = false
@State var summonParamReSummon: Bool = false @State var summonParamReSummon: Bool = false
init(event: Event) {
self.event = event
self.addLink = false
}
init(tournament: Tournament, addLink: Bool) {
self.tournament = tournament
self.addLink = addLink
}
var tournamentStore: TournamentStore? { var tournamentStore: TournamentStore? {
return self.tournament.tournamentStore return self.tournament?.tournamentStore
} }
var messageSentFailed: Binding<Bool> { var messageSentFailed: Binding<Bool> {
@ -60,40 +72,48 @@ struct SendToAllView: View {
.labelsHidden() .labelsHidden()
.pickerStyle(.inline) .pickerStyle(.inline)
} }
if let event {
Section { LabeledContent {
ForEach(tournament.groupStages()) { groupStage in Text(event.selectedTeams().count.formatted())
let teams = groupStage.teams() } label: {
if teams.isEmpty == false { Text("Participants")
LabeledContent { }
Text(teams.count.formatted() + " équipe" + teams.count.pluralSuffix)
} label: { } else if let tournament {
Text(groupStage.groupStageTitle()) Section {
ForEach(tournament.groupStages()) { groupStage in
let teams = groupStage.teams()
if teams.isEmpty == false {
LabeledContent {
Text(teams.count.formatted() + " équipe" + teams.count.pluralSuffix)
} label: {
Text(groupStage.groupStageTitle())
}
.tag(groupStage.id)
} }
.tag(groupStage.id)
} }
} ForEach(tournament.rounds()) { round in
ForEach(tournament.rounds()) { round in let teams = round.teams()
let teams = round.teams() if teams.isEmpty == false {
if teams.isEmpty == false { LabeledContent {
LabeledContent { Text(teams.count.formatted() + " équipe" + teams.count.pluralSuffix)
Text(teams.count.formatted() + " équipe" + teams.count.pluralSuffix) } label: {
} label: { Text(round.roundTitle())
Text(round.roundTitle()) }
.tag(round.id)
} }
.tag(round.id)
} }
Toggle("Inclure la liste d'attente", isOn: $includeWaitingList)
if includeWaitingList {
Toggle("Seulement la liste d'attente", isOn: $onlyWaitingList)
}
} footer: {
Text("Si vous ne souhaitez pas contacter toutes les équipes, choisissez un ou plusieurs groupes d'équipes manuellement.")
} }
Toggle("Inclure la liste d'attente", isOn: $includeWaitingList)
if includeWaitingList {
Toggle("Seulement la liste d'attente", isOn: $onlyWaitingList)
}
} footer: {
Text("Si vous ne souhaitez pas contacter toutes les équipes, choisissez un ou plusieurs groupes d'équipes manuellement.")
} }
if addLink { if addLink, event == nil {
Section { Section {
let links : [PageLink] = [.teams, .summons, .groupStages, .matches, .rankings] let links : [PageLink] = [.teams, .summons, .groupStages, .matches, .rankings]
Picker(selection: $pageLink) { Picker(selection: $pageLink) {
@ -135,7 +155,7 @@ struct SendToAllView: View {
Button("OK") { Button("OK") {
} }
if case .uncalledTeams(let uncalledTeams) = sentError { if case .uncalledTeams(let uncalledTeams) = sentError, let tournament {
NavigationLink("Voir les équipes non contactées") { NavigationLink("Voir les équipes non contactées") {
TeamsCallingView(teams: uncalledTeams) TeamsCallingView(teams: uncalledTeams)
.environment(tournament) .environment(tournament)
@ -224,6 +244,11 @@ struct SendToAllView: View {
} }
func _teams() -> [TeamRegistration] { func _teams() -> [TeamRegistration] {
if let event {
return event.selectedTeams()
}
guard let tournament else { return [] }
let selectedSortedTeams = tournament.selectedSortedTeams() let selectedSortedTeams = tournament.selectedSortedTeams()
if onlyWaitingList { if onlyWaitingList {
return tournament.waitingListSortedTeams(selectedSortedTeams: selectedSortedTeams) return tournament.waitingListSortedTeams(selectedSortedTeams: selectedSortedTeams)
@ -258,8 +283,10 @@ struct SendToAllView: View {
func finalMessage() -> String { func finalMessage() -> String {
var message = [String?]() var message = [String?]()
message.append("\n\n") message.append("\n\n")
if addLink { if let tournament, addLink, event == nil {
message.append(tournament.shareURL(pageLink)?.absoluteString) message.append(tournament.shareURL(pageLink)?.absoluteString)
} else if let event {
message.append(event.shareURL()?.absoluteString)
} }
let signature = dataStore.user.getSummonsMessageSignature() ?? dataStore.user.defaultSignature(tournament) let signature = dataStore.user.getSummonsMessageSignature() ?? dataStore.user.defaultSignature(tournament)
@ -275,7 +302,9 @@ struct SendToAllView: View {
if contactMethod == 0 { if contactMethod == 0 {
contactType = .message(date: nil, recipients: _teams().flatMap { $0.unsortedPlayers() }.flatMap { [$0.phoneNumber, $0.contactPhoneNumber] }.compactMap({ $0 }), body: finalMessage(), tournamentBuild: nil) contactType = .message(date: nil, recipients: _teams().flatMap { $0.unsortedPlayers() }.flatMap { [$0.phoneNumber, $0.contactPhoneNumber] }.compactMap({ $0 }), body: finalMessage(), tournamentBuild: nil)
} else { } else {
contactType = .mail(date: nil, recipients: tournament.umpireMail(), bccRecipients: _teams().flatMap { $0.unsortedPlayers() }.flatMap { [$0.email, $0.contactEmail] }.compactMap({ $0 }), body: finalMessage(), subject: tournament.mailSubject(), tournamentBuild: nil) let umpireMail = tournament?.umpireMail() ?? event?.umpireMail()
let subject = tournament?.mailSubject() ?? event?.mailSubject()
contactType = .mail(date: nil, recipients: umpireMail, bccRecipients: _teams().flatMap { $0.unsortedPlayers() }.flatMap { [$0.email, $0.contactEmail] }.compactMap({ $0 }), body: finalMessage(), subject: subject, tournamentBuild: nil)
} }
} }

@ -16,6 +16,7 @@ struct EventSettingsView: View {
@State private var pageLink: PageLink = .teams @State private var pageLink: PageLink = .teams
@State private var tournamentInformation: String = "" @State private var tournamentInformation: String = ""
@State private var eventStartDate: Date @State private var eventStartDate: Date
@State private var showSendToAllView: Bool = false
@FocusState private var focusedField: Tournament.CodingKeys? @FocusState private var focusedField: Tournament.CodingKeys?
var visibleOnPadelClub: Binding<Bool> { var visibleOnPadelClub: Binding<Bool> {
@ -92,6 +93,12 @@ struct EventSettingsView: View {
_linkLabel() _linkLabel()
Section {
RowButtonView("Contactez toutes les équipes") {
showSendToAllView = true
}
}
Section { Section {
DatePicker(selection: $eventStartDate) { DatePicker(selection: $eventStartDate) {
Text(eventStartDate.formatted(.dateTime.weekday(.wide)).capitalized).lineLimit(1) Text(eventStartDate.formatted(.dateTime.weekday(.wide)).capitalized).lineLimit(1)
@ -172,6 +179,10 @@ struct EventSettingsView: View {
} }
} }
} }
.sheet(isPresented: $showSendToAllView) {
SendToAllView(event: event)
.tint(.master)
}
.navigationBarBackButtonHidden(focusedField != nil) .navigationBarBackButtonHidden(focusedField != nil)
.toolbar(content: { .toolbar(content: {
if focusedField != nil { if focusedField != nil {

Loading…
Cancel
Save