Compare commits

..

2 commits

Author SHA1 Message Date
b1570b3a99 code cleanup 2018-07-31 10:29:09 +02:00
46aab9a836 export report as csv file implemented 2018-07-31 10:28:07 +02:00
5 changed files with 75 additions and 2 deletions

View file

@ -2,6 +2,7 @@
#include "database.h" #include "database.h"
#include <algorithm> #include <algorithm>
#include <fstream>
#include <iomanip> #include <iomanip>
#include <numeric> #include <numeric>
#include <sstream> #include <sstream>
@ -133,6 +134,27 @@ void Marketplace::removeSale(boost::uuids::uuid uuid)
sales_.end()); sales_.end());
} }
void Marketplace::exportReportToCSV(const std::string& filename, int feeInPercent, int maxFeeInEuro)
{
const char delimiter = ',';
std::ofstream file(filename);
file << "Verk.Nr." << delimiter << "Nachname" << delimiter << "Vorname" << delimiter
<< "Anz. gemeldet" << delimiter << "Anz. verkauft" << delimiter << "Umsatz" << delimiter
<< "Auszahlung\n";
for (const auto& seller : sellers_) {
file << seller->getSellerNo() << delimiter
<< escapeCsvValue(seller->getLastName(), delimiter) << delimiter
<< escapeCsvValue(seller->getFirstName(), delimiter) << delimiter
<< seller->numArticlesOffered() << delimiter << seller->numArticlesSold() << delimiter
<< escapeCsvValue(seller->sumAsString(), delimiter) << delimiter
<< escapeCsvValue(paymentAsString(seller->sumInCents(), feeInPercent, maxFeeInEuro),
delimiter)
<< "\n";
}
}
double marketFee(int sum, int percent, int maxFee) double marketFee(int sum, int percent, int maxFee)
{ {
int fee = (sum * percent) / 100.0L; int fee = (sum * percent) / 100.0L;
@ -156,4 +178,29 @@ std::string paymentAsString(int sumInCent, int percent, int maxFeeInCent)
feeStream << std::right << std::setw(10) << std::showbase feeStream << std::right << std::setw(10) << std::showbase
<< std::put_money(sumInCent - marketFee(sumInCent, percent, maxFeeInCent), false); << std::put_money(sumInCent - marketFee(sumInCent, percent, maxFeeInCent), false);
return feeStream.str(); return feeStream.str();
}
std::string escapeCsvValue(const std::string& value, const char delimiter)
{
std::stringstream output;
bool containsDelim{false};
if (value.find(delimiter) != std::string::npos || value.find('"') != std::string::npos) {
containsDelim = true;
output << '"';
}
for (auto& symbol : value) {
if (symbol == '"') {
output << '"' << symbol;
} else {
output << symbol;
}
}
if (containsDelim) {
output << '"';
}
return output.str();
} }

View file

@ -41,6 +41,8 @@ class Marketplace
void finishCurrentSale(std::unique_ptr<Sale> sale); void finishCurrentSale(std::unique_ptr<Sale> sale);
void removeSale(boost::uuids::uuid uuid); void removeSale(boost::uuids::uuid uuid);
void exportReportToCSV(const std::string& filename, int feeInPercent, int maxFeeInEuro);
private: private:
SellersVec sellers_; SellersVec sellers_;
SalesVec sales_; SalesVec sales_;
@ -50,5 +52,6 @@ class Marketplace
double marketFee(int sumInCent, int percent, int maxFeeInCent); double marketFee(int sumInCent, int percent, int maxFeeInCent);
std::string marketFeeAsString(int sumInCent, int percent, int maxFeeInCent); std::string marketFeeAsString(int sumInCent, int percent, int maxFeeInCent);
std::string paymentAsString(int sumInCent, int percent, int maxFeeInCent); std::string paymentAsString(int sumInCent, int percent, int maxFeeInCent);
std::string escapeCsvValue(const std::string& value, const char delimiter);
#endif #endif

View file

@ -2,6 +2,9 @@
#include "mainwindow.h" #include "mainwindow.h"
#include <QFileDialog>
#include <QSettings>
ReportDialog::ReportDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f) ReportDialog::ReportDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f)
{ {
ui_.setupUi(this); ui_.setupUi(this);
@ -9,4 +12,21 @@ ReportDialog::ReportDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent,
model_ = std::make_unique<ReportModel>(market_, ui_.reportView); model_ = std::make_unique<ReportModel>(market_, ui_.reportView);
ui_.reportView->setModel(model_.get()); ui_.reportView->setModel(model_.get());
ui_.reportView->hideColumn(0); ui_.reportView->hideColumn(0);
connect(ui_.exportCsvButton, &QPushButton::clicked, this, &ReportDialog::onExportCsvButtonClicked);
}
void ReportDialog::onExportCsvButtonClicked()
{
QSettings settings;
int feeInPercent = settings.value("global/feeInPercent").toInt();
int maxFeeInEuro = settings.value("global/maxFeeInEuro").toInt();
QFileDialog fileDialog(this);
fileDialog.setFileMode(QFileDialog::AnyFile);
fileDialog.setNameFilter("CSV Files (*.csv)");
fileDialog.setAcceptMode(QFileDialog::AcceptSave);
if (fileDialog.exec()) {
market_->exportReportToCSV(fileDialog.selectedFiles().at(0).toStdString(), feeInPercent, maxFeeInEuro);
}
} }

View file

@ -17,7 +17,10 @@ class ReportDialog : public QDialog
ReportDialog(QWidget* parent = nullptr, ReportDialog(QWidget* parent = nullptr,
Qt::WindowFlags f = Qt::WindowTitleHint | Qt::WindowSystemMenuHint); Qt::WindowFlags f = Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
private: private slots:
void onExportCsvButtonClicked();
private:
Ui::ReportDialog ui_; Ui::ReportDialog ui_;
Marketplace* market_; Marketplace* market_;
std::unique_ptr<ReportModel> model_; std::unique_ptr<ReportModel> model_;

View file

@ -39,7 +39,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="pushButton_2"> <widget class="QPushButton" name="exportCsvButton">
<property name="text"> <property name="text">
<string>Exportieren (.csv)</string> <string>Exportieren (.csv)</string>
</property> </property>