Imports System.Data.SqlClient Imports System.Reflection Public Class cAuditFlow Private ReadOnly SQL As New SQL ''' ''' Erzeugt alle fälligen Prüfungen ab dem gegebenen Startdatum. ''' Unterstützt sowohl Intervall-basierte als auch einmalige Prüfobjekte. ''' Berücksichtigt das Enddatum und Erinnerungsvorlauf jedes Prüfobjekts. ''' ''' Datum, ab dem fällige Prüfungen nachträglich berechnet werden sollen Public Shared Sub ErzeugeFaelligePruefungen(vonDatum As Date) Dim pruefobjekte = cAuditFlow_Pruefobjekte.LoadAllAktiv() Dim heute As Date = Date.Today For Each obj In pruefobjekte ' Intervalltyp ermitteln (immer in Großbuchstaben, Leerzeichen entfernt) Dim intervallTyp As String = If(obj.wartPO_IntervallTyp, "").Trim().ToUpper() ' Erinnerungsvorlauf ermitteln Dim vorlauf As Integer = obj.wartPO_Erinnerung_VorlaufInTagen ' Enddatum aus Datenbank (leer = unbegrenzt) Dim dbEndDatum As Date = If(obj.wartPO_enddatum > Date.MinValue, obj.wartPO_enddatum, Date.MaxValue) ' System-Enddatum = heute + Vorlauf (aber max. bis zum definierten Enddatum) Dim systemEndDatum As Date = heute.AddDays(vorlauf) Dim endDatum As Date = If(systemEndDatum <= dbEndDatum, systemEndDatum, dbEndDatum) ' Startdatum zur Prüfung: das spätere von vonDatum oder Startdatum aus DB Dim startDatum As Date = If(vonDatum > obj.wartPO_startdatum, vonDatum, obj.wartPO_startdatum) ' Wenn Startdatum bereits hinter dem Enddatum liegt → überspringen If startDatum > endDatum Then Continue For ' === EINMALIGE PRÜFUNG === If intervallTyp = "EINMALIG" Then Dim faellig As Date = obj.wartPO_startdatum If faellig >= startDatum AndAlso faellig <= endDatum Then If Not cAuditFlow_Pruefungen.ExistiertBereits(obj.wartPO_Id, faellig) Then Dim einmaligePruefung As New cAuditFlow_Pruefungen With { .wartPruef_wartPOId = obj.wartPO_Id, .wartPruef_Faelligkeitsdatum = faellig, .wartPruef_Erledigung = False, .wartPruef_Bemerkung = "Einmalige Prüfung" } einmaligePruefung.SAVE() End If End If Continue For End If ' === WIEDERKEHRENDE PRÜFUNG === If Not obj.wartPO_IntervallWert.HasValue Then Continue For Dim laufDatum As Date = startDatum Do While laufDatum <= endDatum If Not cAuditFlow_Pruefungen.ExistiertBereits(obj.wartPO_Id, laufDatum) Then Dim neuePruefung As New cAuditFlow_Pruefungen With { .wartPruef_wartPOId = obj.wartPO_Id, .wartPruef_Faelligkeitsdatum = laufDatum, .wartPruef_Erledigung = False } neuePruefung.SAVE() End If ' Nächstes Datum berechnen laufDatum = BerechneNaechstesDatum(laufDatum, intervallTyp, obj.wartPO_IntervallWert.Value) Loop Next End Sub ''' ''' Berechnet das nächste Fälligkeitsdatum auf Basis eines Ausgangsdatums, des Intervalltyps und -werts. ''' ''' Ausgangspunkt für die nächste Fälligkeit ''' Intervalltyp: "TAGE", "WOCHEN", "MONATE", "JAHRE" ''' Anzahl der Einheiten, die zwischen zwei Fälligkeiten liegen ''' ''' Beispiele: ''' typ: "TAGE", wert: 10 → alle 10 Tage ''' typ: "WOCHEN", wert: 1 → jede Woche ''' typ: "MONATE", wert: 3 → alle 3 Monate ''' typ: "JAHRE", wert: 2 → alle 2 Jahre ''' Private Shared Function BerechneNaechstesDatum(start As Date, typ As String, wert As Integer) As Date Select Case typ.Trim.ToUpper() Case "TAGE" Return start.AddDays(wert) Case "WOCHEN" Return start.AddDays(wert * 7) Case "MONATE" Return start.AddMonths(wert) Case "JAHRE" Return start.AddYears(wert) Case Else Throw New ArgumentException("Ungültiger Intervalltyp: " & typ) End Select End Function ''' ''' Löscht alle offenen (wartPruef_Erledigung = 0) Prüfungen für ein Prüfobjekt. ''' Standard: nur fällige (Faelligkeitsdatum <= heute). ''' Rückgabewert: Anzahl gelöschter Datensätze; -1 bei Fehler. ''' Shared Function DELETE_ALL_OPEN_FAELLIGE(wartPOId As Integer, Optional onlyFaellige As Boolean = True) As Integer Try Dim sqlStr As String = "DELETE FROM [tblAuditFlow_Pruefungen] " & "WHERE [wartPruef_wartPOId]=@wartPruef_wartPOId " & " AND ISNULL([wartPruef_Erledigung],0)=0" If onlyFaellige Then sqlStr &= " AND [wartPruef_Faelligkeitsdatum] <= CAST(GETDATE() AS DATE)" End If Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL() Using cmd As New SqlCommand(sqlStr, conn) cmd.Parameters.AddWithValue("@wartPruef_wartPOId", wartPOId) Dim affected As Integer = cmd.ExecuteNonQuery() Return affected End Using End Using Catch ex As Exception VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, MethodInfo.GetCurrentMethod().Name) Return -1 End Try End Function ''' ''' Markiert eine Prüfung als erledigt, speichert das Datum und übergibt Base64-Anhänge an ein externes Archivsystem. ''' Die erzeugte dsId wird als Referenz in die Prüfung eingetragen. ''' ''' ID der Prüfung, die erledigt werden soll ''' Liste von Base64-kodierten Dateiinhalten ''' True, wenn erfolgreich gespeichert Public Shared Function SetzePruefungAufErledigtMitAnhaengen(pruefungsId As Integer, Bemerkung As String, anhaengeBase64 As List(Of String)) As Boolean Try ' Prüfung laden Dim pruefung As New cAuditFlow_Pruefungen(pruefungsId) If Not pruefung.hasEntry Then Return False ' 1. Archivierung der Base64-Dateien (Platzhalter) ' =============================================== ' Hier wird angenommen, dass du die Base64-Anhänge an dein Dokumentenarchiv (z. B. DMS) übergibst. ' Die Rückgabe ist eine eindeutige dsId (z. B. Integer oder Guid), die in der Prüfungstabelle gespeichert wird. Dim dsId As Integer = -1 ' <== Platzhalter für spätere Archivierung / Dateiübertragung ' TODO: Übergabe der Dateien und Erhalt der dsId vom Archivsystem ' 2. Prüfung als erledigt markieren ' ================================= pruefung.wartPruef_Erledigung_Datum = Date.Now pruefung.wartPruef_Erledigung = True pruefung.wartPruef_Anhaenge_daId = dsId pruefung.wartPruef_Bemerkung = Bemerkung ' 3. Speichern Return pruefung.SAVE() Catch ex As Exception VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name) Return False End Try End Function End Class