From a0f4c99adce23fed3978c5bc305ef24efa5ce71d Mon Sep 17 00:00:00 2001 From: elgekko Date: Mon, 16 Oct 2023 15:59:18 +0200 Subject: [PATCH] New menu items added, invoices view is partially implemented --- TODO.txt | 19 +++-- lis-db/migrations/README | 8 +- .../scripts/004_create_test_data.sql | 2 +- ...09_add_partner_for_invoice_import_test.sql | 4 +- .../lis/db/repository/InvoiceRepository.java | 2 +- .../repository/InvoiceRepositorySearch.java | 12 +++ .../InvoiceRepositorySearchImpl.java | 77 +++++++++++++++++++ .../db/repository/filter/InvoiceFilter.java | 28 +++++++ .../db/repository/filter/PageableFilter.java | 11 +++ .../main/java/hu/user/lis/ui/Constants.java | 3 + .../lis/ui/config/ResourceConfigurer.java | 2 + .../user/lis/ui/data/InvoicesDataModel.java | 52 +++++++++++++ .../hu/user/lis/ui/view/IndexViewModel.java | 5 ++ .../user/lis/ui/view/InvoicesViewModel.java | 53 +++++++++++++ lis-ui/src/main/resources/web/index.zul | 7 ++ .../src/main/resources/web/invoice-settle.zul | 51 ++++++++++++ lis-ui/src/main/resources/web/invoices.zul | 51 ++++++++++++ 17 files changed, 375 insertions(+), 12 deletions(-) create mode 100644 lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepositorySearch.java create mode 100644 lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepositorySearchImpl.java create mode 100644 lis-db/src/main/java/hu/user/lis/db/repository/filter/InvoiceFilter.java create mode 100644 lis-db/src/main/java/hu/user/lis/db/repository/filter/PageableFilter.java create mode 100644 lis-ui/src/main/java/hu/user/lis/ui/data/InvoicesDataModel.java create mode 100644 lis-ui/src/main/java/hu/user/lis/ui/view/InvoicesViewModel.java create mode 100644 lis-ui/src/main/resources/web/invoice-settle.zul create mode 100644 lis-ui/src/main/resources/web/invoices.zul diff --git a/TODO.txt b/TODO.txt index 1b0e9a5..741d171 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,17 +1,24 @@ +0.1.9 +-banki integráció +-távlati: utalás előkészítése + 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 + - 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 -- ömlesztve: kimenő számlák: mi nem lett kifizetve, partner -- számla ki lett e fizetve (bejövő, kimenő) - - 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 -- 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? -- autorizáció -- dokumentum kezelés szétválasztása +- 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 diff --git a/lis-db/migrations/README b/lis-db/migrations/README index c1cb487..c145ce6 100644 --- a/lis-db/migrations/README +++ b/lis-db/migrations/README @@ -48,7 +48,8 @@ Enjoy. DOCKER -docker run -itd --name lis --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INSTANCE=db2admin -e DB2INST1_PASSWORD=password -e DBNAME=lis -e PERSISTENT_HOME=false -v /Docker:/database ibmcom/db2 +docker pull ibmcom/db2 +docker run -itd --name ibmdb2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INSTANCE=db2admin -e DB2INST1_PASSWORD=password -e DBNAME=lis -e PERSISTENT_HOME=false -v /docker/ibmdb2:/database ibmcom/db2 docker logs -f lis docker exec -it lis bash docker stop lis @@ -60,4 +61,7 @@ migrate up --env=prod Move data ---------- -https://community.ibm.com/community/user/datamanagement/discussion/db2-docker-persistent-volume \ No newline at end of file +https://community.ibm.com/community/user/datamanagement/discussion/db2-docker-persistent-volume + +DB2 SQL +ALTER TABLE "tableName" ALTER COLUMN "columnName" RESTART WITH diff --git a/lis-db/migrations/scripts/004_create_test_data.sql b/lis-db/migrations/scripts/004_create_test_data.sql index ba552bc..b8e4926 100644 --- a/lis-db/migrations/scripts/004_create_test_data.sql +++ b/lis-db/migrations/scripts/004_create_test_data.sql @@ -10,7 +10,7 @@ INSERT INTO PARTNER (id, name, vat_nr, active) VALUES (1, 'NYÍRŐ', '00000000-00-0', 1), - (2, 'KOLOS', '00000000-00-0', 1); + (2, 'KOLOS', '00000001-00-0', 1); INSERT INTO PROJECT_STATUS diff --git a/lis-db/migrations/scripts/009_add_partner_for_invoice_import_test.sql b/lis-db/migrations/scripts/009_add_partner_for_invoice_import_test.sql index b9e0435..bcf7c07 100644 --- a/lis-db/migrations/scripts/009_add_partner_for_invoice_import_test.sql +++ b/lis-db/migrations/scripts/009_add_partner_for_invoice_import_test.sql @@ -1,8 +1,8 @@ -- // add partner for invoice import test -- Migration SQL that makes the change goes here. -INSERT INTO PARTNER(name, vat_nr, address, active) -VALUES('Értékesítő Kft', '99999999-2-41', '1234 Budapest, Hármas utca 1', 1); +INSERT INTO PARTNER(id, name, vat_nr, address, active) +VALUES(3, 'Értékesítő Kft', '99999999-2-41', '1234 Budapest, Hármas utca 1', 1); -- //@UNDO -- SQL to undo the change goes here. diff --git a/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepository.java b/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepository.java index e25f16c..da74be7 100644 --- a/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepository.java +++ b/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepository.java @@ -3,6 +3,6 @@ package hu.user.lis.db.repository; import hu.user.lis.db.Invoice; import org.springframework.data.jpa.repository.JpaRepository; -public interface InvoiceRepository extends JpaRepository { +public interface InvoiceRepository extends JpaRepository, InvoiceRepositorySearch { } diff --git a/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepositorySearch.java b/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepositorySearch.java new file mode 100644 index 0000000..cc55b83 --- /dev/null +++ b/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepositorySearch.java @@ -0,0 +1,12 @@ +package hu.user.lis.db.repository; + +import hu.user.lis.db.Invoice; +import hu.user.lis.db.repository.filter.InvoiceFilter; + +import java.util.List; + +public interface InvoiceRepositorySearch { + List search(InvoiceFilter filter); + + long count(InvoiceFilter filter); +} diff --git a/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepositorySearchImpl.java b/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepositorySearchImpl.java new file mode 100644 index 0000000..d60affd --- /dev/null +++ b/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceRepositorySearchImpl.java @@ -0,0 +1,77 @@ +package hu.user.lis.db.repository; + +import hu.user.lis.db.Invoice; +import hu.user.lis.db.repository.filter.InvoiceFilter; +import org.springframework.data.jpa.repository.query.QueryUtils; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Repository +public class InvoiceRepositorySearchImpl implements InvoiceRepositorySearch { + @PersistenceContext + EntityManager entityManager; + + Predicate[] getPredicates(CriteriaBuilder cb, Root root, InvoiceFilter filter) { + List predicates = new ArrayList<>(); + + + if (Objects.nonNull(filter.getPartner())) { + predicates.add(cb.equal(root.get("partner"), filter.getPartner())); + } + + if (Objects.nonNull(filter.getProject())) { + predicates.add(cb.equal(root.get("project"), filter.getProject())); + } + + if (filter.isIncoming()) { + predicates.add(cb.isTrue(root.get("incoming"))); + } + + if (filter.isSettled()) { + //TODO add field + predicates.add(cb.isTrue(root.get("settled"))); + } + + if (Objects.nonNull(filter.getPaymentDeadLineFrom()) || Objects.nonNull(filter.getPaymentDeadLineTo())) { + //TODO check + predicates.add(cb.between(root.get("deadline"), filter.getPaymentDeadLineFrom(), filter.getPaymentDeadLineTo())); + } + + return predicates.toArray(new Predicate[]{}); + } + + @Override + public List search(InvoiceFilter filter) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Invoice.class); + Root root = cq.from(Invoice.class); + + cq.where(getPredicates(cb, root, filter)); + cq.orderBy(QueryUtils.toOrders(filter.getPageable().getSort(), root, cb)); + TypedQuery query = entityManager.createQuery(cq); + query.setMaxResults(filter.getPageable().getPageSize()); + query.setFirstResult(filter.getPageable().getPageSize() * filter.getPageable().getPageNumber()); + return query.getResultList(); + } + + @Override + public long count(InvoiceFilter filter) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(Invoice.class); + + cq.select(cb.count(root)); + cq.where(getPredicates(cb, root, filter)); + return entityManager.createQuery(cq).getSingleResult(); + } +} diff --git a/lis-db/src/main/java/hu/user/lis/db/repository/filter/InvoiceFilter.java b/lis-db/src/main/java/hu/user/lis/db/repository/filter/InvoiceFilter.java new file mode 100644 index 0000000..beaeae4 --- /dev/null +++ b/lis-db/src/main/java/hu/user/lis/db/repository/filter/InvoiceFilter.java @@ -0,0 +1,28 @@ +package hu.user.lis.db.repository.filter; + +import hu.user.lis.db.Partner; +import hu.user.lis.db.Project; +import lombok.*; + +import java.util.Date; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@ToString +public class InvoiceFilter extends PageableFilter { + + private Partner partner; + + private Project project; + + private boolean isIncoming; + + private boolean isSettled; + + private Date paymentDeadLineFrom; + + private Date paymentDeadLineTo; + +} diff --git a/lis-db/src/main/java/hu/user/lis/db/repository/filter/PageableFilter.java b/lis-db/src/main/java/hu/user/lis/db/repository/filter/PageableFilter.java new file mode 100644 index 0000000..43a2dbc --- /dev/null +++ b/lis-db/src/main/java/hu/user/lis/db/repository/filter/PageableFilter.java @@ -0,0 +1,11 @@ +package hu.user.lis.db.repository.filter; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.data.domain.Pageable; + +@Getter +@Setter +public class PageableFilter { + private Pageable pageable; +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/Constants.java b/lis-ui/src/main/java/hu/user/lis/ui/Constants.java index 336eaa0..b8e7a0b 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/Constants.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/Constants.java @@ -12,6 +12,9 @@ public class Constants { public static final String SET_PROJECTS_LIST_DATA = "SET_PROJECTS_LIST_DATA"; public static final String REFRESH_INVOICE_IMPORT_TASKS = "REFRESH_INVOICE_IMPORT_TASKS"; public static final String NAV_PARTNERS = "/partners"; + public static final String NAV_INVOICES = "/invoices"; + + public static final String NAV_INVOICE_SETTLE = "/invoice-settle"; public static final String NAV_PROJECTS = "/projects"; public static final String NAV_PROJECT = "/project"; public static final String NAV_PROJECT_WILD_CARD = "/project/**"; diff --git a/lis-ui/src/main/java/hu/user/lis/ui/config/ResourceConfigurer.java b/lis-ui/src/main/java/hu/user/lis/ui/config/ResourceConfigurer.java index 3cca4dd..4e9a79b 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/config/ResourceConfigurer.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/config/ResourceConfigurer.java @@ -24,6 +24,8 @@ public class ResourceConfigurer { Constants.NAV_SERVICE_RECORDS, Constants.NAV_IMPORT_INVOICES_ASSIGN, Constants.NAV_IMPORT_INVOICES_APPROVE, + Constants.NAV_INVOICES, + Constants.NAV_INVOICE_SETTLE, Constants.NAV_SETTINGS, Constants.NAV_PROJECT_WILD_CARD }) diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/InvoicesDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/InvoicesDataModel.java new file mode 100644 index 0000000..aa7f712 --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/data/InvoicesDataModel.java @@ -0,0 +1,52 @@ +package hu.user.lis.ui.data; + +import hu.user.lis.db.Invoice; +import hu.user.lis.db.repository.InvoiceRepository; +import hu.user.lis.db.repository.filter.InvoiceFilter; +import hu.user.lis.ui.data.common.CachedSpringDataModel; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Component; +import org.zkoss.zul.FieldComparator; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +@Component +@Log4j2 +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class InvoicesDataModel extends CachedSpringDataModel { + @Autowired + InvoiceRepository invoiceRepository; + + private InvoiceFilter filter; + + @Override + public List getResultSet(int page, int pageSize, FieldComparator sortComparator) { + Pageable pageable = createPageable(page, pageSize, sortComparator); + Optional.ofNullable(filter).ifPresent(f -> f.setPageable(pageable)); + return Objects.isNull(filter) ? invoiceRepository.findAll(pageable).getContent() : invoiceRepository.search(filter); + } + + @Override + public int getResultSetCount() { + long result = Objects.isNull(filter) ? invoiceRepository.count() : invoiceRepository.count(filter); + return (int) result; + } + + public void search(InvoiceFilter filter) { + log.info("Searching invoices using filter: {}", filter); + this.filter = filter; + super.reset(); + } + + public void listAll() { + log.info("List all invoices"); + this.filter = null; + super.reset(); + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/IndexViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/IndexViewModel.java index 6681f3a..f25ebaa 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/IndexViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/IndexViewModel.java @@ -180,4 +180,9 @@ public class IndexViewModel implements EventListener { public void onCancelImportInvoiceProcess() { workflowManagerService.cancelInvoiceImportProcess(); } + + @Command + public void onInvoiceDues() { + + } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/InvoicesViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/InvoicesViewModel.java new file mode 100644 index 0000000..f9f529a --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/InvoicesViewModel.java @@ -0,0 +1,53 @@ +package hu.user.lis.ui.view; + +import com.google.common.collect.ImmutableMap; +import hu.user.lis.db.Invoice; +import hu.user.lis.ui.Constants; +import hu.user.lis.ui.data.InvoicesDataModel; +import hu.user.lis.ui.data.common.CachedSpringDataModel; +import hu.user.lis.ui.view.common.EntityViewModel; +import lombok.Getter; +import lombok.extern.log4j.Log4j2; +import org.zkoss.bind.annotation.Init; +import org.zkoss.zk.ui.select.annotation.WireVariable; + +import static hu.user.lis.ui.data.common.CachedDataModel.ASCENDING; +import static hu.user.lis.ui.data.common.CachedDataModel.NATURAL; + +@Log4j2 +public class InvoicesViewModel extends EntityViewModel { + @Getter + @WireVariable + InvoicesDataModel invoicesDataModel; + + @Override + protected CachedSpringDataModel getDataModel() { + return invoicesDataModel; + } + + @Override + protected String getNavigation() { + return Constants.NAV_INVOICES; + } + + @Init + public void init() { + super.init(); + addColumns(ImmutableMap.of( + "partner.name", ASCENDING, + "partner.vatNr", NATURAL, + "project.name", NATURAL, + "dueDate", NATURAL, + "paymentDate", NATURAL, + "grossAmount", NATURAL, + "currency", NATURAL, + "income", NATURAL + )); + } + + protected void refresh() { + invoicesDataModel.clearSelection(); + invoicesDataModel.listAll(); + } + +} diff --git a/lis-ui/src/main/resources/web/index.zul b/lis-ui/src/main/resources/web/index.zul index cef68a7..97d900c 100644 --- a/lis-ui/src/main/resources/web/index.zul +++ b/lis-ui/src/main/resources/web/index.zul @@ -85,6 +85,13 @@ + + + + diff --git a/lis-ui/src/main/resources/web/invoice-settle.zul b/lis-ui/src/main/resources/web/invoice-settle.zul new file mode 100644 index 0000000..36e170c --- /dev/null +++ b/lis-ui/src/main/resources/web/invoice-settle.zul @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
\ No newline at end of file diff --git a/lis-ui/src/main/resources/web/invoices.zul b/lis-ui/src/main/resources/web/invoices.zul new file mode 100644 index 0000000..4589531 --- /dev/null +++ b/lis-ui/src/main/resources/web/invoices.zul @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
\ No newline at end of file -- 2.54.0