v0.2.4
authorVásáry Dániel <vasary@elgekko.net>
Tue, 5 Mar 2024 16:00:01 +0000 (17:00 +0100)
committerVásáry Dániel <vasary@elgekko.net>
Tue, 5 Mar 2024 16:00:01 +0000 (17:00 +0100)
18 files changed:
sly-crm-app/pom.xml
sly-crm-app/src/main/resources/application-prod.yaml
sly-crm-db/src/main/java/hu/user/lis/db/Project.java
sly-crm-db/src/main/java/hu/user/lis/db/repository/TreasuryRepository.java
sly-crm-ui/src/main/java/hu/user/lis/ui/data/InvoiceDataModel.java
sly-crm-ui/src/main/java/hu/user/lis/ui/data/MoneyBalance.java [new file with mode: 0644]
sly-crm-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java
sly-crm-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java
sly-crm-ui/src/main/java/hu/user/lis/ui/data/TreasuryDataModel.java
sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ExchangedRateValueUpdater.java [new file with mode: 0644]
sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java
sly-crm-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java
sly-crm-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java
sly-crm-ui/src/main/resources/web/editor/project-editor.zul
sly-crm-ui/src/main/resources/web/form/invoice-form.zul
sly-crm-ui/src/main/resources/web/invoices.zul
sly-crm-ui/src/main/resources/web/static/css/webclient.css
sly-crm-ui/src/main/resources/web/test.zul

index 8aa44567d99145781c58ab13f6217a6d7722a4ce..5eb6979e09661c9d0e8cb710b618bb047ce5a8a6 100644 (file)
@@ -3,7 +3,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <artifactId>sly-crm-app</artifactId>
-    <version>0.2.3</version>
+    <version>0.2.4</version>
     <name>SLY-CRM</name>
     <parent>
         <groupId>hu.user</groupId>
index 502cf240bedded74e6814fbb51e96f038e058fef..4f4f7a45312736635f8d08d00debfff69cc42f02 100644 (file)
@@ -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:
index 13d2362d99bbd2e4c09e2a006d6afb86bf9bc41f..cdc53dabb72d57159db63c945753676a87536991 100644 (file)
@@ -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<OutgoingInvoice> 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<Treasury> treasuries;
 
     private String name;
index 13a16c21d07b44e725b74e7379f17e9ac85bae92..795ee488e590b5e961a610fc51a962d437f3b612 100644 (file)
@@ -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<Treasury, Long> {
 
+    List<Treasury> getAllByProjectOrderByTransactionDate(Project project);
+
+    List<Treasury> getAllByProjectIsNull();
+
 }
index a9e3d9d9b0bbd2eb9196b17acee15d0bd4515cf8..8076fb6e4a62c5f05510f8cbd50c09ff016b7e4f 100644 (file)
@@ -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<IncomingInvoice> incoming = invoiceRepository.findAllByProjectAndIncomingIsTrue(project);
+        project.setIncomingInvoices(incoming);
+    }
+
+    public void fillProjectOutgoingInvoices(Project project) {
+        List<OutgoingInvoice> 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 (file)
index 0000000..0d362d7
--- /dev/null
@@ -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;
+}
index 06751134bba22f7c168ca5804f6ab9ba8934e848..3b57c22d9cb6256f9a049dd0c9bda2877b2c371c 100644 (file)
@@ -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<Project> {
     @Autowired
-    ProjectRepository projectRepository;
+    private ProjectRepository projectRepository;
 
     @Autowired
-    InvoiceRepository invoiceRepository;
+    private InvoiceRepository invoiceRepository;
 
     @Autowired
-    ProjectStatusDataModel projectStatusDataModel;
+    private TreasuryRepository treasuryRepository;
 
     @Autowired
-    EntityDataService<Project> projectDataService;
+    private ProjectStatusDataModel projectStatusDataModel;
+
+    @Autowired
+    private EntityDataService<Project> projectDataService;
 
     private ProjectFilter filter;
 
@@ -128,8 +133,13 @@ public class ProjectsDataModel extends CachedSpringDataModel<Project> {
         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<Treasury> orphanTreasuries = treasuryRepository.getAllByProjectIsNull();
+        treasuryRepository.deleteAll(orphanTreasuries);
         return result;
     }
 
index 393c516daedebea9a8999ae29a45f7f46be37b97..16c37d04d2cad1efbd94dd893ee56151ddf3240b 100644 (file)
@@ -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<ServiceRecord
     @Override
     public List<ServiceRecord> 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<ServiceRecord> result = listAll ? serviceRecordRepository.findAll(pageable).toList() :
+        return listAll ? serviceRecordRepository.findAll(pageable).toList() :
                 serviceRecordRepository.search(filterProjectId, filterAssociateId, pageable);
-        return result;
     }
 
     Map<Long, ServiceRecord> getGroupedServiceRecords() {
         Map<Long, ServiceRecord> grouped = new HashMap<>();
         List<ServiceRecord> 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);
             }
         });
index ef8a4d218a4c620331e7a6d13d7071d0dc59bb67..e63420539a2f16b32c109b56c818a3bd35ab1861 100644 (file)
@@ -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<Treasury> treasuryDataService;
+    private EntityDataService<Treasury> 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> 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 (file)
index 0000000..fc05278
--- /dev/null
@@ -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();
+    }
+
+
+}
index 4a071afe99bec535c495b63807688cfd8e22b43b..794afae1baa6c2722c63484fdd541812ad18dda6 100644 (file)
@@ -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<Project> {
     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<Project> {
     @WireVariable
     private EntityDocumentService entityDocumentService;
 
+    @WireVariable
+    private ExchangedRateValueUpdater exchangedRateValueUpdater;
+
     @Override
     public FormValidator<Project> getFormValidator() {
         return projectFormValidator;
@@ -126,6 +110,7 @@ public class ProjectEditorModel extends EntityEditorModel<Project> {
             Object data = evt.getData();
             initDocuments(data);
             initDetails();
+            //validate();
         }
     }
 
@@ -147,10 +132,10 @@ public class ProjectEditorModel extends EntityEditorModel<Project> {
             Clients.evalJavaScript(String.format("pushNav('/project/%d')", id));
             log.info("Loading entity {} to editor", id);
             Project project = projectsDataModel.getById(id);
-            List<IncomingInvoice> incoming = invoiceRepository.findAllByProjectAndIncomingIsTrue(project);
-            List<OutgoingInvoice> 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<Project> {
     @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);
index abed574fbdc782cf6e8871ca8222647632f3692c..2575d4f6ddcc08b00ca504b50eaab762ed134662 100644 (file)
@@ -87,8 +87,6 @@ public class ServiceRecordEditorModel extends EntityAttachmentEditorModel<Servic
             if (isSaveEnabled()) {
                 Optional<ProjectAssociate> opProjectAssociate = projectAssociatesDataModel.searchByAssociateAndProject(getFormDocument().getAssociate().getId(),
                         getFormDocument().getProject().getId());
-
-
                 List<EntityDocumentAction> actions = getEntityDocumentDataModel().getActions();
                 if (opProjectAssociate.isPresent()) {
                     Events.postEvent(new SaveEntityWithAttachmentEvent<>(getFormDocument(), actions, target));
index 2ec785b547e5287290aef85ddbe3a100be98a3e2..f55b6f7d985454f7535c014837d338202b89eb1b 100644 (file)
@@ -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<ServiceRecord> 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<Double> 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<ServiceRecord> event) {
         if (event.isSave()) {
             ServiceRecord modifiedEntity = event.getData();
             List<EntityDocumentAction> actions = event.withAttachment().getActions();
             modifiedEntity.setSigned(!actions.isEmpty());
+            calculateCost(modifiedEntity);
             serviceRecordsDataModel.save(modifiedEntity);
             entityDocumentService.executeActions(modifiedEntity.getId(), actions);
             refresh();
index b795876426b9f37c8eaf87ab44d5e5c3088885ea..8e0b61d8739654b0d54c16dbbe0ff15c19e60a66 100644 (file)
                                 </tabs>
                                 <tabpanels>
                                     <tabpanel>
-                                        <vlayout vflex="true">
-                                            <window title="Árrés (HUF)">
-                                                <hbox>
-                                                    <panel title="Bevétel">
-                                                        <panelchildren>
-                                                            <label value="@load(vm.formDocument.supplyPrice)"/>
-                                                        </panelchildren>
-                                                    </panel>
-                                                    <panel title="Kiadás">
-                                                        <panelchildren>
-                                                            <label value="@load(vm.formDocument.sellingPrice)"/>
-                                                        </panelchildren>
-                                                    </panel>
-                                                    <panel title="Árrés">
-                                                        <panelchildren>
-                                                            <label value="@load(vm.formDocument.margin)"/>
-                                                        </panelchildren>
-                                                    </panel>
-                                                </hbox>
-                                            </window>
+                                        <vlayout vflex="true" style="overflow: auto">
+                                            <hbox pack="stretch">
+                                                <div class="input-group">
+                                                    <span class="input-group-addon">Bevétel:</span>
+                                                    <label value="@load(vm.formDocument.supplyPrice) @converter('hu.user.lis.ui.converter.DoubleToStringConverter')"/>
+                                                    <span class="input-group-addon">HUF</span>
+                                                </div>
+                                                <div class="input-group">
+                                                    <span class="input-group-addon">Kiadás:</span>
+                                                    <label value="@load(vm.formDocument.sellingPrice) @converter('hu.user.lis.ui.converter.DoubleToStringConverter')"/>
+                                                    <span class="input-group-addon">HUF</span>
+                                                </div>
+                                                <div class="input-group">
+                                                    <span class="input-group-addon">Különbözet:</span>
+                                                    <label value="@load(vm.formDocument.margin) @converter('hu.user.lis.ui.converter.DoubleToStringConverter')"/>
+                                                    <span class="input-group-addon">HUF</span>
+                                                </div>
+                                            </hbox>
                                             <grid sclass="no-hover-grid" oddRowSclass="none"
                                                   model="@load(vm.incomeMarginsDataModel)"
                                                   forward="onOK=submit.onClick, onCancel=cancel.onClick"
                                                   emptyMessage="Nem kalkulálható!">
-                                                <columns visible="false">
+                                                <columns visible="true">
                                                     <column width="50px" label="Pénznem"/>
                                                     <column width="100%" label="Nettó összeg"/>
                                                     <column width="100%" label="Bruttó összeg"/>
index 79150b834522488ae1a94cb6df25a9ac5dfbb6db..828c66bf54e97f8ff5616e7a2c9c422ce9615a4c 100644 (file)
@@ -8,8 +8,8 @@
         <tabpanels>
             <tabpanel>
                 <vlayout hflex="true">
-                    <label value="Partner"/>
-                    <entity-selector selector_id="invoice_partner" entity="Partner"/>
+                    <!--                    <label value="Partner"/>-->
+                    <!--                    <entity-selector selector_id="invoice_partner" entity="Partner"/>-->
                     <!--                    <vlayout hflex="true">-->
                     <!--                        <label value="Projekt"/>-->
                     <!--                        <hlayout>-->
index c57d6c497ce0449ced335f180f257a45c44377f0..f619bf010c7b2c8f2ba6f3bb02f361344b6446fe 100644 (file)
@@ -11,8 +11,8 @@
                 <toolbar align="end">
                     <toolbarbutton label="Szerkeszt" iconSclass="z-icon-edit" onClick="@command('onEdit')"
                                    disabled="@load(empty vm.selectedEntity)"/>
-                    <!--                        <toolbarbutton label="Projekt módosítás" iconSclass="z-icon-forward"-->
-                    <!--                                       onClick="@command('onChangeProject')" disabled="@load(empty vm.selectedEntity)"/>-->
+                    <toolbarbutton label="Projekt módosítás" iconSclass="z-icon-forward"
+                                   onClick="@command('onChangeProject')" disabled="@load(empty vm.selectedEntity)"/>
                     <toolbarbutton label="Kiegyenlít" iconSclass="z-icon-credit-card"
                                    onClick="@command('onInvoicePayment')"
                                    disabled="@load(empty vm.selectedEntity || vm.selectedEntity.planned)"/>
index d6a072342ba245d7b5a82a336a111559968de038..1a0b4f57b13468ba889eb4e4a37968fc65550b8a 100644 (file)
@@ -1,3 +1,27 @@
+.badge {
+    display: inline-block;
+    min-width: 10px;
+    padding: 3px 7px;
+    font-size: 12px;
+    font-weight: bold;
+    line-height: 1;
+    color: #fff;
+    text-align: center;
+    white-space: nowrap;
+    vertical-align: baseline;
+    background-color: #999;
+    border-radius: 10px;
+}
+
+.input-group {
+    margin: 10px;
+}
+
+.input-group > .z-label {
+    font-size: 1.2em;
+    font-weight: bold;
+}
+
 .stretch-content > .z-caption-content {
     width: 100%
 }
   opacity: 1;
 }
 
+/*
 .no-hover-grid .z-row .z-grid-odd,
 .no-hover-grid .z-row:hover>.z-row-inner,
 .no-hover-grid .z-row:hover>.z-cell {
-    background: none;
+    background: transparent;
+    text-color: black;
 }
-/**/
+*/
 
 textarea {
     resize: none;
index eb8269aef28a28ce41f285dc24799e234cd87e48..6361cedca15d9e43e415ed78ab09d656fc839bb2 100644 (file)
@@ -39,4 +39,6 @@ public void showFileName(org.zkoss.zk.ui.event.UploadEvent event){
 }
 ]]></zscript>
     <button label="copy client-side" w:onClick="copyToClipboard('Client Side', 'value-test123')"/>
+    <label class="badge">42</label>
+
 </zk>
\ No newline at end of file