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

bygger utbetalingstidslinje som en ren SykdomstidslinjeVisitor #115

Merged
merged 1 commit into from
Sep 6, 2024
Merged
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import no.nav.helse.person.Vedtaksperiode.Companion.HAR_PÅGÅENDE_UTBETALINGER
import no.nav.helse.person.Vedtaksperiode.Companion.MED_SKJÆRINGSTIDSPUNKT
import no.nav.helse.person.Vedtaksperiode.Companion.SKAL_INNGÅ_I_SYKEPENGEGRUNNLAG
import no.nav.helse.person.Vedtaksperiode.Companion.aktiveSkjæringstidspunkter
import no.nav.helse.person.Vedtaksperiode.Companion.arbeidsgiverperioder
import no.nav.helse.person.Vedtaksperiode.Companion.beregnSkjæringstidspunkter
import no.nav.helse.person.Vedtaksperiode.Companion.checkBareEnPeriodeTilGodkjenningSamtidig
import no.nav.helse.person.Vedtaksperiode.Companion.egenmeldingsperioder
Expand Down Expand Up @@ -84,7 +85,7 @@ import no.nav.helse.utbetalingstidslinje.Arbeidsgiverperiode.Companion.finn
import no.nav.helse.utbetalingstidslinje.FaktaavklarteInntekter
import no.nav.helse.utbetalingstidslinje.Feriepengeberegner
import no.nav.helse.utbetalingstidslinje.Utbetalingstidslinje
import no.nav.helse.utbetalingstidslinje.UtbetalingstidslinjeBuilder
import no.nav.helse.utbetalingstidslinje.UtbetalingstidslinjeBuilderNy
import no.nav.helse.økonomi.Prosentdel.Companion.prosent

internal class Arbeidsgiver private constructor(
Expand Down Expand Up @@ -146,7 +147,7 @@ internal class Arbeidsgiver private constructor(
}

internal fun List<Arbeidsgiver>.beregnSkjæringstidspunkter(infotrygdhistorikk: Infotrygdhistorikk) {
forEach { it.vedtaksperioder.beregnSkjæringstidspunkter(beregnSkjæringstidspunkt(infotrygdhistorikk), it.beregnArbeidsgiverperiode()) }
forEach { it.vedtaksperioder.beregnSkjæringstidspunkter(beregnSkjæringstidspunkt(infotrygdhistorikk), it.beregnArbeidsgiverperiode(Subsumsjonslogg.NullObserver)) }
}

internal fun List<Arbeidsgiver>.aktiveSkjæringstidspunkter(): Set<LocalDate> {
Expand Down Expand Up @@ -705,8 +706,8 @@ internal class Arbeidsgiver private constructor(
.merge(sykdomstidslinje(), replace)
}

internal fun beregnArbeidsgiverperiode() = { vedtaksperiode: Periode ->
person.arbeidsgiverperiodeFor(organisasjonsnummer, sykdomstidslinje(), null).finn(vedtaksperiode)?.grupperSammenhengendePerioder() ?: emptyList()
internal fun beregnArbeidsgiverperiode(jurist: Subsumsjonslogg) = { vedtaksperiode: Periode ->
person.arbeidsgiverperiodeFor(organisasjonsnummer, sykdomstidslinje(), jurist).finn(vedtaksperiode)?.grupperSammenhengendePerioder() ?: emptyList()
}

private fun arbeidsgiverperiode(periode: Periode, sykdomstidslinje: Sykdomstidslinje): Arbeidsgiverperiode? {
Expand Down Expand Up @@ -869,21 +870,26 @@ internal class Arbeidsgiver private constructor(
periode: Periode,
regler: ArbeidsgiverRegler,
faktaavklarteInntekter: FaktaavklarteInntekter,
infotrygdhistorikk: Infotrygdhistorikk,
utbetaltePerioderInfotrygd: List<Periode>,
subsumsjonslogg: Subsumsjonslogg
): Utbetalingstidslinje {
val ghosttidslinje = faktaavklarteInntekter.ghosttidslinje(organisasjonsnummer, periode.endInclusive)
val sykdomstidslinje = ghosttidslinje.merge(sykdomstidslinje(), replace)
if (sykdomstidslinje.count() == 0) return Utbetalingstidslinje()
val builder = UtbetalingstidslinjeBuilder(

val arbeidsgiverperioder = vedtaksperioder.arbeidsgiverperioder()

val builder = UtbetalingstidslinjeBuilderNy(
faktaavklarteInntekter = faktaavklarteInntekter,
hendelse = hendelse,
regler = regler,
subsumsjonslogg = subsumsjonslogg,
organisasjonsnummer = organisasjonsnummer,
beregningsperiode = periode
beregningsperiode = periode,
arbeidsgiverperioder = arbeidsgiverperioder,
utbetaltePerioderInfotrygd = utbetaltePerioderInfotrygd
)
infotrygdhistorikk.buildUtbetalingstidslinje(organisasjonsnummer, sykdomstidslinje, builder, subsumsjonslogg)
sykdomstidslinje.accept(builder)
return builder.result()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import no.nav.helse.etterlevelse.MaskinellJurist
import no.nav.helse.hendelser.Avsender
import no.nav.helse.hendelser.Hendelse
import no.nav.helse.hendelser.Periode
import no.nav.helse.hendelser.Periode.Companion.periode
import no.nav.helse.hendelser.Simulering
import no.nav.helse.hendelser.Søknad
import no.nav.helse.hendelser.Ytelser
Expand Down Expand Up @@ -48,6 +49,7 @@ import no.nav.helse.sykdomstidslinje.SykdomshistorikkHendelse
import no.nav.helse.sykdomstidslinje.Sykdomstidslinje
import no.nav.helse.utbetalingslinjer.Utbetaling
import no.nav.helse.utbetalingstidslinje.Arbeidsgiverperiode
import no.nav.helse.utbetalingstidslinje.ArbeidsgiverperiodeForVedtaksperiode
import no.nav.helse.utbetalingstidslinje.Maksdatosituasjon
import no.nav.helse.utbetalingstidslinje.Utbetalingstidslinje

Expand Down Expand Up @@ -83,6 +85,7 @@ internal class Behandlinger private constructor(behandlinger: List<Behandling>)
visitor.postVisitBehandlinger(behandlinger)
}

internal fun arbeidsgiverperiode() = ArbeidsgiverperiodeForVedtaksperiode(periode(), behandlinger.last().arbeidsgiverperiode)
internal fun skjæringstidspunkt() = behandlinger.last().skjæringstidspunkt
private fun varEllerErRettFør(neste: Behandlinger) = behandlinger.varEllerErRettFør(neste.behandlinger.last())

Expand Down Expand Up @@ -359,7 +362,7 @@ internal class Behandlinger private constructor(behandlinger: List<Behandling>)
private val tidsstempel = endringer.first().tidsstempel
private val dokumentsporing get() = endringer.dokumentsporing
val arbeidsgiverperiode get() = gjeldende.arbeidsgiverperiode
val skjæringstidspunkt get() = endringer.last().skjæringstidspunkt
val skjæringstidspunkt get() = gjeldende.skjæringstidspunkt

constructor(observatører: List<BehandlingObserver>, tilstand: Tilstand, endringer: List<Endring>, avsluttet: LocalDateTime?, kilde: Behandlingkilde) : this(UUID.randomUUID(), tilstand, endringer.toMutableList(), null, avsluttet, kilde, observatører) {
check(observatører.isNotEmpty()) {
Expand Down Expand Up @@ -709,6 +712,7 @@ internal class Behandlinger private constructor(behandlinger: List<Behandling>)
utbetalingstidslinje: Utbetalingstidslinje
): Utbetalingstidslinje {
val strategi = Arbeidsgiver::lagUtbetaling
// TODO: bør sende med beregnet AGP slik at utbetalingskoden vet hvilket oppdrag som skal bygges videre på
return lagUtbetaling(
vedtaksperiodeSomLagerUtbetaling,
fødselsnummer,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -357,8 +357,9 @@ class Person private constructor(
alder = alder,
arbeidsgivere = { beregningsperiode: Periode, subsumsjonslogg: Subsumsjonslogg, hendelse: IAktivitetslogg ->
val faktaavklarteInntekter = vilkårsgrunnlagHistorikk.faktavklarteInntekter()
val infotrygdUtbetaltePerioder = infotrygdhistorikk.betaltePerioder()
arbeidsgivere.associateWith {
it.beregnUtbetalingstidslinje(hendelse, beregningsperiode, regler, faktaavklarteInntekter, infotrygdhistorikk, subsumsjonslogg)
it.beregnUtbetalingstidslinje(hendelse, beregningsperiode, regler, faktaavklarteInntekter, infotrygdUtbetaltePerioder, subsumsjonslogg)
}
},
infotrygdUtbetalingstidslinje = infotrygdhistorikk.utbetalingstidslinje(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -584,11 +584,11 @@ internal class Vedtaksperiode private constructor(
private fun oppdaterHistorikk(hendelse: SykdomstidslinjeHendelse, validering: () -> Unit) {
val periodeFør = arbeidsgiver.finnVedtaksperiodeFør(this)
val periodeEtter = arbeidsgiver.finnVedtaksperiodeEtter(this)
behandlinger.håndterEndringOgLagreTidsnæreOpplysninger(person, arbeidsgiver, hendelse, person.beregnSkjæringstidspunkt(), arbeidsgiver.beregnArbeidsgiverperiode(), periodeFør?.behandlinger, periodeEtter?.behandlinger, periodeEtter?.aktivitetsloggkopi(hendelse), validering)
behandlinger.håndterEndringOgLagreTidsnæreOpplysninger(person, arbeidsgiver, hendelse, person.beregnSkjæringstidspunkt(), arbeidsgiver.beregnArbeidsgiverperiode(jurist), periodeFør?.behandlinger, periodeEtter?.behandlinger, periodeEtter?.aktivitetsloggkopi(hendelse), validering)
}

private fun oppdaterHistorikk(hendelse: SykdomshistorikkHendelse, validering: () -> Unit) {
behandlinger.håndterEndring(person, arbeidsgiver, hendelse, person.beregnSkjæringstidspunkt(), arbeidsgiver.beregnArbeidsgiverperiode(), validering)
behandlinger.håndterEndring(person, arbeidsgiver, hendelse, person.beregnSkjæringstidspunkt(), arbeidsgiver.beregnArbeidsgiverperiode(jurist), validering)
}

private fun håndterEgenmeldingsperioderFraOverlappendeSøknad(søknad: Søknad) {
Expand Down Expand Up @@ -1099,7 +1099,7 @@ internal class Vedtaksperiode private constructor(

private fun håndterOverstyringIgangsattRevurdering(revurdering: Revurderingseventyr) {
revurdering.inngåSomRevurdering(this, periode)
behandlinger.sikreNyBehandling(arbeidsgiver, revurdering, person.beregnSkjæringstidspunkt(), arbeidsgiver.beregnArbeidsgiverperiode())
behandlinger.sikreNyBehandling(arbeidsgiver, revurdering, person.beregnSkjæringstidspunkt(), arbeidsgiver.beregnArbeidsgiverperiode(jurist))
tilstand(revurdering, AvventerRevurdering)
}

Expand Down Expand Up @@ -2287,7 +2287,7 @@ internal class Vedtaksperiode private constructor(
}

override fun igangsettOverstyring(vedtaksperiode: Vedtaksperiode, revurdering: Revurderingseventyr) {
vedtaksperiode.behandlinger.sikreNyBehandling(vedtaksperiode.arbeidsgiver, revurdering, vedtaksperiode.person.beregnSkjæringstidspunkt(), vedtaksperiode.arbeidsgiver.beregnArbeidsgiverperiode())
vedtaksperiode.behandlinger.sikreNyBehandling(vedtaksperiode.arbeidsgiver, revurdering, vedtaksperiode.person.beregnSkjæringstidspunkt(), vedtaksperiode.arbeidsgiver.beregnArbeidsgiverperiode(vedtaksperiode.jurist))
if (vedtaksperiode.forventerInntekt()) {
revurdering.inngåSomEndring(vedtaksperiode, vedtaksperiode.periode)
revurdering.loggDersomKorrigerendeSøknad(revurdering, "Startet omgjøring grunnet korrigerende søknad")
Expand Down Expand Up @@ -2319,7 +2319,7 @@ internal class Vedtaksperiode private constructor(
infotrygdhistorikk: Infotrygdhistorikk
) {
if (!vedtaksperiode.forventerInntekt()) return
vedtaksperiode.behandlinger.sikreNyBehandling(vedtaksperiode.arbeidsgiver, hendelse, vedtaksperiode.person.beregnSkjæringstidspunkt(), vedtaksperiode.arbeidsgiver.beregnArbeidsgiverperiode())
vedtaksperiode.behandlinger.sikreNyBehandling(vedtaksperiode.arbeidsgiver, hendelse, vedtaksperiode.person.beregnSkjæringstidspunkt(), vedtaksperiode.arbeidsgiver.beregnArbeidsgiverperiode(vedtaksperiode.jurist))
håndterFørstegangsbehandling(hendelse, vedtaksperiode) {
infotrygdhistorikk.valider(hendelse, vedtaksperiode.periode, vedtaksperiode.skjæringstidspunkt, vedtaksperiode.organisasjonsnummer)
}
Expand Down Expand Up @@ -2374,7 +2374,7 @@ internal class Vedtaksperiode private constructor(
vedtaksperiode.skalHåndtereDagerRevurdering(dager)

override fun igangsettOverstyring(vedtaksperiode: Vedtaksperiode, revurdering: Revurderingseventyr) {
vedtaksperiode.behandlinger.sikreNyBehandling(vedtaksperiode.arbeidsgiver, revurdering, vedtaksperiode.person.beregnSkjæringstidspunkt(), vedtaksperiode.arbeidsgiver.beregnArbeidsgiverperiode())
vedtaksperiode.behandlinger.sikreNyBehandling(vedtaksperiode.arbeidsgiver, revurdering, vedtaksperiode.person.beregnSkjæringstidspunkt(), vedtaksperiode.arbeidsgiver.beregnArbeidsgiverperiode(vedtaksperiode.jurist))
vedtaksperiode.jurist.`fvl § 35 ledd 1`()
revurdering.inngåSomRevurdering(vedtaksperiode, vedtaksperiode.periode)
vedtaksperiode.tilstand(revurdering, AvventerRevurdering)
Expand Down Expand Up @@ -2461,6 +2461,7 @@ internal class Vedtaksperiode private constructor(
internal const val MINIMALT_TILLATT_AVSTAND_TIL_INFOTRYGD = 18L

internal fun List<Vedtaksperiode>.egenmeldingsperioder(): List<Periode> = flatMap { it.egenmeldingsperioder }
internal fun List<Vedtaksperiode>.arbeidsgiverperioder() = map { it.behandlinger.arbeidsgiverperiode() }

private fun Iterable<Iterable<Vedtaksperiode>>.annenArbeidsgiver(vedtaksperiode: Vedtaksperiode) = this
.asSequence()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ internal class Infotrygdhistorikk private constructor(
}


internal fun betaltePerioder(orgnummer: String? = null) =
if (!harHistorikk()) emptyList() else siste.betaltePerioder(orgnummer)

internal fun harHistorikk() = elementer.isNotEmpty()
internal fun harUtbetaltI(periode: Periode): Boolean {
if (!harHistorikk()) return false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,16 +132,13 @@ class ArbeidsgiverInntektsopplysning(
}

internal companion object {
internal fun List<ArbeidsgiverInntektsopplysning>.faktaavklarteInntekter(skjæringstidspunkt: LocalDate, `6G`: Inntekt) = FaktaavklarteInntekter.VilkårsprøvdSkjæringstidspunkt(
skjæringstidspunkt = skjæringstidspunkt,
`6G` = `6G`,
inntekter = this.map { FaktaavklarteInntekter.VilkårsprøvdSkjæringstidspunkt.FaktaavklartInntekt(
internal fun List<ArbeidsgiverInntektsopplysning>.faktaavklarteInntekter() = this
.map { FaktaavklarteInntekter.VilkårsprøvdSkjæringstidspunkt.FaktaavklartInntekt(
organisasjonsnummer = it.orgnummer,
fastsattÅrsinntekt = it.inntektsopplysning.fastsattÅrsinntekt(),
gjelder = it.gjelder,
refusjonsopplysninger = it.refusjonsopplysninger
) }
)
internal fun List<ArbeidsgiverInntektsopplysning>.validerSkjønnsmessigAltEllerIntet(skjæringstidspunkt: LocalDate) =
omregnetÅrsinntekter(skjæringstidspunkt, this).validerSkjønnsmessigAltEllerIntet()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ import no.nav.helse.person.inntekt.Sykepengegrunnlag.Begrensning.ER_6G_BEGRENSET
import no.nav.helse.person.inntekt.Sykepengegrunnlag.Begrensning.ER_IKKE_6G_BEGRENSET
import no.nav.helse.person.inntekt.Sykepengegrunnlag.Begrensning.VURDERT_I_INFOTRYGD
import no.nav.helse.utbetalingstidslinje.Begrunnelse
import no.nav.helse.utbetalingstidslinje.FaktaavklarteInntekter
import no.nav.helse.utbetalingstidslinje.Utbetalingstidslinje
import no.nav.helse.økonomi.Inntekt

Expand Down Expand Up @@ -504,6 +505,11 @@ internal class Sykepengegrunnlag private constructor(
oppfyllerMinsteinntektskrav = this.oppfyllerMinsteinntektskrav
)

internal fun faktaavklarteInntekter() = arbeidsgiverInntektsopplysninger.faktaavklarteInntekter(skjæringstidspunkt, `6G`)
internal fun faktaavklarteInntekter() = FaktaavklarteInntekter.VilkårsprøvdSkjæringstidspunkt(
skjæringstidspunkt = skjæringstidspunkt,
vurdertIInfotrygd = vurdertInfotrygd,
`6G` = `6G`,
inntekter = arbeidsgiverInntektsopplysninger.faktaavklarteInntekter()
)
}

Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ internal class Sykdomstidslinje private constructor(
internal fun arbeidsdager(periode: Periode, kilde: Hendelseskilde) =
Sykdomstidslinje(periode.associateWith { if (it.erHelg()) FriskHelgedag(it, kilde) else Arbeidsdag(it, kilde) })
internal fun ghostdager(periode: Periode) =
Sykdomstidslinje(periode.associateWith { if (it.erHelg()) UkjentDag(it, INGEN) else Arbeidsdag(it, INGEN) })
Sykdomstidslinje(periode.associateWith { if (it.erHelg()) UkjentDag(it, INGEN) else UkjentDag(it, INGEN) })

internal fun arbeidsdager(førsteDato: LocalDate, sisteDato: LocalDate, kilde: Hendelseskilde) =
arbeidsdager(Periode(førsteDato, sisteDato), kilde)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import no.nav.helse.person.aktivitetslogg.GodkjenningsbehovBuilder
import no.nav.helse.person.aktivitetslogg.IAktivitetslogg
import no.nav.helse.person.aktivitetslogg.Varselkode.RV_IM_3
import no.nav.helse.person.inntekt.Refusjonsopplysning
import no.nav.helse.sykdomstidslinje.Sykdomstidslinje
import no.nav.helse.ukedager
import no.nav.helse.utbetalingstidslinje.ArbeidsgiverRegler.Companion.NormalArbeidstaker

Expand Down Expand Up @@ -178,13 +177,6 @@ internal class Arbeidsgiverperiode private constructor(private val perioder: Lis
return aktivitetslogg
}

internal fun sykdomstidslinjeSomStrekkerSegUtoverArbeidsgiverperioden(sykdomstidslinje: Sykdomstidslinje): Sykdomstidslinje {
val periode = sykdomstidslinje.periode() ?: return Sykdomstidslinje()
val sisteDagIArbeidsgiverperioden = perioder.lastOrNull()?.endInclusive ?: return Sykdomstidslinje()
val periodeUtoverArbeidsgiverperioden = periode.beholdDagerEtter(sisteDagIArbeidsgiverperioden)?.utenHelgehale() ?: return Sykdomstidslinje()
return sykdomstidslinje.subset(periodeUtoverArbeidsgiverperioden)
}

private fun utbetalingsdagerI(periode: Periode) = periode.filter { dag -> utbetalingsdager.any { utbetalingsperiode -> dag in utbetalingsperiode }}

internal companion object {
Expand Down
Loading
Loading