Denis V. Dedkov преди 2 години
родител
ревизия
fc1d96437f
променени са 9 файла, в които са добавени 180 реда и са изтрити 10 реда
  1. 1 0
      CMakeLists.txt
  2. 23 10
      beerlog_ru_RU.ts
  3. 2 0
      main.cpp
  4. 1 0
      qml/Views/ProductsView.qml
  5. 43 0
      qml/Views/RestsView.qml
  6. 5 0
      qml/main.qml
  7. 1 0
      qml/qml.qrc
  8. 69 0
      viewmodels/restsviewmodel.cpp
  9. 35 0
      viewmodels/restsviewmodel.h

+ 1 - 0
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

+ 23 - 10
beerlog_ru_RU.ts

@@ -17,16 +17,24 @@
 <context>
     <name>ProductsView</name>
     <message>
-        <location filename="qml/Views/ProductsView.qml" line="87"/>
+        <location filename="qml/Views/ProductsView.qml" line="88"/>
         <source>Summary: %1</source>
         <translation>Итого: %1</translation>
     </message>
     <message>
-        <location filename="qml/Views/ProductsView.qml" line="94"/>
+        <location filename="qml/Views/ProductsView.qml" line="95"/>
         <source>Order</source>
         <translation>Заказать</translation>
     </message>
 </context>
+<context>
+    <name>RestsView</name>
+    <message>
+        <location filename="qml/Views/RestsView.qml" line="8"/>
+        <source>Rests</source>
+        <translation>Остатки</translation>
+    </message>
+</context>
 <context>
     <name>SettingsView</name>
     <message>
@@ -61,38 +69,43 @@
         <translation></translation>
     </message>
     <message>
-        <location filename="qml/main.qml" line="91"/>
+        <location filename="qml/main.qml" line="92"/>
         <source>BeerLog v0.1</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="qml/main.qml" line="93"/>
+        <location filename="qml/main.qml" line="94"/>
         <source>Online</source>
         <translation>В сети</translation>
     </message>
     <message>
-        <location filename="qml/main.qml" line="93"/>
+        <location filename="qml/main.qml" line="94"/>
         <source>Offline</source>
         <translation>Не в сети</translation>
     </message>
     <message>
-        <location filename="qml/main.qml" line="99"/>
+        <location filename="qml/main.qml" line="100"/>
         <source>Orders</source>
         <translation>Заказы</translation>
     </message>
     <message>
-        <location filename="qml/main.qml" line="103"/>
+        <location filename="qml/main.qml" line="104"/>
+        <source>Rests</source>
+        <translation>Остатки</translation>
+    </message>
+    <message>
+        <location filename="qml/main.qml" line="108"/>
         <source>Settings</source>
         <translation>Настройки</translation>
     </message>
     <message>
-        <location filename="qml/main.qml" line="107"/>
-        <location filename="qml/main.qml" line="143"/>
+        <location filename="qml/main.qml" line="112"/>
+        <location filename="qml/main.qml" line="148"/>
         <source>Quit</source>
         <translation>Выход</translation>
     </message>
     <message>
-        <location filename="qml/main.qml" line="147"/>
+        <location filename="qml/main.qml" line="152"/>
         <source>Realy quit the application?</source>
         <translation>Действительно выйти из приложения?</translation>
     </message>

+ 2 - 0
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<ProductsViewModel>("ru.ded.beerlog", 1, 0, "ProductsViewModel");
     qmlRegisterType<OrdersViewModel>("ru.ded.beerlog", 1, 0, "OrdersViewModel");
     qmlRegisterType<StoresViewModel>("ru.ded.beerlog", 1, 0, "StoresViewModel");
+    qmlRegisterType<RestsViewModel>("ru.ded.beerlog", 1, 0, "RestsViewModel");
     qmlRegisterType<SettingsViewModel>("ru.ded.beerlog", 1, 0, "SettingsViewModel");
 
     engine.load(url);

+ 1 - 0
qml/Views/ProductsView.qml

@@ -12,6 +12,7 @@ Page {
 
     RowLayout {
         anchors.fill: parent
+        anchors.margins: 10
 
         ListView {
             id: productsList

+ 43 - 0
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)
+            }
+        }
+    }
+}

+ 5 - 0
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"

+ 1 - 0
qml/qml.qrc

@@ -6,5 +6,6 @@
         <file>Views/OrdersView.qml</file>
         <file>Views/SettingsView.qml</file>
         <file>Views/ProductsView.qml</file>
+        <file>Views/RestsView.qml</file>
     </qresource>
 </RCC>

+ 69 - 0
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();
+}

+ 35 - 0
viewmodels/restsviewmodel.h

@@ -0,0 +1,35 @@
+#ifndef RESTSVIEWMODEL_H
+#define RESTSVIEWMODEL_H
+
+#include <QObject>
+
+#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<QString, QVariantMap> m_rests;
+};
+
+#endif // RESTSVIEWMODEL_H