Personenidentitäten entknüpfen (statt vorher Antragspersondaten), Personenidentitäten zum Entknüpfen vorher in getrennter DB-Transaktion erzeugen

This commit is contained in:
2025-05-18 20:58:28 +02:00
parent 6b3dc2474d
commit 57ee7925e1
2 changed files with 218 additions and 53 deletions

View File

@@ -165,8 +165,9 @@ namespace AidA.Data
{
var c = HibernateHelper.GetCurrentSession().CreateCriteria<Antrag>().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<Antrag>) c.UniqueResult();
}
public static PersonenIdentitaet GetPersonenIdentitaet(string vorname, string nachname, DateTime? geburtsdatum)
{
var criteria = HibernateHelper.GetCurrentSession().CreateCriteria<PersonenIdentitaet>()
.Add(Restrictions.Eq("Vorname", vorname))
.Add(Restrictions.Eq("Nachname", nachname))
.Add(Restrictions.Eq("Geburtsdatum", geburtsdatum));
return (PersonenIdentitaet) criteria.UniqueResult();
}
public static IList<PersonenIdentitaet> GetPersonenIdentitaeten(string vorname, string nachname)
{
var criteria = HibernateHelper.GetCurrentSession().CreateCriteria<PersonenIdentitaet>()
.Add(Restrictions.Eq("Vorname", vorname))
.Add(Restrictions.Eq("Nachname", nachname));
return criteria.List<PersonenIdentitaet>();
}
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;
}
}
}

View File

@@ -13,6 +13,8 @@ namespace AidA.Service.Anonymization
private Dictionary<long, IList<Antrag>> AntragsPersonenDatenDictionary;
private Dictionary<long, IList<Antrag>> PersonenIdentitaetDictionary;
private IList<Antrag> ZuAnonymisierendeAntraege;
private IList<Anonymisierung> Anonymisierungen;
@@ -45,7 +47,8 @@ namespace AidA.Service.Anonymization
ZuAnonymisierendeAntraege = new List<Antrag>();
AnsprechpartnerDictionary = new Dictionary<long, IList<Antrag>>();
AntragsPersonenDatenDictionary = new Dictionary<long, IList<Antrag>>();
// AntragsPersonenDatenDictionary = new Dictionary<long, IList<Antrag>>();
PersonenIdentitaetDictionary = new Dictionary<long, IList<Antrag>>();
Anonymisierungen = Database.GetAll<Anonymisierung>();
Anonymisierungsausnahmen = Database.GetAll<Anonymisierungsausnahme>();
@@ -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<long, PersonenIdentitaet> 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>();
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<AntragsGegenstand> antragsGegenstaende = antragsPersonenDaten.AntragsGegenstaende;
foreach (var antragsGegenstand in antragsGegenstaende)
{
IList<FinanzTransaktion> finanzTransaktionen = antragsGegenstand.FinanzTransaktionen;
foreach (var finanzTransaktion in finanzTransaktionen)
{
IList<ZahlungSEPA> 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<AntragsGegenstand> antragsGegenstaende = antragsPersonenDaten.AntragsGegenstaende;
foreach (var antragsGegenstand in antragsGegenstaende)
{
IList<FinanzTransaktion> finanzTransaktionen = antragsGegenstand.FinanzTransaktionen;
foreach (var finanzTransaktion in finanzTransaktionen)
{
IList<ZahlungSEPA> 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<AntragsPersonenDaten> 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> { 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<long, PersonenIdentitaet> AnonymisiertePersonenIdentitaetenVorbereiten()
{
string vorname = "Anonymisierte";
string nachname = "Personenidentität";
IList<PersonenIdentitaet> dbAnonymisiertePersonen = Database.GetPersonenIdentitaeten(vorname, nachname);
Dictionary<DateTime, PersonenIdentitaet> neuAnonymisiertePersonen = new Dictionary<DateTime, PersonenIdentitaet>();
Dictionary<long, PersonenIdentitaet> anonymisiertePersonenFuerAntragsPersonenDaten = new Dictionary<long, PersonenIdentitaet>();
foreach (var antrag in ZuAnonymisierendeAntraege)
{
IList<AntragsPersonenDaten> 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;
}
}
}