From 84ab42c35ca0d9c0a65035a7e410f3b932309db8 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 14 Jun 2019 17:21:30 +0200 Subject: [PATCH] Updating import for PBT --- .../android/model/realm/Session.kt | 8 +- .../android/util/csv/CSVDescriptor.kt | 4 +- .../android/util/csv/CSVField.kt | 14 +++- .../android/util/csv/SessionCSVDescriptor.kt | 84 ++++++++++++------- .../android/util/csv/SessionField.kt | 8 ++ 5 files changed, 82 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index af897af9..293c8fc7 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -68,7 +68,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat companion object { - fun newInstance(realm: Realm, isTournament: Boolean, bankroll: Bankroll? = null): Session { + fun newInstance(realm: Realm, isTournament: Boolean, bankroll: Bankroll? = null, managed: Boolean = false): Session { val session = Session() session.result = Result() if (bankroll != null) { @@ -78,7 +78,11 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } session.type = if (isTournament) Session.Type.TOURNAMENT.ordinal else Session.Type.CASH_GAME.ordinal - return realm.copyToRealm(session) + return if (managed) { + realm.copyToRealm(session) + } else { + session + } } fun fieldNameForQueryType(queryCondition: Class < out QueryCondition >): String? { diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt index b462c377..36df0fac 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt @@ -34,7 +34,7 @@ abstract class DataCSVDescriptor(source: DataSource, vararg el val data = this.parseData(realm, record) data?.let { - Timber.d(">>>>>>> identifier added: ${it.id}") +// Timber.d(">>>>>>> identifier added: ${it.id}") this.realmModelIds.add(it.objectIdentifier) } return if (data != null) 1 else 0 @@ -42,7 +42,7 @@ abstract class DataCSVDescriptor(source: DataSource, vararg el override fun cancel(realm: Realm) { - Timber.d(">>>>>>> Start delete of ${realmModelIds.size}") +// Timber.d(">>>>>>> Start delete of ${realmModelIds.size}") realm.executeTransaction { this.realmModelIds.forEach { identifier -> diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVField.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVField.kt index 3e7e6659..1202443a 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVField.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVField.kt @@ -31,6 +31,18 @@ interface NumberCSVField: TypedCSVField { } } +interface DataCSVField : TypedCSVField { + + override fun parse(value: String): T? { + + this.callback?.let { + return it(value) + } + return null + } + +} + interface DateCSVField : TypedCSVField { val dateFormat: String? @@ -58,8 +70,8 @@ interface BlindCSVField : TypedCSVField> { val strBlinds = value.split("/") if (strBlinds.size == 2) { - val bb = strBlinds.last().toDouble() val sb = strBlinds.first().toDouble() + val bb = strBlinds.last().toDouble() return Pair(sb, bb) } else { Timber.d("Blinds could not be parsed: $value") diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt index fe6e26ed..3fc15506 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt @@ -63,11 +63,14 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean private fun parseTransaction(realm: Realm, record: CSVRecord): Transaction? { var date: Date? = null - var amount: Double? = null var type: TransactionType? = null var currencyCode: String? = null var currencyRate: Double? = null + // Poker Bankroll Tracker specifics + var buyin: Double? = null + var cashedOut: Double? = null + fields.forEach { field -> val index = this.fieldMapping[field] @@ -77,10 +80,8 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean is SessionField.Start -> { date = field.parse(value) } - is SessionField.Buyin -> amount = field.parse(value) - is SessionField.SessionType -> { - type = realm.getOrCreate(value) - } + is SessionField.Buyin -> buyin = field.parse(value) + is SessionField.CashedOut -> cashedOut = field.parse(value) is SessionField.CurrencyCode -> currencyCode = value is SessionField.CurrencyRate -> currencyRate = field.parse(value) else -> { @@ -89,13 +90,23 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean } } + val amount = if (buyin != null && buyin!! > 0) { + type = TransactionType.getByValue(TransactionType.Value.DEPOSIT, realm) + buyin + } else if (cashedOut != null && cashedOut!! > 0) { + type = TransactionType.getByValue(TransactionType.Value.WITHDRAWAL, realm) + cashedOut!! * -1 + } else { + null + } + if (date != null && amount != null && type != null && currencyCode != null) { - if (DataUtils.transactionUnicityCheck(realm, date!!, amount!!, type!!)) { + if (DataUtils.transactionUnicityCheck(realm, date!!, amount, type)) { val transaction = realm.copyToRealm(Transaction()) transaction.date = date!! - transaction.amount = amount!! + transaction.amount = amount transaction.type = type val bankroll = Bankroll.getOrCreate(realm, currencyCode!!, currencyCode = currencyCode!!, currencyRate = currencyRate) @@ -113,7 +124,10 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean private fun parseSession(realm: Realm, record: CSVRecord): Session? { - val session = Session.newInstance(realm, this.isTournament) + val session = Session.newInstance(realm, this.isTournament, managed = false) + + var startDate: Date? = null + var endDate: Date? = null var isLive = true var bankrollName: String? = null @@ -128,19 +142,30 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean val value = record.get(index) when (field) { is SessionField.Start -> { - session.startDate = field.parse(value) + startDate = field.parse(value) } is SessionField.End -> { - session.endDate = field.parse(value) + endDate = field.parse(value) } is SessionField.StartTime -> { - session.startDate?.setHourMinutes(value) + startDate?.setHourMinutes(value) } is SessionField.EndTime -> { - session.endDate?.setHourMinutes(value) + endDate?.setHourMinutes(value) + } + is SessionField.Buyin -> { + val buyin = field.parse(value) + session.result?.buyin = buyin + if (session.type == Session.Type.TOURNAMENT.ordinal) { + session.tournamentEntryFee = buyin + } else {} } - is SessionField.Buyin -> session.result?.buyin = field.parse(value) is SessionField.CashedOut -> session.result?.cashout = field.parse(value) + is SessionField.SessionType -> { + Session.Type.getValueFromString(value)?.let { type -> + session.type = type.ordinal + } + } is SessionField.Addon -> additionalBuyins += field.parse(value) ?: 0.0 is SessionField.Rebuy -> additionalBuyins += field.parse(value) ?: 0.0 is SessionField.Tips -> session.result?.tips = field.parse(value) @@ -152,14 +177,12 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean is SessionField.Game -> { if (value.isNotEmpty()) { session.game = realm.getOrCreate(value) - } else { - } + } else { } } is SessionField.Location -> { if (value.isNotEmpty()) { session.location = realm.getOrCreate(value) - } else { - } + } else { } } is SessionField.Bankroll -> bankrollName = value is SessionField.LimitType -> session.limit = Limit.getInstance(value)?.ordinal @@ -172,14 +195,13 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean is SessionField.SmallBlind -> session.cgSmallBlind = field.parse(value) is SessionField.BigBlind -> session.cgBigBlind = field.parse(value) is SessionField.TableSize -> session.tableSize = TableSize.valueForLabel(value) - is SessionField.SessionType -> { - Session.Type.getValueFromString(value)?.let { type -> - session.type = type.ordinal - } - } is SessionField.TournamentPosition -> session.result?.tournamentFinalPosition = field.parse(value)?.toInt() - is SessionField.TournamentName -> session.tournamentName = realm.getOrCreate(value) + is SessionField.TournamentName -> { + if (value.isNotEmpty()) { + session.tournamentName = realm.getOrCreate(value) + } else { } + } is SessionField.TournamentType -> session.tournamentType = TournamentType.getValueForLabel(value)?.ordinal is SessionField.TournamentNumberOfPlayers -> session.tournamentNumberOfPlayers = @@ -199,26 +221,26 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean session.bankroll = Bankroll.getOrCreate(realm, bankrollName ?: "Import", isLive, currencyCode, currencyRate) - val startDate = session.startDate - val endDate = session.endDate - val net = session.result?.net session.result?.buyin?.let { session.result?.buyin = it + additionalBuyins } + val net = session.result?.net if (startDate != null && endDate != null && net != null) { // valid session // session already in realm, we'd love not put it in Realm before doing the check - if (DataUtils.sessionCount(realm, startDate, endDate, net) == 1) { - return session + val count = DataUtils.sessionCount(realm, startDate!!, endDate!!, net) + if (count == 0) { + val managedSession = realm.copyToRealm(session) + managedSession.startDate = startDate + managedSession.endDate = endDate + return managedSession } else { - Timber.d("Session already exists") + Timber.d("Session already exists(count=$count): sd=$startDate, ed=$endDate, net=$net") } } else { Timber.d("Can't import session: sd=$startDate, ed=$endDate, net=$net") } - session.cleanup() - session.deleteFromRealm() return null } diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt index 6f0876af..1550d399 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt @@ -2,6 +2,14 @@ package net.pokeranalytics.android.util.csv import java.util.* +sealed class TransactionField { + + data class TransactionType( + override var header: String, + override var callback: ((String) -> net.pokeranalytics.android.model.realm.TransactionType?)? = null + ) : DataCSVField + +} /** * The enumeration of Session fields