Skip to content

Commit 9d1ecda

Browse files
committedFeb 24, 2025
reading support for paymentterms in XREchnung format
#SKONTO#TAGE=2#PROZENT=2.00#BASISBETRAG=252.94# #SKONTO#TAGE=4#PROZENT=4.01# #VERZUG#TAGE=14#PROZENT=1.0# add TaxPointDate, add DueDateTypeCode fix DesignatedProductClassification
1 parent fce342a commit 9d1ecda

11 files changed

+216
-59
lines changed
 

‎intf.ZUGFeRDDesignatedProductClassification.pas

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ interface
2929
TZUGFeRDDesignatedProductClassification = class
3030
private
3131
FClassName: String;
32-
FListID: String;
32+
FListID: TZUGFeRDDesignatedProductClassificationClassCodes;
3333
FListVersionID: String;
34-
FClassCode: TZUGFeRDDesignatedProductClassificationClassCodes;
34+
FClassCode: string;
3535
public
3636
/// <summary>
3737
/// A code for the classification of an item according to type or kind or nature.
@@ -40,12 +40,12 @@ TZUGFeRDDesignatedProductClassification = class
4040
/// purposes, for instance like public procurement, in accordance with the Common Vocabulary for Public Procurement
4141
/// [CPV]), e-Commerce(UNSPSC) etc.
4242
/// </summary>
43-
property ClassCode : TZUGFeRDDesignatedProductClassificationClassCodes read FClassCode write FClassCode;
43+
property ClassCode : string read FClassCode write FClassCode;
4444

4545
/// <summary>
4646
/// Product classification name
4747
/// </summary>
48-
property ListID : String read FListID write FListID;
48+
property ListID : TZUGFeRDDesignatedProductClassificationClassCodes read FListID write FListID;
4949

5050
/// <summary>
5151
/// Version of product classification

‎intf.ZUGFeRDDesignatedProductClassificationClassCodes.pas

+21-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ interface
3737
/// </summary>
3838
TZUGFeRDDesignatedProductClassificationClassCodes = (
3939

40+
Unknown,
41+
4042
/// <summary>
4143
/// Product version number
4244
/// Number assigned by manufacturer or seller to identify the release of a product.
@@ -49,7 +51,17 @@ interface
4951
/// </summary>
5052
HS,
5153

52-
Unknown
54+
/// <summary>
55+
/// ISBN (International Standard Book Number)
56+
/// A unique number identifying a book.
57+
/// </summary>
58+
IB,
59+
60+
/// <summary>
61+
/// Mutually defined
62+
/// Item type identification mutually agreed between interchanging parties.
63+
/// </summary>
64+
ZZZ
5365
);
5466

5567
TZUGFeRDDesignatedProductClassificationClassCodesExtensions = class
@@ -68,6 +80,8 @@ class function TZUGFeRDDesignatedProductClassificationClassCodesExtensions.EnumT
6880
case c of
6981
TZUGFeRDDesignatedProductClassificationClassCodes.AA: Result := 'AA';
7082
TZUGFeRDDesignatedProductClassificationClassCodes.HS: Result := 'HS';
83+
TZUGFeRDDesignatedProductClassificationClassCodes.IB: Result := 'IB';
84+
TZUGFeRDDesignatedProductClassificationClassCodes.ZZZ: Result := 'ZZZ';
7185
else Result := '';
7286
end;
7387
end;
@@ -80,6 +94,12 @@ class function TZUGFeRDDesignatedProductClassificationClassCodesExtensions.FromS
8094
else
8195
if SameText(s,'HS') then
8296
Result := TZUGFeRDDesignatedProductClassificationClassCodes.HS
97+
else
98+
if SameText(s,'IB') then
99+
Result := TZUGFeRDDesignatedProductClassificationClassCodes.IB
100+
else
101+
if SameText(s,'ZZZ') then
102+
Result := TZUGFeRDDesignatedProductClassificationClassCodes.ZZZ
83103
else
84104
Result := TZUGFeRDDesignatedProductClassificationClassCodes.Unknown;
85105
end;

‎intf.ZUGFeRDGlobalIDSchemeIdentifiers.pas

+11-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ interface
66
System.SysUtils
77
;
88

9+
// see http://iso6523.info/icd_list.pdf
10+
//
11+
912
type
1013
TZUGFeRDGlobalIDSchemeIdentifiers = (
1114
/// <summary>
@@ -43,7 +46,11 @@ interface
4346
/// <summary>
4447
/// Numero d'entreprise / ondernemingsnummer / Unternehmensnummer
4548
/// </summary>
46-
CompanyNumber = 208
49+
CompanyNumber = 208,
50+
/// <summary>
51+
/// Leitweg-ID
52+
/// </summary>
53+
LeitwegID = 204
4754
);
4855

4956
TZUGFeRDGlobalIDSchemeIdentifiersExtensions = class
@@ -72,6 +79,8 @@ class function TZUGFeRDGlobalIDSchemeIdentifiersExtensions.FromString(s: string)
7279
Result := TZUGFeRDGlobalIDSchemeIdentifiers.ODETTE else
7380
if SameText(s,'0208') then
7481
Result := TZUGFeRDGlobalIDSchemeIdentifiers.CompanyNumber else
82+
if SameText(s,'0204') then
83+
Result := TZUGFeRDGlobalIDSchemeIdentifiers.LeitwegID else
7584

7685
Result := TZUGFeRDGlobalIDSchemeIdentifiers.Unknown;
7786
end;
@@ -87,6 +96,7 @@ class function TZUGFeRDGlobalIDSchemeIdentifiersExtensions.EnumToString(c: TZUGF
8796
TZUGFeRDGlobalIDSchemeIdentifiers.EAN: Result := '0160';
8897
TZUGFeRDGlobalIDSchemeIdentifiers.ODETTE: Result := '0177';
8998
TZUGFeRDGlobalIDSchemeIdentifiers.CompanyNumber: Result := '0208';
99+
TZUGFeRDGlobalIDSchemeIdentifiers.LeitwegID: Result := '0204';
90100
else
91101
Result := '0000';
92102
end;

‎intf.ZUGFeRDInvoiceDescriptor.pas

+6-2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ interface
4141
intf.ZUGFeRDTaxTypes,
4242
intf.ZUGFeRDTaxCategoryCodes,
4343
intf.ZUGFeRDTaxExemptionReasonCodes,
44+
intf.ZUGFeRDDateTypeCodes,
4445
intf.ZUGFeRDContact,
4546
intf.ZUGFeRDNote,
4647
intf.ZUGFeRDCurrencyCodes,
@@ -745,7 +746,7 @@ TZUGFeRDInvoiceDescriptor = class
745746
/// <param name="allowanceChargeBasisAmount"></param>
746747
/// <param name="exemptionReasonCode"></param>
747748
/// <param name="exemptionReason"></param>
748-
procedure AddApplicableTradeTax(const calculatedAmount, basisAmount: Currency; const percent: Double; const typeCode: TZUGFeRDTaxTypes; const categoryCode: TZUGFeRDTaxCategoryCodes = TZUGFeRDTaxCategoryCodes.Unknown; const allowanceChargeBasisAmount: Currency = 0; const exemptionReasonCode: IZUGFeRDNullableParam<TZUGFeRDTaxExemptionReasonCodes> = Nil; const exemptionReason: string = ''; const lineTotalBasisAmount: Currency = 0);
749+
procedure AddApplicableTradeTax(const calculatedAmount, basisAmount: Currency; const percent: Double; const typeCode: TZUGFeRDTaxTypes; const categoryCode: TZUGFeRDTaxCategoryCodes = TZUGFeRDTaxCategoryCodes.Unknown; const allowanceChargeBasisAmount: Currency = 0; const exemptionReasonCode: IZUGFeRDNullableParam<TZUGFeRDTaxExemptionReasonCodes> = Nil; const exemptionReason: string = ''; const lineTotalBasisAmount: Currency = 0; const taxPointDate: IZUGFeRDNullableParam<TDateTime> = nil; const dueDateTypeCode: IZUGFeRDNullableParam<TZUGFeRDDateTypeCodes> = Nil);
749750

750751
/// <summary>
751752
/// Saves the descriptor object into a stream.
@@ -1526,7 +1527,9 @@ procedure TZUGFeRDInvoiceDescriptor.AddApplicableTradeTax(const calculatedAmount
15261527
const allowanceChargeBasisAmount: Currency = 0;
15271528
const exemptionReasonCode: IZUGFeRDNullableParam<TZUGFeRDTaxExemptionReasonCodes> = Nil;
15281529
const exemptionReason: string = '';
1529-
const lineTotalBasisAmount: Currency = 0);
1530+
const lineTotalBasisAmount: Currency = 0;
1531+
const taxPointDate: IZUGFeRDNullableParam<TDateTime> = nil;
1532+
const dueDateTypeCode: IZUGFeRDNullableParam<TZUGFeRDDateTypeCodes> = Nil);
15301533
var
15311534
tax: TZUGFeRDTax;
15321535
begin
@@ -1539,6 +1542,7 @@ procedure TZUGFeRDInvoiceDescriptor.AddApplicableTradeTax(const calculatedAmount
15391542
tax.LineTotalBasisAmount := lineTotalBasisAmount;
15401543
tax.ExemptionReasonCode := exemptionReasonCode;
15411544
tax.ExemptionReason := exemptionReason;
1545+
tax.DueDateTypeCode := dueDateTypeCode;
15421546

15431547
if (categoryCode <> TZUGFeRDTaxCategoryCodes.Unknown) then
15441548
tax.CategoryCode := categoryCode;

‎intf.ZUGFeRDInvoiceDescriptor20Reader.pas

+4-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ interface
4747
,intf.ZUGFeRDBankAccount
4848
,intf.ZUGFeRDTaxTypes,intf.ZUGFeRDTaxCategoryCodes
4949
,intf.ZUGFeRDTaxExemptionReasonCodes
50+
,intf.ZUGFeRDDateTypeCodes
5051
,intf.ZUGFeRDPaymentTerms
5152
,intf.ZUGFeRDSellerOrderReferencedDocument
5253
,intf.ZUGFeRDInvoiceReferencedDocument
@@ -327,7 +328,9 @@ function TZUGFeRDInvoiceDescriptor20Reader.Load(xmldocument : IXMLDocument): TZU
327328
TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:AllowanceChargeBasisAmount', 0),
328329
TZUGFeRDTaxExemptionReasonCodesExtensions.FromString(TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:ExemptionReasonCode')),
329330
TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:ExemptionReason'),
330-
TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:LineTotalBasisAmount'));
331+
TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:LineTotalBasisAmount'),
332+
TZUGFeRDXmlUtils.NodeAsDateTime(nodes[i], './/ram:TaxPointDate/udt:DateString'),
333+
TZUGFeRDDateTypeCodesExtensions.FromString(TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:DueDateTypeCode')));
331334
end;
332335

333336
nodes := doc.SelectNodes('//ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge');

‎intf.ZUGFeRDInvoiceDescriptor20Writer.pas

+12
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ interface
4242
,intf.ZUGFeRDTax
4343
,intf.ZUGFeRDTaxTypes
4444
,intf.ZUGFeRDTaxCategoryCodes
45+
,intf.ZUGFeRDDateTypeCodes
4546
,intf.ZUGFeRDTradeLineItem
4647
,intf.ZUGFeRDAdditionalReferencedDocument
4748
,intf.ZUGFeRDAdditionalReferencedDocumentTypeCodes
@@ -1011,6 +1012,17 @@ procedure TZUGFeRDInvoiceDescriptor20Writer._writeOptionalTaxes(
10111012
begin
10121013
_writer.WriteElementString('ram:ExemptionReasonCode', TZUGFeRDTaxExemptionReasonCodesExtensions.EnumToString(tax.ExemptionReasonCode));
10131014
end;
1015+
if tax.TaxPointDate.HasValue then
1016+
begin
1017+
_writer.WriteStartElement('ram:TaxPointDate');
1018+
_writer.WriteStartElement('udt:DateString');
1019+
_writer.WriteAttributeString('format', '102');
1020+
_writer.WriteValue(_formatDate(tax.TaxPointDate.Value));
1021+
_writer.WriteEndElement(); // !udt:DateString
1022+
_writer.WriteEndElement(); // !TaxPointDate
1023+
end;
1024+
if tax.DueDateTypeCode.HasValue then
1025+
_writer.WriteElementString('ram:DueDateTypeCode', TZUGFeRDDateTypeCodesExtensions.EnumToString(tax.DueDateTypeCode));
10141026
_writer.WriteElementString('ram:RateApplicablePercent', _formatDecimal(tax.Percent));
10151027
_writer.WriteEndElement(); // !ApplicableTradeTax
10161028
end;

0 commit comments

Comments
 (0)