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 5585ef44..11f1da03 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 @@ -17,7 +17,16 @@ enum class DataSource { POKER_INCOME, POKER_BANKROLL_TRACKER, RUN_GOOD, - POKER_AGENT + POKER_AGENT; + + val availableDateFormats: List + get() { + return when(this) { + POKER_BANKROLL_TRACKER -> listOf("MM/dd/yy HH:mm", "yyyy-MM-dd HH:mm:ss") + else -> listOf() + } + } + } /** @@ -102,8 +111,6 @@ abstract class DataCSVDescriptor(source: DataSource, vararg el return null } -// abstract fun - } /** diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt index 312ac9f3..690f8a41 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt @@ -12,6 +12,9 @@ import net.pokeranalytics.android.util.extensions.getOrCreate import net.pokeranalytics.android.util.extensions.setHourMinutes import org.apache.commons.csv.CSVRecord import timber.log.Timber +import java.text.DateFormat +import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* abstract class PACSVDescriptor(source: DataSource, @@ -23,6 +26,8 @@ abstract class PACSVDescriptor(source: DataSource, private var currentDay: String = "" private var startInSeconds: Double = 20 * 3600.0 + private var dateFormat: DateFormat? = null + /** * Parses a [record] and return an optional Session */ @@ -35,7 +40,7 @@ abstract class PACSVDescriptor(source: DataSource, var endDate: Date? = null var isLive = true - var bankrollName = "" + var bankrollName = "Import" var currencyCode: String? = null var currencyRate: Double? = null var additionalBuyins = 0.0 // rebuy + addon @@ -50,7 +55,7 @@ abstract class PACSVDescriptor(source: DataSource, val value = record.get(index) when (field) { is SessionField.Start -> { - startDate = field.parse(value) + startDate = parseDate(field, value) if (source == DataSource.POKER_AGENT) { if (currentDay == value) { sameDaySessionCount++ @@ -61,7 +66,7 @@ abstract class PACSVDescriptor(source: DataSource, } else {} } is SessionField.End -> { - endDate = field.parse(value) + endDate = parseDate(field, value) } is SessionField.StartTime -> { startDate?.setHourMinutes(value) @@ -226,10 +231,6 @@ abstract class PACSVDescriptor(source: DataSource, } - if (bankrollName.isEmpty()) { - bankrollName = "Import" - } - val bankroll = Bankroll.getOrCreate(realm, bankrollName, isLive, currencyCode, currencyRate) session.bankroll = bankroll @@ -270,4 +271,34 @@ abstract class PACSVDescriptor(source: DataSource, return null } + private fun parseDate(field: DateCSVField, value: String): Date { + + try { + this.dateFormat?.parse(value)?.let { date -> + return date + } + } catch (e: ParseException) { + } + + // if date null or exception + // try to find another valid dateformat + val formats = this.source.availableDateFormats.toMutableList() + field.dateFormat?.let { dateFormat -> + formats.add(0, dateFormat) + } + + for (dateFormat in formats) { + val df = SimpleDateFormat(dateFormat) + try { + df.parse(value)?.let { date -> + this.dateFormat = df + return date + } + } catch (e: ParseException) { + } + } + + throw PAIllegalStateException("No date format found to parse date: $value") + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt index 7f17162d..a6a563ff 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt @@ -157,7 +157,7 @@ class ProductCSVDescriptors { ) } - val pokerAnalyticsiOS: SessionCSVDescriptor + private val pokerAnalyticsiOS: SessionCSVDescriptor get() { return SessionCSVDescriptor( DataSource.POKER_ANALYTICS, 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 c306c4d0..f1df37d2 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 @@ -10,7 +10,7 @@ sealed class TrField { data class TransactionDate( override var header: String, override var callback: ((String) -> Date?)? = null, - override val dateFormat: String? = null + override val dateFormat: String? = null, ) : DateCSVField data class Amount( @@ -45,25 +45,25 @@ sealed class SessionField { data class Start( override var header: String, override var callback: ((String) -> Date?)? = null, - override val dateFormat: String? = null + override val dateFormat: String? = null, ) : DateCSVField data class StartTime( override var header: String, override var callback: ((String) -> Date?)? = null, - override val dateFormat: String? = null + override val dateFormat: String? = null, ) : DateCSVField data class End( override var header: String, override var callback: ((String) -> Date?)? = null, - override val dateFormat: String? = null + override val dateFormat: String? = null, ) : DateCSVField data class EndTime( override var header: String, override var callback: ((String) -> Date?)? = null, - override val dateFormat: String? = null + override val dateFormat: String? = null, ) : DateCSVField data class Duration( diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionTransactionCSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionTransactionCSVDescriptor.kt index e71a1585..97f13169 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionTransactionCSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionTransactionCSVDescriptor.kt @@ -13,7 +13,7 @@ import java.util.* /** * A SessionCSVDescriptor is a CSVDescriptor specialized in parsing Session objects */ -class SessionTransactionCSVDescriptor(source: DataSource, private var isTournament: Boolean?, vararg elements: CSVField) : +class SessionTransactionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg elements: CSVField) : PACSVDescriptor(source, isTournament, *elements) { private enum class DataType {