update some DB stuff

multistore
Razmig Sarkissian 2 years ago
parent 44f4b3e566
commit 80dbc66478
  1. 1
      PadelClub/Data/AppSettings.swift
  2. 6
      PadelClub/Data/Club.swift
  3. 6
      PadelClub/Data/Event.swift
  4. 35
      PadelClub/Data/PlayerRegistration.swift
  5. 39
      PadelClub/Data/TeamRegistration.swift
  6. 18
      PadelClub/Data/Tournament.swift
  7. 18
      PadelClub/Data/User.swift
  8. 2
      PadelClub/Info.plist
  9. 11
      PadelClub/Utils/PadelRule.swift
  10. 4
      PadelClub/Views/Cashier/CashierDetailView.swift
  11. 4
      PadelClub/Views/Cashier/CashierSettingsView.swift
  12. 10
      PadelClub/Views/Player/Components/PlayerPayView.swift
  13. 2
      PadelClub/Views/Player/Components/PlayerSexPickerView.swift
  14. 4
      PadelClub/Views/Player/PlayerDetailView.swift
  15. 2
      PadelClub/Views/Tournament/Screen/Components/UpdateSourceRankDateView.swift
  16. 2
      PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift

@ -15,6 +15,7 @@ class AppSettings: MicroStorable {
static var fileName: String { "appsettings.json" }
var lastDataSource: String? = nil
var callMessageBody : String? = nil
var callMessageSignature: String? = nil
var callDisplayFormat: Bool = false

@ -23,10 +23,12 @@ class Club : ModelObject, Storable, Hashable {
}
var id: String = Store.randomId()
var creator: String?
var name: String
var acronym: String
var phone: String?
var code: String?
//var federalClubData: Data?
var address: String?
var city: String?
var zipCode: String?
@ -34,7 +36,8 @@ class Club : ModelObject, Storable, Hashable {
var longitude: Double?
//var courtCount: Int?
internal init(name: String, acronym: String? = nil, phone: String? = nil, code: String? = nil, address: String? = nil, city: String? = nil, zipCode: String? = nil, latitude: Double? = nil, longitude: Double? = nil) {
internal init(creator: String? = nil, name: String, acronym: String? = nil, phone: String? = nil, code: String? = nil, address: String? = nil, city: String? = nil, zipCode: String? = nil, latitude: Double? = nil, longitude: Double? = nil) {
self.creator = creator
self.name = name
self.acronym = acronym ?? name.acronym()
self.phone = phone
@ -69,6 +72,7 @@ class Club : ModelObject, Storable, Hashable {
enum CodingKeys: String, CodingKey {
case _id = "id"
case _creator = "creator"
case _name = "name"
case _acronym = "acronym"
case _phone = "phone"

@ -14,9 +14,11 @@ class Event: ModelObject, Storable {
static func resourceName() -> String { return "events" }
var id: String = Store.randomId()
var creator: String?
var club: String?
var creationDate: Date = Date()
var name: String?
//var federalTournamentData: Data?
//var courtCount: Int?
var tenupId: String?
// var groupStageFormat: Int?
@ -24,7 +26,8 @@ class Event: ModelObject, Storable {
// var loserRoundFormat: Int?
//var timeslots ?
internal init(club: String? = nil, name: String? = nil, tenupId: String? = nil) {
internal init(creator: String? = nil, club: String? = nil, name: String? = nil, tenupId: String? = nil) {
self.creator = creator
self.club = club
self.name = name
// self.courtCount = courtCount
@ -61,6 +64,7 @@ class Event: ModelObject, Storable {
extension Event {
enum CodingKeys: String, CodingKey {
case _id = "id"
case _creator = "creator"
case _club = "club"
case _creationDate = "creationDate"
case _name = "name"

@ -18,9 +18,8 @@ class PlayerRegistration: ModelObject, Storable {
var lastName: String
var licenceId: String?
var rank: Int?
var registrationType: PaymentType?
var registrationDate: Date?
var sex: Int
var paymentType: PlayerPaymentType?
var sex: Int //todo
var tournamentPlayed: Int?
var points: Double?
@ -37,14 +36,13 @@ class PlayerRegistration: ModelObject, Storable {
var hasArrived: Bool = false
internal init(teamRegistration: String? = nil, firstName: String, lastName: String, licenceId: String? = nil, rank: Int? = nil, registrationType: PaymentType? = nil, registrationDate: Date? = nil, sex: Int, source: PlayerDataSource? = nil) {
internal init(teamRegistration: String? = nil, firstName: String, lastName: String, licenceId: String? = nil, rank: Int? = nil, paymentType: PlayerPaymentType? = nil, sex: Int, source: PlayerDataSource? = nil) {
self.teamRegistration = teamRegistration
self.firstName = firstName
self.lastName = lastName
self.licenceId = licenceId
self.rank = rank
self.registrationType = registrationType
self.registrationDate = registrationDate
self.paymentType = paymentType
self.sex = sex
self.source = source
}
@ -135,7 +133,7 @@ class PlayerRegistration: ModelObject, Storable {
}
func hasPaid() -> Bool {
registrationType != nil
paymentType != nil
}
func playerLabel(_ displayStyle: DisplayStyle = .wide) -> String {
@ -265,8 +263,7 @@ class PlayerRegistration: ModelObject, Storable {
case _lastName = "lastName"
case _licenceId = "licenceId"
case _rank = "rank"
case _registrationType = "registrationType"
case _registrationDate = "registrationDate"
case _paymentType = "paymentType"
case _sex = "sex"
case _tournamentPlayed = "tournamentPlayed"
case _points = "points"
@ -283,11 +280,25 @@ class PlayerRegistration: ModelObject, Storable {
}
enum PlayerDataSource: Int, Codable {
case frenchFederation
case beachPadel
case frenchFederation = 0
case beachPadel = 1
}
enum PaymentType: Int, CaseIterable, Identifiable, Codable {
enum PlayerSexType: Int, CaseIterable, Identifiable, Codable {
init?(rawValue: Int?) {
guard let value = rawValue else { return nil }
self.init(rawValue: value)
}
var id: Self {
self
}
case female = 0
case male = 1
}
enum PlayerPaymentType: Int, CaseIterable, Identifiable, Codable {
init?(rawValue: Int?) {
guard let value = rawValue else { return nil }
self.init(rawValue: value)

@ -28,13 +28,12 @@ class TeamRegistration: ModelObject, Storable {
var walkOut: Bool = false
var wildCardBracket: Bool = false
var wildCardGroupStage: Bool = false
var category: TournamentCategory?
var weight: Int = 0
var lockWeight: Int?
var confirmationDate: Date?
var qualified: Bool = false
internal init(tournament: String, groupStage: String? = nil, registrationDate: Date? = nil, callDate: Date? = nil, bracketPosition: Int? = nil, groupStagePosition: Int? = nil, comment: String? = nil, source: String? = nil, sourceValue: String? = nil, logo: String? = nil, name: String? = nil, category: TournamentCategory? = nil) {
internal init(tournament: String, groupStage: String? = nil, registrationDate: Date? = nil, callDate: Date? = nil, bracketPosition: Int? = nil, groupStagePosition: Int? = nil, comment: String? = nil, source: String? = nil, sourceValue: String? = nil, logo: String? = nil, name: String? = nil) {
self.tournament = tournament
self.groupStage = groupStage
self.registrationDate = registrationDate
@ -46,7 +45,6 @@ class TeamRegistration: ModelObject, Storable {
self.sourceValue = sourceValue
self.logo = logo
self.name = name
self.category = category
}
func isSeedable() -> Bool {
@ -101,12 +99,7 @@ class TeamRegistration: ModelObject, Storable {
}
var tournamentCategory: TournamentCategory {
get {
category ?? .men
}
set {
category = newValue
}
tournamentObject()?.tournamentCategory ?? .men
}
@objc
@ -121,8 +114,8 @@ class TeamRegistration: ModelObject, Storable {
})
}
func updateWeight() {
setWeight(from: self.players())
func updateWeight(inTournamentCategory tournamentCategory: TournamentCategory) {
setWeight(from: self.players(), inTournamentCategory: tournamentCategory)
}
func teamLabel(_ displayStyle: DisplayStyle = .wide) -> String {
@ -201,9 +194,9 @@ class TeamRegistration: ModelObject, Storable {
}
func updatePlayers(_ players: Set<PlayerRegistration>) {
func updatePlayers(_ players: Set<PlayerRegistration>, inTournamentCategory tournamentCategory: TournamentCategory) {
try? DataStore.shared.playerRegistrations.delete(contentOfs: unsortedPlayers())
setWeight(from: Array(players))
setWeight(from: Array(players), inTournamentCategory: tournamentCategory)
players.forEach { player in
player.teamRegistration = id
@ -273,31 +266,20 @@ class TeamRegistration: ModelObject, Storable {
Store.main.filter { $0.teamRegistration == self.id }
}
func setWeight(from players: [PlayerRegistration]) {
func setWeight(from players: [PlayerRegistration], inTournamentCategory tournamentCategory: TournamentCategory) {
let significantPlayerCount = significantPlayerCount()
weight = (players.prefix(significantPlayerCount).map { $0.weight } + missingPlayerType().map { unrankValue(for: $0 == 1 ? true : false ) }).prefix(significantPlayerCount).reduce(0,+)
weight = (players.prefix(significantPlayerCount).map { $0.weight } + missingPlayerType(inTournamentCategory: tournamentCategory).map { unrankValue(for: $0 == 1 ? true : false ) }).prefix(significantPlayerCount).reduce(0,+)
}
func significantPlayerCount() -> Int {
tournamentObject()?.significantPlayerCount() ?? 2
}
func mandatoryPlayerType() -> [Int] {
switch tournamentCategory {
case .mix:
return [0, 1]
case .women:
return [0, 0]
case .men:
return [1, 1]
}
}
func missingPlayerType() -> [Int] {
func missingPlayerType(inTournamentCategory tournamentCategory: TournamentCategory) -> [Int] {
let players = unsortedPlayers()
if players.count >= 2 { return [] }
let s = players.map { $0.sex }
var missing = mandatoryPlayerType()
var missing = tournamentCategory.mandatoryPlayerType()
s.forEach { i in
if let index = missing.firstIndex(of: i) {
missing.remove(at: index)
@ -351,7 +333,6 @@ class TeamRegistration: ModelObject, Storable {
case _name = "name"
case _wildCardBracket = "wildCardBracket"
case _wildCardGroupStage = "wildCardGroupStage"
case _category = "category"
case _weight = "weight"
case _walkOut = "walkOut"
case _lockWeight = "lockWeight"

@ -14,7 +14,6 @@ class Tournament : ModelObject, Storable {
var id: String = Store.randomId()
var event: String?
var creator: String?
var name: String?
var startDate: Date
var endDate: Date?
@ -49,9 +48,8 @@ class Tournament : ModelObject, Storable {
@ObservationIgnored
var navigationPath: [Screen] = []
internal init(event: String? = nil, creator: String? = nil, name: String? = nil, startDate: Date = Date(), endDate: Date? = nil, creationDate: Date = Date(), isPrivate: Bool = true, groupStageFormat: MatchFormat? = nil, roundFormat: MatchFormat? = nil, loserRoundFormat: MatchFormat? = nil, groupStageSortMode: GroupStageOrderingMode, groupStageCount: Int = 4, rankSourceDate: Date? = nil, dayDuration: Int = 1, teamCount: Int = 24, teamSorting: TeamSortingType? = nil, federalCategory: TournamentCategory, federalLevelCategory: TournamentLevel, federalAgeCategory: FederalTournamentAge, groupStageCourtCount: Int? = nil, seedCount: Int = 8, closedRegistrationDate: Date? = nil, groupStageAdditionalQualified: Int = 0, courtCount: Int = 2, prioritizeClubMembers: Bool = false, qualifiedPerGroupStage: Int = 1, teamsPerGroupStage: Int = 4, entryFee: Double? = nil) {
internal init(event: String? = nil, name: String? = nil, startDate: Date = Date(), endDate: Date? = nil, creationDate: Date = Date(), isPrivate: Bool = true, groupStageFormat: MatchFormat? = nil, roundFormat: MatchFormat? = nil, loserRoundFormat: MatchFormat? = nil, groupStageSortMode: GroupStageOrderingMode, groupStageCount: Int = 4, rankSourceDate: Date? = nil, dayDuration: Int = 1, teamCount: Int = 24, teamSorting: TeamSortingType? = nil, federalCategory: TournamentCategory, federalLevelCategory: TournamentLevel, federalAgeCategory: FederalTournamentAge, groupStageCourtCount: Int? = nil, seedCount: Int = 8, closedRegistrationDate: Date? = nil, groupStageAdditionalQualified: Int = 0, courtCount: Int = 2, prioritizeClubMembers: Bool = false, qualifiedPerGroupStage: Int = 1, teamsPerGroupStage: Int = 4, entryFee: Double? = nil) {
self.event = event
self.creator = creator
self.name = name
self.startDate = startDate
self.endDate = endDate
@ -539,7 +537,7 @@ class Tournament : ModelObject, Storable {
var teamsToImport = [TeamRegistration]()
teams.forEach { team in
if let previousTeam = team.previousTeam {
previousTeam.updatePlayers(team.players)
previousTeam.updatePlayers(team.players, inTournamentCategory: team.tournamentCategory)
teamsToImport.append(previousTeam)
} else {
let newTeam = addTeam(team.players, registrationDate: team.registrationDate)
@ -671,7 +669,7 @@ class Tournament : ModelObject, Storable {
teams.forEach { team in
let players = team.unsortedPlayers()
players.forEach { $0.setWeight(in: self) }
team.setWeight(from: players)
team.setWeight(from: players, inTournamentCategory: tournamentCategory)
try? DataStore.shared.playerRegistrations.addOrUpdate(contentOfs: players)
}
try? DataStore.shared.teamRegistrations.addOrUpdate(contentOfs: teams)
@ -985,8 +983,7 @@ class Tournament : ModelObject, Storable {
func addTeam(_ players: Set<PlayerRegistration>, registrationDate: Date? = nil) -> TeamRegistration {
let team = TeamRegistration(tournament: id, registrationDate: registrationDate ?? Date())
team.tournamentCategory = tournamentCategory
team.setWeight(from: Array(players))
team.setWeight(from: Array(players), inTournamentCategory: tournamentCategory)
players.forEach { player in
player.teamRegistration = team.id
}
@ -1271,7 +1268,6 @@ extension Tournament {
enum CodingKeys: String, CodingKey {
case _id = "id"
case _event = "event"
case _creator = "creator"
case _name = "name"
case _startDate = "startDate"
case _endDate = "endDate"
@ -1364,12 +1360,12 @@ extension Tournament {
let tournamentLevel = TournamentLevel.mostUsed(inTournaments: tournaments)
let tournamentCategory = TournamentCategory.mostUsed(inTournaments: tournaments)
let federalTournamentAge = FederalTournamentAge.mostUsed(inTournaments: tournaments)
return Tournament(creator: DataStore.shared.user?.id, groupStageSortMode: .snake, rankSourceDate: rankSourceDate, teamSorting: tournamentLevel.defaultTeamSortingType, federalCategory: tournamentCategory, federalLevelCategory: tournamentLevel, federalAgeCategory: federalTournamentAge)
//creator: DataStore.shared.user?.id
return Tournament(groupStageSortMode: .snake, rankSourceDate: rankSourceDate, teamSorting: tournamentLevel.defaultTeamSortingType, federalCategory: tournamentCategory, federalLevelCategory: tournamentLevel, federalAgeCategory: federalTournamentAge)
}
static func fake() -> Tournament {
return Tournament(event: "Roland Garros", creator: "", name: "Magic P100", startDate: Date(), endDate: Date(), creationDate: Date(), isPrivate: false, groupStageFormat: .nineGames, roundFormat: nil, loserRoundFormat: nil, groupStageSortMode: .snake, groupStageCount: 4, rankSourceDate: nil, dayDuration: 2, teamCount: 24, teamSorting: .rank, federalCategory: .men, federalLevelCategory: .p100, federalAgeCategory: .a45, groupStageCourtCount: nil, seedCount: 8, closedRegistrationDate: nil, groupStageAdditionalQualified: 0, courtCount: 4, prioritizeClubMembers: false, qualifiedPerGroupStage: 2, teamsPerGroupStage: 4, entryFee: nil)
return Tournament(event: "Roland Garros", name: "Magic P100", startDate: Date(), endDate: Date(), creationDate: Date(), isPrivate: false, groupStageFormat: .nineGames, roundFormat: nil, loserRoundFormat: nil, groupStageSortMode: .snake, groupStageCount: 4, rankSourceDate: nil, dayDuration: 2, teamCount: 24, teamSorting: .rank, federalCategory: .men, federalLevelCategory: .p100, federalAgeCategory: .a45, groupStageCourtCount: nil, seedCount: 8, closedRegistrationDate: nil, groupStageAdditionalQualified: 0, courtCount: 4, prioritizeClubMembers: false, qualifiedPerGroupStage: 2, teamsPerGroupStage: 4, entryFee: nil)
}
}

@ -27,6 +27,15 @@ class User: UserBase {
var lastName: String
var phone: String?
var country: String?
var callMessageBody : String? = nil
var callMessageSignature: String? = nil
var callDisplayFormat: Bool = false
var callDisplayEntryFee: Bool = false
var callUseFullCustomMessage: Bool = false
var matchFormatsDefaultDuration: [MatchFormat: Int]? = nil
var bracketMatchFormatPreference: MatchFormat?
var groupStageMatchFormatPreference: MatchFormat?
var loserBracketMatchFormatPreference: MatchFormat?
init(username: String, email: String, firstName: String, lastName: String, phone: String?, country: String?) {
self.username = username
@ -64,6 +73,15 @@ class User: UserBase {
case _lastName = "lastName"
case _phone = "phone"
case _country = "country"
case _callMessageBody = "callMessageBody"
case _callMessageSignature = "callMessageSignature"
case _callDisplayFormat = "callDisplayFormat"
case _callDisplayEntryFee = "callDisplayEntryFee"
case _callUseFullCustomMessage = "callUseFullCustomMessage"
case _matchFormatsDefaultDuration = "matchFormatsDefaultDuration"
case _bracketMatchFormatPreference = "bracketMatchFormatPreference"
case _groupStageMatchFormatPreference = "groupStageMatchFormatPreference"
case _loserBracketMatchFormatPreference = "loserBracketMatchFormatPreference"
}
}

@ -18,5 +18,7 @@
</array>
</dict>
</array>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
</dict>
</plist>

@ -638,6 +638,17 @@ enum TournamentCategory: Int, Hashable, Codable, CaseIterable, Identifiable {
self.init(rawValue: value)
}
func mandatoryPlayerType() -> [Int] {
switch self {
case .mix:
return [0, 1]
case .women:
return [0, 0]
case .men:
return [1, 1]
}
}
var localizedPlayerLabel: String {
switch self {
case .women:

@ -42,8 +42,8 @@ struct CashierDetailView: View {
private func _tournamentCashierDetailView(_ tournament: Tournament) -> some View {
DisclosureGroup {
ForEach(PlayerRegistration.PaymentType.allCases) { type in
let count = tournament.selectedPlayers().filter({ $0.registrationType == type }).count
ForEach(PlayerRegistration.PlayerPaymentType.allCases) { type in
let count = tournament.selectedPlayers().filter({ $0.paymentType == type }).count
LabeledContent {
if let entryFee = tournament.entryFee {
let sum = Double(count) * entryFee

@ -26,7 +26,7 @@ struct CashierSettingsView: View {
let players = tournaments.flatMap({ $0.selectedPlayers() })
players.forEach { player in
if player.hasPaid() == false {
player.registrationType = .gift
player.paymentType = .gift
}
}
try? dataStore.playerRegistrations.addOrUpdate(contentOfs: players)
@ -39,7 +39,7 @@ struct CashierSettingsView: View {
RowButtonView("Personne n'a réglé", role: .destructive) {
let players = tournaments.flatMap({ $0.selectedPlayers() })
players.forEach { player in
player.registrationType = nil
player.paymentType = nil
}
try? dataStore.playerRegistrations.addOrUpdate(contentOfs: players)
}

@ -12,16 +12,16 @@ struct PlayerPayView: View {
@Bindable var player: PlayerRegistration
var body: some View {
Picker(selection: $player.registrationType) {
Text("Non réglé").tag(nil as PlayerRegistration.PaymentType?)
ForEach(PlayerRegistration.PaymentType.allCases) { type in
Text(type.localizedLabel()).tag(type as PlayerRegistration.PaymentType?)
Picker(selection: $player.paymentType) {
Text("Non réglé").tag(nil as PlayerRegistration.PlayerPaymentType?)
ForEach(PlayerRegistration.PlayerPaymentType.allCases) { type in
Text(type.localizedLabel()).tag(type as PlayerRegistration.PlayerPaymentType?)
}
} label: {
}
.pickerStyle(.menu)
.fixedSize()
.onChange(of: player.registrationType) {
.onChange(of: player.paymentType) {
_save()
}
}

@ -35,7 +35,7 @@ struct PlayerSexPickerView: View {
player.setWeight(in: tournament)
try dataStore.playerRegistrations.addOrUpdate(instance: player)
if let team = player.team() {
team.updateWeight()
team.updateWeight(inTournamentCategory: tournament.tournamentCategory)
try dataStore.teamRegistrations.addOrUpdate(instance: team)
}

@ -80,12 +80,12 @@ struct PlayerDetailView: View {
_save()
}
.onChange(of: player.weight) {
player.team()?.updateWeight()
player.team()?.updateWeight(inTournamentCategory: tournament.tournamentCategory)
_save()
}
.onChange(of: player.rank) {
player.setWeight(in: tournament)
player.team()?.updateWeight()
player.team()?.updateWeight(inTournamentCategory: tournament.tournamentCategory)
_save()
}
.headerProminence(.increased)

@ -46,7 +46,7 @@ struct UpdateSourceRankDateView: View {
try dataStore.playerRegistrations.addOrUpdate(contentOfs: tournament.unsortedPlayers())
tournament.unsortedTeams().forEach { team in
team.setWeight(from: team.players())
team.setWeight(from: team.players(), inTournamentCategory: tournament.tournamentCategory)
if forceRefreshLockWeight {
team.lockWeight = team.weight
}

@ -555,7 +555,7 @@ struct InscriptionManagerView: View {
private func _updateTeam() {
guard let editedTeam else { return }
let players = _currentSelection()
editedTeam.updatePlayers(players)
editedTeam.updatePlayers(players, inTournamentCategory: tournament.tournamentCategory)
try? dataStore.teamRegistrations.addOrUpdate(instance: editedTeam)
try? dataStore.playerRegistrations.addOrUpdate(contentOfs: players)
createdPlayers.removeAll()

Loading…
Cancel
Save