/** * Modify a transaction before it is used to complete the panel for auto fill. The supplied * transaction must be a new or cloned transaction. It can't be a transaction that lives in the * map. The returned transaction can be the supplied reference or may be a new instance * * @param t The transaction to modify * @return the modified transaction */ private Transaction modifyTransactionForAutoComplete(final Transaction t) { // tweak the transaction t.setNumber(null); t.setReconciled(ReconciledState.NOT_RECONCILED); // clear both sides // set the last date as required if (!Options.rememberLastDateProperty().get()) { t.setDate(LocalDate.now()); } else { t.setDate(datePicker.getValue()); } // preserve any transaction entries that may have been entered first if (amountField.getLength() > 0) { Transaction newTrans = buildTransaction(); t.clearTransactionEntries(); t.addTransactionEntries(newTrans.getTransactionEntries()); } // preserve any preexisting memo field info if (memoTextField.getLength() > 0) { t.setMemo(memoTextField.getText()); } // Do not copy over attachments t.setAttachment(null); return t; }
@NotNull @Override public Transaction buildTransaction() { final Transaction transaction; if (tranType == TransactionType.ADDSHARE) { transaction = TransactionFactory.generateAddXTransaction( accountProperty().get(), securityComboBox.getValue(), priceField.getDecimal(), quantityField.getDecimal(), datePicker.getValue(), memoTextField.getText()); } else { transaction = TransactionFactory.generateRemoveXTransaction( accountProperty().get(), securityComboBox.getValue(), priceField.getDecimal(), quantityField.getDecimal(), datePicker.getValue(), memoTextField.getText()); } transaction.setNumber(numberComboBox.getValue()); return attachmentPane.buildTransaction(transaction); }
@FXML private void convertAction() { final Optional<Account> accountOptional = StaticAccountsMethods.selectAccount(null, accountProperty.get()); if (accountOptional.isPresent()) { final Account opp = accountOptional.get(); final Transaction t = new Transaction(); t.setDate(datePicker.getValue()); t.setNumber(numberComboBox.getValue()); t.setPayee(payeeTextField.getText()); final TransactionEntry entry = new TransactionEntry(); entry.setMemo(memoTextField.getText()); if (amountField.getDecimal().signum() >= 0) { entry.setCreditAccount(accountProperty.get()); entry.setDebitAccount(opp); } else { entry.setDebitAccount(accountProperty.get()); entry.setCreditAccount(opp); } entry.setCreditAmount(amountField.getDecimal().abs()); entry.setDebitAmount(amountField.getDecimal().abs().negate()); t.addTransactionEntry(entry); ReconcileManager.reconcileTransaction(accountProperty.get(), t, getReconciledState()); TransactionDialog.showAndWait( accountProperty.get(), t, optional -> { if (optional.isPresent()) { final Transaction tran = optional.get(); final Engine engine = EngineFactory.getEngine(EngineFactory.DEFAULT); Objects.requireNonNull(engine); if (engine.removeTransaction(modTrans)) { engine.addTransaction(tran); } clearForm(); } }); } }
/** * Changes and transaction number to the next available in the account and returns the resultant * * @param transaction transaction to change the check number * @return the resultant transaction */ private static Transaction changeTransNum(final Transaction transaction) { Engine engine = EngineFactory.getEngine(EngineFactory.DEFAULT); try { Transaction clone = (Transaction) transaction.clone(); clone.setNumber(getNextTransactionNum(transaction)); if (engine.removeTransaction(transaction)) { engine.addTransaction(clone); return clone; } } catch (CloneNotSupportedException e) { Logger.getLogger(PrintCheckFactory.class.getName()).log(Level.SEVERE, null, e); } return transaction; }
private Transaction generateTransaction( final String transactionClass, final Map<String, String> elementMap) { // logger.finest("Being generateTransaction"); switch (transactionClass) { case "SplitTransaction": logger.finest("Found SplitTransaction"); splitList.add(elementMap); return null; case "SplitEntryTransaction": logger.finest("Found SplitEntryTransaction"); splitEntryList.add(elementMap); return null; } // logger.finest("Building base transation"); Transaction transaction = null; Date actDate = decodeDate(elementMap.get("actTransDate")); Date date = decodeDate(elementMap.get("voucherDate")); String memo = elementMap.get("memo"); String payee = elementMap.get("payee"); String number = elementMap.get("number"); CurrencyNode node = decodeCurrency(elementMap.get("commodity")); // logger.finest(transactionClass); if (transactionClass.equals("AddXTransaction") || transactionClass.equals("RemoveXTransaction")) { BigDecimal price = new BigDecimal(elementMap.get("price")); BigDecimal quantity = new BigDecimal(elementMap.get("quantity")); Account investmentAccount = accountMap.get(elementMap.get("investmentAccount")); boolean reconciled = Boolean.parseBoolean(elementMap.get("reconciled")); SecurityNode sNode = EngineFactory.getEngine(EngineFactory.DEFAULT).getSecurity(elementMap.get("security")); transaction = new InvestmentTransaction(); AbstractInvestmentTransactionEntry entry; if (transactionClass.equals("AddXTransaction")) { entry = new TransactionEntryAddX(investmentAccount, sNode, price, quantity); } else { entry = new TransactionEntryRemoveX(investmentAccount, sNode, price, quantity); } entry.setMemo(memo); transaction.setDate(date); transaction.setDateEntered(actDate); transaction.setPayee(payee); transaction.addTransactionEntry(entry); transaction.setReconciled( investmentAccount, reconciled ? ReconciledState.RECONCILED : ReconciledState.NOT_RECONCILED); } if (transactionClass.equals("SplitXTransaction") || transactionClass.equals("MergeXTransaction")) { BigDecimal price = new BigDecimal(elementMap.get("price")); BigDecimal quantity = new BigDecimal(elementMap.get("quantity")); Account investmentAccount = accountMap.get(elementMap.get("investmentAccount")); boolean reconciled = Boolean.parseBoolean(elementMap.get("reconciled")); SecurityNode sNode = EngineFactory.getEngine(EngineFactory.DEFAULT).getSecurity(elementMap.get("security")); transaction = new InvestmentTransaction(); AbstractInvestmentTransactionEntry entry; if (transactionClass.equals("SplitXTransaction")) { entry = new TransactionEntrySplitX(investmentAccount, sNode, price, quantity); } else { entry = new TransactionEntryMergeX(investmentAccount, sNode, price, quantity); } entry.setMemo(memo); transaction.setDate(date); transaction.setDateEntered(actDate); transaction.setPayee(payee); transaction.addTransactionEntry(entry); transaction.setReconciled( investmentAccount, reconciled ? ReconciledState.RECONCILED : ReconciledState.NOT_RECONCILED); } if (transactionClass.equals("BuyXTransaction") || transactionClass.equals("SellXTransaction")) { BigDecimal fees = new BigDecimal(elementMap.get("fees")); BigDecimal price = new BigDecimal(elementMap.get("price")); BigDecimal quantity = new BigDecimal(elementMap.get("quantity")); Account investmentAccount = accountMap.get(elementMap.get("investmentAccount")); Account account = accountMap.get(elementMap.get("account")); boolean accountReconciled = Boolean.parseBoolean(elementMap.get("accountReconciled")); boolean investmentAccountReconciled = Boolean.parseBoolean(elementMap.get("investmentAccountReconciled")); SecurityNode sNode = EngineFactory.getEngine(EngineFactory.DEFAULT).getSecurity(elementMap.get("security")); BigDecimal exchangeRate = BigDecimal.ONE; if (sNode != null) { if (transactionClass.equals("BuyXTransaction")) { transaction = TransactionFactory.import1xBuyXTransaction( account, investmentAccount, sNode, price, quantity, exchangeRate, fees, date, memo); } else { transaction = TransactionFactory.import1xSellXTransaction( account, investmentAccount, sNode, price, quantity, exchangeRate, fees, date, memo); } transaction.setDateEntered(actDate); transaction.setPayee(payee); transaction.setReconciled( investmentAccount, investmentAccountReconciled ? ReconciledState.RECONCILED : ReconciledState.NOT_RECONCILED); transaction.setReconciled( account, accountReconciled ? ReconciledState.RECONCILED : ReconciledState.NOT_RECONCILED); } } if (transactionClass.equals("DividendTransaction")) { BigDecimal amount = new BigDecimal(elementMap.get("amount")); Account investmentAccount = accountMap.get(elementMap.get("investmentAccount")); Account account = accountMap.get(elementMap.get("account")); boolean accountReconciled = Boolean.parseBoolean(elementMap.get("accountReconciled")); boolean investmentAccountReconciled = Boolean.parseBoolean(elementMap.get("investmentAccountReconciled")); SecurityNode sNode = EngineFactory.getEngine(EngineFactory.DEFAULT).getSecurity(elementMap.get("security")); transaction = TransactionFactory.generateDividendXTransaction( investmentAccount, investmentAccount, account, sNode, amount, amount.negate(), amount, date, memo, accountReconciled); ReconcileManager.reconcileTransaction( investmentAccount, transaction, investmentAccountReconciled ? ReconciledState.RECONCILED : ReconciledState.NOT_RECONCILED); ReconcileManager.reconcileTransaction( account, transaction, accountReconciled ? ReconciledState.RECONCILED : ReconciledState.NOT_RECONCILED); } if (transactionClass.equals("ReinvestDivTransaction")) { BigDecimal fees = new BigDecimal(elementMap.get("fees")); BigDecimal price = new BigDecimal(elementMap.get("price")); BigDecimal quantity = new BigDecimal(elementMap.get("quantity")); SecurityNode sNode = EngineFactory.getEngine(EngineFactory.DEFAULT).getSecurity(elementMap.get("security")); Account investmentAccount = accountMap.get(elementMap.get("investmentAccount")); boolean reconciled = Boolean.parseBoolean(elementMap.get("reconciled")); transaction = new InvestmentTransaction(); AbstractInvestmentTransactionEntry entry = new TransactionEntryReinvestDivX(investmentAccount, sNode, price, quantity); entry.setMemo(memo); transaction.setDate(date); transaction.setDateEntered(actDate); transaction.setPayee(payee); transaction.addTransactionEntry(entry); if (fees.compareTo(BigDecimal.ZERO) > 0) { TransactionEntry fTran = new TransactionEntry(investmentAccount, fees.negate()); fTran.setMemo(memo); fTran.setTransactionTag(TransactionTag.INVESTMENT_FEE); transaction.addTransactionEntry(fTran); } transaction.setReconciled( investmentAccount, reconciled ? ReconciledState.RECONCILED : ReconciledState.NOT_RECONCILED); } switch (transactionClass) { case "SingleEntryTransaction": { BigDecimal amount = new BigDecimal(elementMap.get("amount")); Account account = accountMap.get(elementMap.get("account")); boolean reconciled = Boolean.parseBoolean(elementMap.get("reconciled")); transaction = TransactionFactory.generateSingleEntryTransaction( account, amount, date, reconciled, memo, payee, number); transaction.setDateEntered(actDate); break; } case "DoubleEntryTransaction": { Account creditAccount = accountMap.get(elementMap.get("creditAccount")); Account debitAccount = accountMap.get(elementMap.get("debitAccount")); BigDecimal amount = new BigDecimal(elementMap.get("amount")); boolean creditReconciled = Boolean.parseBoolean(elementMap.get("creditReconciled")); boolean debitReconciled = Boolean.parseBoolean(elementMap.get("debitReconciled")); transaction = new Transaction(); transaction.setDate(date); transaction.setDateEntered(actDate); transaction.setNumber(number); transaction.setPayee(payee); TransactionEntry entry = new TransactionEntry(); entry.setMemo(memo); entry.setCreditAccount(creditAccount); entry.setDebitAccount(debitAccount); if (creditAccount.getCurrencyNode().equals(node)) { entry.setCreditAmount(amount); } else { BigDecimal exchangeRate = new BigDecimal(elementMap.get("exchangeRate")); entry.setCreditAmount(amount.multiply(exchangeRate)); } if (debitAccount.getCurrencyNode().equals(node)) { entry.setDebitAmount(amount.negate()); } else { BigDecimal exchangeRate = new BigDecimal(elementMap.get("exchangeRate")); entry.setDebitAmount(amount.multiply(exchangeRate).negate()); } transaction.addTransactionEntry(entry); transaction.setReconciled( creditAccount, creditReconciled ? ReconciledState.RECONCILED : ReconciledState.NOT_RECONCILED); transaction.setReconciled( debitAccount, debitReconciled ? ReconciledState.RECONCILED : ReconciledState.NOT_RECONCILED); break; } } return transaction; }
void importTransactions(final XMLStreamReader reader) { logger.info("Begin transaction import"); try { parse: while (reader.hasNext()) { int event = reader.next(); switch (event) { case XMLStreamConstants.START_ELEMENT: if (reader.getAttributeCount() > 0 && reader.getAttributeValue(0).contains("Transaction")) { logger.finest("Found the start of a Transaction"); parseTransaction(reader); } break; case XMLStreamConstants.END_ELEMENT: if (reader.getLocalName().equals("objects")) { logger.fine("Found the end of the object list and transactions"); break parse; } break; default: break; } } } catch (XMLStreamException e) { logger.log(Level.SEVERE, e.toString(), e); } logger.log(Level.INFO, "Generating {0} Split Transactions", splitList.size()); /* loop through the lists and add split transactions */ for (Iterator<Map<String, String>> i = splitList.iterator(); i.hasNext(); ) { Map<String, String> map = i.next(); String id = map.get(ID); Transaction transaction = new Transaction(); transaction.setDate(decodeDate(map.get("voucherDate"))); transaction.setDateEntered(decodeDate(map.get("actTransDate"))); transaction.setNumber(map.get("number")); transaction.setPayee(map.get("payee")); transaction.setMemo(map.get("memo")); for (Iterator<Map<String, String>> j = this.splitEntryList.iterator(); j.hasNext(); ) { Map<String, String> entryMap = j.next(); if (entryMap.get("parent").equals(id)) { TransactionEntry entry = new TransactionEntry(); entry.setMemo(entryMap.get("memo")); Account creditAccount = accountMap.get(entryMap.get("creditAccount")); Account debitAccount = accountMap.get(entryMap.get("debitAccount")); boolean creditReconciled = Boolean.parseBoolean(entryMap.get("creditReconciled")); boolean debitReconciled = Boolean.parseBoolean(entryMap.get("debitReconciled")); entry.setCreditAccount(creditAccount); entry.setDebitAccount(debitAccount); CurrencyNode node = decodeCurrency(entryMap.get("commodity")); BigDecimal amount = new BigDecimal(entryMap.get("amount")); if (creditAccount.getCurrencyNode().equals(node)) { entry.setCreditAmount(amount); } else { BigDecimal exchangeRate = new BigDecimal(entryMap.get("exchangeRate")); entry.setCreditAmount(amount.multiply(exchangeRate)); } if (debitAccount.getCurrencyNode().equals(node)) { entry.setDebitAmount(amount.negate()); } else { BigDecimal exchangeRate = new BigDecimal(entryMap.get("exchangeRate")); entry.setDebitAmount(amount.multiply(exchangeRate).negate()); } transaction.addTransactionEntry(entry); transaction.setReconciled( creditAccount, creditReconciled ? ReconciledState.RECONCILED : ReconciledState.NOT_RECONCILED); transaction.setReconciled( debitAccount, debitReconciled ? ReconciledState.RECONCILED : ReconciledState.NOT_RECONCILED); j.remove(); } } assert transaction.size() > 0; Engine engine = EngineFactory.getEngine(EngineFactory.DEFAULT); if (!engine.addTransaction(transaction)) { logger.log(Level.SEVERE, "Failed to import transaction: {0}", id); } i.remove(); } logger.info("Transaction import complete"); }