Files
RecordOrganizer/app/DD-Record-Organizer/Classes/ClassHelper.vb
2026-03-24 12:42:53 +01:00

615 lines
29 KiB
VB.net
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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