Closed albig closed 11 months ago
@albig @hbrunn Ich fange zunächst einmal an mit einer Möglichkeit überhaupt "smooth" Pausenzeiten zu erfassen. Hier wäre die erste Spezifikation dafür. Im ersten Entwicklungsschritt kann vlt. die automatische Korrektur der Pausenzeiten (noch) außen vor bleiben. Ich denke allerdings, dass wir hierfür auch bereits einen Weg vorzeichnen können:
https://cloud.verdigado.com/index.php/s/FNqxN2oLyZo6sFH?dir=undefined&path=%2F&openfile=454092
@albig @hbrunn
Hier wäre das kurze Recording des POC von Holger, der es ermöglicht Pausenzeiten vorschlagen zu lassen (Einstellungen am Mitarbeiter) , Pausenzeiten manuell einzutragen (auch mehrere Intervalle), Pausenzeiten abzuändern (wenn ein Standard unterschritten wird):
https://drive.google.com/file/d/188nMr3l6pNfwggsbBcziTL1NgEPD4GZB/view
Technisch wird der Arbeitstag in zwei Zeilen aufgesplittet, wobei dann z.B. zum Ende eines Zeitintervalls aus dem Working Calendars (40 Stunden, Montag Vormittag 08:00 bis 12:00) in der ersten Zeile das Log-Out Date automatisch gesetzt wird. In der zweiten Zeile wird dann das Login-Date berechnet aus Log-Out Date vorheriger Eintrag in hr.attendance + erfasste oder ermittelte Pausenzeit.
Hierdurch ergibt sich dann die Arbeitszeit wie im odoo Standard: Summiere für einen Tag das Delta aus Sign-Out Time - Sign-In Time.
Momentan ist im POC die Standard Pausenzeit beim Mitarbeiter hinterlegt. Hier wäre auch eine Tabelle denkbar, z.B. in Staffelform: Standardpause ab 4 Stunden: 00:30 ab 08 Stunden: 00:45 u.s.w.
Es werden auch Aktivitäten erstellt: z.B. "Du hast zuwenig Pause erfasst. Bitte korrigiere Deine Pausenzeit" Dies wird momentan beim hr.employee als activity geführt. Verlinkt werden soll die Referenz zum konkreten hr.attendance Eintrag an diesem Tag, um die Korrektur zu vereinfachen.
Ich hatte den Stand der Implementierung von https://github.com/OCA/hr-attendance/pull/142 ausprobiert und bin mit dem Ansatz des Aufsplittens der Buchungen gar nicht glücklich. Klar, versteh ich das, dass das jetzt der billigste Weg ist.
Aber es ist nicht mehr nachvollziehbar, was der MA tatsächlich gebucht hat. Und das ist vermutlich in Zukunft auch notwendig, das nachweisen zu können.
Beispiel:
Der MA hat von 05:00 bis 07:30 Uhr gebucht und von 08:00 bis 14:52 Uhr. Die Pause von 11:00 Uhr bis 11:30 Uhr ist durch hr_attendance_break
, was man nicht sehen kann und kalkulatorisch auch falsch ist (dürfte nur 15 Minuten sein).
Ich denke wir müssen die Pausen separat buchen und auch unterscheiden, ob die Pausenzeiten vom MA eingetragen wurden oder technisch hinzugefügt wurden.
Ich habe jetzt in dem branch das Datenmodell für die Pausen gepushed, und in der Listview von attendances funktioniert das auch. Da könnt Ihr dann die Woche über mit spielen ob das unerwünschte Nebenwirkungen hat bei Überstundenberechnung etc, sollte eigentlich nicht.
Achtung: Im aktuellen Stand koexistiert das nicht gut mit hr_attendance_autoclose
, weil das ein eigenes Feld für die Arbeitszeit ausrechnet und das Originalfeld versteckt. Zum Testen daher am besten das Originalfeld mittels Debug-Modus wieder sichtbar machen. Auf weitere Berechnungen sollte das keine Auswirkungen haben, weil da immer das Originalfeld benutzt werden sollte.
Nächste Woche mache ich dann die UI fertig, und füge die Pausen noch in die Attendance Analysis ein?
Danke Dir @hbrunn.
Drei Dinge:
UncaughtClientError > TypeError
Uncaught Javascript Error > break_moment.hours is not a function
TypeError: break_moment.hours is not a function
at Class._rpc (http://localhost:8169/web/assets/133-8bc5ede/web.assets_backend.min.js:9951:296)
at Class.
2. Wann erfolgt jetzt die Pausenberechnung? Einen Cron-Job find ich nicht.
3. Ja, die Pausen in der Attendance Analyse wäre sehr sinnvoll.
hr_attendance_break
ist jetzt auch in der Demo-Instanz installiert. Selbes verhalten wie lokal.
UncaughtClientError > TypeError
Uncaught Javascript Error > break_moment.hours is not a function
TypeError: break_moment.hours is not a function
at Class._rpc (https://odoo.demo.os.verdigado.net/web/assets/debug/web.assets_backend.js:145831:47) (/hr_attendance_break/static/src/js/hr_attendance_break.js:63)
at Class.<anonymous> (https://odoo.demo.os.verdigado.net/web/assets/debug/web.assets_common.js:61669:38) (/web/static/src/legacy/js/core/class.js:134)
at Class._rpc (https://odoo.demo.os.verdigado.net/web/assets/debug/web.assets_backend.js:145894:21) (/hr_attendance_reason/static/src/js/my_attendances.esm.js:47)
at Class._rpc (https://odoo.demo.os.verdigado.net/web/assets/debug/web.assets_common.js:61659:38) (/web/static/src/legacy/js/core/class.js:124)
at Class.update_attendance (https://odoo.demo.os.verdigado.net/web/assets/debug/web.assets_backend.js:139816:14) (/hr_attendance/static/src/js/my_attendances.js:39)
at Class.update_attendance (https://odoo.demo.os.verdigado.net/web/assets/debug/web.assets_backend.js:145910:18) (/hr_attendance_reason/static/src/js/my_attendances.esm.js:63)
at Class.update_attendance (https://odoo.demo.os.verdigado.net/web/assets/debug/web.assets_common.js:61659:38) (/web/static/src/legacy/js/core/class.js:124)
at Class.<anonymous> (https://odoo.demo.os.verdigado.net/web/assets/debug/web.assets_backend.js:139791:18) (/hr_attendance/static/src/js/my_attendances.js:14)
at Class.<anonymous> (https://odoo.demo.os.verdigado.net/web/assets/debug/web.assets_common.js:2867:36) (/web/static/lib/underscore/underscore.js:900)
at Class.<anonymous> (https://odoo.demo.os.verdigado.net/web/assets/debug/web.assets_common.js:2089:29) (/web/static/lib/underscore/underscore.js:122)
Es gibt in der Ansicht kein Element mit id="break-hours"
, was offenbar die Ursache ist.
Wenn man über den Kiosk-Mode geht, dann funktioniert der Check-In. Den Kiosk-Mode nutzen wir aber nicht.
mit dem fixup-commit sollte es gehen. Aber wie geschrieben, das macht noch die alte in-der-Mitte-splitten-Logik, dieser UI-Teil kommt erst nachste Woche mit dem Pausen-Modell.
Ja, mit dem fixup-commit funktioniert der Check-In ohne Fehler. Dann warte ich mal das neue Pausen-Modell nächste Woche ab und teste dann weiter.
was machen wir jetzt eigentlich mit dem Konzept der Standard-Pause in dem neuen Setup? Wann fängt sie an, wann hört sie auf?
was machen wir jetzt eigentlich mit dem Konzept der Standard-Pause in dem neuen Setup? Wann fängt sie an, wann hört sie auf?
Wir brauchen die Standard-Pause nach aktuellem deutschen Recht. D.h. 30 Minuten nach 6 Stunden und 15 Minuten nach 9 Stunden. Das sollte durch den Cronjob geprüft und ggf. Pausen hinzugefügt werden. Die Pausen-Records sind ja dann einem Attendance-Record zugeordnet, richtig? Dann wäre die Pause eben nach 6 bzw. 9 Stunden.
Beispiel: Check-In 8:00 Uhr Check-Out: 18 Uhr Pause: 14:00-14:30 Uhr und 17:00-17:15 Uhr Anwesenheitszeit: 10 h Netto-Arbeitszeit: 9:15 h
Der User kann eine Standard-Pausenlänge vorgeben - das meinst Du vermutlich auch, oder? Da bin ich mir auch unschlüssig, was das für einen Nutzen hat.
Beispiel: Nutzer konfiguriert 30 Minuten Check-In: 8:00 Uhr Check-Out: 14:00 Uhr Pause: 13:30 - 14:00 Uhr (Pause am Ende, Standardpause) --> Anwesenheitszeit: 6 h --> eigentlich keine Pause notwendig --> Netto-Arbeitszeit: 5:30 h
ja genau, der zweite Teil. Lasse ich dann erstmal weg
ich pushe mal den Zwischenstand mit funktionierender UI fur Pause via Checkin/out widget - bin nicht wirklich glücklich mit dem Handling, vielleicht könnt Ihr da vor dem Meeting noch draufschauen?
Mir scheint die Chance sehr hoch dass Menschen statt der Kaffeetasse den Checkout-Button erwischen. Und die Zahnräder als wieder-an-die-Arbeit-Knopf finde ich auch nicht ideal. Meinungen/Vorschläge?
Ich arbeite jetzt am Pausen-Warn-Cronjob + Konfiguration dafür, danach das glue-Modul dass das mit _autoclose funktioniert.
Ich hab den Stand in der Demo-Instanz installiert.
Spontanes Feedback: Wenn ich in der Pause bin, sollte nur der Button für "Pause beenden" erscheinen. Dann wird es verständlicher.
Wenn man aus der Pause tatsächlich einen Check-Out machen möchte, müsste man zwei Mal klicken.
gerade noch zuwenig-Pausen-Flagging + Konfiguration geposted:
Erwartete Eingabe bei den Schwellen ist dann 9:00, 0:45 und 6:00, 0:30. Die Aktion auf die hier verlinkt wird kann ein beliebiger Typ sein, schauen wir uns am besten spater zusammen an
@albig @hbrunn Hier ist der Testfall für normale Pausen an einem Arbeitstag (konkret zwei Pausen, je eine An- und Abmeldung): https://cloud.verdigado.com/index.php/s/FNqxN2oLyZo6sFH?dir=undefined&openfile=457143
ich habe jetzt dann den neuen Code für hr_attendance_break gepushed. Es sollte dann automatisch auch hr_attendance_break_autoclose
installieren, um das sicher zu stellen habe ich dieses Modul dann im PR hier auch einfach zu den dependencies zugefügt.
Wenn das so für Euch gut ist, würde ich den PR im hr-attendance repo auf ready to review setzen.
Ich bin dabei das Feature auszuprobieren.
Die Warnung über fehlende Pausen durch den Cron-Job scheint zu funktionieren.
Seh ich das richtig, dass das aber nur eine Warnung ist und die fehlende Pause nicht automatisch eingetragen wird? Haben wir uns da missverstanden, fehlt da noch was oder funktioniert nur mein Use-Case nicht (bevor ich jetzt lange suche...).
Missverständnis, ich dachte Ihr wollt es erstmal bei der Warnung belassen. Gib einfach an was genau passieren soll, dann implementiere ich das als Standardverhalten.
Wenn der Cron feststellt, dass die Pausen nicht ausreichen, soll
1) soll ich die Pause in die Mitte der Anwesenheit setzen, oder ans Ende? Die Pause wird dann durch den User admin erstellt sein, ist das ausreichend zur Nachverfolgung oder soll ich ein Flag 'autogenerated' hinzufugen? 2) soll das dann besser eine Email sein statt einer Activity? Activities können (mit Bordmitteln) keinen record-spezifischen Text enthalten, in der Email kann ich dagegen beliebiges schreiben.
soeben die besprochenen Punkte gepushed. Achtung: Bei bestehenden DBs braucht das auch ein -i hr_attendance_break
weil ich ein paar noupdate-records verändert habe.
@hbrunn Ich habe den Stand von https://github.com/verdigado/odoo-customize/pull/18 und https://github.com/OCA/hr-attendance/pull/142 installiert.
Die Überstunden-Berechnung ist aber falsch:
Im Beispiel hat der MA von 10:00 bis 18:54 Uhr gearbeitet. Seine Soll-Arbeitszeit sind 8:00 Stunden. hr_attendance_break
hat korrekt eine Pause von 30 Minuten hinzugefügt. Manuell habe ich im Beispiel danach eine weitere Pause von 1 Stunde hinzugefügt. Ergibt netto eine Arbeitszeit von 07:24h. Es "fehlen" also 36 Minuten. Die "Überstunden" müssten -0:36 betragen.
In den Überstunden findet das aber keine Berücksichtigung. Es werden 0:54 errechnet und zum Stundensaldo hinzugefügt.
Im Bericht ist die Pausenzeit verdoppelt. Hier sind es plötzlich 3h Pause.
Der Bericht ist so schwierig auszuwerten. Ohne Soll-Arbeitszeit kann man mit den Werten in der Spalte nicht auf Plausibilität prüfen.
Wünschenswert wäre
Soll-Arbeitszeit - Worked Hours = Überstunden, dabei wären die Pause zur Information
oder
Soll-Arbeitszeit - Ist-Arbeitszeit - Pausen = Überstunden
1+2 das sind Bugs sie ich heute gelöst bekommen sollte 3 das ist nicht trivial zu implementieren, wird diese Woche sicher nichts
1+2 wäre super.
Könntest Du dann noch in verdigado_attendance
ein Beispiel machen, wie ich das hr_attendance_break.template_mandatory_break
richtig überschreibe, wäre das cool. Ich hatte mich daran gestern schon versucht, aber weiß nicht, ob das richtig war und sichergestellt ist, dass auch das angepasste Email-Template verwendet wird.
@albig wie gehen wir mit Pausen < 15min (bzw company.hr_attendance_break_min_break) um, werden die auch von den Überstunden abgezogen?
Tja, gute Frage @hbrunn.
Nach dem aktuellen Konzept, werden die kürzeren Pausen nicht bei worked hours abgezogen, weil nur Pausen mit der Mindest-Länge in die Gesamt-Pausen-Berechnung einfließen.
Mmh. Das ist formal korrekt. Wenn man das nicht will, kann man den Schwellwert auf 00:00 setzen, richtig?
Dann sollten wir weiterhin so verfahren. Bei den Überstunden müsste dann folgendes berechnet werden:
Soll-Arbeitszeit - Ist-Arbeitszeit - (Pausen >= Schwellwert) = Überstunden
Was das email-Template angeht: Das ist ein noupdate-Record, deshalb kannst Du das mit einem normalen Update nicht überschreiben. -i
oder Code der das noupdate-Flag auf False setzt würde funktionieren, aber Du willst ja auch nicht bei Updates immer das Template überschreiben, um nicht die Möglichkeit zu verbauen dass das nach Auslieferung angepasst wird, richtig? Für neue Installationen ist das egal, weil bei der Installation von neuen Modulen noupdate-Records doch überschrieben werden.
Bei bestehenden Installationen führt kein Weg um ein Migrationsscript, das das Template überschreibt und die Übersetzungen (achja, Übersetzungen bekommst Du gar nicht überschrieben, auch nicht mit -i. Dafür gibt es --i18n-overwrite
, das dann aber alle Übersetzungen des Moduls überschreibt) aktualisiert. Wenn Du Template + Übersetzung auf einen Branch pushst, kann ich nächste Woche ein entsprechendes Migrationsscript dazusetzen.
Zum Entwickeln/Testen kannst Du am Besten in Deiner dev-Datenbank im Debug-Modus das noupdate-Flag wegnehmen, und die Übersetzung aus ir_translation löschen (letzteres geht auch halbwegs komfortabel in Einstellungen/Übersetzungen/Übersetzte Begriffe).
In Deutschland ist nach Arbeitszeitgesetz eine Pause von 30 Minuten nach 6 Stunden einzuhalten. Nach 9 Stunden müssen es sogar 45 Minuten sein.
Es soll eine Option geben, dass diese Pause automatisch abgezogen werden, wenn ein MA keine oder zu wenig Pausen bucht.
Beispiel:
Bucht der MA sich zwischendurch aus, werden die Pause berücksichtigt, wenn sie mindestens 15 Minuten betragen.
Beispiel: