xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>lis-app</artifactId>
- <version>0.1.9-SNAPSHOT</version>
+ <version>0.2.0-SNAPSHOT</version>
<name>SLY-CRM</name>
<parent>
<groupId>hu.user</groupId>
--- /dev/null
+package hu.user.lis.service.dataimport;
+
+import hu.user.lis.db.repository.*;
+import lombok.extern.log4j.Log4j2;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.nio.file.Paths;
+
+
+@Log4j2
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@ActiveProfiles("dev")
+@TestPropertySource("classpath:application-dev.yaml")
+//@ActiveProfiles("prod")
+//@TestPropertySource("classpath:application-prod.yaml")
+public class DataImportIT {
+ @Autowired
+ InvoiceImportRepository invoiceImportRepository;
+ @Autowired
+ PaymentRepository paymentRepository;
+ @Autowired
+ ProjectAssociateRepository projectAssociateRepository;
+ @Autowired
+ ServiceRecordRepository serviceRecordRepository;
+ @Autowired
+ TreasuryRepository treasuryRepository;
+ @Autowired
+ InvoiceRepository invoiceRepository;
+ @Autowired
+ ProjectRepository projectRepository;
+ @Autowired
+ EDocumentRepository eDocumentRepository;
+ @Autowired
+ PartnerRepository partnerRepository;
+
+ @Autowired
+ private DataImportService dataImportService;
+
+
+ @Test
+ public void importTest() throws Exception {
+ invoiceImportRepository.deleteAllInBatch();
+ paymentRepository.deleteAllInBatch();
+ projectAssociateRepository.deleteAllInBatch();
+ serviceRecordRepository.deleteAllInBatch();
+ treasuryRepository.deleteAllInBatch();
+ invoiceRepository.deleteAllInBatch();
+ projectRepository.deleteAllInBatch();
+ partnerRepository.deleteAllInBatch();
+
+ dataImportService.importData(Paths.get("c:/work/_spec/slycrm/2024/dataimport.xlsx"));
+ }
+
+}
--- /dev/null
+-- // modify short name on partner
+-- Migration SQL that makes the change goes here.
+
+ALTER TABLE partner
+ ALTER COLUMN short_name
+ SET DATA TYPE VARCHAR(100);
+
+-- //@UNDO
+-- SQL to undo the change goes here.
+
--- /dev/null
+-- // add unique index to project_status name
+-- Migration SQL that makes the change goes here.
+
+CREATE UNIQUE INDEX UX_PROJECT_STATUS_NAME ON PROJECT_STATUS(name);
+
+-- //@UNDO
+-- SQL to undo the change goes here.
+
+DROP INDEX UX_PROJECT_STATUS_NAME;
--- /dev/null
+-- // remove unique index on partner vatnr
+-- Migration SQL that makes the change goes here.
+DROP INDEX UX_PARTNER_VAT_NR;
+
+-- //@UNDO
+-- SQL to undo the change goes here.
+CREATE UNIQUE INDEX UX_PARTNER_VAT_NR ON PARTNER(vat_nr);
@Getter
public enum Currency {
- HUF(0), USD(1), EUR(2);
+ HUF(0), USD(1), EUR(2), GBP(3);
final int val;
Currency(int val) {
--- /dev/null
+package hu.user.lis.db.repository;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+@Repository
+public class JdbcTemplateRepository {
+ @Autowired
+ private JdbcTemplate jdbcTemplate;
+
+ @Transactional
+ public void truncateTable(String tableName) {
+ jdbcTemplate.execute(String.format("TRUNCATE TABLE %s IGNORE DELETE TRIGGERS IMMEDIATE", tableName));
+ }
+}
\ No newline at end of file
import hu.user.lis.db.Partner;
import org.springframework.data.jpa.repository.JpaRepository;
+import java.util.List;
import java.util.Optional;
public interface PartnerRepository extends JpaRepository<Partner, Long>, PartnerRepositorySearch {
Optional<Partner> findByVatNr(String vatNr);
+ List<Partner> findAllByName(String name);
+
}
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
+import java.util.Optional;
public interface ProjectStatusRepository extends JpaRepository<ProjectStatus, Long> {
List<ProjectStatus> findByActiveIsTrue(Sort sort);
+ Optional<ProjectStatus> findByName(String name);
+
long countByActiveIsTrue();
ProjectStatus findByOrder(int order);
<artifactId>bcprov-jdk18on</artifactId>
<version>1.76</version>
</dependency>
+ <dependency>
+ <groupId>org.dhatim</groupId>
+ <artifactId>fastexcel-reader</artifactId>
+ <version>0.15.7</version>
+ </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
--- /dev/null
+package hu.user.lis.service.dataimport;
+
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+@Log4j2
+@Service
+public class DataImportService {
+ @Autowired
+ private PartnerXlsProcessor partnerXlsProcessor;
+
+ @Autowired
+ private ProjectXlsProcessor projectXlsProcessor;
+
+ @Autowired
+ private IncomingInvoiceXlsProcessor incomingInvoiceXlsProcessor;
+
+ @Autowired
+ private OutgoingInvoiceXlsProcessor outgoingInvoiceXlsProcessor;
+
+ public void importData(Path inputFile) throws Exception {
+ String fileName = inputFile.getFileName().toString();
+ byte[] xlsData = Files.readAllBytes(inputFile);
+ partnerXlsProcessor.process(fileName, xlsData, 1);
+ projectXlsProcessor.process(fileName, xlsData, 0);
+ incomingInvoiceXlsProcessor.process(fileName, xlsData, 3);
+ outgoingInvoiceXlsProcessor.process(fileName, xlsData, 2);
+ }
+
+}
--- /dev/null
+package hu.user.lis.service.dataimport;
+
+import hu.user.lis.db.IncomingInvoice;
+import hu.user.lis.db.InvoiceStatus;
+import hu.user.lis.db.Project;
+import hu.user.lis.db.repository.InvoiceRepository;
+import hu.user.lis.db.repository.ProjectRepository;
+import hu.user.lis.service.dataimport.mapper.InvoiceXlsMapper;
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Objects;
+
+@Log4j2
+@Component
+public class IncomingInvoiceXlsProcessor extends XlsProcessor<IncomingInvoice> {
+ @Autowired
+ private InvoiceRepository invoiceRepository;
+
+ @Autowired
+ private ProjectRepository projectRepository;
+
+ @Autowired
+ private InvoiceXlsMapper invoiceXlsMapper;
+
+ @Override
+ protected IncomingInvoice mapEntity(Map<String, String> rowData) {
+ IncomingInvoice entity = invoiceXlsMapper.toIncomingInvoiceEntity(rowData);
+ entity.setStatus(InvoiceStatus.ACTIVE);
+ entity.setIncoming(true);
+ return entity;
+ }
+
+ @Override
+ protected boolean isValid(IncomingInvoice entity) {
+ return !StringUtils.isBlank(entity.getHumanId())
+// && !Objects.isNull(entity.getPartner())
+ && !Objects.isNull(entity.getCurrency())
+ && !Objects.isNull(entity.getCreateDate())
+ && !Objects.isNull(entity.getCompletionDate())
+ && !Objects.isNull(entity.getPaymentDeadline())
+ && entity.getNetAmount() > 0
+ && entity.getGrossAmount() > 0
+ && entity.getVatAmount() > 0;
+ }
+
+ @Override
+ protected void process(IncomingInvoice entity) {
+ invoiceRepository.save(entity);
+ Project project = entity.getProject();
+ if (Objects.nonNull(project)) {
+ if (Objects.isNull(project.getIncomingInvoices())) {
+ project.setIncomingInvoices(new ArrayList<>());
+ }
+ project.getIncomingInvoices().add(entity);
+ projectRepository.save(project);
+ }
+ log.info("Incoming invoice added: {}", entity.getHumanId());
+ }
+
+}
--- /dev/null
+package hu.user.lis.service.dataimport;
+
+import hu.user.lis.db.InvoiceStatus;
+import hu.user.lis.db.OutgoingInvoice;
+import hu.user.lis.db.Project;
+import hu.user.lis.db.repository.InvoiceRepository;
+import hu.user.lis.db.repository.ProjectRepository;
+import hu.user.lis.service.dataimport.mapper.InvoiceXlsMapper;
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Objects;
+
+@Log4j2
+@Component
+public class OutgoingInvoiceXlsProcessor extends XlsProcessor<OutgoingInvoice> {
+ @Autowired
+ private InvoiceRepository invoiceRepository;
+
+ @Autowired
+ private ProjectRepository projectRepository;
+
+ @Autowired
+ private InvoiceXlsMapper invoiceXlsMapper;
+
+ @Override
+ protected OutgoingInvoice mapEntity(Map<String, String> rowData) {
+ OutgoingInvoice entity = invoiceXlsMapper.toOutgoingInvoiceEntity(rowData);
+ entity.setStatus(InvoiceStatus.ACTIVE);
+ return entity;
+ }
+
+ @Override
+ protected boolean isValid(OutgoingInvoice entity) {
+ return !StringUtils.isBlank(entity.getHumanId())
+// && !Objects.isNull(entity.getPartner())
+ && !Objects.isNull(entity.getCurrency())
+ && !Objects.isNull(entity.getCreateDate())
+ && !Objects.isNull(entity.getCompletionDate())
+ && !Objects.isNull(entity.getPaymentDeadline())
+ && entity.getNetAmount() > 0
+ && entity.getGrossAmount() > 0
+ && entity.getVatAmount() > 0;
+ }
+
+ @Override
+ protected void process(OutgoingInvoice entity) {
+ invoiceRepository.save(entity);
+ Project project = entity.getProject();
+ if (Objects.nonNull(project)) {
+ if (Objects.isNull(project.getOutgoingInvoices())) {
+ project.setOutgoingInvoices(new ArrayList<>());
+ }
+ project.getOutgoingInvoices().add(entity);
+ projectRepository.save(project);
+ }
+ log.info("Outgoing invoice added: {}", entity.getHumanId());
+ }
+
+}
--- /dev/null
+package hu.user.lis.service.dataimport;
+
+import hu.user.lis.db.Partner;
+import hu.user.lis.db.repository.PartnerRepository;
+import hu.user.lis.service.dataimport.mapper.PartnerXlsMapper;
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.Objects;
+
+@Log4j2
+@Component
+public class PartnerXlsProcessor extends XlsProcessor<Partner> {
+ @Autowired
+ private PartnerRepository partnerRepository;
+
+ @Autowired
+ private PartnerXlsMapper partnerXlsMapper;
+
+ @Override
+ protected Partner mapEntity(Map<String, String> rowData) {
+ Partner entity = partnerXlsMapper.toEntity(rowData);
+ if (Objects.isNull(entity.getShortName())) {
+ entity.setShortName(entity.getName());
+ }
+ entity.setActive(true);
+ return entity;
+ }
+
+ @Override
+ protected boolean isValid(Partner entity) {
+ return !StringUtils.isBlank(entity.getName())
+ && !StringUtils.isBlank(entity.getShortName());
+ }
+
+ @Override
+ protected void process(Partner entity) {
+ partnerRepository.save(entity);
+ log.info("Partner added: {}", entity.getName());
+ }
+
+}
--- /dev/null
+package hu.user.lis.service.dataimport;
+
+import hu.user.lis.db.Project;
+import hu.user.lis.db.ProjectStatus;
+import hu.user.lis.db.repository.ProjectRepository;
+import hu.user.lis.db.repository.ProjectStatusRepository;
+import hu.user.lis.service.dataimport.mapper.ProjectXlsMapper;
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Optional;
+
+@Log4j2
+@Component
+public class ProjectXlsProcessor extends XlsProcessor<Project> {
+ public static final String IMPORTED = "IMPORTED";
+ @Autowired
+ private ProjectRepository projectRepository;
+
+ @Autowired
+ private ProjectStatusRepository projectStatusRepository;
+
+ @Autowired
+ private ProjectXlsMapper projectXlsMapper;
+
+ private ProjectStatus defaultProjectStatus;
+
+ @Override
+ public void process(String fileName, byte[] xlsData, int sheetIndex) throws IOException {
+ Optional<ProjectStatus> projectStatus = projectStatusRepository.findByName(IMPORTED);
+ if (projectStatus.isPresent()) {
+ defaultProjectStatus = projectStatus.get();
+ } else {
+ defaultProjectStatus = ProjectStatus.builder().name(IMPORTED).active(true).build();
+ projectStatusRepository.saveAndFlush(defaultProjectStatus);
+ }
+ super.process(fileName, xlsData, sheetIndex);
+ }
+
+ @Override
+ protected Project mapEntity(Map<String, String> rowData) {
+ Project entity = projectXlsMapper.toEntity(rowData);
+ entity.setProjectStatus(defaultProjectStatus);
+ entity.setActive(true);
+
+ if (entity.getHumanId().equals("99000199")) {
+ log.info("");
+ }
+ return entity;
+ }
+
+ @Override
+ protected boolean isValid(Project entity) {
+ return !StringUtils.isBlank(entity.getName())
+ && !StringUtils.isBlank(entity.getHumanId());
+// && !Objects.isNull(entity.getPartner());
+ }
+
+ @Override
+ protected void process(Project entity) {
+ projectRepository.save(entity);
+ log.info("Project added: {}", entity.getName());
+ }
+
+}
--- /dev/null
+package hu.user.lis.service.dataimport;
+
+import lombok.extern.log4j.Log4j2;
+import org.dhatim.fastexcel.reader.Cell;
+import org.dhatim.fastexcel.reader.ReadableWorkbook;
+import org.dhatim.fastexcel.reader.Row;
+import org.dhatim.fastexcel.reader.Sheet;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Log4j2
+public abstract class XlsProcessor<T> {
+ private List<Cell> headers;
+
+ @Transactional
+ public void process(String fileName, byte[] xlsData, int sheetIndex) throws IOException {
+ try (InputStream is = new ByteArrayInputStream(xlsData);
+ ReadableWorkbook wb = new ReadableWorkbook(is)) {
+ Sheet sheet = wb.getSheet(sheetIndex).orElseThrow(IndexOutOfBoundsException::new);
+ try (Stream<Row> rows = sheet.openStream()) {
+ rows.forEach(row -> {
+ if (row.getRowNum() == 1) {
+ headers = getHeaders(row);
+ } else if (row.getRowNum() == 2) {
+ //skip
+ } else {
+ //log.info("Processing {}", row.getRowNum());
+ processRow(row);
+ }
+ });
+ }
+ } catch (IOException e) {
+ log.error("Excel file reading error from {}. System message: {}", fileName, e.getMessage());
+ throw e;
+ }
+ }
+
+ private List<Cell> getHeaders(Row row) {
+ return row.stream().collect(Collectors.toList());
+ }
+
+ private void processRow(Row r) {
+ Map<String, String> rowData = getRowMap(r);
+ T entity = mapEntity(rowData);
+ try {
+ if (isValid(entity)) {
+ process(entity);
+ }
+ } catch (Exception e) {
+ log.error("Processing error for {}", r, e);
+ throw e;
+ }
+ }
+
+ private Map<String, String> getRowMap(Row r) {
+ Map<String, String> rowData = new HashMap<>();
+ r.stream().filter(Objects::nonNull).forEach(c -> {
+ try {
+ if (c.getColumnIndex() < headers.size()) {
+ String header = headers.get(c.getColumnIndex()).getRawValue();
+ String data = c.getRawValue();
+ rowData.put(header, data);
+ }
+ } catch (Exception e) {
+ log.error("Cell error!", e);
+ }
+ });
+ return rowData;
+ }
+
+ protected abstract T mapEntity(Map<String, String> rowData);
+
+ protected abstract boolean isValid(T entity);
+
+ protected abstract void process(T entity);
+}
--- /dev/null
+package hu.user.lis.service.dataimport.mapper;
+
+import hu.user.lis.db.IncomingInvoice;
+import hu.user.lis.db.OutgoingInvoice;
+import hu.user.lis.db.Partner;
+import hu.user.lis.db.Project;
+import hu.user.lis.db.repository.PartnerRepository;
+import hu.user.lis.db.repository.ProjectRepository;
+import org.apache.commons.lang3.StringUtils;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Named;
+import org.mapstruct.ReportingPolicy;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.sql.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+
+@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public abstract class InvoiceXlsMapper {
+ @Autowired
+ private PartnerRepository partnerRepository;
+
+ @Autowired
+ private ProjectRepository projectRepository;
+
+ @Named("mapDate")
+ static Date mapDate(String numberValue) {
+ long longValue = 0;
+ try {
+ longValue = Long.parseLong(numberValue);
+ } catch (Exception ignored) {
+ }
+ long javaDateValue = (longValue - 25569) * 86400 * 1000;
+ return new Date(javaDateValue);
+ }
+
+ @Named("mapPartner")
+ Partner mapPartner(String partnerName) {
+ Partner result = null;
+ List<Partner> partners = partnerRepository.findAllByName(partnerName);
+ if (partners.size() == 1) {
+ result = partners.get(0);
+ }
+ return result;
+ }
+
+ @Named("mapProject")
+ Project mapProject(String humanId) {
+ Project result = null;
+ Optional<Project> project = projectRepository.findByHumanId(humanId);
+ if (project.isPresent()) {
+ result = project.get();
+ }
+ return result;
+ }
+
+ @Named("mapPaid")
+ boolean mapPaid(String paymentDate) {
+ return StringUtils.isNotBlank(paymentDate);
+ }
+
+ @Mapping(source = "Sorszám", target = "humanId")
+ @Mapping(source = "Azonosító", target = "project", qualifiedByName = "mapProject")
+ @Mapping(source = "Partner", target = "partner", qualifiedByName = "mapPartner")
+ @Mapping(source = "Teljesítés dátuma", target = "completionDate", qualifiedByName = "mapDate")
+ @Mapping(source = "Számla kelte", target = "createDate", qualifiedByName = "mapDate")
+ @Mapping(source = "Fizetési határidő", target = "paymentDeadline", qualifiedByName = "mapDate")
+ @Mapping(source = "Nettó összeg", target = "netAmount")
+ @Mapping(source = "Bruttó összeg", target = "grossAmount")
+ @Mapping(source = "ÁFA (HUF)", target = "vatAmount")
+ @Mapping(source = "Devizanem", target = "currency")
+ @Mapping(source = "Kiegyenlítve", target = "paid", qualifiedByName = "mapPaid")
+ public abstract IncomingInvoice toIncomingInvoiceEntity(Map<String, String> xlsRowData);
+
+ @Mapping(source = "Sorszám", target = "humanId")
+ @Mapping(source = "Azonosító", target = "project", qualifiedByName = "mapProject")
+ @Mapping(source = "Partner", target = "partner", qualifiedByName = "mapPartner")
+ @Mapping(source = "Teljesítés dátuma", target = "completionDate", qualifiedByName = "mapDate")
+ @Mapping(source = "Számla kelte", target = "createDate", qualifiedByName = "mapDate")
+ @Mapping(source = "Fizetési határidő", target = "paymentDeadline", qualifiedByName = "mapDate")
+ @Mapping(source = "Nettó összeg", target = "netAmount")
+ @Mapping(source = "Bruttó összeg", target = "grossAmount")
+ @Mapping(source = "ÁFA (HUF)", target = "vatAmount")
+ @Mapping(source = "Devizanem", target = "currency")
+ @Mapping(source = "Kiegyenlítve", target = "paid", qualifiedByName = "mapPaid")
+ public abstract OutgoingInvoice toOutgoingInvoiceEntity(Map<String, String> xlsRowData);
+}
--- /dev/null
+package hu.user.lis.service.dataimport.mapper;
+
+import hu.user.lis.db.Partner;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.ReportingPolicy;
+
+import java.util.Map;
+
+
+@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface PartnerXlsMapper {
+ @Mapping(source = "Partner név", target = "name")
+ @Mapping(source = "Rövid név", target = "shortName")
+ @Mapping(source = "Adószám", target = "vatNr")
+ @Mapping(source = "Cím", target = "address")
+ Partner toEntity(Map<String, String> xlsRowData);
+}
--- /dev/null
+package hu.user.lis.service.dataimport.mapper;
+
+import hu.user.lis.db.Partner;
+import hu.user.lis.db.Project;
+import hu.user.lis.db.repository.PartnerRepository;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Named;
+import org.mapstruct.ReportingPolicy;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+import java.util.Map;
+
+
+@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public abstract class ProjectXlsMapper {
+ @Autowired
+ private PartnerRepository partnerRepository;
+
+ @Named("mapPartner")
+ Partner mapPartner(String partnerName) {
+ Partner result = null;
+ List<Partner> partners = partnerRepository.findAllByName(partnerName);
+ if (partners.size() == 1) {
+ result = partners.get(0);
+ }
+ return result;
+ }
+
+ @Mapping(source = "Megnevezés", target = "name")
+ @Mapping(source = "Azonosító", target = "humanId")
+ @Mapping(source = "Kapcsolattartó", target = "contactName")
+ @Mapping(source = "Ügyfél", target = "partner", qualifiedByName = "mapPartner")
+ @Mapping(target = "projectStatus", ignore = true)
+ @Mapping(target = "incomingInvoices", ignore = true)
+ @Mapping(target = "outgoingInvoices", ignore = true)
+ @Mapping(target = "treasuries", ignore = true)
+ public abstract Project toEntity(Map<String, String> xlsRowData);
+
+
+}
@Service
public class CurrentProfile {
+
@Autowired
ProfileRepository profileRepository;
@Getter
--- /dev/null
+package hu.user.lis.ui.view;
+
+import org.zkoss.bind.BindComposer;
+
+public class SpringBindComposer extends BindComposer {
+}
<center border="none" flex="true">
<listbox vflex="true" model="@load(vm.associatesDataModel)"
autopaging="true" mold="paging" pagingPosition="top" multiple="false"
- onSelect="@command('onListSelection')" onDoubleClick="@command('onEdit')">
+ onSelect="@command('onListSelection')">
<listhead sizable="true">
<listheader label="Név" sort="auto(name)" align="left"
sortDirection="@load(vm.cols['name'].sortDirection)"/>
</listhead>
<template name="model">
- <listitem>
+ <listitem onDoubleClick="@command('onEdit')">
<listcell label="@load(each.name)"/>
<listcell label="@load(each.login)"/>
<listcell>
<tabpanel>
<vlayout hflex="true">
<label value="Projekt"/>
- <entity-selector entity="Project" hflex="true"/>
+ <entity-selector selector_id="approve_project" entity="Project" hflex="true"/>
<label value="Leírás"/>
<textbox hflex="true" instant="true"
forward="onOK=submit.onClick, onCancel=cancel.onClick"/>
<hlayout>
<label value="Partner"/>
- <entity-selector entity="Partner"/>
+ <entity-selector selector_id="approve_partner" entity="Partner"/>
<button label="Szerkesztés" iconSclass="z-icon-edit"
onClick="@command('onEditPartner')"
disabled="@bind(not vm.canEditPartner)"/>
<tabpanel>
<vlayout hflex="true">
<label value="Projekt"/>
- <entity-selector entity="Project" hflex="true"/>
+ <entity-selector selector_id="assign_project" entity="Project" hflex="true"/>
<div children="@load(vm.projectSuggestions)">
<template name="children">
<a label="@load(each)"
forward="onOK=submit.onClick, onCancel=cancel.onClick"/>
<hlayout>
<label value="Partner"/>
- <entity-selector entity="Partner"/>
+ <entity-selector selector_id="assign_partner" entity="Partner"/>
<button label="Szerkesztés" iconSclass="z-icon-edit"
onClick="@command('onEditPartner')"
disabled="@bind(not vm.canEditPartner)"/>
<row>
<vlayout>
<label value="Ügyfél"/>
- <entity-selector entity="Partner"/>
+ <entity-selector selector_id="proj_edit_partner"
+ entity="Partner"/>
</vlayout>
<vlayout>
<label value="Kapcsolattartó"/>
<vlayout hflex="true">
<vlayout hflex="true">
<label value="Projekt"/>
- <entity-selector entity="Project" hflex="true"/>
+ <entity-selector selector_id="sr_edit_project" entity="Project" hflex="true"/>
</vlayout>
<hlayout>
<vlayout>
<label value="Munkatárs"/>
- <entity-selector entity="Associate"/>
+ <entity-selector selector_id="sr_edit_associate" entity="Associate"/>
</vlayout>
<vlayout>
<label value="Munkanap"/>
-<?component name="partner-selector" inline="true" macroURI="~./partner-selector.zul"?>
<zk>
<zscript>
import hu.user.lis.db.Currency;
forward="onOK=submit.onClick, onCancel=cancel.onClick"
disabled="@bind(vm.readonlyForm)"/>
<label value="Partner"/>
- <entity-selector entity="Partner" readonly="${vm.readonlyForm}"/>
+ <entity-selector selector_id="inv_editor_partner" entity="Partner" readonly="${vm.readonlyForm}"/>
<hlayout>
<vlayout>
<label value="Sorszám"/>
<center border="none" flex="true">
<listbox vflex="true" model="@load(vm.approveInvoicesDataModel)"
autopaging="true" mold="paging" pagingPosition="top" multiple="false"
- onSelect="@command('onListSelection')" onDoubleClick="@command('onHandleTask')">
+ onSelect="@command('onListSelection')">
<listhead sizable="true">
<listheader label="Azonosító" sort="auto(humanId)" align="left"/>
<listheader label="Partner" sort="auto(partner.name)" align="left"/>
<listheader label="Javasolt projektek" align="left"/>
</listhead>
<template name="model">
- <listitem>
+ <listitem onDoubleClick="@command('onHandleTask')">
<listcell label="@load(each['invoiceHumanId'])"/>
<listcell label="@load(each['partnerName'])"/>
<listcell
<center border="none" flex="true">
<listbox vflex="true" model="@load(vm.assignInvoicesDataModel)"
autopaging="true" mold="paging" pagingPosition="top" multiple="false"
- onSelect="@command('onListSelection')" onDoubleClick="@command('onHandleTask')">
+ onSelect="@command('onListSelection')">
<listhead sizable="true">
<listheader label="Azonosító" sort="auto(humanId)" align="left"/>
<listheader label="Partner" sort="auto(partner.name)" align="left"/>
<listheader label="Javasolt projektek" align="left"/>
</listhead>
<template name="model">
- <listitem>
+ <listitem onDoubleClick="@command('onHandleTask')">
<listcell label="@load(each['invoiceHumanId'])"/>
<listcell label="@load(each['partnerName'])"/>
<listcell
<toolbar>
<label value="Partner"/>
<separator orient="vertical"/>
- <entity-selector entity="Partner" style="display: inline-block;" width="300px"/>
+ <entity-selector selector_id="inv_suspended_partner" 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"/>
+ <entity-selector selector_id="inv_suspended_project" entity="Project"
+ style="display: inline-block;" width="300px"/>
<space bar="true"/>
<toolbarbutton label="Iktatás" iconSclass="z-icon-forward"
<toolbar>
<label value="Partner"/>
<separator orient="vertical"/>
- <entity-selector entity="Partner" style="display: inline-block;" width="300px"/>
+ <entity-selector selector_id="inv_partner" 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"/>
+ <entity-selector selector_id="inv_project" entity="Project" style="display: inline-block;"
+ width="300px"/>
<space bar="true"/>
<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')" onDoubleClick="@command('onEdit')">
+ onSelect="@command('onListSelection')">
<listhead sizable="true">
<listheader width="30px" label="Terv" sort="auto(planned)" align="left"
sortDirection="@load(vm.cols['planned'].sortDirection)"/>
sortDirection="@load(vm.cols['incoming'].sortDirection)"/>
</listhead>
<template name="model">
- <listitem>
+ <listitem onDoubleClick="@command('onEdit')">
<listcell>
<a iconSclass="z-icon-map-marker" visible="@load(each.planned)"
style="@load(each.planned ? 'color: gray' : 'color: black')"/>
</toolbar>
</north>
<center border="none" flex="true">
- <listbox id="partnersList" vflex="true" model="@load(vm.partnersDataModel)"
+ <listbox vflex="true" model="@load(vm.partnersDataModel)"
autopaging="true" mold="paging" pagingPosition="top" multiple="false"
- onSelect="@command('onListSelection')" onDoubleClick="@command('onEdit')">
+ onSelect="@command('onListSelection')">
<listhead sizable="true">
<listheader label="Név" sort="auto(name)" align="left"
sortDirection="@load(vm.cols['name'].sortDirection)"/>
</listhead>
<template name="model">
- <listitem>
+ <listitem onDoubleClick="@command('onEdit')">
<listcell label="@load(each.name)"/>
<listcell label="@load(each.vatNr)"/>
<listcell label="@load(each.address)"/>
</north>
<center border="none" flex="true">
<listbox vflex="true" model="@load(vm.projectsDataModel)"
- autopaging="true" pagingPosition="top" multiple="false"
- onSelect="@command('onListSelection')" onDoubleClick="@command('onEdit')">
+ autopaging="true" mold="paging" pagingPosition="top" multiple="false"
+ onSelect="@command('onListSelection')">
<listhead sizable="true">
<listheader label="Azonosító" sort="auto(humanId)" align="left"
sortDirection="@load(vm.cols['humanId'].sortDirection)"/>
sortDirection="@load(vm.cols['active'].sortDirection)"/>
</listhead>
<template name="model">
- <listitem>
+ <listitem onDoubleClick="@command('onEdit')">
<listcell label="@load(each.humanId)"/>
<listcell label="@load(each.partner.name)"/>
<listcell label="@load(each.projectStatus.name)"/>
<separator orient="vertical"/>
<label value="Projekt"/>
<separator orient="vertical"/>
- <entity-selector entity="Project" style="display: inline-block;" width="300px"/>
+ <entity-selector selector_id="sr_project" entity="Project" style="display: inline-block;"
+ width="300px"/>
<separator orient="vertical"/>
<label value="Munkatárs"/>
<separator orient="vertical"/>
- <entity-selector entity="Associate" style="display: inline-block;"/>
+ <entity-selector selector_id="sr_associate" entity="Associate" style="display: inline-block;"/>
<toolbarbutton label="Nincs szűrés" iconSclass="z-icon-ban" onClick="@command('onClearFilters')"/>
</toolbar>
</north>
<center border="none" flex="true">
<listbox vflex="true" model="@load(vm.serviceRecordsDataModel)"
- autopaging="true" mold="paging" pagingPosition="top" onSelect="@command('onListSelection')"
- onDoubleClick="@command('onEdit')">
+ autopaging="true" mold="paging" pagingPosition="top" onSelect="@command('onListSelection')">
<listhead sizable="true">
<listheader label="Projekt azonosító" sort="auto(project.humanId)" align="left"
sortDirection="@load(vm.cols['project.humanId'].sortDirection)"/>
<listheader label="Aláírt" align="left"/>
</listhead>
<template name="model">
- <listitem>
+ <listitem onDoubleClick="@command('onEdit')">
<listcell label="@load(each.project.humanId)"/>
<listcell label="@load(each.project.name)"/>
<listcell label="@load(each.project.partner.name)"/>
</north>
<center border="none" flex="true">
<listbox vflex="true" model="@load(vm.projectStatusDataModel)"
- autopaging="true" pagingPosition="top" multiple="false"
+ autopaging="true" mold="paging" pagingPosition="top" multiple="false"
selectedItem="@bind(vm.selectedProjectStatus)">
<listhead sizable="true">
<listheader label="Sorrend" align="left"/>
<zk xmlns:c="client">
<hlayout viewModel="@id('vmEntity') @init(vm.getEntitySelectorRouter().getEntitySelectorModel(entity))">
- <bandbox id="entityBandBox" autodrop="true" hflex="true" mold="rounded"
+
+ <bandbox id="entityBandBox_${selector_id}" autodrop="true" hflex="true" mold="rounded"
value="@load(vmEntity.selectedEntity) @converter(vmEntity.displayConverter)"
onChanging="@command('onEntityBandChanging')" onOpen="@command('onEntityBandOpen')"
forward="onOK=submit.onClick, onCancel=cancel.onClick" disabled="${readonly}" readonly="${readonly}">
<attribute c:name="_doKeyDown">
<![CDATA[
function (evt) {
+ var selectorId = "${selector_id}";
+ console.log("this", this);
+
+ var bandBox = zk.$("$entityBandBox_" + selectorId);
+ var bandPopup = zk.$("$entityBandPopup_" + selectorId);
+
var keyCode = evt.keyCode;
- console.log(keyCode, zk.$("$entityBandBox").getValue());
- if (keyCode == 13){
- //zk.$.notify("Hello World");
- zk.$("$entityBandBox").close();
- zk.$("$entityBandBox").focus();
+
+ console.log("keyCode", keyCode);
+
+ if (keyCode == 13 || keyCode == 27){
+ bandBox.close();
+ bandBox.focus();
return;
}
+
if (keyCode == 40){
- if (!zk.$("$entityBandBox").isOpen()) {
- zk.$("$entityBandBox").open();
- zAu.send(new zk.Event(zk.Widget.$('$entityBandBox'), "onOpen", {'open': true}, {toServer:true}));
+ if (!bandBox.isOpen()) {
+ console.log("Opening");
+ zAu.send(new zk.Event(bandBox, "onOpen", {'open': true}, {toServer:true}));
+ bandBox.open();
}
- console.log("List", zk.$("$entityList"));
-
- zk.$("$entityList").focus();
- return;
- }
- if (keyCode == 27){
- zk.$("$entityBandBox").close()
- zk.$("$entityBandBox").focus();
+ bandPopup.focus();
return;
}
}
]]>
</attribute>
- <bandpopup width="400px">
- <listbox id="entityList" height="250px"
+ <bandpopup id="entityBandPopup_${selector_id}" width="400px">
+ <listbox id="entityList_${selector_id}" height="250px"
model="@bind(vmEntity.dataModel)"
selectedItem="@bind(vmEntity.selectedEntity)"
- onClick="entityBandBox.close()"
- onDoubleClick="entityBandBox.close()">
+ onClick="entityBandBox_${selector_id}.close()"
+ onDoubleClick="entityBandBox_${selector_id}.close()">
<listhead visible="false">
<listheader label="name" vflex="max"/>
</listhead>