Last active
June 19, 2017 04:36
-
-
Save tshevchuk/e5d91781d168dd8b9f3409497abf6252 to your computer and use it in GitHub Desktop.
Qif to beancount converter. SubTransaction.java https://gist.github.com/tshevchuk/c862b4e77d1bedc3c94776644a6d33a5 , Transaction.java https://gist.github.com/tshevchuk/4f855f96f9bc31c529733e0b7fa4a1ee
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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