Skip to content

Commit

Permalink
Merge pull request #16 from navikt/dev/beregn-dagpenger-status
Browse files Browse the repository at this point in the history
Dev/beregn dagpenger status
  • Loading branch information
jstnhlj authored Nov 22, 2022
2 parents 7b3d5e3 + fdc5939 commit 974321e
Show file tree
Hide file tree
Showing 11 changed files with 996 additions and 31 deletions.
14 changes: 14 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"seed": "ts-node prisma/seed.ts"
},
"dependencies": {
"@alheimsins/uker-fra-dato": "1.0.4",
"@elastic/ecs-pino-format": "1.3.0",
"@prisma/client": "4.6.1",
"axios": "1.1.3",
Expand Down
66 changes: 35 additions & 31 deletions src/api/arbeidssoker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,46 @@ import { getTokenFromCookie } from '../auth/tokenDings';

interface Arbeidssokerperioder {
status: number;
arbeidssokerperioder: [{ fraOgMed: string; tilOgMed?: string }?];
arbeidssokerperioder: [{ fraOgMed: string; tilOgMed?: string }] | [];
}

interface UnderOppfolging {
status: number;
underoppfolging: boolean;
}

export async function hentArbeidssokerPerioder(
veilarbregistreringGcpUrl: string,
token: string,
query: ParsedQs
): Promise<Arbeidssokerperioder> {
const fraOgMed = query.fraOgMed;
const tilOgMed = query.tilOgMed;
const url = `${veilarbregistreringGcpUrl}/veilarbregistrering/api/arbeidssoker/perioder/niva3?fraOgMed=${fraOgMed}${
tilOgMed ? `&tilOgMed=${tilOgMed}` : ''
}`;

try {
const { data, status } = await axios(url, {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
[config.CONSUMER_ID_HEADER_NAME]: config.CONSUMER_ID_HEADER_VALUE,
},
});
return {
status,
...data,
};
} catch (err) {
log.error(err);
return {
status: (err as AxiosError).response?.status || 500,
arbeidssokerperioder: [],
};
}
}

function arbeidssokerRoutes(
ptoProxyUrl = config.PTO_PROXY_URL,
veilarbregistreringGcpUrl = config.VEILARBREGISTRERING_GCP_URL
Expand Down Expand Up @@ -73,7 +105,7 @@ function arbeidssokerRoutes(
return res.status(401).end();
}

const arbeidssokerperioder = await hentArbeidssokerPerioder(token, req.query);
const arbeidssokerperioder = await hentArbeidssokerPerioder(veilarbregistreringGcpUrl, token, req.query);
const underoppfolging = await hentUnderOppfolging(token);

return res.send({
Expand Down Expand Up @@ -108,41 +140,13 @@ function arbeidssokerRoutes(
return res.status(401).end();
}

const perioder = await hentArbeidssokerPerioder(token, { fraOgMed: '2020-01-01' });
const perioder = await hentArbeidssokerPerioder(veilarbregistreringGcpUrl, token, { fraOgMed: '2020-01-01' });
const underOppfolging = await hentUnderOppfolging(token);
const erUnderOppfolging = underOppfolging.underoppfolging;
const erArbeidssoker = erUnderOppfolging || perioder.arbeidssokerperioder.length > 0;
return res.send({ erArbeidssoker });
});

async function hentArbeidssokerPerioder(token: string, query: ParsedQs): Promise<Arbeidssokerperioder> {
const fraOgMed = query.fraOgMed;
const tilOgMed = query.tilOgMed;
const url = `${veilarbregistreringGcpUrl}/veilarbregistrering/api/arbeidssoker/perioder/niva3?fraOgMed=${fraOgMed}${
tilOgMed ? `&tilOgMed=${tilOgMed}` : ''
}`;

try {
const { data, status } = await axios(url, {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
[config.CONSUMER_ID_HEADER_NAME]: config.CONSUMER_ID_HEADER_VALUE,
},
});
return {
status,
...data,
};
} catch (err) {
log.error(err);
return {
status: (err as AxiosError).response?.status || 500,
arbeidssokerperioder: [],
};
}
}

async function hentUnderOppfolging(token: string): Promise<UnderOppfolging> {
try {
const { data, status } = await axios(`${ptoProxyUrl}/veilarboppfolging/api/niva3/underoppfolging`, {
Expand Down
91 changes: 91 additions & 0 deletions src/api/data/dagpengerStatus/beregnArbeidssokerPerioder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import ukerFraDato from '@alheimsins/uker-fra-dato';
import { BeregnedePerioder } from './typer';

export function dagerFraDato(from: Date, to?: Date): number {
const todate = to || new Date();
const start = new Date(from.toISOString().substr(0, 10));
const end = new Date(todate.toISOString().substr(0, 10));
const millis = end.getTime() - start.getTime();
const days = millis / 3600000 / 24;
return Math.floor(days);
}

export interface Periode {
fraOgMed: string;
tilOgMed?: string;
}

interface Props {
arbeidssokerperioder: [] | Periode[];
}

function sorterArbeidssokerperioderSisteForst(a: Periode, b: Periode) {
return new Date(b.fraOgMed).getTime() - new Date(a.fraOgMed).getTime();
}

function harAktivArbeidssokerperiode(perioder: Periode[]) {
const sistePeriode = perioder[0];
return sistePeriode.tilOgMed === null || sistePeriode.tilOgMed === undefined;
}

function beregnAntallDagerSidenSisteArbeidssokerperiode(dato: string | null) {
return dagerFraDato(dato ? new Date(dato) : new Date());
}

function beregnAntallUkerSidenSisteArbeidssokerperiode(dato: string | null) {
return ukerFraDato(dato ? new Date(dato) : new Date());
}

function beregnAntallUkerMellomSisteArbeidssokerperioder(perioder: Periode[]) {
const sistePeriode = perioder[0];
const nestSistePeriode = perioder[1];
return ukerFraDato(new Date(nestSistePeriode?.tilOgMed || '2020-01-01'), new Date(sistePeriode.fraOgMed));
}

function beregnArbeidssokerperioder(props: Props | null | undefined): BeregnedePerioder {
const { arbeidssokerperioder } = props ? props : { arbeidssokerperioder: null };

if (arbeidssokerperioder === null) {
return {
harAktivArbeidssokerperiode: 'INGEN_DATA',
aktivPeriodeStart: 'INGEN_DATA',
antallDagerSidenSisteArbeidssokerperiode: 'INGEN_DATA',
antallUkerSidenSisteArbeidssokerperiode: 'INGEN_DATA',
antallUkerMellomSisteArbeidssokerperioder: 'INGEN_DATA',
};
}

if (arbeidssokerperioder.length === 0) {
return {
harAktivArbeidssokerperiode: 'N/A',
aktivPeriodeStart: 'N/A',
antallDagerSidenSisteArbeidssokerperiode: 'N/A',
antallUkerSidenSisteArbeidssokerperiode: 'N/A',
antallUkerMellomSisteArbeidssokerperioder: 'N/A',
};
}

arbeidssokerperioder.sort(sorterArbeidssokerperioderSisteForst);

const aktivArbeidssokerperiode = harAktivArbeidssokerperiode(arbeidssokerperioder);
const sluttDatoSistePeriode = arbeidssokerperioder[0].tilOgMed ?? null;
const harMerEnnEnPeriode = arbeidssokerperioder.length > 1;

return {
harAktivArbeidssokerperiode: aktivArbeidssokerperiode ? 'Ja' : 'Nei',
aktivPeriodeStart: aktivArbeidssokerperiode
? new Date(arbeidssokerperioder[0].fraOgMed).toISOString().substring(0, 10)
: 'Ingen aktive perioder',
antallDagerSidenSisteArbeidssokerperiode: aktivArbeidssokerperiode
? 'Ikke avsluttet'
: beregnAntallDagerSidenSisteArbeidssokerperiode(sluttDatoSistePeriode),
antallUkerSidenSisteArbeidssokerperiode: aktivArbeidssokerperiode
? 'Ikke avsluttet'
: beregnAntallUkerSidenSisteArbeidssokerperiode(sluttDatoSistePeriode),
antallUkerMellomSisteArbeidssokerperioder: harMerEnnEnPeriode
? beregnAntallUkerMellomSisteArbeidssokerperioder(arbeidssokerperioder)
: 'Første periode',
};
}

export default beregnArbeidssokerperioder;
101 changes: 101 additions & 0 deletions src/api/data/dagpengerStatus/beregnDagpengeStatus.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import {
BeregnedePerioder,
BrukerInfoData,
BrukerregistreringData,
DagpengeStatus,
DpInnsynPaabegyntSoknad,
DpInnsynSoknad,
Vedtak,
} from './typer';

export const sorterEtterNyesteDatoInnsendt = (a: DpInnsynSoknad, b: DpInnsynSoknad) =>
new Date(b.datoInnsendt).getTime() - new Date(a.datoInnsendt).getTime();

export const sorterEtterNyesteVedtak = (a: Vedtak, b: Vedtak) =>
new Date(b.datoFattet).getTime() - new Date(a.datoFattet).getTime();

function beregnDagpengeStatus({
brukerInfoData,
registreringData,
paabegynteSoknader,
innsendteSoknader,
dagpengeVedtak,
arbeidssokerperioder,
}: {
brukerInfoData: BrukerInfoData;
registreringData: BrukerregistreringData | null;
paabegynteSoknader: DpInnsynPaabegyntSoknad[];
innsendteSoknader: DpInnsynSoknad[];
dagpengeVedtak: Vedtak[];
arbeidssokerperioder: BeregnedePerioder;
}): DagpengeStatus {
const { rettighetsgruppe } = brukerInfoData;
const { aktivPeriodeStart, harAktivArbeidssokerperiode } = arbeidssokerperioder;
const erIaktivPeriode = harAktivArbeidssokerperiode === 'Ja';
const harOpprettetDato = registreringData?.registrering?.opprettetDato;

if (rettighetsgruppe === 'DAGP') {
return 'mottar';
}

if (!harOpprettetDato && !erIaktivPeriode) {
return 'ukjent';
}

const registreringsDato = harOpprettetDato
? new Date(registreringData?.registrering!.opprettetDato)
: new Date(aktivPeriodeStart);
const sistInnsendteSoknad = innsendteSoknader.sort(sorterEtterNyesteDatoInnsendt)[0];
const sisteDagpengevedtak = dagpengeVedtak.sort(sorterEtterNyesteVedtak)[0];

const erVedtakNyereEnnSoknad =
sisteDagpengevedtak &&
sistInnsendteSoknad &&
new Date(sisteDagpengevedtak.datoFattet).getTime() > new Date(sistInnsendteSoknad.datoInnsendt).getTime();

if (erVedtakNyereEnnSoknad) {
const vedtakErNyereEnnSisteRegistreringsdato =
new Date(sisteDagpengevedtak.datoFattet).getTime() > registreringsDato.getTime();
if (sisteDagpengevedtak && sisteDagpengevedtak.status === 'AVSLÅTT' && vedtakErNyereEnnSisteRegistreringsdato) {
return 'avslag';
}

const erVedtakAvsluttet = sisteDagpengevedtak.tilDato
? new Date(sisteDagpengevedtak.tilDato).getTime() < new Date().getTime()
: false;

if (sisteDagpengevedtak && sisteDagpengevedtak.status === 'INNVILGET' && !erVedtakAvsluttet) {
return vedtakErNyereEnnSisteRegistreringsdato ? 'innvilget' : 'tidligere-innvilget';
}

if (erVedtakAvsluttet) {
return 'stanset';
}
}

const sistPaabegynteSoknad = paabegynteSoknader.sort(
(a: DpInnsynPaabegyntSoknad, b: DpInnsynPaabegyntSoknad) =>
new Date(a.sistEndret).getTime() - new Date(b.sistEndret).getTime()
)[0];

const harPaabegyntEtterInnsendt =
sistPaabegynteSoknad &&
sistInnsendteSoknad &&
new Date(sistPaabegynteSoknad.sistEndret).getTime() > new Date(sistInnsendteSoknad?.datoInnsendt).getTime();

if (harPaabegyntEtterInnsendt) {
return 'soktogpaabegynt';
}

if (sistInnsendteSoknad) {
return 'sokt';
}

if (sistPaabegynteSoknad) {
return 'paabegynt';
}

return 'ukjent';
}

export default beregnDagpengeStatus;
Loading

0 comments on commit 974321e

Please sign in to comment.