commit 8a50dd801ca7f44f20bcf9d81137353d688e3395 Author: Kojo Date: Tue Apr 29 18:47:00 2025 +0200 Initialer Stand diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bcf6c9c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/AidA/bin +/AidA/obj +/.vs diff --git a/AidA.sln b/AidA.sln new file mode 100644 index 0000000..4970db3 --- /dev/null +++ b/AidA.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.33214.272 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AidA", "AidA\AidA.csproj", "{108F9587-86B7-416F-B3B2-875C4396A4E2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {108F9587-86B7-416F-B3B2-875C4396A4E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {108F9587-86B7-416F-B3B2-875C4396A4E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {108F9587-86B7-416F-B3B2-875C4396A4E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {108F9587-86B7-416F-B3B2-875C4396A4E2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D3FBE47C-2063-41E8-8636-D5D35BB3FFDE} + EndGlobalSection +EndGlobal diff --git a/AidA/AidA.csproj b/AidA/AidA.csproj new file mode 100644 index 0000000..94313be --- /dev/null +++ b/AidA/AidA.csproj @@ -0,0 +1,257 @@ + + + + + Debug + AnyCPU + {108F9587-86B7-416F-B3B2-875C4396A4E2} + WinExe + AidA + AidA + v4.7.2 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + true + true + false + C:\tmp\AidaDeploy\ + true + Disk + false + Foreground + 7 + Days + false + false + false + true + 4 + 1.0.0.%2a + false + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + 113DC5DAEB8BF5A0067D354B9F6C1E3EC7AD3857 + + + AidA_TemporaryKey.pfx + + + true + + + true + + + + ..\packages\Antlr3.Runtime.3.5.1\lib\net40-client\Antlr3.Runtime.dll + + + + + + + + + + + + + + + + + + + ..\packages\Iesi.Collections.4.0.4\lib\net461\Iesi.Collections.dll + + + ..\packages\NHibernate.5.5.2\lib\net461\NHibernate.dll + + + ..\packages\Remotion.Linq.2.2.0\lib\net45\Remotion.Linq.dll + + + ..\packages\Remotion.Linq.EagerFetching.2.2.0\lib\net45\Remotion.Linq.EagerFetching.dll + + + + + + + + + + + + + + + + + 4.0 + + + + + + + + + + MSBuild:Compile + Designer + + + + + + + + + + + + + + + + AnonymisierungsAusnahmenWindow.xaml + + + + + AnonymisierungslaufDetailWindow.xaml + + + AnonymisierungslaufVorbereitenWindow.xaml + + + LoginWindow.xaml + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + App.xaml + Code + + + + + + + + + + + MainWindow.xaml + Code + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + + + + + + + + + + + + + + + + + + + + Always + + + + + False + Microsoft .NET Framework 4.7.2 %28x86 und x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + \ No newline at end of file diff --git a/AidA/AidA.csproj.user b/AidA/AidA.csproj.user new file mode 100644 index 0000000..120f1ed --- /dev/null +++ b/AidA/AidA.csproj.user @@ -0,0 +1,17 @@ + + + + ShowAllFiles + C:\tmp\AidaDeploy\|C:\tmp\ + + + + + + de-DE + false + + + false + + \ No newline at end of file diff --git a/AidA/AidA_TemporaryKey.pfx b/AidA/AidA_TemporaryKey.pfx new file mode 100644 index 0000000..58026ed Binary files /dev/null and b/AidA/AidA_TemporaryKey.pfx differ diff --git a/AidA/App.config b/AidA/App.config new file mode 100644 index 0000000..4e5c81b --- /dev/null +++ b/AidA/App.config @@ -0,0 +1,21 @@ + + + + +
+ + + + + + + + + c:/tmp/ + + + 83730 + + + + \ No newline at end of file diff --git a/AidA/App.xaml b/AidA/App.xaml new file mode 100644 index 0000000..341c662 --- /dev/null +++ b/AidA/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/AidA/App.xaml.cs b/AidA/App.xaml.cs new file mode 100644 index 0000000..eba2f48 --- /dev/null +++ b/AidA/App.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace AidA +{ + /// + /// Interaktionslogik für "App.xaml" + /// + public partial class App : Application + { + } +} diff --git a/AidA/Data/Database.cs b/AidA/Data/Database.cs new file mode 100644 index 0000000..eb9d89a --- /dev/null +++ b/AidA/Data/Database.cs @@ -0,0 +1,238 @@ +using AidA.Data.Entities; +using NHibernate; +using NHibernate.Criterion; +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Windows; + +namespace AidA.Data +{ + public class Database + { + public static IList GetAll() where T : class + { + return HibernateHelper.GetCurrentSession().CreateCriteria().List(); + } + + public static void InsertAnonymisierungslauf(Anonymisierungslauf anonymisierungslauf, string user) + { + ISession session = HibernateHelper.GetCurrentSession(); + ITransaction transaction = session.BeginTransaction(); + anonymisierungslauf.InsTs = DateTime.Now; + anonymisierungslauf.InsUser = user; + try + { + session.Save(anonymisierungslauf); + transaction.Commit(); + } + catch (Exception ex) + { + transaction.Rollback(); + throw ex; + } + } + + public static void UpdateAnonymisierungslauf(Anonymisierungslauf anonymisierungslauf, string user) + { + ISession session = HibernateHelper.GetCurrentSession(); + ITransaction transaction = session.BeginTransaction(); + anonymisierungslauf.UpdTs = DateTime.Now; + anonymisierungslauf.UpdUser = user; + try + { + session.Save(anonymisierungslauf); + transaction.Commit(); + } + catch (Exception ex) + { + transaction.Rollback(); + throw ex; + } + } + + public static void SaveAnonymisierungslaufDurchfuehrung(Anonymisierungslauf anonymisierungslauf, IList ZuAnonymisierendeAntraege, string user) + { + ISession session = HibernateHelper.GetCurrentSession(); + ITransaction transaction = session.BeginTransaction(); + + DateTime ts = DateTime.Now; + anonymisierungslauf.UpdTs = ts; + anonymisierungslauf.UpdUser = user; + bool dbGesichert = false; + + try + { + ErstelleDbSicherheitsKopie(anonymisierungslauf.Sicherung); + dbGesichert = true; + } + catch (Exception ex) + { + transaction.Rollback(); + var text = "Fehler beim Erstellen der Datenbanksicherung:\n\n" + + ex.Message + "\n\n" + + "Anonymisierungsdaten werden nicht gespeichert!\n" + + "Bitte Rechte des Datenbankbenutzers prüfen."; + MessageBox.Show(text, "Erstellen der Datenbanksicherung fehlgeschlagen", MessageBoxButton.OK, MessageBoxImage.Error); + anonymisierungslauf.Sicherung = null; + anonymisierungslauf.AnzahlAnonymisierteAntraege = 0; + } + + if (dbGesichert) + { + try + { + foreach (var anonymisierung in anonymisierungslauf.Anonymisierungen) + { + session.Save(anonymisierung); + anonymisierung.InsTs = ts; + anonymisierung.InsUser = user; + } + foreach (var antrag in ZuAnonymisierendeAntraege) + { + foreach (var kommunikation in antrag.Kommunikationen) + { + session.Delete(kommunikation); + } + session.Save(antrag); + } + session.SaveOrUpdate(anonymisierungslauf); + transaction.Commit(); + } + catch (Exception ex) + { + transaction.Rollback(); + var text = "Fehler beim Speichern der Anonymisierungsdaten:\n\n" + ex.Message; + MessageBox.Show(text, "Speichern der Anonymisierungsdaten fehlgeschlagen", MessageBoxButton.OK, MessageBoxImage.Error); + anonymisierungslauf.AnzahlAnonymisierteAntraege = 0; + } + } + } + + public static void InsertAnonymisierung(Anonymisierung anonymisierung, String user) + { + ISession session = HibernateHelper.GetCurrentSession(); + ITransaction transaction = session.BeginTransaction(); + anonymisierung.InsTs = DateTime.Now; + anonymisierung.InsUser = user; + try + { + session.Save(anonymisierung); + transaction.Commit(); + } + catch (Exception ex) + { + transaction.Rollback(); + throw ex; + } + } + + public static void InsertAnonymisierungsausnahme(Anonymisierungsausnahme anonymisierungsausnahme, String user) + { + ISession session = HibernateHelper.GetCurrentSession(); + ITransaction transaction = session.BeginTransaction(); + anonymisierungsausnahme.InsTs = DateTime.Now; + anonymisierungsausnahme.InsUser = user; + try + { + session.Save(anonymisierungsausnahme); + transaction.Commit(); + } + catch (Exception ex) + { + transaction.Rollback(); + throw ex; + } + } + + public static void DeleteAnonymisierungsausnahme(Anonymisierungsausnahme anonymisierungsausnahme) + { + ISession session = HibernateHelper.GetCurrentSession(); + ITransaction transaction = session.BeginTransaction(); + try + { + session.Delete(anonymisierungsausnahme); + transaction.Commit(); + } + catch (Exception ex) + { + transaction.Rollback(); + throw ex; + } + } + + public static long GetAntragsIdForAntragsNummer(long antragsNummer) + { + var c = HibernateHelper.GetCurrentSession().CreateCriteria().Add(Restrictions.Eq("AntragsNummer", antragsNummer)); + Antrag antrag = (Antrag)c.UniqueResult(); + + return antrag.Id; + } + + public static AntragsStatus GetAntragsStatus(long antragsStatusId) + { + var c = HibernateHelper.GetCurrentSession().CreateCriteria().Add(Restrictions.Eq("Id", antragsStatusId)); + + return (AntragsStatus) c.UniqueResult(); + } + + public static Anonymisierung GetAnonymisierungForAntrag(long antragsId) + { + var c = HibernateHelper.GetCurrentSession().CreateCriteria().Add(Restrictions.Eq("AntragsId", antragsId)); + + return (Anonymisierung) c.UniqueResult(); + } + + public static IList GetAntraegeForAnsprechpartner (Ansprechpartner ansprechpartner) + { + var c = HibernateHelper.GetCurrentSession().CreateCriteria().Add(Restrictions.Eq("Ansprechpartner", ansprechpartner)); + + return (IList) c.UniqueResult(); + } + + public static void ErstelleDbSicherheitsKopie(string dateiName) + { + const string query = @"BACKUP DATABASE @db TO DISK = @file;"; + String dbBackupVerzeichnis = Properties.Settings.Default.DbBackupVerzeichnis; + + SqlConnection sqlConnection = new SqlConnection(HibernateHelper.GetConnectString()); + + SqlCommand sqlCommand = new SqlCommand(query, sqlConnection); + sqlCommand.Parameters.AddWithValue("@db", "aida-dev"); + sqlCommand.Parameters.AddWithValue("@file", dbBackupVerzeichnis + dateiName); + + sqlConnection.Open(); + int result = sqlCommand.ExecuteNonQuery(); + sqlConnection.Close(); + } + + public static void DbSichern(String dateiname) + { + String dbBackupVerzeichnis = Properties.Settings.Default.DbBackupVerzeichnis; + + ISession session = HibernateHelper.GetCurrentSession(); + + const string query = @"BACKUP DATABASE @db TO DISK = @file;"; + + SqlConnection sqlConnection = new SqlConnection(HibernateHelper.GetConnectString()); + + SqlCommand sqlCommand = new SqlCommand(query, sqlConnection); + sqlCommand.Parameters.AddWithValue("@db", "aida-dev"); + sqlCommand.Parameters.AddWithValue("@file", dateiname); + + sqlConnection.Open(); + try + { + int result = sqlCommand.ExecuteNonQuery(); + sqlConnection.Close(); + MessageBox.Show("Datenbank gesichert nach \n\n" + dateiname, "Datenbank gesichert", MessageBoxButton.OK); + } + catch (Exception ex) + { + var text = "Fehler beim Erstellen der Datenbanksicherung:\n\n" + ex.Message + "\n\n" + ex.StackTrace; + MessageBox.Show(text, "Erstellen der Datenbanksicherung fehlgeschlagen", MessageBoxButton.OK, MessageBoxImage.Error); + sqlConnection.Close(); + } + } + } +} diff --git a/AidA/Data/Entities/Anonymisierung.cs b/AidA/Data/Entities/Anonymisierung.cs new file mode 100644 index 0000000..55fc088 --- /dev/null +++ b/AidA/Data/Entities/Anonymisierung.cs @@ -0,0 +1,20 @@ +using System; + +namespace AidA.Data.Entities +{ + public class Anonymisierung + { + public virtual long Id { get; set; } + public virtual int Aufbewahrungsfrist { get; set; } + public virtual long AntragsNummer { get; set; } + public virtual string Bemerkung { get; set; } + public virtual DateTime? InsTs { get; set; } + public virtual string InsUser { get; set; } + public virtual DateTime? UpdTs { get; set; } + public virtual string UpdUser { get; set; } + + + public virtual long AntragsId { get; set; } + public virtual long AnonymisierungslaufId { get; set; } + } +} diff --git a/AidA/Data/Entities/Anonymisierungsausnahme.cs b/AidA/Data/Entities/Anonymisierungsausnahme.cs new file mode 100644 index 0000000..2f689c4 --- /dev/null +++ b/AidA/Data/Entities/Anonymisierungsausnahme.cs @@ -0,0 +1,13 @@ +using System; + +namespace AidA.Data.Entities +{ + public class Anonymisierungsausnahme + { + public virtual long Id { get; set; } + public virtual long AntragsNummer { get; set; } + public virtual long AntragsId { get; set; } + public virtual DateTime? InsTs { get; set; } + public virtual string InsUser { get; set; } + } +} diff --git a/AidA/Data/Entities/Anonymisierungslauf.cs b/AidA/Data/Entities/Anonymisierungslauf.cs new file mode 100644 index 0000000..85d94fe --- /dev/null +++ b/AidA/Data/Entities/Anonymisierungslauf.cs @@ -0,0 +1,59 @@ +using AidA.Data.ViewModel; +using System; +using System.Collections.Generic; + +namespace AidA.Data.Entities +{ + public class Anonymisierungslauf + { + public virtual long Id { get; set; } + public virtual int Aufbewahrungsfrist { get; set; } + public virtual string Sicherung { get; set; } + public virtual DateTime? PruefBeginn { get; set; } + public virtual DateTime? PruefEnde { get; set; } + public virtual string PruefUser { get; set; } + public virtual int AnzahlGepruefteAntraege { get; set; } + public virtual int AnzahlBereitsAnonymisierteAntraege { get; set; } + public virtual int AnzahlAusgenommeneAntraege { get; set; } + public virtual int AnzahlNochAufzubewahrendeAntraege { get; set; } + public virtual int AnzahlZuAnonymisierendeAntraege { get; set; } + public virtual DateTime? AnonymisierungsBeginn { get; set; } + public virtual DateTime? AnonymisierungsEnde { get; set; } + public virtual string AnonymisierungsUser { get; set; } + public virtual int AnzahlAnonymisierteAntraege { get; set; } + public virtual string Bemerkung { get; set; } + public virtual DateTime? InsTs { get; set; } + public virtual string InsUser { get; set; } + public virtual DateTime? UpdTs { get; set; } + public virtual string UpdUser { get; set; } + + public virtual IList Anonymisierungen { get; set; } + + public Anonymisierungslauf() + { + + } + + public Anonymisierungslauf(AnonymisierungslaufVM vm) + { + Aufbewahrungsfrist = vm.Aufbewahrungsfrist; + + PruefBeginn = vm.PruefBeginn; + PruefEnde = vm.PruefEnde; + PruefUser = vm.PruefUser; + AnzahlGepruefteAntraege = vm.AnzahlGepruefteAntraege; + AnzahlBereitsAnonymisierteAntraege = vm.AnzahlBereitsAnonymisierteAntraege; + AnzahlAusgenommeneAntraege = vm.AnzahlAusgenommeneAntraege; + AnzahlNochAufzubewahrendeAntraege = vm.AnzahlNochAufzubewahrendeAntraege; + AnzahlZuAnonymisierendeAntraege = vm.AnzahlZuAnonymisierendeAntraege; + + AnonymisierungsBeginn = vm.AnonymisierungsBeginn; + AnonymisierungsEnde = vm.AnonymisierungsEnde; + AnonymisierungsUser = vm.AnonymisierungsUser; + AnzahlAnonymisierteAntraege = vm.AnzahlAnonymisierteAntraege; + + Bemerkung = vm.Bemerkung; + } + + } +} diff --git a/AidA/Data/Entities/Ansprechpartner.cs b/AidA/Data/Entities/Ansprechpartner.cs new file mode 100644 index 0000000..8f22977 --- /dev/null +++ b/AidA/Data/Entities/Ansprechpartner.cs @@ -0,0 +1,16 @@ + +namespace AidA.Data.Entities +{ + public class Ansprechpartner + { + public virtual long Id { get; set; } + public virtual string Vorname { get; set; } + public virtual string Nachname { get; set; } + public virtual string Abteilung { get; set; } + public virtual bool Aktiv { get; set; } + public virtual long Version { get; set; } + + public virtual Beratungsstelle Beratungsstelle { get; set; } + public virtual KontaktInfo KontaktInfo { get; set; } + } +} diff --git a/AidA/Data/Entities/Antrag.cs b/AidA/Data/Entities/Antrag.cs new file mode 100644 index 0000000..cb26f5f --- /dev/null +++ b/AidA/Data/Entities/Antrag.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; + +namespace AidA.Data.Entities +{ + public class Antrag + { + public virtual long Id { get; set; } + public virtual long AntragsNummer { get; set; } + public virtual bool Prio { get; set; } + public virtual DateTime? EingangsDatum { get; set; } + public virtual DateTime? FaelligkeitsDatum { get; set; } + public virtual int BewilligungsJahr { get; set; } + public virtual bool Wiedervorlage { get; set; } + public virtual string Bemerkung { get; set; } + public virtual string Memo { get; set; } + public virtual long Version { get; set; } + public virtual bool Aktualisiert { get; set; } + + public virtual long? SachbearbeiterId { get; set; } + + public virtual AntragsStatus AntragsStatus { get; set; } + public virtual Ansprechpartner Ansprechpartner { get; set; } + public virtual IList AntragsPersonenDatenListe { get; set; } + public virtual IList Kommunikationen { get; set; } + + public virtual IList Anonymisierungen { get; set; } + + } +} diff --git a/AidA/Data/Entities/AntragsGegenstand.cs b/AidA/Data/Entities/AntragsGegenstand.cs new file mode 100644 index 0000000..905e8f0 --- /dev/null +++ b/AidA/Data/Entities/AntragsGegenstand.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace AidA.Data.Entities +{ + public class AntragsGegenstand + { + public virtual long Id { get; set; } + public virtual string Gegenstand { get; set; } + public virtual decimal? BetragBeantragt { get; set; } + public virtual DateTime? BeantragtTimestamp { get; set; } + public virtual decimal? BetragBewilligt { get; set; } + public virtual DateTime? BewilligtTimestamp { get; set; } + public virtual bool Darlehen { get; set; } + public virtual DateTime? GeaendertDurchTimestamp { get; set; } + public virtual string Bemerkung { get; set; } + public virtual long Version { get; set; } + + public virtual AntragsPersonenDaten AntragsPersoenenDaten { get; set; } + public virtual IList FinanzTransaktionen { get; set; } + } +} diff --git a/AidA/Data/Entities/AntragsPersonenDaten.cs b/AidA/Data/Entities/AntragsPersonenDaten.cs new file mode 100644 index 0000000..afcf072 --- /dev/null +++ b/AidA/Data/Entities/AntragsPersonenDaten.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; + +namespace AidA.Data.Entities +{ + public class AntragsPersonenDaten + { + public virtual long Id { get; set; } + public virtual string Strasse { get; set; } + public virtual string Plz { get; set; } + public virtual string Ort { get; set; } + public virtual string Telefon { get; set; } + public virtual string Email { get; set; } + public virtual string Handy { get; set; } + public virtual string Fax { get; set; } + public virtual string Iban { get; set; } + public virtual string Bank { get; set; } + public virtual bool AussergewoehnlGehBehinderung { get; set; } + public virtual bool HilflosNachESTG { get; set; } + public virtual bool Blind { get; set; } + public virtual bool Gehoerlos { get; set; } + public virtual bool RundfunkbeitragsErmaessigung { get; set; } + public virtual bool BegleitPersonÖffentlVerkehrsmittel { get; set; } + public virtual bool ErhebBeeintrBewStrassenVerkehr { get; set; } + public virtual bool PsychischeErkrankung { get; set; } + public virtual long Version { get; set; } + + public virtual long AntragsId { get; set; } + + public virtual IList AntragsGegenstaende { get; set; } + public virtual PersonenIdentitaet PersonenIdentitaet { get; set; } + + } +} diff --git a/AidA/Data/Entities/AntragsStatus.cs b/AidA/Data/Entities/AntragsStatus.cs new file mode 100644 index 0000000..c172523 --- /dev/null +++ b/AidA/Data/Entities/AntragsStatus.cs @@ -0,0 +1,10 @@ + +namespace AidA.Data.Entities +{ + public class AntragsStatus + { + public virtual long Id { get; set; } + public virtual string Name { get; set; } + public virtual long Version { get; set; } + } +} diff --git a/AidA/Data/Entities/Beratungsstelle.cs b/AidA/Data/Entities/Beratungsstelle.cs new file mode 100644 index 0000000..b3377bc --- /dev/null +++ b/AidA/Data/Entities/Beratungsstelle.cs @@ -0,0 +1,13 @@ + +namespace AidA.Data.Entities +{ + public class Beratungsstelle + { + public virtual long Id { get; set; } + public virtual string Name1 { get; set; } + public virtual string Name2 { get; set; } + public virtual long Version { get; set; } + + public virtual KontaktInfo KontaktInfo { get; set; } + } +} diff --git a/AidA/Data/Entities/FinanzTransaktion.cs b/AidA/Data/Entities/FinanzTransaktion.cs new file mode 100644 index 0000000..2885bf7 --- /dev/null +++ b/AidA/Data/Entities/FinanzTransaktion.cs @@ -0,0 +1,19 @@ + +using System; +using System.Collections.Generic; + +namespace AidA.Data.Entities +{ + public class FinanzTransaktion + { + public virtual long Id { get; set; } + public virtual decimal Betrag { get; set; } + public virtual DateTime? AuszugsDatum { get; set; } + public virtual DateTime? ErfassungsTimestamp { get; set; } + public virtual string Bemerkung { get; set; } + public virtual long Version { get; set; } + + public virtual IList ZahlungenSEPA { get; set; } + + } +} diff --git a/AidA/Data/Entities/Kommunikation.cs b/AidA/Data/Entities/Kommunikation.cs new file mode 100644 index 0000000..7f29a3f --- /dev/null +++ b/AidA/Data/Entities/Kommunikation.cs @@ -0,0 +1,14 @@ + +using System; + +namespace AidA.Data.Entities +{ + public class Kommunikation + { + public virtual long Id { get; set; } + public virtual DateTime? Datum { get; set; } + public virtual string Beschreibung { get; set; } + public virtual string Inhalt { get; set; } + public virtual long Version { get; set; } + } +} diff --git a/AidA/Data/Entities/KontaktInfo.cs b/AidA/Data/Entities/KontaktInfo.cs new file mode 100644 index 0000000..a5c9a3b --- /dev/null +++ b/AidA/Data/Entities/KontaktInfo.cs @@ -0,0 +1,14 @@ + +namespace AidA.Data.Entities +{ + public class KontaktInfo + { + public virtual long Id { get; set; } + public virtual string Telefon { get; set; } + public virtual string Handy { get; set; } + public virtual string Fax { get; set; } + public virtual string Email { get; set; } + public virtual string Internet { get; set; } + public virtual long Version { get; set; } + } +} diff --git a/AidA/Data/Entities/Mitarbeiter.cs b/AidA/Data/Entities/Mitarbeiter.cs new file mode 100644 index 0000000..350354d --- /dev/null +++ b/AidA/Data/Entities/Mitarbeiter.cs @@ -0,0 +1,16 @@ + +namespace AidA.Data.Entities +{ + public class Mitarbeiter + { + public virtual long Id { get; set; } + public virtual string Vorname { get; set; } + public virtual string Nachname { get; set; } + public virtual string Telefon { get; set; } + public virtual string Email { get; set; } + public virtual string Anmeldename { get; set; } + public virtual bool Aktiv { get; set; } + public virtual string Sprechzeit { get; set; } + public virtual long Version { get; set; } + } +} diff --git a/AidA/Data/Entities/PersonenIdentitaet.cs b/AidA/Data/Entities/PersonenIdentitaet.cs new file mode 100644 index 0000000..14f7caf --- /dev/null +++ b/AidA/Data/Entities/PersonenIdentitaet.cs @@ -0,0 +1,13 @@ +using System; + +namespace AidA.Data.Entities +{ + public class PersonenIdentitaet + { + public virtual long Id { get; set; } + public virtual string Vorname { get; set; } + public virtual string Nachname { get; set; } + public virtual DateTime? Geburtsdatum { get; set; } + public virtual long Version { get; set; } + } +} diff --git a/AidA/Data/Entities/ZahlungSEPA.cs b/AidA/Data/Entities/ZahlungSEPA.cs new file mode 100644 index 0000000..f3171be --- /dev/null +++ b/AidA/Data/Entities/ZahlungSEPA.cs @@ -0,0 +1,13 @@ + +namespace AidA.Data.Entities +{ + public class ZahlungSEPA + { + public virtual long Id { get; set; } + public virtual string Empfaenger { get; set; } + public virtual string IBAN { get; set; } + public virtual string BIC { get; set; } + public virtual string Verwendungszweck { get; set; } + public virtual long Version { get; set; } + } +} diff --git a/AidA/Data/HibernateHelper.cs b/AidA/Data/HibernateHelper.cs new file mode 100644 index 0000000..443df7b --- /dev/null +++ b/AidA/Data/HibernateHelper.cs @@ -0,0 +1,65 @@ +using NHibernate; +using NHibernate.Cfg; +using System.Collections.Generic; + +namespace AidA.Data +{ + public sealed class HibernateHelper + { + private static ISession CurrentSession; + private static ISessionFactory SessionFactory; + + private static string ConnectString; + + static HibernateHelper() + { + } + + public static ISession GetCurrentSession() + { + if (CurrentSession == null) + { + CurrentSession = SessionFactory.OpenSession(); + } + + return CurrentSession; + } + + public static void CloseSession() + { + if (CurrentSession == null) + { + // No current session + return; + } + + CurrentSession.Close(); + } + + public static void CloseSessionFactory() + { + if (SessionFactory != null) + { + SessionFactory.Close(); + } + } + + public static string GetConnectString() + { + return ConnectString; + } + + public static void Connect(string databaseUserName, string password) + { + Configuration configuration = new Configuration().Configure(); + + IDictionary properties = configuration.Properties; + ConnectString = new Configuration().Configure().GetProperty("connection.connection_string"); + ConnectString = ConnectString.Replace("userId", databaseUserName); + ConnectString = ConnectString.Replace("userPwd", password); + configuration.SetProperty("connection.connection_string", ConnectString); + + SessionFactory = configuration.BuildSessionFactory(); + } + } +} \ No newline at end of file diff --git a/AidA/Data/Mappings/Anonymisierung.hbm.xml b/AidA/Data/Mappings/Anonymisierung.hbm.xml new file mode 100644 index 0000000..fd05707 --- /dev/null +++ b/AidA/Data/Mappings/Anonymisierung.hbm.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/Anonymisierungsausnahme.hbm.xml b/AidA/Data/Mappings/Anonymisierungsausnahme.hbm.xml new file mode 100644 index 0000000..396a06f --- /dev/null +++ b/AidA/Data/Mappings/Anonymisierungsausnahme.hbm.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/Anonymisierungslauf.hbm.xml b/AidA/Data/Mappings/Anonymisierungslauf.hbm.xml new file mode 100644 index 0000000..be56eb0 --- /dev/null +++ b/AidA/Data/Mappings/Anonymisierungslauf.hbm.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/Ansprechpartner.hbm.xml b/AidA/Data/Mappings/Ansprechpartner.hbm.xml new file mode 100644 index 0000000..54ee1e7 --- /dev/null +++ b/AidA/Data/Mappings/Ansprechpartner.hbm.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/Antrag.hbm.xml b/AidA/Data/Mappings/Antrag.hbm.xml new file mode 100644 index 0000000..bc638a0 --- /dev/null +++ b/AidA/Data/Mappings/Antrag.hbm.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/AntragsGegenstand.hbm.xml b/AidA/Data/Mappings/AntragsGegenstand.hbm.xml new file mode 100644 index 0000000..af14726 --- /dev/null +++ b/AidA/Data/Mappings/AntragsGegenstand.hbm.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/AntragsPersonenDaten.hbm.xml b/AidA/Data/Mappings/AntragsPersonenDaten.hbm.xml new file mode 100644 index 0000000..79cb706 --- /dev/null +++ b/AidA/Data/Mappings/AntragsPersonenDaten.hbm.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/AntragsStatus.hbm.xml b/AidA/Data/Mappings/AntragsStatus.hbm.xml new file mode 100644 index 0000000..5114a00 --- /dev/null +++ b/AidA/Data/Mappings/AntragsStatus.hbm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/Beratungsstelle.hbm.xml b/AidA/Data/Mappings/Beratungsstelle.hbm.xml new file mode 100644 index 0000000..19f8bab --- /dev/null +++ b/AidA/Data/Mappings/Beratungsstelle.hbm.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/FinanzTransaktion.hbm.xml b/AidA/Data/Mappings/FinanzTransaktion.hbm.xml new file mode 100644 index 0000000..a5eca97 --- /dev/null +++ b/AidA/Data/Mappings/FinanzTransaktion.hbm.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/Kommunikation.hbm.xml b/AidA/Data/Mappings/Kommunikation.hbm.xml new file mode 100644 index 0000000..03cffb9 --- /dev/null +++ b/AidA/Data/Mappings/Kommunikation.hbm.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/KontaktInfo.hbm.xml b/AidA/Data/Mappings/KontaktInfo.hbm.xml new file mode 100644 index 0000000..ac2c2ed --- /dev/null +++ b/AidA/Data/Mappings/KontaktInfo.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/Mitarbeiter.hbm.xml b/AidA/Data/Mappings/Mitarbeiter.hbm.xml new file mode 100644 index 0000000..623a674 --- /dev/null +++ b/AidA/Data/Mappings/Mitarbeiter.hbm.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/PersonenIdentitaet.hbm.xml b/AidA/Data/Mappings/PersonenIdentitaet.hbm.xml new file mode 100644 index 0000000..343c671 --- /dev/null +++ b/AidA/Data/Mappings/PersonenIdentitaet.hbm.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Mappings/ZahlungSEPA.hbm.xml b/AidA/Data/Mappings/ZahlungSEPA.hbm.xml new file mode 100644 index 0000000..b910674 --- /dev/null +++ b/AidA/Data/Mappings/ZahlungSEPA.hbm.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AidA/Data/Ressources/Images/DAS-Logo.png b/AidA/Data/Ressources/Images/DAS-Logo.png new file mode 100644 index 0000000..937e92b Binary files /dev/null and b/AidA/Data/Ressources/Images/DAS-Logo.png differ diff --git a/AidA/Data/ViewModel/AbstractBaseVM.cs b/AidA/Data/ViewModel/AbstractBaseVM.cs new file mode 100644 index 0000000..ffeac89 --- /dev/null +++ b/AidA/Data/ViewModel/AbstractBaseVM.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; + +namespace AidA.Data.ViewModel +{ + public abstract class AbstractBaseVM : INotifyPropertyChanged + { + private bool _IsDirty; + + public virtual bool IsDirty + { + get { return _IsDirty; } + } + + public Type Type + { + get { return GetType(); } + } + + public event PropertyChangedEventHandler PropertyChanged; + + public virtual void SetDirty(bool newDirty) + { + _IsDirty = newDirty; + } + + protected bool AreDifferent(object pMember, object pNewValue) + { + if (pNewValue is string && ((string)pNewValue) == string.Empty) + { + return pMember != null && ((string)pMember) != string.Empty; + } + + return (pMember == null && pNewValue != null) || (pMember != null && !pMember.Equals(pNewValue)); + } + + protected bool AreDifferent(object pMember, object pNewValue) + { + if (pMember is IEnumerable l1 && pNewValue is IEnumerable l2) + { + return !Enumerable.SequenceEqual(l1, l2); + } + + return AreDifferent(pMember, pNewValue); + } + + protected bool AreEqual(object x, object y) + { + if (x == null) + { + return y == null; + } + return x.Equals(y); + } + + public object Itself + { + get + { + return this; + } + } + + public void FirePropertyChangedItself() + { + FirePropertyChanged(nameof(Itself)); + } + + protected virtual void FirePropertyChanged(string pPropertyName) + { + FirePropertyChanged(PropertyChanged, this, pPropertyName); + } + + protected void FirePropertyChanged(PropertyChangedEventHandler handler, string pPropertyName) + { + FirePropertyChanged(handler, this, pPropertyName); + } + + protected void FirePropertyChanged(object sender, string pPropertyName) + { + FirePropertyChanged(PropertyChanged, sender, pPropertyName); + } + + protected void FirePropertyChanged(object sender, PropertyChangedEventArgs e) + { + FirePropertyChanged(PropertyChanged, sender, e); + } + + protected void FirePropertyChanged(PropertyChangedEventHandler handler, object sender, string pPropertyName) + { + FirePropertyChanged(handler, sender, new PropertyChangedEventArgs(pPropertyName)); + } + + protected void FirePropertyChanged(PropertyChangedEventHandler handler, object sender, PropertyChangedEventArgs e) + { + _IsDirty = true; + handler?.Invoke(sender, e); + } + } +} \ No newline at end of file diff --git a/AidA/Data/ViewModel/AnonymisierungVM.cs b/AidA/Data/ViewModel/AnonymisierungVM.cs new file mode 100644 index 0000000..b12b3bc --- /dev/null +++ b/AidA/Data/ViewModel/AnonymisierungVM.cs @@ -0,0 +1,18 @@ +using System; + +namespace AidA.Data.ViewModel +{ + public class AnonymisierungVM : AbstractBaseVM + { + public virtual long Id { get; set; } + public virtual int Aufbewahrungsfrist { get; set; } + public virtual DateTime? InsTs { get; set; } + public virtual DateTime? UpdTs { get; set; } + public virtual string Bemerkung { get; set; } + public virtual long Version { get; set; } + + + public virtual long AntragsId { get; set; } + public virtual long AnonymisierungslaufId { get; set; } + } +} diff --git a/AidA/Data/ViewModel/AnonymisierungslaufVM.cs b/AidA/Data/ViewModel/AnonymisierungslaufVM.cs new file mode 100644 index 0000000..4287083 --- /dev/null +++ b/AidA/Data/ViewModel/AnonymisierungslaufVM.cs @@ -0,0 +1,31 @@ +using AidA.Data.Entities; +using System; +using System.Collections.Generic; + +namespace AidA.Data.ViewModel +{ + public class AnonymisierungslaufVM : AbstractBaseVM + { + public virtual long Id { get; set; } + public virtual int Aufbewahrungsfrist { get; set; } + public virtual string Sicherung { get; set; } + public virtual DateTime? PruefBeginn { get; set; } + public virtual DateTime? PruefEnde { get; set; } + public virtual string PruefUser { get; set; } + public virtual int AnzahlGepruefteAntraege { get; set; } + public virtual int AnzahlBereitsAnonymisierteAntraege { get; set; } + public virtual int AnzahlAusgenommeneAntraege { get; set; } + public virtual int AnzahlNochAufzubewahrendeAntraege { get; set; } + public virtual int AnzahlZuAnonymisierendeAntraege { get; set; } + public virtual DateTime? AnonymisierungsBeginn { get; set; } + public virtual DateTime? AnonymisierungsEnde { get; set; } + public virtual string AnonymisierungsUser { get; set; } + public virtual int AnzahlAnonymisierteAntraege { get; set; } + public virtual string Bemerkung { get; set; } + public virtual long Version { get; set; } + + + public virtual IList Anonymisierungen { get; set; } + + } +} diff --git a/AidA/Properties/AssemblyInfo.cs b/AidA/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..222336a --- /dev/null +++ b/AidA/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("AidA")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AidA")] +[assembly: AssemblyCopyright("Copyright © 2024")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly +// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +//Um mit dem Erstellen lokalisierbarer Anwendungen zu beginnen, legen Sie +//ImCodeVerwendeteKultur in der .csproj-Datei +//in einer fest. Wenn Sie in den Quelldateien beispielsweise Deutsch +//(Deutschland) verwenden, legen Sie auf \"de-DE\" fest. Heben Sie dann die Auskommentierung +//des nachstehenden NeutralResourceLanguage-Attributs auf. Aktualisieren Sie "en-US" in der nachstehenden Zeile, +//sodass es mit der UICulture-Einstellung in der Projektdatei übereinstimmt. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) + ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) +)] + + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +// indem Sie "*" wie unten gezeigt eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AidA/Properties/DataSources/AidA.Data.ViewModel.AnonymisierungslaufVM.datasource b/AidA/Properties/DataSources/AidA.Data.ViewModel.AnonymisierungslaufVM.datasource new file mode 100644 index 0000000..2ea4fa9 --- /dev/null +++ b/AidA/Properties/DataSources/AidA.Data.ViewModel.AnonymisierungslaufVM.datasource @@ -0,0 +1,10 @@ + + + + AidA.Data.ViewModel.AnonymisierungslaufVM, AidA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/AidA/Properties/Licenses.licx b/AidA/Properties/Licenses.licx new file mode 100644 index 0000000..82c3d74 --- /dev/null +++ b/AidA/Properties/Licenses.licx @@ -0,0 +1,10 @@ +DevExpress.Xpf.Editors.ButtonEdit, DevExpress.Xpf.Core.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraWizard.WizardControl, DevExpress.XtraWizard.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.Xpf.Grid.GridControl, DevExpress.Xpf.Grid.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.Xpf.Editors.ProgressBarEdit, DevExpress.Xpf.Core.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.Xpf.Editors.TextEdit, DevExpress.Xpf.Core.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.Xpf.LayoutControl.GroupBox, DevExpress.Xpf.LayoutControl.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.Xpf.PropertyGrid.PropertyGridControl, DevExpress.Xpf.PropertyGrid.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.Xpf.LayoutControl.DataLayoutControl, DevExpress.Xpf.LayoutControl.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.Xpf.NavBar.NavBarControl, DevExpress.Xpf.NavBar.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.Xpf.Editors.ComboBoxEdit, DevExpress.Xpf.Core.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/AidA/Properties/Resources.Designer.cs b/AidA/Properties/Resources.Designer.cs new file mode 100644 index 0000000..13042f7 --- /dev/null +++ b/AidA/Properties/Resources.Designer.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion: 4.0.30319.42000 +// +// Änderungen an dieser Datei können fehlerhaftes Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + + +namespace AidA.Properties +{ + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder-Klasse + // über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der Option /str erneut aus, oder erstellen Sie Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AidA.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenlookups, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/AidA/Properties/Resources.resx b/AidA/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/AidA/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/AidA/Properties/Settings.Designer.cs b/AidA/Properties/Settings.Designer.cs new file mode 100644 index 0000000..a10edbc --- /dev/null +++ b/AidA/Properties/Settings.Designer.cs @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace AidA.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("c:/tmp/")] + public string DbBackupVerzeichnis { + get { + return ((string)(this["DbBackupVerzeichnis"])); + } + set { + this["DbBackupVerzeichnis"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("83730")] + public long AntragsIdFuerAntragspersondatenEntknuepfung { + get { + return ((long)(this["AntragsIdFuerAntragspersondatenEntknuepfung"])); + } + set { + this["AntragsIdFuerAntragspersondatenEntknuepfung"] = value; + } + } + } +} diff --git a/AidA/Properties/Settings.settings b/AidA/Properties/Settings.settings new file mode 100644 index 0000000..388e937 --- /dev/null +++ b/AidA/Properties/Settings.settings @@ -0,0 +1,12 @@ + + + + + + c:/tmp/ + + + 83730 + + + \ No newline at end of file diff --git a/AidA/Service/Anonymization/AnonymizationManager.cs b/AidA/Service/Anonymization/AnonymizationManager.cs new file mode 100644 index 0000000..fd15109 --- /dev/null +++ b/AidA/Service/Anonymization/AnonymizationManager.cs @@ -0,0 +1,415 @@ +using AidA.Data; +using AidA.Data.Entities; +using DevExpress.Xpf.Editors; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace AidA.Service.Anonymization +{ + public class AnonymizationManager + { + private Dictionary> AnsprechpartnerDictionary; + + private Dictionary> AntragsPersonenDatenDictionary; + + private IList ZuAnonymisierendeAntraege; + + private IList Anonymisierungen; + + private IList Anonymisierungsausnahmen; + + private string UserName; + + + public AnonymizationManager(String userName) + { + UserName = userName; + } + + public Anonymisierungslauf AnonymisierungslaufVorbereiten(int aufbewahrungsfrist, ProgressBarEdit progressBar) + { + var antraege = Database.GetAll(); + int gepruefteAntraege = 0; + int bereitsAnonymisierteAntraege = 0; + int ausgenommeneAntraege = 0; + int erledigteAntraege = 0; + int nochAufzubewahrendeAntraege = 0; + int antragsPersonenDatenCount = 0; + int antragsGegenstaendeCount = 0; + AntragsStatus antragsStatus; + IList antragsPersonenDatenListe; + IList antragsGegenstaende; + DateTime? beginnAufbewahrungsfrist = null; + DateTime aufbewahrenBis = new DateTime(DateTime.Now.Year - aufbewahrungsfrist, DateTime.Now.Month, DateTime.Now.Day); + + ZuAnonymisierendeAntraege = new List(); + AnsprechpartnerDictionary = new Dictionary>(); + AntragsPersonenDatenDictionary = new Dictionary>(); + Anonymisierungen = Database.GetAll(); + Anonymisierungsausnahmen = Database.GetAll(); + + progressBar.Minimum = 0; + progressBar.Maximum = antraege.Count; + progressBar.Value = 0; + progressBar.DisplayFormatString = progressBar.DisplayFormatString + " von " + antraege.Count; + progressBar.Visibility = System.Windows.Visibility.Visible; + + Anonymisierungslauf anonymisierungslauf = new Anonymisierungslauf(); + anonymisierungslauf.PruefBeginn = DateTime.Now; + anonymisierungslauf.PruefUser = UserName; + anonymisierungslauf.Aufbewahrungsfrist = aufbewahrungsfrist; + + foreach (var antrag in antraege) + { + if (gepruefteAntraege % 1000 == 0) + System.Windows.Forms.Application.DoEvents(); + + var anonymisierung = Anonymisierungen.FirstOrDefault(a => a.AntragsId.Equals(antrag.Id)); + if (anonymisierung != null) + { + bereitsAnonymisierteAntraege++; + gepruefteAntraege++; + progressBar.Value++; + continue; + } + + var anonymisierungsausnahme = Anonymisierungsausnahmen.FirstOrDefault(a => a.AntragsId.Equals(antrag.Id)); + if (anonymisierungsausnahme != null) + { + ausgenommeneAntraege++; + UpdateAnsprechpartnerDictionary(antrag); + UpdateAntragsPersonenDatenDictionary(antrag); + gepruefteAntraege++; + progressBar.Value++; + continue; + } + + antragsStatus = antrag.AntragsStatus; + + if (antragsStatus != null && (antragsStatus.Name.Equals("erledigt") || antragsStatus.Name.Equals("mit Fehlern erledigt"))) + { + erledigteAntraege++; + + antragsPersonenDatenListe = antrag.AntragsPersonenDatenListe; + foreach (var antragsPersonenDaten in antragsPersonenDatenListe) + { + antragsPersonenDatenCount++; + + antragsGegenstaende = antragsPersonenDaten.AntragsGegenstaende; + DateTime? allMaxTS = null; + foreach (var antragsGegenstand in antragsGegenstaende) + { + antragsGegenstaendeCount++; + DateTime? maxTS = DateUtils.MaxTimestamp(antragsGegenstand.BeantragtTimestamp, antragsGegenstand.BewilligtTimestamp, antragsGegenstand.GeaendertDurchTimestamp); + allMaxTS = DateUtils.MaxTimestamp(allMaxTS, maxTS); + } + + beginnAufbewahrungsfrist = allMaxTS; + } + } + + // konnte fuer erledigte Antraege aufgrund fehlender Timestamps kein Beginn der Aufbewahrungsfrist ermittelt werden, + // verfahren wir (bis auf Weiteres) wie bei nicht erledigten Antraegen + if (beginnAufbewahrungsfrist is null) + { + if (antrag.FaelligkeitsDatum != null) + { + DateTime faelligkeitsDatum = (DateTime)antrag.FaelligkeitsDatum; + beginnAufbewahrungsfrist = new DateTime(faelligkeitsDatum.Year + 1, 1, 1); + } + else + { + int bewilligungsJahr = antrag.BewilligungsJahr; + if (bewilligungsJahr == 0) + { + // es gibt 18 Antraege mit Bewilligungsjahr 0, haben alle Eingangsdatum > 2022 + // wir setzen den Beginn der Aufbewahrungsfrist auf 2022, um die Anonymisierung zu verhindern + beginnAufbewahrungsfrist = new DateTime(2022, 1, 1); + } + else + { + beginnAufbewahrungsfrist = new DateTime(bewilligungsJahr + 1, 1, 1); + } + } + } + + if (beginnAufbewahrungsfrist != null) + { + DateTime beginn = (DateTime)beginnAufbewahrungsfrist; + DateTime endeAufbewahrungsfrist = new DateTime(beginn.Year + aufbewahrungsfrist, beginn.Month, beginn.Day); + + if (DateTime.Now > endeAufbewahrungsfrist) + { + ZuAnonymisierendeAntraege.Add(antrag); + } + else + { + nochAufzubewahrendeAntraege++; + } + } + else + { + nochAufzubewahrendeAntraege++; + } + + UpdateAnsprechpartnerDictionary(antrag); + UpdateAntragsPersonenDatenDictionary(antrag); + gepruefteAntraege++; + progressBar.Value++; + } + + anonymisierungslauf.PruefEnde = DateTime.Now; + anonymisierungslauf.AnzahlGepruefteAntraege = gepruefteAntraege; + anonymisierungslauf.AnzahlBereitsAnonymisierteAntraege = bereitsAnonymisierteAntraege; + anonymisierungslauf.AnzahlAusgenommeneAntraege = ausgenommeneAntraege; + anonymisierungslauf.AnzahlNochAufzubewahrendeAntraege = nochAufzubewahrendeAntraege; + anonymisierungslauf.AnzahlZuAnonymisierendeAntraege = ZuAnonymisierendeAntraege.Count; + + return anonymisierungslauf; + } + + public void AnonymisierungslaufDurchfuehren(Anonymisierungslauf anonymisierungslauf, ProgressBarEdit progressBar) + { + anonymisierungslauf.AnonymisierungsBeginn = DateTime.Now; + anonymisierungslauf.AnonymisierungsUser = UserName; + anonymisierungslauf.Sicherung = "Anonymisierungsbackup_" + String.Format("{0:yyyyMMdd HHmm}", anonymisierungslauf.AnonymisierungsBeginn) + ".bak"; + + Database.InsertAnonymisierungslauf(anonymisierungslauf, UserName); + + anonymisierungslauf.Anonymisierungen = new List(); + int anzahlAnonymisierteAntraege = 0; + var ansprechpartnerIds = new List(); + + long antragsIdFuerAntragspersondatenEntknuepfung = Properties.Settings.Default.AntragsIdFuerAntragspersondatenEntknuepfung; + + progressBar.Minimum = 0; + progressBar.Maximum = ZuAnonymisierendeAntraege.Count; + progressBar.Value = 0; + progressBar.DisplayFormatString = progressBar.DisplayFormatString + " von " + ZuAnonymisierendeAntraege.Count; + progressBar.Visibility = System.Windows.Visibility.Visible; + + foreach (var antrag in ZuAnonymisierendeAntraege) + { + if (anzahlAnonymisierteAntraege % 20 == 0) + System.Windows.Forms.Application.DoEvents(); + + Anonymisierung anonymisierung = new Anonymisierung(); + anonymisierung.AntragsId = antrag.Id; + anonymisierung.Aufbewahrungsfrist = anonymisierungslauf.Aufbewahrungsfrist; + anonymisierung.AntragsNummer = antrag.AntragsNummer; + anonymisierung.AnonymisierungslaufId = anonymisierungslauf.Id; + + Ansprechpartner ansprechpartner = antrag.Ansprechpartner; + if (ansprechpartner != null) + { + bool ansprechpartnerNochBenoetigt = CheckAnsprechpartnerNochBenoetigt(ansprechpartner, antrag); + if (!ansprechpartnerNochBenoetigt) + { + // Beratungsstelle wird zurzeit noch nicht benoetigt + // Beratungsstelle beratungsstelle = ansprechpartner.Beratungsstelle; + + if (ansprechpartner.KontaktInfo != null) + { + ansprechpartner.KontaktInfo = null; + } + + // Ansprechpartner (und Antrag.AnsprechpartnerId) loeschen (todo: Pruefen, ob das so klappt) + antrag.Ansprechpartner = null; + } + } + + antrag.SachbearbeiterId = null; + + IList antragsPersonenDatenListe = antrag.AntragsPersonenDatenListe; + if (antragsPersonenDatenListe != null) + { + foreach (var antragsPersonenDaten in antragsPersonenDatenListe) + { + bool antragsPersonenDatenNochBenoetigt = CheckAntragsPersonenDatenNochBenoetigt(antragsPersonenDaten, antrag); + if (!antragsPersonenDatenNochBenoetigt) + { + 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; + + 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 = ""; + } + } + } + } + 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; + } + } + } + + // Memo loeschen - noch pruefen ob so gueltig und verarbeitbar + antrag.Memo = null; + + anonymisierungslauf.Anonymisierungen.Add(anonymisierung); + anzahlAnonymisierteAntraege++; + progressBar.Value++; + } + + anonymisierungslauf.AnzahlAnonymisierteAntraege = anzahlAnonymisierteAntraege; + anonymisierungslauf.AnonymisierungsEnde = DateTime.Now; + + Database.SaveAnonymisierungslaufDurchfuehrung(anonymisierungslauf, ZuAnonymisierendeAntraege, UserName); + } + + public void AnonymisierungslaufSpeichern(Anonymisierungslauf anonymisierungslauf) + { + Database.UpdateAnonymisierungslauf(anonymisierungslauf, UserName); + } + + public void AnonymisierungsAusnahmeHinzufuegen(long antragsNummer) + { + Anonymisierungsausnahme anonymisierungsausnahme = new Anonymisierungsausnahme(); + anonymisierungsausnahme.AntragsNummer = antragsNummer; + anonymisierungsausnahme.AntragsId = Database.GetAntragsIdForAntragsNummer(antragsNummer); + + Database.InsertAnonymisierungsausnahme(anonymisierungsausnahme, UserName); + } + + public void AnonymisierungsAusnahmeLoeschen(Anonymisierungsausnahme anonymisierungsausnahme) + { + Database.DeleteAnonymisierungsausnahme(anonymisierungsausnahme); + } + + private void UpdateAnsprechpartnerDictionary(Antrag antrag) + { + Ansprechpartner ansprechpartner = antrag.Ansprechpartner; + if (ansprechpartner != null) + { + if (AnsprechpartnerDictionary.ContainsKey(ansprechpartner.Id)) + { + AnsprechpartnerDictionary[ansprechpartner.Id].Add(antrag); + } + else + { + AnsprechpartnerDictionary.Add(ansprechpartner.Id, new List { antrag }); + } + } + } + + private void UpdateAntragsPersonenDatenDictionary(Antrag antrag) + { + IList antragsPersonenDatenListe = antrag.AntragsPersonenDatenListe; + if (antragsPersonenDatenListe != null) + { + foreach (var antragsPersonenDaten in antragsPersonenDatenListe) + { + if (AntragsPersonenDatenDictionary.ContainsKey(antragsPersonenDaten.Id)) + { + AntragsPersonenDatenDictionary[antragsPersonenDaten.Id].Add(antrag); + } + else + { + AntragsPersonenDatenDictionary.Add(antragsPersonenDaten.Id, new List { antrag }); + } + } + } + } + + /** + * Prueft, ob der Ansprechpartner eines Antrags noch fuer andere Antraege benoetigt wird + */ + private bool CheckAnsprechpartnerNochBenoetigt(Ansprechpartner ansprechpartner, Antrag antrag) + { + bool nochBenoetigt = false; + if (AnsprechpartnerDictionary.ContainsKey(ansprechpartner.Id)) + { + var ansprechpartnerAntraege = AnsprechpartnerDictionary[ansprechpartner.Id]; + + if (ansprechpartnerAntraege != null && ansprechpartnerAntraege.Count > 1) + { + foreach (var ansprechpartnerAntrag in ansprechpartnerAntraege) + { + if (ansprechpartnerAntrag.Id != antrag.Id) + { + var zuAnonymisieren = ZuAnonymisierendeAntraege.FirstOrDefault(a => a.Id.Equals(ansprechpartnerAntrag.Id)); + if (zuAnonymisieren is null) + { + var schonAnonymisiert = Anonymisierungen.FirstOrDefault(a => a.AntragsId.Equals(ansprechpartnerAntrag.Id)); + if (schonAnonymisiert is null) + { + nochBenoetigt = true; + } + } + } + } + } + } + return nochBenoetigt; + } + + /** + * Prueft, ob AntragsPersonenDaten eines Antrags noch fuer andere Antraege benoetigt werden + */ + private bool CheckAntragsPersonenDatenNochBenoetigt(AntragsPersonenDaten antragsPersonenDaten, Antrag antrag) + { + bool nochBenoetigt = false; + if (AntragsPersonenDatenDictionary.ContainsKey(antragsPersonenDaten.Id)) + { + var antragsPersonenDatenAntraege = AntragsPersonenDatenDictionary[antragsPersonenDaten.Id]; + + if (antragsPersonenDatenAntraege != null && antragsPersonenDatenAntraege.Count > 1) + { + foreach (var antragsPersonenDatenAntrag in antragsPersonenDatenAntraege) + { + if (antragsPersonenDatenAntrag.Id != antrag.Id) + { + var zuAnonymisieren = ZuAnonymisierendeAntraege.FirstOrDefault(a => a.Id.Equals(antragsPersonenDatenAntrag.Id)); + if (zuAnonymisieren is null) + { + var schonAnonymisiert = Anonymisierungen.FirstOrDefault(a => a.AntragsId.Equals(antragsPersonenDatenAntrag.Id)); + if (schonAnonymisiert is null) + { + nochBenoetigt = true; + } + } + } + } + } + } + return nochBenoetigt; + } + } +} diff --git a/AidA/Service/DateUtils.cs b/AidA/Service/DateUtils.cs new file mode 100644 index 0000000..982117f --- /dev/null +++ b/AidA/Service/DateUtils.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AidA.Service +{ + public class DateUtils + { + public static DateTime? MaxTimestamp(DateTime? ts1, DateTime? ts2) + { + DateTime? maxTs = null; + if (ts1 != null) + { + if (ts2 != null) + { + if (ts2 > ts1) + { + maxTs = ts2; + } + else + { + maxTs = ts1; + } + } + } + else if (ts2 != null) + { + maxTs = ts2; + } + return maxTs; + } + + public static DateTime? MaxTimestamp(DateTime? ts1, DateTime? ts2, DateTime? ts3) + { + DateTime? maxTs = MaxTimestamp(ts1, ts2); + + if (ts3 != null && ts3 > maxTs) + { + maxTs = ts3; + } + + return maxTs; + } + } +} diff --git a/AidA/View/AnonymisierungsAusnahmenWindow.xaml b/AidA/View/AnonymisierungsAusnahmenWindow.xaml new file mode 100644 index 0000000..5b6fb64 --- /dev/null +++ b/AidA/View/AnonymisierungsAusnahmenWindow.xaml @@ -0,0 +1,34 @@ + + + +