Inhaltsübersicht
Table of Contents maxLevel 2
Übersicht: was ist ZUGFerD?
Der PDF-Standard PDF/A-3 erlaubt neben Inhaltsübersicht
Table of Contents maxLevel 2
Übersicht: was ist ZUGFerD?
Der PDF-Standard PDF/A-3 erlaubt neben dem Transport des Belegs die gleichzeitige Auslieferung der Rechnungsdaten im XML-Format. Dies erfolgt sozusagen als interner „Anhang" einer PDF-Datei. Der Empfänger wird so in die Lage versetzt, die wichtigen Daten einer Rechnung in eine Datenbank zu exportieren. Die manuelle Erfassung durch Ablesen vom Beleg entfällt.
Einige große Unternehmen haben diese Methode des Datentransfers bereits zur Bedingung bei der Rechnungsschreibung in Form einer PDF-Datei gemacht oder sie für die nahe Zukunft als notwendig angekündigt.
DirectSpool (früher Automail) wurde erweitert, um die Rechnungsdaten aus der Spooldatei (SPLF) abzugreifen und der PDF-Datei als XML-Daten mitzugeben. Für den Absender ist keine Programmierung erforderlich. Der Empfänger kann mit dem Adobe Reader den Beleg anzeigen und über das Symbol „Büroklammer" den Export der XML-Daten vornehmen (dazu mehr weiter unten).
Weitere Informationen zum System "ZUGFeRD" finden Sie unter https://www.zugferd-tech.de/.
Voraussetzungen für den Einsatz von directmail für ZUGFeRD
- DirectSpool/DirectMail ab Version 5.50
- Toolmaker Lizenz für ZUGFeRD XML (ggf. auch für XMR)
- Spooldateien mit SCS Datenstrom (Standard)
- Ausgabeformat *EPDF
- Wert *ZUGFERD in den PDF Formularangaben bei Parameter PDF/A erstellen
- Fontdatei im IFS unter /Toolmaker/DirectMail400/Fonts (z.B. cour.ttf)
- Dateien ZUG.XML und ZUG.XMP im IFS unter /Toolmaker/DirectMail400/Zugferd
...
Indizes für ZUGFeRD definieren
Wie in DirectSpool üblich, werden variable Daten per Definition aus der Spooldatei abgegriffen und als Indizes gespeichert (Beispiel &RGNR). Außerdem können per SQL Werte aus einer Datei gelesen und auch als Indizes definiert werden.
Seitens ZUGFeRD gibt es fest vordefinierte Felder sowohl für die Kopf- als auch die Postendaten einer Rechnung, denen über eine komfortable Funktion die gesammelten Indizes aus der SPLF zugeordnet werden. Auch die Verwendung von konstanten Werten und die Nutzung von Datumsroutinen zur Formatumsetzung sind möglich.
Ausgehend von einer funktionierenden Automail-Definition wird nachfolgend beschrieben, wie die Funktion ZUGFeRD aktiviert und die Indizes zugeordnet werden.
ZUGFeRD Definitionen und Default Werte
Rufen Sie DirectSpool (Automail) mit WRKATMDEF auf. Drücken Sie dann Taste F7 ZUGFeRD Definition. Es erscheint folgendes Dialogprogramm, wo Sie die Standardwerte je ZUGFeRD Feld erfassen und abspeichern können.Rufen Sie DirectSpool (Automail) mit WRKATMDEF auf. Drücken Sie dann Taste F7 ZUGFeRD Definition.
X-File Template - Definiert Die Einbettungsstruktur für das PDF
X-ADD Template - zug.xmp definiert das Muster für die Zugferd Struktur
Anfang Position / Ende Position - bestimmt die Vervielfältigung der Positionen. Z.B Rechnungspositionen
API Programm - es kann ein Programm hinterlegt werden, in welchem das XML erzeugt wird
Das Programm muss in der Bibliothek DIRMAIL stehen und einen beliebigen neuen Namen Haben
Nachfolgend ein API Musterprogramm:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
CTL-OPT DEBUG(*YES) OPTION(*NODEBUGIO) ;
CTL-OPT DECEDIT('0,') DATEDIT(*DMY.) ;
//********************************************************************
// Example ZugFeRD API Programm *
// *
// Autor: Roman Tutschka 07.2019 *
//********************************************************************
// CREATE COMMANDS:
// Replace PGMLIB , SRCLIB , PGMNAM with your own Names
// PGMLIB is normaly DIRMAIL use an NEW !!! Programm Name
// COMMANDS:
// ADDLIBLE DIRMAIL
//
// CRTSQLRPGI OBJ(PGMLIB/PGMNAM) SRCFILE(SRCLIB/QRPGLESRC)
// SRCMBR(PGMNAM) COMMIT(*NONE) OBJTYPE(*MODULE) USER(*CURRENT)
// REPLACE(*YES) DBGVIEW(*SOURCE)
//
// CRTPGM PGM(PGMLIB/PGMNAM) BNDSRVPGM((DIRMAIL/DMLIB))
//
// Entry
? DCL-PR DMWRKZUX ;
ID PACKED(11:0); // Identifikation
SEGMENT PACKED(9:0); // Identifikation
PXML POINTER ; // Returns Pointer for embedded XML
siz INT(10) ; // Returns Size of the XML
END-PR;
// Internal Definition
? DCL-PI DMWRKZUX ;
ID PACKED(11:0); // Identifikation
SEGMENT PACKED(9:0); // Identifikation
PXML POINTER ; // Returns Pointer for embedded XML
siz INT(10) ; // Size of the XML
END-PI;
DCL-PR dm_etoa INT(10) extproc('dm_etoa') ;
buffer CHAR(32767) options(*varsize) ;
bufferlen INT(10) value ;
END-PR;
DCL-S PRETCHAR char(999999) based(PXML) ;
//
DCL-DS DSHDR EXTNAME('DMEXCHDR') END-DS; // Datastucture for Header Information
DCL-DS DSZUG EXTNAME('DMATMZUG') QUALIFIED END-DS; // Datastucture for ZUGFERD Information
DCL-DS DSIDX EXTNAME('DMEXCIDX') QUALIFIED END-DS; // Datastucture for INDEX Information
DCL-S INDEXNAM LIKE(DSIDX.EINAM) ; // Name of the Index
//********************************************************************
// Main Programm
//********************************************************************
PXML = %ALLOC(10000000); // Allocate MAX space for Return FREED in DIRMAIL
// Read DIRMAIL Header Information OPTIONAL
EXEC SQL SELECT * INTO :DSHDR FROM DMEXCHDR
WHERE EASEQ = :ID ;
// Read Indexes Values from DIRMAIL
clear DSIDX; // init
INDEXNAM = 'RGNR'; // Example in this case the result
// is the Value from the DIRMAIL Index for Example the Invoice Number
EXEC SQL SELECT I.* INTO :DSIDX from DMEXCSEG as S
join DMEXCIDX as I on ESSEQ = EISEQ
WHERE ESSEQ = :ID AND ESNUM = :SEGMENT AND
EIPAG >= ESSTR AND EIPAG <= ESEND
AND EINAM = :INDEXNAM
FETCH FIRST 1 ROWS ONLY;
// Result value for the example Index ''RGNR'' in in DSIDX.DSIDX
// Create Embedded XML
// EXAMLE Value
IF SQLCOD = 0;
// Example embed INVOICE Number INDEXNAM RGNR exist
PRETCHAR = DSIDX.EIVAL ; // Example embed INVOICE Number INDEXNAM
ELSE;
// Example embed INVOICE Number INDEXNAM RGNR do not exist
PRETCHAR = 'RETURN XML' ; // Example
ENDIF;
// Convert to ASCII needed if the valoue is in EBDIC
dm_etoa(PRETCHAR: %LEN(%TRIM(PRETCHAR))) ;
siz = %LEN(%TRIM(PRETCHAR)) ;
// if the Value of the XML is in ASCII only return the address of PXML
// and the Size of DATA
return;
|
ZUGFeRD Definitionen und Default-Werte
Nach dem Druck auf Enter erscheint folgendes Dialogprogramm, mit dem Sie die Standardwerte je FeRD Feld erfassen und abspeichern können.
Hinweise zu den Spalten:
Typ: H=Header (Kopfinfos der Rechnung), P=Positionen (z.B. für Artikelzeile)
Variablen Name: Der von der ZUGFeRD Organisation festgelegte Name für ein Merkmal
Default Wert: Ein von Ihnen für Ihre Firma vorgegebener konstanter Wert für ein Merkmal
XML Format: Hier kann bei Bedarf mit F4 die Funktion für Dezimal- und Datumsformate ausgewählt werden. Die angezeigten Möglichkeiten sind in der Parameter Kontrolldatei von WOPiXX unter ZUGFORMAT definiert.
Herkunft Format: Angeben, wenn unbedingt erforderlich. Normalerweise wird das Datumsformat automatisch erkannt. Auch hier kann mit F4 das Format ausgewählt werden. Die angezeigten Möglichkeiten sind in der Parameter Kontrolldatei von WOPiXX unter ZUGOFORMAT definiert.
Reihenfolge: Sequenz für die Darstellung in dieser Anzeige.
Falls die Variablen Namen nicht verständlich sind, kann mit F11 die Sicht umgeschaltet und eine Bezeichnung eingeblendet werden.
...
...
Format der PDF-Datei
Innerhalb der Automail directspool-Definition ist zu prüfen, ob das Spoolausgabe Format richtig gesetzt ist, es muss *EPDF sein.
Sie finden
In directspool (Automail) finden Sie dieses Fenster unter dem Pulldown Menü Email bei 3. Ausgabeformat.
PDF Formularangaben – Parameter Schriftart und PDF/A *ZUGFERD
Unter dem Punkt 5. Formular/Papier im Menü Email müssen 2 Parameter gesetzt werden.
Der Parameter Schriftart - muss den Namen einer Fontdatei enthalten, .
Dieses ist üblicherweise COUR.TTF. (
...
Diese Schriftart stammt aus dem Windows Umfeld und wird nicht von Toolmaker geliefert).
Die Schriftart-Datei muss im IFS-Verzeichnis unter
/Toolmaker/Directmail400/Font
existieren
...
.
Grund: Fontdateien können Copyrights unterliegen! Wird keine Fontdatei bereitgestellt und hier angegeben, tritt ein Fehler auf. Der hier allgemein angegebene Sonderwert *COURIER ist nicht ausreichend, weil das PDF/A Format die Einbettung der Fontdatei erzwingt.
Unten muss bei PDF/A erstellen - Hier muss *ZUGFERD angegeben werden, damit die XML-Daten auch in die PDF-Datei eingefügt werden.
Erforderliche Indizes prüfen
Alle variablen Werte aus der Spooldatei, die als XML-Daten mit in die PDF-Datei eingefügt werden sollen, müssen als Indizes definiert worden sein. Beispiel:
Das Thema Indizes definieren und bedingen wird als bekannt vorausgesetzt. Das Bild zeigt die grafische Darstellung der definierten Indizes in Umkehranzeige und deren Bedingungskonstanten mittels Unterstreichung. Die Farben können abweichen. Die Detailangaben werden im folgenden Bild dargestellt.
Die Auflistung und Verwaltung der Indexeinträge kann über Pulldown Menü Index und Punkt 4 Mit Indizes arbeiten erreicht werden. Jeder Indexname kann durch ein vorangestellte & an den gewünschten Stellen in der Automail Definition verwendet werden.
ZUGFeRD Zuordnungen
Für die Zuordnung der einzelnen Indizes aus der Spooldatei zu den festen Feldnamen der XML-Struktur wird folgendes Bild verwendet. Es kann über das Pulldown Menü Extras und Punkt 3 erreicht werden.
Es werden alle ZUGFeRD Default Werte angezeigt (Beschreibung siehe oben) und man kann jetzt mit F4 bei den noch leeren Zeilen die Indizes aus einer Liste mit 1 auswählen. Ein Index ist an dem führenden Zeichen & zu erkennen (Beispiele &RGDAT, &KDNR, &RGNR).
Falls die Variablen Namen nicht verständlich sind, kann mit F11 die Sicht umgeschaltet und eine Bezeichnung eingeblendet werden.
Definition abspeichern
Nachdem alle erforderlichen Indizes den ZUGFeRD Variablen zugeordnet wurden, kann die Definition mit F3 und J=Ja abgespeichert werden.
...
Nicht erlaubte Sonderzeichen (&, <, >, " und ')
Es gibt fünf Zeichen, die nicht in XML-Dateien erlaubt sind. An ihrer Stelle muss man eine sog. "escape"-Sequenz eintragen. Es sind dies:
Zeichen | Escape-Sequenz |
---|---|
" | " |
' | ' |
< | < |
> | > |
& | & |
...
(siehe z.B. https://stackoverflow.com/questions/1091945/what-characters-do-i-need-to-escape-in-xml-documents)
...
icon | false |
---|---|
title | Beispiel |
Das kaufmännische Und (&) wird automatisch korrigiert
Ein Beispiel: in einer spoolmail-Definition wird ein Index aus einer Datenbankdatei geholt. Das Feld enthält den Namen einer Firma: "ACME GmbH & Co. KG".
...
Directspool korrigiert diesen String bei der Üernahme automatisch und setzt ihn um in:
<ram:SellerTradeParty>
<ram:Name>ACME GmbH & Co. KG</ram:Name>
...
Dieses kann auf zwei Arten gelöst werden:
...
Spezialfälle: den String mit <![CDATA[....]]> umgeben
Die Sequenz <![CDATA[<beliebiger_text>]]>
sorgt dafür, dass in <beliebieger_text> auch Sonderzeichen angegeben werden können. Der XML-Parser ignoriert diese. Damit kann der Inhalt des Feldes ohne Änderung ausgegeben werden.
Code Block | ||||
---|---|---|---|---|
| ||||
<ram:SellerTradeParty> <ram:Name> <![CDATA[ ACMEArtikel GmbH"Kerzenständer &30cm" Co.nicht KGlieferbar ]]> </ram:Name> ... |
Weitere Hinweise zu <![CDATA: (https://stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean)
Den String #amp; an directspool liefern
Wenn die Daten, die directspool erhält, den Wert #amp; enthalten, dann werden sie in die Escape-Sequenz & umgesetzt.
Für diese Lösung müsste also das Feld den Wert "ACME GmbH #amp; Co. KG" haben und würde korrekt in die XML-Datei ausgegeben.
...
Ergebnis prüfen
Davon ausgehend, dass es sich um eine funktionierende Automail Definition handelt, die jetzt um die ZUGFeRD Funktion erweitert wurde, kann eine passende Spooldatei in der überwachten OUTQ eingefügt und das Ergebnis der Konvertierung geprüft werden.
Es kann sich bei dem von Ihnen definierten Ablauf um eine E-Mail mit PDF-Anhang, eine ins IFS exportierte PDF-Datei oder um eine archivierte PDF-Datei handeln.
Klicken Sie die PDF-Datei doppelt. Es sollte sich der Adobe Reader öffnen und den Inhalt anzeigen. An dieser Anzeige hat sich nichts geändert, aber es wird in der linken, senkrechten Symbolleiste eine Büroklammer angezeigt. Diese anklicken und die Liste der Dateianlagen prüfen. Die ZUGFeRD XML Datei doppelklicken – es öffnet sich die Anwendung, die mit der Endung XML verbunden ist und zeigt den XML Code an. Möglicherweise kommt vorher noch ein Warnhinweis wg. potentieller Risiken beim Öffnen.
Mit Rechtsklick auf den Namen der Datei können Sie die XML Datei in einem Verzeichnis speichern.
Hinweis: Falls Sie z.B. von Ihren Lieferanten Rechnungen im PDF/A-3 Format bekommen, wird genau wie zuvor beschrieben vorgegangen, um den XML Anhang zu exportieren. Im IBM i Umfeld kann auch eine automatische Verarbeitung der XML Daten implementiert werden (siehe Export-API).
...
Export-API DMEXPPDA für PDF/A-3 Dateien
Diese Schnittstelle wird gesondert lizenziert und kann mit dem Lizenzcode XMR von Toolmaker freigeschaltet werden.
Sie haben eine PDF/A-3 Datei erhalten. Wenn Sie den Export der XML Daten in der IBM i Welt automatisiert durchführen und die XML Daten gleich verarbeiten wollen, können Sie das DirectSpool API Programm DMEXPPDA aus Ihrer Anwendung aufrufen und 3 Parameter übergeben.
RPGLE Beispiel (Testprogramm Ausschnitt):
// Definitions
DCL-S ifsobj char(250) inz('/A/Zugferd_Testhw1_QPRINT.PDF') ;
DCL-S ifsout char(250) inz('/A/Zugferd_Testhw1_OUTPUT.xml') ;
DCL-S retcod char(80) inz ;
Dcl-Pr DMexppda ExtPgm('DMEXPPDA') ;
PDFDocument CHAR(250) ;
resultFile CHAR(250) ;
returnCode CHAR(80) ;
End-Pr ;
// Call the program
DMexppda(ifsobj:ifsout:retcod) ;
if retcod = *blank ;
// PDF Attachment has been exported
Else ;
// error handling
Endif ;