#include "productsviewmodel.h" #include "models/basemodel.h" #include "services/settingsservice.h" ProductsViewModel::ProductsViewModel(QObject *parent) : QObject{parent} { connect(m_productsModel, &BaseModel::dataChanged, this, &ProductsViewModel::productsChanged); connect(m_restsModel, &BaseModel::dataChanged, this, &ProductsViewModel::productsChanged); connect(settings(), &SettingsService::selectedStoreIdChanged, this, &ProductsViewModel::productsChanged); } QVariantList ProductsViewModel::products() const { QVariantList res; for (const QVariant &product : m_productsModel->items()) { QVariantMap item = product.toMap(); item["rest"] = productRest(item.value("id").toString()); res << item; } return res; } QVariantList ProductsViewModel::order() const { QVariantList res; for (auto it = m_order.constBegin(); it != m_order.constEnd(); ++it) { QVariantMap product = m_productsModel->item(it.key()); product["count"] = it.value().toMap().value("quantity").toDouble(); res << product; } return res; } float ProductsViewModel::orderSum() const { float res = 0.0; for (auto it = m_order.constBegin(); it != m_order.constEnd(); ++it) { QVariantMap product = m_productsModel->item(it.key()); float price = product.value("price", 0.0).toFloat(); float quantity = it.value().toMap().value("quantity").toDouble(); res += quantity * price; } return res; } void ProductsViewModel::setOrderValue(const QString &productId, float value) { if (value) { float price = m_productsModel->itemProperty(productId, "price", 0.0).toFloat(); m_order[productId] = QVariantMap { { "productId", productId }, { "quantity", value}, { "price", price } }; } else { m_order.remove(productId); } emit orderChanged(); } void ProductsViewModel::submitOrder() { m_ordersModel->submitItem({ { "userId", settings()->selectedUserId() }, { "storeId", settings()->selectedStoreId() }, { "products", m_order.values() }, { "amount", orderSum() } }); updateRests(); m_order.clear(); emit orderChanged(); } float ProductsViewModel::productRest(const QString &productId) const { QString storeId = settings()->selectedStoreId(); return m_restsModel->productRest(storeId, productId); } SettingsService *ProductsViewModel::settings() const { return SettingsService::instance(); } void ProductsViewModel::updateRests() const { QString storeId = settings()->selectedStoreId(); for (auto it = m_order.constBegin(); it != m_order.constEnd(); ++it) { float quantity = it.value().toMap().value("quantity", 0.0).toFloat(); float rest = productRest(it.key()); m_restsModel->submitRest(storeId, it.key(), rest - quantity); } }