Skip to content

Commit

Permalink
Feature/amelding progress indikator (#3431)
Browse files Browse the repository at this point in the history
Feilretting ved innsending av Amelding
  • Loading branch information
krharum authored Mar 14, 2024
1 parent 0ca4ef6 commit 69db3ed
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ public static void main(String[] args) {

SpringApplication.run(DollyBackendApplicationStarter.class, args);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public Flux<ClientFuture> gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly
var initStatus = miljoer.stream()
.map(miljo -> String.format("%s:%s", miljo, getInfoVenter(SYSTEM)))
.collect(Collectors.joining(","));

transactionHelperService.persister(progress, BestillingProgress::getAaregStatus,
BestillingProgress::setAaregStatus, initStatus);

Expand All @@ -79,7 +80,7 @@ public Flux<ClientFuture> gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly

return sendArbeidsforhold(bestilling, dollyPerson, miljoerTrygg.get(), isOpprettEndre);
} else {
return ameldingService.sendAmelding(bestilling, dollyPerson, miljoerTrygg.get());
return ameldingService.sendAmelding(bestilling, dollyPerson, miljoerTrygg.get(), progress);
}
})
.map(status -> futurePersist(progress, status));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,24 @@
import lombok.extern.slf4j.Slf4j;
import no.nav.dolly.bestilling.aareg.command.AmeldingPutCommand;
import no.nav.dolly.config.Consumers;
import no.nav.dolly.domain.jpa.BestillingProgress;
import no.nav.dolly.errorhandling.ErrorStatusDecoder;
import no.nav.dolly.metrics.Timed;
import no.nav.testnav.libs.dto.ameldingservice.v1.AMeldingDTO;
import no.nav.testnav.libs.dto.ameldingservice.v1.VirksomhetDTO;
import no.nav.testnav.libs.securitycore.domain.ServerProperties;
import no.nav.testnav.libs.standalone.servletsecurity.exchange.TokenExchange;
import org.slf4j.event.Level;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.netty.http.client.HttpClient;
import reactor.netty.resources.ConnectionProvider;

import java.time.Duration;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
Expand All @@ -30,7 +36,6 @@ public class AmeldingConsumer {

private static final String JURIDISK_ENHET_IKKE_FUNNET = "Feil= Juridisk enhet for organisasjon(ene): %s ble ikke funnet i miljø";
private static final DateTimeFormatter YEAR_MONTH = DateTimeFormatter.ofPattern("yyyy-MM");

private final TokenExchange tokenService;
private final WebClient webClient;
private final ServerProperties serverProperties;
Expand All @@ -41,19 +46,29 @@ public AmeldingConsumer(
Consumers consumers,
ObjectMapper objectMapper,
ErrorStatusDecoder errorStatusDecoder,
WebClient.Builder webClientBuilder
) {
WebClient.Builder webClientBuilder) {

this.tokenService = tokenService;
serverProperties = consumers.getTestnavAmeldingService();
this.webClient = webClientBuilder
.baseUrl(serverProperties.getUrl())
.exchangeStrategies(getJacksonStrategy(objectMapper))
.clientConnector(
new ReactorClientHttpConnector(
HttpClient
.create(ConnectionProvider.builder("Testnorge connection pool")
.maxConnections(5)
.pendingAcquireMaxCount(10000)
.pendingAcquireTimeout(Duration.ofMinutes(30))
.build())
.responseTimeout(Duration.ofSeconds(3))
))
.build();
this.errorStatusDecoder = errorStatusDecoder;
}

@Timed(name = "providers", tags = { "operation", "amelding_put" })
public Flux<String> sendAmeldinger(List<AMeldingDTO> ameldinger, String miljoe) {
@Timed(name = "providers", tags = {"operation", "amelding_put"})
public Flux<String> sendAmeldinger(List<AMeldingDTO> ameldinger, String miljoe, BestillingProgress progress) {

return tokenService.exchange(serverProperties)
.flatMapMany(token -> Flux.fromIterable(ameldinger)
Expand All @@ -67,9 +82,13 @@ public Flux<String> sendAmeldinger(List<AMeldingDTO> ameldinger, String miljoe)
log.info("Sender Amelding {} til miljø {}: {}",
amelding.getKalendermaaned().format(YEAR_MONTH), miljoe, Json.pretty(amelding));
return new AmeldingPutCommand(webClient, amelding, miljoe, token.getTokenValue()).call()
.doOnNext(status -> log.info("Ameldingstatus: {}", status.getStatusCode()))
.map(status -> status.getStatusCode().is2xxSuccessful() ? "OK" :
errorStatusDecoder.getErrorText(HttpStatus.valueOf(status.getStatusCode().value()), status.getBody()));
errorStatusDecoder.getErrorText(HttpStatus.valueOf(status.getStatusCode().value()), status.getBody()))
.doOnNext(status ->
log.atLevel("OK".equals(status) ? Level.INFO : Level.ERROR)
.log("Ameldingstatus: {}, miljoe: {}, kalendermåned: {}, organisasjon: {}",
status, miljoe, amelding.getKalendermaaned(),
amelding.getOpplysningspliktigOrganisajonsnummer()));
}
}));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import lombok.extern.slf4j.Slf4j;
import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.MappingContext;
import no.nav.dolly.domain.jpa.BestillingProgress;
import no.nav.dolly.domain.resultset.RsDollyUtvidetBestilling;
import no.nav.dolly.domain.resultset.aareg.RsAareg;
import no.nav.dolly.domain.resultset.aareg.RsAmeldingRequest;
Expand All @@ -16,6 +17,7 @@
import reactor.core.publisher.Mono;

import java.util.Collection;
import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
Expand All @@ -25,16 +27,16 @@
@Slf4j
public class AmeldingService {

private static final String STATUS_ELEMENT = "%s: arbforhold=1$%s";
private static final String STATUS_ELEMENT = "%s:Amelding$%s";

private final AmeldingConsumer ameldingConsumer;
private final MapperFacade mapperFacade;
private final OrganisasjonServiceConsumer organisasjonServiceConsumer;

public Mono<String> sendAmelding(RsDollyUtvidetBestilling bestilling, DollyPerson dollyPerson,
Set<String> miljoer) {
Set<String> miljoer, BestillingProgress progress) {

var orgnumre = bestilling.getAareg().get(0).getAmelding().stream()
var orgnumre = bestilling.getAareg().getFirst().getAmelding().stream()
.map(RsAmeldingRequest::getArbeidsforhold)
.flatMap(Collection::stream)
.map(RsArbeidsforholdAareg::getArbeidsgiver)
Expand All @@ -46,14 +48,15 @@ public Mono<String> sendAmelding(RsDollyUtvidetBestilling bestilling, DollyPerso
.filter(OrganisasjonDTO::isFunnet)
.collect(Collectors.toMap(OrganisasjonDTO::getOrgnummer, OrganisasjonDTO::getJuridiskEnhet))
.flatMapMany(organisasjon ->
prepareAmeldinger(bestilling.getAareg().get(0), dollyPerson.getIdent(),
organisasjon, miljoe))
prepareAmeldinger(bestilling.getAareg().getFirst(), dollyPerson.getIdent(),
organisasjon, miljoe, progress))
.collect(Collectors.joining(",")))
.flatMap(Flux::from)
.collect(Collectors.joining(","));
}

private Flux<String> prepareAmeldinger(RsAareg aareg, String ident, Map<String, String> organisasjon, String miljoe) {
private Flux<String> prepareAmeldinger(RsAareg aareg, String ident, Map<String, String> organisasjon,
String miljoe, BestillingProgress progress) {

var context = new MappingContext.Factory().getContext();
context.setProperty("personIdent", ident);
Expand All @@ -62,9 +65,10 @@ private Flux<String> prepareAmeldinger(RsAareg aareg, String ident, Map<String,

return Flux.fromIterable(aareg.getAmelding())
.map(aamelding -> mapperFacade.map(aamelding, AMeldingDTO.class, context))
.sort(Comparator.comparing(AMeldingDTO::getKalendermaaned))
.collectList()
.flatMapMany(reultat -> ameldingConsumer.sendAmeldinger(reultat, miljoe)
.flatMapMany(ameldinger -> ameldingConsumer.sendAmeldinger(ameldinger, miljoe, progress)
.distinct()
.map(status -> String.format(STATUS_ELEMENT, miljoe, status)));
.map(status -> STATUS_ELEMENT.formatted(miljoe, status)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
Expand Down Expand Up @@ -54,16 +55,21 @@ public void mapAtoB(RsAmeldingRequest rsAmelding,
amelding.setKalendermaaned(LocalDate.of(Integer.parseInt(date[0]), Integer.parseInt(date[1]), 1));
var opplysningsPliktig = (Map<String, String>) context.getProperty("opplysningspliktig");

amelding.setOpplysningspliktigOrganisajonsnummer(opplysningsPliktig.get(rsAmelding.getArbeidsforhold().get(0).getArbeidsgiver().getOrgnummer()));
amelding.setOpplysningspliktigOrganisajonsnummer(opplysningsPliktig.get(rsAmelding.getArbeidsforhold()
.getFirst().getArbeidsgiver().getOrgnummer()));

var virksomheter = mapperFacade.mapAsList(rsAmelding.getArbeidsforhold(), Virksomhet.class, context);
virksomheter.forEach(virksomhet -> {
var arbForholdId = new AtomicInteger(0);
virksomhet.getPersoner()
.forEach(person -> person.getArbeidsforhold()
.forEach(arbeidsforhold -> arbeidsforhold
.setArbeidsforholdId(Integer.toString(arbForholdId.incrementAndGet()))));
});
var arbeidsForholdIder = new HashMap<String, AtomicInteger>();
virksomheter
.forEach(virksomhet -> virksomhet.getPersoner().forEach(person ->
arbeidsForholdIder.put(virksomhet.getOrganisajonsnummer()+person.getIdent(),
new AtomicInteger(0))));
virksomheter.forEach(virksomhet -> virksomhet.getPersoner()
.forEach(person -> person.getArbeidsforhold()
.forEach(arbeidsforhold -> arbeidsforhold
.setArbeidsforholdId(Integer.toString(
arbeidsForholdIder.get(virksomhet.getOrganisajonsnummer()+person.getIdent())
.incrementAndGet())))));
var ameldingVirksomheter = virksomheter.stream().map(virksomhet ->
VirksomhetDTO.builder()
.organisajonsnummer(virksomhet.getOrganisajonsnummer())
Expand Down Expand Up @@ -94,12 +100,14 @@ public void mapAtoB(RsArbeidsforholdAareg rsArbeidsforholdAareg, Virksomhet virk
getDate(rsArbeidsforholdAareg.getAnsettelsesPeriode().getTom()) : null)
.antallTimerPerUke(
!rsArbeidsforholdAareg.getAntallTimerForTimeloennet().isEmpty() ?
rsArbeidsforholdAareg.getAntallTimerForTimeloennet().get(0).getAntallTimer().floatValue() :
rsArbeidsforholdAareg.getAntallTimerForTimeloennet()
.getFirst().getAntallTimer().floatValue() :
getAvtaltArbeidstidPerUke(rsArbeidsforholdAareg))
.arbeidsforholdType((String) context.getProperty("arbeidsforholdstype"))
.arbeidstidsordning(rsArbeidsforholdAareg.getArbeidsavtale().getArbeidstidsordning())
.fartoey(nonNull(rsArbeidsforholdAareg.getFartoy()) && !rsArbeidsforholdAareg.getFartoy().isEmpty() ?
mapperFacade.map(rsArbeidsforholdAareg.getFartoy().get(0), FartoeyDTO.class) : null)
mapperFacade.map(rsArbeidsforholdAareg.getFartoy()
.getFirst(), FartoeyDTO.class) : null)
.inntekter(
(nonNull(rsArbeidsforholdAareg.getUtenlandsopphold()) &&
!rsArbeidsforholdAareg.getUtenlandsopphold().isEmpty()) ||
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
import no.nav.dolly.domain.resultset.RsStatusRapport;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
import static no.nav.dolly.domain.resultset.SystemTyper.AAREG;
import static no.nav.dolly.mapper.AbstractRsStatusMiljoeIdentForhold.checkAndUpdateStatus;
Expand Down Expand Up @@ -43,23 +43,26 @@ public static List<RsStatusRapport> buildAaregStatusMap(List<BestillingProgress>
}
});

return errorEnvIdents.isEmpty() ? emptyList() :
singletonList(RsStatusRapport.builder().id(AAREG).navn(AAREG.getBeskrivelse())
.statuser(errorEnvIdents.entrySet().stream().map(status ->
RsStatusRapport.Status.builder()
.melding(status.getKey().replace(";", ","))
.detaljert(status.getValue().entrySet().stream().map(miljo ->
RsStatusRapport.Detaljert.builder()
.miljo(miljo.getKey())
.identer(miljo.getValue())
.build())
.toList())
.build())
.toList())
var statuser = errorEnvIdents.entrySet().stream().map(status ->
RsStatusRapport.Status.builder()
.melding(status.getKey().replace(";", ","))
.detaljert(status.getValue().entrySet().stream().map(miljo ->
RsStatusRapport.Detaljert.builder()
.miljo(miljo.getKey())
.identer(miljo.getValue())
.build())
.toList())
.build())
.toList();

return statuser.isEmpty() ? Collections.emptyList() :
singletonList(RsStatusRapport.builder()
.navn(AAREG.getBeskrivelse())
.id(AAREG)
.statuser(statuser)
.build());
}


public static String konverterBAfeilkodeTilFeilmelding(String baKode) {
var baFeilkode = getBaFeilkodeFromFeilmelding(baKode);
try {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
package no.nav.testnav.apps.oppsummeringsdokumentservice.repository;

import no.nav.testnav.apps.oppsummeringsdokumentservice.repository.model.OppsummeringsdokumentModel;
import no.nav.testnav.libs.dto.oppsummeringsdokumentservice.v2.Populasjon;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;


public interface OppsummeringsdokumentRepository extends ElasticsearchRepository<OppsummeringsdokumentModel, String> {
void deleteAllByMiljoAndPopulasjon(String miljo, Populasjon populasjon);

void deleteAllByMiljo(String miljo);


}
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ public static QueryBuilder prepareQuery(QueryRequest request) {

matchString(query, "_id", request.getId());
matchString(query, "miljo", request.getMiljo());
matchString(query, "opplysningspliktigOrganisajonsnummer", request.getOrgnummer());
matchString(query, "virksomheter.personer.ident", request.getIdent());
matchString(query, "virksomheter.organisajonsnummer", request.getOrgnummer());
matchString(query, "virksomheter.personer.arbeidsforhold.typeArbeidsforhold", request.getTypeArbeidsforhold());

if (nonNull(request.getFom())) {
Expand Down

0 comments on commit 69db3ed

Please sign in to comment.