diff --git a/CMakeLists.txt b/CMakeLists.txt
index fc371ef..8155fd2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,6 +25,7 @@ set(PROJECT_SOURCES
viewmodels/productsviewmodel.h viewmodels/productsviewmodel.cpp
viewmodels/ordersviewmodel.h viewmodels/ordersviewmodel.cpp
viewmodels/settingsviewmodel.h viewmodels/settingsviewmodel.cpp
+ viewmodels/restsviewmodel.h viewmodels/restsviewmodel.cpp
services/beerservice.h services/beerservice.cpp
services/settingsservice.h services/settingsservice.cpp
services/modelsregister.h services/modelsregister.cpp
diff --git a/beerlog_ru_RU.ts b/beerlog_ru_RU.ts
index d76162e..c965b32 100644
--- a/beerlog_ru_RU.ts
+++ b/beerlog_ru_RU.ts
@@ -17,16 +17,24 @@
ProductsView
-
+
Summary: %1
Итого: %1
-
+
Order
Заказать
+
+ RestsView
+
+
+ Rests
+ Остатки
+
+
SettingsView
@@ -61,38 +69,43 @@
-
+
BeerLog v0.1
-
+
Online
В сети
-
+
Offline
Не в сети
-
+
Orders
Заказы
-
+
+ Rests
+ Остатки
+
+
+
Settings
Настройки
-
-
+
+
Quit
Выход
-
+
Realy quit the application?
Действительно выйти из приложения?
diff --git a/main.cpp b/main.cpp
index f5342f2..aee057f 100644
--- a/main.cpp
+++ b/main.cpp
@@ -11,6 +11,7 @@
#include "viewmodels/productsviewmodel.h"
#include "viewmodels/ordersviewmodel.h"
#include "viewmodels/storesviewmodel.h"
+#include "viewmodels/restsviewmodel.h"
#include "viewmodels/settingsviewmodel.h"
#include "services/beerservice.h"
@@ -51,6 +52,7 @@ int main(int argc, char *argv[])
qmlRegisterType("ru.ded.beerlog", 1, 0, "ProductsViewModel");
qmlRegisterType("ru.ded.beerlog", 1, 0, "OrdersViewModel");
qmlRegisterType("ru.ded.beerlog", 1, 0, "StoresViewModel");
+ qmlRegisterType("ru.ded.beerlog", 1, 0, "RestsViewModel");
qmlRegisterType("ru.ded.beerlog", 1, 0, "SettingsViewModel");
engine.load(url);
diff --git a/qml/Views/ProductsView.qml b/qml/Views/ProductsView.qml
index a40e38c..1e2e80a 100644
--- a/qml/Views/ProductsView.qml
+++ b/qml/Views/ProductsView.qml
@@ -12,6 +12,7 @@ Page {
RowLayout {
anchors.fill: parent
+ anchors.margins: 10
ListView {
id: productsList
diff --git a/qml/Views/RestsView.qml b/qml/Views/RestsView.qml
new file mode 100644
index 0000000..78488f9
--- /dev/null
+++ b/qml/Views/RestsView.qml
@@ -0,0 +1,43 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+
+import ru.ded.beerlog 1.0
+
+Page {
+
+ title: qsTr("Rests")
+
+ RestsViewModel {
+ id: restsModel
+ }
+
+ ListView {
+ id: restsList
+
+ anchors.fill: parent
+ anchors.margins: 10
+
+ model: restsModel.products
+
+ delegate: ItemDelegate {
+ width: restsList.width
+
+ text: modelData.title
+
+ TextField {
+ anchors.right: parent.right
+
+ validator: DoubleValidator {
+ bottom: 0.0
+ top: 1000.0
+ }
+
+ height: parent.height
+
+ text: modelData.rest
+
+ onEditingFinished: restsModel.setProductRest(modelData.productId, text)
+ }
+ }
+ }
+}
diff --git a/qml/main.qml b/qml/main.qml
index d751a1f..54bca75 100644
--- a/qml/main.qml
+++ b/qml/main.qml
@@ -83,6 +83,7 @@ ApplicationWindow {
readonly property var actions: {
"orders": () => { stackView.openPage("Views/OrdersView.qml") },
+ "rests": () => { stackView.openPage("Views/RestsView.qml") },
"settings": () => { stackView.openPage("Views/SettingsView.qml") },
"quit": () => { Qt.quit() }
}
@@ -99,6 +100,10 @@ ApplicationWindow {
title: qsTr("Orders")
action: "orders"
}
+ ListElement {
+ title: qsTr("Rests")
+ action: "rests"
+ }
ListElement {
title: qsTr("Settings")
action: "settings"
diff --git a/qml/qml.qrc b/qml/qml.qrc
index a582786..41da06f 100644
--- a/qml/qml.qrc
+++ b/qml/qml.qrc
@@ -6,5 +6,6 @@
Views/OrdersView.qml
Views/SettingsView.qml
Views/ProductsView.qml
+ Views/RestsView.qml
diff --git a/viewmodels/restsviewmodel.cpp b/viewmodels/restsviewmodel.cpp
new file mode 100644
index 0000000..acd1c75
--- /dev/null
+++ b/viewmodels/restsviewmodel.cpp
@@ -0,0 +1,69 @@
+#include "restsviewmodel.h"
+
+#include "models/basemodel.h"
+#include "services/settingsservice.h"
+
+RestsViewModel::RestsViewModel(QObject *parent)
+ : QObject{parent}
+{
+ connect(m_restsModel, &BaseModel::dataChanged, this, &RestsViewModel::reloadRests);
+ connect(m_productsModel, &BaseModel::dataChanged, this, &RestsViewModel::productsChanged);
+ connect(settings(), &SettingsService::selectedStoreIdChanged, this, &RestsViewModel::productsChanged);
+
+ reloadRests();
+}
+
+QVariantList RestsViewModel::products() const
+{
+ QVariantList res;
+
+ const QString storeId = settings()->selectedStoreId();
+ const QVariantList products = m_productsModel->items();
+ for (const QVariant &product : products) {
+ QString productId = product.toMap().value("id").toString();
+ QVariantMap rest = m_rests.value(storeId).value(productId).toMap();
+ res << QVariantMap {
+ { "productId", productId },
+ { "title", m_productsModel->itemProperty(productId, "name").toString() },
+ { "rest", rest.value("rest", 0.0).toFloat() }
+ };
+ }
+
+ return res;
+}
+
+void RestsViewModel::setProductRest(const QString &productId, float rest)
+{
+ QString storeId = settings()->selectedStoreId();
+ QVariantMap productRest = m_rests.value(storeId).value(productId).toMap();
+ productRest["rest"] = rest;
+ productRest["storeId"] = storeId;
+ productRest["productId"] = productId;
+ QString restId = productRest.value("id").toString();
+ if (restId.isEmpty()) {
+ m_restsModel->addItem(productRest);
+ } else {
+ m_restsModel->modifyItem(restId, productRest);
+ }
+}
+
+SettingsService *RestsViewModel::settings() const
+{
+ return SettingsService::instance();
+}
+
+void RestsViewModel::reloadRests()
+{
+ m_rests.clear();
+
+ const QVariantList rests = m_restsModel->items();
+ for (const QVariant &varRest : rests) {
+ QVariantMap rest = varRest.toMap();
+ QString storeId = rest.value("storeId").toString();
+ QVariantMap storeRests = m_rests.value(storeId);
+ storeRests[rest.value("productId").toString()] = rest;
+ m_rests[storeId] = storeRests;
+ }
+
+ emit productsChanged();
+}
diff --git a/viewmodels/restsviewmodel.h b/viewmodels/restsviewmodel.h
new file mode 100644
index 0000000..953e722
--- /dev/null
+++ b/viewmodels/restsviewmodel.h
@@ -0,0 +1,35 @@
+#ifndef RESTSVIEWMODEL_H
+#define RESTSVIEWMODEL_H
+
+#include
+
+#include "services/modelsregister.h"
+
+class SettingsService;
+class RestsViewModel : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QVariantList products READ products NOTIFY productsChanged)
+
+public:
+ explicit RestsViewModel(QObject *parent = nullptr);
+
+ QVariantList products() const;
+
+ Q_INVOKABLE void setProductRest(const QString &productId, float rest);
+
+signals:
+ void productsChanged();
+
+private:
+ SettingsService *settings() const;
+ void reloadRests();
+
+ BaseModel *m_productsModel = ModelsRegister::model("products");
+ BaseModel *m_restsModel = ModelsRegister::model("rests");
+
+ QMap m_rests;
+};
+
+#endif // RESTSVIEWMODEL_H