server:
- port: 80
+ port: 8080
servlet:
context-path: /
zk:
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
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<String> 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));
+
}
--- /dev/null
+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);
+ }
+}
@Autowired
WorkflowManagerService workflowManagerService;
+
public void refresh() {
super.reset();
}
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;
private boolean filterShowActive;
+ @Override
+ public String getShortName() {
+ return "associates";
+ }
+
@Override
public List<Associate> getResultSet(int page, int pageSize, FieldComparator sortComparator) {
Pageable pageable = createPageable(page, pageSize, sortComparator);
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()
+ );
+ }
+
}
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;
private InvoiceFilter filter;
+ @Override
+ public String getShortName() {
+ return "invoices";
+ }
+
@Override
public List<Invoice> getResultSet(int page, int pageSize, FieldComparator sortComparator) {
Pageable pageable = createPageable(page, pageSize, sortComparator);
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()
+ );
+ }
}
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;
@Component
@Log4j2
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-public class PartnersDataModel extends CachedSpringDataModel<Partner> implements IDataHeaderProvider, IRowDataProvider<Partner> {
+public class PartnersDataModel extends CachedSpringDataModel<Partner> {
@Autowired
PartnerRepository partnerRepository;
private boolean filterShowActive;
+ @Override
+ public String getShortName() {
+ return "partners";
+ }
+
@Override
public List<Partner> getResultSet(int page, int pageSize, FieldComparator sortComparator) {
Pageable pageable = createPageable(page, pageSize, sortComparator);
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()
+ );
}
}
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;
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;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
@Component
@Log4j2
private boolean filterShowActive;
+ @Override
+ public String getShortName() {
+ return "projects";
+ }
+
@Override
public List<Project> getResultSet(int page, int pageSize, FieldComparator sortComparator) {
Pageable pageable = createPageable(page, pageSize, sortComparator);
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()
+ );
+ }
}
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;
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;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.stream.Collectors;
@Component
private boolean groupByAssociate;
+ @Override
+ public String getShortName() {
+ return "service-records";
+ }
+
@Init
public void init() {
Clients.evalJavaScript("pushNav('/service-records')");
public void delete(ServiceRecord entity) {
serviceRecordRepository.delete(entity);
}
+
+ @Override
+ public String[] mapHeaders() {
+ return ArrayUtils.toArray(
+ "Projekt azonosító",
+ "Projekt név",
+ "Partner név",
+ "Munkatárs",
+ "Munkanap",
+ "Leírás",
+ "Óraszám"
+ );
+ }
+
+ @Override
+ public Object[] mapRowData(ServiceRecord data) {
+ return ArrayUtils.toArray(
+ Optional.ofNullable(data.getProject()).map(Project::getName),
+ Optional.ofNullable(data.getProject()).map(Project::getPartner).map(Partner::getName),
+ Optional.ofNullable(data.getAssociate()).map(Associate::getName),
+ data.getWorkDay(),
+ data.getWorkHours()
+ );
+ }
}
package hu.user.lis.ui.data.common;
+import hu.user.lis.ui.TypeUtils;
import hu.user.lis.ui.properties.ApplicationUIProperties;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;
import org.zkoss.zul.FieldComparator;
import org.zkoss.zul.Filedownload;
import org.zkoss.zul.ListModelList;
+import org.zkoss.zul.Messagebox;
import org.zkoss.zul.event.ListDataEvent;
import java.io.OutputStream;
private ApplicationUIProperties applicationUIProperties;
public CachedDataModel() {
-
setMultiple(false);
+ }
+ public String getShortName() {
+ return "short-name-not-defined";
}
public void reset() {
}
}
- abstract public List<T> getResultSet(int page, int pageSize, FieldComparator sortComparator);
+ public abstract List<T> getResultSet(int page, int pageSize, FieldComparator sortComparator);
- abstract public int getResultSetCount();
+ public abstract int getResultSetCount();
@Override
public String getSortDirection(Comparator comparator) {
reset();
}
- public Path export(String name, IDataHeaderProvider headerProvider, IRowDataProvider<T> 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]);
}
List<T> 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[]{
+ };
+ }
+
}
});
}
- @Command
- public void onExport() {
- partnersDataModel.export();
- }
}
"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"
));
}
getDataModel().onHeaderReorder(dragged, dropped);
}
+ @Command
+ public void onExport() {
+ getDataModel().export();
+ }
+
}
</listitem>
</template>
</listbox>
+ <hbox pack="stretch" hflex="true">
+ <toolbar align="end">
+ <toolbarbutton label="Export" iconSclass="z-icon-file-excel-o"
+ onClick="@command('onExport')"/>
+ </toolbar>
+ </hbox>
</vlayout>
</center>
</borderlayout>
</listitem>
</template>
</listbox>
+ <hbox pack="stretch" hflex="true">
+ <toolbar align="end">
+ <toolbarbutton label="Export" iconSclass="z-icon-file-excel-o"
+ onClick="@command('onExport')"/>
+ </toolbar>
+ </hbox>
</vlayout>
</center>
</borderlayout>
</listitem>
</template>
</listbox>
+ <hbox pack="stretch" hflex="true">
+ <toolbar align="end">
+ <toolbarbutton label="Export" iconSclass="z-icon-file-excel-o"
+ onClick="@command('onExport')"/>
+ </toolbar>
+ </hbox>
</vlayout>
</center>
</borderlayout>
</listitem>
</template>
</listbox>
+ <hbox pack="stretch" hflex="true">
+ <toolbar align="end">
+ <toolbarbutton label="Export" iconSclass="z-icon-file-excel-o"
+ onClick="@command('onExport')"/>
+ </toolbar>
+ </hbox>
</vlayout>
</center>
</borderlayout>