You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmymoney/kmymoney2/converter/mymoneyqifwriter.cpp

260 lines
8.3 KiB

/***************************************************************************
mymoneyqifwriter.cpp - description
-------------------
begin : Sun Jan 5 2003
copyright : (C) 2000-2003 by Michael Edwardes
email : mte@users.sourceforge.net
Javier Campos Morales <javi_c@users.sourceforge.net>
Felix Rodriguez <frodriguez@users.sourceforge.net>
John C <thetacoturtle@users.sourceforge.net>
Thomas Baumgart <ipwizard@users.sourceforge.net>
Kevin Tambascio <ktambascio@users.sourceforge.net>
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
// ----------------------------------------------------------------------------
// QT Headers
#include <tqfile.h>
#include <tqtextstream.h>
// ----------------------------------------------------------------------------
// KDE Headers
#include <tdelocale.h>
#include <tdemessagebox.h>
// ----------------------------------------------------------------------------
// Project Headers
#include "mymoneyqifwriter.h"
#include "../mymoney/mymoneyfile.h"
MyMoneyQifWriter::MyMoneyQifWriter()
{
}
MyMoneyQifWriter::~MyMoneyQifWriter()
{
}
void MyMoneyQifWriter::write(const TQString& filename, const TQString& profile,
const TQString& accountId, const bool accountData,
const bool categoryData,
const TQDate& startDate, const TQDate& endDate)
{
m_qifProfile.loadProfile("Profile-" + profile);
TQFile qifFile(filename);
if(qifFile.open(IO_WriteOnly)) {
TQTextStream s(&qifFile);
try {
if(categoryData) {
writeCategoryEntries(s);
}
if(accountData) {
writeAccountEntry(s, accountId, startDate, endDate);
}
emit signalProgress(-1, -1);
} catch(MyMoneyException *e) {
TQString 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(TQTextStream &s, const TQString& accountId, const TQDate& startDate, const TQDate& endDate)
{
MyMoneyFile* file = MyMoneyFile::instance();
MyMoneyAccount account;
account = file->account(accountId);
MyMoneyTransactionFilter filter(accountId);
filter.setDateFilter(startDate, endDate);
TQValueList<MyMoneyTransaction> list = file->transactionList(filter);
TQString 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;
TQValueList<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(TQTextStream &s)
{
MyMoneyFile* file = MyMoneyFile::instance();
MyMoneyAccount income;
MyMoneyAccount expense;
income = file->income();
expense = file->expense();
s << "!Type:Cat" << endl;
TQStringList list = income.accountList() + expense.accountList();
emit signalProgress(0, list.count());
TQStringList::Iterator it;
int count = 0;
for(it = list.begin(); it != list.end(); ++it) {
writeCategoryEntry(s, *it, "");
emit signalProgress(++count, 0);
}
}
void MyMoneyQifWriter::writeCategoryEntry(TQTextStream &s, const TQString& accountId, const TQString& leadIn)
{
MyMoneyAccount acc = MyMoneyFile::instance()->account(accountId);
TQString name = acc.name();
s << "N" << leadIn << name << endl;
s << (MyMoneyAccount::accountGroup(acc.accountType()) == MyMoneyAccount::Expense ? "E" : "I") << endl;
s << "^" << endl;
TQStringList list = acc.accountList();
TQStringList::Iterator it;
name += ":";
for(it = list.begin(); it != list.end(); ++it) {
writeCategoryEntry(s, *it, name);
}
}
void MyMoneyQifWriter::writeTransactionEntry(TQTextStream &s, const MyMoneyTransaction& t, const TQString& 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) {
TQString 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;
}
TQValueList<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) {
TQValueList<MyMoneySplit>::ConstIterator it;
for(it = list.begin(); it != list.end(); ++it) {
if(!((*it) == split)) {
writeSplitEntry(s, *it);
}
}
}
}
s << "^" << endl;
}
void MyMoneyQifWriter::writeSplitEntry(TQTextStream& 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) {
TQString m = split.memo();
m.replace('\n', "\\n");
s << "E" << m << endl;
}
s << "$" << m_qifProfile.value('$', -split.value()) << endl;
}
#include "mymoneyqifwriter.moc"