1020 lines
42 KiB
VB.net
1020 lines
42 KiB
VB.net
Imports System.Data.SqlClient
|
|
Imports com.sun.tools.doclets.internal.toolkit.util
|
|
Imports DAKOSY_Worker
|
|
Imports DocumentFormat.OpenXml.Office2010.Word
|
|
Imports TAlex.WPF.Helpers
|
|
|
|
Public Class usrCntlATLAS_EXGestellung
|
|
|
|
Property ALLG As usrCntlATLAS_EXGestellung
|
|
'Property FilialeNr As Integer
|
|
' Property AbfertigungsNr As Integer
|
|
|
|
' Property BezugsNr As String = ""
|
|
' Property AvisoId As Integer
|
|
'Property SENDUNGS_ID As Integer
|
|
Property AVISO As VERAG_PROG_ALLGEMEIN.cAviso
|
|
Property SENDUNG As VERAG_PROG_ALLGEMEIN.cSendungen
|
|
Dim sentToDakosy = False
|
|
|
|
|
|
Property FIRMA_DY = VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA
|
|
|
|
|
|
|
|
Sub New(AVISO As VERAG_PROG_ALLGEMEIN.cAviso, SENDUNG As VERAG_PROG_ALLGEMEIN.cSendungen, FIRMA_DY As String)
|
|
' Dieser Aufruf ist für den Designer erforderlich.
|
|
InitializeComponent()
|
|
|
|
Me.AVISO = AVISO
|
|
Me.SENDUNG = SENDUNG
|
|
Me.FIRMA_DY = FIRMA_DY
|
|
|
|
|
|
|
|
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
|
|
End Sub
|
|
|
|
|
|
Private Sub usrCntlATLAS_Load(sender As Object, e As EventArgs) Handles Me.Load
|
|
Button4.Visible = True
|
|
cboDakosyAction.Items.Clear()
|
|
cboDakosyAction.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("Neuen Datensatz erstellen", DY_ObjektAktion.OBJ_CREATE))
|
|
cboDakosyAction.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("Vohr. DS ändern", DY_ObjektAktion.OBJ_CHANGE))
|
|
cboDakosyAction.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("Vorh. DS stornieren", DY_ObjektAktion.OBJ_CANCEL))
|
|
cboDakosyAction.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("Datensatz an ZOLL senden", DY_ObjektAktion.OBJ_SEND))
|
|
cboDakosyAction.changeItem(DY_ObjektAktion.OBJ_SEND)
|
|
|
|
sbAbgangZollstelle.initSearchBox(Me.FindForm, "[Code] ,[Code] as Nr,Description as Dienststelle,left(Code,2) as Land,[Description] +' (' +left(Code,2)+')' as display FROM [tbl_DY_ZollDE_C0141_Zollstellen]", {" [Code]", "Description"}, " (StartDate is null OR StartDate< GETDATE()) AND (EndDate is null OR EndDate> GETDATE()) ", " left(Code,2),[Description]", "Code", "display", "FMZOLL", , 400, 200, {"display", "Code"})
|
|
|
|
cbxNCTS.Checked = False
|
|
|
|
If VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = "ATILLA" Or VERAG_PROG_ALLGEMEIN.cAllgemein.NIEDERLASSUNG = "WAI" Then
|
|
Button2.Visible = True
|
|
Label5.Visible = True
|
|
End If
|
|
initStammref()
|
|
|
|
If VERAG_PROG_ALLGEMEIN.cBerechtignunen.CHECK_BERECHTIGUNG_bool("EXG_2_NCTS", "AVISO") Then
|
|
initEXGs()
|
|
Else
|
|
Panel3.Visible = False
|
|
MyPanel2.Visible = False
|
|
MyPanel1.Visible = False
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Sub initEXGs()
|
|
MyPanel1.Visible = False
|
|
Panel3.Visible = False
|
|
MyDatagridview1.DataSource = Nothing
|
|
|
|
If SENDUNG Is Nothing Then Exit Sub
|
|
|
|
Dim bezugsNr As String = SENDUNG.FilialenNr & "/" & SENDUNG.AbfertigungsNr
|
|
Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
|
|
|
|
Try
|
|
Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()
|
|
Dim query As String = "SELECT exg_Id, exg_ObjectName, exg_MRN, exg_CustomsOfficeOfExitForTransitDeclared, exg_Consignor_Name " &
|
|
"FROM tblDakosy_EXG " &
|
|
"WHERE exg_ObjectName LIKE @bezugsNr " &
|
|
"ORDER BY exg_Trans_DatumZeit"
|
|
|
|
Using cmd As New SqlCommand(query, conn)
|
|
cmd.Parameters.AddWithValue("@bezugsNr", bezugsNr.Replace("[", "[[]").Replace("%", "[%]").Replace("_", "[_]") & "[_]EXG[0-9]%")
|
|
|
|
Dim dt As New DataTable
|
|
Using adapter As New SqlDataAdapter(cmd)
|
|
adapter.Fill(dt)
|
|
End Using
|
|
|
|
If dt.Rows.Count > 0 Then
|
|
MyDatagridview1.DataSource = dt
|
|
MyPanel2.Visible = True
|
|
MyPanel2.Enabled = True
|
|
MyPanel1.Visible = True
|
|
Panel3.Visible = True
|
|
MyPanel1.Enabled = True
|
|
|
|
MyDatagridview1.Columns("exg_Id").Visible = False
|
|
MyDatagridview1.Columns("exg_ObjectName").HeaderText = "Bezugsnummer"
|
|
MyDatagridview1.Columns("exg_Consignor_Name").HeaderText = "Versender"
|
|
MyDatagridview1.Columns("exg_MRN").HeaderText = "MRN"
|
|
MyDatagridview1.Columns("exg_CustomsOfficeOfExitForTransitDeclared").HeaderText = "Ausgangszollstelle"
|
|
MyDatagridview1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
|
|
End If
|
|
End Using
|
|
End Using
|
|
|
|
Catch ex As Exception
|
|
MsgBox("Fehler beim Laden der EXG-Datensätze:" & vbCrLf & ex.Message & ex.StackTrace)
|
|
End Try
|
|
End Sub
|
|
|
|
Sub initStammref()
|
|
Select Case FIRMA_DY
|
|
Case "VERAG"
|
|
txtDyMandant.Text = "VERG"
|
|
txtDyNiederlassung.Text = VERAG_PROG_ALLGEMEIN.cAllgemein.NIEDERLASSUNG
|
|
txtDyNiederlassung.Text = VERAG_PROG_ALLGEMEIN.cAllgemein.NIEDERLASSUNG
|
|
|
|
Case "ATILLA"
|
|
txtDyMandant.Text = "ATIL"
|
|
txtDyNiederlassung.Text = "SUW"
|
|
|
|
Case "UNISPED"
|
|
txtDyMandant.Text = "UNAT"
|
|
txtDyNiederlassung.Text = "ATSPED"'"SUB"
|
|
|
|
Case "IMEX"
|
|
txtDyMandant.Text = "IMEX"
|
|
txtDyNiederlassung.Text = "IME"
|
|
|
|
Case "AMBAR"
|
|
txtDyMandant.Text = "ATIL"
|
|
txtDyNiederlassung.Text = "AMBWO"
|
|
End Select
|
|
|
|
Dim MandantWhere As String = "(dySr_dy_Mandant = '" & txtDyMandant.Text & "' " &
|
|
"AND dySr_dy_Niederlassung IN ('','" & txtDyNiederlassung.Text & "'))"
|
|
|
|
'Select Case FIRMA_DY
|
|
' Case "ATILLA"
|
|
' MandantWhere = "((dySr_dy_Mandant = 'ATIL' AND dySr_dy_Niederlassung = 'SUW') " &
|
|
' "OR (dySr_dy_Mandant = 'UNAT' AND dySr_dy_Niederlassung = 'SUB'))"
|
|
|
|
' Case Else
|
|
' MandantWhere = "(dySr_dy_Mandant = '" & txtDyMandant.Text & "' " &
|
|
' "AND dySr_dy_Niederlassung IN ('','" & txtDyNiederlassung.Text & "'))"
|
|
'End Select
|
|
|
|
' Dim BezugsNr = ("ID" & AVISO.AvisoID & "_" & SENDUNG.FilialenNr & "-" & SENDUNG.AbfertigungsNr & "_" & If(AVISO.Auftraggeber.Length > 8, AVISO.Auftraggeber.ToString.Substring(0, 5), AVISO.Auftraggeber)).Trim
|
|
|
|
Dim BezugsNr = SENDUNG.FilialenNr & "/" & SENDUNG.AbfertigungsNr & "_EXG"
|
|
lblBezugsnummer.Text = BezugsNr
|
|
|
|
cboStammreferenz.fillWithSQL("SELECT [dySr_Stammreferenz],[dySr_Bezeichnung] FROM [tblDakosy_Stammreferenzen] WHERE dySr_Land='DE' AND dySr_Verfahren='EXG' and " & MandantWhere & " and dySr_visible=1", False, "FMZOLL", True)
|
|
' MsgBox("SELECT [dySr_Stammreferenz],[dySr_Bezeichnung] FROM [tblDakosy_Stammreferenzen] WHERE dySr_Land='DE' AND dySr_Verfahren='AA' and dySr_dy_Mandant='" & txtDyMandant.Text & "' and dySr_dy_Niederlassung IN ('','" & txtDyNiederlassung.Text & "') and dySr_visible=1")
|
|
cboStammreferenz.changeItem("")
|
|
If cboStammreferenz.Items.Count = 2 Then
|
|
cboStammreferenz.SelectedIndex = 1
|
|
End If
|
|
|
|
|
|
cboStammreferenz2.fillWithSQL("SELECT [dySr_Stammreferenz],[dySr_Bezeichnung] FROM [tblDakosy_Stammreferenzen] WHERE dySr_Land='DE' AND dySr_Verfahren='NCTS' and dySr_dy_Mandant='" & txtDyMandant.Text & "' and dySr_dy_Niederlassung IN ('','" & txtDyNiederlassung.Text.Replace("DTB", "SUB") & "') and dySr_visible=1", False, "FMZOLL", True)
|
|
cboStammreferenz2.changeItem("")
|
|
|
|
|
|
End Sub
|
|
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
|
|
|
|
Me.Cursor = Cursors.WaitCursor
|
|
Dim err = False
|
|
' If cboStammreferenz._value = "" Then MsgBox("Stammreferenz auswählen!") : Me.Cursor = Cursors.Default : Exit Sub
|
|
If sbAbgangZollstelle._value = "" Then MsgBox("Zollstelle auswählen!") : Me.Cursor = Cursors.Default : Exit Sub
|
|
If Not sbAbgangZollstelle._value.StartsWith("DE") Then MsgBox("Gültige Zollstelle (in DE) auswählen!") : Me.Cursor = Cursors.Default : Exit Sub
|
|
If rtbMRN.Text.Trim = "" Then MsgBox("MRN auswählen!") : Me.Cursor = Cursors.Default : Exit Sub
|
|
|
|
|
|
delDuplicates() 'Duplikate entfernen
|
|
|
|
Dim exg_list = New List(Of Integer)
|
|
Dim dblcheck = ""
|
|
'MRN Prüfung:
|
|
For Each l In rtbMRN.Lines
|
|
|
|
If l.Trim <> "" Then
|
|
'If l.Trim.Length >= 18 And dblcheck.Contains(l.Trim) Then
|
|
' MsgBox("Doppelte MRN !: " & l)
|
|
' Me.Cursor = Cursors.Default
|
|
' Exit Sub
|
|
'End If
|
|
If Not IsValidMRN(l.Trim) Then
|
|
MsgBox("Ungültige MRN (Format): " & l)
|
|
Me.Cursor = Cursors.Default
|
|
Exit Sub
|
|
End If
|
|
dblcheck &= l.Trim
|
|
End If
|
|
Next
|
|
|
|
If sentToDakosy OrElse vbYes = MsgBox("Soll(en) die Ausfuhr-Gestellung(en) abgeschickt werden?", vbYesNoCancel) Then
|
|
Dim cnt = 1
|
|
'Senden:
|
|
For Each l In rtbMRN.Lines
|
|
If l.Trim <> "" Then
|
|
|
|
If Not sendEXP_MRN(l.Trim.ToUpper, sbAbgangZollstelle._value, cnt, exg_list, FIRMA_DY) Then
|
|
MsgBox("Sendefehler bei " & l)
|
|
err = True
|
|
End If
|
|
cnt += 1
|
|
End If
|
|
Next
|
|
If Not err Then
|
|
If cbxNCTS.Checked Then
|
|
Dim NCTS_OUT = usrCntlATLAS_NCTS004.genNCTSfromStammref(Me, FIRMA_DY, AVISO, SENDUNG, "")
|
|
|
|
If NCTS_OUT Is Nothing Then
|
|
MsgBox("NCTS-Entwurf konnte nicht erstellt werden!")
|
|
Exit Sub
|
|
End If
|
|
|
|
If NCTS_OUT.ncts_Id <= 0 OrElse NCTS_OUT.ncts_dyaAnmID <= 0 Then
|
|
MsgBox("NCTS-Entwurf hat keine gültige ID!")
|
|
Exit Sub
|
|
End If
|
|
|
|
NCTS_OUT.ncts_HOUSE_CONSIGNMENT.Clear()
|
|
NCTS_OUT.DELETE_HouseConsignment()
|
|
|
|
If Not NCTS_OUT.SAVE_ALL() Then
|
|
MsgBox("NCTS-Entwurf konnte nicht gespeichert werden!")
|
|
Exit Sub
|
|
End If
|
|
|
|
For Each exgId In exg_list
|
|
cDakosyEXG.UPDATE_FillNCTS_ID(exgId, NCTS_OUT.ncts_dyaAnmID)
|
|
Next
|
|
|
|
lblBezugsnummer.Text = NCTS_OUT.ncts_ObjectName
|
|
End If
|
|
End If
|
|
Me.FindForm.Close()
|
|
End If
|
|
|
|
Me.Cursor = Cursors.Default
|
|
End Sub
|
|
|
|
Private isFormattingMRN As Boolean = False
|
|
|
|
Private Sub rtbMRN_KeyPress(sender As Object, e As KeyPressEventArgs) Handles rtbMRN.KeyPress
|
|
If e.KeyChar = ChrW(13) OrElse e.KeyChar = ChrW(10) Then
|
|
e.Handled = True
|
|
Exit Sub
|
|
End If
|
|
|
|
If Char.IsControl(e.KeyChar) Then Exit Sub
|
|
|
|
Dim pos = rtbMRN.SelectionStart
|
|
Dim lineIndex = rtbMRN.GetLineFromCharIndex(pos)
|
|
Dim lineStart = rtbMRN.GetFirstCharIndexFromLine(lineIndex)
|
|
|
|
If lineStart < 0 Then Exit Sub
|
|
|
|
Dim lineLength = pos - lineStart
|
|
|
|
If lineLength = 17 AndAlso rtbMRN.SelectionLength = 0 Then
|
|
e.Handled = True
|
|
rtbMRN.SelectedText = Char.ToUpperInvariant(e.KeyChar) & vbCrLf
|
|
rtbMRN.Select(rtbMRN.TextLength, 0)
|
|
rtbMRN.ScrollToCaret()
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub rtbMRN_KeyDown(sender As Object, e As KeyEventArgs) Handles rtbMRN.KeyDown
|
|
If e.KeyCode = Keys.Enter Then
|
|
e.SuppressKeyPress = True
|
|
e.Handled = True
|
|
|
|
Dim pos = rtbMRN.SelectionStart
|
|
Dim lineIndex = rtbMRN.GetLineFromCharIndex(pos)
|
|
Dim lineStart = rtbMRN.GetFirstCharIndexFromLine(lineIndex)
|
|
|
|
If lineStart < 0 Then Exit Sub
|
|
|
|
Dim lineText = If(lineIndex >= 0 AndAlso lineIndex < rtbMRN.Lines.Length, rtbMRN.Lines(lineIndex), "")
|
|
|
|
If String.IsNullOrWhiteSpace(lineText) Then Exit Sub
|
|
If pos <> lineStart + lineText.Length Then Exit Sub
|
|
|
|
' Keine weitere Zeile, wenn bereits ein Umbruch folgt
|
|
If pos < rtbMRN.TextLength AndAlso
|
|
(rtbMRN.Text(pos) = ChrW(13) OrElse rtbMRN.Text(pos) = ChrW(10)) Then Exit Sub
|
|
|
|
rtbMRN.SelectedText = vbCrLf
|
|
rtbMRN.Select(rtbMRN.TextLength, 0)
|
|
Exit Sub
|
|
End If
|
|
|
|
If e.KeyCode <> Keys.Back OrElse rtbMRN.SelectionLength > 0 Then Exit Sub
|
|
|
|
Dim posBack = rtbMRN.SelectionStart
|
|
If posBack = 0 Then Exit Sub
|
|
|
|
Dim lineIndexBack = rtbMRN.GetLineFromCharIndex(posBack)
|
|
Dim lineStartBack = rtbMRN.GetFirstCharIndexFromLine(lineIndexBack)
|
|
|
|
If lineIndexBack > 0 AndAlso posBack = lineStartBack Then
|
|
e.SuppressKeyPress = True
|
|
|
|
Dim prevStart = rtbMRN.GetFirstCharIndexFromLine(lineIndexBack - 1)
|
|
Dim prevText = rtbMRN.Lines(lineIndexBack - 1)
|
|
|
|
If prevText.Length > 0 Then
|
|
rtbMRN.Select(prevStart + prevText.Length - 1, 1)
|
|
rtbMRN.SelectedText = ""
|
|
rtbMRN.SelectionStart = prevStart + prevText.Length - 1
|
|
End If
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub rtbMRN_TextChanged(sender As Object, e As EventArgs) Handles rtbMRN.TextChanged
|
|
If isFormattingMRN Then Exit Sub
|
|
|
|
Dim original = rtbMRN.Text
|
|
Dim pos = rtbMRN.SelectionStart
|
|
Dim normalized = original.Replace(vbCrLf, vbLf).Replace(vbCr, vbLf)
|
|
Dim lines = normalized.Split(ControlChars.Lf)
|
|
Dim resultLines As New List(Of String)
|
|
|
|
For Each l In lines
|
|
If l.Trim() <> "" Then resultLines.Add(l)
|
|
Next
|
|
|
|
Dim result = String.Join(vbCrLf, resultLines)
|
|
|
|
' Eine leere letzte Zeile erlauben
|
|
If normalized.EndsWith(vbLf) AndAlso result <> "" Then result &= vbCrLf
|
|
|
|
If original <> result Then
|
|
isFormattingMRN = True
|
|
Try
|
|
rtbMRN.Text = result
|
|
rtbMRN.SelectionStart = Math.Min(pos, rtbMRN.TextLength)
|
|
rtbMRN.SelectionLength = 0
|
|
Finally
|
|
isFormattingMRN = False
|
|
End Try
|
|
End If
|
|
|
|
Label9.Text = "Anzahl: " & resultLines.Count.ToString()
|
|
End Sub
|
|
Function sendEXP_MRN(MRN As String, Zollstelle As String, zeile As String, ByRef exg_list As List(Of Integer), Optional FIRMA_DY_TEMP As String = "") As Boolean
|
|
|
|
Me.Refresh()
|
|
|
|
' Dim cDyAnm As New cDakosy_Zollanmeldungen(cDy_ART, BezugsNr, AVISO.AvisoID, SENDUNG.tblSnd_SendungID)
|
|
'loadDYZollanmeldungen()
|
|
Dim dy_Id = -1
|
|
If True Then
|
|
''Dim cDY As New cDakosyNCTSOut(cDyAnm.dy_Id, cDyAnm.dy_Erstellung_SB)
|
|
'ncts_OUT.ncts_dyaAnmID = DY_ANM.dy_Id
|
|
'ncts_OUT.ncts_Erstellung_SB = DY_ANM.dy_Erstellung_SB
|
|
'ncts_OUT.ncts_LetzteBearbeitung = Now
|
|
'ncts_OUT.ncts_LetzteBearbeitung_SB = DY_ANM.dy_LetzteBearbeitung_SB
|
|
'ncts_OUT.ncts_firma = Me.FIRMA_DY
|
|
' DAKOSY_Interface_SEND.loadInClass_VersandanmeldungNCTSDE_003(ncts_OUT, Me, DY_ANM, Me.FIRMA_DY)
|
|
|
|
Dim EXG As New DAKOSY_Worker.cDakosyEXG
|
|
EXG.exg_MRN = MRN
|
|
EXG.exg_CustomsOfficeOfExitForTransitDeclared = Zollstelle
|
|
' dim FilialenNr
|
|
|
|
Dim zusatz = ""
|
|
If TextBox1.Text <> "" Then zusatz = "/" & TextBox1.Text
|
|
|
|
|
|
EXG.exg_ObjectName = SENDUNG.FilialenNr & "/" & SENDUNG.AbfertigungsNr & "_EXG" & zeile & "" & zusatz '---> >>> MRN KÜRZEN!!!!
|
|
|
|
'EXG.exg_ObjectName = AVISO.AvisoID & "_EXP_" & EXG.exg_MRN.ToString().Substring(0, 4) & EXG.exg_MRN.ToString.Substring(14) & zusatz '---> >>> MRN KÜRZEN!!!!
|
|
'EXG.exg_ObjectName = AVISO.AvisoID & "_EXP_" & EXG.exg_MRN
|
|
|
|
|
|
|
|
Dim FIRMA_DY = VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA
|
|
FIRMA_DY = DAKOSY_Worker.cDakosyFunftions.getFirma_DY(SENDUNG.FilialenNr, Me.FindForm, "EXG") ' -> hier liegt vermutlich der Fehler, die Firma wird hier nochmals gesetzt
|
|
|
|
If FIRMA_DY_TEMP <> "" Then
|
|
FIRMA_DY = FIRMA_DY_TEMP
|
|
End If
|
|
|
|
Dim saveFile = ""
|
|
|
|
If EXG.SAVE_ALL Then
|
|
exg_list.Add(EXG.exg_Id)
|
|
|
|
If generatePresentationEXITDE_003(EXG, AVISO, SENDUNG, EXG.exg_ObjectName, saveFile, cboDakosyAction._value, FIRMA_DY, cboStammreferenz._value) Then
|
|
If saveFile <> "" Then
|
|
If cDakosyFunftions.send_Data_To_Dakosy_FTP(saveFile, lblBezugsnummer.Text, dy_Id, FIRMA_DY) Then
|
|
'DAKOSY_Worker.cDakosy_Statusmeldungen.InsertStatusMeldung(DY_ANM, DAKOSY_Worker.cDY_Statusliste.S_03)
|
|
If SENDUNG IsNot Nothing Then SENDUNG.SET_VGMA() ' MA Vorgeschrieben in Sendung setzen.
|
|
Return True
|
|
Else
|
|
'DAKOSY_Worker.cDakosy_Statusmeldungen.InsertStatusMeldung(DY_ANM, DAKOSY_Worker.cDY_Statusliste.S_09)
|
|
Return False
|
|
End If
|
|
End If
|
|
End If
|
|
|
|
End If
|
|
End If
|
|
|
|
|
|
' DY_ANM.UPDATE_DATA()
|
|
|
|
'Beim Senden soll die Sendung überhnommen + tblSnd_VG_MA gesetzt werden --> damit gleich gesehen wird, dass der Akt in Bearbeitung ist.
|
|
' DY_ANM.UPDATE_AVISO_SND(DY_ANM.dy_SendungsId)
|
|
|
|
|
|
Return False
|
|
|
|
End Function
|
|
|
|
|
|
|
|
|
|
Shared Function generatePresentationEXITDE_003(EXG As DAKOSY_Worker.cDakosyEXG, AVISO As VERAG_PROG_ALLGEMEIN.cAviso, SND As VERAG_PROG_ALLGEMEIN.cSendungen, ByVal Bezugsnummer As String, ByRef saveFile As String, DY_ACTION As String, FIRMA_DY As String, Optional BezugsnummerVorblendung As String = "") As Boolean
|
|
Dim Interface_VERSION = "003"
|
|
Dim ObjectAktion = DY_ACTION
|
|
' Dim BezugsnummerVorblendung = "AA_NCTS_DE_ZE_WO_MITTICH"
|
|
|
|
Dim XML As New DAKOSY_Worker.PresentationEXITDE.GestellungXPTyp
|
|
|
|
|
|
If Bezugsnummer.Length > 22 Then
|
|
Bezugsnummer = Bezugsnummer.Substring(0, 22)
|
|
End If
|
|
'Transaktion:
|
|
XML.Transaktion = New PresentationEXITDE.TransaktionExportTyp
|
|
XML.Transaktion.IOPartner = SDL.DAKOSY_Interface_SEND.getIOPartner(FIRMA_DY) 'If(VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM, "VERA", "VERG")
|
|
XML.Transaktion.IODatumZeit = Now
|
|
XML.Transaktion.IOReferenz = SND.FilialenNr & "-" & SND.AbfertigungsNr & "_" & Now.ToString("ddMMyyHHmmSS")
|
|
If Not VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM And XML.Transaktion.IOPartner <> "UNAT" Then
|
|
XML.Transaktion.IODivision3 = SDL.DAKOSY_Interface_SEND.getDivision(FIRMA_DY) '"SUW"
|
|
End If
|
|
XML.Transaktion.Version = Interface_VERSION
|
|
|
|
Dim XML_EG = New PresentationEXITDE.EinzelGestellungTyp
|
|
'ObjektIdentifizierung:
|
|
XML_EG.ObjektIdentifizierung.ObjektName = Bezugsnummer
|
|
|
|
'If Bezugsnummer IsNot Nothing Then XML_EG.ObjektIdentifizierung.ObjektAliasname = Bezugsnummer
|
|
Dim ObjektAktionLst As New List(Of String)
|
|
If ObjectAktion = "SEND" Then
|
|
ObjektAktionLst.Add("CREATE")
|
|
End If
|
|
ObjektAktionLst.Add(ObjectAktion)
|
|
XML_EG.ObjektIdentifizierung.ObjektAktion = ObjektAktionLst
|
|
If If(VERAG_PROG_ALLGEMEIN.cAllgemein.MITARBEITER.mit_DAKOSY_SB, "") <> "" Then XML_EG.ObjektIdentifizierung.Bearbeiter = VERAG_PROG_ALLGEMEIN.cAllgemein.MITARBEITER.mit_DAKOSY_SB
|
|
|
|
If BezugsnummerVorblendung IsNot Nothing AndAlso BezugsnummerVorblendung <> "" Then XML_EG.ObjektIdentifizierung.BezugsnummerVorblendung = BezugsnummerVorblendung
|
|
|
|
'TransitOperation:
|
|
XML_EG.HeaderData = New PresentationEXITDE.KopfDatenGestellungTyp
|
|
XML_EG.HeaderData.MRN = EXG.exg_MRN
|
|
XML_EG.HeaderData.ArrivalNotificationDateAndTime = Now
|
|
|
|
XML_EG.HeaderData.ExitCarrier.ContactPerson.Name = VERAG_PROG_ALLGEMEIN.cAllgemein.USRNAME
|
|
If If(VERAG_PROG_ALLGEMEIN.cAllgemein.MITARBEITER.mit_telefonnr, "") <> "" Then
|
|
XML_EG.HeaderData.ExitCarrier.ContactPerson.PhoneNumber = VERAG_PROG_ALLGEMEIN.cAllgemein.MITARBEITER.mit_telefonnr
|
|
Else
|
|
Select Case VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA
|
|
Case "UNISPED"
|
|
XML_EG.HeaderData.ExitCarrier.ContactPerson.PhoneNumber = "0043771126770"
|
|
Case "AMBAR"
|
|
XML_EG.HeaderData.ExitCarrier.ContactPerson.PhoneNumber = "004986519962492"
|
|
Case "IMEX"
|
|
XML_EG.HeaderData.ExitCarrier.ContactPerson.PhoneNumber = "00437711 31630"
|
|
Case "ATILLA"
|
|
XML_EG.HeaderData.ExitCarrier.ContactPerson.PhoneNumber = "0043771128450"
|
|
Case Else
|
|
XML_EG.HeaderData.ExitCarrier.ContactPerson.PhoneNumber = "004377112777200"
|
|
End Select
|
|
End If
|
|
|
|
|
|
|
|
XML_EG.HeaderData.CustomsOfficeOfExitActual = EXG.exg_CustomsOfficeOfExitForTransitDeclared
|
|
'If cDY.ncts_CountryOfDispatch IsNot Nothing Then XML.EinzelEingangsanzeige.TransitOperation.CustomsOfficeOfDestinationActual = cDY.ncts_CountryOfDispatch
|
|
'If SND.tblSnd_ATB_T1 IsNot Nothing Then XML.EinzelEingangsanzeige.TransitOperation.MRN = SND.tblSnd_ATB_T1
|
|
'XML.EinzelEingangsanzeige.TransitOperation.ArrivalNotificationDateAndTime = Now
|
|
|
|
'XML.EinzelEingangsanzeige.TransitOperation.IncidentFlag = "N"
|
|
|
|
XML.DeclarationData.Add(XML_EG)
|
|
|
|
|
|
' Dim saveDir = System.Reflection.Assembly.GetExecutingAssembly().Location & "\Dakosy_SEND\"
|
|
|
|
Dim saveDir = Application.StartupPath & "\Dakosy_SEND\"
|
|
If Not System.IO.Directory.Exists(saveDir) Then
|
|
System.IO.Directory.CreateDirectory(saveDir)
|
|
End If
|
|
|
|
saveFile = saveDir & "DY_EXG_" & Now.ToString("yyMMdd_HHmmss_fff") & ".xml"
|
|
|
|
XML.SaveToFile(saveFile)
|
|
|
|
'SDL.DAKOSY_Interface_SEND.replaceNullDateXML(saveFile)
|
|
|
|
Return True
|
|
End Function
|
|
|
|
|
|
|
|
|
|
Public Function IsValidMRN(mrn As String) As Boolean
|
|
'' Überprüfen, ob die Länge genau 18 Zeichen beträgt
|
|
'If String.IsNullOrEmpty(mrn) OrElse mrn.Length <> 18 Then
|
|
' Return False
|
|
'End If
|
|
|
|
'' Überprüfen, ob die ersten zwei Zeichen Buchstaben sind (Ländercode)
|
|
'If Not Char.IsLetter(mrn(0)) OrElse Not Char.IsLetter(mrn(1)) Then
|
|
' Return False
|
|
'End If
|
|
|
|
'' Überprüfen, ob die nächsten zwei Zeichen Ziffern sind (Jahreszahl)
|
|
'If Not Char.IsDigit(mrn(2)) OrElse Not Char.IsDigit(mrn(3)) Then
|
|
' Return False
|
|
'End If
|
|
|
|
'' Überprüfen, ob die nächsten 12 Zeichen alphanumerisch sind
|
|
'For i As Integer = 4 To 15
|
|
' If Not Char.IsLetterOrDigit(mrn(i)) Then
|
|
' Return False
|
|
' End If
|
|
'Next
|
|
|
|
'' Überprüfen, ob die letzten zwei Zeichen Prüfziffern sind (optional, falls komplexere Prüfung erforderlich)
|
|
'For i As Integer = 16 To 17
|
|
' If Not Char.IsDigit(mrn(i)) Then
|
|
' Return False
|
|
' End If
|
|
'Next
|
|
|
|
'' Alle Prüfungen bestanden
|
|
'Return True
|
|
|
|
' Überprüfen, ob die Länge genau 18 Zeichen beträgt
|
|
If String.IsNullOrEmpty(mrn) OrElse mrn.Length <> 18 Then
|
|
Return False
|
|
End If
|
|
|
|
' Überprüfen, ob die ersten zwei Zeichen Ziffern sind (Jahreszahl)
|
|
If Not Char.IsDigit(mrn(0)) OrElse Not Char.IsDigit(mrn(1)) Then
|
|
Return False
|
|
End If
|
|
|
|
' Überprüfen, ob die nächsten zwei Zeichen Buchstaben sind (Ländercode)
|
|
If Not Char.IsLetter(mrn(2)) OrElse Not Char.IsLetter(mrn(3)) Then
|
|
Return False
|
|
End If
|
|
|
|
'' Überprüfen, ob die nächsten 12 Zeichen alphanumerisch sind
|
|
'For i As Integer = 4 To 15
|
|
' If Not Char.IsLetterOrDigit(mrn(i)) Then
|
|
' Return False
|
|
' End If
|
|
'Next
|
|
|
|
'' Überprüfen, ob die letzten zwei Zeichen Ziffern sind (Prüfziffern)
|
|
'For i As Integer = 16 To 17
|
|
' If Not Char.IsDigit(mrn(i)) Then
|
|
' Return False
|
|
' End If
|
|
'Next
|
|
Return True
|
|
End Function
|
|
|
|
Private Sub cbxNCTS_CheckedChanged(sender As Object, e As EventArgs) Handles cbxNCTS.CheckedChanged
|
|
MyPanel2.Enabled = cbxNCTS.Checked
|
|
End Sub
|
|
|
|
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
|
|
FIRMA_DY = Button2.Text
|
|
initStammref()
|
|
|
|
|
|
If VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = "ATILLA" Then
|
|
If Button2.Text = "UNISPED" Then
|
|
Button2.Text = "ATILLA"
|
|
Else
|
|
Button2.Text = "UNISPED"
|
|
End If
|
|
End If
|
|
If VERAG_PROG_ALLGEMEIN.cAllgemein.NIEDERLASSUNG = "WAI" Then
|
|
If Button2.Text = "UNISPED" Then
|
|
Button2.Text = "VERAG"
|
|
Else
|
|
Button2.Text = "UNISPED"
|
|
End If
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
|
|
Dim exgIds As New List(Of Integer)
|
|
|
|
For Each row As DataGridViewRow In MyDatagridview1.Rows
|
|
If Not row.IsNewRow AndAlso row.Cells("exg_Id").Value IsNot Nothing Then
|
|
exgIds.Add(Convert.ToInt32(row.Cells("exg_Id").Value))
|
|
End If
|
|
Next
|
|
|
|
If exgIds.Count = 0 Then
|
|
MsgBox("Keine EXG-Gestellungen vorhanden!")
|
|
Exit Sub
|
|
End If
|
|
|
|
Try
|
|
Me.Cursor = Cursors.WaitCursor
|
|
|
|
Dim saveFile As String = SendNCTS(exgIds, True, "T1")
|
|
|
|
'MsgBox("NCTS erfolgreich erstellt!" & vbCrLf & saveFile)
|
|
'Process.Start(saveFile)
|
|
|
|
Me.FindForm.Close()
|
|
Catch ex As Exception
|
|
MsgBox("Fehler beim Erstellen des NCTS:" & vbCrLf & ex.Message)
|
|
Finally
|
|
Me.Cursor = Cursors.Default
|
|
End Try
|
|
End Sub
|
|
Function SendNCTS(exgIds As List(Of Integer), Optional sendFTP As Boolean = False, Optional nctsArt As String = "T2") As String
|
|
If exgIds Is Nothing OrElse exgIds.Count = 0 Then
|
|
Throw New Exception("Keine EXG-Gestellungen übergeben.")
|
|
End If
|
|
|
|
'Console.WriteLine("EXG-Test: " & exgIds.Count & " Gestellungen gefunden.")
|
|
|
|
Dim BezugsNr As String = ""
|
|
BezugsNr = usrCntlATLAS_NCTS004.getBezugsnr(txtDyMandant.Text, SENDUNG, BezugsNr, "")
|
|
Dim NCTS_OUT As New DAKOSY_Worker.cDakosyNCTSOut004
|
|
Dim DY_ANM As New cDakosy_Zollanmeldungen
|
|
Dim firma As String = ""
|
|
Dim niederlassung As String = ""
|
|
Dim firstEXG As Boolean = True
|
|
|
|
NCTS_OUT.ncts_ObjectName = BezugsNr
|
|
If cboStammreferenz2._value <> "" Then NCTS_OUT.ncts_BezugsnummerVorblendung = cboStammreferenz2._value
|
|
|
|
'::::AVISO Daten befüllen::::
|
|
cDakosyNCTSOut004.loaddataFromAVISO(AVISO, SENDUNG, "", BezugsNr, NCTS_OUT, FIRMA_DY, False)
|
|
'::::::::::::::::::::::::::::
|
|
|
|
'EXG-Daten laden und NCTS befüllen
|
|
For Each exgId In exgIds.Distinct()
|
|
Dim EXG As New DAKOSY_Worker.cDakosyEXG
|
|
EXG.exg_Id = exgId
|
|
|
|
If Not EXG.LOAD(True) Then Throw New Exception("EXG nicht gefunden: " & exgId)
|
|
If EXG.exg_POSITION Is Nothing OrElse EXG.exg_POSITION.Count = 0 Then Throw New Exception("EXG ohne Positionen: " & exgId)
|
|
|
|
|
|
If firstEXG Then
|
|
firma = EXG.exg_firma
|
|
niederlassung = EXG.exg_niederlassung
|
|
firstEXG = False
|
|
Else
|
|
If firma <> EXG.exg_firma OrElse niederlassung <> EXG.exg_niederlassung Then
|
|
Throw New Exception("EXG-Datensätze gehören zu unterschiedlichen Firmen oder Niederlassungen.")
|
|
End If
|
|
End If
|
|
|
|
DAKOSY_Worker.cDakosyNCTSOut004.fillNCTS_WithEXG(NCTS_OUT, EXG, BezugsNr, cbxAutoTranslate.Checked, cbxForceTranslate.Checked, cbxVersLand.Checked, cbxBestLand.Checked)
|
|
|
|
'Console.WriteLine("NCTS: EXG übernommen: " & EXG.exg_ObjectName)
|
|
|
|
'Dim HC = NCTS_OUT.ncts_HOUSE_CONSIGNMENT.Last()
|
|
'Console.WriteLine("EXG: " & EXG.exg_ObjectName)
|
|
'Console.WriteLine("EXG Versender: " & Convert.ToString(EXG.exg_Consignor_Name))
|
|
'Console.WriteLine("EXG Empfänger: " & Convert.ToString(EXG.exg_Consignee_Name))
|
|
'Console.WriteLine("NCTS Versender: " & Convert.ToString(HC.nctsHC_Consignor_Name))
|
|
'Console.WriteLine("NCTS Empfänger: " & Convert.ToString(HC.nctsHC_Consignee_Name))
|
|
Next
|
|
|
|
If If(firma, "") = "" Then firma = VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA
|
|
|
|
|
|
If NCTS_OUT.ncts_HOUSE_CONSIGNMENT Is Nothing OrElse NCTS_OUT.ncts_HOUSE_CONSIGNMENT.Count = 0 Then
|
|
Throw New Exception("Keine NCTS-House-Consignments erzeugt.")
|
|
End If
|
|
|
|
'Neue Zollanmeldung erstellen
|
|
DY_ANM.dy_ART = nctsArt
|
|
DY_ANM.dy_BezugsNr = BezugsNr
|
|
DY_ANM.dy_AvisoId = If(AVISO Is Nothing, Nothing, AVISO.AvisoID)
|
|
DY_ANM.dy_SendungsId = If(SENDUNG Is Nothing, Nothing, SENDUNG.tblSnd_SendungID)
|
|
|
|
If Not DY_ANM.SAVE() OrElse DY_ANM.dy_Id <= 0 Then
|
|
Throw New Exception("NCTS-Zollanmeldung konnte nicht erstellt werden.")
|
|
End If
|
|
|
|
'NCTS ergänzen
|
|
NCTS_OUT.ncts_Trans_Referenz = BezugsNr & "_" & Now.ToString("ddMMyyHHmmss")
|
|
NCTS_OUT.ncts_niederlassung = If(String.IsNullOrWhiteSpace(niederlassung), "SUB", niederlassung)
|
|
NCTS_OUT.ncts_Declarationtype = nctsArt
|
|
|
|
'NCTS speichern und optional versenden
|
|
Return cDakosyNCTSOut004.SaveAndSendNCTS(NCTS_OUT, DY_ANM, BezugsNr, If(String.IsNullOrWhiteSpace(firma), "VERAG", firma), sendFTP, SENDUNG, "CREATE", nctsArt)
|
|
|
|
|
|
|
|
|
|
''NCTS mit Zollanmeldung verknüpfen
|
|
'NCTS_OUT.ncts_ObjectName = BezugsNr
|
|
'NCTS_OUT.ncts_dyaAnmID = DY_ANM.dy_Id
|
|
'NCTS_OUT.ncts_Trans_Referenz = BezugsNr & "_" & Now.ToString("ddMMyyHHmmss")
|
|
'NCTS_OUT.ncts_Erstellung_SB = DY_ANM.dy_Erstellung_SB
|
|
'NCTS_OUT.ncts_LetzteBearbeitung = Now
|
|
'NCTS_OUT.ncts_LetzteBearbeitung_SB = DY_ANM.dy_LetzteBearbeitung_SB
|
|
'NCTS_OUT.ncts_firma = If(String.IsNullOrWhiteSpace(firma), "VERAG", firma)
|
|
'NCTS_OUT.ncts_niederlassung = If(String.IsNullOrWhiteSpace(niederlassung), "SUB", niederlassung)
|
|
|
|
''CheckNCTSStringLengths(NCTS_OUT)
|
|
|
|
'If Not NCTS_OUT.SAVE_ALL() Then
|
|
' Throw New Exception("NCTS-Daten konnten nicht gespeichert werden. DY-ID: " & DY_ANM.dy_Id)
|
|
'End If
|
|
|
|
''NCTS-XML erstellen
|
|
'Dim saveFile As String = ""
|
|
|
|
'If Not cDakosyNCTSOut004.generateVersandanmeldungNCTSDE_004(NCTS_OUT, saveFile, "CREATE", Application.StartupPath, "NCTS") Then
|
|
' Throw New Exception("NCTS-XML konnte nicht erzeugt werden.")
|
|
'End If
|
|
|
|
'If String.IsNullOrWhiteSpace(saveFile) OrElse Not System.IO.File.Exists(saveFile) Then
|
|
' Throw New Exception("NCTS-XML-Datei fehlt.")
|
|
'End If
|
|
|
|
''Optional an DAKOSY senden
|
|
'If sendFTP Then
|
|
' If cDakosyFunftions.send_Data_To_Dakosy_FTP(saveFile, BezugsNr, DY_ANM.dy_Id, firma) Then
|
|
' DAKOSY_Worker.cDakosy_Statusmeldungen.InsertStatusMeldung(DY_ANM, DAKOSY_Worker.cDY_Statusliste.S_03)
|
|
' DY_ANM.UPDATE_DATA()
|
|
' DY_ANM.UPDATE_AVISO_SND(DY_ANM.dy_SendungsId)
|
|
' Else
|
|
' DAKOSY_Worker.cDakosy_Statusmeldungen.InsertStatusMeldung(DY_ANM, DAKOSY_Worker.cDY_Statusliste.S_09)
|
|
' Throw New Exception("NCTS-FTP-Versand fehlgeschlagen. DY-ID: " & DY_ANM.dy_Id)
|
|
' End If
|
|
'End If
|
|
|
|
''Console.WriteLine("NCTS: " & BezugsNr & " / DY-ID: " & DY_ANM.dy_Id)
|
|
|
|
'Return saveFile
|
|
End Function
|
|
Sub delDuplicates()
|
|
rtbMRN.Lines = rtbMRN.Lines.
|
|
Select(Function(l) l.Trim().ToUpperInvariant()).
|
|
Where(Function(l) l <> "").
|
|
Distinct().
|
|
ToArray()
|
|
End Sub
|
|
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
|
|
delDuplicates()
|
|
End Sub
|
|
|
|
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
|
|
Label10.Text = "MRNs werden gelesen..."
|
|
Label10.Refresh()
|
|
|
|
Dim mrns As List(Of cPDFMRNResult) = readEXDataFromPDF()
|
|
|
|
If mrns IsNot Nothing AndAlso mrns.Count > 0 Then
|
|
Dim uniqueMRNs = mrns.Select(Function(x) x.MRN).Distinct().ToList()
|
|
rtbMRN.Text = String.Join(Environment.NewLine, uniqueMRNs)
|
|
Label10.Text = $"{uniqueMRNs.Count} MRN erkannt"
|
|
Else
|
|
Label10.Text = "Keine MRNs gefunden."
|
|
End If
|
|
End Sub
|
|
|
|
Private Function readEXDataFromPDF() As List(Of cPDFMRNResult)
|
|
Dim f As New frmImportFromAVISOAnhaenge(AVISO, SENDUNG)
|
|
f.ShowDialog(Me)
|
|
|
|
If f.DialogResult <> DialogResult.OK Then Return New List(Of cPDFMRNResult)
|
|
If f.LIST_FILES Is Nothing OrElse f.LIST_FILES.Count = 0 Then Return New List(Of cPDFMRNResult)
|
|
|
|
Cursor.Current = Cursors.WaitCursor
|
|
Try
|
|
Return ExtractMRNsFromPDFs(f.LIST_FILES, Label10)
|
|
Finally
|
|
Cursor.Current = Cursors.Default
|
|
End Try
|
|
End Function
|
|
|
|
|
|
|
|
|
|
|
|
Public Shared Function ExtractMRNsFromPDFs(files As IEnumerable(Of String), Optional lblProgress As Label = Nothing) As List(Of cPDFMRNResult)
|
|
Dim results As New List(Of cPDFMRNResult)
|
|
Dim pdfFiles = files.ToList()
|
|
Dim fileNr As Integer = 0
|
|
|
|
For Each pdfPath In pdfFiles
|
|
fileNr += 1
|
|
Console.WriteLine("PDF: " & pdfPath)
|
|
|
|
If String.IsNullOrWhiteSpace(pdfPath) OrElse Not System.IO.File.Exists(pdfPath) Then Continue For
|
|
|
|
Try
|
|
Using textPdf = UglyToad.PdfPig.PdfDocument.Open(pdfPath)
|
|
Dim imagePdf As PdfiumViewer.PdfDocument = Nothing
|
|
|
|
Try
|
|
'Console.WriteLine("Seiten: " & textPdf.NumberOfPages)
|
|
|
|
For pageIndex As Integer = 0 To textPdf.NumberOfPages - 1
|
|
Dim found As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
|
|
|
|
' Fortschritt anzeigen
|
|
If lblProgress IsNot Nothing Then
|
|
lblProgress.Text = $"PDF: {fileNr}/{pdfFiles.Count}" & vbCrLf &
|
|
$"Seite: {pageIndex + 1}/{textPdf.NumberOfPages}" & vbCrLf &
|
|
$"MRNs: {results.Count}"
|
|
lblProgress.Refresh()
|
|
End If
|
|
|
|
' 1. Zuerst Text auslesen
|
|
Try
|
|
For Each mrn In ExtractMRNsFromPDFText(textPdf, pageIndex)
|
|
found.Add(mrn)
|
|
Next
|
|
Catch ex As Exception
|
|
' Console.WriteLine($"TEXT-FEHLER | Seite={pageIndex + 1} | {ex.Message}")
|
|
End Try
|
|
|
|
' 2. Nur wenn keine MRN im Text gefunden wurde
|
|
If found.Count = 0 Then
|
|
Try
|
|
If imagePdf Is Nothing Then imagePdf = PdfiumViewer.PdfDocument.Load(pdfPath)
|
|
|
|
For Each mrn In ExtractMRNsFromPDFImage(imagePdf, pageIndex)
|
|
found.Add(mrn)
|
|
Next
|
|
Catch ex As Exception
|
|
' Console.WriteLine($"BILD-FEHLER | Seite={pageIndex + 1} | {ex.Message}")
|
|
End Try
|
|
End If
|
|
|
|
For Each mrn In found
|
|
results.Add(New cPDFMRNResult With {
|
|
.FileName = System.IO.Path.GetFileName(pdfPath),
|
|
.PageNumber = pageIndex + 1,
|
|
.MRN = mrn
|
|
})
|
|
Next
|
|
|
|
' Console.WriteLine($"SEITE {pageIndex + 1} ENDE | MRNs={found.Count}")
|
|
|
|
' Fortschritt nach abgeschlossener Seite aktualisieren
|
|
If lblProgress IsNot Nothing Then
|
|
lblProgress.Text = $"PDF {fileNr}/{pdfFiles.Count} | Seite {pageIndex + 1}/{textPdf.NumberOfPages} | MRNs: {results.Count}"
|
|
lblProgress.Refresh()
|
|
End If
|
|
Next
|
|
Finally
|
|
If imagePdf IsNot Nothing Then imagePdf.Dispose()
|
|
End Try
|
|
End Using
|
|
|
|
Catch ex As Exception
|
|
' Console.WriteLine("PDF FEHLER: " & ex.ToString())
|
|
End Try
|
|
Next
|
|
|
|
' Console.WriteLine("FERTIG | MRNs gesamt: " & results.Count)
|
|
|
|
If lblProgress IsNot Nothing Then
|
|
lblProgress.Text = $"Fertig: {results.Count} MRNs"
|
|
lblProgress.Refresh()
|
|
End If
|
|
|
|
Return results
|
|
End Function
|
|
|
|
|
|
Private Shared Function ExtractMRNsFromPDFText(pdf As UglyToad.PdfPig.PdfDocument, pageIndex As Integer) As List(Of String)
|
|
Dim results As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
|
|
Dim pageText = pdf.GetPage(pageIndex + 1).Text
|
|
|
|
' Console.WriteLine($"TEXT | Seite={pageIndex + 1} | Zeichen={pageText.Length}")
|
|
|
|
Dim matches = System.Text.RegularExpressions.Regex.Matches(
|
|
pageText.ToUpperInvariant(),
|
|
"(?<![A-Z0-9])[0-9]{2}[A-Z]{2}[A-Z0-9]{14}(?![A-Z0-9])")
|
|
|
|
For Each match As System.Text.RegularExpressions.Match In matches
|
|
If results.Add(match.Value) Then
|
|
' Console.WriteLine($"TEXT-MRN | Seite={pageIndex + 1} | {match.Value}")
|
|
End If
|
|
Next
|
|
|
|
Return results.ToList()
|
|
End Function
|
|
|
|
|
|
Private Shared Function ExtractMRNsFromPDFImage(pdf As PdfiumViewer.PdfDocument, pageIndex As Integer) As List(Of String)
|
|
Dim results As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
|
|
|
|
Dim reader As New ZXing.BarcodeReader With {
|
|
.AutoRotate = True,
|
|
.Options = New ZXing.Common.DecodingOptions With {
|
|
.TryHarder = True,
|
|
.PossibleFormats = New List(Of ZXing.BarcodeFormat) From {
|
|
ZXing.BarcodeFormat.CODE_128,
|
|
ZXing.BarcodeFormat.CODE_39,
|
|
ZXing.BarcodeFormat.ITF,
|
|
ZXing.BarcodeFormat.CODABAR
|
|
}
|
|
}
|
|
}
|
|
|
|
' Console.WriteLine($"BILD | Seite={pageIndex + 1} | Barcode-Erkennung gestartet")
|
|
|
|
For Each dpi As Integer In {200, 300}
|
|
Try
|
|
Dim pageSize = pdf.PageSizes(pageIndex)
|
|
Dim width = CInt(Math.Ceiling(pageSize.Width * dpi / 72.0))
|
|
Dim height = CInt(Math.Ceiling(pageSize.Height * dpi / 72.0))
|
|
|
|
' Console.WriteLine($"Rendering | Seite={pageIndex + 1} | DPI={dpi} | {width}x{height}")
|
|
|
|
Using img As System.Drawing.Image = pdf.Render(pageIndex, width, height, dpi, dpi, PdfiumViewer.PdfRenderFlags.Annotations)
|
|
Using bmp As New Bitmap(img)
|
|
|
|
' Gesamte Seite und zusätzlich oberen rechten Bereich prüfen
|
|
Dim cropX = CInt(bmp.Width * 0.59)
|
|
Dim cropY = CInt(bmp.Height * 0.025)
|
|
Dim cropW = CInt(bmp.Width * 0.39)
|
|
Dim cropH = CInt(bmp.Height * 0.12)
|
|
|
|
Dim rect As New Rectangle(cropX, cropY, cropW, cropH)
|
|
rect.Intersect(New Rectangle(0, 0, bmp.Width, bmp.Height))
|
|
|
|
Dim images As New List(Of Bitmap)
|
|
images.Add(bmp)
|
|
|
|
Try
|
|
If rect.Width > 0 AndAlso rect.Height > 0 Then
|
|
images.Add(bmp.Clone(rect, System.Drawing.Imaging.PixelFormat.Format24bppRgb))
|
|
End If
|
|
|
|
For imageIndex As Integer = 0 To images.Count - 1
|
|
Dim currentImage = images(imageIndex)
|
|
Dim decoded = reader.DecodeMultiple(currentImage)
|
|
|
|
If decoded Is Nothing OrElse decoded.Length = 0 Then
|
|
Dim singleResult = reader.Decode(currentImage)
|
|
If singleResult IsNot Nothing Then decoded = {singleResult}
|
|
End If
|
|
|
|
If decoded IsNot Nothing Then
|
|
For Each barcode In decoded
|
|
' Console.WriteLine($"BARCODE | Seite={pageIndex + 1} | Typ={barcode.BarcodeFormat} | Inhalt={barcode.Text}")
|
|
|
|
Dim mrn = GetMRNFromBarcode(barcode.Text)
|
|
If mrn IsNot Nothing Then
|
|
results.Add(mrn)
|
|
' Console.WriteLine("MRN ERKANNT: " & mrn)
|
|
End If
|
|
Next
|
|
End If
|
|
Next
|
|
Finally
|
|
' Nur den zusätzlich erzeugten Ausschnitt freigeben
|
|
For imageIndex As Integer = 1 To images.Count - 1
|
|
images(imageIndex).Dispose()
|
|
Next
|
|
End Try
|
|
End Using
|
|
End Using
|
|
|
|
Catch ex As Exception
|
|
' Console.WriteLine($"BILD-FEHLER | Seite={pageIndex + 1} | DPI={dpi} | {ex.Message}")
|
|
End Try
|
|
|
|
If results.Count > 0 Then Exit For
|
|
Next
|
|
|
|
Return results.ToList()
|
|
End Function
|
|
|
|
|
|
|
|
Private Shared Function GetMRNFromBarcode(value As String) As String
|
|
If String.IsNullOrWhiteSpace(value) Then Return Nothing
|
|
|
|
Dim match = System.Text.RegularExpressions.Regex.Match(
|
|
value.ToUpperInvariant(),
|
|
"(?<![A-Z0-9])[0-9]{2}[A-Z]{2}[A-Z0-9]{14}(?![A-Z0-9])")
|
|
|
|
Return If(match.Success, match.Value, Nothing)
|
|
End Function
|
|
|
|
|
|
End Class
|
|
|
|
Public Class cPDFMRNResult
|
|
Public Property FileName As String
|
|
Public Property PageNumber As Integer
|
|
Public Property MRN As String
|
|
End Class |