Zugferd-Logik
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user