Files
beerlog/viewmodels/productsviewmodel.cpp

104 lines
2.9 KiB
C++

#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);
}
}