diff --git a/src/core/database.cpp b/src/core/database.cpp index 1674d26..11c8b68 100644 --- a/src/core/database.cpp +++ b/src/core/database.cpp @@ -145,7 +145,7 @@ void Database::beginTransaction() { exec("BEGIN TRANSACTION"); } void Database::endTransaction() { exec("END TRANSACTION"); } -unsigned int Database::storeSellers(std::vector>& sellers) +unsigned int Database::storeSellers(std::vector>& sellers) { int retCode{}; int count{}; @@ -165,10 +165,9 @@ unsigned int Database::storeSellers(std::vector>& seller if (retCode != SQLITE_OK) throw std::runtime_error(sqlite3_errmsg(db_)); - int test = sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":uuid"), - boost::uuids::to_string(seller->getUuid()).c_str(), -1, - SQLITE_TRANSIENT); - std::cout << "!!! TEST: " << test << "\n"; + sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":uuid"), + boost::uuids::to_string(seller->getUuid()).c_str(), -1, + SQLITE_TRANSIENT); sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":seller_no"), seller->getSellerNo()); sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":first_name"), @@ -254,12 +253,14 @@ unsigned int Database::storeSellers(std::vector>& seller endTransaction(); - // Everything went fine, so we can now update our objects - sellers.erase( - std::remove_if(begin(sellers), end(sellers), [](const std::shared_ptr& seller) { - return seller->getState() == Seller::State::DELETE; - })); - for (const auto& seller : sellers) { + // Everything went fine, so we can now update our objects + sellers.erase(std::remove_if(sellers.begin(), sellers.end(), + [](const std::unique_ptr& seller) { + return (seller->getState() == Seller::State::DELETE); + }), + sellers.end()); + + for (auto& seller : sellers) { seller->cleanupArticles(); seller->setState(Seller::State::OK); } diff --git a/src/core/database.h b/src/core/database.h index 82707b2..5fe126c 100644 --- a/src/core/database.h +++ b/src/core/database.h @@ -16,7 +16,7 @@ class Database Database& operator=(const Database&) = delete; void exec(const std::string& sql); void init(); - unsigned int storeSellers(std::vector>& sellers); + unsigned int storeSellers(std::vector>& sellers); private: sqlite3* db_; diff --git a/src/core/marketplace.cpp b/src/core/marketplace.cpp index b0e6b46..2534905 100644 --- a/src/core/marketplace.cpp +++ b/src/core/marketplace.cpp @@ -1,10 +1,13 @@ #include "marketplace.h" #include "database.h" +#include + Marketplace::Marketplace() { - auto seller = std::make_shared("Max", "Mustermann"); - sellers_.push_back(seller); + auto seller = std::make_unique("Max", "Mustermann"); + seller->createUuid(); + sellers_.push_back(std::move(seller)); } void Marketplace::storeToDb() @@ -12,7 +15,20 @@ void Marketplace::storeToDb() const std::string DB_PATH{"/tmp/kima2.db"}; Database db(DB_PATH); + db.init(); db.storeSellers(sellers_); } -std::vector>& Marketplace::getSellers() { return sellers_; } \ No newline at end of file +void Marketplace::loadFromDb() {} + +std::vector>& Marketplace::getSellers() { return sellers_; } + +int Marketplace::getNextSellerNo() +{ + auto iter = std::max_element( + sellers_.begin(), sellers_.end(), + [](const std::unique_ptr& a, const std::unique_ptr& b) -> bool { + return a->getSellerNo() < b->getSellerNo(); + }); + return (*iter)->getSellerNo() + 1; +} \ No newline at end of file diff --git a/src/core/marketplace.h b/src/core/marketplace.h index 03e5221..4bf73bd 100644 --- a/src/core/marketplace.h +++ b/src/core/marketplace.h @@ -13,11 +13,12 @@ class Marketplace Marketplace(); void storeToDb(); void loadFromDb(); - std::vector>& getSellers(); + std::vector>& getSellers(); + int getNextSellerNo(); private: - std::vector> sellers_; - std::vector> sales_; + std::vector> sellers_; + std::vector> sales_; }; #endif \ No newline at end of file diff --git a/src/core/seller.cpp b/src/core/seller.cpp index 94fd9d4..def265e 100644 --- a/src/core/seller.cpp +++ b/src/core/seller.cpp @@ -14,11 +14,11 @@ Seller::Seller(const std::string& firstName, const std::string& lastName, int se void Seller::setSellerNo(int seller_no) { sellerNo_ = seller_no; } -inline void Seller::setFirstName(const std::string& firstName) { firstName_ = firstName; } +void Seller::setFirstName(const std::string& firstName) { firstName_ = firstName; } -inline void Seller::setLastName(const std::string& lastName) { lastName_ = lastName; } +void Seller::setLastName(const std::string& lastName) { lastName_ = lastName; } -inline void Seller::setNumArticlesOffered(int number) { numArticlesOffered_ = number; } +void Seller::setNumArticlesOffered(int number) { numArticlesOffered_ = number; } void Seller::addArticle(std::shared_ptr
article) { @@ -51,10 +51,11 @@ int Seller::numArticlesOffered() const { return numArticlesOffered_; } void Seller::cleanupArticles() { - articles_.erase(std::remove_if(begin(articles_), end(articles_), + articles_.erase(std::remove_if(articles_.begin(), articles_.end(), [](const std::shared_ptr
& article) { return article->getState() == Article::State::DELETE; - })); + }), + articles_.end()); for (auto& article : articles_) { article->setState(Article::State::OK); diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 5bf8018..3cf4428 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -15,5 +15,10 @@ MainWindow::MainWindow() void MainWindow::on_actionEditSeller_triggered() { auto dialog = std::make_unique(this); - dialog->exec(); + int retCode = dialog->exec(); + if (retCode == QDialog::Accepted) { + marketplace_->storeToDb(); + } else { + marketplace_->loadFromDb(); + } } \ No newline at end of file diff --git a/src/gui/sellerdialog.cpp b/src/gui/sellerdialog.cpp index 256e740..3088028 100644 --- a/src/gui/sellerdialog.cpp +++ b/src/gui/sellerdialog.cpp @@ -2,11 +2,34 @@ #include "mainwindow.h" +#include + SellerDialog::SellerDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f) { ui_.setupUi(this); - SellerModel* model = new SellerModel( - dynamic_cast(parent)->getMarketplace()->getSellers(), ui_.tableView); + SellerModel* model = + new SellerModel(dynamic_cast(parent)->getMarketplace(), ui_.tableView); ui_.tableView->setModel(model); ui_.tableView->setColumnHidden(0, true); // hide the uuid + connect(ui_.newButton, &QPushButton::clicked, this, &SellerDialog::on_newButton_clicked); } + +void SellerDialog::on_newButton_clicked() +{ + ui_.tableView->model()->insertRows(ui_.tableView->model()->rowCount(), 1); + ui_.tableView->scrollToBottom(); +} + +void SellerDialog::accept() +{ + Marketplace* market = dynamic_cast(parentWidget())->getMarketplace(); + for (const auto& seller : market->getSellers()) { + if (seller->getFirstName().empty() || seller->getLastName().empty()) { + QMessageBox(QMessageBox::Icon::Critical, "Fehler", + "Bitte geben Sie bei jedem Verkäufer Vorname und Nachname an.", + QMessageBox::StandardButton::Ok, this).exec(); + return; + } + } + QDialog::accept(); +} \ No newline at end of file diff --git a/src/gui/sellerdialog.h b/src/gui/sellerdialog.h index 7194e6f..8d0dc0a 100644 --- a/src/gui/sellerdialog.h +++ b/src/gui/sellerdialog.h @@ -16,6 +16,8 @@ class SellerDialog : public QDialog Qt::WindowFlags f = Qt::WindowTitleHint | Qt::WindowSystemMenuHint); private: + void on_newButton_clicked(); + virtual void accept() override; Ui::SellerDialog ui_; }; diff --git a/src/gui/sellermodel.cpp b/src/gui/sellermodel.cpp index 62b0b45..4f9815b 100644 --- a/src/gui/sellermodel.cpp +++ b/src/gui/sellermodel.cpp @@ -1,11 +1,18 @@ #include "sellermodel.h" -SellerModel::SellerModel(std::vector>& sellers, QObject* parent) - : QAbstractTableModel(parent), sellers_(&sellers) +#include + +#include + +SellerModel::SellerModel(Marketplace* market, QObject* parent) + : QAbstractTableModel(parent), marketplace_(market) { } -int SellerModel::rowCount(const QModelIndex& parent) const { return sellers_->size(); } +int SellerModel::rowCount(const QModelIndex& parent) const +{ + return marketplace_->getSellers().size(); +} int SellerModel::columnCount(const QModelIndex& parent) const { return 5; } @@ -14,7 +21,7 @@ QVariant SellerModel::data(const QModelIndex& index, int role) const if (role != Qt::DisplayRole) return QVariant(); - Seller* seller = sellers_->at(index.row()).get(); + Seller* seller = marketplace_->getSellers().at(index.row()).get(); switch (index.column()) { case 0: return seller->getUuidAsString().c_str(); @@ -55,4 +62,67 @@ QVariant SellerModel::headerData(int section, Qt::Orientation orientation, int r return QStringLiteral("%1").arg(section); } else return ""; +} + +Qt::ItemFlags SellerModel::flags(const QModelIndex& index) const +{ + return QAbstractTableModel::flags(index) | Qt::ItemFlag::ItemIsEditable; +} + +bool SellerModel::setData(const QModelIndex& index, const QVariant& value, int role) +{ + if (role != Qt::EditRole) + return false; + + Seller* seller = marketplace_->getSellers().at(index.row()).get(); + + switch (index.column()) { + case 0: + seller->setUuidFromString(value.toString().toStdString()); + break; + case 1: { + if (value.toInt() < 0) + return false; + auto iter = + std::find_if(marketplace_->getSellers().begin(), marketplace_->getSellers().end(), + [&value](const std::unique_ptr& seller) { + return value.toInt() == seller->getSellerNo(); + }); + if (iter != marketplace_->getSellers().end()) { + /* QMessageBox(QMessageBox::Icon::Warning, "Fehler", + "Die Verkäufernummer muss eindeutig sein.", QMessageBox::StandardButton::Ok) + .exec(); */ + return false; + } + seller->setSellerNo(value.toInt()); + break; + } + case 2: + seller->setFirstName(value.toString().toStdString()); + break; + case 3: + seller->setLastName(value.toString().toStdString()); + break; + case 4: + seller->setNumArticlesOffered(value.toInt()); + break; + default: + return false; + } + if (seller->getState() == Seller::State::OK) + seller->setState(Seller::State::UPDATE); + dataChanged(index, index); + return true; +} + +bool SellerModel::insertRows(int row, int count, const QModelIndex& parent) +{ + beginInsertRows(parent, row, row + count - 1); + auto seller = std::make_unique(); + seller->createUuid(); + seller->setSellerNo(marketplace_->getNextSellerNo()); + marketplace_->getSellers().push_back(std::move(seller)); + endInsertRows(); + + return true; } \ No newline at end of file diff --git a/src/gui/sellermodel.h b/src/gui/sellermodel.h index 65c4a82..7ec2244 100644 --- a/src/gui/sellermodel.h +++ b/src/gui/sellermodel.h @@ -8,14 +8,17 @@ class SellerModel : public QAbstractTableModel { public: - explicit SellerModel(std::vector>& sellers, QObject* parent = nullptr); + explicit SellerModel(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; + virtual Qt::ItemFlags flags(const QModelIndex& index) const override; + virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); + virtual bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex()) override; private: - std::vector>* sellers_; + Marketplace* marketplace_; }; #endif \ No newline at end of file diff --git a/test/test_database.cpp b/test/test_database.cpp index 1493a10..9fda5df 100644 --- a/test/test_database.cpp +++ b/test/test_database.cpp @@ -17,20 +17,20 @@ BOOST_AUTO_TEST_CASE(store_seller_fail) { Database db(":memory:"); db.init(); - std::vector> sellers; - sellers.push_back(std::make_shared()); - sellers.push_back(std::make_shared()); + std::vector> sellers; + sellers.push_back(std::make_unique()); + sellers.push_back(std::make_unique()); BOOST_CHECK_THROW(db.storeSellers(sellers), std::runtime_error); } BOOST_AUTO_TEST_CASE(store_sellers_succ) { Database db(":memory:"); db.init(); - std::vector> sellers; - auto a = std::make_shared(); + std::vector> sellers; + auto a = std::make_unique(); a->createUuid(); a->setSellerNo(1); - auto b = std::make_shared("Max", "Mustermann"); + auto b = std::make_unique("Max", "Mustermann"); b->createUuid(); b->setSellerNo(2); auto c = std::make_shared
(); @@ -39,8 +39,8 @@ BOOST_AUTO_TEST_CASE(store_sellers_succ) c->setDescription("Test"); b->addArticle(c); BOOST_TEST(a->getUuid() != b->getUuid()); - sellers.push_back(a); - sellers.push_back(b); + sellers.push_back(std::move(a)); + sellers.push_back(std::move(b)); BOOST_CHECK_NO_THROW(db.storeSellers(sellers)); } @@ -48,12 +48,11 @@ BOOST_AUTO_TEST_CASE(seller_states) { Database db(":memory:"); db.init(); - std::vector> sellers; - auto a = std::make_shared(); + std::vector> sellers; + auto a = std::make_unique(); a->setSellerNo(3); a->createUuid(); - sellers.push_back(a); - std::cout << "Anzahl sellers: " << sellers.size() << "\n"; + sellers.push_back(std::move(a)); BOOST_TEST((sellers.at(0)->getState() == Entity::State::NEW)); BOOST_TEST(db.storeSellers(sellers) == 1); BOOST_TEST((sellers.at(0)->getState() == Entity::State::OK));