Skip to content

Commit 7b33c4d

Browse files
committed
Adding improved calculation of todays numbers.
1 parent 8b06854 commit 7b33c4d

3 files changed

Lines changed: 139 additions & 2 deletions

File tree

eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Services/TimePlanningPlanningService/TimePlanningPlanningService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,6 +1454,7 @@ public async Task<OperationResult> Update(int id, TimePlanningPlanningPrDayModel
14541454
planning.Start2Id = model.Start2Id ?? 0;
14551455
planning.Stop2Id = model.Stop2Id ?? 0;
14561456
planning.MessageId = model.Message;
1457+
planning.PaiedOutFlex = model.PaidOutFlex;
14571458

14581459
if (!assignedSite.UseOnlyPlanHours)
14591460
{

eform-client/src/app/plugins/modules/time-planning-pn/components/plannings/time-planning-actions/workday-entity/workday-entity-dialog.component.html

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
[value]="plannedStartOfShift1"
2626
>
2727
<ngx-material-timepicker #plannedPicker
28+
(closed)="calculatePlanHours()"
2829
[format]="24"
2930
[defaultTime]="plannedStartOfShift1"
3031
[minutesGap]="5"></ngx-material-timepicker>
@@ -43,6 +44,7 @@
4344
[value]="plannedBreakOfShift1"
4445
>
4546
<ngx-material-timepicker #plannedPause1Picker
47+
(closed)="calculatePlanHours()"
4648
[format]="24"
4749
[defaultTime]="plannedBreakOfShift1"
4850
[minutesGap]="5"></ngx-material-timepicker>
@@ -60,6 +62,7 @@
6062
[max]="plannedStartOfShift2 === '00:00' ? '23:55' : plannedStartOfShift2"
6163
[value]="plannedEndOfShift1">
6264
<ngx-material-timepicker #plannedPicker2
65+
(closed)="calculatePlanHours()"
6366
[format]="24"
6467
[defaultTime]="plannedEndOfShift1"
6568
[minutesGap]="5"></ngx-material-timepicker>
@@ -79,6 +82,7 @@
7982
[max]="plannedEndOfShift2 === '00:00' ? '23:55' : plannedEndOfShift2"
8083
[value]="plannedStartOfShift2">
8184
<ngx-material-timepicker #plannedPicker3
85+
(closed)="calculatePlanHours()"
8286
[format]="24"
8387
[defaultTime]="plannedStartOfShift2"
8488
[minutesGap]="5"></ngx-material-timepicker>
@@ -97,6 +101,7 @@
97101
[value]="plannedBreakOfShift2"
98102
>
99103
<ngx-material-timepicker #plannedPause2Picker
104+
(closed)="calculatePlanHours()"
100105
[format]="24"
101106
[defaultTime]="plannedBreakOfShift2"
102107
[minutesGap]="5"></ngx-material-timepicker>
@@ -114,6 +119,7 @@
114119
[min]="plannedStartOfShift2 === '00:00' ? plannedEndOfShift1 : plannedStartOfShift2"
115120
[value]="plannedEndOfShift2 === '00:00' ? '' : plannedEndOfShift2">
116121
<ngx-material-timepicker #plannedPicker4
122+
(closed)="calculatePlanHours()"
117123
[format]="24"
118124
[defaultTime]="plannedEndOfShift2 === '00:00' ? '' : plannedEndOfShift2"
119125
[minutesGap]="5"></ngx-material-timepicker>
@@ -137,6 +143,7 @@
137143
[value]="start1StartedAt"
138144
>
139145
<ngx-material-timepicker #picker
146+
(closed)="calculatePlanHours()"
140147
[format]="24"
141148
[defaultTime]="start1StartedAt"
142149
[minutesGap]="5"
@@ -156,6 +163,7 @@
156163
[value]="pause1Id"
157164
>
158165
<ngx-material-timepicker #pause1IdPicker
166+
(closed)="calculatePlanHours()"
159167
[format]="24"
160168
[defaultTime]="pause1Id"
161169
[minutesGap]="5"></ngx-material-timepicker>
@@ -174,6 +182,7 @@
174182
[max]="start2StartedAt"
175183
[value]="stop1StoppedAt">
176184
<ngx-material-timepicker #picker2
185+
(closed)="calculatePlanHours()"
177186
[format]="24"
178187
[defaultTime]="stop1StoppedAt"
179188
[minutesGap]="5"></ngx-material-timepicker>
@@ -193,6 +202,7 @@
193202
[max]="stop2StoppedAt"
194203
[value]="start2StartedAt">
195204
<ngx-material-timepicker #picker3
205+
(closed)="calculatePlanHours()"
196206
[format]="24"
197207
[defaultTime]="start2StartedAt"
198208
[minutesGap]="5"></ngx-material-timepicker>
@@ -211,6 +221,7 @@
211221
[value]="pause2Id"
212222
>
213223
<ngx-material-timepicker #pause2IdPicker
224+
(closed)="calculatePlanHours()"
214225
[format]="24"
215226
[defaultTime]="pause2Id"
216227
[minutesGap]="5"></ngx-material-timepicker>
@@ -228,6 +239,7 @@
228239
[min]="start2StartedAt"
229240
[value]="stop2StoppedAt">
230241
<ngx-material-timepicker #picker4
242+
(closed)="calculatePlanHours()"
231243
[format]="24"
232244
[defaultTime]="stop2StoppedAt"
233245
[minutesGap]="5"></ngx-material-timepicker>
@@ -236,18 +248,83 @@
236248
</ng-template>
237249

238250
<!-- <p><strong>{{ 'Plan text' | translate }}:</strong> {{ data.planText }}</p>-->
239-
<br>
240-
<mat-form-field class="pr-2">
251+
<!-- <br>-->
252+
<!-- <mat-form-field class="pr-2">-->
253+
<!-- <mat-label>{{ 'Flex balance at start of day' | translate }}</mat-label>-->
254+
<!-- <input-->
255+
<!-- type="text"-->
256+
<!-- matInput-->
257+
<!-- id="flexToDate"-->
258+
<!-- name="flexToDate"-->
259+
<!-- readonly="readonly"-->
260+
<!-- disabled-->
261+
<!-- [value]="convertHoursToTime(data.sumFlexStart)"-->
262+
<!-- >-->
263+
<!-- </mat-form-field>-->
264+
<br><mat-form-field class="pr-2">
241265
<mat-label>{{ 'Plan hours' | translate }}</mat-label>
242266
<input
243267
type="number"
244268
matInput
245269
id="planHours"
246270
name="planHours"
271+
[disabled]="isInTheFuture || data.message === null"
247272
[(ngModel)]="data.planHours"
248273
>
249274
</mat-form-field>
250275
<br>
276+
<mat-form-field class="pr-2">
277+
<mat-label>{{ 'NettoHours' | translate }}</mat-label>
278+
<input
279+
type="text"
280+
matInput
281+
id="nettoHours"
282+
name="nettoHours"
283+
readonly="readonly"
284+
disabled
285+
[value]="convertHoursToTime(data.actualHours)"
286+
>
287+
</mat-form-field>
288+
<br>
289+
<mat-form-field class="pr-2">
290+
<mat-label>{{ 'Flex' | translate }}</mat-label>
291+
<input
292+
type="text"
293+
matInput
294+
id="todaysFlex"
295+
name="todaysFlex"
296+
readonly="readonly"
297+
disabled
298+
[value]="convertHoursToTime(todaysFlex)"
299+
>
300+
</mat-form-field>
301+
<br>
302+
<mat-form-field class="pr-2">
303+
<mat-label>{{ 'PaidOutFlex' | translate }}</mat-label>
304+
<input
305+
type="number"
306+
matInput
307+
id="paidOutFlex"
308+
name="paidOutFlex"
309+
(change)="calculatePlanHours()"
310+
[(ngModel)]="data.paidOutFlex"
311+
>
312+
</mat-form-field>
313+
<br>
314+
<mat-form-field class="pr-2">
315+
<mat-label>{{ 'SumFlex' | translate }}</mat-label>
316+
<input
317+
type="text"
318+
matInput
319+
id="flexIncludingToday"
320+
name="flexIncludingToday"
321+
readonly="readonly"
322+
disabled
323+
[value]="convertHoursToTime(data.sumFlexEnd)"
324+
>
325+
</mat-form-field>
326+
<br>
327+
<br>
251328
<p *ngIf="data.workerComment"><strong>{{ 'CommentWorker' | translate }}:</strong> {{ data.workerComment }}</p>
252329
<ng-container *ngFor="let key of enumKeys">
253330
<ng-container *ngIf="key !== 'Blank' && key !== 'Care'">
@@ -257,6 +334,7 @@
257334
</ng-container>
258335
</ng-container>
259336
<br>
337+
<br>
260338
<mat-form-field class="pr-2">
261339
<mat-label>{{ 'CommentOffice' | translate }}</mat-label>
262340
<input

eform-client/src/app/plugins/modules/time-planning-pn/components/plannings/time-planning-actions/workday-entity/workday-entity-dialog.component.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ export class WorkdayEntityDialogComponent implements OnInit {
6868
isInTheFuture: boolean = false;
6969
maxPause1Id: number = 0;
7070
maxPause2Id: number = 0;
71+
todaysFlex: number = 0;
7172
date: any;
7273
@ViewChild('plannedColumnTemplate', { static: true }) plannedColumnTemplate!: TemplateRef<any>;
7374
@ViewChild('actualColumnTemplate', { static: true }) actualColumnTemplate!: TemplateRef<any>;
@@ -97,6 +98,7 @@ export class WorkdayEntityDialogComponent implements OnInit {
9798
this.stop2StoppedAt = this.datePipe.transform(this.data.stop2StoppedAt, 'HH:mm', 'UTC');
9899
this.pause2Id = this.convertMinutesToTime(this.data.pause2Id * 5);
99100
this.isInTheFuture = Date.parse(this.data.date) > Date.now();
101+
this.todaysFlex = this.data.actualHours - this.data.planHours;
100102
this.date = Date.parse(this.data.date);
101103
//this.tableHeaders = [];
102104

@@ -188,6 +190,7 @@ export class WorkdayEntityDialogComponent implements OnInit {
188190
this.data.plannedStartOfShift2 = this.convertTimeToMinutes(this.plannedStartOfShift2);
189191
this.data.plannedEndOfShift2 = this.convertTimeToMinutes(this.plannedEndOfShift2);
190192
this.data.plannedBreakOfShift2 = this.convertTimeToMinutes(this.plannedBreakOfShift2);
193+
debugger;
191194
this.data.start1Id = this.convertTimeToMinutes(this.start1StartedAt, true);
192195
this.data.pause1Id = this.convertTimeToMinutes(this.pause1Id, true);
193196
this.data.start2Id = this.convertTimeToMinutes(this.start2StartedAt, true);
@@ -242,10 +245,65 @@ export class WorkdayEntityDialogComponent implements OnInit {
242245
return hours * 60 + minutes;
243246
}
244247

248+
convertHoursToTime(hours: number): string {
249+
const isNegative = hours < 0;
250+
if (hours < 0) {
251+
hours = Math.abs(hours);
252+
}
253+
const totalMinutes = Math.floor(hours * 60)
254+
const hrs = Math.floor(totalMinutes / 60);
255+
let mins = totalMinutes % 60;
256+
if (isNegative) {
257+
// return '${padZero(hrs)}:${padZero(60 - mins)}';
258+
return `-${hrs}:${this.padZero(mins)}`;
259+
}
260+
return `${this.padZero(hrs)}:${this.padZero(mins)}`;
261+
}
262+
245263
onCancel() {
246264
this.data.message = this.originalData.message;
247265
this.enumKeys.forEach(key => {
248266
this.data[key] = this.originalData[key];
249267
});
250268
}
269+
270+
calculatePlanHours() {
271+
this.data.plannedStartOfShift1 = this.convertTimeToMinutes(this.plannedStartOfShift1);
272+
this.data.plannedEndOfShift1 = this.convertTimeToMinutes(this.plannedEndOfShift1);
273+
this.data.plannedBreakOfShift1 = this.convertTimeToMinutes(this.plannedBreakOfShift1);
274+
this.data.plannedStartOfShift2 = this.convertTimeToMinutes(this.plannedStartOfShift2);
275+
this.data.plannedEndOfShift2 = this.convertTimeToMinutes(this.plannedEndOfShift2);
276+
this.data.plannedBreakOfShift2 = this.convertTimeToMinutes(this.plannedBreakOfShift2);
277+
let plannedTimeInMinutes = this.data.plannedEndOfShift1 - this.data.plannedStartOfShift1 - this.data.plannedBreakOfShift1;
278+
if (this.data.plannedEndOfShift2 !== 0) {
279+
let timeInMinutes2NdShift = this.data.plannedEndOfShift2 - this.data.plannedStartOfShift2 - this.data.plannedBreakOfShift2;
280+
plannedTimeInMinutes += timeInMinutes2NdShift;
281+
}
282+
const plannedHours = Math.floor(plannedTimeInMinutes);
283+
const plannedMinutes = Math.round((plannedTimeInMinutes - plannedHours) * 60);
284+
this.data.planHours = plannedTimeInMinutes / 60;
285+
286+
this.data.start1Id = this.convertTimeToMinutes(this.start1StartedAt, true);
287+
this.data.pause1Id = this.convertTimeToMinutes(this.pause1Id, true);
288+
this.data.start2Id = this.convertTimeToMinutes(this.start2StartedAt, true);
289+
this.data.stop1Id = this.convertTimeToMinutes(this.stop1StoppedAt, true);
290+
this.data.pause2Id = this.convertTimeToMinutes(this.pause2Id, true);
291+
this.data.stop2Id = this.convertTimeToMinutes(this.stop2StoppedAt, true);
292+
293+
let actualTimeInMinutes = this.data.stop1Id - this.data.pause1Id - this.data.start1Id;
294+
if (this.data.stop2Id !== 0) {
295+
let timeInMinutes2NdShift = this.data.stop2Id - this.data.pause2Id - this.data.start2Id;
296+
actualTimeInMinutes += timeInMinutes2NdShift;
297+
}
298+
if (actualTimeInMinutes !== 0) {
299+
actualTimeInMinutes *= 5;
300+
}
301+
const actualHours = Math.floor(actualTimeInMinutes);
302+
const actualMinutes = Math.round((actualTimeInMinutes - actualHours) * 60);
303+
this.data.actualHours = actualTimeInMinutes / 60;
304+
305+
debugger;
306+
this.todaysFlex = this.data.actualHours - this.data.planHours;
307+
this.data.sumFlexEnd = this.data.sumFlexStart + this.data.actualHours - this.data.planHours - this.data.paidOutFlex;
308+
}
251309
}

0 commit comments

Comments
 (0)