forked from equinor/flotilla
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAutoScheduleFrequency.cs
More file actions
79 lines (70 loc) · 2.57 KB
/
AutoScheduleFrequency.cs
File metadata and controls
79 lines (70 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;
#pragma warning disable CS8618
namespace Api.Database.Models
{
[Owned]
public class AutoScheduleFrequency
{
[Required]
// In local time
public IList<TimeOnly> TimesOfDay { get; set; } = new List<TimeOnly>();
[Required]
public IList<DayOfWeek> DaysOfWeek { get; set; } = new List<DayOfWeek>();
public bool HasValidValue()
{
return TimesOfDay.Count != 0 && DaysOfWeek.Count != 0;
}
public void ValidateAutoScheduleFrequency()
{
if (TimesOfDay.Count == 0)
{
throw new ArgumentException(
"AutoScheduleFrequency must have at least one time of day"
);
}
if (DaysOfWeek.Count == 0)
{
throw new ArgumentException(
"AutoScheduleFrequency must have at least one day of week"
);
}
}
public IList<TimeSpan>? GetSchedulingTimesUntilMidnight()
{
// NCS is always in CET
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(
"Central European Standard Time"
);
DateTime nowLocal = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
TimeOnly nowLocalTimeOnly = TimeOnly.FromDateTime(nowLocal);
TimeSpan timeTilUtcMidnight =
new TimeOnly(23, 59, 59) - TimeOnly.FromDateTime(DateTime.UtcNow);
var autoScheduleNext = new List<TimeSpan>();
if (DaysOfWeek.Contains(nowLocal.DayOfWeek))
{
autoScheduleNext.AddRange(
TimesOfDay
.Where(time =>
(time >= nowLocalTimeOnly)
&& (time - nowLocalTimeOnly <= timeTilUtcMidnight)
)
.Select(time => time - nowLocalTimeOnly)
);
}
if (DaysOfWeek.Contains(nowLocal.AddDays(1).DayOfWeek))
{
autoScheduleNext.AddRange(
TimesOfDay
.Where(time =>
(time < nowLocalTimeOnly)
&& (time - nowLocalTimeOnly <= timeTilUtcMidnight)
)
.Select(time => time - nowLocalTimeOnly)
);
}
return autoScheduleNext.Count > 0 ? autoScheduleNext : null;
}
}
}