diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SokosRequest.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SokosRequest.java index 4c8db13f8ee..ce1dea330b4 100644 --- a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SokosRequest.java +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SokosRequest.java @@ -4,7 +4,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.val; @Data @Builder @@ -13,6 +12,6 @@ public class SokosRequest { private String fnr; - private Integer inntektsar; + private String inntektsar; private String skattekort; -} +} \ No newline at end of file diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/service/SkattekortService.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/service/SkattekortService.java index 5e3c903eeb6..495498e94a8 100644 --- a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/service/SkattekortService.java +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/service/SkattekortService.java @@ -8,16 +8,14 @@ import no.nav.skattekortservice.consumer.SokosSkattekortConsumer; import no.nav.skattekortservice.dto.SkattekortRequest; import no.nav.skattekortservice.dto.SokosRequest; +import no.nav.skattekortservice.utility.SkattekortValidator; import no.nav.testnav.libs.dto.skattekortservice.v1.SkattekortTilArbeidsgiverDTO; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import org.springframework.web.server.ResponseStatusException; import reactor.core.publisher.Mono; import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.util.Base64; -import java.util.Collection; @Slf4j @Service @@ -37,7 +35,8 @@ public SkattekortService(MapperFacade mapperFacade, @SneakyThrows public Mono sendSkattekort(SkattekortTilArbeidsgiverDTO skattekort) { - validate(skattekort); + SkattekortValidator.validate(skattekort); + var arbeidstaker = skattekort.getArbeidsgiver().getFirst() .getArbeidstaker().getFirst(); @@ -48,7 +47,7 @@ public Mono sendSkattekort(SkattekortTilArbeidsgiverDTO skattekort) { .doOnNext(encodedXml -> log.info("Base64 encoded request: {}", encodedXml)) .map(encodedXml -> SokosRequest.builder() .fnr(arbeidstaker.getArbeidstakeridentifikator()) - .inntektsar(arbeidstaker.getInntektsaar()) + .inntektsar(arbeidstaker.getInntektsaar().toString()) .skattekort(encodedXml) .build()) .flatMap(skattekortConsumer::sendSkattekort); @@ -70,23 +69,4 @@ private String encodeRequest(String request) { return Base64.getEncoder() .encodeToString(request.getBytes(StandardCharsets.UTF_8)); } - - private static void validate(SkattekortTilArbeidsgiverDTO skattekort) { - - skattekort.getArbeidsgiver().stream() - .map(SkattekortTilArbeidsgiverDTO.Arbeidsgiver::getArbeidstaker) - .flatMap(Collection::stream) - .map(SkattekortTilArbeidsgiverDTO.Skattekortmelding::getSkattekort) - .map(SkattekortTilArbeidsgiverDTO.Skattekort::getTrekktype) - .flatMap(Collection::stream) - .forEach(trekktype -> { - if (trekktype.isAllEmpty()) { - throw new ResponseStatusException(HttpStatus.BAD_REQUEST, - "En av Forskuddstrekk, Frikort, Trekkprosent og Trekktabell må angis per trekktype"); - } else if (trekktype.isAmbiguous()) { - throw new ResponseStatusException(HttpStatus.BAD_REQUEST, - "Kun én av Forskuddstrekk, Frikort, Trekkprosent og Trekktabell kan angis per trekktype"); - } - }); - } } diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/utility/SkattekortValidator.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/utility/SkattekortValidator.java new file mode 100644 index 00000000000..24b69991512 --- /dev/null +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/utility/SkattekortValidator.java @@ -0,0 +1,74 @@ +package no.nav.skattekortservice.utility; + +import lombok.experimental.UtilityClass; +import no.nav.testnav.libs.dto.skattekortservice.v1.SkattekortTilArbeidsgiverDTO; +import org.springframework.http.HttpStatus; +import org.springframework.web.server.ResponseStatusException; + +import java.util.Collection; + +@UtilityClass +public class SkattekortValidator { + + public static void validate(SkattekortTilArbeidsgiverDTO skattekort) { + + validateArbeidsgiver(skattekort); + + validateArbeidstager(skattekort); + + validateSkattekort(skattekort); + } + + private static void validateSkattekort(SkattekortTilArbeidsgiverDTO skattekort) { + + skattekort.getArbeidsgiver().stream() + .map(SkattekortTilArbeidsgiverDTO.Arbeidsgiver::getArbeidstaker) + .flatMap(Collection::stream) + .map(SkattekortTilArbeidsgiverDTO.Skattekortmelding::getSkattekort) + .map(SkattekortTilArbeidsgiverDTO.Skattekort::getTrekktype) + .flatMap(Collection::stream) + .forEach(trekktype -> { + if (trekktype.isAllEmpty()) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, + "En av Forskuddstrekk, Frikort, Trekkprosent og Trekktabell må angis per trekktype"); + } else if (trekktype.isAmbiguous()) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, + "Kun én av Forskuddstrekk, Frikort, Trekkprosent og Trekktabell kan angis per trekktype"); + } + }); + } + + private static void validateArbeidstager(SkattekortTilArbeidsgiverDTO skattekort) { + + skattekort.getArbeidsgiver().stream() + .map(SkattekortTilArbeidsgiverDTO.Arbeidsgiver::getArbeidstaker) + .flatMap(Collection::stream) + .forEach(arbeidstaker -> { + if (arbeidstaker.isEmptyArbeidstakeridentifikator()) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, + "Arbeidstakeridentifikator må være satt"); + } else if (arbeidstaker.isEmptyInntektsaar()) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, + "Inntektsår må være satt"); + } + }); + } + + private static void validateArbeidsgiver(SkattekortTilArbeidsgiverDTO skattekort) { + + skattekort.getArbeidsgiver().stream() + .map(SkattekortTilArbeidsgiverDTO.Arbeidsgiver::getArbeidsgiveridentifikator) + .forEach(arbeidsgiver -> { + if (arbeidsgiver.isAllEmpty()) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, + "arbeidsgiveridentifikator må inneholde enten " + + "organisasjonsnummer eller personidentifikator"); + + } else if (arbeidsgiver.isAmbiguous()) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, + "arbeidsgiveridentifikator er uklar, " + + "både organisasjonsnummer og personidentifikator er angitt"); + } + }); + } +} diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/SkattekortTilArbeidsgiverDTO.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/SkattekortTilArbeidsgiverDTO.java index 98eb5ab061d..ff09ed15a8f 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/SkattekortTilArbeidsgiverDTO.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/SkattekortTilArbeidsgiverDTO.java @@ -1,5 +1,6 @@ package no.nav.testnav.libs.dto.skattekortservice.v1; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -10,6 +11,8 @@ import java.util.List; import static java.util.Objects.isNull; +import static org.apache.commons.lang3.StringUtils.isBlank; +import static org.apache.commons.lang3.StringUtils.isNotBlank; @Data @Builder @@ -64,6 +67,18 @@ public List getTilleggsopplysning() { } return tilleggsopplysning; } + + @JsonIgnore + public boolean isEmptyArbeidstakeridentifikator() { + + return isBlank(arbeidstakeridentifikator); + } + + @JsonIgnore + public boolean isEmptyInntektsaar() { + + return isNull(inntektsaar); + } } @Data @@ -74,6 +89,20 @@ public static class IdentifikatorForEnhetEllerPerson { private String organisasjonsnummer; private String personidentifikator; + + @JsonIgnore + public boolean isAllEmpty() { + + return isBlank(organisasjonsnummer) && + isBlank(personidentifikator); + } + + @JsonIgnore + public boolean isAmbiguous() { + + return isNotBlank(organisasjonsnummer) && + isNotBlank(personidentifikator); + } } @Data