From 1de5f5b8b567b0d63cd7ea5b4287235d16f59e7a Mon Sep 17 00:00:00 2001 From: "d.breimaier" Date: Fri, 29 Aug 2025 16:42:15 +0200 Subject: [PATCH] creditsafeAPI Monitoring, Kundenuebersicht, Zugferd, etc. --- SDL/Fakturierung/cFakturierung.vb | 14 +++-- .../usrCntlKundenuebersicht.Designer.vb | 19 +++++- SDL/kunden/usrCntlKundenuebersicht.vb | 57 +++++++++++++++-- .../Creditsafe/cCreditSafeAPI.vb | 63 ++++++++++++++++++- 4 files changed, 139 insertions(+), 14 deletions(-) diff --git a/SDL/Fakturierung/cFakturierung.vb b/SDL/Fakturierung/cFakturierung.vb index 7789cf45..0542f22f 100644 --- a/SDL/Fakturierung/cFakturierung.vb +++ b/SDL/Fakturierung/cFakturierung.vb @@ -2163,14 +2163,16 @@ Public Class cFakturierung 'Summe aller Rechnungspositions-Nettobeträge der Rechnung Dim lineTotalAmont = sumNetto 'Der Gesamtbetrag der Umsatzsteuer für die Rechnung, - 'IIf(RECHNUNG.SteuerpflichtigerGesamtbetrag <> 0, Math.Round(Convert.ToDecimal(RECHNUNG.SteuerpflichtigerGesamtbetrag) / (100 + steuerProzenFaktor) * steuerProzenFaktor, 2), 0) - Dim taxTotalAmount = IIf(RECHNUNG.SteuerpflichtigerGesamtbetrag <> 0, Math.Round(Convert.ToDecimal(RECHNUNG.SteuerpflichtigerGesamtbetrag) / (100) * steuerProzenFaktor, 2), 0) + 'IIf(RECHNUNG.SteuerpflichtigerGesamtbetrag <> 0, Math.Round(Convert.ToDecimal(RECHNUNG.SteuerpflichtigerGesamtbetrag) / (100 + steuerProzenFaktor) * steuerProzenFaktor, 2), 0) ?????????????????? + Dim taxTotalAmount = IIf(RECHNUNG.SteuerpflichtigerGesamtbetrag <> 0, Math.Round(Convert.ToDecimal(RECHNUNG.SteuerpflichtigerGesamtbetrag) / (100 + steuerProzenFaktor) * steuerProzenFaktor, 2), 0) ' Die Gesamtsumme der Rechnung ohne Umsatzsteuer ' RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag + 0 - 0 - Dim taxBasisAmount = Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag + 0 - 0) + Dim taxBasisAmount = Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag + 0 - 0 - taxTotalAmount) 'Der Gesamtbetrag der Rechnung mit Umsatzsteuer - Dim grandTotalAmount = Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag + taxTotalAmount) + 'Dim grandTotalAmount = Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag + taxTotalAmount) + Dim grandTotalAmount = Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag) 'Der ausstehende Betrag, um dessen Zahlung gebeten wird. Dieser Betrag ist der Rechnungsgesamtbetrag einschließlich Umsatzsteuer abzüglich des im Voraus gezahlten Betrages.Im Falle einer vollständig beglichenen Rechnung ist dieser Betrag gleich null. Der Betrag kann negativ sein; In diesem Fall schuldet der Verkäufer dem Käufer den Betrag - Dim duePayableAmount = Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag + taxTotalAmount) + 'Dim duePayableAmount = Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag + taxTotalAmount) + Dim duePayableAmount = Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag) desc.SetTotals( lineTotalAmount:=Convert.ToDecimal(lineTotalAmont), @@ -2468,9 +2470,11 @@ Public Class cFakturierung Dim taxBasisAmount = Convert.ToDecimal(Gesamt_RG_BetragSteuerfrei + Gesamt_RG_BetragSteuerpflichtig + 0 - 0) 'Der Gesamtbetrag der Rechnung mit Umsatzsteuer Dim grandTotalAmount = Convert.ToDecimal(Gesamt_RG_BetragSteuerfrei + Gesamt_RG_BetragSteuerpflichtig + taxTotalAmount) + 'Der ausstehende Betrag, um dessen Zahlung gebeten wird. Dieser Betrag ist der Rechnungsgesamtbetrag einschließlich Umsatzsteuer abzüglich des im Voraus gezahlten Betrages.Im Falle einer vollständig beglichenen Rechnung ist dieser Betrag gleich null. Der Betrag kann negativ sein; In diesem Fall schuldet der Verkäufer dem Käufer den Betrag Dim duePayableAmount = Convert.ToDecimal(Gesamt_RG_BetragSteuerfrei + Gesamt_RG_BetragSteuerpflichtig + taxTotalAmount) + desc.SetTotals( lineTotalAmount:=Convert.ToDecimal(lineTotalAmont), chargeTotalAmount:=0, 'Summe aller in der Rechnung enthaltenen Zuschläge der Dokumentenebene diff --git a/SDL/kunden/usrCntlKundenuebersicht.Designer.vb b/SDL/kunden/usrCntlKundenuebersicht.Designer.vb index 23f197c7..63e99dc3 100644 --- a/SDL/kunden/usrCntlKundenuebersicht.Designer.vb +++ b/SDL/kunden/usrCntlKundenuebersicht.Designer.vb @@ -262,6 +262,7 @@ Partial Class usrCntlKundenuebersicht Me.btnOP = New System.Windows.Forms.Button() Me.ContextMenuStrip5 = New System.Windows.Forms.ContextMenuStrip(Me.components) Me.ToolStripMenuItem12 = New System.Windows.Forms.ToolStripMenuItem() + Me.PictureBox7 = New System.Windows.Forms.PictureBox() Me.cntxtAddVM.SuspendLayout() Me.tbWeitereKundenDetails.SuspendLayout() Me.tbOfferten.SuspendLayout() @@ -314,6 +315,7 @@ Partial Class usrCntlKundenuebersicht Me.ContextMenuStrip2.SuspendLayout() Me.ContextMenuStrip4.SuspendLayout() Me.ContextMenuStrip5.SuspendLayout() + CType(Me.PictureBox7, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() ' 'cntxtAddVM @@ -1402,6 +1404,7 @@ Partial Class usrCntlKundenuebersicht ' Me.Panel4.BackColor = System.Drawing.Color.WhiteSmoke Me.Panel4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle + Me.Panel4.Controls.Add(Me.PictureBox7) Me.Panel4.Controls.Add(Me.PictureBox6) Me.Panel4.Controls.Add(Me.FlatButton2) Me.Panel4.Controls.Add(Me.btnCreditsafe) @@ -1425,7 +1428,7 @@ Partial Class usrCntlKundenuebersicht Me.PictureBox6.BackgroundImage = Global.SDL.My.Resources.Resources.fragezeichen Me.PictureBox6.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom Me.PictureBox6.Cursor = System.Windows.Forms.Cursors.Hand - Me.PictureBox6.Location = New System.Drawing.Point(639, 4) + Me.PictureBox6.Location = New System.Drawing.Point(308, 2) Me.PictureBox6.Name = "PictureBox6" Me.PictureBox6.Size = New System.Drawing.Size(18, 19) Me.PictureBox6.TabIndex = 132 @@ -3427,6 +3430,18 @@ Partial Class usrCntlKundenuebersicht Me.ToolStripMenuItem12.Size = New System.Drawing.Size(150, 30) Me.ToolStripMenuItem12.Text = "Schnelldruck" ' + 'PictureBox7 + ' + Me.PictureBox7.BackgroundImage = Global.SDL.My.Resources.Resources.warning2 + Me.PictureBox7.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom + Me.PictureBox7.Cursor = System.Windows.Forms.Cursors.Hand + Me.PictureBox7.Location = New System.Drawing.Point(638, 3) + Me.PictureBox7.Name = "PictureBox7" + Me.PictureBox7.Size = New System.Drawing.Size(18, 19) + Me.PictureBox7.TabIndex = 133 + Me.PictureBox7.TabStop = False + Me.PictureBox7.Visible = False + ' 'usrCntlKundenuebersicht ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -3516,6 +3531,7 @@ Partial Class usrCntlKundenuebersicht Me.ContextMenuStrip2.ResumeLayout(False) Me.ContextMenuStrip4.ResumeLayout(False) Me.ContextMenuStrip5.ResumeLayout(False) + CType(Me.PictureBox7, System.ComponentModel.ISupportInitialize).EndInit() Me.ResumeLayout(False) Me.PerformLayout() @@ -3747,4 +3763,5 @@ Partial Class usrCntlKundenuebersicht Friend WithEvents EORI As DataGridViewTextBoxColumn Friend WithEvents NL As DataGridViewTextBoxColumn Friend WithEvents BIN As DataGridViewTextBoxColumn + Friend WithEvents PictureBox7 As PictureBox End Class diff --git a/SDL/kunden/usrCntlKundenuebersicht.vb b/SDL/kunden/usrCntlKundenuebersicht.vb index 815ad988..306d23dd 100644 --- a/SDL/kunden/usrCntlKundenuebersicht.vb +++ b/SDL/kunden/usrCntlKundenuebersicht.vb @@ -671,6 +671,9 @@ Public Class usrCntlKundenuebersicht Button3.BackgroundImage = My.Resources.fragezeichen ' Button4.Visible = False ' Button5.Visible = False + + PictureBox7.Visible = IIf(KUNDE_ERW.kde_CreditSaveId <> "", True, False) + Catch ex As Exception VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name,, "Es ist ein Fehler beim Laden der Firmendaten - Allgemein aufgetreten!") End Try @@ -3104,6 +3107,8 @@ Public Class usrCntlKundenuebersicht pdfObject = cs.getPDF(company, failureDesc) + cs.AddCompanyToPortfolio(company) + cs.getSubscriptionCountries(dt) If dt.Rows.Count > 0 AndAlso dt.AsEnumerable.Any(Function(c) company.country = c.Item("countryIso2").ToString) Then @@ -3257,15 +3262,57 @@ Public Class usrCntlKundenuebersicht End If End Sub - Private Sub lblBonitaet_TextChanged(sender As Object, e As EventArgs) Handles lblBonitaet.TextChanged - End Sub + Private Sub PictureBox7_Click(sender As Object, e As EventArgs) Handles PictureBox7.Click - Private Sub lblBonitaetRisikostufe_TextChanged(sender As Object, e As EventArgs) Handles lblBonitaetRisikostufe.TextChanged + Dim lastChecked As Date = Date.ParseExact(lblBonitaetsdatum._value, "dd.MM.yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo) - End Sub - Private Sub Label39_Click(sender As Object, e As EventArgs) Handles Label39.Click + Dim cs = New cCreditSafeAPI("creditsafe") + + If cs.authenticate() = "200" Then + Dim company As New cCreditSafeAPI.Company("", "", "", "", KUNDE_ERW.kde_CreditSaveNo, KUNDE_ERW.kde_CreditSaveId, Nothing, "", "", "", "", "", "", "", "", "") + company.lastChecked = IIf(IsDate(lastChecked), lastChecked, Today().AddDays(-1)) + Dim dt As New DataTable() + cs.getCompanyEvents(company, dt) + + If dt.Rows.Count > 0 Then + Dim frm As New Form + Dim dgv As New DataGridView() + + If dt.Columns.Contains("eventid") Then dt.Columns("eventid").ColumnMapping = MappingType.Hidden + If dt.Columns.Contains("companyId") Then dt.Columns("companyId").ColumnMapping = MappingType.Hidden + If dt.Columns.Contains("portfolioId") Then dt.Columns("portfolioId").ColumnMapping = MappingType.Hidden + If dt.Columns.Contains("localEventCode") Then dt.Columns("localEventCode").ColumnMapping = MappingType.Hidden + If dt.Columns.Contains("globalEventCode") Then dt.Columns("globalEventCode").ColumnMapping = MappingType.Hidden + If dt.Columns.Contains("createdDate") Then dt.Columns("createdDate").ColumnMapping = MappingType.Hidden + + If dgv.Columns.Contains("newValue") Then dgv.Columns("newValue").HeaderText = "Nachher" + If dgv.Columns.Contains("oldValue") Then dgv.Columns("oldValue").HeaderText = "Vorher" + If dgv.Columns.Contains("eventDate") Then dgv.Columns("eventDate").HeaderText = "Geändert am" + + + dgv.DataSource = dt + + If dgv IsNot Nothing Then + + frm.Size = New Size(750, 500) + dgv.Size = New Size(frm.Size.Width - 10, frm.Size.Height - 10) + dgv.Dock = DockStyle.Fill + dgv.Anchor = AnchorStyles.Left + dgv.Anchor = AnchorStyles.Top + dgv.ReadOnly = True + frm.Controls.Add(dgv) + frm.StartPosition = FormStartPosition.CenterScreen + frm.ShowDialog() + End If + + + Else + MsgBox("Keine Creditsafe-Änderungen seit " & lastChecked.ToShortDateString) + End If + + End If End Sub End Class diff --git a/VERAG_PROG_ALLGEMEIN/Schnittstellen/Creditsafe/cCreditSafeAPI.vb b/VERAG_PROG_ALLGEMEIN/Schnittstellen/Creditsafe/cCreditSafeAPI.vb index 762d9fa7..5a7c9163 100644 --- a/VERAG_PROG_ALLGEMEIN/Schnittstellen/Creditsafe/cCreditSafeAPI.vb +++ b/VERAG_PROG_ALLGEMEIN/Schnittstellen/Creditsafe/cCreditSafeAPI.vb @@ -96,7 +96,7 @@ Public Class cCreditSafeAPI - Shared Function SendGetRequestWithAuthHeader(url As String, company As Company, acceptContentType As String, method As String, authenticationToken As String, ByRef failureDesc As String) As String + Shared Function SendGetRequestWithAuthHeader(url As String, company As Company, acceptContentType As String, method As String, authenticationToken As String, ByRef failureDesc As String, Optional isMonitoring As Boolean = False) As String Try VERAG_PROG_ALLGEMEIN.cChilkat_Helper.UnlockCilkat() @@ -117,7 +117,7 @@ Public Class cCreditSafeAPI rest.ClearAllQueryParams() - If company IsNot Nothing Then + If company IsNot Nothing AndAlso Not isMonitoring Then setSearchParam(rest, company) @@ -131,6 +131,42 @@ Public Class cCreditSafeAPI Dim responseJson As String Dim pdfData As New Chilkat.BinData + If isMonitoring Then + + Dim json As New Chilkat.JsonObject + success = json.UpdateString("id", company.creditSafeId) + success = json.UpdateString("personalReference", "VERAG AG") + success = json.UpdateString("freeText", "hinzugefügt am " & Today.ToShortDateString) + success = json.UpdateString("personalLimit", "") + + Debug.WriteLine(json.Emit()) + + Dim sbRequestBody As New Chilkat.StringBuilder + json.EmitSb(sbRequestBody) + + Dim sbResponseBody As New Chilkat.StringBuilder + success = rest.FullRequestSb(method, url, sbRequestBody, sbResponseBody) + If (success <> True) Then + Debug.WriteLine(rest.LastErrorText) + failureDesc = rest.LastErrorText + Return failureDesc + + Else + + If (rest.ResponseStatusCode <> 200) Then + failureDesc = rest.ResponseStatusText & IIf(responseJson <> "", vbNewLine & responseJson, "") + Return failureDesc + Else + + Return responseJson + End If + + + End If + + End If + + If acceptContentType.Contains("application/pdf") Then responseJson = rest.FullRequestNoBodyBd(method, url, pdfData) @@ -193,6 +229,10 @@ Public Class cCreditSafeAPI End Function + + + + Shared Function authenticate(Optional username As String = "", Optional password As String = "") As String Dim myUri As String = API_STRING & "/v1/authenticate" @@ -208,6 +248,16 @@ Public Class cCreditSafeAPI End Function + Shared Function AddCompanyToPortfolio(company As Company, Optional PortfolioID As String = "1662419") As String + + Dim myUri As String = API_STRING & "/v1/monitoring/portfolios/" & PortfolioID & "/companies" 'Default + + Dim jsonRespString = SendGetRequestWithAuthHeader(myUri, company, "application/json", "POST", token, "", True) + + Return jsonRespString + + End Function + Shared Function searchCompanies(company As Company, ByRef dataTable As DataTable) As String @@ -377,8 +427,8 @@ Public Class cCreditSafeAPI R("ruleName") = compObj.StringOf("ruleName") R("localEventCode") = compObj.StringOf("localEventCode") R("globalEventCode") = compObj.StringOf("globalEventCode") - R("newValue") = compObj.StringOf("newValue") R("oldValue") = compObj.StringOf("oldValue") + R("newValue") = compObj.StringOf("newValue") R("eventDate") = dateTime.GetAsTimestamp(getAsLocal) R("createdDate") = dateTime.GetAsTimestamp(getAsLocal) dtEvents.Rows.Add(R) @@ -387,6 +437,13 @@ Public Class cCreditSafeAPI End While Next + + + If dtEvents.Rows.Count > 1 Then + dtEvents.DefaultView.Sort = "eventDate ASC" + dtEvents = dtEvents.DefaultView.ToTable + End If + Return "Anzahl gefundener Datensätze: " & numCompanies End Function