Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

oppdater ktlint til 1.4.1 nå som pluginen er up to date #4907

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,7 @@
<dependency>
<groupId>com.pinterest.ktlint</groupId>
<artifactId>ktlint-cli</artifactId>
<version>1.3.1</version>
<version>1.4.1</version>
</dependency>
</dependencies>
</plugin>
Expand Down
15 changes: 5 additions & 10 deletions src/main/kotlin/no/nav/familie/ba/sak/common/RessursUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,19 @@ import org.springframework.http.ResponseEntity
object RessursUtils {
private val logger = LoggerFactory.getLogger(RessursUtils::class.java)

fun <T> unauthorized(errorMessage: String): ResponseEntity<Ressurs<T>> =
ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(Ressurs.failure(errorMessage))
fun <T> unauthorized(errorMessage: String): ResponseEntity<Ressurs<T>> = ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(Ressurs.failure(errorMessage))

fun <T> badRequest(
errorMessage: String,
throwable: Throwable,
): ResponseEntity<Ressurs<T>> =
errorResponse(HttpStatus.BAD_REQUEST, errorMessage, throwable)
): ResponseEntity<Ressurs<T>> = errorResponse(HttpStatus.BAD_REQUEST, errorMessage, throwable)

fun <T> forbidden(errorMessage: String): ResponseEntity<Ressurs<T>> =
ikkeTilgangResponse(errorMessage)
fun <T> forbidden(errorMessage: String): ResponseEntity<Ressurs<T>> = ikkeTilgangResponse(errorMessage)

fun <T> illegalState(
errorMessage: String,
throwable: Throwable,
): ResponseEntity<Ressurs<T>> =
errorResponse(HttpStatus.INTERNAL_SERVER_ERROR, errorMessage, throwable)
): ResponseEntity<Ressurs<T>> = errorResponse(HttpStatus.INTERNAL_SERVER_ERROR, errorMessage, throwable)

fun <T> funksjonellFeil(funksjonellFeil: FunksjonellFeil): ResponseEntity<Ressurs<T>> =
funksjonellErrorResponse(
Expand All @@ -35,8 +31,7 @@ object RessursUtils {
fun <T> frontendFeil(
feil: Feil,
throwable: Throwable?,
): ResponseEntity<Ressurs<T>> =
frontendErrorResponse(feil, throwable)
): ResponseEntity<Ressurs<T>> = frontendErrorResponse(feil, throwable)

fun <T> ok(data: T): ResponseEntity<Ressurs<T>> = ResponseEntity.ok(Ressurs.success(data))

Expand Down
6 changes: 2 additions & 4 deletions src/main/kotlin/no/nav/familie/ba/sak/common/Tid.kt
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,7 @@ fun MånedPeriode.overlapperHeltEllerDelvisMed(annenPeriode: MånedPeriode) =
annenPeriode.inkluderer(this.fom) ||
annenPeriode.inkluderer(this.tom)

fun MånedPeriode.erMellom(annenPeriode: MånedPeriode) =
annenPeriode.inkluderer(this.fom) && annenPeriode.inkluderer(this.tom)
fun MånedPeriode.erMellom(annenPeriode: MånedPeriode) = annenPeriode.inkluderer(this.fom) && annenPeriode.inkluderer(this.tom)

fun Periode.kanErstatte(other: Periode): Boolean = this.fom.isSameOrBefore(other.fom) && this.tom.isSameOrAfter(other.tom)

Expand Down Expand Up @@ -270,8 +269,7 @@ class YearMonthProgression(
val hoppMåneder: Long = 1,
) : Iterable<YearMonth>,
ClosedRange<YearMonth> {
override fun iterator(): Iterator<YearMonth> =
YearMonthIterator(start, endInclusive, hoppMåneder)
override fun iterator(): Iterator<YearMonth> = YearMonthIterator(start, endInclusive, hoppMåneder)

infix fun step(måneder: Long) = YearMonthProgression(start, endInclusive, måneder)
}
Expand Down
19 changes: 9 additions & 10 deletions src/main/kotlin/no/nav/familie/ba/sak/common/TidslinjeUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,12 @@ fun erTilogMed3ÅrTidslinje(fødselsdato: LocalDate): Tidslinje<Boolean, Måned>
fun opprettBooleanTidslinje(
fraÅrMåned: YearMonth,
tilÅrMåned: YearMonth,
) =
tidslinje {
listOf(
Periode(
fraÅrMåned.tilTidspunkt(),
tilÅrMåned.tilTidspunkt(),
true,
),
)
}
) = tidslinje {
listOf(
Periode(
fraÅrMåned.tilTidspunkt(),
tilÅrMåned.tilTidspunkt(),
true,
),
)
}
3 changes: 1 addition & 2 deletions src/main/kotlin/no/nav/familie/ba/sak/common/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,7 @@ object Utils {

inline fun <reified T : Enum<T>> konverterEnumsTilString(liste: List<T>) = liste.joinToString(separator = ";")

inline fun <reified T : Enum<T>> konverterStringTilEnums(string: String?): List<T> =
if (string.isNullOrBlank()) emptyList() else string.split(";").map { enumValueOf(it) }
inline fun <reified T : Enum<T>> konverterStringTilEnums(string: String?): List<T> = if (string.isNullOrBlank()) emptyList() else string.split(";").map { enumValueOf(it) }
}

fun Any.convertDataClassToJson(): String = objectMapper.writeValueAsString(this)
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ class ApiExceptionHandler {
),
)
}

is FunksjonellFeil -> funksjonellFeil(mostSpecificCause)
else -> illegalState(mostSpecificCause.message.toString(), mostSpecificCause)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,14 @@ class PensjonConfig(
"Pensjon applikasjon kan ikke kalle andre tjenester",
)
}

erPensjonRequest && (!harForvalterRolle && !erKallerPensjon) -> {
response.sendError(
HttpServletResponse.SC_UNAUTHORIZED,
"Pensjon tjeneste kan kun kalles av pensjon eller innlogget bruker med FORVALTER rolle",
)
}

erPensjonRequest && (harForvalterRolle || erKallerPensjon) -> filterChain.doFilter(request, response)
!erPensjonRequest && !erKallerPensjon -> filterChain.doFilter(request, response)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,7 @@ class SentryConfiguration(
}
}

private fun hentKibanalenke(callId: String) =
"https://logs.adeo.no/app/discover#/?_g=(time:(from:now-1M,to:now))&_a=(filters:!((query:(match_phrase:(x_callId:'$callId')))))"
private fun hentKibanalenke(callId: String) = "https://logs.adeo.no/app/discover#/?_g=(time:(from:now-1M,to:now))&_a=(filters:!((query:(match_phrase:(x_callId:'$callId')))))"

fun finnMetodeSomFeiler(e: Throwable?): String {
val firstElement =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,9 @@ TaskRepository in familie-prosessering is @Primary, which is not able to mock so
class TaskRepositoryWrapper(
private val taskService: TaskService,
) {
fun save(task: Task) =
taskService.save(task)
fun save(task: Task) = taskService.save(task)

fun findAll(): Iterable<Task> =
taskService.findAll()
fun findAll(): Iterable<Task> = taskService.findAll()

fun findByStatus(status: Status): List<Task> =
taskService.finnTasksMedStatus(listOf(status), type = null, page = Pageable.unpaged())
fun findByStatus(status: Status): List<Task> = taskService.finnTasksMedStatus(listOf(status), type = null, page = Pageable.unpaged())
}
61 changes: 46 additions & 15 deletions src/main/kotlin/no/nav/familie/ba/sak/ekstern/pensjon/README.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,46 @@
# Tjeneste for Pensjon

Erstatter gammel rutine for overføring av barnetrygddata (fra Infotrygd via fil) ifm. med godskrivning av pensjonsopptjening for mottakere av barnetrygd foregående år.
Erstatter gammel rutine for overføring av barnetrygddata (fra Infotrygd via fil) ifm. med godskrivning av
pensjonsopptjening for mottakere av barnetrygd foregående år.

Ble i utgangspunktet kun laget for henting av data fra familie-ba-sak, da man så for seg infotrygdsakene fortsatt ville komme fra gammel løype, men er på forespørsel utvidet til å hente data fra Infotrygd (via [familie-ba-infotrygd](https://github.com/navikt/familie-ba-infotrygd)) i tillegg.
Ble i utgangspunktet kun laget for henting av data fra familie-ba-sak, da man så for seg infotrygdsakene fortsatt ville
komme fra gammel løype, men er på forespørsel utvidet til å hente data fra Infotrygd (
via [familie-ba-infotrygd](https://github.com/navikt/familie-ba-infotrygd)) i tillegg.

Domenemodellen er derfor primært tilpasset ba-sak, med høyere detaljnivå enn det man kan tilby med dataene fra Infotrygd, men det er begrensninger som er innforstått (ref. [slack](https://nav-it.slack.com/archives/C04JGFS9A3E/p1692275651280949?thread_ts=1692272606.816909&cid=C04JGFS9A3E))
Domenemodellen er derfor primært tilpasset ba-sak, med høyere detaljnivå enn det man kan tilby med dataene fra
Infotrygd, men det er begrensninger som er innforstått (
ref. [slack](https://nav-it.slack.com/archives/C04JGFS9A3E/p1692275651280949?thread_ts=1692272606.816909&cid=C04JGFS9A3E))

## Oppbygning

### Steg 1 - Innhenting av identer

Pensjon starter med å bestille overlevering av alle identer med barnetrygd innenfor et gitt år ved å kalle endepunktet [/api/ekstern/pensjon/bestill-personer-med-barnetrygd/{år}](https://familie-ba-sak.intern.dev.nav.no/swagger-ui/index.html#/pensjon-controller/bestillPersonerMedBarnetrygdForGitt%C3%85rP%C3%A5Kafka) under [PensjonController](PensjonController.kt), som oppretter en [HentAlleIdenterTilPsysTask](../../task/HentAlleIdenterTilPsysTask.kt)

Denne finner først alle identer fra ba-sak med spørringen gitt av `finnIdenterMedLøpendeBarnetrygdForGittÅr` i [AndelTilkjentYtelseRepository](../../kjerne/beregning/domene/AndelTilkjentYtelseRepository.kt), og deretter alle identer fra Infotrygd via integrasjonen mot [/infotrygd/barnetrygd/pensjon](https://familie-ba-infotrygd.dev.intern.nav.no/swagger-ui/index.html#/pensjon-controller/personerMedBarnetrygd) i [InfotrygdBarnetrygdClient](../../integrasjoner/infotrygd/InfotrygdBarnetrygdClient.kt). Tasken avslutter så med å publisere alle unike ident-forekomster til kafka-topic'en med navn [aapen-familie-ba-sak-identer-med-barnetrygd](../../../../../../../../../../.deploy/nais/kafka/dev/aapen-familie-ba-sak-identer-med-barnetrygd.yaml).

I dev-miljø er det en [funksjonsbryter](https://teamfamilie-unleash-web.iap.nav.cloud.nais.io/projects/default/features/familie-ba-sak.hent-identer-til-psys-fra-infotrygd) som styrer om det skal inkluderes data fra Infotrygd
eller ikke. Det er fordi det returneres ekte fødselsnumre derfra, siden `infotrygd_baq` basen stort sett bare er en kopi av `infotrygd_bap`. Den bør helst være avskrudd med mindre Pensjon etterlyser å få teste med bryteren på, siden kjøringer med sensitive data kun gjøres fra et bestemt testmiljø.
Pensjon starter med å bestille overlevering av alle identer med barnetrygd innenfor et gitt år ved å kalle
endepunktet [/api/ekstern/pensjon/bestill-personer-med-barnetrygd/{år}](https://familie-ba-sak.intern.dev.nav.no/swagger-ui/index.html#/pensjon-controller/bestillPersonerMedBarnetrygdForGitt%C3%85rP%C3%A5Kafka)
under [PensjonController](PensjonController.kt), som oppretter
en [HentAlleIdenterTilPsysTask](../../task/HentAlleIdenterTilPsysTask.kt)

Denne finner først alle identer fra ba-sak med spørringen gitt av `finnIdenterMedLøpendeBarnetrygdForGittÅr`
i [AndelTilkjentYtelseRepository](../../kjerne/beregning/domene/AndelTilkjentYtelseRepository.kt), og deretter alle
identer fra Infotrygd via integrasjonen
mot [/infotrygd/barnetrygd/pensjon](https://familie-ba-infotrygd.dev.intern.nav.no/swagger-ui/index.html#/pensjon-controller/personerMedBarnetrygd)
i [InfotrygdBarnetrygdClient](../../integrasjoner/infotrygd/InfotrygdBarnetrygdClient.kt). Tasken avslutter så med å
publisere alle unike ident-forekomster til kafka-topic'en med
navn [aapen-familie-ba-sak-identer-med-barnetrygd](../../../../../../../../../../.deploy/nais/kafka/dev/aapen-familie-ba-sak-identer-med-barnetrygd.yaml).

I dev-miljø er det
en [funksjonsbryter](https://teamfamilie-unleash-web.iap.nav.cloud.nais.io/projects/default/features/familie-ba-sak.hent-identer-til-psys-fra-infotrygd)
som styrer om det skal inkluderes data fra Infotrygd
eller ikke. Det er fordi det returneres ekte fødselsnumre derfra, siden `infotrygd_baq` basen stort sett bare er en kopi
av `infotrygd_bap`. Den bør helst være avskrudd med mindre Pensjon etterlyser å få teste med bryteren på, siden
kjøringer med sensitive data kun gjøres fra et bestemt testmiljø.

### Steg 2 - Innhenting av perioder

Hver kafka-melding av type `DATA` publisert i steg 1, vil følges opp med et POST-kall for henting av perioder til [/api/ekstern/pensjon/hent-barnetrygd](https://familie-ba-sak.intern.dev.nav.no/swagger-ui/index.html#/pensjon-controller/hentBarnetrygd) med body på format:
Hver kafka-melding av type `DATA` publisert i steg 1, vil følges opp med et POST-kall for henting av perioder
til [/api/ekstern/pensjon/hent-barnetrygd](https://familie-ba-sak.intern.dev.nav.no/swagger-ui/index.html#/pensjon-controller/hentBarnetrygd)
med body på format:

```
{
"ident": <ident-fra-kafka-melding>,
Expand Down Expand Up @@ -52,15 +73,25 @@ Responsen er på format
]
}
```
hvor det returneres en liste av fagsaker med tilhørende barnetrygdperioder fra den aktuelle datoen. Grunnen til at det er en liste er fordi det også returneres periodedata fra relaterte fagsaker via barna på identen

Akkurat som i steg 1, hentes det også her data fra både infotrygd og ba-sak. Dersom det finnes perioder med overlappende dato fra forskjellig kildesystem, er det ba-sak periodene som skal gjelde (ref [slack](https://nav-it.slack.com/archives/C04JGFS9A3E/p1700725524272959?thread_ts=1700650664.696339&cid=C04JGFS9A3E)). Filtreringen gjøres vha. tidslinjer med funksjonen `fjernOverlappendeInfotrygdperioder` i [PensjonService](PensjonService.kt)
hvor det returneres en liste av fagsaker med tilhørende barnetrygdperioder fra den aktuelle datoen. Grunnen til at det
er en liste er fordi det også returneres periodedata fra relaterte fagsaker via barna på identen

Akkurat som i steg 1, hentes det også her data fra både infotrygd og ba-sak. Dersom det finnes perioder med overlappende
dato fra forskjellig kildesystem, er det ba-sak periodene som skal gjelde (
ref [slack](https://nav-it.slack.com/archives/C04JGFS9A3E/p1700725524272959?thread_ts=1700650664.696339&cid=C04JGFS9A3E)).
Filtreringen gjøres vha. tidslinjer med funksjonen `fjernOverlappendeInfotrygdperioder`
i [PensjonService](PensjonService.kt)

Dersom [funksjonsbryteren](https://teamfamilie-unleash-web.iap.nav.cloud.nais.io/projects/default/features/familie-ba-sak.hent-identer-til-psys-fra-infotrygd) for henting av periodedata fra `infotrygd_baq` er avskrudd,
Dersom [funksjonsbryteren](https://teamfamilie-unleash-web.iap.nav.cloud.nais.io/projects/default/features/familie-ba-sak.hent-identer-til-psys-fra-infotrygd)
for henting av periodedata fra `infotrygd_baq` er avskrudd,
blir testdataene istedenfor krydret med litt tilfeldige uttrekk derfra innimellom, hvor personidentene maskeres.

I motsetning til Bisys som kun er interessert i perioder med utvidet barnetrygd, er Pensjon kun ute etter periodene med ordinær barnetrygd. Derfor har vi filteret
`filter { it.type == YtelseType.ORDINÆR_BARNETRYGD }` i `hentPerioder`funksjonen i ba-sak. I infotrygd gjør vi ikke denne filtreringen pga. sammenslåing av perioder, som betyr at en `UTVIDET_BARNETRYGD`-periode derfra egentlig er en kombinasjon hvor det også inngår ordinære andeler, og må derfor medregnes.
I motsetning til Bisys som kun er interessert i perioder med utvidet barnetrygd, er Pensjon kun ute etter periodene med
ordinær barnetrygd. Derfor har vi filteret
`filter { it.type == YtelseType.ORDINÆR_BARNETRYGD }` i `hentPerioder`funksjonen i ba-sak. I infotrygd gjør vi ikke
denne filtreringen pga. sammenslåing av perioder, som betyr at en `UTVIDET_BARNETRYGD`-periode derfra egentlig er en
kombinasjon hvor det også inngår ordinære andeler, og må derfor medregnes.

## Nyttige lenker

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ data class RestVilkårResultat(
val utdypendeVilkårsvurderinger: List<UtdypendeVilkårsvurdering> = emptyList(),
val resultatBegrunnelse: ResultatBegrunnelse? = null,
) {
fun erAvslagUtenPeriode() =
this.erEksplisittAvslagPåSøknad == true && this.periodeFom == null && this.periodeTom == null
fun erAvslagUtenPeriode() = this.erEksplisittAvslagPåSøknad == true && this.periodeFom == null && this.periodeTom == null

fun harFremtidigTom() = this.periodeTom == null || this.periodeTom.isAfter(LocalDate.now().sisteDagIMåned())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,7 @@ class ECBService(
private fun beregnValutakurs(
valutakursUtenlandskValuta: BigDecimal,
valutakursNOK: BigDecimal,
) =
valutakursNOK.del(valutakursUtenlandskValuta, 10)
) = valutakursNOK.del(valutakursUtenlandskValuta, 10)

private fun validateExchangeRates(
currency: String,
Expand All @@ -93,10 +92,9 @@ class ECBService(
currencies: List<String>,
exchangeRateDate: LocalDate,
expectedSize: Int,
) =
exchangeRates.size == expectedSize &&
exchangeRates.all { it.date == exchangeRateDate } &&
exchangeRates.map { it.currency }.containsAll(currencies)
) = exchangeRates.size == expectedSize &&
exchangeRates.all { it.date == exchangeRateDate } &&
exchangeRates.map { it.currency }.containsAll(currencies)

private fun throwValidationException(
currency: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ class InfotrygdBarnetrygdClient(
"Http feil mot ${uri.path}: httpkode: ${ex.statusCode}, feilmelding ${ex.message}",
ex,
)

else -> secureLogger.warn("Feil mot ${uri.path}; melding ${ex.message}", ex)
}
logger.warn("Feil mot ${uri.path}.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ class UtgåendeJournalføringService(

hentEksisterendeJournalpost(eksternReferanseId, fnr)
}

else -> throw ressursException
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ class PdlRestClient(
}
}.toSet()
}

else -> emptySet()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,7 @@ class PersonopplysningerService(
}
}

fun hentAdressebeskyttelseSomSystembruker(aktør: Aktør): ADRESSEBESKYTTELSEGRADERING =
systemOnlyPdlRestClient.hentAdressebeskyttelse(aktør).tilAdressebeskyttelse()
fun hentAdressebeskyttelseSomSystembruker(aktør: Aktør): ADRESSEBESKYTTELSEGRADERING = systemOnlyPdlRestClient.hentAdressebeskyttelse(aktør).tilAdressebeskyttelse()

companion object {
const val UKJENT_LANDKODE = "ZZ"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,5 +73,4 @@ class SystemOnlyPdlRestClient(
}
}

fun List<Adressebeskyttelse>.tilAdressebeskyttelse() =
this.firstOrNull()?.gradering ?: ADRESSEBESKYTTELSEGRADERING.UGRADERT
fun List<Adressebeskyttelse>.tilAdressebeskyttelse() = this.firstOrNull()?.gradering ?: ADRESSEBESKYTTELSEGRADERING.UGRADERT
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ data class PersonInfo(
val kontaktinformasjonForDoedsbo: PdlKontaktinformasjonForDødsbo? = null,
)

fun List<Bostedsadresse>.filtrerUtKunNorskeBostedsadresser() =
this.filter { it.vegadresse != null || it.matrikkeladresse != null || it.ukjentBosted != null }
fun List<Bostedsadresse>.filtrerUtKunNorskeBostedsadresser() = this.filter { it.vegadresse != null || it.matrikkeladresse != null || it.ukjentBosted != null }

data class ForelderBarnRelasjon(
val aktør: Aktør,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,7 @@ class AvstemmingService(
taskService.save(konsistensavstemmingAvsluttTask)
}

fun hentSisteIverksatteBehandlingerFraLøpendeFagsaker() =
behandlingHentOgPersisterService.hentSisteIverksatteBehandlingerFraLøpendeFagsaker()
fun hentSisteIverksatteBehandlingerFraLøpendeFagsaker() = behandlingHentOgPersisterService.hentSisteIverksatteBehandlingerFraLøpendeFagsaker()

@Transactional(propagation = Propagation.REQUIRES_NEW)
fun opprettKonsistensavstemmingFinnPerioderForRelevanteBehandlingerTask(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,7 @@ private fun List<AndelTilkjentYtelse>.tilBeløpstidslinje(): Tidslinje<BigDecima
}
}

private fun List<Utbetalingsperiode>.tilTidStrenger() =
Utils.slåSammen(this.map { "${it.vedtakdatoFom.toYearMonth()} til ${it.vedtakdatoTom.toYearMonth()}" })
private fun List<Utbetalingsperiode>.tilTidStrenger() = Utils.slåSammen(this.map { "${it.vedtakdatoFom.toYearMonth()} til ${it.vedtakdatoTom.toYearMonth()}" })

private sealed interface AndelOgOppdragForskjell

Expand Down
Loading
Loading