Project id suggest finished, bug fixes
authorVásáry Dániel <vasary@elgekko.net>
Wed, 25 Oct 2023 18:17:30 +0000 (20:17 +0200)
committerVásáry Dániel <vasary@elgekko.net>
Wed, 25 Oct 2023 18:17:30 +0000 (20:17 +0200)
16 files changed:
TODO.txt
lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepositorySearchImpl.java
lis-db/src/main/java/hu/user/lis/db/repository/ProjectRepository.java
lis-ui/src/main/java/hu/user/lis/ui/converter/ListStringToStringConverter.java [new file with mode: 0644]
lis-ui/src/main/java/hu/user/lis/ui/editor/ImportInvoiceAssignEditorModel.java
lis-ui/src/main/java/hu/user/lis/ui/editor/common/Editors.java
lis-ui/src/main/java/hu/user/lis/ui/view/AssignInvoicesViewModel.java
lis-ui/src/main/java/hu/user/lis/ui/view/InvoicePaymentViewModel.java
lis-ui/src/main/java/hu/user/lis/ui/view/InvoicesViewModel.java
lis-ui/src/main/resources/metainfo/zk/zk.xml
lis-ui/src/main/resources/web/editor/import-invoice-approve-editor.zul
lis-ui/src/main/resources/web/editor/import-invoice-assign-editor.zul
lis-ui/src/main/resources/web/import-invoices-assign.zul
lis-ui/src/main/resources/web/invoices.zul
lis-ui/src/main/resources/web/static/css/webclient.css
lis-workflow/src/main/java/hu/user/lis/workflow/invoice/service/IncomingInvoiceFetcherService.java

index 741d1718fe1ef2c7d06b8ba7ff717cf31e6c325a..721c62d205fa6cf27264adada5dc80edf699a0ff 100644 (file)
--- a/TODO.txt
+++ b/TODO.txt
@@ -1,24 +1,23 @@
-0.1.9
--banki integráció
--távlati: utalás előkészítése
+- távlati: autorizáció
+- távlati: dokumentum kezelés szétválasztása
+- távlati: utalás előkészítése
+- távlati: banki integráció
 
 0.1.8
 - A "Számla kiegyenlítés" számla sorszám alapú kereséssel indul, találat esetén megjelenik egy űrlap:
     - számla részletek megejelenítése: határidő, összeg, devizanem
-    - mekkora pénzmozgás volt, milyen devizanemben, illetve felvehető új néznmozgás
+    - mekkora pénzmozgás volt, milyen devizanemben, illetve felvehető új pénzmozgás
     - az űrlapon a csatolt számlakép megjelenítése
     - mivel tartozhat egy sorszám több számlához is, ezt kezelni kell
 - A "Szállítói követelés követés" funkció a számlák listáját mutatja szűrve, azokat tartalmazza amik még nincsenek kiegyenlítve (külön a bejövö külön a kimenő)
 - munkalap hiba javítása
-- projekt ID-t regexp-el ki kell szedni, ha több van egy listát feldobni
+* projekt ID-t regexp-el ki kell szedni, ha több van egy listát feldobni
     invoiceHead/invoiceDetail/additionalInvoiceData
     invoiceHead/invoiceDetail/conventionalInvoiceInfo/orderNumbers
     invoiceHead/invoiceDetail/conventionalInvoiceInfo/contractNumbers
     invoiceHead/invoiceDetail/conventionalInvoiceInfo/customerCompanyCodes
     invoiceHead/invoiceDetail/conventionalInvoiceInfo/projectNumbers
 - NAV számla lekérdezés folytatólagossága (meg kell jegyezni, mi volt az utolsó elem), a kezdő dátum (napok száma) konfigurálható legyen?
-- távlati: autorizáció
-- távlati: dokumentum kezelés szétválasztása
 
 0.1.7
 * A számla importhoz tartozó menüpontok jelezzék, ha van feladat
index 14ac83b63b18cee10d38782074f412d9c81034dc..6717edaeecaa2ad8282cc7f4e6723d494957057f 100644 (file)
@@ -41,6 +41,8 @@ public class InvoiceRepositorySearchImpl implements InvoiceRepositorySearch {
 
         if (filter.isPaid()) {
             predicates.add(cb.isTrue(root.get("paid")));
+        } else {
+            predicates.add(cb.isFalse(root.get("paid")));
         }
 
         if (Objects.nonNull(filter.getPaymentDeadLineFrom())) {
index 9fcbfaa1b01f5c2b1b96dc1ee8539fb04c894831..5806ee3fe0012d1d56ababca1bcca7324e5132a5 100644 (file)
@@ -4,11 +4,14 @@ import hu.user.lis.db.Project;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 import java.util.List;
+import java.util.Optional;
 
 public interface ProjectRepository extends JpaRepository<Project, Long>, ProjectRepositorySearch {
 
     List<Project> findByHumanIdLikeOrderByHumanIdDesc(String yearSearch);
 
+    Optional<Project> findByHumanId(String humanId);
+
     Project findFirstByHumanIdLikeOrderByHumanIdDesc(String yearSearch);
 
 }
diff --git a/lis-ui/src/main/java/hu/user/lis/ui/converter/ListStringToStringConverter.java b/lis-ui/src/main/java/hu/user/lis/ui/converter/ListStringToStringConverter.java
new file mode 100644 (file)
index 0000000..ad55f0e
--- /dev/null
@@ -0,0 +1,20 @@
+package hu.user.lis.ui.converter;
+
+import org.apache.commons.lang3.StringUtils;
+import org.zkoss.bind.BindContext;
+import org.zkoss.bind.Converter;
+import org.zkoss.zul.Listcell;
+
+import java.util.List;
+
+public class ListStringToStringConverter implements Converter<String, List<String>, Listcell> {
+    @Override
+    public String coerceToUi(List<String> list, Listcell listCell, BindContext bindContext) {
+        return StringUtils.join(list, ", ");
+    }
+
+    @Override
+    public List<String> coerceToBean(String data, Listcell listCell, BindContext bindContext) {
+        return null;
+    }
+}
index b303ec3badfcafb24c8469244f0913cc8be4912f..ee7ac4c2d9c148f99bdaee366fd8afb2ec9f2746 100644 (file)
@@ -3,6 +3,7 @@ package hu.user.lis.ui.editor;
 import hu.user.lis.db.Invoice;
 import hu.user.lis.db.Partner;
 import hu.user.lis.db.Project;
+import hu.user.lis.db.repository.ProjectRepository;
 import hu.user.lis.ui.data.PartnersDataModel;
 import hu.user.lis.ui.editor.common.Editors;
 import lombok.Getter;
@@ -10,23 +11,34 @@ import lombok.Setter;
 import lombok.extern.log4j.Log4j2;
 import org.zkoss.bind.annotation.*;
 import org.zkoss.zk.ui.Component;
+import org.zkoss.zk.ui.Executions;
 import org.zkoss.zk.ui.select.annotation.WireVariable;
+import org.zkoss.zk.ui.util.Notification;
 
+import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 
 @Log4j2
 public class ImportInvoiceAssignEditorModel extends InvoiceEditorModel {
     @WireVariable
-    PartnersDataModel partnersDataModel;
+    private PartnersDataModel partnersDataModel;
+
+    @WireVariable
+    private ProjectRepository projectRepository;
 
     @Getter
     @Setter
-    boolean canEditPartner;
+    private boolean canEditPartner;
+
+    @Getter
+    private List<String> projectSuggestions;
 
     @Init
     @Override
     public void init() {
         super.init();
+        projectSuggestions = (List<String>) Executions.getCurrent().getArg().get("projectSuggestions");
         canEditPartner = Objects.isNull(getFormDocument().getPartner().getId());
     }
 
@@ -50,4 +62,17 @@ public class ImportInvoiceAssignEditorModel extends InvoiceEditorModel {
         Partner entity = partnersDataModel.clone(getFormDocument().getPartner());
         Editors.doEdit(Editors.PARTNER, entity, modifiedEntity -> getFormDocument().setPartner(modifiedEntity));
     }
+
+    @Command
+    public void selectSuggestedProject(@BindingParam("humanId") String humanId) {
+        Optional<Project> opHumanId = projectRepository.findByHumanId(humanId);
+        if (opHumanId.isPresent()) {
+            getFormDocument().setProject(opHumanId.get());
+            getEntitySelectorRouter().configureSelector(Project.class, getFormDocument(), "project");
+            validate();
+        } else {
+            Notification.show("Nincs projekt ezen a számon: " + humanId, true);
+        }
+    }
+
 }
index 6336065a7565bb1b2152dd6ba147f889c84e5548..a4a82ce7b23bfeffcb940afd1107becac4315c0b 100644 (file)
@@ -23,7 +23,7 @@ public class Editors {
     }
 
     public static <E> void doEdit(String page, E entity, E original, EditCompleted<E> editCompleted) {
-        Map<String, E> arg;
+        Map<String, Object> arg;
         if (Objects.isNull(entity)) {
             //header double click
             return;
@@ -34,6 +34,11 @@ public class Editors {
         } else {
             arg = ImmutableMap.of("formDocument", entity, "origDocument", original);
         }
+
+        doEdit(page, arg, editCompleted);
+    }
+
+    public static <E> void doEdit(String page, Map<String, Object> arg, EditCompleted<E> editCompleted) {
         Window editorWindow = (Window) Executions.createComponents(page, null, arg);
         editorWindow.addEventListener("onClose", e -> {
             if (e.getData() != null) {
index 7fe62d0f8f89e761f23bb0dc5d4bb2cbf4a26485..45a4076ae7eba3442aafb50b9cebb50c8432e566 100644 (file)
@@ -5,6 +5,7 @@ import hu.user.lis.db.Invoice;
 import hu.user.lis.ui.Constants;
 import hu.user.lis.ui.data.AssignInvoicesDataModel;
 import hu.user.lis.ui.data.common.CachedSpringDataModel;
+import hu.user.lis.ui.editor.common.EditCompleted;
 import hu.user.lis.ui.editor.common.Editors;
 import hu.user.lis.ui.event.EventBus;
 import hu.user.lis.ui.event.ProcessEventRouter;
@@ -23,6 +24,9 @@ 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.List;
+import java.util.Map;
+
 @Getter
 @Log4j2
 @VariableResolver(DelegatingVariableResolver.class)
@@ -67,7 +71,9 @@ public class AssignInvoicesViewModel extends EntityViewModel<JSONObject> impleme
     @Command
     public void onHandleTask() {
         Invoice entity = (Invoice) getSelectedEntity().get("invoiceEntity");
-        Editors.doEdit(Editors.IMPORT_INVOICE_ASSIGN, entity, modifiedEntity -> {
+        List<String> projectSuggestions = (List<String>) getSelectedEntity().get("projectSuggestions");
+        Map<String, Object> arg = ImmutableMap.of("formDocument", entity, "projectSuggestions", projectSuggestions);
+        Editors.doEdit(Editors.IMPORT_INVOICE_ASSIGN, arg, (EditCompleted<Invoice>) modifiedEntity -> {
             assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of("invoiceEntity", modifiedEntity));
             onRefresh();
         });
index 001fe749ee0990b4b89cfc9a9fcd68d6414ad8b3..2f0225a0170df467bfb428e7becd5c4e11c16051 100644 (file)
@@ -18,6 +18,7 @@ import org.zkoss.bind.annotation.Command;
 import org.zkoss.bind.annotation.Init;
 import org.zkoss.bind.annotation.NotifyChange;
 import org.zkoss.zk.ui.select.annotation.WireVariable;
+import org.zkoss.zk.ui.util.Notification;
 import org.zkoss.zul.ListModelList;
 
 import java.util.List;
@@ -98,7 +99,7 @@ public class InvoicePaymentViewModel extends EntityViewModel<Payment> {
             List<Invoice> invoices = invoiceRepository.findByHumanId(invoiceNumber);
             if (invoices.isEmpty()) {
                 setPartnerRequired(false);
-                //show message
+                Notification.show("Nem található számla: " + invoiceNumber, true);
             } else {
                 if (invoices.size() == 1) {
                     setPartnerRequired(false);
index a3da68a3cccc6f455d3d2ebaca47e6836f89c765..0bc15355965cc70343810908bcc0ccd4d0d89185 100644 (file)
@@ -21,7 +21,8 @@ import org.zkoss.zk.ui.event.Event;
 import org.zkoss.zk.ui.event.EventListener;
 import org.zkoss.zk.ui.select.annotation.WireVariable;
 
-import java.util.Objects;
+import java.util.Arrays;
+import java.util.List;
 
 import static hu.user.lis.ui.data.common.CachedDataModel.ASCENDING;
 import static hu.user.lis.ui.data.common.CachedDataModel.NATURAL;
@@ -30,6 +31,7 @@ import static hu.user.lis.ui.data.common.CachedDataModel.NATURAL;
 public class InvoicesViewModel extends EntityViewModel<Invoice> implements EventListener<Event> {
     @Getter
     private final InvoiceFilter invoiceFilter = InvoiceFilter.builder().incoming(true).build();
+    List<String> refreshTriggerProperties = Arrays.asList("paymentDeadLineFrom", "paymentDeadLineTo", "paid", "incoming");
     @WireVariable
     private EventBus eventBus;
     @Getter
@@ -47,10 +49,11 @@ public class InvoicesViewModel extends EntityViewModel<Invoice> implements Event
         eventBus.registerForBinding(this);
         refresh();
         addColumns(ImmutableMap.of(
-                "partner.name", ASCENDING,
+                "partner.humanId", NATURAL,
+                "partner.name", NATURAL,
                 "partner.vatNr", NATURAL,
                 "project.name", NATURAL,
-                "paymentDeadline", NATURAL,
+                "paymentDeadline", ASCENDING,
                 "grossAmount", NATURAL,
                 "currency", NATURAL,
                 "incoming", NATURAL
@@ -84,7 +87,6 @@ public class InvoicesViewModel extends EntityViewModel<Invoice> implements Event
     public void setIncoming(@BindingParam("incoming") boolean value) {
         invoiceFilter.setIncoming(value);
         BindUtils.postNotifyChange(null, null, invoiceFilter, "incoming");
-        refresh();
     }
 
     @Command
@@ -96,11 +98,8 @@ public class InvoicesViewModel extends EntityViewModel<Invoice> implements Event
     public void onEvent(Event evt) throws Exception {
         if (evt instanceof PropertyChangeEvent) {
             PropertyChangeEvent propertyEvent = (PropertyChangeEvent) evt;
-            if (Objects.nonNull(propertyEvent.getBase()) && propertyEvent.getBase().equals(this)) {
-                if ("invoiceFilter.project".equals(propertyEvent.getProperty()) ||
-                        "invoiceFilter.partner".equals(propertyEvent.getProperty())) {
-                    refresh();
-                }
+            if (invoiceFilter.equals(propertyEvent.getBase())) {
+                refresh();
             }
 
         }
index 04e41f19a5a976f22da182027c02e94982bee782..3d7fd40a666dc3fabded1fbe91ba9ce5dd9f4391 100644 (file)
@@ -41,6 +41,8 @@
     <library-property>
         <name>org.zkoss.theme.preferred</name>
         <value>silvertail</value>
+        <!--        <value>sapphire</value>-->
+        <!--        <value>atlantic</value>-->
     </library-property>
     <library-property>
         <name>org.zkoss.zul.grid.rod</name>
index becc5e56c95fc79f86cf0af75f97c935ffd43aca..a2de64fafa155b5f8ce846ff2a88c65f4d7982c0 100644 (file)
@@ -30,7 +30,8 @@
                                 <hlayout>
                                     <label value="Partner"/>
                                     <entity-selector entity="Partner"/>
-                                    <button label="Bezár" onClick="@command('onEditPartner')"
+                                    <button label="Szerkesztés" iconSclass="z-icon-edit"
+                                            onClick="@command('onEditPartner')"
                                             disabled="@bind(not vm.canEditPartner)"/>
                                 </hlayout>
 
index eeddad579c1779928237e6050f6bb793b3f0db26..381c5865a349fc33e38611c6b9ec90defb86b11c 100644 (file)
                             <vlayout hflex="true">
                                 <label value="Projekt"/>
                                 <entity-selector entity="Project" hflex="true"/>
+                                <div children="@load(vm.projectSuggestions)">
+                                    <template name="children">
+                                        <a label="@load(each)"
+                                           onClick="@command('selectSuggestedProject', humanId=each)"/>
+                                    </template>
+                                </div>
 
                                 <label value="Leírás"/>
                                 <textbox hflex="true" instant="true"
@@ -30,7 +36,8 @@
                                 <hlayout>
                                     <label value="Partner"/>
                                     <entity-selector entity="Partner"/>
-                                    <button label="Bezár" onClick="@command('onEditPartner')"
+                                    <button label="Szerkesztés" iconSclass="z-icon-edit"
+                                            onClick="@command('onEditPartner')"
                                             disabled="@bind(not vm.canEditPartner)"/>
                                 </hlayout>
 
index e3c75b2a9de6854db81a71ffb99a198a0cca20bb..2a32abb0bd5ee66ec46f15dd2734e52257902611 100644 (file)
@@ -25,7 +25,8 @@
                         <listitem>
                             <listcell label="@load(each['invoiceEntity'].humanId)"/>
                             <listcell label="@load(each['invoiceEntity'].partner.name)"/>
-                            <listcell label="@load(each['projectSuggestions'])"/>
+                            <listcell
+                                    label="@load(each['projectSuggestions']) @converter('hu.user.lis.ui.converter.ListStringToStringConverter')"/>
                         </listitem>
                     </template>
                 </listbox>
index c5efc7184b613d889fdb489793b881a4c2a04166..5ac7d57792721801eb6c8021dc4c74f4c614db1c 100644 (file)
                     <label value="Fizetési határidő"/>
                     <separator orient="vertical"/>
                     <datebox instant="true" format="yyyy. MM. dd."
-                             value="@bind(vm.invoiceFilter.paymentDeadLineFrom)"
-                             onChange="@command('refresh')"/>
+                             value="@bind(vm.invoiceFilter.paymentDeadLineFrom)"/>
                     <label value="-"/>
                     <datebox instant="true" format="yyyy. MM. dd."
-                             value="@bind(vm.invoiceFilter.paymentDeadLineTo)"
-                             onChange="@command('refresh')"/>
+                             value="@bind(vm.invoiceFilter.paymentDeadLineTo)"/>
 
                     <space bar="true"/>
-                    <toolbarbutton mode="toggle" iconSclass="z-icon-credit-card" label="Teljesített fizetés"
-                                   checked="@load(!vm.invoiceFilter.incoming)"
-                                   onClick="@command('setIncoming', incoming=false)"/>
+                    <toolbarbutton mode="toggle" iconSclass="z-icon-credit-card" label="Fizetve"
+                                   checked="@bind(vm.invoiceFilter.paid)"/>
 
                     <!--                    <toolbarbutton iconSclass="z-icon-search" label="Szűrés"-->
                     <!--                                   onClick="@command('search')"/>-->
@@ -50,6 +47,8 @@
                          autopaging="true" mold="paging" pagingPosition="top" multiple="false"
                          onSelect="@command('onListSelection')" onDoubleClick="@command('onEdit')">
                     <listhead sizable="true">
+                        <listheader label="Sorszám" sort="auto(partner.humanId)" align="left"
+                                    sortDirection="@load(vm.cols['partner.name'].sortDirection)"/>
                         <listheader label="Partner név" sort="auto(partner.name)" align="left"
                                     sortDirection="@load(vm.cols['partner.name'].sortDirection)"/>
                         <listheader label="Partner adószám" sort="auto(partner.vatNr)" align="left"
                         <listheader label="Bruttó összeg" sort="auto(grossAmount)" align="right"
                                     style="text-align: center"
                                     sortDirection="@load(vm.cols['grossAmount'].sortDirection)"/>
-                        <listheader label="Bruttó összeg" sort="auto(currency)" align="left"
+                        <listheader label="Pénznem" sort="auto(currency)" align="left"
                                     sortDirection="@load(vm.cols['currency'].sortDirection)"/>
                         <listheader label="Költség/Bevétel" sort="auto(incoming)" align="left"
                                     sortDirection="@load(vm.cols['incoming'].sortDirection)"/>
                     </listhead>
                     <template name="model">
                         <listitem>
+                            <listcell label="@load(each.humanId)"/>
                             <listcell label="@load(each.partner.name)"/>
                             <listcell label="@load(each.partner.vatNr)"/>
                             <listcell label="@load(each.project.name)"/>
index 20863c78e213070f980b2f28d592b4b56a2c87b2..5577fb34b6a16400c923b7953f0b1d517df23719 100644 (file)
@@ -1,3 +1,10 @@
+.z-notification-content {
+    font-size: 20px;
+    width: auto;
+    min-height: 100px;
+    padding-top: 30px;
+}
+
 .z-grid-emptybody td {
 /*    font-size: 2em;*/
     font-style: normal;
index a6241b00f11d346c9d2786a4be057c9012ba9154..b5b1e46c4884b5a4876a24577a19f51970521c3c 100644 (file)
@@ -15,6 +15,7 @@ import hu.user.lis.service.nav.TaxOfficeDataConverter;
 import hu.user.lis.service.nav.TaxOfficeInvoiceService;
 import hu.user.lis.service.nav.TaxOfficeXmlConverter;
 import hu.user.lis.workflow.properties.WorkflowProperties;
+import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.RandomUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -31,6 +32,7 @@ import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+@Log4j2
 @Service
 public class IncomingInvoiceFetcherService {
     private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
@@ -165,10 +167,14 @@ public class IncomingInvoiceFetcherService {
 
     public List<String> searchProjectId(String invoiceXML) {
         List<String> result = new ArrayList<>();
-        Pattern compiledPattern = Pattern.compile(workflowProperties.getImportInvoice().getProjectIdPattern());
-        Matcher m = compiledPattern.matcher(invoiceXML);
-        while (m.find()) {
-            result.add(m.group());
+        try {
+            Pattern compiledPattern = Pattern.compile(workflowProperties.getImportInvoice().getProjectIdPattern());
+            Matcher m = compiledPattern.matcher(invoiceXML);
+            while (m.find()) {
+                result.add(m.group());
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage());
         }
         return result;
     }