From c70bab3270767691f924a7053b011766c77f598c Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Sun, 3 Mar 2024 00:19:19 +0100 Subject: [PATCH] Excel export completed an all views --- .../src/main/resources/application-prod.yaml | 8 ++-- .../src/test/java/hu/user/lis/EventIT.java | 26 +++++++++++- .../main/java/hu/user/lis/ui/TypeUtils.java | 19 +++++++++ .../lis/ui/data/AssignInvoicesDataModel.java | 1 + .../user/lis/ui/data/AssociatesDataModel.java | 25 +++++++++++ .../user/lis/ui/data/InvoicesDataModel.java | 38 +++++++++++++++++ .../user/lis/ui/data/PartnersDataModel.java | 29 +++++++------ .../user/lis/ui/data/ProjectsDataModel.java | 38 +++++++++++++++++ .../lis/ui/data/ServiceRecordsDataModel.java | 32 ++++++++++++++ .../lis/ui/data/common/CachedDataModel.java | 42 +++++++++++++------ .../user/lis/ui/view/PartnersViewModel.java | 4 -- .../user/lis/ui/view/ProjectsViewModel.java | 2 +- .../lis/ui/view/common/EntityViewModel.java | 5 +++ .../src/main/resources/web/associates.zul | 6 +++ .../src/main/resources/web/invoices.zul | 6 +++ .../src/main/resources/web/projects.zul | 6 +++ .../main/resources/web/service-records.zul | 6 +++ 17 files changed, 258 insertions(+), 35 deletions(-) create mode 100644 sly-crm-ui/src/main/java/hu/user/lis/ui/TypeUtils.java diff --git a/sly-crm-app/src/main/resources/application-prod.yaml b/sly-crm-app/src/main/resources/application-prod.yaml index 036708a..502cf24 100644 --- a/sly-crm-app/src/main/resources/application-prod.yaml +++ b/sly-crm-app/src/main/resources/application-prod.yaml @@ -1,5 +1,5 @@ server: - port: 80 + port: 8080 servlet: context-path: / zk: @@ -52,8 +52,10 @@ logging: logging.level.httpclient.wire: ERROR application: ui: - user-name: - password: + user-name: user + password: password + export-temp-path: /temp + disable-profile-save: true workflow: import-invoice: input-path: /temp/invoice-import diff --git a/sly-crm-app/src/test/java/hu/user/lis/EventIT.java b/sly-crm-app/src/test/java/hu/user/lis/EventIT.java index 4d96ecd..f4b331f 100644 --- a/sly-crm-app/src/test/java/hu/user/lis/EventIT.java +++ b/sly-crm-app/src/test/java/hu/user/lis/EventIT.java @@ -6,22 +6,44 @@ package hu.user.lis; +import hu.user.lis.db.Partner; +import hu.user.lis.db.Project; +import hu.user.lis.ui.TypeUtils; import lombok.extern.log4j.Log4j2; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; +import java.util.Optional; + @Log4j2 @RunWith(SpringRunner.class) @ComponentScan("hu.user.lis") @SpringBootTest +@ActiveProfiles("dev") +@TestPropertySource("classpath:application-dev.yaml") public class EventIT { @Test - public void testSaveEntityEvent() { - String data = ""; + public void testOptional() { + Partner partner = Partner.builder().name("Partner Name").build(); + Project project1 = Project.builder().partner(partner).build(); + Project project2 = Project.builder().build(); + + Optional optionalString = Optional.ofNullable(project1).map(Project::getPartner).map(Partner::getName); + log.info(TypeUtils.formatOptional(optionalString)); + + optionalString = Optional.ofNullable(project2).map(Project::getPartner).map(Partner::getName); + log.info(TypeUtils.formatOptional(optionalString)); + + + log.info(TypeUtils.formatOptional(null)); + log.info(TypeUtils.formatOptional(5)); + } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/TypeUtils.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/TypeUtils.java new file mode 100644 index 0000000..7eb0f60 --- /dev/null +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/TypeUtils.java @@ -0,0 +1,19 @@ +package hu.user.lis.ui; + +import org.zkoss.lang.Strings; + +public class TypeUtils { + + private TypeUtils() { + } + + public static String formatOptional(Object optionalValue) { + return String.valueOf(optionalValue) + .replace("Optional.", "") + .replace("Optional", "") + .replace("[", "") + .replace("]", "") + .replace("null", Strings.EMPTY) + .replace("empty", Strings.EMPTY); + } +} diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/AssignInvoicesDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/AssignInvoicesDataModel.java index c465bb1..30b0c75 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/AssignInvoicesDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/AssignInvoicesDataModel.java @@ -23,6 +23,7 @@ public class AssignInvoicesDataModel extends CachedSpringDataModel { @Autowired WorkflowManagerService workflowManagerService; + public void refresh() { super.reset(); } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/AssociatesDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/AssociatesDataModel.java index 4570d75..d0e5e14 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/AssociatesDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/AssociatesDataModel.java @@ -6,6 +6,7 @@ import hu.user.lis.service.data.AssociateService; import hu.user.lis.service.data.EntityDataService; import hu.user.lis.ui.data.common.CachedSpringDataModel; import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; @@ -35,6 +36,11 @@ public class AssociatesDataModel extends CachedSpringDataModel { private boolean filterShowActive; + @Override + public String getShortName() { + return "associates"; + } + @Override public List getResultSet(int page, int pageSize, FieldComparator sortComparator) { Pageable pageable = createPageable(page, pageSize, sortComparator); @@ -98,4 +104,23 @@ public class AssociatesDataModel extends CachedSpringDataModel { public void delete(Associate selectedEntity) { associateRepository.delete(selectedEntity); } + + @Override + public String[] mapHeaders() { + return ArrayUtils.toArray( + "Név", "Login", "Havi önköltség", "Havi önköltség ÁFA", "Aktív" + ); + } + + @Override + public Object[] mapRowData(Associate data) { + return ArrayUtils.toArray( + data.getName(), + data.getLogin(), + data.getMonthlyCost(), + data.getMonthlyVat(), + data.isActive() + ); + } + } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/InvoicesDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/InvoicesDataModel.java index e5d2f1e..4672d49 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/InvoicesDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/InvoicesDataModel.java @@ -1,10 +1,13 @@ package hu.user.lis.ui.data; import hu.user.lis.db.Invoice; +import hu.user.lis.db.Partner; +import hu.user.lis.db.Project; 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.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; @@ -25,6 +28,11 @@ public class InvoicesDataModel extends CachedSpringDataModel { private InvoiceFilter filter; + @Override + public String getShortName() { + return "invoices"; + } + @Override public List getResultSet(int page, int pageSize, FieldComparator sortComparator) { Pageable pageable = createPageable(page, pageSize, sortComparator); @@ -43,4 +51,34 @@ public class InvoicesDataModel extends CachedSpringDataModel { this.filter = filter; super.reset(); } + + @Override + public String[] mapHeaders() { + return ArrayUtils.toArray( + "Terv", + "Sorszám", + "Partner név", + "Projekt azonosító", + "Projekt név", + "Fizetési határidő", + "Bruttó összeg", + "Pénznem", + "Költség/Bevétel" + ); + } + + @Override + public Object[] mapRowData(Invoice data) { + return ArrayUtils.toArray( + data.isPlanned(), + data.getHumanId(), + Optional.ofNullable(data.getPartner()).map(Partner::getName), + Optional.ofNullable(data.getProject()).map(Project::getHumanId), + Optional.ofNullable(data.getProject()).map(Project::getName), + data.getPaymentDeadline(), + data.getGrossAmount(), + data.getCurrency(), + data.isIncoming() + ); + } } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/PartnersDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/PartnersDataModel.java index 7c7885e..e67ac12 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/PartnersDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/PartnersDataModel.java @@ -5,9 +5,8 @@ import hu.user.lis.db.repository.PartnerRepository; import hu.user.lis.service.data.EntityDataService; import hu.user.lis.service.data.PartnerService; import hu.user.lis.ui.data.common.CachedSpringDataModel; -import hu.user.lis.ui.data.common.IDataHeaderProvider; -import hu.user.lis.ui.data.common.IRowDataProvider; import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; @@ -20,7 +19,7 @@ import java.util.List; @Component @Log4j2 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class PartnersDataModel extends CachedSpringDataModel implements IDataHeaderProvider, IRowDataProvider { +public class PartnersDataModel extends CachedSpringDataModel { @Autowired PartnerRepository partnerRepository; @@ -39,6 +38,11 @@ public class PartnersDataModel extends CachedSpringDataModel implements private boolean filterShowActive; + @Override + public String getShortName() { + return "partners"; + } + @Override public List getResultSet(int page, int pageSize, FieldComparator sortComparator) { Pageable pageable = createPageable(page, pageSize, sortComparator); @@ -94,21 +98,20 @@ public class PartnersDataModel extends CachedSpringDataModel implements partnerRepository.delete(selectedEntity); } - public void export() { - super.export("partners", this, this); - } - @Override public String[] mapHeaders() { - return new String[]{ + return ArrayUtils.toArray( "Név", "Adószám", "Cím", "Aktív" - }; + ); } @Override - public String[] mapRowData(Partner data) { - return new String[]{ - data.getName(), data.getVatNr(), data.getAddress(), String.valueOf(data.isActive()) - }; + public Object[] mapRowData(Partner data) { + return ArrayUtils.toArray( + data.getName(), + data.getVatNr(), + data.getAddress(), + data.isActive() + ); } } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java index 2793a50..b1a4a17 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java @@ -1,5 +1,6 @@ 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.repository.InvoiceRepository; @@ -7,6 +8,7 @@ import hu.user.lis.db.repository.ProjectRepository; import hu.user.lis.service.data.EntityDataService; import hu.user.lis.ui.data.common.CachedSpringDataModel; import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; @@ -20,6 +22,7 @@ import java.time.Year; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; @Component @Log4j2 @@ -45,6 +48,11 @@ public class ProjectsDataModel extends CachedSpringDataModel { private boolean filterShowActive; + @Override + public String getShortName() { + return "projects"; + } + @Override public List getResultSet(int page, int pageSize, FieldComparator sortComparator) { Pageable pageable = createPageable(page, pageSize, sortComparator); @@ -128,4 +136,34 @@ public class ProjectsDataModel extends CachedSpringDataModel { public void delete(Project selectedEntity) { projectRepository.delete(selectedEntity); } + + @Override + public String[] mapHeaders() { + return ArrayUtils.toArray( + "Azonosító", + "Ügyfél", + "Státusz", + "Megnevezés", + "Kapcsolattartó", + "Beszerzési ár (HUF)", + "Eladási ár (HUF)", + "Árrés (HUF)", + "Aktív" + ); + } + + @Override + public Object[] mapRowData(Project data) { + return ArrayUtils.toArray( + data.getHumanId(), + Optional.ofNullable(data.getPartner()).map(Partner::getName), + Optional.ofNullable(data.getProjectStatus()).map(ProjectStatus::getName), + data.getName(), + data.getContactName(), + data.getSupplyPrice(), + data.getSellingPrice(), + data.getMargin(), + data.isActive() + ); + } } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java index e56221b..393c516 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/data/ServiceRecordsDataModel.java @@ -1,6 +1,7 @@ package hu.user.lis.ui.data; import hu.user.lis.db.Associate; +import hu.user.lis.db.Partner; import hu.user.lis.db.Project; import hu.user.lis.db.ServiceRecord; import hu.user.lis.db.repository.ServiceRecordRepository; @@ -8,6 +9,7 @@ import hu.user.lis.service.data.EntityDataService; import hu.user.lis.service.data.ServiceRecordService; import hu.user.lis.ui.data.common.CachedSpringDataModel; import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; @@ -20,6 +22,7 @@ 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; @Component @@ -42,6 +45,11 @@ public class ServiceRecordsDataModel extends CachedSpringDataModel extends ListModelList { private ApplicationUIProperties applicationUIProperties; public CachedDataModel() { - setMultiple(false); + } + public String getShortName() { + return "short-name-not-defined"; } public void reset() { @@ -171,9 +175,9 @@ public abstract class CachedDataModel extends ListModelList { } } - abstract public List getResultSet(int page, int pageSize, FieldComparator sortComparator); + public abstract List getResultSet(int page, int pageSize, FieldComparator sortComparator); - abstract public int getResultSetCount(); + public abstract int getResultSetCount(); @Override public String getSortDirection(Comparator comparator) { @@ -191,22 +195,23 @@ public abstract class CachedDataModel extends ListModelList { reset(); } - public Path export(String name, IDataHeaderProvider headerProvider, IRowDataProvider rowDataProvider) { + public void export() { String timestamp = DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss").format(LocalDateTime.now()); - Path result = Paths.get(applicationUIProperties.getExportTempPath(), String.format("%s-%s.xlsx", name, timestamp)); + Path destinationTempPath = Paths.get(applicationUIProperties.getExportTempPath(), String.format("%s-%s.xlsx", getShortName(), timestamp)); int resultSetCount = getResultSetCount(); if (resultSetCount == 0) { - return null; + Messagebox.show("Nincs exportálható adat."); + return; } int pageCount = resultSetCount / CACHE_SIZE; if (resultSetCount % CACHE_SIZE > 0) { pageCount++; } int row = 0; - try (OutputStream os = Files.newOutputStream(result)) { + try (OutputStream os = Files.newOutputStream(destinationTempPath)) { Workbook wb = new Workbook(os, "SLY-CRM", "1.0"); Worksheet ws = wb.newWorksheet("Sheet 1"); - String[] headers = headerProvider.mapHeaders(); + String[] headers = mapHeaders(); for (int h = 0; h < headers.length; h++) { ws.value(row, h, headers[h]); } @@ -214,20 +219,33 @@ public abstract class CachedDataModel extends ListModelList { List datas = getResultSet(i, CACHE_SIZE, sortComparator); log.info("Got {} records", datas.size()); for (T data : datas) { - String[] rowData = rowDataProvider.mapRowData(data); + Object[] rowData = mapRowData(data); row++; for (int o = 0; o < rowData.length; o++) { - ws.value(row, o, rowData[o]); + ws.value(row, o, TypeUtils.formatOptional(rowData[o])); } } } + ws.freezePane(headers.length, 1); + ws.range(0, 0, 0, headers.length).style().fillColor("888888").set(); + ws.finish(); wb.finish(); - Filedownload.save(result.toFile(), "application/vnd.ms-excel"); + Filedownload.save(destinationTempPath.toFile(), "application/vnd.ms-excel"); } catch (Exception e) { log.error(e.getMessage()); } - return result; } + + protected String[] mapHeaders() { + return new String[]{ + }; + } + + protected Object[] mapRowData(T data) { + return new Object[]{ + }; + } + } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java index e66457d..25aa2d8 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java @@ -87,8 +87,4 @@ public class PartnersViewModel extends FilterActiveViewModel { }); } - @Command - public void onExport() { - partnersDataModel.export(); - } } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java index 34e8401..818bd96 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java @@ -58,7 +58,7 @@ public class ProjectsViewModel extends FilterActiveViewModel implements "contactName,Kapcsolattartó,natural,left,true", "supplyPrice,Beszerzési ár (HUF),natural,left,true", "sellingPrice,Eladási ár (HUF),natural,left,true", - "margin,Árrés (HUF) ,natural,left,true", + "margin,Árrés (HUF),natural,left,true", "active,Aktív,natural,left,true" )); } diff --git a/sly-crm-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java b/sly-crm-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java index 887796e..a4c0845 100644 --- a/sly-crm-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java +++ b/sly-crm-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java @@ -115,4 +115,9 @@ public abstract class EntityViewModel { getDataModel().onHeaderReorder(dragged, dropped); } + @Command + public void onExport() { + getDataModel().export(); + } + } diff --git a/sly-crm-ui/src/main/resources/web/associates.zul b/sly-crm-ui/src/main/resources/web/associates.zul index e899edf..7caeeb6 100644 --- a/sly-crm-ui/src/main/resources/web/associates.zul +++ b/sly-crm-ui/src/main/resources/web/associates.zul @@ -65,6 +65,12 @@ + + + + + diff --git a/sly-crm-ui/src/main/resources/web/invoices.zul b/sly-crm-ui/src/main/resources/web/invoices.zul index 3addacf..4436c7e 100644 --- a/sly-crm-ui/src/main/resources/web/invoices.zul +++ b/sly-crm-ui/src/main/resources/web/invoices.zul @@ -122,6 +122,12 @@ + + + + + diff --git a/sly-crm-ui/src/main/resources/web/projects.zul b/sly-crm-ui/src/main/resources/web/projects.zul index 08ccc30..d5cb86e 100644 --- a/sly-crm-ui/src/main/resources/web/projects.zul +++ b/sly-crm-ui/src/main/resources/web/projects.zul @@ -68,6 +68,12 @@ + + + + + diff --git a/sly-crm-ui/src/main/resources/web/service-records.zul b/sly-crm-ui/src/main/resources/web/service-records.zul index fd9f02e..f1021a1 100644 --- a/sly-crm-ui/src/main/resources/web/service-records.zul +++ b/sly-crm-ui/src/main/resources/web/service-records.zul @@ -79,6 +79,12 @@ + + + + + -- 2.54.0