-
Notifications
You must be signed in to change notification settings - Fork 0
/
CzasHelper.pas
163 lines (131 loc) · 5.05 KB
/
CzasHelper.pas
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
unit CzasHelper;
interface
uses
System.SysUtils, System.DateUtils;
type
TCzasHelper = class
private
czasPracyWCiaguDnia : TDateTime;
czasWolnyOdPracyWCiaguDnia : TDateTime;
czasRozpoczeciaPracy : TDateTime;
czasKoncaPracy : TDateTime;
function PozaGodzinamiPracy(dataCzas : TDateTime) : Boolean;
function TrwaPowyzejJednegoDniaRoboczego(czasWMinutach : Integer) : Boolean;
function IloscDniWolnychPomiedzyDatami(nieruchomaData, ruchomaData : TDateTime) : Integer;
function DzienWolny(dataCzas : TDateTime) : Boolean;
public
constructor Create(godzinaPoczatkuPracy, godzinaKoncaPracy : TDateTime);
function DataCzasZakonczeniaDlaDatyCzasuStartuICzasuTrwania
(start : TDateTime; czasTrwaniaWMinutach : Integer) : TDateTime;
function DataCzasRozpoczeciaDlaDatyCzasuZakonczeniaICzasuTrwania
(koniec : TDateTime; czasTrwaniaWMinutach : Integer) : TDateTime;
function DataCzasPracujacy(dataCzas : TDateTime; pozniejsza : Boolean) : TDateTime;
end;
implementation
//private
function TCzasHelper.PozaGodzinamiPracy(dataCzas : TDateTime) : Boolean;
begin
Result := (TimeOf(dataCzas) > TimeOf(czasKoncaPracy)) or (TimeOf(dataCzas) < TimeOf(czasRozpoczeciaPracy));
end;
function TCzasHelper.TrwaPowyzejJednegoDniaRoboczego(czasWMinutach : Integer) : Boolean;
begin
Result := IncMinute(EncodeTime(0,0,0,0), czasWMinutach) > czasPracyWCiaguDnia;
end;
function TCzasHelper.IloscDniWolnychPomiedzyDatami(nieruchomaData, ruchomaData : TDateTime) : Integer;
var
zmianaDnia : Integer;
tempDateTime1 : TDateTime;
tempDateTime2 : TDateTime;
begin
tempDateTime1 := DateOf(nieruchomaData);
tempDateTime2 := DateOf(ruchomaData);
Result := 0;
if tempDateTime1 < tempDateTime2 then zmianaDnia := 1
else zmianaDnia := -1;
while ((not (tempDateTime1 = tempDateTime2)) or DzienWolny(tempDateTime2)) do
begin
if DzienWolny(tempDateTime1) then
begin
tempDateTime2 := IncDay(tempDateTime2, zmianaDnia);
Result := Result + 1;
end;
tempDateTime1 := IncDay(tempDateTime1, zmianaDnia);
end;
end;
function TCzasHelper.DzienWolny(dataCzas : TDateTime) : Boolean;
begin
Result := ((DayOfWeek(dataCzas) = 1) or (DayOfWeek(dataCzas) = 7));
end;
//public
constructor TCzasHelper.Create(godzinaPoczatkuPracy, godzinaKoncaPracy : TDateTime);
begin
czasRozpoczeciaPracy := godzinaPoczatkuPracy;
czasKoncaPracy := godzinaKoncaPracy;
czasPracyWCiaguDnia := godzinaKoncaPracy - godzinaPoczatkuPracy;
czasWolnyOdPracyWCiaguDnia := EncodeTime(23,0,0,0) + EncodeTime(1,0,0,0) - czasPracyWCiaguDnia;
end;
function TCzasHelper.DataCzasZakonczeniaDlaDatyCzasuStartuICzasuTrwania
(start : TDateTime; czasTrwaniaWMinutach : Integer) : TDateTime;
var
roboczoDni : Integer;
begin
Result := IncMinute(start, czasTrwaniaWMinutach);
if TrwaPowyzejJednegoDniaRoboczego(czasTrwaniaWMinutach) then
begin
roboczoDni := Trunc(IncMinute(EncodeTime(0,0,0,0), czasTrwaniaWMinutach) / czasPracyWCiaguDnia);
Result := Result + roboczoDni * czasWolnyOdPracyWCiaguDnia;
end;
if PozaGodzinamiPracy(Result) then
begin
Result := Result + czasWolnyOdPracyWCiaguDnia;
end;
Result := IncDay(Result, IloscDniWolnychPomiedzyDatami(start, Result));
end;
function TCzasHelper.DataCzasRozpoczeciaDlaDatyCzasuZakonczeniaICzasuTrwania
(koniec : TDateTime; czasTrwaniaWMinutach : Integer) : TDateTime;
var
roboczoDni : Integer;
begin
Result := IncMinute(koniec, -czasTrwaniaWMinutach);
if TrwaPowyzejJednegoDniaRoboczego(czasTrwaniaWMinutach) then
begin
roboczoDni := Trunc(IncMinute(EncodeTime(0,0,0,0), czasTrwaniaWMinutach) / czasPracyWCiaguDnia);
Result := Result + roboczoDni * -czasWolnyOdPracyWCiaguDnia;
end;
if PozaGodzinamiPracy(Result) then
begin
Result := Result - czasWolnyOdPracyWCiaguDnia;
end;
Result := IncDay(Result, -IloscDniWolnychPomiedzyDatami(koniec, Result));
end;
function TCzasHelper.DataCzasPracujacy(dataCzas : TDateTime; pozniejsza : Boolean) : TDateTime;
var
zmianaDnia : Integer;
tempDataCzas : TDateTime;
begin
if pozniejsza then zmianaDnia := 1
else zmianaDnia := -1;
tempDataCzas := DateOf(dataCzas);
Result := TimeOf(dataCzas);
if pozniejsza then
begin
if TimeOf(dataCzas) < czasRozpoczeciaPracy then Result := czasRozpoczeciaPracy
else if TimeOf(dataCzas) >= czasKoncaPracy then
begin
Result := czasRozpoczeciaPracy;
tempDataCzas := IncDay(tempDataCzas, 1);
end;
end
else
begin
if TimeOf(dataCzas) > czasKoncaPracy then Result := czasKoncaPracy
else if TimeOf(dataCzas) <= czasRozpoczeciaPracy then
begin
Result := czasKoncaPracy;
tempDataCzas := IncDay(tempDataCzas, 1);
end;
end;
while DzienWolny(tempDataCzas) do tempDataCzas := IncDay(tempDataCzas, zmianaDnia);
Result := Result + tempDataCzas;
end;
end.