|
| 1 | +package tilbakekreving.application.service.kravgrunnlag |
| 2 | + |
| 3 | +import arrow.core.Either |
| 4 | +import arrow.core.getOrElse |
| 5 | +import arrow.core.left |
| 6 | +import no.nav.su.se.bakover.common.persistence.SessionFactory |
| 7 | +import no.nav.su.se.bakover.common.tid.Tidspunkt |
| 8 | +import no.nav.su.se.bakover.domain.sak.SakService |
| 9 | +import no.nav.su.se.bakover.hendelse.domain.HendelseId |
| 10 | +import org.slf4j.LoggerFactory |
| 11 | +import tilbakekreving.domain.AvbruttTilbakekrevingsbehandling |
| 12 | +import tilbakekreving.domain.KanAnnullere |
| 13 | +import tilbakekreving.domain.TilbakekrevingsbehandlingRepo |
| 14 | +import tilbakekreving.domain.kravgrunnlag.AnnullerKravgrunnlagCommand |
| 15 | +import tilbakekreving.domain.kravgrunnlag.Kravgrunnlagstatus |
| 16 | +import tilbakekreving.domain.kravgrunnlag.påsak.KravgrunnlagStatusendringPåSakHendelse |
| 17 | +import tilbakekreving.domain.kravgrunnlag.repo.AnnullerKravgrunnlagStatusEndringMeta |
| 18 | +import tilbakekreving.domain.kravgrunnlag.repo.KravgrunnlagRepo |
| 19 | +import tilbakekreving.domain.vedtak.Tilbakekrevingsklient |
| 20 | +import tilgangstyring.application.TilgangstyringService |
| 21 | +import java.time.Clock |
| 22 | + |
| 23 | +class AnnullerKravgrunnlagService( |
| 24 | + private val tilgangstyring: TilgangstyringService, |
| 25 | + private val tilbakekrevingsbehandlingRepo: TilbakekrevingsbehandlingRepo, |
| 26 | + private val sakService: SakService, |
| 27 | + private val kravgrunnlagRepo: KravgrunnlagRepo, |
| 28 | + private val tilbakekrevingsklient: Tilbakekrevingsklient, |
| 29 | + private val sessionFactory: SessionFactory, |
| 30 | + private val clock: Clock, |
| 31 | +) { |
| 32 | + private val log = LoggerFactory.getLogger(this::class.java) |
| 33 | + |
| 34 | + fun annuller(command: AnnullerKravgrunnlagCommand): Either<KunneIkkeAnnullereKravgrunnlag, AvbruttTilbakekrevingsbehandling?> { |
| 35 | + tilgangstyring.assertHarTilgangTilSak(command.sakId).onLeft { |
| 36 | + return KunneIkkeAnnullereKravgrunnlag.IkkeTilgang(it).left() |
| 37 | + } |
| 38 | + val sak = sakService.hentSak(command.sakId).getOrElse { |
| 39 | + throw IllegalStateException("Kunne ikke oppdatere kravgrunnlag for tilbakekrevingsbehandling, fant ikke sak. Command: $command") |
| 40 | + } |
| 41 | + if (sak.versjon != command.klientensSisteSaksversjon) { |
| 42 | + log.info("Oppdater kravgrunnlag - Sakens versjon (${sak.versjon}) er ulik saksbehandlers versjon. Command: $command") |
| 43 | + } |
| 44 | + val tilbakekrevingsbehandlingHendelser = tilbakekrevingsbehandlingRepo.hentForSak(command.sakId) |
| 45 | + val uteståendeKravgrunnlagPåSak = tilbakekrevingsbehandlingHendelser.hentUteståendeKravgrunnlag() |
| 46 | + ?: return KunneIkkeAnnullereKravgrunnlag.SakenHarIkkeKravgrunnlagSomKanAnnulleres.left() |
| 47 | + val kravgrunnlag = tilbakekrevingsbehandlingHendelser.hentKravrunnlag(command.kravgrunnlagHendelseId) |
| 48 | + ?: return KunneIkkeAnnullereKravgrunnlag.FantIkkeKravgrunnlag.left() |
| 49 | + |
| 50 | + if (uteståendeKravgrunnlagPåSak.hendelseId != kravgrunnlag.hendelseId) { |
| 51 | + return KunneIkkeAnnullereKravgrunnlag.InnsendtHendelseIdErIkkeDenSistePåSaken.left() |
| 52 | + } |
| 53 | + |
| 54 | + val behandling = |
| 55 | + tilbakekrevingsbehandlingHendelser.hentBehandlingForKravgrunnlag(uteståendeKravgrunnlagPåSak.hendelseId) |
| 56 | + |
| 57 | + val (avbruttHendelse, avbruttBehandling) = behandling?.let { |
| 58 | + (it as? KanAnnullere)?.annuller( |
| 59 | + annulleringstidspunkt = Tidspunkt.now(clock), |
| 60 | + annullertAv = command.annullertAv, |
| 61 | + versjon = command.klientensSisteSaksversjon.inc(), |
| 62 | + ) ?: return KunneIkkeAnnullereKravgrunnlag.BehandlingenErIFeilTilstandForÅAnnullere.left() |
| 63 | + } ?: (null to null) |
| 64 | + |
| 65 | + return tilbakekrevingsklient.annullerKravgrunnlag(command.annullertAv, kravgrunnlag).mapLeft { |
| 66 | + KunneIkkeAnnullereKravgrunnlag.FeilMotTilbakekrevingskomponenten(it) |
| 67 | + }.map { råTilbakekrevingsvedtakForsendelse -> |
| 68 | + sessionFactory.withTransactionContext { |
| 69 | + kravgrunnlagRepo.lagreKravgrunnlagPåSakHendelse( |
| 70 | + KravgrunnlagStatusendringPåSakHendelse( |
| 71 | + hendelseId = HendelseId.generer(), |
| 72 | + versjon = if (avbruttHendelse == null) command.klientensSisteSaksversjon.inc() else command.klientensSisteSaksversjon.inc(2), |
| 73 | + sakId = sak.id, |
| 74 | + hendelsestidspunkt = Tidspunkt.now(clock), |
| 75 | + tidligereHendelseId = uteståendeKravgrunnlagPåSak.hendelseId, |
| 76 | + saksnummer = sak.saksnummer, |
| 77 | + eksternVedtakId = uteståendeKravgrunnlagPåSak.eksternVedtakId, |
| 78 | + status = Kravgrunnlagstatus.Annullert, |
| 79 | + eksternTidspunkt = råTilbakekrevingsvedtakForsendelse.tidspunkt, |
| 80 | + ), |
| 81 | + AnnullerKravgrunnlagStatusEndringMeta( |
| 82 | + correlationId = command.correlationId, |
| 83 | + ident = command.annullertAv, |
| 84 | + brukerroller = command.brukerroller, |
| 85 | + tilbakekrevingsvedtakForsendelse = råTilbakekrevingsvedtakForsendelse, |
| 86 | + ), |
| 87 | + it, |
| 88 | + ) |
| 89 | + if (avbruttHendelse != null) { |
| 90 | + tilbakekrevingsbehandlingRepo.lagre( |
| 91 | + hendelse = avbruttHendelse, |
| 92 | + meta = command.toDefaultHendelsesMetadata(), |
| 93 | + sessionContext = it, |
| 94 | + ) |
| 95 | + } |
| 96 | + } |
| 97 | + avbruttBehandling |
| 98 | + } |
| 99 | + } |
| 100 | +} |
0 commit comments