Skip to content

Instantly share code, notes, and snippets.

@richbeales
Created October 5, 2014 19:09
Show Gist options
  • Save richbeales/273430f30cbf758ef3b4 to your computer and use it in GitHub Desktop.
Save richbeales/273430f30cbf758ef3b4 to your computer and use it in GitHub Desktop.
Track working time from workstation lock and unlock events
__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