From 2d2b1b42f0c9551e838bfa1ea2794c0d37913452 Mon Sep 17 00:00:00 2001 From: sononio Date: Mon, 8 Jan 2018 23:10:40 +0300 Subject: [PATCH 01/11] CSV Export button added --- app/src/main/res/layout/fragment_export_form.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/res/layout/fragment_export_form.xml b/app/src/main/res/layout/fragment_export_form.xml index 162b3f58f..45cb91273 100644 --- a/app/src/main/res/layout/fragment_export_form.xml +++ b/app/src/main/res/layout/fragment_export_form.xml @@ -91,7 +91,13 @@ + Date: Tue, 9 Jan 2018 00:28:40 +0300 Subject: [PATCH 02/11] CSV Export completed --- .../android/export/ExportAsyncTask.java | 6 +- .../gnucash/android/export/ExportFormat.java | 5 +- .../android/export/csv/CsvExporter.java | 206 ++++++++++++++++++ .../android/ui/export/ExportFormFragment.java | 9 + 4 files changed, 223 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/gnucash/android/export/csv/CsvExporter.java diff --git a/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java b/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java index 9b7b9fb3f..d267bdb5f 100644 --- a/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java +++ b/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java @@ -57,6 +57,7 @@ import org.gnucash.android.db.adapter.DatabaseAdapter; import org.gnucash.android.db.adapter.SplitsDbAdapter; import org.gnucash.android.db.adapter.TransactionsDbAdapter; +import org.gnucash.android.export.csv.CsvExporter; import org.gnucash.android.export.ofx.OfxExporter; import org.gnucash.android.export.qif.QifExporter; import org.gnucash.android.export.xml.GncXmlExporter; @@ -217,7 +218,7 @@ private void dismissProgressDialog() { /** * Returns an exporter corresponding to the user settings. - * @return Object of one of {@link QifExporter}, {@link OfxExporter} or {@link GncXmlExporter} + * @return Object of one of {@link QifExporter}, {@link OfxExporter} or {@link GncXmlExporter} or {@Link CsvExporter} */ private Exporter getExporter() { switch (mExportParams.getExportFormat()) { @@ -228,8 +229,9 @@ private Exporter getExporter() { return new OfxExporter(mExportParams, mDb); case XML: - default: return new GncXmlExporter(mExportParams, mDb); + default: + return new CsvExporter(mExportParams, mDb); } } diff --git a/app/src/main/java/org/gnucash/android/export/ExportFormat.java b/app/src/main/java/org/gnucash/android/export/ExportFormat.java index 99ca1a347..d86bd94be 100644 --- a/app/src/main/java/org/gnucash/android/export/ExportFormat.java +++ b/app/src/main/java/org/gnucash/android/export/ExportFormat.java @@ -22,7 +22,8 @@ public enum ExportFormat { QIF("Quicken Interchange Format"), OFX("Open Financial eXchange"), - XML("GnuCash XML"); + XML("GnuCash XML"), + CSV("GnuCash CSV"); /** * Full name of the export format acronym @@ -45,6 +46,8 @@ public String getExtension(){ return ".ofx"; case XML: return ".gnca"; + case CSV: + return ".csv"; default: return ".txt"; } diff --git a/app/src/main/java/org/gnucash/android/export/csv/CsvExporter.java b/app/src/main/java/org/gnucash/android/export/csv/CsvExporter.java new file mode 100644 index 000000000..afe00b5e8 --- /dev/null +++ b/app/src/main/java/org/gnucash/android/export/csv/CsvExporter.java @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2014 - 2015 Ngewi Fet + * Copyright (c) 2014 Yongxin Wang + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gnucash.android.export.csv; + +import org.gnucash.android.export.xml.*; + +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.Uri; +import android.util.Log; + +import com.crashlytics.android.Crashlytics; + +import org.gnucash.android.app.GnuCashApplication; +import org.gnucash.android.db.DatabaseSchema; +import org.gnucash.android.db.adapter.BooksDbAdapter; +import org.gnucash.android.db.adapter.CommoditiesDbAdapter; +import org.gnucash.android.db.adapter.RecurrenceDbAdapter; +import org.gnucash.android.db.adapter.TransactionsDbAdapter; +import org.gnucash.android.export.ExportFormat; +import org.gnucash.android.export.ExportParams; +import org.gnucash.android.export.Exporter; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.AccountType; +import org.gnucash.android.model.BaseModel; +import org.gnucash.android.model.Book; +import org.gnucash.android.model.Budget; +import org.gnucash.android.model.BudgetAmount; +import org.gnucash.android.model.Commodity; +import org.gnucash.android.model.Money; +import org.gnucash.android.model.PeriodType; +import org.gnucash.android.model.Price; +import org.gnucash.android.model.Recurrence; +import org.gnucash.android.model.ScheduledAction; +import org.gnucash.android.model.Split; +import org.gnucash.android.model.Transaction; +import org.gnucash.android.model.TransactionType; +import org.gnucash.android.util.BookUtils; +import org.gnucash.android.util.TimestampHelper; +import org.xmlpull.v1.XmlPullParserFactory; +import org.xmlpull.v1.XmlSerializer; + +import java.io.BufferedOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.zip.GZIPOutputStream; + +import static org.gnucash.android.db.DatabaseSchema.ScheduledActionEntry; +import static org.gnucash.android.db.DatabaseSchema.SplitEntry; +import static org.gnucash.android.db.DatabaseSchema.TransactionEntry; + +/** + * Creates a GnuCash XML representation of the accounts and transactions + * + * @author Ngewi Fet + * @author Yongxin Wang + */ +public class CsvExporter extends Exporter{ + + /** + * Root account for template accounts + */ + private Account mRootTemplateAccount; + private Map mTransactionToTemplateAccountMap = new TreeMap<>(); + + /** + * Construct a new exporter with export parameters + * @param params Parameters for the export + */ + public CsvExporter(ExportParams params) { + super(params, null); + LOG_TAG = "GncXmlExporter"; + } + + /** + * Overloaded constructor. + * Creates an exporter with an already open database instance. + * @param params Parameters for the export + * @param db SQLite database + */ + public CsvExporter(ExportParams params, SQLiteDatabase db) { + super(params, db); + LOG_TAG = "GncXmlExporter"; + } + + @Override + public List generateExport() throws ExporterException { + OutputStreamWriter writer = null; + String outputFile = getExportCacheFilePath(); + try { + FileOutputStream fileOutputStream = new FileOutputStream(outputFile); + BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); + writer = new OutputStreamWriter(bufferedOutputStream); + + generateExport(writer); + } catch (IOException ex){ + Crashlytics.log("Error exporting XML"); + Crashlytics.logException(ex); + } finally { + if (writer != null) { + try { + writer.close(); + } catch (IOException e) { + throw new ExporterException(mExportParams, e); + } + } + } + + List exportedFiles = new ArrayList<>(); + exportedFiles.add(outputFile); + + return exportedFiles; + } + + public void generateExport(final Writer writer) throws ExporterException { + try { + String separator = ","; + List names = new ArrayList(); + names.add("type"); + names.add("full_name"); + names.add("name"); + names.add("code"); + names.add("description"); + names.add("color"); + names.add("notes"); + names.add("commoditym"); + names.add("commodityn"); + names.add("hidden"); + names.add("tax"); + names.add("place_holder"); + + + List transactions = mTransactionsDbAdapter.getAllTransactions(); + List budgets = mBudgetsDbAdapter.getAllRecords(); + List accounts = mAccountsDbAdapter.getAllRecords(); + List commodities = mCommoditiesDbAdapter.getAllRecords(); + List prices = mPricesDbAdapter.getAllRecords(); + List scheduledActions = mScheduledActionDbAdapter.getAllRecords(); + List splits = mSplitsDbAdapter.getAllRecords(); + + + for(int i = 0; i < names.size(); i++) { + writer.write(names.get(i) + separator); + } + writer.write('\n'); + for(int i = 0; i < accounts.size(); i++) { + Account account = accounts.get(i); + + writer.write(account.getAccountType().toString() + separator); + writer.write(account.getFullName() + separator); + writer.write(account.getName() + separator); + + //Code + writer.write(separator); + + writer.write(account.getDescription() + separator); + writer.write(account.getColor() + separator); + + //Notes + writer.write(separator); + + writer.write(account.getCommodity().getCurrencyCode() + separator); + writer.write("CURRENCY" + separator); + writer.write(account.isHidden()?"T":"F" + separator); + + //Not exactly + writer.write("F" + separator); + + writer.write(account.isPlaceholderAccount()?"T":"F" + separator); + + + //writer.write(); + + writer.write('\n'); + } + } catch (Exception e) { + Crashlytics.logException(e); + throw new ExporterException(mExportParams, e); + } + } +} diff --git a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java index 90503473f..2449792b4 100644 --- a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java @@ -137,6 +137,7 @@ public class ExportFormFragment extends Fragment implements @BindView(R.id.radio_ofx_format) RadioButton mOfxRadioButton; @BindView(R.id.radio_qif_format) RadioButton mQifRadioButton; @BindView(R.id.radio_xml_format) RadioButton mXmlRadioButton; + @BindView(R.id.radio_csv_format) RadioButton mCsVRadioButton; @BindView(R.id.recurrence_options) View mRecurrenceOptionsView; /** @@ -204,6 +205,12 @@ private void onRadioButtonClicked(View view){ mExportWarningTextView.setText(R.string.export_warning_xml); mExportDateLayout.setVisibility(View.GONE); break; + + case R.id.radio_csv_format: + mExportFormat = ExportFormat.CSV; + mExportWarningTextView.setText(""); + mExportDateLayout.setVisibility(View.INVISIBLE); + break; } } @@ -464,12 +471,14 @@ public void onClick(View view) { mOfxRadioButton.setOnClickListener(radioClickListener); mQifRadioButton.setOnClickListener(radioClickListener); mXmlRadioButton.setOnClickListener(radioClickListener); + mCsVRadioButton.setOnClickListener(radioClickListener); ExportFormat defaultFormat = ExportFormat.valueOf(defaultExportFormat.toUpperCase()); switch (defaultFormat){ case QIF: mQifRadioButton.performClick(); break; case OFX: mOfxRadioButton.performClick(); break; case XML: mXmlRadioButton.performClick(); break; + case CSV: mCsVRadioButton.performClick(); break; } if (GnuCashApplication.isDoubleEntryEnabled()){ From 58a014e78fdcf6dd290bae872a24423c9ec54825 Mon Sep 17 00:00:00 2001 From: AngelicosPhosphoros Date: Tue, 9 Jan 2018 11:58:11 +0300 Subject: [PATCH 03/11] Added CSV-formats to export_formats string resource --- app/src/main/res/values-af-rZA/strings.xml | 2 ++ app/src/main/res/values-ar-rSA/strings.xml | 2 ++ app/src/main/res/values-ca-rES/strings.xml | 2 ++ app/src/main/res/values-cs-rCZ/strings.xml | 2 ++ app/src/main/res/values-de/strings.xml | 2 ++ app/src/main/res/values-el-rGR/strings.xml | 2 ++ app/src/main/res/values-en-rGB/strings.xml | 2 ++ app/src/main/res/values-es-rMX/strings.xml | 2 ++ app/src/main/res/values-es/strings.xml | 2 ++ app/src/main/res/values-fi-rFI/strings.xml | 2 ++ app/src/main/res/values-fr/strings.xml | 2 ++ app/src/main/res/values-hu-rHU/strings.xml | 2 ++ app/src/main/res/values-in-rID/strings.xml | 2 ++ app/src/main/res/values-it-rIT/strings.xml | 2 ++ app/src/main/res/values-iw-rIL/strings.xml | 2 ++ app/src/main/res/values-ja-rJP/strings.xml | 2 ++ app/src/main/res/values-ko-rKR/strings.xml | 2 ++ app/src/main/res/values-lv-rLV/strings.xml | 2 ++ app/src/main/res/values-nb/strings.xml | 2 ++ app/src/main/res/values-nl-rNL/strings.xml | 2 ++ app/src/main/res/values-no-rNO/strings.xml | 2 ++ app/src/main/res/values-pl-rPL/strings.xml | 2 ++ app/src/main/res/values-pt-rBR/strings.xml | 2 ++ app/src/main/res/values-pt-rPT/strings.xml | 2 ++ app/src/main/res/values-ro-rRO/strings.xml | 2 ++ app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values-sr-rSP/strings.xml | 2 ++ app/src/main/res/values-sv-rSE/strings.xml | 2 ++ app/src/main/res/values-tr-rTR/strings.xml | 2 ++ app/src/main/res/values-uk-rUA/strings.xml | 2 ++ app/src/main/res/values-vi-rVN/strings.xml | 2 ++ app/src/main/res/values-zh-rCN/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 34 files changed, 68 insertions(+) diff --git a/app/src/main/res/values-af-rZA/strings.xml b/app/src/main/res/values-af-rZA/strings.xml index 8bc5253ca..6ebabab18 100644 --- a/app/src/main/res/values-af-rZA/strings.xml +++ b/app/src/main/res/values-af-rZA/strings.xml @@ -179,6 +179,8 @@ QIF OFX XML + CSV-accounts + CSV-transactions Select a Color diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index 7ccf20003..2a1162b2b 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -183,6 +183,8 @@ QIF OFX XML + CSV-accounts + CSV-transactions Select a Color diff --git a/app/src/main/res/values-ca-rES/strings.xml b/app/src/main/res/values-ca-rES/strings.xml index c5bc4eb4a..e0759fc47 100644 --- a/app/src/main/res/values-ca-rES/strings.xml +++ b/app/src/main/res/values-ca-rES/strings.xml @@ -177,6 +177,8 @@ QIF OFX XML + CSV-comptes + CSV-transaccions Seleccioneu un color diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index dc5b11a03..474479365 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -176,6 +176,8 @@ QIF OFX XML + CSV-účty + CSV-transakcí Select a Color diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a9529b883..0a5c06f49 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -176,6 +176,8 @@ QIF OFX XML + CSV-Konten + CSV-Transaktionen Farbe auswählen diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index 49f40617d..db79ae430 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -188,6 +188,8 @@ QIF OFX XML + CSV-λογαριασμούς + CSV-συναλλαγών Επιλογή χρώματος diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 1715b6f83..dafd6ff32 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -179,6 +179,8 @@ QIF OFX XML + CSV-accounts + CSV-transactions Select a Color diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index 1d8d70660..08c0591b6 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -172,6 +172,8 @@ QIF OFX XML + CSV-cuentas + CSV-actas Seleccionar un color diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 994bd4661..9f12b30d3 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -172,6 +172,8 @@ QIF OFX XML + CSV-cuentas + CSV-actas Seleccione un color diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 202c16fd2..6a033bf2b 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -179,6 +179,8 @@ QIF OFX XML + CSV-tilit + CSV-liiketoimet Select a Color diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9ab498501..ac18b6f6a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -171,6 +171,8 @@ QIF OFX XML + CSV-comptes + CSV-transactions Sélectionnez une couleur diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 6fb7cee73..f52f03d47 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -179,6 +179,8 @@ QIF OFX XML + CSV-fiókok + CSV-ügyletek Select a Color diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml index 32e24d46f..395f803a9 100644 --- a/app/src/main/res/values-in-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -171,6 +171,8 @@ QIF OFX XML + CSV-accounts + CSV-transactions Pilih Warna diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 421590559..be47b1120 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -176,6 +176,8 @@ QIF OFX XML + CSV-conti + CSV-transazioni Seleziona un colore diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index 2dd55c1a7..222a5b9ac 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -181,6 +181,8 @@ QIF OFX XML + CSV-accounts + CSV-transactions Select a Color diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index b5d7e1c9e..2518fb141 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -173,6 +173,8 @@ QIF OFX XML + CSV-アカウント + CSV-取引 色を選択 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index f20d6f229..78d95474e 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -175,6 +175,8 @@ QIF OFX XML + CSV-계정 + CSV-업무 색상 선택 diff --git a/app/src/main/res/values-lv-rLV/strings.xml b/app/src/main/res/values-lv-rLV/strings.xml index 3deabdcda..405e89843 100644 --- a/app/src/main/res/values-lv-rLV/strings.xml +++ b/app/src/main/res/values-lv-rLV/strings.xml @@ -180,6 +180,8 @@ QIF OFX XML + CSV-accounts + CSV-transactions Select a Color diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 84f2daf11..c8b3c83c2 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -170,6 +170,8 @@ QIF OFX XML + CSV-kontoer + CSV-transaksjoner Velg en farge diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index 3da93b9d5..a8e998ae1 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -179,6 +179,8 @@ QIF OFX XML + CSV-rekeningen + CSV-transacties Kies een kleur diff --git a/app/src/main/res/values-no-rNO/strings.xml b/app/src/main/res/values-no-rNO/strings.xml index f4b098eec..abc690a6e 100644 --- a/app/src/main/res/values-no-rNO/strings.xml +++ b/app/src/main/res/values-no-rNO/strings.xml @@ -175,6 +175,8 @@ QIF OFX XML + CSV-kontoer + CSV-transaksjoner Velg en farge diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index 079d66f5c..8788b4e6d 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -177,6 +177,8 @@ Konto docelowe używa innej waluty niż konto wyjściowe QIF OFX XML + CSV-konta + CSV-transakcje Wybierz kolor diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2f3bfca4f..839ae4abf 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -174,6 +174,8 @@ QIF OFX XML + CSV-contas + CSV-transações Selecione uma Cor diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index fed5df41b..a0f5cda62 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -174,6 +174,8 @@ QIF OFX XML + CSV-contas + CSV-transações Escolha uma côr diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index ff9007834..3e86e8fd9 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -180,6 +180,8 @@ QIF OFX XML + CSV-conturi + CSV-tranzacții Select a Color diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9ba4502df..148176f2d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -176,6 +176,8 @@ QIF OFX XML + CSV-счета + CSV-транзакции Выберите цвет diff --git a/app/src/main/res/values-sr-rSP/strings.xml b/app/src/main/res/values-sr-rSP/strings.xml index d7eb355dc..0c264592e 100644 --- a/app/src/main/res/values-sr-rSP/strings.xml +++ b/app/src/main/res/values-sr-rSP/strings.xml @@ -180,6 +180,8 @@ QIF OFX XML + CSV-рачуне + CSV-трансакције Select a Color diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index be8308fd5..d6067e6c3 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -170,6 +170,8 @@ QIF OFX XML + CSV-konton + CSV-transaktioner Välj en färg diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index 2c93676fd..e3b8f243a 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -179,6 +179,8 @@ QIF OFX XML + CSV-hesapları + CSV-işlemler Renk Seçin diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml index b4aa3b352..0d919a5d2 100644 --- a/app/src/main/res/values-uk-rUA/strings.xml +++ b/app/src/main/res/values-uk-rUA/strings.xml @@ -176,6 +176,8 @@ QIF OFX XML + CSV-счета + CSV-транзакции Оберіть колір diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index 082e3fac1..d8a21f5bd 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -178,6 +178,8 @@ QIF OFX XML + CSV-tài khoản + CSV-giao dịch Select a Color diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 60a54c00c..9b7eaebe4 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -175,6 +175,8 @@ QIF OFX XML + CSV-账户 + CSV-交易 选择一种颜色 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 70dd0e16b..4c2bbce04 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -175,6 +175,8 @@ QIF OFX XML + CSV-账户 + CSV-交易 选择一种颜色 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 624257895..4c0901836 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -179,6 +179,8 @@ QIF OFX XML + CSV-accounts + CSV-transactions Select a Color From 2a439c59a768757bfc1faa8b053142502d3883fc Mon Sep 17 00:00:00 2001 From: AngelicosPhosphoros Date: Tue, 9 Jan 2018 12:12:50 +0300 Subject: [PATCH 04/11] Make change of CSV export name --- .../java/org/gnucash/android/ui/export/ExportFormFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java index 2449792b4..e8f49d268 100644 --- a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java @@ -223,6 +223,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, bindViewListeners(); + mCsVRadioButton.setText(getResources().getStringArray(R.array.export_formats)[3]); + return view; } @Override From 4fca1c5487a74d05f283047685b3c99e662838e4 Mon Sep 17 00:00:00 2001 From: AngelicosPhosphoros Date: Tue, 9 Jan 2018 13:01:28 +0300 Subject: [PATCH 05/11] Added buttons for CSV. Added texts import from resources. --- .../android/ui/export/ExportFormFragment.java | 13 ++++++++----- app/src/main/res/layout/fragment_export_form.xml | 12 +++++++++--- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java index e8f49d268..c2c403633 100644 --- a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java @@ -137,7 +137,8 @@ public class ExportFormFragment extends Fragment implements @BindView(R.id.radio_ofx_format) RadioButton mOfxRadioButton; @BindView(R.id.radio_qif_format) RadioButton mQifRadioButton; @BindView(R.id.radio_xml_format) RadioButton mXmlRadioButton; - @BindView(R.id.radio_csv_format) RadioButton mCsVRadioButton; + @BindView(R.id.radio_csv_accounts_format) RadioButton mCsvAccountsRadioButton; + @BindView(R.id.radio_csv_transactions_format) RadioButton mCsvTransactionsRadioButton; @BindView(R.id.recurrence_options) View mRecurrenceOptionsView; /** @@ -206,7 +207,7 @@ private void onRadioButtonClicked(View view){ mExportDateLayout.setVisibility(View.GONE); break; - case R.id.radio_csv_format: + case R.id.radio_csv_accounts_format: mExportFormat = ExportFormat.CSV; mExportWarningTextView.setText(""); mExportDateLayout.setVisibility(View.INVISIBLE); @@ -223,7 +224,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, bindViewListeners(); - mCsVRadioButton.setText(getResources().getStringArray(R.array.export_formats)[3]); + String[] export_format_strings = getResources().getStringArray(R.array.export_formats); + mCsvAccountsRadioButton.setText(export_format_strings[3]); + mCsvTransactionsRadioButton.setText(export_format_strings[4]); return view; } @@ -473,14 +476,14 @@ public void onClick(View view) { mOfxRadioButton.setOnClickListener(radioClickListener); mQifRadioButton.setOnClickListener(radioClickListener); mXmlRadioButton.setOnClickListener(radioClickListener); - mCsVRadioButton.setOnClickListener(radioClickListener); + mCsvAccountsRadioButton.setOnClickListener(radioClickListener); ExportFormat defaultFormat = ExportFormat.valueOf(defaultExportFormat.toUpperCase()); switch (defaultFormat){ case QIF: mQifRadioButton.performClick(); break; case OFX: mOfxRadioButton.performClick(); break; case XML: mXmlRadioButton.performClick(); break; - case CSV: mCsVRadioButton.performClick(); break; + case CSV: mCsvAccountsRadioButton.performClick(); break; } if (GnuCashApplication.isDoubleEntryEnabled()){ diff --git a/app/src/main/res/layout/fragment_export_form.xml b/app/src/main/res/layout/fragment_export_form.xml index 45cb91273..49e6a6897 100644 --- a/app/src/main/res/layout/fragment_export_form.xml +++ b/app/src/main/res/layout/fragment_export_form.xml @@ -73,7 +73,7 @@ android:layout_height="wrap_content" android:layout_marginLeft="35dp" android:gravity="center_vertical" - android:orientation="horizontal"> + android:orientation="vertical"> - + android:text="CSV-acc"/> + From 7198d7df77898999794f3903fa6a3dfe33a82f1d Mon Sep 17 00:00:00 2001 From: sononio Date: Tue, 9 Jan 2018 21:15:27 +0300 Subject: [PATCH 06/11] CSV Export transactions added --- .../android/export/ExportAsyncTask.java | 9 +- .../gnucash/android/export/ExportFormat.java | 7 +- .../gnucash/android/export/ExportParams.java | 21 ++ .../org/gnucash/android/export/Exporter.java | 5 +- ...vExporter.java => CsvAccountExporter.java} | 38 +-- .../export/csv/CsvTransactionsExporter.java | 237 ++++++++++++++++++ .../gnucash/android/export/csv/CsvWriter.java | 48 ++++ .../android/ui/export/ExportFormFragment.java | 40 ++- .../main/res/layout/fragment_export_form.xml | 42 ++++ 9 files changed, 420 insertions(+), 27 deletions(-) rename app/src/main/java/org/gnucash/android/export/csv/{CsvExporter.java => CsvAccountExporter.java} (86%) create mode 100644 app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java create mode 100644 app/src/main/java/org/gnucash/android/export/csv/CsvWriter.java diff --git a/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java b/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java index d267bdb5f..aec60b471 100644 --- a/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java +++ b/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java @@ -57,7 +57,8 @@ import org.gnucash.android.db.adapter.DatabaseAdapter; import org.gnucash.android.db.adapter.SplitsDbAdapter; import org.gnucash.android.db.adapter.TransactionsDbAdapter; -import org.gnucash.android.export.csv.CsvExporter; +import org.gnucash.android.export.csv.CsvAccountExporter; +import org.gnucash.android.export.csv.CsvTransactionsExporter; import org.gnucash.android.export.ofx.OfxExporter; import org.gnucash.android.export.qif.QifExporter; import org.gnucash.android.export.xml.GncXmlExporter; @@ -218,7 +219,7 @@ private void dismissProgressDialog() { /** * Returns an exporter corresponding to the user settings. - * @return Object of one of {@link QifExporter}, {@link OfxExporter} or {@link GncXmlExporter} or {@Link CsvExporter} + * @return Object of one of {@link QifExporter}, {@link OfxExporter} or {@link GncXmlExporter} or {@Link CsvAccountExporter} */ private Exporter getExporter() { switch (mExportParams.getExportFormat()) { @@ -230,8 +231,10 @@ private Exporter getExporter() { case XML: return new GncXmlExporter(mExportParams, mDb); + case CSVA: + return new CsvAccountExporter(mExportParams, mDb); default: - return new CsvExporter(mExportParams, mDb); + return new CsvTransactionsExporter(mExportParams, mDb); } } diff --git a/app/src/main/java/org/gnucash/android/export/ExportFormat.java b/app/src/main/java/org/gnucash/android/export/ExportFormat.java index d86bd94be..4e30654fa 100644 --- a/app/src/main/java/org/gnucash/android/export/ExportFormat.java +++ b/app/src/main/java/org/gnucash/android/export/ExportFormat.java @@ -23,7 +23,8 @@ public enum ExportFormat { QIF("Quicken Interchange Format"), OFX("Open Financial eXchange"), XML("GnuCash XML"), - CSV("GnuCash CSV"); + CSVA("GnuCash accounts CSV"), + CSVT("GnuCash transactions CSV"); /** * Full name of the export format acronym @@ -46,7 +47,9 @@ public String getExtension(){ return ".ofx"; case XML: return ".gnca"; - case CSV: + case CSVA: + return ".csv"; + case CSVT: return ".csv"; default: return ".txt"; diff --git a/app/src/main/java/org/gnucash/android/export/ExportParams.java b/app/src/main/java/org/gnucash/android/export/ExportParams.java index 90c4e4221..e85ad3e8f 100644 --- a/app/src/main/java/org/gnucash/android/export/ExportParams.java +++ b/app/src/main/java/org/gnucash/android/export/ExportParams.java @@ -78,6 +78,11 @@ public String getDescription(){ */ private String mExportLocation; + /** + * CSV-separator char + */ + private char mCsvSeparator = ','; + /** * Creates a new set of paramters and specifies the export format * @param format Format to use when exporting the transactions @@ -169,6 +174,22 @@ public void setExportLocation(String exportLocation){ mExportLocation = exportLocation; } + /** + * Get the CSV-separator char + * @return CSV-separator char + */ + public char getCsvSeparator(){ + return mCsvSeparator; + } + + /** + * Set the CSV-separator char + * @param separator CSV-separator char + */ + public void setCsvSeparator(char separator) { + mCsvSeparator = separator; + } + @Override public String toString() { return "Export all transactions created since " + TimestampHelper.getUtcStringFromTimestamp(mExportStartTime) + " UTC" diff --git a/app/src/main/java/org/gnucash/android/export/Exporter.java b/app/src/main/java/org/gnucash/android/export/Exporter.java index 87c60d569..51e2fc9e3 100644 --- a/app/src/main/java/org/gnucash/android/export/Exporter.java +++ b/app/src/main/java/org/gnucash/android/export/Exporter.java @@ -160,7 +160,10 @@ public static String sanitizeFilename(String inputName) { */ public static String buildExportFilename(ExportFormat format, String bookName) { return EXPORT_FILENAME_DATE_FORMAT.format(new Date(System.currentTimeMillis())) - + "_gnucash_export_" + sanitizeFilename(bookName) + format.getExtension(); + + "_gnucash_export_" + sanitizeFilename(bookName) + + (format==ExportFormat.CSVA?"_accounts_":"") + + (format==ExportFormat.CSVT?"_transactions_":"") + + format.getExtension(); } /** diff --git a/app/src/main/java/org/gnucash/android/export/csv/CsvExporter.java b/app/src/main/java/org/gnucash/android/export/csv/CsvAccountExporter.java similarity index 86% rename from app/src/main/java/org/gnucash/android/export/csv/CsvExporter.java rename to app/src/main/java/org/gnucash/android/export/csv/CsvAccountExporter.java index afe00b5e8..13582ed1a 100644 --- a/app/src/main/java/org/gnucash/android/export/csv/CsvExporter.java +++ b/app/src/main/java/org/gnucash/android/export/csv/CsvAccountExporter.java @@ -1,6 +1,5 @@ /* - * Copyright (c) 2014 - 2015 Ngewi Fet - * Copyright (c) 2014 Yongxin Wang + * Copyright (c) 2018 Semyannikov Gleb * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -75,25 +74,26 @@ import static org.gnucash.android.db.DatabaseSchema.TransactionEntry; /** - * Creates a GnuCash XML representation of the accounts and transactions + * Creates a GnuCash CSV account representation of the accounts and transactions * - * @author Ngewi Fet - * @author Yongxin Wang + * @author Semyannikov Gleb */ -public class CsvExporter extends Exporter{ +public class CsvAccountExporter extends Exporter{ /** * Root account for template accounts */ private Account mRootTemplateAccount; private Map mTransactionToTemplateAccountMap = new TreeMap<>(); + private char mCsvSeparator; /** * Construct a new exporter with export parameters * @param params Parameters for the export */ - public CsvExporter(ExportParams params) { + public CsvAccountExporter(ExportParams params) { super(params, null); + mCsvSeparator = params.getCsvSeparator(); LOG_TAG = "GncXmlExporter"; } @@ -103,28 +103,30 @@ public CsvExporter(ExportParams params) { * @param params Parameters for the export * @param db SQLite database */ - public CsvExporter(ExportParams params, SQLiteDatabase db) { + public CsvAccountExporter(ExportParams params, SQLiteDatabase db) { super(params, db); + mCsvSeparator = params.getCsvSeparator(); LOG_TAG = "GncXmlExporter"; } @Override public List generateExport() throws ExporterException { - OutputStreamWriter writer = null; + OutputStreamWriter writerStream = null; + CsvWriter writer = null; String outputFile = getExportCacheFilePath(); try { FileOutputStream fileOutputStream = new FileOutputStream(outputFile); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); - writer = new OutputStreamWriter(bufferedOutputStream); - + writerStream = new OutputStreamWriter(bufferedOutputStream); + writer = new CsvWriter(writerStream); generateExport(writer); } catch (IOException ex){ - Crashlytics.log("Error exporting XML"); + Crashlytics.log("Error exporting CSV"); Crashlytics.logException(ex); } finally { - if (writer != null) { + if (writerStream != null) { try { - writer.close(); + writerStream.close(); } catch (IOException e) { throw new ExporterException(mExportParams, e); } @@ -137,9 +139,9 @@ public List generateExport() throws ExporterException { return exportedFiles; } - public void generateExport(final Writer writer) throws ExporterException { + public void generateExport(final CsvWriter writer) throws ExporterException { try { - String separator = ","; + String separator = mCsvSeparator + ""; List names = new ArrayList(); names.add("type"); names.add("full_name"); @@ -167,7 +169,7 @@ public void generateExport(final Writer writer) throws ExporterException { for(int i = 0; i < names.size(); i++) { writer.write(names.get(i) + separator); } - writer.write('\n'); + writer.write("\n"); for(int i = 0; i < accounts.size(); i++) { Account account = accounts.get(i); @@ -196,7 +198,7 @@ public void generateExport(final Writer writer) throws ExporterException { //writer.write(); - writer.write('\n'); + writer.write("\n"); } } catch (Exception e) { Crashlytics.logException(e); diff --git a/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java b/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java new file mode 100644 index 000000000..6e8c7ae63 --- /dev/null +++ b/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2018 Semyannikov Gleb + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gnucash.android.export.csv; + +import org.gnucash.android.export.xml.*; + +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.Uri; +import android.util.Log; + +import com.crashlytics.android.Crashlytics; + +import org.gnucash.android.app.GnuCashApplication; +import org.gnucash.android.db.DatabaseSchema; +import org.gnucash.android.db.adapter.BooksDbAdapter; +import org.gnucash.android.db.adapter.CommoditiesDbAdapter; +import org.gnucash.android.db.adapter.RecurrenceDbAdapter; +import org.gnucash.android.db.adapter.TransactionsDbAdapter; +import org.gnucash.android.export.ExportFormat; +import org.gnucash.android.export.ExportParams; +import org.gnucash.android.export.Exporter; +import org.gnucash.android.model.Account; +import org.gnucash.android.model.AccountType; +import org.gnucash.android.model.BaseModel; +import org.gnucash.android.model.Book; +import org.gnucash.android.model.Budget; +import org.gnucash.android.model.BudgetAmount; +import org.gnucash.android.model.Commodity; +import org.gnucash.android.model.Money; +import org.gnucash.android.model.PeriodType; +import org.gnucash.android.model.Price; +import org.gnucash.android.model.Recurrence; +import org.gnucash.android.model.ScheduledAction; +import org.gnucash.android.model.Split; +import org.gnucash.android.model.Transaction; +import org.gnucash.android.model.TransactionType; +import org.gnucash.android.util.BookUtils; +import org.gnucash.android.util.TimestampHelper; +import org.xmlpull.v1.XmlPullParserFactory; +import org.xmlpull.v1.XmlSerializer; + +import java.io.BufferedOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.zip.GZIPOutputStream; + +import static org.gnucash.android.db.DatabaseSchema.ScheduledActionEntry; +import static org.gnucash.android.db.DatabaseSchema.SplitEntry; +import static org.gnucash.android.db.DatabaseSchema.TransactionEntry; + +/** + * Creates a GnuCash CSV transactions representation of the accounts and transactions + * + * @author Semyannikov Gleb + */ +public class CsvTransactionsExporter extends Exporter{ + + /** + * Root account for template accounts + */ + private Account mRootTemplateAccount; + private Map mTransactionToTemplateAccountMap = new TreeMap<>(); + private char mCsvSeparator; + + /** + * Construct a new exporter with export parameters + * @param params Parameters for the export + */ + public CsvTransactionsExporter(ExportParams params) { + super(params, null); + mCsvSeparator = params.getCsvSeparator(); + LOG_TAG = "GncXmlExporter"; + } + + /** + * Overloaded constructor. + * Creates an exporter with an already open database instance. + * @param params Parameters for the export + * @param db SQLite database + */ + public CsvTransactionsExporter(ExportParams params, SQLiteDatabase db) { + super(params, db); + mCsvSeparator = params.getCsvSeparator(); + LOG_TAG = "GncXmlExporter"; + } + + @Override + public List generateExport() throws ExporterException { + OutputStreamWriter writerStream = null; + CsvWriter writer = null; + String outputFile = getExportCacheFilePath(); + try { + FileOutputStream fileOutputStream = new FileOutputStream(outputFile); + BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); + writerStream = new OutputStreamWriter(bufferedOutputStream); + writer = new CsvWriter(writerStream); + generateExport(writer); + } catch (IOException ex){ + Crashlytics.log("Error exporting CSV"); + Crashlytics.logException(ex); + } finally { + if (writerStream != null) { + try { + writerStream.close(); + } catch (IOException e) { + throw new ExporterException(mExportParams, e); + } + } + } + + List exportedFiles = new ArrayList<>(); + exportedFiles.add(outputFile); + + return exportedFiles; + } + + public void generateExport(final CsvWriter writer) throws ExporterException { + try { + String separator = mCsvSeparator + ""; + List names = new ArrayList(); + names.add("Date"); + names.add("Account name"); + names.add("Number"); + names.add("Description"); + names.add("Notes"); + names.add("Memo"); + names.add("Category"); + names.add("Type"); + names.add("Action"); + names.add("Reconcile"); + names.add("To With Sym"); + names.add("From With Sym"); + names.add("To Num."); + names.add("From Num."); + names.add("To Rate/Price"); + names.add("From Rate/Price"); + + + List transactions = mTransactionsDbAdapter.getAllTransactions(); + //List budgets = mBudgetsDbAdapter.getAllRecords(); + //List accounts = mAccountsDbAdapter.getAllRecords(); + //List commodities = mCommoditiesDbAdapter.getAllRecords(); + //List prices = mPricesDbAdapter.getAllRecords(); + //List scheduledActions = mScheduledActionDbAdapter.getAllRecords(); + //List splits = mSplitsDbAdapter.getAllRecords(); + + + for(int i = 0; i < names.size(); i++) { + writer.write(names.get(i) + separator); + } + writer.write("\n"); + for(int i = 0; i < transactions.size(); i++) { + Transaction transaction = transactions.get(i); + List splits = transaction.getSplits(); + for (int j = 0; j < splits.size()/2; j++) { + Split split = splits.get(j); + Split pair = null; + for (int k = 0; k < splits.size(); k++) { + if (split.isPairOf(splits.get(k))) { + pair = splits.get(k); + } + } + + Account account = mAccountsDbAdapter.getRecord(split.getAccountUID()); + Account account_pair = null; + if (pair != null) { + account_pair = mAccountsDbAdapter.getRecord(pair.getAccountUID()); + } + + Date date = new Date(transaction.getTimeMillis()); + DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); + writer.write(df.format(date) + separator); + + writer.write(account.getName() + separator); + + //Number + writer.write(separator); + + writer.write(transaction.getDescription() + separator); + + writer.write(transaction.getNote() + separator); + + writer.write((split.getMemo()==null?"":split.getMemo()) + separator); + + writer.write((account_pair.getName()==null?"":account_pair.getName()) + separator); + + writer.write((split.getType().name()) + separator); + + //Action + writer.write(separator); + + writer.write(split.getReconcileState() + separator); + + writer.write(split.getFormattedQuantity().toPlainString() + separator); + writer.write(separator); + writer.write(split.getFormattedQuantity().toPlainString() + separator); + writer.write(separator); + writer.write(separator); + writer.write("\n"); + } + } + + } catch (Exception e) { + Crashlytics.logException(e); + throw new ExporterException(mExportParams, e); + } + } +} diff --git a/app/src/main/java/org/gnucash/android/export/csv/CsvWriter.java b/app/src/main/java/org/gnucash/android/export/csv/CsvWriter.java new file mode 100644 index 000000000..5e6570d37 --- /dev/null +++ b/app/src/main/java/org/gnucash/android/export/csv/CsvWriter.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018 Semyannikov Gleb + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gnucash.android.export.csv; + + +import java.io.IOException; +import java.io.Writer; + +/** + * Format data to be CSV-compatible + * + * @author Semyannikov Gleb + */ +public class CsvWriter { + private Writer writer; + + public CsvWriter(Writer writer){ + this.writer = writer; + } + + public void write(String str) throws IOException { + if (str == null || str.length() < 1) { + return; + } + + String head = str.substring(0, str.length() - 1); + char separator = str.charAt(str.length() - 1); + if (head.indexOf(separator) > -1) { + head = '"' + head + '"'; + } + + writer.write(head + separator); + } +} diff --git a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java index c2c403633..43ca6c6bc 100644 --- a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java @@ -133,6 +133,7 @@ public class ExportFormFragment extends Fragment implements @BindView(R.id.switch_export_all) SwitchCompat mExportAllSwitch; @BindView(R.id.export_date_layout) LinearLayout mExportDateLayout; + @BindView(R.id.export_separator_layout) LinearLayout mExportSeparatorLayout; @BindView(R.id.radio_ofx_format) RadioButton mOfxRadioButton; @BindView(R.id.radio_qif_format) RadioButton mQifRadioButton; @@ -140,6 +141,10 @@ public class ExportFormFragment extends Fragment implements @BindView(R.id.radio_csv_accounts_format) RadioButton mCsvAccountsRadioButton; @BindView(R.id.radio_csv_transactions_format) RadioButton mCsvTransactionsRadioButton; + @BindView(R.id.radio_separator_comma_format) RadioButton mSeparatorCommaButton; + @BindView(R.id.radio_separator_colon_format) RadioButton mSeparatorColonButton; + @BindView(R.id.radio_separator_semicolon_format) RadioButton mSeparatorSemicolonButton; + @BindView(R.id.recurrence_options) View mRecurrenceOptionsView; /** * Event recurrence options @@ -170,6 +175,8 @@ public class ExportFormFragment extends Fragment implements */ private Uri mExportUri; + private char mExportCsvSeparator = ','; + /** * Flag to determine if export has been started. * Used to continue export after user has picked a destination file @@ -187,6 +194,7 @@ private void onRadioButtonClicked(View view){ mExportWarningTextView.setVisibility(View.GONE); } mExportDateLayout.setVisibility(View.VISIBLE); + mExportSeparatorLayout.setVisibility(View.GONE); break; case R.id.radio_qif_format: @@ -199,18 +207,37 @@ private void onRadioButtonClicked(View view){ mExportWarningTextView.setVisibility(View.GONE); } mExportDateLayout.setVisibility(View.VISIBLE); + mExportSeparatorLayout.setVisibility(View.GONE); break; case R.id.radio_xml_format: mExportFormat = ExportFormat.XML; mExportWarningTextView.setText(R.string.export_warning_xml); mExportDateLayout.setVisibility(View.GONE); + mExportSeparatorLayout.setVisibility(View.GONE); break; case R.id.radio_csv_accounts_format: - mExportFormat = ExportFormat.CSV; + mExportFormat = ExportFormat.CSVA; + mExportWarningTextView.setText(""); + mExportDateLayout.setVisibility(View.GONE); + mExportSeparatorLayout.setVisibility(View.VISIBLE); + break; + case R.id.radio_csv_transactions_format: + mExportFormat = ExportFormat.CSVT; mExportWarningTextView.setText(""); - mExportDateLayout.setVisibility(View.INVISIBLE); + mExportDateLayout.setVisibility(View.GONE); + mExportSeparatorLayout.setVisibility(View.VISIBLE); + break; + + case R.id.radio_separator_comma_format: + mExportCsvSeparator = ','; + break; + case R.id.radio_separator_colon_format: + mExportCsvSeparator = ':'; + break; + case R.id.radio_separator_semicolon_format: + mExportCsvSeparator = ';'; break; } } @@ -300,6 +327,7 @@ private void startExport(){ exportParameters.setExportTarget(mExportTarget); exportParameters.setExportLocation(mExportUri != null ? mExportUri.toString() : null); exportParameters.setDeleteTransactionsAfterExport(mDeleteAllCheckBox.isChecked()); + exportParameters.setCsvSeparator(mExportCsvSeparator); Log.i(TAG, "Commencing async export of transactions"); new ExportAsyncTask(getActivity(), GnuCashApplication.getActiveDb()).execute(exportParameters); @@ -477,13 +505,19 @@ public void onClick(View view) { mQifRadioButton.setOnClickListener(radioClickListener); mXmlRadioButton.setOnClickListener(radioClickListener); mCsvAccountsRadioButton.setOnClickListener(radioClickListener); + mCsvTransactionsRadioButton.setOnClickListener(radioClickListener); + + mSeparatorCommaButton.setOnClickListener(radioClickListener); + mSeparatorColonButton.setOnClickListener(radioClickListener); + mSeparatorSemicolonButton.setOnClickListener(radioClickListener); ExportFormat defaultFormat = ExportFormat.valueOf(defaultExportFormat.toUpperCase()); switch (defaultFormat){ case QIF: mQifRadioButton.performClick(); break; case OFX: mOfxRadioButton.performClick(); break; case XML: mXmlRadioButton.performClick(); break; - case CSV: mCsvAccountsRadioButton.performClick(); break; + case CSVA: mCsvAccountsRadioButton.performClick(); break; + case CSVT: mCsvTransactionsRadioButton.performClick(); break; } if (GnuCashApplication.isDoubleEntryEnabled()){ diff --git a/app/src/main/res/layout/fragment_export_form.xml b/app/src/main/res/layout/fragment_export_form.xml index 49e6a6897..65632118f 100644 --- a/app/src/main/res/layout/fragment_export_form.xml +++ b/app/src/main/res/layout/fragment_export_form.xml @@ -105,6 +105,48 @@ android:text="CSV-trans"/> + + + + + + + + + + Date: Tue, 9 Jan 2018 21:34:13 +0300 Subject: [PATCH 07/11] CSV export contributors added --- CONTRIBUTORS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index fe12546fb..4bdb9a6c0 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -27,6 +27,7 @@ The following people (in alphabetical order) contributed (commits on GitHub) to * Falk Brockmann * Felipe Morato * Geert Janssens +* Gleb Semyannikov * Jörg Möller * Israel Buitron * Jesse Shieh @@ -54,6 +55,7 @@ The following people (in alphabetical order) contributed (commits on GitHub) to * Stephan Windmüller * Terry Chung * thesebas thesebas@thesebas.net +* Timur Khuzin * Vladimir Rutsky * Weslly Oliveira * windwarrior lennartbuit@gmail.com From 76c74cbfa77535538012d2ba70dfdb6076c9448a Mon Sep 17 00:00:00 2001 From: sononio Date: Wed, 10 Jan 2018 23:09:44 +0300 Subject: [PATCH 08/11] CSV export refactor --- .../android/export/ExportAsyncTask.java | 2 +- .../export/csv/CsvAccountExporter.java | 62 ------------------- .../export/csv/CsvTransactionsExporter.java | 60 ------------------ 3 files changed, 1 insertion(+), 123 deletions(-) diff --git a/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java b/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java index aec60b471..a72465c55 100644 --- a/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java +++ b/app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java @@ -219,7 +219,7 @@ private void dismissProgressDialog() { /** * Returns an exporter corresponding to the user settings. - * @return Object of one of {@link QifExporter}, {@link OfxExporter} or {@link GncXmlExporter} or {@Link CsvAccountExporter} + * @return Object of one of {@link QifExporter}, {@link OfxExporter} or {@link GncXmlExporter}, {@Link CsvAccountExporter} or {@Link CsvTransactionsExporter} */ private Exporter getExporter() { switch (mExportParams.getExportFormat()) { diff --git a/app/src/main/java/org/gnucash/android/export/csv/CsvAccountExporter.java b/app/src/main/java/org/gnucash/android/export/csv/CsvAccountExporter.java index 13582ed1a..a5c4842e6 100644 --- a/app/src/main/java/org/gnucash/android/export/csv/CsvAccountExporter.java +++ b/app/src/main/java/org/gnucash/android/export/csv/CsvAccountExporter.java @@ -16,62 +16,18 @@ package org.gnucash.android.export.csv; -import org.gnucash.android.export.xml.*; - -import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.net.Uri; -import android.util.Log; - import com.crashlytics.android.Crashlytics; - -import org.gnucash.android.app.GnuCashApplication; -import org.gnucash.android.db.DatabaseSchema; -import org.gnucash.android.db.adapter.BooksDbAdapter; -import org.gnucash.android.db.adapter.CommoditiesDbAdapter; -import org.gnucash.android.db.adapter.RecurrenceDbAdapter; -import org.gnucash.android.db.adapter.TransactionsDbAdapter; -import org.gnucash.android.export.ExportFormat; import org.gnucash.android.export.ExportParams; import org.gnucash.android.export.Exporter; import org.gnucash.android.model.Account; -import org.gnucash.android.model.AccountType; -import org.gnucash.android.model.BaseModel; -import org.gnucash.android.model.Book; -import org.gnucash.android.model.Budget; -import org.gnucash.android.model.BudgetAmount; -import org.gnucash.android.model.Commodity; -import org.gnucash.android.model.Money; -import org.gnucash.android.model.PeriodType; -import org.gnucash.android.model.Price; -import org.gnucash.android.model.Recurrence; -import org.gnucash.android.model.ScheduledAction; -import org.gnucash.android.model.Split; -import org.gnucash.android.model.Transaction; -import org.gnucash.android.model.TransactionType; -import org.gnucash.android.util.BookUtils; -import org.gnucash.android.util.TimestampHelper; -import org.xmlpull.v1.XmlPullParserFactory; -import org.xmlpull.v1.XmlSerializer; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.io.OutputStreamWriter; -import java.io.Writer; -import java.math.BigDecimal; -import java.sql.Timestamp; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.zip.GZIPOutputStream; - -import static org.gnucash.android.db.DatabaseSchema.ScheduledActionEntry; -import static org.gnucash.android.db.DatabaseSchema.SplitEntry; -import static org.gnucash.android.db.DatabaseSchema.TransactionEntry; /** * Creates a GnuCash CSV account representation of the accounts and transactions @@ -79,12 +35,6 @@ * @author Semyannikov Gleb */ public class CsvAccountExporter extends Exporter{ - - /** - * Root account for template accounts - */ - private Account mRootTemplateAccount; - private Map mTransactionToTemplateAccountMap = new TreeMap<>(); private char mCsvSeparator; /** @@ -156,15 +106,7 @@ public void generateExport(final CsvWriter writer) throws ExporterException { names.add("tax"); names.add("place_holder"); - - List transactions = mTransactionsDbAdapter.getAllTransactions(); - List budgets = mBudgetsDbAdapter.getAllRecords(); List accounts = mAccountsDbAdapter.getAllRecords(); - List commodities = mCommoditiesDbAdapter.getAllRecords(); - List prices = mPricesDbAdapter.getAllRecords(); - List scheduledActions = mScheduledActionDbAdapter.getAllRecords(); - List splits = mSplitsDbAdapter.getAllRecords(); - for(int i = 0; i < names.size(); i++) { writer.write(names.get(i) + separator); @@ -190,14 +132,10 @@ public void generateExport(final CsvWriter writer) throws ExporterException { writer.write("CURRENCY" + separator); writer.write(account.isHidden()?"T":"F" + separator); - //Not exactly writer.write("F" + separator); writer.write(account.isPlaceholderAccount()?"T":"F" + separator); - - //writer.write(); - writer.write("\n"); } } catch (Exception e) { diff --git a/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java b/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java index 6e8c7ae63..e306cf1bf 100644 --- a/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java +++ b/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java @@ -16,66 +16,23 @@ package org.gnucash.android.export.csv; -import org.gnucash.android.export.xml.*; - -import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.net.Uri; -import android.util.Log; - import com.crashlytics.android.Crashlytics; -import org.gnucash.android.app.GnuCashApplication; -import org.gnucash.android.db.DatabaseSchema; -import org.gnucash.android.db.adapter.BooksDbAdapter; -import org.gnucash.android.db.adapter.CommoditiesDbAdapter; -import org.gnucash.android.db.adapter.RecurrenceDbAdapter; -import org.gnucash.android.db.adapter.TransactionsDbAdapter; -import org.gnucash.android.export.ExportFormat; import org.gnucash.android.export.ExportParams; import org.gnucash.android.export.Exporter; import org.gnucash.android.model.Account; -import org.gnucash.android.model.AccountType; -import org.gnucash.android.model.BaseModel; -import org.gnucash.android.model.Book; -import org.gnucash.android.model.Budget; -import org.gnucash.android.model.BudgetAmount; -import org.gnucash.android.model.Commodity; -import org.gnucash.android.model.Money; -import org.gnucash.android.model.PeriodType; -import org.gnucash.android.model.Price; -import org.gnucash.android.model.Recurrence; -import org.gnucash.android.model.ScheduledAction; import org.gnucash.android.model.Split; import org.gnucash.android.model.Transaction; -import org.gnucash.android.model.TransactionType; -import org.gnucash.android.util.BookUtils; -import org.gnucash.android.util.TimestampHelper; -import org.xmlpull.v1.XmlPullParserFactory; -import org.xmlpull.v1.XmlSerializer; - import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.io.OutputStreamWriter; -import java.io.Writer; -import java.math.BigDecimal; -import java.sql.Timestamp; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collection; import java.util.Date; import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.zip.GZIPOutputStream; - -import static org.gnucash.android.db.DatabaseSchema.ScheduledActionEntry; -import static org.gnucash.android.db.DatabaseSchema.SplitEntry; -import static org.gnucash.android.db.DatabaseSchema.TransactionEntry; /** * Creates a GnuCash CSV transactions representation of the accounts and transactions @@ -84,11 +41,6 @@ */ public class CsvTransactionsExporter extends Exporter{ - /** - * Root account for template accounts - */ - private Account mRootTemplateAccount; - private Map mTransactionToTemplateAccountMap = new TreeMap<>(); private char mCsvSeparator; /** @@ -164,15 +116,7 @@ public void generateExport(final CsvWriter writer) throws ExporterException { names.add("To Rate/Price"); names.add("From Rate/Price"); - List transactions = mTransactionsDbAdapter.getAllTransactions(); - //List budgets = mBudgetsDbAdapter.getAllRecords(); - //List accounts = mAccountsDbAdapter.getAllRecords(); - //List commodities = mCommoditiesDbAdapter.getAllRecords(); - //List prices = mPricesDbAdapter.getAllRecords(); - //List scheduledActions = mScheduledActionDbAdapter.getAllRecords(); - //List splits = mSplitsDbAdapter.getAllRecords(); - for(int i = 0; i < names.size(); i++) { writer.write(names.get(i) + separator); @@ -206,13 +150,9 @@ public void generateExport(final CsvWriter writer) throws ExporterException { writer.write(separator); writer.write(transaction.getDescription() + separator); - writer.write(transaction.getNote() + separator); - writer.write((split.getMemo()==null?"":split.getMemo()) + separator); - writer.write((account_pair.getName()==null?"":account_pair.getName()) + separator); - writer.write((split.getType().name()) + separator); //Action From 13f243b3e5a0183c8657eec61bfad649d9cfb2d4 Mon Sep 17 00:00:00 2001 From: AngelicosPhosphoros Date: Tue, 23 Jan 2018 21:12:45 +0300 Subject: [PATCH 09/11] Transaction export refactored. Cursor based iteration over transactions --- .../export/csv/CsvTransactionsExporter.java | 116 +++++++++++++----- 1 file changed, 84 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java b/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java index e306cf1bf..a3207148c 100644 --- a/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java +++ b/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java @@ -17,13 +17,18 @@ package org.gnucash.android.export.csv; import android.database.sqlite.SQLiteDatabase; +import android.database.Cursor; import com.crashlytics.android.Crashlytics; import org.gnucash.android.export.ExportParams; import org.gnucash.android.export.Exporter; import org.gnucash.android.model.Account; +import org.gnucash.android.model.Commodity; +import org.gnucash.android.model.Money; import org.gnucash.android.model.Split; import org.gnucash.android.model.Transaction; +import org.gnucash.android.model.TransactionType; + import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; @@ -31,6 +36,8 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.List; @@ -43,6 +50,21 @@ public class CsvTransactionsExporter extends Exporter{ private char mCsvSeparator; + private DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); + + private Comparator splitComparator = new Comparator() { + @Override + public int compare(Split o1, Split o2) { + if(o1.getType() == TransactionType.DEBIT + && o2.getType() == TransactionType.CREDIT) + return -1; + if (o1.getType() == TransactionType.CREDIT + && o2.getType() == TransactionType.DEBIT) + return 1; + return 0; + } + }; + /** * Construct a new exporter with export parameters * @param params Parameters for the export @@ -95,6 +117,57 @@ public List generateExport() throws ExporterException { return exportedFiles; } + private void write_split(final Transaction transaction, final Split split, final CsvWriter writer) throws IOException + { + String separator = mCsvSeparator + ""; + Account account = mAccountsDbAdapter.getRecord(split.getAccountUID()); + + // Date + Date date = new Date(transaction.getTimeMillis()); + writer.write(dateFormat.format(date) + separator); + // Account name + writer.write(account.getName() + separator); + // TODO:Number is not defined yet? + writer.write( separator); + // Description + writer.write(transaction.getDescription() + separator); + // Notes of transaction + writer.write(transaction.getNote() + separator); + // Memo + writer.write( + (split.getMemo()==null? + "":split.getMemo()) + separator); + // TODO:Category is not defined yet? + writer.write(separator); + // Type + writer.write(split.getType().name() + separator); + // TODO:Action is not defined yet? + writer.write(separator); + // Reconcile + writer.write(split.getReconcileState() + separator); + + // Changes + Money change = split.getFormattedQuantity().withCurrency(transaction.getCommodity()); + Money zero = Money.getZeroInstance().withCurrency(transaction.getCommodity()); + // To currency; From currency; To; From + if (change.isNegative()) { + writer.write(zero.toPlainString() + separator); + writer.write(change.abs().toPlainString() + separator); + writer.write(Money.getZeroInstance().toPlainString() + separator); + writer.write(split.getFormattedQuantity().abs().toPlainString() + separator); + } + else { + writer.write(change.abs().toPlainString() + separator); + writer.write(zero.toPlainString() + separator); + writer.write(split.getFormattedQuantity().abs().toPlainString() + separator); + writer.write(Money.getZeroInstance().toPlainString() + separator); + } + + // TODO: What is price? + writer.write(separator); + writer.write(separator); + } + public void generateExport(final CsvWriter writer) throws ExporterException { try { String separator = mCsvSeparator + ""; @@ -122,9 +195,14 @@ public void generateExport(final CsvWriter writer) throws ExporterException { writer.write(names.get(i) + separator); } writer.write("\n"); - for(int i = 0; i < transactions.size(); i++) { - Transaction transaction = transactions.get(i); + + + Cursor cursor = mTransactionsDbAdapter.fetchAllRecords(); + while (cursor.moveToNext()) + { + Transaction transaction = mTransactionsDbAdapter.buildModelInstance(cursor); List splits = transaction.getSplits(); + Collections.sort(splits,splitComparator); for (int j = 0; j < splits.size()/2; j++) { Split split = splits.get(j); Split pair = null; @@ -134,38 +212,12 @@ public void generateExport(final CsvWriter writer) throws ExporterException { } } - Account account = mAccountsDbAdapter.getRecord(split.getAccountUID()); - Account account_pair = null; + write_split(transaction, split, writer); + writer.write("\n"); if (pair != null) { - account_pair = mAccountsDbAdapter.getRecord(pair.getAccountUID()); + write_split(transaction, pair, writer); + writer.write("\n"); } - - Date date = new Date(transaction.getTimeMillis()); - DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); - writer.write(df.format(date) + separator); - - writer.write(account.getName() + separator); - - //Number - writer.write(separator); - - writer.write(transaction.getDescription() + separator); - writer.write(transaction.getNote() + separator); - writer.write((split.getMemo()==null?"":split.getMemo()) + separator); - writer.write((account_pair.getName()==null?"":account_pair.getName()) + separator); - writer.write((split.getType().name()) + separator); - - //Action - writer.write(separator); - - writer.write(split.getReconcileState() + separator); - - writer.write(split.getFormattedQuantity().toPlainString() + separator); - writer.write(separator); - writer.write(split.getFormattedQuantity().toPlainString() + separator); - writer.write(separator); - writer.write(separator); - writer.write("\n"); } } From 0aae30a1403e7446c01022d4c26985a7e3aae4cd Mon Sep 17 00:00:00 2001 From: AngelicosPhosphoros Date: Tue, 23 Jan 2018 21:25:45 +0300 Subject: [PATCH 10/11] Contributors updated --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 4bdb9a6c0..d5f100d38 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -55,6 +55,7 @@ The following people (in alphabetical order) contributed (commits on GitHub) to * Stephan Windmüller * Terry Chung * thesebas thesebas@thesebas.net +* Timur Badretdinov * Timur Khuzin * Vladimir Rutsky * Weslly Oliveira From 034bf52022173d01418726baa4908de2cbddb3bc Mon Sep 17 00:00:00 2001 From: Ngewi Fet Date: Tue, 27 Feb 2018 18:55:53 +0100 Subject: [PATCH 11/11] Hide CSV export separator label when another export format is selected --- .../android/export/csv/CsvTransactionsExporter.java | 7 ++++--- .../gnucash/android/ui/export/ExportFormFragment.java | 9 +++++---- app/src/main/res/layout/fragment_export_form.xml | 4 +++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java b/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java index a3207148c..46ef62ab2 100644 --- a/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java +++ b/app/src/main/java/org/gnucash/android/export/csv/CsvTransactionsExporter.java @@ -16,14 +16,14 @@ package org.gnucash.android.export.csv; -import android.database.sqlite.SQLiteDatabase; import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + import com.crashlytics.android.Crashlytics; import org.gnucash.android.export.ExportParams; import org.gnucash.android.export.Exporter; import org.gnucash.android.model.Account; -import org.gnucash.android.model.Commodity; import org.gnucash.android.model.Money; import org.gnucash.android.model.Split; import org.gnucash.android.model.Transaction; @@ -40,6 +40,7 @@ import java.util.Comparator; import java.util.Date; import java.util.List; +import java.util.Locale; /** * Creates a GnuCash CSV transactions representation of the accounts and transactions @@ -50,7 +51,7 @@ public class CsvTransactionsExporter extends Exporter{ private char mCsvSeparator; - private DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); + private DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.US); private Comparator splitComparator = new Comparator() { @Override diff --git a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java index 43ca6c6bc..285c7a84f 100644 --- a/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/export/ExportFormFragment.java @@ -144,6 +144,7 @@ public class ExportFormFragment extends Fragment implements @BindView(R.id.radio_separator_comma_format) RadioButton mSeparatorCommaButton; @BindView(R.id.radio_separator_colon_format) RadioButton mSeparatorColonButton; @BindView(R.id.radio_separator_semicolon_format) RadioButton mSeparatorSemicolonButton; + @BindView(R.id.layout_csv_options) LinearLayout mCsvOptionsLayout; @BindView(R.id.recurrence_options) View mRecurrenceOptionsView; /** @@ -207,27 +208,27 @@ private void onRadioButtonClicked(View view){ mExportWarningTextView.setVisibility(View.GONE); } mExportDateLayout.setVisibility(View.VISIBLE); - mExportSeparatorLayout.setVisibility(View.GONE); + mCsvOptionsLayout.setVisibility(View.GONE); break; case R.id.radio_xml_format: mExportFormat = ExportFormat.XML; mExportWarningTextView.setText(R.string.export_warning_xml); mExportDateLayout.setVisibility(View.GONE); - mExportSeparatorLayout.setVisibility(View.GONE); + mCsvOptionsLayout.setVisibility(View.GONE); break; case R.id.radio_csv_accounts_format: mExportFormat = ExportFormat.CSVA; mExportWarningTextView.setText(""); mExportDateLayout.setVisibility(View.GONE); - mExportSeparatorLayout.setVisibility(View.VISIBLE); + mCsvOptionsLayout.setVisibility(View.VISIBLE); break; case R.id.radio_csv_transactions_format: mExportFormat = ExportFormat.CSVT; mExportWarningTextView.setText(""); mExportDateLayout.setVisibility(View.GONE); - mExportSeparatorLayout.setVisibility(View.VISIBLE); + mCsvOptionsLayout.setVisibility(View.VISIBLE); break; case R.id.radio_separator_comma_format: diff --git a/app/src/main/res/layout/fragment_export_form.xml b/app/src/main/res/layout/fragment_export_form.xml index 65632118f..5844a2300 100644 --- a/app/src/main/res/layout/fragment_export_form.xml +++ b/app/src/main/res/layout/fragment_export_form.xml @@ -105,7 +105,9 @@ android:text="CSV-trans"/> -