AuditFlow

This commit is contained in:
2025-08-13 16:44:01 +02:00
parent 967792860d
commit ccccddad57
14 changed files with 4381 additions and 53 deletions

View File

@@ -0,0 +1,99 @@
Imports System.Data.SqlClient
Public Class cAuditFlow
''' <summary>
''' 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.
''' </summary>
''' <param name="vonDatum">Datum, ab dem fällige Prüfungen nachträglich berechnet werden sollen</param>
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
''' <summary>
''' Berechnet das nächste Fälligkeitsdatum auf Basis eines Ausgangsdatums, des Intervalltyps und -werts.
''' </summary>
''' <param name="start">Ausgangspunkt für die nächste Fälligkeit</param>
''' <param name="typ">Intervalltyp: "TAGE", "WOCHEN", "MONATE", "JAHRE"</param>
''' <param name="wert">Anzahl der Einheiten, die zwischen zwei Fälligkeiten liegen</param>
''' <remarks>
''' 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
''' </remarks>
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
End Class

View File

@@ -0,0 +1,202 @@

Imports System.Data.SqlClient
Imports System.Reflection
Public Class cAuditFlow_Pruefobjekte
'=== Properties (Spalten laut Tabelle) ===
Public Property wartPO_Id As Integer
Public Property wartPO_Bezeichnung As String
Public Property wartPO_Kennung As String
Public Property wartPO_Kategorie As String
Public Property wartPO_Firma As String
Public Property wartPO_Niederlasung As String
Public Property wartPO_Standort As String
Public Property wartPO_Aktiv As Boolean = True
Public Property wartPO_IntervallTyp As String ' VARCHAR(30)
Public Property wartPO_IntervallWert As Nullable(Of Integer) ' NULL
Public Property wartPO_Erinnerung_VorlaufInTagen As Integer = 0 ' NOT NULL DEFAULT(0)
Public Property wartPO_startdatum As Date = Date.Today ' NOT NULL DEFAULT(getdate())
Public Property wartPO_enddatum As Nullable(Of Date) ' NULL (DEFAULT(getdate()) wenn nicht gesetzt)
Public Property wartPO_zustaendigIntern_MaId As Nullable(Of Integer)
Public Property wartPO_zustaendigIntern_Name As String
Public Property wartPO_zustaendigIntern_Tel As String
Public Property wartPO_zustaendigIntern_Mail As String
Public Property wartPO_zustaendigExtern_Firma As String
Public Property wartPO_zustaendigExtern_Name As String
Public Property wartPO_zustaendigExtern_Tel As String
Public Property wartPO_zustaendigExtern_Mail As String
Public Property wartPO_MailErinnerung_SendenAnIntZust As Boolean = True ' NOT NULL DEFAULT(1)
Public Property wartPO_Beschreibung As String
'=== Status / Helper ===
Public hasEntry As Boolean = False
Private ReadOnly SQL As New SQL
'=== CTORs ===
Public Sub New(wartPO_Id As Integer)
Me.wartPO_Id = wartPO_Id
LOAD()
End Sub
Public Sub New()
' Für neue Datensätze ohne sofortiges LOAD
End Sub
'=== Parameterliste ===
Private Function getParameterList() As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
Dim list As New List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
' PK
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_Id", wartPO_Id, , True))
' Datenfelder
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_Bezeichnung", wartPO_Bezeichnung))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_Kennung", wartPO_Kennung))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_Kategorie", wartPO_Kategorie))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_Firma", wartPO_Firma))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_Niederlasung", wartPO_Niederlasung))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_Standort", wartPO_Standort))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_Aktiv", wartPO_Aktiv))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_IntervallTyp", wartPO_IntervallTyp))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_IntervallWert", wartPO_IntervallWert))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_Erinnerung_VorlaufInTagen", wartPO_Erinnerung_VorlaufInTagen))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_startdatum", wartPO_startdatum))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_enddatum", wartPO_enddatum))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_zustaendigIntern_MaId", wartPO_zustaendigIntern_MaId))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_zustaendigIntern_Name", wartPO_zustaendigIntern_Name))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_zustaendigIntern_Tel", wartPO_zustaendigIntern_Tel))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_zustaendigIntern_Mail", wartPO_zustaendigIntern_Mail))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_zustaendigExtern_Firma", wartPO_zustaendigExtern_Firma))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_zustaendigExtern_Name", wartPO_zustaendigExtern_Name))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_zustaendigExtern_Tel", wartPO_zustaendigExtern_Tel))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_zustaendigExtern_Mail", wartPO_zustaendigExtern_Mail))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_MailErinnerung_SendenAnIntZust", wartPO_MailErinnerung_SendenAnIntZust))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPO_Beschreibung", wartPO_Beschreibung))
Return list
End Function
'=== SAVE: Insert/Update in einer Transaktion ===
Public Function SAVE() As Boolean
Try
Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
Dim sqlstr As String =
"BEGIN TRAN " &
"IF EXISTS(SELECT * FROM [tblAuditFlow_Pruefobjekte] WHERE [wartPO_Id]=@wartPO_Id) " &
"BEGIN " & getUpdateCmd() & " END " &
"ELSE " &
"BEGIN " & getInsertCmd() & " END " &
"COMMIT TRAN "
Return SQL.doSQLVarList(sqlstr, "ADMIN", , list)
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
Return False
End Try
End Function
'=== LOAD: füllt Properties via Reflection aus DataReader ===
Public Sub LOAD()
Try
hasEntry = False
Using conn As SqlConnection = SQL.GetNewOpenConnectionADMIN()
Using cmd As New SqlCommand("SELECT * FROM [tblAuditFlow_Pruefobjekte] WHERE [wartPO_Id]=@wartPO_Id", conn)
cmd.Parameters.AddWithValue("@wartPO_Id", wartPO_Id)
Using dr = cmd.ExecuteReader()
If dr.Read() Then
For Each li In getParameterList()
' li.Text = Spaltenname, li.Scalarvariable = Property-Name
Dim propInfo As PropertyInfo = Me.GetType().GetProperty(li.Scalarvariable)
If propInfo Is Nothing Then Continue For
If dr.Item(li.Text) Is DBNull.Value Then
propInfo.SetValue(Me, Nothing)
Else
propInfo.SetValue(Me, dr.Item(li.Text))
End If
Next
hasEntry = True
End If
End Using
End Using
End Using
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Sub
'=== UPDATE-Kommando dynamisch aus Parameterliste ===
Private Function getUpdateCmd() As String
Try
Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
Dim setParts As New List(Of String)
For Each i In list
If Not i.isPrimaryParam Then
setParts.Add("[" & i.Text & "]=@" & i.Scalarvariable)
End If
Next
Dim setClause As String = String.Join(",", setParts)
Return "UPDATE [tblAuditFlow_Pruefobjekte] SET " & setClause & " WHERE [wartPO_Id]=@wartPO_Id"
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
Return ""
End Try
End Function
'=== INSERT-Kommando dynamisch aus Parameterliste ===
Private Function getInsertCmd() As String
Try
Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
Dim cols As New List(Of String)
Dim vals As New List(Of String)
For Each i In list
If Not i.isPrimaryParam Then
cols.Add("[" & i.Text & "]")
vals.Add("@" & i.Scalarvariable)
End If
Next
Return "INSERT INTO [tblAuditFlow_Pruefobjekte] (" & String.Join(",", cols) & ") VALUES (" & String.Join(",", vals) & ")"
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
Return ""
End Try
End Function
Public Shared Function LoadAllAktiv() As List(Of cAuditFlow_Pruefobjekte)
Dim result As New List(Of cAuditFlow_Pruefobjekte)
Try
Using conn As SqlConnection = VERAG_PROG_ALLGEMEIN.SQL.GetNewOpenConnectionADMIN()
Using cmd As New SqlCommand("SELECT * FROM [tblAuditFlow_Pruefobjekte] WHERE [wartPO_Aktiv]=1", conn)
Using dr As SqlDataReader = cmd.ExecuteReader()
While dr.Read()
Dim obj As New cAuditFlow_Pruefobjekte()
For Each li In obj.getParameterList()
Dim propInfo As PropertyInfo = obj.GetType().GetProperty(li.Scalarvariable)
If propInfo Is Nothing Then Continue For
If dr(li.Text) Is DBNull.Value Then
propInfo.SetValue(obj, Nothing)
Else
propInfo.SetValue(obj, dr(li.Text))
End If
Next
obj.hasEntry = True
result.Add(obj)
End While
End Using
End Using
End Using
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
Return result
End Function
End Class

View File

@@ -0,0 +1,162 @@

Imports System.Data.SqlClient
Imports System.Reflection
Public Class cAuditFlow_Pruefungen
'=== Properties entsprechend der Tabelle ===
Public Property wartPruef_Id As Integer
Public Property wartPruef_wartPOId As Integer
Public Property wartPruef_Faelligkeitsdatum As Date
Public Property wartPruef_Erledigung As Boolean = False
Public Property wartPruef_Erledigung_Datum As Nullable(Of Date)
Public Property wartPruef_Erledigung_BestaetigtMaId As Nullable(Of Integer)
Public Property wartPruef_Erledigung_BestaetigtMaName As String
Public Property wartPruef_Erledigung_Bemerkung As String
Public Property wartPruef_Anhaenge_daId As Nullable(Of Integer)
Public Property wartPruef_Bemerkung As String
Public Property wartPruef_MailErinnerung_Gesendet As Boolean = False
Public Property wartPruef_MailErinnerung_GesendetAn As String
Public Property wartPruef_MailErinnerung_GesendetAm As Nullable(Of Date)
'=== Status / Helper ===
Public hasEntry As Boolean = False
Private ReadOnly SQL As New SQL
'=== CTORs ===
Public Sub New(wartPruef_Id As Integer)
Me.wartPruef_Id = wartPruef_Id
LOAD()
End Sub
Public Sub New()
' Für neue Datensätze ohne sofortiges LOAD
End Sub
'=== Parameterliste ===
Private Function getParameterList() As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
Dim list As New List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
' PK als PrimaryParam
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_Id", wartPruef_Id, , True))
' übrige Spalten
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_wartPOId", wartPruef_wartPOId))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_Faelligkeitsdatum", wartPruef_Faelligkeitsdatum))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_Erledigung", wartPruef_Erledigung))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_Erledigung_Datum", wartPruef_Erledigung_Datum))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_Erledigung_BestaetigtMaId", wartPruef_Erledigung_BestaetigtMaId))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_Erledigung_BestaetigtMaName", wartPruef_Erledigung_BestaetigtMaName))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_Erledigung_Bemerkung", wartPruef_Erledigung_Bemerkung))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_Anhaenge_daId", wartPruef_Anhaenge_daId))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_Bemerkung", wartPruef_Bemerkung))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_MailErinnerung_Gesendet", wartPruef_MailErinnerung_Gesendet))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_MailErinnerung_GesendetAn", wartPruef_MailErinnerung_GesendetAn))
list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("wartPruef_MailErinnerung_GesendetAm", wartPruef_MailErinnerung_GesendetAm))
Return list
End Function
'=== SAVE: Insert/Update in einer Transaktion ===
Public Function SAVE() As Boolean
Try
Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
Dim sqlstr As String =
"BEGIN TRAN " &
"IF EXISTS(SELECT * FROM [tblAuditFlow_Pruefungen] WHERE [wartPruef_Id]=@wartPruef_Id) " &
"BEGIN " & getUpdateCmd() & " END " &
"ELSE " &
"BEGIN " & getInsertCmd() & " END " &
"COMMIT TRAN "
Return SQL.doSQLVarList(sqlstr, "ADMIN", , list)
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
Return False
End Try
End Function
'=== LOAD: Properties via Reflection aus DataReader ===
Public Sub LOAD()
Try
hasEntry = False
Using conn As SqlConnection = SQL.GetNewOpenConnectionADMIN()
Using cmd As New SqlCommand("SELECT * FROM [tblAuditFlow_Pruefungen] WHERE [wartPruef_Id]=@wartPruef_Id", conn)
cmd.Parameters.AddWithValue("@wartPruef_Id", wartPruef_Id)
Using dr = cmd.ExecuteReader()
If dr.Read() Then
For Each li In getParameterList()
Dim propInfo As PropertyInfo = Me.GetType().GetProperty(li.Scalarvariable)
If propInfo Is Nothing Then Continue For
If dr.Item(li.Text) Is DBNull.Value Then
propInfo.SetValue(Me, Nothing)
Else
propInfo.SetValue(Me, dr.Item(li.Text))
End If
Next
hasEntry = True
End If
End Using
End Using
End Using
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Sub
'=== UPDATE-Kommando dynamisch ===
Private Function getUpdateCmd() As String
Try
Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
Dim setParts As New List(Of String)
For Each i In list
If Not i.isPrimaryParam Then
setParts.Add("[" & i.Text & "]=@" & i.Scalarvariable)
End If
Next
Dim setClause As String = String.Join(",", setParts)
Return "UPDATE [tblAuditFlow_Pruefungen] SET " & setClause & " WHERE [wartPruef_Id]=@wartPruef_Id"
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
Return ""
End Try
End Function
'=== INSERT-Kommando dynamisch ===
Private Function getInsertCmd() As String
Try
Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
Dim cols As New List(Of String)
Dim vals As New List(Of String)
For Each i In list
If Not i.isPrimaryParam Then
cols.Add("[" & i.Text & "]")
vals.Add("@" & i.Scalarvariable)
End If
Next
Return "INSERT INTO [tblAuditFlow_Pruefungen] (" & String.Join(",", cols) & ") VALUES (" & String.Join(",", vals) & ")"
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
Return ""
End Try
End Function
Public Shared Function ExistiertBereits(pruefobjektID As Integer, faelligkeit As Date) As Boolean
Try
Using conn As SqlConnection = VERAG_PROG_ALLGEMEIN.SQL.GetNewOpenConnectionADMIN()
Using cmd As New SqlCommand("SELECT COUNT(*) FROM [tblAuditFlow_Pruefungen] WHERE [wartPruef_wartPOId]=@poID AND [wartPruef_Faelligkeitsdatum]=@datum", conn)
cmd.Parameters.AddWithValue("@poID", pruefobjektID)
cmd.Parameters.AddWithValue("@datum", faelligkeit.Date)
Dim count As Integer = Convert.ToInt32(cmd.ExecuteScalar())
Return count > 0
End Using
End Using
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