From: Vásáry Dániel Date: Tue, 23 Jan 2024 16:40:22 +0000 (+0100) Subject: Invoice import improved X-Git-Url: http://git.useribm.hu/?a=commitdiff_plain;h=1d6551b8853ba60fe08411ac20d33bf730cd2d2b;p=sly-crm.git Invoice import improved --- 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 70af892..d17ef8f 100644 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 index 0000000..6a70ce7 --- /dev/null +++ b/lis-app/src/main/resources/keystore/onlineszamla.nav.gov.hu.cer @@ -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----- diff --git a/lis-app/src/test/java/hu/user/lis/service/dataimport/DataImportIT.java b/lis-app/src/test/java/hu/user/lis/service/dataimport/DataImportIT.java index c66bd68..baacc40 100644 --- a/lis-app/src/test/java/hu/user/lis/service/dataimport/DataImportIT.java +++ b/lis-app/src/test/java/hu/user/lis/service/dataimport/DataImportIT.java @@ -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")); } } 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 a5195c1..1c4b588 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 @@ -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 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