KIMA2 ist ein kleines Kassenprogramm für Kindersachenmärkte.
https://www.rustysoft.de/?01_kima2
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
4.8 KiB
146 lines
4.8 KiB
#include "mainwindow.h" |
|
|
|
#include "basketmodel.h" |
|
#include "pricedialog.h" |
|
#include "sellerdialog.h" |
|
|
|
#include <regex> |
|
|
|
#include <QMessageBox> |
|
|
|
constexpr int STATUSBAR_TIMEOUT = 5000; |
|
|
|
MainWindow::MainWindow() |
|
{ |
|
ui_.setupUi(this); |
|
|
|
marketplace_ = std::make_unique<Marketplace>(); |
|
marketplace_->loadFromDb(); |
|
statusBar()->showMessage("Gespeicherte Daten wurden geladen.", STATUSBAR_TIMEOUT); |
|
|
|
BasketModel* model = new BasketModel(getMarketplace(), ui_.basketView); |
|
ui_.basketView->setModel(model); |
|
ui_.basketView->setColumnHidden(0, true); // hide the uuid |
|
|
|
connect(ui_.actionQuit, &QAction::triggered, qApp, QApplication::quit); |
|
connect(ui_.actionEditSeller, &QAction::triggered, this, |
|
&MainWindow::on_actionEditSeller_triggered); |
|
connect(ui_.sellerNoEdit, &QLineEdit::returnPressed, this, |
|
&MainWindow::on_sellerNoEdit_checkSellerNo); |
|
connect(ui_.paidButton, &QPushButton::clicked, this, &MainWindow::on_paidButton_triggered); |
|
connect(ui_.basketView->selectionModel(), &QItemSelectionModel::selectionChanged, this, |
|
&MainWindow::onBasketViewSelectionChanged); |
|
connect(ui_.cancelArticleButton, &QPushButton::clicked, this, |
|
&MainWindow::onCancelArticleButtonClicked); |
|
connect(ui_.cancelAllArticlesButton, &QPushButton::clicked, this, |
|
&MainWindow::onCancelAllArticlesButtonClicked); |
|
} |
|
|
|
void MainWindow::on_actionEditSeller_triggered() |
|
{ |
|
auto dialog = std::make_unique<SellerDialog>(this); |
|
int retCode = dialog->exec(); |
|
if (retCode == QDialog::Accepted) { |
|
marketplace_->sortSellers(); |
|
marketplace_->storeToDb(); |
|
statusBar()->showMessage("Änderungen an den Verkäufer-Stammdaten gespeichert.", |
|
STATUSBAR_TIMEOUT); |
|
} else { |
|
marketplace_->loadFromDb(); |
|
statusBar()->showMessage("Änderungen an den Verkäufer-Stammdaten verworfen!", |
|
STATUSBAR_TIMEOUT); |
|
} |
|
} |
|
|
|
void MainWindow::on_paidButton_triggered() |
|
{ |
|
if (marketplace_->basketSize() > 0) { |
|
QString lastPrice{marketplace_->getBasketSumAsString().c_str()}; |
|
dynamic_cast<BasketModel*>(ui_.basketView->model())->finishSale(); |
|
ui_.lastPriceLabel1->setText(lastPrice); |
|
ui_.lastPriceLabel2->setText(lastPrice); |
|
} |
|
} |
|
|
|
void MainWindow::on_sellerNoEdit_checkSellerNo() |
|
{ |
|
using std::regex, std::regex_match, std::smatch; |
|
|
|
auto inputText = ui_.sellerNoEdit->text().toStdString(); |
|
|
|
if (inputText.empty()) { |
|
on_paidButton_triggered(); |
|
return; |
|
} |
|
|
|
regex pattern{R"(\d{1,5})"}; |
|
smatch result; |
|
|
|
if (!regex_match(inputText, result, pattern)) { |
|
ui_.sellerNoEdit->clear(); |
|
return; |
|
} |
|
|
|
int sellerNo = std::stoi(result[0]); |
|
|
|
auto seller = marketplace_->findSellerWithSellerNo(sellerNo); |
|
if (seller) { |
|
PriceDialog priceDialog(this); |
|
auto dialogResult = priceDialog.exec(); |
|
if (dialogResult == QDialog::Accepted) { |
|
int price = priceDialog.getPrice(); |
|
dynamic_cast<BasketModel*>(ui_.basketView->model())->addArticle(seller, price); |
|
} |
|
} |
|
|
|
ui_.sellerNoEdit->clear(); |
|
} |
|
|
|
void MainWindow::onBasketViewSelectionChanged(const QItemSelection& selected, |
|
[[maybe_unused]] const QItemSelection& deselected) |
|
{ |
|
if (selected.size() > 0) { |
|
ui_.cancelArticleButton->setEnabled(true); |
|
} else { |
|
ui_.cancelArticleButton->setEnabled(false); |
|
} |
|
} |
|
|
|
void MainWindow::onCancelArticleButtonClicked([[maybe_unused]] bool checked) |
|
{ |
|
auto selModel = ui_.basketView->selectionModel(); |
|
if (selModel->hasSelection() == false) |
|
return; |
|
|
|
auto dlgResult = |
|
QMessageBox(QMessageBox::Icon::Warning, "Sind Sie sicher?", |
|
"Möchten Sie wirklich den Artikel stornieren?", |
|
QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No, this) |
|
.exec(); |
|
if (dlgResult == QMessageBox::No) |
|
return; |
|
|
|
auto indexes = selModel->selectedRows(); |
|
std::sort(indexes.begin(), indexes.end()); |
|
|
|
// Deleting the rows, beginning with the last one! |
|
for (auto iter = indexes.constEnd() - 1; iter >= indexes.constBegin(); --iter) { |
|
ui_.basketView->model()->removeRow(iter->row()); |
|
} |
|
} |
|
|
|
void MainWindow::onCancelAllArticlesButtonClicked([[maybe_unused]] bool checked) |
|
{ |
|
if (ui_.basketView->model()->rowCount() == 0) |
|
return; |
|
|
|
auto dlgResult = |
|
QMessageBox(QMessageBox::Icon::Warning, "Sind Sie sicher?", |
|
"Möchten Sie wirklich *alle* Artikel des aktuellen Einkaufs stornieren?", |
|
QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No, this) |
|
.exec(); |
|
if (dlgResult == QMessageBox::No) |
|
return; |
|
|
|
dynamic_cast<BasketModel*>(ui_.basketView->model())->cancelSale(); |
|
} |