parent
18eb54309e
commit
83dbad0e0f
@ -0,0 +1,78 @@ |
|||||||
|
package net.pokeranalytics.android.util.csv |
||||||
|
|
||||||
|
import io.realm.Realm |
||||||
|
import net.pokeranalytics.android.exceptions.PAIllegalStateException |
||||||
|
import net.pokeranalytics.android.model.realm.Bankroll |
||||||
|
import net.pokeranalytics.android.model.realm.Transaction |
||||||
|
import net.pokeranalytics.android.model.realm.TransactionType |
||||||
|
import net.pokeranalytics.android.model.utils.DataUtils |
||||||
|
import org.apache.commons.csv.CSVRecord |
||||||
|
import timber.log.Timber |
||||||
|
import java.util.* |
||||||
|
|
||||||
|
class TransactionCSVDescriptor(source: DataSource, vararg elements: CSVField) : |
||||||
|
DataCSVDescriptor<Transaction>(source, *elements) { |
||||||
|
|
||||||
|
override fun parseData(realm: Realm, record: CSVRecord): Transaction? { |
||||||
|
|
||||||
|
var date: Date? = null |
||||||
|
var typeName: String? = null |
||||||
|
var bankrollName: String? = null |
||||||
|
var amount: Double? = null |
||||||
|
var comment: String? = null |
||||||
|
var live = false |
||||||
|
var currencyCode: String? = null |
||||||
|
var currencyRate: Double? = null |
||||||
|
|
||||||
|
for (field in this.fields) { |
||||||
|
|
||||||
|
val index = this.fieldMapping[field] |
||||||
|
if (index != null) { |
||||||
|
val value = record.get(index) |
||||||
|
when (field) { |
||||||
|
is TrField.TransactionDate -> date = field.parse(value) |
||||||
|
is TrField.TransactionType -> typeName = value |
||||||
|
is TrField.Amount -> amount = field.parse(value) |
||||||
|
is TrField.BankrollName -> bankrollName = value |
||||||
|
is TrField.Live -> live = field.parse(value) ?: true |
||||||
|
is TrField.CurrencyCode -> currencyCode = value |
||||||
|
is TrField.CurrencyRate -> currencyRate = field.parse(value) |
||||||
|
is TrField.Comment -> comment = value |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (date != null && amount != null && typeName != null && bankrollName != null) { |
||||||
|
|
||||||
|
val type = TransactionType.getOrCreate(realm, typeName, amount > 0) |
||||||
|
|
||||||
|
if (DataUtils.transactionUnicityCheck(realm, date, amount, type)) { |
||||||
|
val bankroll = Bankroll.getOrCreate(realm, bankrollName, live, currencyCode, currencyRate) |
||||||
|
return Transaction.newInstance(realm, bankroll, date, type, amount, comment) |
||||||
|
} else { |
||||||
|
Timber.d("Transaction already exists") |
||||||
|
} |
||||||
|
} else { |
||||||
|
Timber.d("Can't import transaction: date=$date, amount=$amount, type=$typeName") |
||||||
|
} |
||||||
|
|
||||||
|
return null |
||||||
|
} |
||||||
|
|
||||||
|
override fun toCSV(data: Transaction, field: CSVField): String? { |
||||||
|
|
||||||
|
return when(field) { |
||||||
|
is TrField.TransactionDate -> field.format(data.date) |
||||||
|
is TrField.TransactionType -> data.type?.name |
||||||
|
is TrField.Amount -> field.format(data.amount) |
||||||
|
is TrField.BankrollName -> data.bankroll?.name |
||||||
|
is TrField.Live -> field.format(data.bankroll?.live) |
||||||
|
is TrField.CurrencyCode -> data.bankroll?.currency?.code |
||||||
|
is TrField.CurrencyRate -> field.format(data.bankroll?.currency?.rate) |
||||||
|
is TrField.Comment -> data.comment |
||||||
|
else -> throw PAIllegalStateException("unmanaged field: $field") |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue