- Thema
- VB.NET
- SDK-Mitglieder
- FillZUGFeRD_Structure() getItemSpecifiedTradeAllowanceCharge() getItemSpecifiedTradeAllowanceChargeCount() Trade_ItemAllowance TradeItemsCount
- Business Terms
- BG-27 Abschläge auf Ebene der Rechnungsposition BG-28 Zuschläge auf Ebene der Rechnungsposition BT-147 Nachlass auf den Artikelpreis BG-25 Rechnungsposition BG-29 Detailinformationen zum Preis BT-131 Nettobetrag der Rechnungsposition BT-136 Betrag des Abschlags auf Ebene der Rechnungsposition BT-137 Grundbetrag des Abschlags auf Ebene der
- Codebeispiele
- VB.NET
- Veröffentlicht
Ein Rabatt kann in einer E-Rechnung an zwei verschiedenen Stellen einer Position stehen – und beide wirken unterschiedlich:
- Abschläge und Zuschläge der Position (BG-27, BG-28) wirken auf den Positionsbetrag als Ganzes. Sie sind im Nettobetrag der Position (BT-131) bereits verrechnet.
- Der Nachlass auf den Artikelpreis (BT-147) gehört zu den Preisangaben (BG-29): Bruttopreis (BT-148) minus Nachlass ergibt den Nettopreis je Einheit (BT-146).
Die Aloaha ZUGFeRD SDK hat für beide Stellen eigene Zugriffe. Wie Sie BG-27/BG-28 schreiben, zeigt Zu- und Abschläge je Rechnungsposition; hier geht es ums Auslesen und um den Preisnachlass.
Übersicht
| Aufruf | Liest bzw. schreibt |
|---|---|
getItemSpecifiedTradeAllowanceChargeCount(ItemIndex) | Anzahl der Zu- und Abschläge (BG-27 + BG-28) einer Position |
getItemSpecifiedTradeAllowanceCharge | einen Zu- oder Abschlag der Position |
Trade_ItemAllowance(ItemIndex, AllowanceIndex) | Nachlass auf den Artikelpreis (BT-147), nicht BG-27/BG-28 |
BG-27 und BG-28 lesen
| Parameter | Abschlag (BG-27) | Zuschlag (BG-28) |
|---|---|---|
isCharge | False | True |
CalculationPercent | BT-138 | BT-143 |
BasisAmount | BT-137 | BT-142 |
ActualAmount | BT-136 | BT-141 |
ReasonCode | BT-140 | BT-145 |
Reason | BT-139 | BT-144 |
Alle Ausgabeparameter werden per Referenz gefüllt. Beide Indizes beginnen bei 0.
VB.NET
Dim alo As New Aloaha_ZUGFeRD.XML("IHR-LIZENZSCHLUESSEL")
If alo.FillZUGFeRD_Structure("C:\Rechnungen\eingang.xml", "IHR-LIZENZSCHLUESSEL") Then
For i As Integer = 0 To alo.TradeItemsCount - 1
For k As Integer = 0 To alo.getItemSpecifiedTradeAllowanceChargeCount(i) - 1
Dim isCharge As Boolean = False
Dim Prozent As String = "", Grundbetrag As String = "", Betrag As String = ""
Dim GrundCode As String = "", Grund As String = ""
alo.getItemSpecifiedTradeAllowanceCharge(i, k, isCharge, Prozent, Grundbetrag, Betrag, GrundCode, Grund)
Console.WriteLine($"Position {i + 1}: {If(isCharge, "Zuschlag", "Abschlag")} {Betrag} ({Grund})")
Next
Next
End If
VBA / VB6 (COM) – die Variablen müssen typisiert sein, damit VBA sie per Referenz übergeben kann:
Dim i As Long, k As Long
Dim isCharge As Boolean
Dim Prozent As String, Grundbetrag As String, Betrag As String, GrundCode As String, Grund As String
For i = 0 To alo.TradeItemsCount - 1
For k = 0 To alo.getItemSpecifiedTradeAllowanceChargeCount(i) - 1
alo.getItemSpecifiedTradeAllowanceCharge i, k, isCharge, Prozent, Grundbetrag, Betrag, GrundCode, Grund
Debug.Print i + 1, IIf(isCharge, "Zuschlag", "Abschlag"), Val(Betrag), Grund
Next k
Next i
Ist ein Index ungültig, liefert getItemSpecifiedTradeAllowanceChargeCount 0, und getItemSpecifiedTradeAllowanceCharge lässt die übergebenen Variablen unverändert. Setzen Sie sie daher vor jedem Aufruf zurück, wenn Sie nicht über die Anzahl gehen. Beträge stehen mit Dezimalpunkt in der Rechnung; in VBA rechnen Sie sie mit Val() um.
Preisnachlass BT-147: Trade_ItemAllowance
Die Eigenschaft Trade_ItemAllowance heißt zwar nach Zu- und Abschlägen, greift aber auf den Rabatt im Bruttopreis der Position zu (GrossPriceProductTradePrice). Sie liefert eine Struktur iXML.AppliedTradeAllowanceCharge; der Nachlass je Einheit (BT-147) steht in ActualAmount.Amount. AddProduct_Comfort füllt diesen Eintrag über die Parameter AllowanceAmount und AllowanceReason; er hat dort immer den Index 0.
VB.NET – lesen und ändern
Dim Nachlass As Aloaha_ZUGFeRD.iXML.AppliedTradeAllowanceCharge = alo.Trade_ItemAllowance(0, 0)
Console.WriteLine("Preisnachlass je Einheit: " & Nachlass.ActualAmount.Amount)
' Nachlass von Position 0 auf 1,50 je Einheit ändern
Nachlass.ChargeIndicator = False
Nachlass.ActualAmount.Amount = "1.50"
alo.Trade_ItemAllowance(0, 0) = Nachlass
- Lesen Sie den Eintrag vor dem Ändern aus, wie im Beispiel: Der Setter ersetzt den kompletten Eintrag.
- Hat die Position noch keinen solchen Eintrag (AddProduct_Comfort ohne Basismenge und Rabatt), legt der Setter ihn an; ein Index hinter dem letzten Eintrag erweitert die Liste. Beim Lesen eines nicht vorhandenen Eintrags erhalten Sie eine leere Struktur. In älteren Versionen der SDK verwarf der Setter den Wert in diesem Fall ohne Fehlermeldung.
- Den Nettopreis (BT-146) und den Positionsbetrag (BT-131) rechnet die SDK nicht neu; passen Sie sie selbst an.
- In die XML gelangt der Nachlass nur zusammen mit einem Bruttopreis (BT-148) und nur, wenn ein Betrag gesetzt ist.
In VBA ist Trade_ItemAllowance nicht sinnvoll nutzbar, weil die Struktur über COM nicht als Objekt ankommt. Dort lesen Sie Brutto- und Nettopreis aus den Spalten grossprice und netprice von ReadTradeItemCSV, siehe Positionswerte in VBA/Access auslesen.
Profile
- BG-27/BG-28 sind ab BASIC erlaubt; Grundbetrag und Prozentsatz (BT-137/138, BT-142/143) ab EN 16931 (COMFORT).
- BT-147 ist ab BASIC erlaubt. Bis EN 16931 ist hier nur ein Abschlag mit Betrag vorgesehen; Prozentsatz, Grundbetrag und Zuschläge auf den Preis gehören zu EXTENDED. Prozentsatz (
CalculationPercent) und Grundbetrag (BasisAmount) des Preisnachlasses schreibt die SDK deshalb nur im Profil EXTENDED in die XML; Betrag, Grund und Code in jedem Profil. In älteren Versionen der SDK wurden Prozentsatz und Grundbetrag in jedes Profil geschrieben.
Häufige Fragen
Liest Trade_ItemAllowance die Positionsrabatte BG-27?
Nein. Trade_ItemAllowance liest den Rabatt im Bruttopreis (BT-147). Für BG-27 und BG-28 verwenden Sie getItemSpecifiedTradeAllowanceChargeCount und getItemSpecifiedTradeAllowanceCharge.
Muss ich BG-27/BG-28 vom Positionsbetrag abziehen?
Nein. Der Nettobetrag der Position (BT-131) enthält die Zu- und Abschläge der Position bereits.
Wie unterscheide ich Rabatt und Zuschlag beim Auslesen?
Am Parameter isCharge: False steht für einen Abschlag (BG-27), True für einen Zuschlag (BG-28).
Business Terms in diesem Artikel: BG-27 BG-28 BT-147 BG-25 BG-29 BT-131 BT-136 BT-137 BT-138 BT-139 BT-140 BT-141 BT-142 BT-143 BT-144 BT-145 BT-146 BT-148