Files
SDL/SDL/ZOLLSYSTEM/DAKOSY/ATLAS/EXGestellung/usrCntlATLAS_EXGestellung.vb

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