new report dialog

This commit is contained in:
Martin Brodbeck 2018-07-30 09:50:54 +02:00
parent efb1f3ffbf
commit 06c99052df
12 changed files with 334 additions and 1 deletions

View file

@ -134,4 +134,26 @@ void Marketplace::removeSale(boost::uuids::uuid uuid)
sales_.erase(std::remove_if(sales_.begin(), sales_.end(),
[&uuid](const auto& a) { return a->getUuid() == uuid; }),
sales_.end());
}
double marketFee(int sum, int percent, int maxFee)
{
int fee = (sum * percent) / 100.0L;
return fee > maxFee ? maxFee : fee;
}
std::string marketFeeAsString(int sum, int percent, int maxFee)
{
std::stringstream feeStream;
feeStream << std::right << std::setw(12) << std::showbase
<< std::put_money(marketFee(sum, percent, maxFee), false);
return feeStream.str();
}
std::string paymentAsString(int sum, int percent)
{
std::stringstream feeStream;
feeStream << std::right << std::setw(12) << std::showbase
<< std::put_money(sum - marketFee(sum, percent), false);
return feeStream.str();
}

View file

@ -47,4 +47,8 @@ class Marketplace
BasketVec basket_;
};
double marketFee(int sum, int percent, int maxFee = 5000);
std::string marketFeeAsString(int sum, int percent, int maxFee = 5000);
std::string paymentAsString(int sum, int percent);
#endif

View file

@ -1,5 +1,9 @@
#include "seller.h"
#include <numeric>
#include <sstream>
#include <iomanip>
Seller::Seller(const std::string& firstName, const std::string& lastName, int sellerNo,
int numArticlesOffered)
: Entity()
@ -80,6 +84,20 @@ void Seller::cleanupArticles()
}
}
int Seller::sumInCents()
{
int sum = std::accumulate(articles_.begin(), articles_.end(), 0,
[](int a, const auto& b) { return a + b->getPrice(); });
return sum;
}
std::string Seller::sumAsString()
{
std::stringstream sumStream;
sumStream << std::right << std::setw(12) << std::showbase << std::put_money(sumInCents(), false);
return sumStream.str();
}
// int Seller::numArticlesTotal() const { return static_cast<int>(getArticles().size()); }
bool operator<(const Seller& li, const Seller& re) { return li.sellerNo_ < re.sellerNo_; }

View file

@ -34,6 +34,8 @@ class Seller : public Entity
std::vector<Article*> getArticles(bool onlySold = true) const;
Article* getArticleByUuid(const std::string& uuidString);
int getMaxArticleNo() const;
int sumInCents();
std::string sumAsString();
friend bool operator<(const Seller& li, const Seller& re);
friend bool operator<(const std::unique_ptr<Seller>& li, const std::unique_ptr<Seller>& re);

View file

@ -19,6 +19,9 @@ set(GUI_SOURCES
pricedialog.ui
basketmodel.cpp
salemodel.cpp
reportdialog.cpp
reportdialog.ui
reportmodel.cpp
)
add_executable(kima2 ${GUI_SOURCES})

View file

@ -2,6 +2,7 @@
#include "basketmodel.h"
#include "pricedialog.h"
#include "reportdialog.h"
#include "salemodel.h"
#include "sellerdialog.h"
@ -47,6 +48,7 @@ MainWindow::MainWindow()
connect(static_cast<BasketModel*>(ui_.basketView->model()), &BasketModel::basketDataChanged,
static_cast<SaleModel*>(ui_.salesView->model()), &SaleModel::onBasketDataChanged);
connect(ui_.aboutQtAction, &QAction::triggered, this, &MainWindow::onAboutQt);
connect(ui_.reportAction, &QAction::triggered, this, [=]() { ReportDialog(this).exec(); });
}
void MainWindow::onActionEditSellerTriggered()

View file

@ -385,7 +385,7 @@ drucken</string>
<x>0</x>
<y>0</y>
<width>817</width>
<height>14</height>
<height>24</height>
</rect>
</property>
<widget class="QMenu" name="menu_Datei">
@ -409,8 +409,15 @@ drucken</string>
<addaction name="aboutAction"/>
<addaction name="aboutQtAction"/>
</widget>
<widget class="QMenu" name="menuExtras">
<property name="title">
<string>&amp;Extras</string>
</property>
<addaction name="reportAction"/>
</widget>
<addaction name="menu_Datei"/>
<addaction name="menu_Edit"/>
<addaction name="menuExtras"/>
<addaction name="menuHilfe"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
@ -443,6 +450,11 @@ drucken</string>
<string>Über Qt</string>
</property>
</action>
<action name="reportAction">
<property name="text">
<string>Auswertung</string>
</property>
</action>
</widget>
<resources/>
<connections/>

12
src/gui/reportdialog.cpp Normal file
View file

@ -0,0 +1,12 @@
#include "reportdialog.h"
#include "mainwindow.h"
ReportDialog::ReportDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f)
{
ui_.setupUi(this);
market_ = dynamic_cast<MainWindow*>(parent)->getMarketplace();
model_ = std::make_unique<ReportModel>(market_, ui_.reportView);
ui_.reportView->setModel(model_.get());
ui_.reportView->hideColumn(0);
}

26
src/gui/reportdialog.h Normal file
View file

@ -0,0 +1,26 @@
#ifndef REPORT_DIALOG_H
#define REPORT_DIALOG_H
#include "ui_reportdialog.h"
#include "reportmodel.h"
#include <marketplace.h>
#include <QDialog>
class ReportDialog : public QDialog
{
Q_OBJECT
public:
ReportDialog(QWidget* parent = nullptr,
Qt::WindowFlags f = Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
private:
Ui::ReportDialog ui_;
Marketplace* market_;
std::unique_ptr<ReportModel> model_;
};
#endif

112
src/gui/reportdialog.ui Normal file
View file

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ReportDialog</class>
<widget class="QDialog" name="ReportDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>Auswertung</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QTableView" name="reportView"/>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="pushButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Quittung drucken</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>Exportieren (.csv)</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_3">
<property name="text">
<string>Übersicht drucken</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>ReportDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>ReportDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

99
src/gui/reportmodel.cpp Normal file
View file

@ -0,0 +1,99 @@
#include "reportmodel.h"
#include <QFont>
ReportModel::ReportModel(Marketplace* market, QObject* parent)
: QAbstractTableModel(parent), market_(market)
{
}
int ReportModel::rowCount([[maybe_unused]] const QModelIndex& parent) const
{
return static_cast<int>(market_->getSellers().size());
}
int ReportModel::columnCount([[maybe_unused]] const QModelIndex& parent) const { return 7; }
QVariant ReportModel::data(const QModelIndex& index, int role) const
{
if (role == Qt::FontRole) {
QFont myFont;
switch (index.column()) {
case 4:
[[fallthrough]];
case 5:
[[fallthrough]];
case 6:
myFont.setFamily("monospace");
return myFont;
default:
return myFont;
}
}
if (role == Qt::TextAlignmentRole) {
switch (index.column()) {
case 4:
return Qt::AlignRight;
default:
return Qt::AlignLeft;
}
}
if (role != Qt::DisplayRole)
return QVariant();
if (market_->getSellers().size() == 0)
return QVariant();
Seller* seller = market_->getSellers().at(index.row()).get();
switch (index.column()) {
case 0:
return seller->getUuidAsString().c_str();
case 1:
return seller->getSellerNo();
case 2:
return seller->getLastName().c_str();
case 3:
return seller->getFirstName().c_str();
case 4:
return seller->numArticlesSold();
case 5:
return seller->sumAsString().c_str();
case 6:
return paymentAsString(seller->sumInCents(), 20).c_str();
default:
return "???";
}
}
QVariant ReportModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole)
return QVariant();
if (orientation == Qt::Horizontal) {
switch (section) {
case 0:
return "ID";
case 1:
return "Nummer";
case 2:
return "Nachname";
case 3:
return "Vorname";
case 4:
return "verkauft";
case 5:
return "Umsatz";
case 6:
return "Auszahlung";
default:
return "???";
}
// return QStringLiteral("%1").arg(section);
} else
return "";
}

21
src/gui/reportmodel.h Normal file
View file

@ -0,0 +1,21 @@
#ifndef REPORT_MODEL_H
#define REPORT_MODEL_H
#include <marketplace.h>
#include <QAbstractTableModel>
class ReportModel : public QAbstractTableModel
{
public:
explicit ReportModel(Marketplace* market, QObject* parent = nullptr);
virtual int rowCount(const QModelIndex& parent = QModelIndex()) const override;
virtual int columnCount(const QModelIndex& parent = QModelIndex()) const override;
virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
private:
Marketplace* market_;
};
#endif