From abae4019b94f041b64aae86a491a6d4e7dc7ddf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Kjetil=20Sk=C3=A5r?= <43172034+s148719@users.noreply.github.com> Date: Tue, 19 Oct 2021 15:10:23 +0200 Subject: [PATCH] Endre brukernotifikasjoner (#291) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Endre brukernotifikasjoner Unngå duplikate bestillinger for opprettelse og ferdigstilling av oppgaver Opprette tabell for bestilling av signeringsoppgave til far. * Update V11_2_0__create-table-oppgavebestilling.sql --- .../config/BrukernotifikasjonConfig.java | 31 ++-- .../config/FarskapsportalConfig.java | 6 +- .../brukernotifikasjon/Beskjedprodusent.java | 25 ++-- .../BrukernotifikasjonConsumer.java | 77 +++++++--- .../brukernotifikasjon/Ferdigprodusent.java | 36 +++-- .../brukernotifikasjon/Oppgaveprodusent.java | 30 +++- .../persistence/dao/OppgavebestillingDao.java | 19 +++ ...bestilling.java => Oppgavebestilling.java} | 18 ++- .../scheduled/SletteOppgave.java | 19 ++- .../service/FarskapsportalService.java | 25 +++- .../service/PersistenceService.java | 36 ++++- src/main/resources/application.yml | 2 +- ...11_2_0__create-table-oppgavebestilling.sql | 17 +++ .../BeskjedprodusentTest.java | 27 ++-- .../BrukernotifikasjonConsumerTest.java | 86 ++++++++--- .../FerdigprodusentTest.java | 65 ++++++++- .../OppgaveprodusentTest.java | 81 +++++++++- .../rs/FarskapsportalControllerTest.java | 29 +++- .../scheduled/SletteOppgaveTest.java | 87 ++++++++++- .../service/FarskapsportalServiceTest.java | 138 +++++++++++++++--- 20 files changed, 693 insertions(+), 161 deletions(-) create mode 100644 src/main/java/no/nav/farskapsportal/persistence/dao/OppgavebestillingDao.java rename src/main/java/no/nav/farskapsportal/persistence/entity/{Brukernotifikasjonsbestilling.java => Oppgavebestilling.java} (62%) create mode 100644 src/main/resources/db/migration/V11_2_0__create-table-oppgavebestilling.sql diff --git a/src/main/java/no/nav/farskapsportal/config/BrukernotifikasjonConfig.java b/src/main/java/no/nav/farskapsportal/config/BrukernotifikasjonConfig.java index 9fb44f1e9..98c43a3c4 100644 --- a/src/main/java/no/nav/farskapsportal/config/BrukernotifikasjonConfig.java +++ b/src/main/java/no/nav/farskapsportal/config/BrukernotifikasjonConfig.java @@ -3,7 +3,6 @@ import io.confluent.kafka.serializers.AbstractKafkaSchemaSerDeConfig; import io.confluent.kafka.serializers.KafkaAvroSerializer; import java.net.MalformedURLException; -import java.net.URL; import java.util.HashMap; import java.util.Map; import no.nav.brukernotifikasjon.schemas.Beskjed; @@ -15,13 +14,14 @@ import no.nav.farskapsportal.consumer.brukernotifikasjon.BrukernotifikasjonConsumer; import no.nav.farskapsportal.consumer.brukernotifikasjon.Ferdigprodusent; import no.nav.farskapsportal.consumer.brukernotifikasjon.Oppgaveprodusent; +import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao; +import no.nav.farskapsportal.service.PersistenceService; import org.apache.kafka.clients.producer.ProducerConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.kafka.annotation.EnableKafka; import org.springframework.kafka.core.DefaultKafkaProducerFactory; import org.springframework.kafka.core.KafkaTemplate; @@ -49,7 +49,7 @@ public class BrukernotifikasjonConfig { private String saslMechanism; @Value("${spring.kafka.properties.security.protocol}") - private String securityProtocol; + private String securityProtocol; public BrukernotifikasjonConfig(@Autowired FarskapsportalEgenskaper farskapsportalEgenskaper) { this.farskapsportalEgenskaper = farskapsportalEgenskaper; @@ -62,13 +62,13 @@ private Map getKafkaConfigProps() { configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer.class); configProps.put(AbstractKafkaSchemaSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, kafkaSchemaRegistryUrlConfig); configProps.put("schema.registry.ssl.keystore.location", trustStorePath); - configProps.put("schema.registry.ssl.keystore.password",trustStorePwd); + configProps.put("schema.registry.ssl.keystore.password", trustStorePwd); configProps.put("schema.registry.ssl.truststore.location", trustStorePath); - configProps.put("schema.registry.ssl.truststore.password",trustStorePwd); + configProps.put("schema.registry.ssl.truststore.password", trustStorePwd); configProps.put("ssl.truststore.location", trustStorePath); - configProps.put("ssl.truststore.password",trustStorePwd); + configProps.put("ssl.truststore.password", trustStorePwd); configProps.put("ssl.keystore.location", trustStorePath); - configProps.put("ssl.keystore.password",trustStorePwd); + configProps.put("ssl.keystore.password", trustStorePwd); configProps.put("security.protocol", securityProtocol); configProps.put("sasl.jaas.config", saslJaasConfig); configProps.put("sasl.mechanism", saslMechanism); @@ -93,8 +93,8 @@ public KafkaTemplate kafkaTemplateOppgave() { @Bean BrukernotifikasjonConsumer brukernotifikasjonConsumer(Beskjedprodusent beskjedprodusent, Ferdigprodusent ferdigprodusent, - Oppgaveprodusent oppgaveprodusent) throws MalformedURLException { - return new BrukernotifikasjonConsumer(toUrl(farskapsportalEgenskaper.getUrl()), beskjedprodusent, ferdigprodusent, oppgaveprodusent); + Oppgaveprodusent oppgaveprodusent, FarskapsportalEgenskaper farskapsportalEgenskaper) throws MalformedURLException { + return new BrukernotifikasjonConsumer(beskjedprodusent, ferdigprodusent, oppgaveprodusent, farskapsportalEgenskaper); } @Bean @@ -104,16 +104,13 @@ Beskjedprodusent beskjedprodusent(@Qualifier("beskjed") KafkaTemplate kafkaTemplate) throws MalformedURLException { - return new Oppgaveprodusent(toUrl(farskapsportalEgenskaper.getUrl()), farskapsportalEgenskaper, kafkaTemplate); + @Qualifier("oppgave") KafkaTemplate kafkaTemplate, PersistenceService persistenceService) { + return new Oppgaveprodusent(farskapsportalEgenskaper, kafkaTemplate, persistenceService); } @Bean - Ferdigprodusent ferdigprodusent(@Qualifier("ferdig") KafkaTemplate kafkaTemplate) { - return new Ferdigprodusent(farskapsportalEgenskaper, kafkaTemplate); - } - - private URL toUrl(String url) throws MalformedURLException { - return new URL(url); + Ferdigprodusent ferdigprodusent(@Qualifier("ferdig") KafkaTemplate kafkaTemplate, PersistenceService persistenceService, + OppgavebestillingDao oppgavebestillingDao) { + return new Ferdigprodusent(farskapsportalEgenskaper, kafkaTemplate, persistenceService, oppgavebestillingDao); } } diff --git a/src/main/java/no/nav/farskapsportal/config/FarskapsportalConfig.java b/src/main/java/no/nav/farskapsportal/config/FarskapsportalConfig.java index 2f4aee27e..c79afef8b 100644 --- a/src/main/java/no/nav/farskapsportal/config/FarskapsportalConfig.java +++ b/src/main/java/no/nav/farskapsportal/config/FarskapsportalConfig.java @@ -41,6 +41,7 @@ import no.nav.farskapsportal.persistence.dao.FarskapserklaeringDao; import no.nav.farskapsportal.persistence.dao.ForelderDao; import no.nav.farskapsportal.persistence.dao.MeldingsloggDao; +import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao; import no.nav.farskapsportal.persistence.dao.StatusKontrollereFarDao; import no.nav.farskapsportal.service.FarskapsportalService; import no.nav.farskapsportal.service.PersistenceService; @@ -158,14 +159,15 @@ SkattConsumer skattConsumer(@Qualifier("skatt") RestTemplate restTemplate, } @Bean - public PersistenceService persistenceService(PersonopplysningService personopplysningService, + public PersistenceService persistenceService(OppgavebestillingDao oppgavebestillingDao, + PersonopplysningService personopplysningService, FarskapserklaeringDao farskapserklaeringDao, Mapper mapper, BarnDao barnDao, ForelderDao forelderDao, StatusKontrollereFarDao kontrollereFarDao, MeldingsloggDao meldingsloggDao) { - return new PersistenceService(personopplysningService, farskapserklaeringDao, barnDao, forelderDao, kontrollereFarDao, + return new PersistenceService(oppgavebestillingDao, personopplysningService, farskapserklaeringDao, barnDao, forelderDao, kontrollereFarDao, meldingsloggDao, mapper); } diff --git a/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Beskjedprodusent.java b/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Beskjedprodusent.java index 8c041bd00..d9815b522 100644 --- a/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Beskjedprodusent.java +++ b/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Beskjedprodusent.java @@ -1,18 +1,15 @@ package no.nav.farskapsportal.consumer.brukernotifikasjon; import java.net.URL; -import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.UUID; import lombok.Value; import lombok.extern.slf4j.Slf4j; import no.nav.brukernotifikasjon.schemas.Beskjed; import no.nav.brukernotifikasjon.schemas.Nokkel; import no.nav.brukernotifikasjon.schemas.builders.BeskjedBuilder; -import no.nav.brukernotifikasjon.schemas.builders.NokkelBuilder; import no.nav.farskapsportal.config.egenskaper.FarskapsportalEgenskaper; +import no.nav.farskapsportal.persistence.entity.Forelder; import org.springframework.kafka.core.KafkaTemplate; @Slf4j @@ -22,18 +19,17 @@ public class Beskjedprodusent { FarskapsportalEgenskaper farskapsportalEgenskaper; KafkaTemplate kafkaTemplate; - public void oppretteBeskjedTilBruker(String brukersFoedselsnummer, String meldingTilBruker, boolean medEksternVarsling, URL lenke) { + public void oppretteBeskjedTilBruker(Forelder forelder, String meldingTilBruker, boolean medEksternVarsling, URL lenke, Nokkel nokkel) { - var nokkel = oppretteNokkel(); - var beskjed = oppretteBeskjed(brukersFoedselsnummer, meldingTilBruker, medEksternVarsling, lenke); + var beskjed = oppretteBeskjed(forelder.getFoedselsnummer(), meldingTilBruker, medEksternVarsling, lenke); - kafkaTemplate.send(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicBeskjed(), nokkel, beskjed); + try { + kafkaTemplate.send(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicBeskjed(), nokkel, beskjed); + } catch (Exception e) { + log.error("Opprettelse av beskjed til forelder med id {} feilet!", forelder.getId()); + } - } - - private Nokkel oppretteNokkel() { - var unikEventid = UUID.randomUUID().toString(); - return new NokkelBuilder().withSystembruker(farskapsportalEgenskaper.getSystembrukerBrukernavn()).withEventId(unikEventid).build(); + log.info("Beskjed sendt til forelder med id {}.", forelder.getId()); } private Beskjed oppretteBeskjed(String foedselsnummer, String meldingTilBruker, boolean medEksternVarsling, URL lenke) { @@ -44,7 +40,8 @@ private Beskjed oppretteBeskjed(String foedselsnummer, String meldingTilBruker, .withGrupperingsId(farskapsportalEgenskaper.getBrukernotifikasjon().getGrupperingsidFarskap()) .withEksternVarsling(medEksternVarsling) .withSynligFremTil( - LocalDateTime.now(ZoneId.of("UTC")).withHour(0).plusMonths(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetBeskjedAntallMaaneder())) + LocalDateTime.now(ZoneId.of("UTC")).withHour(0) + .plusMonths(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetBeskjedAntallMaaneder())) .withSikkerhetsnivaa(farskapsportalEgenskaper.getBrukernotifikasjon().getSikkerhetsnivaaBeskjed()) .withLink(lenke) .withTekst(meldingTilBruker) diff --git a/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BrukernotifikasjonConsumer.java b/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BrukernotifikasjonConsumer.java index cc03e62b9..e68b23d3c 100644 --- a/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BrukernotifikasjonConsumer.java +++ b/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BrukernotifikasjonConsumer.java @@ -1,11 +1,16 @@ package no.nav.farskapsportal.consumer.brukernotifikasjon; +import java.net.MalformedURLException; import java.net.URL; -import lombok.AllArgsConstructor; +import java.util.UUID; import lombok.extern.slf4j.Slf4j; +import no.nav.brukernotifikasjon.schemas.Nokkel; +import no.nav.brukernotifikasjon.schemas.builders.NokkelBuilder; +import no.nav.farskapsportal.config.egenskaper.FarskapsportalEgenskaper; +import no.nav.farskapsportal.exception.InternFeilException; +import no.nav.farskapsportal.persistence.entity.Forelder; @Slf4j -@AllArgsConstructor public class BrukernotifikasjonConsumer { private static final String MELDING_OM_SIGNERT_FARSKAPSERKLAERING = "Du har en signert farskapserklæring er tilgjengelig for nedlasting i en begrenset tidsperiode fra farskapsportalen:"; @@ -14,38 +19,68 @@ public class BrukernotifikasjonConsumer { private static final String MELDING_TIL_FAR_OM_AVBRUTT_SIGNERING = "Fars signering ble avbrutt, aktuell farskapserklæring måtte derfor slettes. Mor kan opprette ny hvis ønskelig."; private static final String MELDING_OM_IKKE_UTFOERT_SIGNERINGSOPPGAVE = "Far har ikke signert farskapserklæringen innen fristen. Farskapserklæringen er derfor slettet. Mor kan opprette ny hvis ønskelig. Trykk her for å opprette ny farskapserklæring."; - - private final URL farskapsportalUrl; private final Beskjedprodusent beskjedprodusent; private final Ferdigprodusent ferdigprodusent; private final Oppgaveprodusent oppgaveprodusent; + private final FarskapsportalEgenskaper farskapsportalEgenskaper; + private final URL farskapsportalUrl; - public void informereForeldreOmTilgjengeligFarskapserklaering(String foedselsnummerMor, String foedselsnummerFar) { - log.info("Informerer foreldre om ferdigstilt farskapserklæring."); - beskjedprodusent.oppretteBeskjedTilBruker(foedselsnummerMor, MELDING_OM_SIGNERT_FARSKAPSERKLAERING, true, farskapsportalUrl); - beskjedprodusent.oppretteBeskjedTilBruker(foedselsnummerFar, MELDING_OM_SIGNERT_FARSKAPSERKLAERING, true, farskapsportalUrl); + public BrukernotifikasjonConsumer(Beskjedprodusent beskjedprodusent, Ferdigprodusent ferdigprodusent, Oppgaveprodusent oppgaveprodusent, + FarskapsportalEgenskaper farskapsportalEgenskaper) + throws MalformedURLException { + this.beskjedprodusent = beskjedprodusent; + this.ferdigprodusent = ferdigprodusent; + this.oppgaveprodusent = oppgaveprodusent; + this.farskapsportalEgenskaper = farskapsportalEgenskaper; + this.farskapsportalUrl = toUrl(farskapsportalEgenskaper.getUrl()); } - public void varsleMorOmUtgaattOppgaveForSignering(String foedselsnummerMor) { + public void informereForeldreOmTilgjengeligFarskapserklaering(Forelder mor, Forelder far) { + log.info("Informerer foreldre (mor: {}, far: {}) om ferdigstilt farskapserklæring.", mor.getId(), far.getId()); + beskjedprodusent.oppretteBeskjedTilBruker(mor, MELDING_OM_SIGNERT_FARSKAPSERKLAERING, true, farskapsportalUrl, oppretteNokkel()); + beskjedprodusent.oppretteBeskjedTilBruker(far, MELDING_OM_SIGNERT_FARSKAPSERKLAERING, true, farskapsportalUrl, oppretteNokkel()); + } + + public void varsleMorOmUtgaattOppgaveForSignering(Forelder mor) { log.info("Sender varsel til mor om utgått signeringsoppgave"); - beskjedprodusent.oppretteBeskjedTilBruker(foedselsnummerMor, MELDING_OM_IKKE_UTFOERT_SIGNERINGSOPPGAVE, true, farskapsportalUrl); + beskjedprodusent.oppretteBeskjedTilBruker(mor, MELDING_OM_IKKE_UTFOERT_SIGNERINGSOPPGAVE, true, farskapsportalUrl, oppretteNokkel()); } - public void varsleOmAvbruttSignering(String foedselsnummerMor, String foedselsnummerFar) { + public void varsleOmAvbruttSignering(Forelder mor, Forelder far) { log.info("Varsler brukere om avbrutt signering"); - beskjedprodusent.oppretteBeskjedTilBruker(foedselsnummerMor, MELDING_TIL_MOR_OM_AVBRUTT_SIGNERING, true, farskapsportalUrl); - beskjedprodusent.oppretteBeskjedTilBruker(foedselsnummerFar, MELDING_TIL_FAR_OM_AVBRUTT_SIGNERING, true, farskapsportalUrl); + beskjedprodusent.oppretteBeskjedTilBruker(mor, MELDING_TIL_MOR_OM_AVBRUTT_SIGNERING, true, farskapsportalUrl, oppretteNokkel()); + beskjedprodusent.oppretteBeskjedTilBruker(far, MELDING_TIL_FAR_OM_AVBRUTT_SIGNERING, true, farskapsportalUrl, oppretteNokkel()); + } + + public void oppretteOppgaveTilFarOmSignering(int idFarskapserklaering, Forelder far) { + try { + oppgaveprodusent + .oppretteOppgaveForSigneringAvFarskapserklaering(idFarskapserklaering, far, + MELDING_OM_VENTENDE_FARSKAPSERKLAERING, true, farskapsportalUrl); + } catch (InternFeilException internFeilException) { + log.error("En feil inntraff ved opprettelse av oppgave til far for farskapserklæring med id {}", idFarskapserklaering); + } + } + + public void sletteFarsSigneringsoppgave(String eventId, Forelder far) { + log.info("Sletter signeringsoppgave med eventId {}", eventId); + try { + ferdigprodusent.ferdigstilleFarsSigneringsoppgave(far, oppretteNokkel(eventId)); + } catch (InternFeilException internFeilException) { + log.error("En feil oppstod ved sending av ferdigmelding for oppgave med eventId {}."); + } + } + + private Nokkel oppretteNokkel() { + var unikEventid = UUID.randomUUID().toString(); + return oppretteNokkel(unikEventid); } - public void oppretteOppgaveTilFarOmSignering(int idFarskapserklaering, String foedselsnummerFar) { - log.info("Oppretter oppgave om signering til far i farskapserklæring med id {}", idFarskapserklaering); - oppgaveprodusent - .oppretteOppgaveForSigneringAvFarskapserklaering(Integer.toString(idFarskapserklaering), foedselsnummerFar, - MELDING_OM_VENTENDE_FARSKAPSERKLAERING, true); + private Nokkel oppretteNokkel(String eventId) { + return new NokkelBuilder().withSystembruker(farskapsportalEgenskaper.getSystembrukerBrukernavn()).withEventId(eventId).build(); } - public void sletteFarsSigneringsoppgave(int idFarskapserklaering, String foedselsnummerFar) { - log.info("Sletter signeringsoppgave knyttet til farskapserklæring med id {}", idFarskapserklaering); - ferdigprodusent.ferdigstilleFarsSigneringsoppgave(Integer.toString(idFarskapserklaering), foedselsnummerFar); + private URL toUrl(String url) throws MalformedURLException { + return new URL(url); } } diff --git a/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Ferdigprodusent.java b/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Ferdigprodusent.java index 8a0078c30..27ef8e711 100644 --- a/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Ferdigprodusent.java +++ b/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Ferdigprodusent.java @@ -5,9 +5,14 @@ import lombok.Value; import lombok.extern.slf4j.Slf4j; import no.nav.brukernotifikasjon.schemas.Done; +import no.nav.brukernotifikasjon.schemas.Nokkel; import no.nav.brukernotifikasjon.schemas.builders.DoneBuilder; -import no.nav.brukernotifikasjon.schemas.builders.NokkelBuilder; +import no.nav.farskapsportal.api.Feilkode; import no.nav.farskapsportal.config.egenskaper.FarskapsportalEgenskaper; +import no.nav.farskapsportal.exception.InternFeilException; +import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao; +import no.nav.farskapsportal.persistence.entity.Forelder; +import no.nav.farskapsportal.service.PersistenceService; import org.springframework.kafka.core.KafkaTemplate; @Slf4j @@ -16,13 +21,27 @@ public class Ferdigprodusent { FarskapsportalEgenskaper farskapsportalEgenskaper; KafkaTemplate kafkaTemplate; - - public void ferdigstilleFarsSigneringsoppgave(String idFarskapserklaering, String foedselsnummerFar) { - - var nokkel = new NokkelBuilder().withEventId(idFarskapserklaering).withSystembruker(farskapsportalEgenskaper.getSystembrukerBrukernavn()).build(); - var melding = oppretteDone(foedselsnummerFar); - - kafkaTemplate.send(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicFerdig(), nokkel, melding); + PersistenceService persistenceService; + OppgavebestillingDao oppgavebestillingDao; + + public void ferdigstilleFarsSigneringsoppgave(Forelder far, Nokkel nokkel) { + + var oppgaveSomSkalFerdigstilles = oppgavebestillingDao.henteOppgavebestilling(nokkel.getEventId()); + + if (oppgaveSomSkalFerdigstilles.isPresent() && oppgaveSomSkalFerdigstilles.get().getFerdigstilt() == null) { + var melding = oppretteDone(far.getFoedselsnummer()); + try { + kafkaTemplate.send(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicFerdig(), nokkel, melding); + } catch (Exception e) { + throw new InternFeilException(Feilkode.BRUKERNOTIFIKASJON_OPPRETTE_OPPGAVE, e); + } + + log.info("Ferdigmelding ble sendt for oppgave med eventId {}."); + persistenceService.setteOppgaveTilFerdigstilt(nokkel.getEventId()); + } else { + log.warn("Fant ingen aktiv oppgavebestilling for eventId {} (gjelder far med id: {}). Bestiller derfor ikke ferdigstilling.", + nokkel.getEventId(), far.getId()); + } } private Done oppretteDone(String foedselsnummerFar) { @@ -32,5 +51,4 @@ private Done oppretteDone(String foedselsnummerFar) { .withGrupperingsId(farskapsportalEgenskaper.getBrukernotifikasjon().getGrupperingsidFarskap()) .build(); } - } diff --git a/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Oppgaveprodusent.java b/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Oppgaveprodusent.java index f45220bd7..92909c0d7 100644 --- a/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Oppgaveprodusent.java +++ b/src/main/java/no/nav/farskapsportal/consumer/brukernotifikasjon/Oppgaveprodusent.java @@ -3,39 +3,55 @@ import java.net.URL; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.UUID; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import no.nav.brukernotifikasjon.schemas.Nokkel; import no.nav.brukernotifikasjon.schemas.Oppgave; import no.nav.brukernotifikasjon.schemas.builders.NokkelBuilder; import no.nav.brukernotifikasjon.schemas.builders.OppgaveBuilder; import no.nav.farskapsportal.api.Feilkode; import no.nav.farskapsportal.config.egenskaper.FarskapsportalEgenskaper; import no.nav.farskapsportal.exception.InternFeilException; +import no.nav.farskapsportal.persistence.entity.Forelder; +import no.nav.farskapsportal.service.PersistenceService; import org.springframework.kafka.core.KafkaTemplate; @Slf4j @AllArgsConstructor public class Oppgaveprodusent { - private URL farskapsportalUrl; private FarskapsportalEgenskaper farskapsportalEgenskaper; private KafkaTemplate kafkaTemplate; + private PersistenceService persistenceService; - public void oppretteOppgaveForSigneringAvFarskapserklaering(String idFarskapserklaering, String foedselsnummerFar, String oppgavetekst, - boolean medEksternVarsling) { + public void oppretteOppgaveForSigneringAvFarskapserklaering(int idFarskapserklaering, Forelder far, String oppgavetekst, + boolean medEksternVarsling, URL farskapsportalUrl) { - var nokkel = new NokkelBuilder().withEventId(idFarskapserklaering).withSystembruker(farskapsportalEgenskaper.getSystembrukerBrukernavn()).build(); - var melding = oppretteOppgave(foedselsnummerFar, oppgavetekst, medEksternVarsling); + var nokkel = new NokkelBuilder().withEventId(UUID.randomUUID().toString()).withSystembruker(farskapsportalEgenskaper.getSystembrukerBrukernavn()) + .build(); + var melding = oppretteOppgave(far.getFoedselsnummer(), oppgavetekst, medEksternVarsling, farskapsportalUrl); + + var farsAktiveSigneringsoppgaver = persistenceService.henteAktiveOppgaverTilForelderIFarskapserklaering(idFarskapserklaering, far); + + if (farsAktiveSigneringsoppgaver.isEmpty()) { + log.info("Oppretter oppgave om signering til far i farskapserklæring med id {}", idFarskapserklaering); + oppretteOppgave(nokkel, melding); + log.info("Signeringsppgave opprettet for far med id {}.", far.getId()); + persistenceService.lagreNyOppgavebestilling(idFarskapserklaering, nokkel.getEventId()); + } + } + + private void oppretteOppgave(Nokkel nokkel, Oppgave melding) { try { kafkaTemplate.send(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicOppgave(), nokkel, melding); } catch (Exception e) { - log.error("Opprettelse av oppgave feilet!"); e.printStackTrace(); throw new InternFeilException(Feilkode.BRUKERNOTIFIKASJON_OPPRETTE_OPPGAVE, e); } } - private Oppgave oppretteOppgave(String foedselsnummer, String oppgavetekst, boolean medEksternVarsling) { + private Oppgave oppretteOppgave(String foedselsnummer, String oppgavetekst, boolean medEksternVarsling, URL farskapsportalUrl) { return new OppgaveBuilder() .withTidspunkt(ZonedDateTime.now(ZoneId.of("UTC")).toLocalDateTime()) diff --git a/src/main/java/no/nav/farskapsportal/persistence/dao/OppgavebestillingDao.java b/src/main/java/no/nav/farskapsportal/persistence/dao/OppgavebestillingDao.java new file mode 100644 index 000000000..00fbcf884 --- /dev/null +++ b/src/main/java/no/nav/farskapsportal/persistence/dao/OppgavebestillingDao.java @@ -0,0 +1,19 @@ +package no.nav.farskapsportal.persistence.dao; + +import java.util.Optional; +import java.util.Set; +import no.nav.farskapsportal.persistence.entity.Oppgavebestilling; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface OppgavebestillingDao extends CrudRepository { + + @Query("select o from Oppgavebestilling o where o.farskapserklaering.id = :idFarskapserklaering and o.forelder.foedselsnummer = :fnr and o.eventId is not null and o.ferdigstilt is null") + Set henteAktiveOppgaver(int idFarskapserklaering, String fnr); + + @Query("select o from Oppgavebestilling o where o.eventId = :eventId") + Optional henteOppgavebestilling(String eventId); + +} diff --git a/src/main/java/no/nav/farskapsportal/persistence/entity/Brukernotifikasjonsbestilling.java b/src/main/java/no/nav/farskapsportal/persistence/entity/Oppgavebestilling.java similarity index 62% rename from src/main/java/no/nav/farskapsportal/persistence/entity/Brukernotifikasjonsbestilling.java rename to src/main/java/no/nav/farskapsportal/persistence/entity/Oppgavebestilling.java index 1cf6e851b..37c71deb9 100644 --- a/src/main/java/no/nav/farskapsportal/persistence/entity/Brukernotifikasjonsbestilling.java +++ b/src/main/java/no/nav/farskapsportal/persistence/entity/Oppgavebestilling.java @@ -1,9 +1,12 @@ package no.nav.farskapsportal.persistence.entity; +import java.time.LocalDateTime; +import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.OneToOne; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -20,10 +23,23 @@ @DynamicUpdate @NoArgsConstructor @AllArgsConstructor -public class Brukernotifikasjonsbestilling { +public class Oppgavebestilling { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; + @OneToOne + private Farskapserklaering farskapserklaering; + + @OneToOne + private Forelder forelder; + + @Column(unique = true) + private String eventId; + + private LocalDateTime opprettet; + + private LocalDateTime ferdigstilt; + } diff --git a/src/main/java/no/nav/farskapsportal/scheduled/SletteOppgave.java b/src/main/java/no/nav/farskapsportal/scheduled/SletteOppgave.java index 7ec4d7bfa..c624f408b 100644 --- a/src/main/java/no/nav/farskapsportal/scheduled/SletteOppgave.java +++ b/src/main/java/no/nav/farskapsportal/scheduled/SletteOppgave.java @@ -6,6 +6,7 @@ import no.nav.farskapsportal.config.egenskaper.FarskapsportalEgenskaper; import no.nav.farskapsportal.consumer.brukernotifikasjon.BrukernotifikasjonConsumer; import no.nav.farskapsportal.persistence.entity.Farskapserklaering; +import no.nav.farskapsportal.persistence.entity.Oppgavebestilling; import no.nav.farskapsportal.service.PersistenceService; import org.springframework.scheduling.annotation.Scheduled; @@ -26,10 +27,18 @@ public void sletteUtloepteSigneringsoppgaver() { if (farskapsportalEgenskaper.getBrukernotifikasjon().isSkruddPaa() && farskapserklaering.getDokument().getSigneringsinformasjonMor() .getSigneringstidspunkt().toLocalDate() .isBefore(LocalDate.now().minusDays(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetOppgaveAntallDager() - 1))) { - log.info("Sletter utgått signeringsoppgave for farskapserklæring med id {}", farskapserklaering.getId()); - brukernotifikasjonConsumer - .sletteFarsSigneringsoppgave(farskapserklaering.getId(), farskapserklaering.getFar().getFoedselsnummer()); - sletteFarskapserklaeringOgsendeMeldingTilMorDersomFarIkkeHarSignert(farskapserklaering); + + var aktiveOppgaver = persistenceService.henteAktiveOppgaverTilForelderIFarskapserklaering(farskapserklaering.getId(), + farskapserklaering.getFar()); + + for (Oppgavebestilling oppgave : aktiveOppgaver) { + + log.info("Sletter utgått signeringsoppgave for far (id {}) i farskapserklæring (id {})", farskapserklaering.getFar().getId(), + farskapserklaering.getId()); + + brukernotifikasjonConsumer.sletteFarsSigneringsoppgave(oppgave.getEventId(), farskapserklaering.getFar()); + sletteFarskapserklaeringOgsendeMeldingTilMorDersomFarIkkeHarSignert(farskapserklaering); + } } } } @@ -39,7 +48,7 @@ private void sletteFarskapserklaeringOgsendeMeldingTilMorDersomFarIkkeHarSignert || farskapserklaering.getDokument().getSigneringsinformasjonFar().getXadesXml() == null) { persistenceService.deaktivereFarskapserklaering(farskapserklaering.getId()); log.info("Farskapserklæring med id {} ble slettet fra databasen.", farskapserklaering.getId()); - brukernotifikasjonConsumer.varsleMorOmUtgaattOppgaveForSignering(farskapserklaering.getMor().getFoedselsnummer()); + brukernotifikasjonConsumer.varsleMorOmUtgaattOppgaveForSignering(farskapserklaering.getMor()); log.info("Varsel sendt til mor om at fars oppgave for signering er utgått, og at ny farskapserklæring må opprettes."); } } diff --git a/src/main/java/no/nav/farskapsportal/service/FarskapsportalService.java b/src/main/java/no/nav/farskapsportal/service/FarskapsportalService.java index 9a9d7c265..9ad99c816 100644 --- a/src/main/java/no/nav/farskapsportal/service/FarskapsportalService.java +++ b/src/main/java/no/nav/farskapsportal/service/FarskapsportalService.java @@ -48,6 +48,7 @@ import no.nav.farskapsportal.persistence.entity.Dokument; import no.nav.farskapsportal.persistence.entity.Dokumentinnhold; import no.nav.farskapsportal.persistence.entity.Farskapserklaering; +import no.nav.farskapsportal.persistence.entity.Oppgavebestilling; import no.nav.farskapsportal.util.Mapper; import org.apache.commons.lang3.Validate; import org.springframework.lang.Nullable; @@ -382,11 +383,14 @@ private Farskapserklaering oppdatereSigneringsinfoForFar(DokumentStatusDto dokum aktuellFarskapserklaering.getDokument().getSigneringsinformasjonFar().getSigneringstidspunkt())); if (farskapsportalEgenskaper.getBrukernotifikasjon().isSkruddPaa()) { // Slette fars oppgave for signering på DittNav - brukernotifikasjonConsumer.sletteFarsSigneringsoppgave(aktuellFarskapserklaering.getId(), - aktuellFarskapserklaering.getFar().getFoedselsnummer()); + var aktiveOppgaver = persistenceService.henteAktiveOppgaverTilForelderIFarskapserklaering(aktuellFarskapserklaering.getId(), + aktuellFarskapserklaering.getFar()); + for (Oppgavebestilling oppgave : aktiveOppgaver) { + brukernotifikasjonConsumer.sletteFarsSigneringsoppgave(oppgave.getEventId(), aktuellFarskapserklaering.getFar()); + } // Informere foreldrene om gjennomført signering og tilgjengelig farskapserklæring - brukernotifikasjonConsumer.informereForeldreOmTilgjengeligFarskapserklaering(aktuellFarskapserklaering.getFar().getFoedselsnummer(), - aktuellFarskapserklaering.getMor().getFoedselsnummer()); + brukernotifikasjonConsumer.informereForeldreOmTilgjengeligFarskapserklaering(aktuellFarskapserklaering.getMor(), + aktuellFarskapserklaering.getFar()); } } return null; @@ -416,7 +420,7 @@ private Farskapserklaering oppdatereSigneringsinfoForMor(DokumentStatusDto dokum aktuellFarskapserklaering.getDokument().getSigneringsinformasjonMor().setXadesXml(xadesXml); if (farskapsportalEgenskaper.getBrukernotifikasjon().isSkruddPaa()) { brukernotifikasjonConsumer.oppretteOppgaveTilFarOmSignering(aktuellFarskapserklaering.getId(), - aktuellFarskapserklaering.getFar().getFoedselsnummer()); + aktuellFarskapserklaering.getFar()); } } return null; @@ -445,9 +449,14 @@ private void haandetereStatusFeilet(DokumentStatusDto dokumentStatusDto, Farskap if (rolle.equals(FAR)) { farskapserklaering.getDokument().getSigneringsinformasjonFar().setStatusSignering(dokumentStatusDto.getStatusSignering().toString()); if (farskapsportalEgenskaper.getBrukernotifikasjon().isSkruddPaa()) { - brukernotifikasjonConsumer.varsleOmAvbruttSignering(farskapserklaering.getMor().getFoedselsnummer(), - farskapserklaering.getFar().getFoedselsnummer()); - brukernotifikasjonConsumer.sletteFarsSigneringsoppgave(farskapserklaering.getId(), farskapserklaering.getFar().getFoedselsnummer()); + brukernotifikasjonConsumer.varsleOmAvbruttSignering(farskapserklaering.getMor(), farskapserklaering.getFar()); + var farsAktiveSigneringsoppgaver = persistenceService.henteAktiveOppgaverTilForelderIFarskapserklaering(farskapserklaering.getId(), + farskapserklaering.getFar()); + log.info("Fant {} aktiv signeringsoppgave til knyttet til far med id {}", farsAktiveSigneringsoppgaver.size(), + farskapserklaering.getFar().getId()); + for (Oppgavebestilling oppgave : farsAktiveSigneringsoppgaver) { + brukernotifikasjonConsumer.sletteFarsSigneringsoppgave(oppgave.getEventId(), farskapserklaering.getFar()); + } } } diff --git a/src/main/java/no/nav/farskapsportal/service/PersistenceService.java b/src/main/java/no/nav/farskapsportal/service/PersistenceService.java index 149d1aec1..e24c03af0 100644 --- a/src/main/java/no/nav/farskapsportal/service/PersistenceService.java +++ b/src/main/java/no/nav/farskapsportal/service/PersistenceService.java @@ -22,10 +22,12 @@ import no.nav.farskapsportal.persistence.dao.FarskapserklaeringDao; import no.nav.farskapsportal.persistence.dao.ForelderDao; import no.nav.farskapsportal.persistence.dao.MeldingsloggDao; +import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao; import no.nav.farskapsportal.persistence.dao.StatusKontrollereFarDao; import no.nav.farskapsportal.persistence.entity.Farskapserklaering; import no.nav.farskapsportal.persistence.entity.Forelder; import no.nav.farskapsportal.persistence.entity.Meldingslogg; +import no.nav.farskapsportal.persistence.entity.Oppgavebestilling; import no.nav.farskapsportal.persistence.entity.StatusKontrollereFar; import no.nav.farskapsportal.persistence.exception.FantIkkeEntititetException; import no.nav.farskapsportal.util.Mapper; @@ -35,6 +37,8 @@ @RequiredArgsConstructor public class PersistenceService { + private final OppgavebestillingDao oppgavebestillingDao; + private final PersonopplysningService personopplysningService; private final FarskapserklaeringDao farskapserklaeringDao; @@ -128,7 +132,8 @@ public Set henteFarskapserklaeringerEtterRedirect(String fnr } @Transactional - public StatusKontrollereFar oppdatereStatusKontrollereFar(String fnrMor, String registrertNavnFar, String oppgittNavnFar, int antallDagerTilForsoekNullstilles, int maksAntallFeiledeForsoek) { + public StatusKontrollereFar oppdatereStatusKontrollereFar(String fnrMor, String registrertNavnFar, String oppgittNavnFar, + int antallDagerTilForsoekNullstilles, int maksAntallFeiledeForsoek) { var muligStatusKontrollereFar = statusKontrollereFarDao.henteStatusKontrollereFar(fnrMor); var naa = LocalDateTime.now(); @@ -210,6 +215,32 @@ public void deaktivereFarskapserklaering(int idFarskapserklaering) { } } + public Oppgavebestilling lagreNyOppgavebestilling(int idFarskapserklaering, String eventId) { + var farskapserklaering = henteFarskapserklaeringForId(idFarskapserklaering); + + var oppgavebestilling = Oppgavebestilling.builder() + .farskapserklaering(farskapserklaering) + .forelder(farskapserklaering.getFar()) + .eventId(eventId) + .opprettet(LocalDateTime.now()).build(); + return oppgavebestillingDao.save(oppgavebestilling); + } + + public Set henteAktiveOppgaverTilForelderIFarskapserklaering(int idFarskapserklaering, Forelder forelder) { + return oppgavebestillingDao.henteAktiveOppgaver(idFarskapserklaering, forelder.getFoedselsnummer()); + } + + @Transactional + public void setteOppgaveTilFerdigstilt(String eventId) { + var aktiveOppgaver = oppgavebestillingDao.henteOppgavebestilling(eventId); + + if (aktiveOppgaver.isPresent()) { + aktiveOppgaver.get().setFerdigstilt(LocalDateTime.now()); + } else { + log.warn("Fant ingen oppgavebestilling med eventId {}, ferdigstiltstatus ble ikke satt!", eventId); + } + } + public void oppdatereMeldingslogg(LocalDateTime tidspunktForOverfoering, String meldingsidSkatt) { var nyttInnslag = Meldingslogg.builder().tidspunktForOversendelse(tidspunktForOverfoering).meldingsidSkatt(meldingsidSkatt).build(); meldingsloggDao.save(nyttInnslag); @@ -233,7 +264,8 @@ private ForelderDto henteForelder(String fnr) { return ForelderDto.builder().foedselsnummer(fnr).navn(navnDto).build(); } - private StatusKontrollereFar lagreNyStatusKontrollereFar(String fnrMor, String registrertNavnFar, String oppgittNavnFar, LocalDateTime tidspunktForNullstilling) { + private StatusKontrollereFar lagreNyStatusKontrollereFar(String fnrMor, String registrertNavnFar, String oppgittNavnFar, + LocalDateTime tidspunktForNullstilling) { var eksisterendeMor = forelderDao.henteForelderMedFnr(fnrMor); var mor = eksisterendeMor.orElseGet(() -> forelderDao.save(mapper.toEntity(henteForelder(fnrMor)))); log.warn("Mor med id {}, oppgav feil navn på far. Legger til nytt innslag i statusKontrollereFar-tabellen", mor.getId()); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 95f1db4a0..943a56889 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -179,7 +179,7 @@ ESIGNERING_AVBRUTT_URL: localhost:8082/esignering/avbrutt ESIGNERING_FEILET_URL: localhost:8082/esignering/feilet KAFKA_BROKERS: 127.0.0.1:9092 KAFKA_SCHEMA_REGISTRY_URL_CONFIG: http://localhost:8081 -NAV_TRUSTSTORE_PATH: /Users/jkskaar/workspaces/github/navikt/farskapsportal-api/src/test/resources/server-selfsigned.jks +NAV_TRUSTSTORE_PATH: /Users/jkskaar/workspaces/github/navikt/temp/farskapsportal-api/src/test/resources/server-selfsigned.jks NAV_TRUSTSTORE_PASSWORD: qwer1234 NAIS_CLUSTER_NAME: dev SRVFARSKAPSPORTAL_PWD: top_hemmelig diff --git a/src/main/resources/db/migration/V11_2_0__create-table-oppgavebestilling.sql b/src/main/resources/db/migration/V11_2_0__create-table-oppgavebestilling.sql new file mode 100644 index 000000000..6a26bccf1 --- /dev/null +++ b/src/main/resources/db/migration/V11_2_0__create-table-oppgavebestilling.sql @@ -0,0 +1,17 @@ +-- Table: oppgavebestilling + +-- DROP TABLE oppgavebestilling; + +CREATE TABLE oppgavebestilling +( + id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ), + farskapserklaering_id integer, + forelder_id integer, + event_id varchar(255), + opprettet timestamp without time zone, + ferdigstilt timestamp without time zone, + CONSTRAINT oppgavebestilling_pkey PRIMARY KEY (id), + CONSTRAINT uk_oppgavebestilling_event_id UNIQUE (event_id) +) + +TABLESPACE pg_default; \ No newline at end of file diff --git a/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BeskjedprodusentTest.java b/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BeskjedprodusentTest.java index 8be4ee829..e93b35897 100644 --- a/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BeskjedprodusentTest.java +++ b/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BeskjedprodusentTest.java @@ -8,19 +8,19 @@ import static org.mockito.Mockito.verify; import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; import java.net.URL; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.TimeZone; +import java.util.UUID; import no.nav.brukernotifikasjon.schemas.Beskjed; -import no.nav.brukernotifikasjon.schemas.Done; import no.nav.brukernotifikasjon.schemas.Nokkel; +import no.nav.brukernotifikasjon.schemas.builders.NokkelBuilder; import no.nav.farskapsportal.FarskapsportalApplicationLocal; import no.nav.farskapsportal.config.egenskaper.FarskapsportalEgenskaper; +import no.nav.farskapsportal.persistence.entity.Forelder; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; @@ -52,13 +52,12 @@ void skalOppretteBeskjedTilBruker() throws MalformedURLException { var beskjedfanger = ArgumentCaptor.forClass(Beskjed.class); var eksternVarsling = true; - var fnrFar = "11111122222"; - var idFarskapserklaering = "1"; + var far = Forelder.builder().foedselsnummer("11111122222").build(); - var farskapsportalUrl = new URL(farskapsportalEgenskaper.getUrl()); + var farskapsportalUrl = new URL(farskapsportalEgenskaper.getUrl()); // when - beskjedprodusent.oppretteBeskjedTilBruker(fnrFar, "Hei på deg", eksternVarsling, farskapsportalUrl); + beskjedprodusent.oppretteBeskjedTilBruker(far, "Hei på deg", eksternVarsling, farskapsportalUrl, oppretteNokkel()); //then verify(ferdigkoe, times(1)) @@ -75,19 +74,25 @@ void skalOppretteBeskjedTilBruker() throws MalformedURLException { var beskjed = beskjeder.get(0); assertAll( - () -> assertThat(beskjed.getFodselsnummer()).isEqualTo(fnrFar), + () -> assertThat(beskjed.getFodselsnummer()).isEqualTo(far.getFoedselsnummer()), () -> assertThat(beskjed.getGrupperingsId()).isEqualTo(farskapsportalEgenskaper.getBrukernotifikasjon().getGrupperingsidFarskap()), () -> assertThat(LocalDateTime.ofInstant(Instant.ofEpochMilli(beskjed.getTidspunkt()), - ZoneId.of("UTC"))).isBetween(ZonedDateTime.now(ZoneId.of("UTC")).toLocalDateTime().minusSeconds(2), ZonedDateTime.now(ZoneId.of("UTC")).toLocalDateTime()), + ZoneId.of("UTC"))).isBetween(ZonedDateTime.now(ZoneId.of("UTC")).toLocalDateTime().minusSeconds(2), + ZonedDateTime.now(ZoneId.of("UTC")).toLocalDateTime()), () -> assertThat(beskjed.getEksternVarsling()).isEqualTo(eksternVarsling), () -> assertThat(beskjed.getLink()).isEqualTo(farskapsportalUrl.toString()), () -> assertThat(beskjed.getSikkerhetsnivaa()).isEqualTo(farskapsportalEgenskaper.getBrukernotifikasjon().getSikkerhetsnivaaBeskjed()), () -> assertThat(beskjed.getTekst()).isEqualTo("Hei på deg"), () -> assertThat(LocalDateTime.ofInstant(Instant.ofEpochMilli(beskjed.getSynligFremTil()), - ZoneId.of("UTC"))).isEqualTo( LocalDateTime.ofInstant(Instant.ofEpochMilli(beskjed.getTidspunkt()), - TimeZone.getDefault().toZoneId()).plusMonths(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetBeskjedAntallMaaneder()).withHour(0)), + ZoneId.of("UTC"))).isEqualTo(LocalDateTime.ofInstant(Instant.ofEpochMilli(beskjed.getTidspunkt()), + TimeZone.getDefault().toZoneId()).plusMonths(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetBeskjedAntallMaaneder()) + .withHour(0)), () -> assertThat(noekkel.getSystembruker()).isEqualTo(farskapsportalEgenskaper.getSystembrukerBrukernavn()) ); } + private Nokkel oppretteNokkel() { + var unikEventid = UUID.randomUUID().toString(); + return new NokkelBuilder().withSystembruker(farskapsportalEgenskaper.getSystembrukerBrukernavn()).withEventId(unikEventid).build(); + } } diff --git a/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BrukernotifikasjonConsumerTest.java b/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BrukernotifikasjonConsumerTest.java index 86aaf41d2..c98ec87d7 100644 --- a/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BrukernotifikasjonConsumerTest.java +++ b/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/BrukernotifikasjonConsumerTest.java @@ -6,6 +6,8 @@ import static no.nav.farskapsportal.TestUtils.henteForelder; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -14,7 +16,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.ZoneOffset; +import java.util.UUID; import no.nav.brukernotifikasjon.schemas.Beskjed; import no.nav.brukernotifikasjon.schemas.Done; import no.nav.brukernotifikasjon.schemas.Nokkel; @@ -25,6 +27,9 @@ import no.nav.farskapsportal.dto.BarnDto; import no.nav.farskapsportal.dto.ForelderDto; import no.nav.farskapsportal.persistence.dao.FarskapserklaeringDao; +import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao; +import no.nav.farskapsportal.persistence.entity.Forelder; +import no.nav.farskapsportal.persistence.entity.Oppgavebestilling; import no.nav.farskapsportal.service.PersistenceService; import no.nav.farskapsportal.util.Mapper; import org.junit.jupiter.api.DisplayName; @@ -50,19 +55,16 @@ public class BrukernotifikasjonConsumerTest { private static final ForelderDto MOR = henteForelder(Forelderrolle.MOR); private static final ForelderDto FAR = henteForelder(Forelderrolle.FAR); private static final BarnDto BARN = henteBarnUtenFnr(5); - @Autowired - BrukernotifikasjonConsumer brukernotifikasjonConsumer; - + Mapper mapper; @Autowired - PersistenceService persistenceService; - + private BrukernotifikasjonConsumer brukernotifikasjonConsumer; @Autowired - FarskapserklaeringDao farskapserklaeringDao; - + private PersistenceService persistenceService; @Autowired - Mapper mapper; - + private FarskapserklaeringDao farskapserklaeringDao; + @Autowired + private OppgavebestillingDao oppgavebestillingDao; @MockBean private KafkaTemplate beskjedkoe; @@ -83,7 +85,8 @@ void skalInformereForeldreOmTilgjengeligFarskapserklaering() { var beskjedfanger = ArgumentCaptor.forClass(Beskjed.class); // when - brukernotifikasjonConsumer.informereForeldreOmTilgjengeligFarskapserklaering(MOR.getFoedselsnummer(), FAR.getFoedselsnummer()); + brukernotifikasjonConsumer.informereForeldreOmTilgjengeligFarskapserklaering(mapper.modelMapper(MOR, Forelder.class), + mapper.modelMapper(FAR, Forelder.class)); // then verify(beskjedkoe, times(2)) @@ -130,13 +133,14 @@ void skalInformereForeldreOmTilgjengeligFarskapserklaering() { void skalVarsleMorOmUtloeptOppgaveForSignering() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var noekkelfanger = ArgumentCaptor.forClass(Nokkel.class); var beskjedfanger = ArgumentCaptor.forClass(Beskjed.class); // when - brukernotifikasjonConsumer.varsleMorOmUtgaattOppgaveForSignering(MOR.getFoedselsnummer()); + brukernotifikasjonConsumer.varsleMorOmUtgaattOppgaveForSignering(mapper.modelMapper(MOR, Forelder.class)); // then verify(beskjedkoe, times(1)) @@ -164,10 +168,8 @@ void skalVarsleMorOgFarDersomFarAvbryterSignering() { var noekkelfanger = ArgumentCaptor.forClass(Nokkel.class); var beskjedfanger = ArgumentCaptor.forClass(Beskjed.class); - var tidspunktFoerTestEpochMillis = LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli(); - // when - brukernotifikasjonConsumer.varsleOmAvbruttSignering(MOR.getFoedselsnummer(), FAR.getFoedselsnummer()); + brukernotifikasjonConsumer.varsleOmAvbruttSignering(mapper.toEntity(MOR), mapper.toEntity(FAR)); // then verify(beskjedkoe, times(2)) @@ -180,7 +182,6 @@ void skalVarsleMorOgFarDersomFarAvbryterSignering() { var alleNoekler = noekkelfanger.getAllValues(); var noekkelTilMor = alleNoekler.get(0); var noekkelTilFar = alleNoekler.get(1); - var tidspunktEtterTestEpocMillis = LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli(); assertAll( () -> assertThat(noekkelTilMor.getSystembruker()).isEqualTo(farskapsportalEgenskaper.getSystembrukerBrukernavn()), @@ -209,7 +210,9 @@ void skalVarsleMorOgFarDersomFarAvbryterSignering() { void skalOppretteOppgaveTilFarOmSignering() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); + var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now().minusMinutes(3)); var farskapserklaering = persistenceService.lagreNyFarskapserklaering(mapper.toEntity(farskapserklaeringSomVenterPaaFarsSignatur)); @@ -218,7 +221,7 @@ void skalOppretteOppgaveTilFarOmSignering() { var oppgavefanger = ArgumentCaptor.forClass(Oppgave.class); // when - brukernotifikasjonConsumer.oppretteOppgaveTilFarOmSignering(farskapserklaering.getId(), FAR.getFoedselsnummer()); + brukernotifikasjonConsumer.oppretteOppgaveTilFarOmSignering(farskapserklaering.getId(), mapper.toEntity(FAR)); // then verify(oppgavekoe, times(1)) @@ -227,9 +230,16 @@ void skalOppretteOppgaveTilFarOmSignering() { var nokkel = noekkelfanger.getValue(); var oppgave = oppgavefanger.getValue(); + var oppgavebestillinger = persistenceService.henteAktiveOppgaverTilForelderIFarskapserklaering(farskapserklaering.getId(), + farskapserklaering.getFar()); + var oppgavebestilling = oppgavebestillinger.stream().findFirst(); + assertAll( + () -> assertThat(oppgavebestilling).isPresent(), + () -> assertThat(oppgavebestilling.get().getFerdigstilt()).isNull(), + () -> assertThat(oppgavebestilling.get().getOpprettet()).isNotNull(), () -> assertThat(nokkel.getSystembruker()).isEqualTo(farskapsportalEgenskaper.getSystembrukerBrukernavn()), - () -> assertThat(nokkel.getEventId()).isEqualTo(Integer.toString(farskapserklaering.getId())), + () -> assertThat(nokkel.getEventId()).isEqualTo(oppgavebestilling.get().getEventId()), () -> assertThat(oppgave.getEksternVarsling()).isTrue(), () -> assertThat(oppgave.getFodselsnummer()).isEqualTo(FAR.getFoedselsnummer()), () -> assertThat(oppgave.getGrupperingsId()).isEqualTo(farskapsportalEgenskaper.getBrukernotifikasjon().getGrupperingsidFarskap()), @@ -240,12 +250,45 @@ void skalOppretteOppgaveTilFarOmSignering() { ); } + @Test + void skalIkkeOppretteSigneringsoppgaveDersomEnAlleredeEksistererForFarIFarskapserklaering() { + + // given + oppgavebestillingDao.deleteAll(); + farskapserklaeringDao.deleteAll(); + + var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); + farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now().minusMinutes(3)); + var farskapserklaering = persistenceService.lagreNyFarskapserklaering(mapper.toEntity(farskapserklaeringSomVenterPaaFarsSignatur)); + + oppgavebestillingDao.save(Oppgavebestilling.builder() + .forelder(farskapserklaering.getFar()).farskapserklaering(farskapserklaering).opprettet(LocalDateTime.now()) + .eventId(UUID.randomUUID().toString()).build()); + + // when + brukernotifikasjonConsumer.oppretteOppgaveTilFarOmSignering(farskapserklaering.getId(), mapper.toEntity(FAR)); + + // then + verify(oppgavekoe, times(0)) + .send(anyString(), any(Nokkel.class), any(Oppgave.class)); + var oppgavebestillinger = persistenceService.henteAktiveOppgaverTilForelderIFarskapserklaering(farskapserklaering.getId(), + farskapserklaering.getFar()); + var oppgavebestilling = oppgavebestillinger.stream().findFirst(); + + assertAll( + () -> assertThat(oppgavebestilling).isPresent(), + () -> assertThat(oppgavebestilling.get().getFerdigstilt()).isNull(), + () -> assertThat(oppgavebestilling.get().getOpprettet()).isNotNull() + ); + } + @Test void skalSletteFarsSigneringsoppgave() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); - var tidspunktFoerTestIEpochMillis = LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli(); + var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now().minusMinutes(3)); var farskapserklaering = persistenceService.lagreNyFarskapserklaering(mapper.toEntity(farskapserklaeringSomVenterPaaFarsSignatur)); @@ -253,8 +296,10 @@ void skalSletteFarsSigneringsoppgave() { var noekkelfanger = ArgumentCaptor.forClass(Nokkel.class); var ferdigfanger = ArgumentCaptor.forClass(Done.class); + var eksisterendeOppgavebestilling = persistenceService.lagreNyOppgavebestilling(farskapserklaering.getId(), UUID.randomUUID().toString()); + // when - brukernotifikasjonConsumer.sletteFarsSigneringsoppgave(farskapserklaering.getId(), FAR.getFoedselsnummer()); + brukernotifikasjonConsumer.sletteFarsSigneringsoppgave(eksisterendeOppgavebestilling.getEventId(), mapper.toEntity(FAR)); // then verify(ferdigkoe, times(1)) @@ -270,5 +315,4 @@ void skalSletteFarsSigneringsoppgave() { () -> assertThat(ferdig.getTidspunkt()).isGreaterThan(Instant.now().minusSeconds(10).toEpochMilli()) ); } - } diff --git a/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/FerdigprodusentTest.java b/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/FerdigprodusentTest.java index 123c9b62f..2f289735a 100644 --- a/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/FerdigprodusentTest.java +++ b/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/FerdigprodusentTest.java @@ -1,8 +1,14 @@ package no.nav.farskapsportal.consumer.brukernotifikasjon; import static no.nav.farskapsportal.FarskapsportalApplicationLocal.PROFILE_TEST; +import static no.nav.farskapsportal.TestUtils.FAR; +import static no.nav.farskapsportal.TestUtils.MOR; +import static no.nav.farskapsportal.TestUtils.henteBarnUtenFnr; +import static no.nav.farskapsportal.TestUtils.henteFarskapserklaeringDto; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -11,10 +17,18 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.UUID; import no.nav.brukernotifikasjon.schemas.Done; import no.nav.brukernotifikasjon.schemas.Nokkel; +import no.nav.brukernotifikasjon.schemas.builders.NokkelBuilder; import no.nav.farskapsportal.FarskapsportalApplicationLocal; import no.nav.farskapsportal.config.egenskaper.FarskapsportalEgenskaper; +import no.nav.farskapsportal.persistence.dao.FarskapserklaeringDao; +import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao; +import no.nav.farskapsportal.persistence.entity.Forelder; +import no.nav.farskapsportal.persistence.entity.Oppgavebestilling; +import no.nav.farskapsportal.service.PersistenceService; +import no.nav.farskapsportal.util.Mapper; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; @@ -29,27 +43,43 @@ @ActiveProfiles(PROFILE_TEST) public class FerdigprodusentTest { + @Autowired + Mapper mapper; @Autowired private FarskapsportalEgenskaper farskapsportalEgenskaper; - @MockBean private KafkaTemplate ferdigkoe; - @Autowired private Ferdigprodusent ferdigprodusent; + @Autowired + private PersistenceService persistenceService; + @Autowired + private FarskapserklaeringDao farskapserklaeringDao; + @Autowired + private OppgavebestillingDao oppgavebestillingDao; @Test void skalFerdigstilleFarsSigneringsoppgave() { // given + oppgavebestillingDao.deleteAll(); + farskapserklaeringDao.deleteAll(); + var noekkelfanger = ArgumentCaptor.forClass(Nokkel.class); var ferdigfanger = ArgumentCaptor.forClass(Done.class); var fnrFar = "11111122222"; - var idFarskapserklaering = "1"; + + var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, henteBarnUtenFnr(6)); + farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now().minusMinutes(3)); + var farskapserklaering = persistenceService.lagreNyFarskapserklaering(mapper.toEntity(farskapserklaeringSomVenterPaaFarsSignatur)); + + var oppgavebestilling = oppgavebestillingDao.save(Oppgavebestilling.builder() + .opprettet(LocalDateTime.now()).eventId(UUID.randomUUID().toString()).forelder(farskapserklaering.getFar()).build()); // when - ferdigprodusent.ferdigstilleFarsSigneringsoppgave(idFarskapserklaering, fnrFar); + ferdigprodusent.ferdigstilleFarsSigneringsoppgave(Forelder.builder().foedselsnummer(fnrFar).build(), + new NokkelBuilder().withSystembruker("srvfarskapsportal").withEventId(oppgavebestilling.getEventId()).build()); //then verify(ferdigkoe, times(1)) @@ -70,9 +100,32 @@ void skalFerdigstilleFarsSigneringsoppgave() { () -> assertThat(ferdigmelding.getGrupperingsId()).isEqualTo(farskapsportalEgenskaper.getBrukernotifikasjon().getGrupperingsidFarskap()), () -> assertThat(LocalDateTime.ofInstant(Instant.ofEpochMilli(ferdigmelding.getTidspunkt()), ZoneId.of("UTC"))) .isBetween(ZonedDateTime.now(ZoneId.of("UTC")).toLocalDateTime().minusSeconds(2), ZonedDateTime.now(ZoneId.of("UTC")).toLocalDateTime()), - () -> assertThat(noekkel.getSystembruker()).isEqualTo(farskapsportalEgenskaper.getSystembrukerBrukernavn()), - () -> assertThat(noekkel.getEventId()).isEqualTo(idFarskapserklaering) + () -> assertThat(noekkel.getEventId()).isEqualTo(oppgavebestilling.getEventId()) ); } + @Test + void skalIkkeFerdigstilleOppgaveSomIkkeErAktiv() { + + // given + oppgavebestillingDao.deleteAll(); + farskapserklaeringDao.deleteAll(); + + var fnrFar = "11111122222"; + + var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, henteBarnUtenFnr(6)); + farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now().minusMinutes(3)); + var farskapserklaering = persistenceService.lagreNyFarskapserklaering(mapper.toEntity(farskapserklaeringSomVenterPaaFarsSignatur)); + + var oppgavebestilling = oppgavebestillingDao.save(Oppgavebestilling.builder() + .opprettet(LocalDateTime.now()).eventId(UUID.randomUUID().toString()).forelder(farskapserklaering.getFar()).ferdigstilt(LocalDateTime.now()) + .build()); + + // when + ferdigprodusent.ferdigstilleFarsSigneringsoppgave(Forelder.builder().foedselsnummer(fnrFar).build(), + new NokkelBuilder().withSystembruker("srvfarskapsportal").withEventId(oppgavebestilling.getEventId()).build()); + + //then + verify(ferdigkoe, times(0)).send(anyString(), any(Nokkel.class), any(Done.class)); + } } diff --git a/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/OppgaveprodusentTest.java b/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/OppgaveprodusentTest.java index 992ed72bb..7de645b82 100644 --- a/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/OppgaveprodusentTest.java +++ b/src/test/java/no/nav/farskapsportal/consumer/brukernotifikasjon/OppgaveprodusentTest.java @@ -1,17 +1,32 @@ package no.nav.farskapsportal.consumer.brukernotifikasjon; import static no.nav.farskapsportal.FarskapsportalApplicationLocal.PROFILE_TEST; +import static no.nav.farskapsportal.TestUtils.FAR; +import static no.nav.farskapsportal.TestUtils.MOR; +import static no.nav.farskapsportal.TestUtils.henteBarnUtenFnr; +import static no.nav.farskapsportal.TestUtils.henteFarskapserklaeringDto; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import java.net.MalformedURLException; +import java.net.URL; import java.time.Instant; +import java.time.LocalDateTime; +import java.util.UUID; import no.nav.brukernotifikasjon.schemas.Nokkel; import no.nav.brukernotifikasjon.schemas.Oppgave; import no.nav.farskapsportal.FarskapsportalApplicationLocal; import no.nav.farskapsportal.config.egenskaper.FarskapsportalEgenskaper; +import no.nav.farskapsportal.persistence.dao.FarskapserklaeringDao; +import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao; +import no.nav.farskapsportal.persistence.entity.Forelder; +import no.nav.farskapsportal.service.PersistenceService; +import no.nav.farskapsportal.util.Mapper; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.springframework.beans.factory.annotation.Autowired; @@ -33,20 +48,39 @@ public class OppgaveprodusentTest { @Autowired private Oppgaveprodusent oppgaveprodusent; + @Autowired + private PersistenceService persistenceService; + + @Autowired + private Mapper mapper; + + @Autowired + private FarskapserklaeringDao farskapserklaeringDao; + + @Autowired + private OppgavebestillingDao oppgavebestillingDao; + @Test - void skalOppretteOppgaveForSigneringAvFarskapserklaering() { + void skalOppretteOppgaveForSigneringAvFarskapserklaering() throws MalformedURLException { // given + oppgavebestillingDao.deleteAll(); + farskapserklaeringDao.deleteAll(); + var noekkelfanger = ArgumentCaptor.forClass(Nokkel.class); var oppgavefanger = ArgumentCaptor.forClass(Oppgave.class); - var fnrFar = "11111122222"; - var idFarskapserklaering = "1"; + var far = Forelder.builder().foedselsnummer("11111122222").build(); var oppgavetekst = "Vennligst signer farskapserklæringen"; var eksternVarsling = false; + var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, henteBarnUtenFnr(5)); + farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now().minusMinutes(3)); + var lagretFarskapserklaering = persistenceService.lagreNyFarskapserklaering(mapper.toEntity(farskapserklaeringSomVenterPaaFarsSignatur)); + // when - oppgaveprodusent.oppretteOppgaveForSigneringAvFarskapserklaering(idFarskapserklaering, fnrFar, oppgavetekst, eksternVarsling); + oppgaveprodusent.oppretteOppgaveForSigneringAvFarskapserklaering(lagretFarskapserklaering.getId(), far, oppgavetekst, eksternVarsling, + new URL(farskapsportalEgenskaper.getUrl())); //then verify(oppgavekoe, times(1)) @@ -55,7 +89,17 @@ void skalOppretteOppgaveForSigneringAvFarskapserklaering() { var noekler = noekkelfanger.getAllValues(); var oppgaver = oppgavefanger.getAllValues(); + var oppgavebestilling = persistenceService.henteAktiveOppgaverTilForelderIFarskapserklaering(lagretFarskapserklaering.getId(), + lagretFarskapserklaering.getFar()).stream().findFirst(); + assertAll( + () -> assertThat(oppgavebestilling).isPresent(), + () -> assertThat(oppgavebestilling.get().getFerdigstilt()).isNull(), + () -> assertThat(oppgavebestilling.get().getOpprettet()).isNotNull(), + () -> assertThat(oppgavebestilling.get().getOpprettet()).isBefore(LocalDateTime.now().plusMinutes(10)), + () -> assertThat(oppgavebestilling.get().getOpprettet()).isAfter(LocalDateTime.now().minusMinutes(10)), + () -> assertThat(oppgavebestilling.get().getEventId()).isNotNull(), + () -> assertThat(oppgavebestilling.get().getForelder()).isNotNull(), () -> assertThat(noekler.size()).isEqualTo(1), () -> assertThat(oppgaver.size()).isEqualTo(1)); @@ -63,15 +107,40 @@ void skalOppretteOppgaveForSigneringAvFarskapserklaering() { var oppgave = oppgaver.get(0); assertAll( - () -> assertThat(oppgave.getFodselsnummer()).isEqualTo(fnrFar), + () -> assertThat(oppgave.getFodselsnummer()).isEqualTo(far.getFoedselsnummer()), () -> assertThat(oppgave.getEksternVarsling()).isEqualTo(eksternVarsling), () -> assertThat(oppgave.getTekst()).isEqualTo(oppgavetekst), () -> assertThat(oppgave.getGrupperingsId()).isEqualTo(farskapsportalEgenskaper.getBrukernotifikasjon().getGrupperingsidFarskap()), () -> assertThat(oppgave.getSikkerhetsnivaa()).isEqualTo(farskapsportalEgenskaper.getBrukernotifikasjon().getSikkerhetsnivaaOppgave()), () -> assertThat(oppgave.getTidspunkt()).isBetween(Instant.now().minusSeconds(5).toEpochMilli(), Instant.now().toEpochMilli()), () -> assertThat(noekkel.getSystembruker()).isEqualTo(farskapsportalEgenskaper.getSystembrukerBrukernavn()), - () -> assertThat(noekkel.getEventId()).isEqualTo(idFarskapserklaering) + () -> assertThat(noekkel.getEventId()).isEqualTo(oppgavebestilling.get().getEventId()) ); } + + @Test + void skalIkkeOppretteDuplikatOppgavebestilling() throws MalformedURLException { + + // given + oppgavebestillingDao.deleteAll(); + farskapserklaeringDao.deleteAll(); + + var far = Forelder.builder().foedselsnummer("11111122222").build(); + var oppgavetekst = "Vennligst signer farskapserklæringen"; + var eksternVarsling = false; + + var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, henteBarnUtenFnr(5)); + farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now().minusMinutes(3)); + var lagretFarskapserklaering = persistenceService.lagreNyFarskapserklaering(mapper.toEntity(farskapserklaeringSomVenterPaaFarsSignatur)); + + persistenceService.lagreNyOppgavebestilling(lagretFarskapserklaering.getId(), UUID.randomUUID().toString()); + + // when + oppgaveprodusent.oppretteOppgaveForSigneringAvFarskapserklaering(lagretFarskapserklaering.getId(), lagretFarskapserklaering.getFar(), oppgavetekst, eksternVarsling, + new URL(farskapsportalEgenskaper.getUrl())); + + //then + verify(oppgavekoe, times(0)).send(anyString(), any(Nokkel.class), any(Oppgave.class)); + } } diff --git a/src/test/java/no/nav/farskapsportal/provider/rs/FarskapsportalControllerTest.java b/src/test/java/no/nav/farskapsportal/provider/rs/FarskapsportalControllerTest.java index ba3e2fb33..314701291 100644 --- a/src/test/java/no/nav/farskapsportal/provider/rs/FarskapsportalControllerTest.java +++ b/src/test/java/no/nav/farskapsportal/provider/rs/FarskapsportalControllerTest.java @@ -32,6 +32,7 @@ import java.time.format.DateTimeFormatter; import java.util.LinkedHashMap; import java.util.List; +import java.util.UUID; import lombok.SneakyThrows; import no.nav.bidrag.commons.web.test.HttpHeaderTestRestTemplate; import no.nav.farskapsportal.FarskapsportalApplicationLocal; @@ -78,9 +79,11 @@ import no.nav.farskapsportal.exception.EsigneringConsumerException; import no.nav.farskapsportal.persistence.dao.FarskapserklaeringDao; import no.nav.farskapsportal.persistence.dao.ForelderDao; +import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao; import no.nav.farskapsportal.persistence.dao.StatusKontrollereFarDao; import no.nav.farskapsportal.persistence.entity.Dokument; import no.nav.farskapsportal.persistence.entity.Dokumentinnhold; +import no.nav.farskapsportal.persistence.entity.Oppgavebestilling; import no.nav.farskapsportal.persistence.entity.Signeringsinformasjon; import no.nav.farskapsportal.service.PersistenceService; import no.nav.farskapsportal.util.Mapper; @@ -141,6 +144,8 @@ public class FarskapsportalControllerTest { @Autowired private PersistenceService persistenceService; @Autowired + private OppgavebestillingDao oppgavebestillingDao; + @Autowired private FarskapserklaeringDao farskapserklaeringDao; @Autowired private ForelderDao forelderDao; @@ -257,6 +262,7 @@ private void brukeStandardMocksUtenPdlApi(String fnrPaaloggetBruker) { @AfterEach void ryddeTestdata() { + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); statusKontrollereFarDao.deleteAll(); forelderDao.deleteAll(); @@ -1417,6 +1423,7 @@ void skalLagreOppdatertPadesUrlVedOppdateringAvStatus() { // rydde testdata farskapserklaeringDao.deleteAll(); forelderDao.deleteAll(); + oppgavebestillingDao.deleteAll(); // given var oppdatertPades = lageUrl("/pades-opppdatert"); @@ -1428,12 +1435,15 @@ void skalLagreOppdatertPadesUrlVedOppdateringAvStatus() { .innhold("Jeg erklærer med dette farskap til barnet...".getBytes()).build()); farskapserklaeringDao.save(lagretFarskapserklaeringSignertAvMor); + var lagretOppgavebestilling = oppgavebestillingDao.save( + Oppgavebestilling.builder().farskapserklaering(lagretFarskapserklaeringSignertAvMor).eventId(UUID.randomUUID().toString()) + .opprettet(LocalDateTime.now()).build()); + var registrertNavnFar = FAR.getNavn(); var registrertNavnMor = MOR.getNavn(); when(oidcTokenSubjectExtractor.hentPaaloggetPerson()).thenReturn(FAR.getFoedselsnummer()); - doNothing().when(brukernotifikasjonConsumer).sletteFarsSigneringsoppgave(lagretFarskapserklaeringSignertAvMor.getId(), FAR.getFoedselsnummer()); - doNothing().when(brukernotifikasjonConsumer) - .informereForeldreOmTilgjengeligFarskapserklaering(FAR.getFoedselsnummer(), MOR.getFoedselsnummer()); + doNothing().when(brukernotifikasjonConsumer).sletteFarsSigneringsoppgave(lagretOppgavebestilling.getEventId(), mapper.toEntity(FAR)); + doNothing().when(brukernotifikasjonConsumer).informereForeldreOmTilgjengeligFarskapserklaering(mapper.toEntity(FAR), mapper.toEntity(MOR)); stsStub.runSecurityTokenServiceStub("jalla"); LinkedHashMap kjoennshistorikkFar = getKjoennshistorikk(KjoennType.MANN); @@ -1486,9 +1496,9 @@ void skalDeaktivereFarskapserklaeringDersomMorAvbryterSignering() { // rydde testdata farskapserklaeringDao.deleteAll(); forelderDao.deleteAll(); + oppgavebestillingDao.deleteAll(); // given - var oppdatertPades = lageUrl("/pades-opppdatert"); var bestillingAvNyFarskapserklaering = henteFarskapserklaeringDto(MOR, FAR, BARN_UTEN_FNR); var nyopprettetFarskapserklaering = farskapserklaeringDao.save(mapper.toEntity(bestillingAvNyFarskapserklaering)); nyopprettetFarskapserklaering.getDokument().setStatusUrl(lageUrl("/status").toString()); @@ -1546,6 +1556,7 @@ void skalDeaktivereFarskapserklaeringDersomFarAvbryterSignering() { // rydde testdata farskapserklaeringDao.deleteAll(); forelderDao.deleteAll(); + oppgavebestillingDao.deleteAll(); // given var bestillingAvNyFarskapserklaering = henteFarskapserklaeringDto(MOR, FAR, BARN_UTEN_FNR); @@ -1606,6 +1617,7 @@ void skalReturnereHttpStatusNotFoundDersomStatusQueryTokenErUkjent() { // rydde testdata farskapserklaeringDao.deleteAll(); forelderDao.deleteAll(); + oppgavebestillingDao.deleteAll(); // given var bestillingAvNyFarskapserklaering = henteFarskapserklaeringDto(MOR, FAR, BARN_UTEN_FNR); @@ -1653,6 +1665,7 @@ void skalReturnereHttpStatusInternalServerErrorDersomXadeslenkeManglerEtterSigne // rydde testdata farskapserklaeringDao.deleteAll(); forelderDao.deleteAll(); + oppgavebestillingDao.deleteAll(); // given var farskapserklaeringSignertAvMor = henteFarskapserklaeringDto(MOR, FAR, BARN_UTEN_FNR); @@ -1663,12 +1676,16 @@ void skalReturnereHttpStatusInternalServerErrorDersomXadeslenkeManglerEtterSigne .innhold("Jeg erklærer med dette farskap til barnet...".getBytes()).build()); farskapserklaeringDao.save(lagretFarskapserklaeringSignertAvMor); + var lagretOppgavebestilling = oppgavebestillingDao.save( + Oppgavebestilling.builder().farskapserklaering(lagretFarskapserklaeringSignertAvMor).eventId(UUID.randomUUID().toString()) + .opprettet(LocalDateTime.now()).build()); + var registrertNavnFar = FAR.getNavn(); var registrertNavnMor = MOR.getNavn(); when(oidcTokenSubjectExtractor.hentPaaloggetPerson()).thenReturn(FAR.getFoedselsnummer()); - doNothing().when(brukernotifikasjonConsumer).sletteFarsSigneringsoppgave(lagretFarskapserklaeringSignertAvMor.getId(), FAR.getFoedselsnummer()); + doNothing().when(brukernotifikasjonConsumer).sletteFarsSigneringsoppgave(lagretOppgavebestilling.getEventId(), mapper.toEntity(FAR)); doNothing().when(brukernotifikasjonConsumer) - .informereForeldreOmTilgjengeligFarskapserklaering(FAR.getFoedselsnummer(), MOR.getFoedselsnummer()); + .informereForeldreOmTilgjengeligFarskapserklaering(mapper.toEntity(FAR), mapper.toEntity(MOR)); stsStub.runSecurityTokenServiceStub("jalla"); LinkedHashMap kjoennshistorikkFar = getKjoennshistorikk(KjoennType.MANN); diff --git a/src/test/java/no/nav/farskapsportal/scheduled/SletteOppgaveTest.java b/src/test/java/no/nav/farskapsportal/scheduled/SletteOppgaveTest.java index 5f87ca94d..f4c432432 100644 --- a/src/test/java/no/nav/farskapsportal/scheduled/SletteOppgaveTest.java +++ b/src/test/java/no/nav/farskapsportal/scheduled/SletteOppgaveTest.java @@ -9,7 +9,9 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -17,7 +19,8 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.UUID; import no.nav.brukernotifikasjon.schemas.Beskjed; import no.nav.brukernotifikasjon.schemas.Done; import no.nav.brukernotifikasjon.schemas.Nokkel; @@ -29,17 +32,21 @@ import no.nav.farskapsportal.dto.ForelderDto; import no.nav.farskapsportal.exception.RessursIkkeFunnetException; import no.nav.farskapsportal.persistence.dao.FarskapserklaeringDao; +import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao; import no.nav.farskapsportal.persistence.entity.Dokumentinnhold; +import no.nav.farskapsportal.persistence.entity.Oppgavebestilling; import no.nav.farskapsportal.service.PersistenceService; import no.nav.farskapsportal.util.Mapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; +import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.kafka.KafkaException; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.test.context.ActiveProfiles; @@ -69,6 +76,9 @@ public class SletteOppgaveTest { @Autowired private FarskapserklaeringDao farskapserklaeringDao; + @Autowired + private OppgavebestillingDao oppgavebestillingDao; + @MockBean private KafkaTemplate beskjedkoe; @@ -77,9 +87,12 @@ public class SletteOppgaveTest { private SletteOppgave sletteOppgave; + @BeforeEach void setup() { + MockitoAnnotations.openMocks(this); //without this you will get NPE + // Bønnen sletteOppgave er kun tilgjengelig for live-profilen for å unngå skedulert trigging av metoden under test. sletteOppgave = SletteOppgave.builder() .persistenceService(persistenceService) @@ -92,7 +105,9 @@ void setup() { void skalSletteUtloeptOppgaveOgVarsleMorDersomFarIkkeSignererInnenFristen() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); + var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now()); @@ -103,7 +118,14 @@ void skalSletteUtloeptOppgaveOgVarsleMorDersomFarIkkeSignererInnenFristen() { // Setter signeringstidspunkt til utenfor levetiden til oppgaven farskapserklaering.getDokument().getSigneringsinformasjonMor().setSigneringstidspunkt( LocalDateTime.now().minusDays(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetOppgaveAntallDager())); - persistenceService.oppdatereFarskapserklaering(farskapserklaering); + var lagretFarskapserklaering = persistenceService.oppdatereFarskapserklaering(farskapserklaering); + + var lagretOppgavebestilling = oppgavebestillingDao.save(Oppgavebestilling.builder() + .eventId(UUID.randomUUID().toString()) + .forelder(lagretFarskapserklaering.getFar()) + .farskapserklaering(lagretFarskapserklaering) + .opprettet(LocalDateTime.now()) + .build()); var ferdignoekkelfanger = ArgumentCaptor.forClass(Nokkel.class); var ferdigfanger = ArgumentCaptor.forClass(Done.class); @@ -116,6 +138,7 @@ void skalSletteUtloeptOppgaveOgVarsleMorDersomFarIkkeSignererInnenFristen() { // then verify(ferdigkoe, times(1)) .send(eq(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicFerdig()), ferdignoekkelfanger.capture(), ferdigfanger.capture()); + verify(beskjedkoe, times(1)) .send(eq(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicBeskjed()), beskjednoekkelfanger.capture(), beskjedfanger.capture()); @@ -127,11 +150,13 @@ void skalSletteUtloeptOppgaveOgVarsleMorDersomFarIkkeSignererInnenFristen() { var beskjedMorSynligFremTilDato = Instant.ofEpochMilli(beskjed.getSynligFremTil()).atZone(ZoneId.systemDefault()).toLocalDate(); + var oppdatertOppgavebestilling = oppgavebestillingDao.findById(lagretOppgavebestilling.getId()); + assertAll( () -> assertThat(ferdignokkel.getSystembruker()).isEqualTo(farskapsportalEgenskaper.getSystembrukerBrukernavn()), () -> assertThat(ferdig.getGrupperingsId()).isEqualTo(farskapsportalEgenskaper.getBrukernotifikasjon().getGrupperingsidFarskap()), () -> assertThat(ferdig.getFodselsnummer()).isEqualTo(FAR.getFoedselsnummer()), - () -> assertThat(ferdig.getTidspunkt()).isGreaterThan(Instant.now().minusSeconds(10).toEpochMilli()), + () -> assertThat(ferdig.getTidspunkt()).isGreaterThan(ZonedDateTime.now(ZoneId.of("UTC")).minusMinutes(5).toEpochSecond()), () -> assertThat(beskjednoekkel.getSystembruker()).isEqualTo(farskapsportalEgenskaper.getSystembrukerBrukernavn()), () -> assertThat(beskjed.getGrupperingsId()).isEqualTo(farskapsportalEgenskaper.getBrukernotifikasjon().getGrupperingsidFarskap()), () -> assertThat(beskjed.getLink()).isEqualTo(farskapsportalEgenskaper.getUrl()), @@ -140,7 +165,8 @@ void skalSletteUtloeptOppgaveOgVarsleMorDersomFarIkkeSignererInnenFristen() { () -> assertThat(beskjed.getTekst()).isEqualTo(MELDING_OM_IKKE_UTFOERT_SIGNERINGSOPPGAVE), () -> assertThat(beskjed.getEksternVarsling()).isTrue(), () -> assertThat(beskjedMorSynligFremTilDato) - .isEqualTo(LocalDate.now().plusMonths(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetBeskjedAntallMaaneder())) + .isEqualTo(LocalDate.now().plusMonths(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetBeskjedAntallMaaneder())), + () -> assertThat(oppdatertOppgavebestilling.get().getFerdigstilt()).isNotNull() ); var ressursIkkeFunnetException = assertThrows(RessursIkkeFunnetException.class, @@ -161,7 +187,9 @@ void skalSletteUtloeptOppgaveOgVarsleMorDersomFarIkkeSignererInnenFristen() { void skalIkkeSletteOppgaveSomIkkeErUtloept() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); + var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now()); @@ -169,7 +197,14 @@ void skalIkkeSletteOppgaveSomIkkeErUtloept() { farskapserklaering.getDokument() .setDokumentinnhold(Dokumentinnhold.builder().innhold("Jeg erklærer med dette farskap til barnet..".getBytes()).build()); - // Setter signeringstidspunkt til innenfor levetiden til oppgaven + var lagretOppgavebestilling = oppgavebestillingDao.save(Oppgavebestilling.builder() + .eventId(UUID.randomUUID().toString()) + .forelder(farskapserklaering.getFar()) + .farskapserklaering(farskapserklaering) + .opprettet(LocalDateTime.now()) + .build()); + + // Setter signeringstidspunkt til utenfor levetiden til oppgaven farskapserklaering.getDokument().getSigneringsinformasjonMor().setSigneringstidspunkt( LocalDateTime.now().minusDays(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetOppgaveAntallDager() - 5)); persistenceService.oppdatereFarskapserklaering(farskapserklaering); @@ -179,7 +214,47 @@ void skalIkkeSletteOppgaveSomIkkeErUtloept() { // then verify(ferdigkoe, times(0)) - .send(eq(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicFerdig()), any(), any()); + .send(eq(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicFerdig()), any(Nokkel.class), any(Done.class)); + + var oppgavebestillingEtterSlettforsoek = oppgavebestillingDao.findById(lagretOppgavebestilling.getId()); + + assertThat(oppgavebestillingEtterSlettforsoek.get().getFerdigstilt()).isNull(); } + + @Test + void skalIkkeOppdatereOppgavebestillingDersomFerdigkallFeiler() { + + // given + oppgavebestillingDao.deleteAll(); + farskapserklaeringDao.deleteAll(); + + var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); + farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now()); + + var farskapserklaering = persistenceService.lagreNyFarskapserklaering(mapper.toEntity(farskapserklaeringSomVenterPaaFarsSignatur)); + farskapserklaering.getDokument() + .setDokumentinnhold(Dokumentinnhold.builder().innhold("Jeg erklærer med dette farskap til barnet..".getBytes()).build()); + + var lagretOppgavebestilling = oppgavebestillingDao.save(Oppgavebestilling.builder() + .eventId(UUID.randomUUID().toString()) + .forelder(farskapserklaering.getFar()) + .farskapserklaering(farskapserklaering) + .opprettet(LocalDateTime.now()) + .build()); + + // Setter signeringstidspunkt til innenfor levetiden til oppgaven + farskapserklaering.getDokument().getSigneringsinformasjonMor().setSigneringstidspunkt( + LocalDateTime.now().minusDays(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetOppgaveAntallDager() + 5)); + persistenceService.oppdatereFarskapserklaering(farskapserklaering); + + doThrow(KafkaException.class).when(ferdigkoe).send(anyString(), any(Nokkel.class), any(Done.class)); + + // when + sletteOppgave.sletteUtloepteSigneringsoppgaver(); + + // then + var oppgavebestillingEtterSlettforsoek = oppgavebestillingDao.findById(lagretOppgavebestilling.getId()); + assertThat(oppgavebestillingEtterSlettforsoek.get().getFerdigstilt()).isNull(); + } } diff --git a/src/test/java/no/nav/farskapsportal/service/FarskapsportalServiceTest.java b/src/test/java/no/nav/farskapsportal/service/FarskapsportalServiceTest.java index a14b5a617..e04e4d80c 100644 --- a/src/test/java/no/nav/farskapsportal/service/FarskapsportalServiceTest.java +++ b/src/test/java/no/nav/farskapsportal/service/FarskapsportalServiceTest.java @@ -9,12 +9,9 @@ import static no.nav.farskapsportal.TestUtils.henteForelder; import static no.nav.farskapsportal.TestUtils.henteNyligFoedtBarn; import static no.nav.farskapsportal.TestUtils.lageUrl; -import static no.nav.farskapsportal.api.Feilkode.FEIL_ROLLE_FAR; -import static no.nav.farskapsportal.api.Feilkode.FORELDER_HAR_VERGE; import static no.nav.farskapsportal.api.Feilkode.IKKE_MYNDIG; import static no.nav.farskapsportal.api.Feilkode.MOR_IKKE_NORSK_BOSTEDSADRESSE; import static no.nav.farskapsportal.api.Feilkode.MOR_OG_FAR_SAMME_PERSON; -import static no.nav.farskapsportal.api.Feilkode.PERSON_ER_DOED; import static no.nav.farskapsportal.api.Feilkode.UGYLDIG_FAR; import static no.nav.farskapsportal.consumer.pdl.PdlApiConsumer.PDL_FOLKEREGISTERIDENTIFIKATOR_STATUS_I_BRUK; import static no.nav.farskapsportal.consumer.pdl.PdlApiConsumer.PDL_FOLKEREGISTERIDENTIFIKATOR_TYPE_FNR; @@ -28,7 +25,8 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; @@ -43,7 +41,9 @@ import java.time.format.DateTimeFormatter; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; +import java.util.UUID; import java.util.stream.Collectors; import lombok.SneakyThrows; import no.nav.farskapsportal.FarskapsportalApplicationLocal; @@ -75,9 +75,12 @@ import no.nav.farskapsportal.exception.ValideringException; import no.nav.farskapsportal.persistence.dao.FarskapserklaeringDao; import no.nav.farskapsportal.persistence.dao.ForelderDao; +import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao; import no.nav.farskapsportal.persistence.dao.StatusKontrollereFarDao; import no.nav.farskapsportal.persistence.entity.Dokument; import no.nav.farskapsportal.persistence.entity.Dokumentinnhold; +import no.nav.farskapsportal.persistence.entity.Forelder; +import no.nav.farskapsportal.persistence.entity.Oppgavebestilling; import no.nav.farskapsportal.persistence.entity.Signeringsinformasjon; import no.nav.farskapsportal.util.Mapper; import org.junit.jupiter.api.DisplayName; @@ -112,6 +115,8 @@ public class FarskapsportalServiceTest { @Autowired private PersistenceService persistenceService; @Autowired + private OppgavebestillingDao oppgavebestillingDao; + @Autowired private FarskapserklaeringDao farskapserklaeringDao; @Autowired private ForelderDao forelderDao; @@ -133,6 +138,7 @@ class HenteBrukerinformasjon { void morSkalSeSinePaabegynteOgFarsVentedeFarskapserklaeringerOgListeOverNyfoedteUtenFar() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var foedselsdatoSpedbarn = LocalDate.now().minusMonths(2).minusDays(21); @@ -179,6 +185,7 @@ void morSkalSeSinePaabegynteOgFarsVentedeFarskapserklaeringerOgListeOverNyfoedte void morSkalSeSinePaabegynteFarskapserklaeringer() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var farskapserklaeringSomManglerMorsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); @@ -219,6 +226,7 @@ void morSkalSeSinePaabegynteFarskapserklaeringer() { void morSkalSeFarskapserklaeringerSomVenterPaaFar() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now()); @@ -257,6 +265,7 @@ void morSkalSeFarskapserklaeringerSomVenterPaaFar() { void skalIkkeKasteValideringExceptionDersomMorErSeparert() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); @@ -292,6 +301,7 @@ void skalIkkeKasteValideringExceptionDersomMorErSeparert() { void skalKasteValideringExceptionDersomMorErGift() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); @@ -322,6 +332,7 @@ void skalKasteValideringExceptionDersomMorErGift() { void skalKasteValideringExceptionDersomMorHarUkjentSivilstand() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); @@ -355,6 +366,7 @@ void skalKasteValideringExceptionDersomMorHarUkjentSivilstand() { void skalKasteValideringExceptiondersomMorErRegistrertPartner() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); @@ -409,6 +421,7 @@ void skalKasteValideringExceptionDersomMorErBosattUtenforNorge() { void farSkalSeSineVentendeFarskapserklaeringer() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); farskapserklaeringSomVenterPaaFarsSignatur.getDokument().setSignertAvMor(LocalDateTime.now()); @@ -446,6 +459,7 @@ void farSkalSeSineVentendeFarskapserklaeringer() { void farSkalIkkeSeFarskapserklaeringerSomMorIkkeHarSignert() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var farskapserklaeringSomVenterPaaFarsSignatur = henteFarskapserklaeringDto(MOR, FAR, BARN); @@ -481,6 +495,7 @@ class OppretteFarskapserklaering { void skalOppretteFarskapserklaeringForBarnMedTermindato() { // rydde testdata + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); // given @@ -541,6 +556,7 @@ void skalOppretteFarskapserklaeringForBarnMedTermindato() { void skalOppretteFarskapserklaeringForNyligFoedtBarnFoedtINorge() { // rydde testdata + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); // given @@ -607,6 +623,7 @@ public Object answer(InvocationOnMock invocation) { void skalKasteValideringExceptionDersomBarnErFoedtIUtlandet() { // rydde testdata + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); // given @@ -666,6 +683,7 @@ public Object answer(InvocationOnMock invocation) { void morSkalKunneOppretteFarskapserklaeringForNyfoedtSelvOmHunHarEnAapenErklaeringForUfoedt() { // rydde testdata + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); // given @@ -739,6 +757,7 @@ public Object answer(InvocationOnMock invocation) { void morSkalIkkeKunneOppretteFarskapserklaeringForUfoedtBarnDersomHunHarEnPaagaaendeFarskapserklaering() { // rydde testdata + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); // given @@ -775,6 +794,7 @@ void morSkalIkkeKunneOppretteFarskapserklaeringForUfoedtBarnDersomHunHarEnPaagaa void skalKasteValideringExceptionDersomMorHarAapenErklaeringMedAnnenFarForNyfoedteBarn() { // rydde testdata + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); // given @@ -874,6 +894,7 @@ void skalKasteIllegalArgumentExceptionDersomMorOgFarErSammePerson() { void skalKasteValideringExceptionDersomTermindatoErUgyldig() { // rydde testdata + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); //given @@ -913,6 +934,7 @@ void skalKasteValideringExceptionDersomTermindatoErUgyldig() { void skalKasteManglerRelasjonExceptionDersomBarnOppgittMedFoedselsnummerManglerRelasjonTilMor() { // rydde testdata + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); // given @@ -976,6 +998,7 @@ void skalKasteManglerRelasjonExceptionDersomBarnOppgittMedFoedselsnummerManglerR void skalKasteValideringExceptionDersomMorOppgirBarnMedFoedselsnummerMenHarIngenNyfoedteBarnUtenFarKnyttetTilSeg() { // rydde testdata + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); // given @@ -1079,8 +1102,10 @@ class OppdatereStatusSigneringsjobb { void skalOppdatereSigneringsinformasjonForMorEtterRedirectDersomStatusQueryTokenErGyldig() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); + var unikEventid = UUID.randomUUID().toString(); var statuslenke = lageUrl("/status"); var farskapserklaering = henteFarskapserklaeringDto(MOR, FAR, BARN); var padesMor = lageUrl("/padesMor"); @@ -1102,9 +1127,8 @@ void skalOppdatereSigneringsinformasjonForMorEtterRedirectDersomStatusQueryToken when(personopplysningService.henteFoedselsdato(FAR.getFoedselsnummer())).thenReturn(FOEDSELSDATO_FAR); when(personopplysningService.henteNavn(FAR.getFoedselsnummer())).thenReturn(FAR.getNavn()); - doNothing().when(brukernotifikasjonConsumer).sletteFarsSigneringsoppgave(lagretFarskapserklaering.getId(), FAR.getFoedselsnummer()); doNothing().when(brukernotifikasjonConsumer) - .informereForeldreOmTilgjengeligFarskapserklaering(MOR.getFoedselsnummer(), FAR.getFoedselsnummer()); + .informereForeldreOmTilgjengeligFarskapserklaering(mapper.modelMapper(MOR, Forelder.class), mapper.modelMapper(FAR, Forelder.class)); when(difiESignaturConsumer.henteStatus(any(), any())).thenReturn( DokumentStatusDto.builder() @@ -1125,9 +1149,10 @@ void skalOppdatereSigneringsinformasjonForMorEtterRedirectDersomStatusQueryToken // when farskapsportalService.oppdatereStatusSigneringsjobb(MOR.getFoedselsnummer(), "etGyldigStatusQueryToken"); + // then + verify(brukernotifikasjonConsumer, times(1)).oppretteOppgaveTilFarOmSignering(anyInt(), any(Forelder.class)); var oppdatertFarskapserklaering = farskapserklaeringDao.findById(lagretFarskapserklaering.getId()); - // then assertAll( () -> assertThat(oppdatertFarskapserklaering).isPresent(), () -> assertNotNull(oppdatertFarskapserklaering.get().getDokument().getSigneringsinformasjonMor().getSigneringstidspunkt()), @@ -1143,6 +1168,7 @@ void skalOppdatereSigneringsinformasjonForFarEtterRedirectDersomStatusQueryToken // given farskapserklaeringDao.deleteAll(); + var unikEventid = UUID.randomUUID().toString(); var statuslenke = lageUrl("/status"); var farskapserklaering = henteFarskapserklaeringDto(MOR, FAR, BARN); var padesFar = lageUrl("/padesFar"); @@ -1165,9 +1191,9 @@ void skalOppdatereSigneringsinformasjonForFarEtterRedirectDersomStatusQueryToken when(personopplysningService.henteFoedselsdato(MOR.getFoedselsnummer())).thenReturn(MOR.getFoedselsdato()); when(personopplysningService.harNorskBostedsadresse(MOR.getFoedselsnummer())).thenReturn(true); - doNothing().when(brukernotifikasjonConsumer).sletteFarsSigneringsoppgave(lagretFarskapserklaering.getId(), FAR.getFoedselsnummer()); + doNothing().when(brukernotifikasjonConsumer).sletteFarsSigneringsoppgave(unikEventid, mapper.toEntity(FAR)); doNothing().when(brukernotifikasjonConsumer) - .informereForeldreOmTilgjengeligFarskapserklaering(MOR.getFoedselsnummer(), FAR.getFoedselsnummer()); + .informereForeldreOmTilgjengeligFarskapserklaering(mapper.modelMapper(MOR, Forelder.class), mapper.modelMapper(FAR, Forelder.class)); when(difiESignaturConsumer.henteStatus(any(), any())).thenReturn( DokumentStatusDto.builder() @@ -1206,6 +1232,7 @@ void skalOppdatereSigneringsjobbDersomMorHarAktivOgDeaktivertFarskapserklaering( // given farskapserklaeringDao.deleteAll(); + var unikEventid = UUID.randomUUID().toString(); var statuslenke = lageUrl("/status"); var farskapserklaering = henteFarskapserklaeringDto(MOR, FAR, BARN); var padesMor = lageUrl("/padesMor"); @@ -1232,9 +1259,9 @@ void skalOppdatereSigneringsjobbDersomMorHarAktivOgDeaktivertFarskapserklaering( when(personopplysningService.henteFoedselsdato(FAR.getFoedselsnummer())).thenReturn(FOEDSELSDATO_FAR); when(personopplysningService.henteNavn(FAR.getFoedselsnummer())).thenReturn(FAR.getNavn()); - doNothing().when(brukernotifikasjonConsumer).sletteFarsSigneringsoppgave(lagretAktivFarskapserklaering.getId(), FAR.getFoedselsnummer()); + doNothing().when(brukernotifikasjonConsumer).sletteFarsSigneringsoppgave(unikEventid, mapper.toEntity(FAR)); doNothing().when(brukernotifikasjonConsumer) - .informereForeldreOmTilgjengeligFarskapserklaering(MOR.getFoedselsnummer(), FAR.getFoedselsnummer()); + .informereForeldreOmTilgjengeligFarskapserklaering(mapper.modelMapper(MOR, Forelder.class), mapper.modelMapper(FAR, Forelder.class)); when(difiESignaturConsumer.henteStatus(any(), any())).thenReturn( DokumentStatusDto.builder() @@ -1286,6 +1313,10 @@ void skalSletteSigneringsoppgaveNaarFarSignerer() { lagretFarskapserklaering.getDokument().setStatusUrl(statuslenke.toString()); farskapserklaeringDao.save(lagretFarskapserklaering); + var lagretOppgavebestilling = oppgavebestillingDao.save( + Oppgavebestilling.builder().farskapserklaering(lagretFarskapserklaering).forelder(lagretFarskapserklaering.getFar()) + .eventId(UUID.randomUUID().toString()).opprettet(LocalDateTime.now()).build()); + when(personopplysningService.henteFoedselsdato(FAR.getFoedselsnummer())).thenReturn(FOEDSELSDATO_FAR); when(personopplysningService.henteNavn(FAR.getFoedselsnummer())).thenReturn(FAR.getNavn()); when(personopplysningService.bestemmeForelderrolle(FAR.getFoedselsnummer())).thenReturn(Forelderrolle.FAR); @@ -1295,9 +1326,9 @@ void skalSletteSigneringsoppgaveNaarFarSignerer() { when(personopplysningService.henteFoedselsdato(MOR.getFoedselsnummer())).thenReturn(MOR.getFoedselsdato()); when(personopplysningService.harNorskBostedsadresse(MOR.getFoedselsnummer())).thenReturn(true); - doNothing().when(brukernotifikasjonConsumer).sletteFarsSigneringsoppgave(lagretFarskapserklaering.getId(), FAR.getFoedselsnummer()); + doNothing().when(brukernotifikasjonConsumer).sletteFarsSigneringsoppgave(lagretOppgavebestilling.getEventId(), mapper.toEntity(FAR)); doNothing().when(brukernotifikasjonConsumer) - .informereForeldreOmTilgjengeligFarskapserklaering(MOR.getFoedselsnummer(), FAR.getFoedselsnummer()); + .informereForeldreOmTilgjengeligFarskapserklaering(mapper.modelMapper(MOR, Forelder.class), mapper.modelMapper(FAR, Forelder.class)); when(difiESignaturConsumer.henteStatus(any(), any())).thenReturn( DokumentStatusDto.builder() @@ -1321,7 +1352,7 @@ void skalSletteSigneringsoppgaveNaarFarSignerer() { var oppdatertFarskapserklaering = farskapserklaeringDao.findById(lagretFarskapserklaering.getId()); // then - verify(brukernotifikasjonConsumer, times(1)).sletteFarsSigneringsoppgave(lagretFarskapserklaering.getId(), FAR.getFoedselsnummer()); + verify(brukernotifikasjonConsumer, times(1)).sletteFarsSigneringsoppgave(lagretOppgavebestilling.getEventId(), mapper.toEntity(FAR)); assertAll( () -> assertThat(oppdatertFarskapserklaering).isPresent(), @@ -1336,6 +1367,7 @@ void skalSletteSigneringsoppgaveNaarFarSignerer() { void skalSletteSigneringsoppgaveDersomFarAvbryterSignering() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var statuslenke = lageUrl("/status"); @@ -1349,7 +1381,76 @@ void skalSletteSigneringsoppgaveDersomFarAvbryterSignering() { var lagretFarskapserklaering = persistenceService.lagreNyFarskapserklaering(mapper.toEntity(farskapserklaering)); lagretFarskapserklaering.getDokument().setStatusUrl(statuslenke.toString()); + farskapserklaeringDao.save(lagretFarskapserklaering); + + var lagretOppgavebestilling = oppgavebestillingDao.save( + Oppgavebestilling.builder().eventId(UUID.randomUUID().toString()).forelder(lagretFarskapserklaering.getFar()) + .farskapserklaering(lagretFarskapserklaering).opprettet(LocalDateTime.now()).build()); + + when(personopplysningService.henteFoedselsdato(FAR.getFoedselsnummer())).thenReturn(FOEDSELSDATO_FAR); + when(personopplysningService.henteNavn(FAR.getFoedselsnummer())).thenReturn(FAR.getNavn()); + when(personopplysningService.bestemmeForelderrolle(FAR.getFoedselsnummer())).thenReturn(Forelderrolle.FAR); + when(personopplysningService.henteGjeldendeKjoenn(FAR.getFoedselsnummer())).thenReturn(KjoennDto.builder().kjoenn(KjoennType.MANN).build()); + + when(personopplysningService.henteNavn(MOR.getFoedselsnummer())).thenReturn(MOR.getNavn()); + when(personopplysningService.henteFoedselsdato(MOR.getFoedselsnummer())).thenReturn(MOR.getFoedselsdato()); + when(personopplysningService.harNorskBostedsadresse(MOR.getFoedselsnummer())).thenReturn(true); + + doNothing().when(brukernotifikasjonConsumer) + .informereForeldreOmTilgjengeligFarskapserklaering(mapper.modelMapper(MOR, Forelder.class), mapper.modelMapper(FAR, Forelder.class)); + + when(difiESignaturConsumer.henteStatus(any(), any())).thenReturn( + DokumentStatusDto.builder() + .bekreftelseslenke(lageUrl("/confirmation")) + .statuslenke(statuslenke) + .statusSignering(StatusSignering.FEILET) + .padeslenke(padesFar).signaturer(List.of( + SignaturDto.builder() + .signatureier(FAR.getFoedselsnummer()) + .harSignert(false) + .tidspunktForStatus(ZonedDateTime.now().minusSeconds(3)) + .xadeslenke(null) + .build())).build()); + + when(difiESignaturConsumer.henteSignertDokument(any())).thenReturn(farskapserklaeringDokumentinnhold); + when(difiESignaturConsumer.henteXadesXml(any())).thenReturn(xadesXml); + // when + var esigneringStatusFeiletException = assertThrows(EsigneringStatusFeiletException.class, + () -> farskapsportalService.oppdatereStatusSigneringsjobb(FAR.getFoedselsnummer(), "etGyldigStatusQueryToken")); + + var oppdatertFarskapserklaering = farskapserklaeringDao.findById(lagretFarskapserklaering.getId()); + + // then + verify(brukernotifikasjonConsumer, times(1)).sletteFarsSigneringsoppgave(lagretOppgavebestilling.getEventId(), mapper.toEntity(FAR)); + + assertAll( + () -> assertThat(oppdatertFarskapserklaering).isPresent(), + () -> assertThat(oppdatertFarskapserklaering.get().getDokument().getSigneringsinformasjonFar().getStatusSignering()).isEqualTo("FEILET"), + () -> assertThat(oppdatertFarskapserklaering.get().getDokument().getSigneringsinformasjonFar().getSigneringstidspunkt()).isNull(), + () -> assertThat(oppdatertFarskapserklaering.get().getDeaktivert()).isNotNull(), + () -> assertThat(esigneringStatusFeiletException.getFeilkode()).isEqualTo(Feilkode.ESIGNERING_STATUS_FEILET) + ); + } + + @Test + void skalIkkeBestilleFerdigstillingAvOppgaveDersomFarIkkeHarAktiveOppgaver() { + + // given + oppgavebestillingDao.deleteAll(); + farskapserklaeringDao.deleteAll(); + + var statuslenke = lageUrl("/status"); + var farskapserklaering = henteFarskapserklaeringDto(MOR, FAR, BARN); + var padesFar = lageUrl("/padesFar"); + farskapserklaering.getDokument().setSignertAvMor(LocalDateTime.now().minusMinutes(3)); + var farskapserklaeringDokumentinnhold = "Jeg erklærer herved farskap til dette barnet".getBytes(StandardCharsets.UTF_8); + var xadesXml = "12345678912".getBytes(StandardCharsets.UTF_8); + + assertNull(farskapserklaering.getDokument().getSignertAvFar()); + + var lagretFarskapserklaering = persistenceService.lagreNyFarskapserklaering(mapper.toEntity(farskapserklaering)); + lagretFarskapserklaering.getDokument().setStatusUrl(statuslenke.toString()); farskapserklaeringDao.save(lagretFarskapserklaering); when(personopplysningService.henteFoedselsdato(FAR.getFoedselsnummer())).thenReturn(FOEDSELSDATO_FAR); @@ -1362,7 +1463,7 @@ void skalSletteSigneringsoppgaveDersomFarAvbryterSignering() { when(personopplysningService.harNorskBostedsadresse(MOR.getFoedselsnummer())).thenReturn(true); doNothing().when(brukernotifikasjonConsumer) - .informereForeldreOmTilgjengeligFarskapserklaering(MOR.getFoedselsnummer(), FAR.getFoedselsnummer()); + .informereForeldreOmTilgjengeligFarskapserklaering(mapper.modelMapper(MOR, Forelder.class), mapper.modelMapper(FAR, Forelder.class)); when(difiESignaturConsumer.henteStatus(any(), any())).thenReturn( DokumentStatusDto.builder() @@ -1387,7 +1488,7 @@ void skalSletteSigneringsoppgaveDersomFarAvbryterSignering() { var oppdatertFarskapserklaering = farskapserklaeringDao.findById(lagretFarskapserklaering.getId()); // then - verify(brukernotifikasjonConsumer, times(1)).sletteFarsSigneringsoppgave(lagretFarskapserklaering.getId(), FAR.getFoedselsnummer()); + verify(brukernotifikasjonConsumer, times(0)).sletteFarsSigneringsoppgave(anyString(), any(Forelder.class)); assertAll( () -> assertThat(oppdatertFarskapserklaering).isPresent(), @@ -1402,6 +1503,7 @@ void skalSletteSigneringsoppgaveDersomFarAvbryterSignering() { void dersomMorAvbryterSigneringSkalAktuellFarskapserklaeringDeaktiveres() { // given + oppgavebestillingDao.deleteAll(); farskapserklaeringDao.deleteAll(); var statuslenke = lageUrl("/status"); @@ -1438,7 +1540,7 @@ void dersomMorAvbryterSigneringSkalAktuellFarskapserklaeringDeaktiveres() { () -> farskapsportalService.oppdatereStatusSigneringsjobb(MOR.getFoedselsnummer(), "etGyldigStatusQueryToken")); // then - verify(brukernotifikasjonConsumer, times(0)).varsleOmAvbruttSignering(eq(MOR.getFoedselsnummer()), eq(FAR.getFoedselsnummer())); + verify(brukernotifikasjonConsumer, times(0)).varsleOmAvbruttSignering(any(Forelder.class), any(Forelder.class)); assertThat(esigneringStatusFeiletException.getFarskapserklaering().isPresent()); var farskapserklaeringReturnertFraException = esigneringStatusFeiletException.getFarskapserklaering().get(); @@ -1496,7 +1598,7 @@ void dersomFarAvbryterSigneringSkalAktuellFarskapserklaeringDeaktiveres() { () -> farskapsportalService.oppdatereStatusSigneringsjobb(FAR.getFoedselsnummer(), "etGyldigStatusQueryToken")); // then - verify(brukernotifikasjonConsumer, times(1)).varsleOmAvbruttSignering(eq(MOR.getFoedselsnummer()), eq(FAR.getFoedselsnummer())); + verify(brukernotifikasjonConsumer, times(1)).varsleOmAvbruttSignering(any(Forelder.class), any(Forelder.class)); assertAll( () -> assertThat(esigneringStatusFeiletException.getFarskapserklaering().isPresent())