From 4a41036aec01ebdd39d3352c00214029c545b629 Mon Sep 17 00:00:00 2001 From: Martin Brodbeck Date: Tue, 31 Jul 2018 16:15:48 +0200 Subject: [PATCH] now printing reports --- src/core/marketplace.cpp | 41 ++++++++++++++++++ src/core/marketplace.h | 6 +++ src/gui/CMakeLists.txt | 3 +- src/gui/reportdialog.cpp | 90 ++++++++++++++++++++++++++++++++++++++-- src/gui/reportdialog.h | 1 + src/gui/reportdialog.ui | 2 +- 6 files changed, 138 insertions(+), 5 deletions(-) diff --git a/src/core/marketplace.cpp b/src/core/marketplace.cpp index aab11de..90dc0fa 100644 --- a/src/core/marketplace.cpp +++ b/src/core/marketplace.cpp @@ -155,6 +155,47 @@ void Marketplace::exportReportToCSV(const std::string& filename, int feeInPercen } } +int Marketplace::getOverallSumInCent() +{ + int sum = std::accumulate(sellers_.begin(), sellers_.end(), 0, + [](int a, const auto& b) { return a + b->sumInCents(); }); + return sum; +} + +std::string Marketplace::getOverallSumAsString() +{ + int sum = getOverallSumInCent(); + std::stringstream sumStream; + sumStream << std::right << std::setw(10) << std::showbase << std::put_money(sum, false); + return sumStream.str(); +} + +int Marketplace::getOverallPaymentInCent(int percent, int maxFee) +{ + int sum = std::accumulate( + sellers_.begin(), sellers_.end(), 0, [percent, maxFee](int a, const auto& b) { + return a + b->sumInCents() - marketFee(b->sumInCents(), percent, maxFee); + }); + return sum; +} + +std::string Marketplace::getOverallPaymentAsString(int percent, int maxFee) +{ + int sum = getOverallPaymentInCent(percent, maxFee); + std::stringstream sumStream; + sumStream << std::right << std::setw(10) << std::showbase << std::put_money(sum, false); + return sumStream.str(); +} + +std::string Marketplace::getOverallRevenueAsString(int percent, int maxFee) +{ + int sum = getOverallSumInCent(); + int pay = getOverallPaymentInCent(percent, maxFee); + std::stringstream sumStream; + sumStream << std::right << std::setw(10) << std::showbase << std::put_money(sum - pay, false); + return sumStream.str(); +} + double marketFee(int sum, int percent, int maxFee) { int fee = (sum * percent) / 100.0L; diff --git a/src/core/marketplace.h b/src/core/marketplace.h index b6613f1..98ec978 100644 --- a/src/core/marketplace.h +++ b/src/core/marketplace.h @@ -41,6 +41,12 @@ class Marketplace void finishCurrentSale(std::unique_ptr sale); void removeSale(boost::uuids::uuid uuid); + int getOverallSumInCent(); + std::string getOverallSumAsString(); + int getOverallPaymentInCent(int percent, int maxFee); + std::string getOverallPaymentAsString(int percent, int maxFee); + std::string getOverallRevenueAsString(int percent, int maxFee); + void exportReportToCSV(const std::string& filename, int feeInPercent, int maxFeeInEuro); private: diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index a76e44b..15dcd54 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -7,6 +7,7 @@ set(CMAKE_AUTOUIC ON) # Find the QtWidgets library find_package(Qt5Widgets CONFIG REQUIRED) +find_package(Qt5PrintSupport CONFIG REQUIRED) set(GUI_SOURCES kima2.cpp @@ -28,4 +29,4 @@ set(GUI_SOURCES add_executable(kima2 ${GUI_SOURCES}) target_include_directories(kima2 PRIVATE ${PROJECT_BINARY_DIR}) -target_link_libraries(kima2 core Qt5::Widgets stdc++fs) +target_link_libraries(kima2 core Qt5::Widgets Qt5::PrintSupport stdc++fs) diff --git a/src/gui/reportdialog.cpp b/src/gui/reportdialog.cpp index f598c80..f1e61a0 100644 --- a/src/gui/reportdialog.cpp +++ b/src/gui/reportdialog.cpp @@ -3,7 +3,10 @@ #include "mainwindow.h" #include +#include #include +#include +#include ReportDialog::ReportDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f) { @@ -13,7 +16,10 @@ ReportDialog::ReportDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, ui_.reportView->setModel(model_.get()); ui_.reportView->hideColumn(0); - connect(ui_.exportCsvButton, &QPushButton::clicked, this, &ReportDialog::onExportCsvButtonClicked); + connect(ui_.exportCsvButton, &QPushButton::clicked, this, + &ReportDialog::onExportCsvButtonClicked); + connect(ui_.printReportButton, &QPushButton::clicked, this, + &ReportDialog::onPrintReportButtonClicked); } void ReportDialog::onExportCsvButtonClicked() @@ -27,6 +33,84 @@ void ReportDialog::onExportCsvButtonClicked() fileDialog.setNameFilter("CSV Files (*.csv)"); fileDialog.setAcceptMode(QFileDialog::AcceptSave); if (fileDialog.exec()) { - market_->exportReportToCSV(fileDialog.selectedFiles().at(0).toStdString(), feeInPercent, maxFeeInEuro); + market_->exportReportToCSV(fileDialog.selectedFiles().at(0).toStdString(), feeInPercent, + maxFeeInEuro); } -} \ No newline at end of file +} + +void ReportDialog::onPrintReportButtonClicked() +{ + QPrinter printer; + + QPrintDialog dialog(&printer, this); + dialog.setWindowTitle("Bericht drucken"); + + if (dialog.exec() != QDialog::Accepted) { + return; + } + + QSettings settings; + int feeInPercent = settings.value("global/feeInPercent").toInt(); + int maxFeeInEuro = settings.value("global/maxFeeInEuro").toInt(); + + QPainter painter; + int height = printer.height(); + int width = printer.width(); + const double ENTRIES_PER_PAGE = 50.0; + const auto& sellers = market_->getSellers(); + unsigned int numPages = std::ceil(sellers.size() / ENTRIES_PER_PAGE); + + painter.begin(&printer); + + for (unsigned int i = 1; i <= numPages; ++i) { + if (i > 1) + printer.newPage(); + painter.setFont(QFont("Arial", 16, QFont::Bold)); + painter.drawText(QRect(0, 0, width, height), Qt::AlignTop | Qt::AlignHCenter, + "Auswertung Kindersachenmarkt"); + painter.setFont(QFont("monospace", 12)); + QString content; + content += QString("%1 %2 %3 %4 %5 %6 %7") + .arg("Nr.", -3) + .arg("Nachname", -14) + .arg("Vorname", -14) + .arg("geliefert", -9) + .arg("verkauft", -8) + .arg("Umsatz", -10) + .arg("Auszahlung\n", -11); + content.append( + "---------------------------------------------------------------------------\n"); + for (unsigned int j = 0; j < ENTRIES_PER_PAGE && (i * j) < sellers.size(); ++j) { + content += QString("%1 %2 %3 %4 %5 %6 %7\n") + .arg(sellers.at(i * j)->getSellerNo(), 3) + .arg(sellers.at(i * j)->getLastName().c_str(), -14) + .arg(sellers.at(i * j)->getFirstName().c_str(), -14) + .arg(sellers.at(i * j)->numArticlesOffered(), 9) + .arg(sellers.at(i * j)->numArticlesSold(), 8) + .arg(sellers.at(i * j)->sumAsString().c_str(), 10) + .arg(paymentAsString(sellers.at(i * j)->sumInCents(), feeInPercent, + maxFeeInEuro * 100) + .c_str(), + 11); + } + painter.drawText(QRect(0, 50, width, height), Qt::AlignLeft, content); + } + + // now print the overall statistics + printer.newPage(); + painter.setFont(QFont("Arial", 16, QFont::Bold)); + painter.drawText(QRect(0, 0, width, height), Qt::AlignTop | Qt::AlignHCenter, + "Auswertung Kindersachenmarkt"); + painter.setFont(QFont("monospace", 12)); + QString content("Gesamtstatistik\n---------------\n\n"); + content += QString("Registrierte Verkäufer: %1\n").arg(sellers.size(), 6); + content += QString("Verkaufte Artikel: %1\n\n").arg(6, 6); + content += QString("Gesamtumsatz: %1\n").arg(market_->getOverallSumAsString().c_str(), 10); + content += QString("Ausgezahlt: %1\n") + .arg(market_->getOverallPaymentAsString(feeInPercent, maxFeeInEuro * 100).c_str(), 10); + content += QString("Verbleibend: %1\n") + .arg(market_->getOverallRevenueAsString(feeInPercent, maxFeeInEuro * 100).c_str(), 10); + painter.drawText(QRect(0, 50, width, height), Qt::AlignLeft, content); + + painter.end(); +} diff --git a/src/gui/reportdialog.h b/src/gui/reportdialog.h index a6c21d6..9ed9d38 100644 --- a/src/gui/reportdialog.h +++ b/src/gui/reportdialog.h @@ -19,6 +19,7 @@ class ReportDialog : public QDialog private slots: void onExportCsvButtonClicked(); + void onPrintReportButtonClicked(); private: Ui::ReportDialog ui_; diff --git a/src/gui/reportdialog.ui b/src/gui/reportdialog.ui index 68e480a..fbe0165 100644 --- a/src/gui/reportdialog.ui +++ b/src/gui/reportdialog.ui @@ -46,7 +46,7 @@ - + Übersicht drucken