diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/SkattekortServiceApplicationStarter.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/SkattekortServiceApplicationStarter.java index 1c714ebb8b7..0d5a91d6a10 100644 --- a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/SkattekortServiceApplicationStarter.java +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/SkattekortServiceApplicationStarter.java @@ -10,4 +10,4 @@ public static void main(String[] args) { SpringApplication.run(SkattekortServiceApplicationStarter.class, args); } -} +} \ No newline at end of file diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SkattekortResponsIntermediate.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SkattekortResponsIntermediate.java index dcf4a91927e..efeef1ffbc1 100644 --- a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SkattekortResponsIntermediate.java +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SkattekortResponsIntermediate.java @@ -1,11 +1,15 @@ package no.nav.skattekortservice.dto; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; +import lombok.experimental.SuperBuilder; import no.nav.testnav.libs.dto.skattekortservice.v1.IdentifikatorForEnhetEllerPerson; import java.time.LocalDate; @@ -88,9 +92,6 @@ public static class Skattekort { private LocalDate utstedtDato; private Long skattekortidentifikator; private List forskuddstrekk; - private List frikort; - private List trekktabell; - private List trekkprosent; public List getForskuddstrekk() { @@ -99,59 +100,40 @@ public List getForskuddstrekk() { } return forskuddstrekk; } - - public List getFrikort() { - - if (isNull(frikort)) { - frikort = new ArrayList<>(); - } - return frikort; - } - - public List getTrekktabell() { - - if (isNull(trekktabell)) { - trekktabell = new ArrayList<>(); - } - return trekktabell; - } - - public List getTrekkprosent() { - - if (isNull(trekkprosent)) { - trekkprosent = new ArrayList<>(); - } - return trekkprosent; - } } @Data - @Builder + @SuperBuilder @NoArgsConstructor @AllArgsConstructor - public static class Forskuddstrekk { + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "xsi:type") + @JsonSubTypes({ + @JsonSubTypes.Type(value = Frikort.class, name = "Frikort"), + @JsonSubTypes.Type(value = Trekktabell.class, name = "Trekktabell"), + @JsonSubTypes.Type(value = Trekkprosent.class, name = "Trekkprosent") + }) + public abstract static class Forskuddstrekk { private Trekkode trekkode; + private String type; } + @EqualsAndHashCode(callSuper = true) @Data - @Builder + @SuperBuilder @NoArgsConstructor @AllArgsConstructor - public static class Frikort { - - private Trekkode trekkode; + public static class Frikort extends Forskuddstrekk { private Integer frikortbeloep; } + @EqualsAndHashCode(callSuper = true) @Data - @Builder + @SuperBuilder @NoArgsConstructor @AllArgsConstructor - public static class Trekktabell { - - private Trekkode trekkode; + public static class Trekktabell extends Forskuddstrekk { private Tabelltype tabelltype; private String tabellnummer; @@ -159,11 +141,12 @@ public static class Trekktabell { private Integer antallMaanederForTrekk; } + @EqualsAndHashCode(callSuper = true) @Data - @Builder + @SuperBuilder @NoArgsConstructor @AllArgsConstructor - public static class Trekkprosent { + public static class Trekkprosent extends Forskuddstrekk { private Trekkode trekkode; diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ArbeidsgiverMappingStrategy.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ArbeidsgiverMappingStrategy.java index 28348b1e7ff..6d3f64c1a3b 100644 --- a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ArbeidsgiverMappingStrategy.java +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ArbeidsgiverMappingStrategy.java @@ -5,7 +5,6 @@ import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.MappingContext; import no.nav.skattekortservice.dto.SkattekortResponsIntermediate; -import no.nav.testnav.libs.dto.skattekortservice.v1.Forskuddstrekk; import no.nav.testnav.libs.dto.skattekortservice.v1.Frikort; import no.nav.testnav.libs.dto.skattekortservice.v1.Resultatstatus; import no.nav.testnav.libs.dto.skattekortservice.v1.Skattekort; @@ -17,6 +16,8 @@ import no.nav.testnav.libs.dto.skattekortservice.v1.Trekktabell; import org.springframework.stereotype.Component; +import static java.util.Objects.nonNull; + @Slf4j @Component public class ArbeidsgiverMappingStrategy implements MappingStrategy { @@ -39,22 +40,12 @@ public void mapAtoB(SkattekortResponsIntermediate.Skattekortmelding source, Skat }) .register(); - factory.classMap(SkattekortResponsIntermediate.Forskuddstrekk.class, Forskuddstrekk.class) - .customize(new CustomMapper<>() { - @Override - public void mapAtoB(SkattekortResponsIntermediate.Forskuddstrekk source, Forskuddstrekk target, MappingContext context) { - - target.setTrekkode(Trekkode.valueOf(source.getTrekkode().getValue())); - } - }) - .register(); - factory.classMap(SkattekortResponsIntermediate.Frikort.class, Frikort.class) .customize(new CustomMapper<>() { @Override public void mapAtoB(SkattekortResponsIntermediate.Frikort source, Frikort target, MappingContext context) { - target.setTrekkode(Trekkode.valueOf(source.getTrekkode().getValue())); + target.setTrekkode(getTrekkodeValue(source.getTrekkode())); target.setFrikortbeloep(source.getFrikortbeloep()); } }) @@ -65,7 +56,7 @@ public void mapAtoB(SkattekortResponsIntermediate.Frikort source, Frikort target @Override public void mapAtoB(SkattekortResponsIntermediate.Trekktabell source, Trekktabell target, MappingContext context) { - target.setTrekkode(Trekkode.valueOf(source.getTrekkode().getValue())); + target.setTrekkode(getTrekkodeValue(source.getTrekkode())); target.setTabelltype(Tabelltype.valueOf(source.getTabelltype().getValue())); target.setTabellnummer(source.getTabellnummer()); target.setProsentsats(source.getProsentsats()); @@ -79,11 +70,16 @@ public void mapAtoB(SkattekortResponsIntermediate.Trekktabell source, Trekktabel @Override public void mapAtoB(SkattekortResponsIntermediate.Trekkprosent source, Trekkprosent target, MappingContext context) { - target.setTrekkode(Trekkode.valueOf(target.getTrekkode().getValue())); + target.setTrekkode(getTrekkodeValue(source.getTrekkode())); target.setProsentsats(source.getProsentsats()); target.setAntallMaanederForTrekk(source.getAntallMaanederForTrekk()); } }) .register(); } + + private static Trekkode getTrekkodeValue(SkattekortResponsIntermediate.Trekkode trekkode) { + + return nonNull(trekkode.getValue()) ? Trekkode.valueOf(trekkode.getValue()) : null; + } } diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/TrekktypeMappingStrategy.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ForskuddstrekkMappingStrategy.java similarity index 52% rename from apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/TrekktypeMappingStrategy.java rename to apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ForskuddstrekkMappingStrategy.java index 0d6d81dfd77..5e6c1273f11 100644 --- a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/TrekktypeMappingStrategy.java +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ForskuddstrekkMappingStrategy.java @@ -9,7 +9,6 @@ import no.nav.testnav.libs.dto.skattekortservice.v1.Skattekort; import no.nav.testnav.libs.dto.skattekortservice.v1.Trekkprosent; import no.nav.testnav.libs.dto.skattekortservice.v1.Trekktabell; -import no.nav.testnav.libs.dto.skattekortservice.v1.Trekktype; import org.springframework.stereotype.Component; import java.util.Objects; @@ -17,7 +16,7 @@ import static java.util.Objects.nonNull; @Component -public class TrekktypeMappingStrategy implements MappingStrategy { +public class ForskuddstrekkMappingStrategy implements MappingStrategy { @Override public void register(MapperFactory factory) { @@ -26,20 +25,17 @@ public void register(MapperFactory factory) { @Override public void mapAtoB(Skattekort skattekort, no.skatteetaten.fastsetting.formueinntekt.forskudd.skattekorttilarbeidsgiver.v3.Skattekort skattekort2, MappingContext context) { - skattekort2.getForskuddstrekk().addAll(skattekort.getTrekktype().stream() - .map(trekktype -> { - if (nonNull(trekktype.getFrikort())) { - return mapperFacade.map(trekktype.getFrikort(), + skattekort2.getForskuddstrekk().addAll(skattekort.getForskuddstrekk().stream() + .map(forskuddstrekk -> { + if (nonNull(forskuddstrekk.getFrikort())) { + return mapperFacade.map(forskuddstrekk.getFrikort(), no.skatteetaten.fastsetting.formueinntekt.forskudd.skattekorttilarbeidsgiver.v3.Frikort.class); - } else if (nonNull(trekktype.getTrekktabell())) { - return mapperFacade.map(trekktype.getTrekktabell(), + } else if (nonNull(forskuddstrekk.getTrekktabell())) { + return mapperFacade.map(forskuddstrekk.getTrekktabell(), no.skatteetaten.fastsetting.formueinntekt.forskudd.skattekorttilarbeidsgiver.v3.Trekktabell.class); - } else if (nonNull(trekktype.getTrekkprosent())) { - return mapperFacade.map(trekktype.getTrekkprosent(), + } else if (nonNull(forskuddstrekk.getTrekkprosent())) { + return mapperFacade.map(forskuddstrekk.getTrekkprosent(), no.skatteetaten.fastsetting.formueinntekt.forskudd.skattekorttilarbeidsgiver.v3.Trekkprosent.class); - } else if (nonNull(trekktype.getForskuddstrekk())) { - return mapperFacade.map(trekktype.getForskuddstrekk(), - no.skatteetaten.fastsetting.formueinntekt.forskudd.skattekorttilarbeidsgiver.v3.Forskuddstrekk.class); } else { return null; } @@ -48,7 +44,7 @@ public void mapAtoB(Skattekort skattekort, no.skatteetaten.fastsetting.formueinn .toList()); } }) - .exclude("trekktype") + .exclude("forskuddstrekk") .byDefault() .register(); @@ -57,29 +53,21 @@ public void mapAtoB(Skattekort skattekort, no.skatteetaten.fastsetting.formueinn @Override public void mapAtoB(SkattekortResponsIntermediate.Skattekort skattekort, Skattekort skattekort2, MappingContext context) { - skattekort2.getTrekktype().addAll(skattekort.getFrikort().stream() - .map(frikort -> Trekktype.builder() - .frikort(mapperFacade.map(frikort, Frikort.class)) - .build()) - .toList()); - skattekort2.getTrekktype().addAll(skattekort.getForskuddstrekk().stream() - .map(forskuddstrekk -> Trekktype.builder() - .forskuddstrekk(mapperFacade.map(forskuddstrekk, Forskuddstrekk.class)) - .build()) - .toList()); - skattekort2.getTrekktype().addAll(skattekort.getTrekkprosent().stream() - .map(trekkprosent -> Trekktype.builder() - .trekkprosent(mapperFacade.map(trekkprosent, Trekkprosent.class)) - .build()) - .toList()); - skattekort2.getTrekktype().addAll(skattekort.getTrekktabell().stream() - .map(trekktabell -> Trekktype.builder() - .trekktabell(mapperFacade.map(trekktabell, Trekktabell.class)) - .build()) - .toList()); + skattekort2.setSkattekortidentifikator(skattekort.getSkattekortidentifikator()); + skattekort2.setUtstedtDato(skattekort.getUtstedtDato()); + skattekort.getForskuddstrekk() + .forEach(forskuddstrekk -> skattekort2.getForskuddstrekk().add( + Forskuddstrekk.builder() + .frikort(forskuddstrekk instanceof SkattekortResponsIntermediate.Frikort ? + mapperFacade.map(forskuddstrekk, Frikort.class) : null) + .trekktabell(forskuddstrekk instanceof SkattekortResponsIntermediate.Trekktabell ? + mapperFacade.map(forskuddstrekk, Trekktabell.class) : null) + .trekkprosent(forskuddstrekk instanceof SkattekortResponsIntermediate.Trekkprosent ? + mapperFacade.map(forskuddstrekk, Trekkprosent.class) : null) + .build() + )); } }) - .byDefault() .register(); } } \ No newline at end of file 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 index 2ead001896d..e039d549028 100644 --- 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 @@ -28,7 +28,7 @@ private static void validateSkattekort(SkattekortRequestDTO skattekort) { .map(ArbeidsgiverSkatt::getArbeidstaker) .flatMap(Collection::stream) .map(Skattekortmelding::getSkattekort) - .map(Skattekort::getTrekktype) + .map(Skattekort::getForskuddstrekk) .flatMap(Collection::stream) .forEach(trekktype -> { if (trekktype.isAllEmpty()) { diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Forskuddstrekk.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Forskuddstrekk.java index 0d2dc40687a..aeed4c1f671 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Forskuddstrekk.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Forskuddstrekk.java @@ -1,15 +1,48 @@ package no.nav.testnav.libs.dto.skattekortservice.v1; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Arrays; +import java.util.Objects; + @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Forskuddstrekk { - private Trekkode trekkode; + private Frikort frikort; + private Trekktabell trekktabell; + private Trekkprosent trekkprosent; + + @JsonIgnore + public boolean isAllEmpty() { + + return contentsCount() == 0; + } + + @JsonIgnore + public boolean isAmbiguous() { + + return contentsCount() > 1; + } + + private long contentsCount() { + + return Arrays.stream(getClass().getDeclaredFields()) + .map(field -> { + try { + field.setAccessible(true); + return field.get(this); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }) + .filter(Objects::nonNull) + .count(); + } } diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Skattekort.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Skattekort.java index b7f872e60a1..94a1bb58fa3 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Skattekort.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Skattekort.java @@ -19,14 +19,14 @@ public class Skattekort { private LocalDate utstedtDato; private Long skattekortidentifikator; - private List trekktype; + private List forskuddstrekk; - public List getTrekktype() { + public List getForskuddstrekk() { - if (isNull(trekktype)) { - trekktype = new ArrayList<>(); + if (isNull(forskuddstrekk)) { + forskuddstrekk = new ArrayList<>(); } - return trekktype; + return forskuddstrekk; } } diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Trekktype.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Trekktype.java deleted file mode 100644 index 5042a2e4870..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Trekktype.java +++ /dev/null @@ -1,47 +0,0 @@ -package no.nav.testnav.libs.dto.skattekortservice.v1; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -import java.util.Arrays; -import java.util.Objects; - -@Data -@SuperBuilder -@NoArgsConstructor -public class Trekktype { - - private Forskuddstrekk forskuddstrekk; - private Frikort frikort; - private Trekktabell trekktabell; - private Trekkprosent trekkprosent; - - @JsonIgnore - public boolean isAllEmpty() { - - return contentsCount() == 0; - } - - @JsonIgnore - public boolean isAmbiguous() { - - return contentsCount() > 1; - } - - private long contentsCount() { - - return Arrays.stream(getClass().getDeclaredFields()) - .map(field -> { - try { - field.setAccessible(true); - return field.get(this); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - }) - .filter(Objects::nonNull) - .count(); - } -}