615 lines
29 KiB
VB.net
615 lines
29 KiB
VB.net
Imports System.IO
|
||
Imports System.Globalization
|
||
Imports System.ComponentModel
|
||
|
||
Public Class ClassHelper
|
||
Private Shared BW_DocPath As String
|
||
Private Shared BW_DocID As Integer
|
||
Private Shared BW_ParentID As Integer
|
||
Private Shared BW_Filename As String
|
||
Public Shared Function FORMAT_WM_PATH(WMpath As String) As String
|
||
Try
|
||
If IsNothing(WMpath) Then
|
||
Return Nothing
|
||
End If
|
||
|
||
If WMpath.StartsWith("W:") Then
|
||
WMpath = WMpath.Replace("W:", WMPATH_PREFIX)
|
||
ElseIf WMpath.StartsWith("\") AndAlso Not WMpath.StartsWith(WMPATH_PREFIX) Then
|
||
WMpath = WMPATH_PREFIX & WMpath
|
||
End If
|
||
|
||
LOGGER.Debug("WMpath is: " & WMpath)
|
||
Return WMpath
|
||
Catch ex As Exception
|
||
Return WMpath
|
||
End Try
|
||
End Function
|
||
Public Shared Function GetRelPath(WMpath As String) As String
|
||
Try
|
||
If WMpath.StartsWith("W:") Then
|
||
WMpath = WMpath.Replace("W:", "")
|
||
ElseIf WMpath.StartsWith(WMPATH_PREFIX) Then
|
||
WMpath = WMpath.Replace(WMPATH_PREFIX, "")
|
||
End If
|
||
|
||
LOGGER.Debug("WMpath is: " & WMpath)
|
||
Return WMpath
|
||
Catch ex As Exception
|
||
Return WMpath
|
||
End Try
|
||
End Function
|
||
Public Shared Function Format_Currency(value As String, language As String)
|
||
Try
|
||
If IsNothing(value) Then
|
||
Return ""
|
||
End If
|
||
|
||
If language <> "de-DE" Then
|
||
value = value.Replace(",", ".")
|
||
End If
|
||
|
||
Dim dValue = Double.Parse(value)
|
||
|
||
Dim ci = Threading.Thread.CurrentThread.CurrentCulture
|
||
Dim nfi As NumberFormatInfo = ci.NumberFormat.Clone()
|
||
nfi.CurrencySymbol = "" ' KEIN Currency Symbol
|
||
|
||
Return dValue.ToString("C", nfi)
|
||
Catch ex As Exception
|
||
Return value.ToString()
|
||
End Try
|
||
End Function
|
||
|
||
Public Shared Function Convert_Date(input As String, format As String)
|
||
Try
|
||
Dim dt As Date = CDate(input)
|
||
Dim result = dt.ToString(format, CultureInfo.InvariantCulture)
|
||
Return result
|
||
Catch ex As Exception
|
||
LOGGER.Warn("Unexpected Error while converting value '" & input & "' to date....." & ex.Message)
|
||
Return input
|
||
End Try
|
||
|
||
End Function
|
||
Public Shared Function CheckDBNull(input As Object, back_Value As String)
|
||
If IsDBNull(input) Then
|
||
If back_Value = "String" Then
|
||
Return ""
|
||
Else
|
||
Return True
|
||
End If
|
||
Else
|
||
If back_Value = "String" Then
|
||
Return input.ToString
|
||
Else
|
||
Return False
|
||
End If
|
||
End If
|
||
End Function
|
||
Public Shared Function Convert_to_Database_Date(input As String)
|
||
Try
|
||
Dim dt As Date = CDate(input)
|
||
Dim result = dt.ToString("yyyy-MM-dd", Nothing)
|
||
Return result
|
||
Catch ex As Exception
|
||
LOGGER.Warn("Unexpected Error while converting value '" & input & "' to date(Convert_to_Database_Date)....." & ex.Message)
|
||
Return input
|
||
End Try
|
||
|
||
End Function
|
||
Public Shared Function Get_TempFilename()
|
||
'Eine tempfile generieren
|
||
Dim tempFilename = My.Computer.FileSystem.GetTempFileName()
|
||
'Nur den Filenamen ohne Erweiterung
|
||
Dim tempName = Path.GetDirectoryName(tempFilename) & "\" & Path.GetFileNameWithoutExtension(tempFilename)
|
||
'tempfile lsöchen
|
||
If My.Computer.FileSystem.FileExists(tempFilename) Then
|
||
My.Computer.FileSystem.DeleteFile(tempFilename)
|
||
End If
|
||
Return tempName
|
||
End Function
|
||
Public Shared Function Versionierung_Datei(pDateiname As String) As String
|
||
Try
|
||
pDateiname = FORMAT_WM_PATH(pDateiname)
|
||
Dim dir As String = Path.GetDirectoryName(pDateiname)
|
||
Dim baseName As String = Path.GetFileNameWithoutExtension(pDateiname)
|
||
Dim ext As String = Path.GetExtension(pDateiname)
|
||
Dim stammname As String = Path.Combine(dir, baseName)
|
||
|
||
If Not File.Exists(pDateiname) Then
|
||
Return ""
|
||
End If
|
||
|
||
Dim version As Integer = 2
|
||
Dim candidate As String
|
||
Do
|
||
candidate = stammname & "~" & version & ext
|
||
version += 1
|
||
Loop While File.Exists(candidate)
|
||
|
||
Return candidate
|
||
Catch ex As Exception
|
||
LOGGER.Warn(" - Error in versioning file - error: " & vbCrLf & ex.Message)
|
||
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error in versioning file:")
|
||
Return ""
|
||
End Try
|
||
End Function
|
||
Public Shared Function CleanFilename(ByVal sFilename As String,
|
||
Optional ByVal REPLACEChar As String = "") As String
|
||
|
||
' alle nicht zulässigen Zeichen ersetzen
|
||
Return System.Text.RegularExpressions.Regex.Replace(
|
||
sFilename, "[?*^""<>|]", REPLACEChar)
|
||
End Function
|
||
Public Shared Function File_open(RESULT_DOC_PATH As Object, DocID As String, pParentID As Integer)
|
||
Try
|
||
Dim oFileName = Path.GetFileName(RESULT_DOC_PATH)
|
||
BW_Filename = oFileName
|
||
RESULT_DOC_PATH = FORMAT_WM_PATH(RESULT_DOC_PATH)
|
||
If pParentID = 0 Then
|
||
Dim sql = String.Format("SELECT dwParentID FROM TBPMO_DOCRESULT_LIST WHERE DocID = {0}", DocID)
|
||
pParentID = MYDB_ECM.GetScalarValue(sql)
|
||
End If
|
||
If SHARE_DRIVE_ACTIVE Then
|
||
If RESULT_DOC_PATH.ToString.StartsWith(constWMOBJECTS) Then
|
||
RESULT_DOC_PATH = RESULT_DOC_PATH.ToString.Replace(constWMOBJECTS, WMPATH_PREFIX)
|
||
End If
|
||
|
||
|
||
End If
|
||
CURRENT_OFFICE_FILE_CHANGED = False
|
||
If RESULT_DOC_PATH <> Nothing Then
|
||
'Dim EXT = Path.GetExtension(RESULT_DOC_PATH)
|
||
'EXT = EXT.Replace(".", "")
|
||
' Dim sql = String.Format("SELECT VIEWER FROM TBPMO_DOC_USER_VIEW WHERE USER_ID = {0} AND FILE_EXTENSION = '{1}'", USER_GUID, EXT)
|
||
' Dim DT As DataTable = MYDB_ECM.GetDatatable(sql)
|
||
' If DT.Rows.Count = 1 Then
|
||
' Select Case DT.Rows(0).Item("VIEWER")
|
||
' Case "DOC_VIEW"
|
||
' OPEN_DOCVIEW(RESULT_DOC_PATH, DocID)
|
||
' End Select
|
||
' Else
|
||
File_SYSOPEN(RESULT_DOC_PATH, DocID, pParentID)
|
||
'End If
|
||
Return True
|
||
Else
|
||
MSGBOX_Handler("ERROR", "", "Sorry, but the docpath for doc-id: " & DocID & " is nothing!")
|
||
LOGGER.Debug("RESULT_DOC_PATH IS NOTHING")
|
||
Return False
|
||
|
||
End If
|
||
Catch ex As Exception
|
||
MsgBox("Unexpected Error in File_open:" & vbCrLf & ex.Message & vbCrLf & RESULT_DOC_PATH & vbCrLf & "DocID: " & DocID, MsgBoxStyle.Critical)
|
||
LOGGER.Warn("Error in File_open: " & ex.Message & vbCrLf & " - Path: " & RESULT_DOC_PATH & " - DocID: " & DocID)
|
||
Return False
|
||
End Try
|
||
End Function
|
||
Public Shared Sub Open_Folder(RESULT_DOC_PATH As Object, DocID As String)
|
||
Try
|
||
If RESULT_DOC_PATH <> Nothing Then
|
||
RESULT_DOC_PATH = FORMAT_WM_PATH(RESULT_DOC_PATH)
|
||
Dim _path = Path.GetDirectoryName(RESULT_DOC_PATH)
|
||
FOLDER_OPEN(_path, DocID)
|
||
Else
|
||
LOGGER.Debug("RESULT_DOC_PATH IS NOTHING")
|
||
End If
|
||
Catch ex As Exception
|
||
MsgBox("Unexpected Error in Open_Folder:" & vbCrLf & ex.Message & vbCrLf & RESULT_DOC_PATH & vbCrLf & "DocID: " & DocID, MsgBoxStyle.Critical)
|
||
LOGGER.Warn("Error in Open_Folder: " & ex.Message & vbCrLf & " - Path: " & RESULT_DOC_PATH & " - DocID: " & DocID)
|
||
End Try
|
||
End Sub
|
||
Private Shared Sub File_SYSOPEN(RESULT_DOC_PATH As Object, DocID As String, pParentID As Integer)
|
||
Try
|
||
If RESULT_DOC_PATH <> Nothing Then
|
||
|
||
BW_DocPath = RESULT_DOC_PATH
|
||
BW_DocID = DocID
|
||
BW_ParentID = pParentID
|
||
|
||
Dim BWFileHandler As New BackgroundWorker
|
||
AddHandler BWFileHandler.DoWork, AddressOf BWFileHandler_DoWork
|
||
BWFileHandler.RunWorkerAsync()
|
||
Else
|
||
LOGGER.Warn("File_SYSOPEN RESULT_DOC_PATH is nothing")
|
||
End If
|
||
Catch ex As Exception
|
||
MsgBox("Unexpected Error in File_SYSOPEN:" & vbCrLf & ex.Message & vbCrLf & RESULT_DOC_PATH & vbCrLf & "DocID: " & DocID, MsgBoxStyle.Critical)
|
||
LOGGER.Warn("Error in File_SYSOPEN: " & ex.Message & vbCrLf & " - Path: " & RESULT_DOC_PATH & " - DocID: " & DocID)
|
||
End Try
|
||
|
||
End Sub
|
||
Private Shared Sub BWFileHandler_DoWork()
|
||
Try
|
||
Dim oOverrideRunPath As String = ""
|
||
Dim oExtension As String = Path.GetExtension(BW_DocPath).ToLower()
|
||
|
||
' Prüfen, ob eine spezielle Anwendung für die Dateierweiterung definiert ist
|
||
For Each oROW As DataRow In CURRENT_TBFILE_EXTENSION_OVERRIDE.Rows
|
||
If oExtension.Replace(".", "") = oROW.Item("FILE_EXTENSION").ToString().ToLower() Then
|
||
LOGGER.Debug($"Specific file extension override for [{oExtension}] found.")
|
||
oOverrideRunPath = oROW.Item("PROCESS").ToString()
|
||
Exit For
|
||
End If
|
||
Next
|
||
|
||
Dim oMyProcess As Process = Nothing
|
||
Dim oSql As String = ""
|
||
|
||
Try
|
||
' ###### Startinfo vorbereiten ######
|
||
Dim startInfo As New ProcessStartInfo()
|
||
|
||
If oOverrideRunPath <> "" Then
|
||
startInfo.FileName = oOverrideRunPath
|
||
startInfo.Arguments = $"""{BW_DocPath}"""
|
||
LOGGER.Debug($"Opening document [{BW_DocPath}] using override application [{oOverrideRunPath}].")
|
||
Else
|
||
startInfo.FileName = BW_DocPath
|
||
LOGGER.Debug($"Opening document [{BW_DocPath}] with system default application.")
|
||
End If
|
||
|
||
startInfo.UseShellExecute = True
|
||
startInfo.RedirectStandardOutput = False
|
||
If oOverrideRunPath <> "" Then
|
||
oMyProcess = Process.Start(startInfo)
|
||
Else
|
||
oMyProcess = Process.Start(BW_DocPath)
|
||
End If
|
||
' ###### Prozess starten ######
|
||
|
||
' Prozess kann Nothing sein, wenn eine bestehende Anwendung (z. B. Outlook)
|
||
' die Datei übernimmt, ohne einen neuen Prozess zu erstellen.
|
||
If oMyProcess IsNot Nothing Then
|
||
Dim ProcID As Integer = oMyProcess.Id
|
||
LOGGER.Debug($"Started process ID {ProcID} for document [{BW_DocPath}].")
|
||
|
||
oMyProcess.WaitForExit()
|
||
|
||
oExtension = Path.GetExtension(BW_DocPath).ToLower()
|
||
LOGGER.Debug($"Checking if file extension [{oExtension}] may change during edit...")
|
||
|
||
If FILE_FORMATS_CHANGE_DURING_EDIT.Contains(oExtension) And oOverrideRunPath = "" Then
|
||
LOGGER.Debug("Create possible Document change in TBPMO_DOC_ID_CHANGED.")
|
||
Dim oInsert = $"INSERT INTO TBPMO_DOC_ID_CHANGED (USER_ID,PROCESS_ID,VERSION_ID,OLD_DOC_ID,NEW_DOC_ID,DOC_PATH) VALUES (" &
|
||
$"{USER_GUID},'{ProcID}',9999,{BW_DocID},0,'{BW_DocPath}')"
|
||
MYDB_ECM.ExecuteNonQuery(oInsert)
|
||
End If
|
||
Else
|
||
' Kein neuer Prozess gestartet – Datei wurde von bestehender Anwendung übernommen
|
||
LOGGER.Debug($"No new process created for [{BW_DocPath}]. File likely handled by existing application (e.g. Outlook).")
|
||
End If
|
||
|
||
Catch ex As Exception
|
||
' Fehler im Prozessstart oder während des Wartens
|
||
LOGGER.Warn("Error in Process.Start(): " & ex.Message & vbCrLf & " - Path: " & BW_DocPath & " - DocID: " & BW_DocID)
|
||
MsgBox("Error in OpenFile: " & ex.Message & vbCrLf &
|
||
"Path: " & BW_DocPath & vbCrLf & "DocID: " & BW_DocID,
|
||
MsgBoxStyle.Exclamation, "Open File Error")
|
||
End Try
|
||
|
||
Catch ex As Exception
|
||
' Fehler im gesamten Worker (z. B. Path nicht vorhanden)
|
||
LOGGER.Warn("General error in BWFileHandler_DoWork: " & ex.Message & vbCrLf &
|
||
" - Path: " & BW_DocPath & " - DocID: " & BW_DocID)
|
||
|
||
' Letzter Versuch: Öffne mit Standardprogramm
|
||
Try
|
||
Process.Start(BW_DocPath)
|
||
LOGGER.Debug("Fallback: Document opened with default application.")
|
||
Catch ex1 As Exception
|
||
LOGGER.Warn("Fallback error in Process.Start(): " & ex1.Message & vbCrLf &
|
||
" - Path: " & BW_DocPath & " - DocID: " & BW_DocID)
|
||
End Try
|
||
End Try
|
||
End Sub
|
||
|
||
Private Shared Sub FOLDER_OPEN(PATH As Object, DocID As String)
|
||
Try
|
||
If PATH <> Nothing Then
|
||
LOGGER.Debug("in FOLDER_OPEN(" & PATH & ")")
|
||
If System.IO.Directory.Exists(PATH) = True Then
|
||
Process.Start(PATH)
|
||
Else
|
||
MsgBox("Folder '" & PATH & "' not existing or accessible!", MsgBoxStyle.Exclamation)
|
||
End If
|
||
End If
|
||
Catch ex As Exception
|
||
MsgBox("Unexpected Error in FOLDER_OPEN:" & vbCrLf & ex.Message & vbCrLf & PATH & vbCrLf & "DocID: " & DocID, MsgBoxStyle.Critical)
|
||
LOGGER.Warn("Error in FOLDER_OPEN: " & ex.Message & vbCrLf & " - Path: " & PATH & " - DocID: " & DocID)
|
||
End Try
|
||
|
||
End Sub
|
||
Public Shared Function InsertEssential_Log(REFERENCE_KEY As Integer, REFERENCE_STRING As String, COMMENT As String)
|
||
Try
|
||
COMMENT = COMMENT.Replace("'", "")
|
||
Dim insert = String.Format("INSERT INTO TBPMO_LOG_ESSENTIALS (REFERENCE_KEY,REFERENCE_STRING,COMMENT,ADDED_WHO) VALUES ({0},'{1}','{2}','{3}')", REFERENCE_KEY, REFERENCE_STRING, COMMENT, USER_USERNAME)
|
||
|
||
Dim result = MYDB_ECM.ExecuteNonQuery(insert)
|
||
Return result
|
||
Catch ex As Exception
|
||
LOGGER.Warn("Unexpected Error in InsertEssential_Log: " & ex.Message)
|
||
Return False
|
||
End Try
|
||
End Function
|
||
Public Shared Function DeleteRecord(SELECTED_RECORD_ID As Integer, Optional Comment As String = "")
|
||
Try
|
||
Dim DeleteRecordSQL = String.Format("EXEC [dbo].[PRPMO_DELETE_RECORD] {0}, '{1}','{2}'", SELECTED_RECORD_ID, USER_USERNAME, Comment)
|
||
Dim result As Boolean = MYDB_ECM.ExecuteNonQuery(DeleteRecordSQL)
|
||
If result = False Then
|
||
Dim msg = "Der Datensatz '" & SELECTED_RECORD_ID & "' konnte nicht gelöscht werden. Überprüfen Sie das log"
|
||
If USER_LANGUAGE <> "de-DE" Then
|
||
msg = "The record '" & SELECTED_RECORD_ID & "' could not be deleted. Check the log"
|
||
End If
|
||
MsgBox(msg, MsgBoxStyle.Exclamation)
|
||
|
||
End If
|
||
LOGGER.Info($"Deleted Record [{SELECTED_RECORD_ID}] Result was [{result}]: ")
|
||
Return result
|
||
Catch ex As Exception
|
||
LOGGER.Warn("Unexpected Error in DeleteRecord: " & ex.Message)
|
||
Return False
|
||
End Try
|
||
End Function
|
||
Public Shared Sub MSGBOX_Handler(type As String, Caption As String, info1 As String, Optional info2 As String = "")
|
||
Dim msg = info1
|
||
If info2 <> "" Then
|
||
msg &= vbCrLf & vbCrLf & info2
|
||
End If
|
||
If type = "ERROR" Then
|
||
MessageBox.Show(msg, Caption, MessageBoxButtons.OK, MessageBoxIcon.Error)
|
||
LOGGER.Warn(msg)
|
||
ElseIf type = "INFO" Then
|
||
MessageBox.Show(msg, Caption, MessageBoxButtons.OK, MessageBoxIcon.Information)
|
||
End If
|
||
End Sub
|
||
Public Shared Function Check_Record_Read_only(RECORD_ID As Integer, ENTITY_ID As Integer)
|
||
Dim sql = ""
|
||
Try
|
||
sql = SQL_RECORD_AND_FILE_READ_ONLY
|
||
sql = sql.Replace("@RECORDID", RECORD_ID)
|
||
sql = sql.Replace("@RECORD_ID", RECORD_ID)
|
||
sql = sql.Replace("@USER_ID", USER_GUID)
|
||
sql = sql.Replace("@USER_GUID", USER_GUID)
|
||
sql = sql.Replace("@ENTITY_ID", ENTITY_ID)
|
||
sql = sql.Replace("@USERNAME", USER_USERNAME)
|
||
sql = sql.Replace("@USER_NAME", USER_USERNAME)
|
||
LOGGER.Debug("RIGHT_ONLY_READ_RECORD_DOC SQL: (When true then disable) '" & sql & "'")
|
||
Return CBool(MYDB_ECM.GetScalarValue(sql))
|
||
Catch ex As Exception
|
||
LOGGER.Warn("SQL_RIGHT_READ_AND_VIEW_ONLY: " & sql)
|
||
Return False
|
||
End Try
|
||
End Function
|
||
Public Shared Function Check_File_Read_only(RECORD_ID As Integer, ENTITY_ID As Integer)
|
||
Dim sql = ""
|
||
Try
|
||
|
||
sql = SQL_DOC_READ_ONLY
|
||
sql = sql.Replace("@RECORDID", RECORD_ID)
|
||
sql = sql.Replace("@RECORD_ID", RECORD_ID)
|
||
sql = sql.Replace("@USER_ID", USER_GUID)
|
||
sql = sql.Replace("@USER_GUID", USER_GUID)
|
||
sql = sql.Replace("@ENTITY_ID", ENTITY_ID)
|
||
sql = sql.Replace("@USERNAME", USER_USERNAME)
|
||
sql = sql.Replace("@USER_NAME", USER_USERNAME)
|
||
LOGGER.Debug("RIGHT_ONLY_READ_COC SQL: (When true then disable) '" & sql & "'")
|
||
Return CBool(MYDB_ECM.GetScalarValue(sql))
|
||
Catch ex As Exception
|
||
LOGGER.Warn("RIGHT_WINDREAM_FORBIDDEN: " & sql)
|
||
Return False
|
||
End Try
|
||
End Function
|
||
Public Shared Sub REMOVE_OLD_DROP_FILES()
|
||
Try
|
||
' ✅ NEU: Pre-Check - welche Dateien sind betroffen?
|
||
Dim preCheckSQL = $"SELECT GUID, FILENAME_ONLY, ADDED_WHEN, DATEDIFF(MINUTE, ADDED_WHEN, GETDATE()) AS AGE_MINUTES " &
|
||
$"FROM TBPMO_FILES_USER " &
|
||
$"WHERE ADDED_WHEN < DATEADD(MINUTE, -15, GETDATE()) " &
|
||
$"AND WORKED = 0 AND USER_WORK = '{USER_USERNAME}'"
|
||
|
||
Dim preCheckDT = MYDB_ECM.GetDatatable(preCheckSQL)
|
||
|
||
If preCheckDT IsNot Nothing AndAlso preCheckDT.Rows.Count > 0 Then
|
||
LOGGER.Warn($"REMOVE_OLD_DROP_FILES: {preCheckDT.Rows.Count} Dateien werden als TIMEOUT markiert:")
|
||
For Each row As DataRow In preCheckDT.Rows
|
||
LOGGER.Warn($" - GUID={row("GUID")}, Datei={row("FILENAME_ONLY")}, Alter={row("AGE_MINUTES")} Minuten")
|
||
Next
|
||
Else
|
||
LOGGER.Debug($"REMOVE_OLD_DROP_FILES: Keine Dateien älter als 15 Minuten (User: {USER_USERNAME})")
|
||
End If
|
||
|
||
' ✅ Dann UPDATE
|
||
Dim oDEL = String.Format("UPDATE [DD_ECM].[dbo].[TBPMO_FILES_USER]
|
||
SET [USER_WORK] = [USER_WORK] + '_TIMEOUT',
|
||
WORKED = 1
|
||
WHERE ADDED_WHEN < DATEADD(MINUTE, -15, GETDATE())
|
||
AND WORKED = 0 AND USER_WORK = '{0}' ;", USER_USERNAME)
|
||
|
||
Dim rowsAffected = MYDB_ECM.ExecuteNonQuery(oDEL)
|
||
|
||
If rowsAffected > 0 Then
|
||
LOGGER.Warn($"REMOVE_OLD_DROP_FILES: {rowsAffected} Dateien wurden als TIMEOUT markiert")
|
||
End If
|
||
Catch ex As Exception
|
||
MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected error while REMOVE_OLD_DROP_FILES")
|
||
End Try
|
||
End Sub
|
||
Public Shared Sub Create_USER_FILE_TABLE()
|
||
Try
|
||
Dim sql = String.Format("SELECT *, CONVERT(BIT,0) AS DELETE_FILE FROM TBPMO_FILES_USER WHERE (USER_WORK = '{0}') AND WORKED = 0", USER_USERNAME)
|
||
CURRENT_TBPMO_FILES_USER = MYDB_ECM.GetDatatable(sql)
|
||
' ✅ NEU: Logging
|
||
If CURRENT_TBPMO_FILES_USER Is Nothing Then
|
||
LOGGER.Warn($"Create_USER_FILE_TABLE: GetDatatable gab Nothing zurück (User: {USER_USERNAME})")
|
||
Else
|
||
LOGGER.Debug($"Create_USER_FILE_TABLE: {CURRENT_TBPMO_FILES_USER.Rows.Count} Dateien geladen (User: {USER_USERNAME})")
|
||
|
||
' ✅ DEBUG: Zeige GUIDs der geladenen Dateien
|
||
For Each row As DataRow In CURRENT_TBPMO_FILES_USER.Rows
|
||
LOGGER.Debug($" - GUID={row("GUID")}, WORKED={row("WORKED")}, Datei={row("FILENAME2WORK")}")
|
||
Next
|
||
End If
|
||
Catch ex As Exception
|
||
LOGGER.Error($"Create_USER_FILE_TABLE Exception: {ex.Message}")
|
||
MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected error while creating User_File_Table")
|
||
End Try
|
||
End Sub
|
||
Public Shared Function DELETE_PMO_FILE_USER(GUID As Integer)
|
||
Try
|
||
Dim del As String = String.Format("DELETE FROM TBPMO_FILES_USER WHERE GUID = {0}", GUID)
|
||
Return MYDB_ECM.ExecuteNonQuery(del)
|
||
Catch ex As Exception
|
||
MsgBox("Unexpected Error in DELETE_PMO_FILE_USER: " & ex.Message, MsgBoxStyle.Critical)
|
||
Return False
|
||
End Try
|
||
End Function
|
||
Public Shared Function DELETE_PMO_FILE_USER_OPEN_FILES()
|
||
Try
|
||
Dim del As String = String.Format("DELETE FROM TBPMO_FILES_USER WHERE (USER_WORK = '{0}') AND WORKED = 0", USER_USERNAME)
|
||
Return MYDB_ECM.ExecuteNonQuery(del)
|
||
Catch ex As Exception
|
||
MsgBox("Unexpected Error in DELETE_PMO_FILE_USER_OPEN_FILES: " & ex.Message, MsgBoxStyle.Critical)
|
||
Return False
|
||
End Try
|
||
End Function
|
||
Public Shared Function DecryptString(ciphertext As String, MethodName As String)
|
||
Dim result As String
|
||
Dim wrapper As New ClassEncryption("!35452didalog=")
|
||
' DecryptData throws if the wrong password is used.
|
||
Try
|
||
result = wrapper.DecryptData(ciphertext)
|
||
Return result
|
||
Catch ex As Exception
|
||
LOGGER.Warn("The ciphertext for Method'" & MethodName & "' could not be decrypted")
|
||
Return ""
|
||
End Try
|
||
End Function
|
||
Public Shared Function FILTER_DATATABLE(BaseDatatable As DataTable, expression As String, sortstring As String)
|
||
Try
|
||
'Schema übernehmen
|
||
Dim filteredData As DataTable = BaseDatatable.Clone()
|
||
'Einfügevariante
|
||
BaseDatatable.Select(expression, sortstring).CopyToDataTable(filteredData, LoadOption.PreserveChanges)
|
||
'Dim filteredData = BaseDatatable.Select(expression).CopyToDataTable()
|
||
Return filteredData
|
||
Catch ex As Exception
|
||
LOGGER.Warn("unexpected error in FILTER_DATATABLE: " & ex.Message)
|
||
Return Nothing
|
||
End Try
|
||
|
||
End Function
|
||
Public Shared Function GetDocrecordLinks(pRECORDID As Integer)
|
||
Try
|
||
Dim oSQL = $"SELECT * FROM TBPMO_DOC_RECORD_LINK WHERE RECORD_ID = {pRECORDID}"
|
||
CURRENT_DT_TBPMO_DOC_RECORD_LINK = MYDB_ECM.GetDatatable(oSQL)
|
||
Catch ex As Exception
|
||
LOGGER.Warn("Unexpected Error in GetDocrecordLinks: " & ex.Message)
|
||
Return False
|
||
End Try
|
||
End Function
|
||
Public Shared Function Insert_USER_File(pFilename As String, handleType As String)
|
||
Try
|
||
Dim oImport_filename_only As String = Path.GetFileName(pFilename)
|
||
Dim CURRENT_FILE_HASH = ""
|
||
|
||
If File.Exists(pFilename) Then
|
||
Dim oFileInfo As New FileInfo(pFilename)
|
||
LOGGER.Debug($"File exists: [{pFilename}] | Size: {oFileInfo.Length} bytes | Extension: {oFileInfo.Extension}")
|
||
|
||
If (pFilename.ToUpper.EndsWith(".MSG") Or pFilename.ToUpper.EndsWith(".EML")) And (handleType = "|OUTLOOK_MESSAGE|" Or handleType = "|MSGONLY|") Then
|
||
CURRENT_FILE_HASH = FILESYSTEM.GetChecksumFromString(pFilename)
|
||
LOGGER.Debug($"Hash method: GetChecksumFromString | Hash: [{CURRENT_FILE_HASH}]")
|
||
Else
|
||
CURRENT_FILE_HASH = FILESYSTEM.GetChecksum(pFilename)
|
||
LOGGER.Debug($"Hash method: GetChecksum | Hash: [{CURRENT_FILE_HASH}]")
|
||
End If
|
||
Else
|
||
LOGGER.Warn($"File does not exist: [{pFilename}] - Cannot compute hash.")
|
||
End If
|
||
|
||
Dim oSQL = $"SELECT Filename, ADDED_WHO, FORMAT(ADDED_WHEN, 'dd-MM-yyyy HH:mm') AS ADDED_WHEN_STRING FROM TBPMO_DOCRESULT_LIST WHERE FILE_HASH = '{CURRENT_FILE_HASH}' ORDER BY ADDED_WHEN DESC"
|
||
LOGGER.Debug($"Inserting File - hash is [{CURRENT_FILE_HASH}]")
|
||
Dim oDTCHECK As DataTable = MYDB_ECM.GetDatatable(oSQL)
|
||
|
||
If Not IsNothing(oDTCHECK) Then
|
||
If oDTCHECK.Rows.Count >= 1 Then
|
||
LOGGER.Info($"We got a file with the same hash [{CURRENT_FILE_HASH}]")
|
||
Dim oFilename = oDTCHECK.Rows(0).Item(0)
|
||
Dim oUSER = oDTCHECK.Rows(0).Item(1)
|
||
Dim oADDED_WHEN = oDTCHECK.Rows(0).Item(2)
|
||
Dim oMSG As String
|
||
|
||
If USER_LANGUAGE <> "de-DE" Then
|
||
oMSG = $"This file [{oImport_filename_only}] has already been imported into orgFLOW!" & vbCrLf &
|
||
$"File already imported: [{oFilename}]" & vbCrLf &
|
||
$"Imported on: {oADDED_WHEN}" & vbCrLf &
|
||
$"Imported by: {oUSER}" & vbCrLf &
|
||
$"Total imports with identical content: {oDTCHECK.Rows.Count}" & vbCrLf & vbCrLf &
|
||
"Do you want to import this file again?" & vbCrLf &
|
||
"NO → The complete import will be cancelled."
|
||
Else
|
||
oMSG = $"Diese Datei [{oImport_filename_only}] wurde bereits in orgFLOW importiert!" & vbCrLf &
|
||
$"Bereits vorhandene Datei: [{oFilename}]" & vbCrLf &
|
||
$"Importiert am: {oADDED_WHEN}" & vbCrLf &
|
||
$"Importiert von: {oUSER}" & vbCrLf &
|
||
$"Anzahl Importe mit identischem Inhalt: {oDTCHECK.Rows.Count}" & vbCrLf & vbCrLf &
|
||
"Möchten Sie die Datei dennoch erneut importieren?" & vbCrLf &
|
||
"NEIN → Der gesamte Import (alle folgenden) wird abgebrochen."
|
||
End If
|
||
|
||
Dim result As MsgBoxResult
|
||
result = MessageBox.Show(oMSG, CAPTION_CONFIRMATION, MessageBoxButtons.YesNo, MessageBoxIcon.Question)
|
||
|
||
If result = MsgBoxResult.No Then
|
||
LOGGER.Info($"User wählte NEIN bei Hash-Duplikat-Check für [{oImport_filename_only}] - Import abgebrochen")
|
||
Return False
|
||
Else
|
||
LOGGER.Info($"User wählte JA bei Hash-Duplikat-Check für [{oImport_filename_only}] - fahre fort")
|
||
End If
|
||
End If
|
||
End If
|
||
|
||
' ✅ NEU: Pre-Check - gibt es bereits einen Eintrag mit diesem Hash?
|
||
Dim preCheckSQL = $"SELECT GUID, USER_WORK, WORKED FROM TBPMO_FILES_USER WHERE FILE_HASH = '{CURRENT_FILE_HASH}' AND USER_WORK = '{USER_USERNAME}'"
|
||
Dim preCheckDT = MYDB_ECM.GetDatatable(preCheckSQL)
|
||
|
||
If preCheckDT IsNot Nothing AndAlso preCheckDT.Rows.Count > 0 Then
|
||
LOGGER.Warn($"WARNUNG: Datei mit Hash [{CURRENT_FILE_HASH}] bereits in TBPMO_FILES_USER vorhanden:")
|
||
For Each row As DataRow In preCheckDT.Rows
|
||
LOGGER.Warn($" - GUID={row("GUID")}, USER_WORK={row("USER_WORK")}, WORKED={row("WORKED")}")
|
||
Next
|
||
End If
|
||
|
||
' ✅ INSERT mit explizitem Logging
|
||
Dim ins As String = String.Format("INSERT INTO TBPMO_FILES_USER (FILENAME2WORK, USER_WORK, HANDLE_TYPE, FILENAME_ONLY, FILE_HASH) VALUES ('{0}','{1}','{2}','{3}','{4}')", pFilename, USER_USERNAME, handleType, oImport_filename_only, CURRENT_FILE_HASH)
|
||
|
||
LOGGER.Debug($"Führe INSERT aus: [{ins}]")
|
||
Dim insertResult = MYDB_ECM.ExecuteNonQuery(ins)
|
||
|
||
If insertResult Then
|
||
' ✅ VERIFY - wurde wirklich eingefügt?
|
||
Dim verifySQL = $"SELECT TOP 1 GUID, ADDED_WHEN FROM TBPMO_FILES_USER WHERE FILE_HASH = '{CURRENT_FILE_HASH}' AND USER_WORK = '{USER_USERNAME}' ORDER BY GUID DESC"
|
||
Dim verifyDT = MYDB_ECM.GetDatatable(verifySQL)
|
||
|
||
If verifyDT IsNot Nothing AndAlso verifyDT.Rows.Count > 0 Then
|
||
Dim insertedGUID = verifyDT.Rows(0)("GUID")
|
||
Dim insertedADDED_WHEN = verifyDT.Rows(0)("ADDED_WHEN")
|
||
LOGGER.Info($"INSERT ERFOLGREICH: GUID={insertedGUID}, ADDED_WHEN={insertedADDED_WHEN}, Datei=[{oImport_filename_only}]")
|
||
Else
|
||
LOGGER.Error($"INSERT fehlgeschlagen (VERIFY)! Datei=[{oImport_filename_only}], Hash=[{CURRENT_FILE_HASH}]")
|
||
End If
|
||
Else
|
||
LOGGER.Error($"INSERT fehlgeschlagen (ExecuteNonQuery)! Datei=[{oImport_filename_only}]")
|
||
End If
|
||
|
||
Return insertResult
|
||
|
||
Catch ex As Exception
|
||
LOGGER.Error($"Insert_USER_File Exception: {ex.Message}")
|
||
MsgBox("Unexpected Error in Insert file for user (TBPMO_FILES_USER): " & ex.Message, MsgBoxStyle.Critical)
|
||
Return False
|
||
End Try
|
||
End Function
|
||
End Class
|