Files
ADMIN/initATLASAufschubkonten/frmRMCNachrichtenVerarbeitung.vb

563 lines
22 KiB
VB.net

Imports System.IO
Imports System.Net
Imports System.Runtime.Remoting
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Xml
Imports DocumentFormat.OpenXml.Bibliography
Imports DocumentFormat.OpenXml.Office2010.Excel
Imports Renci.SshNet
Imports Renci.SshNet.Sftp
Imports VERAG_PROG_ALLGEMEIN
Public Class frmRMCNachrichtenVerarbeitung
Dim cntDatenEingelesen As Integer = 0
Dim dsNichtErkannt As Integer = 0
Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
Dim allowClose = False
Dim rmc As New cRMC
Dim uta As New cUTA
Dim programName As String
Dim Dateiname = ""
Sub New(programName As String)
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
Me.programName = programName
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
End Sub
Sub New(programName As String, allowClose As Boolean) 'autostart
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
Me.programName = programName
Me.allowClose = allowClose
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
End Sub
Private Sub frmDYNachrichtenVerarbeitung_Load(sender As Object, e As EventArgs) Handles Me.Load
ListBox3.Items.Clear()
Me.Refresh()
lblFTP.Text = programName
If programName.Contains("RMC") Then
rmc.initImportPfade(programName)
For Each d In System.IO.Directory.GetFiles(rmc.VERARBEITUNG_PFAD)
ListBox3.Items.Add(frmStartOptions.cut_file(d))
Me.Refresh()
Next
ElseIf programName.Contains("UTA") Then
uta.initImportPfade(programName)
For Each d In System.IO.Directory.GetFiles(uta.VERARBEITUNG_PFAD)
ListBox3.Items.Add(frmStartOptions.cut_file(d))
Me.Refresh()
Next
End If
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Me.Enabled = False
Try
Label9.Visible = True
Dim cnt = getNachrichtenDaten()
Label9.Text = cnt & " Datensätze empfangen."
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine & "Datei: " & Dateiname, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
Me.Enabled = True
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Me.Enabled = False
Try
Label5.Visible = True
DatenEinlesen()
If dsNichtErkannt > 0 Then
Label6.Text = dsNichtErkannt & " Datensätze nicht " & vbNewLine & "erkannt."
Label6.Visible = True
End If
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine & "Datei: " & Dateiname, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
Me.Enabled = True
Label5.Text = cntDatenEingelesen & " Datensätze verarbeitet."
End Sub
Function getNachrichtenDaten() As Integer
Dim cnt = 0
Try
If programName.Contains("RMC") Then
DownloadFtpDirectory(rmc.API_STRING & "/", New NetworkCredential(rmc.API.Rows(0).Item("api_user").ToString, rmc.API.Rows(0).Item("api_password").ToString), "", cnt, False)
ElseIf programName.Contains("UTA") Then
DownloadSFtpDirectory(uta.API_STRING, New NetworkCredential(uta.API.Rows(0).Item("api_user").ToString, uta.API.Rows(0).Item("api_password").ToString), "", cnt, False, "/TRX/" & Now.Year)
End If
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine & "Datei: " & Dateiname, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
Return cnt
End Function
Sub DownloadFtpDirectory(url As String, credentials As NetworkCredential, localPath As String, ByRef cnt As Integer, deleteAfterDownload As Boolean)
Dim listRequest As FtpWebRequest = WebRequest.Create(url)
listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails
listRequest.Credentials = credentials
Dim verarbeitungspfad = ""
If programName.Contains("RMC") Then
verarbeitungspfad = rmc.VERARBEITUNG_PFAD
ElseIf programName.Contains("UTA") Then
verarbeitungspfad = uta.VERARBEITUNG_PFAD
End If
Dim lines As List(Of String) = New List(Of String)
Using listResponse As FtpWebResponse = listRequest.GetResponse(),
listStream As Stream = listResponse.GetResponseStream(),
listReader As StreamReader = New StreamReader(listStream)
While Not listReader.EndOfStream
lines.Add(listReader.ReadLine())
End While
End Using
For Each line As String In lines
Dim tokens As String() =
line.Split(New Char() {" "}, 9, StringSplitOptions.RemoveEmptyEntries)
Dim name As String = tokens(8)
Dim permissions As String = tokens(0)
Dim localFilePath As String = Path.Combine(localPath, name)
Dim fileUrl As String = url + name
If permissions(0) <> "d" Then 'in keine Unterorder suchen, nur die erste Ebene
Dim downloadRequest As FtpWebRequest = WebRequest.Create(fileUrl)
downloadRequest.Method = WebRequestMethods.Ftp.DownloadFile
downloadRequest.Credentials = credentials
' Dim fileDateTmp As Date = ServerDateFile(credentials, fileUrl)
'name = name.Replace(".csv", "_RGDAT_" & Now.ToShortDateString & ".csv")
Dim destFilenameTMP = verarbeitungspfad
If IO.File.Exists(verarbeitungspfad & name) Then
Dim fi As FileInfo = New FileInfo(verarbeitungspfad & name)
destFilenameTMP &= name.Replace(fi.Extension, "_") & Now.ToString("yyMMdd_HHmmss.fff") & fi.Extension
Else
destFilenameTMP &= name
End If
Try
Using downloadResponse As FtpWebResponse = downloadRequest.GetResponse(),
sourceStream As Stream = downloadResponse.GetResponseStream(),
targetStream As Stream = File.OpenWrite(destFilenameTMP)
Dim buffer As Byte() = New Byte(10240 - 1) {}
Dim read As Integer
Do
read = sourceStream.Read(buffer, 0, buffer.Length)
If read > 0 Then
targetStream.Write(buffer, 0, read)
End If
Loop While read > 0
sourceStream.Dispose()
targetStream.Dispose()
downloadResponse.Dispose()
'Dim destFilename = verarbeitungspfad & If(IO.File.Exists(verarbeitungspfad & name), name.Replace(".csv", "_") & Now.ToString("yyMMdd_HHmmss.fff") & ".csv", name)
'IO.File.Move(destFilenameTMP, destFilename) 'Datei umbenennen
Dim fi As FileInfo = New FileInfo(destFilenameTMP)
ListBox3.Items.Add(frmStartOptions.cut_file(fi.Name)) 'zur Liste hinzufügen
cnt += 1
'Datei nach download löschen
If deleteAfterDownload Then
Dim ftpReq As FtpWebRequest = WebRequest.Create(fileUrl)
ftpReq.Method = WebRequestMethods.Ftp.DeleteFile
ftpReq.Credentials = credentials
Dim ftpResp As FtpWebResponse = ftpReq.GetResponse
ftpResp.Close()
End If
End Using
Catch ex As Exception
End Try
End If
'End If
Next
End Sub
Function DownloadSFtpDirectory(url As String, credentials As NetworkCredential, localPath As String, ByRef cnt As Integer, deleteAfterDownload As Boolean, Path As String) As Integer
Dim ConnectionInfo As New ConnectionInfo(url, "22", credentials.UserName, New PasswordAuthenticationMethod(credentials.UserName, credentials.Password))
Using client = New SftpClient(ConnectionInfo)
client.Connect()
Dim files = client.ListDirectory(Path)
Dim targetFile As SftpFile
For Each file As SftpFile In files
If file.IsRegularFile AndAlso file.Name.ToLower.Contains(".uta") AndAlso file.Length > 0 Then
Dim remoteFileName = "/" & file.Name
Dim filePath = uta.VERARBEITUNG_PFAD & If(IO.File.Exists(uta.VERARBEITUNG_PFAD & file.Name), Name.Replace(".UTA", "_") & Now.ToString("yyMMdd_HHmmss.fff") & ".UTA", file.Name)
Dim downloadedFile As Stream = IO.File.Create(filePath)
client.DownloadFile(Path + remoteFileName, downloadedFile)
Dim fi As FileInfo = New FileInfo(filePath)
ListBox3.Items.Add(frmStartOptions.cut_file(fi.Name)) 'zur Liste hinzufügen
cnt += 1
'TODO: nach erfolgreichen verschieben, von FTP löschen!
downloadedFile.Close()
End If
Next
End Using
End Function
Private Function ServerDateFile(credentials As NetworkCredential, fileUrl As String) As Date
Dim ServerDate As DateTime
Try
Dim request As FtpWebRequest = WebRequest.Create(fileUrl)
request.Method = WebRequestMethods.Ftp.GetDateTimestamp
request.Credentials = credentials
Using response = CType(request.GetResponse(), Net.FtpWebResponse)
ServerDate = response.LastModified.ToShortDateString
End Using
Return ServerDate
Catch ex As WebException
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine & programName & " GET DATE FILE: " & Dateiname, System.Reflection.MethodInfo.GetCurrentMethod.Name)
Return Now
End Try
Return ServerDate
End Function
Sub DatenEinlesen()
VERAG_PROG_ALLGEMEIN.cAllgemein.ERR_OP_GLOBAL = VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL
If ListBox3.Items.Count = 0 Then
Label6.Text = "Keine Daten zum Einlesen vorhanden."
Label6.Visible = True
Exit Sub
End If
Dim verarbeitungspfad, zielpfad
If programName.Contains("RMC") Then
verarbeitungspfad = rmc.VERARBEITUNG_PFAD
zielpfad = rmc.ZIEL_PFAD
ElseIf programName.Contains("UTA") Then
verarbeitungspfad = uta.VERARBEITUNG_PFAD
zielpfad = uta.ZIEL_PFAD
End If
For i = 1 To 2
For Each d In System.IO.Directory.GetFiles(verarbeitungspfad)
Try
Dateiname = d
If IO.File.Exists(d) Then
Dim found = False
Dim fi As FileInfo = New FileInfo(d)
Dim alreadyMoved = False
If programName.Contains("RMC") Then
Select Case i
Case 1
'------------------------------------------
'------------------ CSV ------------------
'------------------------------------------
If fi.Extension.ToLower = ".csv" Then
If Not found Then
If readRMC(d) <> "" Then found = True
End If
If found Then cntDatenEingelesen += 1
End If
Case 2
'------------------------------------------
'------------------ PDF ------------------
'------------------------------------------
If fi.Extension.ToLower = ".pdf" Then
found = False
If Not IO.Directory.Exists(zielpfad & "Invoice_PDF\" & Now.Year & "\" & Now.ToString("yyyyMMdd") & "\") Then IO.Directory.CreateDirectory(zielpfad & Now.Year & "\" & Now.ToString("yyyyMMdd") & "\")
'File in Datenarchiv sichern:
If fi.Name.ToString.StartsWith("invoice_") Then 'aktuell nur die RMC-Dateien! (später, wenn CSV vollständig, dann alle PDS importieren! d.breimaier: 2024-06-05
Dim DS As New VERAG_PROG_ALLGEMEIN.cDATENSERVER("MDM", "MDM_DATEN", "RMC", Now.Year, Now.ToString("yyyyMMdd"), frmStartOptions.getFileName(d))
DS.uploadDataToDATENSERVER(d,,,,,, True)
SQL.doSQL("Update [tblRMCImport] SET [rmc_daId]='" & DS.da_id & "' where [rmc_pdfFileName] = '" & DS.da_name & "' and [rmc_importDatum] > DATEADD(DAY,-4,getdate()) ", "FMZOLL")
End If
frmStartOptions.moveFile_DateBack(d, zielpfad & "Invoice_PDF\" & Now.Year & "\" & Now.ToString("yyyyMMdd") & "\")
If fi.Name.ToLower.Contains("pdf") Then addDGVEinarbeitung("PDF", fi.Name)
dgvEinarbeitung.Refresh()
End If
End Select
ElseIf programName.Contains("UTA") Then
'------------------------------------------
'------------------ .UTA ------------------
'------------------------------------------
If fi.Extension.ToLower = ".uta" Then
If Not found Then
uta.clearimporttable()
If readUTA(d) <> "" Then found = True
End If
If found Then cntDatenEingelesen += 1
End If
End If
If True Then
If Not alreadyMoved Then
If found Then
If Not IO.Directory.Exists(zielpfad & Now.Year & "\" & Now.ToString("yyyyMMdd") & "\") Then IO.Directory.CreateDirectory(zielpfad & Now.Year & "\" & Now.ToString("yyyyMMdd") & "\")
frmStartOptions.moveFile_DateBack(d, zielpfad & Now.Year & "\" & Now.ToString("yyyyMMdd") & "\")
End If
End If
End If
End If
Me.Refresh()
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine & "Datei: " & Dateiname, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
Next
Next
End Sub
Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
Me.Close()
End Sub
Private Sub btn_Click(sender As Object, e As EventArgs) Handles btn.Click
Me.Close()
End Sub
Sub addDGVEinarbeitung(art, BezugsNr)
dgvEinarbeitung.Rows.Add(art, BezugsNr)
Try
dgvEinarbeitung.FirstDisplayedScrollingRowIndex = dgvEinarbeitung.RowCount - 1
Catch ex As Exception
End Try
End Sub
Function readRMC(d As String) As String
Try
Dim fi As FileInfo = New FileInfo(d)
Dim kdNr = ""
Dim filetimestamp = Regex.Replace(fi.Name, "[^\d]", "") 'entferne alle nicht numerischen Werte!
Dim fileNr = filetimestamp.Substring(0, IIf(filetimestamp.Length > 8, filetimestamp.Length - 8, filetimestamp.Length))
Dim fileType = IIf(fi.Name.ToLower.Contains("nto"), "netto", "brutto")
Dim dt As New DataTable
dt.Columns.Add("KundenNr", GetType(String))
dt.Columns.Add("Kunde", GetType(String))
dt.Columns.Add("UID", GetType(String))
Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(d, Encoding.GetEncoding(1252))
MyReader.TextFieldType = FileIO.FieldType.Delimited
MyReader.SetDelimiters(";")
Dim currentRow As String()
Dim cnt = 0
Dim firstLine = True
While Not MyReader.EndOfData
Try
currentRow = MyReader.ReadFields()
If firstLine Then
If SQL.isleernothing(currentRow(0)) = "KundenNr" Then
firstLine = False
Else
createRMC(fi, fileNr, filetimestamp, currentRow, fileType, kdNr, cnt, dt)
End If
Else
createRMC(fi, fileNr, filetimestamp, currentRow, fileType, kdNr, cnt, dt)
End If
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine & "Datei: " & Dateiname, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End While
readRMC = "Zeilen: " & cnt
End Using
addDGVEinarbeitung("RMC: Detail" & kdNr, readRMC)
If dt.Rows.Count > 0 Then
Dim filepath = VERAG_PROG_ALLGEMEIN.cProgramFunctions.genExcelFromDT_NEW(dt,,,,, False,)
If filepath <> "" Then
Dim anhenge As New List(Of String)
anhenge.Add(filepath)
VERAG_PROG_ALLGEMEIN.cProgramFunctions.sendMail("d.breimaier@verag.ag", "Wölfl-UIDNr", "Im Anhang die zu prüfenden Kunden von WÖLFL " & vbNewLine & vbNewLine & "*Automatic generated e-mail*",,,,, "d.breimaier@verag.ag", anhenge)
End If
End If
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine & "Datei: " & Dateiname, System.Reflection.MethodInfo.GetCurrentMethod.Name)
MsgBox(ex.StackTrace & ex.Message)
readRMC = ""
End Try
End Function
Function readUTA(d As String) As String
Try
Dim fi As FileInfo = New FileInfo(d)
Dim objFileRead As StreamReader = New StreamReader(d)
If uta.readAndSaveUTA(objFileRead, fi) Then
addDGVEinarbeitung(fi.Name, "OK")
Else
addDGVEinarbeitung(fi.Name, "Fehler")
End If
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine & "Datei: " & Dateiname, System.Reflection.MethodInfo.GetCurrentMethod.Name)
MsgBox(ex.StackTrace & ex.Message)
End Try
End Function
Private Sub dgvEinarbeitung_SelectionChanged(sender As Object, e As EventArgs) Handles dgvEinarbeitung.SelectionChanged
dgvEinarbeitung.ClearSelection()
End Sub
Private Sub frmTCNachrichtenVerarbeitung_Shown(sender As Object, e As EventArgs) Handles Me.Shown
If allowClose Then
Me.Refresh()
Button2.PerformClick()
Button1.PerformClick()
System.Threading.Thread.Sleep(2000)
Me.Close()
End If
End Sub
Private Sub createRMC(fi As FileInfo, filenr As Integer, filetimestamp As String, currentRow As String(), fileType As String, ByRef kdNr As String, cnt As Integer, dt As DataTable)
Dim RMC As New VERAG_PROG_ALLGEMEIN.cRMC
RMC.rmc_file = fi.Name
RMC.rmc_version = filetimestamp
RMC.rmc_fileNr = filenr
RMC.rmc_kdNr = SQL.isleernothing(currentRow(0))
RMC.rmc_kdName = SQL.isleernothing(currentRow(1))
RMC.rmc_fibuNr = SQL.isleernothing(currentRow(2))
RMC.rmc_UID = SQL.isleernothing(currentRow(3))
RMC.rmc_landKZ = SQL.isleernothing(currentRow(4))
RMC.rmc_landBezeichnung = SQL.isleernothing(currentRow(5))
RMC.rmc_reDatum = SQL.isleernothing(currentRow(6))
RMC.rmc_sammelReNr = SQL.isleernothing(currentRow(7))
RMC.rmc_reNr = SQL.isleernothing(currentRow(8))
RMC.rmc_betragNetto = SQL.isleernothing(currentRow(9))
RMC.rmc_betragMWST = SQL.isleernothing(currentRow(10))
RMC.rmc_betragBrutto = SQL.isleernothing(currentRow(11))
RMC.rmc_waehrung = SQL.isleernothing(currentRow(12))
RMC.rmc_euroBrutto = SQL.isleernothing(currentRow(13))
RMC.rmc_pdfFileName = "invoice_" & RMC.rmc_kdNr & "_" & filenr & "_" & RMC.rmc_sammelReNr & IIf(fileType = "netto", "_nto_e_verag.pdf", "_bto_e_verag.pdf")
If RMC.SAVE() Then
If kdNr <> RMC.rmc_kdNr Then
Dim adress As New VERAG_PROG_ALLGEMEIN.cAdressen(RMC.rmc_UID, RMC.rmc_kdNr)
If Not adress.hasEntry Then
Dim R As DataRow = dt.NewRow
R("KundenNr") = RMC.rmc_kdNr
R("Kunde") = RMC.rmc_kdName
R("UID") = RMC.rmc_UID
dt.Rows.Add(R)
End If
'If adress IsNot Nothing Then adress.UpdateSpecialField("WölflKundenNr", RMC.rmc_kdNr) -> nicht updaten, sondern nur info ausgeben!
End If
kdNr = RMC.rmc_kdNr
cnt += 1
End If
End Sub
End Class