diff --git a/src/core/database.cpp b/src/core/database.cpp index 827e6ab..75b85d0 100644 --- a/src/core/database.cpp +++ b/src/core/database.cpp @@ -107,7 +107,7 @@ void Database::init() if (errCode) { throw std::runtime_error("Could not open database file."); } - + // sqlite3_db_config(db_, SQLITE_DBCONFIG_ENABLE_FKEY); exec("PRAGMA foreign_keys = ON;"); @@ -644,3 +644,73 @@ unsigned int Database::loadSales(std::vector>& sales, return count; } + +void Database::updateCashPointNo(int oldCashPointNo, int newCashPointNo) +{ + int retCode{}; + sqlite3_stmt* stmt; + + // Check if the new no ist already in use + retCode = sqlite3_prepare_v2(db_, "SELECT COUNT() FROM articles WHERE source_no = :source_no", + -1, &stmt, nullptr); + if (retCode != SQLITE_OK) + throw std::string(sqlite3_errmsg(db_)); + + sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":source_no"), newCashPointNo); + + retCode = sqlite3_step(stmt); + + int count{}; + + if (retCode != SQLITE_ROW) { + std::string errMsg(sqlite3_errmsg(db_)); + sqlite3_finalize(stmt); + throw std::runtime_error(errMsg); + } + + count = sqlite3_column_int(stmt, 0); + sqlite3_finalize(stmt); + + if (count > 0) { + throw std::runtime_error("The desired cashpoint no is aleady in use."); + } + + beginTransaction(); + retCode = sqlite3_prepare_v2( + db_, "UPDATE articles SET source_no = :new_source_no WHERE source_no = :old_source_no", -1, + &stmt, nullptr); + if (retCode != SQLITE_OK) + throw std::string(sqlite3_errmsg(db_)); + + sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":new_source_no"), newCashPointNo); + sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":old_source_no"), oldCashPointNo); + + retCode = sqlite3_step(stmt); + if (retCode != SQLITE_DONE) { + std::string errMsg(sqlite3_errmsg(db_)); + sqlite3_finalize(stmt); + throw std::runtime_error(errMsg); + } + + sqlite3_finalize(stmt); + + retCode = sqlite3_prepare_v2( + db_, "UPDATE sales SET source_no = :new_source_no WHERE source_no = :old_source_no", -1, + &stmt, nullptr); + if (retCode != SQLITE_OK) + throw std::string(sqlite3_errmsg(db_)); + + sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":new_source_no"), newCashPointNo); + sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":old_source_no"), oldCashPointNo); + + retCode = sqlite3_step(stmt); + if (retCode != SQLITE_DONE) { + std::string errMsg(sqlite3_errmsg(db_)); + sqlite3_finalize(stmt); + throw std::runtime_error(errMsg); + } + + sqlite3_finalize(stmt); + + endTransaction(); +} \ No newline at end of file diff --git a/src/core/database.h b/src/core/database.h index 4515d88..0183baa 100644 --- a/src/core/database.h +++ b/src/core/database.h @@ -23,6 +23,7 @@ class Database unsigned int storeSales(std::vector>& sales); unsigned int loadSales(std::vector>& sales, std::vector>& sellers); + void updateCashPointNo(int oldCashPointNo, int newCashPointNo); private: sqlite3* db_{nullptr}; diff --git a/src/core/marketplace.cpp b/src/core/marketplace.cpp index 818e614..66615f5 100644 --- a/src/core/marketplace.cpp +++ b/src/core/marketplace.cpp @@ -139,6 +139,9 @@ void Marketplace::removeSale(boost::uuids::uuid uuid) double marketFee(int sum, int percent, int maxFee) { int fee = (sum * percent) / 100.0L; + if (maxFee <= 0) { + return fee; + } return fee > maxFee ? maxFee : fee; } diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index f3d9914..afcf239 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -22,6 +22,8 @@ set(GUI_SOURCES reportdialog.cpp reportdialog.ui reportmodel.cpp + settingsdialog.cpp + settingsdialog.ui ) add_executable(kima2 ${GUI_SOURCES}) diff --git a/src/gui/kima2.cpp b/src/gui/kima2.cpp index c375ce5..719c502 100644 --- a/src/gui/kima2.cpp +++ b/src/gui/kima2.cpp @@ -1,13 +1,16 @@ #include "mainwindow.h" #include +#include +#include +#include "settingsdialog.h" int main(int argc, char* argv[]) { // Q_INIT_RESOURCE(application); // Set the locale to german, so that currency is correct - //std::locale german("de_DE.utf-8"); + // std::locale german("de_DE.utf-8"); std::locale myLocale(""); std::locale::global(myLocale); @@ -17,6 +20,15 @@ int main(int argc, char* argv[]) QCoreApplication::setOrganizationDomain("rustysoft.de"); QCoreApplication::setApplicationName("KIMA2"); + QSettings settings{}; + while (!settings.contains("global/cashPointNo")) { + QMessageBox(QMessageBox::Icon::Information, "Erster Start von KIMA2", + "Es wurden keine Einstellungen gefunden. Vermutlich starteten Sie KIMA2 zum " + "ersten Mal. Bitte legen Sie nun die Einstellungen fest.", + QMessageBox::StandardButton::Ok).exec(); + SettingsDialog().exec(); + } + auto mainWin = std::make_unique(); mainWin->show(); diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index ca0dd6c..c9f6373 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -5,10 +5,12 @@ #include "reportdialog.h" #include "salemodel.h" #include "sellerdialog.h" +#include "settingsdialog.h" #include #include +#include constexpr int STATUSBAR_TIMEOUT = 5000; @@ -29,6 +31,8 @@ MainWindow::MainWindow() ui_.salesView->setColumnHidden(2, true); ui_.salesView->resizeColumnToContents(0); + setWindowTitle("KIMA2 - Kasse Nr. " + QSettings().value("global/cashPointNo").toString()); + connect(ui_.actionQuit, &QAction::triggered, qApp, QApplication::quit); connect(ui_.actionEditSeller, &QAction::triggered, this, &MainWindow::onActionEditSellerTriggered); @@ -49,6 +53,11 @@ MainWindow::MainWindow() static_cast(ui_.salesView->model()), &SaleModel::onBasketDataChanged); connect(ui_.aboutQtAction, &QAction::triggered, this, &MainWindow::onAboutQt); connect(ui_.reportAction, &QAction::triggered, this, [=]() { ReportDialog(this).exec(); }); + connect(ui_.configAction, &QAction::triggered, this, [=]() { + SettingsDialog(this).exec(); + this->setWindowTitle("KIMA2 - Kasse Nr. " + + QSettings().value("global/cashPointNo").toString()); + }); } void MainWindow::onActionEditSellerTriggered() diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp new file mode 100644 index 0000000..af62279 --- /dev/null +++ b/src/gui/settingsdialog.cpp @@ -0,0 +1,61 @@ +#include "settingsdialog.h" + +#include + +#include +#include + +SettingsDialog::SettingsDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f) +{ + ui_.setupUi(this); + + QSettings settings{}; + int cashPointNo = settings.value("global/cashPointNo").toInt(); + QString posPrinterDevice = settings.value("global/posPrinterDevice").toString(); + int feeInPercent = settings.value("global/feeInPercent").toInt(); + int maxFeeInEuro = settings.value("global/maxFeeInEuro").toInt(); + + ui_.cashPointNoSpinBox->setValue(cashPointNo); + ui_.posPrinterDeviceEdit->setText(posPrinterDevice); + ui_.feePercentSpinBox->setValue(feeInPercent); + ui_.maxFeeSpinBox->setValue(maxFeeInEuro); +} + +void SettingsDialog::accept() +{ + QSettings settings; + + int oldCashPointNo = settings.value("global/cashPointNo").toInt(); + int newCashPointNo = ui_.cashPointNoSpinBox->value(); + + settings.setValue("global/posPrinterDevice", ui_.posPrinterDeviceEdit->text()); + settings.setValue("global/feeInPercent", ui_.feePercentSpinBox->value()); + settings.setValue("global/maxFeeInEuro", ui_.maxFeeSpinBox->value()); + + if (oldCashPointNo != newCashPointNo) { + int result = + QMessageBox(QMessageBox::Icon::Question, "Sind Sie sicher?", + "Möchten Sie die Kassen-Nr wirklich ändern? Diese muss über alle " + "Installationen hinweg eindeutig sein.", + QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No, this) + .exec(); + if (result == QMessageBox::Yes) { + try { + Database().updateCashPointNo(oldCashPointNo, newCashPointNo); + } catch (std::exception& ex) { + std::string errMsg("Das Ändern der Kassen-Nr. ist fehlgeschlagen: "); + errMsg.append(ex.what()); + QMessageBox(QMessageBox::Icon::Critical, "Fehler", + errMsg.c_str(), + QMessageBox::StandardButton::Ok, + this) + .exec(); + QDialog::accept(); + return; + } + settings.setValue("global/cashPointNo", ui_.cashPointNoSpinBox->value()); + } + } + + QDialog::accept(); +} \ No newline at end of file diff --git a/src/gui/settingsdialog.h b/src/gui/settingsdialog.h new file mode 100644 index 0000000..7533a3b --- /dev/null +++ b/src/gui/settingsdialog.h @@ -0,0 +1,21 @@ +#ifndef SETTINGS_DIALOG_H +#define SETTINGS_DIALOG_H + +#include "ui_settingsdialog.h" + +#include + +class SettingsDialog : public QDialog +{ + public: + SettingsDialog(QWidget* parent = nullptr, + Qt::WindowFlags f = Qt::WindowTitleHint | Qt::WindowSystemMenuHint); + + public slots: + void accept() override; + + private: + Ui::SettingsDialog ui_; +}; + +#endif \ No newline at end of file diff --git a/src/gui/settingsdialog.ui b/src/gui/settingsdialog.ui new file mode 100644 index 0000000..f9019e4 --- /dev/null +++ b/src/gui/settingsdialog.ui @@ -0,0 +1,103 @@ + + + SettingsDialog + + + Einstellungen + + + + + + Kassen-Nr.: + + + + + + + + + + Bondrucker Gerätedatei: + + + + + + + + + + Testen + + + + + + + Gebühr in %: + + + + + + + + + + max. Gebühr in €: + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + SettingsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + SettingsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + +