diff options
Diffstat (limited to 'kmymoney2/converter/mymoneyqifwriter.cpp')
-rw-r--r-- | kmymoney2/converter/mymoneyqifwriter.cpp | 254 |
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 + email : [email protected] + Javier Campos Morales <[email protected]> + Felix Rodriguez <[email protected]> + John C <[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" |