From 26111f4697de910663cfaab1a8891a0922aee3ec Mon Sep 17 00:00:00 2001 From: Dobie Wollert Date: Wed, 30 Dec 2015 04:41:59 -0800 Subject: [PATCH] Added exceptions --- app/controllers/timeclock.js | 78 +++++++++++++++++++++++++++++++++ app/model/timeClockException.js | 5 ++- 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/app/controllers/timeclock.js b/app/controllers/timeclock.js index 08a422f..546f65c 100644 --- a/app/controllers/timeclock.js +++ b/app/controllers/timeclock.js @@ -82,6 +82,23 @@ function findUserSpans(user, day) { .exec(); } +function findUserSpansForWeek(user, day) { + var startOfDay = day.clone().startOf('week').toDate(); + var endOfDay = day.clone().endOf('week').toDate(); + + var query = { + start: { + '$gte': startOfDay, + '$lte': endOfDay + }, + user: user + }; + + return TimeClockSpan + .find(query) + .exec(); +} + function findUserWorkorders(user, day) { var startOfDay = day.clone().startOf('day').toDate(); var endOfDay = day.clone().endOf('day').toDate(); @@ -414,6 +431,64 @@ function handleClockInExceptions(user, workorder, spans, now) { } } +function handleClockOutExceptions(currentSpan, user, spans, now) { + if (currentSpan.type !== 'workday') { + return; + } + + var dayOfWeek = now.day(); + if (dayOfWeek != 3 && dayOfWeek != 4) { + return; + } + + var workdaySpans = filterSpans(spans, {type: 'workday'}); + + var secondsWorked = 0; + workdaySpans.forEach(span => secondsWorked += span.status === 'closed' ? span.duration : 0); + secondsWorked += currentSpan.duration; + + console.log("Seconds Worked: " + secondsWorked); + + if (dayOfWeek == 3 && secondsWorked < 20 * 60 * 60) { + new TimeClockException({ + user: user._id, + date: new Date(), + reason: 'less_than_twenty_hours_worked' + }).save(); + + reportException({ + user: user, + reason: 'Less than 20 hours worked by end of day Wednesday.' + }); + } + + if (dayOfWeek == 4 && secondsWorked < 30 * 60 * 60) { + new TimeClockException({ + user: user._id, + date: new Date(), + reason: 'less_than_thirty_hours_worked' + }).save(); + + reportException({ + user: user, + reason: 'Less than 30 hours worked by end of day Thursday.' + }); + } + + if (dayOfWeek == 4 && secondsWorked > 40 * 60 * 60) { + new TimeClockException({ + user: user._id, + date: new Date(), + reason: 'greater_than_forty_hours_worked' + }).save(); + + reportException({ + user: user, + reason: 'Greater than 40 hours worked by end of day Thursday.' + }); + } +} + function reportException(exception) { const message = { @@ -480,6 +555,9 @@ function handleClockOutRequest(params, user, spans, workorders, now) { span.duration = moment(span.end).diff(span.start, 'seconds'); span.notes = params.notes; + findUserSpansForWeek(user, now) + .then(weeklySpans => handleClockOutExceptions(span, user, weeklySpans, now)); + return span.save().then(spanToResponse); } diff --git a/app/model/timeClockException.js b/app/model/timeClockException.js index 914ac9e..6904b71 100644 --- a/app/model/timeClockException.js +++ b/app/model/timeClockException.js @@ -7,7 +7,10 @@ var ObjectId = Schema.ObjectId; const EXCEPTION_REASONS = [ 'late_to_first_workorder', 'too_little_travel', - 'too_much_travel' + 'too_much_travel', + 'less_than_twenty_hours_worked', + 'less_than_thirty_hours_worked', + 'greater_than_forty_hours_worked' ]; var schema = new Schema({