AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte WPXOrder - X-Factur (ZUGFeRD) XML Daten lesen und erzeugen
Thema durchsuchen
Ansicht
Themen-Optionen

WPXOrder - X-Factur (ZUGFeRD) XML Daten lesen und erzeugen

Ein Thema von jziersch · begonnen am 8. Nov 2024 · letzter Beitrag vom 25. Jan 2025
Antwort Antwort
Seite 2 von 2     12   
jziersch
Registriert seit: 9. Okt 2003
WPXOrder ist eine Sammlung von Delphi-Units zur Erstellung und Auswertung von X-Factur (ZUGFeRD) XML-Daten.

Diese Library ist eine möglichst komplette Repräsentierung des ZUGFeRD XSD Schemas als Delphi Klassen.

Sie wurde erstellt, um Rechnungs Daten zu laden, zu verarbeiten und zu speichern. Es beinhaltet noch nicht den E-Invoice-Standard und ist darauf ausgerichtet, XML-Daten zu erstellen, die in PDF-Rechnungen eingebettet werden. Um solche Rechnungen zu erstellen, können Sie die praktische PDF-Erstellungs-VCL wPDF verwenden. Um solche Rechnungen zu lesen, können Sie WPViewPDF PLUS verwenden, das nicht nur X-Factur Daten extrahieren, sondern auch anhängen kann.

Bitte schauen Sie sich den Quellcode auf unserer WPXOrder GitHub Seite an.

Zweck und Lizenzierung
WPXOrder wurde entwickelt, um XML-Anhänge für Rechnungen zu erstellen, die als PDFs verteilt werden. Es wurde in Delphi 10.1 entwickelt und funktioniert am besten mit unseren Produkten wPDF oder WPViewPDF PLUS. Es kann auch verwendet werden, um solche XML-Daten zu lesen und auf alle Eigenschaften einfach zuzugreifen. Es kann auch zur Überprüfung der Berechnung (Gesamtsummen) verwendet werden - bitte beachten Sie jedoch, dass wir nicht garantieren können, dass solche Berechnungen in jedem Fall korrekt funktionieren.

Durch die Art der Implementierung werden folgende Fehler bei der Erstellung von XML Daten:
1) Schreibfehler der XML namen
2) Eigenschaften in falschem Eltern XML Element
3) Falsche Reihenfolge der Elemente (Wichtig für die Validierung)
Desweitern kann man Werte wie TDateTime zuweisen.


Mit der mitgelieferten EXE können Sie die Beispiel-PDFs öffnen und die internen Berechnungen mit den in den PDFs hinterlegten Zahlen vergleichen. Mit nur einem Klick können Sie Delphi-Code erstellen, der die Daten so erzeugt, wie sie in die Rechnung geladen werden. Dies wird Ihnen sehr helfen, das XML-Format besser zu verstehen und Ihre Rechnungserstellungssoftware zu konvertieren.

Sie können die Komponente ohne Lizenzkosten verwenden, wenn Sie sie in ein Open-Source-Projekt einbinden, das unter der GNU-Lizenz vertrieben wird - mit Ausnahme von Komponenten jeglicher Art oder „Forks“.

Wenn Sie die Komponente intern oder in einem Closed-Source-Produkt kommerziell nutzen wollen, ist eine kommerzielle Lizenz erforderlich. Diese Lizenz ist zu einem angemessenen Preis pro Unternehmen erhältlich (named license). Die kommerzielle Lizenz beinhaltet auch Support für 60 Tage nach dem Kauf. Bitte beachten Sie, dass wir uns zu rechtlichen und kalkulatorischen Fragen im Zusammenhang mit X-Factur nicht äußern können.

Programmier Referenz (alle Klassen):
https://www.wpcubed.com/manuals/wpxorder/index.html

Beschreibung:
https://www.wpcubed.com/pdf/products/xorder/

GitHub:
https://github.com/wpcubed/xorder

wPDF - PDF Erzeugen:
https://www.wpcubed.com/pdf/products/wpdf/

WPViewPDF PLUS - XML aus PDFs extrahieren oder hinzufügen:
https://www.wpcubed.com/pdf/products/pdf-edit/

Hinweise:
Auf GitHub befindet sich auch eine (signierte!) EXE welche aus PDFs XML extrahieren kann und direkt Delphi code erzeugen kann, der genau einen XML Rechnungsanhang mit den selben Werte erstellt.

Der Code verwendet Generics, erfordert also neuere Delphi Versionen.

Viel Erfolg,
Julian

Anhang: Automatisch generierter code der mit WPXOrder das ZUGFeRD Beispiel "Warenrechnung" erzeugt
Miniaturansicht angehängter Grafiken
xfacturtool.png  
Angehängte Dateien
Dateityp: pas code_fuer_warenrechnung_beispiel.pas (19,7 KB, 22x aufgerufen)

Geändert von jziersch (24. Dez 2024 um 10:29 Uhr)
 
Hobbycoder
 
#11
  Alt 24. Jan 2025, 14:07
Danke
  Mit Zitat antworten Zitat
Hobbycoder
 
#12
  Alt 24. Jan 2025, 19:30
In der TWPXSeller gibt es VATID und TATid. Was gehört da rein? Es gibt ja die Steuernummer und die UmsStID.
  Mit Zitat antworten Zitat
jziersch

 
Delphi 10.4 Sydney
 
#13
  Alt 25. Jan 2025, 10:20
Kleine Frage auf die ich im Internet nicht unbedingt eindeutige Antworten finde:

Der Dateiname der im PDF integrierten XLM, muss der einen bestimmten Namen haben?
"ZUGFeRD-invoice.xml" oder auch "factur-x.xml" wird historisch bedingt von Applikationen gesucht.
Der Name muss aber in den XMP (den metadaten) genannt werden und mir sind auch schon Rechnungen untergekommen, die einen anderen Namen verwenden und dann eben dort, in den XMP, eintragen. Das nächste Build von WPViewPDF 5 wird intern eine entsprechende Abfrage enthalten, damit die richtige Datei extrahiert wird.

Geändert von jziersch (25. Jan 2025 um 10:36 Uhr)
  Mit Zitat antworten Zitat
jziersch

 
Delphi 10.4 Sydney
 
#14
  Alt 25. Jan 2025, 10:35
In der TWPXSeller gibt es VATID und TATid. Was gehört da rein? Es gibt ja die Steuernummer und die UmsStID.
Du meinst wahrscheinlich TCompanyData

Aktuell wird nur VATID verwendet (also UmsStID) und entsprechend zugewiesen. Alle anderen Felder sind zugänglich über den Pfad zu der TTradeParty Struktur. Als Beispielcode siehe bitte die TCompanyData.AssignTo()

Edit: Ich habe den code wie unten ergänzt. Damit wird sowohl TaxID also auch VATId geschrieben. Es wird dann ein mehrfach Eintrag erzeugt. Ob das so unterstützt wird kann ich im Moment nicht sagen. Der code ist auf jeden Fall aber ein gutes Beispiel wie man mehrfache Einträge erzeugen kann.

Code:
procedure TCompanyData.AssignTo(Dest: TTradeParty);
var i : Integer;
begin
  if Self<>nil then
  begin
    i := 1;
    if VATID<>'' then
    begin
       Dest.SpecifiedTaxRegistration[i].ID.SetValue(VATID,TTaxID.VA_VAT_number);
       inc(i);
    end;
    if TAXId<>'' then
    begin
       Dest.SpecifiedTaxRegistration[i].ID.SetValue(TAXId,TTaxID.FC_tax_number);
    end;
// ...
  end;
end;

procedure TCompanyData.AssignFrom(Source: TTradeParty);
var val : TWPXElement;
    i : Integer;
begin
  if Source<>nil then
  begin  
    VATID := '';
    TAXId := '';
    if Source.ReadElementValue([Integer(TXTradeParty.SpecifiedTaxRegistration)], val) then
    begin
       for i := 0 to (val as TTaxRegistration).ListCount-1 do
       begin
          if TTaxRegistration(val)[i].ID.schemeID=TTaxID.VA_VAT_number then
               VATID := TTaxRegistration(val)[i].ID.ValueStr
          else TAXId := TTaxRegistration(val)[i].ID.ValueStr;
       end;
    end;
//    ...
  end;
end;

Geändert von jziersch (25. Jan 2025 um 11:04 Uhr) Grund: Schreibe TaxID
  Mit Zitat antworten Zitat
Hobbycoder
 
#15
  Alt 25. Jan 2025, 12:16
Super Danke. Ich komme der Sache näher.

Ein paar Fragen habe ich noch.

[Edit]
[Erledigt]Wie kann ich aus der TWPXFactur die PaymentData, oder die Rechnungsnummer bzw. das Rechnungsdatum auslesen?
Hab ich mittlerweile gefunden
Mit einem XML-Viewer kann man da schon einiges lernen https://xmlexplorer.github.io/#google_vignette
[/Edit]

Und mir ist gerade noch eine Kleinigkeit aufgefallen.
Wenn ich die Artikel in die TWPXFatur eintrage
Delphi-Quellcode:
   for I := 0 to A.PositionList.Count-1 do
   begin
      wpxfctr1.AddSale(
         A.PositionList[i].Kurztext, //ProductName
         A.PositionList[i].EP, //SinglePriceNET
         A.PositionList[i].Menge, //Quantity
         A.PositionList[i].MwSt, //VATRate
         WPXPaymentData.TAXCategory ); //VATCategory
                                                         //QuantityCode
                                                         //Totsl
   end;
dann steht hinterher in der XML:
XML-Code:
 <rsm:SupplyChainTradeTransaction>
   <ram:IncludedSupplyChainTradeLineItem>
    <ram:AssociatedDocumentLineDocument>
     <ram:LineID>1</ram:LineID>
    </ram:AssociatedDocumentLineDocument>
    <ram:SpecifiedTradeProduct>
     <ram:Name>ABUS IP-Kamery TVIP44510</ram:Name>
    </ram:SpecifiedTradeProduct>
    <ram:SpecifiedLineTradeAgreement>
     <ram:NetPriceProductTradePrice>
      <ram:ChargeAmount>149.00</ram:ChargeAmount>
      <ram:BasisQuantity unitCode="H87">1.0000</ram:BasisQuantity> <!-- VPE? -->
     </ram:NetPriceProductTradePrice>
    </ram:SpecifiedLineTradeAgreement>
    <ram:SpecifiedLineTradeDelivery>
     <ram:BilledQuantity unitCode="H87">2.0000</ram:BilledQuantity> <!-- Tatsächliche Artikelmenge -->
    </ram:SpecifiedLineTradeDelivery>
    <ram:SpecifiedLineTradeSettlement>
     <ram:ApplicableTradeTax>
      <ram:TypeCode>VAT</ram:TypeCode>
      <ram:CategoryCode>S</ram:CategoryCode>
      <ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
     </ram:ApplicableTradeTax>
     <ram:SpecifiedTradeSettlementLineMonetarySummation>
      <ram:LineTotalAmount>298.00</ram:LineTotalAmount>
     </ram:SpecifiedTradeSettlementLineMonetarySummation>
    </ram:SpecifiedLineTradeSettlement>
   </ram:IncludedSupplyChainTradeLineItem>
BaseQuantity ist 1, BillingQuantity ist 2.
Also gehe ich mal davon aus, dass sich BaseQuatity auf die VPE bezieht, oder halt die Menge je Einzelpreis.

Wenn ich das jedoch auslesen will:
wpxfctr.Transaction.Items[i].Line.SpecifiedLineTradeAgreement.NetPriceProductTradePrice.BasisQuantity dann gibt es unter NetPriceProductTracePrice kein BillingQuantity. Wie komme ich dann beim Auslesen an die tatsächliche Menge?

Ein Ähnliches Problem habe ich mit der LineID, die ja im AddSale nicht übergeben wird. In meinem erstellten factur-x.XML ist sie dann immer 1.
Müsste die sich nicht nach jedem AddSale um 1 erhöhen?

Ich taste mich jetzt langsam an die E-Rechnung ran, also bitte ich bei den Fragen, wie dumm sie auch sind, um etwas Nachsicht

Geändert von Hobbycoder (25. Jan 2025 um 13:51 Uhr)
  Mit Zitat antworten Zitat
jziersch

 
Delphi 10.4 Sydney
 
#16
  Alt 25. Jan 2025, 16:31
AddSale ist eine high-level API die nicht alle Probleme lösen kann oder will.
Die Funktion AddSale erstellt ein element der Klasse TSupplyChainTradeItem welches es zurückgibt. Dort kann man dann weitere elemente anlegen indem man einfach darauf zugreift.

Empfehlenswert ist anstatt einfach mal Delphi code zu erzeugen:
procedure SaveToFile(Filename : String; Mode : TWPXOrderDumpMode = TWPXOrderDumpMode.DelphiCode);

Das kann man auch nach dem laden einer Beispiel XML Datei machen. Damit hat man bereits das Code gerüst um eine XML zu erzeugen und die nötigen Zeilen um Werte zu lesen.
  Mit Zitat antworten Zitat
Hobbycoder
 
#17
  Alt 25. Jan 2025, 18:26
Ich hab mir mal die Dokumentation heruntergeladen https://www.ferd-net.de/publikatione...publikationen/

Das erklärt die ganzen Eigenschaften recht gut.
Damit versuche ich mal mein Grück.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz