From 123f06f3b1952ffb93fafb183bdb13afb860c59e Mon Sep 17 00:00:00 2001 From: "d.breimaier" Date: Fri, 19 Jun 2026 17:13:38 +0200 Subject: [PATCH] Fiskaltrust, Automailversand, etc. --- SDL/Classes/cFiskaltrustClient.vb | 2 +- SDL/Classes/cFiskaltrustClient_chilkat.vb | 402 ++++++++++++++++++++++ SDL/Classes/cRKSV.vb | 30 +- SDL/Fakturierung/cAutomailversand.vb | 329 ++++++++++++++---- SDL/SDL.vbproj | 1 + SDL/USTV/usrCntlUSTV.Designer.vb | 46 ++- SDL/USTV/usrCntlUSTV.vb | 276 ++++++++++++++- SDL/buchhaltung/frmBU_Mahnlauf.vb | 2 +- SDL/kassenbuch/frmBelegNeu.Designer.vb | 2 +- SDL/kassenbuch/frmBelegNeu.vb | 33 +- SDL/mdm/frmMDMDatenverarbetiung.vb | 2 +- 11 files changed, 1029 insertions(+), 96 deletions(-) create mode 100644 SDL/Classes/cFiskaltrustClient_chilkat.vb diff --git a/SDL/Classes/cFiskaltrustClient.vb b/SDL/Classes/cFiskaltrustClient.vb index 2b61e0f5..384b82ba 100644 --- a/SDL/Classes/cFiskaltrustClient.vb +++ b/SDL/Classes/cFiskaltrustClient.vb @@ -702,7 +702,7 @@ Public Class cFiskaltrustClient End Function - Public Function getVersion(Terminal_ID) As String + Private Function getVersion(Terminal_ID) As String Return Terminal_ID & "_" & Application.ProductVersion diff --git a/SDL/Classes/cFiskaltrustClient_chilkat.vb b/SDL/Classes/cFiskaltrustClient_chilkat.vb new file mode 100644 index 00000000..ed52b292 --- /dev/null +++ b/SDL/Classes/cFiskaltrustClient_chilkat.vb @@ -0,0 +1,402 @@ + +Imports System.Data.SqlClient +Imports System.Reflection +Imports Chilkat +Imports Newtonsoft.Json + + +Public Class cFiskaltrustClient_chilkat + + Private ReadOnly _baseUrl As String + Private ReadOnly _cashboxId As String + Private ReadOnly _accessToken As String + Private ReadOnly _country As String + + Public Sub New(baseUrl As String, cashboxId As String, accessToken As String, country As String) + _baseUrl = baseUrl.TrimEnd("/"c) + _cashboxId = cashboxId + _accessToken = accessToken + _country = country + End Sub + + Public Function SignReceipt(amount As Decimal, vat As Decimal, POS As List(Of EABelegPositionen), kindOfPayment As String, posSystemId As String) As String + + Dim payload As JsonObject = BuildPayloadReceipt(amount, vat, POS, kindOfPayment, posSystemId) + + Return SendChilkat(GetEndpoint("payment"), payload.Emit()) + End Function + + Public Function SignReceipt_test(posSystemId As String) As String + + Dim LIST = New List(Of EABelegPositionen) + Dim p = New EABelegPositionen + p.Mandant = "VERA" + p.Niederlassung = "SUB" + p.Benutzer = 74 + p.BelegDat = Now + p.BelegNr = 1 + p.PreislistenNr = 1 + p.PreislistenPos = 1 + p.LeistungsNr = 300 + p.LeistungsBez = "TEST" + p.Preis = 10 + p.Anzahl = 1 + LIST.Add(p) + + Dim amount = 100 + Dim vat = 0 + Dim POS = LIST + Dim kindOfPayment = "Cash" + + Dim payload As JsonObject = BuildPayloadReceipt(amount, vat, POS, kindOfPayment, posSystemId) + + Return SendChilkat(GetEndpoint("payment"), payload.Emit()) + End Function + + Public Function SignNullReceipt(posSystemId As String) As String + Return SendChilkat(GetEndpoint("payment"), BuildPayloadNullReceipt(posSystemId, _country).Emit()) + End Function + + Public Function SignClosingReceipt(receiptType As String, posSystemId As String) As String + + Return SendChilkat(GetEndpoint("payment"), BuildPayloadClosingReceipt(receiptType, posSystemId).Emit()) + End Function + + Public Function Echo(kassenName As String) As String + + Dim json As New JsonObject() + json.UpdateString("Message", kassenName & " - VERBINDUNG OK") + + Return SendChilkat(GetEndpoint("test"), json.Emit()) + + End Function + + Public Function Journal(Optional typ As String = "") As String + + Dim endpoint = GetEndpoint("journal") + + If typ <> "" Then endpoint &= "?type=" & typ + + Return SendChilkat(endpoint, "", True) + End Function + + Private Function SendChilkat(endpoint As String, payload As String, Optional isGet As Boolean = False) As String + + Dim retries As Integer = 3 + Dim lastEx As Exception = Nothing + VERAG_PROG_ALLGEMEIN.cChilkat_Helper.UnlockCilkat() + Dim rest As New Chilkat.Rest + Dim failureDesc As String + rest.VerboseLogging = True + + + For i As Integer = 1 To retries + + Try + + Dim uri As New Uri(_baseUrl) + + If Not rest.Connect(uri.Host, uri.Port, uri.Scheme = "https", True) Then + + Throw New Exception(rest.LastErrorText) + failureDesc = rest.LastErrorText + Return failureDesc + + End If + + rest.AddHeader("cashboxid", _cashboxId) + rest.AddHeader("accesstoken", _accessToken) + + Dim response As String + + If isGet Then + response = rest.FullRequestNoBody("GET", uri.AbsoluteUri & endpoint) + Else + + + If _country = "AT" Then + rest.AddHeader("Content-Type", "text/plain") + response = rest.FullRequestString("POST", uri.AbsoluteUri & endpoint, payload) + Else + rest.AddHeader("Content-Type", "application/json") + response = rest.FullRequestString("POST", uri.AbsoluteUri & endpoint, payload) + End If + + + End If + + If rest.ResponseStatusCode >= 200 AndAlso rest.ResponseStatusCode < 300 Then + Return response + Else + failureDesc = rest.LastErrorText + End If + + Throw New Exception("HTTP " & rest.ResponseStatusCode & ": " & response) + + Catch ex As Exception + lastEx = ex + Threading.Thread.Sleep(500) + End Try + + Next + + Throw lastEx + + End Function + + Private Function BuildPayloadReceipt(amount As Decimal, vat As Decimal, POS As List(Of EABelegPositionen), kindOfPayment As String, posSystemId As String) As JsonObject + + Dim json As New JsonObject() + + json.UpdateString("ftCashBoxID", _cashboxId) + json.UpdateString("ftPosSystemId", getVersion(posSystemId)) + json.UpdateString("cbTerminalID", posSystemId) + json.UpdateString("cbReceiptReference", Guid.NewGuid().ToString()) + json.UpdateString("cbReceiptMoment", DateTime.UtcNow.ToString("o")) + json.UpdateString("ftReceiptCase", 4919338172267102209) + + Dim chargeItems = json.AppendArray("cbChargeItems") + + For Each p In POS + + If chargeItems.AddObjectAt(-1) Then + Dim item As Chilkat.JsonObject = chargeItems.ObjectAt(chargeItems.Size - 1) + item.UpdateInt("Quantity", p.Anzahl) + item.UpdateNumber("Amount", p.Preis.ToString().Replace(",", ".")) + item.UpdateNumber("VATRate", vat.ToString().Replace(",", ".")) + item.UpdateString("Description", p.LeistungsBez) + item.UpdateString("ftChargeItemCase", 4919338167972134929) + End If + + + Next + + Dim payItems = json.AppendArray("cbPayItems") + payItems.AddObjectAt(-1) + Dim pay As Chilkat.JsonObject = payItems.ObjectAt(payItems.Size - 1) + pay.UpdateInt("Quantity", 1) + pay.UpdateNumber("Amount", amount.ToString().Replace(",", ".")) + pay.UpdateString("Description", kindOfPayment) + pay.UpdateString("ftPayItemCase", 4919338167972134913) + + Return json + + End Function + + Private Function BuildPayloadNullReceipt(posSystemId As String, country As String) As JsonObject + + Dim json As New JsonObject() + + json.UpdateString("ftCashBoxID", _cashboxId) + json.UpdateString("ftPosSystemId", getVersion(posSystemId)) + json.UpdateString("cbTerminalID", posSystemId) + json.UpdateString("cbReceiptMoment", DateTime.UtcNow.ToString("o")) + + Return json + End Function + + Private Function BuildPayloadClosingReceipt(receiptType As String, posSystemId As String) As JsonObject + + Dim json As New JsonObject() + + json.UpdateString("ftCashBoxID", _cashboxId) + json.UpdateString("ftPosSystemId", getVersion(posSystemId)) + json.UpdateString("cbTerminalID", posSystemId) + + Return json + End Function + + Private Function GetEndpoint(type As String) As String + + Select Case type + + Case "payment" + + Select Case _country + Case "DE" : Return "/json/v1/Sign" + Case "AT" : Return "/json/Sign" + End Select + + Case "test" + + Select Case _country + Case "DE" : Return "/json/v1/Echo" + Case "AT" : Return "/json/Echo" + End Select + + Case "journal" + + Select Case _country + Case "DE" : Return "/json/v0/Journal" + Case "AT" : Return "/json/Journal" + End Select + + End Select + + Throw New Exception("Unsupported country") + + End Function + + Private Function getVersion(Terminal_ID As String) As String + Return Terminal_ID & "_" & Application.ProductVersion + End Function + + Public Function saveRKSV_FT(ByRef result_zahlung As String, ByRef QR_CodeString As String) As Boolean + + If result_zahlung <> "" Then + Dim json As New Chilkat.JsonObject + Dim success As Boolean = json.Load(result_zahlung) + If (success <> True) Then + Debug.WriteLine(json.LastErrorText) + Return False + End If + + + Dim saved As Boolean = False + + Dim ftSig As New cFiskaltrustSignatures() + + Dim ftReceiptMoment As New Chilkat.CkDateTime + Dim dt As New Chilkat.DtObj + Dim getAsLocal As Boolean = False + + Dim ftID As Integer = -1 + + success = json.DateOf("ftReceiptMoment", ftReceiptMoment) + Debug.WriteLine(ftReceiptMoment.GetAsTimestamp(getAsLocal)) + + With ftSig + + .ftCashBoxID = json.StringOf("ftCashBoxID") + .ftQueueID = json.StringOf("ftQueueID") + .ftQueueItemID = json.StringOf("ftQueueItemID") + .ftQueueRow = json.IntOf("ftQueueRow") + .cbTerminalID = json.StringOf("cbTerminalID") + .cbReceiptReference = json.StringOf("cbReceiptReference") + .ftCashBoxIdentification = json.StringOf("ftCashBoxIdentification") + .ftReceiptIdentification = json.StringOf("ftReceiptIdentification") + .ftReceiptMoment = ftReceiptMoment.GetAsTimestamp(getAsLocal) + .ftState = json.StringOf("ftState") + saved = .SAVE() + + End With + + + Dim num As Integer = json.SizeOfArray("ftSignatures") + If num = 0 Then + Return False + End If + + Dim Signatures As Chilkat.JsonArray = json.ArrayOf("ftSignatures") + If (json.LastMethodSuccess = False) Then + Return False + End If + + Dim numSignatures As Integer = Signatures.Size + + For i = 0 To numSignatures - 1 + + + Dim SignObj As Chilkat.JsonObject = Signatures.ObjectAt(i) + Dim ftSigPos As New cFiskaltrustSignaturPositions() + + With ftSigPos + .ftSignatures = ftSig.ft_id + .ftData = SignObj.StringOf("Data") + .ftSignatureFormat = SignObj.StringOf("ftSignatureFormat") + .ftSignatureType = SignObj.StringOf("ftSignatureType") + saved = .SAVE() + If IsNumeric(.ftSignatureType) AndAlso CInt(.ftSignatureType) = IIf(VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM = True, 0, 3) Then + 'QR_CodeString = .ftData + End If + + End With + + Next + + + Return saved + + + + End If + + + End Function + + + Public Function exportJournal(ByRef result_Journal As String) As Boolean + + If result_Journal <> "" Then + Dim jsonArr As New Chilkat.JsonArray + Dim success As Boolean = jsonArr.Load(result_Journal) + If (success <> True) Then + Debug.WriteLine(jsonArr.LastErrorText) + Return False + End If + + + Dim dt As New DataTable + + dt.Columns.Add("ftReceiptJournalId", GetType(String)) + dt.Columns.Add("ftReceiptMoment", GetType(String)) + dt.Columns.Add("ftReceiptNumber", GetType(String)) + dt.Columns.Add("ftReceiptTotal", GetType(String)) + dt.Columns.Add("ftQueueId", GetType(String)) + dt.Columns.Add("ftReceiptHash", GetType(String)) + dt.Columns.Add("ftQueueItemId", GetType(String)) + dt.Columns.Add("TimeStamp", GetType(String)) + + Dim i = 0 + Dim num As Integer = jsonArr.Size + If num = 0 Then + Return False + End If + + Dim tmstmp As New Chilkat.CkDateTime + Dim getAsLocal As Boolean = False + + + While i < num + + Dim SignObj As Chilkat.JsonObject = jsonArr.ObjectAt(i) + Dim R As DataRow = dt.NewRow + + With SignObj + + R("ftReceiptJournalId") = .StringOf("ftReceiptJournalId") + R("ftReceiptMoment") = .StringOf("ftReceiptMoment") + R("ftReceiptNumber") = .IntOf("ftReceiptNumber") + R("ftReceiptTotal") = .StringOf("ftReceiptTotal") + R("ftQueueId") = .StringOf("ftQueueId") + R("ftQueueItemId") = .StringOf("ftQueueItemId") + R("ftReceiptHash") = .StringOf("ftReceiptHash") + R("TimeStamp") = tmstmp.GetAsTimestamp(getAsLocal) + + End With + + dt.Rows.Add(R) + + i = i + 1 + End While + + If dt.Rows.Count > 0 Then + + Dim Path = VERAG_PROG_ALLGEMEIN.cProgramFunctions.genExcelFromDT_NEW(dt) + + End If + + + End If + + + + End Function + + + Private Sub Log(message As String) + Console.WriteLine(message) + End Sub + +End Class + diff --git a/SDL/Classes/cRKSV.vb b/SDL/Classes/cRKSV.vb index 8214dc49..c9dd04d9 100644 --- a/SDL/Classes/cRKSV.vb +++ b/SDL/Classes/cRKSV.vb @@ -92,7 +92,7 @@ Public Class cRKSV End Function - Shared Async Function insertRKSVFiskaltrustAsync(ByVal kasse As cRKSV_Kasse, CompanyGUID As String, ByVal umsatzZaehler As Double, ByVal belegDat As DateTime, ByVal steuerSchluessel As Integer, ByVal RKSV_Beleg_Id As Integer, ByVal summeBRUTTO As Double, TEST As Boolean, POS As List(Of EABelegPositionen), QR_CodeString As String, LastJWS As String) As Task(Of Boolean) + Shared Function insertRKSVFiskaltrustAsync(ByVal kasse As cRKSV_Kasse, CompanyGUID As String, ByVal umsatzZaehler As Double, ByVal belegDat As DateTime, ByVal steuerSchluessel As Integer, ByVal RKSV_Beleg_Id As Integer, ByVal summeBRUTTO As Double, TEST As Boolean, POS As List(Of EABelegPositionen), ByRef QR_CodeString As String, ByRef LastJWS As String) As Boolean Try @@ -123,21 +123,35 @@ Public Class cRKSV Dim BetragSatzBesonders = IIf(steuersatz = 0.19, summeBRUTTO, 0.0) Dim StandUmsatzzaehler = umsatzZaehler 'KASSE.rksv_Umsatzzaehler - Dim client As New cFiskaltrustClient(kasse.rksv_FT_RestServiceURL, kasse.rksv_FT_CashboxID, kasse.rksv_FT_AccessToken, kasse.rksv_FT_Country) + If False Then + 'Dim client As New cFiskaltrustClient(kasse.rksv_FT_RestServiceURL, kasse.rksv_FT_CashboxID, kasse.rksv_FT_AccessToken, kasse.rksv_FT_Country) - - Dim result = Await client.SignReceiptAsync(summeBRUTTO, steuersatz, POS, "Cash", kasse.rksv_id) - If result <> "" Then - Return client.saveRKSV_FT(result, QR_CodeString) + 'Dim result = Await client.SignReceiptAsync(summeBRUTTO, steuersatz, POS, "Cash", kasse.rksv_id) + 'If result <> "" Then + ' Return client.saveRKSV_FT(result, QR_CodeString) + 'Else + ' Return False + 'End If Else - Return False + Dim client As New cFiskaltrustClient_chilkat(kasse.rksv_FT_RestServiceURL, kasse.rksv_FT_CashboxID, kasse.rksv_FT_AccessToken, kasse.rksv_FT_Country) + Dim result = client.SignReceipt(summeBRUTTO, steuersatz, POS, "Cash", kasse.rksv_id) + If result <> "" Then + Return client.saveRKSV_FT(result, QR_CodeString) + Else + Return False + End If + End If + + + + Catch ex As Exception MsgBox("Es ist ein Fehler bei der Signatur aufgetreten (insertRKSV): " & vbNewLine & ex.Message & ex.StackTrace) - Return False + Return False End Try End Function diff --git a/SDL/Fakturierung/cAutomailversand.vb b/SDL/Fakturierung/cAutomailversand.vb index c55d8d9b..d6df9cf0 100644 --- a/SDL/Fakturierung/cAutomailversand.vb +++ b/SDL/Fakturierung/cAutomailversand.vb @@ -16,7 +16,6 @@ Public Class cAutomailversand 'STATUS 3-_> Sammel-Rg gedruckt 'STATUS 4-_> ? irgendwas mit SR 6 Maut/Diesel?? - 'NUR STATUS 2 -> d.b. Rechnungsdatum + RechnungsNr vergeben! Dim rechnungenMailversand = "" @@ -160,7 +159,7 @@ Public Class cAutomailversand 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 - loadAndSetAnhaenge(SR_DT, ATTACHMENTS, listPDFs,,, KDE_ERW.kde_merge_pdf) + loadAndSetAnhaenge_new(SR_DT, ATTACHMENTS, listPDFs,,, KDE_ERW.kde_merge_pdf) If VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then Mailsubject &= " TEST" @@ -249,6 +248,7 @@ Public Class cAutomailversand setEmpfaengerMail_ER(SPEDBUCH, AD, MailTo, MailtoCC, MailtoBCC, "") If VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then + MailTo = "" MailtoCC = "" MailtoBCC = setAccountToSend(FirmaID) @@ -275,7 +275,7 @@ Public Class cAutomailversand Dim Mailsubject As String = "" Dim HTMLMail As String = "" setEmailText(r, FirmaID, RECHNUNG.RechnungsNr, Mailsubject, HTMLMail, RECHNUNG.Sammelrechnung, dt, RECHNUNG.BelegartenNr, SPEDBUCH, RECHNUNG) - loadAndSetAnhaenge(dt, ATTACHMENTS, listPDFs, RECHNUNG, SPEDBUCH, KDE_ERW.kde_merge_pdf) + loadAndSetAnhaenge_new(dt, ATTACHMENTS, listPDFs, RECHNUNG, SPEDBUCH, KDE_ERW.kde_merge_pdf) If VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then Mailsubject &= " TEST" @@ -530,18 +530,124 @@ Public Class cAutomailversand End Function + Private Sub loadAndSetAnhaenge_new(SR_DT As DataTable, ATTACHMENTS As List(Of cFakt_MailATTach), listPDFs As List(Of String), Optional RECHNUNG As cRechnungsausgang = Nothing, Optional SPEDBUCH As cSpeditionsbuch = Nothing, Optional mergeAllPDFS As Boolean = False) + + Dim zielPfad_PDFZusammenfassung = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getTMPPath("Anhang.pdf", ".pdf",, False, "Zusammenfassung") + + '==================================================== + ' EINZELRECHNUNG + '==================================================== + If RECHNUNG IsNot Nothing Then + + Dim mergeList As New List(Of String) + + ' Beleg + Dim belegName = If(RECHNUNG.BelegartenKz = "AR", "Rechnung.pdf", "Gutschrift.pdf") + + For Each pdf In listPDFs + ATTACHMENTS.Add(New cFakt_MailATTach(pdf, belegName)) + Next + + ' Rechnungsanhänge + RECHNUNG.LOAD_ANHAENGE() + + For Each anh In RECHNUNG.ANHAENGE + + HandlePdf(anh.dsId, anh.Bezeichnung, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False, mergeList, ATTACHMENTS) + + Next + + ' Zoll-Unterlagen + LoadZollAttachments(SPEDBUCH, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False, mergeList, ATTACHMENTS) + + ' Zusammenfassung erzeugen + AddMergedPdf(mergeList, zielPfad_PDFZusammenfassung, ATTACHMENTS) + + ' Beleg + Anhänge zusammenführen + If mergeAllPDFS AndAlso ATTACHMENTS.Count > 1 Then + + Dim prefix = If(RECHNUNG.BelegartenKz = "AR", "Rechnungs", "Gutschrifts") + + Dim zielPfad = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getTMPPath(prefix & "anhang.pdf", ".pdf",, False, "Zusammenfassung") + + Dim pdfs As New List(Of String) + pdfs = ATTACHMENTS.Select(Function(a) a.Pfad.ToString).ToList() + + If FormularManagerNEU.MergePdfFiles(pdfs, zielPfad) Then + ATTACHMENTS.Clear() + ATTACHMENTS.Add(New cFakt_MailATTach(zielPfad, "")) + + End If + + End If + + Return + + End If + + '==================================================== + ' SAMMELRECHNUNG + '==================================================== + If SR_DT Is Nothing OrElse SR_DT.Rows.Count = 0 Then Return + + Dim mergeListSR As New List(Of String)(listPDFs) + + ' Zoll-Unterlagen + For Each row As DataRow In SR_DT.Rows + + Dim spedbuchTemp As New VERAG_PROG_ALLGEMEIN.cSpeditionsbuch(row("FilialenNr"), row("AbfertigungsNr"), row("SpeditionsbuchUnterNr")) + Dim filialenNr = If(IsDBNull(row("FilialenNr")), 0, CInt(row("FilialenNr"))) + Dim firmaId = If(IsDBNull(row("Firma_ID")), 0, CInt(row("Firma_ID"))) + + LoadZollAttachments(spedbuchTemp, filialenNr, firmaId, True, mergeListSR, ATTACHMENTS) + + Next + + ' Rechnungsanhänge + For Each row As DataRow In SR_DT.Rows + + Dim filialenNr = If(IsDBNull(row("FilialenNr")), 0, CInt(row("FilialenNr"))) + + Dim firmaId = If(IsDBNull(row("Firma_ID")), 0, CInt(row("Firma_ID"))) + + Dim anhaenge = VERAG_PROG_ALLGEMEIN.cRechnungsausgang.LOAD_ANHAENGE_LIST(row("RK_ID")) + + If anhaenge Is Nothing Then Continue For + + For Each anh In anhaenge + + HandlePdf(anh.dsId, anh.Bezeichnung, filialenNr, firmaId, True, mergeListSR, ATTACHMENTS) + + Next + + Next + + ' Zusammenfassung erzeugen + AddMergedPdf(mergeListSR, zielPfad_PDFZusammenfassung, ATTACHMENTS) + + End Sub + + Private Sub loadAndSetAnhaenge(SR_DT As DataTable, ATTACHMENTS As List(Of cFakt_MailATTach), listPDFs As List(Of String), Optional RECHNUNG As cRechnungsausgang = Nothing, Optional SPEDBUCH As cSpeditionsbuch = Nothing, Optional mergeAllPDFS As Boolean = False) + '---- Zusammenfassung der PDFs in 3 Schritten: + + '1--> Beleg + '2--> Anhänge der Rechnung + '3--> Zoll-Anhänge aus SPED-BUCH + Dim zielPfadZusammenfassung = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getTMPPath("Attachment.pdf", ".pdf",, False, "Zusammenfassung") Dim pdfAnhang_merge As Boolean = False '----------------------------------------------------------------- EINZELRECHNUNGEN------------------------------------------------ If RECHNUNG IsNot Nothing Then + '1--> Beleg For Each l In listPDFs ATTACHMENTS.Add(New cFakt_MailATTach(l, If(RECHNUNG.BelegartenKz = "AR", "Rechnung.pdf", "Gutschrift.pdf"))) Next + '2--> Anhänge der Rechnung Dim zsmf_ER As New List(Of String) RECHNUNG.LOAD_ANHAENGE() @@ -549,7 +655,7 @@ Public Class cAutomailversand Dim path = VERAG_PROG_ALLGEMEIN.cDATENSERVER.GET_PDFPath_BY_DocID(ANH.dsId) - pdfAnhang_merge = PDFS_zusammenfassen(path, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False) + pdfAnhang_merge = mergeSinglePDFDocuments(path, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False) If pdfAnhang_merge Then If path <> "" Then @@ -568,7 +674,7 @@ Public Class cAutomailversand Next - + '3--> Zoll-Anhänge aus SPED-BUCH If SPEDBUCH IsNot Nothing Then Dim ZOLL = IIf(SPEDBUCH.DokumentId_Mitteilung IsNot Nothing, "AT", "DE") @@ -577,7 +683,7 @@ Public Class cAutomailversand Case "DE" If SPEDBUCH.DokumentId_Steuerbeleg IsNot Nothing Then Dim path = VERAG_PROG_ALLGEMEIN.cDATENSERVER.GET_PDFPath_BY_DocID(SPEDBUCH.DokumentId_Steuerbeleg) - pdfAnhang_merge = PDFS_zusammenfassen(path, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False) + pdfAnhang_merge = mergeSinglePDFDocuments(path, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False) If pdfAnhang_merge Then zsmf_ER.Add(path) Else @@ -587,7 +693,7 @@ Public Class cAutomailversand End If If SPEDBUCH.DokumentId_VBD IsNot Nothing Then Dim path = VERAG_PROG_ALLGEMEIN.cDATENSERVER.GET_PDFPath_BY_DocID(SPEDBUCH.DokumentId_VBD) - pdfAnhang_merge = PDFS_zusammenfassen(path, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False) + pdfAnhang_merge = mergeSinglePDFDocuments(path, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False) If pdfAnhang_merge Then zsmf_ER.Add(path) Else @@ -601,11 +707,11 @@ Public Class cAutomailversand If SPEDBUCH.DokumentId_Steuerbeleg IsNot Nothing Then Dim path = VERAG_PROG_ALLGEMEIN.cDATENSERVER.GET_PDFPath_BY_DocID(SPEDBUCH.DokumentId_Steuerbeleg) - pdfAnhang_merge = PDFS_zusammenfassen(path, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False) + pdfAnhang_merge = mergeSinglePDFDocuments(path, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False) If pdfAnhang_merge Then zsmf_ER.Add(path) Else - ATTACHMENTS.Add(New cFakt_MailATTach(path, "Verzollungsnachweis.pdf")) + ATTACHMENTS.Add(New cFakt_MailATTach(path, "Verzollungsnachweis.pdf")) End If End If @@ -613,7 +719,7 @@ Public Class cAutomailversand Dim path = VERAG_PROG_ALLGEMEIN.cDATENSERVER.GET_PDFPath_BY_DocID(SPEDBUCH.DokumentId_Mitteilung) - pdfAnhang_merge = PDFS_zusammenfassen(path, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False) + pdfAnhang_merge = mergeSinglePDFDocuments(path, RECHNUNG.FilialenNr, RECHNUNG.Firma_ID, False) If pdfAnhang_merge Then zsmf_ER.Add(path) Else @@ -689,7 +795,7 @@ Public Class cAutomailversand Case "DE" If SPEDBUCH_TEMP.DokumentId_Steuerbeleg IsNot Nothing Then Dim path = VERAG_PROG_ALLGEMEIN.cDATENSERVER.GET_PDFPath_BY_DocID(SPEDBUCH_TEMP.DokumentId_Steuerbeleg) - pdfAnhang_merge = PDFS_zusammenfassen(path, FilialenNr, FIRMA_ID, False) + pdfAnhang_merge = mergeSinglePDFDocuments(path, FilialenNr, FIRMA_ID, False) If pdfAnhang_merge Then zsmf_SR.Add(path) Else @@ -699,7 +805,7 @@ Public Class cAutomailversand End If If SPEDBUCH_TEMP.DokumentId_VBD IsNot Nothing Then Dim path = VERAG_PROG_ALLGEMEIN.cDATENSERVER.GET_PDFPath_BY_DocID(SPEDBUCH_TEMP.DokumentId_VBD) - pdfAnhang_merge = PDFS_zusammenfassen(path, FilialenNr, FIRMA_ID, False) + pdfAnhang_merge = mergeSinglePDFDocuments(path, FilialenNr, FIRMA_ID, False) If pdfAnhang_merge Then zsmf_SR.Add(path) Else @@ -713,7 +819,7 @@ Public Class cAutomailversand If SPEDBUCH_TEMP.DokumentId_Steuerbeleg IsNot Nothing Then Dim path = VERAG_PROG_ALLGEMEIN.cDATENSERVER.GET_PDFPath_BY_DocID(SPEDBUCH_TEMP.DokumentId_Steuerbeleg) - pdfAnhang_merge = PDFS_zusammenfassen(path, FilialenNr, FIRMA_ID, False) + pdfAnhang_merge = mergeSinglePDFDocuments(path, FilialenNr, FIRMA_ID, False) If pdfAnhang_merge Then zsmf_SR.Add(path) Else @@ -725,7 +831,7 @@ Public Class cAutomailversand Dim path = VERAG_PROG_ALLGEMEIN.cDATENSERVER.GET_PDFPath_BY_DocID(SPEDBUCH_TEMP.DokumentId_Mitteilung) - pdfAnhang_merge = PDFS_zusammenfassen(path, FilialenNr, FIRMA_ID, False) + pdfAnhang_merge = mergeSinglePDFDocuments(path, FilialenNr, FIRMA_ID, False) If pdfAnhang_merge Then zsmf_SR.Add(path) Else @@ -755,7 +861,7 @@ Public Class cAutomailversand Dim path = VERAG_PROG_ALLGEMEIN.cDATENSERVER.GET_PDFPath_BY_DocID(ANH.dsId) 'hier die LOGIK, was alles zusammengefasst werden soll! - pdfAnhang_merge = PDFS_zusammenfassen(path, FilialenNr, FIRMA_ID, True) + pdfAnhang_merge = mergeSinglePDFDocuments(path, FilialenNr, FIRMA_ID, True) If pdfAnhang_merge Then If path <> "" Then @@ -826,10 +932,20 @@ Public Class cAutomailversand End Sub - Private Function PDFS_zusammenfassen(path As String, Filiale As Integer, Firma As Integer, isSR As Boolean) + Private Function mergeSinglePDFDocuments(path As String, Filiale As Integer, Firma As Integer, isSR As Boolean) + + + Dim zusammenfassen As Boolean = False + 'True + ' → mergeList + ' → später zu einer PDF zusammenführen + + 'False + ' → sofort als separates Mail-Attachment + Select Case Firma Case 19 If Filiale = 4817 Then @@ -848,7 +964,7 @@ Public Class cAutomailversand Else 'mit Marlene sprechen! - If Not (path.ToString.ToLower.Contains("flyercbam")) Then + If Not (path.ToString.ToLower.Contains("flyercbam") OrElse Not (path.ToString.ToLower.Contains("sammelrechnung"))) Then Return True End If End If @@ -887,6 +1003,95 @@ Public Class cAutomailversand End Function + Private Sub AddToMergeList(list As List(Of String), path As String) + + If String.IsNullOrWhiteSpace(path) Then Return + + If Not list.Any(Function(p) System.IO.Path.GetFileName(p).Equals(System.IO.Path.GetFileName(path), StringComparison.OrdinalIgnoreCase)) Then + + list.Add(path) + + End If + + End Sub + + Private Sub AddAttachmentIfNotExists(attachments As List(Of cFakt_MailATTach), path As String, bezeichnung As String) + + If String.IsNullOrWhiteSpace(path) Then Return + + Dim fileName = System.IO.Path.GetFileName(path) + + If Not attachments.Any(Function(a) System.IO.Path.GetFileName(a.Pfad).Equals(fileName, StringComparison.OrdinalIgnoreCase)) Then + + attachments.Add(New cFakt_MailATTach(path, bezeichnung)) + + End If + + End Sub + + Private Sub HandlePdf(docId As Object, displayName As String, filiale As Integer, firma As Integer, isSR As Boolean, mergeList As List(Of String), attachments As List(Of cFakt_MailATTach)) + + If docId Is Nothing Then Return + + Dim path = VERAG_PROG_ALLGEMEIN.cDATENSERVER.GET_PDFPath_BY_DocID(docId) + + If mergeSinglePDFDocuments(path, filiale, firma, isSR) Then + AddToMergeList(mergeList, path) + Else + AddAttachmentIfNotExists(attachments, path, displayName) + End If + + End Sub + + Private Sub LoadZollAttachments(spedbuch As cSpeditionsbuch, filiale As Integer, firma As Integer, isSR As Boolean, mergeList As List(Of String), attachments As List(Of cFakt_MailATTach), Optional FiskalMail As Boolean = False) + + If spedbuch Is Nothing Then Return + + Dim isAT = spedbuch.DokumentId_Mitteilung IsNot Nothing + + If FiskalMail Then + attachments.Clear() 'liste leeren + End If + + If isAT Then + HandlePdf(spedbuch.DokumentId_Steuerbeleg, "Verzollungsnachweis.pdf", filiale, firma, isSR, mergeList, attachments) + + HandlePdf(spedbuch.DokumentId_Mitteilung, "Versandschein.pdf", filiale, firma, isSR, mergeList, attachments) + + Else + + HandlePdf(spedbuch.DokumentId_Steuerbeleg, "Steuerbescheid.pdf", filiale, firma, isSR, mergeList, attachments) + + If Not FiskalMail Then 'bei FIskal-Mail nicht mitschicken + HandlePdf(spedbuch.DokumentId_VBD, "Abgabenbescheid.pdf", filiale, firma, isSR, mergeList, attachments) + End If + + + End If + + End Sub + + Private Sub AddMergedPdf(mergeList As List(Of String), zielPfad As String, attachments As List(Of cFakt_MailATTach)) + + If Not mergeList.Any Then Return + + If mergeList.Count = 1 Then + + Dim fi As New FileInfo(mergeList(0)) + attachments.Add(New cFakt_MailATTach(mergeList(0), fi.Name)) + + Return + End If + + If FormularManagerNEU.MergePdfFiles(mergeList, zielPfad) Then + + Dim fi As New FileInfo(zielPfad) + attachments.Add(New cFakt_MailATTach(zielPfad, fi.Name)) + + End If + + End Sub + Private Function setLog(SR_DT As DataTable, row As DataRow, FirmaID As Integer, Sammelrechnungsart As Integer, Rechnungsdatum As Date, Optional ATTACHMENTS As List(Of cFakt_MailATTach) = Nothing, Optional Mailsubject As String = "", Optional Mailhtml As String = "", Optional MailTo As String = "", Optional MailtoCC As String = "", Optional MailtoBCC As String = "", Optional Mail As Microsoft.Office.Interop.Outlook.MailItem = Nothing, Optional RECHNUNG As cRechnungsausgang = Nothing, Optional FISKAL As cFiskal_Daten = Nothing, Optional SPEDBUCH As cSpeditionsbuch = Nothing) As Boolean @@ -1246,11 +1451,11 @@ Public Class cAutomailversand End If Dim AD As New cAdressen(kundenNr) - Dim KD As New cKunde(kundenNr) - Dim Sprache As String = "EN" - Dim attachList As New List(Of String) + Dim KD As New cKunde(kundenNr) + Dim Sprache As String = "EN" + Dim attachList As New List(Of String) - Subject = "Meldung innergemeinschaftlicher Erwerb - " & AD.Ordnungsbegriff + Subject = "Meldung innergemeinschaftlicher Erwerb - " & AD.Ordnungsbegriff Select Case RechnungsLandKz Case "A", "AT", "D", "DE", "CH" : Sprache = "DE" @@ -1303,54 +1508,62 @@ Public Class cAutomailversand - If showMail Then + If showMail Then - Dim outl As New Outlook.Application - Dim Mail_StbFA As Microsoft.Office.Interop.Outlook.MailItem - Mail_StbFA = outl.CreateItem(0) - Mail_StbFA.Subject = Subject + Dim outl As New Outlook.Application + Dim Mail_StbFA As Microsoft.Office.Interop.Outlook.MailItem + Mail_StbFA = outl.CreateItem(0) + Mail_StbFA.Subject = Subject - If FirmaID = 24 Then Mail_StbFA.SentOnBehalfOfName = SDL.cFakturierung.getDefaultMail("AMBAR",, True) + If FirmaID = 24 Then Mail_StbFA.SentOnBehalfOfName = SDL.cFakturierung.getDefaultMail("AMBAR",, True) - TextHTML &= cFakturierung.getSignature(AD.LandKz, FirmaID,,,, "") - TextHTML &= "" + TextHTML &= cFakturierung.getSignature(AD.LandKz, FirmaID,,,, "") + TextHTML &= "" - Mail_StbFA.HTMLBody = TextHTML + Mail_StbFA.HTMLBody = TextHTML - Mail_StbFA.To = MailTo - Mail_StbFA.CC = MailCC + Mail_StbFA.To = MailTo + Mail_StbFA.CC = MailCC - ''----------------------------------------------------------------- - ''Steuerbescheid anfügen - ''----------------------------------------------------------------- - 'getAnhaenge(False) + ''----------------------------------------------------------------- + ''Steuerbescheid anfügen + ''----------------------------------------------------------------- + 'getAnhaenge(False) - ''Anhang an Mail anfügen - ''----------------------------------------------------------------- - 'addAttachments(Mail_StbFA, RechnungsNr, cbxMergePDF.Checked) - ''----------------------------------------------------------------- + ''Anhang an Mail anfügen + ''----------------------------------------------------------------- + 'addAttachments(Mail_StbFA, RechnungsNr, cbxMergePDF.Checked) + ''----------------------------------------------------------------- + + LoadZollAttachments(SPEDBUCH, SPEDBUCH.FilialenNr, FirmaID, False, attachList, Nothing, True) + + For Each att In attachList + Mail_StbFA.Attachments.Add(att, Microsoft.Office.Interop.Outlook.OlAttachmentType.olByValue) + Next + + Mail_StbFA.Display() + + Else + + LoadZollAttachments(SPEDBUCH, SPEDBUCH.FilialenNr, FirmaID, False, attachList, Nothing, True) + + Dim accountToSend = setAccountToSend(FirmaID) + VERAG_PROG_ALLGEMEIN.cProgramFunctions.sendMail(MailTo, Subject, TextHTML, accountToSend, False, False, MailCC, accountToSend, attachList,, IIf(VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM, "d.breimaier@verag.ag", accountToSend)) + + ''----------------------------------------------------------------- + ''Steuerbescheid anfügen + ''----------------------------------------------------------------- + 'getAnhaenge(False) + + ''Anhang an Mail anfügen + ''----------------------------------------------------------------- + 'addAttachments(Mail_StbFA, RechnungsNr, cbxMergePDF.Checked) + ''----------------------------------------------------------------- - Mail_StbFA.Display() - - Else - Dim accountToSend = setAccountToSend(FirmaID) - VERAG_PROG_ALLGEMEIN.cProgramFunctions.sendMail(MailTo, Subject, TextHTML, accountToSend, False, False, MailCC, accountToSend, attachList,, IIf(VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM, "d.breimaier@verag.ag", accountToSend)) - - ''----------------------------------------------------------------- - ''Steuerbescheid anfügen - ''----------------------------------------------------------------- - 'getAnhaenge(False) - - ''Anhang an Mail anfügen - ''----------------------------------------------------------------- - 'addAttachments(Mail_StbFA, RechnungsNr, cbxMergePDF.Checked) - ''----------------------------------------------------------------- - - - End If + End If diff --git a/SDL/SDL.vbproj b/SDL/SDL.vbproj index facb9532..44032f34 100644 --- a/SDL/SDL.vbproj +++ b/SDL/SDL.vbproj @@ -796,6 +796,7 @@ + diff --git a/SDL/USTV/usrCntlUSTV.Designer.vb b/SDL/USTV/usrCntlUSTV.Designer.vb index d623e959..9b96f204 100644 --- a/SDL/USTV/usrCntlUSTV.Designer.vb +++ b/SDL/USTV/usrCntlUSTV.Designer.vb @@ -23,12 +23,13 @@ Partial Class usrCntlUSTV Private Sub InitializeComponent() Me.components = New System.ComponentModel.Container() - Dim DataGridViewCellStyle3 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle() + Dim DataGridViewCellStyle2 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(usrCntlUSTV)) Me.pnlFilter = New System.Windows.Forms.Panel() Me.dgvUSTV = New VERAG_PROG_ALLGEMEIN.MyDatagridview(Me.components) Me.Label1 = New System.Windows.Forms.Label() Me.Panel1 = New System.Windows.Forms.Panel() + Me.btnoffeneAntraege = New System.Windows.Forms.Button() Me.txtSucheID = New System.Windows.Forms.TextBox() Me.MyComboBox1 = New VERAG_PROG_ALLGEMEIN.MyComboBox() Me.Label12 = New System.Windows.Forms.Label() @@ -84,7 +85,7 @@ Partial Class usrCntlUSTV Me.ContextMenuStrip2 = New System.Windows.Forms.ContextMenuStrip(Me.components) Me.ContextMenuStrip3 = New System.Windows.Forms.ContextMenuStrip(Me.components) Me.ContextMenuStrip4 = New System.Windows.Forms.ContextMenuStrip(Me.components) - Me.btnoffeneAntraege = New System.Windows.Forms.Button() + Me.btn_Zahlungen_importieren = New System.Windows.Forms.Button() CType(Me.dgvUSTV, System.ComponentModel.ISupportInitialize).BeginInit() Me.Panel1.SuspendLayout() Me.Panel2.SuspendLayout() @@ -106,8 +107,8 @@ Partial Class usrCntlUSTV Me.dgvUSTV.AKTUALISIERUNGS_INTERVALL = -1 Me.dgvUSTV.AllowUserToAddRows = False Me.dgvUSTV.AllowUserToDeleteRows = False - DataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(CType(CType(240, Byte), Integer), CType(CType(245, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.dgvUSTV.AlternatingRowsDefaultCellStyle = DataGridViewCellStyle3 + DataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(CType(CType(240, Byte), Integer), CType(CType(245, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.dgvUSTV.AlternatingRowsDefaultCellStyle = DataGridViewCellStyle2 Me.dgvUSTV.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize Me.dgvUSTV.Dock = System.Windows.Forms.DockStyle.Fill Me.dgvUSTV.Location = New System.Drawing.Point(0, 108) @@ -178,6 +179,18 @@ Partial Class usrCntlUSTV Me.Panel1.Size = New System.Drawing.Size(1737, 108) Me.Panel1.TabIndex = 0 ' + 'btnoffeneAntraege + ' + Me.btnoffeneAntraege.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.btnoffeneAntraege.ForeColor = System.Drawing.Color.Black + Me.btnoffeneAntraege.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft + Me.btnoffeneAntraege.Location = New System.Drawing.Point(806, 24) + Me.btnoffeneAntraege.Name = "btnoffeneAntraege" + Me.btnoffeneAntraege.Size = New System.Drawing.Size(83, 40) + Me.btnoffeneAntraege.TabIndex = 79 + Me.btnoffeneAntraege.Text = "offene Anträge" + Me.btnoffeneAntraege.UseVisualStyleBackColor = True + ' 'txtSucheID ' Me.txtSucheID.Location = New System.Drawing.Point(554, 36) @@ -780,6 +793,7 @@ Partial Class usrCntlUSTV 'Panel3 ' Me.Panel3.AutoSize = True + Me.Panel3.Controls.Add(Me.btn_Zahlungen_importieren) Me.Panel3.Controls.Add(Me.btn3470) Me.Panel3.Controls.Add(Me.Button4) Me.Panel3.Controls.Add(Me.btnVZ) @@ -940,17 +954,20 @@ Partial Class usrCntlUSTV Me.ContextMenuStrip4.Name = "ContextMenuStrip1" Me.ContextMenuStrip4.Size = New System.Drawing.Size(61, 4) ' - 'btnoffeneAntraege + 'btn_Zahlungen_importieren ' - Me.btnoffeneAntraege.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnoffeneAntraege.ForeColor = System.Drawing.Color.Black - Me.btnoffeneAntraege.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft - Me.btnoffeneAntraege.Location = New System.Drawing.Point(806, 24) - Me.btnoffeneAntraege.Name = "btnoffeneAntraege" - Me.btnoffeneAntraege.Size = New System.Drawing.Size(83, 40) - Me.btnoffeneAntraege.TabIndex = 79 - Me.btnoffeneAntraege.Text = "offene Anträge" - Me.btnoffeneAntraege.UseVisualStyleBackColor = True + Me.btn_Zahlungen_importieren.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.btn_Zahlungen_importieren.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.0!) + Me.btn_Zahlungen_importieren.ForeColor = System.Drawing.Color.Black + Me.btn_Zahlungen_importieren.Image = Global.SDL.My.Resources.Resources.Excel_logo + Me.btn_Zahlungen_importieren.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft + Me.btn_Zahlungen_importieren.Location = New System.Drawing.Point(665, 6) + Me.btn_Zahlungen_importieren.Name = "btn_Zahlungen_importieren" + Me.btn_Zahlungen_importieren.Size = New System.Drawing.Size(132, 40) + Me.btn_Zahlungen_importieren.TabIndex = 31 + Me.btn_Zahlungen_importieren.Text = "Erstattungspos. importieren" + Me.btn_Zahlungen_importieren.TextAlign = System.Drawing.ContentAlignment.MiddleRight + Me.btn_Zahlungen_importieren.UseVisualStyleBackColor = True ' 'usrCntlUSTV ' @@ -1030,4 +1047,5 @@ Partial Class usrCntlUSTV Friend WithEvents btn3470 As Button Friend WithEvents ContextMenuStrip4 As ContextMenuStrip Friend WithEvents btnoffeneAntraege As Button + Friend WithEvents btn_Zahlungen_importieren As Button End Class diff --git a/SDL/USTV/usrCntlUSTV.vb b/SDL/USTV/usrCntlUSTV.vb index 558945ef..d0c00a26 100644 --- a/SDL/USTV/usrCntlUSTV.vb +++ b/SDL/USTV/usrCntlUSTV.vb @@ -1,4 +1,7 @@ Imports System.ComponentModel +Imports System.Linq.Expressions +Imports System.Text +Imports GrapeCity.DataVisualization.TypeScript Imports Microsoft.Office.Interop Imports VERAG_PROG_ALLGEMEIN @@ -729,10 +732,10 @@ Public Class usrCntlUSTV MsgBox("Funktion nicht implementiert!") - End If - End If + End If + End Sub @@ -1745,4 +1748,273 @@ Public Class usrCntlUSTV cbxDifferenzbetrag.CheckState = CheckState.Checked init(,,, True) End Sub + + Private Sub btn_Zahlungen_importieren_Click(sender As Object, e As EventArgs) Handles btn_Zahlungen_importieren.Click + Dim sql As New VERAG_PROG_ALLGEMEIN.SQL + + Try + + Dim fd As New OpenFileDialog + fd.InitialDirectory = "\\share01.verag.ost.dmn\F\19 VERAG 360 - MDM\MWST Eingänge\" + fd.Filter = "Excel Dateien (*.xlsx)|*.xlsx" + + If fd.ShowDialog() <> DialogResult.OK Then Exit Sub + + If Not fd.FileName.ToUpper().EndsWith(".XLSX") Then + MessageBox.Show("Bitte eine XLSX-Datei auswählen.") + Exit Sub + End If + + Dim exclApp As Object = Nothing + Dim Datei As Object = Nothing + Dim Blatt As Object = Nothing + + Dim dt As New DataTable + + If dt IsNot Nothing And Not dt.Columns.Contains("name") Then + + dt.Columns.Add("AntragID", GetType(String)) + dt.Columns.Add("Steuerbetrag", GetType(Double)) + dt.Columns.Add("Bank", GetType(String)) + dt.Columns.Add("BelegNr", GetType(String)) + dt.Columns.Add("GS", GetType(String)) + dt.Columns.Add("RZVZ", GetType(String)) + dt.Columns.Add("Info", GetType(String)) + dt.Columns.Add("3470", GetType(String)) + + End If + + + Try + + exclApp = CreateObject("Excel.Application") + exclApp.DisplayAlerts = False + exclApp.CutCopyMode = False + + Datei = exclApp.Workbooks.Open(fd.FileName) + Blatt = Datei.Worksheets(1) + + ' Header einlesen + Dim headerMap As New Dictionary(Of String, Integer)(StringComparer.OrdinalIgnoreCase) + + For col As Integer = 1 To Blatt.UsedRange.Columns.Count + + Dim header As String = Convert.ToString(Blatt.Cells(3, col).Value).Trim() + + If header <> "" AndAlso Not headerMap.ContainsKey(header) Then + headerMap.Add(header, col) + End If + + Next + + ' Pflichtspalten prüfen + Dim requiredHeaders As String() = { + "ID", + "Steuerbetrag", + "BANK", + "BelNr", + "GS", + "RZVZ", + "3470", + "INFO" + } + + For Each h As String In requiredHeaders + + If Not headerMap.ContainsKey(h) Then + MsgBox("Pflichtspalte nicht gefunden: " & h) + Exit Sub + End If + + Next + + Dim letzteZeile As Integer = Blatt.UsedRange.Rows.Count + + For row As Integer = 4 To letzteZeile + + Dim USTAV_ID As String = + getTrimedString(Convert.ToString(Blatt.Cells(row, headerMap("ID")).Value), 6) + + Dim Zahlungsbetrag As String = + Convert.ToString(Blatt.Cells(row, headerMap("Steuerbetrag")).Value) + + Dim Kuerzel As String = + getTrimedString(Convert.ToString(Blatt.Cells(row, headerMap("Spalte1")).Value), 6) + + Dim Bank As String = + Convert.ToString(Blatt.Cells(row, headerMap("BANK")).Value) + + Dim GS As String = + Convert.ToString(Blatt.Cells(row, headerMap("GS")).Value) + + Dim RZVZ As String = + Convert.ToString(Blatt.Cells(row, headerMap("RZVZ")).Value) + + Dim INFO As String = + Convert.ToString(Blatt.Cells(row, headerMap("INFO")).Value) + + Dim _3470 As String = + Convert.ToString(Blatt.Cells(row, headerMap("3470")).Value) + + If String.IsNullOrWhiteSpace(USTAV_ID) Then + Continue For + End If + + If IsNumeric(USTAV_ID) AndAlso Bank <> "" AndAlso IsNumeric(Bank) AndAlso GS <> "" Then + + + Dim R As DataRow = dt.NewRow + R("AntragID") = USTAV_ID + R("Steuerbetrag") = Zahlungsbetrag + R("Bank") = Bank + R("BelegNr") = Kuerzel + R("GS") = GS + R("RZVZ") = RZVZ + R("Info") = INFO + + dt.Rows.Add(R) + End If + + + Next + + If dt.Rows.Count > 0 Then + + If vbYes = MsgBox("Es wurden " & dt.Rows.Count & " Datensätze erkannt. " & vbNewLine & "Sollen diese eingearbeitet werden?", vbYesNoCancel) Then + + For Each r As DataRow In dt.Rows + + Dim USTV_ANTRAG = New VERAG_PROG_ALLGEMEIN.cUSTVAntrag(r.Item("AntragID")) + + If USTV_ANTRAG.hasEntry Then + + Select Case r.Item("3470").ToString.ToLower + Case "ja" + If Not USTV_ANTRAG.UStVAn_3470 Then + USTV_ANTRAG.UStVAn_3470 = True + USTV_ANTRAG.SAVE() + End If + + 'Case "nein" + ' If USTV_ANTRAG.UStVAn_3470 Then + ' USTV_ANTRAG.UStVAn_3470 = False + ' USTV_ANTRAG.SAVE() + ' End If + + End Select + + + + Dim UStV_ERS = New VERAG_PROG_ALLGEMEIN.cUStVErstattungPositionen() + UStV_ERS.UStVEr_ID = USTV_ANTRAG.getMaxPosNrErst() + UStV_ERS.UStVEr_interneNr = USTV_ANTRAG.getMaxinternePosNrErst() + + End If + + Next + + Else + Exit Sub + + End If + End If + + + Finally + + If Datei IsNot Nothing Then + Datei.Close(False) + End If + + If exclApp IsNot Nothing Then + exclApp.Quit() + End If + + If Blatt IsNot Nothing Then + Runtime.InteropServices.Marshal.ReleaseComObject(Blatt) + End If + + If Datei IsNot Nothing Then + Runtime.InteropServices.Marshal.ReleaseComObject(Datei) + End If + + If exclApp IsNot Nothing Then + Runtime.InteropServices.Marshal.ReleaseComObject(exclApp) + End If + + Blatt = Nothing + Datei = Nothing + exclApp = Nothing + + GC.Collect() + GC.WaitForPendingFinalizers() + + End Try + + Catch ex As Exception + + MessageBox.Show(ex.Message & Environment.NewLine & ex.StackTrace) + + End Try + + Me.Refresh() + + + + End Sub + + Function getTrimedString(s As String, l As Integer) As String + Try + If s Is Nothing Then Return "" + If s.ToString.Length > l Then + Return s.Substring(0, l) + End If + Return s.ToString + + Catch ex As Exception + MsgBox("getTrimedString: " & ex.Message & ex.StackTrace) + End Try + Return "" + End Function + Function getTrimedStringACCES(s As Object, l As Integer) As String + + Try + If s Is Nothing Then Return "" + If s Is DBNull.Value Then Return "" + If s.ToString.Length > l Then + Return s.Substring(0, l) + End If + Return s + + Catch ex As Exception + MsgBox("getTrimedString: " & ex.Message & ex.StackTrace) + End Try + Return "" + End Function + Function getTrimedStringACCESEUR(s As Object, l As Integer) As String + + Try + If s Is Nothing Then Return "" + If s Is DBNull.Value Then Return "" + If s.ToString.Length > l Then + Return s.Substring(0, l) + End If + + If IsNumeric(s) Then + Return CDbl(s).ToString("C2") + End If + + Return s + + Catch ex As Exception + MsgBox("getTrimedString: " & ex.Message & ex.StackTrace) + End Try + Return "" + End Function + + Function isleernothing(s) As Object + If s Is DBNull.Value Then Return Nothing + If s.ToString.Trim = "" Then Return Nothing + Return s.trim + End Function End Class diff --git a/SDL/buchhaltung/frmBU_Mahnlauf.vb b/SDL/buchhaltung/frmBU_Mahnlauf.vb index 558247f5..d430cb13 100644 --- a/SDL/buchhaltung/frmBU_Mahnlauf.vb +++ b/SDL/buchhaltung/frmBU_Mahnlauf.vb @@ -1708,7 +1708,7 @@ Public Class frmBU_Mahnlauf 'noch keine Unterscheidung der Abteilungen bei MDM, daher hardcodiert. Dim MautVertrMail = "z.batinic@verag.ag;alex@verag.ag;maut.ro@verag.ag;ma@verag.ag;n.ljubas@verag.ag;s.vidovic@verag.ag;" - Dim MautFaktMail = "s.kriegner@verag.ag;" + Dim MautFaktMail = "s.kriegner@verag.ag;mmdabrechnung@verag.ag;" Select Case cbxKontotyp._value Case "A" : Mail.To = MautVertrMail & MautFaktMail diff --git a/SDL/kassenbuch/frmBelegNeu.Designer.vb b/SDL/kassenbuch/frmBelegNeu.Designer.vb index 5a6be92f..22caeabb 100644 --- a/SDL/kassenbuch/frmBelegNeu.Designer.vb +++ b/SDL/kassenbuch/frmBelegNeu.Designer.vb @@ -1782,7 +1782,7 @@ Partial Class frmBelegNeu 'cm_FT ' Me.cm_FT.Name = "ContextMenuStrip1" - Me.cm_FT.Size = New System.Drawing.Size(61, 4) + Me.cm_FT.Size = New System.Drawing.Size(181, 26) ' 'frmBelegNeu ' diff --git a/SDL/kassenbuch/frmBelegNeu.vb b/SDL/kassenbuch/frmBelegNeu.vb index 6b7ab546..9b8e1989 100644 --- a/SDL/kassenbuch/frmBelegNeu.vb +++ b/SDL/kassenbuch/frmBelegNeu.vb @@ -1705,8 +1705,8 @@ Public Class frmBelegNeu Dim verarbeitet As Boolean = False If KASSE.rksv_FT_RestServiceURL <> "" Then Dim result = cRKSV.insertRKSVFiskaltrustAsync(KASSE, KASSE.rksv_CompanyGUID, KASSE.rksv_Umsatzzaehler, BELEG.BelegDat, BELEG.Steuerschlüssel, RKSV_Beleg_Id, If(EA = "E", summeBRUTTO, summeBRUTTO * -1), TESTBUCHUNG, BELEG.POS, QR_CodeString, LastJWS) - result.Wait() - verarbeitet = result.Result + 'result.Wait() + verarbeitet = result Else verarbeitet = cRKSV.insertRKSV(KASSE, KASSE.rksv_CompanyGUID, KASSE.rksv_Umsatzzaehler, BELEG.BelegDat, BELEG.Steuerschlüssel, RKSV_Beleg_Id, If(EA = "E", summeBRUTTO, summeBRUTTO * -1), QR_CodeString, LastJWS, TESTBUCHUNG, answer) 'Digitale Signierung und Erfassung in die RKSV-Datenbank mittels ITG-Service End If @@ -1962,16 +1962,21 @@ Public Class frmBelegNeu KASSE.LOAD(cboKassen._value) Dim client As New cFiskaltrustClient(KASSE.rksv_FT_RestServiceURL, KASSE.rksv_FT_CashboxID, KASSE.rksv_FT_AccessToken, KASSE.rksv_FT_Country) + Dim client_chilkat As New cFiskaltrustClient_chilkat(KASSE.rksv_FT_RestServiceURL, KASSE.rksv_FT_CashboxID, KASSE.rksv_FT_AccessToken, KASSE.rksv_FT_Country) If item.Name = "null" Then 'beide - Dim result As String = Await client.SignNullReceiptAsync(KASSE.rksv_id) + 'Dim result As String = Await client.SignNullReceiptAsync(KASSE.rksv_id) + + Dim result As String = client_chilkat.SignNullReceipt(KASSE.rksv_id) + MsgBox(result) ElseIf item.Name = "test" Then 'beide - Dim result As String = Await client.Echo(KASSE.rksv_bez & " " & KASSE.rksv_FT_Country & " - ") + 'Dim result As String = Await client.Echo(KASSE.rksv_bez & " " & KASSE.rksv_FT_Country & " - ") + Dim result As String = client_chilkat.Echo(KASSE.rksv_bez & " " & KASSE.rksv_FT_Country & " - ") MsgBox(result) @@ -1982,10 +1987,12 @@ Public Class frmBelegNeu ElseIf item.Name = "bar" Then 'beide - Dim result As String = Await client.SignReceiptAsync_test(KASSE.rksv_id) + 'Dim result As String = Await client.SignReceiptAsync_test(KASSE.rksv_id) + Dim result As String = client_chilkat.SignReceipt_test(KASSE.rksv_id) If result <> "" Then - If vbYes = MsgBox("Testdaten in DB speichern?", vbYesNoCancel) Then + + If vbYes = MsgBox(result & vbNewLine & vbNewLine & "Testdaten in DB speichern?", vbYesNoCancel) Then Dim QR_CodeString As String = "" client.saveRKSV_FT(result, QR_CodeString) End If @@ -1997,13 +2004,15 @@ Public Class frmBelegNeu ElseIf item.Name = "monthly" Then 'beide - Dim result As String = Await client.SignClosinglReceiptAsync(item.Name, KASSE.rksv_id) + 'Dim result As String = Await client.SignClosinglReceiptAsync(item.Name, KASSE.rksv_id) + Dim result As String = client_chilkat.SignClosingReceipt(item.Name, KASSE.rksv_id) MsgBox(result) ElseIf item.Name = "daily" Then 'Nur DE If KASSE.rksv_FT_Country = "DE" Then - Dim result As String = Await client.SignClosinglReceiptAsync(item.Name, KASSE.rksv_id) + 'Dim result As String = Await client.SignClosinglReceiptAsync(item.Name, KASSE.rksv_id) + Dim result As String = client_chilkat.SignClosingReceipt(item.Name, KASSE.rksv_id) MsgBox(result) Else MsgBox("nicht für AT-Kassen möglich!") @@ -2012,12 +2021,14 @@ Public Class frmBelegNeu ElseIf item.Name = "yearly" Then - Dim result As String = Await client.SignClosinglReceiptAsync(item.Name, KASSE.rksv_id) + ' Dim result As String = Await client.SignClosinglReceiptAsync(item.Name, KASSE.rksv_id) + Dim result As String = client_chilkat.SignClosingReceipt(item.Name, KASSE.rksv_id) MsgBox(result) ElseIf item.Name = "journal" Then - Dim result As String = Await client.Journal(2) + 'Dim result As String = Await client.Journal(2) + Dim result As String = client_chilkat.Journal(2) MsgBox(result) @@ -2030,6 +2041,8 @@ Public Class frmBelegNeu End Function + + End Class Class TestRKSVW diff --git a/SDL/mdm/frmMDMDatenverarbetiung.vb b/SDL/mdm/frmMDMDatenverarbetiung.vb index 4a72cf34..9d3f34c6 100644 --- a/SDL/mdm/frmMDMDatenverarbetiung.vb +++ b/SDL/mdm/frmMDMDatenverarbetiung.vb @@ -4916,7 +4916,7 @@ LEFT JOIN VERAG.dbo.tbl_IDS_Länder land End Sub Sub setBillingDateCompleted(Lieferant_ As String, date_ As Date) - SQL.doSQL("UPDATE tblMDMEinarbeitung SET cast(billingdate as Date)='" & date_.ToShortDateString & "' WHERE supplier = " & Lieferant_ & " AND billingdate is null ", "FMZOLL") + SQL.doSQL("UPDATE tblMDMEinarbeitung SET billingdate ='" & date_.ToShortDateString & "' WHERE supplier = '" & Lieferant_ & "' AND billingdate is null ", "FMZOLL") End Sub