From 1308a45250c7e019a84fac903e99a651705f8f8f Mon Sep 17 00:00:00 2001 From: stigus Date: Fri, 19 Sep 2025 09:25:52 +0200 Subject: [PATCH 01/20] - Refactor Consumers and RouteLocatorConfig to support new services: syfosmregler and tsm-input-dolly - Changed the setup of the proxy in minor ways #deploy-proxy-sykemelding --- proxies/sykemelding-proxy/config.yml | 6 +-- .../proxies/sykemeldingproxy/Consumers.java | 6 +-- .../sykemeldingproxy/RouteLocatorConfig.java | 37 ++++++++++--------- .../src/main/resources/application.yml | 7 +++- 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/proxies/sykemelding-proxy/config.yml b/proxies/sykemelding-proxy/config.yml index 76b1e3db902..0ae7c75aac3 100644 --- a/proxies/sykemelding-proxy/config.yml +++ b/proxies/sykemelding-proxy/config.yml @@ -36,19 +36,19 @@ spec: rules: - application: team-dolly-lokal-app - application: dolly-frontend - - application: dolly-idporten - application: dolly-frontend-dev + - application: dolly-idporten - application: dolly-backend - application: dolly-backend-dev - application: testnav-sykemelding-api - application: testnav-sykemelding-api-dev - application: testnav-oversikt-frontend - - application: testnav-sykemelding-api-dev - - application: testnav-sykemelding-api outbound: rules: - application: syfosmregler namespace: teamsykmelding + - application: tsm-input-dolly + namespace: tsm - application: logging namespace: nais-system liveness: diff --git a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/Consumers.java b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/Consumers.java index ebbf535055a..c6138b51f2e 100644 --- a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/Consumers.java +++ b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/Consumers.java @@ -3,11 +3,10 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; -import no.nav.testnav.libs.securitycore.domain.ServerProperties; - import static lombok.AccessLevel.PACKAGE; @Configuration @@ -17,6 +16,7 @@ @Setter(PACKAGE) public class Consumers { - private ServerProperties sykemelding; + private ServerProperties syfosmregler; + private ServerProperties tsmInputDolly; } diff --git a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java index 824d6bbc302..76cbbaa1775 100644 --- a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java +++ b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java @@ -5,6 +5,7 @@ import no.nav.testnav.libs.reactivesecurity.config.SecureOAuth2ServerToServerConfiguration; import no.nav.testnav.libs.reactivesecurity.exchange.azuread.AzureTrygdeetatenTokenService; import no.nav.testnav.libs.securitycore.domain.AccessToken; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; @@ -22,29 +23,31 @@ public class RouteLocatorConfig { @Bean public RouteLocator customRouteLocator( RouteLocatorBuilder builder, - Consumers consumers, - GatewayFilter authenticationFilter - ) { + AzureTrygdeetatenTokenService tokenService, + Consumers consumers) { + return builder .routes() .route(spec -> spec - .path("/**") - .and() - .not(not -> not.path("/internal/**")) - .filters(f -> f.filter(authenticationFilter)) - .uri(consumers.getSykemelding().getUrl())) + .path("/syfosmregler/**") + .filters(f -> f + .stripPrefix(1) + .filter(authFilter(tokenService, consumers.getSyfosmregler())) + ) + .uri(consumers.getSyfosmregler().getUrl())) + .route(spec -> spec + .path("/tsm/**") + .filters(f -> f + .stripPrefix(1) + .filter(authFilter(tokenService, consumers.getTsmInputDolly())) + ) + .uri(consumers.getTsmInputDolly().getUrl())) .build(); } - @Bean - GatewayFilter getAuthenticationFilter( - AzureTrygdeetatenTokenService tokenService, - Consumers consumers - ) { + private GatewayFilter authFilter(AzureTrygdeetatenTokenService tokenService, ServerProperties serverProperties) { return AddAuthenticationRequestGatewayFilterFactory - .bearerAuthenticationHeaderFilter(() -> tokenService - .exchange(consumers.getSykemelding()) - .map(AccessToken::getTokenValue)); + .bearerAuthenticationHeaderFilter(() -> + tokenService.exchange(serverProperties).map(AccessToken::getTokenValue)); } - } diff --git a/proxies/sykemelding-proxy/src/main/resources/application.yml b/proxies/sykemelding-proxy/src/main/resources/application.yml index 18452389118..4f41bbab17e 100644 --- a/proxies/sykemelding-proxy/src/main/resources/application.yml +++ b/proxies/sykemelding-proxy/src/main/resources/application.yml @@ -19,8 +19,13 @@ spring: response-timeout: 30s consumers: - sykemelding: + syfosmregler: name: syfosmregler namespace: teamsykmelding url: http://syfosmregler.teamsykmelding.svc.cluster.local cluster: dev-gcp + tsm-input-dolly: + name: tsm-input-dolly + namespace: tsm + url: http://tsm-input-dolly.tsm.svc.cluster.local + cluster: dev-gcp From 6ffdd0a4aea56e39ca95317a9dc4457d85b1041e Mon Sep 17 00:00:00 2001 From: stigus Date: Fri, 19 Sep 2025 09:33:36 +0200 Subject: [PATCH 02/20] Add support for routing `syfosmregler` and `tsm-input-dolly` services; update tests and configuration files accordingly. #deploy-proxy-sykemelding --- .../RouteLocatorConfigTest.java | 89 ++++++++++++------- .../src/test/resources/application-test.yml | 14 +++ 2 files changed, 70 insertions(+), 33 deletions(-) diff --git a/proxies/sykemelding-proxy/src/test/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfigTest.java b/proxies/sykemelding-proxy/src/test/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfigTest.java index 836e34afe61..0c2d47fd5fd 100644 --- a/proxies/sykemelding-proxy/src/test/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfigTest.java +++ b/proxies/sykemelding-proxy/src/test/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfigTest.java @@ -2,60 +2,83 @@ import no.nav.dolly.libs.test.DollyApplicationContextTest; import no.nav.dolly.libs.test.DollySpringBootTest; +import no.nav.testnav.libs.reactivesecurity.exchange.TokenExchange; +import no.nav.testnav.libs.reactivesecurity.exchange.azuread.AzureTrygdeetatenTokenService; +import no.nav.testnav.libs.securitycore.domain.AccessToken; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient; -import org.springframework.boot.test.context.TestConfiguration; import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; -import org.springframework.cloud.gateway.filter.GatewayFilter; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import reactor.core.publisher.Mono; -import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.client.WireMock.verify; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; import static org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers.mockOAuth2Login; -@DollySpringBootTest( - properties = "consumers.sykemelding.url=http://localhost:${wiremock.server.port}" -) +@DollySpringBootTest() +@ActiveProfiles("test") @AutoConfigureWireMock(port = 0) -@AutoConfigureWebTestClient(timeout = "PT1M") +@AutoConfigureWebTestClient(timeout = "PT30S") class RouteLocatorConfigTest extends DollyApplicationContextTest { - @TestConfiguration - static class TestAuthenticationConfig { + @MockitoBean + AzureTrygdeetatenTokenService tokenService; - @Primary - @Bean - GatewayFilter getNoopAuthenticationFilter() { - return (exchange, chain) -> chain.filter(exchange); - - } + @MockitoBean + TokenExchange tokenExchange; + @BeforeEach + void setupMocks() { + when(tokenService.exchange(any())) + .thenReturn(Mono.just(new AccessToken("dummy-token"))); } @Test - void shouldRouteToStub() { - - stubFor( - get(urlEqualTo("/testing/route")) - .willReturn( - aResponse() - .withStatus(HttpStatus.OK.value()) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE) - .withBody("Some content") - ) - ); + void shouldRouteSyfosmreglerAndStripFirstPathSegment() { + stubFor(get(urlEqualTo("/api/v1/validate")) + .willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody("{\"result\":\"valid\"}"))); webTestClient .mutateWith(mockOAuth2Login()) - .get().uri("/testing/route") + .get() + .uri("/syfosmregler/api/v1/validate") .exchange() .expectStatus().isOk() - .expectHeader().contentType(MediaType.TEXT_PLAIN_VALUE) - .expectBody(String.class).isEqualTo("Some content"); + .expectHeader().contentType(MediaType.APPLICATION_JSON) + .expectBody().json("{\"result\":\"valid\"}"); + verify(1, getRequestedFor(urlEqualTo("/api/v1/validate"))); } + @Test + void shouldRouteTsmAndStripPrefix() { + stubFor(get(urlEqualTo("/api/v1/sykmelding")) + .willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody("{\"status\":\"ok\"}"))); + + webTestClient + .mutateWith(mockOAuth2Login()) + .get() + .uri("/tsm/api/v1/sykmelding") + .exchange() + .expectStatus().isOk() + .expectHeader().contentType(MediaType.APPLICATION_JSON) + .expectBody().json("{\"status\":\"ok\"}"); + + verify(1, getRequestedFor(urlEqualTo("/api/v1/sykmelding"))); + } } diff --git a/proxies/sykemelding-proxy/src/test/resources/application-test.yml b/proxies/sykemelding-proxy/src/test/resources/application-test.yml index e69de29bb2d..ca65b8c9e5e 100644 --- a/proxies/sykemelding-proxy/src/test/resources/application-test.yml +++ b/proxies/sykemelding-proxy/src/test/resources/application-test.yml @@ -0,0 +1,14 @@ +spring: + main: + allow-bean-definition-overriding: true + security: + oauth2: + resourceserver: + jwt: + jwk-set-uri: http://invalid-local/jwks + +consumers: + syfosmregler: + url: http://localhost:${wiremock.server.port} + tsm-input-dolly: + url: http://localhost:${wiremock.server.port} From 744061381f6c32b21b2e6011990489238cf05352 Mon Sep 17 00:00:00 2001 From: stigus Date: Fri, 19 Sep 2025 15:47:42 +0200 Subject: [PATCH 03/20] Update syfosmregler validation URL; comment out auth filter in TSM route. #deploy-proxy-sykemelding #deploy-sykemelding-api #deploy-test-sykemelding-api --- .../consumer/command/SyfosmreglerPostValidateCommand.java | 2 +- .../testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/consumer/command/SyfosmreglerPostValidateCommand.java b/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/consumer/command/SyfosmreglerPostValidateCommand.java index cc0ba877c43..0cb7d5a08c6 100644 --- a/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/consumer/command/SyfosmreglerPostValidateCommand.java +++ b/apps/sykemelding-api/src/main/java/no/nav/registre/testnorge/sykemelding/consumer/command/SyfosmreglerPostValidateCommand.java @@ -16,7 +16,7 @@ @RequiredArgsConstructor public class SyfosmreglerPostValidateCommand implements Callable> { - private static final String SYFOSMREGLER_VALIDATE_URL = "/v1/rules/validate"; + private static final String SYFOSMREGLER_VALIDATE_URL = "/syfosmregler/v1/rules/validate"; private final WebClient webClient; private final ReceivedSykemeldingDTO receivedSykemelding; diff --git a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java index 76cbbaa1775..4ebf36dcbbd 100644 --- a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java +++ b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java @@ -38,8 +38,8 @@ public RouteLocator customRouteLocator( .route(spec -> spec .path("/tsm/**") .filters(f -> f - .stripPrefix(1) - .filter(authFilter(tokenService, consumers.getTsmInputDolly())) + .stripPrefix(1) +// .filter(authFilter(tokenService, consumers.getTsmInputDolly())) ) .uri(consumers.getTsmInputDolly().getUrl())) .build(); From 6c3b52538535faabd1bc71e1f902c79cec457677 Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 22 Sep 2025 10:02:29 +0200 Subject: [PATCH 04/20] Enable auth filter for TSM route in RouteLocatorConfig --- .../testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java index 4ebf36dcbbd..76cbbaa1775 100644 --- a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java +++ b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java @@ -38,8 +38,8 @@ public RouteLocator customRouteLocator( .route(spec -> spec .path("/tsm/**") .filters(f -> f - .stripPrefix(1) -// .filter(authFilter(tokenService, consumers.getTsmInputDolly())) + .stripPrefix(1) + .filter(authFilter(tokenService, consumers.getTsmInputDolly())) ) .uri(consumers.getTsmInputDolly().getUrl())) .build(); From 0c302351dddc1f418e105c8429811a9435870c84 Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 22 Sep 2025 10:08:37 +0200 Subject: [PATCH 05/20] Enable auth filter for TSM route in RouteLocatorConfig #deploy-proxy-sykemelding --- .../testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java index 76cbbaa1775..b6b6301b8d8 100644 --- a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java +++ b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/RouteLocatorConfig.java @@ -50,4 +50,4 @@ private GatewayFilter authFilter(AzureTrygdeetatenTokenService tokenService, Ser .bearerAuthenticationHeaderFilter(() -> tokenService.exchange(serverProperties).map(AccessToken::getTokenValue)); } -} +} \ No newline at end of file From f7909eedabc22f4aa14fd5954a5767a7e95f04e2 Mon Sep 17 00:00:00 2001 From: stigus Date: Mon, 22 Sep 2025 12:04:04 +0200 Subject: [PATCH 06/20] Add support for TSM sykemelding processing and routing; refactor sykemelding commands and configurations. --- apps/dolly-backend/config.test.yml | 1 + apps/dolly-backend/config.yml | 1 + .../sykemelding/SykemeldingConsumer.java | 23 ++- .../SyfosmreglerSykemeldingPostCommand.java | 45 +++++ ...nd.java => TsmSykemeldingPostCommand.java} | 2 +- .../domain/TsmSykemeldingRequest.java | 175 ++++++++++++++++++ .../java/no/nav/dolly/config/Consumers.java | 1 + .../src/main/resources/application.yml | 5 + 8 files changed, 248 insertions(+), 5 deletions(-) create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/SyfosmreglerSykemeldingPostCommand.java rename apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/{SykemeldingPostCommand.java => TsmSykemeldingPostCommand.java} (95%) create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/TsmSykemeldingRequest.java diff --git a/apps/dolly-backend/config.test.yml b/apps/dolly-backend/config.test.yml index 92360c927f6..62f0b2cbf27 100644 --- a/apps/dolly-backend/config.test.yml +++ b/apps/dolly-backend/config.test.yml @@ -66,6 +66,7 @@ spec: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-saf-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io + - host: testnav-sykemelding-proxy.dev-fss-pub.nais.io - host: testnav-skjermingsregister-proxy.dev-fss-pub.nais.io - host: testnav-udistub-proxy.dev-fss-pub.nais.io webproxy: true diff --git a/apps/dolly-backend/config.yml b/apps/dolly-backend/config.yml index 52885436af6..d66f263e882 100644 --- a/apps/dolly-backend/config.yml +++ b/apps/dolly-backend/config.yml @@ -64,6 +64,7 @@ spec: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-saf-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io + - host: testnav-sykemelding-proxy.dev-fss-pub.nais.io - host: testnav-skjermingsregister-proxy.dev-fss-pub.nais.io - host: testnav-udistub-proxy.dev-fss-pub.nais.io webproxy: true diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java index 2790cce1427..caf7685202c 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java @@ -3,8 +3,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.core.util.Json; import lombok.extern.slf4j.Slf4j; +import ma.glasnost.orika.MapperFacade; import no.nav.dolly.bestilling.ConsumerStatus; -import no.nav.dolly.bestilling.sykemelding.command.SykemeldingPostCommand; +import no.nav.dolly.bestilling.sykemelding.command.SyfosmreglerSykemeldingPostCommand; import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest; import no.nav.dolly.bestilling.sykemelding.dto.SykemeldingResponse; import no.nav.dolly.config.Consumers; @@ -24,15 +25,17 @@ public class SykemeldingConsumer extends ConsumerStatus { private final WebClient webClient; private final TokenExchange tokenService; private final ServerProperties serverProperties; + private final MapperFacade mapperFacade; public SykemeldingConsumer( TokenExchange accessTokenService, Consumers consumers, ObjectMapper objectMapper, - WebClient webClient) { + WebClient webClient, MapperFacade mapperFacade) { this.tokenService = accessTokenService; serverProperties = consumers.getTestnavSykemeldingApi(); + this.mapperFacade = mapperFacade; this.webClient = webClient .mutate() .exchangeStrategies(getJacksonStrategy(objectMapper)) @@ -40,13 +43,25 @@ public SykemeldingConsumer( .build(); } - @Timed(name = "providers", tags = {"operation", "detaljertsykemelding_opprett"}) + @Timed(name = "providers", tags = { "operation", "detaljertsykemelding_opprett" }) public Mono postDetaljertSykemelding(DetaljertSykemeldingRequest detaljertSykemeldingRequest) { log.info("Detaljert Sykemelding sendt {}", Json.pretty(detaljertSykemeldingRequest)); return tokenService.exchange(serverProperties) - .flatMap(token -> new SykemeldingPostCommand(webClient, detaljertSykemeldingRequest, + .flatMap(token -> new SyfosmreglerSykemeldingPostCommand(webClient, detaljertSykemeldingRequest, + token.getTokenValue()).call()); + } + + @Timed(name = "providers", tags = { "operation", "detaljertsykemelding_opprett" }) + public Mono postTsmSykemelding(DetaljertSykemeldingRequest detaljertSykemeldingRequest) { + + var sykemeldingRequest = mapperFacade.map(detaljertSykemeldingRequest, DetaljertSykemeldingRequest.class); + + log.info("Sykemelding sendt til tsm-input-dolly {}", Json.pretty(detaljertSykemeldingRequest)); + + return tokenService.exchange(serverProperties) + .flatMap(token -> new SyfosmreglerSykemeldingPostCommand(webClient, detaljertSykemeldingRequest, token.getTokenValue()).call()); } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/SyfosmreglerSykemeldingPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/SyfosmreglerSykemeldingPostCommand.java new file mode 100644 index 00000000000..152f9f8d772 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/SyfosmreglerSykemeldingPostCommand.java @@ -0,0 +1,45 @@ +package no.nav.dolly.bestilling.sykemelding.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest; +import no.nav.dolly.bestilling.sykemelding.dto.SykemeldingResponse; +import no.nav.testnav.libs.dto.sykemelding.v1.SykemeldingResponseDTO; +import no.nav.testnav.libs.reactivecore.web.WebClientError; +import no.nav.testnav.libs.reactivecore.web.WebClientHeader; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.concurrent.Callable; + +@RequiredArgsConstructor +@Slf4j +public class SyfosmreglerSykemeldingPostCommand implements Callable> { + + private static final String DETALJERT_SYKEMELDING_URL = "/api/v1/sykemeldinger"; + + private final WebClient webClient; + private final DetaljertSykemeldingRequest request; + private final String token; + + @Override + public Mono call() { + return webClient + .post() + .uri(uriBuilder -> uriBuilder.path(DETALJERT_SYKEMELDING_URL).build()) + .headers(WebClientHeader.bearer(token)) + .bodyValue(request) + .retrieve() + .bodyToMono(SykemeldingResponseDTO.class) + .map(response -> SykemeldingResponse.builder() + .status(response.getStatus()) + .msgId(response.getSykemeldingId()) + .ident(request.getPasient().getIdent()) + .sykemeldingRequest(SykemeldingResponse.SykemeldingRequest.builder() + .detaljertSykemeldingRequest(request) + .build()) + .build()) + .doOnError(WebClientError.logTo(log)) + .onErrorResume(error -> SykemeldingResponse.of(WebClientError.describe(error), request.getPasient().getIdent())); + } +} \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/SykemeldingPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingPostCommand.java similarity index 95% rename from apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/SykemeldingPostCommand.java rename to apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingPostCommand.java index a0f84f12703..66ee755b0ad 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/SykemeldingPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingPostCommand.java @@ -14,7 +14,7 @@ @RequiredArgsConstructor @Slf4j -public class SykemeldingPostCommand implements Callable> { +public class TsmSykemeldingPostCommand implements Callable> { private static final String DETALJERT_SYKEMELDING_URL = "/api/v1/sykemeldinger"; diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/TsmSykemeldingRequest.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/TsmSykemeldingRequest.java new file mode 100644 index 00000000000..aec763c4962 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/TsmSykemeldingRequest.java @@ -0,0 +1,175 @@ +package no.nav.dolly.bestilling.sykemelding.domain; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +import static java.util.Objects.isNull; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(value = JsonInclude.Include.NON_EMPTY) +public class TsmSykemeldingRequest { + + private Arbeidsgiver arbeidsgiver; + private DollyDiagnose hovedDiagnose; + private List biDiagnoser; + private Detaljer detaljer; + private Helsepersonell helsepersonell; + private Boolean manglendeTilretteleggingPaaArbeidsplassen; + private Organisasjon mottaker; + private Pasient pasient; + private List perioder; + private Organisasjon sender; + private LocalDate startDato; + private Boolean umiddelbarBistand; + private KontaktMedPasient kontaktMedPasient; + + public List getBiDiagnoser() { + if (isNull(biDiagnoser)) { + biDiagnoser = new ArrayList<>(); + } + return biDiagnoser; + } + + public List getPerioder() { + if (isNull(perioder)) { + perioder = new ArrayList<>(); + } + return perioder; + } + + public enum AktivitetType { + + INGEN, AVVENTENDE + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(value = JsonInclude.Include.NON_EMPTY) + public static class Arbeidsgiver { + private String navn; + private Double stillingsprosent; + private String yrkesbetegnelse; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(value = JsonInclude.Include.NON_EMPTY) + public static class DollyDiagnose { + private String diagnose; + private String diagnosekode; + private String system; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(value = JsonInclude.Include.NON_EMPTY) + public static class Detaljer { + private Boolean arbeidsforEtterEndtPeriode; + private String beskrivHensynArbeidsplassen; + private String tiltakArbeidsplass; + private String tiltakNav; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(value = JsonInclude.Include.NON_EMPTY) + public static class Helsepersonell { + private String etternavn; + private String fornavn; + private String hprId; + private String ident; + private String mellomnavn; + private String samhandlerType; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(value = JsonInclude.Include.NON_EMPTY) + public static class Organisasjon { + private Adresse adresse; + private String navn; + private String orgNr; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(value = JsonInclude.Include.NON_EMPTY) + public static class Pasient { + private Adresse adresse; + private String etternavn; + private LocalDate foedselsdato; + private String fornavn; + private String ident; + private String mellomnavn; + private String navKontor; + private String telefon; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(value = JsonInclude.Include.NON_EMPTY) + public static class Periode { + private DollyAktivitet aktivitet; + private LocalDate fom; + private LocalDate tom; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(value = JsonInclude.Include.NON_EMPTY) + public static class DollyAktivitet { + + private AktivitetType aktivitet; + private Integer behandlingsdager; + private Integer grad; + private Boolean reisetilskudd; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(value = JsonInclude.Include.NON_EMPTY) + public static class Adresse { + private String by; + private String gate; + private String land; + private String postnummer; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(value = JsonInclude.Include.NON_EMPTY) + public static class KontaktMedPasient { + private LocalDate kontaktDato; + private String begrunnelseIkkeKontakt; + } +} \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/config/Consumers.java b/apps/dolly-backend/src/main/java/no/nav/dolly/config/Consumers.java index 476ea00baa4..a4e2ae66a02 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/config/Consumers.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/config/Consumers.java @@ -41,6 +41,7 @@ public class Consumers { private ServerProperties testnavSigrunstubProxy; private ServerProperties testnavSkjermingsregisterProxy; private ServerProperties testnavSykemeldingApi; + private ServerProperties testnavSykemeldingProxy; private ServerProperties testnavTpsMessagingService; private ServerProperties testnavUdistubProxy; private ServerProperties testnavSkattekortService; diff --git a/apps/dolly-backend/src/main/resources/application.yml b/apps/dolly-backend/src/main/resources/application.yml index 633718d7b1d..7b77c9ba2b6 100644 --- a/apps/dolly-backend/src/main/resources/application.yml +++ b/apps/dolly-backend/src/main/resources/application.yml @@ -189,6 +189,11 @@ consumers: namespace: dolly url: https://testnav-udistub-proxy.dev-fss-pub.nais.io cluster: dev-fss + testnav-sykemelding-proxy: + name: testnav-sykemelding-proxy + namespace: dolly + url: https://testnav-sykemelding-proxy.dev-fss-pub.nais.io + cluster: dev-gcp testnav-kontoregister-person-proxy: name: testnav-kontoregister-person-proxy namespace: dolly From dd2e8ae4f4edfa1373c8a958c9f825c60ab324b5 Mon Sep 17 00:00:00 2001 From: stigus Date: Tue, 23 Sep 2025 15:04:23 +0200 Subject: [PATCH 07/20] Refactor Sykemelding handling to remove unused MapperFacade; add support for new TSM Sykemelding processing and configurations. Fix mapping strategies for consistency. #deploy-test-dolly-backend --- .../sykemelding/SykemeldingClient.java | 167 ++++++++++-------- .../sykemelding/SykemeldingConsumer.java | 17 +- .../sykemelding/TsmSykemeldingConsumer.java | 61 +++++++ .../command/TsmSykemeldingPostCommand.java | 28 ++- .../domain/TsmSykemeldingRequest.java | 164 ++--------------- .../dto/NySykemeldingResponse.java | 17 ++ .../mapper/SykemeldingMappingStrategy.java | 33 ++-- .../resultset/sykemelding/RsSykemelding.java | 46 ++++- .../src/main/resources/application-local.yml | 4 +- .../src/main/resources/application.yml | 4 +- 10 files changed, 259 insertions(+), 282 deletions(-) create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/TsmSykemeldingConsumer.java create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/dto/NySykemeldingResponse.java diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java index 2b8aef80d51..44d129f3206 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.v3.core.util.Json; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import ma.glasnost.orika.MapperFacade; @@ -9,6 +10,8 @@ import no.nav.dolly.bestilling.ClientRegister; import no.nav.dolly.bestilling.personservice.PersonServiceConsumer; import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest; +import no.nav.dolly.bestilling.sykemelding.domain.TsmSykemeldingRequest; +import no.nav.dolly.bestilling.sykemelding.dto.NySykemeldingResponse; import no.nav.dolly.bestilling.sykemelding.dto.SykemeldingResponse; import no.nav.dolly.config.ApplicationConfig; import no.nav.dolly.consumer.kodeverk.KodeverkConsumer; @@ -21,8 +24,8 @@ import no.nav.dolly.domain.resultset.dolly.DollyPerson; import no.nav.dolly.domain.resultset.sykemelding.RsSykemelding; import no.nav.dolly.errorhandling.ErrorStatusDecoder; -import no.nav.dolly.service.TransaksjonMappingService; import no.nav.dolly.service.TransactionHelperService; +import no.nav.dolly.service.TransaksjonMappingService; import no.nav.testnav.libs.reactivecore.web.WebClientError; import org.apache.commons.lang3.BooleanUtils; import org.springframework.stereotype.Service; @@ -32,9 +35,9 @@ import java.time.Duration; import java.time.LocalDateTime; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; +import static java.util.Objects.isNull; import static java.util.Objects.nonNull; import static no.nav.dolly.domain.resultset.SystemTyper.SYKEMELDING; import static no.nav.dolly.errorhandling.ErrorStatusDecoder.encodeStatus; @@ -47,6 +50,7 @@ public class SykemeldingClient implements ClientRegister { private final SykemeldingConsumer sykemeldingConsumer; + private final TsmSykemeldingConsumer tsmSykemeldingConsumer; private final ErrorStatusDecoder errorStatusDecoder; private final TransaksjonMappingService transaksjonMappingService; private final MapperFacade mapperFacade; @@ -58,134 +62,159 @@ public class SykemeldingClient implements ClientRegister { private final ApplicationConfig applicationConfig; @Override - public Mono gjenopprett(RsDollyUtvidetBestilling bestilling, DollyPerson dollyPerson, BestillingProgress progress, boolean isOpprettEndre) { - - return Mono.just(bestilling) - .filter(bestillling -> nonNull(bestillling.getSykemelding())) - .map(RsDollyUtvidetBestilling::getSykemelding) - .flatMap(sykemelding -> transaksjonMappingService.existAlready(SYKEMELDING, dollyPerson.getIdent(), null, bestilling.getId()) - .flatMap(exists -> { - - if (BooleanUtils.isTrue(exists) && !isOpprettEndre) { - return setProgress(progress, "OK"); - - } else { - return setProgress(progress, getGenereringStartet()) - .then(getPerson(dollyPerson.getIdent()) - .flatMap(persondata -> - postDetaljertSykemelding(sykemelding, persondata) - .filter(Objects::nonNull) - .flatMap(status -> saveTransaksjonId(status, bestilling.getId()) - .thenReturn(status)) - .map(this::getStatus)) - .timeout(Duration.ofSeconds(applicationConfig.getClientTimeout())) - .onErrorResume(error -> Mono.just(encodeStatus(WebClientError.describe(error).getMessage()))) - .collect(Collectors.joining()) - .flatMap(status -> oppdaterStatus(progress, status))); - } - })); - } + public Mono gjenopprett(RsDollyUtvidetBestilling bestilling, + DollyPerson dollyPerson, + BestillingProgress progress, + boolean isOpprettEndre) { - private Mono oppdaterStatus(BestillingProgress progress, String status) { + RsSykemelding sykemelding = bestilling.getSykemelding(); - return transactionHelperService.persister(progress, BestillingProgress::getSykemeldingStatus, - BestillingProgress::setSykemeldingStatus, status); + if (isNull(sykemelding)) { + return Mono.just(progress); + } + + if (sykemelding.hasNySykemelding()) { + var nySykemelding = sykemelding.getNySykemelding(); + return setProgress(progress, getGenereringStartet()) + .then(postNySykemelding(nySykemelding, dollyPerson.getIdent()) + .map(this::getStatus) + .timeout(Duration.ofSeconds(applicationConfig.getClientTimeout())) + .onErrorResume(error -> + Mono.just(encodeStatus(WebClientError.describe(error).getMessage())))) + .flatMap(status -> oppdaterStatus(progress, status)); + } + + if (sykemelding.hasDetaljertSykemelding()) { + + return transaksjonMappingService.existAlready( + SYKEMELDING, dollyPerson.getIdent(), null, bestilling.getId()) + .flatMap(exists -> { + if (BooleanUtils.isTrue(exists) && !isOpprettEndre) { + return setProgress(progress, "OK"); + } + return setProgress(progress, getGenereringStartet()) + .then(getPerson(dollyPerson.getIdent()) + .flatMap(persondata -> + postDetaljertSykemelding(sykemelding, persondata) + .flatMap(resp -> saveTransaksjonId(resp, bestilling.getId()) + .thenReturn(resp)) + .map(this::getStatus)) + .timeout(Duration.ofSeconds(applicationConfig.getClientTimeout())) + .onErrorResume(error -> + Mono.just(encodeStatus(WebClientError.describe(error).getMessage()))) + .collect(Collectors.joining())) + .flatMap(status -> oppdaterStatus(progress, status)); + }); + } + return Mono.just(progress); } @Override public void release(List identer) { + // TODO: slette fra TSM + } - // Sletting er ikke støttet + private Mono oppdaterStatus(BestillingProgress progress, String status) { + return transactionHelperService.persister( + progress, + BestillingProgress::getSykemeldingStatus, + BestillingProgress::setSykemeldingStatus, + status); } private String getStatus(SykemeldingResponse status) { - log.info("Sykemelding response for {} mottatt, status: {}", status.getIdent(), status.getStatus()); - return status.getStatus().is2xxSuccessful() ? "OK" : - errorStatusDecoder.getErrorText(status.getStatus(), status.getAvvik()); + return status.getStatus().is2xxSuccessful() + ? "DetaljertSykemelding:OK" + : errorStatusDecoder.getErrorText(status.getStatus(), status.getAvvik()); } - private Mono setProgress(BestillingProgress progress, String status) { + private String getStatus(NySykemeldingResponse status) { + log.info("Ny sykemelding response for {} mottatt, {}", status.ident(), Json.pretty(status)); + return isNull(status.error()) + ? "NySykemelding:OK" + : status.error(); + } - return transactionHelperService.persister(progress, BestillingProgress::getSykemeldingStatus, - BestillingProgress::setSykemeldingStatus, status); + private Mono setProgress(BestillingProgress progress, String status) { + return transactionHelperService.persister( + progress, + BestillingProgress::getSykemeldingStatus, + BestillingProgress::setSykemeldingStatus, + status); } private Flux getPerson(String ident) { - return personServiceConsumer.getPdlPersoner(List.of(ident)) .filter(pdlPersonBolk -> nonNull(pdlPersonBolk.getData())) .map(PdlPersonBolk::getData); } private Mono getNorgenhet(PdlPersonBolk.Data persondata) { - var geografiskOmrade = persondata.getHentGeografiskTilknytningBolk().stream() .map(PdlPersonBolk.GeografiskTilknytningBolk::getGeografiskTilknytning) - .map(geografiskTilknytning -> nonNull(geografiskTilknytning) && - isNotBlank(geografiskTilknytning.getGtType()) ? - switch (geografiskTilknytning.getGtType()) { - case "KOMMUNE" -> geografiskTilknytning.getGtKommune(); - case "BYDEL" -> geografiskTilknytning.getGtBydel(); + .map(gt -> nonNull(gt) && isNotBlank(gt.getGtType()) ? + switch (gt.getGtType()) { + case "KOMMUNE" -> gt.getGtKommune(); + case "BYDEL" -> gt.getGtBydel(); default -> null; } : null) .collect(Collectors.joining()); - return isNotBlank(geografiskOmrade) ? norg2Consumer.getNorgEnhet(geografiskOmrade) : Mono.empty(); } private Mono postDetaljertSykemelding(RsSykemelding sykemelding, PdlPersonBolk.Data persondata) { - return Mono.just(sykemelding) - .filter(RsSykemelding::hasDetaljertSykemelding) .map(RsSykemelding::getDetaljertSykemelding) .flatMap(detaljert -> Mono.zip(kodeverkConsumer.getKodeverkByName("Postnummer"), getNorgenhet(persondata)) .flatMap(kodeverk -> { - - var detaljertSykemeldingRequest = - mapperFacade.map(detaljert, - DetaljertSykemeldingRequest.class); - + var req = mapperFacade.map(detaljert, DetaljertSykemeldingRequest.class); var context = new MappingContext.Factory().getContext(); context.setProperty("postnummer", kodeverk.getT1()); context.setProperty("norg2Enhet", kodeverk.getT2()); - - detaljertSykemeldingRequest.setPasient(mapperFacade.map(persondata, - DetaljertSykemeldingRequest.Pasient.class, context)); - - return sykemeldingConsumer.postDetaljertSykemelding(detaljertSykemeldingRequest); + req.setPasient(mapperFacade.map( + persondata, + DetaljertSykemeldingRequest.Pasient.class, + context)); + return sykemeldingConsumer.postDetaljertSykemelding(req); })); } - private Mono saveTransaksjonId(SykemeldingResponse sykemelding, Long bestillingId) { + private Mono postNySykemelding(RsSykemelding.RsNySykemelding rsNySykemelding, + String ident) { - if (sykemelding.getStatus().is2xxSuccessful()) { + var aktivitet = rsNySykemelding.getAktivitet().stream() + .map(a -> new TsmSykemeldingRequest.Aktivitet(a.getFom(), a.getTom())) + .collect(Collectors.toList()); - log.info("Lagrer transaksjon for {} i q1 ", sykemelding.getIdent()); + TsmSykemeldingRequest request = new TsmSykemeldingRequest(ident, aktivitet); - sykemelding.getSykemeldingRequest().setSykemeldingId(sykemelding.getMsgId()); + return tsmSykemeldingConsumer.postTsmSykemelding(request); + } + + private Mono saveTransaksjonId(SykemeldingResponse response, Long bestillingId) { + if (response.getStatus().is2xxSuccessful()) { + response.getSykemeldingRequest().setSykemeldingId(response.getMsgId()); return transaksjonMappingService.save(TransaksjonMapping.builder() - .ident(sykemelding.getIdent()) + .ident(response.getIdent()) .bestillingId(bestillingId) - .transaksjonId(toJson(sykemelding.getSykemeldingRequest())) + .transaksjonId(toJson(response.getSykemeldingRequest())) .datoEndret(LocalDateTime.now()) .system(SYKEMELDING.name()) .miljoe("q1") .build()); - } else { - return Mono.empty(); } + return Mono.empty(); } private String toJson(Object object) { - try { return objectMapper.writeValueAsString(object); } catch (JsonProcessingException e) { log.error("Feilet å konvertere transaksjonsId for sykemelding"); + return null; } - return null; } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java index caf7685202c..dab2c1279ef 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.core.util.Json; import lombok.extern.slf4j.Slf4j; -import ma.glasnost.orika.MapperFacade; import no.nav.dolly.bestilling.ConsumerStatus; import no.nav.dolly.bestilling.sykemelding.command.SyfosmreglerSykemeldingPostCommand; import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest; @@ -25,17 +24,15 @@ public class SykemeldingConsumer extends ConsumerStatus { private final WebClient webClient; private final TokenExchange tokenService; private final ServerProperties serverProperties; - private final MapperFacade mapperFacade; public SykemeldingConsumer( TokenExchange accessTokenService, Consumers consumers, ObjectMapper objectMapper, - WebClient webClient, MapperFacade mapperFacade) { + WebClient webClient) { this.tokenService = accessTokenService; serverProperties = consumers.getTestnavSykemeldingApi(); - this.mapperFacade = mapperFacade; this.webClient = webClient .mutate() .exchangeStrategies(getJacksonStrategy(objectMapper)) @@ -53,18 +50,6 @@ public Mono postDetaljertSykemelding(DetaljertSykemeldingRe token.getTokenValue()).call()); } - @Timed(name = "providers", tags = { "operation", "detaljertsykemelding_opprett" }) - public Mono postTsmSykemelding(DetaljertSykemeldingRequest detaljertSykemeldingRequest) { - - var sykemeldingRequest = mapperFacade.map(detaljertSykemeldingRequest, DetaljertSykemeldingRequest.class); - - log.info("Sykemelding sendt til tsm-input-dolly {}", Json.pretty(detaljertSykemeldingRequest)); - - return tokenService.exchange(serverProperties) - .flatMap(token -> new SyfosmreglerSykemeldingPostCommand(webClient, detaljertSykemeldingRequest, - token.getTokenValue()).call()); - } - @Override public String serviceUrl() { return serverProperties.getUrl(); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/TsmSykemeldingConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/TsmSykemeldingConsumer.java new file mode 100644 index 00000000000..33282daf8e2 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/TsmSykemeldingConsumer.java @@ -0,0 +1,61 @@ +package no.nav.dolly.bestilling.sykemelding; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.v3.core.util.Json; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.bestilling.ConsumerStatus; +import no.nav.dolly.bestilling.sykemelding.command.TsmSykemeldingPostCommand; +import no.nav.dolly.bestilling.sykemelding.domain.TsmSykemeldingRequest; +import no.nav.dolly.bestilling.sykemelding.dto.NySykemeldingResponse; +import no.nav.dolly.config.Consumers; +import no.nav.dolly.metrics.Timed; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; +import no.nav.testnav.libs.standalone.servletsecurity.exchange.TokenExchange; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import static no.nav.dolly.util.JacksonExchangeStrategyUtil.getJacksonStrategy; + +@Slf4j +@Service +public class TsmSykemeldingConsumer extends ConsumerStatus { + + private final WebClient webClient; + private final TokenExchange tokenService; + private final ServerProperties serverProperties; + + public TsmSykemeldingConsumer( + TokenExchange accessTokenService, + Consumers consumers, + ObjectMapper objectMapper, + WebClient webClient) { + + this.tokenService = accessTokenService; + serverProperties = consumers.getTestnavSykemeldingProxy(); + this.webClient = webClient + .mutate() + .exchangeStrategies(getJacksonStrategy(objectMapper)) + .baseUrl(serverProperties.getUrl()) + .build(); + } + + @Timed(name = "providers", tags = { "operation", "nysykemelding_opprett" }) + public Mono postTsmSykemelding(TsmSykemeldingRequest tsmSykemeldingRequest) { + + log.info("Sykemelding sendt til tsm-input-dolly {}", Json.pretty(tsmSykemeldingRequest)); + + return tokenService.exchange(serverProperties) + .flatMap(token -> new TsmSykemeldingPostCommand(webClient, tsmSykemeldingRequest, token.getTokenValue()).call()); + } + + @Override + public String serviceUrl() { + return serverProperties.getUrl(); + } + + @Override + public String consumerName() { + return "testnav-sykemelding-proxy"; + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingPostCommand.java index 66ee755b0ad..fdcf856562e 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingPostCommand.java @@ -2,9 +2,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest; -import no.nav.dolly.bestilling.sykemelding.dto.SykemeldingResponse; -import no.nav.testnav.libs.dto.sykemelding.v1.SykemeldingResponseDTO; +import no.nav.dolly.bestilling.sykemelding.domain.TsmSykemeldingRequest; +import no.nav.dolly.bestilling.sykemelding.dto.NySykemeldingResponse; import no.nav.testnav.libs.reactivecore.web.WebClientError; import no.nav.testnav.libs.reactivecore.web.WebClientHeader; import org.springframework.web.reactive.function.client.WebClient; @@ -14,32 +13,25 @@ @RequiredArgsConstructor @Slf4j -public class TsmSykemeldingPostCommand implements Callable> { +public class TsmSykemeldingPostCommand implements Callable> { - private static final String DETALJERT_SYKEMELDING_URL = "/api/v1/sykemeldinger"; + private static final String TSM_SYKEMELDING_URL = "/tsm/api/sykmelding"; private final WebClient webClient; - private final DetaljertSykemeldingRequest request; + private final TsmSykemeldingRequest request; private final String token; @Override - public Mono call() { + public Mono call() { return webClient .post() - .uri(uriBuilder -> uriBuilder.path(DETALJERT_SYKEMELDING_URL).build()) + .uri(uriBuilder -> uriBuilder.path(TSM_SYKEMELDING_URL).build()) .headers(WebClientHeader.bearer(token)) .bodyValue(request) .retrieve() - .bodyToMono(SykemeldingResponseDTO.class) - .map(response -> SykemeldingResponse.builder() - .status(response.getStatus()) - .msgId(response.getSykemeldingId()) - .ident(request.getPasient().getIdent()) - .sykemeldingRequest(SykemeldingResponse.SykemeldingRequest.builder() - .detaljertSykemeldingRequest(request) - .build()) - .build()) + .bodyToMono(NySykemeldingResponse.class) .doOnError(WebClientError.logTo(log)) - .onErrorResume(error -> SykemeldingResponse.of(WebClientError.describe(error), request.getPasient().getIdent())); + .onErrorResume(error -> Mono.just(new NySykemeldingResponse(error.getMessage(), "NA", null, request.getIdent()))); + } } \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/TsmSykemeldingRequest.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/TsmSykemeldingRequest.java index aec763c4962..110425d97fa 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/TsmSykemeldingRequest.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/TsmSykemeldingRequest.java @@ -1,175 +1,31 @@ package no.nav.dolly.bestilling.sykemelding.domain; -import com.fasterxml.jackson.annotation.JsonInclude; import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import java.time.LocalDate; -import java.util.ArrayList; import java.util.List; -import static java.util.Objects.isNull; - -@Data +@Getter +@Setter @Builder @NoArgsConstructor @AllArgsConstructor -@JsonInclude(value = JsonInclude.Include.NON_EMPTY) public class TsmSykemeldingRequest { - private Arbeidsgiver arbeidsgiver; - private DollyDiagnose hovedDiagnose; - private List biDiagnoser; - private Detaljer detaljer; - private Helsepersonell helsepersonell; - private Boolean manglendeTilretteleggingPaaArbeidsplassen; - private Organisasjon mottaker; - private Pasient pasient; - private List perioder; - private Organisasjon sender; - private LocalDate startDato; - private Boolean umiddelbarBistand; - private KontaktMedPasient kontaktMedPasient; - - public List getBiDiagnoser() { - if (isNull(biDiagnoser)) { - biDiagnoser = new ArrayList<>(); - } - return biDiagnoser; - } - - public List getPerioder() { - if (isNull(perioder)) { - perioder = new ArrayList<>(); - } - return perioder; - } - - public enum AktivitetType { - - INGEN, AVVENTENDE - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @JsonInclude(value = JsonInclude.Include.NON_EMPTY) - public static class Arbeidsgiver { - private String navn; - private Double stillingsprosent; - private String yrkesbetegnelse; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @JsonInclude(value = JsonInclude.Include.NON_EMPTY) - public static class DollyDiagnose { - private String diagnose; - private String diagnosekode; - private String system; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @JsonInclude(value = JsonInclude.Include.NON_EMPTY) - public static class Detaljer { - private Boolean arbeidsforEtterEndtPeriode; - private String beskrivHensynArbeidsplassen; - private String tiltakArbeidsplass; - private String tiltakNav; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @JsonInclude(value = JsonInclude.Include.NON_EMPTY) - public static class Helsepersonell { - private String etternavn; - private String fornavn; - private String hprId; - private String ident; - private String mellomnavn; - private String samhandlerType; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @JsonInclude(value = JsonInclude.Include.NON_EMPTY) - public static class Organisasjon { - private Adresse adresse; - private String navn; - private String orgNr; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @JsonInclude(value = JsonInclude.Include.NON_EMPTY) - public static class Pasient { - private Adresse adresse; - private String etternavn; - private LocalDate foedselsdato; - private String fornavn; - private String ident; - private String mellomnavn; - private String navKontor; - private String telefon; - } + private String ident; + private List aktivitet; - @Data + @Getter + @Setter @Builder @NoArgsConstructor @AllArgsConstructor - @JsonInclude(value = JsonInclude.Include.NON_EMPTY) - public static class Periode { - private DollyAktivitet aktivitet; + public static class Aktivitet { private LocalDate fom; private LocalDate tom; } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @JsonInclude(value = JsonInclude.Include.NON_EMPTY) - public static class DollyAktivitet { - - private AktivitetType aktivitet; - private Integer behandlingsdager; - private Integer grad; - private Boolean reisetilskudd; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @JsonInclude(value = JsonInclude.Include.NON_EMPTY) - public static class Adresse { - private String by; - private String gate; - private String land; - private String postnummer; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @JsonInclude(value = JsonInclude.Include.NON_EMPTY) - public static class KontaktMedPasient { - private LocalDate kontaktDato; - private String begrunnelseIkkeKontakt; - } -} \ No newline at end of file +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/dto/NySykemeldingResponse.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/dto/NySykemeldingResponse.java new file mode 100644 index 00000000000..002f8382123 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/dto/NySykemeldingResponse.java @@ -0,0 +1,17 @@ +package no.nav.dolly.bestilling.sykemelding.dto; + +import java.time.LocalDate; +import java.util.List; + +public record NySykemeldingResponse( + String error, + String sykmeldingId, + List aktivitet, + String ident +) { + public record Aktivitet( + LocalDate fom, + LocalDate tom + ) { + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/mapper/SykemeldingMappingStrategy.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/mapper/SykemeldingMappingStrategy.java index f57e82bedd2..1ae7fae5b01 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/mapper/SykemeldingMappingStrategy.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/mapper/SykemeldingMappingStrategy.java @@ -32,8 +32,9 @@ public void register(MapperFactory factory) { factory.classMap(RsDetaljertSykemelding.class, DetaljertSykemeldingRequest.class) .customize(new CustomMapper<>() { @Override - public void mapAtoB(RsDetaljertSykemelding rsSykemelding, DetaljertSykemeldingRequest request, MappingContext context) { - + public void mapAtoB(RsDetaljertSykemelding rsSykemelding, + DetaljertSykemeldingRequest request, + MappingContext context) { request.setSender(nonNull(request.getSender()) ? request.getSender() : Organisasjon.builder() @@ -46,7 +47,6 @@ public void mapAtoB(RsDetaljertSykemelding rsSykemelding, DetaljertSykemeldingRe .navn("Mini-Norge Legekontor") .orgNr("992741090") .build()); - if (isNull(rsSykemelding.getDetaljer())) { request.setDetaljer(DetaljertSykemeldingRequest.Detaljer.builder() .arbeidsforEtterEndtPeriode(true) @@ -59,16 +59,13 @@ public void mapAtoB(RsDetaljertSykemelding rsSykemelding, DetaljertSykemeldingRe factory.classMap(PdlPersonBolk.Data.class, Pasient.class) .customize(new CustomMapper<>() { - @Override public void mapAtoB(PdlPersonBolk.Data persondata, Pasient pasient, MappingContext context) { - var person = persondata.getHentPersonBolk().stream() .filter(personBolk -> nonNull(personBolk.getPerson())) .findFirst().orElse(PdlPersonBolk.PersonBolk.builder() .person(new PdlPerson.Person()) .build()); - pasient.setIdent(person.getIdent()); mapperFacade.map(person.getPerson().getNavn().stream() .findFirst().orElse(new PdlPerson.Navn()), pasient); @@ -77,14 +74,12 @@ public void mapAtoB(PdlPersonBolk.Data persondata, Pasient pasient, MappingConte pasient.setFoedselsdato(person.getPerson().getFoedselsdato().stream() .map(PdlPerson.Foedselsdato::getFoedselsdato) .findFirst().orElse(null)); - pasient.setTelefon(person.getPerson().getTelefonnummer().stream() .filter(telefonnummer -> telefonnummer.getPrioritet() == 1) .map(telefonnummer -> String.format("%s %s", telefonnummer.getLandskode(), telefonnummer.getNummer())) .findFirst().orElse(null)); - var norg2enhet = (Norg2EnhetResponse) context.getProperty("norg2Enhet"); pasient.setNavKontor(nonNull(norg2enhet) ? norg2enhet.getEnhetNr() : null); } @@ -93,27 +88,23 @@ public void mapAtoB(PdlPersonBolk.Data persondata, Pasient pasient, MappingConte factory.classMap(BostedadresseDTO.class, Adresse.class) .customize(new CustomMapper<>() { - @Override - public void mapAtoB(BostedadresseDTO kilde, Adresse destinasjon, MappingContext context) { - + public void mapAtoB(BostedadresseDTO kilde, Adresse dest, MappingContext context) { var postnummere = (Map) context.getProperty("postnummer"); - if (nonNull(kilde.getVegadresse())) { - destinasjon.setPostnummer(kilde.getVegadresse().getPostnummer()); - destinasjon.setBy(postnummere.get(kilde.getVegadresse().getPostnummer())); - destinasjon.setGate(Stream.of(kilde.getVegadresse().getAdressenavn(), + dest.setPostnummer(kilde.getVegadresse().getPostnummer()); + dest.setBy(postnummere.get(kilde.getVegadresse().getPostnummer())); + dest.setGate(Stream.of(kilde.getVegadresse().getAdressenavn(), kilde.getVegadresse().getHusnummer(), kilde.getVegadresse().getHusbokstav()) .filter(StringUtils::isNotBlank) .collect(Collectors.joining(" "))); - destinasjon.setLand("NOR"); - + dest.setLand("NOR"); } else if (nonNull(kilde.getUtenlandskAdresse())) { - destinasjon.setPostnummer(kilde.getUtenlandskAdresse().getPostkode()); - destinasjon.setBy(kilde.getUtenlandskAdresse().getBySted()); - destinasjon.setGate(kilde.getUtenlandskAdresse().getAdressenavnNummer()); - destinasjon.setLand(kilde.getUtenlandskAdresse().getLandkode()); + dest.setPostnummer(kilde.getUtenlandskAdresse().getPostkode()); + dest.setBy(kilde.getUtenlandskAdresse().getBySted()); + dest.setGate(kilde.getUtenlandskAdresse().getAdressenavnNummer()); + dest.setLand(kilde.getUtenlandskAdresse().getLandkode()); } } }) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/sykemelding/RsSykemelding.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/sykemelding/RsSykemelding.java index b778230dfed..b3c06d7f595 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/sykemelding/RsSykemelding.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/sykemelding/RsSykemelding.java @@ -2,7 +2,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.springframework.data.elasticsearch.annotations.DateFormat; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; @@ -23,6 +27,7 @@ public class RsSykemelding { private RsDetaljertSykemelding detaljertSykemelding; + private RsNySykemelding nySykemelding; @JsonIgnore public boolean hasDetaljertSykemelding() { @@ -30,6 +35,45 @@ public boolean hasDetaljertSykemelding() { return nonNull(detaljertSykemelding); } + @JsonIgnore + public boolean hasNySykemelding() { + + return nonNull(nySykemelding); + } + + @Getter + @Setter + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(JsonInclude.Include.NON_EMPTY) + public static class RsNySykemelding { + + private List aktivitet; + + public List getAktivitet() { + if (isNull(aktivitet)) { + aktivitet = new ArrayList<>(); + } + return aktivitet; + } + + @Getter + @Setter + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(JsonInclude.Include.NON_EMPTY) + public static class Aktivitet { + + @Field(type = FieldType.Date, format = DateFormat.basic_date, pattern = "uuuu-MM-dd") + private LocalDate fom; + + @Field(type = FieldType.Date, format = DateFormat.basic_date, pattern = "uuuu-MM-dd") + private LocalDate tom; + } + } + @Getter @Setter @Builder diff --git a/apps/dolly-backend/src/main/resources/application-local.yml b/apps/dolly-backend/src/main/resources/application-local.yml index b52caa69313..a948f97c6d8 100644 --- a/apps/dolly-backend/src/main/resources/application-local.yml +++ b/apps/dolly-backend/src/main/resources/application-local.yml @@ -67,4 +67,6 @@ consumers: etterlatte: url: https://etterlatte-testdata.intern.dev.nav.no nom-proxy: - url: https://testnav-nom-proxy.intern.dev.nav.no \ No newline at end of file + url: https://testnav-nom-proxy.intern.dev.nav.no + testnav-sykemelding-proxy: + url: https://testnav-sykemelding-proxy.intern.dev.nav.no diff --git a/apps/dolly-backend/src/main/resources/application.yml b/apps/dolly-backend/src/main/resources/application.yml index 7b77c9ba2b6..7ce3a97b61c 100644 --- a/apps/dolly-backend/src/main/resources/application.yml +++ b/apps/dolly-backend/src/main/resources/application.yml @@ -38,7 +38,7 @@ spring: resourceserver: aad: issuer-uri: ${AZURE_OPENID_CONFIG_ISSUER} - accepted-audience: ${AZURE_APP_CLIENT_ID}, api:// ${AZURE_APP_CLIENT_ID} + accepted-audience: ${AZURE_APP_CLIENT_ID}, api:// ${AZURE_APP_CLIENT_ID} jackson: parser: include-source-in-location: true @@ -192,7 +192,7 @@ consumers: testnav-sykemelding-proxy: name: testnav-sykemelding-proxy namespace: dolly - url: https://testnav-sykemelding-proxy.dev-fss-pub.nais.io + url: http://testnav-sykemelding-proxy.dolly.svc.cluster.local cluster: dev-gcp testnav-kontoregister-person-proxy: name: testnav-kontoregister-person-proxy From ff3509653e805554777213f84ebd65baeaeef579 Mon Sep 17 00:00:00 2001 From: stigus Date: Wed, 24 Sep 2025 13:48:45 +0200 Subject: [PATCH 08/20] Add TSM sykemelding delete command and integrate deletion logic in SykemeldingClient. Refactor TsmSykemeldingConsumer to support delete operations. #deploy-test-dolly-backend --- .../sykemelding/SykemeldingClient.java | 4 ++- .../sykemelding/TsmSykemeldingConsumer.java | 10 ++++++ .../command/TsmSykemeldingDeleteCommand.java | 32 +++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingDeleteCommand.java diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java index 44d129f3206..a70da42b645 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java @@ -111,7 +111,9 @@ public Mono gjenopprett(RsDollyUtvidetBestilling bestilling, @Override public void release(List identer) { - // TODO: slette fra TSM + identer.forEach(ident -> tsmSykemeldingConsumer.deleteTsmSykemeldinger(ident) + .doOnError(WebClientError.logTo(log)) + .subscribe()); } private Mono oppdaterStatus(BestillingProgress progress, String status) { diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/TsmSykemeldingConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/TsmSykemeldingConsumer.java index 33282daf8e2..7197bea8996 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/TsmSykemeldingConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/TsmSykemeldingConsumer.java @@ -4,6 +4,7 @@ import io.swagger.v3.core.util.Json; import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.ConsumerStatus; +import no.nav.dolly.bestilling.sykemelding.command.TsmSykemeldingDeleteCommand; import no.nav.dolly.bestilling.sykemelding.command.TsmSykemeldingPostCommand; import no.nav.dolly.bestilling.sykemelding.domain.TsmSykemeldingRequest; import no.nav.dolly.bestilling.sykemelding.dto.NySykemeldingResponse; @@ -49,6 +50,15 @@ public Mono postTsmSykemelding(TsmSykemeldingRequest tsmS .flatMap(token -> new TsmSykemeldingPostCommand(webClient, tsmSykemeldingRequest, token.getTokenValue()).call()); } + @Timed(name = "providers", tags = { "operation", "nysykemelding_delete" }) + public Mono deleteTsmSykemeldinger(String ident) { + + log.info("Sletter sykemeldinger i tsm for ident: {}", ident); + + return tokenService.exchange(serverProperties) + .flatMap(token -> new TsmSykemeldingDeleteCommand(webClient, ident, token.getTokenValue()).call()); + } + @Override public String serviceUrl() { return serverProperties.getUrl(); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingDeleteCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingDeleteCommand.java new file mode 100644 index 00000000000..e5b8fca5492 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingDeleteCommand.java @@ -0,0 +1,32 @@ +package no.nav.dolly.bestilling.sykemelding.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.libs.reactivecore.web.WebClientHeader; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.concurrent.Callable; + +@RequiredArgsConstructor +@Slf4j +public class TsmSykemeldingDeleteCommand implements Callable> { + + private static final String TSM_SYKEMELDING_URL = "/tsm/api/sykmelding/ident"; + + private final WebClient webClient; + private final String ident; + private final String token; + + @Override + public Mono call() { + return webClient + .delete() + .uri(uriBuilder -> uriBuilder.path(TSM_SYKEMELDING_URL).build()) + .headers(WebClientHeader.bearer(token)) + .header("X-ident", ident) + .retrieve() + .bodyToMono(Void.class) + .doOnSuccess(response -> log.info("Slettet sykemeldinger i tsm for ident: {}", ident)); + } +} \ No newline at end of file From 9c2a9afabef5e644d0fccd72ceb70fff642c3acb Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 08:51:08 +0200 Subject: [PATCH 09/20] Deploy backend test #deploy-test-dolly-backend --- .../main/java/no/nav/dolly/DollyBackendApplicationStarter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java b/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java index 49a646b9734..bc4c91d31b3 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/DollyBackendApplicationStarter.java @@ -12,4 +12,4 @@ public static void main(String[] args) { .initializers(new NaisEnvironmentApplicationContextInitializer()) .run(args); } -} +} \ No newline at end of file From e3e7089804f85eb811de575b6fcfd106d7ffc25a Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 10:03:33 +0200 Subject: [PATCH 10/20] Fix missing newline at EOF in SykemeldingProxyApplicationStarter. #deploy-proxy-sykemelding --- .../sykemeldingproxy/SykemeldingProxyApplicationStarter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/SykemeldingProxyApplicationStarter.java b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/SykemeldingProxyApplicationStarter.java index 3268d54611a..e9243d5ba70 100644 --- a/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/SykemeldingProxyApplicationStarter.java +++ b/proxies/sykemelding-proxy/src/main/java/no/nav/testnav/proxies/sykemeldingproxy/SykemeldingProxyApplicationStarter.java @@ -14,4 +14,4 @@ public static void main(String[] args) { .initializers(new NaisEnvironmentApplicationContextInitializer()) .run(args); } -} +} \ No newline at end of file From 28aff41f12554ed10b5760ef38415b6f0da18cf6 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 10:06:13 +0200 Subject: [PATCH 11/20] Add reordered proxy rules for sykemelding and other services in config files #deploy-test-dolly-backend --- apps/dolly-backend/config.test.yml | 10 +++++----- apps/dolly-backend/config.yml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/dolly-backend/config.test.yml b/apps/dolly-backend/config.test.yml index 62f0b2cbf27..84159bdfc80 100644 --- a/apps/dolly-backend/config.test.yml +++ b/apps/dolly-backend/config.test.yml @@ -28,15 +28,12 @@ spec: outbound: rules: - application: generer-navn-service - - application: testnav-arbeidsplassencv-proxy - - application: testnav-arbeidssoekerregisteret-proxy - application: testnav-bruker-service-dev - application: testnav-inntektsmelding-service - application: testnav-kodeverk-service - application: testnav-miljoer-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service - - application: testnav-nom-proxy - application: testnav-pdl-forvalter-dev - application: testnav-person-service - application: testnav-skattekort-service @@ -45,12 +42,16 @@ spec: - application: testnav-synt-sykemelding-api - application: testnav-synt-sykemelding-api-dev - application: testnav-tps-messaging-service - - application: testnav-yrkesskade-proxy - application: testnorge-profil-api-dev - application: etterlatte-testdata namespace: etterlatte - application: logging namespace: nais-system + - application: testnav-yrkesskade-proxy + - application: testnav-nom-proxy + - application: testnav-sykemelding-proxy + - application: testnav-arbeidsplassencv-proxy + - application: testnav-arbeidssoekerregisteret-proxy external: - host: testnav-arena-forvalteren-proxy.dev-fss-pub.nais.io - host: testnav-brregstub-proxy.dev-fss-pub.nais.io @@ -66,7 +67,6 @@ spec: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-saf-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io - - host: testnav-sykemelding-proxy.dev-fss-pub.nais.io - host: testnav-skjermingsregister-proxy.dev-fss-pub.nais.io - host: testnav-udistub-proxy.dev-fss-pub.nais.io webproxy: true diff --git a/apps/dolly-backend/config.yml b/apps/dolly-backend/config.yml index d66f263e882..89b559c2645 100644 --- a/apps/dolly-backend/config.yml +++ b/apps/dolly-backend/config.yml @@ -28,27 +28,28 @@ spec: outbound: rules: - application: generer-navn-service - - application: testnav-arbeidsplassencv-proxy - - application: testnav-arbeidssoekerregisteret-proxy - application: testnav-bruker-service - application: testnav-inntektsmelding-service - application: testnav-kodeverk-service - application: testnav-miljoer-service - application: testnav-organisasjon-forvalter - application: testnav-organisasjon-service - - application: testnav-nom-proxy - application: testnav-pdl-forvalter - application: testnav-person-service - application: testnav-skattekort-service - application: testnav-sykemelding-api - application: testnav-synt-sykemelding-api - application: testnav-tps-messaging-service - - application: testnav-yrkesskade-proxy - application: testnorge-profil-api - application: etterlatte-testdata namespace: etterlatte - application: logging namespace: nais-system + - application: testnav-yrkesskade-proxy + - application: testnav-nom-proxy + - application: testnav-arbeidsplassencv-proxy + - application: testnav-arbeidssoekerregisteret-proxy + - application: testnav-sykemelding-proxy external: - host: testnav-arena-forvalteren-proxy.dev-fss-pub.nais.io - host: testnav-brregstub-proxy.dev-fss-pub.nais.io @@ -64,7 +65,6 @@ spec: - host: testnav-pensjon-testdata-facade-proxy.dev-fss-pub.nais.io - host: testnav-saf-proxy.dev-fss-pub.nais.io - host: testnav-sigrunstub-proxy.dev-fss-pub.nais.io - - host: testnav-sykemelding-proxy.dev-fss-pub.nais.io - host: testnav-skjermingsregister-proxy.dev-fss-pub.nais.io - host: testnav-udistub-proxy.dev-fss-pub.nais.io webproxy: true From 1466f6b8d6114d99e8cd4126ec35e45cae565ebc Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 10:14:38 +0200 Subject: [PATCH 12/20] Simplify status messages in SykemeldingClient by removing redundant prefixes. #deploy-test-dolly-backend --- .../nav/dolly/bestilling/sykemelding/SykemeldingClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java index a70da42b645..9d105626be5 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java @@ -127,14 +127,14 @@ private Mono oppdaterStatus(BestillingProgress progress, Str private String getStatus(SykemeldingResponse status) { log.info("Sykemelding response for {} mottatt, status: {}", status.getIdent(), status.getStatus()); return status.getStatus().is2xxSuccessful() - ? "DetaljertSykemelding:OK" + ? "OK" : errorStatusDecoder.getErrorText(status.getStatus(), status.getAvvik()); } private String getStatus(NySykemeldingResponse status) { log.info("Ny sykemelding response for {} mottatt, {}", status.ident(), Json.pretty(status)); return isNull(status.error()) - ? "NySykemelding:OK" + ? "OK" : status.error(); } From 8d6aed297386c65809f803eb4f957eb2d2fa92e6 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 12:44:11 +0200 Subject: [PATCH 13/20] Refactor Sykemelding classes and logic: replace `TsmSykemelding` with `NySykemelding`, update DTO naming conventions, and simplify related methods. #deploy-test-dolly-backend --- ...nsumer.java => NySykemeldingConsumer.java} | 22 ++++++------ .../sykemelding/SykemeldingClient.java | 36 +++++++++---------- .../sykemelding/SykemeldingConsumer.java | 12 +++---- ...jertSykemeldingValideringPostCommand.java} | 18 +++++----- ...d.java => NySykemeldingDeleteCommand.java} | 2 +- ...and.java => NySykemeldingPostCommand.java} | 14 ++++---- .../domain/SykemeldingTransaksjon.java | 18 ---------- .../DetaljertSykemeldingRequestDTO.java} | 4 +-- .../dto/DetaljertSykemeldingResponseDTO.java} | 11 +++--- .../NySykemeldingRequestDTO.java} | 4 +-- .../dto/NySykemeldingResponseDTO.java} | 4 +-- .../mapper/SykemeldingMappingStrategy.java | 14 ++++---- 12 files changed, 70 insertions(+), 89 deletions(-) rename apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/{TsmSykemeldingConsumer.java => NySykemeldingConsumer.java} (68%) rename apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/{SyfosmreglerSykemeldingPostCommand.java => DetaljertSykemeldingValideringPostCommand.java} (61%) rename apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/{TsmSykemeldingDeleteCommand.java => NySykemeldingDeleteCommand.java} (93%) rename apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/{TsmSykemeldingPostCommand.java => NySykemeldingPostCommand.java} (66%) delete mode 100644 apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/SykemeldingTransaksjon.java rename apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/{DetaljertSykemeldingRequest.java => dto/DetaljertSykemeldingRequestDTO.java} (97%) rename apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/{dto/SykemeldingResponse.java => domain/dto/DetaljertSykemeldingResponseDTO.java} (70%) rename apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/{TsmSykemeldingRequest.java => dto/NySykemeldingRequestDTO.java} (84%) rename apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/{dto/NySykemeldingResponse.java => domain/dto/NySykemeldingResponseDTO.java} (73%) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/TsmSykemeldingConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/NySykemeldingConsumer.java similarity index 68% rename from apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/TsmSykemeldingConsumer.java rename to apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/NySykemeldingConsumer.java index 7197bea8996..75b85cb998a 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/TsmSykemeldingConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/NySykemeldingConsumer.java @@ -4,10 +4,10 @@ import io.swagger.v3.core.util.Json; import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.ConsumerStatus; -import no.nav.dolly.bestilling.sykemelding.command.TsmSykemeldingDeleteCommand; -import no.nav.dolly.bestilling.sykemelding.command.TsmSykemeldingPostCommand; -import no.nav.dolly.bestilling.sykemelding.domain.TsmSykemeldingRequest; -import no.nav.dolly.bestilling.sykemelding.dto.NySykemeldingResponse; +import no.nav.dolly.bestilling.sykemelding.command.NySykemeldingDeleteCommand; +import no.nav.dolly.bestilling.sykemelding.command.NySykemeldingPostCommand; +import no.nav.dolly.bestilling.sykemelding.domain.dto.NySykemeldingRequestDTO; +import no.nav.dolly.bestilling.sykemelding.domain.dto.NySykemeldingResponseDTO; import no.nav.dolly.config.Consumers; import no.nav.dolly.metrics.Timed; import no.nav.testnav.libs.securitycore.domain.ServerProperties; @@ -20,13 +20,13 @@ @Slf4j @Service -public class TsmSykemeldingConsumer extends ConsumerStatus { +public class NySykemeldingConsumer extends ConsumerStatus { private final WebClient webClient; private final TokenExchange tokenService; private final ServerProperties serverProperties; - public TsmSykemeldingConsumer( + public NySykemeldingConsumer( TokenExchange accessTokenService, Consumers consumers, ObjectMapper objectMapper, @@ -42,21 +42,21 @@ public TsmSykemeldingConsumer( } @Timed(name = "providers", tags = { "operation", "nysykemelding_opprett" }) - public Mono postTsmSykemelding(TsmSykemeldingRequest tsmSykemeldingRequest) { + public Mono postTsmSykemelding(NySykemeldingRequestDTO nySykemeldingRequestDTO) { - log.info("Sykemelding sendt til tsm-input-dolly {}", Json.pretty(tsmSykemeldingRequest)); + log.info("Sykemelding sendt til tsm-input-dolly {}", Json.pretty(nySykemeldingRequestDTO)); return tokenService.exchange(serverProperties) - .flatMap(token -> new TsmSykemeldingPostCommand(webClient, tsmSykemeldingRequest, token.getTokenValue()).call()); + .flatMap(token -> new NySykemeldingPostCommand(webClient, nySykemeldingRequestDTO, token.getTokenValue()).call()); } @Timed(name = "providers", tags = { "operation", "nysykemelding_delete" }) public Mono deleteTsmSykemeldinger(String ident) { - log.info("Sletter sykemeldinger i tsm for ident: {}", ident); + log.info("Sletter nye sykemeldinger for ident: {}", ident); return tokenService.exchange(serverProperties) - .flatMap(token -> new TsmSykemeldingDeleteCommand(webClient, ident, token.getTokenValue()).call()); + .flatMap(token -> new NySykemeldingDeleteCommand(webClient, ident, token.getTokenValue()).call()); } @Override diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java index 9d105626be5..bd7637bebcc 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java @@ -9,10 +9,10 @@ import ma.glasnost.orika.MappingContext; import no.nav.dolly.bestilling.ClientRegister; import no.nav.dolly.bestilling.personservice.PersonServiceConsumer; -import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest; -import no.nav.dolly.bestilling.sykemelding.domain.TsmSykemeldingRequest; -import no.nav.dolly.bestilling.sykemelding.dto.NySykemeldingResponse; -import no.nav.dolly.bestilling.sykemelding.dto.SykemeldingResponse; +import no.nav.dolly.bestilling.sykemelding.domain.dto.DetaljertSykemeldingRequestDTO; +import no.nav.dolly.bestilling.sykemelding.domain.dto.DetaljertSykemeldingResponseDTO; +import no.nav.dolly.bestilling.sykemelding.domain.dto.NySykemeldingRequestDTO; +import no.nav.dolly.bestilling.sykemelding.domain.dto.NySykemeldingResponseDTO; import no.nav.dolly.config.ApplicationConfig; import no.nav.dolly.consumer.kodeverk.KodeverkConsumer; import no.nav.dolly.consumer.norg2.Norg2Consumer; @@ -50,7 +50,7 @@ public class SykemeldingClient implements ClientRegister { private final SykemeldingConsumer sykemeldingConsumer; - private final TsmSykemeldingConsumer tsmSykemeldingConsumer; + private final NySykemeldingConsumer nySykemeldingConsumer; private final ErrorStatusDecoder errorStatusDecoder; private final TransaksjonMappingService transaksjonMappingService; private final MapperFacade mapperFacade; @@ -111,7 +111,7 @@ public Mono gjenopprett(RsDollyUtvidetBestilling bestilling, @Override public void release(List identer) { - identer.forEach(ident -> tsmSykemeldingConsumer.deleteTsmSykemeldinger(ident) + identer.forEach(ident -> nySykemeldingConsumer.deleteTsmSykemeldinger(ident) .doOnError(WebClientError.logTo(log)) .subscribe()); } @@ -124,14 +124,14 @@ private Mono oppdaterStatus(BestillingProgress progress, Str status); } - private String getStatus(SykemeldingResponse status) { + private String getStatus(DetaljertSykemeldingResponseDTO status) { log.info("Sykemelding response for {} mottatt, status: {}", status.getIdent(), status.getStatus()); return status.getStatus().is2xxSuccessful() ? "OK" : errorStatusDecoder.getErrorText(status.getStatus(), status.getAvvik()); } - private String getStatus(NySykemeldingResponse status) { + private String getStatus(NySykemeldingResponseDTO status) { log.info("Ny sykemelding response for {} mottatt, {}", status.ident(), Json.pretty(status)); return isNull(status.error()) ? "OK" @@ -165,38 +165,38 @@ private Mono getNorgenhet(PdlPersonBolk.Data persondata) { return isNotBlank(geografiskOmrade) ? norg2Consumer.getNorgEnhet(geografiskOmrade) : Mono.empty(); } - private Mono postDetaljertSykemelding(RsSykemelding sykemelding, - PdlPersonBolk.Data persondata) { + private Mono postDetaljertSykemelding(RsSykemelding sykemelding, + PdlPersonBolk.Data persondata) { return Mono.just(sykemelding) .map(RsSykemelding::getDetaljertSykemelding) .flatMap(detaljert -> Mono.zip(kodeverkConsumer.getKodeverkByName("Postnummer"), getNorgenhet(persondata)) .flatMap(kodeverk -> { - var req = mapperFacade.map(detaljert, DetaljertSykemeldingRequest.class); + var req = mapperFacade.map(detaljert, DetaljertSykemeldingRequestDTO.class); var context = new MappingContext.Factory().getContext(); context.setProperty("postnummer", kodeverk.getT1()); context.setProperty("norg2Enhet", kodeverk.getT2()); req.setPasient(mapperFacade.map( persondata, - DetaljertSykemeldingRequest.Pasient.class, + DetaljertSykemeldingRequestDTO.Pasient.class, context)); return sykemeldingConsumer.postDetaljertSykemelding(req); })); } - private Mono postNySykemelding(RsSykemelding.RsNySykemelding rsNySykemelding, - String ident) { + private Mono postNySykemelding(RsSykemelding.RsNySykemelding rsNySykemelding, + String ident) { var aktivitet = rsNySykemelding.getAktivitet().stream() - .map(a -> new TsmSykemeldingRequest.Aktivitet(a.getFom(), a.getTom())) + .map(a -> new NySykemeldingRequestDTO.Aktivitet(a.getFom(), a.getTom())) .collect(Collectors.toList()); - TsmSykemeldingRequest request = new TsmSykemeldingRequest(ident, aktivitet); + NySykemeldingRequestDTO request = new NySykemeldingRequestDTO(ident, aktivitet); - return tsmSykemeldingConsumer.postTsmSykemelding(request); + return nySykemeldingConsumer.postTsmSykemelding(request); } - private Mono saveTransaksjonId(SykemeldingResponse response, Long bestillingId) { + private Mono saveTransaksjonId(DetaljertSykemeldingResponseDTO response, Long bestillingId) { if (response.getStatus().is2xxSuccessful()) { response.getSykemeldingRequest().setSykemeldingId(response.getMsgId()); return transaksjonMappingService.save(TransaksjonMapping.builder() diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java index dab2c1279ef..d9dd812b1f0 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingConsumer.java @@ -4,9 +4,9 @@ import io.swagger.v3.core.util.Json; import lombok.extern.slf4j.Slf4j; import no.nav.dolly.bestilling.ConsumerStatus; -import no.nav.dolly.bestilling.sykemelding.command.SyfosmreglerSykemeldingPostCommand; -import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest; -import no.nav.dolly.bestilling.sykemelding.dto.SykemeldingResponse; +import no.nav.dolly.bestilling.sykemelding.command.DetaljertSykemeldingValideringPostCommand; +import no.nav.dolly.bestilling.sykemelding.domain.dto.DetaljertSykemeldingRequestDTO; +import no.nav.dolly.bestilling.sykemelding.domain.dto.DetaljertSykemeldingResponseDTO; import no.nav.dolly.config.Consumers; import no.nav.dolly.metrics.Timed; import no.nav.testnav.libs.securitycore.domain.ServerProperties; @@ -41,12 +41,12 @@ public SykemeldingConsumer( } @Timed(name = "providers", tags = { "operation", "detaljertsykemelding_opprett" }) - public Mono postDetaljertSykemelding(DetaljertSykemeldingRequest detaljertSykemeldingRequest) { + public Mono postDetaljertSykemelding(DetaljertSykemeldingRequestDTO detaljertSykemeldingRequestDTO) { - log.info("Detaljert Sykemelding sendt {}", Json.pretty(detaljertSykemeldingRequest)); + log.info("Detaljert Sykemelding sendt {}", Json.pretty(detaljertSykemeldingRequestDTO)); return tokenService.exchange(serverProperties) - .flatMap(token -> new SyfosmreglerSykemeldingPostCommand(webClient, detaljertSykemeldingRequest, + .flatMap(token -> new DetaljertSykemeldingValideringPostCommand(webClient, detaljertSykemeldingRequestDTO, token.getTokenValue()).call()); } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/SyfosmreglerSykemeldingPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/DetaljertSykemeldingValideringPostCommand.java similarity index 61% rename from apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/SyfosmreglerSykemeldingPostCommand.java rename to apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/DetaljertSykemeldingValideringPostCommand.java index 152f9f8d772..9a67481014f 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/SyfosmreglerSykemeldingPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/DetaljertSykemeldingValideringPostCommand.java @@ -2,8 +2,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest; -import no.nav.dolly.bestilling.sykemelding.dto.SykemeldingResponse; +import no.nav.dolly.bestilling.sykemelding.domain.dto.DetaljertSykemeldingRequestDTO; +import no.nav.dolly.bestilling.sykemelding.domain.dto.DetaljertSykemeldingResponseDTO; import no.nav.testnav.libs.dto.sykemelding.v1.SykemeldingResponseDTO; import no.nav.testnav.libs.reactivecore.web.WebClientError; import no.nav.testnav.libs.reactivecore.web.WebClientHeader; @@ -14,16 +14,16 @@ @RequiredArgsConstructor @Slf4j -public class SyfosmreglerSykemeldingPostCommand implements Callable> { +public class DetaljertSykemeldingValideringPostCommand implements Callable> { private static final String DETALJERT_SYKEMELDING_URL = "/api/v1/sykemeldinger"; private final WebClient webClient; - private final DetaljertSykemeldingRequest request; + private final DetaljertSykemeldingRequestDTO request; private final String token; @Override - public Mono call() { + public Mono call() { return webClient .post() .uri(uriBuilder -> uriBuilder.path(DETALJERT_SYKEMELDING_URL).build()) @@ -31,15 +31,15 @@ public Mono call() { .bodyValue(request) .retrieve() .bodyToMono(SykemeldingResponseDTO.class) - .map(response -> SykemeldingResponse.builder() + .map(response -> DetaljertSykemeldingResponseDTO.builder() .status(response.getStatus()) .msgId(response.getSykemeldingId()) .ident(request.getPasient().getIdent()) - .sykemeldingRequest(SykemeldingResponse.SykemeldingRequest.builder() - .detaljertSykemeldingRequest(request) + .sykemeldingRequest(DetaljertSykemeldingResponseDTO.SykemeldingRequest.builder() + .detaljertSykemeldingRequestDTO(request) .build()) .build()) .doOnError(WebClientError.logTo(log)) - .onErrorResume(error -> SykemeldingResponse.of(WebClientError.describe(error), request.getPasient().getIdent())); + .onErrorResume(error -> DetaljertSykemeldingResponseDTO.of(WebClientError.describe(error), request.getPasient().getIdent())); } } \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingDeleteCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingDeleteCommand.java similarity index 93% rename from apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingDeleteCommand.java rename to apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingDeleteCommand.java index e5b8fca5492..fbdad150c16 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingDeleteCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingDeleteCommand.java @@ -10,7 +10,7 @@ @RequiredArgsConstructor @Slf4j -public class TsmSykemeldingDeleteCommand implements Callable> { +public class NySykemeldingDeleteCommand implements Callable> { private static final String TSM_SYKEMELDING_URL = "/tsm/api/sykmelding/ident"; diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingPostCommand.java similarity index 66% rename from apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingPostCommand.java rename to apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingPostCommand.java index fdcf856562e..92acd97d238 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/TsmSykemeldingPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingPostCommand.java @@ -2,8 +2,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.dolly.bestilling.sykemelding.domain.TsmSykemeldingRequest; -import no.nav.dolly.bestilling.sykemelding.dto.NySykemeldingResponse; +import no.nav.dolly.bestilling.sykemelding.domain.dto.NySykemeldingRequestDTO; +import no.nav.dolly.bestilling.sykemelding.domain.dto.NySykemeldingResponseDTO; import no.nav.testnav.libs.reactivecore.web.WebClientError; import no.nav.testnav.libs.reactivecore.web.WebClientHeader; import org.springframework.web.reactive.function.client.WebClient; @@ -13,25 +13,25 @@ @RequiredArgsConstructor @Slf4j -public class TsmSykemeldingPostCommand implements Callable> { +public class NySykemeldingPostCommand implements Callable> { private static final String TSM_SYKEMELDING_URL = "/tsm/api/sykmelding"; private final WebClient webClient; - private final TsmSykemeldingRequest request; + private final NySykemeldingRequestDTO request; private final String token; @Override - public Mono call() { + public Mono call() { return webClient .post() .uri(uriBuilder -> uriBuilder.path(TSM_SYKEMELDING_URL).build()) .headers(WebClientHeader.bearer(token)) .bodyValue(request) .retrieve() - .bodyToMono(NySykemeldingResponse.class) + .bodyToMono(NySykemeldingResponseDTO.class) .doOnError(WebClientError.logTo(log)) - .onErrorResume(error -> Mono.just(new NySykemeldingResponse(error.getMessage(), "NA", null, request.getIdent()))); + .onErrorResume(error -> Mono.just(new NySykemeldingResponseDTO(error.getMessage(), "NA", null, request.getIdent()))); } } \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/SykemeldingTransaksjon.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/SykemeldingTransaksjon.java deleted file mode 100644 index f2c17974079..00000000000 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/SykemeldingTransaksjon.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.nav.dolly.bestilling.sykemelding.domain; - -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@JsonInclude(value = JsonInclude.Include.NON_NULL) -public class SykemeldingTransaksjon { - - private String orgnummer; - private String arbeidsforholdId; -} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/DetaljertSykemeldingRequest.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/DetaljertSykemeldingRequestDTO.java similarity index 97% rename from apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/DetaljertSykemeldingRequest.java rename to apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/DetaljertSykemeldingRequestDTO.java index 7e1d630ebfa..a74d830cdb0 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/DetaljertSykemeldingRequest.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/DetaljertSykemeldingRequestDTO.java @@ -1,4 +1,4 @@ -package no.nav.dolly.bestilling.sykemelding.domain; +package no.nav.dolly.bestilling.sykemelding.domain.dto; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.AllArgsConstructor; @@ -17,7 +17,7 @@ @NoArgsConstructor @AllArgsConstructor @JsonInclude(value = JsonInclude.Include.NON_EMPTY) -public class DetaljertSykemeldingRequest { +public class DetaljertSykemeldingRequestDTO { private Arbeidsgiver arbeidsgiver; private DollyDiagnose hovedDiagnose; diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/dto/SykemeldingResponse.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/DetaljertSykemeldingResponseDTO.java similarity index 70% rename from apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/dto/SykemeldingResponse.java rename to apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/DetaljertSykemeldingResponseDTO.java index 72963e010b0..10e50bfac8f 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/dto/SykemeldingResponse.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/DetaljertSykemeldingResponseDTO.java @@ -1,11 +1,10 @@ -package no.nav.dolly.bestilling.sykemelding.dto; +package no.nav.dolly.bestilling.sykemelding.domain.dto; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest; import no.nav.testnav.libs.reactivecore.web.WebClientError; import org.springframework.http.HttpStatus; import reactor.core.publisher.Mono; @@ -14,7 +13,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class SykemeldingResponse { +public class DetaljertSykemeldingResponseDTO { private HttpStatus status; private String avvik; @@ -22,8 +21,8 @@ public class SykemeldingResponse { private String msgId; private String ident; - public static Mono of(WebClientError.Description description, String ident) { - return Mono.just(SykemeldingResponse + public static Mono of(WebClientError.Description description, String ident) { + return Mono.just(DetaljertSykemeldingResponseDTO .builder() .ident(ident) .status(description.getStatus()) @@ -39,6 +38,6 @@ public static Mono of(WebClientError.Description descriptio public static class SykemeldingRequest { private String sykemeldingId; - private DetaljertSykemeldingRequest detaljertSykemeldingRequest; + private DetaljertSykemeldingRequestDTO detaljertSykemeldingRequestDTO; } } diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/TsmSykemeldingRequest.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/NySykemeldingRequestDTO.java similarity index 84% rename from apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/TsmSykemeldingRequest.java rename to apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/NySykemeldingRequestDTO.java index 110425d97fa..42aec74be64 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/TsmSykemeldingRequest.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/NySykemeldingRequestDTO.java @@ -1,4 +1,4 @@ -package no.nav.dolly.bestilling.sykemelding.domain; +package no.nav.dolly.bestilling.sykemelding.domain.dto; import lombok.AllArgsConstructor; import lombok.Builder; @@ -14,7 +14,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class TsmSykemeldingRequest { +public class NySykemeldingRequestDTO { private String ident; private List aktivitet; diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/dto/NySykemeldingResponse.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/NySykemeldingResponseDTO.java similarity index 73% rename from apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/dto/NySykemeldingResponse.java rename to apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/NySykemeldingResponseDTO.java index 002f8382123..cfd40cd79ad 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/dto/NySykemeldingResponse.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/NySykemeldingResponseDTO.java @@ -1,9 +1,9 @@ -package no.nav.dolly.bestilling.sykemelding.dto; +package no.nav.dolly.bestilling.sykemelding.domain.dto; import java.time.LocalDate; import java.util.List; -public record NySykemeldingResponse( +public record NySykemeldingResponseDTO( String error, String sykmeldingId, List aktivitet, diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/mapper/SykemeldingMappingStrategy.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/mapper/SykemeldingMappingStrategy.java index 1ae7fae5b01..7bb4ff62172 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/mapper/SykemeldingMappingStrategy.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/mapper/SykemeldingMappingStrategy.java @@ -3,10 +3,10 @@ import ma.glasnost.orika.CustomMapper; import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.MappingContext; -import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest; -import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest.Adresse; -import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest.Organisasjon; -import no.nav.dolly.bestilling.sykemelding.domain.DetaljertSykemeldingRequest.Pasient; +import no.nav.dolly.bestilling.sykemelding.domain.dto.DetaljertSykemeldingRequestDTO; +import no.nav.dolly.bestilling.sykemelding.domain.dto.DetaljertSykemeldingRequestDTO.Adresse; +import no.nav.dolly.bestilling.sykemelding.domain.dto.DetaljertSykemeldingRequestDTO.Organisasjon; +import no.nav.dolly.bestilling.sykemelding.domain.dto.DetaljertSykemeldingRequestDTO.Pasient; import no.nav.dolly.consumer.norg2.dto.Norg2EnhetResponse; import no.nav.dolly.domain.PdlPerson; import no.nav.dolly.domain.PdlPersonBolk; @@ -29,11 +29,11 @@ public class SykemeldingMappingStrategy implements MappingStrategy { @Override public void register(MapperFactory factory) { - factory.classMap(RsDetaljertSykemelding.class, DetaljertSykemeldingRequest.class) + factory.classMap(RsDetaljertSykemelding.class, DetaljertSykemeldingRequestDTO.class) .customize(new CustomMapper<>() { @Override public void mapAtoB(RsDetaljertSykemelding rsSykemelding, - DetaljertSykemeldingRequest request, + DetaljertSykemeldingRequestDTO request, MappingContext context) { request.setSender(nonNull(request.getSender()) ? request.getSender() : @@ -48,7 +48,7 @@ public void mapAtoB(RsDetaljertSykemelding rsSykemelding, .orgNr("992741090") .build()); if (isNull(rsSykemelding.getDetaljer())) { - request.setDetaljer(DetaljertSykemeldingRequest.Detaljer.builder() + request.setDetaljer(DetaljertSykemeldingRequestDTO.Detaljer.builder() .arbeidsforEtterEndtPeriode(true) .build()); } From 7b1682f84e7ef24483ec2820232c8d8248e0e636 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 13:50:58 +0200 Subject: [PATCH 14/20] - Add support for "Ny Sykemelding" in Sykemelding UI and backend integration. - Implement new attributes and validation logic for "Ny Sykemelding". - Refactor existing Sykemelding logic to account for "Ny Sykemelding". - Add dynamic proxy configuration for `testnav-sykemelding-proxy`. - Update SWR hooks and components to handle new sykemelding-related data. - Modify environment-specific configuration files. #deploy-test-frontend --- apps/dolly-frontend/config.idporten.yml | 1 + apps/dolly-frontend/config.test.yml | 1 + apps/dolly-frontend/config.unstable.yml | 1 + apps/dolly-frontend/config.yml | 1 + .../web/DollyFrontendApplicationStarter.java | 1 + .../no/nav/dolly/web/config/Consumers.java | 1 + .../js/__tests__/mocks/mockServiceWorker.js | 28 +- .../src/main/js/package-lock.json | 975 +++++++++--------- .../src/main/js/proxy-routes.json | 3 + .../kriterier/BestillingKriterieMapper.tsx | 11 +- .../options/malOptions.tsx | 10 +- .../stegVelger/steg/steg1/paneler/Sykdom.tsx | 45 +- .../stegVelger/steg/steg3/Steg3.tsx | 2 +- .../fagsystem/sykdom/SykemeldingTypes.tsx | 1 + .../components/fagsystem/sykdom/form/Form.tsx | 28 +- .../fagsystem/sykdom/form/initialValues.tsx | 113 +- .../sykdom/form/partials/NySykemelding.tsx | 53 + .../fagsystem/sykdom/form/validation.tsx | 13 +- .../fagsystem/sykdom/visning/Visning.tsx | 73 +- .../visning/partials/NySykemeldingVisning.tsx | 37 + .../src/components/miljoVelger/MiljoeInfo.tsx | 10 +- .../ui/form/fieldArray/DollyFieldArray.tsx | 4 +- .../js/src/components/ui/form/formUtils.tsx | 7 +- .../ui/form/inputs/datepicker/Datepicker.tsx | 1 + .../gruppe/PersonVisning/PersonVisning.tsx | 1 + .../js/src/utils/hooks/useSykemelding.tsx | 34 +- .../src/main/resources/application-local.yml | 2 + .../src/main/resources/application.yml | 5 + 28 files changed, 821 insertions(+), 641 deletions(-) create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/NySykemelding.tsx create mode 100644 apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/partials/NySykemeldingVisning.tsx diff --git a/apps/dolly-frontend/config.idporten.yml b/apps/dolly-frontend/config.idporten.yml index 78c1737d22a..1e524033fd6 100644 --- a/apps/dolly-frontend/config.idporten.yml +++ b/apps/dolly-frontend/config.idporten.yml @@ -54,6 +54,7 @@ spec: - application: testnav-yrkesskade-proxy - application: testnav-altinn3-tilgang-proxy - application: testnav-arbeidssoekerregisteret-proxy + - application: testnav-sykemelding-proxy - application: testnav-api-oversikt-service - application: logging namespace: nais-system diff --git a/apps/dolly-frontend/config.test.yml b/apps/dolly-frontend/config.test.yml index 45ec383e98c..956200c600e 100644 --- a/apps/dolly-frontend/config.test.yml +++ b/apps/dolly-frontend/config.test.yml @@ -61,6 +61,7 @@ spec: - application: testnav-yrkesskade-proxy - application: testnav-altinn3-tilgang-service - application: testnav-arbeidssoekerregisteret-proxy + - application: testnav-sykemelding-proxy - application: testnav-api-oversikt-service - application: logging namespace: nais-system diff --git a/apps/dolly-frontend/config.unstable.yml b/apps/dolly-frontend/config.unstable.yml index fe583d9ba92..56908b2d737 100644 --- a/apps/dolly-frontend/config.unstable.yml +++ b/apps/dolly-frontend/config.unstable.yml @@ -51,6 +51,7 @@ spec: - application: testnav-yrkesskade-proxy - application: testnav-altinn3-tilgang-service - application: testnav-arbeidssoekerregisteret-proxy + - application: testnav-sykemelding-proxy - application: testnav-api-oversikt-service - application: logging namespace: nais-system diff --git a/apps/dolly-frontend/config.yml b/apps/dolly-frontend/config.yml index 8115495e37f..542e18ade5a 100644 --- a/apps/dolly-frontend/config.yml +++ b/apps/dolly-frontend/config.yml @@ -62,6 +62,7 @@ spec: - application: testnav-yrkesskade-proxy - application: testnav-altinn3-tilgang-proxy - application: testnav-arbeidssoekerregisteret-proxy + - application: testnav-sykemelding-proxy - application: testnav-api-oversikt-service - application: logging namespace: nais-system diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java index f11ca77ebfa..34a5f1f2437 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/DollyFrontendApplicationStarter.java @@ -96,6 +96,7 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { .route(createRoute(consumers.getTestnavLevendeArbeidsforholdAnsettelse(), "testnav-levende-arbeidsforhold-ansettelse")) .route(createRoute(consumers.getTestnavLevendeArbeidsforholdScheduler(), "testnav-levende-arbeidsforhold-scheduler")) .route(createRoute(consumers.getTestnavYrkesskadeProxy())) + .route(createRoute(consumers.getTestnavSykemeldingProxy())) .route(createRoute(consumers.getTestnavAltinn3TilgangService(), "testnav-altinn3-tilgang-service")) .route(createRoute(consumers.getTestnavArbeidssoekerregisteretProxy())) .route(createRoute(consumers.getTestnavApiOversiktService(), "testnav-oversikt-service")) diff --git a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java index 7c37339b490..91ee94e138d 100644 --- a/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java +++ b/apps/dolly-frontend/src/main/java/no/nav/dolly/web/config/Consumers.java @@ -66,6 +66,7 @@ public class Consumers { private ServerProperties testnavLevendeArbeidsforholdAnsettelse; private ServerProperties testnavLevendeArbeidsforholdScheduler; private ServerProperties testnavYrkesskadeProxy; + private ServerProperties testnavSykemeldingProxy; private ServerProperties testnavAltinn3TilgangService; private ServerProperties testnavArbeidssoekerregisteretProxy; private ServerProperties testnavApiOversiktService; diff --git a/apps/dolly-frontend/src/main/js/__tests__/mocks/mockServiceWorker.js b/apps/dolly-frontend/src/main/js/__tests__/mocks/mockServiceWorker.js index 7e23102e0b2..15623f1090b 100644 --- a/apps/dolly-frontend/src/main/js/__tests__/mocks/mockServiceWorker.js +++ b/apps/dolly-frontend/src/main/js/__tests__/mocks/mockServiceWorker.js @@ -7,8 +7,8 @@ * - Please do NOT modify this file. */ -const PACKAGE_VERSION = '2.11.1' -const INTEGRITY_CHECKSUM = 'f5825c521429caf22a4dd13b66e243af' +const PACKAGE_VERSION = '2.11.3' +const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() @@ -71,11 +71,6 @@ addEventListener('message', async function (event) { break } - case 'MOCK_DEACTIVATE': { - activeClientIds.delete(clientId) - break - } - case 'CLIENT_CLOSED': { activeClientIds.delete(clientId) @@ -94,6 +89,8 @@ addEventListener('message', async function (event) { }) addEventListener('fetch', function (event) { + const requestInterceptedAt = Date.now() + // Bypass navigation requests. if (event.request.mode === 'navigate') { return @@ -110,23 +107,29 @@ addEventListener('fetch', function (event) { // Bypass all requests when there are no active clients. // Prevents the self-unregistered worked from handling requests - // after it's been deleted (still remains active until the next reload). + // after it's been terminated (still remains active until the next reload). if (activeClientIds.size === 0) { return } const requestId = crypto.randomUUID() - event.respondWith(handleRequest(event, requestId)) + event.respondWith(handleRequest(event, requestId, requestInterceptedAt)) }) /** * @param {FetchEvent} event * @param {string} requestId + * @param {number} requestInterceptedAt */ -async function handleRequest(event, requestId) { +async function handleRequest(event, requestId, requestInterceptedAt) { const client = await resolveMainClient(event) const requestCloneForEvents = event.request.clone() - const response = await getResponse(event, client, requestId) + const response = await getResponse( + event, + client, + requestId, + requestInterceptedAt, + ) // Send back the response clone for the "response:*" life-cycle events. // Ensure MSW is active and ready to handle the message, otherwise @@ -204,7 +207,7 @@ async function resolveMainClient(event) { * @param {string} requestId * @returns {Promise} */ -async function getResponse(event, client, requestId) { +async function getResponse(event, client, requestId, requestInterceptedAt) { // Clone the request because it might've been already used // (i.e. its body has been read and sent to the client). const requestClone = event.request.clone() @@ -255,6 +258,7 @@ async function getResponse(event, client, requestId) { type: 'REQUEST', payload: { id: requestId, + interceptedAt: requestInterceptedAt, ...serializedRequest, }, }, diff --git a/apps/dolly-frontend/src/main/js/package-lock.json b/apps/dolly-frontend/src/main/js/package-lock.json index ee55c3b5684..83460e849d3 100644 --- a/apps/dolly-frontend/src/main/js/package-lock.json +++ b/apps/dolly-frontend/src/main/js/package-lock.json @@ -927,9 +927,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", "cpu": [ "ppc64" ], @@ -944,9 +944,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", "cpu": [ "arm" ], @@ -961,9 +961,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", "cpu": [ "arm64" ], @@ -978,9 +978,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", "cpu": [ "x64" ], @@ -995,9 +995,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", "cpu": [ "arm64" ], @@ -1012,9 +1012,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", "cpu": [ "x64" ], @@ -1029,9 +1029,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", "cpu": [ "arm64" ], @@ -1046,9 +1046,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", "cpu": [ "x64" ], @@ -1063,9 +1063,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", "cpu": [ "arm" ], @@ -1080,9 +1080,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", "cpu": [ "arm64" ], @@ -1097,9 +1097,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", "cpu": [ "ia32" ], @@ -1114,9 +1114,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", "cpu": [ "loong64" ], @@ -1131,9 +1131,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", "cpu": [ "mips64el" ], @@ -1148,9 +1148,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", "cpu": [ "ppc64" ], @@ -1165,9 +1165,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", "cpu": [ "riscv64" ], @@ -1182,9 +1182,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", "cpu": [ "s390x" ], @@ -1199,9 +1199,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", "cpu": [ "x64" ], @@ -1216,9 +1216,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", "cpu": [ "arm64" ], @@ -1233,9 +1233,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", "cpu": [ "x64" ], @@ -1250,9 +1250,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", "cpu": [ "arm64" ], @@ -1267,9 +1267,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", "cpu": [ "x64" ], @@ -1284,9 +1284,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", "cpu": [ "arm64" ], @@ -1301,9 +1301,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", "cpu": [ "x64" ], @@ -1318,9 +1318,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", "cpu": [ "arm64" ], @@ -1335,9 +1335,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", "cpu": [ "ia32" ], @@ -1352,9 +1352,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", "cpu": [ "x64" ], @@ -1518,9 +1518,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", - "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", "dev": true, "license": "MIT", "engines": { @@ -1622,9 +1622,9 @@ } }, "node_modules/@hookform/resolvers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.1.tgz", - "integrity": "sha512-u0+6X58gkjMcxur1wRWokA7XsiiBJ6aK17aPZxhkoYiK5J+HcTx0Vhu9ovXe6H+dVpO6cjrn2FkJTryXEMlryQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", + "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", "license": "MIT", "dependencies": { "@standard-schema/utils": "^0.3.0" @@ -1685,14 +1685,24 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@inquirer/ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.0.tgz", + "integrity": "sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@inquirer/confirm": { - "version": "5.1.16", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.16.tgz", - "integrity": "sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==", + "version": "5.1.18", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.18.tgz", + "integrity": "sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.2.0", + "@inquirer/core": "^10.2.2", "@inquirer/type": "^3.0.8" }, "engines": { @@ -1708,15 +1718,15 @@ } }, "node_modules/@inquirer/core": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.0.tgz", - "integrity": "sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.2.tgz", + "integrity": "sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==", "dev": true, "license": "MIT", "dependencies": { + "@inquirer/ansi": "^1.0.0", "@inquirer/figures": "^1.0.13", "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", @@ -1868,9 +1878,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1902,16 +1912,16 @@ } }, "node_modules/@navikt/aksel-icons": { - "version": "7.29.1", - "resolved": "https://npm.pkg.github.com/download/@navikt/aksel-icons/7.29.1/dd3a4014c46263847d74a531a9b4cf2850bbe018", - "integrity": "sha512-ERX4lUCYcPDQN3UT1051UY8bDb6vBwAePMSDuRO5bLnTSSq8ZqNxPDtSxaihp35DeqZi08j7AJQXGGpn0exd9g==", + "version": "7.31.0", + "resolved": "https://npm.pkg.github.com/download/@navikt/aksel-icons/7.31.0/5d0ea15a5f0ba53bf9e0c38a0b45612235d6b332", + "integrity": "sha512-6rtyFhDDBOkyG815trxe9pnaJrvSnwLEpkJ7qh0qZm1B8g59a4bf2IJGVtKDPg9thVOrxNtA/H9G4N6n0v9Kkg==", "dev": true, "license": "MIT" }, "node_modules/@navikt/ds-css": { - "version": "7.29.1", - "resolved": "https://npm.pkg.github.com/download/@navikt/ds-css/7.29.1/fac35f81f5620714b47e5e3ed02671b896b0ba71", - "integrity": "sha512-Lm3Itq/Ls/7yB4btn4nRix4qOGCltn4Qszf+6SPOtK/oI4+h9TiqArV5+BGa02Ve+6NPi0ByDYLTOyQWTKwMng==", + "version": "7.31.0", + "resolved": "https://npm.pkg.github.com/download/@navikt/ds-css/7.31.0/78afbca44bf15ca55be50990b19693411994a579", + "integrity": "sha512-7wA5Goihfxai/IkTuDIErUSye+/X5UUP2ixT/blipkDbN1Ny6u7PaujYuuGzRR7Glez3suaB4+ATYMxAXLJziw==", "dev": true, "license": "MIT" }, @@ -1933,16 +1943,16 @@ } }, "node_modules/@navikt/ds-react": { - "version": "7.29.1", - "resolved": "https://npm.pkg.github.com/download/@navikt/ds-react/7.29.1/f3036f7ca457f8a0dc01631aff5962ca53d4e023", - "integrity": "sha512-GDTCBzoATjw/P/p/CXrknDkSCqNITppVIpKAuwwf7vEINPQJGiOWitx5uIe5r2DIoDq5wfzIXRWkGcIJLGGTJA==", + "version": "7.31.0", + "resolved": "https://npm.pkg.github.com/download/@navikt/ds-react/7.31.0/6a2825dae4e35d7f11a63e4ecbd3c0808ef5e308", + "integrity": "sha512-soQmDwnTMYoFTsJggDgYKijtSQe0VuHNbksGRrjgb2+F1HZ2zwjDP/mLzg73Mwr3kkrz4nkwS9NTGhoHO+dt3w==", "dev": true, "license": "MIT", "dependencies": { "@floating-ui/react": "0.27.8", "@floating-ui/react-dom": "^2.0.9", - "@navikt/aksel-icons": "^7.29.1", - "@navikt/ds-tokens": "^7.29.1", + "@navikt/aksel-icons": "^7.31.0", + "@navikt/ds-tokens": "^7.31.0", "clsx": "^2.1.0", "date-fns": "^4.0.0", "react-day-picker": "9.7.0" @@ -1953,9 +1963,9 @@ } }, "node_modules/@navikt/ds-tokens": { - "version": "7.29.1", - "resolved": "https://npm.pkg.github.com/download/@navikt/ds-tokens/7.29.1/7e294b5a3d8670cdb8590b8af75b8d9e6b170e68", - "integrity": "sha512-bgZE6i9YiPC86NtmkFuzlXEhrhgmL1cDCiy3TKZ7H9OiF93KYAPSxK+tGRmpFkf8LxXx5QXK3LYAfK8RmRDxFg==", + "version": "7.31.0", + "resolved": "https://npm.pkg.github.com/download/@navikt/ds-tokens/7.31.0/c8ff6b4d9a463ddab2a357fd4dee135c26693322", + "integrity": "sha512-cW7be0OyW9FIcIrgagIO0/YZoc3774iCqq9VYvx9cyIYT3CK6kSziCEyT/Kro3wEzyW+nJokTORgyx28zk3y9A==", "dev": true, "license": "MIT" }, @@ -2420,14 +2430,14 @@ } }, "node_modules/@playwright/experimental-ct-core": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.55.0.tgz", - "integrity": "sha512-8HRI8Envzgv3bVr6CrKCW3NxFR3dvXaE10OACkfs50GiTn5t4m31UJ3wDpFAgzxZvXPoyLfG3mLG16YbpWS5Ww==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.55.1.tgz", + "integrity": "sha512-Mhdmx3CDlOYi4Nr8N4bzaqhjmdcl+SKdsKWznN6TWZCFZDMZARyZ3Vp5IIS3AAoymzMCcG6bRsKicA79eUBLKA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.55.0", - "playwright-core": "1.55.0", + "playwright": "1.55.1", + "playwright-core": "1.55.1", "vite": "^6.3.4" }, "engines": { @@ -2567,13 +2577,13 @@ } }, "node_modules/@playwright/experimental-ct-react": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.55.0.tgz", - "integrity": "sha512-mtm5kkcQx7ilqBnBIWHqhKVjvAjHQi5OBx+ySmofwj82IS8GiQvpKLVsFDeAEfNpVj+j6B1Dm+8610rqfH/9sw==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.55.1.tgz", + "integrity": "sha512-q+qH/J99iV6+99oVT417AA8KsYp3lwxsnxZrLZjIwkEC5+G28QCkr7+UYAOZoNPzelGqHFMLhYMvc6mXuREa2w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.55.0", + "@playwright/experimental-ct-core": "1.55.1", "@vitejs/plugin-react": "^4.2.1" }, "bin": { @@ -2622,13 +2632,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.0.tgz", - "integrity": "sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.1.tgz", + "integrity": "sha512-IVAh/nOJaw6W9g+RJVlIQJ6gSiER+ae6mKQ5CX1bERzQgbC1VSeBlwdvczT7pxb0GWiyrxH4TGKbMfDb4Sq/ig==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.55.0" + "playwright": "1.55.1" }, "bin": { "playwright": "cli.js" @@ -2694,9 +2704,9 @@ } }, "node_modules/@react-router/dev": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.8.2.tgz", - "integrity": "sha512-9ilgQoNhvgvUyQKDapALt9qVO3GpSw9ng5X2BwIhLIwqh8CTyRM/jz5cK53p5yzGiVeyx9njXXfeuxUlvQgJuA==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.9.2.tgz", + "integrity": "sha512-uGDupa6S64Yv9pAtEWchPKQTyl9Ab59ztqyPilNAFYnktMEweOHTBfN4tMUinnxAJQByB6hAoLQmHcy0u6RdTA==", "dev": true, "license": "MIT", "dependencies": { @@ -2708,8 +2718,8 @@ "@babel/traverse": "^7.27.7", "@babel/types": "^7.27.7", "@npmcli/package-json": "^4.0.1", - "@react-router/node": "7.8.2", - "@vitejs/plugin-rsc": "0.4.11", + "@react-router/node": "7.9.2", + "@remix-run/node-fetch-server": "^0.9.0", "arg": "^5.0.1", "babel-dead-code-elimination": "^1.0.6", "chokidar": "^4.0.0", @@ -2724,7 +2734,6 @@ "prettier": "^3.6.2", "react-refresh": "^0.14.0", "semver": "^7.3.7", - "set-cookie-parser": "^2.6.0", "tinyglobby": "^0.2.14", "valibot": "^0.41.0", "vite-node": "^3.2.2" @@ -2736,8 +2745,9 @@ "node": ">=20.0.0" }, "peerDependencies": { - "@react-router/serve": "^7.8.2", - "react-router": "^7.8.2", + "@react-router/serve": "^7.9.2", + "@vitejs/plugin-rsc": "*", + "react-router": "^7.9.2", "typescript": "^5.1.0", "vite": "^5.1.0 || ^6.0.0 || ^7.0.0", "wrangler": "^3.28.2 || ^4.0.0" @@ -2746,6 +2756,9 @@ "@react-router/serve": { "optional": true }, + "@vitejs/plugin-rsc": { + "optional": true + }, "typescript": { "optional": true }, @@ -2755,9 +2768,9 @@ } }, "node_modules/@react-router/node": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.8.2.tgz", - "integrity": "sha512-FNepNg4Aya6V0ZxD/+uObtqxtMXcsBGa0ax9PznUh5qr8g4M6Xo9IN+soLb1tghz6iS/F9djFyhJ/lDkF77dEw==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.9.2.tgz", + "integrity": "sha512-mGqpEXVWs1XmwpJdbESE2fzvS3a43EdMCuiL2U3Nmm1IuGdSjc60gQK/IeKWjNGdgj1pZEyyQK17fYXPqjp5Uw==", "license": "MIT", "dependencies": { "@mjackson/node-fetch-server": "^0.2.0" @@ -2766,7 +2779,7 @@ "node": ">=20.0.0" }, "peerDependencies": { - "react-router": "7.8.2", + "react-router": "7.9.2", "typescript": "^5.1.0" }, "peerDependenciesMeta": { @@ -2802,17 +2815,24 @@ } } }, + "node_modules/@remix-run/node-fetch-server": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@remix-run/node-fetch-server/-/node-fetch-server-0.9.0.tgz", + "integrity": "sha512-SoLMv7dbH+njWzXnOY6fI08dFMI5+/dQ+vY3n8RnnbdG7MdJEgiP28Xj/xWlnRnED/aB6SFw56Zop+LbmaaKqA==", + "dev": true, + "license": "MIT" + }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.34", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.34.tgz", - "integrity": "sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==", + "version": "1.0.0-beta.35", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.35.tgz", + "integrity": "sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg==", "dev": true, "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz", - "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.2.tgz", + "integrity": "sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==", "cpu": [ "arm" ], @@ -2824,9 +2844,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz", - "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.2.tgz", + "integrity": "sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==", "cpu": [ "arm64" ], @@ -2838,9 +2858,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz", - "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.2.tgz", + "integrity": "sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==", "cpu": [ "arm64" ], @@ -2852,9 +2872,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz", - "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.2.tgz", + "integrity": "sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==", "cpu": [ "x64" ], @@ -2866,9 +2886,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz", - "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.2.tgz", + "integrity": "sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==", "cpu": [ "arm64" ], @@ -2880,9 +2900,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz", - "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.2.tgz", + "integrity": "sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==", "cpu": [ "x64" ], @@ -2894,9 +2914,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz", - "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.2.tgz", + "integrity": "sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==", "cpu": [ "arm" ], @@ -2908,9 +2928,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz", - "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.2.tgz", + "integrity": "sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==", "cpu": [ "arm" ], @@ -2922,9 +2942,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz", - "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.2.tgz", + "integrity": "sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==", "cpu": [ "arm64" ], @@ -2936,9 +2956,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz", - "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.2.tgz", + "integrity": "sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==", "cpu": [ "arm64" ], @@ -2949,10 +2969,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz", - "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.2.tgz", + "integrity": "sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==", "cpu": [ "loong64" ], @@ -2964,9 +2984,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz", - "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.2.tgz", + "integrity": "sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==", "cpu": [ "ppc64" ], @@ -2978,9 +2998,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz", - "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.2.tgz", + "integrity": "sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==", "cpu": [ "riscv64" ], @@ -2992,9 +3012,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz", - "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.2.tgz", + "integrity": "sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==", "cpu": [ "riscv64" ], @@ -3006,9 +3026,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz", - "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.2.tgz", + "integrity": "sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==", "cpu": [ "s390x" ], @@ -3020,9 +3040,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz", - "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.2.tgz", + "integrity": "sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==", "cpu": [ "x64" ], @@ -3034,9 +3054,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz", - "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.2.tgz", + "integrity": "sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==", "cpu": [ "x64" ], @@ -3048,9 +3068,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz", - "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.2.tgz", + "integrity": "sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==", "cpu": [ "arm64" ], @@ -3062,9 +3082,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz", - "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.2.tgz", + "integrity": "sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==", "cpu": [ "arm64" ], @@ -3076,9 +3096,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz", - "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.2.tgz", + "integrity": "sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==", "cpu": [ "ia32" ], @@ -3089,10 +3109,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.2.tgz", + "integrity": "sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz", - "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.2.tgz", + "integrity": "sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==", "cpu": [ "x64" ], @@ -3341,13 +3375,13 @@ } }, "node_modules/@types/node": { - "version": "24.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", - "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.12.0" } }, "node_modules/@types/parse-json": { @@ -3357,9 +3391,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.1.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", - "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", + "version": "19.1.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz", + "integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3472,17 +3506,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.43.0.tgz", - "integrity": "sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", + "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.43.0", - "@typescript-eslint/type-utils": "8.43.0", - "@typescript-eslint/utils": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/type-utils": "8.44.1", + "@typescript-eslint/utils": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -3496,22 +3530,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.43.0", + "@typescript-eslint/parser": "^8.44.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.43.0.tgz", - "integrity": "sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", + "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.43.0", - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4" }, "engines": { @@ -3527,14 +3561,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.43.0.tgz", - "integrity": "sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", + "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.43.0", - "@typescript-eslint/types": "^8.43.0", + "@typescript-eslint/tsconfig-utils": "^8.44.1", + "@typescript-eslint/types": "^8.44.1", "debug": "^4.3.4" }, "engines": { @@ -3549,14 +3583,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.43.0.tgz", - "integrity": "sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", + "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0" + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3567,9 +3601,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.43.0.tgz", - "integrity": "sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", + "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", "dev": true, "license": "MIT", "engines": { @@ -3584,15 +3618,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.43.0.tgz", - "integrity": "sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz", + "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0", - "@typescript-eslint/utils": "8.43.0", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/utils": "8.44.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3609,9 +3643,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz", - "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", + "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", "dev": true, "license": "MIT", "engines": { @@ -3623,16 +3657,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.43.0.tgz", - "integrity": "sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", + "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.43.0", - "@typescript-eslint/tsconfig-utils": "8.43.0", - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/visitor-keys": "8.43.0", + "@typescript-eslint/project-service": "8.44.1", + "@typescript-eslint/tsconfig-utils": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3652,16 +3686,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.43.0.tgz", - "integrity": "sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz", + "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.43.0", - "@typescript-eslint/types": "8.43.0", - "@typescript-eslint/typescript-estree": "8.43.0" + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3676,13 +3710,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.43.0.tgz", - "integrity": "sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", + "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/types": "8.44.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -3707,16 +3741,16 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.2.tgz", - "integrity": "sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.3.tgz", + "integrity": "sha512-PFVHhosKkofGH0Yzrw1BipSedTH68BFF8ZWy1kfUpCtJcouXXY0+racG8sExw7hw0HoX36813ga5o3LTWZ4FUg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.28.3", + "@babel/core": "^7.28.4", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.34", + "@rolldown/pluginutils": "1.0.0-beta.35", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, @@ -3737,34 +3771,6 @@ "node": ">=0.10.0" } }, - "node_modules/@vitejs/plugin-rsc": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-rsc/-/plugin-rsc-0.4.11.tgz", - "integrity": "sha512-+4H4wLi+Y9yF58znBfKgGfX8zcqUGt8ngnmNgzrdGdF1SVz7EO0sg7WnhK5fFVHt6fUxsVEjmEabsCWHKPL1Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mjackson/node-fetch-server": "^0.7.0", - "es-module-lexer": "^1.7.0", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17", - "periscopic": "^4.0.2", - "turbo-stream": "^3.1.0", - "vitefu": "^1.1.1" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*", - "vite": "*" - } - }, - "node_modules/@vitejs/plugin-rsc/node_modules/@mjackson/node-fetch-server": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@mjackson/node-fetch-server/-/node-fetch-server-0.7.0.tgz", - "integrity": "sha512-un8diyEBKU3BTVj3GzlTPA1kIjCkGdD+AMYQy31Gf9JCkfoZzwgJ79GUtHrF2BN3XPNMLpubbzPcxys+a3uZEw==", - "dev": true, - "license": "MIT" - }, "node_modules/@vitest/browser": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.2.4.tgz", @@ -4015,35 +4021,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -4285,9 +4262,9 @@ } }, "node_modules/axios": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.0.tgz", - "integrity": "sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -4399,6 +4376,16 @@ "license": "MIT", "optional": true }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", + "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -4436,9 +4423,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", - "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", "dev": true, "funding": [ { @@ -4456,9 +4443,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001737", - "electron-to-chromium": "^1.5.211", - "node-releases": "^2.0.19", + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { @@ -4572,9 +4560,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001741", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz", - "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==", + "version": "1.0.30001745", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz", + "integrity": "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==", "dev": true, "funding": [ { @@ -4904,9 +4892,9 @@ } }, "node_modules/country-data-list": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/country-data-list/-/country-data-list-1.5.4.tgz", - "integrity": "sha512-y2gzj84oFCRIqNd9YwQL4X54yu/feqWMja2Ed2CI44mhKlybwQZlkR7AVO8dGOD0xCBfVGsJ76BFV6KOCyFtOA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/country-data-list/-/country-data-list-1.5.5.tgz", + "integrity": "sha512-igoAbJvlD/foOq4+aB3t24Hndvb5y/DasXcrVOtJMZ0UFLgfYq/mPMcCcSjJAIykLcTWOHZehZgNUJyaKMz1iA==", "license": "MIT" }, "node_modules/cross-spawn": { @@ -5101,9 +5089,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5240,9 +5228,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz", + "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -5318,9 +5306,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.215", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.215.tgz", - "integrity": "sha512-TIvGp57UpeNetj/wV/xpFNpWGb0b/ROw372lHPx5Aafx02gjTBtWnEEcaSX3W2dLM3OSdGGyHX/cHl01JQsLaQ==", + "version": "1.5.223", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.223.tgz", + "integrity": "sha512-qKm55ic6nbEmagFlTFczML33rF90aU+WtrJ9MdTCThrcvDNdUHN4p6QfVN78U06ZmguqXIyMPyYhw2TrbDUwPQ==", "dev": true, "license": "ISC" }, @@ -5377,9 +5365,9 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -5575,9 +5563,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5588,32 +5576,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" } }, "node_modules/escalade": { @@ -5639,9 +5627,9 @@ } }, "node_modules/eslint": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", - "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5651,7 +5639,7 @@ "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.35.0", + "@eslint/js": "9.36.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -7259,16 +7247,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.6" - } - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -7429,9 +7407,9 @@ "license": "MIT" }, "node_modules/isbot": { - "version": "5.1.30", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.30.tgz", - "integrity": "sha512-3wVJEonAns1OETX83uWsk5IAne2S5zfDcntD2hbtU23LelSqNXzXs9zKjMPOLMzroCgIjCfjYAEHrd2D6FOkiA==", + "version": "5.1.31", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.31.tgz", + "integrity": "sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==", "dev": true, "license": "Unlicense", "engines": { @@ -8019,9 +7997,9 @@ "license": "MIT" }, "node_modules/msw": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.11.1.tgz", - "integrity": "sha512-dGSRx0AJmQVQfpGXTsAAq4JFdwdhOBdJ6sJS/jnN0ac3s0NZB6daacHF1z5Pefx+IejmvuiLWw260RlyQOf3sQ==", + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.11.3.tgz", + "integrity": "sha512-878imp8jxIpfzuzxYfX0qqTq1IFQz/1/RBHs/PyirSjzi+xKM/RRfIpIqHSCWjH0GxidrjhgiiXC+DWXNDvT9w==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8031,7 +8009,6 @@ "@inquirer/confirm": "^5.0.0", "@mswjs/interceptors": "^0.39.1", "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", "graphql": "^16.8.1", @@ -8040,9 +8017,11 @@ "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", + "rettime": "^0.7.0", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.0", "type-fest": "^4.26.1", + "until-async": "^3.0.2", "yargs": "^17.7.2" }, "bin": { @@ -8064,22 +8043,22 @@ } }, "node_modules/msw/node_modules/tldts": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.13.tgz", - "integrity": "sha512-z/SgnxiICGb7Gli0z7ci9BZdjy1tQORUbdmzEUA7NbIJKWhdONn78Ji8gV0PAGfHPyEd+I+W2rMzhLjWkv2Olg==", + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.16.tgz", + "integrity": "sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.0.13" + "tldts-core": "^7.0.16" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/msw/node_modules/tldts-core": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.13.tgz", - "integrity": "sha512-Td0LeWLgXJGsikI4mO82fRexgPCEyTcwWiXJERF/GBHX3Dm+HQq/wx4HnYowCbiwQ8d+ENLZc+ktbZw8H+0oEA==", + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.16.tgz", + "integrity": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==", "dev": true, "license": "MIT" }, @@ -8252,9 +8231,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.20.tgz", - "integrity": "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", "dev": true, "license": "MIT" }, @@ -8721,18 +8700,6 @@ "path2d": "^0.2.1" } }, - "node_modules/periscopic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-4.0.2.tgz", - "integrity": "sha512-sqpQDUy8vgB7ycLkendSKS6HnVz1Rneoc3Rc+ZBUCe2pbqlVuCC5vF52l0NJ1aiMg/r1qfYF9/myz8CZeI2rjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "is-reference": "^3.0.2", - "zimmerframe": "^1.0.0" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -8764,13 +8731,13 @@ } }, "node_modules/playwright": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", - "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.1.tgz", + "integrity": "sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.0" + "playwright-core": "1.55.1" }, "bin": { "playwright": "cli.js" @@ -8783,9 +8750,9 @@ } }, "node_modules/playwright-core": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", - "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.1.tgz", + "integrity": "sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==", "dev": true, "license": "Apache-2.0", "bin": { @@ -9259,9 +9226,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.62.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.62.0.tgz", - "integrity": "sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA==", + "version": "7.63.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.63.0.tgz", + "integrity": "sha512-ZwueDMvUeucovM2VjkCf7zIHcs1aAlDimZu2Hvel5C5907gUzMpm4xCrQXtRzCvsBqFjonB4m3x4LzCFI1ZKWA==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -9379,9 +9346,9 @@ } }, "node_modules/react-router": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.8.2.tgz", - "integrity": "sha512-7M2fR1JbIZ/jFWqelpvSZx+7vd7UlBTfdZqf6OSdF9g6+sfdqJDAWcak6ervbHph200ePlu+7G8LdoiC3ReyAQ==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.2.tgz", + "integrity": "sha512-i2TPp4dgaqrOqiRGLZmqh2WXmbdFknUyiCRmSKs0hf6fWXkTKg5h56b+9F22NbGRAMxjYfqQnpi63egzD2SuZA==", "dev": true, "license": "MIT", "dependencies": { @@ -9757,6 +9724,13 @@ "node": ">= 4" } }, + "node_modules/rettime": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.7.0.tgz", + "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==", + "dev": true, + "license": "MIT" + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -9769,9 +9743,9 @@ } }, "node_modules/rollup": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", - "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.2.tgz", + "integrity": "sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==", "dev": true, "license": "MIT", "dependencies": { @@ -9785,27 +9759,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.50.1", - "@rollup/rollup-android-arm64": "4.50.1", - "@rollup/rollup-darwin-arm64": "4.50.1", - "@rollup/rollup-darwin-x64": "4.50.1", - "@rollup/rollup-freebsd-arm64": "4.50.1", - "@rollup/rollup-freebsd-x64": "4.50.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", - "@rollup/rollup-linux-arm-musleabihf": "4.50.1", - "@rollup/rollup-linux-arm64-gnu": "4.50.1", - "@rollup/rollup-linux-arm64-musl": "4.50.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", - "@rollup/rollup-linux-ppc64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-musl": "4.50.1", - "@rollup/rollup-linux-s390x-gnu": "4.50.1", - "@rollup/rollup-linux-x64-gnu": "4.50.1", - "@rollup/rollup-linux-x64-musl": "4.50.1", - "@rollup/rollup-openharmony-arm64": "4.50.1", - "@rollup/rollup-win32-arm64-msvc": "4.50.1", - "@rollup/rollup-win32-ia32-msvc": "4.50.1", - "@rollup/rollup-win32-x64-msvc": "4.50.1", + "@rollup/rollup-android-arm-eabi": "4.52.2", + "@rollup/rollup-android-arm64": "4.52.2", + "@rollup/rollup-darwin-arm64": "4.52.2", + "@rollup/rollup-darwin-x64": "4.52.2", + "@rollup/rollup-freebsd-arm64": "4.52.2", + "@rollup/rollup-freebsd-x64": "4.52.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.2", + "@rollup/rollup-linux-arm-musleabihf": "4.52.2", + "@rollup/rollup-linux-arm64-gnu": "4.52.2", + "@rollup/rollup-linux-arm64-musl": "4.52.2", + "@rollup/rollup-linux-loong64-gnu": "4.52.2", + "@rollup/rollup-linux-ppc64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-musl": "4.52.2", + "@rollup/rollup-linux-s390x-gnu": "4.52.2", + "@rollup/rollup-linux-x64-gnu": "4.52.2", + "@rollup/rollup-linux-x64-musl": "4.52.2", + "@rollup/rollup-openharmony-arm64": "4.52.2", + "@rollup/rollup-win32-arm64-msvc": "4.52.2", + "@rollup/rollup-win32-ia32-msvc": "4.52.2", + "@rollup/rollup-win32-x64-gnu": "4.52.2", + "@rollup/rollup-win32-x64-msvc": "4.52.2", "fsevents": "~2.3.2" } }, @@ -9934,9 +9909,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.92.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", - "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", + "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "dev": true, "license": "MIT", "dependencies": { @@ -10772,9 +10747,9 @@ "license": "MIT" }, "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, "license": "MIT", "optional": true, @@ -10890,9 +10865,9 @@ } }, "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", "dev": true, "license": "MIT", "engines": { @@ -11040,13 +11015,6 @@ "node": "*" } }, - "node_modules/turbo-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-3.1.0.tgz", - "integrity": "sha512-tVI25WEXl4fckNEmrq70xU1XumxUwEx/FZD5AgEcV8ri7Wvrg2o7GEq8U7htrNx3CajciGm+kDyhRf5JB6t7/A==", - "dev": true, - "license": "MIT" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -11185,12 +11153,22 @@ } }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", "dev": true, "license": "MIT" }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -11314,9 +11292,9 @@ } }, "node_modules/vite": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", - "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.7.tgz", + "integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", "dev": true, "license": "MIT", "dependencies": { @@ -11505,26 +11483,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/vitefu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", - "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", - "dev": true, - "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*", - "tests/projects/workspace/packages/*" - ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, "node_modules/vitest": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", @@ -12113,9 +12071,9 @@ } }, "node_modules/yup": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.7.0.tgz", - "integrity": "sha512-VJce62dBd+JQvoc+fCVq+KZfPHr+hXaxCcVgotfwWvlR0Ja3ffYKaJBT8rptPOSKOGJDCUnW2C2JWpud7aRP6Q==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.7.1.tgz", + "integrity": "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==", "license": "MIT", "dependencies": { "property-expr": "^2.0.5", @@ -12136,13 +12094,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zimmerframe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", - "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", - "dev": true, - "license": "MIT" - }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", diff --git a/apps/dolly-frontend/src/main/js/proxy-routes.json b/apps/dolly-frontend/src/main/js/proxy-routes.json index ccb736a010d..48b4960093d 100644 --- a/apps/dolly-frontend/src/main/js/proxy-routes.json +++ b/apps/dolly-frontend/src/main/js/proxy-routes.json @@ -135,6 +135,9 @@ "/testnav-arbeidsplassencv-proxy": { "changeOrigin": true }, + "/testnav-sykemelding-proxy": { + "changeOrigin": true + }, "/testnav-helsepersonell-service": { "changeOrigin": true }, diff --git a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx index 0794fd54335..26f1342ebdf 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx @@ -35,7 +35,7 @@ import { kategoriKodeverk, tekniskNavnKodeverk, } from '@/components/fagsystem/sigrunstubSummertSkattegrunnlag/form/GrunnlagArrayForm' -import { useTpOrdningKodeverk } from '@/utils/hooks/usePensjon' +import { useTpOrdningKodeverk } from '@/utils/hooks/usePensjon' // TODO: Flytte til selector? // TODO: Flytte til selector? // - Denne kan forminskes ved bruk av hjelpefunksjoner @@ -1503,7 +1503,7 @@ const mapSykemelding = (bestillingData, data) => { if (sykemeldingKriterier) { const sykemelding = { header: 'Sykemelding', - items: null, + items: [] as any, } if (sykemeldingKriterier.syntSykemelding) { sykemelding.items = [ @@ -1511,6 +1511,13 @@ const mapSykemelding = (bestillingData, data) => { obj('Organisasjonsnummer', sykemeldingKriterier.syntSykemelding.orgnummer), obj('Arbeidsforhold-ID', sykemeldingKriterier.syntSykemelding.arbeidsforholdId), ] + } else if (sykemeldingKriterier.nySykemelding) { + sykemeldingKriterier.nySykemelding.aktivitet?.forEach((aktivitet: any) => { + sykemelding.items.push( + obj('Startdato', formatDate(aktivitet.fom)), + obj('Sluttdato', formatDate(aktivitet.tom)), + ) + }) } else if (sykemeldingKriterier.detaljertSykemelding) { sykemelding.items = [ obj('Startdato', formatDate(sykemeldingKriterier.detaljertSykemelding.startDato)), diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/options/malOptions.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/options/malOptions.tsx index 0e1c37b48b5..538b74d6fef 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/options/malOptions.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/options/malOptions.tsx @@ -95,7 +95,7 @@ export const initialValuesBasedOnMal = (mal: any, environments: any) => { initialValuesMal.dokarkiv = getUpdatedDokarkiv(initialValuesMal.dokarkiv) } if (initialValuesMal.sykemelding?.syntSykemelding) { - initialValuesMal.sykemelding = getUpdatedSykemelding( + initialValuesMal.sykemelding.detaljertSykemelding = getUpdatedSykemelding( initialValuesMal.sykemelding.syntSykemelding, ) } @@ -430,10 +430,10 @@ const getUpdatedBankkonto = (bankkonto: any) => { const getUpdatedSykemelding = (syntSykemelding: any) => { let updatedSykemelding = initialValuesDetaljertSykemelding - updatedSykemelding.detaljertSykemelding.startDato = new Date() - updatedSykemelding.detaljertSykemelding.mottaker.orgNr = syntSykemelding.orgnummer - updatedSykemelding.detaljertSykemelding.perioder[0].fom = addDays(syntSykemelding.startDato, -7) - updatedSykemelding.detaljertSykemelding.perioder[0].tom = addDays(syntSykemelding.startDato, -1) + updatedSykemelding.startDato = new Date() + updatedSykemelding.mottaker.orgNr = syntSykemelding.orgnummer + updatedSykemelding.perioder[0].fom = addDays(syntSykemelding.startDato, -7) + updatedSykemelding.perioder[0].tom = addDays(syntSykemelding.startDato, -1) return updatedSykemelding } diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Sykdom.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Sykdom.tsx index 7031cf91ecd..6373982e826 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Sykdom.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Sykdom.tsx @@ -1,7 +1,10 @@ import Panel from '@/components/ui/panel/Panel' import { Attributt, AttributtKategori } from '../Attributt' import { harValgtAttributt } from '@/components/ui/form/formUtils' -import { sykdomAttributt } from '@/components/fagsystem/sykdom/form/Form' +import { + nySykemeldingAttributt, + sykemeldingAttributt, +} from '@/components/fagsystem/sykdom/form/Form' import { useContext } from 'react' import { BestillingsveilederContext, @@ -9,7 +12,10 @@ import { } from '@/components/bestillingsveileder/BestillingsveilederContext' import { initialYrkesskade } from '@/components/fagsystem/yrkesskader/initialValues' import { yrkesskaderAttributt } from '@/components/fagsystem/yrkesskader/form/Form' -import { initialValuesDetaljertSykemelding } from '@/components/fagsystem/sykdom/form/initialValues' +import { + initialValuesDetaljertSykemelding, + initialValuesNySykemelding, +} from '@/components/fagsystem/sykdom/form/initialValues' export const SykdomPanel = ({ stateModifier, formValues }: any) => { const sm = stateModifier(SykdomPanel.initialValues) @@ -26,17 +32,30 @@ export const SykdomPanel = ({ stateModifier, formValues }: any) => { // @ts-ignore sm.batchAdd(harGyldigSykemeldingBestilling ? ['sykemelding'] : [])} + checkAttributeArray={() => sm.batchAdd(['nySykemelding'])} uncheckAttributeArray={sm.batchRemove} iconType="sykdom" - startOpen={harValgtAttributt(formValues, [sykdomAttributt, yrkesskaderAttributt])} + startOpen={harValgtAttributt(formValues, [ + sykemeldingAttributt, + nySykemeldingAttributt, + yrkesskaderAttributt, + ])} > + @@ -47,16 +66,26 @@ SykdomPanel.heading = 'Sykdom og skade' SykdomPanel.initialValues = ({ set, del, delMutate, has }: any) => ({ sykemelding: { - label: 'Har sykemelding', - checked: has('sykemelding'), + label: 'Har detaljert sykemelding', + checked: has('sykemelding.detaljertSykemelding'), add() { - set('sykemelding', initialValuesDetaljertSykemelding) + set('sykemelding.detaljertSykemelding', initialValuesDetaljertSykemelding) }, remove() { del('sykemelding') delMutate?.() }, }, + nySykemelding: { + label: 'Har ny sykemelding', + checked: has('sykemelding.nySykemelding'), + add() { + set('sykemelding.nySykemelding', initialValuesNySykemelding) + }, + remove() { + del('sykemelding') + }, + }, yrkesskader: { label: 'Har yrkesskader', checked: has('yrkesskader'), diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg3/Steg3.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg3/Steg3.tsx index 3872ee0925b..c0c01ccf9c5 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg3/Steg3.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg3/Steg3.tsx @@ -65,7 +65,7 @@ const Steg3 = ({ loadingBestilling }: { loadingBestilling: boolean }) => { formMethods.setValue('environments', alleredeValgtMiljoe()) } else if (erQ1EllerQ2MiljoeAvhengig(formMethods.getValues())) { formMethods.setValue('environments', ['q1', 'q2']) - } else if (formMethods.getValues()?.sykemelding) { + } else if (formMethods.getValues()?.sykemelding?.detaljertSykemelding) { formMethods.setValue('environments', ['q1']) } else if (!formMethods.getValues()?.environments) { formMethods.setValue('environments', []) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/SykemeldingTypes.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/SykemeldingTypes.tsx index a05759a545a..acb50c15f62 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/SykemeldingTypes.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/SykemeldingTypes.tsx @@ -6,6 +6,7 @@ export interface SykemeldingForm { export type Sykemelding = { data: Array + ident: any loading: boolean bestillingIdListe: any tilgjengeligMiljoe: any diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/Form.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/Form.tsx index e107607b60c..42fc1774330 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/Form.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/Form.tsx @@ -6,12 +6,15 @@ import React, { useEffect } from 'react' import { useFormContext } from 'react-hook-form' import { DetaljertSykemelding } from '@/components/fagsystem/sykdom/form/partials/DetaljertSykemelding' import { useDollyFasteDataOrganisasjoner } from '@/utils/hooks/useDollyOrganisasjoner' +import { NySykemelding } from '@/components/fagsystem/sykdom/form/partials/NySykemelding' -export const sykdomAttributt = 'sykemelding' +export const sykemeldingAttributt = 'sykemelding.detaljertSykemelding' +export const nySykemeldingAttributt = 'sykemelding.nySykemelding' const SykdomForm = () => { const formMethods = useFormContext() - const detaljertSykemelding = formMethods.watch(`${sykdomAttributt}.detaljertSykemelding`) + const detaljertSykemelding = formMethods.watch(sykemeldingAttributt) + const nySykemelding = formMethods.watch(nySykemeldingAttributt) const { organisasjoner } = useDollyFasteDataOrganisasjoner(true) @@ -20,11 +23,8 @@ const SykdomForm = () => { const valgtOrg = organisasjoner?.find( (org) => org.orgnummer === detaljertSykemelding.mottaker.orgNr, ) - formMethods.setValue( - `${sykdomAttributt}.detaljertSykemelding.arbeidsgiver.navn`, - valgtOrg?.navn, - ) - formMethods.setValue(`${sykdomAttributt}.detaljertSykemelding.mottaker`, { + formMethods.setValue(`${sykemeldingAttributt}.arbeidsgiver.navn`, valgtOrg?.navn) + formMethods.setValue(`${sykemeldingAttributt}.mottaker`, { navn: valgtOrg?.navn || null, orgNr: valgtOrg?.orgnummer || null, adresse: { @@ -34,20 +34,24 @@ const SykdomForm = () => { postnummer: valgtOrg?.forretningsAdresse?.postnr || null, }, }) - formMethods.trigger(`${sykdomAttributt}.detaljertSykemelding`) + formMethods.trigger(sykemeldingAttributt) } }, [organisasjoner]) return ( // @ts-ignore - + - + {detaljertSykemelding && } + {nySykemelding && } ) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/initialValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/initialValues.tsx index f0aefa69994..1e38a79df0c 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/initialValues.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/initialValues.tsx @@ -1,65 +1,72 @@ import { Diagnose } from '@/components/fagsystem/sykdom/SykemeldingTypes' -import { addDays } from 'date-fns' +import { addDays, addWeeks } from 'date-fns' import { getRandomValue } from '@/components/fagsystem/utils' import { SelectOptionsGyldigeDiagnoser } from '@/components/fagsystem/sykdom/form/partials/SelectOptionsDiagnoser' const randomDiagnose = getRandomValue(SelectOptionsGyldigeDiagnoser()) -export const initialValuesDetaljertSykemelding = { - detaljertSykemelding: { - arbeidsgiver: { - navn: '', - stillingsprosent: 100, - yrkesbetegnelse: '', - }, - biDiagnoser: [] as Array, - detaljer: { - arbeidsforEtterEndtPeriode: false, - beskrivHensynArbeidsplassen: '', - tiltakArbeidsplass: '', - tiltakNav: '', - }, - hovedDiagnose: { - diagnose: randomDiagnose?.diagnoseNavn || '', - diagnosekode: randomDiagnose?.value || '', - system: randomDiagnose ? '2.16.578.1.12.4.1.1.7170' : '', - }, - helsepersonell: { - etternavn: '', - fornavn: '', - hprId: '', - ident: '', - mellomnavn: '', - samhandlerType: '', +export const initialValuesNySykemelding = { + aktivitet: [ + { + fom: new Date(), + tom: addWeeks(new Date(), 2), }, - manglendeTilretteleggingPaaArbeidsplassen: false, - mottaker: { - navn: '', - orgNr: null, - adresse: { - by: '', - gate: '', - land: '', - postnummer: '', - }, + ], +} + +export const initialValuesDetaljertSykemelding = { + arbeidsgiver: { + navn: '', + stillingsprosent: 100, + yrkesbetegnelse: '', + }, + biDiagnoser: [] as Array, + detaljer: { + arbeidsforEtterEndtPeriode: false, + beskrivHensynArbeidsplassen: '', + tiltakArbeidsplass: '', + tiltakNav: '', + }, + hovedDiagnose: { + diagnose: randomDiagnose?.diagnoseNavn || '', + diagnosekode: randomDiagnose?.value || '', + system: randomDiagnose ? '2.16.578.1.12.4.1.1.7170' : '', + }, + helsepersonell: { + etternavn: '', + fornavn: '', + hprId: '', + ident: '', + mellomnavn: '', + samhandlerType: '', + }, + manglendeTilretteleggingPaaArbeidsplassen: false, + mottaker: { + navn: '', + orgNr: null, + adresse: { + by: '', + gate: '', + land: '', + postnummer: '', }, - perioder: [ - { - aktivitet: { - aktivitet: null as unknown as string, - behandlingsdager: 0, - grad: 50, - reisetilskudd: false, - }, - fom: addDays(new Date(), -7), - tom: addDays(new Date(), -1), + }, + perioder: [ + { + aktivitet: { + aktivitet: null as unknown as string, + behandlingsdager: 0, + grad: 50, + reisetilskudd: false, }, - ], - kontaktMedPasient: { - kontaktDato: null, - begrunnelseIkkeKontakt: 'Ikke behov for kontakt', + fom: addDays(new Date(), -7), + tom: addDays(new Date(), -1), }, - startDato: new Date(), - umiddelbarBistand: false, + ], + kontaktMedPasient: { + kontaktDato: null, + begrunnelseIkkeKontakt: 'Ikke behov for kontakt', }, + startDato: new Date(), + umiddelbarBistand: false, } diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/NySykemelding.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/NySykemelding.tsx new file mode 100644 index 00000000000..f2f51bb2764 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/NySykemelding.tsx @@ -0,0 +1,53 @@ +import { FormDatepicker } from '@/components/ui/form/inputs/datepicker/Datepicker' +import { FormDollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import React from 'react' +import { addDays, addWeeks } from 'date-fns' +import { useFormContext } from 'react-hook-form' + +const initialValuesAktivitet = { + fom: new Date(), + tom: addWeeks(new Date(), 2), +} + +export const NySykemelding = () => { + const formMethods = useFormContext() + + return ( +
+ { + const aktiviteter = formMethods.getValues('sykemelding.nySykemelding.aktivitet') || [] + let lastEntryTom: Date = aktiviteter[aktiviteter?.length - 1]?.tom + ? new Date(aktiviteter[aktiviteter?.length - 1]?.tom) + : new Date() + if (lastEntryTom.getDay() === 5 || lastEntryTom.getDay() === 6) { + // Ny periode kan ikke starte på en lørdag eller søndag, kun påfølgende mandag + lastEntryTom = addDays(lastEntryTom, lastEntryTom.getDay() === 5 ? 2 : 1) + } + const newAktivitet = { + fom: addDays(lastEntryTom, 1), + tom: addWeeks(lastEntryTom, 2), + } + formMethods.setValue('sykemelding.nySykemelding.aktivitet', [ + ...aktiviteter, + newAktivitet, + ]) + }} + > + {(path: string) => ( + <> + + + + )} + +
+ ) +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/validation.tsx index aa0f01021a6..04d3f046879 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/validation.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/validation.tsx @@ -39,10 +39,17 @@ export const validation = { sykemelding: ifPresent( '$sykemelding', Yup.object({ - syntSykemelding: ifPresent( - '$sykemelding.syntSykemelding', + nySykemelding: ifPresent( + '$sykemelding.nySykemelding', Yup.object({ - startDato: requiredDate, + aktivitet: Yup.array() + .min(1, 'Må ha minst én aktivitet') + .of( + Yup.object({ + fom: testDatoFom(requiredDate, 'tom'), + tom: testDatoTom(requiredDate, 'fom'), + }), + ), orgnummer: testHarArbeidsforhold(Yup.string().nullable()), }), ), diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx index 77854991acb..492a8791974 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx @@ -10,6 +10,8 @@ import { MiljoTabs } from '@/components/ui/miljoTabs/MiljoTabs' import { useBestilteMiljoer } from '@/utils/hooks/useBestilling' import Loading from '@/components/ui/loading/Loading' import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import { useTsmSykemelding } from '@/utils/hooks/useSykemelding' +import { NySykemeldingVisning } from '@/components/fagsystem/sykdom/visning/partials/NySykemeldingVisning' export const sjekkManglerSykemeldingData = (sykemeldingData) => { return ( @@ -33,11 +35,13 @@ const VisningAvBestilling = ({ bestillinger }) => { const syntSykemelding = _.get(bestilling, 'data.sykemelding.syntSykemelding') const detaljertSykemelding = _.get(bestilling, 'data.sykemelding.detaljertSykemelding') - return syntSykemelding ? ( - - ) : detaljertSykemelding ? ( - - ) : null + if (syntSykemelding) { + return + } else if (detaljertSykemelding) { + return + } else { + return null + } } }) } @@ -79,31 +83,34 @@ const Visning = ({ data }) => { export const SykemeldingVisning = ({ data, + ident, loading, bestillingIdListe, tilgjengeligMiljoe, bestillinger, }: Sykemelding) => { const { bestilteMiljoer } = useBestilteMiljoer(bestillingIdListe, 'SYKEMELDING') + const { sykemeldinger, loading: nySykemeldingLoading } = useTsmSykemelding(ident?.ident) - if (loading) { + if (loading || nySykemeldingLoading) { return } - if (!data && !bestillinger) { + if (!data && !bestillinger && sykemeldinger?.length === 0) { return null } const manglerFagsystemData = - sjekkManglerSykemeldingData(data) && sjekkManglerSykemeldingBestilling(bestillinger) + sjekkManglerSykemeldingData(data) && + sjekkManglerSykemeldingBestilling(bestillinger) && + sykemeldinger?.length === 0 const miljoerMedData = data?.map((miljoData) => miljoData.data && miljoData.miljo) const errorMiljoer = bestilteMiljoer?.filter((miljo) => !miljoerMedData?.includes(miljo)) - const forsteMiljo = data?.find((miljoData) => miljoData?.data)?.miljo const mergeData = () => { - const mergeMiljo = [] + const mergeMiljo: Array<{ data: any[]; miljo: string }> = [] data?.forEach((item: any) => { const indexOfMiljo = mergeMiljo.findIndex((sykemelding) => sykemelding?.miljo === item?.miljo) if (indexOfMiljo >= 0) { @@ -117,30 +124,42 @@ export const SykemeldingVisning = ({ }) return mergeMiljo } - const mergetData = mergeData() + const mergetData = mergeData() const filteredData = tilgjengeligMiljoe && mergetData?.filter((item) => tilgjengeligMiljoe.includes(item.miljo)) + let render: React.ReactNode + + console.log('sykemeldinger: ', sykemeldinger) //TODO - SLETT MEG + + if (manglerFagsystemData) { + render = ( + + Fant ikke sykemelding-data på person + + ) + } else if (sjekkManglerSykemeldingData(data) && sykemeldinger?.length === 0) { + render = + } else if (sykemeldinger?.length > 0) { + render = + } else { + render = ( + + + + ) + } + return (
- {manglerFagsystemData ? ( - - Fant ikke sykemelding-data på person - - ) : sjekkManglerSykemeldingData(data) ? ( - - ) : ( - - - - )} + {render}
) } diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/partials/NySykemeldingVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/partials/NySykemeldingVisning.tsx new file mode 100644 index 00000000000..e9c09e986ee --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/partials/NySykemeldingVisning.tsx @@ -0,0 +1,37 @@ +import * as React from 'react' +import { formatDate } from '@/utils/DataFormatter' +import { TitleValue } from '@/components/ui/titleValue/TitleValue' +import { useTsmSykemelding } from '@/utils/hooks/useSykemelding' +import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import Loading from '@/components/ui/loading/Loading' + +export const NySykemeldingVisning = ({ ident }: any) => { + const { sykemeldinger, error, loading } = useTsmSykemelding(ident?.ident) + + const renderAktivitet = (sykemelding: any, idx: number) => ( + + {(aktivitet: any, idx: number) => ( +
+ + +
+ )} +
+ ) + + if (loading) { + return + } + if (error) { + return
Feil ved henting av sykemeldinger
+ } + + return ( + +

Perioder

+
+
{renderAktivitet(sykemeldinger?.[0], 0)}
+
+
+ ) +} diff --git a/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx b/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx index 84c11ce6629..81ca307bd0a 100644 --- a/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx @@ -18,7 +18,13 @@ export const MiljoeInfo = ({ bestillingsdata, dollyEnvironments }) => { const { instEnvironments, loading: loadingInst, error: errorInst } = useInstEnvironments() const { dokarkivEnvironments, loading: loadingDokarkiv } = useDokarkivEnvironments() const { instdata, arenaforvalter, pensjonforvalter, sykemelding, dokarkiv } = bestillingsdata - if (!instdata && !arenaforvalter && !pensjonforvalter && !sykemelding && !dokarkiv) { + if ( + !instdata && + !arenaforvalter && + !pensjonforvalter && + !sykemelding?.detaljertSykemelding && + !dokarkiv + ) { return null } @@ -89,7 +95,7 @@ export const MiljoeInfo = ({ bestillingsdata, dollyEnvironments }) => { )} - {sykemelding &&
  • Sykemelding: q1
  • } + {sykemelding?.detaljertSykemelding &&
  • Sykemelding: q1
  • } {pensjonforvalter && bestillingsdata?.environments?.includes('q4') && ( diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/DollyFieldArray.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/DollyFieldArray.tsx index 1bede74b4b8..a5a19cbe2fa 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/DollyFieldArray.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/fieldArray/DollyFieldArray.tsx @@ -221,14 +221,14 @@ export const FormDollyFieldArray = ({ title = null, header, newEntry, - hjelpetekst = null, + hjelpetekst = null as unknown as string, nested = false, children, disabled = false, canBeEmpty = true, tag = null, isOrganisasjon = false, - handleNewEntry = null, + handleNewEntry = null as any, handleRemoveEntry = null, maxEntries = null as unknown as number, whiteBackground = false, diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx index c9b84bebba5..023cfe74d79 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx @@ -4,6 +4,10 @@ import { isDate } from 'date-fns' import { useFormContext } from 'react-hook-form' import { sigrunstubPensjonsgivendeAttributt } from '@/components/fagsystem/sigrunstubPensjonsgivende/form/Form' import { sigrunstubSummertSkattegrunnlagAttributt } from '@/components/fagsystem/sigrunstubSummertSkattegrunnlag/form/Form' +import { + nySykemeldingAttributt, + sykemeldingAttributt, +} from '@/components/fagsystem/sykdom/form/Form' export const panelError = (attributtPath) => { const { @@ -97,7 +101,8 @@ const getValgteAttributter = (values) => { 'pensjonforvalter.uforetrygd', 'pensjonforvalter.afpOffentlig', 'arenaforvalter', - 'sykemelding', + sykemeldingAttributt, + nySykemeldingAttributt, 'yrkesskader', 'brregstub', 'instdata', diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx index 7d58df60ac4..57e4a69a9b7 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx @@ -45,6 +45,7 @@ export const DollyDatepicker = ({ fromDate: minDate, toDate: maxDate, disabled: excludeDates, + defaultSelected: convertInputToDate(existingValue)?.toDate?.() || new Date(), }) useEffect(() => { diff --git a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx index 4d2ce074c1d..f54f9f228a4 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx @@ -567,6 +567,7 @@ export default ({ harArenaBestilling={harArenaBestilling(bestillingerFagsystemer)} /> { + const { data, isLoading, error } = useSWR>( + ['/testnav-sykemelding-proxy/tsm/api/sykmelding/ident', ident], + ([url, _ident]) => + fetcher(url, { + 'X-ident': ident, + }), + ) + + return { + sykemeldinger: data?.sykmeldinger || [], + loading: isLoading, + error: error, + } +} + export const useSykemeldingValidering = (values: any) => { const { data, error, trigger } = useSWRMutation>( '/testnav-sykemelding-api/api/v1/sykemeldinger/validate', diff --git a/apps/dolly-frontend/src/main/resources/application-local.yml b/apps/dolly-frontend/src/main/resources/application-local.yml index 3580c2dc24e..723f6f760e6 100644 --- a/apps/dolly-frontend/src/main/resources/application-local.yml +++ b/apps/dolly-frontend/src/main/resources/application-local.yml @@ -91,5 +91,7 @@ consumers: url: https://testnav-sykemelding-api-dev.intern.dev.nav.no testnav-arbeidssoekerregisteret-proxy: url: https://testnav-arbeidssoekerregisteret-proxy.intern.dev.nav.no + testnav-sykemelding-proxy: + url: https://testnav-sykemelding-proxy.intern.dev.nav.no testnav-api-oversikt-service: url: https://testnav-oversikt-service.intern.dev.nav.no diff --git a/apps/dolly-frontend/src/main/resources/application.yml b/apps/dolly-frontend/src/main/resources/application.yml index b3fd4531c62..b73ca3bf779 100644 --- a/apps/dolly-frontend/src/main/resources/application.yml +++ b/apps/dolly-frontend/src/main/resources/application.yml @@ -198,6 +198,11 @@ consumers: namespace: dolly url: http://testnav-arbeidsplassencv-proxy.dolly.svc.cluster.local cluster: dev-gcp + testnav-sykemelding-proxy: + name: testnav-sykemelding-proxy + namespace: dolly + url: http://testnav-arbeidsplassencv-proxy.dolly.svc.cluster.local + cluster: dev-gcp testnav-histark-proxy: name: testnav-histark-proxy namespace: dolly From ec9429b0b579c358a39c944493763b99c84f186d Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 13:51:20 +0200 Subject: [PATCH 15/20] - Add support for "Ny Sykemelding" in Sykemelding UI and backend integration. - Implement new attributes and validation logic for "Ny Sykemelding". - Refactor existing Sykemelding logic to account for "Ny Sykemelding". - Add dynamic proxy configuration for `testnav-sykemelding-proxy`. - Update SWR hooks and components to handle new sykemelding-related data. - Modify environment-specific configuration files. #deploy-test-frontend --- .../main/js/src/components/fagsystem/sykdom/visning/Visning.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx index 492a8791974..8cbe104bfb9 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx @@ -131,8 +131,6 @@ export const SykemeldingVisning = ({ let render: React.ReactNode - console.log('sykemeldinger: ', sykemeldinger) //TODO - SLETT MEG - if (manglerFagsystemData) { render = ( From 9fe26e35b8c1daaeaa417761e7368fab0dff96de Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 13:57:11 +0200 Subject: [PATCH 16/20] - Replace `defaultSelected` fallback value in Datepicker component with `undefined` instead of `new Date()` for improved input handling. #deploy-test-frontend --- .../js/src/components/ui/form/inputs/datepicker/Datepicker.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx index 57e4a69a9b7..ca5a357aa67 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/Datepicker.tsx @@ -45,7 +45,7 @@ export const DollyDatepicker = ({ fromDate: minDate, toDate: maxDate, disabled: excludeDates, - defaultSelected: convertInputToDate(existingValue)?.toDate?.() || new Date(), + defaultSelected: convertInputToDate(existingValue)?.toDate?.() ?? undefined, }) useEffect(() => { From 9a85674f441a955f00f24f6887fa161d2a18ac7a Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 14:00:05 +0200 Subject: [PATCH 17/20] - Remove unused `data` prop from `Visning` component in `MiljoTabs`. #deploy-test-frontend --- .../main/js/src/components/fagsystem/sykdom/visning/Visning.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx index 8cbe104bfb9..2abfb6b636f 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx @@ -149,7 +149,7 @@ export const SykemeldingVisning = ({ forsteMiljo={forsteMiljo} data={filteredData ?? mergetData} > - + ) } From 665a5f9c5050187d3689c469fdea053617f86da9 Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 14:05:56 +0200 Subject: [PATCH 18/20] - Remove unused `ident` prop from `VisningAvBestilling` in `Visning` component. #deploy-test-frontend --- .../main/js/src/components/fagsystem/sykdom/visning/Visning.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx index 2abfb6b636f..7a4bdfec22a 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/visning/Visning.tsx @@ -138,7 +138,7 @@ export const SykemeldingVisning = ({ ) } else if (sjekkManglerSykemeldingData(data) && sykemeldinger?.length === 0) { - render = + render = } else if (sykemeldinger?.length > 0) { render = } else { From 45b52c4d4d1e87235b7a335b48970b996101759b Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 14:17:37 +0200 Subject: [PATCH 19/20] - Fix typo in help text for "Ny Sykemelding" component. #deploy-test-frontend --- .../fagsystem/sykdom/form/partials/NySykemelding.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/NySykemelding.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/NySykemelding.tsx index f2f51bb2764..426bb543110 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/NySykemelding.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/sykdom/form/partials/NySykemelding.tsx @@ -18,8 +18,8 @@ export const NySykemelding = () => { name="sykemelding.nySykemelding.aktivitet" header="Aktivitet" hjelpetekst={ - 'Det kan ikke være dager uten sykemelding i mellom periodene. ' + - 'Unntaket er når en t.o.m. er på fredag, lørdag og søndag, så kan neste f.o.m. være senest mandag' + 'Det kan ikke være dager uten sykemelding mellom periodene. ' + + 'Unntaket er når en t.o.m. er på fredag, lørdag og søndag, så kan neste f.o.m. være senest mandag.' } newEntry={initialValuesAktivitet} handleNewEntry={() => { From 7b231b7217cff9aa86212f21c9e31f0b1046e5ce Mon Sep 17 00:00:00 2001 From: stigus Date: Thu, 25 Sep 2025 14:48:22 +0200 Subject: [PATCH 20/20] Refactor sykemelding handling: adjust error logging, update DTO structure, and enhance response handling in NySykemelding classes. #deploy-test-dolly-backend --- .../sykemelding/SykemeldingClient.java | 7 ++- .../command/NySykemeldingDeleteCommand.java | 3 ++ .../command/NySykemeldingPostCommand.java | 2 +- .../domain/dto/NySykemeldingResponseDTO.java | 50 ++++++++++++++----- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java index bd7637bebcc..b5761f8a08f 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/SykemeldingClient.java @@ -112,7 +112,6 @@ public Mono gjenopprett(RsDollyUtvidetBestilling bestilling, @Override public void release(List identer) { identer.forEach(ident -> nySykemeldingConsumer.deleteTsmSykemeldinger(ident) - .doOnError(WebClientError.logTo(log)) .subscribe()); } @@ -132,10 +131,10 @@ private String getStatus(DetaljertSykemeldingResponseDTO status) { } private String getStatus(NySykemeldingResponseDTO status) { - log.info("Ny sykemelding response for {} mottatt, {}", status.ident(), Json.pretty(status)); - return isNull(status.error()) + log.info("Ny sykemelding response for {} mottatt, {}", status.getIdent(), Json.pretty(status)); + return status.getStatus().is2xxSuccessful() ? "OK" - : status.error(); + : errorStatusDecoder.getErrorText(status.getStatus(), status.getAvvik()); } private Mono setProgress(BestillingProgress progress, String status) { diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingDeleteCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingDeleteCommand.java index fbdad150c16..8d2687d2165 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingDeleteCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingDeleteCommand.java @@ -2,8 +2,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import no.nav.testnav.libs.reactivecore.web.WebClientError; import no.nav.testnav.libs.reactivecore.web.WebClientHeader; import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; import reactor.core.publisher.Mono; import java.util.concurrent.Callable; @@ -27,6 +29,7 @@ public Mono call() { .header("X-ident", ident) .retrieve() .bodyToMono(Void.class) + .doOnError(throwable -> !(throwable instanceof WebClientResponseException.NotFound), WebClientError.logTo(log)) .doOnSuccess(response -> log.info("Slettet sykemeldinger i tsm for ident: {}", ident)); } } \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingPostCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingPostCommand.java index 92acd97d238..f486e17a416 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingPostCommand.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/command/NySykemeldingPostCommand.java @@ -31,7 +31,7 @@ public Mono call() { .retrieve() .bodyToMono(NySykemeldingResponseDTO.class) .doOnError(WebClientError.logTo(log)) - .onErrorResume(error -> Mono.just(new NySykemeldingResponseDTO(error.getMessage(), "NA", null, request.getIdent()))); + .onErrorResume(error -> NySykemeldingResponseDTO.of(WebClientError.describe(error), request.getIdent())); } } \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/NySykemeldingResponseDTO.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/NySykemeldingResponseDTO.java index cfd40cd79ad..fca301a6508 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/NySykemeldingResponseDTO.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/sykemelding/domain/dto/NySykemeldingResponseDTO.java @@ -1,17 +1,43 @@ package no.nav.dolly.bestilling.sykemelding.domain.dto; -import java.time.LocalDate; -import java.util.List; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import no.nav.testnav.libs.reactivecore.web.WebClientError; +import org.springframework.http.HttpStatus; +import reactor.core.publisher.Mono; -public record NySykemeldingResponseDTO( - String error, - String sykmeldingId, - List aktivitet, - String ident -) { - public record Aktivitet( - LocalDate fom, - LocalDate tom - ) { +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class NySykemeldingResponseDTO { + + private HttpStatus status; + private String avvik; + private NySykemeldingRequest nySykemeldingRequest; + private String msgId; + private String ident; + + public static Mono of(WebClientError.Description description, String ident) { + return Mono.just(NySykemeldingResponseDTO + .builder() + .ident(ident) + .status(description.getStatus()) + .avvik(description.getMessage()) + .build()); + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(JsonInclude.Include.NON_EMPTY) + public static class NySykemeldingRequest { + + private String sykemeldingId; + private NySykemeldingRequestDTO nySykemeldingRequestDTO; } }