Created
October 5, 2014 19:09
-
-
Save richbeales/273430f30cbf758ef3b4 to your computer and use it in GitHub Desktop.
Track working time from workstation lock and unlock events
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
__author__ = 'richbeales' | |
from datetime import datetime, timedelta | |
import unittest | |
DATE_FORMAT = "%d/%m/%Y %H:%M:%S" | |
SHORT_FORMAT = "%d/%m/%Y" | |
class TimeParser(object): | |
def setup(self): | |
# 1 = unlock | |
# 0 = lock | |
self.times = [["01/10/2014 08:15:00", 1], | |
["01/10/2014 12:00:00", 0], | |
["01/10/2014 12:45:00", 1], | |
["01/10/2014 17:00:00", 0], | |
["02/10/2014 09:00:00", 1], | |
["02/10/2014 16:00:00", 0]] | |
def start_time(self, date_reqd): | |
for i, time in enumerate(self.times): | |
curTime = datetime.strptime(time[0], DATE_FORMAT) | |
if curTime.strftime(SHORT_FORMAT) == date_reqd: | |
return curTime | |
def end_time(self, date_reqd): | |
for i, time in enumerate(reversed(self.times)): | |
curTime = datetime.strptime(time[0], DATE_FORMAT) | |
if curTime.strftime(SHORT_FORMAT) == date_reqd: | |
return curTime | |
def get_overall_time(self, date_reqd): | |
start = self.start_time(date_reqd) | |
end = self.end_time(date_reqd) | |
return self.get_diff(end, start) | |
def get_overall_time_week(self, week_starting): | |
total = self.get_overall_time(week_starting) | |
next_day = week_starting | |
for i in range(1, 6): | |
next_day = datetime.strftime(datetime.strptime(next_day, SHORT_FORMAT) + timedelta(days=1), SHORT_FORMAT) | |
total += self.get_overall_time(next_day) | |
return total | |
def get_worked_time(self, date_reqd): | |
start = self.start_time(date_reqd) # must start with an unlock | |
end = self.end_time(date_reqd) # must end with a lock | |
minutes = 0 | |
if not start: | |
return minutes | |
counting = False | |
for i, time in enumerate(self.times): | |
curTime = datetime.strptime(time[0], DATE_FORMAT) | |
if curTime == start: | |
counting = True | |
if counting: | |
if time[1] == 0: | |
minutes += self.get_diff(time[0], self.times[i-1][0]) | |
if curTime == end: | |
counting = False | |
return minutes | |
def get_worked_time_week(self, week_starting): | |
total = self.get_worked_time(week_starting) | |
next_day = week_starting | |
for i in range(1, 6): | |
next_day = datetime.strftime(datetime.strptime(next_day, SHORT_FORMAT) + timedelta(days=1), SHORT_FORMAT) | |
total += self.get_worked_time(next_day) | |
return total | |
@staticmethod | |
def get_diff(time, prev_time): | |
if not time or not prev_time: | |
return 0 | |
if type(time) is datetime: | |
td = time - prev_time | |
else: | |
td = datetime.strptime(time, DATE_FORMAT) - datetime.strptime(prev_time, DATE_FORMAT) | |
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60 | |
return hours * 60 + minutes | |
class TimeParserTests(unittest.TestCase): | |
def setUp(self): | |
self.time = TimeParser() | |
self.time.setup() | |
def test_get_start_time(self): | |
self.assertEqual(self.time.start_time("01/10/2014"), datetime.strptime("01/10/2014 08:15:00", DATE_FORMAT)) | |
def test_get_end_time(self): | |
self.assertEqual(self.time.end_time("01/10/2014"), datetime.strptime("01/10/2014 17:00:00", DATE_FORMAT)) | |
def test_get_overall_time(self): | |
self.assertEqual(self.time.get_overall_time("01/10/2014"), (8*60)+45) | |
def test_get_worked_time(self): | |
self.assertEqual(self.time.get_worked_time("01/10/2014"), 225+255) | |
def test_get_worked_time2(self): | |
self.assertEqual(self.time.get_worked_time("02/10/2014"), 7*60) | |
def test_get_overall_time_week(self): | |
self.assertEqual(self.time.get_overall_time_week("01/10/2014"), (8*60)+45 + 7*60) | |
#@unittest.skip("") | |
def test_get_worked_time_week(self): | |
self.assertEqual(self.time.get_worked_time_week("01/10/2014"), 225+255 + 7*60) | |
if __name__ == '__main__': | |
unittest.main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment