From 7912d8c97bbabb4cadbd84492c4cee785175e70d Mon Sep 17 00:00:00 2001 From: Sean Reilly Date: Fri, 6 Mar 2015 15:09:00 +0000 Subject: [PATCH] Updated for Moneydance 2015 --- build.xml | 4 +- externals/moneydance/extadmin.jar | Bin 52835 -> 40228 bytes .../mdcsvimporter/CustomReaderData.java | 0 .../mdcsvimporter/CustomReaderDialog.form | 0 .../mdcsvimporter/CustomReaderDialog.java | 0 .../CustomTableCellRenderer.java | 90 +++++++-------- .../features/mdcsvimporter/DataField.java | 0 .../features/mdcsvimporter/ImportDialog.java | 19 ++-- .../modules/features/mdcsvimporter/Main.java | 9 +- .../mdcsvimporter/PreviewImportTblModel.java | 106 +++++++++--------- .../mdcsvimporter/PreviewImportWin.java | 2 +- .../mdcsvimporter/TransactionReader.java | 99 +++++++--------- .../mdcsvimporter/formats/CustomReader.java | 24 ++-- .../features/mdcsvimporter/CSVDataTest.java | 7 +- .../features/mdcsvimporter/CSVReaderTest.java | 3 +- .../mdcsvimporter/DateGuesserTest.java | 2 +- 16 files changed, 172 insertions(+), 193 deletions(-) mode change 100644 => 100755 src/com/moneydance/modules/features/mdcsvimporter/CustomReaderData.java mode change 100644 => 100755 src/com/moneydance/modules/features/mdcsvimporter/CustomReaderDialog.form mode change 100644 => 100755 src/com/moneydance/modules/features/mdcsvimporter/CustomReaderDialog.java mode change 100644 => 100755 src/com/moneydance/modules/features/mdcsvimporter/DataField.java mode change 100644 => 100755 src/com/moneydance/modules/features/mdcsvimporter/formats/CustomReader.java diff --git a/build.xml b/build.xml index 352bb81..729a982 100644 --- a/build.xml +++ b/build.xml @@ -77,8 +77,10 @@ - + + + diff --git a/externals/moneydance/extadmin.jar b/externals/moneydance/extadmin.jar index 97df34ebe451d013611252c3392e4a9449229131..9fe62149aba98bae37ac8904055d191d6d96deea 100644 GIT binary patch literal 40228 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 literal 52835 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%0Anzbz75ip;ed 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 SsiHuy% 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 Ng#iNM>-qWV{{e!vJ!t>{ diff --git a/src/com/moneydance/modules/features/mdcsvimporter/CustomReaderData.java b/src/com/moneydance/modules/features/mdcsvimporter/CustomReaderData.java old mode 100644 new mode 100755 diff --git a/src/com/moneydance/modules/features/mdcsvimporter/CustomReaderDialog.form b/src/com/moneydance/modules/features/mdcsvimporter/CustomReaderDialog.form old mode 100644 new mode 100755 diff --git a/src/com/moneydance/modules/features/mdcsvimporter/CustomReaderDialog.java b/src/com/moneydance/modules/features/mdcsvimporter/CustomReaderDialog.java old mode 100644 new mode 100755 diff --git a/src/com/moneydance/modules/features/mdcsvimporter/CustomTableCellRenderer.java b/src/com/moneydance/modules/features/mdcsvimporter/CustomTableCellRenderer.java index 1f5480e..d7072f2 100644 --- a/src/com/moneydance/modules/features/mdcsvimporter/CustomTableCellRenderer.java +++ b/src/com/moneydance/modules/features/mdcsvimporter/CustomTableCellRenderer.java @@ -1,45 +1,45 @@ -package com.moneydance.modules.features.mdcsvimporter; - -import java.awt.Color; -import java.awt.Component; -import javax.swing.JLabel; -import javax.swing.JTable; -import javax.swing.table.DefaultTableCellRenderer; - -/** - * - * @author stan - */ - - -public class CustomTableCellRenderer extends DefaultTableCellRenderer { - - int forRow = -1; - int forCol = -1; - - public void setForRowCol( int row, int col ) - { - forRow = row; - forCol = col; - } - - @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) - { - JLabel lbl = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); - - //Get the status for the current row. - PreviewImportTblModel tableModel = (PreviewImportTblModel) table.getModel(); - if ( (row == forRow || forRow < 0) && (col == forCol || forCol < 0) ) - { - lbl.setBackground( Color.RED ); - } - else - { - //lbl.setBackground( javax.swing.UIManager.getColor( "Table.dropCellBackground" ) ); - lbl.setBackground( Color.WHITE ); - } - //Return the JLabel which renders the cell. - return lbl; - } -} +package com.moneydance.modules.features.mdcsvimporter; + +import java.awt.Color; +import java.awt.Component; +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.table.DefaultTableCellRenderer; + +/** + * + * @author stan + */ + + +public class CustomTableCellRenderer extends DefaultTableCellRenderer { + + int forRow = -1; + int forCol = -1; + + public void setForRowCol( int row, int col ) + { + forRow = row; + forCol = col; + } + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) + { + JLabel lbl = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); + + //Get the status for the current row. + PreviewImportTblModel tableModel = (PreviewImportTblModel) table.getModel(); + if ( (row == forRow || forRow < 0) && (col == forCol || forCol < 0) ) + { + lbl.setBackground( Color.RED ); + } + else + { + //lbl.setBackground( javax.swing.UIManager.getColor( "Table.dropCellBackground" ) ); + lbl.setBackground( Color.WHITE ); + } + //Return the JLabel which renders the cell. + return lbl; + } +} diff --git a/src/com/moneydance/modules/features/mdcsvimporter/DataField.java b/src/com/moneydance/modules/features/mdcsvimporter/DataField.java old mode 100644 new mode 100755 diff --git a/src/com/moneydance/modules/features/mdcsvimporter/ImportDialog.java b/src/com/moneydance/modules/features/mdcsvimporter/ImportDialog.java index eb4a225..3911a61 100644 --- a/src/com/moneydance/modules/features/mdcsvimporter/ImportDialog.java +++ b/src/com/moneydance/modules/features/mdcsvimporter/ImportDialog.java @@ -14,8 +14,7 @@ */ package com.moneydance.modules.features.mdcsvimporter; -import com.moneydance.apps.md.model.Account; -import com.moneydance.apps.md.model.RootAccount; +import com.infinitekind.moneydance.model.*; import com.moneydance.apps.md.view.gui.MoneydanceGUI; import com.moneydance.apps.md.view.gui.OnlineManager; import static com.moneydance.modules.features.mdcsvimporter.TransactionReader.importDialog; @@ -33,8 +32,6 @@ import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JLabel; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; import javax.swing.filechooser.FileFilter; import javax.swing.JOptionPane; import javax.swing.KeyStroke; @@ -130,7 +127,7 @@ public void changedUpdate( DocumentEvent e ) skipDuringInit = false; this.setModal( false ); this.addEscapeListener( this ); - TransactionReader.init( customReaderDialog, this, main.getRootAccount() ); + TransactionReader.init( customReaderDialog, this, main.getAccountBook() ); } public static void addEscapeListener(final JDialog win) { @@ -337,10 +334,10 @@ else if ( runArgsHM.size() > 0 ) private void fillAccountCombo( Main main ) { - RootAccount rootAccount = main.getRootAccount(); + AccountBook book = main.getAccountBook(); comboAccount.removeAllItems(); - fillAccountCombo_( rootAccount ); + fillAccountCombo_(book.getRootAccount()); if ( comboAccount.getItemCount() > 0 ) { @@ -867,7 +864,7 @@ private void btnProcessActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRS Account account = (Account) comboAccount.getSelectedItem(); System.err.println( "starting transReader.parse..." ); - transReader.parse( main, csvData, account, main.getRootAccount() ); + transReader.parse( main, csvData, account, main.getAccountBook() ); csvReader.close(); System.out.println( "finished transReader.parse" ); @@ -1045,7 +1042,7 @@ private void PreviewImportBtnActionPerformed(java.awt.event.ActionEvent evt) {// //System.err.println( "starting transReader.parse..." ); //transReader.parse( main, csvData, account, main.getRootAccount() ); - transReader.setRootAccount( main.getRootAccount() ); + transReader.setAccountBook(main.getAccountBook()); PreviewImportWin previewImportWin = new PreviewImportWin(); previewImportWin.myInit( this, transReader, csvData, csvReader ); @@ -1313,7 +1310,7 @@ protected void fileChanged() // moving TransactionReader.customReaderDialog = customReaderDialog; setLabel( "FindAReader", "Find Reader" ); - TransactionReader[] fileFormats = TransactionReader.getCompatibleReaders( GET_COMPATIBLE_READERS, selectedFile, this, main.getRootAccount() ); + TransactionReader[] fileFormats = TransactionReader.getCompatibleReaders( GET_COMPATIBLE_READERS, selectedFile, this, main.getAccountBook() ); comboFileFormat.removeAllItems(); for ( TransactionReader reader : fileFormats ) @@ -1422,7 +1419,7 @@ protected void fileChanged2() // moving TransactionReader.customReaderDialog = customReaderDialog; setLabel( "FindAReader", "Find Reader" ); - TransactionReader[] fileFormats = TransactionReader.getCompatibleReaders( GET_ALL_READERS, selectedFile, this, main.getRootAccount() ); + TransactionReader[] fileFormats = TransactionReader.getCompatibleReaders( GET_ALL_READERS, selectedFile, this, main.getAccountBook() ); comboFileFormat.removeAllItems(); for ( TransactionReader reader : fileFormats ) diff --git a/src/com/moneydance/modules/features/mdcsvimporter/Main.java b/src/com/moneydance/modules/features/mdcsvimporter/Main.java index 3314ffd..5d211b3 100644 --- a/src/com/moneydance/modules/features/mdcsvimporter/Main.java +++ b/src/com/moneydance/modules/features/mdcsvimporter/Main.java @@ -14,9 +14,9 @@ */ package com.moneydance.modules.features.mdcsvimporter; +import com.infinitekind.moneydance.model.AccountBook; import com.moneydance.apps.md.controller.FeatureModule; import com.moneydance.apps.md.controller.FeatureModuleContext; -import com.moneydance.apps.md.model.RootAccount; import java.awt.Image; import java.io.IOException; import java.util.ArrayList; @@ -50,8 +50,7 @@ public class Main { try { - image = ImageIO.read( - Main.class.getResourceAsStream( "import.png" ) ); + image = ImageIO.read( Main.class.getResourceAsStream( "import.png" ) ); } catch ( IOException x ) { @@ -88,10 +87,10 @@ public void init() context.registerFeature( this, "import", image, "Import File" ); } - RootAccount getRootAccount() + AccountBook getAccountBook() { FeatureModuleContext context = getContext(); - return context.getRootAccount(); + return context.getCurrentAccountBook(); } JFrame getMoneydanceWindow() diff --git a/src/com/moneydance/modules/features/mdcsvimporter/PreviewImportTblModel.java b/src/com/moneydance/modules/features/mdcsvimporter/PreviewImportTblModel.java index b7cab56..a58420b 100644 --- a/src/com/moneydance/modules/features/mdcsvimporter/PreviewImportTblModel.java +++ b/src/com/moneydance/modules/features/mdcsvimporter/PreviewImportTblModel.java @@ -1,53 +1,53 @@ -package com.moneydance.modules.features.mdcsvimporter; - -import java.util.ArrayList; -import javax.swing.table.AbstractTableModel; - -/** - * - * @author stan - */ - - -public class PreviewImportTblModel extends AbstractTableModel -{ - private ArrayListcolNames; - private String[][] data; - - public PreviewImportTblModel( ArrayList colNamesArg, String[][] dataArg ) - { - colNames = colNamesArg; - data = dataArg; - - System.err.println( "row count =" + data.length ); - System.err.println( "col count =" + data[0].length ); - } - - public int getColumnCount() { return data[0].length; } - public int getRowCount() { return data.length;} - public Object getValueAt(int row, int col) - { - //System.err.println( "getValueAt row =" + row + " col =" + col ); - try { - if ( data[row][col] == "" ) - { - //System.err.println( "NOT EXISTS getValueAt row =" + row + " col =" + col ); - } - } - catch( Exception ex ) - { - return ""; - } - return data[row][col]; - } - - public String getColumnName(int col) { - return colNames.get( col ); - } - - /* - public int getColumnCount() { return 10; } - public int getRowCount() { return 10;} - public Object getValueAt(int row, int col) { return new Integer(row*col); } - */ -} +package com.moneydance.modules.features.mdcsvimporter; + +import java.util.ArrayList; +import javax.swing.table.AbstractTableModel; + +/** + * + * @author stan + */ + + +public class PreviewImportTblModel extends AbstractTableModel +{ + private ArrayListcolNames; + private String[][] data; + + public PreviewImportTblModel( ArrayList colNamesArg, String[][] dataArg ) + { + colNames = colNamesArg; + data = dataArg; + + System.err.println( "row count =" + data.length ); + System.err.println( "col count =" + data[0].length ); + } + + public int getColumnCount() { return data[0].length; } + public int getRowCount() { return data.length;} + public Object getValueAt(int row, int col) + { + //System.err.println( "getValueAt row =" + row + " col =" + col ); + try { + if ( data[row][col] == "" ) + { + //System.err.println( "NOT EXISTS getValueAt row =" + row + " col =" + col ); + } + } + catch( Exception ex ) + { + return ""; + } + return data[row][col]; + } + + public String getColumnName(int col) { + return colNames.get( col ); + } + + /* + public int getColumnCount() { return 10; } + public int getRowCount() { return 10;} + public Object getValueAt(int row, int col) { return new Integer(row*col); } + */ +} diff --git a/src/com/moneydance/modules/features/mdcsvimporter/PreviewImportWin.java b/src/com/moneydance/modules/features/mdcsvimporter/PreviewImportWin.java index f71dd17..7b40ca4 100644 --- a/src/com/moneydance/modules/features/mdcsvimporter/PreviewImportWin.java +++ b/src/com/moneydance/modules/features/mdcsvimporter/PreviewImportWin.java @@ -68,7 +68,7 @@ public void myInit( ImportDialog importDialog, TransactionReader transReaderArg, for ( ; fieldIndex < maxFieldIndex; fieldIndex ++ ) { String dataTypeExpecting = transReader.getCustomReaderData().getDataTypesList().get( fieldIndex ); - System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= fieldIndex = " + fieldIndex ); + //System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= fieldIndex = " + fieldIndex ); if ( dataTypeExpecting.equalsIgnoreCase( DATA_TYPE_IGNORE_REST ) ) { diff --git a/src/com/moneydance/modules/features/mdcsvimporter/TransactionReader.java b/src/com/moneydance/modules/features/mdcsvimporter/TransactionReader.java index d7255dd..42af529 100644 --- a/src/com/moneydance/modules/features/mdcsvimporter/TransactionReader.java +++ b/src/com/moneydance/modules/features/mdcsvimporter/TransactionReader.java @@ -14,23 +14,12 @@ */ package com.moneydance.modules.features.mdcsvimporter; -import com.moneydance.apps.md.model.TransactionSet; -import com.moneydance.apps.md.model.Account; -import com.moneydance.apps.md.model.RootAccount; -import com.moneydance.apps.md.model.CurrencyType; -import com.moneydance.apps.md.model.AbstractTxn; -import com.moneydance.apps.md.model.OnlineTxn; -import com.moneydance.apps.md.model.OnlineTxnList; -import com.moneydance.apps.md.model.ParentTxn; -import com.moneydance.apps.md.model.SplitTxn; - -import com.moneydance.apps.md.model.TxnSet; +import com.infinitekind.moneydance.model.*; import com.moneydance.apps.md.view.gui.MoneydanceGUI; import com.moneydance.apps.md.view.gui.OnlineManager; import com.moneydance.modules.features.mdcsvimporter.formats.CustomReader; import java.io.File; import java.io.FileInputStream; -import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; @@ -53,7 +42,7 @@ public abstract class TransactionReader protected static ImportDialog importDialog = null; protected static CustomReaderDialog customReaderDialog = null; - protected static RootAccount rootAccount = null; + protected static AccountBook book = null; protected CSVData csvData; protected Account account; @@ -98,16 +87,16 @@ protected final void throwException( String message ) throw new IOException( message ); } - public static void init( CustomReaderDialog customReaderDialogArg, ImportDialog importDialogArg, RootAccount rootAccountArg ) + public static void init( CustomReaderDialog customReaderDialogArg, ImportDialog importDialogArg, AccountBook accountBookArg ) { customReaderDialog = customReaderDialogArg; importDialog = importDialogArg; - rootAccount = rootAccountArg; + book = accountBookArg; } - - protected final void setRootAccount( RootAccount rootAccount ) + + protected final void setAccountBook(AccountBook book) { - this.rootAccount = rootAccount; + this.book = book; } public final String calcFITxnIdAbstract( AbstractTxn atxn ) @@ -140,7 +129,7 @@ public final String calcFITxnIdAbstract( AbstractTxn atxn ) */ - String origtxn = atxn.getTag( "ol.orig-txn" ); + String origtxn = atxn.getParameter("ol.orig-txn"); //String origCheckNumber = origtxn.replaceAll( ".*\\\"chknum\\\" = \\\"(.*?)\\\"\\\n.*", "$1" ); //System.out.println( "\norigtxn ="+origtxn + "=" ); @@ -182,20 +171,20 @@ public final String calcFITxnIdAbstract( AbstractTxn atxn ) //long value = atxn.getParentTxn().getValue(); - if ( atxn.getTag( "ol.orig-payee" ) == null ) + if ( atxn.getParameter("ol.orig-payee") == null ) { desc = atxn.getDescription(); } else { - desc = atxn.getTag( "ol.orig-payee" ); + desc = atxn.getParameter("ol.orig-payee"); } // This new way compare using the ORIGINAL payee and memo fields so if the user changes them, it will still match. Stan String tmp = atxn.getDateInt() + ":" + amt + ":" + desc + ":" + (origCheckNumber == null ? "" : origCheckNumber.replaceAll( "^0*(.*)", "$1" ) ) // strip leading 0's - + ":" + (atxn.getTag( "ol.orig-memo" ) == null ? "" : atxn.getTag( "ol.orig-memo" )); + + ":" + (atxn.getParameter("ol.orig-memo") == null ? "" : atxn.getParameter("ol.orig-memo")); //System.err.println( "calc abstract FITxnld >" + tmp + "<" ); return tmp; @@ -241,14 +230,14 @@ private final void makeSetOfExistingTxns( TxnSet tset ) /* ************************************************************************************************ */ - public final void parse( Main main, CSVData csvDataArg, Account accountIn, RootAccount rootAccount ) + public final void parse( Main main, CSVData csvDataArg, Account accountIn, AccountBook book) throws IOException { System.err.println("\n--------- entered TransactionReader().parse() -------------"); this.csvData = csvDataArg; - this.rootAccount = rootAccount; - this.txnSet = rootAccount.getTransactionSet(); + this.book = book; + this.txnSet = book.getTransactionSet(); this.tsetMatcherKey = new HashSet(); this.tsetFITxnIdMatcherKey = new HashSet(); @@ -396,7 +385,7 @@ public final void parse( Main main, CSVData csvDataArg, Account accountIn, RootA } else { - this.account = rootAccount.getAccountByName( accountNameFromCSV ); + this.account = book.getRootAccount().getAccountByName( accountNameFromCSV ); System.out.println( "accountNameFromCSV: " + accountNameFromCSV ); if ( this.account == null ) { @@ -469,7 +458,7 @@ public final void parse( Main main, CSVData csvDataArg, Account accountIn, RootA else { System.err.println( "add new parentTxn/splitTxn" ); - ParentTxn pTxn = onlineToParentTxn( account, rootAccount, txn ); + ParentTxn pTxn = onlineToParentTxn( account, book, txn ); if ( pTxn != null ) { txnSet.addNewTxn( pTxn ); @@ -550,7 +539,7 @@ public final void parse( Main main, CSVData csvDataArg, Account accountIn, RootA * Note: Create a ParentTxn from a filled out OnlineTxn */ // @ Override - protected ParentTxn onlineToParentTxn( Account account, RootAccount rootAccount, OnlineTxn oTxn ) + protected ParentTxn onlineToParentTxn( Account account, AccountBook book, OnlineTxn oTxn ) throws IOException { Account category = null; @@ -565,13 +554,13 @@ protected ParentTxn onlineToParentTxn( Account account, RootAccount rootAccount, oTxn.setAmount( - oTxn.getAmount() ); oTxn.setTotalAmount( - oTxn.getTotalAmount() ); - ParentTxn pTxn = new ParentTxn( oTxn.getDateInitiatedInt(), oTxn.getDateInitiatedInt(), oTxn.getDateInitiatedInt() + ParentTxn pTxn = ParentTxn.makeParentTxn(book, oTxn.getDateInitiatedInt(), oTxn.getDateInitiatedInt(), oTxn.getDateInitiatedInt() , ckNum, account, oTxn.getName(), oTxn.getMemo() , -1, AbstractTxn.STATUS_UNRECONCILED ); try { System.err.println( "find category for oTxn.getSubAccountTo() =" + oTxn.getSubAccountTo() + "=" ); - category = getAccount( account, oTxn.getSubAccountTo(), com.moneydance.apps.md.model.AccountUtil.getDefaultCategoryForAcct( account ).getAccountName() //rr.getString("default_category"), - , oTxn.getAmount() <= 0 ? Account.ACCOUNT_TYPE_EXPENSE : Account.ACCOUNT_TYPE_INCOME ); + category = getAccount( account, oTxn.getSubAccountTo(), AccountUtil.getDefaultCategoryForAcct( account ).getAccountName() //rr.getString("default_category"), + , oTxn.getAmount() <= 0 ? Account.AccountType.EXPENSE : Account.AccountType.INCOME ); System.err.println( "found category =" + category + "=" ); } catch (Exception ex) { @@ -579,9 +568,9 @@ protected ParentTxn onlineToParentTxn( Account account, RootAccount rootAccount, return null; // skip this transaction - do not add } - SplitTxn sptxn = new SplitTxn( pTxn, oTxn.getAmount(), oTxn.getAmount(), 1.0 - , category //com.moneydance.apps.md.model.AccountUtil.getDefaultCategoryForAcct(account) /* category */ - , pTxn.getDescription(), -1, AbstractTxn.STATUS_UNRECONCILED ); + SplitTxn sptxn = SplitTxn.makeSplitTxn(pTxn, oTxn.getAmount(), oTxn.getAmount(), 1.0, + category, //com.moneydance.apps.md.model.AccountUtil.getDefaultCategoryForAcct(account) /* category */ + pTxn.getDescription(), -1, AbstractTxn.STATUS_UNRECONCILED ); sptxn.setIsNew( true ); pTxn.addSplit( sptxn ); @@ -608,7 +597,7 @@ public int getNumberOfCustomReaderFieldsUsed() return this.customReaderDialog.getNumberOfCustomReaderFieldsUsed(); } - public static TransactionReader[] getCompatibleReaders( boolean getAllReadersList, File selectedFile, ImportDialog importDialogArg, RootAccount rootAccount ) + public static TransactionReader[] getCompatibleReaders( boolean getAllReadersList, File selectedFile, ImportDialog importDialogArg, AccountBook book) { ArrayList formats = new ArrayList(); // moving importDialog = importDialogArg; @@ -636,7 +625,7 @@ public static TransactionReader[] getCompatibleReaders( boolean getAllReadersLis } CSVData csvData = new CSVData( csvReader ); - transactionReader.setRootAccount( rootAccount ); + transactionReader.setAccountBook(TransactionReader.book); if ( getAllReadersList ) { System.err.println( "=============== add all readers for >" + key + "< ===============" ); @@ -763,14 +752,14 @@ public void setUsingCategorynameFlag(boolean xx) { /** Find and return the ACCOUNT field in the appropriate format. */ private final Account getAccount( Account account, String categoryName, String defaultAccount, - int defaultAcctType ) + Account.AccountType defaultAcctType ) throws Exception { //String acctStr = getField(fieldValues, 1 /*ACCOUNT*/, null); if ( categoryName == null ) return addNewAccount( defaultAccount, account.getCurrencyType(), - rootAccount, "", defaultAcctType, true, -1 ); + book.getRootAccount(), "", defaultAcctType, true, -1 ); //acctStr = acctStr.trim(); - return addNewAccount( categoryName, account.getCurrencyType(), rootAccount, "", + return addNewAccount( categoryName, account.getCurrencyType(), book.getRootAccount(), "", defaultAcctType, true, -1 ); } @@ -781,12 +770,12 @@ private final Account getAccount( Account account, String categoryName, String d private Account addNewAccount( String accountName, CurrencyType currencyType, Account parentAccount, String description, - int accountType, boolean lenientMatch, + Account.AccountType accountType, boolean lenientMatch, int currAccountId) throws Exception { if(accountName.indexOf(':')==0 && - parentAccount.getAccountType()==Account.ACCOUNT_TYPE_ROOT) { + parentAccount.getAccountType()==Account.AccountType.ROOT) { accountName = accountName.substring(1); } @@ -813,14 +802,10 @@ private Account addNewAccount( String accountName, CurrencyType currencyType, } if(newAccount==null) { - newAccount = - Account.makeAccount(accountType, thisAcctName, currencyType, parentAccount); - if(newAccount instanceof com.moneydance.apps.md.model.BankAccount) { - ((com.moneydance.apps.md.model.BankAccount)newAccount).setBankName(description); - } else if(newAccount instanceof com.moneydance.apps.md.model.InvestmentAccount) { - (( com.moneydance.apps.md.model.InvestmentAccount)newAccount).setAccountDescription(description); - } - parentAccount.addSubAccount(newAccount); + newAccount = Legacy.makeAccount(book, accountType, thisAcctName, currencyType, parentAccount); + newAccount.setBankName(description); + newAccount.setAccountDescription(description); + newAccount.syncItem(); } if(restOfAcctName!=null) { @@ -831,19 +816,13 @@ private Account addNewAccount( String accountName, CurrencyType currencyType, if(newAccount.getAccountNum()==currAccountId) { // if the found account is the same as the container account // create another account with the same name and return it - if(accountType==Account.ACCOUNT_TYPE_BANK && - parentAccount==rootAccount) { - newAccount = Account.makeAccount(Account.ACCOUNT_TYPE_INCOME, - thisAcctName+"X", currencyType, - parentAccount); + if(accountType==Account.AccountType.BANK && parentAccount == book.getRootAccount()) { + newAccount = Legacy.makeAccount(book, Account.AccountType.INCOME, thisAcctName+"X", currencyType, parentAccount); } else { - newAccount = Account.makeAccount(accountType, thisAcctName+"X", - currencyType, parentAccount); - } - if(newAccount instanceof com.moneydance.apps.md.model.BankAccount) { - (( com.moneydance.apps.md.model.BankAccount)newAccount).setBankName(description); + newAccount = Legacy.makeAccount(book, accountType, thisAcctName+"X", currencyType, parentAccount); } - parentAccount.addSubAccount(newAccount); + newAccount.setBankName(description); + newAccount.syncItem(); } return newAccount; } diff --git a/src/com/moneydance/modules/features/mdcsvimporter/formats/CustomReader.java b/src/com/moneydance/modules/features/mdcsvimporter/formats/CustomReader.java old mode 100644 new mode 100755 index 49399f9..dc4a825 --- a/src/com/moneydance/modules/features/mdcsvimporter/formats/CustomReader.java +++ b/src/com/moneydance/modules/features/mdcsvimporter/formats/CustomReader.java @@ -14,7 +14,7 @@ */ package com.moneydance.modules.features.mdcsvimporter.formats; -import com.moneydance.apps.md.model.OnlineTxn; +import com.infinitekind.moneydance.model.OnlineTxn; import com.moneydance.modules.features.mdcsvimporter.CSVData; import com.moneydance.modules.features.mdcsvimporter.CustomReaderData; import com.moneydance.modules.features.mdcsvimporter.TransactionReader; @@ -198,12 +198,12 @@ public boolean canParse( CSVData data ) for ( ; retVal && fieldIndex < maxFieldIndex; fieldIndex ++ ) { String dataTypeExpecting = getCustomReaderData().getDataTypesList().get( fieldIndex ); - System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= fieldIndex = " + fieldIndex ); + //System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= fieldIndex = " + fieldIndex ); data.nextField(); // if ( ! data.nextField() ) // { -// System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but have no data left." ); +// //System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but have no data left." ); // retVal = false; // break; // } @@ -239,7 +239,7 @@ else if ( ( fieldString == null || fieldString.equals( DATA_TYPE_BLANK ) ) ) { if ( ! getCustomReaderData().getEmptyFlagsList().get( fieldIndex ).equals( "Can Be Blank" ) ) { - System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but got no value =" + fieldString + "= and STOP ON ERROR" ); + //System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but got no value =" + fieldString + "= and STOP ON ERROR" ); retVal = false; break; } @@ -366,10 +366,10 @@ else if ( dataTypeExpecting.equalsIgnoreCase( DATA_TYPE_ACCOUNT_NAME ) ) System.err.println( "accountName >" + fieldString + "<" ); accountName = fieldString; - if ( rootAccount.getAccountByName( accountName ) == null ) + if ( book.getRootAccount().getAccountByName( accountName ) == null ) { - System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but that account does not exist =" + fieldString + "= will not import it." ); -// System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but that account does not exist =" + fieldString + "= and STOP ON ERROR" ); + //System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but that account does not exist =" + fieldString + "= will not import it." ); +// //System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but that account does not exist =" + fieldString + "= and STOP ON ERROR" ); // retVal = false; // break; } @@ -439,7 +439,7 @@ protected boolean parseNext() throws IOException for ( ; fieldIndex < maxFieldIndex; fieldIndex ++ ) { String dataTypeExpecting = getCustomReaderData().getDataTypesList().get( fieldIndex ); - System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= EmptyFlagsList = " + getCustomReaderData().getEmptyFlagsList().get( fieldIndex ) + "=" ); + //System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= EmptyFlagsList = " + getCustomReaderData().getEmptyFlagsList().get( fieldIndex ) + "=" ); csvData.nextField(); String fieldString = csvData.getField(); @@ -475,7 +475,7 @@ else if ( ( fieldString == null || fieldString.equals( "" ) ) && ! getCustomReaderData().getEmptyFlagsList().get( fieldIndex ) .equals( "Can Be Blank" ) ) { - System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but got no value =" + fieldString + "= and STOP ON ERROR" ); + //System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but got no value =" + fieldString + "= and STOP ON ERROR" ); throwException( "dataTypeExpecting =" + dataTypeExpecting + "= but got no value =" + fieldString + "= and STOP ON ERROR" ); } @@ -604,10 +604,10 @@ else if ( dataTypeExpecting.equalsIgnoreCase( DATA_TYPE_ACCOUNT_NAME ) ) System.err.println( "accountName >" + fieldString + "<" ); accountName = fieldString; - if ( rootAccount.getAccountByName( accountName ) == null ) + if ( book.getRootAccount().getAccountByName( accountName ) == null ) { - System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but that account does not exist =" + fieldString + "= will not import it." ); -// System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but that account does not exist =" + fieldString + "= and STOP ON ERROR" ); + //System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but that account does not exist =" + fieldString + "= will not import it." ); +// //System.err.println( "dataTypeExpecting =" + dataTypeExpecting + "= but that account does not exist =" + fieldString + "= and STOP ON ERROR" ); // throwException( "dataTypeExpecting =" + dataTypeExpecting + "= but that account does not exist =" + fieldString + "= and STOP ON ERROR" ); return false; // skip this line } diff --git a/test/com/moneydance/modules/features/mdcsvimporter/CSVDataTest.java b/test/com/moneydance/modules/features/mdcsvimporter/CSVDataTest.java index cf2973b..095ff75 100644 --- a/test/com/moneydance/modules/features/mdcsvimporter/CSVDataTest.java +++ b/test/com/moneydance/modules/features/mdcsvimporter/CSVDataTest.java @@ -4,7 +4,7 @@ */ package com.moneydance.modules.features.mdcsvimporter; -import com.moneydance.apps.md.model.Account; +import com.infinitekind.moneydance.model.*; import java.io.FileReader; import java.io.IOException; import java.io.StringReader; @@ -64,10 +64,11 @@ public void simpleTest1() throws IOException { StringReader data = new StringReader( test1 ); - CSVReader csvReader = new CSVReader( data ); + CustomReaderData readerData = new CustomReaderData(); + CSVReader csvReader = new CSVReader( data, readerData); CSVData csvData = new CSVData( csvReader ); - csvData.parseIntoLines( ',' ); + csvData.parseIntoLines( readerData ); System.out.println( "finished transReader.parse" ); diff --git a/test/com/moneydance/modules/features/mdcsvimporter/CSVReaderTest.java b/test/com/moneydance/modules/features/mdcsvimporter/CSVReaderTest.java index ee875a1..fdbd7eb 100644 --- a/test/com/moneydance/modules/features/mdcsvimporter/CSVReaderTest.java +++ b/test/com/moneydance/modules/features/mdcsvimporter/CSVReaderTest.java @@ -61,7 +61,8 @@ public void simpleTest1() throws IOException { StringReader data = new StringReader( test1 ); - CSVReader cvsReader = new CSVReader( data ); + CustomReaderData parseParameters = new CustomReaderData(); + CSVReader cvsReader = new CSVReader( data, parseParameters ); doTest1( cvsReader ); } diff --git a/test/com/moneydance/modules/features/mdcsvimporter/DateGuesserTest.java b/test/com/moneydance/modules/features/mdcsvimporter/DateGuesserTest.java index 4461eb6..3f95866 100644 --- a/test/com/moneydance/modules/features/mdcsvimporter/DateGuesserTest.java +++ b/test/com/moneydance/modules/features/mdcsvimporter/DateGuesserTest.java @@ -66,7 +66,7 @@ public void testCheckDateString() { Reader file = new InputStreamReader( DateGuesserTest.class.getResourceAsStream( "dateGuesser.csv" ) ); - CSVReader reader = new CSVReader( file ); + CSVReader reader = new CSVReader( ); DateGuesser guesser = new DateGuesser(); while ( reader.nextLine() ) {