+
+ tmpM = reDecimalPoint.matcher(value);
+ if (tmpM.find()) {
+ value = value.replace(",", "");
+ value = value.replace(" ", "");
+ }
+ }
+ L("curr=" + currency + ", value=" + value);
+ final float val = Float.parseFloat(value);
+ lastAccount.addAmount(val, currency);
+ for (LedgerAccount syn : syntheticAccounts) {
+ L(String.format(Locale.ENGLISH, "propagating %s %1.2f to %s",
+ currency, val, syn.getName()));
+ syn.addAmount(val, currency);
+ }
+ }
+
+ if (match_found) {
+ syntheticAccounts.clear();
+ state = ParserState.EXPECTING_ACCOUNT;
+ L("→ expecting account");
+ }
+
+ break;
+
+ case EXPECTING_TRANSACTION:
+ if (!line.isEmpty() && (line.charAt(0) == ' '))
+ continue;
+ m = reTransactionStart.matcher(line);
+ if (m.find()) {
+ transactionId = Integer.parseInt(Objects.requireNonNull(m.group(1)));
+ state = ParserState.EXPECTING_TRANSACTION_DESCRIPTION;
+ L(String.format(Locale.ENGLISH,
+ "found transaction %d → expecting description", transactionId));
+ progress.setProgress(++processedTransactionCount);
+ if (maxTransactionId < transactionId)
+ maxTransactionId = transactionId;
+ if ((progress.isIndeterminate()) || (progress.getTotal() < transactionId))
+ progress.setTotal(transactionId);
+ publishProgress(progress);
+ }
+ m = reEnd.matcher(line);
+ if (m.find()) {
+ L("--- transaction value complete ---");
+ break LINES;
+ }
+ break;
+
+ case EXPECTING_TRANSACTION_DESCRIPTION:
+ if (!line.isEmpty() && (line.charAt(0) == ' '))
+ continue;
+ m = reTransactionDescription.matcher(line);
+ if (m.find()) {
+ if (transactionId == 0)
+ throw new TransactionParserException(
+ "Transaction Id is 0 while expecting " + "description");
+
+ String date = Objects.requireNonNull(m.group(1));
+ try {
+ int equalsIndex = date.indexOf('=');
+ if (equalsIndex >= 0)
+ date = date.substring(equalsIndex + 1);
+ transaction =
+ new LedgerTransaction(transactionId, date, m.group(2));
+ }
+ catch (ParseException e) {
+ e.printStackTrace();
+ return String.format("Error parsing date '%s'", date);
+ }
+ state = ParserState.EXPECTING_TRANSACTION_DETAILS;
+ L(String.format(Locale.ENGLISH,
+ "transaction %d created for %s (%s) →" + " expecting details",
+ transactionId, date, m.group(2)));
+ }
+ break;
+
+ case EXPECTING_TRANSACTION_DETAILS:
+ if (line.isEmpty()) {
+ // transaction data collected
+
+ transaction.finishLoading();
+ transactions.add(transaction);
+
+ state = ParserState.EXPECTING_TRANSACTION;
+ L(String.format("transaction %s parsed → expecting transaction",
+ transaction.getId()));
+
+// sounds like a good idea, but transaction-1 may not be the first one chronologically
+// for example, when you add the initial seeding transaction after entering some others
+// if (transactionId == 1) {
+// L("This was the initial transaction.
+// Terminating " +
+// "parser");
+// break LINES;
+// }
+ }
+ else {
+ LedgerTransactionAccount lta = parseTransactionAccountLine(line);
+ if (lta != null) {
+ transaction.addAccount(lta);
+ L(String.format(Locale.ENGLISH, "%d: %s = %s", transaction.getId(),
+ lta.getAccountName(), lta.getAmount()));