diff --git a/backend/src/endDateCalculator/endDateCalculatorHandler.ts b/backend/src/endDateCalculator/endDateCalculatorHandler.ts index 3d8ff6dee..78ed0d2e6 100644 --- a/backend/src/endDateCalculator/endDateCalculatorHandler.ts +++ b/backend/src/endDateCalculator/endDateCalculatorHandler.ts @@ -1,14 +1,23 @@ -import { LaskePaattymisPaivaQueryVariables } from "../../../common/graphql/apiModel"; +import { LaskePaattymisPaivaQueryVariables, LaskuriTyyppi } from "../../../common/graphql/apiModel"; import { dateTimeToString, dateToString, ISO_DATE_FORMAT, parseDate } from "../util/dateUtil"; import { Dayjs } from "dayjs"; import { bankHolidaysClient } from "./bankHolidaysClient"; import { config } from "../config"; export async function calculateEndDate({ - alkupaiva, - tyyppi: _tyyppi, -}: LaskePaattymisPaivaQueryVariables): Promise { - // Calculator currectly has only two types (KUULUTUKSEN_PAATTYMISPAIVA, NAHTAVILLAOLON_KUULUTUKSEN_PAATTYMISPAIVA) and they are calculated with equal formula + alkupaiva, + tyyppi, + }: LaskePaattymisPaivaQueryVariables): Promise { + switch (tyyppi) { + case LaskuriTyyppi.KUULUTUKSEN_PAATTYMISPAIVA: + case LaskuriTyyppi.NAHTAVILLAOLON_KUULUTUKSEN_PAATTYMISPAIVA: + return calculateOnePlusGivenDaysSkipHolidays(alkupaiva, 30); + case LaskuriTyyppi.HYVAKSYMISPAATOKSEN_KUULUTUSAIKA: + return calculateOnePlusGivenDaysSkipHolidays(alkupaiva, 7 + 30); // julkaisupäivä + 7 päivän tiedoksisaantiaika + 30 päivän muutoksenhakuaika + } +} + +async function calculateOnePlusGivenDaysSkipHolidays(alkupaiva: string, days: number) { let start: Dayjs; // Only accept dates in prod, but allow datetimes in other environments const isDateOnly = config.isProd() || alkupaiva.length == ISO_DATE_FORMAT.length; @@ -23,7 +32,7 @@ export async function calculateEndDate({ throw new Error("Alkupäivän pitää olla muotoa YYYY-MM-DDTHH:mm"); } } - let endDate: Dayjs = start.add(30, "day"); + let endDate: Dayjs = start.add(days, "day"); const bankHolidays = await bankHolidaysClient.getBankHolidays(); while (bankHolidays.isBankHoliday(endDate)) { endDate = endDate.add(1, "day"); diff --git a/backend/test/endDateCalculator/endDateCalculator.test.ts b/backend/test/endDateCalculator/endDateCalculator.test.ts index e790478c5..64ec321e4 100644 --- a/backend/test/endDateCalculator/endDateCalculator.test.ts +++ b/backend/test/endDateCalculator/endDateCalculator.test.ts @@ -55,6 +55,12 @@ describe("Api", () => { ).to.be.equal("2022-12-05"); }); + it("should calculate correct Hyväksymispäätöksen kuulutusaika end date over weekend", async () => { + expect( + await calculateEndDate({ alkupaiva: "2022-11-03", tyyppi: LaskuriTyyppi.HYVAKSYMISPAATOKSEN_KUULUTUSAIKA }) + ).to.be.equal("2022-12-12"); + }); + it("should manage list of bank holidays correctly", () => { const bankHolidays = new BankHolidays(["2022-12-24", "2022-12-25"]); expect(bankHolidays.isBankHoliday(parseDate("2022-12-24"))).to.be.true; diff --git a/graphql/types.graphql b/graphql/types.graphql index b6a6aad51..6c5bc304b 100644 --- a/graphql/types.graphql +++ b/graphql/types.graphql @@ -583,6 +583,7 @@ type LatausTiedot { enum LaskuriTyyppi { KUULUTUKSEN_PAATTYMISPAIVA NAHTAVILLAOLON_KUULUTUKSEN_PAATTYMISPAIVA + HYVAKSYMISPAATOKSEN_KUULUTUSAIKA } enum Kieli {