From 2d5b16f97414f929f860c880ef9ba0bec6a905d5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Fri, 24 Nov 2023 14:32:25 +0100 Subject: [PATCH] InvoiceImport V2, validator information added to forms --- KB.md | 5 + lis-app/pom.xml | 6 + .../src/main/resources/application-dev.yaml | 4 + .../user/lis/workflow/CleanupCamundaIT.java | 43 + .../lis/workflow/TaxOfficeInvoiceApiIT.java | 8 +- ...dd_remotely_authenticated_to_associate.sql | 1 + .../scripts/011_add_paid_to_invoice.sql | 1 + .../012_add_created_by_import_to_partner.sql | 1 + .../scripts/014_create_incvoice_indexes.sql | 10 + .../scripts/015_add_active_to_invoice.sql | 11 + .../src/main/java/hu/user/lis/db/Invoice.java | 1 + .../java/hu/user/lis/db/InvoiceImport.java | 1 - .../repository/InvoiceImportRepository.java | 4 + .../InvoiceRepositorySearchImpl.java | 1 + .../lis/service/data/EntityDataService.java | 30 + .../service/nav/TaxOfficeInvoiceService.java | 4 +- .../lis/service/nav/TaxOfficeProperties.java | 32 + .../service/nav/TaxOfficeRequestBuilder.java | 65 +- .../lis/ui/data/AssignInvoicesDataModel.java | 2 +- .../hu/user/lis/ui/data/InvoiceDataModel.java | 11 +- .../user/lis/ui/data/InvoicesDataModel.java | 2 +- .../lis/ui/editor/AssociateEditorModel.java | 18 +- .../ImportInvoiceApproveEditorModel.java | 34 +- .../ImportInvoiceAssignEditorModel.java | 32 +- .../lis/ui/editor/InvoiceEditorModel.java | 25 +- .../lis/ui/editor/PartnerEditorModel.java | 28 +- .../lis/ui/editor/ProjectEditorModel.java | 20 +- .../ui/editor/ServiceRecordEditorModel.java | 20 +- .../lis/ui/editor/TreasuryEditorModel.java | 19 +- .../ui/editor/common/EntityEditorModel.java | 26 +- .../validator/AssociateFormValidator.java | 26 + .../FormValidator.java} | 44 +- .../ImportInvoiceApproveFormValidator.java | 17 + .../ImportInvoiceAssignFormValidator.java | 18 + .../validator/InvoiceFormValidator.java | 83 + .../validator/PartnerFormValidator.java | 34 + .../ProjectFormValidator.java} | 12 +- .../validator/ServiceRecordFormValidator.java | 19 + .../validator/TreasuryFormValidator.java | 20 + .../lis/ui/view/ApproveInvoicesViewModel.java | 24 +- .../lis/ui/view/AssignInvoicesViewModel.java | 30 +- .../user/lis/ui/view/AssociatesViewModel.java | 1 + .../resources/web/editor/associate-editor.zul | 5 + .../editor/import-invoice-approve-editor.zul | 13 +- .../editor/import-invoice-assign-editor.zul | 14 +- .../web/editor/incoming-invoice-editor.zul | 5 + .../web/editor/outgoing-invoice-editor.zul | 5 + .../resources/web/editor/partner-editor.zul | 5 + .../resources/web/editor/project-editor.zul | 7 +- .../web/editor/service-record-editor.zul | 5 + .../resources/web/editor/treasury-editor.zul | 5 + .../resources/web/import-invoices-approve.zul | 7 +- .../resources/web/import-invoices-assign.zul | 4 +- lis-ui/src/main/resources/web/index.zul | 3 +- .../workflow/invoice/DownloadInvoiceData.java | 24 +- .../DownloadInvoiceDataFromLocalPath.java | 35 + .../lis/workflow/invoice/ListNewInvoices.java | 51 +- .../invoice/ListNewInvoicesFromLocalPath.java | 32 + .../invoice/data/InvoiceImportStatus.java | 5 + .../IncomingInvoiceFetcherService.java | 4 +- .../service/WorkflowManagerService.java | 32 +- .../resources/assign-incoming-invoices.bpmn | 77 +- logs/archived/sly-crm-app-2023-11-02.0.log | 5511 +++++++++++++++++ 63 files changed, 6390 insertions(+), 252 deletions(-) create mode 100644 lis-app/src/test/java/hu/user/lis/workflow/CleanupCamundaIT.java create mode 100644 lis-db/migrations/scripts/014_create_incvoice_indexes.sql create mode 100644 lis-db/migrations/scripts/015_add_active_to_invoice.sql create mode 100644 lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeProperties.java create mode 100644 lis-ui/src/main/java/hu/user/lis/ui/editor/validator/AssociateFormValidator.java rename lis-ui/src/main/java/hu/user/lis/ui/editor/{validate/FormFieldChecker.java => validator/FormValidator.java} (57%) create mode 100644 lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ImportInvoiceApproveFormValidator.java create mode 100644 lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ImportInvoiceAssignFormValidator.java create mode 100644 lis-ui/src/main/java/hu/user/lis/ui/editor/validator/InvoiceFormValidator.java create mode 100644 lis-ui/src/main/java/hu/user/lis/ui/editor/validator/PartnerFormValidator.java rename lis-ui/src/main/java/hu/user/lis/ui/editor/{validate/ProjectFormChecker.java => validator/ProjectFormValidator.java} (73%) create mode 100644 lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ServiceRecordFormValidator.java create mode 100644 lis-ui/src/main/java/hu/user/lis/ui/editor/validator/TreasuryFormValidator.java create mode 100644 lis-workflow/src/main/java/hu/user/lis/workflow/invoice/DownloadInvoiceDataFromLocalPath.java create mode 100644 lis-workflow/src/main/java/hu/user/lis/workflow/invoice/ListNewInvoicesFromLocalPath.java create mode 100644 lis-workflow/src/main/java/hu/user/lis/workflow/invoice/data/InvoiceImportStatus.java create mode 100644 logs/archived/sly-crm-app-2023-11-02.0.log diff --git a/KB.md b/KB.md index 1ae4031..1ebf57f 100644 --- a/KB.md +++ b/KB.md @@ -84,10 +84,15 @@ A típussal eggyező változó nevet kell adni, különben nem találja meg!!! https://www.baeldung.com/spring-5-webclient +##### JPA + +https://docs.spring.io/spring-data/jpa/reference/repositories/query-keywords-reference.html + ##### Regexp adószám https://www.billingo.hu/blog/olvas/adoszam-felepitese?utm_term=&utm_campaign=PM+-+Általános&utm_source=adwords&utm_medium=ppc&hsa_acc=3455314461&hsa_cam=15237149027&hsa_grp=&hsa_ad=&hsa_src=x&hsa_tgt=&hsa_kw=&hsa_mt=&hsa_net=adwords&hsa_ver=3&gclid=CjwKCAjw67ajBhAVEiwA2g_jELVso85dN9wgA43d9Exs3OtDvp_mjvRJ5M0_Q9cJu7u8XusVeSvYnRoCKTwQAvD_BwE +https://blog.billzone.eu/2017/01/05/kozossegi-adoszamok-formatuma/ https://regex101.com/r/ytlsy4/2 /^[0-9]{8}-[1-5] {1}-[02]|[22]|[03]|[23]|[04]|[24]|[05]|[25]|[06]|[26]|[07]|[27]|[08]|[28]|[09]|[29]|[10]|[30]|[11]|[31]|[12]|[32]|[13] diff --git a/lis-app/pom.xml b/lis-app/pom.xml index b8a4848..cc4d61e 100644 --- a/lis-app/pom.xml +++ b/lis-app/pom.xml @@ -4,6 +4,7 @@ 4.0.0 lis-app 0.1.8-SNAPSHOT + SLY-CRM hu.user lis @@ -34,6 +35,11 @@ build-info + + + User Rendszerház Kft. + + diff --git a/lis-app/src/main/resources/application-dev.yaml b/lis-app/src/main/resources/application-dev.yaml index 7ec2477..898f1f3 100644 --- a/lis-app/src/main/resources/application-dev.yaml +++ b/lis-app/src/main/resources/application-dev.yaml @@ -72,3 +72,7 @@ service: sign-key: fe-9d8b-971c878376204BQEWTHH2HI6 exchange-key: 3af24BQEWTHH4TSX sender-tax-number: 13364937 + sender-company: User Rendszerház Kft. + sender-country: HU + sender-contact: Kovács Géza + days-range: 34 \ No newline at end of file diff --git a/lis-app/src/test/java/hu/user/lis/workflow/CleanupCamundaIT.java b/lis-app/src/test/java/hu/user/lis/workflow/CleanupCamundaIT.java new file mode 100644 index 0000000..3ae576d --- /dev/null +++ b/lis-app/src/test/java/hu/user/lis/workflow/CleanupCamundaIT.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) $today.year-$today.month-24. + * By elGekko + */ + +package hu.user.lis.workflow; + +import lombok.extern.log4j.Log4j2; +import org.camunda.bpm.engine.RuntimeService; +import org.camunda.bpm.engine.TaskService; +import org.camunda.bpm.engine.runtime.ProcessInstance; +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.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.List; + + +@Log4j2 +@SpringBootTest +@RunWith(SpringRunner.class) +@ActiveProfiles("dev") +@ComponentScan("hu.user.lis") +@TestPropertySource("classpath:application-dev.yaml") +public class CleanupCamundaIT { + @Autowired + private RuntimeService runtimeService; + + @Autowired + private TaskService taskService; + + + @Test + public void deleteAllTasks() throws InterruptedException { + List processInstances = runtimeService.createProcessInstanceQuery().active().list(); + processInstances.forEach(p -> runtimeService.deleteProcessInstance(p.getProcessInstanceId(), "No reason")); + } +} \ No newline at end of file diff --git a/lis-app/src/test/java/hu/user/lis/workflow/TaxOfficeInvoiceApiIT.java b/lis-app/src/test/java/hu/user/lis/workflow/TaxOfficeInvoiceApiIT.java index 9fa33f9..a5195c1 100644 --- a/lis-app/src/test/java/hu/user/lis/workflow/TaxOfficeInvoiceApiIT.java +++ b/lis-app/src/test/java/hu/user/lis/workflow/TaxOfficeInvoiceApiIT.java @@ -72,7 +72,7 @@ public class TaxOfficeInvoiceApiIT { QueryInvoiceDigestRequest queryRequest = taxOfficeRequestBuilder.requestInvoiceDigest(); queryRequest.setPage(1); queryRequest.setInvoiceDirection(InvoiceDirectionType.INBOUND); - queryRequest.setInvoiceQueryParams(taxOfficeRequestBuilder.params()); + queryRequest.setInvoiceQueryParams(taxOfficeRequestBuilder.params(34)); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_XML); @@ -95,7 +95,7 @@ public class TaxOfficeInvoiceApiIT { QueryInvoiceDigestRequest queryRequest = taxOfficeRequestBuilder.requestInvoiceDigest(); queryRequest.setPage(1); queryRequest.setInvoiceDirection(InvoiceDirectionType.INBOUND); - queryRequest.setInvoiceQueryParams(taxOfficeRequestBuilder.params()); + queryRequest.setInvoiceQueryParams(taxOfficeRequestBuilder.params(34)); WebClient client = WebClient.create(API_URL); WebClient.UriSpec uriSpec = client.post(); @@ -121,7 +121,7 @@ public class TaxOfficeInvoiceApiIT { QueryInvoiceDigestRequest queryRequest = taxOfficeRequestBuilder.requestInvoiceDigest(); queryRequest.setPage(1); queryRequest.setInvoiceDirection(InvoiceDirectionType.INBOUND); - queryRequest.setInvoiceQueryParams(taxOfficeRequestBuilder.params()); + queryRequest.setInvoiceQueryParams(taxOfficeRequestBuilder.params(34)); HttpClient httpClient = HttpClient.create() .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) @@ -152,7 +152,7 @@ public class TaxOfficeInvoiceApiIT { int availablePages = 1; int currentPage = 1; while (currentPage <= availablePages) { - Optional response = taxOfficeInvoiceService.queryInboundInvoices(currentPage); + Optional response = taxOfficeInvoiceService.queryInboundInvoices(currentPage, 34); if (!response.isPresent()) { break; } diff --git a/lis-db/migrations/scripts/003_add_remotely_authenticated_to_associate.sql b/lis-db/migrations/scripts/003_add_remotely_authenticated_to_associate.sql index cb8b83f..729d1ad 100644 --- a/lis-db/migrations/scripts/003_add_remotely_authenticated_to_associate.sql +++ b/lis-db/migrations/scripts/003_add_remotely_authenticated_to_associate.sql @@ -7,4 +7,5 @@ ALTER TABLE ASSOCIATE ADD COLUMN remotely_authenticated SMALLINT NOT NULL DEFAUL -- SQL to undo the change goes here. ALTER TABLE ASSOCIATE DROP COLUMN remotely_authenticated; +CALL SYSPROC.ADMIN_CMD('REORG TABLE associate'); diff --git a/lis-db/migrations/scripts/011_add_paid_to_invoice.sql b/lis-db/migrations/scripts/011_add_paid_to_invoice.sql index 8b961cb..b09b684 100644 --- a/lis-db/migrations/scripts/011_add_paid_to_invoice.sql +++ b/lis-db/migrations/scripts/011_add_paid_to_invoice.sql @@ -7,3 +7,4 @@ ALTER TABLE invoice ADD COLUMN paid SMALLINT NOT NULL DEFAULT 0; -- SQL to undo the change goes here. ALTER TABLE invoice DROP COLUMN paid; +CALL SYSPROC.ADMIN_CMD('REORG TABLE invoice'); diff --git a/lis-db/migrations/scripts/012_add_created_by_import_to_partner.sql b/lis-db/migrations/scripts/012_add_created_by_import_to_partner.sql index 8603565..52cc0c3 100644 --- a/lis-db/migrations/scripts/012_add_created_by_import_to_partner.sql +++ b/lis-db/migrations/scripts/012_add_created_by_import_to_partner.sql @@ -7,3 +7,4 @@ ALTER TABLE partner ADD COLUMN created_by_import SMALLINT NOT NULL DEFAULT 0; -- SQL to undo the change goes here. ALTER TABLE partner DROP COLUMN created_by_import; +CALL SYSPROC.ADMIN_CMD('REORG TABLE partner'); diff --git a/lis-db/migrations/scripts/014_create_incvoice_indexes.sql b/lis-db/migrations/scripts/014_create_incvoice_indexes.sql new file mode 100644 index 0000000..670404d --- /dev/null +++ b/lis-db/migrations/scripts/014_create_incvoice_indexes.sql @@ -0,0 +1,10 @@ +-- // create invoice indexes +-- Migration SQL that makes the change goes here. + +CREATE INDEX IDX_INVOICE_CREATE_DATE ON invoice(create_date); +CREATE INDEX IDX_INVOICE_PARTNER_ID_HUMAN_ID ON invoice(partner_id, human_id); +-- //@UNDO +-- SQL to undo the change goes here. + +DROP INDEX IDX_INVOICE_CREATE_DATE; +DROP INDEX IDX_INVOICE_PARTNER_ID_HUMAN_ID; diff --git a/lis-db/migrations/scripts/015_add_active_to_invoice.sql b/lis-db/migrations/scripts/015_add_active_to_invoice.sql new file mode 100644 index 0000000..07fb06b --- /dev/null +++ b/lis-db/migrations/scripts/015_add_active_to_invoice.sql @@ -0,0 +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; + +-- //@UNDO +-- SQL to undo the change goes here. + +ALTER TABLE invoice DROP COLUMN active; +CALL SYSPROC.ADMIN_CMD('REORG TABLE invoice'); diff --git a/lis-db/src/main/java/hu/user/lis/db/Invoice.java b/lis-db/src/main/java/hu/user/lis/db/Invoice.java index ca94e7c..bb72eeb 100644 --- a/lis-db/src/main/java/hu/user/lis/db/Invoice.java +++ b/lis-db/src/main/java/hu/user/lis/db/Invoice.java @@ -32,6 +32,7 @@ public class Invoice implements Serializable { Date paymentDeadline; @Column(nullable = false, insertable = false, updatable = false) boolean incoming; + boolean active; boolean paid; boolean planned; byte[] file; diff --git a/lis-db/src/main/java/hu/user/lis/db/InvoiceImport.java b/lis-db/src/main/java/hu/user/lis/db/InvoiceImport.java index 07ef118..9ade154 100644 --- a/lis-db/src/main/java/hu/user/lis/db/InvoiceImport.java +++ b/lis-db/src/main/java/hu/user/lis/db/InvoiceImport.java @@ -26,7 +26,6 @@ public class InvoiceImport implements Serializable { @JsonIncludeProperties({"id"}) private Invoice invoice; - @GeneratedValue(strategy = GenerationType.AUTO) @Column(updatable = false) @CreationTimestamp private Date imported; diff --git a/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceImportRepository.java b/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceImportRepository.java index 7b4c222..0994af8 100644 --- a/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceImportRepository.java +++ b/lis-db/src/main/java/hu/user/lis/db/repository/InvoiceImportRepository.java @@ -3,6 +3,10 @@ package hu.user.lis.db.repository; import hu.user.lis.db.InvoiceImport; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface InvoiceImportRepository extends JpaRepository { + // @Query("SELECT * FROM InvoiceImport i WHERE ") + Optional findTopByOrderByInvoiceCreateDate(); } 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 index 6717eda..47b9d6d 100644 --- 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 @@ -24,6 +24,7 @@ public class InvoiceRepositorySearchImpl implements InvoiceRepositorySearch { Predicate[] getPredicates(CriteriaBuilder cb, Root root, InvoiceFilter filter) { List predicates = new ArrayList<>(); + predicates.add(cb.equal(root.get("active"), true)); if (Objects.nonNull(filter.getPartner())) { predicates.add(cb.equal(root.get("partner"), filter.getPartner())); diff --git a/lis-service/src/main/java/hu/user/lis/service/data/EntityDataService.java b/lis-service/src/main/java/hu/user/lis/service/data/EntityDataService.java index 75ff85f..f0a099d 100644 --- a/lis-service/src/main/java/hu/user/lis/service/data/EntityDataService.java +++ b/lis-service/src/main/java/hu/user/lis/service/data/EntityDataService.java @@ -1,6 +1,7 @@ package hu.user.lis.service.data; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.SerializationUtils; @@ -11,6 +12,8 @@ import org.springframework.stereotype.Service; import java.io.Serializable; import java.util.AbstractMap; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; @Log4j2 @@ -43,6 +46,20 @@ public class EntityDataService extends EntityDataService return result; } + public Map toMap(T entity) { + Map result = null; + try { + String data = toJSON(entity); + TypeReference> typeRef = + new TypeReference>() { + }; + result = objectMapper.readValue(data, typeRef); + } catch (JsonProcessingException e) { + log.catching(e); + } + return result; + } + public String toPrettyJSON(T entity) { String result = null; try { @@ -63,6 +80,19 @@ public class EntityDataService extends EntityDataService return result; } + public Map fromJSON(String data) { + Map result = null; + try { + TypeReference> typeRef = + new TypeReference>() { + }; + result = objectMapper.readValue(data, typeRef); + } catch (JsonProcessingException e) { + log.catching(e); + } + return result; + } + public boolean areEquals(T entity1, T entity2) { boolean result = true; String json1 = toJSON(entity1); diff --git a/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeInvoiceService.java b/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeInvoiceService.java index 682b812..f67f220 100644 --- a/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeInvoiceService.java +++ b/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeInvoiceService.java @@ -34,11 +34,11 @@ public class TaxOfficeInvoiceService { return builder.toString(); } - public Optional queryInboundInvoices(int page) throws Exception { + public Optional queryInboundInvoices(int page, int daysRange) throws Exception { QueryInvoiceDigestRequest request = taxOfficeRequestBuilder.requestInvoiceDigest(); request.setPage(page); request.setInvoiceDirection(InvoiceDirectionType.INBOUND); - request.setInvoiceQueryParams(taxOfficeRequestBuilder.params()); + request.setInvoiceQueryParams(taxOfficeRequestBuilder.params(daysRange)); String response = taxOfficeConnector.post("/queryInvoiceDigest", taxOfficeXmlConverter.toXml(request)); return taxOfficeXmlConverter.fromXml(response, QueryInvoiceDigestResponse.class); } diff --git a/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeProperties.java b/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeProperties.java new file mode 100644 index 0000000..150d6ce --- /dev/null +++ b/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeProperties.java @@ -0,0 +1,32 @@ +package hu.user.lis.service.nav; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "service.nav.api") +public class TaxOfficeProperties { + + private String user; + + private String password; + + private String signKey; + + private String exchangeKey; + + private String senderTaxNumber; + + private String senderCompany; + + private String senderCountry; + + private String senderContact; + + private int daysRange; + +} diff --git a/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeRequestBuilder.java b/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeRequestBuilder.java index 120870f..7f4559d 100644 --- a/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeRequestBuilder.java +++ b/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeRequestBuilder.java @@ -9,7 +9,8 @@ import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.RandomStringUtils; import org.bouncycastle.jcajce.provider.digest.SHA3; import org.bouncycastle.util.encoders.Hex; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.info.BuildProperties; import org.springframework.stereotype.Component; import javax.xml.datatype.DatatypeConfigurationException; @@ -26,20 +27,26 @@ public class TaxOfficeRequestBuilder { private final static DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_PATTERN); - @Value("${service.nav.api.user}") - private String apiUser; - - @Value("${service.nav.api.password}") - private String apiPassword; - - @Value("${service.nav.api.sign-key}") - private String signKey; - - @Value("${service.nav.api.exchange-key}") - private String exchangeKey; - - @Value("${service.nav.api.sender-tax-number}") - private String senderTaxNumber; + @Autowired + private TaxOfficeProperties properties; + + @Autowired + private BuildProperties buildProperties; + +// @Value("${service.nav.api.user}") +// private String apiUser; +// +// @Value("${service.nav.api.password}") +// private String apiPassword; +// +// @Value("${service.nav.api.sign-key}") +// private String signKey; +// +// @Value("${service.nav.api.exchange-key}") +// private String exchangeKey; +// +// @Value("${service.nav.api.sender-tax-number}") +// private String senderTaxNumber; /* A requestId a kérés azonosítója. Értéke bármi lehet, ami a pattern szerint érvényes és az @@ -56,7 +63,7 @@ public class TaxOfficeRequestBuilder { BasicHeaderType result = new BasicHeaderType(); result.setRequestId(RandomStringUtils.randomAlphanumeric(20)); result.setTimestamp(DatatypeFactory.newInstance().newXMLGregorianCalendar( - LocalDateTime.now(ZoneOffset.UTC).toString() + "Z") + LocalDateTime.now(ZoneOffset.UTC) + "Z") ); result.setRequestVersion("3.0"); result.setHeaderVersion("1.0"); @@ -72,13 +79,13 @@ public class TaxOfficeRequestBuilder { */ public UserHeaderType user() { UserHeaderType result = new UserHeaderType(); - result.setLogin(apiUser); + result.setLogin(properties.getUser()); CryptoType pwdCryptoType = new CryptoType(); pwdCryptoType.setCryptoType("SHA-512"); - pwdCryptoType.setValue(DigestUtils.sha512Hex(apiPassword).toUpperCase()); + pwdCryptoType.setValue(DigestUtils.sha512Hex(properties.getPassword()).toUpperCase()); result.setPasswordHash(pwdCryptoType); - result.setTaxNumber(senderTaxNumber.substring(0, 8)); + result.setTaxNumber(properties.getSenderTaxNumber().substring(0, 8)); return result; } @@ -90,14 +97,14 @@ public class TaxOfficeRequestBuilder { */ public SoftwareType software() { SoftwareType result = new SoftwareType(); - result.setSoftwareId(String.format("HU-%s-000000", senderTaxNumber)); - result.setSoftwareName("SLY-CRM"); + result.setSoftwareId(String.format("%s-%s-000000", properties.getSenderCountry(), properties.getSenderTaxNumber().substring(0, 8))); + result.setSoftwareName(buildProperties.getName()); result.setSoftwareOperation(SoftwareOperationType.ONLINE_SERVICE); - result.setSoftwareMainVersion("0.1.7"); - result.setSoftwareDevName("User Rendszerház Kft."); - result.setSoftwareDevContact("Kovács Géza"); - result.setSoftwareDevCountryCode("HU"); - result.setSoftwareDevTaxNumber(senderTaxNumber); + result.setSoftwareMainVersion(buildProperties.getVersion()); + result.setSoftwareDevName(properties.getSenderCompany()); + result.setSoftwareDevContact(properties.getSenderContact()); + result.setSoftwareDevCountryCode(properties.getSenderCountry()); + result.setSoftwareDevTaxNumber(properties.getSenderTaxNumber()); return result; } @@ -110,11 +117,11 @@ public class TaxOfficeRequestBuilder { időpontjára, UTC időben c. originalInvoiceNumber megadása esetén számlaláncra */ - public InvoiceQueryParamsType params() throws DatatypeConfigurationException { + public InvoiceQueryParamsType params(int daysRange) throws DatatypeConfigurationException { MandatoryQueryParamsType mandatoryQueryParamsType = new MandatoryQueryParamsType(); DateIntervalParamType dateInterval = new DateIntervalParamType(); dateInterval.setDateFrom(DatatypeFactory.newInstance().newXMLGregorianCalendar( - LocalDateTime.now(ZoneOffset.UTC).minusDays(34).toString()) + LocalDateTime.now(ZoneOffset.UTC).minusDays(daysRange).toString()) ); dateInterval.setDateTo(DatatypeFactory.newInstance().newXMLGregorianCalendar(LocalDateTime.now().toString())); mandatoryQueryParamsType.setInvoiceIssueDate(dateInterval); @@ -138,7 +145,7 @@ public class TaxOfficeRequestBuilder { String rsSignature = header.getRequestId() + DATE_TIME_FORMATTER.format(zdtUTC) + - signKey; + properties.getSignKey(); CryptoType reqCryptoType = new CryptoType(); reqCryptoType.setCryptoType("SHA3-512"); diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/AssignInvoicesDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/AssignInvoicesDataModel.java index 99aa8f6..c465bb1 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/data/AssignInvoicesDataModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/data/AssignInvoicesDataModel.java @@ -39,7 +39,7 @@ public class AssignInvoicesDataModel extends CachedSpringDataModel { JSONObject o = new JSONObject(); o.put("taskId", t.getId()); o.putAll(workflowManagerService.getVariables(t.getId())); - log.info("Task {}", o); +// log.info("Task {}", o); return o; }).collect(Collectors.toList()); } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/InvoiceDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/InvoiceDataModel.java index 57641df..faafc11 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/data/InvoiceDataModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/data/InvoiceDataModel.java @@ -34,18 +34,11 @@ public class InvoiceDataModel { } public IncomingInvoice createNewIncomingInvoice() { - IncomingInvoice result = IncomingInvoice.builder() - .incoming(true) - .planned(true) - .build(); - return result; + return IncomingInvoice.builder().incoming(true).active(true).build(); } public OutgoingInvoice createNewOutgoingInvoice() { - OutgoingInvoice result = OutgoingInvoice.builder() - .planned(true) - .build(); - return result; + return OutgoingInvoice.builder().active(true).build(); } public void save(Invoice modifiedEntity) { 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 index 4c1a9e0..e5d2f1e 100644 --- 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 @@ -21,7 +21,7 @@ import java.util.Optional; @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class InvoicesDataModel extends CachedSpringDataModel { @Autowired - InvoiceRepository invoiceRepository; + private InvoiceRepository invoiceRepository; private InvoiceFilter filter; diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/AssociateEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/AssociateEditorModel.java index 66c8218..c59ef0b 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/AssociateEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/AssociateEditorModel.java @@ -2,27 +2,35 @@ package hu.user.lis.ui.editor; import hu.user.lis.db.Associate; import hu.user.lis.ui.editor.common.EntityEditorModel; +import hu.user.lis.ui.editor.validator.AssociateFormValidator; +import hu.user.lis.ui.editor.validator.FormValidator; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; -import org.apache.commons.lang3.StringUtils; import org.zkoss.bind.annotation.Init; +import org.zkoss.zk.ui.select.annotation.WireVariable; @Log4j2 @Getter @Setter public class AssociateEditorModel extends EntityEditorModel { + @WireVariable + private AssociateFormValidator associateFormValidator; + + @Override + public FormValidator getFormValidator() { + return associateFormValidator; + } + @Init + @Override public void init() { super.init(); } @Override protected boolean canSave(Associate entity) { - return StringUtils.isNotBlank(entity.getName()) && - StringUtils.isNotBlank(entity.getLogin()) && - (entity.isRemotelyAuthenticated() || StringUtils.isNotBlank(entity.getPassword())) && - entity.getMonthlyCost() > 0; + return associateFormValidator.validate(entity); } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/ImportInvoiceApproveEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/ImportInvoiceApproveEditorModel.java index 47b5ecb..ac2d672 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/ImportInvoiceApproveEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/ImportInvoiceApproveEditorModel.java @@ -6,6 +6,9 @@ import hu.user.lis.db.Partner; import hu.user.lis.db.Project; import hu.user.lis.ui.data.PartnersDataModel; import hu.user.lis.ui.editor.common.Editors; +import hu.user.lis.ui.editor.validator.FormValidator; +import hu.user.lis.ui.editor.validator.ImportInvoiceApproveFormValidator; +import hu.user.lis.workflow.invoice.data.InvoiceImportStatus; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; @@ -27,6 +30,14 @@ public class ImportInvoiceApproveEditorModel extends InvoiceEditorModel { @Setter boolean canEditPartner; + @WireVariable + private ImportInvoiceApproveFormValidator importInvoiceApproveFormValidator; + + @Override + public FormValidator getFormValidator() { + return importInvoiceApproveFormValidator; + } + @Init @Override public void init() { @@ -36,9 +47,7 @@ public class ImportInvoiceApproveEditorModel extends InvoiceEditorModel { @Override protected boolean canSave(Invoice entity) { - return super.canSave(entity) - && Objects.nonNull(entity.getProject()) - && Objects.nonNull(entity.getFile()); + return importInvoiceApproveFormValidator.validate(entity); } @Override @@ -56,19 +65,14 @@ public class ImportInvoiceApproveEditorModel extends InvoiceEditorModel { } @Command - public void onCloseApproveWindow(@BindingParam("target") Window target, @BindingParam("save") int save) { - if (save == 0) { + public void onCloseApproveWindow(@BindingParam("target") Window target, @BindingParam("status") InvoiceImportStatus status) { + if (InvoiceImportStatus.NONE.equals(status)) { Events.postEvent(new Event("onClose", target, null)); - return; - } - if (save == 1) { - Events.postEvent(new Event("onClose", target, - ImmutableMap.of("approved", false))); - return; - } - if (isSaveEnabled()) { - Events.postEvent(new Event("onClose", target, - ImmutableMap.of("approved", true, "modifiedEntity", getFormDocument()))); + } else { + Events.postEvent(new Event("onClose", target, ImmutableMap.of( + "modifiedEntity", getFormDocument(), + "status", status + ))); } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/ImportInvoiceAssignEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/ImportInvoiceAssignEditorModel.java index 5de60be..fdb20f0 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/ImportInvoiceAssignEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/ImportInvoiceAssignEditorModel.java @@ -7,6 +7,9 @@ import hu.user.lis.db.Project; import hu.user.lis.db.repository.ProjectRepository; import hu.user.lis.ui.data.PartnersDataModel; import hu.user.lis.ui.editor.common.Editors; +import hu.user.lis.ui.editor.validator.FormValidator; +import hu.user.lis.ui.editor.validator.ImportInvoiceAssignFormValidator; +import hu.user.lis.workflow.invoice.data.InvoiceImportStatus; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; @@ -38,6 +41,14 @@ public class ImportInvoiceAssignEditorModel extends InvoiceEditorModel { @Getter private List projectSuggestions; + @WireVariable + private ImportInvoiceAssignFormValidator importInvoiceAssignFormValidator; + + @Override + public FormValidator getFormValidator() { + return importInvoiceAssignFormValidator; + } + @Init @Override public void init() { @@ -48,9 +59,7 @@ public class ImportInvoiceAssignEditorModel extends InvoiceEditorModel { @Override protected boolean canSave(Invoice entity) { - return super.canSave(entity) - && Objects.nonNull(entity.getProject()) - && Objects.nonNull(entity.getFile()); + return importInvoiceAssignFormValidator.validate(entity); } @Override @@ -80,17 +89,14 @@ public class ImportInvoiceAssignEditorModel extends InvoiceEditorModel { } @Command - public void onCloseApproveWindow(@BindingParam("target") Window target, @BindingParam("save") int save) { - if (save == 0) { + public void onCloseApproveWindow(@BindingParam("target") Window target, @BindingParam("status") InvoiceImportStatus status) { + if (InvoiceImportStatus.NONE.equals(status)) { Events.postEvent(new Event("onClose", target, null)); - return; - } - if (save == 1) { - Events.postEvent(new Event("onClose", target, ImmutableMap.of("invalid", true))); - return; - } - if (isSaveEnabled()) { - Events.postEvent(new Event("onClose", target, ImmutableMap.of("modifiedEntity", getFormDocument()))); + } else { + Events.postEvent(new Event("onClose", target, ImmutableMap.of( + "modifiedEntity", getFormDocument(), + "status", status + ))); } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/InvoiceEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/InvoiceEditorModel.java index 4d208e4..8105beb 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/InvoiceEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/InvoiceEditorModel.java @@ -4,20 +4,20 @@ import hu.user.lis.db.Currency; import hu.user.lis.db.Invoice; import hu.user.lis.db.Partner; import hu.user.lis.ui.editor.common.EntityEditorModel; +import hu.user.lis.ui.editor.validator.FormValidator; +import hu.user.lis.ui.editor.validator.InvoiceFormValidator; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; -import org.apache.commons.lang3.StringUtils; import org.zkoss.bind.BindContext; import org.zkoss.bind.BindUtils; import org.zkoss.bind.annotation.*; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.UploadEvent; +import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zul.Messagebox; -import java.util.Objects; - @Log4j2 @Getter @Setter @@ -25,6 +25,14 @@ public class InvoiceEditorModel extends EntityEditorModel { private boolean vatCalculated; + @WireVariable + private InvoiceFormValidator invoiceFormValidator; + + @Override + public FormValidator getFormValidator() { + return invoiceFormValidator; + } + @Init @Override public void init() { @@ -55,16 +63,7 @@ public class InvoiceEditorModel extends EntityEditorModel { @Override protected boolean canSave(Invoice entity) { - return entity.getNetAmount() > 0 && - entity.getGrossAmount() > 0 && - entity.getVatAmount() > 0 && - StringUtils.isNotBlank(entity.getTitle()) && - Objects.nonNull(entity.getPartner()) && - Objects.nonNull(entity.getCompletionDate()) && - Objects.nonNull(entity.getCreateDate()) && - Objects.nonNull(entity.getPaymentDeadline()) && - (entity.getCreateDate().before(entity.getCompletionDate()) || entity.getCreateDate().equals(entity.getCompletionDate())) && - (entity.getCompletionDate().before(entity.getPaymentDeadline()) || entity.getCompletionDate().equals(entity.getPaymentDeadline())); + return invoiceFormValidator.validate(entity); } @Command diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/PartnerEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/PartnerEditorModel.java index 6c6e1f9..e4d813e 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/PartnerEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/PartnerEditorModel.java @@ -2,38 +2,36 @@ package hu.user.lis.ui.editor; import hu.user.lis.db.Partner; import hu.user.lis.ui.editor.common.EntityEditorModel; +import hu.user.lis.ui.editor.validator.FormValidator; +import hu.user.lis.ui.editor.validator.PartnerFormValidator; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; -import org.apache.commons.lang3.StringUtils; import org.zkoss.bind.annotation.Init; +import org.zkoss.zk.ui.select.annotation.WireVariable; @Log4j2 @Getter @Setter public class PartnerEditorModel extends EntityEditorModel { - private static final String VAT_NR_PATTERN = "/^[0-9]{8}-[1-5]{1}-[02]|[22]|[03]|[23]|[04]|[24]|[05]|[25]|[06]|[26]|[07]|[27]|[08]|[28]|[09]|[29]|[10]|[30]|[11]|[31]|[12]|[32]|[13]|[33]|[14]|[34]|[15]|[35]|[16]|[36]|[17]|[37]|[18]|[38]|[19]|[39]|[20]|[40]|[41]|[42]|[43]|[44]|[51]$/s"; + + @WireVariable + private PartnerFormValidator partnerFormValidator; + + @Override + public FormValidator getFormValidator() { + return partnerFormValidator; + } @Init + @Override public void init() { super.init(); } @Override protected boolean canSave(Partner entity) { - return StringUtils.isNotBlank(entity.getName()) && - StringUtils.isNotBlank(entity.getAddress()) && - StringUtils.isNotBlank(entity.getVatNr()) && - entity.getVatNr().length() == 13 && - isVatNumber(entity.getVatNr()); + return partnerFormValidator.validate(entity); } - private boolean isVatNumber(String vatNr) { - return true; - //TODO not working properly -// Pattern pattern = Pattern.compile(VAT_NR_PATTERN); -// boolean result = pattern.matcher(vatNr).matches(); -// log.info("Vat number regex match {}", result); -// return result; - } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java index dee3ce0..f422f5c 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java @@ -7,8 +7,8 @@ import hu.user.lis.ui.converter.ProjectStatusConverter; import hu.user.lis.ui.data.*; import hu.user.lis.ui.editor.common.Editors; import hu.user.lis.ui.editor.common.EntityEditorModel; -import hu.user.lis.ui.editor.validate.FormFieldChecker; -import hu.user.lis.ui.editor.validate.ProjectFormChecker; +import hu.user.lis.ui.editor.validator.FormValidator; +import hu.user.lis.ui.editor.validator.ProjectFormValidator; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; @@ -86,7 +86,12 @@ public class ProjectEditorModel extends EntityEditorModel { private String partialAssociateName; @WireVariable - private ProjectFormChecker projectFormChecker; + private ProjectFormValidator projectFormValidator; + + @Override + public FormValidator getFormValidator() { + return projectFormValidator; + } @Init @Override @@ -95,11 +100,6 @@ public class ProjectEditorModel extends EntityEditorModel { projectStatusDataModel.listActive(); } - @Override - public FormFieldChecker getFormChecker() { - return projectFormChecker; - } - @Override public void onEvent(Event evt) { super.onEvent(evt); @@ -130,7 +130,7 @@ public class ProjectEditorModel extends EntityEditorModel { setFormDocument(projectsDataModel.getById(id)); setOrigDocument(projectsDataModel.clone(getFormDocument())); } - projectFormChecker.validate(getFormDocument()); + projectFormValidator.validate(getFormDocument()); BindUtils.postNotifyChange(this, "formDocument"); } @@ -171,7 +171,7 @@ public class ProjectEditorModel extends EntityEditorModel { @Override protected boolean canSave(Project entity) { - return projectFormChecker.validate(getFormDocument()); + return projectFormValidator.validate(getFormDocument()); } @Command diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java index b6b184b..e12e514 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java @@ -8,10 +8,11 @@ import hu.user.lis.ui.auth.CurrentProfile; import hu.user.lis.ui.data.ProjectAssociatesDataModel; import hu.user.lis.ui.editor.common.EntityEditorModel; import hu.user.lis.ui.editor.selector.EntitySelectorModel; +import hu.user.lis.ui.editor.validator.FormValidator; +import hu.user.lis.ui.editor.validator.ServiceRecordFormValidator; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; -import org.apache.commons.lang3.StringUtils; import org.zkoss.bind.BindContext; import org.zkoss.bind.BindUtils; import org.zkoss.bind.PropertyChangeEvent; @@ -41,8 +42,16 @@ public class ServiceRecordEditorModel extends EntityEditorModel { private EntitySelectorModel projectEntitySelectorModel; + @WireVariable + private ServiceRecordFormValidator serviceRecordFormValidator; + + @Override + public FormValidator getFormValidator() { + return serviceRecordFormValidator; + } @Init + @Override public void init() { super.init(); } @@ -75,7 +84,6 @@ public class ServiceRecordEditorModel extends EntityEditorModel { @Override public void onCloseWindow(@BindingParam("target") Window target, @BindingParam("save") boolean save) { if (save) { - Optional opProjectAssociate = projectAssociatesDataModel.searchByAssociateAndProject(getFormDocument().getAssociate().getId(), getFormDocument().getProject().getId()); if (opProjectAssociate.isPresent()) { @@ -107,17 +115,11 @@ public class ServiceRecordEditorModel extends EntityEditorModel { return Collections.emptyList(); } - @Override protected boolean canSave(ServiceRecord entity) { - return Objects.nonNull(entity.getProject()) && - Objects.nonNull(entity.getAssociate()) && - Objects.nonNull(entity.getWorkDay()) && - StringUtils.isNotBlank(entity.getDescription()) && - entity.getWorkHours() > 0; + return serviceRecordFormValidator.validate(entity); } - @Command public void onUploadFile(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { UploadEvent evt = (UploadEvent) ctx.getTriggerEvent(); diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/TreasuryEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/TreasuryEditorModel.java index 3cc5667..814f975 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/TreasuryEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/TreasuryEditorModel.java @@ -2,6 +2,8 @@ package hu.user.lis.ui.editor; import hu.user.lis.db.Treasury; import hu.user.lis.ui.editor.common.EntityEditorModel; +import hu.user.lis.ui.editor.validator.FormValidator; +import hu.user.lis.ui.editor.validator.TreasuryFormValidator; import lombok.extern.log4j.Log4j2; import org.zkoss.bind.BindContext; import org.zkoss.bind.BindUtils; @@ -10,24 +12,29 @@ import org.zkoss.bind.annotation.ContextParam; import org.zkoss.bind.annotation.ContextType; import org.zkoss.bind.annotation.Init; import org.zkoss.zk.ui.event.UploadEvent; +import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zul.Messagebox; -import java.util.Objects; - @Log4j2 public class TreasuryEditorModel extends EntityEditorModel { + @WireVariable + private TreasuryFormValidator treasuryFormValidator; + + @Override + public FormValidator getFormValidator() { + return treasuryFormValidator; + } + @Init + @Override public void init() { super.init(); } @Override protected boolean canSave(Treasury entity) { - return entity.getBuyAmount() > 0 && - entity.getSellAmount() > 0 && - Objects.nonNull(entity.getValueDate()) && - Objects.nonNull(entity.getTransactionDate()); + return treasuryFormValidator.validate(entity); } @Command diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/common/EntityEditorModel.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/common/EntityEditorModel.java index daeb6ef..ed8b666 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/common/EntityEditorModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/common/EntityEditorModel.java @@ -2,11 +2,12 @@ package hu.user.lis.ui.editor.common; import hu.user.lis.service.data.EntityDataService; import hu.user.lis.ui.editor.selector.EntitySelectorRouter; -import hu.user.lis.ui.editor.validate.FormFieldChecker; +import hu.user.lis.ui.editor.validator.FormValidator; import hu.user.lis.ui.event.EventBus; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; import org.zkoss.bind.BindUtils; import org.zkoss.bind.PropertyChangeEvent; import org.zkoss.bind.ValidationContext; @@ -22,7 +23,6 @@ import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.select.annotation.VariableResolver; import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zkplus.spring.DelegatingVariableResolver; -import org.zkoss.zul.Messagebox; import org.zkoss.zul.Window; import java.io.Serializable; @@ -78,9 +78,11 @@ public abstract class EntityEditorModel extends Abstract public void init() { eventBus.register(this); eventBus.registerForBinding(this); - origDocument = (T) Executions.getCurrent().getArg().get("origDocument"); formDocument = (T) Executions.getCurrent().getArg().get("formDocument"); + if (Objects.nonNull(getFormValidator())) { + getFormValidator().validate(getFormDocument()); + } } @Override @@ -105,6 +107,7 @@ public abstract class EntityEditorModel extends Abstract protected void validate(T entity) { boolean enable = areDifferent(entity) && canSave(entity); setSaveEnabled(enable); + BindUtils.postNotifyChange(this, "validationMessages"); } protected void validate() { @@ -126,20 +129,21 @@ public abstract class EntityEditorModel extends Abstract return false; } - @Command - public void onShowValidationMessages() { - if (Objects.nonNull(getFormChecker()) && Objects.nonNull(getFormChecker().getMessages())) { - if (getFormChecker().getMessages().isEmpty()) { - Messagebox.show("Az űrlap helyesen van kitöltve.", "Információ", Messagebox.OK, Messagebox.INFORMATION); + public String getValidationMessages() { + String result = StringUtils.EMPTY; + if (Objects.nonNull(getFormValidator()) && Objects.nonNull(getFormValidator().getMessages())) { + if (getFormValidator().getMessages().isEmpty()) { + result = "Az űrlap helyesen van kitöltve."; } else { StringBuilder builder = new StringBuilder(); - getFormChecker().getMessages().forEach(m -> builder.append(m).append("\r\n")); - Messagebox.show(builder.toString(), "Hiba", Messagebox.OK, Messagebox.ERROR); + getFormValidator().getMessages().forEach(m -> builder.append(m).append("
")); + result = builder.toString(); } } + return result; } - public FormFieldChecker getFormChecker() { + public FormValidator getFormValidator() { return null; } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/AssociateFormValidator.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/AssociateFormValidator.java new file mode 100644 index 0000000..4ffae56 --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/AssociateFormValidator.java @@ -0,0 +1,26 @@ +package hu.user.lis.ui.editor.validator; + +import hu.user.lis.db.Associate; +import org.springframework.stereotype.Component; + +@Component +public class AssociateFormValidator extends FormValidator { + + @Override + protected FieldValidation[] getValidators(Associate entity) { + return new FieldValidation[]{ + validator(entity.getName(), this::validateString, "A 'Név' kitöltése kötelező."), + validator(entity.getLogin(), this::validateString, "A 'Login' kitöltése kötelező."), + validator(entity, this::validatePassword, "A 'Jelszó' kitöltése kötelező."), + validator(entity.getMonthlyCost(), this::validateDouble, "A 'Havi önköltség' kitöltése kötelező.") + }; + } + + boolean validatePassword(Object data) { + if (data instanceof Associate) { + Associate entity = (Associate) data; + return entity.isRemotelyAuthenticated() || validateString(entity.getPassword()); + } + return false; + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/validate/FormFieldChecker.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/FormValidator.java similarity index 57% rename from lis-ui/src/main/java/hu/user/lis/ui/editor/validate/FormFieldChecker.java rename to lis-ui/src/main/java/hu/user/lis/ui/editor/validator/FormValidator.java index 7d2ecb9..955675a 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/validate/FormFieldChecker.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/FormValidator.java @@ -1,17 +1,16 @@ -package hu.user.lis.ui.editor.validate; +package hu.user.lis.ui.editor.validator; import lombok.Builder; import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.*; -public abstract class FormFieldChecker { - @Getter +@Getter +public abstract class FormValidator { private final List messages = new ArrayList<>(); protected FieldValidation validator(Object data, FieldValidator validator, String message) { @@ -37,7 +36,36 @@ public abstract class FormFieldChecker { return StringUtils.isNotBlank(String.valueOf(data)); } - boolean validateEntity(Object data) { + boolean validateDouble(Object data) { + if (Objects.isNull(data)) { + return false; + } + return ((double) data) > 0; + } + + boolean validateInt(Object data) { + if (Objects.isNull(data)) { + return false; + } + return ((int) data) > 0; + } + + boolean validateFirstDateIsBeforeOrEquals(Date firstDate, Date secondDate) { + if (Objects.isNull(firstDate) || Objects.isNull(secondDate)) { + return true; + } + LocalDate first = firstDate.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + + LocalDate second = secondDate.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + + return first.isBefore(second) || firstDate.equals(secondDate); + } + + boolean validateNotNull(Object data) { return Objects.nonNull(data); } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ImportInvoiceApproveFormValidator.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ImportInvoiceApproveFormValidator.java new file mode 100644 index 0000000..cbd950f --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ImportInvoiceApproveFormValidator.java @@ -0,0 +1,17 @@ +package hu.user.lis.ui.editor.validator; + +import hu.user.lis.db.Invoice; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.stereotype.Component; + +@Component +public class ImportInvoiceApproveFormValidator extends InvoiceFormValidator { + @Override + protected FieldValidation[] getValidators(Invoice entity) { + FieldValidation[] validators = new FieldValidation[]{ + validator(entity.getProject(), this::validateNotNull, "A 'Projekt' kitöltése kötelező."), + validator(entity.getFile(), this::validateNotNull, "A 'Számlakép' feltöltése kötelező.") + }; + return ArrayUtils.addAll(super.getValidators(entity), validators); + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ImportInvoiceAssignFormValidator.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ImportInvoiceAssignFormValidator.java new file mode 100644 index 0000000..f7cfb9c --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ImportInvoiceAssignFormValidator.java @@ -0,0 +1,18 @@ +package hu.user.lis.ui.editor.validator; + +import hu.user.lis.db.Invoice; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.stereotype.Component; + +@Component +public class ImportInvoiceAssignFormValidator extends InvoiceFormValidator { + + @Override + protected FieldValidation[] getValidators(Invoice entity) { + FieldValidation[] validators = new FieldValidation[]{ + validator(entity.getProject(), this::validateNotNull, "A 'Projekt' kitöltése kötelező."), + validator(entity.getFile(), this::validateNotNull, "A 'Számlakép' feltöltése kötelező.") + }; + return ArrayUtils.addAll(super.getValidators(entity), validators); + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/InvoiceFormValidator.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/InvoiceFormValidator.java new file mode 100644 index 0000000..8b199b4 --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/InvoiceFormValidator.java @@ -0,0 +1,83 @@ +package hu.user.lis.ui.editor.validator; + +import hu.user.lis.db.Invoice; +import org.springframework.stereotype.Component; + +@Component +public class InvoiceFormValidator extends FormValidator { + + @Override + protected FieldValidation[] getValidators(Invoice entity) { + return new FieldValidation[]{ + validator(entity.getTitle(), this::validateString, "Az 'Leírás' kitöltése kötelező."), + validator(entity.getPartner(), this::validateNotNull, "A 'Partner' kitöltése kötelező."), + validator(entity, this::validateHumanId, "A 'Sorszám' kitöltése kötelező."), + validator(entity.getCurrency(), this::validateNotNull, "A 'Pénznem' kitöltése kötelező."), + validator(entity.getNetAmount(), this::validateDouble, "A 'Nettó összeg' kitöltése kötelező."), + validator(entity.getGrossAmount(), this::validateDouble, "A 'Bruttó összeg' kitöltése kötelező."), + validator(entity.getVatAmount(), this::validateDouble, "Az 'ÁFA' kitöltése kötelező."), + validator(entity, this::validateCreateDate, "Az 'Kiállítás dátuma' kitöltése kötelező."), + validator(entity, this::validateCompletionDate, "A 'Teljesítés dátuma' kitöltése kötelező."), + validator(entity, this::validatePaymentDeadline, "A 'Fizetési határidő' kitöltése kötelező."), + validator(entity, this::validateCreateAndCompletionDates, "A 'Kiállítás dátuma' nem lehet később mint a 'Teljesítés dátuma'."), + validator(entity, this::validateCompletionAndPaymentDates, "A 'Teljesítés dátuma' nem lehet később mint a 'Fizetési határidő'."), + validator(entity, this::validateCreateAndPaymentDates, "A 'Kiállítás dátuma' nem lehet később mint a 'Fizetési határidő'."), + }; + } + + private boolean validateCreateAndPaymentDates(Object data) { + if (data instanceof Invoice) { + Invoice entity = (Invoice) data; + return validateFirstDateIsBeforeOrEquals(entity.getCreateDate(), entity.getPaymentDeadline()); + } + return false; + } + + private boolean validateCompletionAndPaymentDates(Object data) { + if (data instanceof Invoice) { + Invoice entity = (Invoice) data; + return validateFirstDateIsBeforeOrEquals(entity.getCompletionDate(), entity.getPaymentDeadline()); + } + return false; + } + + private boolean validateCreateAndCompletionDates(Object data) { + if (data instanceof Invoice) { + Invoice entity = (Invoice) data; + return validateFirstDateIsBeforeOrEquals(entity.getCreateDate(), entity.getCompletionDate()); + } + return false; + } + + private boolean validateHumanId(Object data) { + if (data instanceof Invoice) { + Invoice entity = (Invoice) data; + return entity.isPlanned() || validateString(entity.getHumanId()); + } + return false; + } + + private boolean validateCompletionDate(Object data) { + if (data instanceof Invoice) { + Invoice entity = (Invoice) data; + return entity.isPlanned() || validateNotNull(entity.getCompletionDate()); + } + return false; + } + + private boolean validateCreateDate(Object data) { + if (data instanceof Invoice) { + Invoice entity = (Invoice) data; + return entity.isPlanned() || validateString(entity.getCreateDate()); + } + return false; + } + + private boolean validatePaymentDeadline(Object data) { + if (data instanceof Invoice) { + Invoice entity = (Invoice) data; + return entity.isPlanned() || validateString(entity.getPaymentDeadline()); + } + return false; + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/PartnerFormValidator.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/PartnerFormValidator.java new file mode 100644 index 0000000..56a6d8a --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/PartnerFormValidator.java @@ -0,0 +1,34 @@ +package hu.user.lis.ui.editor.validator; + +import hu.user.lis.db.Partner; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.regex.Pattern; + +@Component +public class PartnerFormValidator extends FormValidator { + private static final String VAT_NR_PATTERN = "^\\d{8}-[1-5]-(0[2-9]|[1,3]\\d|20|2[2-9]|4[0-4]|51)$"; + private Pattern vatNrPattern; + + @PostConstruct + public void postConstruct() { + vatNrPattern = Pattern.compile(VAT_NR_PATTERN); + } + + @Override + protected FieldValidation[] getValidators(Partner entity) { + return new FieldValidation[]{ + validator(entity.getName(), this::validateString, "A 'Név' kitöltése kötelező."), + validator(entity.getVatNr(), this::validateVatNumber, "Az 'Adószám' kitöltése kötelező, formátuma: 12345678-1-01."), + validator(entity.getAddress(), this::validateString, "A 'Cím' kitöltése kötelező."), + }; + } + + private boolean validateVatNumber(Object data) { + if (data instanceof String) { + return vatNrPattern.matcher(String.valueOf(data)).matches(); + } + return false; + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/validate/ProjectFormChecker.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ProjectFormValidator.java similarity index 73% rename from lis-ui/src/main/java/hu/user/lis/ui/editor/validate/ProjectFormChecker.java rename to lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ProjectFormValidator.java index eeae9f8..991aeaa 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/editor/validate/ProjectFormChecker.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ProjectFormValidator.java @@ -1,4 +1,4 @@ -package hu.user.lis.ui.editor.validate; +package hu.user.lis.ui.editor.validator; import hu.user.lis.db.Project; import hu.user.lis.workflow.properties.WorkflowProperties; @@ -10,7 +10,7 @@ import java.util.Objects; import java.util.regex.Pattern; @Component -public class ProjectFormChecker extends FormFieldChecker { +public class ProjectFormValidator extends FormValidator { @Autowired private WorkflowProperties workflowProperties; @@ -31,10 +31,10 @@ public class ProjectFormChecker extends FormFieldChecker { @Override protected FieldValidation[] getValidators(Project entity) { return new FieldValidation[]{ - validator(entity.getHumanId(), this::validateHumanId, "Az azonosító kitöltése kötelező, formátuma 2023-0001."), - validator(entity.getName(), this::validateString, "A név kitöltése kötelező."), - validator(entity.getContactName(), this::validateString, "A kapcsolattartó kitöltése kötelező."), - validator(entity.getPartner(), this::validateEntity, "A partner kitöltése kötelező.") + validator(entity.getHumanId(), this::validateHumanId, "Az 'Azonosító' kitöltése kötelező, formátuma 2023-0001."), + validator(entity.getName(), this::validateString, "A 'Megnevezés' kitöltése kötelező."), + validator(entity.getPartner(), this::validateNotNull, "Az 'Ügyfél' kitöltése kötelező."), + validator(entity.getContactName(), this::validateString, "A 'Kapcsolattartó' kitöltése kötelező.") }; } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ServiceRecordFormValidator.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ServiceRecordFormValidator.java new file mode 100644 index 0000000..a9fd3a2 --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/ServiceRecordFormValidator.java @@ -0,0 +1,19 @@ +package hu.user.lis.ui.editor.validator; + +import hu.user.lis.db.ServiceRecord; +import org.springframework.stereotype.Component; + +@Component +public class ServiceRecordFormValidator extends FormValidator { + + @Override + protected FieldValidation[] getValidators(ServiceRecord entity) { + return new FieldValidation[]{ + validator(entity.getProject(), this::validateNotNull, "A 'Projekt' kitöltése kötelező."), + validator(entity.getAssociate(), this::validateNotNull, "A 'Munkatárs' kitöltése kötelező."), + validator(entity.getWorkDay(), this::validateNotNull, "A 'Munkanap' kitöltése kötelező."), + validator(entity.getWorkHours(), this::validateInt, "Az 'Óraszám' kitöltése kötelező."), + validator(entity.getDescription(), this::validateString, "Az 'Leírás' kitöltése kötelező."), + }; + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/TreasuryFormValidator.java b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/TreasuryFormValidator.java new file mode 100644 index 0000000..ddd5949 --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/editor/validator/TreasuryFormValidator.java @@ -0,0 +1,20 @@ +package hu.user.lis.ui.editor.validator; + +import hu.user.lis.db.Treasury; +import org.springframework.stereotype.Component; + +@Component +public class TreasuryFormValidator extends FormValidator { + + @Override + protected FieldValidation[] getValidators(Treasury entity) { + return new FieldValidation[]{ + validator(entity.getSellCurrency(), this::validateNotNull, "A 'Eladás/Pénznem' kitöltése kötelező."), + validator(entity.getSellAmount(), this::validateDouble, "A 'Eladás/Összeg' kitöltése kötelező."), + validator(entity.getBuyCurrency(), this::validateNotNull, "A 'Vétel/Pénznem' kitöltése kötelező."), + validator(entity.getBuyAmount(), this::validateDouble, "A 'Vétel/Összeg' kitöltése kötelező."), + validator(entity.getTransactionDate(), this::validateNotNull, "A 'Üzletkötés dátuma' kitöltése kötelező."), + validator(entity.getValueDate(), this::validateNotNull, "A 'Értéknap' kitöltése kötelező."), + }; + } +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/ApproveInvoicesViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/ApproveInvoicesViewModel.java index 197f852..c410c57 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/ApproveInvoicesViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/ApproveInvoicesViewModel.java @@ -2,7 +2,6 @@ package hu.user.lis.ui.view; import com.google.common.collect.ImmutableMap; import hu.user.lis.db.Invoice; -import hu.user.lis.db.Partner; import hu.user.lis.db.repository.InvoiceRepository; import hu.user.lis.db.repository.PartnerRepository; import hu.user.lis.ui.Constants; @@ -12,6 +11,7 @@ import hu.user.lis.ui.editor.common.Editors; import hu.user.lis.ui.event.EventBus; import hu.user.lis.ui.event.ProcessEventRouter; import hu.user.lis.ui.view.common.EntityViewModel; +import hu.user.lis.workflow.invoice.data.InvoiceImportStatus; import lombok.Getter; import lombok.extern.log4j.Log4j2; import org.springframework.transaction.annotation.Transactional; @@ -62,6 +62,7 @@ public class ApproveInvoicesViewModel extends EntityViewModel implem } @Init + @Override public void init() { super.init(); eventBus.registerForProcessEvent(this); @@ -85,17 +86,20 @@ public class ApproveInvoicesViewModel extends EntityViewModel implem editorWindow.addEventListener("onClose", e -> { if (Objects.nonNull(e.getData())) { Map results = (Map) e.getData(); - boolean approved = (boolean) results.get("approved"); - Invoice modifiedEntity = (Invoice) results.get("modifiedEntity"); - if (approved) { - Partner partner = modifiedEntity.getPartner(); - if (Objects.isNull(partner.getId())) { - partnerRepository.save(partner); - } + InvoiceImportStatus status = (InvoiceImportStatus) results.get("status"); + if (InvoiceImportStatus.APPROVE.equals(status)) { + Invoice modifiedEntity = (Invoice) results.get("modifiedEntity"); + modifiedEntity.setActive(true); invoiceRepository.save(modifiedEntity); + approveInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of( + "invoiceEntity", modifiedEntity, + "status", status + )); + } else { + approveInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of( + "status", status + )); } - approveInvoicesDataModel.completeTask(getSelectedEntity(), results); - onRefresh(); } }); editorWindow.doModal(); diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/AssignInvoicesViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/AssignInvoicesViewModel.java index f175f11..68d8e6c 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/AssignInvoicesViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/AssignInvoicesViewModel.java @@ -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.repository.InvoiceRepository; import hu.user.lis.ui.Constants; import hu.user.lis.ui.data.AssignInvoicesDataModel; import hu.user.lis.ui.data.common.CachedSpringDataModel; @@ -9,6 +10,7 @@ import hu.user.lis.ui.editor.common.Editors; import hu.user.lis.ui.event.EventBus; import hu.user.lis.ui.event.ProcessEventRouter; import hu.user.lis.ui.view.common.EntityViewModel; +import hu.user.lis.workflow.invoice.data.InvoiceImportStatus; import hu.user.lis.workflow.invoice.service.WorkflowManagerService; import lombok.Getter; import lombok.extern.log4j.Log4j2; @@ -25,6 +27,7 @@ import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zkplus.spring.DelegatingVariableResolver; import org.zkoss.zul.Window; +import javax.persistence.EntityNotFoundException; import java.util.List; import java.util.Map; import java.util.Objects; @@ -42,6 +45,9 @@ public class AssignInvoicesViewModel extends EntityViewModel impleme @WireVariable WorkflowManagerService workflowManagerService; + @WireVariable + InvoiceRepository invoiceRepository; + @WireVariable EventBus eventBus; @@ -72,24 +78,28 @@ public class AssignInvoicesViewModel extends EntityViewModel impleme @Command public void onHandleTask() { - Invoice entity = (Invoice) getSelectedEntity().get("invoiceEntity"); List projectSuggestions = (List) getSelectedEntity().get("projectSuggestions"); + Long invoiceId = (Long) getSelectedEntity().get("invoiceId"); + + Invoice entity = invoiceRepository.findById(invoiceId).orElseThrow(EntityNotFoundException::new); Map args = ImmutableMap.of("formDocument", entity, "projectSuggestions", projectSuggestions); -// Editors.doShowEdit(Editors.IMPORT_INVOICE_ASSIGN, args, (EditCompleted) modifiedEntity -> { -// assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of("invoiceEntity", modifiedEntity)); -// onRefresh(); -// }); Window editorWindow = (Window) Executions.createComponents(Editors.IMPORT_INVOICE_ASSIGN, null, args); editorWindow.addEventListener("onClose", e -> { if (Objects.nonNull(e.getData())) { Map results = (Map) e.getData(); - boolean invalid = (boolean) results.get("invalid"); - Invoice modifiedEntity = (Invoice) results.get("modifiedEntity"); - if (invalid) { - assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of("invalid", true)); + 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 { - assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of("invoiceEntity", modifiedEntity)); + assignInvoicesDataModel.completeTask(getSelectedEntity(), ImmutableMap.of( + "status", status + )); } onRefresh(); } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java index b7c86eb..240fef7 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java @@ -34,6 +34,7 @@ public class AssociatesViewModel extends FilterActiveViewModel { } @Init + @Override public void init() { super.init(); addColumns(ImmutableMap.of( diff --git a/lis-ui/src/main/resources/web/editor/associate-editor.zul b/lis-ui/src/main/resources/web/editor/associate-editor.zul index 9880950..8caeb05 100644 --- a/lis-ui/src/main/resources/web/editor/associate-editor.zul +++ b/lis-ui/src/main/resources/web/editor/associate-editor.zul @@ -61,6 +61,11 @@