Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package no.nav.ung.sak.behandlingslager.tilkjentytelse;

import jakarta.persistence.AttributeOverride;
import jakarta.persistence.AttributeOverrides;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import no.nav.ung.sak.behandlingslager.BaseEntitet;
import no.nav.ung.sak.typer.AktørId;

@Entity(name = "InntektAbonnement")
@Table(name = "INNTEKT_ABONNEMENT")
public class InntektAbonnement extends BaseEntitet {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_INNTEKT_ABONNEMENT")
private Long id;

@Column(name = "abonnement_id", nullable = false, unique = true)
private String abonnementId;

@Embedded
@AttributeOverrides(@AttributeOverride(name = "aktørId", column = @Column(name = "aktoer_id", nullable = false)))
private AktørId aktørId;

@Version
@Column(name = "versjon", nullable = false)
private long versjon;

@Column(name = "aktiv", nullable = false)
private boolean aktiv = true;

public InntektAbonnement() {
}

public InntektAbonnement(String abonnementId, AktørId aktørId) {
this.abonnementId = abonnementId;
this.aktørId = aktørId;
}

public Long getId() {
return id;
}

public String getAbonnementId() {
return abonnementId;
}

public AktørId getAktørId() {
return aktørId;
}

public boolean erAktiv() {
return aktiv;
}
public void setAktiv(boolean aktiv) {
this.aktiv = aktiv;
}
public long getVersjon() {
return versjon;
}

public void setVersjon(long versjon) {
this.versjon = versjon;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package no.nav.ung.sak.behandlingslager.tilkjentytelse;

import jakarta.enterprise.context.Dependent;
import jakarta.inject.Inject;
import jakarta.persistence.EntityManager;
import no.nav.ung.sak.typer.AktørId;

import java.util.Optional;

@Dependent
public class InntektAbonnementRepository {

private EntityManager entityManager;

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

public void lagre(InntektAbonnement abonnement) {
entityManager.persist(abonnement);
}

public Optional<InntektAbonnement> hentAbonnementForAktør(AktørId aktørId) {
var query = entityManager.createQuery(
"SELECT r FROM InntektAbonnement r WHERE r.aktørId = :aktørId",
InntektAbonnement.class
);
query.setParameter("aktørId", aktørId);
return query.getResultStream().findFirst();
}

public void slettAbonnement(InntektAbonnement abonnement) {
abonnement.setAktiv(false);
entityManager.persist(abonnement);
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
package no.nav.ung.sak.domene.registerinnhenting;

import jakarta.enterprise.context.Dependent;
import jakarta.inject.Inject;
import no.nav.k9.felles.exception.TekniskException;
import no.nav.k9.felles.integrasjon.rest.OidcRestClient;
import no.nav.k9.felles.integrasjon.rest.ScopedRestIntegration;
import no.nav.k9.felles.konfigurasjon.konfig.KonfigVerdi;
import no.nav.ung.sak.behandlingslager.tilkjentytelse.InntektAbonnement;
import no.nav.ung.sak.typer.AktørId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URI;
import java.net.URISyntaxException;
import java.time.LocalDate;
import java.util.List;

@Dependent
//TODO Endre default verdi til produksjonsurl når vi går til prod
@ScopedRestIntegration(scopeKey = "inntektskomponenten.scope", defaultScope = "api://ikomp-q2.intern.dev.nav.no/.default")
public class InntektAbonnentKlient {

private static final Logger LOG = LoggerFactory.getLogger(InntektAbonnentKlient.class);
public static final int INNTEKT_HENDELSE_LIMIT = 1000;

private OidcRestClient oidcRestClient;
private final URI opprettAbonnementURI;
private final URI avsluttAbonnementURI;
private final URI hendelseStartURI;
private final URI hendelseURI;

@Inject
public InntektAbonnentKlient(
@KonfigVerdi(value = "inntektskomponenten.url",
defaultVerdi = "http://ikomp.team-inntekt") String baseUrl,
OidcRestClient oidcRestClient) {
this.oidcRestClient = oidcRestClient;
this.opprettAbonnementURI = tilUri(baseUrl, "rs/api/v1/abonnement");
this.avsluttAbonnementURI = tilUri(baseUrl, "rs/api/v1/abonnement/%s");
this.hendelseStartURI = tilUri(baseUrl, "rest/v2/abonnement/hendelse/start");
this.hendelseURI = tilUri(baseUrl, "rest/v2/abonnement/hendelse");
}

public InntektAbonnement opprettAbonnement(AktørId aktørId, String formaal, List<String> filter,
String fomMaanedObservasjon, String tomMaanedObservasjon,
LocalDate sisteBruksdag) {
var request = new OpprettAbonnementRequest(
aktørId.getId(),
formaal,
filter,
fomMaanedObservasjon,
tomMaanedObservasjon,
sisteBruksdag
);
AbonnementResponse response;
try {
response = oidcRestClient.post(opprettAbonnementURI, request, AbonnementResponse.class);
} catch (Exception e) {
throw new TekniskException("UNG-947528", "Feil ved opprettelse av abonnement", e);
}

var abonnement = new InntektAbonnement(String.valueOf(response.abonnementId()), aktørId);
LOG.info("Opprettet abonnementId: {} for aktør: {}", response.abonnementId(), aktørId.getId());
return abonnement;
}

public long hentStartSekvensnummer(LocalDate dato) {
var request = new AbonnementHendelseStartApiInn(dato);
AbonnementHendelseStartApiUt response;
try {
response = oidcRestClient.post(hendelseStartURI, request, AbonnementHendelseStartApiUt.class);
} catch (Exception e) {
throw new TekniskException("UNG-440600", "Feil ved henting av startsekvensnummer", e);
}
return response.sekvensnummer();
}

public List<AbonnementHendelse> sjekkNyeInntektHendelser(long fraSekvensnummer, List<String> filter) {
var request = new InntektHendelserRequest(fraSekvensnummer, INNTEKT_HENDELSE_LIMIT, filter);
AbonnementHendelseApiUt response;
try {
response = oidcRestClient.post(hendelseURI, request, AbonnementHendelseApiUt.class);
} catch (Exception e) {
throw new TekniskException("UNG-769025", "Feil ved henting av nye hendelser", e);
}
return response.data;
}

public void avsluttAbonnement(long abonnementId) {
try {
var uri = URI.create(String.format(avsluttAbonnementURI.toString(), abonnementId));
// TODO fikse delete kall mot inntektskomponenten
oidcRestClient.delete(uri);
} catch (Exception e) {
throw new TekniskException("UNG-328650", "Feil ved avslutning av abonnement", e);
}
LOG.info("Avsluttet abonnement {}", abonnementId);
}

private static URI tilUri(String baseUrl, String path) {
try {
return new URI(baseUrl + "/" + path);
} catch (URISyntaxException e) {
throw new IllegalArgumentException("Ugyldig konfigurasjon for inntektskomponenten.url", e);
}
}

public record OpprettAbonnementRequest(
String norskident,
String formaal,
List<String> filter,
String fomMaanedObservasjon,
String tomMaanedObservasjon,
LocalDate sisteBruksdag
) {}

public record AbonnementResponse(String abonnementId) {
}

public record AbonnementHendelseStartApiInn(LocalDate dato) {}

public record AbonnementHendelseStartApiUt(long sekvensnummer) {}

public record InntektHendelserRequest(
long fra,
int antall,
List<String> filter
) {}

public record AbonnementHendelseApiUt(List<AbonnementHendelse> data) {}

public record AbonnementHendelse(
long sekvensnummer,
String norskident,
String maaned,
String behandlet,
List<String> filter
) {}






}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
create table inntekt_abonnement
(
id bigint not null primary key,
abonnement_id varchar(100) not null,
aktoer_id varchar(50) not null,
periode daterange not null,
siste_bruksdag date not null,
aktiv boolean not null,
versjon bigint default 0 not null,
opprettet_tid timestamp(3) default CURRENT_TIMESTAMP not null,
opprettet_av varchar(20) default 'VL' not null,
endret_av varchar(20),
endret_tid timestamp(3)
);

create unique index uidx_inntekt_abonnement_aktoer_id
on inntekt_abonnement (aktoer_id) where aktiv = true;

create unique index uidx_inntekt_abonnement_abonnement_id
on inntekt_abonnement (abonnement_id) where aktiv = true;

create sequence seq_inntekt_abonnement increment by 50 minvalue 1000000;

comment on table inntekt_abonnement is 'Kobling mellom abonnement-ID og aktør-ID for abonnementer i inntektskomponenten.';
comment on column inntekt_abonnement.abonnement_id is 'Unik abonnement identifikator for spørring mot inntekskomponenten';
comment on column inntekt_abonnement.aktoer_id is 'Aktør-ID som eier abonnementet';
comment on column inntekt_abonnement.periode is 'Periode for abonnementet';
comment on column inntekt_abonnement.siste_bruksdag is 'Siste bruksdato for abonnementet';

5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,11 @@
<version>1.1.6</version>
</dependency>

<dependency>
<groupId>no.nav.inntektskomponenten</groupId>
<artifactId>inntektskomponenten-rest-v2</artifactId>
<version>9.5.2</version>
</dependency>

<!-- EKSTRA TEST AVHENGIGHETER FOR LOKAL WEBSERVER -->
<!-- NB: Definer scope der det brukes, ikke her. -->
Expand Down
Loading