import { PERIODISERING_DAGER, PERIODISERING_TIMER, PERIODISERING_UKER, } from '..'; import { Vegarbeidsperiode } from '../domene/Soknad'; const MS_PER_DAG = 1000 * 60 * 60 * 24; function antallDagerIPeriode(fra: Date, til: Date): number { // Vi bruker UTC-datoer for å unngå bugs med sommertid, se https://stackoverflow.com/a/15289883 const utcFra = Date.UTC(fra.getFullYear(), fra.getMonth(), fra.getDate()); const utcTil = Date.UTC(til.getFullYear(), til.getMonth(), til.getDate()); return Math.floor((utcTil - utcFra) / MS_PER_DAG); } function erVarighetOgPeriodeRegistrert( vegarbeidsperiode: Vegarbeidsperiode ): boolean { const arbeidsvarighet = vegarbeidsperiode?.arbeidsvarighet; const varighet = Number.isInteger(parseVarighet(arbeidsvarighet?.varighet)); return !!( vegarbeidsperiode?.fra && vegarbeidsperiode?.til && arbeidsvarighet && arbeidsvarighet?.periodisering && varighet ); } function isNumber(value: string | number): value is number { return typeof value === 'number'; } function parseVarighet(varighet: string | number): number { if (isNumber(varighet)) { return varighet; } return Number.parseInt(varighet, 10); } export function erAngittVarighetInnenforPeriode( vegarbeidsperiode: Vegarbeidsperiode ): boolean { if (!erVarighetOgPeriodeRegistrert(vegarbeidsperiode)) { return true; } // Du kan alltid bruke en dag mer enn differansen (f.eks. samme dag til samme dag = ingen diff men 1 dag) const antallDager = antallDagerIPeriode( new Date(Date.parse(vegarbeidsperiode.fra)), new Date(Date.parse(vegarbeidsperiode.til)) ) + 1; const arbeidsvarighet = vegarbeidsperiode.arbeidsvarighet; const periodisering = arbeidsvarighet.periodisering; const varighet = parseVarighet(arbeidsvarighet.varighet); if (varighet === 0) { return false; } switch (periodisering) { case PERIODISERING_UKER: return varighet * 7 <= antallDager; case PERIODISERING_DAGER: return varighet <= antallDager; case PERIODISERING_TIMER: return varighet <= 24 * antallDager; } return false; }