summaryrefslogtreecommitdiffstats
path: root/kmymoney2/converter/mymoneyqifwriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmymoney2/converter/mymoneyqifwriter.cpp')
-rw-r--r--kmymoney2/converter/mymoneyqifwriter.cpp254
1 files changed, 254 insertions, 0 deletions
diff --git a/kmymoney2/converter/mymoneyqifwriter.cpp b/kmymoney2/converter/mymoneyqifwriter.cpp
new file mode 100644
index 0000000..9526acd
--- /dev/null
+++ b/kmymoney2/converter/mymoneyqifwriter.cpp
@@ -0,0 +1,254 @@
+/***************************************************************************
+ mymoneyqifwriter.cpp - description
+ -------------------
+ begin : Sun Jan 5 2003
+ copyright : (C) 2000-2003 by Michael Edwardes
+ Javier Campos Morales <[email protected]>
+ Felix Rodriguez <[email protected]>
+ Thomas Baumgart <[email protected]>
+ Kevin Tambascio <[email protected]>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+// ----------------------------------------------------------------------------
+// QT Headers
+
+#include <qfile.h>
+#include <qtextstream.h>
+
+// ----------------------------------------------------------------------------
+// KDE Headers
+
+#include <klocale.h>
+#include <kmessagebox.h>
+
+// ----------------------------------------------------------------------------
+// Project Headers
+
+#include "mymoneyqifwriter.h"
+#include "../mymoney/mymoneyfile.h"
+
+MyMoneyQifWriter::MyMoneyQifWriter()
+{
+}
+
+MyMoneyQifWriter::~MyMoneyQifWriter()
+{
+}
+
+void MyMoneyQifWriter::write(const QString& filename, const QString& profile,
+ const QString& accountId, const bool accountData,
+ const bool categoryData,
+ const QDate& startDate, const QDate& endDate)
+{
+ m_qifProfile.loadProfile("Profile-" + profile);
+
+ QFile qifFile(filename);
+ if(qifFile.open(IO_WriteOnly)) {
+ QTextStream s(&qifFile);
+
+ try {
+ if(categoryData) {
+ writeCategoryEntries(s);
+ }
+
+ if(accountData) {
+ writeAccountEntry(s, accountId, startDate, endDate);
+ }
+ emit signalProgress(-1, -1);
+
+ } catch(MyMoneyException *e) {
+ QString errMsg = i18n("Unexpected exception '%1' thrown in %2, line %3 "
+ "caught in MyMoneyQifWriter::write()")
+ .arg(e->what()).arg(e->file()).arg(e->line());
+
+ KMessageBox::error(0, errMsg);
+ delete e;
+ }
+
+ qifFile.close();
+ } else {
+ KMessageBox::error(0, i18n("Unable to open file '%1' for writing").arg(filename));
+ }
+}
+
+void MyMoneyQifWriter::writeAccountEntry(QTextStream &s, const QString& accountId, const QDate& startDate, const QDate& endDate)
+{
+ MyMoneyFile* file = MyMoneyFile::instance();
+ MyMoneyAccount account;
+
+ account = file->account(accountId);
+ MyMoneyTransactionFilter filter(accountId);
+ filter.setDateFilter(startDate, endDate);
+ QValueList<MyMoneyTransaction> list = file->transactionList(filter);
+ QString openingBalanceTransactionId;
+
+ s << "!Type:" << m_qifProfile.profileType() << endl;
+ if(!startDate.isValid() || startDate <= account.openingDate()) {
+ s << "D" << m_qifProfile.date(account.openingDate()) << endl;
+ openingBalanceTransactionId = file->openingBalanceTransaction(account);
+ MyMoneySplit split;
+ if(!openingBalanceTransactionId.isEmpty()) {
+ MyMoneyTransaction openingBalanceTransaction = file->transaction(openingBalanceTransactionId);
+ split = openingBalanceTransaction.splitByAccount(account.id(), true /* match */);
+ }
+ s << "T" << m_qifProfile.value('T', split.value()) << endl;
+ } else {
+ s << "D" << m_qifProfile.date(startDate) << endl;
+ s << "T" << m_qifProfile.value('T', file->balance(accountId, startDate.addDays(-1))) << endl;
+ }
+ s << "CX" << endl;
+ s << "P" << m_qifProfile.openingBalanceText() << endl;
+ s << "L";
+ if(m_qifProfile.accountDelimiter().length())
+ s << m_qifProfile.accountDelimiter()[0];
+ s << account.name();
+ if(m_qifProfile.accountDelimiter().length() > 1)
+ s << m_qifProfile.accountDelimiter()[1];
+ s << endl;
+ s << "^" << endl;
+
+ QValueList<MyMoneyTransaction>::ConstIterator it;
+ signalProgress(0, list.count());
+ int count = 0;
+ for(it = list.begin(); it != list.end(); ++it) {
+ // don't include the openingBalanceTransaction again
+ if((*it).id() != openingBalanceTransactionId)
+ writeTransactionEntry(s, *it, accountId);
+ signalProgress(++count, 0);
+ }
+}
+
+void MyMoneyQifWriter::writeCategoryEntries(QTextStream &s)
+{
+ MyMoneyFile* file = MyMoneyFile::instance();
+ MyMoneyAccount income;
+ MyMoneyAccount expense;
+
+ income = file->income();
+ expense = file->expense();
+
+ s << "!Type:Cat" << endl;
+ QStringList list = income.accountList() + expense.accountList();
+ emit signalProgress(0, list.count());
+ QStringList::Iterator it;
+ int count = 0;
+ for(it = list.begin(); it != list.end(); ++it) {
+ writeCategoryEntry(s, *it, "");
+ emit signalProgress(++count, 0);
+ }
+}
+
+void MyMoneyQifWriter::writeCategoryEntry(QTextStream &s, const QString& accountId, const QString& leadIn)
+{
+ MyMoneyAccount acc = MyMoneyFile::instance()->account(accountId);
+ QString name = acc.name();
+
+ s << "N" << leadIn << name << endl;
+ s << (MyMoneyAccount::accountGroup(acc.accountType()) == MyMoneyAccount::Expense ? "E" : "I") << endl;
+ s << "^" << endl;
+
+ QStringList list = acc.accountList();
+ QStringList::Iterator it;
+ name += ":";
+ for(it = list.begin(); it != list.end(); ++it) {
+ writeCategoryEntry(s, *it, name);
+ }
+}
+
+void MyMoneyQifWriter::writeTransactionEntry(QTextStream &s, const MyMoneyTransaction& t, const QString& accountId)
+{
+ MyMoneyFile* file = MyMoneyFile::instance();
+ MyMoneySplit split = t.splitByAccount(accountId);
+
+ s << "D" << m_qifProfile.date(t.postDate()) << endl;
+
+ switch(split.reconcileFlag()) {
+ case MyMoneySplit::Cleared:
+ s << "C*" << endl;
+ break;
+
+ case MyMoneySplit::Reconciled:
+ case MyMoneySplit::Frozen:
+ s << "CX" << endl;
+ break;
+
+ default:
+ break;
+ }
+
+ if(split.memo().length() > 0) {
+ QString m = split.memo();
+ m.replace('\n', "\\n");
+ s << "M" << m << endl;
+ }
+
+ s << "T" << m_qifProfile.value('T', split.value()) << endl;
+
+ if(split.number().length() > 0)
+ s << "N" << split.number() << endl;
+
+ if(!split.payeeId().isEmpty()) {
+ MyMoneyPayee payee = file->payee(split.payeeId());
+ s << "P" << payee.name() << endl;
+ }
+
+ QValueList<MyMoneySplit> list = t.splits();
+ if(list.count() > 1) {
+ MyMoneySplit sp = t.splitByAccount(accountId, false);
+ MyMoneyAccount acc = file->account(sp.accountId());
+ if(acc.accountGroup() != MyMoneyAccount::Income
+ && acc.accountGroup() != MyMoneyAccount::Expense) {
+ s << "L" << m_qifProfile.accountDelimiter()[0]
+ << MyMoneyFile::instance()->accountToCategory(sp.accountId())
+ << m_qifProfile.accountDelimiter()[1] << endl;
+ } else {
+ s << "L" << file->accountToCategory(sp.accountId()) << endl;
+ }
+ if(list.count() > 2) {
+ QValueList<MyMoneySplit>::ConstIterator it;
+ for(it = list.begin(); it != list.end(); ++it) {
+ if(!((*it) == split)) {
+ writeSplitEntry(s, *it);
+ }
+ }
+ }
+ }
+ s << "^" << endl;
+}
+
+void MyMoneyQifWriter::writeSplitEntry(QTextStream& s, const MyMoneySplit& split)
+{
+ MyMoneyFile* file = MyMoneyFile::instance();
+
+ s << "S";
+ MyMoneyAccount acc = file->account(split.accountId());
+ if(acc.accountGroup() != MyMoneyAccount::Income
+ && acc.accountGroup() != MyMoneyAccount::Expense) {
+ s << m_qifProfile.accountDelimiter()[0]
+ << file->accountToCategory(split.accountId())
+ << m_qifProfile.accountDelimiter()[1];
+ } else {
+ s << file->accountToCategory(split.accountId());
+ }
+ s << endl;
+
+ if(split.memo().length() > 0) {
+ QString m = split.memo();
+ m.replace('\n', "\\n");
+ s << "E" << m << endl;
+ }
+
+ s << "$" << m_qifProfile.value('$', -split.value()) << endl;
+}
+
+#include "mymoneyqifwriter.moc"