Zeiterfassung - App-Dokumentation¶
Ueberblick¶
Diese Canvas App dient zur einfachen Zeiterfassung fuer einen angemeldeten Benutzer. Die App besteht aktuell aus genau einer Startseite (ZeiterfassungNeu) und zeigt den aktuellen Status, die laufende Sitzung sowie Tages- und Monatssummen an. Benutzer koennen sich ueber Kommen einstempeln und ueber Gehen ausstempeln.
Die App arbeitet mit einer Mischung aus:
App-weiten Hilfsfunktionen in
App.pa.yamllokalem UI-State in Variablen
zwischengespeicherten Collections fuer Tages- und Monatsdaten
direktem Schreiben und Lesen aus der Datenquelle
Time Tracking Entry
Dateien¶
Datei |
Zweck |
|---|---|
|
App-Startlogik, globale Variablen, Hilfsfunktionen, Startscreen |
|
Einziger Screen mit UI, Datenabruf, Ein- und Ausstempeln |
Startverhalten¶
Beim Start der App werden in App.OnStart mehrere Variablen initialisiert:
varCurrentUserEmail: E-Mail des aktuellen Benutzers in KleinbuchstabenvarSelectedDate: standardmaessig das heutige DatumvarIsAdminUser: Admin-FlagvarIsLoading: Sperrt UI waehrend laufender DatenoperationenvarCurrentOpenEntry: aktuell offener ZeiteintragvarLunchSelected/varDinnerSelected: Status der VerpflegungsoptionenvarCurrentDayMinutes,varCurrentMonthMinutes,varCurrentSessionMinutes: berechnete Kennzahlen
Zusaetzlich wird geprueft, ob der aktuelle Benutzer Mitglied einer festen Office-365-Gruppe ist. Ist das der Fall, wird varIsAdminUser auf true gesetzt.
Datenquellen und Konnektoren¶
Time Tracking Entry¶
Die fachliche Hauptdatenquelle ist Time Tracking Entry. Darin werden Zeiteintraege gelesen und geschrieben. Verwendete Felder sind unter anderem:
mitarbeiteraktivitaetsdatumaktivitaetsdatumzeitastartKommenGehencheckoutzeitrecidmittagessenMittagessenAbendessenTagestotalMonatstotal
Die App schreibt sowohl deutsch benannte als auch englisch benannte Essensfelder (mittagessen / Mittagessen). Das deutet auf ein historisch gewachsenes oder technisch bedingtes Mapping der Datenquelle hin.
Office365Groups¶
Der Konnektor Office365Groups wird fuer die Adminpruefung verwendet. Ueber ListGroupMembers(...) wird geprueft, ob der aktuelle Benutzer in einer fest hinterlegten Gruppe enthalten ist.
Globale Hilfsfunktionen¶
In App.Formulas sind mehrere wiederverwendbare Funktionen definiert:
FormatMinutes(totalMinutes): Wandelt Minuten inHH:mmumWorkMinutes(startDt, endDt): Berechnet gearbeitete Minuten und verhindert negative WerteFormatBalance(totalHours): Formatiert Stundensalden mit VorzeichenEntryDurationHours(startDt, endDt, breakMinutes): Rechnet einen Eintrag in Stunden umStatusColor(statusText): Liefert eine Farbzuordnung fuer Statuswerte
Zusaetzlich sind zwei Theme-Objekte vorhanden:
AppThemeAppTheme2
Diese kapseln zentrale Farben fuer Oberflaeche, Text, Erfolg, Warnung und Fehler.
Screen ZeiterfassungNeu¶
Zweck¶
Der Screen ist die Hauptoberflaeche fuer die taegliche Zeiterfassung. Beim Oeffnen wird automatisch btnReloadData ausgefuehrt, wodurch die aktuellen Daten geladen und die Anzeige initialisiert wird.
Sichtbare Bereiche¶
1. Kopfbereich¶
Der Header zeigt:
den Titel Zeiterfassung
das aktuell gewaehlte Datum
den Status Nicht eingestempelt oder Eingestempelt
Die Statusfarbe wechselt zwischen Fehler-/Warnfarbton und Erfolgsfarbe, abhaengig davon, ob ein offener Eintrag existiert.
2. Live-Zusammenfassung¶
Dieser Bereich zeigt:
die aktuelle Uhrzeit
die aktuelle Sitzungsdauer
Die Sitzungsdauer wird aus varCurrentSessionMinutes berechnet. Ein Timer aktualisiert diese Anzeige laufend.
3. Aktionen¶
Es gibt zwei Hauptaktionen:
btnKommenbtnGehen
Kommen
Beim Einstempeln passiert Folgendes:
Pruefung, ob bereits ein offener Eintrag existiert
Setzen des Ladezustands
Erzeugen einer neuen
zeitrecidperGUID()Patch()eines neuen Datensatzes inTime Tracking EntrySpeichern von Benutzer, Datum, Startzeit und Verpflegungsstatus
Refresh()der Datenquelleerneutes Laden der lokalen Daten ueber
btnReloadData
Gehen
Beim Ausstempeln passiert Folgendes:
Pruefung, ob ein offener Eintrag vorhanden ist
Berechnung der aktuellen Sitzungsdauer
Neuberechnung von Tages- und Monatssumme ohne Doppelzaehlung des offenen Eintrags
Patch()des offenen Datensatzes mit Endzeit und SummenRefresh()der Datenquelleerneutes Laden der lokalen Daten ueber
btnReloadData
4. Verpflegung¶
Es gibt zwei Checkboxen:
MittagessenAbendessen
Die Auswahl wird lokal in varLunchSelected und varDinnerSelected gehalten und beim Ein- oder Ausstempeln in die Datenquelle geschrieben.
5. Summen¶
Es werden zwei Kennzahlen angezeigt:
TagestotalMonatstotal
Beide werden aus vorbereiteten Collections berechnet und mit FormatMinutes(...) formatiert dargestellt.
Datenfluss¶
Versteckter Reload-Mechanismus¶
Die App verwendet einen unsichtbaren Button btnReloadData als zentrale Ladefunktion. Dessen OnSelect ist die wichtigste Stelle fuer das Lesen und Aufbereiten der Daten.
Der Ablauf:
Refresh('Time Tracking Entry')Laden aller Benutzereintraege in
colUserEntriesFiltern des ausgewaehlten Tages nach
colRawTodayEntriesAnreichern zu
colTodayEntriesmit:startTimeendTimerecordIdlunchValuedinnerValue
Filtern des aktuellen Monats nach
colRawMonthEntriesAnreichern zu
colMonthEntriesErmitteln des offenen Eintrags in
varCurrentOpenEntryBerechnen der aktuellen Kennzahlen und Ruecksetzen der Checkboxen
Live-Aktualisierung¶
Ein unsichtbarer Timer timRefresh laeuft mit einer Dauer von 1000 ms und aktualisiert:
varCurrentSessionMinutesvarCurrentDayMinutesvarCurrentMonthMinutes
Dadurch bleibt die Anzeige waehrend einer laufenden Sitzung aktuell, ohne die Datenquelle sekundenweise neu zu laden.
Verwendete Collections¶
Collection |
Inhalt |
|---|---|
|
Alle Eintraege des aktuellen Benutzers |
|
Rohe Tagesdaten vor Anreicherung |
|
Tagesdaten mit berechneten Hilfsfeldern |
|
Rohe Monatsdaten vor Anreicherung |
|
Monatsdaten mit berechneten Hilfsfeldern |
Verwendete Variablen¶
Variable |
Bedeutung |
|---|---|
|
E-Mail des aktuellen Benutzers |
|
aktuell betrachtetes Datum |
|
steuert die Sichtbarkeit von Admin-Funktionen |
|
sperrt Controls waehrend Datenoperationen |
|
aktuell offener Zeiteintrag |
|
Mittagessen aktiviert |
|
Abendessen aktiviert |
|
Dauer der laufenden Sitzung |
|
Summe fuer den aktuellen Tag |
|
Summe fuer den aktuellen Monat |
|
Hilfsvariable beim Ausstempeln |
|
Hilfsvariable beim Ausstempeln |
Responsive Verhalten¶
Die App nutzt AutoLayout-Container. Mehrere Bereiche schalten bei schmaler Breite (App.Width < 600) von horizontalem auf vertikales Layout um. Dadurch ist die Ansicht fuer kleinere Displays vorbereitet.
Aktuelle Einschraenkungen und Auffaelligkeiten¶
Die App hat derzeit nur einen produktiv genutzten Screen.
Der Admin-Button ist sichtbar, aber funktional noch nicht verdrahtet.
In
App.OnStartwerden einige Variablen mehrfach gesetzt. Das ist funktional unkritisch, aber pflegeintensiver.Die Datenquelle verwendet teilweise doppelte Feldkonzepte fuer Verpflegung (
mittagessenundMittagessen).
Kurzfazit¶
Die App ist als kompakte Single-Screen-Zeiterfassung umgesetzt. Der Kern besteht aus:
Einstempeln und Ausstempeln
Live-Anzeige der aktuellen Sitzung
Berechnung von Tages- und Monatssummen
optional sichtbarer Admin-Einstieg
Der technische Schwerpunkt liegt auf lokal vorbereiteten Collections und einem zentralen Reload-Mechanismus fuer konsistente Anzeige nach jeder Aenderung.