From 40525e4f0ff494a3b5bf9cebad5d00ac25a3d840 Mon Sep 17 00:00:00 2001 From: Joel Stålnacke Date: Fri, 1 Aug 2025 20:22:50 +0300 Subject: Basic domain logic --- TJLaskuri.Core/Library.fs | 27 +++++++++++++++++++++++ TJLaskuri.Core/TJLaskuri.Core.fsproj | 13 +++++++++++ TJLaskuri.Core/Types.fs | 42 ++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 TJLaskuri.Core/Library.fs create mode 100644 TJLaskuri.Core/TJLaskuri.Core.fsproj create mode 100644 TJLaskuri.Core/Types.fs (limited to 'TJLaskuri.Core') diff --git a/TJLaskuri.Core/Library.fs b/TJLaskuri.Core/Library.fs new file mode 100644 index 0000000..aa7b7ea --- /dev/null +++ b/TJLaskuri.Core/Library.fs @@ -0,0 +1,27 @@ +namespace TJLaskuri.Core + +open System + +module Domain = + // TODO: More precise time: hours, minutes + // TODO: Time until service starts + + let getStartDate kontingent = + match serviceStartDates.TryGetValue(kontingent) with + | true, startDate -> Some startDate + | false, _ -> None + + let getEndDate kontingent serviceTime = + getStartDate kontingent + |> Option.map (fun startDate -> + ServiceTime.getDays serviceTime + |> fun x -> x - 1 // Count start date as well + |> startDate.AddDays) + + let getTimeCompleted kontingent (now : DateTime) = + getStartDate kontingent + |> Option.map (fun date -> now.AddDays(1) - date) + + let getTimeLeft kontingent serviceTime (now : DateTime) = + getEndDate kontingent serviceTime + |> Option.map (fun date -> date - now) diff --git a/TJLaskuri.Core/TJLaskuri.Core.fsproj b/TJLaskuri.Core/TJLaskuri.Core.fsproj new file mode 100644 index 0000000..c3b606a --- /dev/null +++ b/TJLaskuri.Core/TJLaskuri.Core.fsproj @@ -0,0 +1,13 @@ + + + + net9.0 + true + + + + + + + + diff --git a/TJLaskuri.Core/Types.fs b/TJLaskuri.Core/Types.fs new file mode 100644 index 0000000..0c5b2d4 --- /dev/null +++ b/TJLaskuri.Core/Types.fs @@ -0,0 +1,42 @@ +namespace TJLaskuri.Core + +open System +open System.Collections.Generic + +[] +module Types = + /// Saapumiserä/kontingent N/Year + /// For example, 2/25 is { N = 2; Year = 2025 } + // Year field is first so that kontingents are sorted year first + type Kontingent = { Year : int; N : int } + + type ServiceTime = + | OneSixFive + | TwoFiveFive + | ThreeFourSeven + + module ServiceTime = + let getDays = function + | OneSixFive -> 165 + | TwoFiveFive -> 255 + | ThreeFourSeven -> 347 + + let kontingent n year = { N = n; Year = year } + + let serviceStartDates = + let date day month year = + DateTime((year : int), month, day) + let entry n year endDate = + let k = kontingent n year + KeyValuePair( + k, endDate) + + Dictionary([ + entry 2 2024 (date 8 7 2024) + entry 1 2025 (date 6 1 2025) + entry 2 2025 (date 7 7 2025) + entry 1 2026 (date 5 1 2026) + entry 2 2026 (date 6 7 2026) + entry 1 2027 (date 4 1 2027) + entry 2 2027 (date 5 7 2027) + ]) -- cgit v1.2.3