package com.code44.finance.data.backup;
import android.content.Context;
import android.database.Cursor;
import com.code44.finance.common.model.TransactionType;
import com.code44.finance.data.db.Tables;
import com.code44.finance.data.model.Account;
import com.code44.finance.data.model.Category;
import com.code44.finance.data.model.Tag;
import com.code44.finance.data.model.Transaction;
import com.code44.finance.data.providers.TransactionsProvider;
import com.code44.finance.utils.IOUtils;
import net.danlew.android.joda.DateUtils;
import org.joda.time.DateTime;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
public class CsvDataExporter extends DataExporter {
private static final String QUOTE = "\"";
private static final String SEPARATOR = ",";
private static final String TAG_SEPARATOR = ",";
private final Context context;
public CsvDataExporter(OutputStream outputStream, Context context) {
super(outputStream);
this.context = context;
}
@Override public void exportData(OutputStream outputStream) throws Exception {
final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));
final Cursor cursor = Tables.Transactions.getQuery().from(context, TransactionsProvider.uriTransactions()).execute();
try {
if (cursor.moveToFirst()) {
writeCsv(writer, cursor);
}
} finally {
IOUtils.closeQuietly(cursor);
}
writer.close();
}
private void writeCsv(BufferedWriter writer, Cursor cursor) throws IOException {
// "29 September 2014", "09:44", "Expense", "Confirmed", "Account from", "Account to", "Category", "Tag1, Tag2"
final StringBuilder outputLine = new StringBuilder();
do {
final Transaction transaction = Transaction.from(cursor);
final DateTime dateTime = new DateTime(transaction.getDate());
outputLine.setLength(0);
outputLine.append(QUOTE).append(DateUtils.formatDateTime(context, dateTime, DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR)).append(QUOTE);
outputLine.append(SEPARATOR).append(QUOTE).append(DateUtils.formatDateTime(context, dateTime, DateUtils.FORMAT_SHOW_TIME)).append(QUOTE);
outputLine.append(SEPARATOR).append(QUOTE).append(transaction.getTransactionType()).append(QUOTE);
outputLine.append(SEPARATOR).append(QUOTE).append(transaction.getTransactionState()).append(QUOTE);
outputLine.append(SEPARATOR).append(QUOTE).append(transaction.getNote()).append(QUOTE);
outputLine.append(SEPARATOR).append(QUOTE).append(getAccountFrom(transaction)).append(QUOTE);
outputLine.append(SEPARATOR).append(QUOTE).append(getAccountTo(transaction)).append(QUOTE);
outputLine.append(SEPARATOR).append(QUOTE).append(getCategory(transaction)).append(QUOTE);
outputLine.append(SEPARATOR).append(QUOTE).append(getTags(transaction)).append(QUOTE);
outputLine.append(SEPARATOR).append(QUOTE).append(transaction.getAmount() / 100.0).append(QUOTE);
outputLine.append(SEPARATOR).append(QUOTE).append(getCurrencyCode(transaction)).append(QUOTE);
outputLine.append(SEPARATOR).append(QUOTE).append(transaction.getExchangeRate()).append(QUOTE);
writer.write(outputLine.toString());
writer.newLine();
} while (cursor.moveToNext());
}
private String getAccountFrom(Transaction transaction) {
if (transaction.getTransactionType() == TransactionType.Income) {
return "";
}
final Account account = transaction.getAccountFrom();
return account != null && account.hasId() ? account.getTitle() : "";
}
private String getAccountTo(Transaction transaction) {
if (transaction.getTransactionType() == TransactionType.Expense) {
return "";
}
final Account account = transaction.getAccountTo();
return account != null && account.hasId() ? account.getTitle() : "";
}
private String getCategory(Transaction transaction) {
if (transaction.getTransactionType() == TransactionType.Transfer) {
return "";
}
final Category category = transaction.getCategory();
return category != null && category.hasId() ? category.getTitle() : "";
}
private String getTags(Transaction transaction) {
if (transaction.getTags().size() > 0) {
final StringBuilder tags = new StringBuilder();
for (Tag tag : transaction.getTags()) {
if (tags.length() > 0) {
tags.append(TAG_SEPARATOR);
}
tags.append(tag.getTitle());
}
return tags.toString();
}
return "";
}
private String getCurrencyCode(Transaction transaction) {
if (transaction.getTransactionType() == TransactionType.Income) {
return transaction.getAccountTo().getCurrency().getCode();
} else {
return transaction.getAccountFrom().getCurrency().getCode();
}
}
}