Donnerstag, 5. Januar 2012

[Profil] Zeiterfassung mit Widget und Dateiexport

Nach längerer Pause komme ich nun endlich dazu mein neuestes Profil zu posten. Hierbei handelt es sich um ein Profil zur Arbeitszeiterfassung, zBsp für nach Arbeitszeit abgerechnete Außeneinsätze. Ziel dieses Widgets ist es die Arbeitseit über mehrere Tage mit wenig Aufwand zu protokollieren um die Arbeitszeit später ordentlich Abrechnen zu können. Dazu sollen natürlich auch die gemachten Pausen berücksichtigt werden.



Wie in dem Bild zu erkennen ist, besitzt das Widget 2 Buttons. Der linke Button startet und stoppt die Zeiterfassung. Mit dem rechten Button können die Pausen (es können natürlich mehrere Pausen eingelegt werden) gestartet und beendet werden. Wird die Zeiterfassung gestoppt, errechnet Tasker die gearbeiteten Stunden und zieht automatisch die Pausenzeit ab.
In eine Textdatei werden alle Information mit Datum hinterlegt damit die Zeiten auch nach mehreren Tagen bequem nachvollzogen werden können.

Als erstes muss mit der App Zoom das Widget erstellt werden, ich habe es Zeiterfassung genannt. Es werden folgende Elemente benötigt:

  • 1. Button: Name: Button_Start
    • Label: Start
    • Click Action: Tasker Task Zeit Ende
  • 2. Button: Name: Button_Pause
    • Label: Pause
    • Click Action: Tasker Task Zeit Pause
  • 1. Textfeld: Name: Start
  • 2. Textfeld: Name: Pause
    • Click Action. Tasker Task Zeit Pause Change
  • 3. Textfeld: Name: Ende
  • 4. Textfeld: Name: Zeit
    • Click Action: Tasker Task Zeit Summe
Die oben aufgeführten Textfelder sollen nur die Uhrzeiten bzw. Pausen- und Gesamtzeit beinhalten. Die Beschriftungen, als "Start:" "Ende:" etc. sollten mit weiteren Textfeldern erstellt werden.

Als nächstes müssen die Buttons für das Beenden der Pause und der Zeiterfassung analog zu den ersten beiden Buttons hinzugefügt werden. Als Name bietet sich "Button_Ende" und "Button_PauseEnde" die verknüpften Tasks sollten "Zeit Ende" & "Zeit Pause Ende" sein.

Die Buttons werden nun genau über den schon vorhandenen Buttons platziert, so dass diese vollständig verdeckt sind. Ist dies geschehen müssen diese 2 Buttons ausgeblendet werden. Dazu einfach den jeweiligen Button für ca. 2 Sekunden berühren, im sich öffnenden Popup dann auf "Invisible" klicken. Nun sollte der Button rot eingefärbt sein. Das fertige Widget könnte nun ungefähr so aussehen:


Wenn dem so ist, kann das Widget nun auf dem Homescreen hinzugefügt werden. Nun können wir mit Tasker auf die einzelnen Textfelder zugreifen und somit die Zeiten anzeigen.

In Tasker müssen wir nun noch die erforderlichen Tasks erstellen:

Task 1: Zeit Start

  1. Variable -> Variable Set
    • Name: %Start
    • To: %TIMES
  2. Zoom -> Element Text
    • Element: Zeiterfassung.w / Start
    • Text: %TIME Uhr
  3. Variable -> Variable Set
    • Name: %StartH
    • To: %TIME
  4. Zoom -> Element Text
    • Element: Zeiterfassung.w / Ende
    • Text: --
  5. Zoom -> Element Text
    • Element: Zeiterfassung.w / Pause
    • Text: --
  6. Zoom -> Element Text
    • Element: Zeiterfassung.w / Zeit
    • Text: --
  7. Zoom -> Element Visibility
    • Element: Zeiterfassung.w / Button_Stop
    • Set: Yes


Task 2: Zeit Pause:

  1. Variable -> Variable Set
    • Name: %PStart
    • To: %TIMES
  2. Zoom -> Element Visibility
    • Element: Zeiterfassung.w / Button_PauseEnde


Task 3: Zeit Pause Ende:

  1. Variable -> Variable Set
    • Name: %Pause
    • To: %TIMES - %PStart + %Pause*60
    • Do Maths: Yes
  2. Variable -> Variable Set
    • Name: %Pause
    • To: %Pause * 60
    • Do Maths: Yes
  3. Zoom -> Element Text
    • Element: Zeiterfassung.w / Pause
    • Text: %Pause min
  4. Zoom -> Element Visibility
    • Zeiterfassung.w / Button_PauseEnde
    • Set: No


Task 4: Zeit Ende:

  1. Zoom -> Element Text
    • Element: Zeiterfassung.w / Ende
    • Text: %TIME Uhr
  2. Variable -> Variable Set
    • Name: %Zeit
    • To: %TIMES - %Start - %Pause*60
    • Do Maths: yes
  3. Variable -> Variable Set
    • Name: %Zeit
    • To: %Zeit/60/60
    • DoMaths: Yes
  4. Zoom -> Element Text
    • Element: Zeiterfassung.w / Zeit
    • Text: %Zeit h
  5. File -> Write File
    • File: Zeiten.txt
    • Text: %DATE: %StartH - %TIME, Pause: %Pause min, Gesamt: %Zeit h
    • Append: Yes
  6. Variable -> Variable Set
    • Name: %Pause
    • To: 0
  7. Zoom -> Element Visibility
    • Zeiterfassung.w / Button_Stop
    • Set: No
Falls noch nicht geschehen, müssen die Tasks nun den Buttons in Zoom zugeordnet werden. Die Zeiterfassung kann nun beginnen. Bevor der Button Ende gedrückt wird muss auch die eventuell noch laufende Pause beendet werden, da ich einen solchen Fall nicht berücksichtigt habe.

Als kleines Schmankerl hier noch 2 Zusatztasks. Mit Task 5 lässt sich die gespeicherte Pausenzeit ändern, falls man mal vergessen hat den Button zu drücken. Task 6 zählt alle in Zeiten.txt gespeicherten Arbeitszeiten zusammen und gibt die Summe in einem Popup aus, praktisch wenn man zBsp wissen möchte, wie lange man die Woche schon gearbeitet hat.

Task 4: Zeit Pause Change

  1. Variable -> Variable Query:
    • Name: %Pause
    • Label: Pause in Minuten
    • Input Type: Numeric / Decimal
    • Default: %Pause
  2. Zoom -> Element Text
    • Element: Zeiterfassung.w / Pause
    • Text: %Pause min


Task 5: Zeit Summe

  1. Variable -> Variable Set
    • Name: %summe
    • To: 0
  2. File -> Read Line
    • File: Zeiten.txt
    • To Var: &line
  3. Task -> If %line !~ EOF
  4. Variable -> Variable Split
    • Name: %line
    • Splitter: Gesamt:
  5. Variable -> Variable Split
    • Name: %line2
    • Splitter: h
  6. Variable -> Variable Set
    • Name: %summe
    • To: %summe + %line21
    • Do Maths: Yes
  7. Task -> GoTo
    • Type: Action Number
    • Number: 2
  8. Task -> End If
  9. Alert -> Popup
    • Text: Gesamt: %summe h
So das wars schon. Viel Spaß :)

Falls Fragen auftauchen einfach einen Kommentar abgeben....

10 Kommentare:

  1. Vielen Dank erst einmal für die tolle Idee und das Skript. Hab ich doch schon eine ganze Weile verschiedene Möglichkeiten getestet und durchgespielt, wie ich am besten an eine gute Zeiterfassung komme, die auch nicht zu überladen und unübersichtlich ist.
    Ich hab Dein Skript gleich mal getestet und für mich etwas abgeändert, so dass nicht sekundengenau gerechnet wird, sondern minutengenau. Empfand ich als leichter formatier- und nachvollziehbar.
    Das Skript hab ich nur noch etwas erweitert, um einen Google-Kalendereintrag, funktioniert soweit auch alles wunderbar, aber jetzt hätte ich doch noch eine Frage: Gibt es mit Tasker auch irgendwie (Szenen, Zoom, etc.) noch die Möglichkeit beim Beenden einen Dialog einzublenden der bspw. nach der Titelzeile für den Kalender fragt? Da hab ich bisher zumindest noch nichts gefunden, außer in puren Szenenumgebungen, aber dafür alles um zu ändern war mir dann doch etwas zu arg.

    AntwortenLöschen
  2. ... Ging natürlich einfacher als ich gedacht habe. Einfach variable abfragen und gut :-)

    AntwortenLöschen
    Antworten
    1. Hi rainer,

      bekomme ich dein Skript mit der Möglichkeit für den Google Kalendereintrag?

      Danke! :)

      Löschen
  3. Hallo Daniel,

    ich entwickle gerade ein etwas andere variante der zeiterfassung, jedoch komme ich mit der Zeitumrechnung nicht weiter (denkblokade)

    wie kann ich aus einer vorgegebenen zeit mit Startzeit und Endzeit die Arbeitszeit ermitteln?

    zur erklärung:

    zuerst kommt eine Variablenabfrage in der ich die Startzeit angebe z.B.(07.05)
    wert wird in %Tstart abgelegt, gefolgt von einer weiteren Abfrage mit Endzeit z.B. (15.00) -> %Tende

    wenn ich nun %Tende von %Tstart subtrahiere dann erhalte ich einen Dezimalwert , was ja auch richtig ist.

    mit
    Name: %Tzeit_ges
    zu: %Tende-%Tstart
    Mathematisch: ja

    erhalte ich die Differenz (7.95) in neuer Variable

    und ab hier weiß ich nicht wirklich zurecht wie ich das in Stunden und Minuten umrechnen kann.

    Hast du eventuell einen Rat wie ich die Sache meistern kann?

    AntwortenLöschen
    Antworten
    1. Zieh von den Minuten in %Tzeit_ges einfach 0.4 ab, wenn sie >0 sind.
      Dazu %Tzeit_ges Splitten mit Trennzeichen "."

      Löschen
  4. Hallo Daniel,

    danke für deinen Tip.

    hab nun auch eine Lösung gefunden wie ich mir die Stunden und Minuten umrechnen kann, so dass auch alles einbezogen wurde.

    Hab für die Stunden und Minuten jeweils eine eigene Variable gesetzt und nach der Berechnung wieder zu einer neuen hinzugefügt.

    Ein paar If und Else Schleifen runden das ganze ab.

    Die Idee mit Var splitten ist garnicht mal so abwägig. Werde das mal mit einbinden und spare mir evtl einige Variablen.

    Dimi

    AntwortenLöschen
  5. Hi,
    Tolle Arbeit. Kannst du das irgendwie als apk exportieren und zum Download zur Verfügung stellen?

    Grüße
    Ampel_Mann

    AntwortenLöschen
  6. Moin,
    tolles Tutorials. Danke...
    Jetzt mit Android 6 haben ich das Problem das Zoom Widget sich nach dem Drücken auf Ende nicht wieder das Start-Button hervorkommt. Gibt es eine Möglichkeit das wieder zu einzustellen?

    Danke...

    AntwortenLöschen
  7. Interessant,
    habe mir auch schon einige Male überlegt, eine neues Programm für unsere Zeiterfassung zu entwickeln, aber eigentlich bin ich mit dem System von Gecosoft, das wir zur Zeit nutzen, sehr zufrieden. Werde mir aber dennoch dein Tutorial noch etwas näher zu Gemüte führen.

    Danke!

    AntwortenLöschen