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