From 57ee7925e1c23ee9e6ba50e50e146c5b27e84556 Mon Sep 17 00:00:00 2001 From: Kojo Date: Sun, 18 May 2025 20:58:28 +0200 Subject: [PATCH] =?UTF-8?q?Personenidentit=C3=A4ten=20entkn=C3=BCpfen=20(s?= =?UTF-8?q?tatt=20vorher=20Antragspersondaten),=20Personenidentit=C3=A4ten?= =?UTF-8?q?=20zum=20Entkn=C3=BCpfen=20vorher=20in=20getrennter=20DB-Transa?= =?UTF-8?q?ktion=20erzeugen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AidA/Data/Database.cs | 46 +++- .../Anonymization/AnonymizationManager.cs | 225 ++++++++++++++---- 2 files changed, 218 insertions(+), 53 deletions(-) diff --git a/AidA/Data/Database.cs b/AidA/Data/Database.cs index eb9d89a..3831300 100644 --- a/AidA/Data/Database.cs +++ b/AidA/Data/Database.cs @@ -165,8 +165,9 @@ namespace AidA.Data { var c = HibernateHelper.GetCurrentSession().CreateCriteria().Add(Restrictions.Eq("AntragsNummer", antragsNummer)); Antrag antrag = (Antrag)c.UniqueResult(); - - return antrag.Id; + if (antrag != null) + return antrag.Id; + return -1; } public static AntragsStatus GetAntragsStatus(long antragsStatusId) @@ -190,6 +191,25 @@ namespace AidA.Data return (IList) c.UniqueResult(); } + public static PersonenIdentitaet GetPersonenIdentitaet(string vorname, string nachname, DateTime? geburtsdatum) + { + var criteria = HibernateHelper.GetCurrentSession().CreateCriteria() + .Add(Restrictions.Eq("Vorname", vorname)) + .Add(Restrictions.Eq("Nachname", nachname)) + .Add(Restrictions.Eq("Geburtsdatum", geburtsdatum)); + + return (PersonenIdentitaet) criteria.UniqueResult(); + } + + public static IList GetPersonenIdentitaeten(string vorname, string nachname) + { + var criteria = HibernateHelper.GetCurrentSession().CreateCriteria() + .Add(Restrictions.Eq("Vorname", vorname)) + .Add(Restrictions.Eq("Nachname", nachname)); + + return criteria.List(); + } + public static void ErstelleDbSicherheitsKopie(string dateiName) { const string query = @"BACKUP DATABASE @db TO DISK = @file;"; @@ -234,5 +254,27 @@ namespace AidA.Data sqlConnection.Close(); } } + + public static long? InsertPersonenIdentitaet(PersonenIdentitaet personenIdentitaet) + { + long? id = null; + + ISession session = HibernateHelper.GetCurrentSession(); + ITransaction transaction = session.BeginTransaction(); + + try + { + session.Save(personenIdentitaet); + transaction.Commit(); + id = personenIdentitaet.Id; + } + catch (Exception ex) + { + transaction.Rollback(); + throw ex; + } + + return id; + } } } diff --git a/AidA/Service/Anonymization/AnonymizationManager.cs b/AidA/Service/Anonymization/AnonymizationManager.cs index 2063178..f0a098c 100644 --- a/AidA/Service/Anonymization/AnonymizationManager.cs +++ b/AidA/Service/Anonymization/AnonymizationManager.cs @@ -13,6 +13,8 @@ namespace AidA.Service.Anonymization private Dictionary> AntragsPersonenDatenDictionary; + private Dictionary> PersonenIdentitaetDictionary; + private IList ZuAnonymisierendeAntraege; private IList Anonymisierungen; @@ -45,7 +47,8 @@ namespace AidA.Service.Anonymization ZuAnonymisierendeAntraege = new List(); AnsprechpartnerDictionary = new Dictionary>(); - AntragsPersonenDatenDictionary = new Dictionary>(); + // AntragsPersonenDatenDictionary = new Dictionary>(); + PersonenIdentitaetDictionary = new Dictionary>(); Anonymisierungen = Database.GetAll(); Anonymisierungsausnahmen = Database.GetAll(); @@ -79,7 +82,8 @@ namespace AidA.Service.Anonymization { ausgenommeneAntraege++; UpdateAnsprechpartnerDictionary(antrag); - UpdateAntragsPersonenDatenDictionary(antrag); + // UpdateAntragsPersonenDatenDictionary(antrag); + UpdatePersonenIdentitaetDictionary(antrag); gepruefteAntraege++; progressBar.Value++; continue; @@ -128,7 +132,7 @@ namespace AidA.Service.Anonymization beginnAufbewahrungsfrist = new DateTime(2022, 1, 1); } else - { + { beginnAufbewahrungsfrist = new DateTime(bewilligungsJahr + 1, 1, 1); } } @@ -154,7 +158,8 @@ namespace AidA.Service.Anonymization } UpdateAnsprechpartnerDictionary(antrag); - UpdateAntragsPersonenDatenDictionary(antrag); + // UpdateAntragsPersonenDatenDictionary(antrag); + UpdatePersonenIdentitaetDictionary(antrag); gepruefteAntraege++; progressBar.Value++; } @@ -171,6 +176,8 @@ namespace AidA.Service.Anonymization public void AnonymisierungslaufDurchfuehren(Anonymisierungslauf anonymisierungslauf, ProgressBarEdit progressBar) { + Dictionary anonymisiertePersonenIdentitaeten = AnonymisiertePersonenIdentitaetenVorbereiten(); + anonymisierungslauf.AnonymisierungsBeginn = DateTime.Now; anonymisierungslauf.AnonymisierungsUser = UserName; anonymisierungslauf.Sicherung = "Anonymisierungsbackup_" + String.Format("{0:yyyyMMdd HHmm}", anonymisierungslauf.AnonymisierungsBeginn) + ".bak"; @@ -181,7 +188,7 @@ namespace AidA.Service.Anonymization int anzahlAnonymisierteAntraege = 0; var ansprechpartnerIds = new List(); - long antragsIdFuerAntragspersondatenEntknuepfung = Properties.Settings.Default.AntragsIdFuerAntragspersondatenEntknuepfung; + // long antragsIdFuerAntragspersondatenEntknuepfung = Properties.Settings.Default.AntragsIdFuerAntragspersondatenEntknuepfung; progressBar.Minimum = 0; progressBar.Maximum = ZuAnonymisierendeAntraege.Count; @@ -232,56 +239,51 @@ namespace AidA.Service.Anonymization { foreach (var antragsPersonenDaten in antragsPersonenDatenListe) { - bool antragsPersonenDatenNochBenoetigt = CheckAntragsPersonenDatenNochBenoetigt(antragsPersonenDaten, antrag); - if (!antragsPersonenDatenNochBenoetigt) + antragsPersonenDaten.Strasse = null; + if (antragsPersonenDaten.Plz != null && antragsPersonenDaten.Plz.Length > 2) { - antragsPersonenDaten.Strasse = null; - if (antragsPersonenDaten.Plz != null && antragsPersonenDaten.Plz.Length > 2) - { - antragsPersonenDaten.Plz = antragsPersonenDaten.Plz.Substring(0, 2); - } - antragsPersonenDaten.Ort = null; - antragsPersonenDaten.Handy = null; - antragsPersonenDaten.Telefon = null; - antragsPersonenDaten.Fax = null; - antragsPersonenDaten.Email = null; - antragsPersonenDaten.Iban = null; - antragsPersonenDaten.Bank = null; + antragsPersonenDaten.Plz = antragsPersonenDaten.Plz.Substring(0, 2); + } + antragsPersonenDaten.Ort = null; + antragsPersonenDaten.Handy = null; + antragsPersonenDaten.Telefon = null; + antragsPersonenDaten.Fax = null; + antragsPersonenDaten.Email = null; + antragsPersonenDaten.Iban = null; + antragsPersonenDaten.Bank = null; - if (antragsPersonenDaten.PersonenIdentitaet != null) - { - PersonenIdentitaet personenIdentitaet = antragsPersonenDaten.PersonenIdentitaet; - personenIdentitaet.Vorname = null; - personenIdentitaet.Nachname = null; - DateTime? gebDatum = personenIdentitaet.Geburtsdatum; - if (gebDatum != null) - { - personenIdentitaet.Geburtsdatum = new DateTime(((DateTime) gebDatum).Year, 1, 1); - } - } - - IList antragsGegenstaende = antragsPersonenDaten.AntragsGegenstaende; - foreach (var antragsGegenstand in antragsGegenstaende) - { - IList finanzTransaktionen = antragsGegenstand.FinanzTransaktionen; - foreach (var finanzTransaktion in finanzTransaktionen) - { - IList zahlungenSEPA = finanzTransaktion.ZahlungenSEPA; - foreach (var zahlungSEPA in zahlungenSEPA) - { - zahlungSEPA.Empfaenger = ""; - zahlungSEPA.IBAN = ""; - zahlungSEPA.BIC = ""; - zahlungSEPA.Verwendungszweck = ""; - } - } - } + PersonenIdentitaet personenIdentitaet = antragsPersonenDaten.PersonenIdentitaet; + bool nochBenoetigt = CheckPersonenIdentitaetNochBenoetigt(personenIdentitaet, antrag); + if (nochBenoetigt) + { + antragsPersonenDaten.PersonenIdentitaet = anonymisiertePersonenIdentitaeten[antragsPersonenDaten.Id]; } else { - // Antragspersonendaten werden noch benoetigt, aber wir entknuepfen sie vom zu anoynisierenden Antrag - // weil die AntragsId nicht geloescht werden kann, biegen wir sie um auf die eines dafuer konfigurierten (Test-) Auftrags - antragsPersonenDaten.AntragsId = antragsIdFuerAntragspersondatenEntknuepfung; + personenIdentitaet.Vorname = "Anonymisierte"; + personenIdentitaet.Nachname = "Person"; + DateTime? geburtsdatum = personenIdentitaet.Geburtsdatum; + if (geburtsdatum != null) + { + personenIdentitaet.Geburtsdatum = new DateTime(((DateTime)geburtsdatum).Year, 1, 1); + } + } + + IList antragsGegenstaende = antragsPersonenDaten.AntragsGegenstaende; + foreach (var antragsGegenstand in antragsGegenstaende) + { + IList finanzTransaktionen = antragsGegenstand.FinanzTransaktionen; + foreach (var finanzTransaktion in finanzTransaktionen) + { + IList zahlungenSEPA = finanzTransaktion.ZahlungenSEPA; + foreach (var zahlungSEPA in zahlungenSEPA) + { + zahlungSEPA.Empfaenger = ""; + zahlungSEPA.IBAN = ""; + zahlungSEPA.BIC = ""; + zahlungSEPA.Verwendungszweck = ""; + } + } } } } @@ -296,7 +298,7 @@ namespace AidA.Service.Anonymization anonymisierungslauf.AnzahlAnonymisierteAntraege = anzahlAnonymisierteAntraege; anonymisierungslauf.AnonymisierungsEnde = DateTime.Now; - + Database.SaveAnonymisierungslaufDurchfuehrung(anonymisierungslauf, ZuAnonymisierendeAntraege, UserName); } @@ -354,6 +356,29 @@ namespace AidA.Service.Anonymization } } + private void UpdatePersonenIdentitaetDictionary(Antrag antrag) + { + IList antragsPersonenDatenListe = antrag.AntragsPersonenDatenListe; + if (antragsPersonenDatenListe != null) + { + foreach (var antragsPersonenDaten in antragsPersonenDatenListe) + { + PersonenIdentitaet personenIdentitaet = antragsPersonenDaten.PersonenIdentitaet; + if (personenIdentitaet != null) + { + if (PersonenIdentitaetDictionary.ContainsKey(personenIdentitaet.Id)) + { + PersonenIdentitaetDictionary[personenIdentitaet.Id].Add(antrag); + } + else + { + PersonenIdentitaetDictionary.Add(personenIdentitaet.Id, new List { antrag }); + } + } + } + } + } + /** * Prueft, ob der Ansprechpartner eines Antrags noch fuer andere Antraege benoetigt wird */ @@ -417,5 +442,103 @@ namespace AidA.Service.Anonymization } return nochBenoetigt; } + + /** + * Prueft, ob eine PersonenIdentitaet eines Antrags noch fuer andere Antraege benoetigt wird + */ + private bool CheckPersonenIdentitaetNochBenoetigt(PersonenIdentitaet personenIdentitaet, Antrag antrag) + { + bool nochBenoetigt = false; + if (PersonenIdentitaetDictionary.ContainsKey(personenIdentitaet.Id)) + { + var personenIdentitaetAntraege = PersonenIdentitaetDictionary[personenIdentitaet.Id]; + + if (personenIdentitaetAntraege != null && personenIdentitaetAntraege.Count > 1) + { + foreach (var personenIdentitaetAntrag in personenIdentitaetAntraege) + { + if (personenIdentitaetAntrag.Id != antrag.Id) + { + var zuAnonymisieren = ZuAnonymisierendeAntraege.FirstOrDefault(a => a.Id.Equals(personenIdentitaetAntrag.Id)); + if (zuAnonymisieren is null) + { + var schonAnonymisiert = Anonymisierungen.FirstOrDefault(a => a.AntragsId.Equals(personenIdentitaetAntrag.Id)); + if (schonAnonymisiert is null) + { + nochBenoetigt = true; + } + } + } + } + } + } + return nochBenoetigt; + } + + /** + * Bereitet fuer die zu anonymisierenden Antraege anonymisierte PersonenIdentitaeten vor. + * Sucht erst in der Datenbank. Nicht vorhandene Eintraege werden erzeugt und in der Datenbank gespeichert. + */ + private Dictionary AnonymisiertePersonenIdentitaetenVorbereiten() + { + string vorname = "Anonymisierte"; + string nachname = "Personenidentität"; + IList dbAnonymisiertePersonen = Database.GetPersonenIdentitaeten(vorname, nachname); + Dictionary neuAnonymisiertePersonen = new Dictionary(); + Dictionary anonymisiertePersonenFuerAntragsPersonenDaten = new Dictionary(); + + foreach (var antrag in ZuAnonymisierendeAntraege) + { + IList antragsPersonenDatenListe = antrag.AntragsPersonenDatenListe; + if (antragsPersonenDatenListe != null) + { + foreach (var antragsPersonenDaten in antragsPersonenDatenListe) + { + PersonenIdentitaet anonymisiertePersonenIdentitaet = null; + DateTime anonymisiertesDatum; + + DateTime? geburtsdatum = antragsPersonenDaten.PersonenIdentitaet.Geburtsdatum; + if (geburtsdatum != null) + { + anonymisiertesDatum = new DateTime(((DateTime)geburtsdatum).Year, 1, 1); + } + else + { + // bei Geburtsdatum null anonymisieren wir auf den 1.1.0042 + anonymisiertesDatum = new DateTime(42, 1, 1); + } + + foreach (var pi in dbAnonymisiertePersonen.Where(p => p.Geburtsdatum == anonymisiertesDatum)) + { + // es kann nur eine wie hier anonymisierte Person pro Jahrgang geben + anonymisiertePersonenIdentitaet = pi; + } + + if (anonymisiertePersonenIdentitaet is null) + { + if (neuAnonymisiertePersonen.ContainsKey(anonymisiertesDatum)) + { + anonymisiertePersonenIdentitaet = neuAnonymisiertePersonen[anonymisiertesDatum]; + } + else + { + anonymisiertePersonenIdentitaet = new PersonenIdentitaet(); + anonymisiertePersonenIdentitaet.Vorname = vorname; + anonymisiertePersonenIdentitaet.Nachname = nachname; + anonymisiertePersonenIdentitaet.Geburtsdatum = anonymisiertesDatum; + anonymisiertePersonenIdentitaet.Version = 1; + + Database.InsertPersonenIdentitaet(anonymisiertePersonenIdentitaet); + neuAnonymisiertePersonen.Add(anonymisiertesDatum, anonymisiertePersonenIdentitaet); + } + } + + anonymisiertePersonenFuerAntragsPersonenDaten.Add(antragsPersonenDaten.Id, anonymisiertePersonenIdentitaet); + } + } + } + + return anonymisiertePersonenFuerAntragsPersonenDaten; + } } }