Skip to content

Instantly share code, notes, and snippets.

@tshevchuk
Last active June 19, 2017 04:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tshevchuk/e5d91781d168dd8b9f3409497abf6252 to your computer and use it in GitHub Desktop.
Save tshevchuk/e5d91781d168dd8b9f3409497abf6252 to your computer and use it in GitHub Desktop.
package com.company;
import com.sun.deploy.util.StringUtils;
import java.io.*;
import java.util.*;
public class QifToBeancount {
public static String convert(String qif) {
List<Transaction> transactions = new ArrayList<>();
try {
parseTransactions(qif, transactions);
} catch (IOException e) {
e.printStackTrace();
}
return transactionsToBeancount(transactions);
}
private static String transactionsToBeancount(List<Transaction> transactions) {
StringBuilder sb = new StringBuilder();
for (Transaction tr : transactions) {
sb.append(tr.getDate())
.append(" * \"")
.append(tr.getDescription())
.append("\"\n ")
.append(tr.getAccount());
for (SubTransaction subTransaction : tr.getSubTransactions()) {
sb.append("\n ")
.append(subTransaction.getAccount())
.append(" ")
.append(invertAmountSign(subTransaction.getAmount()))
.append(" UAH");
}
sb.append("\n\n");
}
return sb.toString();
}
private static String invertAmountSign(String amount) {
if (amount.startsWith("-")) {
return amount.substring(1);
} else {
return "-" + amount;
}
}
private static void parseTransactions(String qif, Collection<Transaction> transactions) throws IOException {
try (BufferedReader reader = new BufferedReader(new StringReader(qif))) {
String account = null;
String date = null;
String description = null;
List<SubTransaction> subTransactions = new ArrayList<>();
String subTransactionAccount = null;
for (String line; (line = reader.readLine()) != null; ) {
if ("!Account".equals(line)) {
continue;
} else if (line.charAt(0) == 'N') {
account = line.substring(1);
} else if ("^".equals(line)) {
if (date != null) {
Transaction transaction = new Transaction();
transaction.setDescription(description);
transaction.setAccount(account);
transaction.setDate(date);
transaction.getSubTransactions().addAll(subTransactions);
transactions.add(transaction);
}
date = null;
subTransactions.clear();
continue;
} else if ("!Type:Cash".equals(line)) {
continue;
} else if (line.charAt(0) == 'D') {
String[] parts = line.substring(1).split("/");
if (parts[1].length() < 2) {
parts[1] = "0" + parts[1];
}
if (parts[2].length() < 2) {
parts[2] = "0" + parts[2];
}
date = StringUtils.join(Arrays.asList(parts), "-");
} else if (line.charAt(0) == 'M') {
description = line.substring(1);
} else if (line.charAt(0) == 'S') {
subTransactionAccount = line.substring(1);
} else if (line.charAt(0) == '$') {
String amount = line.substring(1).replace(',', '.');
SubTransaction subTransaction = new SubTransaction();
subTransaction.setAccount(subTransactionAccount);
subTransaction.setAmount(amount);
subTransactions.add(subTransaction);
subTransactionAccount = null;
} else {
System.out.println("ERROR!!!");
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment