/*
Copyright 2010-2013 Grégory Soutadé
This file is part of KissCount.
KissCount 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 3 of the License, or
(at your option) any later version.
KissCount is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with KissCount. If not, see .
*/
#include
#include
#include
#include "CSVExportEngine.hpp"
static CSVExportEngine csvExportEngine;
CSVExportEngine::CSVExportEngine()
{
KissCount::RegisterExportEngine(this);
_shortExt = ".csv";
_longExt = _("CSV files (*.csv)");
}
CSVExportEngine::~CSVExportEngine()
{
}
bool CSVExportEngine::HandleFile(const QString& path, User* user, Database* db, KissCount* kiss)
{
return ExportEngine::HandleFile(path, user, db, kiss);
}
bool CSVExportEngine::SaveAccounts()
{
Account account;
std::map::iterator it;
*_writer << "Accounts" << endl << endl;
*_writer << "id;name;number;blocked;virtual;hidden" << endl;
for(it=_accounts.begin(); it!=_accounts.end(); it++)
{
try
{
account = _user->GetAccount(it->first);
}
catch(User::AccountNotFound)
{
account.id = it->first;
account.name = "Unknown";
account.blocked = false;
account._virtual = false;
account.hidden = false;
}
ESCAPE_CHARS(account.name);
ESCAPE_CHARS(account.number);
*_writer << QString::number(account.id) << ";";
*_writer << "\"" << account.name << "\"" << ";";
*_writer << "\"" << account.number << "\"" << ";";
// *_writer << (account.shared ? "1" : "0") << ";";
*_writer << (account.blocked ? "1" : "0") << ";";
// *_writer << (account._default ? "1" : "0") << ";" ;
// *_writer << (account.is_owner ? "1" : "0") << ";";
*_writer << (account._virtual ? "1" : "0") << ";";
*_writer << (account.hidden ? "1" : "0");
*_writer << endl;
}
*_writer << endl << endl;
return true;
}
bool CSVExportEngine::SaveAccountAmounts()
{
std::map::iterator it;
QString v;
*_writer << "Account Amounts" << endl << endl;
*_writer << "id;month;year;amount" << endl;
for(it=_accountAmounts.begin(); it!=_accountAmounts.end(); it++)
{
*_writer << QString::number(it->first.account) << ";";
*_writer << QString::number(it->first.month+1) << ";";
*_writer << QString::number(it->first.year) << ";";
*_writer << v.sprintf("%d", it->second);
*_writer << endl;
}
*_writer << endl << endl;
return true;
}
bool CSVExportEngine::SaveCategories()
{
Category category;
std::map::iterator it;
int rgb;
QString v;
*_writer << "Categories" << endl << endl;
*_writer << "id;parent;name;font;backcolor;forecolor;fix_cost" << endl;
for(it=_categories.begin(); it!=_categories.end(); it++)
{
category = _user->GetCategory(it->first);
ESCAPE_CHARS(category.name);
*_writer << QString::number(category.id) << ";";
*_writer << QString::number(category.parent) << ";";
*_writer << "\"" << category.name << "\"" << ";";
*_writer << "\"" << category.font << "\"" << ";";
rgb = category.backcolor.blue();
rgb |= category.backcolor.green() << 8;
rgb |= category.backcolor.red() << 16;
*_writer << v.sprintf("0x%08X", rgb) << ";";
rgb = category.forecolor.blue();
rgb |= category.forecolor.green() << 8;
rgb |= category.forecolor.red() << 16;
*_writer << v.sprintf("0x%08X", rgb) << ";";
*_writer << (category.fix_cost ? "1" : "0");
*_writer << endl;
}
*_writer << endl << endl;
return true;
}
bool CSVExportEngine::SaveTags()
{
Tag tag;
std::map::iterator it;
QString v;
*_writer << "Tags" << endl << endl;
*_writer << "id;name" << endl;
for(it=_tags.begin(); it!=_tags.end(); it++)
{
tag = _user->GetTag(it->first);
ESCAPE_CHARS(tag.name);
*_writer << QString::number(tag.id) << ";";
*_writer << "\"" << tag.name << "\"";
*_writer << endl;
}
*_writer << endl << endl;
return true;
}
bool CSVExportEngine::SaveOperations(std::vector* operations)
{
std::vector::iterator it;
QString v;
*_writer << "Operations" << endl << endl;
*_writer << "id;parent;day;month;year;amount;description;category;fix_cost;account;checked;transfert;formula;meta;virtual;tag" << endl;
for(it=operations->begin(); it!=operations->end(); it++)
{
ESCAPE_CHARS(it->description);
*_writer << QString::number(it->id) << ";" ;
*_writer << QString::number(it->parent) << ";";
*_writer << QString::number(it->day+1) << ";";
*_writer << QString::number(it->month+1) << ";";
*_writer << QString::number(it->year) << ";";
*_writer << v.sprintf("%d", it->amount) << ";";
*_writer << "\"" << it->description << "\"" << ";";
*_writer << QString::number(it->category) << ";";
*_writer << (it->fix_cost ? "1" : "0") << ";";
*_writer << QString::number(it->account) << ";";
*_writer << (it->checked ? "1" : "0") << ";";
*_writer << QString::number(it->transfert) << ";";
*_writer << it->formula << ";";
*_writer << (it->meta ? "1" : "0") << ";";
*_writer << (it->_virtual ? "1" : "0") << ";";
*_writer << QString::number(it->tag);
*_writer << endl;
}
*_writer << endl << endl;
return true;
}
bool CSVExportEngine::SaveFile(std::vector* operations)
{
QFile file(_path);
int rc;
rc = ExportEngine::SaveFile(operations);
if (!rc) return false;
if (!file.open(QIODevice::ReadWrite|QIODevice::Truncate))
{
std::cout << "Error can't open the file " << _path.toStdString() << std::endl;
return false;
}
_writer = new QTextStream(&file);
_writer->setCodec("UTF-8");
SaveAccounts();
SaveAccountAmounts();
SaveCategories();
SaveTags();
SaveOperations(operations);
file.flush();
file.close();
delete _writer;
return true;
}