Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

Die Realisierung des ZUGFeRD-Standards für profiforms Produkte geschieht in einem ZUGFeRD-Modul, dass in mehreren Produkten Anwendung findet.

Das ZUGFeRD-Modul ist eine Klassenbibliothek, mit allen Klassen, die der ZUGFeRD-Standard für ein CrossIndustryDocument vorsieht inkl. der dazugehörigen Hierarchie.
Das oberste Element ist dabei das CrossIndustryDocument selbst, das als internes CrossIndustryDocument im RAM gehalten wird. Dabei besitzt das ZUGFeRD-Modul zwei Schnittstellen zur Interaktion mit dem internen CrossIndustryDocument:

...

  1. Lesen einer ZUGFeRD-XML-Datei in ein internes CrossIndustryDocument (in Arbeit)
  2. Schreiben einer ZUGFeRD-XML-Datei aus einem internen CrossIndustryDocument (realisiert)
  3. Setzen von Werten des internen CrossIndustryDocument über Kommandosprache (realisiert)
  4. Lesen von Werten vom internen CrossIndustryDocument über Kommandosprache (in Arbeit)
  5. Validieren des internen CrossIndustryDocument (realisiert)

 

...

Anker
andressieren_xml
andressieren_xml
Adressieren von Elementen der internen ZUGFeRD-XML-Datei

 

Die Element-Namen der ZUGFeRD-XML-Datei werden nicht in dieser Dokumentation beschrieben, da es davon Hunderte gibt. Für diesen Zweck gibt es die „Technische Dokumentation“ die als Arbeitsmittel unentbehrlich ist. In der vorliegenden Implementierung wird ein Element-Name über einen Path beschrieben, der den genauen Ort des Elements beschreibt. Dabei werden die Element-namen ohne NameSpace-Angaben durch einen Punkt aneinander gereiht. 

CrossIndustryDocument.SpecifiedSupplyChainTradeTransaction.ApplicableSupplyChainTradeSettlement.SpecifiedTradeSettlementMonetarySummation.ChargeTotalAmount

 

Handelt es sich bei der Ortsangabe um eine Array, dann erfolgt die Angabe des Array-Elements mit eckigen Klammern und dem Index-Angabe dazwischen. Das erste Element eines Array hat als Index-Nummer die Nummer 0.  Wird ein Array-Index angesprochen, das ein nicht existierendes Element bezeichnet, so wird mit dem Befehl das fehlende Element und alle davor fehlende Elementen hinzugefügt.           

CrossIndustryDocument.SpecifiedSupplyChainTradeTransaction.IncludedSupplyChainTradeLineItem[0]

 

Da die Pfadnamen sehr lang werden können, gibt es mehrere Wege der Vereinfachung. Zu allererst ist es zulässig den ersten Namen CrossIndustryDocument wegfallen zu lassen, da grundsätzlich jeder Pfad-Name mit CrossIndustryDocument beginnt und er damit selbsterklärend ist.

Weiterhin gibt es Möglichkeit über IDs zu arbeiten. Jedes Element besitzt eine ID über die es angesprochen werden kann. Der Set-Befehl liefert zum entsprechenden Pfad immer die ID zurück. Zukünfige Zugriffe können dann auch über die ID erfolgen.

 

Befehl
Pfad
Rückgabewert
1. Set-BefehlCrossIndustryDocument.SpecifiedSupplyChainTradeTransaction4
2. Set-Befehl4.IncludedSupplyChainTradeLineItem[0]0

...

Anker
setzen_document
setzen_document
Setzen von Werten des internen CrossIndustryDocument über Kommandosprache

...

Das ZUGFeRD-Modul bietet einen Set-Befehl, der sehr universell verwendet werden kann.

Der Set-Befehl hat folgende Parameter:

Befehl
Parameter
1ID
2Path
nValue (0-N)

 

...

Die beiden Übergabeparameter ID und Path dienen zum Adressieren eines Elements. Die ID wird selbständig zum übergebenen Pfad hinzugefügt. Alles anderen Übergabeparameter sind Values und definieren den Inhalt des Elements bzw. den Inhalt seiner Unterelemente.:

 

Pfad: 8.ApplicableTradeTax[0]

Value
Beispiel
Value1

...

“19,00 €,” (CalculatedAmount)
Value2

...

"VAT"( TypeCode)
Value3

...

“100,00 €” (BasisAmount)
Value4

...

“19%” (ApplicablePercent)

Mit einem Set-Befehl werden gleich vier Unterelemente von ApplicableTradeTax gesetzt.

 

Natürlich kann auch jeder der vier Werte in einem separaten Set-Befehl gesetzt werden. Durch die Angabe spezieller Operatoren mit mehreren Werten spart man jedoch erheblich Schreibarbeit. 

Dafür ist es jetzt schwerer zu verstehen, welcher Value welchen Wert setzt.

Die folgende Auflistung beschreibt, welche Element Operatoren mit mehreren Werten besitzen und der wievielte Value welches Unterelement setzt.

Objekt
Stellungsparameter
Unterobjekt
GuidelineSpecifiedDocumentContextParameter1ID
BusinessProcessSpecifiedDocumentContextParameter1ID
SpecifiedExchangedDocumentContext

1
2
3

GuidelineSpecifiedDocumentContextParameter.ID
TestIndicator
BusinessProcessSpecifiedDocumentContextParameter

 IncludedNote 

1

 
   

 

 

IncludedNote

...

2

3

SubjectCode

...

ContentCode

...

Content[0]

...

EffectiveSpecifiedPeriod1CompleteDateTime

 

HeaderExchangedDocument

1

2

3

4

5

n

ID

...

Name

...

TypeCode

...

IssueDateTime

...

CopyIndicator

...

LanguageID[N]

 

SpecifiedTaxRegistration

1

2

ID

...

ID.setSchemeID

...

 

...

PostalTradeAddress

Bei einem Parameter:

1


Bei mehr als einem Parameter:

1

2

3

4

5

 

Normale Adresse mit mehreren Zeilen (komplette Adresse)

...

...



LineOne

...

LineTwo

...

PostcodeCode

...

CityName

...

CountryID

 

DefinedTradeContact

1

2

3

4

5

PersonName

...

DepartmentName

...

TelephoneUniversalCommunication.CompleteNumber

...

FaxUniversalCommunication.CompleteNumber

...

EmailURIUniversalCommunication.URIID

 

TelephoneUniversalCommunication1CompleteNumber

...

FaxUniversalCommunication1CompleteNumber

 

EmailURIUniversalCommunication1URIID

...

TradeParty

1

2

Name

...

ID

...

ApplicableTradeDeliveryTerms1DeliveryTypeCode

...

ApplicableSupplyChainTradeAgreement1BuyerReference

 

ActualDeliverySupplyChainEvent1OccurrenceDateTime

 

SpecifiedLogisticsTransportMovement

1

2

ModeCode

...

ID

...

Indicator1YES|NO

 

DateTime1German or ISO-Date

 

DateMandatoryDateTime1German or ISO-Date

 

schemeIDType

...

Bei einem Parameter:

1

...

 

Bei mehr als einem Parameter:

1

...

2

 

ID[,schemeID]

...



ID

schemeID

schemeAgencyID

...

Bei einem Parameter:

1

...

 

...

Bei mehr als einem Parameter:

1

...

2

 

D[,schemeAgencyID



ID

...

schemeAgencyID

QuantityType

...

Bei einem Parameter:

1

...

 

...

Bei mehr als einem Parameter:

1

...

2

...

 

SignValueUnit



SignValue

Unit

MeasureType

...

Bei einem Parameter:

1

...

 

...

Bei mehr als einem Parameter:

1

...

2

...

 

SignValueUnit



SignValue

Unit

ClassCode

...

Bei einem Parameter:

1

 

Bei zwei Parametern:

1

2

 

Bei mehr als zwei Parametern:

1

2

3

 

Value[,listID[,listVersionID]]

bei zwei Parameter

...



Value

listID



Value

...

listID

...

listVersionID

ApplicableTradeTax

...

1

...

2

...

3

...

4

5

6

7

8

CalculatedAmount

TypeCode

BasisAmount

ApplicablePercent

ExemptionReason

LineTotalBasisAmount

AllowanceChargeBasisAmount

CategoryCode

TradeTax

1

2

3

TypeCode

CategoryCode

ApplicablePercent

BillingSpecifiedPeriod

1

2

StartDateTime

EndDateTime

PayeeSpecifiedCreditorFinancialInstitution

1

2

3

BICID

GermanBankleitzahlID

Name

PayeePartyCreditorFinancialAccount

1

2

3

IBANID

AccountName

ProprietaryID

PayerSpecifiedDebtorFinancialInstitution

1

2

3

BICID

GermanBankleitzahlID

Name

PayerPartyDebtorFinancialAccount

1

2

IBANID

ProprietaryID

SpecifiedTradeSettlementPaymentMeans

1

2

n

TypeCode

ID

Information[N]

SpecifiedTradeSettlementMonetarySummation

1

2

3

4

5

6

7

8

LineTotalAmount

ChargeTotalAmount

AllowanceTotalAmount

TaxBasisTotalAmount

TaxTotalAmount

GrandTotalAmount

TotalPrepaidAmount

DuePayableAmount

TradeAllowanceCharge

1

2

3

4

5

6

7

8

ChargeIndicator

SequenceNumeric

CalculationPercent

BasisAmount

BasisQuantity

ActualAmount

ReasonCode

Reason

SpecifiedLogisticsServiceCharge

1

n

AppliedAmount

Description[N]

ReceivableSpecifiedTradeAccountingAccount1ID
ApplicableSupplyChainTradeSettlement

1

2

PaymentReference

InvoiceCurrencyCode

ApplicableTradePaymentPenaltyTerms

1

2

3

4

5

BasisDateTime

BasisPeriodMeasure

BasisAmount

CalculationPercent

ActualPenaltyAmount

ApplicableTradePaymentDiscountTerms

1

2

3

4

5

BasisDateTime

BasisPeriodMeasure

BasisAmount

CalculationPercent

ActualDiscountAmount

SpecifiedTradePaymentTerms

1

2

n

DueDateDateTime

artialPaymentAmountSet[0]

Description[N]

AssociatedDocumentLineDocument1 
ReferencedDocument

1

2

3

4

IssueDateTime

LineID

ID

ReferenceTypeCode

GrossPriceProductTradePrice

1

2

ChargeAmount

BasisQuantity

NetPriceProductTradePrice

1

2

ChargeAmount

BasisQuantity

SpecifiedSupplyChainTradeDelivery

1

2

3

BilledQuantity

ChargeFreeQuantity

PackageQuantity

SpecifiedTradeAccountingAccount1ID
ApplicableProductCharacteristic

1

2

3

n

TypeCode

ValueMeasure

Value

Description[N]

DesignatedProductClassification

1

2

ClassCode

ClassName[0]

IncludedReferencedProduct

1

2

SellerAssignedID

BuyerAssignedID

Country1ID
SpecifiedTradeProduct

1

2

3

4

5

GlobalID

SellerAssignedID

BuyerAssignedID

Name

Description

 

...

 

ApplicableTradeTax

1 CalculatedAmount

2 TypeCode

3 BasisAmount

4 ApplicablePercent

5 ExemptionReason

6 LineTotalBasisAmount

7 AllowanceChargeBasisAmount

8 CategoryCode

 

 

TradeTax

1 TypeCode

2 CategoryCode

3 ApplicablePercent

 

BillingSpecifiedPeriod

1 StartDateTime

2 EndDateTime

 

PayeeSpecifiedCreditorFinancialInstitution

1 BICID

2 GermanBankleitzahlID

3 Name

 

PayeePartyCreditorFinancialAccount

1 IBANID

2 AccountName

3 ProprietaryID

 

PayerSpecifiedDebtorFinancialInstitution

1 BICID

2 GermanBankleitzahlID

3 Name

 

PayerPartyDebtorFinancialAccount

1 IBANID

2 ProprietaryID

 

SpecifiedTradeSettlementPaymentMeans

1 TypeCode

2 ID

n Information[N]

 

SpecifiedTradeSettlementMonetarySummation

1 LineTotalAmount

2 ChargeTotalAmount

3 AllowanceTotalAmount

4 TaxBasisTotalAmount

5 TaxTotalAmount

6 GrandTotalAmount

7 TotalPrepaidAmount

8 DuePayableAmount

 

TradeAllowanceCharge

1 ChargeIndicator

2 SequenceNumeric

3 CalculationPercent

4 BasisAmount

5 BasisQuantity

6 ActualAmount

7 ReasonCode

8 Reason

 

SpecifiedLogisticsServiceCharge

1 AppliedAmount

n Description[N]

 

ReceivableSpecifiedTradeAccountingAccount

1 ID

 

ApplicableSupplyChainTradeSettlement

1 PaymentReference

2 InvoiceCurrencyCode

 

ApplicableTradePaymentPenaltyTerms

1 BasisDateTime

2 BasisPeriodMeasure

3 BasisAmount

4 CalculationPercent

5 ActualPenaltyAmount

 

ApplicableTradePaymentDiscountTerms

1 BasisDateTime

2 BasisPeriodMeasure

3 BasisAmount

4 CalculationPercent

5 ActualDiscountAmount

 

SpecifiedTradePaymentTerms

1 DueDateDateTime

2 PartialPaymentAmountSet[0]

n Description[N]

 

AssociatedDocumentLineDocument

1 LineID

 

ReferencedDocument

1 IssueDateTime

2 LineID

3 ID

4 ReferenceTypeCode

 

GrossPriceProductTradePrice

1 ChargeAmount

2 BasisQuantity

 

NetPriceProductTradePrice

1 ChargeAmount

2 BasisQuantity

 

SpecifiedSupplyChainTradeDelivery

1 BilledQuantity

2 ChargeFreeQuantity

3 PackageQuantity

 

SpecifiedTradeAccountingAccount

1 ID

 

ApplicableProductCharacteristic

1 TypeCode

2 ValueMeasure

3 Value

n Description[N]

 

DesignatedProductClassification

1 ClassCode

2 ClassName[0]

 

IncludedReferencedProduct

1 SellerAssignedID

2 BuyerAssignedID

 

Country

1 ID

 

SpecifiedTradeProduct

1 GlobalID

2 SellerAssignedID

3 BuyerAssignedID

4 Name

5 Description

 

 

Setzen der Locale-Angaben für ZUGFeRD-XML

...

Da die profiforms-Produkte bereits über Lokalisierungs-Funktionen verfügen, ist es lediglich erforderlich das entsprechende Locale  per per Befehl zu setzen.

 

SetLocale(locale)

 

Bsp:

SetLocal("de_DE")

Zahlen und Einheiten werden auf deutsche Sprache und Deutschland umgestellt.

 

...

Anker
valid_xml
valid_xml
Validieren einer ZUGFeRD-XML

 

Im ZUGFeRD-Modul ist ein Validierer enthalten, der es erlaubt, das interne CrossIndustryDocument zu validieren. Der Validierer ist demnach kein XML-Validiere, der über eine XSD-Schemaprüfung arbeitet. Ganz im Gegenteil wurde auf die XSD-Schemaprüfung bewusst verzichtet, da der interne Validierer diese Aufgabe mit übernimmt.

...

Dabei sind folgende Status-Werte möglich:
 

REQUIRED bzw. R

ADVISED bzw. A

OPTIONAL bzw. O

DEPENDING bzw. D (noch nicht implementiert)

 

Das Ergebnis der Valisierung ist entweder ein Wert 0 oder 1 dafür, ob die Validierung erfolgreich war oder ein Validierungsprotokoll, dass nur einen Inhalt hat, wenn die Validierung nicht erfolgreich war.

...

Es wird dringend empfohlen jedes interne CrossIndustryDocument vor dem Wandeln in einen XML-String bzw. eine XML-Datei es zu validieren. Das verhindert die Weitergabe ungültiger ZUGFeRD-XML-Dateien und den daraus resultieren Stress mit den Konsumenten dieser ungültigen ZUGFeRD-XML-Dateien. Um die Validierung beim Export zu erleichtern, ist es möglich, im Schreibebefehl die Validierung mit durchzuführen. Gibt es Fehler beim Validieren, so wird die ZUGFeRD-XML-Dateie bzw. der ZUGFeRD-XML-String nicht erzeugt.       

 

...

titleWeitere Dokumentationen

...