Skip to content

Commit

Permalink
Merge branch 'master' into inntektsmelding-til-innsyn
Browse files Browse the repository at this point in the history
  • Loading branch information
johannbm authored Oct 22, 2024
2 parents 30e4b67 + 4c26fb4 commit 2ca3bab
Show file tree
Hide file tree
Showing 7 changed files with 190 additions and 99 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,47 +2,37 @@

import static no.nav.vedtak.log.metrics.MetricsUtil.REGISTRY;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicLong;

import jakarta.enterprise.context.ApplicationScoped;

import io.micrometer.core.instrument.Tag;
import no.nav.foreldrepenger.datavarehus.metrikker.BehandlingStatistikkRepository.BehandlingStatistikk.Type;

@ApplicationScoped
public class BehandlingMetrikker {

private static final String BEHANDLING_METRIKK_NAVN = "fp.behandlinger.antall";
private static final Map<Type, AtomicLong> BEHANDLING_GAUGES = new HashMap<>();
private static final Map<BehandlingStatistikkRepository.Behandlingsårsak, AtomicLong> BEHANDLING_GAUGES = new HashMap<>();

BehandlingMetrikker() {
// CDI
}

static List<Tag> tilTags(Type type) {
var tags = new ArrayList<Tag>();
if (type.ytelseType() != null) {
tags.add(Tag.of("ytelse_type", type.ytelseType().getNavn()));
}
if (type.behandlingType() != null) {
tags.add(Tag.of("behandling_type", type.behandlingType().getNavn()));
}
if (type.behandlingsårsak() != null) {
tags.add(Tag.of("behandling_aarsak_type", type.behandlingsårsak().name()));
public static void setAntall(BehandlingStatistikkRepository.Behandlingsårsak behandlingsårsak, Long antall) {
if (BEHANDLING_GAUGES.containsKey(behandlingsårsak)) {
BEHANDLING_GAUGES.get(behandlingsårsak).set(antall);
} else {
var gaugeValue = REGISTRY.gauge(BEHANDLING_METRIKK_NAVN, tilTags(behandlingsårsak), new AtomicLong(antall));
BEHANDLING_GAUGES.put(behandlingsårsak, gaugeValue);
}
return tags;
}

public void setAntall(Type type, Long antall) {
if (BEHANDLING_GAUGES.containsKey(type)) {
BEHANDLING_GAUGES.get(type).set(antall);
} else {
var gaugeValue = REGISTRY.gauge(BEHANDLING_METRIKK_NAVN, tilTags(type), new AtomicLong(antall));
BEHANDLING_GAUGES.put(type, gaugeValue);
}
static List<Tag> tilTags(BehandlingStatistikkRepository.Behandlingsårsak behandlingsårsak) {
return Optional.ofNullable(behandlingsårsak)
.map(ba -> List.of(Tag.of("behandling_aarsak_type", behandlingsårsak.name())))
.orElseGet(List::of);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@

import org.hibernate.jpa.HibernateHints;

import no.nav.foreldrepenger.behandlingslager.behandling.BehandlingType;
import no.nav.foreldrepenger.behandlingslager.behandling.BehandlingÅrsakType;
import no.nav.foreldrepenger.behandlingslager.fagsak.FagsakYtelseType;

@ApplicationScoped
public class BehandlingStatistikkRepository {
Expand All @@ -29,41 +27,33 @@ public BehandlingStatistikkRepository(EntityManager entityManager) {
this.entityManager = entityManager;
}

public List<BehandlingStatistikk> hentAntallBehandlinger() {
public List<BehandlingStatistikk> hentAntallBehandlingsårsaker() {
var query = entityManager.createQuery("""
select f.ytelseType, b.behandlingType, ba.behandlingÅrsakType, count(1) as antall from Fagsak f
join Behandling b on b.fagsak.id = f.id
left outer join BehandlingÅrsak ba on ba.behandling.id = b.id
group by f.ytelseType, b.behandlingType, ba.behandlingÅrsakType
""", BehandlingStatistikkEntitet.class)
select ba.behandlingÅrsakType, count(1) as antall
from BehandlingÅrsak ba
group by ba.behandlingÅrsakType
""", BehandlingÅrsakQR.class)
.setHint(HibernateHints.HINT_READ_ONLY, "true");
var behandlingStatistikkEntitet = query.getResultList();
return mapTilBehandlingStatistikk(behandlingStatistikkEntitet);
}

static List<BehandlingStatistikk> mapTilBehandlingStatistikk(List<BehandlingStatistikkEntitet> behandlingStatistikkEntitet) {
static List<BehandlingStatistikk> mapTilBehandlingStatistikk(List<BehandlingÅrsakQR> behandlingStatistikkEntitet) {
return behandlingStatistikkEntitet.stream()
.map(BehandlingStatistikkRepository::tilBehandlingStatistikk)
.collect(
groupingBy(bs -> bs.type().ytelseType,
groupingBy(bs -> Optional.ofNullable(bs.type().behandlingType()).orElse(BehandlingType.UDEFINERT),
groupingBy(bs -> Optional.ofNullable(bs.type().behandlingsårsak()).orElse(Behandlingsårsak.ANNET),
summarizingLong(bs -> Optional.ofNullable(bs.antall()).orElse(0L)))))
)
.collect(groupingBy(bs -> Optional.ofNullable(bs.behandlingsårsak()).orElse(Behandlingsårsak.ANNET),
summarizingLong(bs -> Optional.ofNullable(bs.antall()).orElse(0L))))
.entrySet()
.stream()
.flatMap(ytelseTypeEntry -> ytelseTypeEntry.getValue().entrySet().stream()
.flatMap(behandlingTypeEntry -> behandlingTypeEntry.getValue().entrySet().stream()
.map(behandlingårsakEntry ->
new BehandlingStatistikk(new BehandlingStatistikk.Type(ytelseTypeEntry.getKey(), behandlingTypeEntry.getKey(), behandlingårsakEntry.getKey()), behandlingårsakEntry.getValue().getSum()))))
.map(behandlingårsakEntry -> new BehandlingStatistikk(behandlingårsakEntry.getKey(), behandlingårsakEntry.getValue().getSum()))
.toList();
}

private static BehandlingStatistikk tilBehandlingStatistikk(BehandlingStatistikkEntitet entitet) {
return new BehandlingStatistikk(new BehandlingStatistikk.Type(entitet.ytelseType(), entitet.behandlingType(), tilBehandlingÅrsak(entitet.behandlingType(), entitet.behandlingArsakType())), entitet.antall());
private static BehandlingStatistikk tilBehandlingStatistikk(BehandlingÅrsakQR entitet) {
return new BehandlingStatistikk(tilBehandlingÅrsak(entitet.behandlingArsakType()), entitet.antall());
}

private static Behandlingsårsak tilBehandlingÅrsak(BehandlingType behandlingType, BehandlingÅrsakType behandlingÅrsakType) {
private static Behandlingsårsak tilBehandlingÅrsak(BehandlingÅrsakType behandlingÅrsakType) {
return switch (behandlingÅrsakType) {
case RE_FEIL_I_LOVANDVENDELSE,
RE_FEIL_REGELVERKSFORSTÅELSE,
Expand Down Expand Up @@ -95,35 +85,17 @@ private static BehandlingStatistikk tilBehandlingStatistikk(BehandlingStatistikk
RE_HENDELSE_UTFLYTTING -> Behandlingsårsak.FOLKEREGISTER;
case RE_VEDTAK_PLEIEPENGER -> Behandlingsårsak.PLEIEPENGER;
case OPPHØR_YTELSE_NYTT_BARN -> Behandlingsårsak.NESTESAK;
case UDEFINERT -> switch (behandlingType) {
case FØRSTEGANGSSØKNAD -> Behandlingsårsak.SØKNAD;
case KLAGE, ANKE -> Behandlingsårsak.KLAGE_ANKE;
case null, default -> Behandlingsårsak.ANNET;
};
case null -> switch (behandlingType) {
case FØRSTEGANGSSØKNAD -> Behandlingsårsak.SØKNAD;
case KLAGE, ANKE -> Behandlingsårsak.KLAGE_ANKE;
case null, default -> Behandlingsårsak.ANNET;
};
case null -> Behandlingsårsak.ANNET;
default -> Behandlingsårsak.ANNET;
};
}

record BehandlingStatistikkEntitet(FagsakYtelseType ytelseType,
BehandlingType behandlingType,
BehandlingÅrsakType behandlingArsakType,
Long antall) {
}
record BehandlingÅrsakQR(BehandlingÅrsakType behandlingArsakType, Long antall) { }


record BehandlingStatistikk(Type type, Long antall) {
record Type(FagsakYtelseType ytelseType,
BehandlingType behandlingType,
Behandlingsårsak behandlingsårsak) {
}
}
public record BehandlingStatistikk(Behandlingsårsak behandlingsårsak, Long antall) { }

enum Behandlingsårsak {
public enum Behandlingsårsak {
SØKNAD,
KLAGE_ANKE,
INNTEKTSMELDING,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package no.nav.foreldrepenger.datavarehus.metrikker;

import static no.nav.vedtak.log.metrics.MetricsUtil.REGISTRY;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicLong;

import io.micrometer.core.instrument.Tag;

public class DokumentMetrikker {

private static final String DOKUMENT_METRIKK_NAVN = "fp.dokument.antall";
private static final Map<DokumentStatistikkRepository.Dokumenttype, AtomicLong> DOKUMENT_GAUGES = new HashMap<>();

DokumentMetrikker() {
// CDI
}

public static void setAntall(DokumentStatistikkRepository.Dokumenttype dokumenttype, Long antall) {
if (DOKUMENT_GAUGES.containsKey(dokumenttype)) {
DOKUMENT_GAUGES.get(dokumenttype).set(antall);
} else {
var gaugeValue = REGISTRY.gauge(DOKUMENT_METRIKK_NAVN, tilTags(dokumenttype), new AtomicLong(antall));
DOKUMENT_GAUGES.put(dokumenttype, gaugeValue);
}
}

static List<Tag> tilTags(DokumentStatistikkRepository.Dokumenttype dokumenttype) {
return Optional.ofNullable(dokumenttype)
.map(dok -> List.of(Tag.of("dokument_type", dok.name())))
.orElseGet(List::of);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package no.nav.foreldrepenger.datavarehus.metrikker;

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summarizingLong;

import java.util.List;
import java.util.Optional;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.persistence.EntityManager;

import org.hibernate.jpa.HibernateHints;

import no.nav.foreldrepenger.behandlingslager.behandling.DokumentTypeId;

@ApplicationScoped
public class DokumentStatistikkRepository {
private EntityManager entityManager;

DokumentStatistikkRepository() {
// for CDI proxy
}

@Inject
public DokumentStatistikkRepository(EntityManager entityManager) {
this.entityManager = entityManager;
}

public List<DokumentStatistikk> hentAntallDokumenttyper() {
var query = entityManager.createQuery("""
select md.dokumentTypeId, count(1) as antall
from MottattDokument md
group by md.dokumentTypeId
""", DokumentTypeQR.class)
.setHint(HibernateHints.HINT_READ_ONLY, "true");
var behandlingStatistikkEntitet = query.getResultList();
return mapTilBehandlingStatistikk(behandlingStatistikkEntitet);
}

static List<DokumentStatistikk> mapTilBehandlingStatistikk(List<DokumentTypeQR> behandlingStatistikkEntitet) {
return behandlingStatistikkEntitet.stream()
.map(DokumentStatistikkRepository::tilBehandlingStatistikk)
.collect(groupingBy(bs -> Optional.ofNullable(bs.dokumenttype()).orElse(Dokumenttype.ANNET),
summarizingLong(bs -> Optional.ofNullable(bs.antall()).orElse(0L))))
.entrySet()
.stream()
.map(dokumentTypeEntry -> new DokumentStatistikk(dokumentTypeEntry.getKey(), dokumentTypeEntry.getValue().getSum()))
.toList();
}

private static DokumentStatistikk tilBehandlingStatistikk(DokumentTypeQR entitet) {
return new DokumentStatistikk(tilDokumenttype(entitet.dokumentTypeId()), entitet.antall());
}

private static Dokumenttype tilDokumenttype(DokumentTypeId dokumentTypeId) {
return switch (dokumentTypeId) {
case SØKNAD_ENGANGSSTØNAD_FØDSEL, SØKNAD_ENGANGSSTØNAD_ADOPSJON -> Dokumenttype.ENGANGSSTØNAD;
case SØKNAD_FORELDREPENGER_FØDSEL, SØKNAD_FORELDREPENGER_ADOPSJON -> Dokumenttype.FORELDREPENGER;
case SØKNAD_SVANGERSKAPSPENGER, I000109 -> Dokumenttype.SVANGERSKAPSPENGER;
case FORELDREPENGER_ENDRING_SØKNAD, FLEKSIBELT_UTTAK_FORELDREPENGER -> Dokumenttype.ENDRINGSSØKNAD;
case INNTEKTSMELDING -> Dokumenttype.INNTEKTSMELDING;
case KLAGE_DOKUMENT, KLAGE_ETTERSENDELSE -> Dokumenttype.KLAGE_ANKE;
// case TILBAKEKREVING_UTTALSELSE, TILBAKEBETALING_UTTALSELSE -> Dokumenttype.TILBAKE; Mottas ikke i fpsak. Vil være 0
case DOKUMENTASJON_AV_TERMIN_ELLER_FØDSEL, DOKUMENTASJON_AV_OMSORGSOVERTAKELSE, BEKREFTELSE_VENTET_FØDSELSDATO,
FØDSELSATTEST, TERMINBEKREFTELSE -> Dokumenttype.FAMHENDELSE;
case LEGEERKLÆRING, DOK_INNLEGGELSE, BESKRIVELSE_FUNKSJONSNEDSETTELSE, MOR_INNLAGT, MOR_SYK,
FAR_SYK, FAR_INNLAGT, BARN_INNLAGT-> Dokumenttype.SYKDOM;
case DOK_FERIE, DOK_ARBEIDSFORHOLD, BEKREFTELSE_FRA_ARBEIDSGIVER, BEKREFTELSE_FRA_STUDIESTED,
BEKREFTELSE_DELTAR_KVALIFISERINGSPROGRAM, DOK_HV, DOK_NAV_TILTAK, MOR_ARBEID_STUDIE, MOR_ARBEID, MOR_STUDIE,
MOR_KVALIFISERINGSPROGRAM, I000112-> Dokumenttype.AKTIVITETSKRAV;
case null -> Dokumenttype.ANNET;
default -> Dokumenttype.ANNET;
};

}

record DokumentTypeQR(DokumentTypeId dokumentTypeId, Long antall) { }


public record DokumentStatistikk(Dokumenttype dokumenttype, Long antall) { }

public enum Dokumenttype {
ENGANGSSTØNAD,
FORELDREPENGER,
SVANGERSKAPSPENGER,
ENDRINGSSØKNAD,
INNTEKTSMELDING,
KLAGE_ANKE,
FAMHENDELSE,
SYKDOM,
AKTIVITETSKRAV,
ANNET
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,29 @@
public class StatistikkMetrikkTask implements ProsessTaskHandler {

private BehandlingStatistikkRepository statistikkRepository;
private BehandlingMetrikker behandlingMetrikker;
private DokumentStatistikkRepository dokumentStatistikkRepository;

public StatistikkMetrikkTask() {
// CDI
}

@Inject
public StatistikkMetrikkTask(BehandlingStatistikkRepository statistikkRepository, BehandlingMetrikker behandlingMetrikker) {
public StatistikkMetrikkTask(BehandlingStatistikkRepository statistikkRepository,
DokumentStatistikkRepository dokumentStatistikkRepository) {
this.statistikkRepository = statistikkRepository;
this.behandlingMetrikker = behandlingMetrikker;
this.dokumentStatistikkRepository = dokumentStatistikkRepository;
}


@Override
public void doTask(ProsessTaskData prosessTaskData) {
var behandlingerPerTypeYtelseÅrsak = statistikkRepository.hentAntallBehandlinger();
for (var behandling: behandlingerPerTypeYtelseÅrsak) {
behandlingMetrikker.setAntall(behandling.type(), behandling.antall());
var behandlingerPerÅrsak = statistikkRepository.hentAntallBehandlingsårsaker();
for (var behandling: behandlingerPerÅrsak) {
BehandlingMetrikker.setAntall(behandling.behandlingsårsak(), behandling.antall());
}
var dokumentPerType = dokumentStatistikkRepository.hentAntallDokumenttyper();
for (var dokumenttype: dokumentPerType) {
DokumentMetrikker.setAntall(dokumenttype.dokumenttype(), dokumenttype.antall());
}
}
}
Loading

0 comments on commit 2ca3bab

Please sign in to comment.