Datenexport und Anbieterwechsel
Stand: 09.11.2026
Diese Seite enthält die Angaben nach Art. 26 und Art. 28 der Verordnung (EU) 2023/2854 (Data Act). Die vertraglichen Regeln stehen in § 15 der AGB.
1. Verfahren
- Export jederzeit: Administratoren mit vollen Rechten können alle Daten jederzeit selbst exportieren, unter Verwaltung → Einstellungen → Daten & Export → „Alle Daten exportieren“.
- Wechselwunsch: Mit der Kündigung oder bis zum Ende der Kündigungsfrist in Textform an info@fairhours.de mitteilen, ob Sie zu einem anderen Anbieter wechseln, auf eigene Systeme wechseln oder Ihre Daten löschen lassen möchten.
- Übergangszeitraum: bis zu 30 Kalendertage nach dem Ende der Kündigungsfrist. Fairhours läuft in dieser Zeit weiter. Sie können den Zeitraum einmal verlängern.
- Datenabruf: 30 Kalendertage nach dem Vertragsende bzw. nach dem Übergangszeitraum.
- Löschung: danach löschen wir alle exportierbaren Daten, siehe AGB § 15 Abs. 9. Sicherungskopien auf dem Server werden nach 14 Tagen überschrieben, Sicherungskopien außer Haus spätestens nach 40 Tagen gelöscht. Rechnungen bewahren wir auf, solange das Gesetz es verlangt.
- Kosten: Export und Wechsel sind kostenlos.
- Unterstützung: Fragen zum Export beantworten wir per E-Mail, auch gegenüber einem von Ihnen benannten neuen Anbieter.
- Daten einer einzelnen Person (etwa für eine Auskunft nach Art. 15 DSGVO oder eine Datenübertragung nach Art. 20 DSGVO): Je Person gibt es den Stundenzettel und, falls die Personalakte gebucht ist, den Export der Personalakte. Aus dem Gesamtexport lassen sich alle Zeilen einer Person über die Spalte person_id herausfiltern. Der Gesamtexport enthält Daten aller Personen der Firma, auch Verweise auf andere Personen, etwa in entschieden_von. Geben Sie einer Person nur ihre eigenen Daten heraus und prüfen Sie, ob Angaben über andere Personen unkenntlich gemacht werden müssen.
2. Formate
| Export | Inhalt | Format |
|---|---|---|
| Gesamtexport | alle Daten der Firma, eine Datei je Tabelle | ZIP mit CSV-Dateien (Trennzeichen Semikolon, UTF-8 mit BOM) |
| Spesen-Belege | Belege im Original | PDF, JPG, PNG (im Gesamtexport enthalten) |
| Personalakte | je Person: Dokumente, Inhaltsverzeichnis, Stammblatt, auf Wunsch Zugriffsprotokoll | ZIP |
| Monatsübersichten und Auswertungen | laufend für die Lohnabrechnung | Excel |
| Spesen-Export | laufend für die Buchhaltung | DATEV-CSV, Excel, PDF |
3. Datenstrukturen
Die folgende Übersicht beschreibt die Dateien des Gesamtexports und ihre Felder.
Der Gesamtexport ist eine ZIP-Datei. CSV bedeutet: Trennzeichen Semikolon, Zeichensatz UTF-8 mit BOM, erste Zeile = Feldnamen. Zeitpunkte stehen als JJJJ-MM-TTTHH:MM:SS in deutscher Zeit (Zeitzone Europe/Berlin mit Sommerzeit, ohne Angabe des Abstands zu UTC). In der Stunde, die bei der Umstellung auf die Winterzeit doppelt vorkommt, ist ein solcher Zeitpunkt deshalb nicht eindeutig; bei Stempelungen klärt das die Spalte utc_abstand_min in buchungen.csv. Ausgenommen sind entra_gruppenwechsel.zeit (UTC mit Millisekunden und Z, JJJJ-MM-TTTHH:MM:SS.sssZ) sowie alle Zeitpunkte in reise_segmente.csv und reise_protokoll.csv (UTC mit Z, JJJJ-MM-TTTHH:MM:SSZ). zone_start und zone_ende nennen die Zeitzone am Start und am Ende eines Reiseabschnitts als IANA-Namen, etwa Europe/Berlin oder America/New_York; daraus lässt sich die Ortszeit berechnen. Die Dauer eines Abschnitts ist die Differenz der UTC-Zeitpunkte, nicht die Differenz der Ortszeiten. Beträge stehen in Cent. Texte, die (auch nach Leerzeichen) mit = + - @ oder mit einem Tabulator beginnen, haben ein Hochkomma davor.
| Datei | Inhalt | Felder | Format |
|---|---|---|---|
| tabellen/abwesenheiten.csv | Abwesenheiten außer Urlaub und Krankheit (z. B. Dienstreise, Messe, Sonderurlaub) mit Antrag und Entscheidung | id: laufende Nummer; person_id: Person (id aus personen.csv); art: Art der Abwesenheit; von: Beginn; bis: Ende; halbtag: halber Tag; grund: Grund; begruendung: Begründung; tage: Tage; status: Stand; erstellt: angelegt am; erstellt_von: angelegt von (id aus personen.csv); entschieden: entschieden am; entschieden_von: entschieden von (id aus personen.csv); kommentar: Kommentar; ohne_genehmigung: 1 = ohne Genehmigung eingetragen; vertretung_fuer: in Vertretung für (id aus personen.csv) | CSV |
| tabellen/abwesenheitskalender.csv | Einträge im gemeinsamen Abwesenheitskalender in Outlook und ihr Stand | id: laufende Nummer; person_id: Person (id aus personen.csv); postfach; teil; von: Beginn; bis: Ende; beginn; ende; betreff; kennung; event_id; ziel; zustand: Stand; versuche: Zahl der Versuche; naechster: nächster Versuch; letzter_fehler: letzte Fehlermeldung; zeit: Zeitpunkt | CSV |
| tabellen/antraege.csv | Anträge auf Urlaub, Zeitkorrektur und Nachtrag mit Entscheidung | id: laufende Nummer; person_id: Person (id aus personen.csv); art: urlaub, korrektur oder nachtrag; status: Stand; von: Beginn; bis: Ende; halbtag: halber Tag; datum: Tag; buchungen: beantragte Stempelungen (JSON); ersetzt: ersetzte Stempelungen (JSON); begruendung: Begründung; tage: Tage; stunden; erstellt: angelegt am; entschieden: entschieden am; entschieden_von: entschieden von (id aus personen.csv); kommentar: Kommentar; vertretung_id: Vertretung während des Urlaubs (id aus personen.csv); durch_admin: 1 = von einem Admin eingetragen; eingetragen_von: eingetragen von (id aus personen.csv); vertretung_fuer: in Vertretung für (id aus personen.csv) | CSV |
| tabellen/anwesenheit_beispiele.csv | Beispiele, nach denen der Anwesenheitskalender Outlook-Termine einordnet | id: laufende Nummer; kennung; betreff; betreff_norm; show_as; ganztags; entscheidung; art; privat; quelle; zeit: Zeitpunkt | CSV |
| tabellen/anwesenheit_einordnung.csv | Geprüfte Einordnung von Outlook-Terminen im Anwesenheitskalender (ohne Betreff) | entscheidung; art; privat; quelle; sicher; zeit: Zeitpunkt; gruppe | CSV |
| tabellen/anwesenheit_termine.csv | Termine aus den eigenen Outlook-Kalendern für den Anwesenheitskalender und ihre Einordnung | id: laufende Nummer; person_id: Person (id aus personen.csv); event_id; serie_id; tag: Tag; von: Beginn; bis: Ende; ganztags; show_as; privat; abgesagt; zeiterfassung; vorschlag_entscheidung; vorschlag_art; vorschlag_privat; vorschlag_quelle; entscheidung; art; quelle; regel_grund; anzeige_von; anzeige_bis; gelesen | CSV |
| tabellen/anwesenheit_wahl.csv | Eigene Einordnung einer Person im Anwesenheitskalender | person_id: Person (id aus personen.csv); entscheidung; art; zeit: Zeitpunkt | CSV |
| tabellen/arbeitsort_ergebnisse.csv | Ergebnisse beim Setzen des Arbeitsorts in Teams und Outlook | id: laufende Nummer; zeit: Zeitpunkt; kuerzel; ort; umfang; ok; status: Stand; fehler | CSV |
| tabellen/arbeitsort_tage.csv | Arbeitsort je Person und Tag (Büro, Homeoffice) | person_id: Person (id aus personen.csv); datum: Tag; ort; zeit: Zeitpunkt | CSV |
| tabellen/arbeitsort_zaehler.csv | Zähler je Tag: Arbeitsort gesetzt bzw. fehlgeschlagen | datum: Tag; ok; fehler | CSV |
| tabellen/ausserhalb.csv | Zeit außerhalb der Rahmenzeit je Person und Tag mit Entscheidung | id: laufende Nummer; person_id: Person (id aus personen.csv); datum: Tag; status: Stand; vor_min; nach_min; entscheidung; entschieden_vor_min; entschieden_nach_min; genehmigt_vor_min; genehmigt_nach_min; erstellt: angelegt am; aktualisiert; entschieden: entschieden am; entschieden_von: entschieden von (id aus personen.csv); kommentar: Kommentar; mit_vor_min; mit_nach_min; mit_herkunft; genehmigt_spannen: Zeitspannen früherer Freigaben (JSON), bis zur nächsten zeitlich wirksamen Korrektur gültig; vertretung_fuer: in Vertretung für (id aus personen.csv); korrektur_hinweis: Letzte Rücksetzung mit Korrektur, Zeitpunkt und bisheriger Entscheidung (JSON); mit_ab_id: Nur Mitgenehmigungen mit größerer Nummer gehören zur aktuellen Tagesentscheidung | CSV |
| tabellen/ausserhalb_entscheidungen.csv | Entscheidungen und Rücksetzungen nach Buchungskorrekturen mit altem und neuem Stand (nur anhängen) | id: laufende Nummer; ausserhalb_id; person_id: Person (id aus personen.csv); zeitpunkt: Zeitpunkt; entschieden_von: entschieden von (id aus personen.csv); vertretung_fuer: in Vertretung für (id aus personen.csv); ok; kommentar: Kommentar; beantragt_vor_min; beantragt_nach_min; alt_status; alt_vor_min; alt_nach_min; neu_status; neu_vor_min; neu_nach_min; art: entscheidung, zuruecksetzung oder korrekturentscheidung; korrektur_art: korrektur, nachtrag, admin, chip_verwerfen oder chip_zuordnen; korrektur_id: Nummer des Antrags, beim Chip-Verwerfen Buchungsnummer, bei alter Chip-Zuordnung Ereignisnummer; alt_stand: Minuten, sekundengenaue Zeitspannen und Entscheidung vor der Änderung (JSON); neu_stand: Minuten, sekundengenaue Zeitspannen und Entscheidung nach der Änderung (JSON) | CSV |
| tabellen/ausserhalb_mit.csv | Mitgenehmigte Zeit außerhalb der Rahmenzeit (durch welchen Antrag, wer, wann) | id: laufende Nummer; ausserhalb_id; antrag_id; vor_min; nach_min; genehmigt_von; vertretung_fuer: in Vertretung für (id aus personen.csv); zeitpunkt: Zeitpunkt; spannen: Zeitspannen früherer Mitgenehmigungen (JSON); neue Entscheidungen gelten für den ganzen Tag | CSV |
| tabellen/ausserhalb_mit_verlauf.csv | Vollständiger ursprünglicher Stand zurückgesetzter Mitgenehmigungen, einschließlich Quelle der Rücksetzung (nur anhängen) | mit_id: Ursprüngliche Nummer aus ausserhalb_mit; ausserhalb_id; antrag_id; daten: Vollständige ursprüngliche Zeile aus ausserhalb_mit (JSON); zurueckgesetzt: Zeitpunkt der Rücksetzung; korrektur_art: Art der auslösenden Korrektur; korrektur_id: Nummer der auslösenden Korrektur | CSV |
| tabellen/buchungen.csv | Stempelungen (Kommen und Gehen) aus Browser, Handy und Terminal | id: laufende Nummer; person_id: Person (id aus personen.csv); chip: Chip-Nummer; aktion: kommen oder gehen; grund: Grund beim Gehen; zeitpunkt: Zeitpunkt; quelle: Herkunft der Stempelung; empfangen: beim Server angekommen; rohdaten: Daten des Terminals; storniert: storniert am (zählt nicht mehr); ort: Arbeitsort; utc_abstand_min: Abstand der Ortszeit zu UTC in Minuten (120 Sommerzeit, 60 Winterzeit; leer bei älteren Stempelungen) | CSV |
| tabellen/chips.csv | Bekannte Chips der Stempelterminals | chip: Chip-Nummer; erstmals: zuerst gesehen; quelle: wo der Chip zuerst gelesen wurde | CSV |
| tabellen/darstellung.csv | Persönliche Darstellung je Person: Design (hell, dunkel, automatisch), Schriftgröße und Kontrast | person_id: Person (id aus personen.csv); thema; schrift; kontrast; geaendert: geändert am | CSV |
| tabellen/einstellungen.csv | Einstellungen der Firma (Name der Einstellung und Wert, meist als JSON) | schluessel: Name der Einstellung; wert: Wert | CSV |
| tabellen/entra_gruppenwechsel.csv | Änderungen der Microsoft-365-Gruppe: wer wann welche Wahl übernommen hat, Bestätigung und Zahlen des Abgleichs | id: laufende Nummer; zeit: Zeitpunkt in UTC (JJJJ-MM-TTTHH:MM:SS.sssZ), abweichend von der deutschen Ortszeit der übrigen Tabellen; person_id: Person (id aus personen.csv); person_name: Name der handelnden Admin-Person; alt: vorherige Gruppenwahl (JSON); neu: neue Gruppenwahl (JSON); bestaetigt: eins = Deaktivieren für diesen Lauf ausdrücklich bestätigt; zahlen: Zahlen des Abgleichs (JSON) | CSV |
| tabellen/ereignisse.csv | Meldungen der Terminals, der Outlook-Freischaltung, Admin-Wiederherstellungen und Datenübernahmen (Admin, Zeitpunkt, Anzahl Personen und Abwesenheiten, SHA-256-Prüfsumme) | id: laufende Nummer; quelle: Herkunft; daten_import bei einer Datenübernahme; art: Art der Meldung; text: Ereignistext; bei Datenübernahmen JSON mit admin_id, personen, abwesenheiten und sha256; zeitpunkt: Zeitpunkt; empfangen: beim Server angekommen | CSV |
| tabellen/firmenlogo.csv | Angaben zum Firmenlogo (das Bild liegt im Ordner logo/) | id: immer 1 (es gibt höchstens ein Logo); mime: Dateiart; breite: Breite in Pixel; hoehe: Höhe in Pixel; version: Prüfsumme des Bildes; geaendert: geändert am; geaendert_von: geändert von (id aus personen.csv) | CSV |
| tabellen/firmentermine.csv | Firmentermine (z. B. Betriebsurlaub, Schulferien, Messen) | id: laufende Nummer; titel: Titel; art: Art; von: Beginn; bis: Ende; farbe; abteilungen: betroffene Abteilungen; teams: betroffene Teams; wirkung: Wirkung auf Arbeitszeit und Urlaub; hinweistext; vorlaeufig: 1 = vorläufig; vorlage; wiederholung: Wiederholung; wiederholung_bis: Wiederholung bis; erstellt: angelegt am; erstellt_von: angelegt von (id aus personen.csv); geaendert: geändert am; geaendert_von: geändert von (id aus personen.csv); entfernt: entfernt am (der Eintrag bleibt zum Nachweis); entfernt_von: entfernt von (id aus personen.csv) | CSV |
| tabellen/genehmigungsvertretungen.csv | Vertretungen bei Genehmigungen | id: laufende Nummer; vg_id; vertreter_id; von: Beginn; bis: Ende; erstellt: angelegt am; erstellt_von: angelegt von (id aus personen.csv); entfernt: entfernt am (der Eintrag bleibt zum Nachweis); entfernt_von: entfernt von (id aus personen.csv) | CSV |
| tabellen/gesamtexporte.csv | Protokoll der Gesamtexporte: wer wann exportiert hat (ohne Inhalt) | id: laufende Nummer; person_id: wer exportiert hat (id aus personen.csv); zeitpunkt: wann | CSV |
| tabellen/ki_hilfe_plaetze.csv | Wer einen Platz im KI-Hilfe-Chat hat | person_id: Person (id aus personen.csv); seit: Platz vergeben am | CSV |
| tabellen/konto_gutschriften.csv | Gutschriften auf Konten, z. B. Messeausgleich | id: laufende Nummer; person_id: Person (id aus personen.csv); konto: Konto; datum: Tag; tage: gutgeschriebene Tage; grund: Grund; erfasst: angelegt am; erfasst_von: angelegt von (id aus personen.csv); entfernt: entfernt am (der Eintrag bleibt zum Nachweis); entfernt_von: entfernt von (id aus personen.csv); vertretung_fuer: in Vertretung für (id aus personen.csv) | CSV |
| tabellen/krankheiten.csv | Krankheitstage einschließlich Bemerkung und Ansprechperson (für den Export entschlüsselt) | id: laufende Nummer; person_id: Person (id aus personen.csv); von: Beginn; bis: Ende; bemerkung: Bemerkung; erfasst: angelegt am; erfasst_von: angelegt von (id aus personen.csv); entfernt: entfernt am (der Eintrag bleibt zum Nachweis); entfernt_von: entfernt von (id aus personen.csv); vertretung_fuer: in Vertretung für (id aus personen.csv); geaendert: geändert am; geaendert_von: geändert von (id aus personen.csv); geaendert_vertretung_fuer; ansprechperson_id: Ansprechperson (id aus personen.csv); ohne_ansprechperson | CSV |
| tabellen/messe_outlook.csv | Messe-Termine aus Outlook und ihre Zuordnung im Messekalender | id: laufende Nummer; postfach; event_id; ical_uid; art; termin_id; messe_id; team_neu; zustand: Stand; ignoriert_weil; herkunft; gehoert_app; organisator; serie; betreff; beginn; ende; ganztags; ort; eintrag; outlook_geaendert; change_key; eigener_change_key; eigener_inhalt; app_stand; fest_ort; grund: Grund; vorschlag; vorschlag_von; erstellt: angelegt am; geaendert: geändert am | CSV |
| tabellen/messe_outlook_auftraege.csv | Aufträge vom Messekalender an Outlook und ihr Stand | id: laufende Nummer; postfach; ziel_art; ziel_id; aktion; kennung; event_id; unsicher; zustand: Stand; versuche: Zahl der Versuche; naechster: nächster Versuch; letzter_fehler: letzte Fehlermeldung; zeit: Zeitpunkt | CSV |
| tabellen/messe_team.csv | Wer zum Team einer Messe gehört | messe_id; person_id: Person (id aus personen.csv) | CSV |
| tabellen/messe_termin_personen.csv | Wer an einem Messe-Termin teilnimmt | termin_id; person_id: Person (id aus personen.csv) | CSV |
| tabellen/messe_termin_tage.csv | Tage eines Messe-Termins | termin_id; tag: Tag | CSV |
| tabellen/messe_termine.csv | Termine auf Messen (z. B. Kundentermine am Stand) | id: laufende Nummer; messe_id: Messe (id aus messen.csv); tag: Tag; von: Beginn; bis: Ende; kunde: Kunde; ansprechpartner: Ansprechpartner beim Kunden; status: Stand; notiz: Notiz; kuerzel_alt; war_da_am; war_da_von; quelle; erstellt_von: angelegt von (id aus personen.csv); erstellt_am: angelegt am; geaendert_von: geändert von (id aus personen.csv); geaendert_am: geändert am; entfernt: entfernt am (der Eintrag bleibt zum Nachweis); entfernt_von: entfernt von (id aus personen.csv); geaendert_ueber | CSV |
| tabellen/messen.csv | Messen mit Ort, Stand und Zeitraum | id: laufende Nummer; name: Name; ort: Ort; stand: Stand auf der Messe; von: Beginn; bis: Ende; aufbau: Aufbau; firmentermin_id; firmentermin_eigen; quelle; erstellt_von: angelegt von (id aus personen.csv); erstellt_am: angelegt am; geaendert_von: geändert von (id aus personen.csv); geaendert_am: geändert am; entfernt: entfernt am (der Eintrag bleibt zum Nachweis); entfernt_von: entfernt von (id aus personen.csv) | CSV |
| tabellen/outlook_abwesenheiten.csv | Termine und Abwesenheitsnotizen, die Fairhours für Urlaub und Krankheit in Outlook eingetragen hat | antrag_id; person_id: Person (id aus personen.csv); entra_oid; ziel; mit_termin; mit_notiz; kennung; termine; notiz: Notiz; notiz_ende; stand; zustand: Stand; versuche: Zahl der Versuche; naechster: nächster Versuch; letzter_fehler: letzte Fehlermeldung; meldungen; zeit: Zeitpunkt | CSV |
| tabellen/personen.csv | Personen mit Stammdaten (Rolle, Abteilung, Zeitmodell, Urlaubsanspruch, Eintritt und Austritt) | id: laufende Nummer; name: Name; chip: Chip-Nummer; rolle: Rolle (ma = Mitarbeitende, vg = Vorgesetzte, admin); personalnummer: Personalnummer; abteilung: Abteilung; vorgesetzter_id: Vorgesetzte(r) (id aus personen.csv); wochenstunden: Wochenstunden; verteilung: Stunden je Wochentag (JSON); land: Bundesland für Feiertage (Kürzel, z. B. BY); eintritt: Eintritt; kuerzel: Kürzel; email: E-Mail; urlaub_anspruch_tage: Urlaubsanspruch im Jahr; urlaub_uebertrag_tage: Resturlaub aus dem Vorjahr; ueberstunden_uebertrag_min: Überstunden-Übertrag in Minuten; aktiv: 1 = aktiv; austritt: Austritt; entra_oid: Kennung in Microsoft 365; quelle; entra_vorgesetzter_oid; stempelpflicht: 1 = stempelt; messeausgleich_uebertrag_tage; abrechnungsbeginn; hr: 1 = Personalabteilung; hr_vertraulich; dienstreise_ohne_genehmigung; ueberstunden_verfall; ueberstunden_verfall_ab; admin_eingeschraenkt: 1 = Admin Zeiterfassung; urlaub_start: Beginn des Urlaubskontos (ab diesem Jahr rechnet der Übertrag); urlaub_start_fest: Kontobeginn ausdrücklich gesetzt; frühere Stempelungen verschieben ihn nicht; team_hoechstens_weg | CSV |
| tabellen/reise_protokoll.csv | Änderungen an Reisezeit und Firmeneinstellungen mit altem und neuem Wert | id: laufende Nummer; bereich: segment oder einstellungen; segment_id: Nummer aus reise_segmente.csv; leer bei Firmeneinstellungen; feld: geändertes Feld; arbeitsweg_vorbelegung enthält die Einstellung beim Anlegen; alt: vorheriger Wert als JSON; neu: neuer Wert als JSON; wer: ändernde Person (id aus personen.csv); wann: Zeitpunkt in UTC | CSV |
| tabellen/reise_segmente.csv | Reisezeit-Segmente mit UTC-Zeiten, Zeitzonen, ArbZG-Bewertung, Gutschrift und Entscheidung | id: laufende Nummer; person_id: Person (id aus personen.csv); reise_id: gemeinsame zufällige Kennung aller Segmente einer Reise; typ: Typ aus dem Reisezeit-Katalog: aktiv_ohne_typ = Reisezeit ohne Untertyp (aktiv); aktiv_selbst_gefahren = selbst gefahren auf Anweisung; aktiv_arbeit_unterwegs = unterwegs gearbeitet auf Anweisung; aktiv_fahrer = Fahrer für Kollegen; passiv_oeffentlich = Bahn, Flug oder Bus ohne Arbeitsauftrag; passiv_freiwillig_auto = freiwillig selbst gefahren statt der vorgesehenen Bahn; mitfahrt_ag_organisiert = Mitfahrt in einer vom Arbeitgeber organisierten Fahrt; start_utc: Beginn in UTC (JJJJ-MM-TTTHH:MM:SSZ); ende_utc: Ende in UTC; leer bei laufender Reise; zone_start: IANA-Zeitzone am Start; zone_ende: IANA-Zeitzone am Ende; leer bei laufender Reise; ausland: 1 = Reise im Ausland; zaehlt_fuer_arbzg: 1 = zählt für Arbeitszeit, Pausen und Ruhezeit nach ArbZG; gutschrift_prozent: Gutschrift auf das Zeitkonto in Prozent (0 bis 100); arbeitsweg_abzug_min: Abzug von der Gutschrift in Minuten, ohne Wirkung auf ArbZG; status: gilt, offen, abgelehnt oder storniert; quelle: live, nachtrag oder verwaltung; bemerkung: Bemerkung zur Reise; erstellt: angelegt am; erstellt_von: angelegt von (id aus personen.csv); entschieden: entschieden am; entschieden_von: entschieden von (id aus personen.csv); entscheidung_grund: Grund der Genehmigung oder Ablehnung | CSV |
| tabellen/spesen_abrechnungen.csv | Spesenabrechnungen und Reisen mit Stand und Entscheidung | id: laufende Nummer; nummer: Nummer; person_id: Person (id aus personen.csv); art: Monat oder Reise; titel: Titel; monat; reise_zweck; reise_ziel; reise_land; reise_ort; reise_beginn; reise_ende; reise_uebernachtung; reise_ergebnis; abwesenheit_id; status: Stand; eingereicht; entschieden: entschieden am; entschieden_von: entschieden von (id aus personen.csv); vertretung_fuer: in Vertretung für (id aus personen.csv); kommentar: Kommentar; geprueft; geprueft_von; export_id: Export (id aus spesen_exporte.csv); pos_zaehler; erstellt: angelegt am; geaendert: geändert am | CSV |
| tabellen/spesen_belege.csv | Angaben zu den Belegen der Spesen (die Dateien liegen im Ordner belege/) | id: Kennung; Dateiname im Ordner belege/; person_id: Person (id aus personen.csv); mime: Dateiart; groesse: Größe in Bytes; sha256; dateiname: ursprünglicher Dateiname; hochgeladen: hochgeladen am; ki_status: Stand der KI-Belegprüfung; ki_ergebnis: von der KI gelesene Angaben (JSON); ki_fehler; ki_versuche; ki_zeit; format: Ablage der Datei auf dem Server (zbl1 = verschlüsselt, klar = älterer unverschlüsselter Beleg); im Export immer unverschlüsselt | CSV |
| tabellen/spesen_belege_tag.csv | Zahl der hochgeladenen Belege je Person und Tag | person_id: Person (id aus personen.csv); datum: Tag; anzahl | CSV |
| tabellen/spesen_exporte.csv | Exporte der Spesen für die Buchhaltung | id: laufende Nummer; nummer; erstellt: angelegt am; erstellt_von: angelegt von (id aus personen.csv); anzahl: Zahl der Abrechnungen; summe_cent: Summe in Cent; datev: 1 = DATEV-Format; hinweise; daten: Abrechnungen und Einstellungen beim Erstellen (JSON); daraus entstehen Excel-Liste und ZIP des Exports; zurueckgenommen; zurueckgenommen_von | CSV |
| tabellen/spesen_kurse.csv | Wechselkurse der Europäischen Zentralbank, die für Spesen genutzt wurden | datum: Tag; waehrung; kurs | CSV |
| tabellen/spesen_plaetze.csv | Wer einen Spesen-Platz hat | person_id: Person (id aus personen.csv); seit: Platz vergeben am | CSV |
| tabellen/spesen_positionen.csv | Einzelne Ausgaben einer Spesenabrechnung | id: laufende Nummer; abrechnung_id: Abrechnung (id aus spesen_abrechnungen.csv); nr; kategorie: Kategorie; datum: Tag; betrag_cent: Betrag in Cent (Euro); waehrung: Währung; betrag_original_cent: Betrag in der Währung des Belegs (Cent); kurs: Wechselkurs; kurs_quelle; angaben; beleg_id: Beleg (id aus spesen_belege.csv); warnung_grund; warnung_codes; konto: Konto; steuer: Steuerschlüssel; bezahlt: privat oder firmenkarte; automatisch; erstellt: angelegt am; geaendert: geändert am | CSV |
| tabellen/spesen_reisetage.csv | Reisetage einer Reise mit Land, Ort und gestellten Mahlzeiten | abrechnung_id; datum: Tag; land; ort; fruehstueck; mittag; abend | CSV |
| tabellen/spesen_verlauf.csv | Verlauf einer Spesenabrechnung (eingereicht, genehmigt, zurückgegeben …) | id: laufende Nummer; abrechnung_id; zeit: Zeitpunkt; person_id: Person (id aus personen.csv); aktion; kommentar: Kommentar | CSV |
| tabellen/stundenbuchungen.csv | Von Hand gebuchte Stunden (Gutschrift oder Abzug) | id: laufende Nummer; person_id: Person (id aus personen.csv); datum: Tag; minuten: Minuten (plus = Gutschrift, minus = Abzug); grund: Grund; erstellt: angelegt am; erstellt_von: angelegt von (id aus personen.csv); entfernt: entfernt am (der Eintrag bleibt zum Nachweis); entfernt_von: entfernt von (id aus personen.csv); entfernt_grund; abgegolten_monat: Monat des Überstunden-Verfalls | CSV |
| tabellen/terminals.csv | Stempelterminals (ohne Kennwörter) | seriennummer: Seriennummer; port; letzter_kontakt: letzter Kontakt; uhr_abweichung_s: Abweichung der Uhr in Sekunden; id: laufende Nummer; name: Name; kennung: Kennung; gesperrt: gesperrt am; angelegt: angelegt am; angelegt_von: angelegt von (id aus personen.csv); zuletzt_abgewiesen | CSV |
| tabellen/ueberstunden_verfall.csv | Monatsabschluss für den Verfall von Überstunden je Person | person_id: Person (id aus personen.csv); monat: Monat; ergebnis: Ergebnis; saldo_min: Saldo am Monatsende in Minuten; buchung_id: Buchung (id aus stundenbuchungen.csv); gelaufen | CSV |
| tabellen/urlaubswuensche.csv | Unverbindliche Urlaubswünsche | id: laufende Nummer; person_id: Person (id aus personen.csv); von: Beginn; bis: Ende; halbtag: halber Tag; notiz: Notiz; erstellt: angelegt am; erstellt_von: angelegt von (id aus personen.csv); geaendert: geändert am; geaendert_von: geändert von (id aus personen.csv); entfernt: entfernt am (der Eintrag bleibt zum Nachweis); entfernt_von: entfernt von (id aus personen.csv); antrag_id | CSV |
| tabellen/vertretungsgruppen.csv | Vertretungsgruppen mit Mindestbesetzung | id: laufende Nummer; name: Name; mindestens: Mindestbesetzung; notiz: Notiz; erstellt: angelegt am; erstellt_von: angelegt von (id aus personen.csv); geaendert: geändert am; geaendert_von: geändert von (id aus personen.csv); entfernt: entfernt am (der Eintrag bleibt zum Nachweis); entfernt_von: entfernt von (id aus personen.csv) | CSV |
| tabellen/vertretungsgruppen_mitglieder.csv | Wer zu einer Vertretungsgruppe gehört | gruppe_id; person_id: Person (id aus personen.csv) | CSV |
| tabellen/zeitmodelle.csv | Frühere Arbeitszeitmodelle je Person: Wochenstunden und Verteilung, die bis zu einem Tag galten | id: laufende Nummer; person_id: Person (id aus personen.csv); bis: Ende; wochenstunden; verteilung; geaendert: geändert am; geaendert_von: geändert von (id aus personen.csv) | CSV |
| tabellen/zusatzurlaub.csv | Zusätzliche Urlaubstage je Person und Jahr | id: laufende Nummer; person_id: Person (id aus personen.csv); tage: Tage; ab_jahr: ab Jahr; bis_jahr: bis Jahr; grund: Grund; erfasst: angelegt am; erfasst_von: angelegt von (id aus personen.csv); entfernt: entfernt am (der Eintrag bleibt zum Nachweis); entfernt_von: entfernt von (id aus personen.csv) | CSV |
| belege/ | Belege der Spesen im Original; Dateiname = id aus spesen_belege.csv | – | PDF, JPG, PNG |
| logo/ | Firmenlogo im Original, falls eines hochgeladen ist (Angaben in firmenlogo.csv) | – | PNG, JPG oder WEBP |
| LIESMICH.txt | Aufbau des Exports, Zeitpunkt der Erstellung und Zahl der Tabellen und Belege | – | Text (UTF-8) |
| Personalakte | Je Person ein eigener Export in der Personalakte: Dokumente, Inhaltsverzeichnis, Stammblatt, auf Wunsch Zugriffsprotokoll | – | ZIP je Person |
4. Bekannte Einschränkungen
- Nicht exportiert werden Daten, die nur dem internen Betrieb dienen: Sitzungen, interne Zähler und Protokolle der KI-Funktionen und des Mailversands, die Zugriffsprotokolle des Webservers (IP-Adresse, Zeitpunkt, aufgerufene Adresse und Browser-Kennung, nach 14 Tagen gelöscht), Kennwort-Hashes, Tokens und Schlüssel.
- Ebenfalls nicht im Gesamtexport: interne Läufe und Stände der Abgleiche mit Microsoft 365 und Outlook, die Prüfung der Outlook-Freischaltung, Anmelde-Übergaben vom Portal und Prüfwerte (Hashes) der KI-Einordnung von Kalenderterminen.
- Es gibt keine Schnittstelle für eine direkte Übertragung zu einem anderen Anbieter. Der Gesamtexport ist eine Datei zum Herunterladen.
- Die Personalakte ist nicht im Gesamtexport: Sie ist verschlüsselt gespeichert und hat eigene Rechte. Sie wird je Person in der Personalakte exportiert.
- Den Gesamtexport laden nur Admins mit vollen Rechten herunter, nicht die Rolle „Admin Zeiterfassung“. In der Demo gibt es keinen Gesamtexport.
- Höchstens ein Gesamtexport alle 10 Minuten je Firma. Jeder Export wird mit Person und Zeitpunkt vermerkt; der Vermerk steht selbst im Export (gesamtexporte.csv).
- Einige Felder enthalten strukturierte Angaben als JSON, zum Beispiel die Werte der Einstellungen.
5. Gerichtsbarkeit der technischen Infrastruktur
| Teil | Betreiber | Standort und Recht |
|---|---|---|
| Server, Datenbanken, Sicherungen | Hetzner Online GmbH | Rechenzentren in Deutschland, deutsches Recht |
| KI-Funktionen (nur wenn gebucht) | Langdock GmbH, Berlin | Verarbeitung in der EU. Langdock nutzt Modellanbieter, von denen einige ihren Sitz oder ihre Muttergesellschaft in den USA haben. |
| Support-Postfach info@fairhours.de | Microsoft Ireland Operations Limited | Irland, Muttergesellschaft in den USA |
6. Schutz vor unrechtmäßigem staatlichem Zugriff
- Ihre Daten liegen bei einem deutschen Rechenzentrumsbetreiber in Deutschland.
- Alle Verbindungen sind verschlüsselt. Personalakten, Spesen-Belege und Krankheitstage sind zusätzlich mit einem eigenen Schlüssel je Firma verschlüsselt gespeichert.
- Sicherungen außer Haus werden verschlüsselt, bevor sie unseren Server verlassen. Den Schlüssel zum Öffnen haben nur wir, offline. Der Speicheranbieter kann die Sicherungen nicht lesen.
- KI-Funktionen sind optional und lassen sich abschalten.
- Verlangt eine Behörde außerhalb der EU Zugang zu Ihren Daten, geben wir sie nur heraus, wenn das nach Art. 32 Data Act zulässig ist. Vorher informieren wir Sie, soweit das erlaubt ist.