CBAM/VERAG Zollanmeldugnen

This commit is contained in:
2026-01-13 10:01:59 +01:00
parent 7cd106a413
commit 0ebe4cf198
12 changed files with 849 additions and 123 deletions

View File

@@ -1,5 +1,10 @@
Imports System.Data.SqlClient
Imports System.Reflection
Imports System.Runtime.InteropServices.ComTypes
Imports com.sun.tools.javac.util
Imports java.lang.ProcessBuilder
Imports sun.util.resources.cldr.aa
Imports VERAG_PROG_ALLGEMEIN.TESTJSON
' ==========================================================================
' MASTER CLASS
@@ -231,7 +236,7 @@ Public Class cVERAG_CustomsDeclarations
"FROM VERAG.dbo.tblVERAG_CustomsDeclarations z " &
"INNER JOIN VERAG.dbo.tblVERAG_CustomsDeclarations_Items i " &
" ON z.za_Id = i.zaItem_zaId " &
"INNER JOIN VERAG.dbo.tblVERAG_CustomsDeclarations_Parties p " &
"LEFT JOIN VERAG.dbo.tblVERAG_CustomsDeclarations_Parties p " &
" ON z.za_Id = p.zaParty_zaId " &
"WHERE z.za_REGIME = 'IMPORT' " &
" AND z.za_IsFinalDeclaration = 1 " &
@@ -357,12 +362,294 @@ Public Class cVERAG_CustomsDeclarations
Return ZA
End Function
Public Sub checkfreshCBAMWarning()
Try
Dim CBAM_ITEMS As New List(Of cVERAG_CustomsDeclarations_Item)
If hasCBAM(CBAM_ITEMS) Then
Dim importerEORI As String = Me.Parties.Where(Function(p) {"CN", "IM", "IMP", "IMPORTER"}.Contains(p.zaParty_Role)).Select(Function(p) p.zaParty_EORI).FirstOrDefault()
Dim ExporterEORI As String = Me.Parties.Where(Function(p) {"CZ", "EX", "EXP", "EXPORTER"}.Contains(p.zaParty_Role)).Select(Function(p) p.zaParty_EORI).FirstOrDefault()
Dim ExporterString As String = Me.Parties.Where(Function(p) {"CZ", "EX", "EXP", "EXPORTER"}.Contains(p.zaParty_Role)).Select(Function(p) p.zaParty_Name).FirstOrDefault()
Dim KD As cKunde = Nothing
Dim AD As cAdressen = Nothing
If If(importerEORI, "") <> "" Then
KD = cKunde.LOAD_ByEORI(importerEORI, If(za_Firma, ""))
If KD Is Nothing Then KD = cKunde.LOAD_ByEORI(importerEORI) 'Wenn kein Kunde mit Firma gefunden wurde, nur nach EORI suchen (default VERAG)
AD = New cAdressen(KD.KundenNr)
End If
If isIndirect() Then
Dim KD_EX As cKunde = Nothing
Dim AD_EX As cAdressen = Nothing
If If(ExporterEORI, "") <> "" Then
KD_EX = cKunde.LOAD_ByEORI(ExporterEORI, If(za_Firma, ""))
If KD_EX Is Nothing Then KD_EX = cKunde.LOAD_ByEORI(ExporterEORI) 'Wenn kein Kunde mit Firma gefunden wurde, nur nach EORI suchen (default VERAG)
AD_EX = New cAdressen(KD_EX.KundenNr)
End If
'==================>> INDIRECT <<=========================
Dim itemsHtml As String =
String.Join("", CBAM_ITEMS.Select(Function(i) "<tr>" &
"<td>" & i.zaItem_PosNo.ToString & "</td>" &
"<td>" & If(i.zaItem_HSCode, "") & "</td>" &
"<td>" & If(i.zaItem_Description, "") & "</td>" &
"</tr>"
))
Dim bodyHtml As String =
"<html><body style='font-family:Segoe UI, Arial, sans-serif; font-size:12pt; color:#222'>" &
"<h2 style='color:#b00020'>CBAM-Warnmeldung bei Zollanmeldung " & Me.za_MRN & "</h2>" &
"<p>" &
"Bei der Zollanmeldung mit der MRN <b>" & Me.za_MRN & "</b> wurden CBAM-relevante Warenpositionen erkannt.<br/>" &
"Bitte prüfen Sie diese Anmeldung im Hinblick auf die CBAM-Meldepflicht." &
"</p>" &
"<h3>Erkannte CBAM-Positionen</h3>" &
"<table cellpadding='6' cellspacing='0' border='1' style='border-collapse:collapse; width:100%'>" &
"<tr style='background-color:#f0f0f0'>" &
"<th align='left'>PosNr</th>" &
"<th align='left'>HS-Code</th>" &
"<th align='left'>Beschreibung</th>" &
"</tr>" &
itemsHtml &
"</table>" &
"<p>" &
"<b>Importeur:</b><br/>" &
importerEORI & " " & vbNewLine &
If(AD Is Nothing, ExporterString, AD.Name_1 & " " & If(AD.Name_2, "") & "<br/>" &
If(AD.LandKz, "") & " " & If(AD.PLZ, "") & " " & If(AD.Ort, "")) &
"</p>" &
"<p>" &
"<b>Exporteur:</b><br/>" &
If(ExporterEORI, "") & " " & vbNewLine &
If(AD_EX Is Nothing, ExporterString, AD_EX.Name_1 & " " & If(AD_EX.Name_2, "") & "<br/>" &
If(AD_EX.LandKz, "") & " " & If(AD_EX.PLZ, "") & " " & If(AD_EX.Ort, "")) &
"</p>" &
"<br/><p><b>VERAG CBAM Compliance Services</b></p>" &
"</body></html>"
VERAG_PROG_ALLGEMEIN.cProgramFunctions.sendMail("al@verag.ag", "CBAM WARNUNG - " & Me.za_MRN, bodyHtml, "cbam@verag.ag")
'VERAG_PROG_ALLGEMEIN.cProgramFunctions.sendMail("al@verag.ag", "CBAM WARNUNG",
' "CBAM-Warnmeldung bei Zollanmeldung " & Me.za_MRN & vbNewLine &
' "Bei der Zollanmeldung mit der MRN " & Me.za_MRN & " wurden CBAM-relevante Warenpositionen erkannt." & vbCrLf &
' "Bitte prüfen Sie diese Anmeldung im Hinblick auf die CBAM-Meldepflicht." & vbCrLf & vbCrLf &
' "Erkannte CBAM-Positionen:" & vbCrLf &
' String.Join(vbCrLf, CBAM_ITEMS.Select(Function(i) " - PosNr: " & i.zaItem_PosNo.ToString & " | HS-Code: " & If(i.zaItem_HSCode, "") & " | Beschreibung: " & If(i.zaItem_Description, "")))
' )
''=========================================================
Else
'==================>> DIRECT <<=========================
Try
If KD IsNot Nothing Then
Dim ERW As New cKundenErweitert(KD.KundenNr)
Select Case ERW.kde_CBAM_Status
Case "", "50to" ' Nur hier wird eine Warnung gesendet!! -> WEnn der Kunde bereits Registriert ist, nicht notwendig.
Dim dateCBAM = If(If(za_ReleaseDate, za_DeclarationDate), Now)
Dim eigenmasseSumme_Shipment As Decimal = CBAM_ITEMS.Sum(Function(i) If(i.zaItem_NetMass, 0D)) / 1000
Dim eigenmasseSumme_YEAR As Decimal = getCBAM_KG(importerEORI, CDate("01.01." & dateCBAM.Year), CDate("31.12." & dateCBAM.Year), za_MRN) / 1000
Dim WarnLevel As String = ""
Dim Schwellenwert As Decimal = 0
Dim Warn1 As Decimal = If(If(ERW.kde_CBAM_Warn1, 0) > 0, ERW.kde_CBAM_Warn1, 30)
Dim Warn2 As Decimal = If(If(ERW.kde_CBAM_Warn2, 0) > 0, ERW.kde_CBAM_Warn2, 40)
Dim Warn50to As Decimal = 50
'geprüft werden die bisherigen CBAM Waren im Jahr + die aktuelle Sendung
If eigenmasseSumme_YEAR < Warn50to And (eigenmasseSumme_Shipment + eigenmasseSumme_YEAR) >= Warn50to Then
'--> WARN 2 überschritten
WarnLevel = "3"
Schwellenwert = 50
End If
'geprüft werden die bisherigen CBAM Waren im Jahr + die aktuelle Sendung
If eigenmasseSumme_YEAR < Warn2 And (eigenmasseSumme_Shipment + eigenmasseSumme_YEAR) >= Warn2 Then
'--> WARN 2 überschritten
WarnLevel = "2"
Schwellenwert = Warn2
End If
'geprüft werden die bisherigen CBAM Waren im Jahr + die aktuelle Sendung
If eigenmasseSumme_YEAR < Warn1 And (eigenmasseSumme_Shipment + eigenmasseSumme_YEAR) >= Warn1 Then
'--> WARN 1 überschritten
WarnLevel = "1"
Schwellenwert = Warn1
End If
'===========>>>> WARNUNG <<<<<<<=================================
If WarnLevel <> "" Then
Dim bodyHtml As String =
"<html><body style='font-family:Segoe UI, Arial, sans-serif; font-size:12pt; color:#222'>" &
"<h2 style='color:#b00020'>CBAM-Warnmeldung zu Ihrer Zollanmeldung " & Me.za_MRN & "</h2>" &
"<p>" &
"Laut unserem System wurden in der Zollanmeldung mit der MRN <b>" & Me.za_MRN & "</b> " &
"CBAM-pflichtige Warenpositionen erkannt.<br/>" &
"Für Ihr Unternehmen liegen uns derzeit keine Informationen über eine gültige CBAM-Registrierung vor." &
"</p>" &
"<table cellpadding='6' cellspacing='0' border='1' style='border-collapse:collapse'>" &
"<tr><td><b>Warnstufe</b></td><td>" & WarnLevel & If(WarnLevel = 3, " - <b style='color:#b00020'>ÜBERSCHREITUNG!</b>", "") & "</td></tr>" &
"<tr><td><b>Schwellenwert</b></td><td>" & Schwellenwert.ToString("N0") & " Tonnen</td></tr>" &
"</table><br/>" &
"<p>" &
"<b>Importeur:</b><br/>" &
importerEORI & " " & vbNewLine &
If(AD Is Nothing, ExporterString, AD.Name_1 & " " & If(AD.Name_2, "") & "<br/>" &
If(AD.LandKz, "") & " " & If(AD.PLZ, "") & " " & If(AD.Ort, "")) &
"</p>" &
"<p>" &
"<b>Exporteur:</b><br/>" &
If(ExporterEORI, "") & " " & vbNewLine & If(ExporterString, "") &
"</p>" &
"<p style='color:#b00020'><b>WICHTIG</b></p>" &
"<p>" &
"Bei Überschreitung einer jährlichen Gesamtmenge von <b>50 Tonnen CBAM-pflichtiger Waren</b> (Jahressumme) " &
"ist eine gültige CBAM-Registrierung zwingend erforderlich.<br/>" &
"Ohne gültige Registrierung kann es zu Zollblockaden oder Abfertigungsstopps kommen." &
"</p>" &
"<p>" &
"Bitte teilen Sie uns kurzfristig unter " &
"<a href='mailto:cbam@verag.ag'>cbam@verag.ag</a> mit, wie Sie weiter vorgehen möchten " &
"(z. B. bestehende Registrierung, Beantragung mit VERAG oder Bevollmächtigung)." &
"</p>" &
"<p><b>VERAG DCS CBAM Compliance Services</b></p>" &
"<p>VERAG Spedition AG<br>A-4975 Suben, Suben 100</p>" &
"</body></html>"
VERAG_PROG_ALLGEMEIN.cProgramFunctions.sendMail(If(AD.E_Mail, ""), "CBAM-WARNUNG " & If(WarnLevel = 3, " - ACHTUNG: Überschreitung 50to! ", "Überschreitung der Meldeschwelle"), bodyHtml, "cbam@verag.ag", (WarnLevel = 3), "cbam@verag.ag",, "al@verag.ag")
'VERAG_PROG_ALLGEMEIN.cProgramFunctions.sendMail(
' "al@verag.ag",
' "CBAM-WARNUNG Überschreitung der Meldeschwelle",
' "CBAM-Warnmeldung zu Ihrer Zollanmeldung " & Me.za_MRN & vbCrLf & vbCrLf &
' "Laut unserem System wurden in der Zollanmeldung mit der MRN " & Me.za_MRN & " CBAM-pflichtige Warenpositionen erkannt." & vbCrLf &
' "Für Ihr Unternehmen liegen uns derzeit keine Informationen über eine gültige CBAM-Registrierung vor." & vbCrLf & vbCrLf &
' "Der für diese Sendung relevante Schwellenwert wurde überschritten." & vbCrLf &
' "Aktuelle Warnstufe: " & WarnLevel & vbCrLf &
' "Angewendeter Schwellenwert: " & Schwellenwert.ToString("N0") & " Tonnen" & vbCrLf & vbCrLf &
' "Importeur: " & importerEORI & " - " & AD.Name_1 & " " & If(AD.Name_2, "") & " " & If(AD.LandKz, "") & " " & If(AD.PLZ, "") & " " & If(AD.Ort, "") & vbCrLf &
' "WICHTIG:" & vbCrLf &
' "Bei Überschreitung einer jährlichen Gesamtmenge von 50 Tonnen CBAM-pflichtiger Waren ist eine gültige CBAM-Registrierung zwingend erforderlich." & vbCrLf &
' "Ohne gültige Registrierung kann es zu Zollblockaden oder Abfertigungsstopps kommen." & vbCrLf & vbCrLf &
' "Bitte teilen Sie uns kurzfristig unter cbam@verag.ag mit, wie Sie weiter vorgehen möchten (z. B. bestehende Registrierung, Beantragung mit VERAG oder Bevollmächtigung)." & vbCrLf & vbCrLf &
' "VERAG CBAM Compliance Services"
' )
End If
'================================================================
End Select
End If
'=========================================================
Catch ex As Exception
cErrorHandler.ERR(ex.Message, ex.StackTrace, Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End If
End If
Catch ex As Exception
cErrorHandler.ERR(ex.Message, ex.StackTrace, Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Sub
Public Function getCBAM_KG(EORI As String, von As Date, bis As Date, Optional without_MRN As String = "") As Decimal
Try
Dim sqlstr = "SELECT SUM(i.zaItem_NetMass) AS CBAM_Eigenmasse_kg
FROM VERAG.dbo.tblVERAG_CustomsDeclarations_Items i
JOIN VERAG.dbo.tblVERAG_CustomsDeclarations z
ON z.za_Id = i.zaItem_zaId
JOIN VERAG.dbo.tblVERAG_CustomsDeclarations_Parties p
ON p.zaParty_zaId = z.za_Id
AND p.zaParty_EORI = '" & EORI & "'
AND p.zaParty_Role IN ('CN','IM','IMP','IMPORTER')
WHERE z.za_ReleaseDate BETWEEN '" & von.ToShortDateString & "' AND '" & bis.ToShortDateString & "'
AND EXISTS (
SELECT 1
FROM VERAG.dbo.tblGreendeal_CBAM_Trn t
WHERE
i.zaItem_HSCode LIKE t.trnPattern
AND t.is_active = 1
AND ISNULL(t.is_exclusion,0) = 0
AND (t.start_date IS NULL OR t.start_date <= z.za_ReleaseDate)
AND (t.end_date IS NULL OR t.end_date >= z.za_ReleaseDate)
) "
If without_MRN <> "" Then sqlstr &= " and za_MRN <>'" & without_MRN & "'"
Return SQL.getValueTxtBySql(sqlstr, "FMZOLL",,, 0)
Catch ex As Exception
cErrorHandler.ERR(ex.Message, ex.StackTrace, Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
Return 0
End Function
Public Function isIndirect() As Boolean
If Me.za_System Is Nothing Then Return False
If Me.za_RepresentationCode Is Nothing Then Return False
If Me.za_System.Contains("DHF") AndAlso Me.za_RepresentationCode = 3 Then Return True
If Me.za_System.Contains("TELOTEC") AndAlso Me.za_RepresentationCode = 3 Then Return True
If Me.za_System.Contains("DAKOSY") AndAlso Me.za_RepresentationCode = 2 Then Return True
Return False
End Function
Public Function hasCBAM(Optional ByRef CBAM_ITEMS As List(Of cVERAG_CustomsDeclarations_Item) = Nothing) As Boolean
Dim LIST As New List(Of cVERAG_CustomsDeclarations)
Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
Try
CBAM_ITEMS = getCBAM_ITEMS()
If CBAM_ITEMS IsNot Nothing AndAlso CBAM_ITEMS.Count > 0 Then
Return True
End If
Catch ex As Exception
cErrorHandler.ERR(ex.Message, ex.StackTrace, Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
Return False
End Function
Public Function getCBAM_ITEMS() As List(Of cVERAG_CustomsDeclarations_Item)
Dim LIST As New List(Of cVERAG_CustomsDeclarations)
Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
Try
' ------------------------------------------------------------
' CBAM Pattern (HSCode)
' ------------------------------------------------------------
Dim cbamHsCodes = VERAG_PROG_ALLGEMEIN.cGreendeal_CBAM_Trn.LoadCBAMTariffNumbers()
If Items Is Nothing OrElse cbamHsCodes Is Nothing OrElse cbamHsCodes.Count = 0 Then Return Nothing
' Performance: HashSet für Prefix-Liste
Dim prefixes As HashSet(Of String) =
New HashSet(Of String)(cbamHsCodes)
Return Me.Items.
Where(Function(it)
Dim hs As String = If(it.zaItem_HSCode, "").Trim()
If hs = "" Then Return False
' linksseitiger Prefix-Abgleich
For Each p In prefixes
If hs.StartsWith(p) Then
Return True
End If
Next
End Function).ToList()
Catch ex As Exception
cErrorHandler.ERR(ex.Message, ex.StackTrace, Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
Return Nothing
End Function
Public Function SAVE() As Boolean
Dim list = getParameterList()
Dim sqlstr =
"BEGIN TRAN " &
"IF EXISTS(SELECT 1 FROM tblVERAG_CustomsDeclarations WHERE za_Id=@za_Id) " &
"BEGIN TRAN " &
"IF EXISTS(SELECT 1 FROM tblVERAG_CustomsDeclarations WHERE za_Id=@za_Id) " &
"BEGIN " & getUpdateCmd() & " END " &
"ELSE BEGIN " & getInsertCmd() & " END " &
"COMMIT TRAN"