Description
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 ZukunftDie 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
aufPerson
hinzufügen, defaultnil
- Beim Erstellen einer Rolle oder Participation,
minimized_at
der Person aufnil
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 mitroles.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
oderfalse
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
istnil
oder älter als X Monate- X Monate ist in settings.yml definierbar
- Standardwert sehr hoch wählen, oder -1 oder
nil
oderfalse
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)
- 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
- Ü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 einevent_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
nichtnil
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
PersonMinimizer
s der Timestampminimized_at
aufNOW
gesetzt
- Haupt-Methode (z.B.
- 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 mitdestroy
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 Tabellepeople
), 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 aufnil
gesetzt werden, weil die Personalien eh schon bei der Rechnungsstellung auf die Rechnung kopiert werden.
- Auch dafür eine neue Domain-Klasse
- Falls die Person eine
- 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