Tägliche Arbeitszeit und Pausen mit Berücksichtigung des ArbZG

Du hast eine Idee für ein Projekt?
Antworten
Andy_71
User
Beiträge: 4
Registriert: Freitag 6. Mai 2022, 20:25

Hallo allerseits,

für mich privat würde ich gern ein kleines Script schreiben, welches die Stunden unseres Zeiterfassungssystems nochmal gegenprüft und ggfs. eine Meldung ausspuckt wenn etwas nicht stimmt.
Wichtig ist dabei, dass die Arbeitszeiten entsprechend des Arbeitszeitgesetzes berücksichtigt werden.
Im groben und ganzen habe ich eigentlich fast alles fertig dazu. Aber ich sitze seit Tagen daran, die korrekten Zeiten für das Arbeitszeit-Netto zu berechnen.

Als Vergleich dient mir dieser kleine Online-Rechner: https://www.finanz-tools.de/arbeitszeit ... enregelung
Dieser ermittelt die Zeiten genau so wie ich sie brauche. Auch eine an sich tolle Erläuterung ist dabei. Dennoch sehe ich wohl gerade den Wald vor lauter Bäumen nicht mehr.

Daten übermittele ich über eine Liste von Dicts. Wobei die Dicts die Kommen/Gehen-Buchungen enthalten. Im nachfolgenden Beispiel komme ich also um 06:37 zur Arbeit und gehe um 14:19 in die Pause. Später komme ich nochmal um 16:45 um dann um 17:44 letztlich Feierabend zu machen.

Code: Alles auswählen

berechne([{
	"Kommen": "06:37",
	"Gehen":  "14:19"
	},{
	"Kommen": "16:45",
	"Gehen":  "17:44"
}], expected_result="08:11")
Es fehlt hier im Prinzip eigentlich nur die korrekte Funktion "berechne()". Zusätzlich übergebe ich hier auch das erwartete Ergebnis der Netto-Arbeitszeit. Dies war aber nur um direkt zu vergleichen und ggfs. zu stoppen.

Als Ergebnis würde ich gern folgende Werte rausbekommen. Wenn's aber letztlich nur das Arbeitszeit-Netto korrekt ausgeben würde, wäre mir schon sehr geholfen.

Code: Alles auswählen

Arbeitszeit (brutto): 11:07 (667m)
genommene Pause     : 02:26 (146m)
zus. gesetzl. Pause : 00:30 (30m)
Arbeitszeit (netto) : 08:11 (491m)

Erwartete Arbeitszeit (netto): 08:11 (491m)
Ich hoffe hier kann mir jemand weiterhelfen und den Wald etwas lichten. Besten Dank schon mal an alle die sich bis hier hin meinen Text gelesen haben :)

Grüße
Andy
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du schon versucht? Wo kommst Du konkret nicht weiter? Zeige Deinen Code, das Ergebnis, Fehlermeldungen?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

@Andy_71: Also im Prinzip fehlt dir damit... alles.
Die Berechnung von Arbeitszeiten ist nicht ganz ohne. Der hier gezeigte Fall ist ja noch recht übersichtlich, aber die Konstellationen können auch deutlich komplizierter sein. Und gerade die Fälle zu berücksichtigen - das ist eben die Herausforderung. Wir reden hier ja nicht davon, einfach Zeiten voneinander abzuziehen, sondern zu erkennen, ob gesetziche Pausen eingehalten wurden, etc.
Andy_71
User
Beiträge: 4
Registriert: Freitag 6. Mai 2022, 20:25

Sirius3 hat geschrieben: Samstag 7. Mai 2022, 09:38 Was hast Du schon versucht? Wo kommst Du konkret nicht weiter? Zeige Deinen Code, das Ergebnis, Fehlermeldungen?
Ich habe tatsächlich bewusst keinen direkten Code hier geliefert weil ich eben schon so viele unterschiedliche Ansätze versucht habe.
Es gibt auch keine Fehlermeldungen die ich hier präsentieren könnte.
sparrow hat geschrieben: Samstag 7. Mai 2022, 12:08 @Andy_71: Also im Prinzip fehlt dir damit... alles.
Die Berechnung von Arbeitszeiten ist nicht ganz ohne. Der hier gezeigte Fall ist ja noch recht übersichtlich, aber die Konstellationen können auch deutlich komplizierter sein. Und gerade die Fälle zu berücksichtigen - das ist eben die Herausforderung. Wir reden hier ja nicht davon, einfach Zeiten voneinander abzuziehen, sondern zu erkennen, ob gesetziche Pausen eingehalten wurden, etc.
Ich würde jetzt nicht sagen es fehlt mir alles, da viel Code drumherum existiert und funktioniert (Abfrage des Zeiterfassungssystems und import der Excel-Daten u.a.). Aber letztlich der Kern des Ganzen.
Aber Du bringst es letztlich auf den Punkt. Vom Prinzip her klingt es alles recht einfach und ist ja auch mit wenigen Sätzen im oben genannten Link gut beschrieben. Aber wie so oft steckt der Teufel im Detail.

Zwei Beispiele:

Code: Alles auswählen

Arbeitsbeginn: 08:00
1. Pause: 14:00 - 14:30
Arbeitsende: 16:00

Arbeitszeit (netto): 7 Stunden und 30 Minuten
eingegebene Pause: 30 Minuten
zusätzliche gesetzliche Pause: keine
Arbeitszeit (brutto): 8 Stunden

Code: Alles auswählen

Arbeitsbeginn: 08:00
1. Pause: 14:10 - 14:40
Arbeitsende: 16:00

Arbeitszeit (netto): 7 Stunden und 20 Minuten
eingegebene Pause: 30 Minuten
zusätzliche gesetzliche Pause: 10 Minuten
Arbeitszeit (brutto): 8 Stunden
Hier kann man schön sehen wie sich die Netto-Zeiten verändern obwohl die Pause gleich lang ist und Arbeitsanfang und -ende identisch sind. Und das nur weil die Pause zehn Minuten später begonnen wurde.
Das liegt daran, dass die Schicht vor der Pause eben > 6h ist und damit eine gesetzliche Zwangspause von bis 30 Minuten hinzukommt. Bis zu, weil die Zwangspause aus der Differenz der Schichtzeit und der 6h gebildet wird.

Im nachfolgenden Beispiel mal ein längerer Arbeitstag bei dem die 40 Minuten-Pause angerechnet wird aber zusätzlich weitere 5 Minuten Zwangspause hinzukommen, da bei der langen Arbeitszeit eben insgesamt 45 Minuten Pausen vom Gesetzgeber vorgesehen ist:

Code: Alles auswählen

Arbeitsbeginn: 08:00
1. Pause: 14:00 - 14:40
Arbeitsende: 18:00

Arbeitszeit (netto): 9 Stunden und 15 Minuten
eingegebene Pause: 40 Minuten
zusätzliche gesetzliche Pause: 5 Minuten
Arbeitszeit (brutto): 10 Stunden
Auch hier gilt wieder, verschiebt sich die erste Pause weiter als 6h nach Arbeitsbeginn nach hinten, dann wird wieder eine Zwangspause hinzukommen:

Code: Alles auswählen

Arbeitsbeginn: 08:00
1. Pause: 14:10 - 14:50
Arbeitsende: 18:00

Arbeitszeit (netto): 9 Stunden und 10 Minuten
eingegebene Pause: 40 Minuten
zusätzliche gesetzliche Pause: 10 Minuten
Arbeitszeit (brutto): 10 Stunden

Der Witz ist, ich kann das mittlerweile ziemlich gut im Kopf rechnen... aber ich habe jetzt so viele Ansätze via Code probiert, dass ich jetzt beim Coden den Wald vor lauter Bäumen nicht mehr sehe.
Ich weiß, dass klingt blöd, aber ich habe mich da völlig verrannt.
Daher suche ich hier bewusst eine Lösung die eben nicht auf eine meiner Ansätze beruht, sondern quasi "from the scratch".
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Und was ist, wenn jemand 6x5 Minuten Pause macht? Oder wenn er eine Stunde arbeitet, dann 1 Stunde Pause macht, dann 6 Stunden und 5 Minuten arbeitet?
Oder jemand macht in 7 Stunden 2 x 15 Minuten Pause?

Ich habe vor Jahren mal eine Zeiterfassung geschrieben und weiß daher, dass das sehr komplex ist.
Andy_71
User
Beiträge: 4
Registriert: Freitag 6. Mai 2022, 20:25

sparrow hat geschrieben: Samstag 7. Mai 2022, 14:09 Und was ist, wenn jemand 6x5 Minuten Pause macht? Oder wenn er eine Stunde arbeitet, dann 1 Stunde Pause macht, dann 6 Stunden und 5 Minuten arbeitet?
Oder jemand macht in 7 Stunden 2 x 15 Minuten Pause?

Ich habe vor Jahren mal eine Zeiterfassung geschrieben und weiß daher, dass das sehr komplex ist.
Der zweite Fall ist simpel. Da die genommene Pause noch vor 6h Arbeitszeit liegt (hier nach 1h), zählt die Pause als im Vorfeld genommen und wird somit an die nachfolgenden Zwangspausen angerechnet. Hier wäre bei 06:05 Arbeitszeit nach der genommenen Pause weitere 5 Minuten fällig. Da aber wie schon erwähnt bereits eine Stunde genommen wurde, bleibt davon nichts übrige. Netto-Arbeitszeit ist somit 07:05.

Der erste Fall ist sicherlich interessanter. Hier fehlt mir aber tatsächlich nicht nur die Erfahrung sondern auch der passende Online-Rechner mit dem man das gegenprüfen könnte :)
Hier käme es auch noch drauf an wann ist Arbeitsbeginn, wann werden die Pause genommen und wann ist Arbeitsende. Und ganz nebenbei könnte man auch noch das ArbZG zitieren in dem Pausen mindestens 15 Minuten lang sein sollten :wink:
Aber letztlich denke ich ist es genauso wie beim zweiten Fall. Die Pausen werden entsprechend angerechnet (je nachdem ob die Arbeitszeit davor <=6h ist).
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Andy_71 hat geschrieben: Samstag 7. Mai 2022, 14:00 Der Witz ist, ich kann das mittlerweile ziemlich gut im Kopf rechnen... aber ich habe jetzt so viele Ansätze via Code probiert, dass ich jetzt beim Coden den Wald vor lauter Bäumen nicht mehr sehe.
Ich weiß, dass klingt blöd, aber ich habe mich da völlig verrannt.
Daher suche ich hier bewusst eine Lösung die eben nicht auf eine meiner Ansätze beruht, sondern quasi "from the scratch".
Für Aufgabenstellungen, bei denen solche Regelwerke umzusetzen sind, bietet es sich meiner Meinung nach in besonderem Maße an, mit automatischen Tests zu arbeiten. Das muss kein ganz strenges TDD sein, aber da du ja schon viel ausprobiert hast, hilft es dir vielleicht, den Fokus jetzt zunächst auf die Formulierung von Tests und die dafür sinnvollen Interfaces zu legen, um ein paar Bäume aus deinem Wald zu entfernen.
Andy_71
User
Beiträge: 4
Registriert: Freitag 6. Mai 2022, 20:25

nezzcarth hat geschrieben: Samstag 7. Mai 2022, 14:33
Andy_71 hat geschrieben: Samstag 7. Mai 2022, 14:00 Der Witz ist, ich kann das mittlerweile ziemlich gut im Kopf rechnen... aber ich habe jetzt so viele Ansätze via Code probiert, dass ich jetzt beim Coden den Wald vor lauter Bäumen nicht mehr sehe.
Ich weiß, dass klingt blöd, aber ich habe mich da völlig verrannt.
Daher suche ich hier bewusst eine Lösung die eben nicht auf eine meiner Ansätze beruht, sondern quasi "from the scratch".
Für Aufgabenstellungen, bei denen solche Regelwerke umzusetzen sind, bietet es sich meiner Meinung nach in besonderem Maße an, mit automatischen Tests zu arbeiten. Das muss kein ganz strenges TDD sein, aber da du ja schon viel ausprobiert hast, hilft es dir vielleicht, den Fokus jetzt zunächst auf die Formulierung von Tests und die dafür sinnvollen Interfaces zu legen, um ein paar Bäume aus deinem Wald zu entfernen.
In die Richtung bewege ich mich gerade tatsächlich. Auch um erstmal Abstand vom eigentlichen Problem zu bekommen. :)
Antworten