Zugferd-Logik

This commit is contained in:
2024-12-12 11:34:33 +01:00
parent de41369333
commit 73af6a0d85

View File

@@ -8,9 +8,11 @@ Imports GrapeCity.ActiveReports.ReportsCore.Tools
Imports itextsharp.text.pdf
Imports Microsoft.Office.Interop
Imports VERAG_PROG_ALLGEMEIN
Imports VERAG_PROG_ALLGEMEIN.Factur_X_1_07_2_EN16931
Imports VERAG_PROG_ALLGEMEIN.Spire.Pdf
Imports VERAG_PROG_ALLGEMEIN.Spire.Pdf.Attachments
Imports s2industries.ZUGFeRD
Imports System.IO
Public Class cFakturierung
@@ -1541,14 +1543,22 @@ Public Class cFakturierung
p.Export(rpt.Document, tmpPath)
Dim Paramslist As New cParameterList(VERAG_PROG_ALLGEMEIN.cAllgemein.PROGID)
Dim enableZugpferd = Paramslist.GET_PARAMETER_VALUE_BOOL("ZUGFeRD")
If enableZugpferd Then
tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.addAttachementToPDF(tmpPath, createZUGFeRD(RECHNUNG))
Else
Dim Zugferdpath = createZUGFeRD(RECHNUNG)
Dim fileInfo_ZP As New FileInfo(Zugferdpath)
Dim ZUGF_DS As New VERAG_PROG_ALLGEMEIN.cDATENSERVER("DOKUMENTE", "ZUGFERD", Now().Year, "", "", fileInfo_ZP.Name, -1, False)
ZUGF_DS.uploadDataToDATENSERVER(Zugferdpath, fileInfo_ZP.Name, fileInfo_ZP.Extension,,,, True)
End If
'e-Rechnung ZUGFeRD aktuell noch deaktiviert!
If False Then tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.addAttachementToPDF(tmpPath, createZUGFeRD(RECHNUNG))
Path = tmpPath
'THEREFORE IMPORT:
'-------------------------------------------------------------------------------
Try
@@ -1735,25 +1745,164 @@ Public Class cFakturierung
Shared Function createZUGFeRD(RECHNUNG As VERAG_PROG_ALLGEMEIN.cRechnungsausgang) As String
Dim ZZTage = 10
Dim vatSeller As ElectronicAddressSchemeIdentifiers
Dim vatBuyer As ElectronicAddressSchemeIdentifiers
' ZUGFeRD XML-Dokument erzeugen
Dim inv As New CrossIndustryInvoiceType
If RECHNUNG.RechnungsKundenNr > 0 Then
inv.ExchangedDocument.ID.Value = RECHNUNG.RK_ID
inv.ExchangedDocument.TypeCode.Value = 632
Dim RECHNUNG_AD As New VERAG_PROG_ALLGEMEIN.cAdressen(RECHNUNG.RechnungsKundenNr)
Dim RECHNUNG_KD As New VERAG_PROG_ALLGEMEIN.cKunde(RECHNUNG.RechnungsKundenNr)
If RECHNUNG_KD.Zahlungsziel IsNot Nothing AndAlso IsNumeric(RECHNUNG_KD.Zahlungsziel) Then
ZZTage = RECHNUNG_KD.Zahlungsziel
End If
End If
Dim zahlungszieldatum As Date = CDate(RECHNUNG.RechnungsDatum).AddDays(ZZTage)
Dim FIRMA As New VERAG_PROG_ALLGEMEIN.cFirmen(RECHNUNG.Firma_ID)
Dim desc As InvoiceDescriptor = InvoiceDescriptor.CreateInvoice(RECHNUNG.RechnungsNr, RECHNUNG.RechnungsDatum, IIf(FIRMA.Firma_ID = 26, CurrencyCodes.GBP, CurrencyCodes.EUR))
Select Case RECHNUNG.BelegartenKz
Case "AR"
desc.Name = "SPEDITIONSRECHNUNG"
desc.Type = InvoiceType.ForwardersInvoice
Case "AG"
desc.Name = "GUTSCHRIFT"
desc.Type = InvoiceType.CreditNote
End Select
If RECHNUNG.Besonderheiten IsNot Nothing Then desc.AddNote(RECHNUNG.Besonderheiten.ToString, SubjectCodes.AAI)
If RECHNUNG.Text IsNot Nothing Then desc.AddNote(RECHNUNG.Text.ToString, SubjectCodes.AAI)
desc.AddNote("Es bestehen Rabatt- und Bonusvereinbarungen.", SubjectCodes.AAK)
desc.SetBuyer(RECHNUNG.RechnungsName_1, RECHNUNG.RechnungsOrt, RECHNUNG.RechnungsOrt, RECHNUNG.RechnungsStraße, GetCountryCodeFromLandKZ(RECHNUNG.RechnungsLandKz, vatBuyer), IIf(Not IsDBNull(RECHNUNG.KundenNrZentrale), RECHNUNG.KundenNrZentrale, ""))
desc.SetSeller(FIRMA.Firma_Bez, FIRMA.Firma_Ort, FIRMA.Firma_Ort, FIRMA.Firma_Straße, GetCountryCodeFromLandKZ(FIRMA.Firma_LandKz, vatSeller))
desc.AddSellerTaxRegistration(FIRMA.Firma_UID.ToString.Replace("UID: ", ""), TaxRegistrationSchemeID.VA)
' Optionally, to support Peppol-----------------------------
If Not IsDBNull(RECHNUNG.RechnungsUstIdNr) AndAlso RECHNUNG.RechnungsUstIdNr IsNot Nothing AndAlso Not IsDBNull(RECHNUNG.RechnungsUstIdKz) AndAlso RECHNUNG.RechnungsUstIdKz IsNot Nothing Then
desc.AddBuyerTaxRegistration(RECHNUNG.RechnungsUstIdKz & RECHNUNG.RechnungsUstIdNr, TaxRegistrationSchemeID.VA)
If vatBuyer Then
desc.SetBuyerElectronicAddress(RECHNUNG.RechnungsUstIdKz & RECHNUNG.RechnungsUstIdNr, vatBuyer)
desc.SetSellerElectronicAddress(FIRMA.Firma_UID.ToString.Replace("UID: ", ""), vatSeller)
End If
End If
'-----------------------------
Dim tmpPathZugpferd = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getTMPPath("ZUGFeRD_Invoice", ".xml", , False)
inv.SaveToFile(tmpPathZugpferd)
Dim steuerProzent As Double = SQL.DLookup(" isnull([Steuersatz %],0)", "[Steuertabelle] ", "[Steuerschlüssel]='" & checkNull(RECHNUNG.Steuerschlüssel) & "'", "FMZOLL", 0)
desc.SetTotals(
lineTotalAmount:=Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag), 'Summe aller Rechnungspositions-Nettobeträge der Rechnung
chargeTotalAmount:=0, 'Summe aller in der Rechnung enthaltenen Zuschläge der Dokumentenebene
allowanceTotalAmount:=0, 'Summe aller in der Rechnung enthaltenen Abschläge der Dokumenteneben
taxBasisAmount:=Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag + 0 - 0), ' Die Gesamtsumme der Rechnung ohne Umsatzsteuer
taxTotalAmount:=Convert.ToDecimal(RECHNUNG.SteuerpflichtigerGesamtbetrag) * steuerProzent, 'Der Gesamtbetrag der Umsatzsteuer für die Rechnung
grandTotalAmount:=Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag * steuerProzent), 'Der Gesamtbetrag der Rechnung mit Umsatzsteuer
totalPrepaidAmount:=0, 'Die Summe der im Voraus gezahlten Beträge
duePayableAmount:=Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag * steuerProzent), '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
roundingAmount:=0 'Der Betrag, der dem Rechnungsgesamtbetrag hinzuzufügen ist, um den zu zahlenden Betrag zu runden
)
Dim lineTotalAmont = RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag
desc.AddTradePaymentTerms(RECHNUNG.TextZZ, zahlungszieldatum)
For Each p In RECHNUNG.POSITIONEN
Dim tradeLineItemNew As TradeLineItem = desc.AddTradeLineItem(
name:=p.LeistungsBez,
billedQuantity:=Convert.ToDecimal(p.Anzahl),
unitCode:=QuantityCodes.C62, ' Stück
netUnitPrice:=Convert.ToDecimal(p.Preis),
grossUnitPrice:=IIf(p.Steuerpflichtig, Convert.ToDecimal(p.Preis * RECHNUNG.Steuersatz_Proz), Convert.ToDecimal(p.Preis)),
categoryCode:=IIf(p.Steuerpflichtig, TaxCategoryCodes.S, TaxCategoryCodes.Z),
taxPercent:=IIf(p.Steuerpflichtig, Convert.ToDecimal(RECHNUNG.Steuersatz_Proz), 0),
taxType:=IIf(p.Steuerpflichtig, TaxTypes.VAT, TaxTypes.VAT)
)
Next
Dim isReverseCharge = isReverseChargeSumme(FIRMA, RECHNUNG)
If RECHNUNG.SteuerfreierGesamtbetrag > 0 Then
desc.AddApplicableTradeTax(Convert.ToDecimal(RECHNUNG.SteuerfreierGesamtbetrag), 0, TaxTypes.VAT, TaxCategoryCodes.Z)
End If
If RECHNUNG.SteuerpflichtigerGesamtbetrag > 0 Then
desc.AddApplicableTradeTax(Convert.ToDecimal(RECHNUNG.SteuerpflichtigerGesamtbetrag), Convert.ToDecimal(RECHNUNG.Steuersatz_Proz), Convert.ToDecimal(RECHNUNG.SteuerpflichtigerGesamtbetrag * RECHNUNG.Steuersatz_Proz), TaxTypes.VAT, IIf(isReverseCharge, TaxCategoryCodes.AE, TaxCategoryCodes.S))
End If
Dim tmpPathZugpferd = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getTMPPath("ZUGFeRD_Invoice_" & RECHNUNG.RechnungsNr, ".xml", True, False)
Dim stream As FileStream = New FileStream(tmpPathZugpferd, FileMode.Create, FileAccess.Write)
desc.Save(stream, ZUGFeRDVersion.Version20, Profile.Comfort)
stream.Flush()
stream.Close()
Return tmpPathZugpferd
End Function
Public Shared Function GetCountryCodeFromLandKZ(LandKZ As String, easi As ElectronicAddressSchemeIdentifiers) As CountryCodes
If LandKZ = "" Then Return CountryCodes.Unknown
Dim landKZISO2 = VERAG_PROG_ALLGEMEIN.cProgramFunctions.getISO2Land(LandKZ)
Dim cc As CountryCodes
Select Case landKZISO2
Case "AT" : cc = CountryCodes.AT : easi = ElectronicAddressSchemeIdentifiers.AustriaVatNumber
Case "DE" : cc = CountryCodes.DE : easi = ElectronicAddressSchemeIdentifiers.GermanyVatNumber
Case "TR" : cc = CountryCodes.TR : easi = ElectronicAddressSchemeIdentifiers.TurkeyVatNumber
Case "GB" : cc = CountryCodes.GB : easi = ElectronicAddressSchemeIdentifiers.UnitedKingdomVatNumber
Case "AL" : cc = CountryCodes.AL : easi = ElectronicAddressSchemeIdentifiers.AlbaniaVatNumber
Case "AZ" : cc = CountryCodes.AZ
Case "BG" : cc = CountryCodes.BG : easi = ElectronicAddressSchemeIdentifiers.BulgariaVatNumber
Case "BA" : cc = CountryCodes.BA : easi = ElectronicAddressSchemeIdentifiers.BosniaAndHerzegovinaVatNumber
Case "CH" : cc = CountryCodes.CH : easi = ElectronicAddressSchemeIdentifiers.SwitzerlandVatNumber
Case "CO" : cc = CountryCodes.CO
Case "CY" : cc = CountryCodes.CY : easi = ElectronicAddressSchemeIdentifiers.CyprusVatNumber
Case "CZ" : cc = CountryCodes.CZ : easi = ElectronicAddressSchemeIdentifiers.CzechRepublicVatNumber
Case "DK" : cc = CountryCodes.DK
Case "DZ" : cc = CountryCodes.DZ
Case "ES" : cc = CountryCodes.ES
Case "FR" : cc = CountryCodes.FR : easi = ElectronicAddressSchemeIdentifiers.FrenchVatNumber
Case "FN" : cc = CountryCodes.FI
Case "HR" : cc = CountryCodes.HR : easi = ElectronicAddressSchemeIdentifiers.CroatiaVatNumber
Case "GE" : cc = CountryCodes.GE
Case "HK" : cc = CountryCodes.HK
Case "IN" : cc = CountryCodes.IN
Case "IR" : cc = CountryCodes.IR : easi = ElectronicAddressSchemeIdentifiers.UnitedKingdomVatNumber
Case "IQ" : cc = CountryCodes.IQ
Case "LT" : cc = CountryCodes.LT : easi = ElectronicAddressSchemeIdentifiers.LithuaniaVatNumber
Case "LV" : cc = CountryCodes.LV : easi = ElectronicAddressSchemeIdentifiers.LatviaVatNumber
Case "US" : cc = CountryCodes.US
Case "MK" : cc = CountryCodes.MK : easi = ElectronicAddressSchemeIdentifiers.MacedoniaVatNumber
Case "PL" : cc = CountryCodes.PL : easi = ElectronicAddressSchemeIdentifiers.PolandVatNumber
Case "RS" : cc = CountryCodes.RS : easi = ElectronicAddressSchemeIdentifiers.SerbiaVatNumber
Case "AE" : cc = CountryCodes.AE
Case "SI" : cc = CountryCodes.SI : easi = ElectronicAddressSchemeIdentifiers.SloveniaVatNumber
Case "SK" : cc = CountryCodes.SK : easi = ElectronicAddressSchemeIdentifiers.SlovakiaVatNumber
Case Else
cc = CountryCodes.Unknown
End Select
Return cc
End Function
Shared Sub printSpedBuchAnhaenge(RG As VERAG_PROG_ALLGEMEIN.cRechnungsausgang, Optional printStb As Boolean = False, Optional printVbD As Boolean = False)
Try
Dim SPEDBCUH = New VERAG_PROG_ALLGEMEIN.cSpeditionsbuch(RG.FilialenNr, RG.AbfertigungsNr, RG.SpeditionsbuchUnterNr)
@@ -2789,7 +2938,7 @@ Public Class cFakturierung
Dim dt As DataTable
If VorschauID = "" Then
dt = SQL.loadDgvBySql("Select * FROM Rechnungsausgang WHERE Rechnungsausgang.Status In(3) And CONVERT(datetime,DruckDatumZeit ,104)='" & DruckdatumUhrzeit.ToString("dd.MM.yyyy HH:mm:ss.fff") & "' and RechnungsNr='" & RechnungsNr & "' ORDER BY FilialenNr, AbfertigungsNr", "FMZOLL")
dt = SQL.loadDgvBySql("Select * FROM Rechnungsausgang WHERE Rechnungsausgang.Status In(3,4) And CONVERT(datetime,DruckDatumZeit ,104)='" & DruckdatumUhrzeit.ToString("dd.MM.yyyy HH:mm:ss.fff") & "' and RechnungsNr='" & RechnungsNr & "' ORDER BY FilialenNr, AbfertigungsNr", "FMZOLL")
Else
dt = SQL.loadDgvBySql("Select * FROM Rechnungsausgang WHERE RechnungsNr is null AND VorschauID='" & VorschauID & "' ORDER BY FilialenNr, AbfertigungsNr", "FMZOLL")
End If