Skip to content

PERSON: Automatisierte Datenlöschung #2106

Closed
hitobito/hitobito_youth
#36
@Michael-Schaer

Description

@Michael-Schaer

Siehe neue Spezifikation: #2106 (comment)

Hier der ursprüngliche Text:
Auf Basis der Diskussion in #1299 und dem Issue hitobito/hitobito_pbs#273 möchten wir eine automatisierte Datenlöschung einrichten. Siehe auch #2105 für die manuelle Datenlöschung.

Der Prozess wird angestossen, wenn kein Opt-In für eine Ehemaligengruppe erfolgt ist. Etwas spezifischer: Wenn 2 Monate nach dem Reminder-Mail aus hitobito/hitobito_pbs#273 weiterhin keine Rolle gesetzt ist, wird eine Löschung überprüft.

Kriterien, die eine Löschung verhindern:

  • Die Person hat eine Rolle (in einer Gruppe)
  • Die Person hat eine Voranmeldung oder Anmeldung für Kurse, Lager oder Anlässe in der Zukunft
  • Die Person hat in den letzten 10 Jahren an einem Kurs- oder Lager teilgenommen (Siehe auch PERSON: Datenlöschung #2105)
  • Die Person hat sich im letzten halben Jahr eingeloggt

@richardjubla @nchiapol Seht ihr hier Potential, dass ihr das auch einsetzen könntet? Oder ist das definitiv im PBS-Wagon?

Tech-Spec

  • Umsetzung im Core, aber per default "ausgeschaltet" bzw. Defaults so gewählt dass es möglichst keinen Einfluss hat. Spezifika von Fristen und Vorgehen bei Minimierung werden dann in jedem Wagon einzeln definiert.
  • Abgrenzung: Folgende in der Diskussion erwähnten Features werden vorerst noch ausgeklammert, bzw. können in Wagons ergänzt werden:
    • Nutzen und erweitern der Spalte "Login" - der letzte Login verzögert zwar die Löschung / Minimierung, aber dieses Datum ist im UI bisher nirgends sichtbar
    • Im Tab "Sicherheit" einsehbar und einzelne Stati und Abhängigkeiten werden dort erklärt - wurde in der Spezifikation der PBS bisher nicht aufgenommen, müsste also ev. durch die Jubla ergänzt werden. Das Sicherheits-Tab als Ort der nachträglichen Nachvollziehbarkeit oder Nachvollziehbarkeit kurz vor der Löschung ist ein Denkfehler - zu diesen Zeitpunkten kann niemand mehr auf das Sicherheits-Tab zugreifen ausser die Person selbst, und wenn sie es selbst macht, muss sie sich dafür einloggen und verzögert somit automatisch die Löschung.
    • Erklärender, generischer Text im Sicherheitstab - wurde in der Spezifikation der PBS bisher nicht aufgenommen, müsste also ev. durch die Jubla ergänzt werden
    • Zeitpunkt der Löschung im Voraus berechnen und an ausgewählten Orten anzeigen - ähnlich wie beim Sicherheits-Tab: diese Information wäre, sobald sie verfügbar wäre, für praktisch niemanden mehr zugänglich. Für Personen mit aktiver Rolle gibt es z.B. schlicht kein vorausgesagtes Löschdatum, weil aktive Rollen meist noch kein Enddatum haben.
    • Status "wird gelöscht" der für 60 Tage angezeigt wird - wurde in der Spezifikation der PBS bisher nicht aufgenommen, müsste also ev. durch die Jubla ergänzt werden
    • Status "inaktiv" - wurde in der Spezifikation der PBS bisher nicht aufgenommen, müsste also ev. durch die Jubla ergänzt werden
    • Benachrichtigungen an zu löschende Person und/oder Verantwortliche - laut Spezifikation gibt es zum Löschzeitpunkt schon länger keine Verantwortlichen mehr (je nach Einstellung natürlich). Benachrichtigung an die zu löschende Person selber wurde in der Diskussion später wieder verworfen, weil es im schweizer DSG nicht vorausgesetzt wird.
    • Nach der Umsetzung sollen alte Accounts nicht sofort oder massenhaft gelöscht werden - wegen der sehr restriktiven Standards im Core werden nur Personen die keine Rolle (auch keine beendete) haben und sich gar nie eingeloggt haben gelöscht. Wenn Wagons diese Settings anpassen, sind sie selber verantwortlich, die Regeln so zu setzen dass keine ungewollt massenhafte Löschung eintritt. Auf einer hohen Flugebene ist es aber eigentlich korrekt, dass bei Einführung dieses Features erst mal sehr viele Datenleichen gelöscht werden, welche gemäss dem neuen DSG schon viel zu lange unnötig herumliegen.
    • Erstellungsdatum des Accounts bzw. Kurz-Rollen berücksichtigen - dazu wurde nichts näheres spezifiziert. Personen die gar keine Rolle und gar keine Anlassteilnahme haben (auch keine vergangenen) und sich nie eingeloggt haben, werden gemäss aktueller Spezifikation beim nächsten Löschungs-Lauf gelöscht.
    • Weitere Grundbedingung "Person wurde in den letzten 24 Monaten nicht bearbeitet" oder "Person hat keine Log-Einträge in den letzten 24 Monaten" - diese Bedingung hatte Denkfehler drin: Damit eine Person bearbeitet werden kann bzw. einen Logeintrag bekommen kann, muss jemand Schreibrechte auf die Person haben, was wiederum eine Rolle bedingt. Diese weitere Grundbedingung könnte also höchstens einen Unterschied machen, wenn jemand die Person bearbeitet, und ihr dann auf der letzten Rolle das Enddatum auf vor 2 Jahren setzt.
    • Risiken bei Rechnungen, bei denen die rechtliche Aufbewahrung oder Nachverfolgbarkeit bei X Jahren liegen sollte - wurde in der Spezifikation der PBS bisher nicht aufgenommen, müsste also ev. durch die Jubla ergänzt werden
    • Terminologie: "Minimierung" soll auch als eine Art der "Löschung" bezeichnet werden - im UI wird bisher nirgends etwas von der Löschung oder Minimierung angezeigt. Die Terminologie ist komplett den Verbänden überlassen, wenn sie dieses neue Feature ihren Mitgliedern erklären.
  • Notizen für Wagons, welche eine Minimierung implementieren:
    • Daran denken, das Log (PaperTrail) sowie alle anderen has_many oder has_one Beziehungen der minimierten Person aufzuräumen.
    • Falls die Haupt-E-Mail nicht entfernt wird, muss geklärt werden, ob sich minimierte Personen weiterhin einloggen dürfen.

ToDo

  • DB-Migration: Neue Timestamp-Spalte minimized_at auf Person hinzufügen, default nil
  • Beim Erstellen einer Rolle oder Participation, minimized_at der Person auf nil setzen und in die DB speichern
  • Täglich laufenden scheduled Delayed::Job namens PeopleCleanupJob erstellen
  • Job sucht alle Personen, auf die folgende Grundbedingungen zutreffen. Dafür eine Domainklasse PeopleCleanupFinder anlegen. Grundbedingungen:
    • Person hatte nie eine Rolle, oder letzte Rolle ist seit mehr als X Monaten beendet. Achtung: Auch archivierte und soft deletete Rollen miteinbeziehen! Logik kann ähnlich wie Group::DeletedPeople#deleted_for umgesetzt werden, aber nicht auf eine Gruppe limitiert, und mit roles.deleted_at <= statt =, plus den Spezial-Case von gar keiner Rolle (ja, das ist möglich, z.B. wenn man sich für einen externen Anlass zu registrieren beginnt, aber nie abschliesst. Oder wenn eine Person neu erfasst wird, und dann innert kurzer Zeit die Rolle wieder gelöscht wird)
      • X Monate ist in settings.yml definierbar
      • Standardwert sehr hoch wählen, oder -1 oder nil oder false als Special Case behandeln. Hauptsache der Job findet standardmässig möglichst nie irgendwelche Personen welche je eine Rolle hatten
    • Es existieren keine event_participations für Events mit zukünftigem Datum (achtung, Events können mehrere Daten haben)
    • current_sign_in_at ist nil oder älter als X Monate
      • X Monate ist in settings.yml definierbar
      • Standardwert sehr hoch wählen, oder -1 oder nil oder false als Special Case behandeln. Hauptsache der Job findet standardmässig möglichst nie irgendwelche Personen welche sich je eingeloggt haben.
    • Bestehende Grundbedingungen sollen in Wagons überschreibbar sein, und neue Grundbedingungen sollen in Wagons hinzugefügt werden können.
    • Im Youth Wagon eine zusätzliche Grundbedingung hinzufügen: Es existieren keine people_manageds (Kinder welche von der gefundenen Person via Elternzugang verwaltet werden)
  • Über alle gefundenen Personen loopen, am besten mit find_in_batches, da die Liste potenziell sehr lang sein kann, wenn das Feature neu eingeführt oder die Grundbedingungen / Settings geändert werden. Für jede gefundene Person:
    • Falls die Person eine event_participation in einem beliebigen Event hat, welcher ein event_date hat das weniger als X Jahre in der Vergangenheit liegt:
      • (Wie oben, X Jahre in settings.yml definierbar, Standardwert so dass möglichst wenige Personen gefunden werden)
      • Diese Zusatz-Bedingung (Participations in beliebigem Event in den letzten X Jahren) in Wagons überschrieben und ergänzt werden können.
      • Falls auf der Person minimized_at nicht nil ist, Abbruch (Person ganz überspringen / ignorieren, nicht auf das andere Lösch-Verhalten zurückfallen)
      • Person wird minimiert. Dazu eine Domainklasse PersonMinimizer anlegen.
        • Haupt-Methode (z.B. perform) enthält im Core keinerlei Logik / Verhalten, ist also ein no-op. Die Idee ist, dass diese Methode in Wagons überschrieben werden kann, um das Verbands-spezifische Minimierungs-Verhalten zu implementieren.
        • Trotzdem wird beim Aufruf des PersonMinimizers der Timestamp minimized_at auf NOW gesetzt
    • Falls die Person keine solche event_participation hat, kommt die Datenlöschung zum Zuge.
      • Auch dafür eine neue Domain-Klasse PersonDestroyer anlegen, welche im Core die Person mit destroy löscht, aber im Wagon überschreibbar ist.
      • Families (via Tabelle family_members), welche nach der Löschung nur noch ein Mitglied haben, auflösen
      • Haushalte (via Spalte household_key auf Tabelle people), welche nach der Löschung nur noch ein Mitglied haben, auflösen
      • Rechnungen die der gelöschten Person gestellt wurden sollen zu "externen" Rechnungen konvertiert werden. Vermutlich muss dafür einfach die person_id der Rechnung auf nil gesetzt werden, weil die Personalien eh schon bei der Rechnungsstellung auf die Rechnung kopiert werden.
  • Im PBS-Wagon die Settings folgendermassen anpassen:
    • Minimales Alter der letzten beendeten Rolle: 18 Monate
    • Minimales Alter des letzten Logins: 24 Monate
    • Minimales Alter des letzten besuchten Events: 10 Jahre
  • Specs schreiben
  • Manuell durchtesten
  • Folgendes Szenario testen: Eine Person A bearbeitet eine andere Person B, und so entsteht bei B ein Log-Eintrag der besagt dass A etwas geändert hat. Später wird Person A durch den hier implementierten Prozess gelöscht. Der Log-Eintrag auf Person B sollte weiterhin sichtbar sein, aber der Name von Person A sollte nicht mehr ersichtlich sein.
  • CHANGELOG-Eintrag unter "unreleased" unten hinzufügen

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions