From ef38e7f29c4c5ee6ec615edff320fdee1804d60f Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Tue, 5 Mar 2024 17:00:01 +0100 Subject: [PATCH] v0.2.4 --- sly-crm-app/pom.xml | 2 +- .../src/main/resources/application-prod.yaml | 1 + .../src/main/java/hu/user/lis/db/Project.java | 15 ++-- .../lis/db/repository/TreasuryRepository.java | 7 ++ .../hu/user/lis/ui/data/InvoiceDataModel.java | 15 +++- .../hu/user/lis/ui/data/MoneyBalance.java | 15 ++++ .../user/lis/ui/data/ProjectsDataModel.java | 18 +++- .../lis/ui/data/ServiceRecordsDataModel.java | 17 ++-- .../user/lis/ui/data/TreasuryDataModel.java | 14 ++- .../ui/editor/ExchangedRateValueUpdater.java | 86 +++++++++++++++++++ .../lis/ui/editor/ProjectEditorModel.java | 54 ++++++------ .../ui/editor/ServiceRecordEditorModel.java | 2 - .../lis/ui/view/ServiceRecordsViewModel.java | 22 ++++- .../resources/web/editor/project-editor.zul | 40 ++++----- .../main/resources/web/form/invoice-form.zul | 4 +- .../src/main/resources/web/invoices.zul | 4 +- .../resources/web/static/css/webclient.css | 30 ++++++- sly-crm-ui/src/main/resources/web/test.zul | 2 + 18 files changed, 255 insertions(+), 93 deletions(-) create mode 100644 sly-crm-ui/src/main/java/hu/user/lis/ui/data/MoneyBalance.java create mode 100644 sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ExchangedRateValueUpdater.java diff --git a/sly-crm-app/pom.xml b/sly-crm-app/pom.xml index 8aa4456..5eb6979 100644 --- a/sly-crm-app/pom.xml +++ b/sly-crm-app/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 sly-crm-app - 0.2.3 + 0.2.4 SLY-CRM hu.user diff --git a/sly-crm-app/src/main/resources/application-prod.yaml b/sly-crm-app/src/main/resources/application-prod.yaml index 502cf24..4f4f7a4 100644 --- a/sly-crm-app/src/main/resources/application-prod.yaml +++ b/sly-crm-app/src/main/resources/application-prod.yaml @@ -60,6 +60,7 @@ application: import-invoice: input-path: /temp/invoice-import project-id-pattern: \d{4}-\d{4} + old-project-id-pattern: \d{8} service: nav: trust: diff --git a/sly-crm-db/src/main/java/hu/user/lis/db/Project.java b/sly-crm-db/src/main/java/hu/user/lis/db/Project.java index 13d2362..cdc53da 100644 --- a/sly-crm-db/src/main/java/hu/user/lis/db/Project.java +++ b/sly-crm-db/src/main/java/hu/user/lis/db/Project.java @@ -9,13 +9,9 @@ import lombok.experimental.SuperBuilder; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; -import javax.persistence.CascadeType; import javax.persistence.Entity; -import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OrderColumn; import javax.persistence.Transient; import java.util.List; @@ -54,11 +50,12 @@ public class Project extends IdEntity { @Transient private List outgoingInvoices; - @OneToMany(targetEntity = Treasury.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) - @JoinColumn(name = "project_id", referencedColumnName = "id") - @Fetch(FetchMode.JOIN) - @OrderColumn(name = "pos") - @JsonIncludeProperties({"id"}) + // @OneToMany(targetEntity = Treasury.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) +// @JoinColumn(name = "project_id", referencedColumnName = "id") +// @Fetch(FetchMode.JOIN) +// @OrderColumn(name = "pos") +// @JsonIncludeProperties({"id"}) + @Transient private List treasuries; private String name; diff --git a/sly-crm-db/src/main/java/hu/user/lis/db/repository/TreasuryRepository.java b/sly-crm-db/src/main/java/hu/user/lis/db/repository/TreasuryRepository.java index 13a16c2..795ee48 100644 --- a/sly-crm-db/src/main/java/hu/user/lis/db/repository/TreasuryRepository.java +++ b/sly-crm-db/src/main/java/hu/user/lis/db/repository/TreasuryRepository.java @@ -1,8 +1,15 @@ package hu.user.lis.db.repository; +import hu.user.lis.db.Project; import hu.user.lis.db.Treasury; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface TreasuryRepository extends JpaRepository { + List getAllByProjectOrderByTransactionDate(Project project); + + List getAllByProjectIsNull(); + } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/InvoiceDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/InvoiceDataModel.java index a9e3d9d..8076fb6 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/InvoiceDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/InvoiceDataModel.java @@ -1,9 +1,6 @@ package hu.user.lis.ui.data; -import hu.user.lis.db.IncomingInvoice; -import hu.user.lis.db.Invoice; -import hu.user.lis.db.InvoiceStatus; -import hu.user.lis.db.OutgoingInvoice; +import hu.user.lis.db.*; import hu.user.lis.db.repository.InvoiceRepository; import hu.user.lis.service.data.EntityDataService; import hu.user.lis.service.data.EntityDocumentAction; @@ -67,4 +64,14 @@ public class InvoiceDataModel { public void delete(Invoice selectedIncomingInvoice) { invoiceRepository.delete(selectedIncomingInvoice); } + + public void fillProjectIncomingInvoices(Project project) { + List incoming = invoiceRepository.findAllByProjectAndIncomingIsTrue(project); + project.setIncomingInvoices(incoming); + } + + public void fillProjectOutgoingInvoices(Project project) { + List outgoing = invoiceRepository.findAllByProjectAndIncomingIsFalse(project); + project.setOutgoingInvoices(outgoing); + } } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/MoneyBalance.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/MoneyBalance.java new file mode 100644 index 0000000..0d362d7 --- /dev/null +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/MoneyBalance.java @@ -0,0 +1,15 @@ +package hu.user.lis.ui.data; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +public class MoneyBalance { + @Builder.Default + Double income = (double) 0; + @Builder.Default + Double expense = (double) 0; +} diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java index 0675113..3b57c22 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java @@ -3,8 +3,10 @@ package hu.user.lis.ui.data; import hu.user.lis.db.Partner; import hu.user.lis.db.Project; import hu.user.lis.db.ProjectStatus; +import hu.user.lis.db.Treasury; import hu.user.lis.db.repository.InvoiceRepository; import hu.user.lis.db.repository.ProjectRepository; +import hu.user.lis.db.repository.TreasuryRepository; import hu.user.lis.db.repository.filter.ProjectFilter; import hu.user.lis.service.data.EntityDataService; import hu.user.lis.ui.data.common.CachedSpringDataModel; @@ -30,16 +32,19 @@ import java.util.Optional; @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ProjectsDataModel extends CachedSpringDataModel { @Autowired - ProjectRepository projectRepository; + private ProjectRepository projectRepository; @Autowired - InvoiceRepository invoiceRepository; + private InvoiceRepository invoiceRepository; @Autowired - ProjectStatusDataModel projectStatusDataModel; + private TreasuryRepository treasuryRepository; @Autowired - EntityDataService projectDataService; + private ProjectStatusDataModel projectStatusDataModel; + + @Autowired + private EntityDataService projectDataService; private ProjectFilter filter; @@ -128,8 +133,13 @@ public class ProjectsDataModel extends CachedSpringDataModel { selectedEntity.getOutgoingInvoices().forEach(i -> i.setProject(selectedEntity)); invoiceRepository.saveAll(selectedEntity.getIncomingInvoices()); invoiceRepository.saveAll(selectedEntity.getOutgoingInvoices()); + treasuryRepository.saveAll(selectedEntity.getTreasuries()); result.setIncomingInvoices(selectedEntity.getIncomingInvoices()); result.setOutgoingInvoices(selectedEntity.getOutgoingInvoices()); + result.setTreasuries(selectedEntity.getTreasuries()); + + List orphanTreasuries = treasuryRepository.getAllByProjectIsNull(); + treasuryRepository.deleteAll(orphanTreasuries); return result; } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java index 393c516..16c37d0 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java @@ -19,11 +19,7 @@ import org.zkoss.bind.annotation.Init; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zul.FieldComparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; +import java.util.*; @Component @Log4j2 @@ -59,28 +55,25 @@ public class ServiceRecordsDataModel extends CachedSpringDataModel getResultSet(int page, int pageSize, FieldComparator sortComparator) { if (groupByAssociate) { - return getGroupedServiceRecords().values().stream().collect(Collectors.toList()); + return new ArrayList<>(getGroupedServiceRecords().values()); } Pageable pageable = createPageable(page, pageSize, sortComparator); - List result = listAll ? serviceRecordRepository.findAll(pageable).toList() : + return listAll ? serviceRecordRepository.findAll(pageable).toList() : serviceRecordRepository.search(filterProjectId, filterAssociateId, pageable); - return result; } Map getGroupedServiceRecords() { Map grouped = new HashMap<>(); List allEntities = serviceRecordRepository.findByProjectId(filterProjectId); - allEntities.stream().forEach(s -> { - double cost = s.getWorkHours() * s.getAssociate().getMonthlyCost() / 160; + allEntities.forEach(s -> { if (grouped.containsKey(s.getAssociate().getId())) { ServiceRecord serviceRecord = grouped.get(s.getAssociate().getId()); - serviceRecord.setCost(serviceRecord.getCost() + cost); + serviceRecord.setCost(serviceRecord.getCost() + s.getCost()); serviceRecord.setWorkHours(serviceRecord.getWorkHours() + s.getWorkHours()); } else { ServiceRecord serviceRecord = serviceRecordDataService.clone(s); serviceRecord.setWorkDay(null); serviceRecord.setId(0L); - serviceRecord.setCost(cost); grouped.put(serviceRecord.getAssociate().getId(), serviceRecord); } }); diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/TreasuryDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/TreasuryDataModel.java index ef8a4d2..e634205 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/TreasuryDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/TreasuryDataModel.java @@ -1,21 +1,27 @@ package hu.user.lis.ui.data; +import hu.user.lis.db.Project; import hu.user.lis.db.Treasury; +import hu.user.lis.db.repository.TreasuryRepository; import hu.user.lis.service.data.EntityDataService; import hu.user.lis.service.data.TreasuryService; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; + @Component @Log4j2 public class TreasuryDataModel { + @Autowired + private TreasuryRepository treasuryRepository; @Autowired - EntityDataService treasuryDataService; + private EntityDataService treasuryDataService; @Autowired - TreasuryService treasuryService; + private TreasuryService treasuryService; public Treasury createNew() { return treasuryService.createNew(); @@ -25,4 +31,8 @@ public class TreasuryDataModel { return treasuryDataService.clone(entity); } + public void fillProjectTreasuries(Project project) { + List treasury = treasuryRepository.getAllByProjectOrderByTransactionDate(project); + project.setTreasuries(treasury); + } } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ExchangedRateValueUpdater.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ExchangedRateValueUpdater.java new file mode 100644 index 0000000..fc05278 --- /dev/null +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ExchangedRateValueUpdater.java @@ -0,0 +1,86 @@ +package hu.user.lis.ui.editor; + +import hu.user.lis.db.*; +import hu.user.lis.service.mnb.ExchangeRateService; +import hu.user.lis.ui.data.MoneyBalance; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; +import java.util.Objects; + +@Log4j2 +@Service +public class ExchangedRateValueUpdater { + @Autowired + private ExchangeRateService exchangeRateService; + + public MoneyBalance update(Project project) { + MoneyBalance result = MoneyBalance.builder().build(); + for (IncomingInvoice incomingInvoice : project.getIncomingInvoices()) { + double income = updateInvoiceExchangedValues(incomingInvoice); + result.setIncome(result.getIncome() + income); + } + + for (OutgoingInvoice outgoingInvoice : project.getOutgoingInvoices()) { + double expense = updateInvoiceExchangedValues(outgoingInvoice); + result.setExpense(result.getExpense() + expense); + } + + for (Treasury treasury : project.getTreasuries()) { + updateTreasuryExchangedValues(treasury); + } + log.info("Exchanged rates and values updated"); + return result; + } + + private void updateTreasuryExchangedValues(Treasury treasury) { + Date initialDate = treasury.getTransactionDate(); + Currency currency = treasury.getBuyCurrency(); + if (!Currency.HUF.equals(currency) && Objects.isNull(treasury.getBuyExchangeRate())) { + LocalDate exchangeDate = Objects.isNull(initialDate) ? LocalDate.now() : + initialDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + Double exchangeRate = exchangeRateService.getExchangeRate(currency, exchangeDate); + if (Objects.nonNull(exchangeRate)) { + treasury.setBuyExchangeRate(exchangeRate); + treasury.setBuyAmountHUF(treasury.getBuyAmount() * exchangeRate); + } + } + currency = treasury.getSellCurrency(); + if (!Currency.HUF.equals(currency) && Objects.isNull(treasury.getSellExchangeRate())) { + LocalDate exchangeDate = Objects.isNull(initialDate) ? LocalDate.now() : + initialDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + Double exchangeRate = exchangeRateService.getExchangeRate(currency, exchangeDate); + if (Objects.nonNull(exchangeRate)) { + treasury.setSellExchangeRate(exchangeRate); + treasury.setSellAmountHUF(treasury.getBuyAmount() * exchangeRate); + } + } + } + + private double updateInvoiceExchangedValues(Invoice invoice) { + if (!Currency.HUF.equals(invoice.getCurrency()) && Objects.isNull(invoice.getExchangeRate())) { + Date initialDate = invoice.getPaymentDeadline(); + LocalDate exchangeDate = Objects.isNull(initialDate) ? LocalDate.now() : + initialDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + Double exchangeRate = exchangeRateService.getExchangeRate(invoice.getCurrency(), exchangeDate); + if (Objects.nonNull(exchangeRate)) { + invoice.setExchangeRate(exchangeRate); + invoice.setNetAmountHUF(invoice.getNetAmount() * exchangeRate); + invoice.setGrossAmountHUF(invoice.getGrossAmount() * exchangeRate); + } + } + if (Currency.HUF.equals(invoice.getCurrency())) { + invoice.setExchangeRate((double) 1); + invoice.setNetAmountHUF(invoice.getNetAmount()); + invoice.setGrossAmountHUF(invoice.getGrossAmount()); + } + + return Objects.isNull(invoice.getGrossAmountHUF()) ? 0 : invoice.getGrossAmountHUF(); + } + + +} diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java index 4a071af..794afae 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java @@ -1,27 +1,12 @@ package hu.user.lis.ui.editor; import com.google.common.collect.ImmutableMap; -import hu.user.lis.db.Associate; -import hu.user.lis.db.IncomingInvoice; -import hu.user.lis.db.Invoice; -import hu.user.lis.db.OutgoingInvoice; -import hu.user.lis.db.Partner; -import hu.user.lis.db.Project; -import hu.user.lis.db.ProjectAssociate; -import hu.user.lis.db.Treasury; -import hu.user.lis.db.repository.InvoiceRepository; +import hu.user.lis.db.*; import hu.user.lis.service.data.EntityDocumentAction; import hu.user.lis.service.data.EntityDocumentService; 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.IncomeMarginsDataModel; -import hu.user.lis.ui.data.InvoiceDataModel; -import hu.user.lis.ui.data.ProjectAssociatesDataModel; -import hu.user.lis.ui.data.ProjectStatusDataModel; -import hu.user.lis.ui.data.ProjectsDataModel; -import hu.user.lis.ui.data.ServiceRecordsDataModel; -import hu.user.lis.ui.data.TreasuryDataModel; +import hu.user.lis.ui.data.*; import hu.user.lis.ui.editor.common.Editors; import hu.user.lis.ui.editor.common.EntityEditorModel; import hu.user.lis.ui.editor.validator.FormValidator; @@ -33,11 +18,7 @@ import lombok.extern.log4j.Log4j2; import org.apache.commons.collections4.CollectionUtils; import org.springframework.transaction.annotation.Transactional; import org.zkoss.bind.BindUtils; -import org.zkoss.bind.annotation.BindingParam; -import org.zkoss.bind.annotation.Command; -import org.zkoss.bind.annotation.Destroy; -import org.zkoss.bind.annotation.Init; -import org.zkoss.bind.annotation.NotifyChange; +import org.zkoss.bind.annotation.*; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.select.annotation.WireVariable; @@ -64,8 +45,8 @@ public class ProjectEditorModel extends EntityEditorModel { ProjectsDataModel projectsDataModel; @WireVariable private InvoiceDataModel invoiceDataModel; - @WireVariable - private InvoiceRepository invoiceRepository; + // @WireVariable +// private InvoiceRepository invoiceRepository; @WireVariable private TreasuryDataModel treasuryDataModel; @Getter @@ -107,6 +88,9 @@ public class ProjectEditorModel extends EntityEditorModel { @WireVariable private EntityDocumentService entityDocumentService; + @WireVariable + private ExchangedRateValueUpdater exchangedRateValueUpdater; + @Override public FormValidator getFormValidator() { return projectFormValidator; @@ -126,6 +110,7 @@ public class ProjectEditorModel extends EntityEditorModel { Object data = evt.getData(); initDocuments(data); initDetails(); + //validate(); } } @@ -147,10 +132,10 @@ public class ProjectEditorModel extends EntityEditorModel { Clients.evalJavaScript(String.format("pushNav('/project/%d')", id)); log.info("Loading entity {} to editor", id); Project project = projectsDataModel.getById(id); - List incoming = invoiceRepository.findAllByProjectAndIncomingIsTrue(project); - List outgoing = invoiceRepository.findAllByProjectAndIncomingIsFalse(project); - project.setIncomingInvoices(incoming); - project.setOutgoingInvoices(outgoing); + invoiceDataModel.fillProjectIncomingInvoices(project); + invoiceDataModel.fillProjectOutgoingInvoices(project); + treasuryDataModel.fillProjectTreasuries(project); + setFormDocument(project); setOrigDocument(projectsDataModel.clone(getFormDocument())); } @@ -433,9 +418,22 @@ public class ProjectEditorModel extends EntityEditorModel { @Override public void validate() { super.validate(); + //updateExchangeRateBasedValues(); safeRecalcMargin(); } + private void updateExchangeRateBasedValues() { + try { + MoneyBalance balance = exchangedRateValueUpdater.update(getFormDocument()); + getFormDocument().setSellingPrice(balance.getIncome()); + getFormDocument().setSupplyPrice(balance.getExpense()); + getFormDocument().setMargin(balance.getIncome() - balance.getExpense()); + BindUtils.postNotifyChange(getFormDocument(), "sellingPrice", "supplyPrice", "margin"); + } catch (Exception e) { + log.error(e.getMessage()); + } + } + private void safeRecalcMargin() { try { incomeMarginsDataModel.recalculate(getFormDocument(), serviceRecordsDataModel); diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java index abed574..2575d4f 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java @@ -87,8 +87,6 @@ public class ServiceRecordEditorModel extends EntityAttachmentEditorModel opProjectAssociate = projectAssociatesDataModel.searchByAssociateAndProject(getFormDocument().getAssociate().getId(), getFormDocument().getProject().getId()); - - List actions = getEntityDocumentDataModel().getActions(); if (opProjectAssociate.isPresent()) { Events.postEvent(new SaveEntityWithAttachmentEvent<>(getFormDocument(), actions, target)); diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java index 2ec785b..f55b6f7 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java @@ -27,10 +27,7 @@ import org.zkoss.zk.ui.select.annotation.VariableResolver; import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zkplus.spring.DelegatingVariableResolver; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; @Log4j2 @@ -112,11 +109,28 @@ public class ServiceRecordsViewModel extends EntityViewModel impl Editors.doEdit(Editors.SERVICE_RECORD, entity, getSelectedEntity(), this::saveServiceRecord); } + public void calculateCost(ServiceRecord entity) { + double cost = 0; + int monthWorkDays = 5; + int workHoursPerDay = 8; + int weeksInMonth = 4; + try { + Optional opMonthlyCost = Optional.ofNullable(entity.getAssociate()).map(Associate::getMonthlyCost); + if (opMonthlyCost.isPresent() && entity.getWorkHours() > 0) { + cost = (opMonthlyCost.get() * entity.getWorkHours()) / (monthWorkDays * workHoursPerDay * weeksInMonth); + entity.setCost(cost); + } + } catch (Exception e) { + log.catching(e); + } + } + public void saveServiceRecord(SaveEntityEvent event) { if (event.isSave()) { ServiceRecord modifiedEntity = event.getData(); List actions = event.withAttachment().getActions(); modifiedEntity.setSigned(!actions.isEmpty()); + calculateCost(modifiedEntity); serviceRecordsDataModel.save(modifiedEntity); entityDocumentService.executeActions(modifiedEntity.getId(), actions); refresh(); diff --git a/sly-crm-ui/src/main/resources/web/editor/project-editor.zul b/sly-crm-ui/src/main/resources/web/editor/project-editor.zul index b795876..8e0b61d 100644 --- a/sly-crm-ui/src/main/resources/web/editor/project-editor.zul +++ b/sly-crm-ui/src/main/resources/web/editor/project-editor.zul @@ -84,31 +84,29 @@ - - - - - - - - - - - - - - - - - + + +
+ Bevétel: +
+
+ Kiadás: +
+
+ Különbözet: +
+
- + diff --git a/sly-crm-ui/src/main/resources/web/form/invoice-form.zul b/sly-crm-ui/src/main/resources/web/form/invoice-form.zul index 79150b8..828c66b 100644 --- a/sly-crm-ui/src/main/resources/web/form/invoice-form.zul +++ b/sly-crm-ui/src/main/resources/web/form/invoice-form.zul @@ -8,8 +8,8 @@ -