Skip to content
Snippets Groups Projects
Commit 2f6be302 authored by Daniele Nicolodi's avatar Daniele Nicolodi
Browse files

timetracking: New entry code and handling of home-office days

parent bd4c1f88
Branches
No related tags found
No related merge requests found
...@@ -68,15 +68,17 @@ class Client: ...@@ -68,15 +68,17 @@ class Client:
def eq(r): def eq(r):
return lambda x: x == r return lambda x: x == r
# Fields without parser are skipped.
fields = [ fields = [
('updated', match('\d{2}\.\d{2}\.\d{4}\s+\d{2}:\d{2}'), lambda k, v: datetime.strptime(k, '%d.%m.%Y %H:%M')), ('updated', match('\d{2}\.\d{2}\.\d{4}\s+\d{2}:\d{2}'), lambda k, v: datetime.strptime(k, '%d.%m.%Y %H:%M')),
('status', eq('Status'), lambda k, v: Status(v)), ('status', eq('Status'), lambda k, v: Status(v)),
('last', eq('letzte Buchung'), lambda k, v: datetime.strptime(v, '%d.%m.%y %H:%M')), ('last', eq('letzte Buchung'), lambda k, v: datetime.strptime(v, '%d.%m.%y %H:%M')),
('count', eq('Arbeitszeit (1)'), lambda k, v: Duration.parse(v)), ('count', eq('Arbeitszeit (1)'), lambda k, v: Duration.parse(v)),
('balance', eq('SALDO akt.'), lambda k, v: Duration.parse(v)), ('balance', eq('SALDO akt.'), lambda k, v: Duration.parse(v)),
('', eq('Resturlaub Vorjahr'), None), ('vacation days prev year', eq('Resturlaub Vorjahr'), None),
('', eq('Urlaub lfd.-Jahr'), None), ('vacation days curr year', eq('Urlaub lfd.-Jahr'), None),
('', eq('Urlaub gesamt'), None), ('vacation days', eq('Urlaub gesamt'), None),
('home office days', eq('Home Office Guthaben'), None),
] ]
data = {} data = {}
...@@ -211,6 +213,7 @@ class Code(enum.Enum): ...@@ -211,6 +213,7 @@ class Code(enum.Enum):
NONE = '', ' ' NONE = '', ' '
SICK_W_CERT = 'KrA', 'S' SICK_W_CERT = 'KrA', 'S'
SICK_WO_CERT = 'KrO', 'S' SICK_WO_CERT = 'KrO', 'S'
SICK_HOURS = 'KrU', 'S'
VACATION = 'U', 'V' VACATION = 'U', 'V'
TIME_COMPENSATION = 'ZaG', 'C' TIME_COMPENSATION = 'ZaG', 'C'
MOBILE = 'Mob', 'M' MOBILE = 'Mob', 'M'
...@@ -219,6 +222,7 @@ class Code(enum.Enum): ...@@ -219,6 +222,7 @@ class Code(enum.Enum):
COVID19_SUSPECT = 'VER', 'Q' COVID19_SUSPECT = 'VER', 'Q'
COVID19_QUARANTINE = 'QUA', 'Q' COVID19_QUARANTINE = 'QUA', 'Q'
BUSYNESS_TRAVEL = 'DR', 'T' BUSYNESS_TRAVEL = 'DR', 'T'
MISSING_BOOKING = '!', '!'
def __new__(cls, value, string): def __new__(cls, value, string):
obj = object.__new__(cls) obj = object.__new__(cls)
...@@ -306,6 +310,9 @@ class Timesheet: ...@@ -306,6 +310,9 @@ class Timesheet:
if re.match(r'.*Korrektur: Fehlzeit', line): if re.match(r'.*Korrektur: Fehlzeit', line):
# correction # correction
continue continue
if re.match(r'.*21:Home Office\s+Absolut\s+', line):
# home office days credit adjustment
continue
if re.match(r'.*100:Urlaub\s+Absolut\s+\+0,00', line): if re.match(r'.*100:Urlaub\s+Absolut\s+\+0,00', line):
# ignore corrected zero amount # ignore corrected zero amount
continue continue
...@@ -327,6 +334,13 @@ class Timesheet: ...@@ -327,6 +334,13 @@ class Timesheet:
setattr(self.days[date], key, Duration.parse(m.group(key))) setattr(self.days[date], key, Duration.parse(m.group(key)))
if m.group('code'): if m.group('code'):
self.days[date].code = Code(m.group('code')) self.days[date].code = Code(m.group('code'))
note = m.group('notes').strip()
if note == 'Buchung nicht erfolgt':
if self.days[date].code != Code.NONE:
raise ValueError(line)
if m.group('entry'):
raise ValueError(line)
self.days[date].code = Code.MISSING_BOOKING
continue continue
raise ValueError(line) raise ValueError(line)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment