Invoice import improved
authorVásáry Dániel <vasary@elgekko.net>
Tue, 23 Jan 2024 16:40:22 +0000 (17:40 +0100)
committerVásáry Dániel <vasary@elgekko.net>
Tue, 23 Jan 2024 16:40:22 +0000 (17:40 +0100)
lis-app/src/main/resources/application-dev.yaml
lis-app/src/main/resources/keystore/lis-keystore.jks
lis-app/src/main/resources/keystore/onlineszamla.nav.gov.hu.cer [new file with mode: 0644]
lis-app/src/test/java/hu/user/lis/service/dataimport/DataImportIT.java
lis-app/src/test/java/hu/user/lis/workflow/TaxOfficeInvoiceApiIT.java
lis-app/src/test/resources/application-test.yaml
lis-service/src/main/java/hu/user/lis/service/nav/InvoiceDataConvertException.java [new file with mode: 0644]
lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeDataConverter.java
lis-service/src/main/java/hu/user/lis/service/nav/TaxOfficeProperties.java
lis-service/src/main/java/hu/user/lis/service/nav/mapper/PartnerMapper.java

index 41de24ff86b5a7506ed794cb5bd129134ce561b8..3f67c178df02745e173270049a6c6b8d5e48a973 100644 (file)
@@ -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
index 70af892a4d89eb56210742885b8e409452a54569..d17ef8f53b625834537485c749cee652f8b2ae3d 100644 (file)
Binary files a/lis-app/src/main/resources/keystore/lis-keystore.jks and b/lis-app/src/main/resources/keystore/lis-keystore.jks differ
diff --git a/lis-app/src/main/resources/keystore/onlineszamla.nav.gov.hu.cer b/lis-app/src/main/resources/keystore/onlineszamla.nav.gov.hu.cer
new file mode 100644 (file)
index 0000000..6a70ce7
--- /dev/null
@@ -0,0 +1,45 @@
+-----BEGIN CERTIFICATE-----
+MIIIBjCCBu6gAwIBAgIOBIyN2pYlwYPS1fLPLgowDQYJKoZIhvcNAQELBQAweDEL
+MAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRYwFAYDVQQKDA1NaWNyb3Nl
+YyBMdGQuMR0wGwYDVQQDDBRlLVN6aWdubyBTU0wgQ0EgMjAxNDEfMB0GCSqGSIb3
+DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0yNDAxMDQxNDU1MDlaFw0yNTAyMDMx
+NDU1MDlaMIGTMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxJjAkBgNV
+BAoMHU5lbXpldGkgQWTDsy0gw6lzIFbDoW1oaXZhdGFsMSIwIAYDVQQDDBkqLm9u
+bGluZXN6YW1sYS5uYXYuZ292Lmh1MSUwIwYDVQQFExwxLjMuNi4xLjQuMS4yMTUy
+OC4yLjMuMi43MTY4MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi/fJ
+9quCAtFbb0ykMeVjmoHeJHUSuxRvL5LRoYteZd0MOqhXken+UAOA7asgrve/2trE
+Xyyl72ryMcXjMYTRR31Rub6ZdUDYI9IacBqtVevy2U70kCPBeGlzYJNNohPt/tly
+k6x+5kUC/Yz67h7j/vS9NIjsBmURs9d5WErFlbbky+HLDQQeTSRu/rQGTtrc+XiR
+QLr19AapjLusLpwe5DvKIqWf/C5FlEtZE9dxYAjw87Bz/hMzhfVLvrZ9ee8nZHnG
+rqsEoGLVSZqq6P5jXbIQTiza+Wt3TjvnZIKSfb007jrx8P3kEUD4OOIy7B/xqIH4
+C9S7V7Ec4NH6ENvOkwIDAQABo4IEcDCCBGwwDgYDVR0PAQH/BAQDAgWgMIIBfQYK
+KwYBBAHWeQIEAgSCAW0EggFpAWcAdgBVgdTCFpA2AUrqC5tXPFPwwOQ4eHAlCBcv
+o6odBxPTDAAAAYzU+JSNAAAEAwBHMEUCIQC/PE7t2nBoNdhjltU9UqXjhPa/i6uU
+P1DtlSwlOcIIVAIgN/viUsGhpFK4HKJL8qI7uPJCstLD95JC6cUNvMGLiRMAdQDg
+krP8DB3I52g2H95huZZNClJ4GYpy1nLEsE2lbW9UBAAAAYzU+JouAAAEAwBGMEQC
+IH+wLzqGoiJ6riN//4qVyyU5zQlOzeX/RyMt15OkJkMOAiAV5DHvocQTdKwUfkmQ
+yUyiP0PifhET8RnhxQSoRBsyOwB2AE51oydcmhDDOFts1N8/Uusd8OCOG41pwLH6
+ZLFimjnfAAABjNT4pBwAAAQDAEcwRQIgZt/zGovN/nf1oMzDDcEo6Nh1kO+GAMXQ
+p757sijsrLYCIQCOxEjR+dm/dx3dbQcnLYWO3xorFxo3f2y8cKqBmRGJgjAdBgNV
+HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwLgYDVR0gBCcwJTAPBg0rBgEEAYGo
+GAIBAYEfMAgGBgQAj3oBBzAIBgZngQwBAgIwHQYDVR0OBBYEFM9IlXSOaiqsfmYJ
+b0Oqqj/Q941PMB8GA1UdIwQYMBaAFN5qsE5DqghBR3S/pYqBVEwgxXUoMD0GA1Ud
+EQQ2MDSCF29ubGluZXN6YW1sYS5uYXYuZ292Lmh1ghkqLm9ubGluZXN6YW1sYS5u
+YXYuZ292Lmh1MIGwBgNVHR8EgagwgaUwNaAzoDGGL2h0dHA6Ly9zc2xjYTIwMTQt
+Y3JsMS5lLXN6aWduby5odS9zc2xjYTIwMTQuY3JsMDWgM6Axhi9odHRwOi8vc3Ns
+Y2EyMDE0LWNybDIuZS1zemlnbm8uaHUvc3NsY2EyMDE0LmNybDA1oDOgMYYvaHR0
+cDovL3NzbGNhMjAxNC1jcmwzLmUtc3ppZ25vLmh1L3NzbGNhMjAxNC5jcmwwggFW
+BggrBgEFBQcBAQSCAUgwggFEMC4GCCsGAQUFBzABhiJodHRwOi8vc3NsY2EyMDE0
+LW9jc3AxLmUtc3ppZ25vLmh1MC4GCCsGAQUFBzABhiJodHRwOi8vc3NsY2EyMDE0
+LW9jc3AyLmUtc3ppZ25vLmh1MC4GCCsGAQUFBzABhiJodHRwOi8vc3NsY2EyMDE0
+LW9jc3AzLmUtc3ppZ25vLmh1MDoGCCsGAQUFBzAChi5odHRwOi8vc3NsY2EyMDE0
+LWNhMS5lLXN6aWduby5odS9zc2xjYTIwMTQuY3J0MDoGCCsGAQUFBzAChi5odHRw
+Oi8vc3NsY2EyMDE0LWNhMi5lLXN6aWduby5odS9zc2xjYTIwMTQuY3J0MDoGCCsG
+AQUFBzAChi5odHRwOi8vc3NsY2EyMDE0LWNhMy5lLXN6aWduby5odS9zc2xjYTIw
+MTQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQC/T+6xt7Cyggg4qcqW7tkzwMqFZeGt
+/g7h4u/wn0qthXpiWq60gAHENX+vGHDakSOiFPKJJb97DnrnEQocge08v7BuVr7Q
+ZVhgedQN0EBdu8rM13G8Csk6op1L5iUPHaev8hKsWb6uKQ/r5iewH2B8+2wxRhEr
+/43SQWPPWIoHFKZai31WJt9EFv7lrC6qoRkMmemw6DDreUwLz64KWw79PbTqbI9V
+hGdsztM3Tk6qb7CV4bIL0tWmk9x4DifwlQsSlGDjtNdYjW7ThrII5cbmYSArozuL
+lIXoRnKbwCKSUkpR6wpPZLb5QmZvXtZpj6Qyen9+BC2x2WJatRHFV5fX
+-----END CERTIFICATE-----
index c66bd681c8620755300a1280ce71121bd89f65db..baacc405ce0583eaf83e00b1239f44e4abbde990 100644 (file)
@@ -10,8 +10,6 @@ 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)
@@ -55,7 +53,7 @@ public class DataImportIT {
         projectRepository.deleteAllInBatch();
         partnerRepository.deleteAllInBatch();
 
-        dataImportService.importData(Paths.get("c:/work/_spec/slycrm/2024/dataimport.xlsx"));
+//        dataImportService.importData(Paths.get("c:/work/_spec/slycrm/2024/dataimport.xlsx"));
     }
 
 }
index a5195c1378c2f7d7b0c938658053482ac66fb5d1..1c4b588f61ed13910543e11ca5ef700ceec61532 100644 (file)
@@ -10,6 +10,7 @@ import hu.gov.nav.schemas.ntca._1_0.common.FunctionCodeType;
 import hu.gov.nav.schemas.osa._3_0.api.*;
 import hu.gov.nav.schemas.osa._3_0.data.InvoiceData;
 import hu.user.lis.service.nav.TaxOfficeInvoiceService;
+import hu.user.lis.service.nav.TaxOfficeProperties;
 import hu.user.lis.service.nav.TaxOfficeRequestBuilder;
 import hu.user.lis.service.nav.TaxOfficeXmlConverter;
 import io.netty.channel.ChannelOption;
@@ -27,7 +28,6 @@ import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.http.client.reactive.ReactorClientHttpConnector;
 import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.reactive.function.client.WebClient;
@@ -46,11 +46,12 @@ import java.util.concurrent.TimeUnit;
 @Log4j2
 @SpringBootTest
 @RunWith(SpringRunner.class)
-@ActiveProfiles("dev")
+@ActiveProfiles("test")
 @ComponentScan("hu.user.lis")
-@TestPropertySource("classpath:application-dev.yaml")
+//@TestPropertySource("classpath:application-test.yaml")
 public class TaxOfficeInvoiceApiIT {
-    public static final String API_URL = "https://api-test.onlineszamla.nav.gov.hu/invoiceService/v3";
+    @Autowired
+    TaxOfficeProperties properties;
 
     @Autowired
     RestTemplate restTemplate;
@@ -83,7 +84,7 @@ public class TaxOfficeInvoiceApiIT {
 
         HttpEntity<String> request = new HttpEntity<>(taxOfficeXmlConverter.toXml(queryRequest), headers);
         try {
-            ResponseEntity<String> response = restTemplate.postForEntity(API_URL + "/queryInvoiceDigest", request, String.class);
+            ResponseEntity<String> 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<WebClient.RequestBodySpec> 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())
index 4f6703ec1d9a9deae8a0557ecbd4bf1826754e63..76691f69a81d59c16173cd3589ad3ec6572c6409 100644 (file)
@@ -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 (file)
index 0000000..8473998
--- /dev/null
@@ -0,0 +1,4 @@
+package hu.user.lis.service.nav;
+
+public class InvoiceDataConvertException extends NullPointerException {
+}
index 2f9802b3563f15f2ea17e4fab8e318a8457d5161..287577da98ce3532e01604bb86e9ba4fef13ed90 100644 (file)
@@ -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);
     }
 
index 150d6ce4473b9a790d2714d6a664bae7be68e132..87e594085f18443765ac28f096d55513809f7925 100644 (file)
@@ -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;
index e0fba9501d3ab30991718caf3e619ca0ec691930..46aae8b206c3928034d3fa96be3ea70ee1c00d95 100644 (file)
@@ -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