Updating import for PBT

csv
Laurent 7 years ago
parent 44d48bdc10
commit 84ab42c35c
  1. 8
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  2. 4
      app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt
  3. 14
      app/src/main/java/net/pokeranalytics/android/util/csv/CSVField.kt
  4. 84
      app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt
  5. 8
      app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt

@ -68,7 +68,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
companion object { 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() val session = Session()
session.result = Result() session.result = Result()
if (bankroll != null) { 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 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? { fun fieldNameForQueryType(queryCondition: Class < out QueryCondition >): String? {

@ -34,7 +34,7 @@ abstract class DataCSVDescriptor<T : Identifiable>(source: DataSource, vararg el
val data = this.parseData(realm, record) val data = this.parseData(realm, record)
data?.let { data?.let {
Timber.d(">>>>>>> identifier added: ${it.id}") // Timber.d(">>>>>>> identifier added: ${it.id}")
this.realmModelIds.add(it.objectIdentifier) this.realmModelIds.add(it.objectIdentifier)
} }
return if (data != null) 1 else 0 return if (data != null) 1 else 0
@ -42,7 +42,7 @@ abstract class DataCSVDescriptor<T : Identifiable>(source: DataSource, vararg el
override fun cancel(realm: Realm) { override fun cancel(realm: Realm) {
Timber.d(">>>>>>> Start delete of ${realmModelIds.size}") // Timber.d(">>>>>>> Start delete of ${realmModelIds.size}")
realm.executeTransaction { realm.executeTransaction {
this.realmModelIds.forEach { identifier -> this.realmModelIds.forEach { identifier ->

@ -31,6 +31,18 @@ interface NumberCSVField: TypedCSVField<Double> {
} }
} }
interface DataCSVField<T> : TypedCSVField<T> {
override fun parse(value: String): T? {
this.callback?.let {
return it(value)
}
return null
}
}
interface DateCSVField : TypedCSVField<Date> { interface DateCSVField : TypedCSVField<Date> {
val dateFormat: String? val dateFormat: String?
@ -58,8 +70,8 @@ interface BlindCSVField : TypedCSVField<Pair<Double, Double>> {
val strBlinds = value.split("/") val strBlinds = value.split("/")
if (strBlinds.size == 2) { if (strBlinds.size == 2) {
val bb = strBlinds.last().toDouble()
val sb = strBlinds.first().toDouble() val sb = strBlinds.first().toDouble()
val bb = strBlinds.last().toDouble()
return Pair(sb, bb) return Pair(sb, bb)
} else { } else {
Timber.d("Blinds could not be parsed: $value") Timber.d("Blinds could not be parsed: $value")

@ -63,11 +63,14 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean
private fun parseTransaction(realm: Realm, record: CSVRecord): Transaction? { private fun parseTransaction(realm: Realm, record: CSVRecord): Transaction? {
var date: Date? = null var date: Date? = null
var amount: Double? = null
var type: TransactionType? = null var type: TransactionType? = null
var currencyCode: String? = null var currencyCode: String? = null
var currencyRate: Double? = null var currencyRate: Double? = null
// Poker Bankroll Tracker specifics
var buyin: Double? = null
var cashedOut: Double? = null
fields.forEach { field -> fields.forEach { field ->
val index = this.fieldMapping[field] val index = this.fieldMapping[field]
@ -77,10 +80,8 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean
is SessionField.Start -> { is SessionField.Start -> {
date = field.parse(value) date = field.parse(value)
} }
is SessionField.Buyin -> amount = field.parse(value) is SessionField.Buyin -> buyin = field.parse(value)
is SessionField.SessionType -> { is SessionField.CashedOut -> cashedOut = field.parse(value)
type = realm.getOrCreate(value)
}
is SessionField.CurrencyCode -> currencyCode = value is SessionField.CurrencyCode -> currencyCode = value
is SessionField.CurrencyRate -> currencyRate = field.parse(value) is SessionField.CurrencyRate -> currencyRate = field.parse(value)
else -> { 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 (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()) val transaction = realm.copyToRealm(Transaction())
transaction.date = date!! transaction.date = date!!
transaction.amount = amount!! transaction.amount = amount
transaction.type = type transaction.type = type
val bankroll = Bankroll.getOrCreate(realm, currencyCode!!, currencyCode = currencyCode!!, currencyRate = currencyRate) 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? { 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 isLive = true
var bankrollName: String? = null var bankrollName: String? = null
@ -128,19 +142,30 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean
val value = record.get(index) val value = record.get(index)
when (field) { when (field) {
is SessionField.Start -> { is SessionField.Start -> {
session.startDate = field.parse(value) startDate = field.parse(value)
} }
is SessionField.End -> { is SessionField.End -> {
session.endDate = field.parse(value) endDate = field.parse(value)
} }
is SessionField.StartTime -> { is SessionField.StartTime -> {
session.startDate?.setHourMinutes(value) startDate?.setHourMinutes(value)
} }
is SessionField.EndTime -> { 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.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.Addon -> additionalBuyins += field.parse(value) ?: 0.0
is SessionField.Rebuy -> additionalBuyins += field.parse(value) ?: 0.0 is SessionField.Rebuy -> additionalBuyins += field.parse(value) ?: 0.0
is SessionField.Tips -> session.result?.tips = field.parse(value) is SessionField.Tips -> session.result?.tips = field.parse(value)
@ -152,14 +177,12 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean
is SessionField.Game -> { is SessionField.Game -> {
if (value.isNotEmpty()) { if (value.isNotEmpty()) {
session.game = realm.getOrCreate(value) session.game = realm.getOrCreate(value)
} else { } else { }
}
} }
is SessionField.Location -> { is SessionField.Location -> {
if (value.isNotEmpty()) { if (value.isNotEmpty()) {
session.location = realm.getOrCreate(value) session.location = realm.getOrCreate(value)
} else { } else { }
}
} }
is SessionField.Bankroll -> bankrollName = value is SessionField.Bankroll -> bankrollName = value
is SessionField.LimitType -> session.limit = Limit.getInstance(value)?.ordinal 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.SmallBlind -> session.cgSmallBlind = field.parse(value)
is SessionField.BigBlind -> session.cgBigBlind = field.parse(value) is SessionField.BigBlind -> session.cgBigBlind = field.parse(value)
is SessionField.TableSize -> session.tableSize = TableSize.valueForLabel(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 = is SessionField.TournamentPosition -> session.result?.tournamentFinalPosition =
field.parse(value)?.toInt() 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 = is SessionField.TournamentType -> session.tournamentType =
TournamentType.getValueForLabel(value)?.ordinal TournamentType.getValueForLabel(value)?.ordinal
is SessionField.TournamentNumberOfPlayers -> session.tournamentNumberOfPlayers = 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) 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?.let {
session.result?.buyin = it + additionalBuyins session.result?.buyin = it + additionalBuyins
} }
val net = session.result?.net
if (startDate != null && endDate != null && net != null) { // valid session 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 // session already in realm, we'd love not put it in Realm before doing the check
if (DataUtils.sessionCount(realm, startDate, endDate, net) == 1) { val count = DataUtils.sessionCount(realm, startDate!!, endDate!!, net)
return session if (count == 0) {
val managedSession = realm.copyToRealm(session)
managedSession.startDate = startDate
managedSession.endDate = endDate
return managedSession
} else { } else {
Timber.d("Session already exists") Timber.d("Session already exists(count=$count): sd=$startDate, ed=$endDate, net=$net")
} }
} else { } else {
Timber.d("Can't import session: sd=$startDate, ed=$endDate, net=$net") Timber.d("Can't import session: sd=$startDate, ed=$endDate, net=$net")
} }
session.cleanup()
session.deleteFromRealm()
return null return null
} }

@ -2,6 +2,14 @@ package net.pokeranalytics.android.util.csv
import java.util.* 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<net.pokeranalytics.android.model.realm.TransactionType>
}
/** /**
* The enumeration of Session fields * The enumeration of Session fields

Loading…
Cancel
Save