This commit is contained in:
2026-03-26 09:30:57 +01:00
parent eaf8945687
commit 9637994b11
5 changed files with 252 additions and 1864 deletions

View File

@@ -33,11 +33,13 @@ Public Class frmSendungsDokumentanforderung
Private Shared _customerPortalAnhangsartenFetchedUtc As DateTime = DateTime.MinValue
Private Shared _customerPortalCustomFilenameAnhangsartId As Integer = -1
Private ReadOnly _kontaktEmailRows As New List(Of KontaktEmailRow)
Private ReadOnly _kundenFirmaByNr As New Dictionary(Of Integer, String)
Private _kontaktRolleTabs As TabControl
Public Sub New(avisoId As Integer, sendungId As Integer, state As DokumentanforderungState)
Public Sub New(ByVal avisoIdValue As Integer, ByVal sendungIdValue As Integer, state As DokumentanforderungState)
InitializeComponent()
AvisoID = avisoId
SendungID = sendungId
AvisoID = avisoIdValue
SendungID = sendungIdValue
Icon = cMeineFunktionenAVISO.GetProgrammIcon
_stateToApply = If(state, New DokumentanforderungState())
End Sub
@@ -45,6 +47,7 @@ Public Class frmSendungsDokumentanforderung
Private ReadOnly _stateToApply As DokumentanforderungState
Private Sub frmSendungsDokumentanforderung_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ResolveContextIds()
VERAG_PROG_ALLGEMEIN.cAllgemein._TRANSLATE(Me)
If cmbCustomerUploadLanguage.SelectedIndex < 0 Then
Dim idx = cmbCustomerUploadLanguage.Items.IndexOf("de")
@@ -62,17 +65,25 @@ Public Class frmSendungsDokumentanforderung
LoadKontaktEmails()
End Sub
Private Sub ResolveContextIds()
If AvisoID > 0 AndAlso SendungID <> 0 Then Return
Dim parentForm = TryCast(Me.Owner, frmAddSendungsvermerkShort)
If parentForm IsNot Nothing Then
If AvisoID <= 0 AndAlso parentForm.AvisoID > 0 Then
AvisoID = parentForm.AvisoID
End If
If SendungID = 0 AndAlso parentForm.SendungID <> 0 Then
SendungID = parentForm.SendungID
End If
End If
End Sub
Private Sub InitializeKontaktEmailGrid()
EnsureKontaktRolleTabs()
If dgvKontaktEmails.Columns.Count > 0 Then Return
dgvKontaktEmails.AutoGenerateColumns = False
Dim colRolle As New DataGridViewTextBoxColumn()
colRolle.Name = "colRolle"
colRolle.HeaderText = "Rolle"
colRolle.DataPropertyName = "Rolle"
colRolle.Width = 100
dgvKontaktEmails.Columns.Add(colRolle)
Dim colArt As New DataGridViewTextBoxColumn()
colArt.Name = "colArt"
colArt.HeaderText = "Art"
@@ -80,6 +91,13 @@ Public Class frmSendungsDokumentanforderung
colArt.Width = 130
dgvKontaktEmails.Columns.Add(colArt)
Dim colFirma As New DataGridViewTextBoxColumn()
colFirma.Name = "colFirma"
colFirma.HeaderText = "Firma"
colFirma.DataPropertyName = "Firma"
colFirma.Width = 180
dgvKontaktEmails.Columns.Add(colFirma)
Dim colEmail As New DataGridViewTextBoxColumn()
colEmail.Name = "colEmail"
colEmail.HeaderText = "E-Mail"
@@ -93,7 +111,7 @@ Public Class frmSendungsDokumentanforderung
dgvKontaktEmails.Rows.Clear()
Dim dedupe As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
Dim fraechterKdNr As Integer = 0
Dim auftraggeberKdNr As Integer = 0
Dim avisiererKdNr As Integer = 0
@@ -115,12 +133,11 @@ Public Class frmSendungsDokumentanforderung
End If
If AvisoID > 0 Then
Dim dtAviso = AvisoDAL.loadDataTableBySQL("SELECT Frächter_KdNr, Auftraggeber_KdNr FROM tblAviso WHERE AvisoID = " & AvisoID)
If dtAviso IsNot Nothing AndAlso dtAviso.Rows.Count > 0 Then
Dim r = dtAviso.Rows(0)
fraechterKdNr = ToIntSafe(r("Frächter_KdNr"))
Dim aviso = AvisoDAL.LesenAviso(AvisoID, "")
If aviso IsNot Nothing Then
fraechterKdNr = ToIntSafe(aviso.Frächter_KdNr)
If auftraggeberKdNr = 0 Then
auftraggeberKdNr = ToIntSafe(r("Auftraggeber_KdNr"))
auftraggeberKdNr = ToIntSafe(aviso.Auftraggeber_KdNr)
End If
End If
End If
@@ -134,82 +151,111 @@ Public Class frmSendungsDokumentanforderung
AddKontaktEmailsByKunde("Absender", absenderKdNr, dedupe)
AddKontaktEmailsByKunde("Frachtführer", frachtfuehrerKdNr, dedupe)
RefreshKontaktRolleTabs()
End Sub
Private Sub EnsureKontaktRolleTabs()
If _kontaktRolleTabs IsNot Nothing Then Return
_kontaktRolleTabs = New TabControl()
_kontaktRolleTabs.Name = "tbKontaktRollen"
_kontaktRolleTabs.Location = New Point(dgvKontaktEmails.Left, dgvKontaktEmails.Top)
_kontaktRolleTabs.Size = New Size(dgvKontaktEmails.Width, 24)
_kontaktRolleTabs.Anchor = dgvKontaktEmails.Anchor
AddHandler _kontaktRolleTabs.SelectedIndexChanged, AddressOf KontaktRolleTabs_SelectedIndexChanged
Controls.Add(_kontaktRolleTabs)
_kontaktRolleTabs.BringToFront()
dgvKontaktEmails.Top = _kontaktRolleTabs.Bottom + 4
dgvKontaktEmails.Height = btnVermerkSetzen.Top - dgvKontaktEmails.Top - 6
End Sub
Private Sub RefreshKontaktRolleTabs()
EnsureKontaktRolleTabs()
Dim selectedRolle = GetSelectedKontaktRolle()
RemoveHandler _kontaktRolleTabs.SelectedIndexChanged, AddressOf KontaktRolleTabs_SelectedIndexChanged
_kontaktRolleTabs.TabPages.Clear()
Dim rollen As New List(Of String)
For Each row In _kontaktEmailRows
dgvKontaktEmails.Rows.Add(row.Rolle, row.Art, row.Email)
If row Is Nothing Then Continue For
If rollen.Contains(row.Rolle) Then Continue For
rollen.Add(row.Rolle)
Dim page As New TabPage(row.Rolle)
page.Tag = row.Rolle
_kontaktRolleTabs.TabPages.Add(page)
Next
_kontaktRolleTabs.Visible = _kontaktRolleTabs.TabPages.Count > 0
If _kontaktRolleTabs.TabPages.Count > 0 Then
Dim selectedIndex As Integer = 0
For i As Integer = 0 To _kontaktRolleTabs.TabPages.Count - 1
If String.Equals(_kontaktRolleTabs.TabPages(i).Tag.ToString(), selectedRolle, StringComparison.OrdinalIgnoreCase) Then
selectedIndex = i
Exit For
End If
Next
_kontaktRolleTabs.SelectedIndex = selectedIndex
End If
AddHandler _kontaktRolleTabs.SelectedIndexChanged, AddressOf KontaktRolleTabs_SelectedIndexChanged
BindKontaktEmailsForSelectedRolle()
End Sub
Private Function GetSelectedKontaktRolle() As String
If _kontaktRolleTabs Is Nothing Then Return ""
If _kontaktRolleTabs.SelectedTab Is Nothing Then Return ""
Return If(_kontaktRolleTabs.SelectedTab.Tag, "").ToString().Trim()
End Function
Private Sub BindKontaktEmailsForSelectedRolle()
dgvKontaktEmails.Rows.Clear()
Dim selectedRolle = GetSelectedKontaktRolle()
For Each row In _kontaktEmailRows
If row Is Nothing Then Continue For
If selectedRolle <> "" AndAlso Not String.Equals(row.Rolle, selectedRolle, StringComparison.OrdinalIgnoreCase) Then Continue For
dgvKontaktEmails.Rows.Add(row.Art, row.Firma, row.Email)
Next
If If(txtCustomerUploadEmail.Text, "").Trim() = "" AndAlso dgvKontaktEmails.Rows.Count > 0 Then
txtCustomerUploadEmail.Text = If(dgvKontaktEmails.Rows(0).Cells("colEmail").Value, "").ToString().Trim()
End If
End Sub
Private Sub KontaktRolleTabs_SelectedIndexChanged(sender As Object, e As EventArgs)
BindKontaktEmailsForSelectedRolle()
End Sub
Private Sub AddKontaktEmailsByKunde(rolle As String, kundenNr As Integer, dedupe As HashSet(Of String))
If kundenNr <= 0 Then Return
' 1. E-Mails aus Kundenstammdaten laden (direkt von Datenbank)
Try
Dim sql As String = "SELECT E_Mail, E_Mail2 FROM Adressen WHERE AdressenNr = " & kundenNr
Using conn As System.Data.SqlClient.SqlConnection = VERAG_PROG_ALLGEMEIN.cSqlDb.GetNewOpenConnectionFMZOLL(False)
Using cmd As New System.Data.SqlClient.SqlCommand(sql, conn)
Using reader = cmd.ExecuteReader()
If reader.Read() Then
Dim email1 = If(reader("E_Mail") Is DBNull.Value, "", reader("E_Mail").ToString().Trim())
Dim email2 = If(reader("E_Mail2") Is DBNull.Value, "", reader("E_Mail2").ToString().Trim())
If email1 <> "" Then
For Each splitEmail In email1.Split({";"c, ","c}, StringSplitOptions.RemoveEmptyEntries)
Dim em = splitEmail.Trim()
If em = "" Then Continue For
Dim key1 = rolle & "|" & kundenNr.ToString() & "|Stammdaten|" & em.ToLowerInvariant()
If Not dedupe.Contains(key1) Then
dedupe.Add(key1)
_kontaktEmailRows.Add(New KontaktEmailRow With {.Rolle = rolle, .Art = "Stammdaten", .Email = em})
End If
Next
End If
If email2 <> "" Then
For Each splitEmail In email2.Split({";"c, ","c}, StringSplitOptions.RemoveEmptyEntries)
Dim em = splitEmail.Trim()
If em = "" Then Continue For
Dim key2 = rolle & "|" & kundenNr.ToString() & "|Stammdaten|" & em.ToLowerInvariant()
If Not dedupe.Contains(key2) Then
dedupe.Add(key2)
_kontaktEmailRows.Add(New KontaktEmailRow With {.Rolle = rolle, .Art = "Stammdaten", .Email = em})
End If
Next
End If
End If
End Using
End Using
End Using
Catch
End Try
Dim firma = GetKundenFirma(kundenNr)
' 2. E-Mails aus E-Mail-Benachrichtigungen (Sendungsdetails) laden (direkt von Datenbank)
Try
Dim sql As String = "SELECT eb_ebartId, eb_EMail, eb_cc, eb_bcc FROM tblEmailBenachrichtigung WHERE eb_KundenNr = " & kundenNr
Dim sql As String = "SELECT * FROM tblKundenKontakt WHERE kkd_KundenNr = " & kundenNr
Using conn As System.Data.SqlClient.SqlConnection = VERAG_PROG_ALLGEMEIN.cSqlDb.GetNewOpenConnectionFMZOLL(False)
Using cmd As New System.Data.SqlClient.SqlCommand(sql, conn)
Using reader = cmd.ExecuteReader()
While reader.Read()
Dim artId = If(reader("eb_ebartId") Is DBNull.Value, 0, Convert.ToInt32(reader("eb_ebartId")))
Dim email = If(reader("eb_EMail") Is DBNull.Value, "", reader("eb_EMail").ToString().Trim())
Dim isCc = If(reader("eb_cc") Is DBNull.Value, False, Convert.ToBoolean(reader("eb_cc")))
Dim isBcc = If(reader("eb_bcc") Is DBNull.Value, False, Convert.ToBoolean(reader("eb_bcc")))
If email = "" Then Continue While
Dim empfaengerArt = If(isBcc, "BCC", If(isCc, "CC", "AN"))
Dim artText = ResolveMailArtLabel(artId) & " / " & empfaengerArt
For Each splitEmail In email.Split({";"c, ","c}, StringSplitOptions.RemoveEmptyEntries)
Dim em = splitEmail.Trim()
If em = "" Then Continue For
Dim key = rolle & "|" & kundenNr.ToString() & "|" & artText & "|" & em.ToLowerInvariant()
If Not dedupe.Contains(key) Then
dedupe.Add(key)
_kontaktEmailRows.Add(New KontaktEmailRow With {.Rolle = rolle, .Art = artText, .Email = em})
End If
Dim artText = GetStringValue(reader, "kkd_kkaBez")
If artText = "" Then artText = "Kontakt"
Dim emails = GetStringValues(reader, "kkd_EMail", "kkd_EMail2", "kkd_Email", "kkd_Email2", "kkd_Mail", "kkd_Mail2", "EMail", "EMail2", "Email", "Email2", "Mail", "Mail2")
If emails.Count = 0 Then Continue While
For Each email In emails
For Each splitEmail In email.Split({";"c, ","c}, StringSplitOptions.RemoveEmptyEntries)
Dim em = splitEmail.Trim()
If em = "" Then Continue For
Dim key = rolle & "|" & kundenNr.ToString() & "|" & artText & "|" & em.ToLowerInvariant()
If Not dedupe.Contains(key) Then
dedupe.Add(key)
_kontaktEmailRows.Add(New KontaktEmailRow With {.Rolle = rolle, .Art = artText, .Firma = firma, .Email = em})
End If
Next
Next
End While
End Using
@@ -219,21 +265,57 @@ Public Class frmSendungsDokumentanforderung
End Try
End Sub
Private Function ResolveMailArtLabel(artId As Integer) As String
Select Case artId
Case 1
Return "Ankunft"
Case 2
Return "Freigabe"
Case 3
Return "Ankunft Export"
Case 4
Return "Freigabe Export"
Case 5
Return "Status"
Case Else
Return "Unbekannt"
End Select
Private Function GetStringValue(reader As IDataRecord, fieldName As String) As String
For i As Integer = 0 To reader.FieldCount - 1
If String.Equals(reader.GetName(i), fieldName, StringComparison.OrdinalIgnoreCase) Then
If reader.IsDBNull(i) Then Return ""
Return reader(i).ToString().Trim()
End If
Next
Return ""
End Function
Private Function GetStringValues(reader As IDataRecord, ParamArray fieldNames() As String) As List(Of String)
Dim values As New List(Of String)
Dim seen As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
For Each fieldName In fieldNames
Dim value = GetStringValue(reader, fieldName)
If value = "" Then Continue For
If seen.Contains(value) Then Continue For
seen.Add(value)
values.Add(value)
Next
Return values
End Function
Private Function GetKundenFirma(kundenNr As Integer) As String
If kundenNr <= 0 Then Return ""
If _kundenFirmaByNr.ContainsKey(kundenNr) Then Return _kundenFirmaByNr(kundenNr)
Dim firma As String = ""
Try
Dim sql As String = "SELECT TOP 1 [Name 1], [Ordnungsbegriff] FROM Adressen WHERE AdressenNr = " & kundenNr
Using conn As System.Data.SqlClient.SqlConnection = VERAG_PROG_ALLGEMEIN.cSqlDb.GetNewOpenConnectionFMZOLL(False)
Using cmd As New System.Data.SqlClient.SqlCommand(sql, conn)
Using reader = cmd.ExecuteReader()
If reader.Read() Then
firma = If(reader("Name 1") Is DBNull.Value, "", reader("Name 1").ToString().Trim())
If firma = "" Then
firma = If(reader("Ordnungsbegriff") Is DBNull.Value, "", reader("Ordnungsbegriff").ToString().Trim())
End If
End If
End Using
End Using
End Using
Catch
End Try
_kundenFirmaByNr(kundenNr) = firma
Return firma
End Function
Private Function ToIntSafe(value As Object) As Integer
@@ -1179,6 +1261,7 @@ Public Class frmSendungsDokumentanforderung
Private Class KontaktEmailRow
Public Property Rolle As String
Public Property Art As String
Public Property Firma As String
Public Property Email As String
End Class