--- /dev/null
+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;
+}
--- /dev/null
+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);
+ }
+}
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;
@WireVariable
private ProjectStatusConverter projectStatusConverter;
@WireVariable
+ private IncomeMarginsDataModel incomeMarginsDataModel;
+ @WireVariable
private EventBus eventBus;
private boolean formInvalid = true;
private Invoice selectedIncomingInvoice;
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;
}
private void validate(Project newData) {
+ incomeMarginsDataModel.recalculate(formDocument);
updateFormInvalid(false);
if (!Objects.isNull(origDocument)) {
boolean invalid = projectServiceImpl.toString(origDocument).equals(projectServiceImpl.toString(newData))
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());
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;
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));
}
}
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
@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)) {
<?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>
</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>
<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>