Personenidentitäten entknüpfen (statt vorher Antragspersondaten), Personenidentitäten zum Entknüpfen vorher in getrennter DB-Transaktion erzeugen
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user