IncomeMargins added
authorelgekko <vasary@elgekko.net>
Mon, 22 May 2023 20:28:28 +0000 (22:28 +0200)
committerelgekko <vasary@elgekko.net>
Mon, 22 May 2023 20:28:28 +0000 (22:28 +0200)
lis-ui/src/main/java/hu/user/lis/ui/data/IncomeMargin.java [new file with mode: 0644]
lis-ui/src/main/java/hu/user/lis/ui/data/IncomeMarginsDataModel.java [new file with mode: 0644]
lis-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java
lis-ui/src/main/java/hu/user/lis/ui/event/EventBus.java
lis-ui/src/main/java/hu/user/lis/ui/view/IndexViewModel.java
lis-ui/src/main/resources/metainfo/zk/zk.xml
lis-ui/src/main/resources/web/project-editor.zul
lis-ui/src/main/resources/web/service-records.zul

diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/IncomeMargin.java b/lis-ui/src/main/java/hu/user/lis/ui/data/IncomeMargin.java
new file mode 100644 (file)
index 0000000..934772e
--- /dev/null
@@ -0,0 +1,14 @@
+package hu.user.lis.ui.data;
+
+import hu.user.lis.db.Currency;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Builder
+public class IncomeMargin {
+    Currency currency;
+    Double amount;
+}
diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/IncomeMarginsDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/IncomeMarginsDataModel.java
new file mode 100644 (file)
index 0000000..a4bddaa
--- /dev/null
@@ -0,0 +1,66 @@
+package hu.user.lis.ui.data;
+
+import hu.user.lis.db.Currency;
+import hu.user.lis.db.Invoice;
+import hu.user.lis.db.Project;
+import hu.user.lis.db.Treasury;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.zkoss.bind.BindUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Component
+@Log4j2
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class IncomeMarginsDataModel extends ArrayList<IncomeMargin> {
+
+    public void recalculate(Project project) {
+        clear();
+        Map<Currency, Double> balances = new HashMap<>();
+        List<Invoice> outgoingInvoices = project.getOutgoingInvoices();
+        if (Objects.nonNull(outgoingInvoices)) {
+            for (Invoice invoice : outgoingInvoices) {
+                addBalance(balances, invoice.getCurrency(), invoice.getNetAmount());
+            }
+        }
+
+        List<Invoice> incomingInvoices = project.getIncomingInvoices();
+        if (Objects.nonNull(incomingInvoices)) {
+            for (Invoice invoice : incomingInvoices) {
+                substractBalance(balances, invoice.getCurrency(), invoice.getNetAmount());
+            }
+        }
+
+        List<Treasury> treasuries = project.getTreasuries();
+        if (Objects.nonNull(treasuries)) {
+            for (Treasury treasury : treasuries) {
+                substractBalance(balances, treasury.getSellCurrency(), treasury.getSellAmount());
+                addBalance(balances, treasury.getBuyCurrency(), treasury.getBuyAmount());
+            }
+        }
+
+        balances.entrySet().stream()
+                .map(s -> IncomeMargin.builder().currency(s.getKey()).amount(s.getValue()).build())
+                .sorted(Comparator.comparing(IncomeMargin::getCurrency))
+                .collect(Collectors.toCollection(() -> this));
+
+        BindUtils.postNotifyChange(null, null, this, "*");
+    }
+
+
+    private void addBalance(Map<Currency, Double> balances, Currency currency, double amount) {
+        double currentBalance = balances.containsKey(currency) ? balances.get(currency) : 0;
+        currentBalance += amount;
+        balances.put(currency, currentBalance);
+    }
+
+    private void substractBalance(Map<Currency, Double> balances, Currency currency, double amount) {
+        double currentBalance = balances.containsKey(currency) ? balances.get(currency) : 0;
+        currentBalance -= amount;
+        balances.put(currency, currentBalance);
+    }
+}
index e89a529a83256638f351807cd8d0ced599ef75d4..2b871a9cb19b682d1ed493c62470f8c87fd58b38 100644 (file)
@@ -9,10 +9,7 @@ import hu.user.lis.db.Treasury;
 import hu.user.lis.services.data.*;
 import hu.user.lis.ui.Constants;
 import hu.user.lis.ui.converter.ProjectStatusConverter;
-import hu.user.lis.ui.data.AssociatesDataModel;
-import hu.user.lis.ui.data.PartnerSelectorDataModel;
-import hu.user.lis.ui.data.ProjectStatusDataModel;
-import hu.user.lis.ui.data.ServiceRecordsDataModel;
+import hu.user.lis.ui.data.*;
 import hu.user.lis.ui.event.EventBus;
 import lombok.Getter;
 import lombok.Setter;
@@ -68,6 +65,8 @@ public class ProjectEditorModel extends AbstractValidator implements EventListen
     @WireVariable
     private ProjectStatusConverter projectStatusConverter;
     @WireVariable
+    private IncomeMarginsDataModel incomeMarginsDataModel;
+    @WireVariable
     private EventBus eventBus;
     private boolean formInvalid = true;
     private Invoice selectedIncomingInvoice;
@@ -82,6 +81,19 @@ public class ProjectEditorModel extends AbstractValidator implements EventListen
         log.info("Initialized");
     }
 
+    @Override
+    public void onEvent(Event evt) {
+        if (Constants.SET_PROJECT_EDITOR_DATA.equals(evt.getName())) {
+            Map<String, Object> data = (Map<String, Object>) evt.getData();
+            origDocument = (Project) data.get("origDocument");
+            formDocument = (Project) data.get("formDocument");
+            serviceRecordsDataModel.search(formDocument, true);
+            associatesDataModel.listAll();
+            incomeMarginsDataModel.recalculate(formDocument);
+            BindUtils.postNotifyChange(this, "formDocument");
+        }
+    }
+
     @NotifyChange("associatesDataModel")
     public void setPartialAssociateName(String partialAssociateName) {
         this.partialAssociateName = partialAssociateName;
@@ -159,6 +171,7 @@ public class ProjectEditorModel extends AbstractValidator implements EventListen
     }
 
     private void validate(Project newData) {
+        incomeMarginsDataModel.recalculate(formDocument);
         updateFormInvalid(false);
         if (!Objects.isNull(origDocument)) {
             boolean invalid = projectServiceImpl.toString(origDocument).equals(projectServiceImpl.toString(newData))
@@ -342,18 +355,6 @@ public class ProjectEditorModel extends AbstractValidator implements EventListen
         BindUtils.postNotifyChange(this, "formInvalid");
     }
 
-    @Override
-    public void onEvent(Event evt) {
-        if (Constants.SET_PROJECT_EDITOR_DATA.equals(evt.getName())) {
-            Map<String, Object> data = (Map<String, Object>) evt.getData();
-            origDocument = (Project) data.get("origDocument");
-            formDocument = (Project) data.get("formDocument");
-            serviceRecordsDataModel.search(formDocument, true);
-            associatesDataModel.listAll();
-            BindUtils.postNotifyChange(this, "formDocument");
-        }
-    }
-
     @Destroy
     public void onDestroy() {
         log.info("Destroy {}", getClass().getSimpleName());
index f09e70430f7df583c9e4c441f281d59a551a4b76..9e9f041594a6154dbd48a71bfa0d01256cc3c548 100644 (file)
@@ -1,6 +1,7 @@
 package hu.user.lis.ui.event;
 
 import hu.user.lis.ui.Constants;
+import lombok.extern.log4j.Log4j2;
 import org.springframework.stereotype.Service;
 import org.zkoss.zk.ui.event.Event;
 import org.zkoss.zk.ui.event.EventListener;
@@ -8,42 +9,45 @@ import org.zkoss.zk.ui.event.EventQueue;
 import org.zkoss.zk.ui.event.EventQueues;
 
 @Service
+@Log4j2
 public class EventBus {
-    private EventQueue<Event> queue;
-
-    public EventBus() {
-        queue = EventQueues.lookup(Constants.PROJECT_EDITOR_QUEUE, EventQueues.APPLICATION, true);
+    private EventQueue<Event> getQueue() {
+        return EventQueues.lookup(Constants.PROJECT_EDITOR_QUEUE, EventQueues.SESSION, true);
     }
 
     public void register(EventListener listener) {
-        queue.subscribe(listener);
+        getQueue().subscribe(listener);
     }
 
     public void unregister(EventListener listener) {
-        queue.unsubscribe(listener);
+        try {
+            getQueue().unsubscribe(listener);
+        } catch (Exception e) {
+            log.warn("Not necessary to unregister");
+        }
     }
 
     public void showProjectsList(Object data) {
-        queue.publish(new Event(Constants.SHOW_PROJECTS_LIST, null, data));
+        getQueue().publish(new Event(Constants.SHOW_PROJECTS_LIST, null, data));
     }
 
     public void showProjectEditor(Object data) {
-        queue.publish(new Event(Constants.SHOW_PROJECT_EDITOR, null, data));
+        getQueue().publish(new Event(Constants.SHOW_PROJECT_EDITOR, null, data));
     }
 
     public void showServiceRecordsList(Object data) {
-        queue.publish(new Event(Constants.SHOW_SERVICE_RECORDS_LIST, null, data));
+        getQueue().publish(new Event(Constants.SHOW_SERVICE_RECORDS_LIST, null, data));
     }
 
     public void setServiceRecordsListData(Object data) {
-        queue.publish(new Event(Constants.SET_SERVICE_RECORDS_LIST_DATA, null, data));
+        getQueue().publish(new Event(Constants.SET_SERVICE_RECORDS_LIST_DATA, null, data));
     }
 
     public void setProjectEditorData(Object data) {
-        queue.publish(new Event(Constants.SET_PROJECT_EDITOR_DATA, null, data));
+        getQueue().publish(new Event(Constants.SET_PROJECT_EDITOR_DATA, null, data));
     }
 
     public void setProjectsListData(Object data) {
-        queue.publish(new Event(Constants.SET_PROJECTS_LIST_DATA, null, data));
+        getQueue().publish(new Event(Constants.SET_PROJECTS_LIST_DATA, null, data));
     }
 }
index 912df2bbb7c3f0cb68a4d10fafafc1ee57d03081..9fa78cab804c1b7f721c00b9c4fe495bf3d22afe 100644 (file)
@@ -13,12 +13,14 @@ import org.zkoss.bind.annotation.Command;
 import org.zkoss.bind.annotation.Destroy;
 import org.zkoss.bind.annotation.Init;
 import org.zkoss.zk.ui.Executions;
+import org.zkoss.zk.ui.Sessions;
 import org.zkoss.zk.ui.event.Event;
 import org.zkoss.zk.ui.event.EventListener;
 import org.zkoss.zk.ui.select.annotation.VariableResolver;
 import org.zkoss.zk.ui.select.annotation.WireVariable;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 import java.util.Map;
 
 @Log4j2
@@ -52,6 +54,8 @@ public class IndexViewModel implements EventListener {
 
     @Init
     public void init() {
+        HttpSession s = (HttpSession) Sessions.getCurrent().getNativeSession();
+        log.info("Current session is {}", s.getId());
         HttpServletRequest nativeRequest = (HttpServletRequest) Executions.getCurrent().getNativeRequest();
         String path = (String) Executions.getCurrent().getAttribute("javax.servlet.forward.servlet_path");
         if (navigation.containsKey(path)) {
index dd730c81664090024e87b06cfb0c68777aa74018..632cf9540ce12691e28fcf80044d74d670e81839 100644 (file)
@@ -1,10 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <zk>
     <config-name/>
-    <system-config>
-        <ui-factory-class>org.zkoss.zk.ui.http.SerializableUiFactory</ui-factory-class>
-        <max-upload-size>10240</max-upload-size>
-    </system-config>
+    <session-config>
+        <session-timeout>300</session-timeout>
+        <timeout-uri>/timeout</timeout-uri>
+    </session-config>
+    <!--    <system-config>-->
+    <!--        <ui-factory-class>org.zkoss.zk.ui.http.SerializableUiFactory</ui-factory-class>-->
+    <!--        <max-upload-size>10240</max-upload-size>-->
+    <!--    </system-config>-->
     <library-property>
         <name>org.zkoss.theme.preferred</name>
         <value>silvertail</value>
index a50a24f44eade6e8e6c847810d7b5933a9a6f3f1..201531004d38a2fe5fecdaf2e39d59bd5f2a6abe 100644 (file)
                                 </tabs>
                                 <tabpanels>
                                     <tabpanel>
-                                        <vlayout hflex="true">
+                                        <vlayout vflex="true">
+                                            <listbox model="@load(vm.incomeMarginsDataModel)" vflex="true"
+                                                     forward="onOK=submit.onClick, onCancel=cancel.onClick">
+                                                <listhead visible="true">
+                                                    <listheader label="Pénznem" align="left"/>
+                                                    <listheader label="Összeg" align="right"/>
+                                                </listhead>
+                                                <template name="model">
+                                                    <listitem>
+                                                        <listcell label="@load(each.currency)"/>
+                                                        <listcell
+                                                                label="@load(each.amount) @converter('hu.user.lis.ui.converter.DoubleToStringConverter')"/>
+                                                    </listitem>
+                                                </template>
+                                            </listbox>
                                         </vlayout>
                                     </tabpanel>
                                 </tabpanels>
index 0467b2a03e38f04f2e38bcbb2d550715c0adde5f..65038cb099bc9a74560231a404fba9b97c716807 100644 (file)
@@ -30,7 +30,7 @@
                         <listheader label="Munkanap" align="left"/>
                         <listheader label="Leírás" align="left"/>
                         <listheader label="Óraszám" align="right"/>
-                        <listheader label="ALáírt" align="left"/>
+                        <listheader label="Aláírt" align="left"/>
                     </listhead>
                     <template name="model">
                         <listitem>