From 1d6551b8853ba60fe08411ac20d33bf730cd2d2b Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Tue, 23 Jan 2024 17:40:22 +0100 Subject: [PATCH] Invoice import improved --- .../src/main/resources/application-dev.yaml | 23 ++++++--- .../main/resources/keystore/lis-keystore.jks | Bin 2593 -> 4687 bytes .../keystore/onlineszamla.nav.gov.hu.cer | 45 ++++++++++++++++++ .../lis/service/dataimport/DataImportIT.java | 4 +- .../lis/workflow/TaxOfficeInvoiceApiIT.java | 15 +++--- .../src/test/resources/application-test.yaml | 27 +++++++---- .../nav/InvoiceDataConvertException.java | 4 ++ .../service/nav/TaxOfficeDataConverter.java | 8 ++-- .../lis/service/nav/TaxOfficeProperties.java | 2 + .../lis/service/nav/mapper/PartnerMapper.java | 36 ++++++++++---- 10 files changed, 128 insertions(+), 36 deletions(-) create mode 100644 lis-app/src/main/resources/keystore/onlineszamla.nav.gov.hu.cer create mode 100644 lis-service/src/main/java/hu/user/lis/service/nav/InvoiceDataConvertException.java diff --git a/lis-app/src/main/resources/application-dev.yaml b/lis-app/src/main/resources/application-dev.yaml index 41de24f..3f67c17 100644 --- a/lis-app/src/main/resources/application-dev.yaml +++ b/lis-app/src/main/resources/application-dev.yaml @@ -66,14 +66,25 @@ service: trust: store: classpath:keystore/lis-keystore.jks store.password: password + # api: + # url: https://api-test.onlineszamla.nav.gov.hu/invoiceService/v3 + # user: vkvyibj5xgqpbp0 + # password: Salabakt3r + # 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 api: - url: https://api-test.onlineszamla.nav.gov.hu/invoiceService/v3 - user: vkvyibj5xgqpbp0 + url: https://api.onlineszamla.nav.gov.hu/invoiceService/v3 + user: ddoz0z29mmzw2kl password: Salabakt3r - sign-key: fe-9d8b-971c878376204BQEWTHH2HI6 - exchange-key: 3af24BQEWTHH4TSX + sign-key: 78-bfed-07fd8f1685104GC07C82GM3G + exchange-key: 1f414GC07C82IBNV sender-tax-number: 13364937 - sender-company: User Rendszerház Kft. + sender-company: ELGEKKO MŰHELY SZOLGÁLTATÓ KORLÁTOLT FELELŐSSÉGŰ TÁRSASÁG sender-country: HU sender-contact: Kovács Géza - days-range: 34 \ No newline at end of file + days-range: 34 diff --git a/lis-app/src/main/resources/keystore/lis-keystore.jks b/lis-app/src/main/resources/keystore/lis-keystore.jks index 70af892a4d89eb56210742885b8e409452a54569..d17ef8f53b625834537485c749cee652f8b2ae3d 100644 GIT binary patch delta 785 zcmV+s1Md8x6wf3K{_Xzl0000200002u?ztUKmY&$0ssqcVRkKPZgy{JV`TsU0gW~X z$9Mn*SS~d%IRF3%3NV5Q1~7sK?w|t#0RjRJ1dNT^mLi?HP~a8)jd+Bs7BQ0C#SOf{i-{8ebpYU!v-}Jl$meJ_AKqcPmQ4y$co~Xv z)^fzKO{HybR0IG30gTl6nl1nUe*^;nMleJIAb+qgI)T zclDsm!wtbG=-73T?}h-y(5Jq8vMB7VwgMplj>JgO`PsjB9o=mQCoP4J-x@0y8aIDz zyl|?4nGuPClSl+08!iR|RUIG%Com;24+ae@1_1;Cfv6Y)0Re#@vsnhT0)M|x?y{Wt%Z7GTCTK!0mL request = new HttpEntity<>(taxOfficeXmlConverter.toXml(queryRequest), headers); try { - ResponseEntity response = restTemplate.postForEntity(API_URL + "/queryInvoiceDigest", request, String.class); + ResponseEntity response = restTemplate.postForEntity(properties.getUrl() + "/queryInvoiceDigest", request, String.class); System.out.println(taxOfficeXmlConverter.toXml(response)); } catch (Exception e) { log.error(e); @@ -97,7 +98,7 @@ public class TaxOfficeInvoiceApiIT { queryRequest.setInvoiceDirection(InvoiceDirectionType.INBOUND); queryRequest.setInvoiceQueryParams(taxOfficeRequestBuilder.params(34)); - WebClient client = WebClient.create(API_URL); + WebClient client = WebClient.create(properties.getUrl()); WebClient.UriSpec uriSpec = client.post(); WebClient.RequestBodySpec bodySpec = uriSpec.uri("/queryInvoiceDigest"); WebClient.RequestHeadersSpec headersSpec = bodySpec.bodyValue(taxOfficeXmlConverter.toXml(queryRequest)); @@ -133,7 +134,7 @@ public class TaxOfficeInvoiceApiIT { WebClient client = webClientBuilder .clientConnector(new ReactorClientHttpConnector(httpClient)) - .baseUrl(API_URL) + .baseUrl(properties.getUrl()) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_VALUE) .defaultHeader(HttpHeaders.ACCEPT_CHARSET, StandardCharsets.UTF_8.toString()) diff --git a/lis-app/src/test/resources/application-test.yaml b/lis-app/src/test/resources/application-test.yaml index 4f6703e..76691f6 100644 --- a/lis-app/src/test/resources/application-test.yaml +++ b/lis-app/src/test/resources/application-test.yaml @@ -20,7 +20,7 @@ spring: enabled: always datasource: type: com.zaxxer.hikari.HikariDataSource - url: jdbc:db2://dvdev.in.useribm.hu:50000/lis + url: jdbc:db2://localhost:50000/slycrm username: db2admin password: password camunda.bpm: @@ -86,13 +86,24 @@ service: store: classpath:keystore/lis-keystore.jks store.password: password api: - url: https://api-test.onlineszamla.nav.gov.hu/invoiceService/v3 - user: vkvyibj5xgqpbp0 - password: Salabakt3r - sign-key: fe-9d8b-971c878376204BQEWTHH2HI6 - exchange-key: 3af24BQEWTHH4TSX + url: https://api.onlineszamla.nav.gov.hu/invoiceService/v3 + user: 2ws6sjlwdldekwx + password: RQnfkpcqKv+4NC!P6t-GV2X85 + sign-key: 17-a39e-a14aa51723854GALPHFMDZ5C + exchange-key: 5ee84GALPHFMFBIZ sender-tax-number: 13364937 - sender-company: User Rendszerház Kft. + sender-company: USER RENDSZERHÁZ Informatikai Korlátolt Felelősségű Társaság sender-country: HU sender-contact: Kovács Géza - days-range: 34 \ No newline at end of file + days-range: 34 +# api: +# url: https://api.onlineszamla.nav.gov.hu/invoiceService/v3 +# user: ddoz0z29mmzw2kl +# password: Salabakt3r +# sign-key: 78-bfed-07fd8f1685104GC07C82GM3G +# exchange-key: 1f414GC07C82IBNV +# sender-tax-number: 13364937 +# sender-company: ELGEKKO MŰHELY SZOLGÁLTATÓ KORLÁTOLT FELELŐSSÉGŰ TÁRSASÁG +# sender-country: HU +# sender-contact: Kovács Géza +# days-range: 34 diff --git a/lis-service/src/main/java/hu/user/lis/service/nav/InvoiceDataConvertException.java b/lis-service/src/main/java/hu/user/lis/service/nav/InvoiceDataConvertException.java new file mode 100644 index 0000000..8473998 --- /dev/null +++ b/lis-service/src/main/java/hu/user/lis/service/nav/InvoiceDataConvertException.java @@ -0,0 +1,4 @@ +package hu.user.lis.service.nav; + +public class InvoiceDataConvertException extends NullPointerException { +} diff --git a/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeDataConverter.java b/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeDataConverter.java index 2f9802b..287577d 100644 --- a/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeDataConverter.java +++ b/lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeDataConverter.java @@ -25,24 +25,24 @@ public class TaxOfficeDataConverter { TaxOfficeXmlConverter taxOfficeXmlConverter; public Partner getPartner(Path file) { - InvoiceData invoiceData = taxOfficeXmlConverter.fromFile(file, InvoiceData.class).orElseThrow(NullPointerException::new); + InvoiceData invoiceData = taxOfficeXmlConverter.fromFile(file, InvoiceData.class).orElseThrow(InvoiceDataConvertException::new); SupplierInfoType supplierInfo = invoiceData.getInvoiceMain().getInvoice().getInvoiceHead().getSupplierInfo(); return partnerMapper.toEntity(supplierInfo); } public Partner getPartner(String xml) { - InvoiceData invoiceData = taxOfficeXmlConverter.fromXml(xml, InvoiceData.class).orElseThrow(NullPointerException::new); + InvoiceData invoiceData = taxOfficeXmlConverter.fromXml(xml, InvoiceData.class).orElseThrow(InvoiceDataConvertException::new); SupplierInfoType supplierInfo = invoiceData.getInvoiceMain().getInvoice().getInvoiceHead().getSupplierInfo(); return partnerMapper.toEntity(supplierInfo); } public IncomingInvoice getIncomingInvoice(Path file) { - InvoiceData invoiceData = taxOfficeXmlConverter.fromFile(file, InvoiceData.class).orElseThrow(NullPointerException::new); + InvoiceData invoiceData = taxOfficeXmlConverter.fromFile(file, InvoiceData.class).orElseThrow(InvoiceDataConvertException::new); return invoiceMapper.toEntity(invoiceData); } public IncomingInvoice getIncomingInvoice(String xml) { - InvoiceData invoiceData = taxOfficeXmlConverter.fromXml(xml, InvoiceData.class).orElseThrow(NullPointerException::new); + InvoiceData invoiceData = taxOfficeXmlConverter.fromXml(xml, InvoiceData.class).orElseThrow(InvoiceDataConvertException::new); return invoiceMapper.toEntity(invoiceData); } 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 index 150d6ce..87e5940 100644 --- 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 @@ -11,6 +11,8 @@ import org.springframework.stereotype.Component; @ConfigurationProperties(prefix = "service.nav.api") public class TaxOfficeProperties { + private String url; + private String user; private String password; diff --git a/lis-service/src/main/java/hu/user/lis/service/nav/mapper/PartnerMapper.java b/lis-service/src/main/java/hu/user/lis/service/nav/mapper/PartnerMapper.java index e0fba95..46aae8b 100644 --- a/lis-service/src/main/java/hu/user/lis/service/nav/mapper/PartnerMapper.java +++ b/lis-service/src/main/java/hu/user/lis/service/nav/mapper/PartnerMapper.java @@ -1,6 +1,7 @@ package hu.user.lis.service.nav.mapper; import hu.gov.nav.schemas.osa._3_0.base.DetailedAddressType; +import hu.gov.nav.schemas.osa._3_0.base.SimpleAddressType; import hu.gov.nav.schemas.osa._3_0.base.TaxNumberType; import hu.gov.nav.schemas.osa._3_0.data.SupplierInfoType; import hu.user.lis.db.Partner; @@ -9,10 +10,12 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; +import java.util.Objects; + @Mapper(componentModel = "spring") public interface PartnerMapper { String ADDRESS_FORMAT = "%s %s, %s %s %s"; - String VAT_NR_FORMAT = "%s-%s-%s"; + String SIMPLE_ADDRESS_FORMAT = "%s %s, %s"; @Mapping(target = "id", ignore = true) @Mapping(target = "address", ignore = true) @@ -24,14 +27,31 @@ public interface PartnerMapper { @AfterMapping default void setPartnerCompositeFields(@MappingTarget Partner.PartnerBuilder builder, SupplierInfoType source) { + TaxNumberType supplierTaxNumber = source.getSupplierTaxNumber(); + if (Objects.nonNull(supplierTaxNumber)) { + String vatNr = supplierTaxNumber.getTaxpayerId(); + if (Objects.nonNull(supplierTaxNumber.getVatCode())) { + vatNr += "-" + supplierTaxNumber.getVatCode(); + } + if (Objects.nonNull(supplierTaxNumber.getCountyCode())) { + vatNr += "-" + supplierTaxNumber.getCountyCode(); + } + builder.vatNr(vatNr); + } + DetailedAddressType detailedAddress = source.getSupplierAddress().getDetailedAddress(); - String address = String.format(ADDRESS_FORMAT, detailedAddress.getCity(), detailedAddress.getPostalCode(), - detailedAddress.getStreetName(), detailedAddress.getPublicPlaceCategory(), detailedAddress.getNumber()); - builder.address(address); - TaxNumberType supplierTaxNumber = source.getSupplierTaxNumber(); - String vatNr = String.format(VAT_NR_FORMAT, supplierTaxNumber.getTaxpayerId(), supplierTaxNumber.getVatCode(), - supplierTaxNumber.getCountyCode()); - builder.vatNr(vatNr); + if (Objects.nonNull(detailedAddress)) { + String address = String.format(ADDRESS_FORMAT, detailedAddress.getCity(), detailedAddress.getPostalCode(), + detailedAddress.getStreetName(), detailedAddress.getPublicPlaceCategory(), detailedAddress.getNumber()); + builder.address(address); + } else { + SimpleAddressType simpleAddress = source.getSupplierAddress().getSimpleAddress(); + if (Objects.nonNull(simpleAddress)) { + String address = String.format(SIMPLE_ADDRESS_FORMAT, simpleAddress.getCity(), simpleAddress.getPostalCode(), + simpleAddress.getAdditionalAddressDetail()); + builder.address(address); + } + } } } \ No newline at end of file -- 2.54.0