InvoiceImport V2 completed
authorVásáry Dániel <vasary@elgekko.net>
Fri, 24 Nov 2023 21:35:19 +0000 (22:35 +0100)
committerVásáry Dániel <vasary@elgekko.net>
Fri, 24 Nov 2023 21:35:19 +0000 (22:35 +0100)
17 files changed:
lis-db/migrations/scripts/015_add_status_to_invoice.sql [moved from lis-db/migrations/scripts/015_add_active_to_invoice.sql with 56% similarity]
lis-db/src/main/java/hu/user/lis/db/Invoice.java
lis-db/src/main/java/hu/user/lis/db/InvoiceStatus.java [new file with mode: 0644]
lis-db/src/main/java/hu/user/lis/db/repository/InvoiceImportRepository.java
lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepositorySearchImpl.java
lis-db/src/main/java/hu/user/lis/db/repository/filter/InvoiceFilter.java
lis-ui/src/main/java/hu/user/lis/ui/Constants.java
lis-ui/src/main/java/hu/user/lis/ui/config/ResourceConfigurer.java
lis-ui/src/main/java/hu/user/lis/ui/data/InvoiceDataModel.java
lis-ui/src/main/java/hu/user/lis/ui/view/ApproveInvoicesViewModel.java
lis-ui/src/main/java/hu/user/lis/ui/view/AssignInvoicesViewModel.java
lis-ui/src/main/java/hu/user/lis/ui/view/ImportInvoicesSuspendedViewModel.java [new file with mode: 0644]
lis-ui/src/main/java/hu/user/lis/ui/view/InvoicesViewModel.java
lis-ui/src/main/resources/web/import-invoices-suspended.zul [new file with mode: 0644]
lis-ui/src/main/resources/web/index.zul
lis-ui/src/main/resources/web/invoices.zul
lis-workflow/src/main/java/hu/user/lis/workflow/invoice/DownloadInvoiceData.java

similarity index 56%
rename from lis-db/migrations/scripts/015_add_active_to_invoice.sql
rename to lis-db/migrations/scripts/015_add_status_to_invoice.sql
index 07fb06b7d58125fd07bea7ea902594bbaa79c7c3..c261fabca8488a315409e2d213589be99e0fe2b4 100644 (file)
@@ -1,11 +1,11 @@
 -- // add active to invoice
 -- Migration SQL that makes the change goes here.
 
-ALTER TABLE invoice ADD COLUMN active SMALLINT NOT NULL DEFAULT 0;
-UPDATE invoice SET active=1;
+ALTER TABLE invoice ADD COLUMN status INTEGER NOT NULL DEFAULT 0;
+UPDATE invoice SET status=1;
 
 -- //@UNDO
 -- SQL to undo the change goes here.
 
-ALTER TABLE invoice DROP COLUMN active;
+ALTER TABLE invoice DROP COLUMN status;
 CALL SYSPROC.ADMIN_CMD('REORG TABLE invoice');
index bb72eeb6b506421e13a06de325361521f3c42244..3be87a4b7840f3766994edbb164040ec59c10217 100644 (file)
@@ -21,20 +21,34 @@ public class Invoice implements Serializable {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     Long id;
+
     String humanId;
+
     String title;
+
     Currency currency;
+
     double netAmount;
+
     double grossAmount;
+
     double vatAmount;
+
     Date completionDate;
+
     Date createDate;
+
     Date paymentDeadline;
+
     @Column(nullable = false, insertable = false, updatable = false)
     boolean incoming;
-    boolean active;
+
+    InvoiceStatus status;
+
     boolean paid;
+
     boolean planned;
+
     byte[] file;
 
     @OneToOne
diff --git a/lis-db/src/main/java/hu/user/lis/db/InvoiceStatus.java b/lis-db/src/main/java/hu/user/lis/db/InvoiceStatus.java
new file mode 100644 (file)
index 0000000..c7387c0
--- /dev/null
@@ -0,0 +1,16 @@
+package hu.user.lis.db;
+
+
+import lombok.Getter;
+
+@Getter
+public enum InvoiceStatus {
+    INACTIVE(0), ACTIVE(1), SUSPENDED(2);
+    final int val;
+
+    InvoiceStatus(int val) {
+        this.val = val;
+    }
+
+
+}
index 0994af88850a3e5c6ccc1ce5a5d159aa5e0f628b..b6e73e27ccfd6cd7feb0d1cf8692bd6147c8da67 100644 (file)
@@ -1,5 +1,6 @@
 package hu.user.lis.db.repository;
 
+import hu.user.lis.db.Invoice;
 import hu.user.lis.db.InvoiceImport;
 import org.springframework.data.jpa.repository.JpaRepository;
 
@@ -9,4 +10,6 @@ public interface InvoiceImportRepository extends JpaRepository<InvoiceImport, Lo
 
     //    @Query("SELECT * FROM InvoiceImport i WHERE ")
     Optional<InvoiceImport> findTopByOrderByInvoiceCreateDate();
+
+    Optional<InvoiceImport> findByInvoice(Invoice selectedEntity);
 }
index 47b9d6d8a6a093176c873d4ce2c744cdb3e02857..1c4be4faa26f57b1010ba008edbf82c995d4322e 100644 (file)
@@ -24,7 +24,7 @@ public class InvoiceRepositorySearchImpl implements InvoiceRepositorySearch {
     Predicate[] getPredicates(CriteriaBuilder cb, Root<Invoice> root, InvoiceFilter filter) {
         List<Predicate> predicates = new ArrayList<>();
 
-        predicates.add(cb.equal(root.get("active"), true));
+        predicates.add(cb.equal(root.get("status"), filter.getStatus()));
 
         if (Objects.nonNull(filter.getPartner())) {
             predicates.add(cb.equal(root.get("partner"), filter.getPartner()));
index f4b1fbd82bdf0e46c8451011caeb4182729fe147..09c27321cc253814ac27a78da2ab862892b50997 100644 (file)
@@ -1,5 +1,6 @@
 package hu.user.lis.db.repository.filter;
 
+import hu.user.lis.db.InvoiceStatus;
 import hu.user.lis.db.Partner;
 import hu.user.lis.db.Project;
 import lombok.*;
@@ -22,6 +23,8 @@ public class InvoiceFilter extends PageableFilter {
 
     private boolean paid;
 
+    private InvoiceStatus status;
+
     private Date paymentDeadLineFrom;
 
     private Date paymentDeadLineTo;
index cbf9e29edde908657e5c756b034c2708b8c93e02..5587187b1d73e19cf3c880bbbb271c7c0280330f 100644 (file)
@@ -27,6 +27,7 @@ public class Constants {
     public static final String NAV_SETTINGS = "/settings";
     public static final String NAV_IMPORT_INVOICES_ASSIGN = "/import-invoices-assign";
     public static final String NAV_IMPORT_INVOICES_APPROVE = "/import-invoices-approve";
+    public static final String NAV_IMPORT_INVOICES_SUSPENDED = "/import-invoices-suspended";
     public static final String NAV_LOGIN = "/login";
     public static final String NAV_LOGOUT = "/logout";
     public static final String NAV_ROOT = "/";
index cf7a390cf7648f33d0c83afb2a9b5f01af1f91b6..946301de9b3b8fe3b3e56f7edaba3cf12d4b1ffd 100644 (file)
@@ -24,6 +24,7 @@ public class ResourceConfigurer {
             Constants.NAV_SERVICE_RECORDS,
             Constants.NAV_IMPORT_INVOICES_ASSIGN,
             Constants.NAV_IMPORT_INVOICES_APPROVE,
+            Constants.NAV_IMPORT_INVOICES_SUSPENDED,
             Constants.NAV_INVOICES,
             Constants.NAV_INVOICE_PAYMENT,
             Constants.NAV_SETTINGS,
index faafc116c28f9f4ca7cd177182a9ac97204896d0..90cb340bcf325588d5a6427eb0c179c04587b9b9 100644 (file)
@@ -2,6 +2,7 @@ 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.repository.InvoiceRepository;
 import hu.user.lis.service.data.EntityDataService;
@@ -34,11 +35,11 @@ public class InvoiceDataModel {
     }
 
     public IncomingInvoice createNewIncomingInvoice() {
-        return IncomingInvoice.builder().incoming(true).active(true).build();
+        return IncomingInvoice.builder().incoming(true).status(InvoiceStatus.ACTIVE).build();
     }
 
     public OutgoingInvoice createNewOutgoingInvoice() {
-        return OutgoingInvoice.builder().active(true).build();
+        return OutgoingInvoice.builder().status(InvoiceStatus.ACTIVE).build();
     }
 
     public void save(Invoice modifiedEntity) {
index c410c5781f4bb8a875915074d109fb7d2021640f..ebe3e196a168336987448efc47d6d40ee979053c 100644 (file)
@@ -2,6 +2,7 @@ package hu.user.lis.ui.view;
 
 import com.google.common.collect.ImmutableMap;
 import hu.user.lis.db.Invoice;
+import hu.user.lis.db.InvoiceStatus;
 import hu.user.lis.db.repository.InvoiceRepository;
 import hu.user.lis.db.repository.PartnerRepository;
 import hu.user.lis.ui.Constants;
@@ -86,16 +87,20 @@ public class ApproveInvoicesViewModel extends EntityViewModel<JSONObject> implem
         editorWindow.addEventListener("onClose", e -> {
             if (Objects.nonNull(e.getData())) {
                 Map<String, Object> results = (Map<String, Object>) e.getData();
+                Invoice modifiedEntity = (Invoice) results.get("modifiedEntity");
                 InvoiceImportStatus status = (InvoiceImportStatus) results.get("status");
                 if (InvoiceImportStatus.APPROVE.equals(status)) {
-                    Invoice modifiedEntity = (Invoice) results.get("modifiedEntity");
-                    modifiedEntity.setActive(true);
+                    modifiedEntity.setStatus(InvoiceStatus.ACTIVE);
                     invoiceRepository.save(modifiedEntity);
                     approveInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of(
                             "invoiceEntity", modifiedEntity,
                             "status", status
                     ));
                 } else {
+                    if (InvoiceImportStatus.SKIP.equals(status)) {
+                        modifiedEntity.setStatus(InvoiceStatus.SUSPENDED);
+                        invoiceRepository.save(modifiedEntity);
+                    }
                     approveInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of(
                             "status", status
                     ));
index 68d8e6c678955489beef450bcbe634319d008fe9..ec73c91ea674e47795a989a239739c90e4ac1684 100644 (file)
@@ -2,6 +2,7 @@ package hu.user.lis.ui.view;
 
 import com.google.common.collect.ImmutableMap;
 import hu.user.lis.db.Invoice;
+import hu.user.lis.db.InvoiceStatus;
 import hu.user.lis.db.repository.InvoiceRepository;
 import hu.user.lis.ui.Constants;
 import hu.user.lis.ui.data.AssignInvoicesDataModel;
@@ -88,15 +89,19 @@ public class AssignInvoicesViewModel extends EntityViewModel<JSONObject> impleme
         editorWindow.addEventListener("onClose", e -> {
             if (Objects.nonNull(e.getData())) {
                 Map<String, Object> results = (Map<String, Object>) e.getData();
+                Invoice modifiedEntity = (Invoice) results.get("modifiedEntity");
                 InvoiceImportStatus status = (InvoiceImportStatus) results.get("status");
                 if (InvoiceImportStatus.ASSIGN.equals(status)) {
-                    Invoice modifiedEntity = (Invoice) results.get("modifiedEntity");
                     invoiceRepository.save(modifiedEntity);
                     assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of(
                             "invoiceEntity", modifiedEntity,
                             "status", status
                     ));
                 } else {
+                    if (InvoiceImportStatus.SKIP.equals(status)) {
+                        modifiedEntity.setStatus(InvoiceStatus.SUSPENDED);
+                        invoiceRepository.save(modifiedEntity);
+                    }
                     assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of(
                             "status", status
                     ));
diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/ImportInvoicesSuspendedViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/ImportInvoicesSuspendedViewModel.java
new file mode 100644 (file)
index 0000000..942f64a
--- /dev/null
@@ -0,0 +1,172 @@
+package hu.user.lis.ui.view;
+
+import com.google.common.collect.ImmutableMap;
+import hu.user.lis.db.*;
+import hu.user.lis.db.repository.InvoiceImportRepository;
+import hu.user.lis.db.repository.InvoiceRepository;
+import hu.user.lis.db.repository.filter.InvoiceFilter;
+import hu.user.lis.ui.Constants;
+import hu.user.lis.ui.data.InvoiceDataModel;
+import hu.user.lis.ui.data.InvoicesDataModel;
+import hu.user.lis.ui.data.common.CachedSpringDataModel;
+import hu.user.lis.ui.editor.common.Editors;
+import hu.user.lis.ui.editor.selector.EntitySelectorRouter;
+import hu.user.lis.ui.event.EventBus;
+import hu.user.lis.ui.view.common.EntityViewModel;
+import hu.user.lis.workflow.invoice.service.WorkflowManagerService;
+import lombok.Getter;
+import lombok.extern.log4j.Log4j2;
+import org.zkoss.bind.PropertyChangeEvent;
+import org.zkoss.bind.annotation.*;
+import org.zkoss.zk.ui.Component;
+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.Optional;
+
+import static hu.user.lis.ui.data.common.CachedDataModel.ASCENDING;
+import static hu.user.lis.ui.data.common.CachedDataModel.NATURAL;
+
+@Log4j2
+public class ImportInvoicesSuspendedViewModel extends EntityViewModel<Invoice> implements EventListener<Event> {
+    @Getter
+    private InvoiceFilter invoiceFilter;
+
+    @WireVariable
+    private EventBus eventBus;
+
+    @Getter
+    @WireVariable
+    private EntitySelectorRouter entitySelectorRouter;
+
+    @Getter
+    @WireVariable
+    private InvoicesDataModel invoicesDataModel;
+
+    @WireVariable
+    private InvoiceDataModel invoiceDataModel;
+
+    @WireVariable
+    private InvoiceImportRepository invoiceImportRepository;
+
+    @WireVariable
+    private WorkflowManagerService workflowManagerService;
+
+    @WireVariable
+    private InvoiceRepository invoiceRepository;
+
+    @Init
+    @Override
+    public void init() {
+        super.init();
+        invoiceFilter = InvoiceFilter.builder()
+                .incoming(true)
+                .status(InvoiceStatus.SUSPENDED)
+                .build();
+
+        eventBus.register(this);
+        eventBus.registerForBinding(this);
+        addColumns(ImmutableMap.of(
+                "partner.humanId", NATURAL,
+                "partner.name", NATURAL,
+                "partner.vatNr", NATURAL,
+                "project.name", NATURAL,
+                "paymentDeadline", ASCENDING,
+                "grossAmount", NATURAL,
+                "currency", NATURAL,
+                "incoming", NATURAL
+        ));
+        refresh();
+    }
+
+    @Override
+    @AfterCompose
+    public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) {
+        entitySelectorRouter.configureSelector(Partner.class, this, "invoiceFilter.partner");
+        entitySelectorRouter.configureSelector(Project.class, this, "invoiceFilter.project");
+    }
+
+    @Override
+    protected CachedSpringDataModel<Invoice> getDataModel() {
+        return invoicesDataModel;
+    }
+
+    @Override
+    protected String getNavigation() {
+        return Constants.NAV_IMPORT_INVOICES_SUSPENDED;
+    }
+
+    @Command
+    public void refresh() {
+        invoicesDataModel.clearSelection();
+        invoicesDataModel.search(invoiceFilter);
+    }
+
+    @Command
+    public void search() {
+        refresh();
+    }
+
+    @Override
+    public void onEvent(Event evt) throws Exception {
+        if (evt instanceof PropertyChangeEvent) {
+            PropertyChangeEvent propertyEvent = (PropertyChangeEvent) evt;
+//           (this.equals(propertyEvent.getBase()) && propertyEvent.getProperty().startsWith("invoiceFilter")))
+            if (invoiceFilter.equals(propertyEvent.getBase())) {
+                log.info("Refresh needed, {} changed", propertyEvent.getProperty());
+
+                refresh();
+            }
+        }
+    }
+
+    @Destroy
+    public void onDestroy() {
+        log.info("Destroy {}", getClass().getSimpleName());
+        eventBus.unregister(this);
+    }
+
+    @Command
+    public void onEdit() {
+        Invoice invoice = getSelectedEntity();
+        if (invoice.isIncoming()) {
+            onEditIncoming();
+        } else {
+            onEditOutgoing();
+        }
+    }
+
+    public void onEditIncoming() {
+        IncomingInvoice selectedIncomingInvoice = (IncomingInvoice) getSelectedEntity();
+        IncomingInvoice entity = invoiceDataModel.clone(selectedIncomingInvoice);
+        Editors.doEdit(Editors.INCOMING_INVOICE, entity, selectedIncomingInvoice, modifiedEntity -> {
+            invoiceDataModel.save(modifiedEntity);
+            refresh();
+        });
+    }
+
+    public void onEditOutgoing() {
+        OutgoingInvoice selectedOutgoingInvoice = (OutgoingInvoice) getSelectedEntity();
+        OutgoingInvoice entity = invoiceDataModel.clone((OutgoingInvoice) getSelectedEntity());
+        Editors.doEdit(Editors.OUTGOING_INVOICE, entity, selectedOutgoingInvoice, modifiedEntity -> {
+            invoiceDataModel.save(modifiedEntity);
+            refresh();
+        });
+    }
+
+    @Command
+    public void onStartAssignment() {
+        Invoice invoice = getSelectedEntity();
+        if (Objects.nonNull(invoice)) {
+            Optional<InvoiceImport> opInvoiceImport = invoiceImportRepository.findByInvoice(invoice);
+            opInvoiceImport.ifPresent(invoiceImport -> {
+                workflowManagerService.startAssignIncomingInvoiceProcess(invoiceImport);
+                invoice.setStatus(InvoiceStatus.INACTIVE);
+                invoiceRepository.save(invoice);
+                refresh();
+            });
+        }
+    }
+}
index 97e5c7b74a92a36c960acf17a7b93c713c3eb932..1b4a0d66d3d3bead0a5c068d6a11cb70e46f7ac1 100644 (file)
@@ -27,7 +27,7 @@ import static hu.user.lis.ui.data.common.CachedDataModel.NATURAL;
 @Log4j2
 public class InvoicesViewModel extends EntityViewModel<Invoice> implements EventListener<Event> {
     @Getter
-    private final InvoiceFilter invoiceFilter = InvoiceFilter.builder().incoming(true).build();
+    private InvoiceFilter invoiceFilter;
 
     @WireVariable
     private EventBus eventBus;
@@ -47,6 +47,10 @@ public class InvoicesViewModel extends EntityViewModel<Invoice> implements Event
     @Override
     public void init() {
         super.init();
+        invoiceFilter = InvoiceFilter.builder()
+                .incoming(true)
+                .status(InvoiceStatus.ACTIVE)
+                .build();
         eventBus.register(this);
         eventBus.registerForBinding(this);
         addColumns(ImmutableMap.of(
diff --git a/lis-ui/src/main/resources/web/import-invoices-suspended.zul b/lis-ui/src/main/resources/web/import-invoices-suspended.zul
new file mode 100644 (file)
index 0000000..1049dee
--- /dev/null
@@ -0,0 +1,68 @@
+<?component name="entity-selector" inline="true" class="hu.user.lis.ui.editor.widget.EntitySelector"?>
+<zk>
+    <window vflex="true" viewModel="@id('vm') @init('hu.user.lis.ui.view.ImportInvoicesSuspendedViewModel')">
+        <caption label="Számla parkoló"/>
+        <borderlayout>
+            <north hflex="true">
+                <vlayout>
+                    <toolbar>
+                        <label value="Partner"/>
+                        <separator orient="vertical"/>
+                        <entity-selector entity="Partner" style="display: inline-block;" width="300px"/>
+                        <space bar="true"/>
+                        <label value="Projekt"/>
+                        <separator orient="vertical"/>
+                        <entity-selector entity="Project" style="display: inline-block;" width="300px"/>
+
+                        <space bar="true"/>
+                        <toolbarbutton label="Iktatás" iconSclass="z-icon-forward"
+                                       onClick="@command('onStartAssignment')"/>
+
+                    </toolbar>
+                </vlayout>
+            </north>
+            <center border="none" hflex="true" vflex="true">
+                <listbox id="invoicesList" vflex="true" model="@load(vm.invoicesDataModel)"
+                         autopaging="true" mold="paging" pagingPosition="top" multiple="false"
+                         onSelect="@command('onListSelection')">
+                    <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"
+                                    sortDirection="@load(vm.cols['partner.vatNr'].sortDirection)"/>
+                        <listheader label="Projekt név" sort="auto(project.name)" align="left"
+                                    sortDirection="@load(vm.cols['project.name'].sortDirection)"/>
+                        <listheader label="Fizetési határidő" sort="auto(paymentDeadline)" align="left"
+                                    sortDirection="@load(vm.cols['paymentDeadline'].sortDirection)"/>
+                        <listheader label="Bruttó összeg" sort="auto(grossAmount)" align="right"
+                                    style="text-align: center"
+                                    sortDirection="@load(vm.cols['grossAmount'].sortDirection)"/>
+                        <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)"/>
+                            <listcell
+                                    label="@load(each.paymentDeadline) @converter('hu.user.lis.ui.converter.DateToStringConverter')"/>
+                            <listcell
+                                    label="@load(each.grossAmount) @converter('hu.user.lis.ui.converter.DoubleToStringConverter')"/>
+                            <listcell label="@load(each.currency)"/>
+                            <listcell>
+                                <a iconSclass="z-icon-external-link" visible="@load(each.incoming)"/>
+                                <a iconSclass="z-icon-sign-in" visible="@load(!each.incoming)"/>
+                            </listcell>
+                        </listitem>
+                    </template>
+                </listbox>
+            </center>
+        </borderlayout>
+    </window>
+</zk>
\ No newline at end of file
index b303ce13626cec3bee964f42e2caddb51359ab92..36827560d22046ec543029a2a7aa9f7e950f5a61 100644 (file)
                                                       label="@bind(vm.approveInvoicesLabel)"
                                                       onClick="@command(vm.selectPage('~./import-invoices-approve.zul'))"
                                                       sclass="@bind(vm.approveInvoiceMenuClassName)"/>
+                                            <menuseparator/>
+                                            <menuitem iconSclass="z-icon-hand-stop-o"
+                                                      label="Számla parkoló"
+                                                      onClick="@command(vm.selectPage('~./import-invoices-suspended.zul'))"/>
                                         </menupopup>
                                     </menu>
                                     <menuseparator/>
index 5ac7d57792721801eb6c8021dc4c74f4c614db1c..0eb16291380b4b2f55a088ae7d5650af5f242eac 100644 (file)
@@ -4,43 +4,45 @@
         <caption label="Számlák"/>
         <borderlayout>
             <north hflex="true">
-                <toolbar>
-                    <!--                    <toolbarbutton label="Hozzáadás" iconSclass="z-icon-plus" onClick="@command('onAdd')"/>-->
-                    <!--                    <toolbarbutton label="Szerkesztés" iconSclass="z-icon-edit" onClick="@command('onEdit')"-->
-                    <!--                                   disabled="@load(empty vm.selectedEntity)"/>-->
-                    <!--                    <toolbarbutton label="Törlés" iconSclass="z-icon-remove" onClick="@command('onDelete')"-->
-                    <!--                                   disabled="@load(empty vm.selectedEntity)"/>-->
-                    <label value="Partner"/>
-                    <separator orient="vertical"/>
-                    <entity-selector entity="Partner" style="display: inline-block;" width="300px"/>
-                    <space bar="true"/>
-                    <label value="Projekt"/>
-                    <separator orient="vertical"/>
-                    <entity-selector entity="Project" style="display: inline-block;" width="300px"/>
-                    <space bar="true"/>
-                    <toolbarbutton mode="toggle" iconSclass="z-icon-external-link" label="Költség"
-                                   checked="@load(vm.invoiceFilter.incoming)"
-                                   onClick="@command('setIncoming', incoming=true)"/>
-                    <toolbarbutton mode="toggle" iconSclass="z-icon-sign-in" label="Bevétel"
-                                   checked="@load(!vm.invoiceFilter.incoming)"
-                                   onClick="@command('setIncoming', incoming=false)"/>
-                    <space bar="true"/>
-                    <!--                    <separator orient="vertical"/>-->
-                    <label value="Fizetési határidő"/>
-                    <separator orient="vertical"/>
-                    <datebox instant="true" format="yyyy. MM. dd."
-                             value="@bind(vm.invoiceFilter.paymentDeadLineFrom)"/>
-                    <label value="-"/>
-                    <datebox instant="true" format="yyyy. MM. dd."
-                             value="@bind(vm.invoiceFilter.paymentDeadLineTo)"/>
+                <vlayout>
+                    <toolbar>
+                        <!--                    <toolbarbutton label="Hozzáadás" iconSclass="z-icon-plus" onClick="@command('onAdd')"/>-->
+                        <!--                    <toolbarbutton label="Szerkesztés" iconSclass="z-icon-edit" onClick="@command('onEdit')"-->
+                        <!--                                   disabled="@load(empty vm.selectedEntity)"/>-->
+                        <!--                    <toolbarbutton label="Törlés" iconSclass="z-icon-remove" onClick="@command('onDelete')"-->
+                        <!--                                   disabled="@load(empty vm.selectedEntity)"/>-->
+                        <label value="Partner"/>
+                        <separator orient="vertical"/>
+                        <entity-selector entity="Partner" style="display: inline-block;" width="300px"/>
+                        <space bar="true"/>
+                        <label value="Projekt"/>
+                        <separator orient="vertical"/>
+                        <entity-selector entity="Project" style="display: inline-block;" width="300px"/>
+                        <space bar="true"/>
+                        <toolbarbutton mode="toggle" iconSclass="z-icon-external-link" label="Költség"
+                                       checked="@load(vm.invoiceFilter.incoming)"
+                                       onClick="@command('setIncoming', incoming=true)"/>
+                        <toolbarbutton mode="toggle" iconSclass="z-icon-sign-in" label="Bevétel"
+                                       checked="@load(!vm.invoiceFilter.incoming)"
+                                       onClick="@command('setIncoming', incoming=false)"/>
+                        <space bar="true"/>
+                        <!--                    <separator orient="vertical"/>-->
+                        <label value="Fizetési határidő"/>
+                        <separator orient="vertical"/>
+                        <datebox instant="true" format="yyyy. MM. dd."
+                                 value="@bind(vm.invoiceFilter.paymentDeadLineFrom)"/>
+                        <label value="-"/>
+                        <datebox instant="true" format="yyyy. MM. dd."
+                                 value="@bind(vm.invoiceFilter.paymentDeadLineTo)"/>
 
-                    <space bar="true"/>
-                    <toolbarbutton mode="toggle" iconSclass="z-icon-credit-card" label="Fizetve"
-                                   checked="@bind(vm.invoiceFilter.paid)"/>
+                        <space bar="true"/>
+                        <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')"/>-->
-                </toolbar>
+                        <!--                    <toolbarbutton iconSclass="z-icon-search" label="Szűrés"-->
+                        <!--                                   onClick="@command('search')"/>-->
+                    </toolbar>
+                </vlayout>
             </north>
             <center border="none" hflex="true" vflex="true">
                 <listbox id="invoicesList" vflex="true" model="@load(vm.invoicesDataModel)"
index 66c5d15ffb694053e7446dbdfceccf789d02884d..e926be2477ba85f771aa62306cb22afc136626d1 100644 (file)
@@ -2,6 +2,7 @@ package hu.user.lis.workflow.invoice;
 
 import hu.user.lis.db.IncomingInvoice;
 import hu.user.lis.db.InvoiceImport;
+import hu.user.lis.db.InvoiceStatus;
 import hu.user.lis.db.Partner;
 import hu.user.lis.db.repository.InvoiceImportRepository;
 import hu.user.lis.db.repository.InvoiceRepository;
@@ -17,6 +18,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 
 @Log4j2
@@ -39,15 +41,32 @@ public class DownloadInvoiceData implements JavaDelegate {
     @Override
     @Transactional
     public void execute(DelegateExecution delegateExecution) throws Exception {
-        String invoiceXml = (String) delegateExecution.getVariable("invoice");
-        log.info("Processing invoice {}", invoiceXml);
+        try {
+            String invoiceXml = (String) delegateExecution.getVariable("invoice");
+            log.info("Processing invoice {}", invoiceXml);
+
+            InvoiceImport invoiceImport = createInvoiceImport(invoiceXml);
+            if (Objects.isNull(invoiceImport)) {
+                throw new IllegalStateException("Unsuccessful invoice import!");
+            }
+            workflowManagerService.startAssignIncomingInvoiceProcess(invoiceImport);
+            log.info("Invoice {} {} processed", invoiceImport.getInvoice().getHumanId(),
+                    invoiceImport.getInvoice().getPartner().getName());
+        } catch (Exception e) {
+            log.error(e);
+        }
+    }
+
+    private InvoiceImport createInvoiceImport(String invoiceXml) throws Exception {
         List<String> projectSuggestions = new ArrayList<>();
         IncomingInvoice invoice = incomingInvoiceFetcherService.getInvoiceDataOnline(invoiceXml, projectSuggestions);
+        invoice.setStatus(InvoiceStatus.INACTIVE);
+
         Optional<Partner> partnerEntity = partnerRepository.findByVatNr(invoice.getPartner().getVatNr());
         if (partnerEntity.isPresent()) {
             if (isInvoiceImported(invoice.getHumanId(), partnerEntity.get())) {
                 log.info("Skipping already imported {} {}, {}", partnerEntity.get().getName(), partnerEntity.get().getVatNr(), invoice.getHumanId());
-                return;
+                return null;
             }
             invoice.setPartner(partnerEntity.get());
         } else {
@@ -55,13 +74,13 @@ public class DownloadInvoiceData implements JavaDelegate {
             partnerRepository.save(invoice.getPartner());
         }
         invoiceRepository.save(invoice);
+
         InvoiceImport invoiceImport = InvoiceImport.builder()
                 .invoice(invoice)
                 .suggestedProjects(projectSuggestions)
                 .build();
         invoiceImportRepository.save(invoiceImport);
-        workflowManagerService.startAssignIncomingInvoiceProcess(invoiceImport);
-        log.info("Invoice {} {} processed", invoice.getHumanId(), invoice.getPartner().getName());
+        return invoiceImport;
     }
 
     private boolean isInvoiceImported(String humanId, Partner partner) {