fix für PDF-Attachment bei MergePDFs

This commit is contained in:
2026-06-25 14:14:44 +02:00
parent 66c6f84725
commit c829d349aa
14 changed files with 491 additions and 55 deletions

View File

@@ -1,10 +1,11 @@
Imports System.IO
Imports com.sun.org.apache.xpath.internal.operations
Imports Microsoft.Office.Interop
Imports VERAG_PROG_ALLGEMEIN
Public Class cAutomailversand
Sub sendMailSammelrechnung(_Rechnungsdatum As Date, SammelrechungArt As Integer, FirmaID As Integer, Optional KundenNr As Integer = -1, Optional mailoeffnen As Boolean = False, Optional faktGruppe As String = "")
Sub sendMailSammelrechnung(_Rechnungsdatum As Date, SammelrechungArt As Integer, FirmaID As Integer, Optional KundenNr As Integer = -1, Optional mailoeffnen As Boolean = False, Optional faktGruppe As String = "", Optional datumBis As Date = Nothing)
Try
Dim sql As New VERAG_PROG_ALLGEMEIN.SQL
@@ -37,7 +38,7 @@ Public Class cAutomailversand
LEFT JOIN tblKundenErweitert on tblKundenErweitert.kde_KundenNr = Rechnungsausgang.RechnungsKundenNr
INNER JOIN Währungstabelle on LandKz = Rechnungsausgang.RechnungsLandKz
WHERE Rechnungsausgang.Status IN (2) and Rechnungsausgang.Automailversand_sent is null And Rechnungsausgang.Firma_ID = '" & FirmaID & "' And Rechnungsausgang.Sammelrechnung = '" & SammelrechungArt & "' And CONVERT(DATE,Rechnungsausgang.Rechnungsdatum,104) = '" & _Rechnungsdatum.ToShortDateString & "'
and isnull(Rechnungsausgang.Automailversand,0) = 1 and RechnungsNr > 0 and FakturierungsGruppe = '" & faktGruppe & "'" & IIf(KundenNr > 0, " AND RechnungsKundenNr = " & KundenNr, "") & "
and isnull(Rechnungsausgang.Automailversand,0) = 1 and RechnungsNr > 0 and FakturierungsGruppe = '" & faktGruppe & "'" & IIf(KundenNr > 0, " AND RechnungsKundenNr = " & KundenNr, "") & IIf(IsDate(datumBis), " AND CONVERT(DATE, Rechnungsausgang.Abfertigungsdatum, 104) <= '" & datumBis.ToShortDateString & "'", "") & "
GROUP BY RechnungsNr, RechnungsKundenNr,tblKundenErweitert.kde_SR_IM_EX
ORDER BY RechnungsLandKz, RechnungsKundenNr"
@@ -158,7 +159,7 @@ Public Class cAutomailversand
showError = mailoeffnen 'bei MailÖffnen fehler anzeigen!
setEmailText(row, FirmaID, RechnungsNr, Mailsubject, HTMLMail, SammelrechungArt, dt, BelegartenNr)
If do_SR(row.Item("RechnungsKundenNr"), FirmaID, SammelrechungArt, Rechnungsdatum, RechnungsNr, DruckDatumZeit, MDMKopiedrucken, listPDFs,,,, showError, AbfertigungsNr, faktGruppe) Then
If do_SR(row.Item("RechnungsKundenNr"), FirmaID, SammelrechungArt, datumBis, Rechnungsdatum, RechnungsNr, DruckDatumZeit, MDMKopiedrucken, listPDFs,,,, showError, AbfertigungsNr, faktGruppe) Then
loadAndSetAnhaenge_new(SR_DT, ATTACHMENTS, listPDFs,,, KDE_ERW.kde_merge_pdf)
If VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then Mailsubject &= " TEST"
@@ -475,10 +476,15 @@ Public Class cAutomailversand
End Sub
Private Function do_SR(kdNr As Integer, FirmaID As Integer, Sammelrechnungsart As Integer, Rechnungsdatum As Date, lastAktuelle_RgNr As Integer, DruckDatumZeit As Date, Kopie As Boolean, listPDFs As List(Of String), Optional EinzelAnlagen As Boolean = False, Optional Sammelbericht As Boolean = True, Optional saveInThereFore As Boolean = False, Optional showError As Boolean = True, Optional AbfertigungsArt As String = "", Optional faktGruppe As String = "")
Private Function do_SR(kdNr As Integer, FirmaID As Integer, Sammelrechnungsart As Integer, DatumBis As Date, Rechnungsdatum As Date, lastAktuelle_RgNr As Integer, DruckDatumZeit As Date, Kopie As Boolean, listPDFs As List(Of String), Optional EinzelAnlagen As Boolean = False, Optional Sammelbericht As Boolean = True, Optional saveInThereFore As Boolean = False, Optional showError As Boolean = True, Optional AbfertigungsArt As String = "", Optional faktGruppe As String = "")
Dim RechnungsNrisSet As Boolean = False
RechnungsNrisSet = cFakturierung.doSAMMELRechnungsDruck(FirmaID, Sammelrechnungsart, Rechnungsdatum, Rechnungsdatum, "", EinzelAnlagen, Sammelbericht, kdNr, 4, listPDFs, "", lastAktuelle_RgNr, DruckDatumZeit,,,,,, faktGruppe, AbfertigungsArt, True, Kopie, True, saveInThereFore, showError)
If DatumBis = Nothing Then
DatumBis = Rechnungsdatum
End If
RechnungsNrisSet = cFakturierung.doSAMMELRechnungsDruck(FirmaID, Sammelrechnungsart, DatumBis, Rechnungsdatum, "", EinzelAnlagen, Sammelbericht, kdNr, 4, listPDFs, "", lastAktuelle_RgNr, DruckDatumZeit,,,,,, faktGruppe, AbfertigungsArt, True, Kopie, True, saveInThereFore, showError)
Return RechnungsNrisSet
End Function

View File

@@ -999,7 +999,14 @@ Public Class frmAbrechnungsMaske
Select Case cboSort._value
Case "EZ"
selectedRows = selectedRows.OrderBy(Function(r) CDate(r.Cells("ReErfZeitstempel").Value))
selectedRows = selectedRows.OrderBy(
Function(r)
Dim value = r.Cells("ReErfZeitstempel").Value
Return If(value Is Nothing OrElse IsDBNull(value),
DateTime.MinValue,
Convert.ToDateTime(value))
End Function
)
Case Else
selectedRows = selectedRows _

View File

@@ -462,6 +462,7 @@ Partial Class frmFaktSammelRgDrucken
'Button6
'
Me.Button6.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.Button6.Enabled = False
Me.Button6.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.Button6.Image = Global.SDL.My.Resources.Resources.rechnung1
Me.Button6.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft

View File

@@ -140,7 +140,7 @@ Public Class frmFaktSammelRgDrucken
Dim SQLAUTOMAIL_RECHNUNGSDATuM = ""
If cbxAUTOMail.Checked Then
SQLAUTOMAIL_RECHNUNGSDATuM = "AND Rechnungsausgang.Status IN (2) AND CONVERT(DATE, Rechnungsausgang.Rechnungsdatum, 104) = '" & txtRechnungsdatum._value & "'"
SQLAUTOMAIL_RECHNUNGSDATuM = "AND Rechnungsausgang.Status IN (2) AND CONVERT(DATE, Rechnungsausgang.Rechnungsdatum, 104) = '" & txtRechnungsdatum._value & "' AND CONVERT(DATE, Rechnungsausgang.Abfertigungsdatum, 104) <= '" & txtZeitraumBis._value & "'"
Else
SQLAUTOMAIL_RECHNUNGSDATuM = " AND Rechnungsausgang.Status IN (0,2) AND CONVERT(DATE, Rechnungsausgang.Abfertigungsdatum, 104) <= '" & txtZeitraumBis._value & "'"
End If
@@ -979,7 +979,7 @@ Public Class frmFaktSammelRgDrucken
For Each r In MyDatagridview1.SelectedRows
Dim fun As New cAutomailversand
fun.sendMailSammelrechnung(CDate(txtRechnungsdatum.Text), Sammelrechung, Firma, r.Cells("RechnungsKundenNr").Value, cbxMailoeffnen.Checked)
fun.sendMailSammelrechnung(CDate(txtRechnungsdatum.Text), Sammelrechung, Firma, r.Cells("RechnungsKundenNr").Value, cbxMailoeffnen.Checked,, CDate(txtZeitraumBis.Text))
Next
initDGV()

View File

@@ -1,12 +1,13 @@
Imports iTextSharp.text.pdf
Imports System.IO
Imports Microsoft.Office.Interop
Imports System.IO
Imports System.Net
Imports GrapeCity.ActiveReports
Imports System.Net.Mail
Imports System.Reflection
Imports System.Text.RegularExpressions
Imports System.Windows.Documents
Imports com.sun.tools.internal.ws.wsdl.document.mime
Imports GrapeCity.ActiveReports
Imports itextsharp.text.pdf
Imports Microsoft.Office.Interop
Imports VERAG_PROG_ALLGEMEIN
@@ -238,7 +239,7 @@ Public Class frmFormulare
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Vollmacht (indirekt)", FormularManagerArten.DE_Vollmacht_indirekt))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Fiskal-Vollmacht", FormularManagerArten.DE_Fiskal))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht", FormularManagerArten.AT_Vollmacht))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht 4200 EV", FormularManagerArten.AT_Vollmacht_EV))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht EV", FormularManagerArten.AT_Vollmacht_EV))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Fiskal-Vollmacht", FormularManagerArten.AT_Fiskal))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("Export Vollmacht", FormularManagerArten.VERAG_EXPORT))
@@ -309,7 +310,7 @@ Public Class frmFormulare
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Vollmacht (indirekt)", FormularManagerArten.DE_Vollmacht_indirekt))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Fiskal-Vollmacht", FormularManagerArten.DE_Fiskal))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht", FormularManagerArten.AT_Vollmacht))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht 4200 EV", FormularManagerArten.AT_Vollmacht_EV))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht EV", FormularManagerArten.AT_Vollmacht_EV))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Fiskal-Vollmacht", FormularManagerArten.AT_Fiskal))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("GB Vollmacht Import/Export", FormularManagerArten.GB_Vollmacht_IE))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("GB Vollmacht indirekt", FormularManagerArten.GB_Vollmacht_indirekt))
@@ -359,7 +360,7 @@ Public Class frmFormulare
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Fiskal-Vollmacht", FormularManagerArten.DE_Fiskal))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE/AT Vollmacht (indirekt)", FormularManagerArten.DE_Vollmacht_indirekt))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht", FormularManagerArten.AT_Vollmacht))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht 4200 EV", FormularManagerArten.AT_Vollmacht_EV))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht EV", FormularManagerArten.AT_Vollmacht_EV))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Fiskal-Vollmacht", FormularManagerArten.AT_Fiskal))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("GB Vollmacht Import/Export", FormularManagerArten.GB_Vollmacht_IE))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("GB Vollmacht indirekt", FormularManagerArten.GB_Vollmacht_indirekt))
@@ -7152,7 +7153,8 @@ Public Class FormularManagerNEU
If reader.NumberOfPages > 0 Then
document.Open()
addAttachmentToCurrentPDF(reader, pdf)
addOnlyFirstAttachmentToCurrentPDF(reader, pdf)
pdf.AddDocument(reader)
reader.Close()
@@ -7200,6 +7202,7 @@ Public Class FormularManagerNEU
For i As Integer = 0 To filespecs.Size - 1 Step 2
' Get the attachment's file specification
Dim fileArray As PdfDictionary = filespecs.GetAsDict(i + 1)
Dim file As PdfDictionary = fileArray.GetAsDict(PdfName.EF)
@@ -7213,12 +7216,77 @@ Public Class FormularManagerNEU
' Add the attachment to the new PDF
Dim fileSpec As PdfFileSpecification = PdfFileSpecification.FileEmbedded(copy, Nothing, fileName, fileContent)
copy.AddFileAttachment(fileName, fileSpec)
Exit For
Next
Next
End If
End If
End Function
Public Shared Function addOnlyFirstAttachmentToCurrentPDF(reader As PdfReader, copy As PdfCopy) As Boolean
Dim catalog As PdfDictionary = reader.Catalog
Dim names As PdfDictionary = CType(PdfReader.GetPdfObject(catalog.Get(PdfName.NAMES)), PdfDictionary)
If names IsNot Nothing Then
Dim embeddedFiles As PdfDictionary = CType(PdfReader.GetPdfObject(names.Get(PdfName.EMBEDDEDFILES)), PdfDictionary)
If embeddedFiles IsNot Nothing Then
Dim filespecs As PdfArray = embeddedFiles.GetAsArray(PdfName.NAMES)
If filespecs Is Nothing Then Return False
For i As Integer = 0 To filespecs.Size - 1 Step 2
Dim fileArray As PdfDictionary = filespecs.GetAsDict(i + 1)
Dim file As PdfDictionary = fileArray.GetAsDict(PdfName.EF)
For Each key As PdfName In file.Keys
Dim stream As PRStream =
CType(PdfReader.GetPdfObject(file.GetAsIndirectObject(key)), PRStream)
Dim fileName As String = fileArray.GetAsString(key).ToString()
Dim fileContent As Byte() = PdfReader.GetStreamBytes(stream)
Dim fileSpec As PdfFileSpecification =
PdfFileSpecification.FileEmbedded(copy, Nothing, fileName, fileContent)
copy.AddFileAttachment(fileName, fileSpec)
Return True ' only one attachment ever gets copied
Next
Next
End If
End If
Return False
End Function
Private Shared Function HasAnyAttachment(reader As PdfReader) As Boolean
Dim catalog As PdfDictionary = reader.Catalog
Dim names As PdfDictionary =
TryCast(PdfReader.GetPdfObject(catalog.Get(PdfName.NAMES)), PdfDictionary)
If names Is Nothing Then Return True
Dim embeddedFiles As PdfDictionary =
TryCast(PdfReader.GetPdfObject(names.Get(PdfName.EMBEDDEDFILES)), PdfDictionary)
If embeddedFiles Is Nothing Then Return False
Dim filespecs As PdfArray = embeddedFiles.GetAsArray(PdfName.NAMES)
Return filespecs IsNot Nothing AndAlso filespecs.Size > 2
End Function

View File

@@ -2591,6 +2591,16 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Ressource vom Typ System.Byte[].
'''</summary>
Friend ReadOnly Property Ustveu_Rechnungsanlagen_BE() As Byte()
Get
Dim obj As Object = ResourceManager.GetObject("Ustveu_Rechnungsanlagen_BE", resourceCulture)
Return CType(obj,Byte())
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Ressource vom Typ System.Byte[].
'''</summary>

View File

@@ -994,4 +994,7 @@
<data name="Ustveu_Rechnungsanlagen_DE" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Ustveu-Rechnungsanlagen-DE.xls;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="Ustveu_Rechnungsanlagen_BE" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Ustveu_Rechnungsanlagen_BE.xlsx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

Binary file not shown.

View File

@@ -5065,6 +5065,7 @@
<None Include="Resources\SR_EVOLOG.xlsx" />
<None Include="Resources\SR_TransFerry360.xlsx" />
<None Include="Resources\Ustveu-Rechnungsanlagen-DE.xls" />
<None Include="Resources\Ustveu_Rechnungsanlagen_BE.xlsx" />
<None Include="Resources\VERAG_CBAM_Report_Template.xlsx" />
<None Include="Resources\Zoll\EORI_UID.dotx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>

View File

@@ -4,6 +4,7 @@ Imports System.Reflection
Imports System.Windows.Documents
Imports com.sun.xml.internal.ws.api.pipe
Imports itextsharp.text.pdf
Imports java.rmi.server
Imports Microsoft.Office.Interop
Imports VERAG_PROG_ALLGEMEIN
@@ -80,7 +81,7 @@ Public Class frmMDM_USTVAntrag
' left join [tblUStVLeistender] as leist on leist.UStV_Leistender = [tblUStVPositionen].[UStVPo_Leistender]
' where UStVAn_ID='" & UStVAn_ID & "' ORDER BY UStVPo_ID", "FMZOLL")
.SET_SQL("SELECT [UStVAn_ID] ,[UStVPo_ID] " & IIf(cbxInterneNr.Checked, ",[UStVPo_interneNr] as intNr", "") & " ,[UStVPo_ReDat],[UStVPo_ReNr],[UStVPo_Leistungsbezeichnung],[UStVPo_Nettobetrag],[UStVPo_NettobetragEUR],[UStVPo_Leistender],leist.[UstV_Leistender_Strasse] + ' ' + leist.[UstV_Leistender_StrasseNr] as [UstV_Leistender_Strasse],leist.[UstV_Leistender_PLZ],leist.[UstV_Leistender_Stadt],leist.[UstV_Leistender_Land],leist.[UstV_Leistender_UstNr],[UStVPo_USteuerbetrag],[UStVPo_Schnittstelle],[UStVPo_SchnittstellenNr],[UStVPo_Umrechnungskurs],[UStVPo_USteuerbetragEUR],[UStVPo_Sachbearbeiter], [UStVPo_daId], [UStVPo_daId_loeschbar] ,[UStVPo_VZ],[UStVPo_VZ_RKID] ,cast(case when isnull([UStVPo_VZ_RKID],0) = 0 then 0 else 1 end as bit) as VZabrechnet
.SET_SQL("SELECT [UStVAn_ID] ,[UStVPo_ID] " & IIf(cbxInterneNr.Checked, ",[UStVPo_interneNr] as intNr", "") & " ,[UStVPo_ReDat],[UStVPo_ReNr],[UStVPo_Leistungsbezeichnung],[UStVPo_Nettobetrag],[UStVPo_NettobetragEUR],[UStVPo_Leistender],leist.[UstV_Leistender_Strasse] + ' ' + leist.[UstV_Leistender_StrasseNr] as [UstV_Leistender_Strasse],leist.[UstV_Leistender_Strasse] as StrasseOnly,leist.[UstV_Leistender_StrasseNr] as StrassenNrOnly,leist.[UstV_Leistender_PLZ],leist.[UstV_Leistender_Stadt],leist.[UstV_Leistender_Land],leist.[UstV_Leistender_UstNr],[UStVPo_USteuerbetrag],[UStVPo_Schnittstelle],[UStVPo_SchnittstellenNr],[UStVPo_Umrechnungskurs],[UStVPo_USteuerbetragEUR],[UStVPo_Sachbearbeiter], [UStVPo_daId], [UStVPo_daId_loeschbar] ,[UStVPo_VZ],[UStVPo_VZ_RKID] ,cast(case when isnull([UStVPo_VZ_RKID],0) = 0 then 0 else 1 end as bit) as VZabrechnet
FROM [tblUStVPositionen]
LEFT JOIN [tblUStVLeistender] as leist
ON ([tblUStVPositionen].[UStVPo_LeistenderId] > 0
@@ -99,6 +100,10 @@ Public Class frmMDM_USTVAntrag
If .Columns.Count > 0 Then
.Columns("UStVAn_ID").Visible = False
.Columns("StrassenNrOnly").Visible = False
.Columns("StrasseOnly").Visible = False
.Columns("UStVPo_ID").HeaderText = "Pos"
.Columns("UStVPo_ID").Width = 40
@@ -4149,21 +4154,43 @@ Public Class frmMDM_USTVAntrag
Dim BANK_IBAN As String = ""
Dim BANK_BIC As String = ""
If IsDBNull(ADR.UstIdNr) OrElse ADR.UstIdNr Is Nothing Then
MsgBox("UID-Nr ist nicht im Kunden hinterlegt!")
End If
Dim filePath As String = ""
Dim fileName As String = USTV_ANTRAG.UStVAn_KuNr & "_" & Antrag_LandKz & "_" & CDate(USTV_ANTRAG.UStVAn_ReDatVon).Month & "_" & CDate(USTV_ANTRAG.UStVAn_ReDatBis).Month & "_" & CDate(USTV_ANTRAG.UStVAn_ReDatBis).Year & "_VATRefund"
dTLANDEU = (New SQL).loadDgvBySql("select LandKz, MitgliedslandEU from Währungstabelle where LandKz is not null", "FMZOLL")
Dim isEU As Boolean = dTLANDEU.AsEnumerable().Where(Function(res) res.Field(Of String)("LandKz") = USTV_ANTRAG.UStVAn_LandKz).Select(Function(res) res.Field(Of Boolean)("MitgliedslandEU")).FirstOrDefault()
If isEU Then
Dim UIDNr As Boolean = True
If IsDBNull(ADR.UstIdNr) OrElse ADR.UstIdNr Is Nothing Then
Select Case MsgBox("UID-Nr ist nicht im Kunden hinterlegt!" & vbNewLine & "Fortfahren?", vbYesNo)
Case vbYes : UIDNr = False
Case vbNo : Exit Sub
End Select
MsgBox("UID-Nr ist nicht im Kunden hinterlegt!")
End If
Select Case ADR.LandKz
Case "RO", "R" : fileName = fileName & ".xml" : createXMLforRO(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath)
Case "DE", "D" : fileName = fileName & ".csv" : createCSVforDE(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath) 'ALTERNATIVE: ELMA5-Massendatenschnittstelle allerdings um einiges aufwendiger!
Case "HR" : fileName = fileName & ".xml" : createXMLforHR(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath)
Case Else
MsgBox("Für das Kundenland " & ADR.LandKz & " wurde kein Export definiert")
End Select
Else
Select Case Antrag_LandKz
Case "BE" : fileName = fileName & ".xlsx" : createCSVforBE(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath)
Case Else
MsgBox("Für das Antragsland " & Antrag_LandKz & " wurde kein Export definiert")
End Select
End If
Select Case ADR.LandKz
Case "RO", "R" : fileName = fileName & ".xml" : createXMLforRO(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath)
Case "DE", "D" : fileName = fileName & ".csv" : createCSVforDE(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath) 'ALTERNATIVE: ELMA5-Massendatenschnittstelle allerdings um einiges aufwendiger!
Case "HR" : fileName = fileName & ".xml" : createXMLforHR(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath)
Case Else
MsgBox("Für das Land " & ADR.LandKz & " wurde kein Export definiert")
End Select
Me.Cursor = Cursors.Default
@@ -4726,7 +4753,7 @@ Public Class frmMDM_USTVAntrag
list.Add("parkplatz")
End If
If LeistungsBez.Contains("zubeh") Then
list.Add("zubehzubehör")
list.Add("zubehör")
End If
If LeistungsBez.Contains("übern") Then
list.Add("übernachtung")
@@ -4827,7 +4854,7 @@ Public Class frmMDM_USTVAntrag
End If
If typ = "maut" Then
Code = 4
SubCode = "4"
SubCode = ""
End If
Case "SI"
@@ -4857,7 +4884,7 @@ Public Class frmMDM_USTVAntrag
End If
If typ = "maut" Then
Code = 4
SubCode = "4"
SubCode = ""
End If
Case "HU"
@@ -4877,7 +4904,7 @@ Public Class frmMDM_USTVAntrag
End If
If typ = "maut" Then
Code = 4
SubCode = "4"
SubCode = ""
End If
Case "SE"
@@ -5054,7 +5081,7 @@ Public Class frmMDM_USTVAntrag
End If
Datei.Save
Datei.Save
Blatt = Datei.Worksheets(1)
@@ -5078,6 +5105,156 @@ Public Class frmMDM_USTVAntrag
Me.Cursor = Cursors.Default
End Function
Private Function createCSVforBE(ADR As cAdressen, KUNDE As cKunde, KUNDE_ERW As cKundenErweitert, FIRMA As cFirmen, BANK_OWNER As String, BANK_IBAN As String, BANK_BIC As String, filename As String, filePath As String)
Try
Dim sPath As String = Environment.GetFolderPath(Environment.SpecialFolder.Personal) & "\VERAG\SDL\tmp\"
If Not My.Computer.FileSystem.DirectoryExists(sPath) Then
My.Computer.FileSystem.CreateDirectory(sPath)
End If
Dim exclApp As Object 'as Application
Dim Datei As Object 'as WorkBook
Dim Blatt As Object 'Microsoft.Office.Interop.Excel.Worksheet 'As Object 'as Worksheet
exclApp = CreateObject("Excel.Application")
With exclApp
.Visible = False
Try
filePath = sPath & filename
'If File.Exists(filePath) Then
' File.Delete(filePath)
'End If
My.Computer.FileSystem.WriteAllBytes(filePath, My.Resources.Ustveu_Rechnungsanlagen_BE, False)
Catch ex As System.Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
Me.Cursor = Cursors.Default
Return False
End Try
Datei = .Workbooks.Open(filePath) 'Anpassen
Blatt = Datei.Worksheets(1) 'Anpassen
Dim counter As Integer = 1
Dim zeile As Integer = 3
Dim counterLeistungen As Integer = 1
For Each row As DataGridViewRow In dgvUSTVPositionen.SelectedRows.Cast(Of DataGridViewRow)().OrderBy(Function(dgvr) dgvr.Index)
Dim UIDNrLeistender = ""
Dim LeistenderName As String = ""
Dim listOfLeistungstyp As New List(Of String)
Dim Strasse As String = ""
If Not IsDBNull(row.Cells("StrasseOnly").Value) AndAlso row.Cells("StrasseOnly").Value IsNot Nothing AndAlso row.Cells("StrasseOnly").Value <> "" Then Strasse = row.Cells("StrasseOnly").Value
Dim StrasseNR As String = ""
If Not IsDBNull(row.Cells("StrassenNrOnly").Value) AndAlso row.Cells("StrassenNrOnly").Value IsNot Nothing AndAlso row.Cells("StrassenNrOnly").Value <> "" Then StrasseNR = row.Cells("StrassenNrOnly").Value
Dim Ort As String = ""
If Not IsDBNull(row.Cells("UstV_Leistender_Stadt").Value) AndAlso row.Cells("UstV_Leistender_Stadt").Value IsNot Nothing AndAlso row.Cells("UstV_Leistender_Stadt").Value <> "" Then Ort = row.Cells("UstV_Leistender_Stadt").Value
Dim PLZ As String = ""
If Not IsDBNull(row.Cells("UstV_Leistender_PLZ").Value) AndAlso row.Cells("UstV_Leistender_PLZ").Value IsNot Nothing AndAlso row.Cells("UstV_Leistender_PLZ").Value <> "" Then PLZ = row.Cells("UstV_Leistender_PLZ").Value
If Not IsDBNull(row.Cells("UstV_Leistender_UstNr").Value) AndAlso row.Cells("UstV_Leistender_UstNr").Value IsNot Nothing AndAlso row.Cells("UstV_Leistender_UstNr").Value <> "" Then
UIDNrLeistender = row.Cells("UstV_Leistender_UstNr").Value
'UIDNrLeistender = UIDNrLeistender.ToString.Replace(Antrag_LandKz, "") DEU wollen das Land dabei!
End If
LeistenderName = row.Cells("UStVPo_Leistender").Value
LeistenderName = LeistenderName.ToString.Replace(Antrag_LandKz, "")
Dim Nettobetrag As Double = 0
If Not IsDBNull(row.Cells("UStVPo_Nettobetrag").Value) AndAlso IsNumeric(row.Cells("UStVPo_Nettobetrag").Value) Then Nettobetrag = CDbl(row.Cells("UStVPo_Nettobetrag").Value)
Dim Steuerbetrag As Double = 0
If Not IsDBNull(row.Cells("UStVPo_USteuerbetrag").Value) AndAlso IsNumeric(row.Cells("UStVPo_USteuerbetrag").Value) Then Steuerbetrag = CDbl(row.Cells("UStVPo_USteuerbetrag").Value)
Dim land = ""
Dim iso2Land = ""
If Not IsDBNull(row.Cells("UstV_Leistender_Land").Value) AndAlso row.Cells("UstV_Leistender_Land").Value IsNot Nothing AndAlso row.Cells("UstV_Leistender_Land").Value <> "" Then land = row.Cells("UstV_Leistender_Land").Value
If land.Length = 2 Then
iso2Land = land
ElseIf land.Length = 3 Then
iso2Land = VERAG_PROG_ALLGEMEIN.cProgramFunctions.getISO2LandFromISO3Land(land)
ElseIf land.Length = 1 Then
iso2Land = VERAG_PROG_ALLGEMEIN.cProgramFunctions.getISO2LandFromISO1Land(land)
End If
Blatt.Range("A" & zeile).Value = counter
Blatt.Range("C" & zeile).Value = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(LeistenderName)
Blatt.Range("D" & zeile).Value = UIDNrLeistender
Blatt.Range("E" & zeile).Value = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(Strasse)
Blatt.Range("F" & zeile).Value = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(StrasseNR)
Blatt.Range("G" & zeile).Value = PLZ
Blatt.Range("H" & zeile).Value = Ort
Blatt.Range("I" & zeile).Value = VERAG_PROG_ALLGEMEIN.cProgramFunctions.getLandEnglFromISO2Land(iso2Land) 'Funktion der das Land auf englisch zurückgibt
Blatt.Range("J" & zeile).Value = "Purchase"
Blatt.Range("K" & zeile).Value = "Normal"
Blatt.Range("L" & zeile).Value = CDate(row.Cells("UStVPo_ReDat").Value).ToString("dd.MM.yyyy")
Blatt.Range("M" & zeile).Value = row.Cells("UStVPo_ReNr").Value
Blatt.Range("N" & zeile).Value = Nettobetrag.ToString("0.00", CultureInfo.InvariantCulture)
Blatt.Range("O" & zeile).Value = Steuerbetrag.ToString("0.00", CultureInfo.InvariantCulture)
Blatt.Range("P" & zeile).Value = Steuerbetrag.ToString("0.00", CultureInfo.InvariantCulture)
If Not IsDBNull(row.Cells("UStVPo_Leistungsbezeichnung").Value) AndAlso row.Cells("UStVPo_Leistungsbezeichnung").Value IsNot Nothing Then
listOfLeistungstyp = getLeistungsTyp(row.Cells("UStVPo_Leistungsbezeichnung").Value, row.Cells("UStVPo_SchnittstellenNr").Value)
Dim typeOfGoodsAndService As String = ""
If listOfLeistungstyp.Count > 0 Then
Select Case listOfLeistungstyp(0)
Case "maut" : typeOfGoodsAndService = "Road tolls and road user charge"
Case "diesel" : typeOfGoodsAndService = "Fuel"
Case "rest" : typeOfGoodsAndService = "Other"
Case "übernachtung" : typeOfGoodsAndService = "Accommodation"
Case "zubehör" : typeOfGoodsAndService = "Other"
Case "parkplatz" : typeOfGoodsAndService = "Travel expenses, such as taxi fares, public transport fares"
End Select
End If
Blatt.Range("B" & zeile).Value = typeOfGoodsAndService
End If
Datei.Save
counter += 1
zeile += 1
Next
Datei.Save
.Visible = True
End With
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
Me.Cursor = Cursors.Default
End Function
Private Function PDFInvoicesPath(ByRef posId As String) As String

View File

@@ -1,4 +1,5 @@
Imports System.ComponentModel
Imports System.Data.SqlClient
Imports System.Reflection
Imports System.Text.RegularExpressions
Imports System.Threading
@@ -317,7 +318,7 @@ Public Class cProgramFunctions
Case 1, 7 : Return openThereforeNavigatorZollvollmachten_DE(KundenNr)
Case 2, 8 : Return openThereforeNavigatorFiskalVM_DE(KundenNr)
Case 4, 9 : Return openThereforeNavigatorFiskalVM_AT(KundenNr)
Case 12, 13 : Return openThereforeNavigatorVM_AT(KundenNr)
' Case 12, 13 : Return openThereforeNavigatorVM_AT(KundenNr)
End Select
Return False
End Function
@@ -395,28 +396,74 @@ Public Class cProgramFunctions
End Function
Shared Function openThereforeNavigatorVM_AT(KundenNr As String)
Try
Dim srch = KundenNr & "%"
Dim docid As String = ""
docid = SQL_VERAG.getValueTxtBySql("SELECT TOP 1 isnull([DocNo],-1) FROM [Therefore].[dbo].[TheCat76] WHERE [String] LIKE '" & srch & "' ORDER BY [Eingabedatum] DESC", "SCANCANON")
Public Shared Function ValidateSQLFieldLengths(parameters As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable), tableName As String, Info As String, Optional conn_art As String = "FMZOLL", Optional showError As Boolean = True) As Boolean
Try
Dim sql As String =
"SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" & tableName & "' AND DATA_TYPE IN ('varchar','nvarchar','char','nchar')"
Dim dt As DataTable =
(New SQL).loadDgvBySql(sql, conn_art)
If dt Is Nothing Then Return False
Dim fieldLengths As New Dictionary(Of String, Integer)(StringComparer.OrdinalIgnoreCase)
For Each r As DataRow In dt.Rows
fieldLengths(r!COLUMN_NAME.ToString) =
CInt(r!CHARACTER_MAXIMUM_LENGTH)
Next
Dim errors As New List(Of String)
For Each p As SQLVariable In parameters
If p Is Nothing Then Continue For
If p.Value() Is Nothing Then Continue For
If p.Text() Is Nothing Then Continue For
Dim fieldName As String = p.Text().TrimStart("@"c)
If Not fieldLengths.ContainsKey(fieldName) Then Continue For
Dim maxLen As Integer = fieldLengths(fieldName)
' varchar(max) / nvarchar(max)
If maxLen = -1 Then Continue For
Dim value As String = p.Value().ToString
If value.Length > maxLen Then
errors.Add(fieldName & " -> " & value.Length & "/" & maxLen)
End If
Next
If errors.Count > 0 Then
Info = "Folgende SQL-Felder sind zu lang:" & vbCrLf & vbCrLf & String.Join(vbCrLf, errors)
If showError Then
MsgBox(Info, MsgBoxStyle.Exclamation)
End If
Return False
End If
Return True
If IsNumeric(docid) AndAlso docid > 0 Then
' Process.Start("theviewer.exe -" & docid)
' Process.Start("C:\Program Files (x86)\Therefore\theviewer.exe -" & docid)
Try
Shell("C:\Program Files (x86)\Therefore\theviewer.exe -d" & docid)
Catch ex As Exception
Shell("C:\Program Files\Therefore\theviewer.exe -d" & docid)
End Try
Else
MsgBox("Das Dokument konnte nicht gefunden werden.")
End If
Return True
Catch ex As Exception
MsgBox("Fehler beim Öffnen!" & vbNewLine & ex.Message & ex.StackTrace)
MsgBox("ValidateSQLFieldLengths:" & vbCrLf & ex.Message)
Return False
End Try
Return False
End Function
Shared Function openThereforeNavigatorFiskalVM_AT(KundenNr As String)

View File

@@ -449,6 +449,12 @@ Public Class cUStVPositionen
Public Function SAVE() As Boolean
Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
If VERAG_PROG_ALLGEMEIN.cProgramFunctions.ValidateSQLFieldLengths(list, "tblUStVPositionen", "", "FMZOLL") Then
Return False
End If
Dim sqlstr = " BEGIN TRAN IF EXISTS(SELECT * FROM tblUStVPositionen WHERE UStVAn_ID=@UStVAn_ID AND UStVPo_ID=@UStVPo_ID) " &
" BEGIN " & getUpdateCmd() & " END " &
" Else " &

View File

@@ -2458,9 +2458,15 @@ Public Class DATENVERVER_OPTIONS
Using pdf As New iText.Kernel.Pdf.PdfDocument(New iText.Kernel.Pdf.PdfReader(pdfPath), New iText.Kernel.Pdf.PdfWriter(tempFile))
Dim xmlBytes = File.ReadAllBytes(xmlPath)
Dim fileName As String = "factur-x.xml"
If HasAttachment(pdf, fileName) Then
Return pdfPath
End If
Dim fs = PdfFileSpec.CreateEmbeddedFileSpec(
pdf,
xmlBytes,
@@ -2490,6 +2496,32 @@ Public Class DATENVERVER_OPTIONS
End Function
Private Shared Function HasAttachment(pdf As iText.Kernel.Pdf.PdfDocument, fileName As String) As Boolean
Dim catalog = pdf.GetCatalog().GetPdfObject()
Dim afObj = catalog.Get(iText.Kernel.Pdf.PdfName.AF)
If afObj Is Nothing Then Return False
Dim afArray = TryCast(afObj, iText.Kernel.Pdf.PdfArray)
If afArray Is Nothing Then Return False
For i As Integer = 0 To afArray.Size() - 1
Dim fsObj = afArray.Get(i)
Dim fsDict = TryCast(fsObj, iText.Kernel.Pdf.PdfDictionary)
If fsDict Is Nothing Then Continue For
Dim fName = fsDict.GetAsString(iText.Kernel.Pdf.PdfName.F)
If fName IsNot Nothing AndAlso fName.ToString().Equals(fileName, StringComparison.OrdinalIgnoreCase) Then
Return True
End If
Next
Return False
End Function
Public Shared Function ConvertToPdfA3(inputPdf As String) As String

View File

@@ -366,6 +366,76 @@ Public Class cProgramFunctions
End If
End Sub
Public Shared Function ValidateSQLFieldLengths(parameters As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable), tableName As String, Info As String, Optional conn_art As String = "FMZOLL", Optional showError As Boolean = True) As Boolean
Try
Dim sql As String =
"SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" & tableName & "' AND DATA_TYPE IN ('varchar','nvarchar','char','nchar')"
Dim dt As DataTable =
(New SQL).loadDgvBySql(sql, conn_art)
If dt Is Nothing Then Return False
Dim fieldLengths As New Dictionary(Of String, Integer)(StringComparer.OrdinalIgnoreCase)
For Each r As DataRow In dt.Rows
fieldLengths(r!COLUMN_NAME.ToString) =
CInt(r!CHARACTER_MAXIMUM_LENGTH)
Next
Dim errors As New List(Of String)
For Each p As SQLVariable In parameters
If p Is Nothing Then Continue For
If p.Value() Is Nothing Then Continue For
If p.Text() Is Nothing Then Continue For
Dim fieldName As String = p.Text().TrimStart("@"c)
If Not fieldLengths.ContainsKey(fieldName) Then Continue For
Dim maxLen As Integer = fieldLengths(fieldName)
' varchar(max) / nvarchar(max)
If maxLen = -1 Then Continue For
Dim value As String = p.Value().ToString
If value.Length > maxLen Then
errors.Add(fieldName & " -> " & value.Length & "/" & maxLen)
End If
Next
If errors.Count > 0 Then
Info = "Folgende SQL-Felder sind zu lang:" & vbCrLf & vbCrLf & String.Join(vbCrLf, errors)
If showError Then
MsgBox(Info, MsgBoxStyle.Exclamation)
End If
Return False
End If
Return True
Catch ex As Exception
MsgBox("ValidateSQLFieldLengths:" & vbCrLf & ex.Message)
Return False
End Try
End Function
Public Shared Function fktEuro(varBetrag As Object, varVonWährung As Object, varNachWährung As Object) As Object
'(FixeTaxe, "ATS", RECHNUNG.Währungscode)
'Dim varVonWährung As Object
@@ -948,11 +1018,19 @@ BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, [Control], New Object(
Return SQL.getValueTxtBySql(sqlstr, "FMZOLL")
End Function
Shared Function getISO1Land(LandKz As String)
Dim sqlstr = "SELECT TOP 1 isnull(Währungstabelle.LandKz,'') AS LandKzISO1 FROM [Länderverzeichnis für die Außenhandelsstatistik] LEFT JOIN Währungstabelle ON [Länderverzeichnis für die Außenhandelsstatistik].LandNr = Währungstabelle.Währungsschlüssel WHERE [Länderverzeichnis für die Außenhandelsstatistik].LandKz='" & LandKz & "' "
Shared Function getLandEnglFromISO2Land(Iso2Land As String)
Dim sqlstr = "SELECT TOP 1 isnull(Land_EN,'') AS LandBez FROM [Währungstabelle] LEFT JOIN [Länderverzeichnis für die Außenhandelsstatistik] ON [Länderverzeichnis für die Außenhandelsstatistik].LandNr = Währungstabelle.Währungsschlüssel WHERE [Länderverzeichnis für die Außenhandelsstatistik].LandKz='" & Iso2Land & "' "
Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
Return SQL.getValueTxtBySql(sqlstr, "FMZOLL")
End Function
Shared Function getISO1Land(LandKz As String)
Dim sqlstr = "SELECT TOP 1 isnull(Währungstabelle.Land_EN,'') AS LandBez FROM [Länderverzeichnis für die Außenhandelsstatistik] LEFT JOIN Währungstabelle ON [Länderverzeichnis für die Außenhandelsstatistik].LandNr = Währungstabelle.Währungsschlüssel WHERE [Länderverzeichnis für die Außenhandelsstatistik].LandKz='" & LandKz & "' "
Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
Return SQL.getValueTxtBySql(sqlstr, "FMZOLL")
End Function
Shared Function convertToIso(s) As String
Return s