diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/dokarkiv/DokarkivClient.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/dokarkiv/DokarkivClient.kt index 9b453213..71705d97 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/dokarkiv/DokarkivClient.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/dokarkiv/DokarkivClient.kt @@ -391,54 +391,7 @@ class DokarkivClient( loggingMeta: LoggingMeta, navEnhet: String, avvist: Boolean, - receivedSykmelding: ReceivedSykmelding, - ): String? { - val oppdaterJournalpostRequest = createOppdaterJournalpostNasjonalRequest(dokumentInfoId, pasientFnr, sykmelder, avvist, receivedSykmelding) - oppdaterJournalpostRequest(oppdaterJournalpostRequest, sykmeldingId, journalpostId) - - return ferdigstillJournalpost( - enhet = navEnhet, - journalpostId = journalpostId, - sykmeldingId = sykmeldingId, - ).body - } - - private fun createOppdaterJournalpostNasjonalRequest( - dokumentInfoId: String?, - pasientFnr: String, - sykmelder: Sykmelder, - avvist: Boolean, - receivedSykmelding: ReceivedSykmelding, - ): OppdaterJournalpostRequest { - val oppdaterJournalpostRequest = OppdaterJournalpostRequest( - avsenderMottaker = getAvsenderMottakerRequest(sykmelder), - bruker = DokBruker(id = pasientFnr), - sak = Sak(), - tittel = createTitleNasjonal(receivedSykmelding.sykmelding.perioder, avvist), - dokumenter = if (dokumentInfoId != null) { - listOf( - DokumentInfo( - dokumentInfoId = dokumentInfoId, - tittel = createTitleNasjonal(receivedSykmelding.sykmelding.perioder, avvist), - ), - ) - } else { - null - }, - ) - return oppdaterJournalpostRequest - } - - fun oppdaterOgFerdigstillNasjonalJournalpost( - journalpostId: String, - dokumentInfoId: String? = null, - pasientFnr: String, - sykmeldingId: String, - sykmelder: Sykmelder, - loggingMeta: LoggingMeta, - navEnhet: String, - avvist: Boolean, - perioder: List, + perioder: List?, ): String? { val oppdaterJournalpostRequest = createOppdaterJournalpostNasjonalRequest(dokumentInfoId, pasientFnr, sykmelder, avvist, perioder) oppdaterJournalpostRequest(oppdaterJournalpostRequest, sykmeldingId, journalpostId) @@ -455,7 +408,7 @@ class DokarkivClient( pasientFnr: String, sykmelder: Sykmelder, avvist: Boolean, - perioder: List, + perioder: List?, ): OppdaterJournalpostRequest { val oppdaterJournalpostRequest = OppdaterJournalpostRequest( avsenderMottaker = getAvsenderMottakerRequest(sykmelder), @@ -486,7 +439,7 @@ class DokarkivClient( private fun getAvsenderMottakerRequest(sykmelder: Sykmelder): AvsenderMottakerRequest { return AvsenderMottakerRequest( - id = padHpr(sykmelder.hprNummer), + id = padHpr(sykmelder.hprNummer!!), navn = finnNavn(sykmelder), land = null, idType = IdType.HPRNR, diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingService.kt index 05388a43..3875ef62 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingService.kt @@ -1,15 +1,12 @@ package no.nav.sykdig.digitalisering.ferdigstilling -import no.nav.sykdig.LoggingMeta import no.nav.sykdig.applog import no.nav.sykdig.config.kafka.OK_SYKMELDING_TOPIC import no.nav.sykdig.digitalisering.dokarkiv.DokarkivClient import no.nav.sykdig.digitalisering.dokument.DocumentService import no.nav.sykdig.digitalisering.ferdigstilling.mapping.mapToReceivedSykmelding import no.nav.sykdig.digitalisering.ferdigstilling.oppgave.OppgaveClient -import no.nav.sykdig.digitalisering.helsenett.SykmelderService import no.nav.sykdig.digitalisering.model.FerdistilltRegisterOppgaveValues -import no.nav.sykdig.digitalisering.papirsykmelding.db.model.NasjonalManuellOppgaveDAO import no.nav.sykdig.digitalisering.pdl.Person import no.nav.sykdig.digitalisering.pdl.toFormattedNameString import no.nav.sykdig.digitalisering.saf.SafJournalpostGraphQlClient @@ -18,7 +15,6 @@ import no.nav.sykdig.model.OppgaveDbModel import no.nav.sykdig.objectMapper import no.nav.sykdig.securelog import no.nav.sykdig.utils.createTitle -import no.nav.sykdig.utils.createTitleNasjonal import no.nav.sykdig.utils.createTitleNavNo import no.nav.sykdig.utils.createTitleRina import org.apache.kafka.clients.producer.KafkaProducer @@ -32,7 +28,6 @@ class FerdigstillingService( private val oppgaveClient: OppgaveClient, private val sykmeldingOKProducer: KafkaProducer, private val dokumentService: DocumentService, - private val sykmelderService: SykmelderService, ) { val log = applog() val securelog = securelog() @@ -162,44 +157,6 @@ class FerdigstillingService( } } - fun ferdigstillNasjonalAvvistJournalpost( - enhet: String, - oppgave: NasjonalManuellOppgaveDAO, - sykmeldt: Person, - avvisningsGrunn: String?, - loggingMeta: LoggingMeta, - ) { - requireNotNull(oppgave.dokumentInfoId) { "DokumentInfoId må være satt for å kunne ferdigstille oppgave" } - val journalpost = safJournalpostGraphQlClient.getJournalpost(oppgave.journalpostId) - securelog.info("journalpostid ${oppgave.journalpostId} ble hentet: ${objectMapper.writeValueAsString(journalpost)}") - - if (safJournalpostGraphQlClient.erFerdigstilt(journalpost)) { - log.info("Journalpost med id ${oppgave.journalpostId} er allerede ferdigstilt, sykmeldingId ${oppgave.sykmeldingId}") - } - else { - log.info("Ferdigstiller journalpost med id ${oppgave.journalpostId}, dokumentInfoId ${oppgave.dokumentInfoId}, sykmeldingId ${oppgave.sykmeldingId} og oppgaveId ${oppgave.oppgaveId}") - dokarkivClient.oppdaterOgFerdigstillNasjonalJournalpost( - journalpostId = oppgave.journalpostId, - dokumentInfoId = oppgave.dokumentInfoId, - pasientFnr = oppgave.fnr!!, - sykmeldingId = oppgave.sykmeldingId, - sykmelder = sykmelderService.getSykmelder(oppgave.papirSmRegistrering.behandler?.hpr!!, "callId"), - loggingMeta = loggingMeta, - navEnhet = enhet, - avvist = true, - perioder = oppgave.papirSmRegistrering.perioder ?: emptyList(), - ) - - oppgaveClient.ferdigstillOppgave(oppgave.oppgaveId.toString(), oppgave.sykmeldingId) - - dokarkivClient.updateDocument( - journalpostid = oppgave.journalpostId, - documentId = oppgave.dokumentInfoId, - tittel = createTitleNasjonal(oppgave.papirSmRegistrering.perioder, true), - ) - } - } - fun sendUpdatedSykmelding(oppgave: OppgaveDbModel, sykmeldt: Person, navEmail: String, values: FerdistilltRegisterOppgaveValues) { val receivedSykmelding = mapToReceivedSykmelding( diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/oppgave/OppgaveClient.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/oppgave/OppgaveClient.kt index 597820d5..e54ff130 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/oppgave/OppgaveClient.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/oppgave/OppgaveClient.kt @@ -64,7 +64,8 @@ class OppgaveClient( oppgaveId: String, sykmeldingId: String, ferdigstillRegistrering: FerdigstillRegistrering, - loggingMeta: LoggingMeta + loggingMeta: LoggingMeta, + beskrivelse: String? ) { val oppgave = getNasjonalOppgave(oppgaveId, sykmeldingId) if (oppgave.status == OppgaveStatus.FERDIGSTILT.name || oppgave.status == OppgaveStatus.FEILREGISTRERT.name) { @@ -80,10 +81,10 @@ class OppgaveClient( tilordnetRessurs = ferdigstillRegistrering.veileder.veilederIdent, tildeltEnhetsnr = ferdigstillRegistrering.navEnhet, mappeId = null, - beskrivelse = oppgave.beskrivelse, + beskrivelse = if (beskrivelse?.isNotBlank() == true) beskrivelse else oppgave.beskrivelse, ) log.info( - "Ferdigstiller oppgave med {}, {}", + "Ferdigstiller nasjonal oppgave med {}, {}", StructuredArguments.keyValue("oppgaveId", oppgaveId), StructuredArguments.fields(loggingMeta), ) diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/helsenett/SykmelderService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/helsenett/SykmelderService.kt index ca9ac024..6ae38600 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/helsenett/SykmelderService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/helsenett/SykmelderService.kt @@ -50,6 +50,29 @@ class SykmelderService( ) } + fun getSykmelderForAvvistOppgave( + hpr: String?, + callId: String, + oppgaveId: Int, + ): Sykmelder { + log.info("Henter sykmelder fra HPR og PDL for oppgaveid $oppgaveId") + if (hpr == null) { + return getDefaultSykmelder() + } + return getSykmelder(hpr, callId) + } + + private fun getDefaultSykmelder(): Sykmelder = + Sykmelder( + fornavn = "Helseforetak", + hprNummer = null, + fnr = null, + aktorId = null, + mellomnavn = null, + etternavn = null, + godkjenninger = null, + ) + suspend fun getTssIdInfotrygd(samhandlerFnr: String, samhandlerOrgName: String, loggingMeta: LoggingMeta, sykmeldingId: String): String { return smtssClient.findBestTssInfotrygd(samhandlerFnr, samhandlerOrgName, loggingMeta, sykmeldingId) } diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalCommonService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalCommonService.kt index 8c23753d..c6bad63c 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalCommonService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalCommonService.kt @@ -46,7 +46,7 @@ class NasjonalCommonService( callId = callId, ) - val tssId = sykmelderService.getTssIdInfotrygd(sykmelder.fnr, "", loggingMeta, sykmeldingId) + val tssId = sykmelderService.getTssIdInfotrygd(sykmelder.fnr!!, "", loggingMeta, sykmeldingId) val datoOpprettet = oppgave.datoOpprettet val journalpostId = oppgave.journalpostId @@ -67,7 +67,7 @@ class NasjonalCommonService( healthInformation.toSykmelding( sykmeldingId, pasient.aktorId, - sykmelder.aktorId, + sykmelder.aktorId!!, sykmeldingId, getLocalDateTime(msgHead.msgInfo.genDate), ) @@ -187,4 +187,4 @@ class NasjonalCommonService( fun isValidOppgaveId(oppgaveId: String): Boolean { val regex = Regex("^\\d{9}$|^[a-zA-Z0-9]{1,20}$") return oppgaveId.matches(regex) -} \ No newline at end of file +} diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalFerdigstillingsService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalFerdigstillingsService.kt new file mode 100644 index 00000000..45df5aa5 --- /dev/null +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalFerdigstillingsService.kt @@ -0,0 +1,115 @@ +package no.nav.sykdig.digitalisering.papirsykmelding + +import net.logstash.logback.argument.StructuredArguments +import no.nav.sykdig.LoggingMeta +import no.nav.sykdig.applog +import no.nav.sykdig.digitalisering.ferdigstilling.GosysService +import no.nav.sykdig.digitalisering.ferdigstilling.oppgave.NasjonalOppgaveResponse +import no.nav.sykdig.digitalisering.ferdigstilling.oppgave.OppgaveClient +import no.nav.sykdig.digitalisering.helsenett.SykmelderService +import no.nav.sykdig.digitalisering.papirsykmelding.api.model.FerdigstillRegistrering +import no.nav.sykdig.digitalisering.papirsykmelding.api.model.Veileder +import no.nav.sykdig.digitalisering.papirsykmelding.db.model.NasjonalManuellOppgaveDAO +import no.nav.sykdig.digitalisering.sykmelding.service.JournalpostService +import no.nav.sykdig.securelog +import org.springframework.stereotype.Service +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + +@Service +class NasjonalFerdigstillingsService( + private val journalpostService: JournalpostService, + private val nasjonalCommonService: NasjonalCommonService, + private val sykmelderService: SykmelderService, + private val oppgaveClient: OppgaveClient, + private val gosysService: GosysService, +) { + + val log = applog() + val securelog = securelog() + + + suspend fun ferdigstillOppgave( + ferdigstillRegistrering: FerdigstillRegistrering, + beskrivelse: String?, + loggingMeta: LoggingMeta, + oppgaveId: String, + ) { + oppgaveClient.ferdigstillNasjonalOppgave(oppgaveId, ferdigstillRegistrering.sykmeldingId, ferdigstillRegistrering, loggingMeta, beskrivelse) + } + + suspend fun ferdigstillNasjonalAvvistOppgave( + lokalOppgave: NasjonalManuellOppgaveDAO, + eksternOppgave: NasjonalOppgaveResponse, + navEnhet: String, + avvisningsgrunn: String?, + veilederIdent: String, + ) { + val sykmeldingId = lokalOppgave.sykmeldingId + val oppgaveId = lokalOppgave.oppgaveId + val loggingMeta = nasjonalCommonService.getLoggingMeta(lokalOppgave.sykmeldingId, lokalOppgave) + requireNotNull(lokalOppgave.oppgaveId) + val sykmelder = sykmelderService.getSykmelderForAvvistOppgave(lokalOppgave.papirSmRegistrering.behandler?.hpr, lokalOppgave.sykmeldingId, lokalOppgave.oppgaveId) + + + requireNotNull(lokalOppgave.fnr) + val ferdigstillRegistrering = + FerdigstillRegistrering( + oppgaveId = oppgaveId, + journalpostId = lokalOppgave.journalpostId, + dokumentInfoId = lokalOppgave.dokumentInfoId, + pasientFnr = lokalOppgave.fnr, + sykmeldingId = sykmeldingId, + sykmelder = sykmelder, + navEnhet = navEnhet, + veileder = Veileder(veilederIdent), + avvist = true, + oppgave = eksternOppgave, + ) + journalpostService.ferdigstillNasjonalJournalpost(ferdigstillRegistrering, lokalOppgave.papirSmRegistrering.perioder, loggingMeta) + ferdigstillOppgave( + ferdigstillRegistrering = ferdigstillRegistrering, + beskrivelse = lagAvvisOppgavebeskrivelse( + opprinneligBeskrivelse = eksternOppgave.beskrivelse, + veileder = Veileder(veilederIdent), + navEnhet = navEnhet, + avvisSykmeldingReason = avvisningsgrunn, + ), + loggingMeta = loggingMeta, + oppgaveId = oppgaveId.toString(), + ) + } + + fun lagAvvisOppgavebeskrivelse( + avvisSykmeldingReason: String?, + opprinneligBeskrivelse: String?, + veileder: Veileder, + navEnhet: String, + timestamp: LocalDateTime? = null, + ): String { + val oppdatertBeskrivelse = + when { + !avvisSykmeldingReason.isNullOrEmpty() -> + "Avvist papirsykmelding med årsak: $avvisSykmeldingReason" + + else -> "Avvist papirsykmelding uten oppgitt årsak." + } + val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") + val formattedTimestamp = (timestamp ?: LocalDateTime.now()).format(formatter) + return "--- $formattedTimestamp ${veileder.veilederIdent}, $navEnhet ---\n$oppdatertBeskrivelse\n\n$opprinneligBeskrivelse" + } + + + fun ferdigstillOgSendOppgaveTilGosys(oppgaveId: String, authorization: String, eksisterendeOppgave: NasjonalManuellOppgaveDAO) { + val sykmeldingId = eksisterendeOppgave.sykmeldingId + val loggingMeta = nasjonalCommonService.getLoggingMeta(sykmeldingId, eksisterendeOppgave) + log.info( + "Sender nasjonal oppgave med id $oppgaveId til Gosys {}", + StructuredArguments.fields(loggingMeta), + ) + val navIdent = nasjonalCommonService.getNavIdent().veilederIdent + gosysService.sendOppgaveTilGosys(oppgaveId, sykmeldingId, navIdent) + + } + +} \ No newline at end of file diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveService.kt index ddc29119..88d04829 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveService.kt @@ -5,25 +5,23 @@ import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import net.logstash.logback.argument.StructuredArguments import no.nav.sykdig.LoggingMeta import no.nav.sykdig.applog +import no.nav.sykdig.auditLogger.AuditLogger +import no.nav.sykdig.auditlog +import no.nav.sykdig.digitalisering.SykDigOppgaveService import no.nav.sykdig.digitalisering.api.getPdfResult import no.nav.sykdig.digitalisering.exceptions.NoOppgaveException import no.nav.sykdig.digitalisering.ferdigstilling.FerdigstillingService import no.nav.sykdig.digitalisering.ferdigstilling.GosysService import no.nav.sykdig.digitalisering.ferdigstilling.oppgave.OppgaveClient -import no.nav.sykdig.digitalisering.mapAvvisningsgrunn +import no.nav.sykdig.digitalisering.helsenett.SykmelderService import no.nav.sykdig.digitalisering.papirsykmelding.api.SmregistreringClient -import no.nav.sykdig.digitalisering.papirsykmelding.api.model.AvvisSykmeldingRequest -import no.nav.sykdig.digitalisering.papirsykmelding.api.model.Document -import no.nav.sykdig.digitalisering.papirsykmelding.api.model.FerdigstillRegistrering -import no.nav.sykdig.digitalisering.papirsykmelding.api.model.PapirManuellOppgave -import no.nav.sykdig.digitalisering.papirsykmelding.api.model.PapirSmRegistering -import no.nav.sykdig.digitalisering.papirsykmelding.api.model.SmRegistreringManuell +import no.nav.sykdig.digitalisering.papirsykmelding.api.model.* import no.nav.sykdig.digitalisering.papirsykmelding.db.NasjonalOppgaveRepository import no.nav.sykdig.digitalisering.papirsykmelding.db.model.NasjonalManuellOppgaveDAO import no.nav.sykdig.digitalisering.papirsykmelding.db.model.Utfall import no.nav.sykdig.digitalisering.pdl.PersonService import no.nav.sykdig.digitalisering.saf.SafClient -import no.nav.sykdig.generated.types.Avvisingsgrunn +import no.nav.sykdig.digitalisering.sykmelding.service.JournalpostService import no.nav.sykdig.metrics.MetricRegister import no.nav.sykdig.securelog import org.springframework.http.HttpStatus @@ -37,16 +35,15 @@ import java.util.* class NasjonalOppgaveService( private val nasjonalOppgaveRepository: NasjonalOppgaveRepository, private val oppgaveClient: OppgaveClient, - private val personService: PersonService, - private val ferdigstillingService: FerdigstillingService, private val smregistreringClient: SmregistreringClient, private val nasjonalCommonService: NasjonalCommonService, - private val gosysService: GosysService, - private val metricRegister: MetricRegister, private val safClient: SafClient, + private val nasjonalFerdigstillingsService: NasjonalFerdigstillingsService, + private val metricRegister: MetricRegister, ) { val log = applog() val securelog = securelog() + val auditLogger = auditlog() val mapper = jacksonObjectMapper() fun lagreOppgave(papirManuellOppgave: PapirManuellOppgave, ferdigstilt: Boolean = false): NasjonalManuellOppgaveDAO { @@ -77,7 +74,7 @@ class NasjonalOppgaveService( avvisningsgrunn = avvisningsgrunn, datoFerdigstilt = LocalDateTime.now(), ferdigstilt = true, - papirSmRegistrering = mapToUpdatedPapirSmRegistrering(existingOppgave, smRegistreringManuell) + papirSmRegistrering = mapToUpdatedPapirSmRegistrering(existingOppgave, smRegistreringManuell), ) securelog.info("Lagret oppgave med sykmeldingId ${updatedOppgave.sykmeldingId} og med database id ${updatedOppgave.id} som dette objektet: $updatedOppgave") @@ -129,15 +126,6 @@ class NasjonalOppgaveService( return oppgave } - suspend fun ferdigstillOppgave( - ferdigstillRegistrering: FerdigstillRegistrering, - beskrivelse: String?, - loggingMeta: LoggingMeta, - oppgaveId: String, - ) { - oppgaveClient.ferdigstillNasjonalOppgave(oppgaveId, ferdigstillRegistrering.sykmeldingId, ferdigstillRegistrering, loggingMeta) - } - fun getOppgaveBySykmeldingId(sykmeldingId: String, authorization: String): NasjonalManuellOppgaveDAO? { val sykmelding = findBySykmeldingId(sykmeldingId) @@ -181,46 +169,56 @@ class NasjonalOppgaveService( return null } - fun avvisOppgave( + suspend fun avvisOppgave( oppgaveId: String, request: String, navEnhet: String, - authorization: String + authorization: String, ): ResponseEntity { - val eksisterendeOppgave = getOppgave(oppgaveId, authorization) - - if (eksisterendeOppgave == null) { + val lokalOppgave = getOppgave(oppgaveId, authorization) + if (lokalOppgave == null) { log.info("Fant ikke oppgave som skulle avvises: $oppgaveId") return ResponseEntity(HttpStatus.NOT_FOUND) } - - if (eksisterendeOppgave.ferdigstilt) { + if (lokalOppgave.ferdigstilt) { log.info("Oppgave med id $oppgaveId er allerede ferdigstilt") return ResponseEntity(HttpStatus.NO_CONTENT) } + val eksternOppgave = oppgaveClient.getNasjonalOppgave(oppgaveId, lokalOppgave.sykmeldingId) val avvisningsgrunn = mapper.readValue(request, AvvisSykmeldingRequest::class.java).reason + + log.info("Avviser oppgave med oppgaveId: $oppgaveId. Avvisningsgrunn: $avvisningsgrunn") val veilederIdent = nasjonalCommonService.getNavIdent().veilederIdent + nasjonalFerdigstillingsService.ferdigstillNasjonalAvvistOppgave(lokalOppgave, eksternOppgave, navEnhet, avvisningsgrunn, veilederIdent) - ferdigstillNasjonalAvvistOppgave(eksisterendeOppgave, navEnhet, avvisningsgrunn, veilederIdent) oppdaterOppgave( - eksisterendeOppgave.sykmeldingId, + lokalOppgave.sykmeldingId, utfall = Utfall.AVVIST.toString(), ferdigstiltAv = veilederIdent, avvisningsgrunn = avvisningsgrunn, - null + null, + ) + auditLogger.info( + AuditLogger() + .createcCefMessage( + fnr = lokalOppgave.fnr, + operation = AuditLogger.Operation.WRITE, + requestPath = "/api/v1/oppgave/$oppgaveId/avvis", + permit = AuditLogger.Permit.PERMIT, + navEmail = nasjonalCommonService.getNavEmail(), + ), ) log.info("Har avvist oppgave med oppgaveId $oppgaveId") return ResponseEntity(HttpStatus.NO_CONTENT) - } fun mapToDao( papirManuellOppgave: PapirManuellOppgave, existingId: UUID?, - ferdigstilt: Boolean = false + ferdigstilt: Boolean = false, ): NasjonalManuellOppgaveDAO { mapper.registerModules(JavaTimeModule()) securelog.info("Mapper til DAO: $papirManuellOppgave") @@ -276,7 +274,7 @@ class NasjonalOppgaveService( } fun mapFromDao( - nasjonalManuellOppgaveDAO: NasjonalManuellOppgaveDAO + nasjonalManuellOppgaveDAO: NasjonalManuellOppgaveDAO, ): PapirManuellOppgave { val papirSmRegistering = nasjonalManuellOppgaveDAO.papirSmRegistrering @@ -315,67 +313,25 @@ class NasjonalOppgaveService( ) } - - fun ferdigstillNasjonalAvvistOppgave( - oppgave: NasjonalManuellOppgaveDAO, - navEnhet: String, - avvisningsgrunn: String?, - veilederIdent: String, - ) { - - if (oppgave.fnr != null) { - val sykmeldt = - personService.getPerson( - id = oppgave.fnr, - callId = oppgave.sykmeldingId, - ) - val avvistGrunn = enumValues().find { it.name.equals(avvisningsgrunn, ignoreCase = true) } - ferdigstillingService.ferdigstillNasjonalAvvistJournalpost( - enhet = navEnhet, - oppgave = oppgave, - sykmeldt = sykmeldt, - avvisningsGrunn = avvistGrunn?.let { mapAvvisningsgrunn(it, null) }, - loggingMeta = nasjonalCommonService.getLoggingMeta(oppgave.sykmeldingId, oppgave), - ) - - } else { - log.error("Fant ikke fnr for oppgave med id $oppgave.oppgaveId") - } + fun getRegisterPdf(oppgaveId: String, authorization: String, dokumentInfoId: String): ResponseEntity { + val oppgave = getOppgave(oppgaveId, authorization) + requireNotNull(oppgave) + val pdfResult = safClient.getPdfFraSaf(oppgave.journalpostId, dokumentInfoId, authorization) + return getPdfResult(pdfResult) } - fun ferdigstillOgSendOppgaveTilGosys(oppgaveId: String, authorization: String) { - val eksisterendeOppgave = getOppgave(oppgaveId, authorization) - - if (eksisterendeOppgave == null) { - log.warn("Fant ikke oppgave med id $oppgaveId") - throw NoOppgaveException("Fant ikke oppgave med id $oppgaveId") - } - - val sykmeldingId = eksisterendeOppgave.sykmeldingId - - val loggingMeta = nasjonalCommonService.getLoggingMeta(sykmeldingId, eksisterendeOppgave) - - log.info( - "Sender nasjonal oppgave med id $oppgaveId til Gosys {}", - StructuredArguments.fields(loggingMeta) - ) - - val navIdent = nasjonalCommonService.getNavIdent().veilederIdent - gosysService.sendOppgaveTilGosys(oppgaveId, sykmeldingId, navIdent) - oppdaterOppgave(sykmeldingId, Utfall.SENDT_TIL_GOSYS.toString(), navIdent, null, null) + fun oppgaveTilGosys(oppgaveId: String, authorization: String) { + val eksisterendeOppgave = getOppgave(oppgaveId, authorization) ?: return + val navIdent = nasjonalCommonService.getNavIdent() + val loggingMeta = nasjonalCommonService.getLoggingMeta(eksisterendeOppgave.sykmeldingId, eksisterendeOppgave) + nasjonalFerdigstillingsService.ferdigstillOgSendOppgaveTilGosys(oppgaveId, authorization, eksisterendeOppgave) + oppdaterOppgave(eksisterendeOppgave.sykmeldingId, Utfall.SENDT_TIL_GOSYS.toString(), navIdent.veilederIdent, null, null) log.info( "Ferdig å sende oppgave med id $oppgaveId til Gosys {}", - StructuredArguments.fields(loggingMeta) + StructuredArguments.fields(loggingMeta), ) - metricRegister.sendtTilGosysNasjonal.increment() } - fun getRegisterPdf(oppgaveId: String, authorization: String, dokumentInfoId: String): ResponseEntity { - val oppgave = getOppgave(oppgaveId, authorization) - requireNotNull(oppgave) - val pdfResult = safClient.getPdfFraSaf(oppgave.journalpostId, dokumentInfoId, authorization) - return getPdfResult(pdfResult) - } } diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalSykmeldingService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalSykmeldingService.kt index 653f8daf..04496028 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalSykmeldingService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalSykmeldingService.kt @@ -42,6 +42,7 @@ class NasjonalSykmeldingService( private val sykmeldingOKProducer: KafkaProducer, private val sykmelderService: SykmelderService, private val nasjonalCommonService: NasjonalCommonService, + private val nasjonalFerdigstillingsService: NasjonalFerdigstillingsService, ) { val log = applog() val securelog = securelog() @@ -120,10 +121,10 @@ class NasjonalSykmeldingService( if (ferdigstillRegistrering.oppgaveId != null) { journalpostService.ferdigstillNasjonalJournalpost( ferdigstillRegistrering = ferdigstillRegistrering, - receivedSykmelding = receivedSykmelding, + perioder = receivedSykmelding.sykmelding.perioder, loggingMeta = loggingMeta, ) - nasjonalOppgaveService.ferdigstillOppgave( + nasjonalFerdigstillingsService.ferdigstillOppgave( ferdigstillRegistrering, null, loggingMeta, diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/NasjonalOppgaveController.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/NasjonalOppgaveController.kt index 8602abae..ed22c32b 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/NasjonalOppgaveController.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/NasjonalOppgaveController.kt @@ -16,20 +16,12 @@ import org.springframework.http.HttpStatusCode import org.springframework.http.ResponseEntity import org.springframework.security.access.prepost.PostAuthorize import org.springframework.security.access.prepost.PreAuthorize -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RequestHeader -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.ResponseBody -import org.springframework.web.bind.annotation.RestController +import org.springframework.web.bind.annotation.* import java.util.* @RestController @RequestMapping("/api/v1/proxy") class NasjonalOppgaveController( - private val smregistreringClient: SmregistreringClient, private val nasjonalOppgaveService: NasjonalOppgaveService, private val sykmelderService: SykmelderService, private val personService: PersonService, @@ -41,7 +33,7 @@ class NasjonalOppgaveController( @PostMapping("/oppgave/{oppgaveId}/avvis") @PreAuthorize("@oppgaveSecurityService.hasAccessToNasjonalOppgave(#oppgaveId, #authorization, '/oppgave/{oppgaveId}/avvis')") @WithSpan - fun avvisOppgave( + suspend fun avvisOppgave( @PathVariable oppgaveId: String, @RequestHeader("X-Nav-Enhet") navEnhet: String, @RequestHeader("Authorization") authorization: String, @@ -149,7 +141,7 @@ class NasjonalOppgaveController( return ResponseEntity.badRequest().build() } log.info("papirsykmelding: Sender oppgave med id $oppgaveId til Gosys") - nasjonalOppgaveService.ferdigstillOgSendOppgaveTilGosys(oppgaveId, authorization) + nasjonalOppgaveService.oppgaveTilGosys(oppgaveId, authorization) return ResponseEntity.noContent().build() } @@ -163,7 +155,7 @@ class NasjonalOppgaveController( @RequestBody papirSykmelding: SmRegistreringManuell, ): ResponseEntity { securelog.info("Oppdaterer korrigert oppgave i syk-dig-backend db $papirSykmelding") - return nasjonalSykmeldingService.korrigerSykmelding(sykmeldingId, navEnhet, UUID.randomUUID().toString(), papirSykmelding, authorization) + return nasjonalSykmeldingService.korrigerSykmelding(sykmeldingId, navEnhet, UUID.randomUUID().toString(), papirSykmelding, authorization) } @GetMapping("/pdf/{oppgaveId}/{dokumentInfoId}") diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/model/PapirSykmelding.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/model/PapirSykmelding.kt index 234dff76..931bb55f 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/model/PapirSykmelding.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/api/model/PapirSykmelding.kt @@ -55,9 +55,9 @@ data class AvvisSykmeldingRequest( ) data class Sykmelder( - val hprNummer: String, - val fnr: String, - val aktorId: String, + val hprNummer: String?, + val fnr: String?, + val aktorId: String?, val fornavn: String?, val mellomnavn: String?, val etternavn: String?, diff --git a/src/main/kotlin/no/nav/sykdig/digitalisering/sykmelding/service/JournalpostService.kt b/src/main/kotlin/no/nav/sykdig/digitalisering/sykmelding/service/JournalpostService.kt index 869c76d2..2150f787 100644 --- a/src/main/kotlin/no/nav/sykdig/digitalisering/sykmelding/service/JournalpostService.kt +++ b/src/main/kotlin/no/nav/sykdig/digitalisering/sykmelding/service/JournalpostService.kt @@ -5,6 +5,7 @@ import no.nav.sykdig.LoggingMeta import no.nav.sykdig.applog import no.nav.sykdig.digitalisering.SykDigOppgaveService import no.nav.sykdig.digitalisering.dokarkiv.DokarkivClient +import no.nav.sykdig.digitalisering.felles.Periode import no.nav.sykdig.digitalisering.papirsykmelding.NasjonalCommonService import no.nav.sykdig.digitalisering.papirsykmelding.api.model.FerdigstillRegistrering import no.nav.sykdig.digitalisering.pdl.PersonService @@ -133,7 +134,7 @@ class JournalpostService( } suspend fun ferdigstillNasjonalJournalpost( ferdigstillRegistrering: FerdigstillRegistrering, - receivedSykmelding: ReceivedSykmelding, + perioder: List?, loggingMeta: LoggingMeta, ) { if ( @@ -148,7 +149,7 @@ class JournalpostService( loggingMeta = loggingMeta, navEnhet = ferdigstillRegistrering.navEnhet, avvist = ferdigstillRegistrering.avvist, - receivedSykmelding = receivedSykmelding + perioder = perioder ) } else { log.info( diff --git a/src/test/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingServiceTest.kt b/src/test/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingServiceTest.kt index b3672c23..46bffeda 100644 --- a/src/test/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingServiceTest.kt +++ b/src/test/kotlin/no/nav/sykdig/digitalisering/ferdigstilling/FerdigstillingServiceTest.kt @@ -79,7 +79,7 @@ class FerdigstillingServiceTest : IntegrationTest() { @BeforeEach fun setup() { - ferdigstillingService = FerdigstillingService(safJournalpostGraphQlClient, dokarkivClient, oppgaveClient, sykmeldingOKProducer, dokumentService, sykmelderService) + ferdigstillingService = FerdigstillingService(safJournalpostGraphQlClient, dokarkivClient, oppgaveClient, sykmeldingOKProducer, dokumentService) nasjonalOppgaveRepository.deleteAll() } diff --git a/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveServiceTest.kt b/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveServiceTest.kt index fa6df95d..902ba2b7 100644 --- a/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveServiceTest.kt +++ b/src/test/kotlin/no/nav/sykdig/digitalisering/papirsykmelding/NasjonalOppgaveServiceTest.kt @@ -9,6 +9,8 @@ import no.nav.sykdig.digitalisering.dokarkiv.DokarkivClient import no.nav.sykdig.digitalisering.dokument.DocumentService import no.nav.sykdig.digitalisering.felles.Adresse import no.nav.sykdig.digitalisering.felles.Behandler +import no.nav.sykdig.digitalisering.ferdigstilling.FerdigstillingService +import no.nav.sykdig.digitalisering.ferdigstilling.oppgave.NasjonalOppgaveResponse import no.nav.sykdig.digitalisering.ferdigstilling.oppgave.OppgaveClient import no.nav.sykdig.digitalisering.helsenett.SykmelderService import no.nav.sykdig.digitalisering.papirsykmelding.api.model.AvvisSykmeldingRequest @@ -21,6 +23,7 @@ import no.nav.sykdig.digitalisering.pdl.Navn import no.nav.sykdig.digitalisering.pdl.Person import no.nav.sykdig.digitalisering.pdl.PersonService import no.nav.sykdig.digitalisering.saf.SafJournalpostGraphQlClient +import no.nav.sykdig.digitalisering.saf.graphql.SafJournalpost import no.nav.sykdig.digitalisering.saf.graphql.SafQueryJournalpost import no.nav.sykdig.model.OppgaveDbModel import okhttp3.internal.EMPTY_BYTE_ARRAY @@ -31,6 +34,7 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.mockito.ArgumentMatchers.anyString import org.mockito.Mockito +import org.mockito.kotlin.any import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Qualifier import org.springframework.boot.test.mock.mockito.MockBean @@ -84,6 +88,9 @@ class NasjonalOppgaveServiceTest : IntegrationTest() { @MockBean lateinit var nasjonaCommonService: NasjonalCommonService + @MockBean + lateinit var nasjonalFerdigstillingService: NasjonalFerdigstillingsService + @Autowired @Qualifier("smregisteringRestTemplate") private lateinit var restTemplate: RestTemplate @@ -102,7 +109,7 @@ class NasjonalOppgaveServiceTest : IntegrationTest() { @Test - fun `avvis oppgave blir oppdatert og lagra i DB`() { + fun `avvis oppgave blir oppdatert og lagra i DB`() = runBlocking { val oppgaveId = "123" val request = mapper.writeValueAsString(AvvisSykmeldingRequest(reason = "MANGLENDE_DIAGNOSE")) val originalOppgave = nasjonalOppgaveService.lagreOppgave(testDataPapirManuellOppgave()) @@ -113,25 +120,26 @@ class NasjonalOppgaveServiceTest : IntegrationTest() { Mockito.`when`(nasjonaCommonService.getNavIdent()).thenReturn(Veileder("navIdent")) Mockito.`when`(personService.getPerson(anyString(), anyString())).thenReturn(testDataPerson()) - Mockito.`when`(safJournalpostGraphQlClient.getJournalpost(anyString())).thenReturn(SafQueryJournalpost(null)) - Mockito.`when`(safJournalpostGraphQlClient.erFerdigstilt(org.mockito.kotlin.any())).thenReturn(false) Mockito.`when`(dokarkivClient.oppdaterOgFerdigstillNasjonalJournalpost( - journalpostId = org.mockito.kotlin.any(), - dokumentInfoId = org.mockito.kotlin.any(), - pasientFnr = org.mockito.kotlin.any(), - sykmeldingId = org.mockito.kotlin.any(), - sykmelder = org.mockito.kotlin.any(), - loggingMeta = org.mockito.kotlin.any(), - navEnhet = org.mockito.kotlin.any(), - avvist = org.mockito.kotlin.any(), - perioder = org.mockito.kotlin.any(), + journalpostId = any(), + dokumentInfoId = any(), + pasientFnr = any(), + sykmeldingId = any(), + sykmelder = any(), + loggingMeta = any(), + navEnhet = any(), + avvist = any(), + perioder = any(), )).thenReturn(null) - Mockito.`when`(sykmelderService.getSykmelder(org.mockito.kotlin.any(), org.mockito.kotlin.any())).thenReturn(testDataSykmelder()) - Mockito.doNothing().`when`(oppgaveClient).ferdigstillOppgave(org.mockito.kotlin.any(), org.mockito.kotlin.any()) - Mockito.doNothing().`when`(documentService).updateDocumentTitle(org.mockito.kotlin.any(), org.mockito.kotlin.any(), org.mockito.kotlin.any()) - Mockito.`when`(nasjonaCommonService.getLoggingMeta(org.mockito.kotlin.any(), org.mockito.kotlin.any())).thenReturn(testDataLoggingMeta()) + Mockito.doNothing().`when`(oppgaveClient).ferdigstillOppgave(any(), any()) + Mockito.doNothing().`when`(documentService).updateDocumentTitle(any(), any(), any()) + Mockito.`when`(nasjonaCommonService.getLoggingMeta(any(), any())).thenReturn(testDataLoggingMeta()) + Mockito.`when`(sykmelderService.getSykmelderForAvvistOppgave(any(),any(),any())).thenReturn(testDataSykmelder()) + Mockito.`when`(safJournalpostGraphQlClient.getJournalpostM2m(any())).thenReturn(SafQueryJournalpost(SafJournalpost("tittel", null, null, null, emptyList(), null, null))) + Mockito.`when`(oppgaveClient.getNasjonalOppgave(any(), any())).thenReturn(NasjonalOppgaveResponse(prioritet = "", aktivDato = LocalDate.now(), oppgavetype = "")) + assertTrue(originalOppgave.avvisningsgrunn == null) val avvistOppgave = nasjonalOppgaveService.avvisOppgave(oppgaveId, request, "enhet", "auth")