diff --git a/src/core/marketplace.cpp b/src/core/marketplace.cpp index 38abcf9..426080e 100644 --- a/src/core/marketplace.cpp +++ b/src/core/marketplace.cpp @@ -2,6 +2,7 @@ #include "database.h" #include +#include #include #include #include @@ -133,6 +134,27 @@ void Marketplace::removeSale(boost::uuids::uuid uuid) sales_.end()); } +void Marketplace::exportReportToCSV(const std::string& filename, int feeInPercent, int maxFeeInEuro) +{ + const unsigned 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) { 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 << std::put_money(sumInCent - marketFee(sumInCent, percent, maxFeeInCent), false); 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(); } \ No newline at end of file diff --git a/src/core/marketplace.h b/src/core/marketplace.h index 203079d..b6613f1 100644 --- a/src/core/marketplace.h +++ b/src/core/marketplace.h @@ -41,6 +41,8 @@ class Marketplace void finishCurrentSale(std::unique_ptr sale); void removeSale(boost::uuids::uuid uuid); + void exportReportToCSV(const std::string& filename, int feeInPercent, int maxFeeInEuro); + private: SellersVec sellers_; SalesVec sales_; @@ -50,5 +52,6 @@ class Marketplace double marketFee(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 escapeCsvValue(const std::string& value, const char delimiter); #endif \ No newline at end of file diff --git a/src/gui/reportdialog.cpp b/src/gui/reportdialog.cpp index 9d5e9e2..f598c80 100644 --- a/src/gui/reportdialog.cpp +++ b/src/gui/reportdialog.cpp @@ -2,6 +2,9 @@ #include "mainwindow.h" +#include +#include + ReportDialog::ReportDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f) { ui_.setupUi(this); @@ -9,4 +12,21 @@ ReportDialog::ReportDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, model_ = std::make_unique(market_, ui_.reportView); ui_.reportView->setModel(model_.get()); 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); + } } \ No newline at end of file diff --git a/src/gui/reportdialog.h b/src/gui/reportdialog.h index 987cf73..a6c21d6 100644 --- a/src/gui/reportdialog.h +++ b/src/gui/reportdialog.h @@ -17,7 +17,10 @@ class ReportDialog : public QDialog ReportDialog(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowTitleHint | Qt::WindowSystemMenuHint); - private: + private slots: + void onExportCsvButtonClicked(); + + private: Ui::ReportDialog ui_; Marketplace* market_; std::unique_ptr model_; diff --git a/src/gui/reportdialog.ui b/src/gui/reportdialog.ui index fc2525f..68e480a 100644 --- a/src/gui/reportdialog.ui +++ b/src/gui/reportdialog.ui @@ -39,7 +39,7 @@ - + Exportieren (.csv)