scheduler-models 1.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/general/emailer.d.ts +1 -0
  2. package/general/emailer.js +29 -0
  3. package/general/emailer.js.map +1 -0
  4. package/general/general.d.ts +9 -0
  5. package/general/general.js +3 -0
  6. package/general/general.js.map +1 -0
  7. package/general/index.d.ts +7 -0
  8. package/general/index.js +24 -0
  9. package/general/index.js.map +1 -0
  10. package/general/logger.d.ts +11 -0
  11. package/general/logger.js +69 -0
  12. package/general/logger.js.map +1 -0
  13. package/general/logs.d.ts +32 -0
  14. package/general/logs.js +60 -0
  15. package/general/logs.js.map +1 -0
  16. package/general/notices.d.ts +24 -0
  17. package/general/notices.js +25 -0
  18. package/general/notices.js.map +1 -0
  19. package/general/report.d.ts +25 -0
  20. package/general/report.js +77 -0
  21. package/general/report.js.map +1 -0
  22. package/general/viewstate.d.ts +5 -0
  23. package/general/viewstate.js +10 -0
  24. package/general/viewstate.js.map +1 -0
  25. package/index.d.ts +0 -0
  26. package/index.js +1 -0
  27. package/index.js.map +1 -0
  28. package/metrics/images.d.ts +16 -0
  29. package/metrics/images.js +31 -0
  30. package/metrics/images.js.map +1 -0
  31. package/metrics/index.d.ts +5 -0
  32. package/metrics/index.js +22 -0
  33. package/metrics/index.js.map +1 -0
  34. package/metrics/mission.d.ts +40 -0
  35. package/metrics/mission.js +79 -0
  36. package/metrics/mission.js.map +1 -0
  37. package/metrics/missionSensorOutage.d.ts +11 -0
  38. package/metrics/missionSensorOutage.js +15 -0
  39. package/metrics/missionSensorOutage.js.map +1 -0
  40. package/metrics/missionsensor.d.ts +45 -0
  41. package/metrics/missionsensor.js +110 -0
  42. package/metrics/missionsensor.js.map +1 -0
  43. package/metrics/outage.d.ts +34 -0
  44. package/metrics/outage.js +51 -0
  45. package/metrics/outage.js.map +1 -0
  46. package/metrics/systemdata/classifications.d.ts +12 -0
  47. package/metrics/systemdata/classifications.js +21 -0
  48. package/metrics/systemdata/classifications.js.map +1 -0
  49. package/metrics/systemdata/communications.d.ts +15 -0
  50. package/metrics/systemdata/communications.js +38 -0
  51. package/metrics/systemdata/communications.js.map +1 -0
  52. package/metrics/systemdata/dcgs.d.ts +12 -0
  53. package/metrics/systemdata/dcgs.js +27 -0
  54. package/metrics/systemdata/dcgs.js.map +1 -0
  55. package/metrics/systemdata/exploitations.d.ts +12 -0
  56. package/metrics/systemdata/exploitations.js +21 -0
  57. package/metrics/systemdata/exploitations.js.map +1 -0
  58. package/metrics/systemdata/groundSystems.d.ts +40 -0
  59. package/metrics/systemdata/groundSystems.js +105 -0
  60. package/metrics/systemdata/groundSystems.js.map +1 -0
  61. package/metrics/systemdata/index.d.ts +7 -0
  62. package/metrics/systemdata/index.js +24 -0
  63. package/metrics/systemdata/index.js.map +1 -0
  64. package/metrics/systemdata/platform.d.ts +75 -0
  65. package/metrics/systemdata/platform.js +140 -0
  66. package/metrics/systemdata/platform.js.map +1 -0
  67. package/metrics/systemdata/systeminfo.d.ts +23 -0
  68. package/metrics/systemdata/systeminfo.js +65 -0
  69. package/metrics/systemdata/systeminfo.js.map +1 -0
  70. package/package.json +33 -0
  71. package/scheduler/employees/assignment.d.ts +38 -0
  72. package/scheduler/employees/assignment.js +207 -0
  73. package/scheduler/employees/assignment.js.map +1 -0
  74. package/scheduler/employees/balance.d.ts +12 -0
  75. package/scheduler/employees/balance.js +21 -0
  76. package/scheduler/employees/balance.js.map +1 -0
  77. package/scheduler/employees/companyinfo.d.ts +9 -0
  78. package/scheduler/employees/companyinfo.js +3 -0
  79. package/scheduler/employees/companyinfo.js.map +1 -0
  80. package/scheduler/employees/contact.d.ts +14 -0
  81. package/scheduler/employees/contact.js +23 -0
  82. package/scheduler/employees/contact.js.map +1 -0
  83. package/scheduler/employees/employee.d.ts +107 -0
  84. package/scheduler/employees/employee.js +1723 -0
  85. package/scheduler/employees/employee.js.map +1 -0
  86. package/scheduler/employees/employeename.d.ts +17 -0
  87. package/scheduler/employees/employeename.js +70 -0
  88. package/scheduler/employees/employeename.js.map +1 -0
  89. package/scheduler/employees/index.d.ts +14 -0
  90. package/scheduler/employees/index.js +31 -0
  91. package/scheduler/employees/index.js.map +1 -0
  92. package/scheduler/employees/labor.d.ts +10 -0
  93. package/scheduler/employees/labor.js +22 -0
  94. package/scheduler/employees/labor.js.map +1 -0
  95. package/scheduler/employees/leave.d.ts +29 -0
  96. package/scheduler/employees/leave.js +49 -0
  97. package/scheduler/employees/leave.js.map +1 -0
  98. package/scheduler/employees/leaverequest.d.ts +43 -0
  99. package/scheduler/employees/leaverequest.js +175 -0
  100. package/scheduler/employees/leaverequest.js.map +1 -0
  101. package/scheduler/employees/specialty.d.ts +14 -0
  102. package/scheduler/employees/specialty.js +23 -0
  103. package/scheduler/employees/specialty.js.map +1 -0
  104. package/scheduler/employees/variation.d.ts +27 -0
  105. package/scheduler/employees/variation.js +88 -0
  106. package/scheduler/employees/variation.js.map +1 -0
  107. package/scheduler/employees/web.d.ts +70 -0
  108. package/scheduler/employees/web.js +3 -0
  109. package/scheduler/employees/web.js.map +1 -0
  110. package/scheduler/employees/work.d.ts +37 -0
  111. package/scheduler/employees/work.js +88 -0
  112. package/scheduler/employees/work.js.map +1 -0
  113. package/scheduler/employees/workday.d.ts +31 -0
  114. package/scheduler/employees/workday.js +144 -0
  115. package/scheduler/employees/workday.js.map +1 -0
  116. package/scheduler/ingest/excelRow.d.ts +52 -0
  117. package/scheduler/ingest/excelRow.js +119 -0
  118. package/scheduler/ingest/excelRow.js.map +1 -0
  119. package/scheduler/ingest/excelRowIngest.d.ts +18 -0
  120. package/scheduler/ingest/excelRowIngest.js +148 -0
  121. package/scheduler/ingest/excelRowIngest.js.map +1 -0
  122. package/scheduler/ingest/index.d.ts +4 -0
  123. package/scheduler/ingest/index.js +21 -0
  124. package/scheduler/ingest/index.js.map +1 -0
  125. package/scheduler/ingest/sapIngest.d.ts +9 -0
  126. package/scheduler/ingest/sapIngest.js +123 -0
  127. package/scheduler/ingest/sapIngest.js.map +1 -0
  128. package/scheduler/ingest/web.d.ts +13 -0
  129. package/scheduler/ingest/web.js +3 -0
  130. package/scheduler/ingest/web.js.map +1 -0
  131. package/scheduler/labor/index.d.ts +2 -0
  132. package/scheduler/labor/index.js +19 -0
  133. package/scheduler/labor/index.js.map +1 -0
  134. package/scheduler/labor/laborcode.d.ts +33 -0
  135. package/scheduler/labor/laborcode.js +56 -0
  136. package/scheduler/labor/laborcode.js.map +1 -0
  137. package/scheduler/labor/workcode.d.ts +28 -0
  138. package/scheduler/labor/workcode.js +36 -0
  139. package/scheduler/labor/workcode.js.map +1 -0
  140. package/scheduler/sites/index.d.ts +1 -0
  141. package/scheduler/sites/index.js +18 -0
  142. package/scheduler/sites/index.js.map +1 -0
  143. package/scheduler/sites/reports/cofsReport.d.ts +25 -0
  144. package/scheduler/sites/reports/cofsReport.js +86 -0
  145. package/scheduler/sites/reports/cofsReport.js.map +1 -0
  146. package/scheduler/sites/reports/forecast.d.ts +29 -0
  147. package/scheduler/sites/reports/forecast.js +169 -0
  148. package/scheduler/sites/reports/forecast.js.map +1 -0
  149. package/scheduler/sites/reports/index.d.ts +5 -0
  150. package/scheduler/sites/reports/index.js +22 -0
  151. package/scheduler/sites/reports/index.js.map +1 -0
  152. package/scheduler/sites/reports/period.d.ts +11 -0
  153. package/scheduler/sites/reports/period.js +28 -0
  154. package/scheduler/sites/reports/period.js.map +1 -0
  155. package/scheduler/sites/reports/section.d.ts +28 -0
  156. package/scheduler/sites/reports/section.js +153 -0
  157. package/scheduler/sites/reports/section.js.map +1 -0
  158. package/scheduler/sites/reports/web.d.ts +69 -0
  159. package/scheduler/sites/reports/web.js +3 -0
  160. package/scheduler/sites/reports/web.js.map +1 -0
  161. package/scheduler/sites/site.d.ts +30 -0
  162. package/scheduler/sites/site.js +92 -0
  163. package/scheduler/sites/site.js.map +1 -0
  164. package/scheduler/sites/web/index.d.ts +1 -0
  165. package/scheduler/sites/web/index.js +18 -0
  166. package/scheduler/sites/web/index.js.map +1 -0
  167. package/scheduler/sites/web/requests.d.ts +36 -0
  168. package/scheduler/sites/web/requests.js +3 -0
  169. package/scheduler/sites/web/requests.js.map +1 -0
  170. package/scheduler/sites/workcenters/index.d.ts +3 -0
  171. package/scheduler/sites/workcenters/index.js +20 -0
  172. package/scheduler/sites/workcenters/index.js.map +1 -0
  173. package/scheduler/sites/workcenters/position.d.ts +16 -0
  174. package/scheduler/sites/workcenters/position.js +29 -0
  175. package/scheduler/sites/workcenters/position.js.map +1 -0
  176. package/scheduler/sites/workcenters/shift.d.ts +21 -0
  177. package/scheduler/sites/workcenters/shift.js +40 -0
  178. package/scheduler/sites/workcenters/shift.js.map +1 -0
  179. package/scheduler/sites/workcenters/workcenter.d.ts +21 -0
  180. package/scheduler/sites/workcenters/workcenter.js +103 -0
  181. package/scheduler/sites/workcenters/workcenter.js.map +1 -0
  182. package/scheduler/teams/company/company.d.ts +33 -0
  183. package/scheduler/teams/company/company.js +196 -0
  184. package/scheduler/teams/company/company.js.map +1 -0
  185. package/scheduler/teams/company/holiday.d.ts +23 -0
  186. package/scheduler/teams/company/holiday.js +82 -0
  187. package/scheduler/teams/company/holiday.js.map +1 -0
  188. package/scheduler/teams/company/index.d.ts +3 -0
  189. package/scheduler/teams/company/index.js +20 -0
  190. package/scheduler/teams/company/index.js.map +1 -0
  191. package/scheduler/teams/company/modperiod.d.ts +12 -0
  192. package/scheduler/teams/company/modperiod.js +21 -0
  193. package/scheduler/teams/company/modperiod.js.map +1 -0
  194. package/scheduler/teams/contact.d.ts +12 -0
  195. package/scheduler/teams/contact.js +21 -0
  196. package/scheduler/teams/contact.js.map +1 -0
  197. package/scheduler/teams/index.d.ts +4 -0
  198. package/scheduler/teams/index.js +21 -0
  199. package/scheduler/teams/index.js.map +1 -0
  200. package/scheduler/teams/specialty.d.ts +12 -0
  201. package/scheduler/teams/specialty.js +21 -0
  202. package/scheduler/teams/specialty.js.map +1 -0
  203. package/scheduler/teams/team.d.ts +34 -0
  204. package/scheduler/teams/team.js +292 -0
  205. package/scheduler/teams/team.js.map +1 -0
  206. package/scheduler/teams/web.d.ts +46 -0
  207. package/scheduler/teams/web.js +3 -0
  208. package/scheduler/teams/web.js.map +1 -0
  209. package/scheduler/web/index.d.ts +1 -0
  210. package/scheduler/web/index.js +18 -0
  211. package/scheduler/web/index.js.map +1 -0
  212. package/scheduler/web/initial.d.ts +10 -0
  213. package/scheduler/web/initial.js +3 -0
  214. package/scheduler/web/initial.js.map +1 -0
  215. package/users/index.d.ts +4 -0
  216. package/users/index.js +21 -0
  217. package/users/index.js.map +1 -0
  218. package/users/permission.d.ts +10 -0
  219. package/users/permission.js +22 -0
  220. package/users/permission.js.map +1 -0
  221. package/users/question.d.ts +12 -0
  222. package/users/question.js +24 -0
  223. package/users/question.js.map +1 -0
  224. package/users/user.d.ts +47 -0
  225. package/users/user.js +192 -0
  226. package/users/user.js.map +1 -0
  227. package/users/web.d.ts +35 -0
  228. package/users/web.js +3 -0
  229. package/users/web.js.map +1 -0
@@ -0,0 +1,1723 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Employee = void 0;
4
+ const employeename_1 = require("./employeename");
5
+ const assignment_1 = require("./assignment");
6
+ const variation_1 = require("./variation");
7
+ const leaverequest_1 = require("./leaverequest");
8
+ const labor_1 = require("./labor");
9
+ const work_1 = require("./work");
10
+ const users_1 = require("../../users");
11
+ const contact_1 = require("./contact");
12
+ const specialty_1 = require("./specialty");
13
+ const leave_1 = require("./leave");
14
+ const workday_1 = require("./workday");
15
+ const balance_1 = require("./balance");
16
+ const uuid_1 = require("uuid");
17
+ class Employee {
18
+ id;
19
+ team;
20
+ site;
21
+ email;
22
+ name;
23
+ companyinfo;
24
+ assignments;
25
+ variations;
26
+ balances;
27
+ leaves;
28
+ requests;
29
+ laborCodes;
30
+ work;
31
+ user;
32
+ contactinfo;
33
+ specialties;
34
+ emails;
35
+ constructor(emp) {
36
+ this.id = (emp && emp.id) ? emp.id : '';
37
+ if (this.id === '') {
38
+ this.id = (emp && emp._id) ? emp._id.toString() : '';
39
+ }
40
+ this.team = (emp) ? emp.team : '';
41
+ this.site = (emp) ? emp.site : '';
42
+ this.email = (emp) ? emp.email : '';
43
+ this.name = (emp) ? new employeename_1.EmployeeName(emp.name) : new employeename_1.EmployeeName();
44
+ this.companyinfo = (emp) ? emp.companyinfo : { company: '', employeeid: '' };
45
+ this.assignments = [];
46
+ if (emp && emp.assignments && emp.assignments.length > 0) {
47
+ emp.assignments.forEach(a => {
48
+ this.assignments.push(new assignment_1.Assignment(a));
49
+ });
50
+ this.assignments.sort((a, b) => a.compareTo(b));
51
+ }
52
+ this.variations = [];
53
+ if (emp && emp.variations && emp.variations.length > 0) {
54
+ emp.variations.forEach(v => {
55
+ this.variations.push(new variation_1.Variation(v));
56
+ });
57
+ this.variations.sort((a, b) => a.compareTo(b));
58
+ }
59
+ this.balances = [];
60
+ if (emp && emp.balances && emp.balances.length > 0) {
61
+ emp.balances.forEach(b => {
62
+ this.balances.push(new balance_1.AnnualLeave(b));
63
+ });
64
+ this.balances.sort((a, b) => a.compareTo(b));
65
+ }
66
+ this.leaves = [];
67
+ if (emp && emp.leaves && emp.leaves.length > 0) {
68
+ emp.leaves.forEach(l => {
69
+ this.leaves.push(new leave_1.Leave(l));
70
+ });
71
+ this.leaves.sort((a, b) => a.compareTo(b));
72
+ }
73
+ this.requests = [];
74
+ if (emp && emp.requests && emp.requests.length > 0) {
75
+ emp.requests.forEach(r => {
76
+ this.requests.push(new leaverequest_1.LeaveRequest(r));
77
+ });
78
+ this.requests.sort((a, b) => a.compareTo(b));
79
+ }
80
+ this.laborCodes = [];
81
+ if (emp && emp.laborCodes && emp.laborCodes.length > 0) {
82
+ emp.laborCodes.forEach(l => {
83
+ this.laborCodes.push(new labor_1.EmployeeLaborCode(l));
84
+ });
85
+ this.laborCodes.sort((a, b) => a.compareTo(b));
86
+ }
87
+ this.contactinfo = [];
88
+ if (emp && emp.contactinfo && emp.contactinfo.length > 0) {
89
+ emp.contactinfo.forEach(c => {
90
+ this.contactinfo.push(new contact_1.Contact(c));
91
+ });
92
+ this.contactinfo.sort((a, b) => a.compareTo(b));
93
+ }
94
+ this.specialties = [];
95
+ if (emp && emp.specialties && emp.specialties.length > 0) {
96
+ emp.specialties.forEach(sp => {
97
+ this.specialties.push(new specialty_1.Specialty(sp));
98
+ });
99
+ this.specialties.sort((a, b) => a.compareTo(b));
100
+ }
101
+ this.emails = [];
102
+ if (emp && emp.emails && emp.emails.length > 0) {
103
+ emp.emails.forEach(e => {
104
+ this.emails.push(e);
105
+ });
106
+ this.emails.sort((a, b) => (a < b) ? -1 : 1);
107
+ }
108
+ if (emp && emp.work && emp.work.length > 0) {
109
+ this.work = [];
110
+ emp.work.forEach(w => {
111
+ this.work.push(new work_1.Work(w));
112
+ });
113
+ this.work.sort((a, b) => a.compareTo(b));
114
+ }
115
+ else {
116
+ this.work = undefined;
117
+ }
118
+ if (emp && emp.user) {
119
+ this.user = new users_1.User(emp.user);
120
+ }
121
+ else {
122
+ this.user = undefined;
123
+ }
124
+ }
125
+ compareTo(other) {
126
+ if (other) {
127
+ if (this.name.lastname === other.name.lastname) {
128
+ if (this.name.firstname === other.name.firstname) {
129
+ if (this.name.middlename && other.name.middlename) {
130
+ return (this.name.middlename < other.name.middlename) ? -1 : 1;
131
+ }
132
+ else if (this.name.middlename) {
133
+ return -1;
134
+ }
135
+ else {
136
+ return 1;
137
+ }
138
+ }
139
+ return (this.name.firstname < other.name.firstname) ? -1 : 1;
140
+ }
141
+ return (this.name.lastname < other.name.lastname) ? -1 : 1;
142
+ }
143
+ return -1;
144
+ }
145
+ cloneForSave() {
146
+ const result = new Employee(this);
147
+ result.work = undefined;
148
+ result.user = undefined;
149
+ return result;
150
+ }
151
+ purge(date) {
152
+ this.variations.sort((a, b) => a.compareTo(b));
153
+ for (let v = this.variations.length - 1; v >= 0; v--) {
154
+ if (this.variations[v].enddate.getTime() < date.getTime()) {
155
+ this.variations.splice(v, 1);
156
+ }
157
+ }
158
+ this.leaves.sort((a, b) => a.compareTo(b));
159
+ for (let l = this.leaves.length - 1; l >= 0; l--) {
160
+ if (this.leaves[l].leavedate.getTime() < date.getTime()) {
161
+ this.leaves.splice(l, 1);
162
+ }
163
+ }
164
+ for (let l = this.requests.length - 1; l >= 0; l--) {
165
+ if (this.requests[l].enddate.getTime() < date.getTime()) {
166
+ this.requests.splice(l, 1);
167
+ }
168
+ }
169
+ this.balances.sort((a, b) => a.compareTo(b));
170
+ for (let b = this.balances.length - 1; b >= 0; b--) {
171
+ if (this.balances[b].year < date.getUTCFullYear()) {
172
+ this.balances.splice(b, 1);
173
+ }
174
+ }
175
+ this.assignments.sort((a, b) => a.compareTo(b));
176
+ const last = this.assignments[this.assignments.length - 1];
177
+ return (last.endDate.getTime() < date.getTime());
178
+ }
179
+ removeLeaves(start, end, reqID = '', includeActuals = true) {
180
+ this.leaves.sort((a, b) => a.compareTo(b));
181
+ for (let l = this.leaves.length - 1; l >= 0; l--) {
182
+ if (reqID === '' && includeActuals) {
183
+ if (this.leaves[l].leavedate.getTime() >= start.getTime()
184
+ && this.leaves[l].leavedate.getTime() <= end.getTime()) {
185
+ this.leaves.splice(l, 1);
186
+ }
187
+ }
188
+ else if (reqID !== '' && includeActuals) {
189
+ if (this.leaves[l].leavedate.getTime() >= start.getTime()
190
+ && this.leaves[l].leavedate.getTime() <= end.getTime()
191
+ && this.leaves[l].requestid === reqID) {
192
+ this.leaves.splice(l, 1);
193
+ }
194
+ }
195
+ else if (reqID === '' && !includeActuals) {
196
+ if (this.leaves[l].leavedate.getTime() >= start.getTime()
197
+ && this.leaves[l].leavedate.getTime() <= end.getTime()
198
+ && this.leaves[l].status.toLowerCase() !== 'actual') {
199
+ this.leaves.splice(l, 1);
200
+ }
201
+ }
202
+ else if (reqID !== '' && !includeActuals) {
203
+ if (this.leaves[l].leavedate.getTime() >= start.getTime()
204
+ && this.leaves[l].leavedate.getTime() <= end.getTime()
205
+ && this.leaves[l].status.toLowerCase() !== 'actual'
206
+ && this.leaves[l].requestid === reqID) {
207
+ this.leaves.splice(l, 1);
208
+ }
209
+ }
210
+ }
211
+ }
212
+ isActive(date) {
213
+ let result = false;
214
+ this.assignments.forEach(a => {
215
+ if (a.useSiteAssignment(this.site, date)) {
216
+ result = true;
217
+ }
218
+ });
219
+ return result;
220
+ }
221
+ isActiveBetween(start, end) {
222
+ let result = false;
223
+ this.assignments.forEach(a => {
224
+ if (a.useAssignment(start, end)) {
225
+ result = true;
226
+ }
227
+ });
228
+ return result;
229
+ }
230
+ isAssigned(site, wkctr, start, end) {
231
+ let result = false;
232
+ this.assignments.forEach(a => {
233
+ if (a.site.toLowerCase() === site.toLowerCase()
234
+ && a.workcenter.toLowerCase() === wkctr.toLowerCase()
235
+ && ((start.getTime() < a.startDate.getTime()
236
+ && end.getTime() > a.endDate.getTime())
237
+ || (end.getTime() > a.startDate.getTime()
238
+ && end.getTime() < a.endDate.getTime())
239
+ || (start.getTime() > a.startDate.getTime()
240
+ && end.getTime() < a.endDate.getTime()))) {
241
+ result = true;
242
+ }
243
+ });
244
+ return result;
245
+ }
246
+ atSite(site, start, end) {
247
+ let result = false;
248
+ this.assignments.forEach(a => {
249
+ if (a.site.toLowerCase() === site.toLowerCase()
250
+ && ((start.getTime() < a.startDate.getTime()
251
+ && end.getTime() > a.endDate.getTime())
252
+ || (end.getTime() > a.startDate.getTime()
253
+ && end.getTime() < a.endDate.getTime())
254
+ || (start.getTime() > a.startDate.getTime()
255
+ && end.getTime() < a.endDate.getTime()))) {
256
+ result = true;
257
+ }
258
+ });
259
+ return result;
260
+ }
261
+ getWorkday(date, type = 'general', labor) {
262
+ switch (type.toLowerCase()) {
263
+ case "actuals":
264
+ return this.getWorkdayActual(date, labor);
265
+ break;
266
+ case "noleaves":
267
+ return this.getWorkdayWOLeaves(date);
268
+ break;
269
+ default:
270
+ return this.getWorkdayGeneral(date);
271
+ }
272
+ }
273
+ getWorkdayGeneral(date) {
274
+ let wday;
275
+ let stdWorkday = 8.0;
276
+ let work = 0.0;
277
+ let siteid = '';
278
+ let lastWorked = new Date(0);
279
+ this.assignments.forEach(asgmt => {
280
+ if (asgmt.useSiteAssignment(this.site, date)) {
281
+ stdWorkday = asgmt.getStandardWorkHours();
282
+ }
283
+ });
284
+ if (this.work) {
285
+ this.work.forEach(wk => {
286
+ if (wk.useWork(date) && wk.modtime) {
287
+ work += wk.hours;
288
+ }
289
+ if (wk.dateworked.getTime() > lastWorked.getTime()) {
290
+ lastWorked = new Date(wk.dateworked);
291
+ }
292
+ });
293
+ }
294
+ this.assignments.forEach(asgmt => {
295
+ if (asgmt.useAssignment(date)) {
296
+ wday = asgmt.getWorkday(date);
297
+ siteid = asgmt.site;
298
+ }
299
+ });
300
+ this.variations.forEach(vari => {
301
+ if (vari.useVariation(date)) {
302
+ wday = vari.getWorkday(date);
303
+ }
304
+ });
305
+ if (work > 0.0) {
306
+ while (!wday || (wday && wday.code === '')) {
307
+ date = new Date(date.getTime() - (24 * 3600000));
308
+ this.assignments.forEach(asgmt => {
309
+ if (asgmt.useAssignment(date)) {
310
+ wday = asgmt.getWorkday(date);
311
+ }
312
+ });
313
+ }
314
+ wday.hours = work;
315
+ return wday;
316
+ }
317
+ this.leaves.forEach(lv => {
318
+ if (lv.useLeave(date)
319
+ && (lv.hours > stdWorkday / 2 || lv.status.toLowerCase() === 'actual')) {
320
+ wday = new workday_1.Workday({
321
+ id: 0,
322
+ workcenter: '',
323
+ code: lv.code,
324
+ hours: lv.hours
325
+ });
326
+ }
327
+ });
328
+ return wday;
329
+ }
330
+ getWorkdayActual(date, labor) {
331
+ let wday;
332
+ let siteid = '';
333
+ let bPrimary = false;
334
+ this.assignments.forEach(asgmt => {
335
+ if (asgmt.useAssignment(date)) {
336
+ siteid = asgmt.site;
337
+ wday = asgmt.getWorkday(date);
338
+ labor?.forEach(lc => {
339
+ asgmt.laborcodes.forEach(alc => {
340
+ if (lc.chargenumber.toLowerCase() === alc.chargenumber.toLowerCase()
341
+ && lc.extension.toLowerCase() === alc.extension.toLowerCase()) {
342
+ bPrimary = true;
343
+ }
344
+ });
345
+ });
346
+ }
347
+ });
348
+ this.variations.forEach(vari => {
349
+ if (vari.useVariation(date)) {
350
+ wday = vari.getWorkday(date);
351
+ }
352
+ });
353
+ let bLeave = false;
354
+ if (bPrimary || labor?.length === 0) {
355
+ this.leaves.forEach(lv => {
356
+ if (lv.useLeave(date) && lv.status.toLowerCase() === 'actual') {
357
+ if (!bLeave) {
358
+ wday = new workday_1.Workday({
359
+ id: 0,
360
+ workcenter: '',
361
+ code: lv.code,
362
+ hours: lv.hours
363
+ });
364
+ }
365
+ else {
366
+ if (wday) {
367
+ if (lv.hours <= wday.hours) {
368
+ wday.hours += lv.hours;
369
+ }
370
+ else {
371
+ wday.hours += lv.hours;
372
+ wday.code = lv.code;
373
+ }
374
+ }
375
+ }
376
+ }
377
+ });
378
+ }
379
+ return wday;
380
+ }
381
+ getWorkdayWOLeaves(date, useWork) {
382
+ let wday;
383
+ let stdWorkday = 8.0;
384
+ let work = 0.0;
385
+ let siteid = '';
386
+ let lastWorked = new Date(0);
387
+ this.assignments.forEach(asgmt => {
388
+ if (asgmt.useSiteAssignment(this.site, date)) {
389
+ stdWorkday = asgmt.getStandardWorkHours();
390
+ }
391
+ });
392
+ if (this.work) {
393
+ this.work.forEach(wk => {
394
+ if (wk.useWork(date) && wk.modtime) {
395
+ work += wk.hours;
396
+ }
397
+ if (wk.dateworked.getTime() > lastWorked.getTime()) {
398
+ lastWorked = new Date(wk.dateworked);
399
+ }
400
+ });
401
+ }
402
+ this.assignments.forEach(asgmt => {
403
+ if (asgmt.useAssignment(date)) {
404
+ wday = asgmt.getWorkday(date);
405
+ siteid = asgmt.site;
406
+ }
407
+ });
408
+ this.variations.forEach(vari => {
409
+ if (vari.useVariation(date)) {
410
+ wday = vari.getWorkday(date);
411
+ }
412
+ });
413
+ if (work > 0.0) {
414
+ while (!wday || (wday && wday.code === '')) {
415
+ date = new Date(date.getTime() - (24 * 3600000));
416
+ this.assignments.forEach(asgmt => {
417
+ if (asgmt.useAssignment(date)) {
418
+ wday = asgmt.getWorkday(date);
419
+ }
420
+ });
421
+ }
422
+ wday.hours = work;
423
+ return wday;
424
+ }
425
+ if (useWork && date.getTime() <= lastWorked.getTime()) {
426
+ wday = undefined;
427
+ }
428
+ return wday;
429
+ }
430
+ getStandardWorkday(date) {
431
+ let answer = 8.0;
432
+ this.assignments.forEach(asgmt => {
433
+ if (asgmt.useAssignment(date)) {
434
+ answer = asgmt.getStandardWorkHours();
435
+ }
436
+ });
437
+ return answer;
438
+ }
439
+ addAssignment(site, wkctr, start) {
440
+ let max = -1;
441
+ this.assignments.sort((a, b) => a.compareTo(b));
442
+ this.assignments.forEach(asgmt => {
443
+ if (asgmt.id > max) {
444
+ max = asgmt.id;
445
+ }
446
+ });
447
+ const lastAsgmt = this.assignments[this.assignments.length - 1];
448
+ lastAsgmt.endDate = new Date(start.getTime() - (24 * 3600000));
449
+ this.assignments[this.assignments.length - 1] = lastAsgmt;
450
+ const newAsgmt = new assignment_1.Assignment({
451
+ id: max + 1,
452
+ site: site,
453
+ workcenter: wkctr,
454
+ startDate: new Date(start),
455
+ endDate: new Date(Date.UTC(9999, 11, 31)),
456
+ schedules: []
457
+ });
458
+ newAsgmt.addSchedule(7);
459
+ for (let d = 1; d < 6; d++) {
460
+ newAsgmt.changeWorkday(0, d, wkctr, 'D', 8.0);
461
+ }
462
+ this.assignments.push(newAsgmt);
463
+ }
464
+ updateAssignment(id, field, value, schedule, workday) {
465
+ let found = false;
466
+ this.assignments.sort((a, b) => a.compareTo(b));
467
+ this.assignments.forEach((asgmt, i) => {
468
+ if (asgmt.id === id) {
469
+ found = true;
470
+ switch (field.toLowerCase()) {
471
+ case "site":
472
+ asgmt.site = value;
473
+ break;
474
+ case "workcenter":
475
+ asgmt.workcenter = value;
476
+ break;
477
+ case "start":
478
+ case "startdate":
479
+ asgmt.startDate = this.getDateFromString(value);
480
+ break;
481
+ case "end":
482
+ case "enddate":
483
+ asgmt.endDate = this.getDateFromString(value);
484
+ break;
485
+ case "rotationdate":
486
+ asgmt.rotationdate = this.getDateFromString(value);
487
+ break;
488
+ case "rotationdays":
489
+ asgmt.rotationdays = Number(value);
490
+ break;
491
+ case "addschedule":
492
+ asgmt.addSchedule(Number(value));
493
+ break;
494
+ case "removeschedule":
495
+ if (schedule) {
496
+ asgmt.removeSchedule(schedule);
497
+ }
498
+ else {
499
+ throw new Error('Assignment schedule id not provided');
500
+ }
501
+ break;
502
+ case "scheduledays":
503
+ if (schedule) {
504
+ asgmt.changeScheduleDays(schedule, Number(value));
505
+ }
506
+ else {
507
+ throw new Error('Assignment schedule id not provided');
508
+ }
509
+ break;
510
+ case "workday-code":
511
+ case "workday-workcenter":
512
+ case "workday-hours":
513
+ case "workday-copy":
514
+ const wparts = field.split('-');
515
+ if (schedule && workday) {
516
+ asgmt.updateWorkday(schedule, workday, wparts[1], value);
517
+ }
518
+ else {
519
+ throw new Error('Assignment schedule and/or workday id not provided');
520
+ }
521
+ break;
522
+ case "addlaborcode":
523
+ const vparts = value.split('|');
524
+ asgmt.addLaborCode(vparts[0], vparts[1]);
525
+ break;
526
+ case "removelaborcode":
527
+ const rparts = value.split('|');
528
+ asgmt.removeLaborCode(rparts[0], rparts[1]);
529
+ break;
530
+ }
531
+ this.assignments[i] = asgmt;
532
+ }
533
+ });
534
+ if (!found) {
535
+ throw new Error('Assignment not found');
536
+ }
537
+ }
538
+ removeAssignment(id) {
539
+ this.assignments.sort((a, b) => a.compareTo(b));
540
+ let pos = -1;
541
+ for (let a = 0; a < this.assignments.length && pos < 0; a++) {
542
+ if (this.assignments[a].id === id) {
543
+ pos = a;
544
+ }
545
+ }
546
+ if (pos === 0) {
547
+ const asgmt = this.assignments[pos];
548
+ const nextAsgmt = this.assignments[pos + 1];
549
+ nextAsgmt.startDate = new Date(asgmt.startDate);
550
+ this.assignments[pos + 1] = nextAsgmt;
551
+ this.assignments.splice(pos, 1);
552
+ }
553
+ else if (pos === this.assignments.length - 1) {
554
+ if (pos > 0) {
555
+ this.assignments[pos - 1].endDate = new Date(Date.UTC(9999, 11, 31));
556
+ this.assignments.pop();
557
+ }
558
+ }
559
+ else {
560
+ this.assignments[pos - 1].endDate
561
+ = new Date(this.assignments[pos + 1].startDate.getTime() - (24 * 3600000));
562
+ this.assignments.splice(pos, 1);
563
+ }
564
+ }
565
+ addVariation(site, start) {
566
+ let newID = -1;
567
+ this.variations.forEach(vari => {
568
+ if (vari.id > newID) {
569
+ newID = vari.id;
570
+ }
571
+ });
572
+ newID++;
573
+ const newVari = new variation_1.Variation();
574
+ newVari.id = newID;
575
+ newVari.site = site;
576
+ newVari.startdate = new Date(start);
577
+ newVari.enddate = new Date(start);
578
+ this.variations.push(newVari);
579
+ this.variations.sort((a, b) => a.compareTo(b));
580
+ }
581
+ updateVariation(varID, field, value, workday) {
582
+ this.variations.sort((a, b) => a.compareTo(b));
583
+ let found = false;
584
+ this.variations.forEach((vari, v) => {
585
+ if (vari.id === varID) {
586
+ found = true;
587
+ switch (field.toLowerCase()) {
588
+ case "site":
589
+ vari.site = value;
590
+ break;
591
+ case "mids":
592
+ case "ismids":
593
+ vari.mids = Boolean(value);
594
+ break;
595
+ case "dates":
596
+ vari.schedule.showdates = Boolean(value);
597
+ break;
598
+ case "start":
599
+ case "startdate":
600
+ vari.startdate = this.getDateFromString(value);
601
+ break;
602
+ case "end":
603
+ case "enddate":
604
+ vari.enddate = this.getDateFromString(value);
605
+ break;
606
+ case "changeschedule":
607
+ vari.schedule.setScheduleDays(Number(value));
608
+ break;
609
+ case "workday-code":
610
+ case "workday-workcenter":
611
+ case "workday-hours":
612
+ case "workday-copy":
613
+ const wparts = field.split('-');
614
+ if (workday) {
615
+ vari.updateWorkday(workday, wparts[1], value);
616
+ }
617
+ break;
618
+ }
619
+ this.variations[v] = vari;
620
+ }
621
+ });
622
+ if (!found) {
623
+ throw new Error('Variation not found');
624
+ }
625
+ }
626
+ getDateFromString(date) {
627
+ const reDateFormat = new RegExp('^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$');
628
+ if (reDateFormat.test(date)) {
629
+ const parts = date.split('-');
630
+ const year = parseInt(parts[0]);
631
+ const month = parseInt(parts[1]);
632
+ const day = parseInt(parts[2]);
633
+ const result = new Date(Date.UTC(year, month - 1, day));
634
+ return result;
635
+ }
636
+ else {
637
+ throw new Error('Date not in correct format (yyyy-mm-dd)');
638
+ }
639
+ }
640
+ removeVariation(varID) {
641
+ let found = -1;
642
+ this.variations.forEach((vari, v) => {
643
+ if (vari.id === varID) {
644
+ found = v;
645
+ }
646
+ });
647
+ if (found >= 0) {
648
+ this.variations.splice(found, 1);
649
+ }
650
+ else {
651
+ throw new Error('Variation not found');
652
+ }
653
+ }
654
+ isPrimaryCode(date, labor) {
655
+ let answer = false;
656
+ this.assignments.forEach(asgmt => {
657
+ if (asgmt.useAssignment(date)) {
658
+ asgmt.laborcodes.forEach(lc => {
659
+ if (labor.chargenumber.toLowerCase() === lc.chargenumber.toLowerCase()
660
+ && labor.extension.toLowerCase() === lc.extension.toLowerCase()) {
661
+ answer = true;
662
+ }
663
+ });
664
+ }
665
+ });
666
+ return answer;
667
+ }
668
+ hasLaborCode(chargeNumber, extension) {
669
+ let found = false;
670
+ this.assignments.forEach(asgmt => {
671
+ asgmt.laborcodes.forEach(lc => {
672
+ if (lc.chargenumber.toLowerCase() === chargeNumber.toLowerCase()
673
+ && lc.extension.toLowerCase() === extension.toLowerCase()) {
674
+ found = true;
675
+ }
676
+ });
677
+ });
678
+ return found;
679
+ }
680
+ hasLaborCodeOnDate(date, chgNo, ext) {
681
+ let found = false;
682
+ this.assignments.forEach(asgmt => {
683
+ if (asgmt.useAssignment(date)) {
684
+ asgmt.laborcodes.forEach(lc => {
685
+ if (lc.chargenumber.toLowerCase() === chgNo.toLowerCase()
686
+ && lc.extension.toLowerCase() === ext.toLowerCase()) {
687
+ found = true;
688
+ }
689
+ });
690
+ }
691
+ });
692
+ return found;
693
+ }
694
+ getAssignmentForPeriod(start, end) {
695
+ const assigned = new Map();
696
+ start = new Date(Date.UTC(start.getFullYear(), start.getMonth(), start.getDate()));
697
+ end = new Date(Date.UTC(end.getFullYear(), end.getMonth(), end.getDate()));
698
+ while (start.getTime() <= end.getTime()) {
699
+ const wd = this.getWorkdayWOLeaves(start);
700
+ if (wd) {
701
+ const label = `${wd.workcenter}-${wd.code}`;
702
+ if (label !== '-') {
703
+ if (assigned.has(label)) {
704
+ let num = assigned.get(label);
705
+ if (num) {
706
+ num++;
707
+ assigned.set(label, num);
708
+ }
709
+ else {
710
+ assigned.set(label, 1);
711
+ }
712
+ }
713
+ else {
714
+ assigned.set(label, 1);
715
+ }
716
+ }
717
+ }
718
+ start = new Date(start.getTime() + (24 * 3600000));
719
+ }
720
+ let max = 0;
721
+ let label = '';
722
+ const keys = Array.from(assigned.keys());
723
+ keys.forEach(key => {
724
+ const num = assigned.get(key);
725
+ if (num && num > max) {
726
+ max = num;
727
+ label = key;
728
+ }
729
+ });
730
+ const work = label.split('-');
731
+ return new workday_1.Workday({
732
+ id: 0,
733
+ workcenter: work[0],
734
+ code: work[1],
735
+ hours: 0.0
736
+ });
737
+ }
738
+ getForecastHours(labor, start, end, codes) {
739
+ let answer = 0.0;
740
+ start = new Date(Date.UTC(start.getFullYear(), start.getMonth(), start.getDate()));
741
+ end = new Date(Date.UTC(end.getFullYear(), end.getMonth(), end.getDate()));
742
+ let found = false;
743
+ this.assignments.forEach(asgmt => {
744
+ if (asgmt.useAssignment(start, end, labor)) {
745
+ found = true;
746
+ }
747
+ });
748
+ if (!found) {
749
+ return 0.0;
750
+ }
751
+ if (!labor.startDate || !labor.endDate
752
+ || labor.endDate.getTime() < start.getTime()
753
+ || labor.startDate.getTime() > end.getTime()) {
754
+ return 0.0;
755
+ }
756
+ let lastWorked = new Date(0);
757
+ if (this.work && this.work.length > 0) {
758
+ this.work.sort((a, b) => a.compareTo(b));
759
+ lastWorked = new Date(this.work[this.work.length - 1].dateworked);
760
+ }
761
+ this.leaves.sort((a, b) => a.compareTo(b));
762
+ this.leaves.forEach(lv => {
763
+ if (lv.status.toLowerCase() === 'actual' && lv.leavedate.getTime() > lastWorked.getTime()) {
764
+ lastWorked = new Date(lv.leavedate);
765
+ }
766
+ });
767
+ let current = new Date(start);
768
+ while (current.getTime() <= end.getTime()) {
769
+ if (current.getTime() > lastWorked.getTime()) {
770
+ const nextday = new Date(current.getTime() + (24 * 3600000));
771
+ let hours = this.getWorkedHours(current, nextday);
772
+ if (hours === 0.0) {
773
+ if (current.getTime() >= labor.startDate.getTime()
774
+ && current.getTime() <= labor.endDate.getTime()) {
775
+ const wd = this.getWorkday(current);
776
+ if (wd && wd.code !== '') {
777
+ codes.forEach(code => {
778
+ if (code.id.toLowerCase() === wd.code.toLowerCase() && !code.isLeave) {
779
+ this.assignments.forEach(asgmt => {
780
+ if (asgmt.useAssignment(current, nextday, labor)) {
781
+ answer += wd.hours;
782
+ }
783
+ });
784
+ }
785
+ });
786
+ }
787
+ }
788
+ }
789
+ }
790
+ current = new Date(current.getTime() + (24 * 3600000));
791
+ }
792
+ return answer;
793
+ }
794
+ getWorkedHours(start, end, chgno, ext) {
795
+ start = new Date(Date.UTC(start.getFullYear(), start.getMonth(), start.getDate()));
796
+ end = new Date(Date.UTC(end.getFullYear(), end.getMonth(), end.getDate()));
797
+ let answer = 0.0;
798
+ if (this.work) {
799
+ this.work.forEach(wk => {
800
+ if (wk.dateworked.getTime() >= start.getTime()
801
+ && wk.dateworked.getTime() <= end.getTime()
802
+ && !wk.modtime) {
803
+ if (!chgno) {
804
+ answer += wk.hours;
805
+ }
806
+ else if (chgno && ext) {
807
+ if (chgno.toLowerCase() === wk.chargenumber.toLowerCase()
808
+ && ext.toLowerCase() === wk.extension.toLowerCase()) {
809
+ answer += wk.hours;
810
+ }
811
+ }
812
+ }
813
+ });
814
+ }
815
+ return answer;
816
+ }
817
+ getLastWorkday() {
818
+ let answer = new Date(0);
819
+ if (this.work && this.work.length > 0) {
820
+ this.work.sort((a, b) => a.compareTo(b));
821
+ const last = this.work[this.work.length - 1];
822
+ answer = new Date(last.dateworked);
823
+ }
824
+ return answer;
825
+ }
826
+ getModTime(start, end) {
827
+ let answer = 0.0;
828
+ this.work?.forEach(wk => {
829
+ if (wk.dateworked.getTime() >= start.getTime()
830
+ && wk.dateworked.getTime() <= end.getTime()
831
+ && wk.modtime) {
832
+ answer += wk.hours;
833
+ }
834
+ });
835
+ return answer;
836
+ }
837
+ hasModTime(start, end) {
838
+ let answer = false;
839
+ this.work?.forEach(wk => {
840
+ if (wk.dateworked.getTime() >= start.getTime()
841
+ && wk.dateworked.getTime() <= end.getTime()
842
+ && wk.modtime) {
843
+ answer = true;
844
+ }
845
+ });
846
+ return answer;
847
+ }
848
+ createLeaveBalance(year) {
849
+ let found = false;
850
+ let lastAnnual = 0.0;
851
+ let lastCarry = 0.0;
852
+ this.balances.forEach(bal => {
853
+ if (bal.year === year) {
854
+ found = true;
855
+ }
856
+ if (bal.year === year - 1) {
857
+ lastAnnual = bal.annual;
858
+ lastCarry = bal.carryover;
859
+ }
860
+ });
861
+ if (!found) {
862
+ const bal = new balance_1.AnnualLeave({
863
+ year: year,
864
+ annual: lastAnnual,
865
+ carryover: lastCarry
866
+ });
867
+ if (lastAnnual === 0.0) {
868
+ bal.annual = 100;
869
+ }
870
+ else {
871
+ let carry = lastAnnual + lastCarry;
872
+ this.leaves.forEach(lv => {
873
+ if (lv.leavedate.getFullYear() === year && lv.code.toLowerCase() === 'v'
874
+ && lv.status.toLowerCase() === 'actual') {
875
+ carry -= lv.hours;
876
+ }
877
+ });
878
+ bal.carryover = carry;
879
+ }
880
+ this.balances.push(bal);
881
+ this.balances.sort((a, b) => a.compareTo(b));
882
+ }
883
+ else {
884
+ throw new Error('Leave Balance year already exists');
885
+ }
886
+ }
887
+ updateLeaveBalance(year, field, value) {
888
+ let found = false;
889
+ for (let lb = 0; lb < this.balances.length && !found; lb++) {
890
+ if (this.balances[lb].year === year) {
891
+ found = true;
892
+ switch (field.toLowerCase()) {
893
+ case "annual":
894
+ this.balances[lb].annual = value;
895
+ break;
896
+ case 'carry':
897
+ case 'carryover':
898
+ this.balances[lb].carryover = value;
899
+ break;
900
+ }
901
+ }
902
+ }
903
+ if (!found) {
904
+ throw new Error('Leave Balance year not found');
905
+ }
906
+ this.balances.sort((a, b) => a.compareTo(b));
907
+ }
908
+ deleteLeaveBalance(year) {
909
+ let found = -1;
910
+ this.balances.forEach((bal, i) => {
911
+ if (bal.year === year) {
912
+ found = i;
913
+ }
914
+ });
915
+ if (found >= 0) {
916
+ this.balances.splice(found, 1);
917
+ }
918
+ else {
919
+ throw new Error('Leave Balance year not found');
920
+ }
921
+ }
922
+ addLeave(id, date, code, status, hours, requestid, holCode) {
923
+ let found = false;
924
+ let max = 0;
925
+ date = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
926
+ this.leaves.forEach((lv, l) => {
927
+ if ((lv.useLeave(date) && lv.code.toLowerCase() === code.toLowerCase())
928
+ || lv.id === id) {
929
+ found = true;
930
+ lv.status = status;
931
+ lv.hours = hours;
932
+ if (lv.requestid === '') {
933
+ lv.requestid = requestid;
934
+ }
935
+ if (holCode && holCode !== '') {
936
+ lv.tagday = holCode;
937
+ }
938
+ this.leaves[l] = lv;
939
+ }
940
+ else if (lv.id > max) {
941
+ max = lv.id;
942
+ }
943
+ });
944
+ if (!found) {
945
+ const lv = new leave_1.Leave({
946
+ id: max + 1,
947
+ leavedate: new Date(date),
948
+ code: code,
949
+ hours: hours,
950
+ status: status,
951
+ requestid: requestid,
952
+ used: false,
953
+ tagday: holCode
954
+ });
955
+ this.leaves.push(lv);
956
+ this.leaves.sort((a, b) => a.compareTo(b));
957
+ }
958
+ }
959
+ updateLeave(id, field, value) {
960
+ let answer = undefined;
961
+ this.leaves.forEach((lv, l) => {
962
+ if (lv.id === id) {
963
+ switch (field.toLowerCase()) {
964
+ case "date":
965
+ const newdate = new Date(Date.parse(value));
966
+ lv.leavedate = newdate;
967
+ break;
968
+ case "code":
969
+ lv.code = value;
970
+ break;
971
+ case "hours":
972
+ lv.hours = Number(value);
973
+ break;
974
+ case 'status':
975
+ lv.status = value;
976
+ break;
977
+ case 'requestid':
978
+ lv.requestid = value;
979
+ break;
980
+ case 'tagday':
981
+ lv.tagday = value;
982
+ break;
983
+ }
984
+ }
985
+ this.leaves[l] = lv;
986
+ this.leaves.sort((a, b) => a.compareTo(b));
987
+ answer = lv;
988
+ });
989
+ return answer;
990
+ }
991
+ deleteLeave(id) {
992
+ let found = -1;
993
+ this.leaves.forEach((lv, l) => {
994
+ if (lv.id === id) {
995
+ found = l;
996
+ }
997
+ });
998
+ if (found >= 0) {
999
+ this.leaves.splice(found, 1);
1000
+ }
1001
+ }
1002
+ getLeaveHours(start, end) {
1003
+ let answer = 0.0;
1004
+ this.leaves.forEach(lv => {
1005
+ if (lv.leavedate.getTime() >= start.getTime()
1006
+ && end.getTime() >= lv.leavedate.getTime()
1007
+ && lv.status.toLowerCase() === 'actual') {
1008
+ answer += lv.hours;
1009
+ }
1010
+ });
1011
+ return answer;
1012
+ }
1013
+ getLeave(start) {
1014
+ const workday = new workday_1.Workday();
1015
+ this.leaves.forEach(lv => {
1016
+ if (lv.leavedate.getUTCFullYear() === start.getUTCFullYear()
1017
+ && lv.leavedate.getUTCMonth() === start.getUTCMonth()
1018
+ && lv.leavedate.getUTCDate() === start.getUTCDate()) {
1019
+ if (workday.code === '') {
1020
+ workday.code = lv.code;
1021
+ workday.hours = lv.hours;
1022
+ }
1023
+ else {
1024
+ if (workday.hours < lv.hours) {
1025
+ workday.code = lv.code;
1026
+ workday.hours += lv.hours;
1027
+ }
1028
+ }
1029
+ }
1030
+ });
1031
+ return workday;
1032
+ }
1033
+ getPTOHours(start, end) {
1034
+ let answer = 0.0;
1035
+ this.leaves.forEach(lv => {
1036
+ if (lv.leavedate.getTime() >= start.getTime()
1037
+ && end.getTime() >= lv.leavedate.getTime()
1038
+ && lv.status.toLowerCase() === 'actual'
1039
+ && lv.code.toLowerCase() === 'v') {
1040
+ answer += lv.hours;
1041
+ }
1042
+ });
1043
+ return answer;
1044
+ }
1045
+ createLeaveRequest(start, end, code, comment) {
1046
+ start = new Date(Date.UTC(start.getFullYear(), start.getMonth(), start.getDate()));
1047
+ end = new Date(Date.UTC(end.getFullYear(), end.getMonth(), end.getDate()));
1048
+ let answer = undefined;
1049
+ this.requests.forEach((req, r) => {
1050
+ if (req.startdate.getTime() === start.getTime()
1051
+ && req.enddate.getTime() === end.getTime()) {
1052
+ if (comment) {
1053
+ const cmt = new leaverequest_1.LeaveRequestComment({
1054
+ commentdate: new Date(),
1055
+ comment: comment
1056
+ });
1057
+ req.comments.push(cmt);
1058
+ req.comments.sort((a, b) => a.compareTo(b));
1059
+ }
1060
+ answer = new leaverequest_1.LeaveRequest(req);
1061
+ }
1062
+ });
1063
+ if (!answer) {
1064
+ const id = (0, uuid_1.v4)().toString();
1065
+ answer = new leaverequest_1.LeaveRequest({
1066
+ id: id,
1067
+ employeeid: this.id,
1068
+ requestdate: new Date(),
1069
+ primarycode: code,
1070
+ startdate: start,
1071
+ enddate: end,
1072
+ status: 'DRAFT',
1073
+ approvalDate: new Date(0),
1074
+ approvedby: '',
1075
+ requesteddays: [],
1076
+ comments: []
1077
+ });
1078
+ answer.comments.push(new leaverequest_1.LeaveRequestComment({
1079
+ commentdate: new Date(),
1080
+ comment: 'Request Created'
1081
+ }));
1082
+ if (comment) {
1083
+ answer.comments.push(new leaverequest_1.LeaveRequestComment({
1084
+ commentdate: new Date(),
1085
+ comment: comment
1086
+ }));
1087
+ }
1088
+ answer.setLeaveDays(this);
1089
+ this.requests.push(new leaverequest_1.LeaveRequest(answer));
1090
+ }
1091
+ return answer;
1092
+ }
1093
+ updateLeaveRequest(id, field, value) {
1094
+ const answer = {
1095
+ message: '',
1096
+ leaverequest: undefined,
1097
+ error: undefined
1098
+ };
1099
+ this.requests.forEach((req, r) => {
1100
+ if (req.useRequest(id)) {
1101
+ switch (field.toLowerCase()) {
1102
+ case "startdate":
1103
+ case "start":
1104
+ let date = new Date(Date.parse(value));
1105
+ date = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
1106
+ if (date.getTime() < req.startdate.getTime()
1107
+ || date.getTime() > req.enddate.getTime()) {
1108
+ if (req.status.toLowerCase() === 'approved') {
1109
+ this.leaves.sort((a, b) => a.compareTo(b));
1110
+ let count = 0;
1111
+ let startpos = -1;
1112
+ this.leaves.forEach((lv, l) => {
1113
+ if (lv.requestid === id && lv.status.toLowerCase() !== 'actual') {
1114
+ if (startpos < 0) {
1115
+ startpos = l;
1116
+ count++;
1117
+ }
1118
+ else {
1119
+ count++;
1120
+ }
1121
+ }
1122
+ });
1123
+ if (startpos >= 0) {
1124
+ this.leaves.splice(startpos, count);
1125
+ }
1126
+ }
1127
+ req.status = 'DRAFT';
1128
+ req.approvalDate = new Date(0);
1129
+ req.approvedby = '';
1130
+ answer.message = `Leave Request: ${this.name.getFirstLast()} leave request `
1131
+ + `(${req.startdate.toLocaleDateString('en-US')}-`
1132
+ + `${req.enddate.toLocaleDateString('en-US')}) start date was changed to `
1133
+ + `before original date. This converted the leave request back to draft `
1134
+ + `for resubmittal.`;
1135
+ }
1136
+ else {
1137
+ if (req.status.toLowerCase() === 'approved') {
1138
+ this.leaves.sort((a, b) => a.compareTo(b));
1139
+ let count = 0;
1140
+ let startpos = -1;
1141
+ this.leaves.forEach((lv, l) => {
1142
+ if (lv.requestid === id && lv.status.toLowerCase() !== 'actual'
1143
+ && lv.leavedate.getTime() < date.getTime()) {
1144
+ if (startpos < 0) {
1145
+ startpos = l;
1146
+ count++;
1147
+ }
1148
+ else {
1149
+ count++;
1150
+ }
1151
+ }
1152
+ });
1153
+ if (startpos >= 0 && count > 0) {
1154
+ this.leaves.splice(startpos, count);
1155
+ }
1156
+ }
1157
+ answer.message = `Leave Request: ${this.name.getFirstLast()} leave request `
1158
+ + `(${req.startdate.toLocaleDateString('en-US')}-`
1159
+ + `${req.enddate.toLocaleDateString('en-US')}) start date was changed `
1160
+ + `within the original dates. Approved Leave days were updated in the database `
1161
+ + 'as approved.';
1162
+ }
1163
+ req.startdate = new Date(date);
1164
+ req.setLeaveDays(this);
1165
+ req.comments.push(new leaverequest_1.LeaveRequestComment({
1166
+ commentdate: new Date(),
1167
+ comment: `Start date for request was changed to ${date.toDateString()}`
1168
+ }));
1169
+ req.comments.sort((a, b) => a.compareTo(b));
1170
+ break;
1171
+ case "enddate":
1172
+ case "end":
1173
+ date = new Date(Date.parse(value));
1174
+ date = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
1175
+ if (date.getTime() < req.startdate.getTime()
1176
+ || date.getTime() > req.enddate.getTime()) {
1177
+ if (req.status.toLowerCase() === 'approved') {
1178
+ this.leaves.sort((a, b) => a.compareTo(b));
1179
+ let count = 0;
1180
+ let startpos = -1;
1181
+ this.leaves.forEach((lv, l) => {
1182
+ if (lv.requestid === id && lv.status.toLowerCase() !== 'actual') {
1183
+ if (startpos < 0) {
1184
+ startpos = l;
1185
+ count++;
1186
+ }
1187
+ else {
1188
+ count++;
1189
+ }
1190
+ }
1191
+ });
1192
+ if (startpos >= 0) {
1193
+ this.leaves.splice(startpos, count);
1194
+ }
1195
+ }
1196
+ req.status = 'DRAFT';
1197
+ req.approvalDate = new Date(0);
1198
+ req.approvedby = '';
1199
+ answer.message = `Leave Request: ${this.name.getFirstLast()} leave request `
1200
+ + `(${req.startdate.toLocaleDateString('en-US')}-`
1201
+ + `${req.enddate.toLocaleDateString('en-US')}) ending date was changed to `
1202
+ + `after original date. This converted the leave request back to draft `
1203
+ + `for resubmittal.`;
1204
+ }
1205
+ else {
1206
+ if (req.status.toLowerCase() === 'approved') {
1207
+ this.leaves.sort((a, b) => a.compareTo(b));
1208
+ let count = 0;
1209
+ let startpos = -1;
1210
+ this.leaves.forEach((lv, l) => {
1211
+ if (lv.requestid === id && lv.status.toLowerCase() !== 'actual'
1212
+ && lv.leavedate.getTime() > date.getTime()) {
1213
+ if (startpos < 0) {
1214
+ startpos = l;
1215
+ count++;
1216
+ }
1217
+ else {
1218
+ count++;
1219
+ }
1220
+ }
1221
+ });
1222
+ if (startpos >= 0 && count > 0) {
1223
+ this.leaves.splice(startpos, count);
1224
+ }
1225
+ answer.message = `Leave Request: ${this.name.getFirstLast()} leave request `
1226
+ + `(${req.startdate.toLocaleDateString('en-US')}-`
1227
+ + `${req.enddate.toLocaleDateString('en-US')}) start date was changed `
1228
+ + `within the original dates. Approved leave dates were updated in the`
1229
+ + 'database as approved';
1230
+ }
1231
+ }
1232
+ req.enddate = new Date(date);
1233
+ req.setLeaveDays(this);
1234
+ req.comments.push(new leaverequest_1.LeaveRequestComment({
1235
+ commentdate: new Date(),
1236
+ comment: `End date for request was changed to ${date.toDateString()}`
1237
+ }));
1238
+ req.comments.sort((a, b) => a.compareTo(b));
1239
+ break;
1240
+ case 'dates':
1241
+ const values = value.split('|');
1242
+ let newstart = new Date(Date.parse(values[0]));
1243
+ newstart = new Date(Date.UTC(newstart.getFullYear(), newstart.getMonth(), newstart.getDate()));
1244
+ let newend = new Date(Date.parse(values[1]));
1245
+ newend = new Date(Date.UTC(newend.getFullYear(), newend.getMonth(), newend.getDate()));
1246
+ if (newstart.getTime() < req.startdate.getTime()
1247
+ || newstart.getTime() > req.enddate.getTime()
1248
+ || newend.getTime() < req.startdate.getTime()
1249
+ || newend.getTime() > req.enddate.getTime()) {
1250
+ if (req.status.toLowerCase() === 'approved') {
1251
+ this.leaves.sort((a, b) => a.compareTo(b));
1252
+ let count = 0;
1253
+ let startpos = -1;
1254
+ this.leaves.forEach((lv, l) => {
1255
+ if (lv.requestid === id && lv.status.toLowerCase() !== 'actual') {
1256
+ if (startpos < 0) {
1257
+ startpos = l;
1258
+ count++;
1259
+ }
1260
+ else {
1261
+ count++;
1262
+ }
1263
+ }
1264
+ });
1265
+ if (startpos >= 0) {
1266
+ this.leaves.splice(startpos, count);
1267
+ }
1268
+ }
1269
+ req.status = 'DRAFT';
1270
+ req.approvalDate = new Date(0);
1271
+ req.approvedby = '';
1272
+ answer.message = `Leave Request: ${this.name.getFirstLast()} leave request `
1273
+ + `(${req.startdate.toLocaleDateString('en-US')}-`
1274
+ + `${req.enddate.toLocaleDateString('en-US')}) start date was changed to `
1275
+ + `outside the original dates. This converted the leave request back to draft `
1276
+ + `for resubmittal.`;
1277
+ }
1278
+ else {
1279
+ if (req.status.toLowerCase() === 'approved') {
1280
+ this.leaves.sort((a, b) => a.compareTo(b));
1281
+ let startcount = 0;
1282
+ let startpos = -1;
1283
+ let endcount = 0;
1284
+ let endpos = -1;
1285
+ this.leaves.forEach((lv, l) => {
1286
+ if (lv.requestid === id && lv.status.toLowerCase() !== 'actual'
1287
+ && lv.leavedate.getTime() < newstart.getTime()) {
1288
+ if (startpos < 0) {
1289
+ startpos = l;
1290
+ startcount++;
1291
+ }
1292
+ else {
1293
+ startcount++;
1294
+ }
1295
+ }
1296
+ else if (lv.requestid === id && lv.status.toLowerCase() !== 'actual'
1297
+ && lv.leavedate.getTime() > newend.getTime()) {
1298
+ if (endpos < 0) {
1299
+ endpos = l;
1300
+ endcount++;
1301
+ }
1302
+ else {
1303
+ endcount++;
1304
+ }
1305
+ }
1306
+ });
1307
+ if (startpos >= 0 && endcount > 0) {
1308
+ this.leaves.splice(startpos, startcount);
1309
+ }
1310
+ if (endpos >= 0 && endcount > 0) {
1311
+ this.leaves.splice(endpos, endcount);
1312
+ }
1313
+ answer.message = `Leave Request: ${this.name.getFirstLast()} leave request `
1314
+ + `(${req.startdate.toLocaleDateString('en-US')}-`
1315
+ + `${req.enddate.toLocaleDateString('en-US')}) both dates were changed to `
1316
+ + `within the original dates. All approved leave dates were updated in `
1317
+ + 'the database.';
1318
+ }
1319
+ }
1320
+ req.startdate = new Date(newstart);
1321
+ req.enddate = new Date(newend);
1322
+ req.setLeaveDays(this);
1323
+ req.comments.push(new leaverequest_1.LeaveRequestComment({
1324
+ commentdate: new Date(),
1325
+ comment: `Request dates for request were changed to `
1326
+ + `${newstart.toDateString()} - ${newend.toDateString()}`
1327
+ }));
1328
+ req.comments.sort((a, b) => a.compareTo(b));
1329
+ break;
1330
+ case "code":
1331
+ case "primarycode":
1332
+ req.primarycode = value;
1333
+ req.setLeaveDays(this, true);
1334
+ req.comments.push(new leaverequest_1.LeaveRequestComment({
1335
+ commentdate: new Date(),
1336
+ comment: `Primary Code for request was changed to ${value}`
1337
+ }));
1338
+ req.comments.sort((a, b) => a.compareTo(b));
1339
+ break;
1340
+ case "requested":
1341
+ req.status = 'REQUESTED';
1342
+ req.requesteddays.forEach((lv, l) => {
1343
+ if (lv.code !== '') {
1344
+ lv.status = 'REQUESTED';
1345
+ req.requesteddays[l] = lv;
1346
+ }
1347
+ });
1348
+ req.comments.push(new leaverequest_1.LeaveRequestComment({
1349
+ commentdate: new Date(),
1350
+ comment: 'Leave request was submitted for approval.'
1351
+ }));
1352
+ req.comments.sort((a, b) => a.compareTo(b));
1353
+ answer.message = `Leave Request from ${this.name.getLastFirst()} `
1354
+ + `submitted for approval. Requested leave dates: `
1355
+ + `${req.startdate.toDateString()} - ${req.enddate.toDateString()}.`;
1356
+ break;
1357
+ case "unapprove":
1358
+ req.approvedby = '';
1359
+ req.approvalDate = new Date(0);
1360
+ req.status = 'DRAFT';
1361
+ req.requesteddays.forEach((lv, l) => {
1362
+ if (lv.code !== '') {
1363
+ lv.status = 'REQUESTED';
1364
+ req.requesteddays[l] = lv;
1365
+ }
1366
+ });
1367
+ req.comments.push(new leaverequest_1.LeaveRequestComment({
1368
+ commentdate: new Date(),
1369
+ comment: value
1370
+ }));
1371
+ req.comments.sort((a, b) => a.compareTo(b));
1372
+ answer.message = `Leave Request: ${this.name.getFirstLast()} leave request `
1373
+ + `(${req.startdate.toLocaleDateString('en-US')}-`
1374
+ + `${req.enddate.toLocaleDateString('en-US')}) was declined by approver.`;
1375
+ break;
1376
+ case 'day':
1377
+ case 'requestday':
1378
+ const bApproved = req.status.toLowerCase() === 'approved';
1379
+ let found = false;
1380
+ let max = 0;
1381
+ const svalues = value.split('|');
1382
+ let lvDate = new Date(Date.parse(svalues[0]));
1383
+ let code = svalues[1];
1384
+ let hours = Number(svalues[2]);
1385
+ let status = '';
1386
+ let workcenter = '';
1387
+ if (svalues.length > 3) {
1388
+ workcenter = svalues[3];
1389
+ }
1390
+ req.requesteddays.forEach((lv, l) => {
1391
+ if (lv.useLeave(lvDate)) {
1392
+ found = true;
1393
+ lv.code = code;
1394
+ if (status == '') {
1395
+ status = lv.status;
1396
+ }
1397
+ lv.status = workcenter;
1398
+ if (code == '') {
1399
+ lv.hours = 0.0;
1400
+ }
1401
+ else {
1402
+ lv.hours = hours;
1403
+ }
1404
+ req.requesteddays[l] = lv;
1405
+ }
1406
+ if (max < lv.id) {
1407
+ max = lv.id;
1408
+ }
1409
+ });
1410
+ if (!found) {
1411
+ const lv = new leave_1.Leave({
1412
+ id: max + 1,
1413
+ leavedate: new Date(lvDate),
1414
+ code: code,
1415
+ hours: hours,
1416
+ status: status,
1417
+ requestid: req.id,
1418
+ used: false
1419
+ });
1420
+ req.requesteddays.push(lv);
1421
+ req.requesteddays.sort((a, b) => a.compareTo(b));
1422
+ }
1423
+ if (bApproved) {
1424
+ found = false;
1425
+ this.leaves.forEach((lv, l) => {
1426
+ if (lv.useLeave(lvDate)) {
1427
+ found = true;
1428
+ lv.code = code;
1429
+ if (code === '') {
1430
+ lv.hours = 0.0;
1431
+ }
1432
+ else {
1433
+ lv.hours = hours;
1434
+ }
1435
+ this.leaves[l] = lv;
1436
+ }
1437
+ });
1438
+ if (!found && code !== '') {
1439
+ this.leaves.push(new leave_1.Leave({
1440
+ id: max + 1,
1441
+ leavedate: new Date(lvDate),
1442
+ code: code,
1443
+ hours: hours,
1444
+ status: req.status,
1445
+ requestid: req.id,
1446
+ used: false
1447
+ }));
1448
+ }
1449
+ }
1450
+ req.comments.push(new leaverequest_1.LeaveRequestComment({
1451
+ commentdate: new Date(),
1452
+ comment: `Requested Days Updated: ${lvDate.toDateString()} to Code: ${code}, `
1453
+ + `hours: ${hours}`
1454
+ }));
1455
+ case "comment":
1456
+ case "addcomment":
1457
+ req.comments.push(new leaverequest_1.LeaveRequestComment({
1458
+ commentdate: new Date(),
1459
+ comment: value
1460
+ }));
1461
+ req.comments.sort((a, b) => a.compareTo(b));
1462
+ break;
1463
+ }
1464
+ answer.leaverequest = req;
1465
+ }
1466
+ });
1467
+ return answer;
1468
+ }
1469
+ approveLeaveRequest(id, approver, leavecodes) {
1470
+ const answer = {
1471
+ message: '',
1472
+ leaverequest: undefined,
1473
+ error: undefined
1474
+ };
1475
+ this.requests.forEach((req, r) => {
1476
+ if (req.id === id) {
1477
+ req.approvalDate = new Date();
1478
+ req.approvedby = approver;
1479
+ req.status = 'Approved';
1480
+ let max = 0;
1481
+ this.removeLeaves(req.startdate, req.enddate, req.id, false);
1482
+ this.leaves.forEach(lv => {
1483
+ if (max < lv.id) {
1484
+ max = lv.id;
1485
+ }
1486
+ });
1487
+ if (req.primarycode.toLowerCase() !== 'mod') {
1488
+ req.requesteddays.forEach((day, d) => {
1489
+ if (day.code !== '') {
1490
+ max++;
1491
+ day.status = 'Approved';
1492
+ req.requesteddays[d] = day;
1493
+ this.leaves.push(new leave_1.Leave({
1494
+ id: max,
1495
+ leavedate: new Date(day.leavedate),
1496
+ code: day.code,
1497
+ hours: day.hours,
1498
+ status: day.status,
1499
+ requestid: req.id,
1500
+ used: false
1501
+ }));
1502
+ }
1503
+ });
1504
+ answer.message = `Leave Request was approved for period of `
1505
+ + `${req.startdate.toDateString()} - ${req.enddate.toDateString()}.`;
1506
+ answer.leaverequest = req;
1507
+ }
1508
+ else {
1509
+ let found = false;
1510
+ this.variations.forEach((vari, v) => {
1511
+ if (vari.startdate.getTime() === req.startdate.getTime()
1512
+ && vari.enddate.getTime() === req.enddate.getTime()
1513
+ && vari.mod) {
1514
+ found = true;
1515
+ let start = new Date(req.startdate);
1516
+ while (start.getDay() !== 0) {
1517
+ start = new Date(start.getTime() - (24 * 3600000));
1518
+ }
1519
+ vari.setScheduleDays();
1520
+ let lastcode = '';
1521
+ let workcenter = '';
1522
+ req.requesteddays.forEach(day => {
1523
+ let isLeave = false;
1524
+ leavecodes.forEach(wc => {
1525
+ if (wc.id.toLowerCase() === day.code.toLowerCase() && wc.isLeave) {
1526
+ isLeave = true;
1527
+ }
1528
+ });
1529
+ if (isLeave) {
1530
+ max++;
1531
+ this.leaves.push(new leave_1.Leave({
1532
+ id: max,
1533
+ leavedate: new Date(day.leavedate),
1534
+ code: day.code,
1535
+ hours: day.hours,
1536
+ status: 'APPROVED',
1537
+ requestid: req.id,
1538
+ used: false
1539
+ }));
1540
+ this.leaves.sort((a, b) => a.compareTo(b));
1541
+ }
1542
+ else {
1543
+ lastcode = day.code;
1544
+ workcenter = day.status;
1545
+ }
1546
+ const dos = Math.floor((day.leavedate.getTime() - start.getTime())
1547
+ / (24 * 3600000));
1548
+ vari.schedule.workdays[dos].code = lastcode;
1549
+ vari.schedule.workdays[dos].hours = day.hours;
1550
+ vari.schedule.workdays[dos].workcenter = workcenter;
1551
+ });
1552
+ }
1553
+ });
1554
+ if (!found) {
1555
+ let max = 0;
1556
+ this.variations.forEach(vari => {
1557
+ if (max < vari.id) {
1558
+ max = vari.id;
1559
+ }
1560
+ });
1561
+ const vari = new variation_1.Variation({
1562
+ id: max + 1,
1563
+ mids: false,
1564
+ mod: true,
1565
+ startdate: new Date(req.startdate),
1566
+ enddate: new Date(req.enddate),
1567
+ site: this.site,
1568
+ schedule: new workday_1.Schedule()
1569
+ });
1570
+ vari.setScheduleDays();
1571
+ vari.schedule.showdates = true;
1572
+ req.requesteddays.forEach(day => {
1573
+ vari.updateWorkdayByDate;
1574
+ });
1575
+ }
1576
+ }
1577
+ }
1578
+ });
1579
+ return answer;
1580
+ }
1581
+ deleteLeaveRequest(id) {
1582
+ let req = this.requests.find(r => r.id === id);
1583
+ if (req) {
1584
+ if (req.status.toLowerCase() === 'approved') {
1585
+ let pos = this.leaves.findIndex(l => l.requestid === id);
1586
+ while (pos >= 0) {
1587
+ this.leaves.splice(pos, 1);
1588
+ pos = this.leaves.findIndex(l => l.requestid === id);
1589
+ }
1590
+ if (req.primarycode.toLowerCase() === 'mod') {
1591
+ pos = this.variations.findIndex(v => (v.mod && v.startdate.getTime() === req.startdate.getTime()
1592
+ && v.enddate.getTime() === req.enddate.getTime()));
1593
+ if (pos >= 0) {
1594
+ this.variations.splice(pos, 1);
1595
+ }
1596
+ }
1597
+ }
1598
+ let pos = this.requests.findIndex(r => r.id === id);
1599
+ if (pos >= 0) {
1600
+ this.requests.splice(pos, 1);
1601
+ }
1602
+ }
1603
+ }
1604
+ addContactInfo(typeid, value, sortid) {
1605
+ let found = false;
1606
+ let next = -1;
1607
+ this.contactinfo.forEach((ci, c) => {
1608
+ if (ci.id > next)
1609
+ next = ci.id;
1610
+ if (ci.typeid === typeid) {
1611
+ found = true;
1612
+ ci.value = value;
1613
+ this.contactinfo[c] = ci;
1614
+ }
1615
+ });
1616
+ if (!found) {
1617
+ const contact = new contact_1.Contact({
1618
+ id: next + 1,
1619
+ typeid: typeid,
1620
+ value: value,
1621
+ sort: sortid
1622
+ });
1623
+ this.contactinfo.push(contact);
1624
+ this.contactinfo.sort((a, b) => a.compareTo(b));
1625
+ }
1626
+ }
1627
+ resortContactInfo(teamcontacts) {
1628
+ this.contactinfo.forEach((ci, c) => {
1629
+ const tc = teamcontacts.get(ci.typeid);
1630
+ ci.sort = (tc) ? tc : 0;
1631
+ this.contactinfo[c] = ci;
1632
+ });
1633
+ this.contactinfo.sort((a, b) => a.compareTo(b));
1634
+ }
1635
+ deleteContactInfoByType(type) {
1636
+ let found = -1;
1637
+ this.contactinfo.forEach((ci, c) => {
1638
+ if (ci.typeid === type) {
1639
+ found = c;
1640
+ }
1641
+ });
1642
+ if (found >= 0) {
1643
+ this.contactinfo.splice(found, 1);
1644
+ }
1645
+ }
1646
+ deleteContactInfo(id) {
1647
+ let found = -1;
1648
+ this.contactinfo.forEach((ci, c) => {
1649
+ if (ci.id === id) {
1650
+ found = c;
1651
+ }
1652
+ });
1653
+ if (found >= 0) {
1654
+ this.contactinfo.splice(found, 1);
1655
+ }
1656
+ }
1657
+ addSpecialty(specid, qualified, sort) {
1658
+ let found = false;
1659
+ let next = -1;
1660
+ this.specialties.forEach((spc, s) => {
1661
+ if (spc.id > next)
1662
+ next = spc.id;
1663
+ if (spc.specialtyid === specid) {
1664
+ found = true;
1665
+ spc.qualified = qualified;
1666
+ this.specialties[s] = spc;
1667
+ }
1668
+ });
1669
+ if (!found) {
1670
+ const spc = new specialty_1.Specialty({
1671
+ id: next + 1,
1672
+ specialtyid: specid,
1673
+ qualified: qualified,
1674
+ sort: sort
1675
+ });
1676
+ this.specialties.push(spc);
1677
+ this.specialties.sort((a, b) => a.compareTo(b));
1678
+ }
1679
+ }
1680
+ resortSpecialties(teamspecs) {
1681
+ this.specialties.forEach((spc, s) => {
1682
+ const ts = teamspecs.get(spc.specialtyid);
1683
+ spc.sort = (ts) ? ts : 0;
1684
+ this.specialties[s] = spc;
1685
+ });
1686
+ this.specialties.sort((a, b) => a.compareTo(b));
1687
+ }
1688
+ deleteSpecialty(id) {
1689
+ let found = -1;
1690
+ this.specialties.forEach((spc, s) => {
1691
+ if (spc.id === id) {
1692
+ found = s;
1693
+ }
1694
+ });
1695
+ if (found >= 0) {
1696
+ this.specialties.splice(found, 1);
1697
+ }
1698
+ this.specialties.sort((a, b) => a.compareTo(b));
1699
+ }
1700
+ deleteSpecialtyByType(type) {
1701
+ let found = -1;
1702
+ this.specialties.forEach((spc, s) => {
1703
+ if (spc.specialtyid === type) {
1704
+ found = s;
1705
+ }
1706
+ });
1707
+ if (found >= 0) {
1708
+ this.specialties.splice(found, 1);
1709
+ }
1710
+ this.specialties.sort((a, b) => a.compareTo(b));
1711
+ }
1712
+ hasSpecialty(spec) {
1713
+ let answer = false;
1714
+ this.specialties.forEach(spc => {
1715
+ if (spc.specialtyid === spec) {
1716
+ answer = true;
1717
+ }
1718
+ });
1719
+ return answer;
1720
+ }
1721
+ }
1722
+ exports.Employee = Employee;
1723
+ //# sourceMappingURL=employee.js.map