From 83f8cea15c4b32acffb56b1649e5be7ece557eb9 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Mon, 4 Sep 2023 14:21:18 +0200 Subject: [PATCH 1/7] =?UTF-8?q?journalf=C3=B8ring=20for=20frioppslaget=20a?= =?UTF-8?q?v=20skatt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/dokarkiv/JournalpostRequest.kt | 22 ++++++- .../client/dokarkiv/JournalpostSkattTest.kt | 2 +- .../infrastructure/web/Feilresponser.kt | 5 ++ .../domain/journalpost/JournalpostCommand.kt | 4 ++ .../domain/journalpost/JournalpostSkatt.kt | 15 ++++- .../Journalf\303\270ringService.kt" | 2 +- .../service/skatt/FrioppslagRequests.kt | 24 +++++++ .../service/skatt/FrioppslagSkattRequest.kt | 12 ---- .../Journalf\303\270rSkattDokumentService.kt" | 11 ++-- ...eGenerereSkattePdfOgJournalf\303\270re.kt" | 15 +++++ .../service/skatt/SkattDokumentService.kt | 1 + .../service/skatt/SkattDokumentServiceImpl.kt | 64 ++++++++++++++++--- .../se/bakover/service/skatt/SkatteService.kt | 2 +- .../service/skatt/SkatteServiceImpl.kt | 20 ++++-- .../skatt/SkattDokumentServiceImplTest.kt | 27 +++++--- .../service/skatt/SkatteServiceImplTest.kt | 20 ++++-- .../bakover/web/routes/skatt/SkatteRoute.kt | 37 ++++++++--- .../bakover/web/services/AccessCheckProxy.kt | 6 +- .../se/bakover/web/services/ServiceBuilder.kt | 6 ++ 19 files changed, 229 insertions(+), 66 deletions(-) create mode 100644 service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt delete mode 100644 service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagSkattRequest.kt create mode 100644 "service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/KunneIkkeGenerereSkattePdfOgJournalf\303\270re.kt" diff --git a/client/src/main/kotlin/no/nav/su/se/bakover/client/dokarkiv/JournalpostRequest.kt b/client/src/main/kotlin/no/nav/su/se/bakover/client/dokarkiv/JournalpostRequest.kt index b5fdd4b896..c5b4adad3b 100644 --- a/client/src/main/kotlin/no/nav/su/se/bakover/client/dokarkiv/JournalpostRequest.kt +++ b/client/src/main/kotlin/no/nav/su/se/bakover/client/dokarkiv/JournalpostRequest.kt @@ -7,7 +7,8 @@ import no.nav.su.se.bakover.domain.Behandlingstema import no.nav.su.se.bakover.domain.Tema import no.nav.su.se.bakover.domain.journalpost.JournalpostCommand import no.nav.su.se.bakover.domain.journalpost.JournalpostForSakCommand -import no.nav.su.se.bakover.domain.journalpost.JournalpostSkatt +import no.nav.su.se.bakover.domain.journalpost.JournalpostSkattForSak +import no.nav.su.se.bakover.domain.journalpost.JournalpostSkattUtenforSak import no.nav.su.se.bakover.domain.person.Person import no.nav.su.se.bakover.domain.sak.Sakstype import java.time.LocalDate @@ -37,7 +38,7 @@ internal fun JournalpostCommand.tilJson(): String { Sakstype.UFØRE -> Behandlingstema.SU_UFØRE_FLYKTNING.value } return when (this) { - is JournalpostSkatt -> JournalpostRequest( + is JournalpostSkattForSak -> JournalpostRequest( tittel = dokument.dokumentTittel, journalpostType = JournalPostType.NOTAT, kanal = null, @@ -93,6 +94,23 @@ internal fun JournalpostCommand.tilJson(): String { ), datoDokument = datoDokument, ) + + is JournalpostSkattUtenforSak -> JournalpostRequest( + tittel = dokument.tittel, + journalpostType = JournalPostType.NOTAT, + kanal = null, + behandlingstema = behandlingstema, + journalfoerendeEnhet = JournalførendeEnhet.AUTOMATISK.enhet, + avsenderMottaker = null, + bruker = bruker, + sak = Fagsak(this.fagsystemId), + dokumenter = JournalpostDokument.lagDokumenterForJournalpostForSak( + tittel = dokument.tittel, + pdf = dokument.generertDokument, + originalJson = dokument.generertDokumentJson, + ), + datoDokument = dokument.opprettet.toLocalDate(zoneIdOslo), + ) }.let { serialize(it) } diff --git a/client/src/test/kotlin/no/nav/su/se/bakover/client/dokarkiv/JournalpostSkattTest.kt b/client/src/test/kotlin/no/nav/su/se/bakover/client/dokarkiv/JournalpostSkattTest.kt index e232a8af7d..49f5851156 100644 --- a/client/src/test/kotlin/no/nav/su/se/bakover/client/dokarkiv/JournalpostSkattTest.kt +++ b/client/src/test/kotlin/no/nav/su/se/bakover/client/dokarkiv/JournalpostSkattTest.kt @@ -1,7 +1,7 @@ package no.nav.su.se.bakover.client.dokarkiv import io.kotest.matchers.shouldBe -import no.nav.su.se.bakover.domain.journalpost.JournalpostSkatt.Companion.lagJournalpost +import no.nav.su.se.bakover.domain.journalpost.JournalpostSkattForSak.Companion.lagJournalpost import no.nav.su.se.bakover.test.sakinfo import no.nav.su.se.bakover.test.skatt.nySkattedokumentGenerert import org.junit.jupiter.api.Test diff --git a/common/infrastructure/src/main/kotlin/no/nav/su/se/bakover/common/infrastructure/web/Feilresponser.kt b/common/infrastructure/src/main/kotlin/no/nav/su/se/bakover/common/infrastructure/web/Feilresponser.kt index 08cdb3a2dc..f5330d0fe7 100644 --- a/common/infrastructure/src/main/kotlin/no/nav/su/se/bakover/common/infrastructure/web/Feilresponser.kt +++ b/common/infrastructure/src/main/kotlin/no/nav/su/se/bakover/common/infrastructure/web/Feilresponser.kt @@ -338,6 +338,11 @@ data object Feilresponser { code = "nye_overlappende_vedtak", ) + val feilVedOpprettelseAvJournalpost = InternalServerError.errorJson( + "Feil ved opprettelse av journalpost", + "feil_ved_opprettelse_av_journalpost", + ) + data object Brev { val kunneIkkeGenerereBrev = InternalServerError.errorJson( "Kunne ikke generere brev", diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostCommand.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostCommand.kt index cc5ed989a1..8b55e441fd 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostCommand.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostCommand.kt @@ -14,6 +14,10 @@ sealed interface JournalpostCommand { val fnr: Fnr } +sealed interface JournalpostUtenforSakCommand : JournalpostCommand { + val fagsystemId: String +} + sealed interface JournalpostForSakCommand : JournalpostCommand { val saksnummer: Saksnummer diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostSkatt.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostSkatt.kt index 6f928049e9..8ce1f1b06a 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostSkatt.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostSkatt.kt @@ -1,5 +1,6 @@ package no.nav.su.se.bakover.domain.journalpost +import dokument.domain.Dokument import no.nav.su.se.bakover.common.domain.Saksnummer import no.nav.su.se.bakover.common.person.Fnr import no.nav.su.se.bakover.domain.sak.SakInfo @@ -9,7 +10,7 @@ import no.nav.su.se.bakover.domain.skatt.Skattedokument /** * kan brukes som mal for 'Notat' poster i Joark. */ -data class JournalpostSkatt( +data class JournalpostSkattForSak( override val saksnummer: Saksnummer, override val sakstype: Sakstype, override val fnr: Fnr, @@ -17,7 +18,7 @@ data class JournalpostSkatt( ) : JournalpostForSakCommand { companion object { - fun Skattedokument.lagJournalpost(sakInfo: SakInfo): JournalpostSkatt = JournalpostSkatt( + fun Skattedokument.lagJournalpost(sakInfo: SakInfo): JournalpostSkattForSak = JournalpostSkattForSak( saksnummer = sakInfo.saksnummer, sakstype = sakInfo.type, dokument = this, @@ -25,3 +26,13 @@ data class JournalpostSkatt( ) } } + +data class JournalpostSkattUtenforSak( + override val fnr: Fnr, + override val sakstype: Sakstype, + /** + * i contexten av skatt, er det mulig at fagsystemId'en er en sak vi har i systemet. Må sees sammen med sakstype. + */ + override val fagsystemId: String, + val dokument: Dokument.UtenMetadata, +) : JournalpostUtenforSakCommand diff --git "a/service/src/main/kotlin/no/nav/su/se/bakover/service/journalf\303\270ring/Journalf\303\270ringService.kt" "b/service/src/main/kotlin/no/nav/su/se/bakover/service/journalf\303\270ring/Journalf\303\270ringService.kt" index 5835151902..1d2686c6a4 100644 --- "a/service/src/main/kotlin/no/nav/su/se/bakover/service/journalf\303\270ring/Journalf\303\270ringService.kt" +++ "b/service/src/main/kotlin/no/nav/su/se/bakover/service/journalf\303\270ring/Journalf\303\270ringService.kt" @@ -22,7 +22,7 @@ class JournalføringService( ) { fun journalfør() { journalførDokumentService.journalfør() - journalførSkattDokumentService.journalfør() + journalførSkattDokumentService.journalførAlleSkattedokumenter() } } diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt new file mode 100644 index 0000000000..5943f8575b --- /dev/null +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt @@ -0,0 +1,24 @@ +package no.nav.su.se.bakover.service.skatt + +import no.nav.su.se.bakover.common.ident.NavIdentBruker +import no.nav.su.se.bakover.common.person.Fnr +import no.nav.su.se.bakover.domain.sak.Sakstype +import no.nav.su.se.bakover.domain.skatt.Skattegrunnlag +import java.time.Year + +data class FrioppslagSkattRequest( + val fnr: Fnr, + val år: Year, + val begrunnelse: String, + val saksbehandler: NavIdentBruker.Saksbehandler, + val sakstype: Sakstype, + val fagsystemId: String, +) + +data class GenererSkattPdfOgJournalførRequest( + val skattegrunnlag: Skattegrunnlag, + val begrunnelse: String, + val fnr: Fnr, + val sakstype: Sakstype, + val fagsystemId: String, +) diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagSkattRequest.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagSkattRequest.kt deleted file mode 100644 index 7501a380a1..0000000000 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagSkattRequest.kt +++ /dev/null @@ -1,12 +0,0 @@ -package no.nav.su.se.bakover.service.skatt - -import no.nav.su.se.bakover.common.ident.NavIdentBruker -import no.nav.su.se.bakover.common.person.Fnr -import java.time.Year - -data class FrioppslagSkattRequest( - val fnr: Fnr, - val år: Year, - val begrunnelse: String, - val saksbehandler: NavIdentBruker.Saksbehandler, -) diff --git "a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/Journalf\303\270rSkattDokumentService.kt" "b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/Journalf\303\270rSkattDokumentService.kt" index 439aa0970b..039cca09ea 100644 --- "a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/Journalf\303\270rSkattDokumentService.kt" +++ "b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/Journalf\303\270rSkattDokumentService.kt" @@ -6,7 +6,7 @@ import no.nav.su.se.bakover.client.dokarkiv.DokArkiv import no.nav.su.se.bakover.common.journal.JournalpostId import no.nav.su.se.bakover.domain.brev.KunneIkkeJournalføreDokument import no.nav.su.se.bakover.domain.journalpost.JournalpostCommand -import no.nav.su.se.bakover.domain.journalpost.JournalpostSkatt.Companion.lagJournalpost +import no.nav.su.se.bakover.domain.journalpost.JournalpostSkattForSak.Companion.lagJournalpost import no.nav.su.se.bakover.domain.sak.SakService import no.nav.su.se.bakover.domain.skatt.DokumentSkattRepo import no.nav.su.se.bakover.domain.skatt.Skattedokument @@ -17,7 +17,7 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory /** - * journalfører dokumenter tilhørende skatt. Ment å bli kallt fra en jobb + * journalfører dokumenter/pdf tilhørende skatt */ class JournalførSkattDokumentService( private val dokArkiv: DokArkiv, @@ -26,7 +26,10 @@ class JournalførSkattDokumentService( ) { val log: Logger = LoggerFactory.getLogger(this::class.java) - fun journalfør(): List { + /** + * Ment å bli kallt fra en jobb + */ + fun journalførAlleSkattedokumenter(): List { return dokumentSkattRepo.hentDokumenterForJournalføring() .map { skattedokument -> journalførSkattedokument(skattedokument).tilResultat(skattedokument, log) } .also { it.logResultat("Journalføring skatt", log) } @@ -43,7 +46,7 @@ class JournalførSkattDokumentService( } } - private fun journalfør(journalpost: JournalpostCommand): Either { + fun journalfør(journalpost: JournalpostCommand): Either { return dokArkiv.opprettJournalpost(journalpost) .mapLeft { log.error("Journalføring: Kunne ikke journalføre i eksternt system (joark/dokarkiv)") diff --git "a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/KunneIkkeGenerereSkattePdfOgJournalf\303\270re.kt" "b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/KunneIkkeGenerereSkattePdfOgJournalf\303\270re.kt" new file mode 100644 index 0000000000..281acb53da --- /dev/null +++ "b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/KunneIkkeGenerereSkattePdfOgJournalf\303\270re.kt" @@ -0,0 +1,15 @@ +package no.nav.su.se.bakover.service.skatt + +import no.nav.su.se.bakover.domain.brev.KunneIkkeJournalføreDokument +import no.nav.su.se.bakover.domain.skatt.KunneIkkeHenteSkattemelding + +sealed interface KunneIkkeGenerereSkattePdfOgJournalføre { + data class FeilVedGenereringAvPdf(val originalFeil: KunneIkkeHenteOgLagePdfAvSkattegrunnlag) : + KunneIkkeGenerereSkattePdfOgJournalføre + + data class FeilVedJournalføring(val originalFeil: KunneIkkeJournalføreDokument) : + KunneIkkeGenerereSkattePdfOgJournalføre + + data class FeilVedHentingAvSkattemelding(val originalFeil: KunneIkkeHenteSkattemelding) : + KunneIkkeGenerereSkattePdfOgJournalføre +} diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentService.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentService.kt index a9f19bb809..781b77e7a1 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentService.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentService.kt @@ -20,4 +20,5 @@ interface SkattDokumentService { ): Either fun lagre(skattedokument: Skattedokument, txc: TransactionContext) + fun genererSkattePdfOgJournalfør(request: GenererSkattPdfOgJournalførRequest): Either } diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt index 7522cd623e..4b06920881 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt @@ -4,6 +4,7 @@ import arrow.core.Either import arrow.core.getOrElse import arrow.core.left import arrow.core.right +import dokument.domain.Dokument import no.nav.su.se.bakover.client.pdf.PdfGenerator import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold.Companion.lagPdfInnhold @@ -11,7 +12,9 @@ import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagForPdf import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagMedFnr import no.nav.su.se.bakover.common.domain.PdfA import no.nav.su.se.bakover.common.persistence.TransactionContext +import no.nav.su.se.bakover.common.tid.Tidspunkt import no.nav.su.se.bakover.domain.grunnlag.EksterneGrunnlagSkatt +import no.nav.su.se.bakover.domain.journalpost.JournalpostSkattUtenforSak import no.nav.su.se.bakover.domain.person.PersonOppslag import no.nav.su.se.bakover.domain.skatt.DokumentSkattRepo import no.nav.su.se.bakover.domain.skatt.Skattedokument @@ -21,10 +24,14 @@ import no.nav.su.se.bakover.domain.vedtak.Stønadsvedtak import java.time.Clock import java.util.UUID +/** + * Service som 'gjør ting' med dokumenter/pdf tilhørende skatt + */ class SkattDokumentServiceImpl( private val pdfGenerator: PdfGenerator, private val personOppslag: PersonOppslag, private val dokumentSkattRepo: DokumentSkattRepo, + private val journalførSkattDokumentService: JournalførSkattDokumentService, private val clock: Clock, ) : SkattDokumentService { @@ -33,17 +40,56 @@ class SkattDokumentServiceImpl( txc: TransactionContext, ): Either = generer(vedtak).onRight { lagre(it, txc) } - override fun genererSkattePdf(begrunnelse: String, skattegrunnlag: Skattegrunnlag): Either { - val skattPdfInnhold = skattegrunnlag.lagPdfInnhold( + override fun genererSkattePdf( + begrunnelse: String, + skattegrunnlag: Skattegrunnlag, + ): Either { + return lagSkattePdfInnhold(begrunnelse, skattegrunnlag) + .getOrElse { return it.left() } + .let { + pdfGenerator.genererPdf(it).getOrElse { + return KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedPdfGenerering(it).left() + } + }.right() + } + + override fun genererSkattePdfOgJournalfør(request: GenererSkattPdfOgJournalførRequest): Either { + return lagSkattePdfInnhold(request.begrunnelse, request.skattegrunnlag) + .getOrElse { return KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedGenereringAvPdf(it).left() } + .let { + val pdf = pdfGenerator.genererPdf(it).getOrElse { + return KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedGenereringAvPdf( + KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedPdfGenerering(it), + ).left() + } + journalførSkattDokumentService.journalfør( + JournalpostSkattUtenforSak( + fnr = request.fnr, + sakstype = request.sakstype, + fagsystemId = request.fagsystemId, + dokument = Dokument.UtenMetadata.Informasjon.Annet( + id = UUID.randomUUID(), + opprettet = Tidspunkt.now(clock), + tittel = it.pdfTemplate.tittel(), + generertDokument = pdf, + generertDokumentJson = it.toJson(), + ), + ), + ).mapLeft { KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedJournalføring(it) }.map { pdf } + } + } + + private fun lagSkattePdfInnhold( + begrunnelse: String, + skattegrunnlag: Skattegrunnlag, + ): Either { + return skattegrunnlag.lagPdfInnhold( begrunnelse = begrunnelse, - navn = personOppslag.person(skattegrunnlag.fnr) - .getOrElse { return KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedHentingAvPerson(it).left() }.navn, + navn = personOppslag.person(skattegrunnlag.fnr).getOrElse { + return KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedHentingAvPerson(it).left() + }.navn, clock = clock, - ) - - return pdfGenerator.genererPdf(skattPdfInnhold).getOrElse { - return KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedPdfGenerering(it).left() - }.right() + ).right() } private fun generer(vedtak: Stønadsvedtak): Either { diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteService.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteService.kt index aca20801b6..33db027b13 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteService.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteService.kt @@ -19,5 +19,5 @@ interface SkatteService { yearRange: YearRange, ): Skattegrunnlag - fun hentOgLagPdfAvSamletSkattegrunnlagFor(request: FrioppslagSkattRequest): Either + fun hentLagOgJournalførSkattePdf(request: FrioppslagSkattRequest): Either } diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt index c409584ae9..9ae1e542d0 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt @@ -15,6 +15,9 @@ import java.time.Clock import java.time.Year import java.util.UUID +/** + * Har som ansvar å hente skattegrunnlaget, og gjøre noe videre med denne + */ class SkatteServiceImpl( private val skatteClient: Skatteoppslag, private val skattDokumentService: SkattDokumentService, @@ -48,9 +51,9 @@ class SkatteServiceImpl( årSpurtFor = yearRange, ) - override fun hentOgLagPdfAvSamletSkattegrunnlagFor( + override fun hentLagOgJournalførSkattePdf( request: FrioppslagSkattRequest, - ): Either { + ): Either { return Skattegrunnlag( id = UUID.randomUUID(), fnr = request.fnr, @@ -58,12 +61,17 @@ class SkatteServiceImpl( saksbehandler = request.saksbehandler, årsgrunnlag = skatteClient.hentSamletSkattegrunnlag(request.fnr, request.år) .hentMestGyldigeSkattegrunnlagEllerFeil() - .getOrElse { return KunneIkkeHenteOgLagePdfAvSkattegrunnlag.KunneIkkeHenteSkattemelding(it).left() }, + .getOrElse { return KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedHentingAvSkattemelding(it).left() }, årSpurtFor = request.år.toRange(), ).let { - skattDokumentService.genererSkattePdf( - begrunnelse = request.begrunnelse, - skattegrunnlag = it, + skattDokumentService.genererSkattePdfOgJournalfør( + GenererSkattPdfOgJournalførRequest( + skattegrunnlag = it, + begrunnelse = request.begrunnelse, + fnr = request.fnr, + sakstype = request.sakstype, + fagsystemId = request.fagsystemId, + ), ) } } diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt index 1b79d84bbb..97b97d885b 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt @@ -52,12 +52,13 @@ internal class SkattDokumentServiceImplTest { } val dokumentSkatt = mock {} - val service = SkattDokumentServiceImpl( + val service = mockedServices( pdfGenerator = pdfGeneratorMock, personOppslag = personMock, dokumentSkattRepo = dokumentSkatt, + journalførSkattDokumentService = mock(), clock = fixedClock, - ) + ).service val tx = TestSessionFactory.transactionContext val dokument = service.genererOgLagre(vedtak, tx) @@ -104,12 +105,13 @@ internal class SkattDokumentServiceImplTest { } val dokumentSkatt = mock {} - val service = SkattDokumentServiceImpl( + val service = mockedServices( pdfGenerator = pdfGeneratorMock, personOppslag = personMock, dokumentSkattRepo = dokumentSkatt, + journalførSkattDokumentService = mock(), clock = fixedClock, - ) + ).service val tx = TestSessionFactory.transactionContext val dokument = service.genererOgLagre(vedtak, tx) dokument.shouldBeRight() @@ -166,12 +168,13 @@ internal class SkattDokumentServiceImplTest { } val dokumentSkatt = mock {} - val service = SkattDokumentServiceImpl( + val service = mockedServices( pdfGenerator = pdfGeneratorMock, personOppslag = personMock, dokumentSkattRepo = dokumentSkatt, + journalførSkattDokumentService = mock(), clock = fixedClock, - ) + ).service val tx = TestSessionFactory.transactionContext val dokument = service.genererOgLagre(vedtak, tx) dokument.shouldBeRight() @@ -228,12 +231,13 @@ internal class SkattDokumentServiceImplTest { } val dokumentSkatt = mock {} - val service = SkattDokumentServiceImpl( + val service = mockedServices( pdfGenerator = pdfGeneratorMock, personOppslag = personMock, dokumentSkattRepo = dokumentSkatt, + journalførSkattDokumentService = mock(), clock = fixedClock, - ) + ).service val tx = TestSessionFactory.transactionContext val dokument = service.genererOgLagre(vedtak, tx) dokument.shouldBeRight() @@ -286,12 +290,13 @@ internal class SkattDokumentServiceImplTest { } val dokumentSkatt = mock {} - val service = SkattDokumentServiceImpl( + val service = mockedServices( pdfGenerator = pdfGeneratorMock, personOppslag = personMock, dokumentSkattRepo = dokumentSkatt, + journalførSkattDokumentService = mock(), clock = fixedClock, - ) + ).service val tx = TestSessionFactory.transactionContext val dokument = service.genererOgLagre(vedtak, tx) dokument.shouldBeRight() @@ -388,12 +393,14 @@ internal class SkattDokumentServiceImplTest { val pdfGenerator: PdfGenerator = mock(), val personOppslag: PersonOppslag = mock(), val dokumentSkattRepo: DokumentSkattRepo = mock(), + val journalførSkattDokumentService: JournalførSkattDokumentService = mock(), val clock: Clock = fixedClock, ) { val service = SkattDokumentServiceImpl( pdfGenerator = pdfGenerator, personOppslag = personOppslag, dokumentSkattRepo = dokumentSkattRepo, + journalførSkattDokumentService = journalførSkattDokumentService, clock = fixedClock, ) diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt index 153a881c06..b4c8cba14b 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt @@ -8,6 +8,7 @@ import io.kotest.matchers.shouldBe import no.nav.su.se.bakover.common.domain.PdfA import no.nav.su.se.bakover.common.tid.YearRange import no.nav.su.se.bakover.common.tid.toRange +import no.nav.su.se.bakover.domain.sak.Sakstype import no.nav.su.se.bakover.domain.skatt.KunneIkkeHenteSkattemelding import no.nav.su.se.bakover.domain.skatt.SamletSkattegrunnlagForÅr import no.nav.su.se.bakover.domain.skatt.SamletSkattegrunnlagForÅrOgStadie @@ -396,19 +397,21 @@ class SkatteServiceImplTest { } val skattDokumentService = mock { - on { genererSkattePdf(any(), any()) } doReturn PdfA("content".toByteArray()).right() + on { genererSkattePdfOgJournalfør(any()) } doReturn PdfA("content".toByteArray()).right() } mockedServices( skatteClient = skatteClient, skattDokumentService = skattDokumentService, ).let { - it.service.hentOgLagPdfAvSamletSkattegrunnlagFor( + it.service.hentLagOgJournalførSkattePdf( request = FrioppslagSkattRequest( fnr = fnr, år = Year.of(2021), begrunnelse = "begrunnelse for henting av skatte-data", saksbehandler = saksbehandler, + sakstype = Sakstype.ALDER, + fagsystemId = "29901", ), ).shouldBeRight() @@ -416,9 +419,16 @@ class SkatteServiceImplTest { argThat { it shouldBe fnr }, argThat { it shouldBe Year.of(2021) }, ) - verify(it.skattDokumentService).genererSkattePdf( - argThat { it shouldBe "begrunnelse for henting av skatte-data" }, - argThat { it shouldBe nySkattegrunnlag(id = it.id) }, + verify(it.skattDokumentService).genererSkattePdfOgJournalfør( + argThat { + it shouldBe GenererSkattPdfOgJournalførRequest( + skattegrunnlag = it.skattegrunnlag, + begrunnelse = "begrunnelse for henting av skatte-data", + fnr = fnr, + sakstype = Sakstype.ALDER, + fagsystemId = "29901", + ) + }, ) it.verifyNoMoreInteractions() } diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt index 259cc86451..125fcaf48a 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt @@ -10,6 +10,7 @@ import no.nav.su.se.bakover.common.audit.AuditLogEvent import no.nav.su.se.bakover.common.brukerrolle.Brukerrolle import no.nav.su.se.bakover.common.ident.NavIdentBruker import no.nav.su.se.bakover.common.infrastructure.web.ErrorJson +import no.nav.su.se.bakover.common.infrastructure.web.Feilresponser import no.nav.su.se.bakover.common.infrastructure.web.Resultat import no.nav.su.se.bakover.common.infrastructure.web.audit import no.nav.su.se.bakover.common.infrastructure.web.authorize @@ -18,8 +19,11 @@ import no.nav.su.se.bakover.common.infrastructure.web.svar import no.nav.su.se.bakover.common.infrastructure.web.withBody import no.nav.su.se.bakover.common.infrastructure.web.withFnr import no.nav.su.se.bakover.common.person.Fnr +import no.nav.su.se.bakover.domain.brev.KunneIkkeJournalføreDokument +import no.nav.su.se.bakover.domain.sak.Sakstype import no.nav.su.se.bakover.domain.skatt.KunneIkkeHenteSkattemelding import no.nav.su.se.bakover.service.skatt.FrioppslagSkattRequest +import no.nav.su.se.bakover.service.skatt.KunneIkkeGenerereSkattePdfOgJournalføre import no.nav.su.se.bakover.service.skatt.KunneIkkeHenteOgLagePdfAvSkattegrunnlag import no.nav.su.se.bakover.service.skatt.SkatteService import no.nav.su.se.bakover.web.routes.person.tilResultat @@ -31,6 +35,8 @@ internal fun Route.skattRoutes(skatteService: SkatteService) { data class FrioppslagRequestBody( val år: Int, val begrunnelse: String, + val sakstype: String, + val fagsystemId: String, ) { fun tilFrioppslagSkattRequest( fnr: Fnr, @@ -40,6 +46,8 @@ internal fun Route.skattRoutes(skatteService: SkatteService) { år = Year.of(år), begrunnelse = begrunnelse, saksbehandler = saksbehandler, + sakstype = Sakstype.from(sakstype), + fagsystemId = fagsystemId, ) } @@ -47,7 +55,7 @@ internal fun Route.skattRoutes(skatteService: SkatteService) { authorize(Brukerrolle.Saksbehandler, Brukerrolle.Attestant) { call.withFnr { fnr -> call.withBody { body -> - skatteService.hentOgLagPdfAvSamletSkattegrunnlagFor( + skatteService.hentLagOgJournalførSkattePdf( request = body.tilFrioppslagSkattRequest(fnr, call.suUserContext.saksbehandler), ).fold( ifLeft = { call.svar(it.tilResultat()) }, @@ -62,16 +70,25 @@ internal fun Route.skattRoutes(skatteService: SkatteService) { } } -internal fun KunneIkkeHenteOgLagePdfAvSkattegrunnlag.tilResultat(): Resultat { - return when (this) { - is KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedHentingAvPerson -> this.originalFeil.tilResultat() - is KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedPdfGenerering -> ErrorJson( - "Feil ved generering av pdf", - "feil_ved_generering_av_pdf", - ).tilResultat(HttpStatusCode.InternalServerError) +internal fun KunneIkkeGenerereSkattePdfOgJournalføre.tilResultat(): Resultat = when (this) { + is KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedGenereringAvPdf -> this.originalFeil.tilResultat() + is KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedHentingAvSkattemelding -> this.originalFeil.tilResultat() + is KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedJournalføring -> this.originalFeil.tilResultat() +} - is KunneIkkeHenteOgLagePdfAvSkattegrunnlag.KunneIkkeHenteSkattemelding -> this.originalFeil.tilResultat() - } +internal fun KunneIkkeJournalføreDokument.tilResultat(): Resultat = when (this) { + KunneIkkeJournalføreDokument.FeilVedOpprettelseAvJournalpost -> Feilresponser.feilVedOpprettelseAvJournalpost + KunneIkkeJournalføreDokument.KunneIkkeFinnePerson -> Feilresponser.fantIkkePerson +} + +internal fun KunneIkkeHenteOgLagePdfAvSkattegrunnlag.tilResultat(): Resultat = when (this) { + is KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedHentingAvPerson -> this.originalFeil.tilResultat() + is KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedPdfGenerering -> ErrorJson( + "Feil ved generering av pdf", + "feil_ved_generering_av_pdf", + ).tilResultat(HttpStatusCode.InternalServerError) + + is KunneIkkeHenteOgLagePdfAvSkattegrunnlag.KunneIkkeHenteSkattemelding -> this.originalFeil.tilResultat() } internal fun KunneIkkeHenteSkattemelding.tilResultat(): Resultat = when (this) { diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt index 044dec8a04..c0c4f0657c 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt @@ -201,7 +201,7 @@ import no.nav.su.se.bakover.service.klage.UnderkjennKlageRequest import no.nav.su.se.bakover.service.klage.VurderKlagevilkårRequest import no.nav.su.se.bakover.service.nøkkeltall.NøkkeltallService import no.nav.su.se.bakover.service.skatt.FrioppslagSkattRequest -import no.nav.su.se.bakover.service.skatt.KunneIkkeHenteOgLagePdfAvSkattegrunnlag +import no.nav.su.se.bakover.service.skatt.KunneIkkeGenerereSkattePdfOgJournalføre import no.nav.su.se.bakover.service.skatt.SkatteService import no.nav.su.se.bakover.service.statistikk.ResendStatistikkhendelserService import no.nav.su.se.bakover.service.søknad.AvslåSøknadManglendeDokumentasjonService @@ -1143,9 +1143,9 @@ open class AccessCheckProxy( return services.skatteService.hentSamletSkattegrunnlagForÅr(fnr, saksbehandler, yearRange) } - override fun hentOgLagPdfAvSamletSkattegrunnlagFor(request: FrioppslagSkattRequest): Either { + override fun hentLagOgJournalførSkattePdf(request: FrioppslagSkattRequest): Either { assertHarTilgangTilPerson(request.fnr) - return services.skatteService.hentOgLagPdfAvSamletSkattegrunnlagFor(request) + return services.skatteService.hentLagOgJournalførSkattePdf(request) } }, kontrollsamtaleSetup = object : KontrollsamtaleSetup { diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/ServiceBuilder.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/ServiceBuilder.kt index 59d7b47b26..7eb36236d4 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/ServiceBuilder.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/ServiceBuilder.kt @@ -24,6 +24,7 @@ import no.nav.su.se.bakover.service.revurdering.GjenopptaYtelseServiceImpl import no.nav.su.se.bakover.service.revurdering.RevurderingServiceImpl import no.nav.su.se.bakover.service.revurdering.StansYtelseServiceImpl import no.nav.su.se.bakover.service.sak.SakServiceImpl +import no.nav.su.se.bakover.service.skatt.JournalførSkattDokumentService import no.nav.su.se.bakover.service.skatt.SkattDokumentServiceImpl import no.nav.su.se.bakover.service.skatt.SkatteServiceImpl import no.nav.su.se.bakover.service.statistikk.ResendStatistikkhendelserServiceImpl @@ -123,6 +124,11 @@ data object ServiceBuilder { pdfGenerator = clients.pdfGenerator, personOppslag = clients.personOppslag, dokumentSkattRepo = databaseRepos.dokumentSkattRepo, + journalførSkattDokumentService = JournalførSkattDokumentService( + dokArkiv = clients.dokArkiv, + sakService = sakService, + dokumentSkattRepo = databaseRepos.dokumentSkattRepo, + ), clock = clock, ) From aab2af14fc4eb30834fd8b85c15b571d5e833898 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Mon, 4 Sep 2023 15:30:18 +0200 Subject: [PATCH 2/7] =?UTF-8?q?tester=20for=20journalf=C3=B8ring=20av=20sk?= =?UTF-8?q?att?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skatt/SkattDokumentServiceImplTest.kt | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt index 97b97d885b..3f58070714 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt @@ -2,6 +2,7 @@ package no.nav.su.se.bakover.service.skatt import arrow.core.nonEmptyListOf import arrow.core.right +import dokument.domain.Dokument import io.kotest.assertions.arrow.core.shouldBeRight import io.kotest.matchers.shouldBe import no.nav.su.se.bakover.client.pdf.PdfGenerator @@ -10,10 +11,14 @@ import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold.Companion.lagPd import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagForPdf import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagMedFnr import no.nav.su.se.bakover.common.domain.PdfA +import no.nav.su.se.bakover.common.extensions.trimWhitespace +import no.nav.su.se.bakover.common.journal.JournalpostId import no.nav.su.se.bakover.common.person.Fnr import no.nav.su.se.bakover.domain.brev.jsonRequest.PdfInnhold import no.nav.su.se.bakover.domain.grunnlag.EksterneGrunnlagSkatt +import no.nav.su.se.bakover.domain.journalpost.JournalpostSkattUtenforSak import no.nav.su.se.bakover.domain.person.PersonOppslag +import no.nav.su.se.bakover.domain.sak.Sakstype import no.nav.su.se.bakover.domain.skatt.DokumentSkattRepo import no.nav.su.se.bakover.test.TestSessionFactory import no.nav.su.se.bakover.test.argThat @@ -22,6 +27,7 @@ import no.nav.su.se.bakover.test.eksterneGrunnlag.eksternGrunnlagHentet import no.nav.su.se.bakover.test.eksterneGrunnlag.nyEksternGrunnlagHentetFeil import no.nav.su.se.bakover.test.fixedClock import no.nav.su.se.bakover.test.fixedTidspunkt +import no.nav.su.se.bakover.test.fnr import no.nav.su.se.bakover.test.iverksattSøknadsbehandling import no.nav.su.se.bakover.test.pdfATom import no.nav.su.se.bakover.test.person @@ -389,6 +395,105 @@ internal class SkattDokumentServiceImplTest { verifyNoMoreInteractions(pdfGenerator, personOppslag) } + @Test + fun `lager skatte pdf, og journalfører den`() { + val pdf = pdfATom() + val skattegrunnlag = nySkattegrunnlag() + val person = person() + val pdfGenerator = mock { + on { genererPdf(any()) } doReturn pdf.right() + } + val personOppslag = mock { + on { person(any()) } doReturn person.right() + } + val journalførSkattDokumentService = mock { + on { journalfør(any()) } doReturn JournalpostId("journalpostId").right() + } + + mockedServices( + pdfGenerator = pdfGenerator, + personOppslag = personOppslag, + journalførSkattDokumentService = journalførSkattDokumentService, + ).let { + it.service.genererSkattePdfOgJournalfør( + GenererSkattPdfOgJournalførRequest( + skattegrunnlag = skattegrunnlag, + begrunnelse = "begrunnelse", + fnr = fnr, + sakstype = Sakstype.ALDER, + fagsystemId = "saksnummer som ikke 'tilhører' oss", + ), + ).shouldBeRight() + + verify(personOppslag).person(argThat { it shouldBe fnr }) + verify(pdfGenerator).genererPdf( + argThat { + it shouldBe skattegrunnlag.lagPdfInnhold( + begrunnelse = "begrunnelse", + navn = person.navn, + clock = fixedClock, + ) + }, + ) + + verify(journalførSkattDokumentService).journalfør( + argThat { + (it as JournalpostSkattUtenforSak) shouldBe JournalpostSkattUtenforSak( + fnr = fnr, + sakstype = Sakstype.ALDER, + fagsystemId = "saksnummer som ikke 'tilhører' oss", + dokument = Dokument.UtenMetadata.Informasjon.Annet( + id = it.dokument.id, + opprettet = fixedTidspunkt, + tittel = "Skattegrunnlag", + generertDokument = pdf, + generertDokumentJson = """ + { + "saksnummer":null, + "behandlingstype":"Frioppslag", + "behandlingsId":null, + "vedtaksId":null, + "hentet":"2021-01-01T01:02:03.456789Z", + "opprettet":"2021-01-01T01:02:03.456789Z", + "søkers":{ + "fnr":"$fnr", + "navn":{ + "fornavn":"Tore", + "mellomnavn":"Johnas", + "etternavn":"Strømøy" + }, + "årsgrunnlag":[ + { + "type":"HarSkattegrunnlag", + "år":2021, + "stadie":"Oppgjør", + "oppgjørsdato":null, + "formue":[{"tekniskNavn":"bruttoformue","beløp":"1238","spesifisering":[]},{"tekniskNavn":"formuesverdiForKjoeretoey","beløp":"20000","spesifisering":[]}], + "inntekt":[{"tekniskNavn":"alminneligInntektFoerSaerfradrag","beløp":"1000","spesifisering":[]}], + "inntektsfradrag":[{"tekniskNavn":"fradragForFagforeningskontingent","beløp":"4000","spesifisering":[]}], + "formuesfradrag":[{"tekniskNavn":"samletAnnenGjeld","beløp":"6000","spesifisering":[]}], + "verdsettingsrabattSomGirGjeldsreduksjon":[{"tekniskNavn":"fradragForFagforeningskontingent","beløp":"4000","spesifisering":[]}], + "oppjusteringAvEierinntekter":[{"tekniskNavn":"fradragForFagforeningskontingent","beløp":"4000","spesifisering":[]}], + "manglerKategori":[{"tekniskNavn":"fradragForFagforeningskontingent","beløp":"4000","spesifisering":[]}], + "annet":[{"tekniskNavn":"fradragForFagforeningskontingent","beløp":"4000","spesifisering":[]}], + "kjøretøy":[{"beløp":"15000","registreringsnummer":"AB12345","fabrikatnavn":"Troll","årForFørstegangsregistrering":"1957","formuesverdi":"15000","antattVerdiSomNytt":null,"antattMarkedsverdi":null},{"beløp":"5000","registreringsnummer":"BC67890","fabrikatnavn":"Think","årForFørstegangsregistrering":"2003","formuesverdi":"5000","antattVerdiSomNytt":null,"antattMarkedsverdi":null}] + } + ] + }, + "eps":null, + "begrunnelse":"begrunnelse", + "erAldersbrev":false + } + """.trimIndent().trimWhitespace(), + ), + ) + }, + ) + + it.verifyNoMoreInteractions() + } + } + private data class mockedServices( val pdfGenerator: PdfGenerator = mock(), val personOppslag: PersonOppslag = mock(), From a57a376a7972d4a1ef238cc09f2e3c5f024fdf21 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Tue, 5 Sep 2023 10:02:09 +0200 Subject: [PATCH 3/7] legg inn litt logging --- .../service/skatt/SkattDokumentServiceImpl.kt | 13 ++++++++++++- .../se/bakover/service/skatt/SkatteServiceImpl.kt | 5 +++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt index 4b06920881..0e22852b2d 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt @@ -21,6 +21,8 @@ import no.nav.su.se.bakover.domain.skatt.Skattedokument import no.nav.su.se.bakover.domain.skatt.Skattegrunnlag import no.nav.su.se.bakover.domain.vedtak.KunneIkkeGenerereSkattedokument import no.nav.su.se.bakover.domain.vedtak.Stønadsvedtak +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.time.Clock import java.util.UUID @@ -35,6 +37,8 @@ class SkattDokumentServiceImpl( private val clock: Clock, ) : SkattDokumentService { + private val log: Logger = LoggerFactory.getLogger(this::class.java) + override fun genererOgLagre( vedtak: Stønadsvedtak, txc: TransactionContext, @@ -62,6 +66,8 @@ class SkattDokumentServiceImpl( KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedPdfGenerering(it), ).left() } + log.info("Genererte skatte-pdf for sakstype ${request.sakstype} med fagsystemId ${request.fagsystemId}") + journalførSkattDokumentService.journalfør( JournalpostSkattUtenforSak( fnr = request.fnr, @@ -75,7 +81,12 @@ class SkattDokumentServiceImpl( generertDokumentJson = it.toJson(), ), ), - ).mapLeft { KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedJournalføring(it) }.map { pdf } + ).mapLeft { + KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedJournalføring(it) + }.map { + log.info("Journalførte skatte-pdf for sakstype ${request.sakstype} med fagsystemId ${request.fagsystemId}. Fikk journalpostId $it") + pdf + } } } diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt index 9ae1e542d0..693a82cb64 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt @@ -11,6 +11,8 @@ import no.nav.su.se.bakover.common.tid.YearRange import no.nav.su.se.bakover.common.tid.toRange import no.nav.su.se.bakover.domain.skatt.Skattegrunnlag import no.nav.su.se.bakover.domain.skatt.Skatteoppslag +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.time.Clock import java.time.Year import java.util.UUID @@ -24,6 +26,8 @@ class SkatteServiceImpl( val clock: Clock, ) : SkatteService { + private val log: Logger = LoggerFactory.getLogger(this::class.java) + override fun hentSamletSkattegrunnlag( fnr: Fnr, saksbehandler: NavIdentBruker.Saksbehandler, @@ -64,6 +68,7 @@ class SkatteServiceImpl( .getOrElse { return KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedHentingAvSkattemelding(it).left() }, årSpurtFor = request.år.toRange(), ).let { + log.info("Hentet skattegrunnlag for sakstype ${request.sakstype} med fagsystemId ${request.fagsystemId}") skattDokumentService.genererSkattePdfOgJournalfør( GenererSkattPdfOgJournalførRequest( skattegrunnlag = it, From f5a35d266ee66a777ea7bb651a1917220e0a53c9 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Tue, 5 Sep 2023 10:49:32 +0200 Subject: [PATCH 4/7] =?UTF-8?q?route=20&=20impl=20for=20=C3=A5=20forh?= =?UTF-8?q?=C3=A5ndsvise=20skatte-pdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/pdf/SkattegrunnlagsPdfInnhold.kt | 10 ++++-- .../service/skatt/FrioppslagRequests.kt | 2 +- .../service/skatt/SkattDokumentService.kt | 10 ++---- .../service/skatt/SkattDokumentServiceImpl.kt | 28 +++++++++++---- .../se/bakover/service/skatt/SkatteService.kt | 1 + .../service/skatt/SkatteServiceImpl.kt | 25 ++++++++++++- .../skatt/SkattDokumentServiceImplTest.kt | 35 ++++++++++++------- .../service/skatt/SkatteServiceImplTest.kt | 2 +- .../bakover/web/routes/skatt/SkatteRoute.kt | 18 ++++++++++ .../bakover/web/services/AccessCheckProxy.kt | 6 ++++ 10 files changed, 105 insertions(+), 32 deletions(-) diff --git a/client/src/main/kotlin/no/nav/su/se/bakover/client/pdf/SkattegrunnlagsPdfInnhold.kt b/client/src/main/kotlin/no/nav/su/se/bakover/client/pdf/SkattegrunnlagsPdfInnhold.kt index 398633458f..681e08d8f3 100644 --- a/client/src/main/kotlin/no/nav/su/se/bakover/client/pdf/SkattegrunnlagsPdfInnhold.kt +++ b/client/src/main/kotlin/no/nav/su/se/bakover/client/pdf/SkattegrunnlagsPdfInnhold.kt @@ -9,6 +9,7 @@ import no.nav.su.se.bakover.domain.brev.PdfTemplateMedDokumentNavn import no.nav.su.se.bakover.domain.brev.SkattegrunnlagPdfTemplate import no.nav.su.se.bakover.domain.brev.jsonRequest.PdfInnhold import no.nav.su.se.bakover.domain.person.Person +import no.nav.su.se.bakover.domain.sak.Sakstype import no.nav.su.se.bakover.domain.skatt.SamletSkattegrunnlagForÅrOgStadie import no.nav.su.se.bakover.domain.skatt.Skattegrunnlag import java.time.Clock @@ -17,6 +18,7 @@ import java.util.UUID data class SkattegrunnlagsPdfInnhold private constructor( val saksnummer: String?, val behandlingstype: BehandlingstypeForSkattemelding, + override val sakstype: Sakstype, val behandlingsId: UUID?, val vedtaksId: UUID?, val hentet: Tidspunkt, @@ -39,6 +41,7 @@ data class SkattegrunnlagsPdfInnhold private constructor( ): SkattegrunnlagsPdfInnhold = SkattegrunnlagsPdfInnhold( saksnummer = saksnummer.toString(), behandlingstype = BehandlingstypeForSkattemelding.Søknadsbehandling, + sakstype = Sakstype.UFØRE, behandlingsId = søknadsbehandlingsId, vedtaksId = vedtaksId, hentet = hentet, @@ -52,13 +55,16 @@ data class SkattegrunnlagsPdfInnhold private constructor( begrunnelse = null, ) - fun Skattegrunnlag.lagPdfInnhold( + fun Skattegrunnlag.lagPdfInnholdFraFrioppslag( + fagsystemId: String, + sakstype: Sakstype, begrunnelse: String?, navn: Person.Navn, clock: Clock, ): SkattegrunnlagsPdfInnhold = SkattegrunnlagsPdfInnhold( - saksnummer = null, + saksnummer = fagsystemId, behandlingstype = BehandlingstypeForSkattemelding.Frioppslag, + sakstype = sakstype, behandlingsId = null, vedtaksId = null, hentet = this.hentetTidspunkt, diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt index 5943f8575b..971d430015 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt @@ -15,7 +15,7 @@ data class FrioppslagSkattRequest( val fagsystemId: String, ) -data class GenererSkattPdfOgJournalførRequest( +data class GenererSkattPdfRequest( val skattegrunnlag: Skattegrunnlag, val begrunnelse: String, val fnr: Fnr, diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentService.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentService.kt index 781b77e7a1..eedeac59af 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentService.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentService.kt @@ -4,7 +4,6 @@ import arrow.core.Either import no.nav.su.se.bakover.common.domain.PdfA import no.nav.su.se.bakover.common.persistence.TransactionContext import no.nav.su.se.bakover.domain.skatt.Skattedokument -import no.nav.su.se.bakover.domain.skatt.Skattegrunnlag import no.nav.su.se.bakover.domain.vedtak.KunneIkkeGenerereSkattedokument import no.nav.su.se.bakover.domain.vedtak.Stønadsvedtak @@ -14,11 +13,8 @@ interface SkattDokumentService { txc: TransactionContext, ): Either - fun genererSkattePdf( - begrunnelse: String, - skattegrunnlag: Skattegrunnlag, - ): Either - fun lagre(skattedokument: Skattedokument, txc: TransactionContext) - fun genererSkattePdfOgJournalfør(request: GenererSkattPdfOgJournalførRequest): Either + + fun genererSkattePdf(request: GenererSkattPdfRequest): Either + fun genererSkattePdfOgJournalfør(request: GenererSkattPdfRequest): Either } diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt index 0e22852b2d..251c9924c3 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt @@ -7,7 +7,7 @@ import arrow.core.right import dokument.domain.Dokument import no.nav.su.se.bakover.client.pdf.PdfGenerator import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold -import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold.Companion.lagPdfInnhold +import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold.Companion.lagPdfInnholdFraFrioppslag import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagForPdf import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagMedFnr import no.nav.su.se.bakover.common.domain.PdfA @@ -16,6 +16,7 @@ import no.nav.su.se.bakover.common.tid.Tidspunkt import no.nav.su.se.bakover.domain.grunnlag.EksterneGrunnlagSkatt import no.nav.su.se.bakover.domain.journalpost.JournalpostSkattUtenforSak import no.nav.su.se.bakover.domain.person.PersonOppslag +import no.nav.su.se.bakover.domain.sak.Sakstype import no.nav.su.se.bakover.domain.skatt.DokumentSkattRepo import no.nav.su.se.bakover.domain.skatt.Skattedokument import no.nav.su.se.bakover.domain.skatt.Skattegrunnlag @@ -45,10 +46,14 @@ class SkattDokumentServiceImpl( ): Either = generer(vedtak).onRight { lagre(it, txc) } override fun genererSkattePdf( - begrunnelse: String, - skattegrunnlag: Skattegrunnlag, + request: GenererSkattPdfRequest, ): Either { - return lagSkattePdfInnhold(begrunnelse, skattegrunnlag) + return lagSkattePdfInnhold( + fagsystemId = request.fagsystemId, + sakstype = request.sakstype, + begrunnelse = request.begrunnelse, + skattegrunnlag = request.skattegrunnlag, + ) .getOrElse { return it.left() } .let { pdfGenerator.genererPdf(it).getOrElse { @@ -57,8 +62,13 @@ class SkattDokumentServiceImpl( }.right() } - override fun genererSkattePdfOgJournalfør(request: GenererSkattPdfOgJournalførRequest): Either { - return lagSkattePdfInnhold(request.begrunnelse, request.skattegrunnlag) + override fun genererSkattePdfOgJournalfør(request: GenererSkattPdfRequest): Either { + return lagSkattePdfInnhold( + fagsystemId = request.fagsystemId, + sakstype = request.sakstype, + begrunnelse = request.begrunnelse, + skattegrunnlag = request.skattegrunnlag, + ) .getOrElse { return KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedGenereringAvPdf(it).left() } .let { val pdf = pdfGenerator.genererPdf(it).getOrElse { @@ -91,10 +101,14 @@ class SkattDokumentServiceImpl( } private fun lagSkattePdfInnhold( + fagsystemId: String, + sakstype: Sakstype, begrunnelse: String, skattegrunnlag: Skattegrunnlag, ): Either { - return skattegrunnlag.lagPdfInnhold( + return skattegrunnlag.lagPdfInnholdFraFrioppslag( + fagsystemId = fagsystemId, + sakstype = sakstype, begrunnelse = begrunnelse, navn = personOppslag.person(skattegrunnlag.fnr).getOrElse { return KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedHentingAvPerson(it).left() diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteService.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteService.kt index 33db027b13..32e1321d0b 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteService.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteService.kt @@ -19,5 +19,6 @@ interface SkatteService { yearRange: YearRange, ): Skattegrunnlag + fun hentOgLagSkattePdf(request: FrioppslagSkattRequest): Either fun hentLagOgJournalførSkattePdf(request: FrioppslagSkattRequest): Either } diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt index 693a82cb64..5ac7a9dd06 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt @@ -55,6 +55,29 @@ class SkatteServiceImpl( årSpurtFor = yearRange, ) + override fun hentOgLagSkattePdf(request: FrioppslagSkattRequest): Either { + return Skattegrunnlag( + id = UUID.randomUUID(), + fnr = request.fnr, + hentetTidspunkt = Tidspunkt.now(clock), + saksbehandler = request.saksbehandler, + årsgrunnlag = skatteClient.hentSamletSkattegrunnlag(request.fnr, request.år) + .hentMestGyldigeSkattegrunnlagEllerFeil() + .getOrElse { return KunneIkkeHenteOgLagePdfAvSkattegrunnlag.KunneIkkeHenteSkattemelding(it).left() }, + årSpurtFor = request.år.toRange(), + ).let { + skattDokumentService.genererSkattePdf( + GenererSkattPdfRequest( + skattegrunnlag = it, + begrunnelse = request.begrunnelse, + fnr = request.fnr, + sakstype = request.sakstype, + fagsystemId = request.fagsystemId, + ), + ) + } + } + override fun hentLagOgJournalførSkattePdf( request: FrioppslagSkattRequest, ): Either { @@ -70,7 +93,7 @@ class SkatteServiceImpl( ).let { log.info("Hentet skattegrunnlag for sakstype ${request.sakstype} med fagsystemId ${request.fagsystemId}") skattDokumentService.genererSkattePdfOgJournalfør( - GenererSkattPdfOgJournalførRequest( + GenererSkattPdfRequest( skattegrunnlag = it, begrunnelse = request.begrunnelse, fnr = request.fnr, diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt index 3f58070714..93dc0b385e 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt @@ -7,7 +7,7 @@ import io.kotest.assertions.arrow.core.shouldBeRight import io.kotest.matchers.shouldBe import no.nav.su.se.bakover.client.pdf.PdfGenerator import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold -import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold.Companion.lagPdfInnhold +import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold.Companion.lagPdfInnholdFraFrioppslag import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagForPdf import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagMedFnr import no.nav.su.se.bakover.common.domain.PdfA @@ -377,17 +377,24 @@ internal class SkattDokumentServiceImplTest { mockedServices(pdfGenerator = pdfGenerator, personOppslag = personOppslag).let { it.service.genererSkattePdf( - begrunnelse = "begrunnelse", - skattegrunnlag = skattegrunnlag, + request = GenererSkattPdfRequest( + skattegrunnlag = skattegrunnlag, + begrunnelse = "begrunnelse", + fnr = fnr, + sakstype = Sakstype.UFØRE, + fagsystemId = "fagsystemId", + ), ).shouldBeRight() verify(personOppslag).person(argThat { it shouldBe skattegrunnlag.fnr }) verify(pdfGenerator).genererPdf( argThat { - it shouldBe skattegrunnlag.lagPdfInnhold( - "begrunnelse", - person.navn, - fixedClock, + it shouldBe skattegrunnlag.lagPdfInnholdFraFrioppslag( + fagsystemId = "fagsystemId", + sakstype = Sakstype.UFØRE, + begrunnelse = "begrunnelse", + navn = person.navn, + clock = fixedClock, ) }, ) @@ -416,19 +423,21 @@ internal class SkattDokumentServiceImplTest { journalførSkattDokumentService = journalførSkattDokumentService, ).let { it.service.genererSkattePdfOgJournalfør( - GenererSkattPdfOgJournalførRequest( + GenererSkattPdfRequest( skattegrunnlag = skattegrunnlag, begrunnelse = "begrunnelse", fnr = fnr, sakstype = Sakstype.ALDER, - fagsystemId = "saksnummer som ikke 'tilhører' oss", + fagsystemId = "fagsystemId", ), ).shouldBeRight() verify(personOppslag).person(argThat { it shouldBe fnr }) verify(pdfGenerator).genererPdf( argThat { - it shouldBe skattegrunnlag.lagPdfInnhold( + it shouldBe skattegrunnlag.lagPdfInnholdFraFrioppslag( + fagsystemId = "fagsystemId", + sakstype = Sakstype.ALDER, begrunnelse = "begrunnelse", navn = person.navn, clock = fixedClock, @@ -441,7 +450,7 @@ internal class SkattDokumentServiceImplTest { (it as JournalpostSkattUtenforSak) shouldBe JournalpostSkattUtenforSak( fnr = fnr, sakstype = Sakstype.ALDER, - fagsystemId = "saksnummer som ikke 'tilhører' oss", + fagsystemId = "fagsystemId", dokument = Dokument.UtenMetadata.Informasjon.Annet( id = it.dokument.id, opprettet = fixedTidspunkt, @@ -449,7 +458,7 @@ internal class SkattDokumentServiceImplTest { generertDokument = pdf, generertDokumentJson = """ { - "saksnummer":null, + "saksnummer":"fagsystemId", "behandlingstype":"Frioppslag", "behandlingsId":null, "vedtaksId":null, @@ -482,7 +491,7 @@ internal class SkattDokumentServiceImplTest { }, "eps":null, "begrunnelse":"begrunnelse", - "erAldersbrev":false + "erAldersbrev":true } """.trimIndent().trimWhitespace(), ), diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt index b4c8cba14b..4f8cfb5570 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt @@ -421,7 +421,7 @@ class SkatteServiceImplTest { ) verify(it.skattDokumentService).genererSkattePdfOgJournalfør( argThat { - it shouldBe GenererSkattPdfOgJournalførRequest( + it shouldBe GenererSkattPdfRequest( skattegrunnlag = it.skattegrunnlag, begrunnelse = "begrunnelse for henting av skatte-data", fnr = fnr, diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt index 125fcaf48a..17d6cf751d 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt @@ -51,6 +51,24 @@ internal fun Route.skattRoutes(skatteService: SkatteService) { ) } + post("$skattPath/person/{fnr}/forhandsvis") { + authorize(Brukerrolle.Saksbehandler, Brukerrolle.Attestant) { + call.withFnr { fnr -> + call.withBody { body -> + skatteService.hentOgLagSkattePdf( + request = body.tilFrioppslagSkattRequest(fnr, call.suUserContext.saksbehandler), + ).fold( + ifLeft = { call.svar(it.tilResultat()) }, + ifRight = { + call.audit(fnr, AuditLogEvent.Action.SEARCH, null) + call.respondBytes(it.getContent(), ContentType.Application.Pdf) + }, + ) + } + } + } + } + post("$skattPath/person/{fnr}") { authorize(Brukerrolle.Saksbehandler, Brukerrolle.Attestant) { call.withFnr { fnr -> diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt index c0c4f0657c..4b3292292a 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt @@ -202,6 +202,7 @@ import no.nav.su.se.bakover.service.klage.VurderKlagevilkårRequest import no.nav.su.se.bakover.service.nøkkeltall.NøkkeltallService import no.nav.su.se.bakover.service.skatt.FrioppslagSkattRequest import no.nav.su.se.bakover.service.skatt.KunneIkkeGenerereSkattePdfOgJournalføre +import no.nav.su.se.bakover.service.skatt.KunneIkkeHenteOgLagePdfAvSkattegrunnlag import no.nav.su.se.bakover.service.skatt.SkatteService import no.nav.su.se.bakover.service.statistikk.ResendStatistikkhendelserService import no.nav.su.se.bakover.service.søknad.AvslåSøknadManglendeDokumentasjonService @@ -1143,6 +1144,11 @@ open class AccessCheckProxy( return services.skatteService.hentSamletSkattegrunnlagForÅr(fnr, saksbehandler, yearRange) } + override fun hentOgLagSkattePdf(request: FrioppslagSkattRequest): Either { + assertHarTilgangTilPerson(request.fnr) + return services.skatteService.hentOgLagSkattePdf(request) + } + override fun hentLagOgJournalførSkattePdf(request: FrioppslagSkattRequest): Either { assertHarTilgangTilPerson(request.fnr) return services.skatteService.hentLagOgJournalførSkattePdf(request) From d0a8b901746a3cff5436790b90ae35478d555118 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Tue, 5 Sep 2023 10:59:22 +0200 Subject: [PATCH 5/7] =?UTF-8?q?test=20for=20forh=C3=A5ndsvisning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/skatt/SkatteServiceImplTest.kt | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt index 4f8cfb5570..9744a02360 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt @@ -389,7 +389,53 @@ class SkatteServiceImplTest { } @Test - fun `henter skattegrunnlag og lager pdf av den`() { + fun `henter skattegrunnlag og lager pdf av den for forhåndsvisning`() { + val samletSkattegrunnlag = nySamletSkattegrunnlagForÅr() + + val skatteClient = mock { + on { hentSamletSkattegrunnlag(any(), any()) } doReturn samletSkattegrunnlag + } + + val skattDokumentService = mock { + on { genererSkattePdf(any()) } doReturn PdfA("content".toByteArray()).right() + } + + mockedServices( + skatteClient = skatteClient, + skattDokumentService = skattDokumentService, + ).let { + it.service.hentOgLagSkattePdf( + request = FrioppslagSkattRequest( + fnr = fnr, + år = Year.of(2021), + begrunnelse = "begrunnelse for henting av skatte-data", + saksbehandler = saksbehandler, + sakstype = Sakstype.ALDER, + fagsystemId = "29901", + ), + ).shouldBeRight() + + verify(it.skatteClient).hentSamletSkattegrunnlag( + argThat { it shouldBe fnr }, + argThat { it shouldBe Year.of(2021) }, + ) + verify(it.skattDokumentService).genererSkattePdf( + argThat { + it shouldBe GenererSkattPdfRequest( + skattegrunnlag = it.skattegrunnlag, + begrunnelse = "begrunnelse for henting av skatte-data", + fnr = fnr, + sakstype = Sakstype.ALDER, + fagsystemId = "29901", + ) + }, + ) + it.verifyNoMoreInteractions() + } + } + + @Test + fun `henter skattegrunnlag og lager pdf av den for journalføring`() { val samletSkattegrunnlag = nySamletSkattegrunnlagForÅr() val skatteClient = mock { From d15fbca7fe83c75d088306d41d05701a38985b53 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Tue, 5 Sep 2023 12:36:06 +0200 Subject: [PATCH 6/7] enkel fagsystemid validering + send sakstype til pdfgen --- .../domain/brev/jsonRequest/PdfInnhold.kt | 1 - .../domain/journalpost/JournalpostSkatt.kt | 43 ++++++++++++++++++- .../KunneIkkeLageJournalpostUtenforSak.kt | 5 +++ .../domain/brev/AvslagsPdfInnholdTest.kt | 3 ++ .../se/bakover/domain/brev/PdfInnholdTest.kt | 5 +++ ...eGenerereSkattePdfOgJournalf\303\270re.kt" | 4 ++ .../service/skatt/SkattDokumentServiceImpl.kt | 6 ++- .../service/brev/BrevServiceImplTest.kt | 2 +- .../skatt/SkattDokumentServiceImplTest.kt | 3 +- .../bakover/web/routes/skatt/SkatteRoute.kt | 15 +++++++ 10 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/KunneIkkeLageJournalpostUtenforSak.kt diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/brev/jsonRequest/PdfInnhold.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/brev/jsonRequest/PdfInnhold.kt index 809a05ac76..61ed17b0d9 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/brev/jsonRequest/PdfInnhold.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/brev/jsonRequest/PdfInnhold.kt @@ -45,7 +45,6 @@ abstract class PdfInnhold { // TODO CHM 05.05.2021: Se på å samle mer av det som er felles for brevinnholdene, f.eks. personalia // TODO ØH 21.06.2022: Denne bør være abstract på sikt, og settes for alle brev eksplisitt - @get:JsonIgnore open val sakstype: Sakstype = Sakstype.UFØRE @JsonProperty diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostSkatt.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostSkatt.kt index 8ce1f1b06a..9ba4eebfec 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostSkatt.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/JournalpostSkatt.kt @@ -1,11 +1,17 @@ package no.nav.su.se.bakover.domain.journalpost +import arrow.core.Either +import arrow.core.getOrElse +import arrow.core.left +import arrow.core.right import dokument.domain.Dokument import no.nav.su.se.bakover.common.domain.Saksnummer import no.nav.su.se.bakover.common.person.Fnr import no.nav.su.se.bakover.domain.sak.SakInfo import no.nav.su.se.bakover.domain.sak.Sakstype import no.nav.su.se.bakover.domain.skatt.Skattedokument +import org.jetbrains.annotations.TestOnly +import java.lang.IllegalArgumentException /** * kan brukes som mal for 'Notat' poster i Joark. @@ -27,7 +33,7 @@ data class JournalpostSkattForSak( } } -data class JournalpostSkattUtenforSak( +data class JournalpostSkattUtenforSak private constructor( override val fnr: Fnr, override val sakstype: Sakstype, /** @@ -35,4 +41,37 @@ data class JournalpostSkattUtenforSak( */ override val fagsystemId: String, val dokument: Dokument.UtenMetadata, -) : JournalpostUtenforSakCommand +) : JournalpostUtenforSakCommand { + + companion object { + @TestOnly + fun create( + fnr: Fnr, + sakstype: Sakstype, + fagsystemId: String, + dokument: Dokument.UtenMetadata, + ): JournalpostSkattUtenforSak { + return tryCreate(fnr, sakstype, fagsystemId, dokument).getOrElse { + throw IllegalArgumentException("Valideringsfeil i JournalpostSkattUtenforSak - ") + } + } + + fun tryCreate( + fnr: Fnr, + sakstype: Sakstype, + fagsystemId: String, + dokument: Dokument.UtenMetadata, + ): Either { + if (fagsystemId.isBlank()) { + return KunneIkkeLageJournalpostUtenforSak.FagsystemIdErTom.left() + } + + return JournalpostSkattUtenforSak( + fnr, + sakstype, + fagsystemId, + dokument, + ).right() + } + } +} diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/KunneIkkeLageJournalpostUtenforSak.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/KunneIkkeLageJournalpostUtenforSak.kt new file mode 100644 index 0000000000..77e14778f7 --- /dev/null +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/journalpost/KunneIkkeLageJournalpostUtenforSak.kt @@ -0,0 +1,5 @@ +package no.nav.su.se.bakover.domain.journalpost + +sealed interface KunneIkkeLageJournalpostUtenforSak { + data object FagsystemIdErTom : KunneIkkeLageJournalpostUtenforSak +} diff --git a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/brev/AvslagsPdfInnholdTest.kt b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/brev/AvslagsPdfInnholdTest.kt index 090b73720a..cc1350ecd4 100644 --- a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/brev/AvslagsPdfInnholdTest.kt +++ b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/brev/AvslagsPdfInnholdTest.kt @@ -23,6 +23,7 @@ class AvslagsPdfInnholdTest { "etternavn": "Strømøy", "saksnummer": 2021 }, + "sakstype": "UFØRE", "avslagsgrunner": ["FLYKTNING"], "erAldersbrev": false, "harFlereAvslagsgrunner": false, @@ -113,6 +114,7 @@ class AvslagsPdfInnholdTest { "etternavn": "Strømøy", "saksnummer": 2021 }, + "sakstype": "UFØRE", "avslagsgrunner": ["FORMUE"], "erAldersbrev": false, "harFlereAvslagsgrunner": false, @@ -191,6 +193,7 @@ class AvslagsPdfInnholdTest { "etternavn": "Strømøy", "saksnummer": 2021 }, + "sakstype": "UFØRE", "avslagsgrunner": ["FORMUE"], "erAldersbrev": false, "harFlereAvslagsgrunner": false, diff --git a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/brev/PdfInnholdTest.kt b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/brev/PdfInnholdTest.kt index 2a21b1eba2..2b3e09c40e 100644 --- a/domain/src/test/kotlin/no/nav/su/se/bakover/domain/brev/PdfInnholdTest.kt +++ b/domain/src/test/kotlin/no/nav/su/se/bakover/domain/brev/PdfInnholdTest.kt @@ -100,6 +100,7 @@ internal class PdfInnholdTest { "etternavn": "Strømøy", "saksnummer": 2021 }, + "sakstype": "UFØRE", "fradato": "01.01.2020", "tildato": "01.01.2020", "forventetInntektStørreEnn0": true, @@ -163,6 +164,7 @@ internal class PdfInnholdTest { "etternavn": "Strømøy", "saksnummer": 2021 }, + "sakstype": "UFØRE", "erAldersbrev": false, "datoSøknadOpprettet": "01.01.2020", "trukketDato": "01.02.2020", @@ -222,6 +224,7 @@ internal class PdfInnholdTest { "etternavn": "Strømøy", "saksnummer": 2021 }, + "sakstype": "UFØRE", "harEktefelle": true, "harFradrag": false, "beregningsperioder": [{ @@ -290,6 +293,7 @@ internal class PdfInnholdTest { "etternavn": "Strømøy", "saksnummer": 12345676 }, + "sakstype": "UFØRE", "erAldersbrev": false, "saksbehandlerNavn": "saks", "fritekst": "fri", @@ -330,6 +334,7 @@ internal class PdfInnholdTest { "etternavn": "Strømøy", "saksnummer": 12345676 }, + "sakstype": "UFØRE", "erAldersbrev": false, "saksbehandlerNavn": "saks", "fritekst": "fri", diff --git "a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/KunneIkkeGenerereSkattePdfOgJournalf\303\270re.kt" "b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/KunneIkkeGenerereSkattePdfOgJournalf\303\270re.kt" index 281acb53da..419a746848 100644 --- "a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/KunneIkkeGenerereSkattePdfOgJournalf\303\270re.kt" +++ "b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/KunneIkkeGenerereSkattePdfOgJournalf\303\270re.kt" @@ -1,6 +1,7 @@ package no.nav.su.se.bakover.service.skatt import no.nav.su.se.bakover.domain.brev.KunneIkkeJournalføreDokument +import no.nav.su.se.bakover.domain.journalpost.KunneIkkeLageJournalpostUtenforSak import no.nav.su.se.bakover.domain.skatt.KunneIkkeHenteSkattemelding sealed interface KunneIkkeGenerereSkattePdfOgJournalføre { @@ -12,4 +13,7 @@ sealed interface KunneIkkeGenerereSkattePdfOgJournalføre { data class FeilVedHentingAvSkattemelding(val originalFeil: KunneIkkeHenteSkattemelding) : KunneIkkeGenerereSkattePdfOgJournalføre + + data class FeilVedJournalpostUtenforSak(val originalFeil: KunneIkkeLageJournalpostUtenforSak) : + KunneIkkeGenerereSkattePdfOgJournalføre } diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt index 251c9924c3..3544903102 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt @@ -79,7 +79,7 @@ class SkattDokumentServiceImpl( log.info("Genererte skatte-pdf for sakstype ${request.sakstype} med fagsystemId ${request.fagsystemId}") journalførSkattDokumentService.journalfør( - JournalpostSkattUtenforSak( + JournalpostSkattUtenforSak.tryCreate( fnr = request.fnr, sakstype = request.sakstype, fagsystemId = request.fagsystemId, @@ -90,7 +90,9 @@ class SkattDokumentServiceImpl( generertDokument = pdf, generertDokumentJson = it.toJson(), ), - ), + ).getOrElse { + return KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedJournalpostUtenforSak(it).left() + }, ).mapLeft { KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedJournalføring(it) }.map { diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/brev/BrevServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/brev/BrevServiceImplTest.kt index 96fffe3aa9..e542126dc9 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/brev/BrevServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/brev/BrevServiceImplTest.kt @@ -86,7 +86,7 @@ internal class BrevServiceImplTest { .getOrFail() as Dokument.UtenMetadata.Informasjon.Annet actual.generertDokument shouldBe pdf actual.tittel shouldBe dokumentCommand.brevTittel - actual.generertDokumentJson shouldBe """{"personalia":{"dato":"01.01.2021","fødselsnummer":"${dokumentCommand.fødselsnummer}","fornavn":"Tore","etternavn":"Strømøy","saksnummer":12345676},"saksbehandlerNavn":"testname","tittel":"En tittel","fritekst":"Litt fritekst","erAldersbrev":false}""" + actual.generertDokumentJson shouldBe """{"personalia":{"dato":"01.01.2021","fødselsnummer":"${dokumentCommand.fødselsnummer}","fornavn":"Tore","etternavn":"Strømøy","saksnummer":12345676},"saksbehandlerNavn":"testname","tittel":"En tittel","fritekst":"Litt fritekst","sakstype":"UFØRE","erAldersbrev":false}""" verify(pdfGeneratorMock).genererPdf( argThat { diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt index 93dc0b385e..fb3c08ad96 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt @@ -447,7 +447,7 @@ internal class SkattDokumentServiceImplTest { verify(journalførSkattDokumentService).journalfør( argThat { - (it as JournalpostSkattUtenforSak) shouldBe JournalpostSkattUtenforSak( + (it as JournalpostSkattUtenforSak) shouldBe JournalpostSkattUtenforSak.create( fnr = fnr, sakstype = Sakstype.ALDER, fagsystemId = "fagsystemId", @@ -460,6 +460,7 @@ internal class SkattDokumentServiceImplTest { { "saksnummer":"fagsystemId", "behandlingstype":"Frioppslag", + "sakstype": "ALDER", "behandlingsId":null, "vedtaksId":null, "hentet":"2021-01-01T01:02:03.456789Z", diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt index 17d6cf751d..fae8da9668 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt @@ -14,12 +14,14 @@ import no.nav.su.se.bakover.common.infrastructure.web.Feilresponser import no.nav.su.se.bakover.common.infrastructure.web.Resultat import no.nav.su.se.bakover.common.infrastructure.web.audit import no.nav.su.se.bakover.common.infrastructure.web.authorize +import no.nav.su.se.bakover.common.infrastructure.web.errorJson import no.nav.su.se.bakover.common.infrastructure.web.suUserContext import no.nav.su.se.bakover.common.infrastructure.web.svar import no.nav.su.se.bakover.common.infrastructure.web.withBody import no.nav.su.se.bakover.common.infrastructure.web.withFnr import no.nav.su.se.bakover.common.person.Fnr import no.nav.su.se.bakover.domain.brev.KunneIkkeJournalføreDokument +import no.nav.su.se.bakover.domain.journalpost.KunneIkkeLageJournalpostUtenforSak import no.nav.su.se.bakover.domain.sak.Sakstype import no.nav.su.se.bakover.domain.skatt.KunneIkkeHenteSkattemelding import no.nav.su.se.bakover.service.skatt.FrioppslagSkattRequest @@ -38,6 +40,9 @@ internal fun Route.skattRoutes(skatteService: SkatteService) { val sakstype: String, val fagsystemId: String, ) { + /** + * fagsystemId & begrunnelse kan være tom string - Dette er ment for forhåndsvisning + */ fun tilFrioppslagSkattRequest( fnr: Fnr, saksbehandler: NavIdentBruker.Saksbehandler, @@ -92,6 +97,16 @@ internal fun KunneIkkeGenerereSkattePdfOgJournalføre.tilResultat(): Resultat = is KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedGenereringAvPdf -> this.originalFeil.tilResultat() is KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedHentingAvSkattemelding -> this.originalFeil.tilResultat() is KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedJournalføring -> this.originalFeil.tilResultat() + is KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedJournalpostUtenforSak -> this.originalFeil.tilResultat() +} + +internal fun KunneIkkeLageJournalpostUtenforSak.tilResultat(): Resultat { + return when (this) { + KunneIkkeLageJournalpostUtenforSak.FagsystemIdErTom -> HttpStatusCode.BadRequest.errorJson( + "Ugyldig data - FagsystemId er tom", + "fagsystemId_er_tom", + ) + } } internal fun KunneIkkeJournalføreDokument.tilResultat(): Resultat = when (this) { From 6457926a7e847760a298244424cb3dfd6cc9d72a Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Wed, 6 Sep 2023 14:28:53 +0200 Subject: [PATCH 7/7] =?UTF-8?q?har=20mulighet=20til=20=C3=A5=20innhente=20?= =?UTF-8?q?eps=20sin=20skattegrunnlag=20sammen=20med=20s=C3=B8kers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/pdf/SkattegrunnlagsPdfInnhold.kt | 33 +++++++--- .../service/skatt/FrioppslagRequests.kt | 5 +- .../service/skatt/SkattDokumentServiceImpl.kt | 28 +++++--- .../service/skatt/SkatteServiceImpl.kt | 66 ++++++++++++------- .../skatt/SkattDokumentServiceImplTest.kt | 55 ++++++++++++---- .../service/skatt/SkatteServiceImplTest.kt | 10 +-- .../bakover/web/routes/skatt/SkatteRoute.kt | 2 + 7 files changed, 138 insertions(+), 61 deletions(-) diff --git a/client/src/main/kotlin/no/nav/su/se/bakover/client/pdf/SkattegrunnlagsPdfInnhold.kt b/client/src/main/kotlin/no/nav/su/se/bakover/client/pdf/SkattegrunnlagsPdfInnhold.kt index 681e08d8f3..b9a48fff57 100644 --- a/client/src/main/kotlin/no/nav/su/se/bakover/client/pdf/SkattegrunnlagsPdfInnhold.kt +++ b/client/src/main/kotlin/no/nav/su/se/bakover/client/pdf/SkattegrunnlagsPdfInnhold.kt @@ -1,6 +1,10 @@ package no.nav.su.se.bakover.client.pdf +import arrow.core.Either import arrow.core.NonEmptyList +import arrow.core.getOrElse +import arrow.core.left +import arrow.core.right import no.nav.su.se.bakover.client.pdf.SamletÅrsgrunnlagPdfJson.Companion.tilPdfJson import no.nav.su.se.bakover.common.domain.Saksnummer import no.nav.su.se.bakover.common.person.Fnr @@ -8,6 +12,7 @@ import no.nav.su.se.bakover.common.tid.Tidspunkt import no.nav.su.se.bakover.domain.brev.PdfTemplateMedDokumentNavn import no.nav.su.se.bakover.domain.brev.SkattegrunnlagPdfTemplate import no.nav.su.se.bakover.domain.brev.jsonRequest.PdfInnhold +import no.nav.su.se.bakover.domain.person.KunneIkkeHentePerson import no.nav.su.se.bakover.domain.person.Person import no.nav.su.se.bakover.domain.sak.Sakstype import no.nav.su.se.bakover.domain.skatt.SamletSkattegrunnlagForÅrOgStadie @@ -55,28 +60,38 @@ data class SkattegrunnlagsPdfInnhold private constructor( begrunnelse = null, ) - fun Skattegrunnlag.lagPdfInnholdFraFrioppslag( + fun lagSkattegrunnlagsPdfInnholdFraFrioppslag( fagsystemId: String, sakstype: Sakstype, begrunnelse: String?, - navn: Person.Navn, + skattegrunnlagSøker: Skattegrunnlag, + skattegrunnlagEps: Skattegrunnlag?, + hentNavn: (Fnr) -> Either, clock: Clock, - ): SkattegrunnlagsPdfInnhold = SkattegrunnlagsPdfInnhold( + ): Either = SkattegrunnlagsPdfInnhold( saksnummer = fagsystemId, behandlingstype = BehandlingstypeForSkattemelding.Frioppslag, sakstype = sakstype, behandlingsId = null, vedtaksId = null, - hentet = this.hentetTidspunkt, + hentet = skattegrunnlagSøker.hentetTidspunkt, opprettet = Tidspunkt.now(clock), søkers = SkattPdfDataJson( - fnr = this.fnr, - navn = navn, - årsgrunnlag = this.årsgrunnlag.tilPdfJson(), + fnr = skattegrunnlagSøker.fnr, + navn = hentNavn(skattegrunnlagSøker.fnr).getOrElse { return it.left() }, + årsgrunnlag = skattegrunnlagSøker.årsgrunnlag.tilPdfJson(), ), - eps = null, + eps = if (skattegrunnlagEps != null) { + SkattPdfDataJson( + fnr = skattegrunnlagEps.fnr, + navn = hentNavn(skattegrunnlagEps.fnr).getOrElse { return it.left() }, + årsgrunnlag = skattegrunnlagEps.årsgrunnlag.tilPdfJson(), + ) + } else { + null + }, begrunnelse = begrunnelse, - ) + ).right() } } diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt index 971d430015..52771e65a1 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/FrioppslagRequests.kt @@ -8,6 +8,7 @@ import java.time.Year data class FrioppslagSkattRequest( val fnr: Fnr, + val epsFnr: Fnr?, val år: Year, val begrunnelse: String, val saksbehandler: NavIdentBruker.Saksbehandler, @@ -16,9 +17,9 @@ data class FrioppslagSkattRequest( ) data class GenererSkattPdfRequest( - val skattegrunnlag: Skattegrunnlag, + val skattegrunnlagSøkers: Skattegrunnlag, + val skattegrunnlagEps: Skattegrunnlag?, val begrunnelse: String, - val fnr: Fnr, val sakstype: Sakstype, val fagsystemId: String, ) diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt index 3544903102..3a36f94fb7 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImpl.kt @@ -7,7 +7,6 @@ import arrow.core.right import dokument.domain.Dokument import no.nav.su.se.bakover.client.pdf.PdfGenerator import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold -import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold.Companion.lagPdfInnholdFraFrioppslag import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagForPdf import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagMedFnr import no.nav.su.se.bakover.common.domain.PdfA @@ -52,7 +51,8 @@ class SkattDokumentServiceImpl( fagsystemId = request.fagsystemId, sakstype = request.sakstype, begrunnelse = request.begrunnelse, - skattegrunnlag = request.skattegrunnlag, + skattegrunnlagSøker = request.skattegrunnlagSøkers, + skattegrunnlagEps = request.skattegrunnlagEps, ) .getOrElse { return it.left() } .let { @@ -67,7 +67,8 @@ class SkattDokumentServiceImpl( fagsystemId = request.fagsystemId, sakstype = request.sakstype, begrunnelse = request.begrunnelse, - skattegrunnlag = request.skattegrunnlag, + skattegrunnlagSøker = request.skattegrunnlagSøkers, + skattegrunnlagEps = request.skattegrunnlagEps, ) .getOrElse { return KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedGenereringAvPdf(it).left() } .let { @@ -80,7 +81,7 @@ class SkattDokumentServiceImpl( journalførSkattDokumentService.journalfør( JournalpostSkattUtenforSak.tryCreate( - fnr = request.fnr, + fnr = request.skattegrunnlagSøkers.fnr, sakstype = request.sakstype, fagsystemId = request.fagsystemId, dokument = Dokument.UtenMetadata.Informasjon.Annet( @@ -106,17 +107,24 @@ class SkattDokumentServiceImpl( fagsystemId: String, sakstype: Sakstype, begrunnelse: String, - skattegrunnlag: Skattegrunnlag, + skattegrunnlagSøker: Skattegrunnlag, + skattegrunnlagEps: Skattegrunnlag?, ): Either { - return skattegrunnlag.lagPdfInnholdFraFrioppslag( + return SkattegrunnlagsPdfInnhold.lagSkattegrunnlagsPdfInnholdFraFrioppslag( fagsystemId = fagsystemId, sakstype = sakstype, begrunnelse = begrunnelse, - navn = personOppslag.person(skattegrunnlag.fnr).getOrElse { - return KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedHentingAvPerson(it).left() - }.navn, + skattegrunnlagSøker = skattegrunnlagSøker, + skattegrunnlagEps = skattegrunnlagEps, + hentNavn = { + personOppslag.person(it).map { it.navn } + }, clock = clock, - ).right() + ).map { + it + }.mapLeft { + KunneIkkeHenteOgLagePdfAvSkattegrunnlag.FeilVedHentingAvPerson(it) + } } private fun generer(vedtak: Stønadsvedtak): Either { diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt index 5ac7a9dd06..7b46659bec 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImpl.kt @@ -3,12 +3,14 @@ package no.nav.su.se.bakover.service.skatt import arrow.core.Either import arrow.core.getOrElse import arrow.core.left +import arrow.core.right import no.nav.su.se.bakover.common.domain.PdfA import no.nav.su.se.bakover.common.ident.NavIdentBruker import no.nav.su.se.bakover.common.person.Fnr import no.nav.su.se.bakover.common.tid.Tidspunkt import no.nav.su.se.bakover.common.tid.YearRange import no.nav.su.se.bakover.common.tid.toRange +import no.nav.su.se.bakover.domain.skatt.KunneIkkeHenteSkattemelding import no.nav.su.se.bakover.domain.skatt.Skattegrunnlag import no.nav.su.se.bakover.domain.skatt.Skatteoppslag import org.slf4j.Logger @@ -56,21 +58,14 @@ class SkatteServiceImpl( ) override fun hentOgLagSkattePdf(request: FrioppslagSkattRequest): Either { - return Skattegrunnlag( - id = UUID.randomUUID(), - fnr = request.fnr, - hentetTidspunkt = Tidspunkt.now(clock), - saksbehandler = request.saksbehandler, - årsgrunnlag = skatteClient.hentSamletSkattegrunnlag(request.fnr, request.år) - .hentMestGyldigeSkattegrunnlagEllerFeil() - .getOrElse { return KunneIkkeHenteOgLagePdfAvSkattegrunnlag.KunneIkkeHenteSkattemelding(it).left() }, - årSpurtFor = request.år.toRange(), - ).let { + return hentSkattegrunnlag(request).getOrElse { + return KunneIkkeHenteOgLagePdfAvSkattegrunnlag.KunneIkkeHenteSkattemelding(it).left() + }.let { skattDokumentService.genererSkattePdf( GenererSkattPdfRequest( - skattegrunnlag = it, + skattegrunnlagSøkers = it.first, + skattegrunnlagEps = it.second, begrunnelse = request.begrunnelse, - fnr = request.fnr, sakstype = request.sakstype, fagsystemId = request.fagsystemId, ), @@ -81,26 +76,49 @@ class SkatteServiceImpl( override fun hentLagOgJournalførSkattePdf( request: FrioppslagSkattRequest, ): Either { - return Skattegrunnlag( - id = UUID.randomUUID(), - fnr = request.fnr, - hentetTidspunkt = Tidspunkt.now(clock), - saksbehandler = request.saksbehandler, - årsgrunnlag = skatteClient.hentSamletSkattegrunnlag(request.fnr, request.år) - .hentMestGyldigeSkattegrunnlagEllerFeil() - .getOrElse { return KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedHentingAvSkattemelding(it).left() }, - årSpurtFor = request.år.toRange(), - ).let { + return hentSkattegrunnlag(request).getOrElse { + return KunneIkkeGenerereSkattePdfOgJournalføre.FeilVedHentingAvSkattemelding(it).left() + }.let { log.info("Hentet skattegrunnlag for sakstype ${request.sakstype} med fagsystemId ${request.fagsystemId}") skattDokumentService.genererSkattePdfOgJournalfør( GenererSkattPdfRequest( - skattegrunnlag = it, + skattegrunnlagSøkers = it.first, + skattegrunnlagEps = it.second, begrunnelse = request.begrunnelse, - fnr = request.fnr, sakstype = request.sakstype, fagsystemId = request.fagsystemId, ), ) } } + + private fun hentSkattegrunnlag(request: FrioppslagSkattRequest): Either> { + val skattegrunnlagSøkers = Skattegrunnlag( + id = UUID.randomUUID(), + fnr = request.fnr, + hentetTidspunkt = Tidspunkt.now(clock), + saksbehandler = request.saksbehandler, + årsgrunnlag = skatteClient.hentSamletSkattegrunnlag(request.fnr, request.år) + .hentMestGyldigeSkattegrunnlagEllerFeil() + .getOrElse { return it.left() }, + årSpurtFor = request.år.toRange(), + ) + + val skattegrunnlagEps = if (request.epsFnr != null) { + Skattegrunnlag( + id = UUID.randomUUID(), + fnr = request.epsFnr, + hentetTidspunkt = Tidspunkt.now(clock), + saksbehandler = request.saksbehandler, + årsgrunnlag = skatteClient.hentSamletSkattegrunnlag(request.epsFnr, request.år) + .hentMestGyldigeSkattegrunnlagEllerFeil() + .getOrElse { return it.left() }, + årSpurtFor = request.år.toRange(), + ) + } else { + null + } + + return Pair(skattegrunnlagSøkers, skattegrunnlagEps).right() + } } diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt index fb3c08ad96..4e95e6011f 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkattDokumentServiceImplTest.kt @@ -7,7 +7,7 @@ import io.kotest.assertions.arrow.core.shouldBeRight import io.kotest.matchers.shouldBe import no.nav.su.se.bakover.client.pdf.PdfGenerator import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold -import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold.Companion.lagPdfInnholdFraFrioppslag +import no.nav.su.se.bakover.client.pdf.SkattegrunnlagsPdfInnhold.Companion.lagSkattegrunnlagsPdfInnholdFraFrioppslag import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagForPdf import no.nav.su.se.bakover.client.pdf.ÅrsgrunnlagMedFnr import no.nav.su.se.bakover.common.domain.PdfA @@ -25,6 +25,7 @@ import no.nav.su.se.bakover.test.argThat import no.nav.su.se.bakover.test.bosituasjonEpsUnder67 import no.nav.su.se.bakover.test.eksterneGrunnlag.eksternGrunnlagHentet import no.nav.su.se.bakover.test.eksterneGrunnlag.nyEksternGrunnlagHentetFeil +import no.nav.su.se.bakover.test.epsFnr import no.nav.su.se.bakover.test.fixedClock import no.nav.su.se.bakover.test.fixedTidspunkt import no.nav.su.se.bakover.test.fnr @@ -378,9 +379,9 @@ internal class SkattDokumentServiceImplTest { mockedServices(pdfGenerator = pdfGenerator, personOppslag = personOppslag).let { it.service.genererSkattePdf( request = GenererSkattPdfRequest( - skattegrunnlag = skattegrunnlag, + skattegrunnlagSøkers = skattegrunnlag, + skattegrunnlagEps = null, begrunnelse = "begrunnelse", - fnr = fnr, sakstype = Sakstype.UFØRE, fagsystemId = "fagsystemId", ), @@ -389,11 +390,13 @@ internal class SkattDokumentServiceImplTest { verify(personOppslag).person(argThat { it shouldBe skattegrunnlag.fnr }) verify(pdfGenerator).genererPdf( argThat { - it shouldBe skattegrunnlag.lagPdfInnholdFraFrioppslag( + it.right() shouldBe lagSkattegrunnlagsPdfInnholdFraFrioppslag( fagsystemId = "fagsystemId", sakstype = Sakstype.UFØRE, begrunnelse = "begrunnelse", - navn = person.navn, + skattegrunnlagSøker = skattegrunnlag, + skattegrunnlagEps = null, + hentNavn = { _ -> person.navn.right() }, clock = fixedClock, ) }, @@ -403,9 +406,10 @@ internal class SkattDokumentServiceImplTest { } @Test - fun `lager skatte pdf, og journalfører den`() { + fun `lager skatte pdf, med eps, og journalfører den`() { val pdf = pdfATom() val skattegrunnlag = nySkattegrunnlag() + val skattegrunnlagEps = nySkattegrunnlag(fnr = epsFnr) val person = person() val pdfGenerator = mock { on { genererPdf(any()) } doReturn pdf.right() @@ -424,22 +428,28 @@ internal class SkattDokumentServiceImplTest { ).let { it.service.genererSkattePdfOgJournalfør( GenererSkattPdfRequest( - skattegrunnlag = skattegrunnlag, + skattegrunnlagSøkers = skattegrunnlag, + skattegrunnlagEps = skattegrunnlagEps, begrunnelse = "begrunnelse", - fnr = fnr, sakstype = Sakstype.ALDER, fagsystemId = "fagsystemId", ), ).shouldBeRight() - verify(personOppslag).person(argThat { it shouldBe fnr }) + val captor = argumentCaptor() + verify(personOppslag, times(2)).person(captor.capture()) + captor.allValues.size shouldBe 2 + captor.firstValue shouldBe person.ident.fnr + captor.lastValue shouldBe epsFnr verify(pdfGenerator).genererPdf( argThat { - it shouldBe skattegrunnlag.lagPdfInnholdFraFrioppslag( + it.right() shouldBe lagSkattegrunnlagsPdfInnholdFraFrioppslag( fagsystemId = "fagsystemId", sakstype = Sakstype.ALDER, begrunnelse = "begrunnelse", - navn = person.navn, + skattegrunnlagSøker = skattegrunnlag, + skattegrunnlagEps = skattegrunnlagEps, + hentNavn = { _ -> person.navn.right() }, clock = fixedClock, ) }, @@ -490,7 +500,28 @@ internal class SkattDokumentServiceImplTest { } ] }, - "eps":null, + "eps":{ + "fnr":"$epsFnr", + "navn":{ + "fornavn":"Tore", + "mellomnavn":"Johnas", + "etternavn":"Strømøy" + }, + "årsgrunnlag":[ + { + "type":"HarSkattegrunnlag", + "år":2021, + "stadie":"Oppgjør", + "oppgjørsdato":null, + "formue":[{"tekniskNavn":"bruttoformue","beløp":"1238","spesifisering":[]},{"tekniskNavn":"formuesverdiForKjoeretoey","beløp":"20000","spesifisering":[]}], + "inntekt":[{"tekniskNavn":"alminneligInntektFoerSaerfradrag","beløp":"1000","spesifisering":[]}], + "inntektsfradrag":[{"tekniskNavn":"fradragForFagforeningskontingent","beløp":"4000","spesifisering":[]}], + "formuesfradrag":[{"tekniskNavn":"samletAnnenGjeld","beløp":"6000","spesifisering":[]}], + "verdsettingsrabattSomGirGjeldsreduksjon":[{"tekniskNavn":"fradragForFagforeningskontingent","beløp":"4000","spesifisering":[]}], + "oppjusteringAvEierinntekter":[{"tekniskNavn":"fradragForFagforeningskontingent","beløp":"4000","spesifisering":[]}], + "manglerKategori":[{"tekniskNavn":"fradragForFagforeningskontingent","beløp":"4000","spesifisering":[]}], + "annet":[{"tekniskNavn":"fradragForFagforeningskontingent","beløp":"4000","spesifisering":[]}], + "kjøretøy":[{"beløp":"15000","registreringsnummer":"AB12345","fabrikatnavn":"Troll","årForFørstegangsregistrering":"1957","formuesverdi":"15000","antattVerdiSomNytt":null,"antattMarkedsverdi":null},{"beløp":"5000","registreringsnummer":"BC67890","fabrikatnavn":"Think","årForFørstegangsregistrering":"2003","formuesverdi":"5000","antattVerdiSomNytt":null,"antattMarkedsverdi":null}]}]}, "begrunnelse":"begrunnelse", "erAldersbrev":true } diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt index 9744a02360..ebc9e1e6c6 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/skatt/SkatteServiceImplTest.kt @@ -407,6 +407,7 @@ class SkatteServiceImplTest { it.service.hentOgLagSkattePdf( request = FrioppslagSkattRequest( fnr = fnr, + epsFnr = null, år = Year.of(2021), begrunnelse = "begrunnelse for henting av skatte-data", saksbehandler = saksbehandler, @@ -422,9 +423,9 @@ class SkatteServiceImplTest { verify(it.skattDokumentService).genererSkattePdf( argThat { it shouldBe GenererSkattPdfRequest( - skattegrunnlag = it.skattegrunnlag, + skattegrunnlagSøkers = it.skattegrunnlagSøkers, + skattegrunnlagEps = null, begrunnelse = "begrunnelse for henting av skatte-data", - fnr = fnr, sakstype = Sakstype.ALDER, fagsystemId = "29901", ) @@ -453,6 +454,7 @@ class SkatteServiceImplTest { it.service.hentLagOgJournalførSkattePdf( request = FrioppslagSkattRequest( fnr = fnr, + epsFnr = null, år = Year.of(2021), begrunnelse = "begrunnelse for henting av skatte-data", saksbehandler = saksbehandler, @@ -468,9 +470,9 @@ class SkatteServiceImplTest { verify(it.skattDokumentService).genererSkattePdfOgJournalfør( argThat { it shouldBe GenererSkattPdfRequest( - skattegrunnlag = it.skattegrunnlag, + skattegrunnlagSøkers = it.skattegrunnlagSøkers, + skattegrunnlagEps = null, begrunnelse = "begrunnelse for henting av skatte-data", - fnr = fnr, sakstype = Sakstype.ALDER, fagsystemId = "29901", ) diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt index fae8da9668..31c5ef3914 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/skatt/SkatteRoute.kt @@ -35,6 +35,7 @@ internal const val skattPath = "/skatt" internal fun Route.skattRoutes(skatteService: SkatteService) { data class FrioppslagRequestBody( + val epsFnr: String?, val år: Int, val begrunnelse: String, val sakstype: String, @@ -48,6 +49,7 @@ internal fun Route.skattRoutes(skatteService: SkatteService) { saksbehandler: NavIdentBruker.Saksbehandler, ): FrioppslagSkattRequest = FrioppslagSkattRequest( fnr = fnr, + epsFnr = if (epsFnr != null) Fnr(epsFnr) else null, år = Year.of(år), begrunnelse = begrunnelse, saksbehandler = saksbehandler,