Skip to content

Commit

Permalink
fix: Korjaa logiikkaa milloin julkaisut tulevat näkyviin kansalaispuo…
Browse files Browse the repository at this point in the history
…lelle (#456)

* korjaa logiikkaa milloin julkaisut tulevat näkyviin kansalaispuolelle

* aseta defaultTimeTo pakolliseksi

* korjaa päivämäärävertailuja

* korjaa kellonaikaoletus päivän loppuun
  • Loading branch information
tkork authored Oct 27, 2022
1 parent 91cfe63 commit e865202
Show file tree
Hide file tree
Showing 8 changed files with 58 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ describe("Hyväksytyn hyväksymispäätöskuulutuksen jälkeen", () => {

const epaAktiivinenProjekti1 = await projektiDatabase.loadProjektiByOid(oid);
assertIsDefined(epaAktiivinenProjekti1);
expect(epaAktiivinenProjekti1!.ajastettuTarkistus).to.eql("2101-01-01T23:59:00+02:00"); // MOCKED_TIMESTAMP + 1 year
expect(epaAktiivinenProjekti1!.ajastettuTarkistus).to.eql("2101-01-01T23:59:59+02:00"); // MOCKED_TIMESTAMP + 1 year
// TODO Aineistot poistetaan vuosi epäaktiivisen olon jälkeen

await lisaaKasittelynTilaJatkopaatos1({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@
"muistutusoikeusPaattyyPaiva": "2042-06-08"
}
],
"ajastettuTarkistus": "2101-01-01T23:59:00+02:00",
"ajastettuTarkistus": "2101-01-01T23:59:59+02:00",
"euRahoitus": false,
"suunnitteluVaihe": {
"hankkeenKuvaus": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@
"muistutusoikeusPaattyyPaiva": "2042-06-08"
}
],
"ajastettuTarkistus": "2101-01-01T23:59:00+02:00",
"ajastettuTarkistus": "2101-01-01T23:59:59+02:00",
"euRahoitus": false,
"suunnitteluVaihe": {
"hankkeenKuvaus": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,8 @@ import {
HyvaksymisPaatosVaihePDF,
LocalizedMap,
} from "../../database/model";
import { parseAndAddDate, parseDate } from "../../util/dateUtil";
import {
HYVAKSYMISPAATOS_DURATION_UNIT,
HYVAKSYMISPAATOS_DURATION_VALUE,
JATKOPAATOS_DURATION_UNIT,
JATKOPAATOS_DURATION_VALUE,
} from "../../projekti/status/statusHandler";
import { parseAndAddDateTime, parseDate } from "../../util/dateUtil";
import { HYVAKSYMISPAATOS_DURATION, JATKOPAATOS_DURATION } from "../../projekti/status/statusHandler";
import { AsiakirjaTyyppi, Kieli } from "../../../../common/graphql/apiModel";
import { fileService } from "../../files/fileService";
import { ProjektiPaths } from "../../files/ProjektiPath";
Expand All @@ -37,10 +32,9 @@ export abstract class AbstractHyvaksymisPaatosVaiheTilaManager extends TilaManag
if (!julkaisu.kuulutusVaihePaattyyPaiva) {
throw new Error("julkaisulta.kuulutusVaihePaattyyPaiva puuttuu");
}
if (isHyvaksymisPaatos) {
return parseAndAddDate(julkaisu.kuulutusVaihePaattyyPaiva, HYVAKSYMISPAATOS_DURATION_VALUE, HYVAKSYMISPAATOS_DURATION_UNIT)?.format();
}
return parseAndAddDate(julkaisu.kuulutusVaihePaattyyPaiva, JATKOPAATOS_DURATION_VALUE, JATKOPAATOS_DURATION_UNIT)?.format();
const paatosDuration = isHyvaksymisPaatos ? HYVAKSYMISPAATOS_DURATION : JATKOPAATOS_DURATION;

return parseAndAddDateTime(julkaisu.kuulutusVaihePaattyyPaiva, "end-of-day", paatosDuration)?.format();
}

protected async generatePDFs(
Expand Down
15 changes: 9 additions & 6 deletions backend/src/projekti/status/projektiJulkinenStatusHandler.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as API from "../../../../common/graphql/apiModel";
import { Status } from "../../../../common/graphql/apiModel";
import { isDateInThePast, parseDate } from "../../util/dateUtil";
import { isDateTimeInThePast, parseDate } from "../../util/dateUtil";
import dayjs from "dayjs";
import { AbstractHyvaksymisPaatosEpaAktiivinenStatusHandler, StatusHandler } from "./statusHandler";

Expand Down Expand Up @@ -32,7 +32,7 @@ export function applyProjektiJulkinenStatus(projekti: API.ProjektiJulkinen): voi
const nahtavillaOlo = new (class extends StatusHandler<API.ProjektiJulkinen> {
handle(p: API.ProjektiJulkinen) {
const kuulutusPaiva = projekti.nahtavillaoloVaihe?.kuulutusPaiva;
if (kuulutusPaiva && parseDate(kuulutusPaiva).isBefore(dayjs())) {
if (kuulutusPaiva && isDateTimeInThePast(kuulutusPaiva, "start-of-day")) {
projekti.status = API.Status.NAHTAVILLAOLO;
super.handle(p); // Continue evaluating next rules
}
Expand All @@ -42,7 +42,10 @@ export function applyProjektiJulkinenStatus(projekti: API.ProjektiJulkinen): voi
const hyvaksymisMenettelyssa = new (class extends StatusHandler<API.ProjektiJulkinen> {
handle(p: API.ProjektiJulkinen) {
const nahtavillaoloVaihe = projekti.nahtavillaoloVaihe;
if (nahtavillaoloVaihe?.kuulutusVaihePaattyyPaiva && isDateInThePast(nahtavillaoloVaihe.kuulutusVaihePaattyyPaiva)) {
if (
nahtavillaoloVaihe?.kuulutusVaihePaattyyPaiva &&
isDateTimeInThePast(nahtavillaoloVaihe.kuulutusVaihePaattyyPaiva, "end-of-day")
) {
projekti.status = API.Status.HYVAKSYMISMENETTELYSSA;
super.handle(p); // Continue evaluating next rules
}
Expand All @@ -52,7 +55,7 @@ export function applyProjektiJulkinenStatus(projekti: API.ProjektiJulkinen): voi
const hyvaksytty = new (class extends StatusHandler<API.ProjektiJulkinen> {
handle(p: API.ProjektiJulkinen) {
const hyvaksymisPaatosVaihe = projekti.hyvaksymisPaatosVaihe;
if (hyvaksymisPaatosVaihe?.kuulutusPaiva && isDateInThePast(hyvaksymisPaatosVaihe.kuulutusPaiva)) {
if (hyvaksymisPaatosVaihe?.kuulutusPaiva && isDateTimeInThePast(hyvaksymisPaatosVaihe.kuulutusPaiva, "start-of-day")) {
projekti.status = API.Status.HYVAKSYTTY;
super.handle(p); // Continue evaluating next rules
}
Expand All @@ -68,7 +71,7 @@ export function applyProjektiJulkinenStatus(projekti: API.ProjektiJulkinen): voi
const jatkoPaatos1 = new (class extends StatusHandler<API.ProjektiJulkinen> {
handle(p: API.ProjektiJulkinen) {
const jatkoPaatos1Vaihe = projekti.jatkoPaatos1Vaihe;
if (jatkoPaatos1Vaihe?.kuulutusPaiva && isDateInThePast(jatkoPaatos1Vaihe.kuulutusPaiva)) {
if (jatkoPaatos1Vaihe?.kuulutusPaiva && isDateTimeInThePast(jatkoPaatos1Vaihe.kuulutusPaiva, "start-of-day")) {
projekti.status = API.Status.JATKOPAATOS_1;
super.handle(p); // Continue evaluating next rules
}
Expand All @@ -84,7 +87,7 @@ export function applyProjektiJulkinenStatus(projekti: API.ProjektiJulkinen): voi
const jatkoPaatos2 = new (class extends StatusHandler<API.ProjektiJulkinen> {
handle(p: API.ProjektiJulkinen) {
const jatkoPaatos2Vaihe = projekti.jatkoPaatos2Vaihe;
if (jatkoPaatos2Vaihe?.kuulutusPaiva && isDateInThePast(jatkoPaatos2Vaihe.kuulutusPaiva)) {
if (jatkoPaatos2Vaihe?.kuulutusPaiva && isDateTimeInThePast(jatkoPaatos2Vaihe.kuulutusPaiva, "start-of-day")) {
projekti.status = API.Status.JATKOPAATOS_2;
super.handle(p); // Continue evaluating next rules
}
Expand Down
6 changes: 3 additions & 3 deletions backend/src/projekti/status/projektiStatusHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { log } from "../../logger";
import { perustiedotValidationSchema } from "../../../../src/schemas/perustiedot";
import { findJulkaisutWithTila, findJulkaisuWithTila } from "../projektiUtil";
import { AbstractHyvaksymisPaatosEpaAktiivinenStatusHandler, StatusHandler } from "./statusHandler";
import { isDateInThePast } from "../../util/dateUtil";
import { isDateTimeInThePast } from "../../util/dateUtil";

export function applyProjektiStatus(projekti: API.Projekti): void {
const perustiedot = new (class extends StatusHandler<API.Projekti> {
Expand Down Expand Up @@ -67,7 +67,7 @@ export function applyProjektiStatus(projekti: API.Projekti): void {
handle(p: API.Projekti) {
const nahtavillaoloVaihe = findJulkaisuWithTila(p.nahtavillaoloVaiheJulkaisut, NahtavillaoloVaiheTila.HYVAKSYTTY);
const nahtavillaoloKuulutusPaattyyInThePast =
nahtavillaoloVaihe?.kuulutusVaihePaattyyPaiva && isDateInThePast(nahtavillaoloVaihe.kuulutusVaihePaattyyPaiva);
nahtavillaoloVaihe?.kuulutusVaihePaattyyPaiva && isDateTimeInThePast(nahtavillaoloVaihe.kuulutusVaihePaattyyPaiva, "end-of-day");

if (nahtavillaoloKuulutusPaattyyInThePast) {
p.status = API.Status.HYVAKSYMISMENETTELYSSA;
Expand All @@ -83,7 +83,7 @@ export function applyProjektiStatus(projekti: API.Projekti): void {

const nahtavillaoloVaihe = findJulkaisuWithTila(p.nahtavillaoloVaiheJulkaisut, NahtavillaoloVaiheTila.HYVAKSYTTY);
const nahtavillaoloKuulutusPaattyyInThePast =
nahtavillaoloVaihe?.kuulutusVaihePaattyyPaiva && isDateInThePast(nahtavillaoloVaihe.kuulutusVaihePaattyyPaiva);
nahtavillaoloVaihe?.kuulutusVaihePaattyyPaiva && isDateTimeInThePast(nahtavillaoloVaihe.kuulutusVaihePaattyyPaiva, "end-of-day");

if (hasHyvaksymisPaatos && nahtavillaoloKuulutusPaattyyInThePast) {
p.status = API.Status.HYVAKSYTTY;
Expand Down
24 changes: 5 additions & 19 deletions backend/src/projekti/status/statusHandler.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import * as API from "../../../../common/graphql/apiModel";
import { isDateInThePast } from "../../util/dateUtil";
import { DateAddTuple, isDateTimeInThePast } from "../../util/dateUtil";

export const HYVAKSYMISPAATOS_DURATION_VALUE = 1;
export const HYVAKSYMISPAATOS_DURATION_UNIT = "year";
export const JATKOPAATOS_DURATION_VALUE = 6;
export const JATKOPAATOS_DURATION_UNIT = "months";
export const HYVAKSYMISPAATOS_DURATION: DateAddTuple = [1, "year"];
export const JATKOPAATOS_DURATION: DateAddTuple = [6, "months"];

// Chain of responsibilites pattern to determine projekti status
export abstract class StatusHandler<T> {
Expand Down Expand Up @@ -48,20 +46,8 @@ export abstract class AbstractHyvaksymisPaatosEpaAktiivinenStatusHandler<
// Kuulutusvaiheen päättymisestä pitää olla vuosi
const kuulutusVaihePaattyyPaiva = hyvaksymisPaatosVaihe?.kuulutusVaihePaattyyPaiva;
if (kuulutusVaihePaattyyPaiva) {
let hyvaksymisPaatosKuulutusPaattyyInThePast: boolean;
if (this.isHyvaksymisPaatos) {
hyvaksymisPaatosKuulutusPaattyyInThePast = isDateInThePast(
kuulutusVaihePaattyyPaiva,
HYVAKSYMISPAATOS_DURATION_VALUE,
HYVAKSYMISPAATOS_DURATION_UNIT
);
} else {
hyvaksymisPaatosKuulutusPaattyyInThePast = isDateInThePast(
kuulutusVaihePaattyyPaiva,
JATKOPAATOS_DURATION_VALUE,
JATKOPAATOS_DURATION_UNIT
);
}
const paatosDuration = this.isHyvaksymisPaatos ? HYVAKSYMISPAATOS_DURATION : JATKOPAATOS_DURATION;
const hyvaksymisPaatosKuulutusPaattyyInThePast = isDateTimeInThePast(kuulutusVaihePaattyyPaiva, "end-of-day", paatosDuration);

if (hyvaksymisPaatosKuulutusPaattyyInThePast) {
p.status = this.epaAktiivisuusStatus;
Expand Down
51 changes: 33 additions & 18 deletions backend/src/util/dateUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,30 @@ const DEFAULT_TIMEZONE = "Europe/Helsinki";
process.env.TZ = DEFAULT_TIMEZONE;
dayjs.tz.setDefault(DEFAULT_TIMEZONE);

export type DateAddTuple = [number, ManipulateType];
export type DefaultTimeTo = "end-of-day" | "start-of-day";

export const ISO_DATE_FORMAT = "YYYY-MM-DD";

export function isDateStringLackingTimeElement(dateString: string): boolean {
return dateString.length === ISO_DATE_FORMAT.length;
}

const DATE_TIME_FORMAT = "YYYY-MM-DDTHH:mm";

export function parseDate(date: string): Dayjs {
let d: Dayjs;
if (date.length == ISO_DATE_FORMAT.length) {
d = dayjs(date, ISO_DATE_FORMAT, true).tz(DEFAULT_TIMEZONE, true);
if (d.isValid()) {
return d;
export function parseDate(dateString: string): Dayjs {
let date: Dayjs;
if (isDateStringLackingTimeElement(dateString)) {
date = dayjs(dateString, ISO_DATE_FORMAT, true).tz(DEFAULT_TIMEZONE, true);
if (date.isValid()) {
return date;
}
}
d = dayjs(date, DATE_TIME_FORMAT, true).tz(DEFAULT_TIMEZONE, true);
if (d.isValid()) {
return d;
date = dayjs(dateString, DATE_TIME_FORMAT, true).tz(DEFAULT_TIMEZONE, true);
if (date.isValid()) {
return date;
}
return dayjs(date).tz(DEFAULT_TIMEZONE, true);
return dayjs(dateString).tz(DEFAULT_TIMEZONE, true);
}

export function dateToString(date: Dayjs): string {
Expand All @@ -40,23 +48,30 @@ export function localDateTimeString(): string {
return dayjs().tz().format(DATE_TIME_FORMAT);
}

export function isDateInThePast(dateString: string | undefined, value?: number, unit?: ManipulateType): boolean {
const date = parseAndAddDate(dateString, value, unit);
export function isDateTimeInThePast(
dateString: string | undefined,
defaultTimeTo: DefaultTimeTo,
...dateAddTuples: DateAddTuple[]
): boolean {
const date = parseAndAddDateTime(dateString, defaultTimeTo, ...dateAddTuples);
if (date) {
return date.isBefore(dayjs());
}
return false;
}

export function parseAndAddDate(dateString: string | undefined, value?: number, unit?: ManipulateType): Dayjs | undefined {
export function parseAndAddDateTime(
dateString: string | undefined,
defaultTimeTo: DefaultTimeTo,
...dateAddTuples: DateAddTuple[]
): Dayjs | undefined {
if (dateString) {
// Support times as well for testing, so do not set the time if it was already provided
let date = parseDate(dateString);
if (value && unit) {
dateAddTuples.forEach(([value, unit]) => {
date = date.add(value, unit);
}
if (dateString.length == ISO_DATE_FORMAT.length) {
date = date.set("hour", 23).set("minute", 59);
});
if (defaultTimeTo === "end-of-day" && isDateStringLackingTimeElement(dateString)) {
date = date.endOf("day");
}
return date;
}
Expand Down

0 comments on commit e865202

Please sign in to comment.