Repository navigation
Expand file tree
/
Copy pathfrequency_static_utils.dart
More file actions
104 lines (92 loc) · 3.58 KB
/
Copy pathfrequency_static_utils.dart
File metadata and controls
104 lines (92 loc) · 3.58 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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import './frequency.dart';
import './frequency_utils.dart';
///calculates the next Date Time from a Static Frequency object given a zero date time point
DateTime getStaticDate(Frequency freqObject, DateTime startDt) {
startDt = startDt.isUtc ? startDt.toLocal() : startDt;
DateTime retVal = startDt;
DateTime currentDtTm = DateTime.now();
if ((freqObject.hoursAtDay != null) && freqObject.hoursAtDay!.isNotEmpty) {
//list passed as ["08:00:00","16:00:00",...]
double intervalseconds = 86400 / freqObject.hoursAtDay!.length;
DateTime firstDoseNextDay =
DateTime(currentDtTm.year, currentDtTm.month, currentDtTm.day);
DateTime thirdtDayStart = DateTime(currentDtTm.year, currentDtTm.month,
currentDtTm.day + 2, startDt.hour, startDt.minute, startDt.second);
bool found = false;
while (firstDoseNextDay.isBefore(thirdtDayStart)) {
if (firstDoseNextDay.isAfter(currentDtTm) ||
(firstDoseNextDay ==
DateTime(currentDtTm.year, currentDtTm.month, currentDtTm.day))) {
String firstDoseString = "";
for (var hr in freqObject.hoursAtDay!) {
firstDoseString = firstDoseNextDay.year.toString() +
"-" +
firstDoseNextDay.month.toString() +
"-" +
firstDoseNextDay.day.toString() +
" " +
hr;
DateTime firstDoseStringDate = DateTime.parse(firstDoseString);
if (firstDoseStringDate.isAtSameMomentAs(firstDoseNextDay) ||
firstDoseStringDate.isAfter(firstDoseNextDay)) {
retVal = firstDoseStringDate;
found = true;
break;
}
}
if (found) {
break;
}
}
firstDoseNextDay =
firstDoseNextDay.add(Duration(seconds: intervalseconds.round()));
}
} else if ((freqObject.daysAtWeek != null) &&
freqObject.daysAtWeek!.isNotEmpty) {
//["Sunday","TuesDay",...]
double intervalseconds = (7 * 86400) / freqObject.daysAtWeek!.length;
DateTime firstDoseNextDay =
DateTime(startDt.year, startDt.month, startDt.day);
DateTime nextWStart = DateTime(currentDtTm.year, currentDtTm.month,
currentDtTm.day + 7, startDt.hour, startDt.minute, startDt.second);
bool found = false;
while (firstDoseNextDay.isBefore(nextWStart)) {
firstDoseNextDay =
firstDoseNextDay.add(Duration(seconds: intervalseconds.round()));
if (firstDoseNextDay.isAfter(currentDtTm)) {
for (var dy in freqObject.daysAtWeek!) {
if (firstDoseNextDay.weekday == weekDays.indexOf(dy)) {
found = true;
break;
}
}
if (found) {
break;
}
}
}
} else if ((freqObject.daysAtMonth != null) &&
freqObject.daysAtMonth!.isNotEmpty) {
for (var mDay in freqObject.daysAtMonth!) {
DateTime mDayDate = DateTime(currentDtTm.year, currentDtTm.month,
int.parse(mDay), currentDtTm.hour, 0, 0);
if (mDayDate.isAfter(currentDtTm)) {
retVal = mDayDate;
break;
}
}
} else if ((freqObject.daysAtYear != null) &&
freqObject.daysAtYear!.isNotEmpty) {
for (var yrDay in freqObject.daysAtYear!) {
DateTime yrDayDate = DateTime.parse(yrDay);
if (yrDayDate.isAfter(currentDtTm)) {
retVal = yrDayDate;
break;
}
}
} else {
throw Exception(
"insufficient parameters for Static frequency, start date will be returned!");
}
return retVal;
}