Zu- und Abschläge je Position auslesen (BG-27, BG-28, BT-147)

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

AufrufLiest bzw. schreibt
getItemSpecifiedTradeAllowanceChargeCount(ItemIndex)Anzahl der Zu- und Abschläge (BG-27 + BG-28) einer Position
getItemSpecifiedTradeAllowanceChargeeinen 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

ParameterAbschlag (BG-27)Zuschlag (BG-28)
isChargeFalseTrue
CalculationPercentBT-138BT-143
BasisAmountBT-137BT-142
ActualAmountBT-136BT-141
ReasonCodeBT-140BT-145
ReasonBT-139BT-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