From 63de518655e3fe576ff56346f04d9504f126c9c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristen=20H=C3=A6rum?= Date: Fri, 9 Aug 2024 10:09:27 +0200 Subject: [PATCH] Bugfix/skattekort service bugfix (#3577) * Remove Trekktype and refactor related code #deploy-skatte-service Removed the Trekktype class and refactored related code to use Forskuddstrekk directly. Updated mapping strategies and utility to align with the new structure. This change simplifies the data model and improves maintainability. * Rename and refactor mapping strategy classes #deploy-skattekort-service Renamed `TrekktypeMappingStrategy` to `ForskuddstrekkMappingStrategy` for better clarity. Updated variable names inside the class to align with the new name. Modified `Forskuddstrekk` class by adding `AllArgsConstructor` and changing `SuperBuilder` to `Builder`. --- .../SkattekortServiceApplicationStarter.java | 2 +- .../dto/SkattekortResponsIntermediate.java | 61 +++++++------------ .../mapper/ArbeidsgiverMappingStrategy.java | 24 +++----- ...ava => ForskuddstrekkMappingStrategy.java} | 58 +++++++----------- .../utility/SkattekortValidator.java | 2 +- .../skattekortservice/v1/Forskuddstrekk.java | 35 ++++++++++- .../dto/skattekortservice/v1/Skattekort.java | 10 +-- .../dto/skattekortservice/v1/Trekktype.java | 47 -------------- 8 files changed, 96 insertions(+), 143 deletions(-) rename apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/{TrekktypeMappingStrategy.java => ForskuddstrekkMappingStrategy.java} (52%) delete mode 100644 libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Trekktype.java 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(); - } -}