Skip to content

Commit f90cde2

Browse files
sync PaymentTerms with C# library
implement PaymentTerms missing fields (synced back to C# library)
1 parent a48b1a8 commit f90cde2

8 files changed

+408
-171
lines changed

intf.ZUGFeRDInvoiceDescriptor1Reader.pas

+27-8
Original file line numberDiff line numberDiff line change
@@ -311,14 +311,33 @@ function TZUGFeRDInvoiceDescriptor1Reader.Load(xmldocument : IXMLDocument): TZUG
311311
begin
312312
var paymentTerm : TZUGFeRDPaymentTerms := TZUGFeRDPaymentTerms.Create;
313313
paymentTerm.Description := TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:Description');
314-
paymentTerm.DueDate:= TZUGFeRDXmlUtils.NodeAsDateTime(nodes[i], './/ram:DueDateDateTime');
315-
paymentTerm.DirectDebitMandateID := TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:DirectDebitMandateID');
316-
//TODO paymentTerm.PartialPaymentAmount
317-
//TODO paymentTerm.ApplicableTradePaymentPenaltyTerms
318-
paymentTerm.ApplicableTradePaymentDiscountTerms.BasisPeriodMeasure := TZUGFeRDXmlUtils.NodeAsDouble(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisPeriodMeasure');
319-
paymentTerm.ApplicableTradePaymentDiscountTerms.UnitCode := TZUGFeRDQuantityCodesExtensions.FromString(TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisPeriodMeasure/@unitCode'));
320-
paymentTerm.ApplicableTradePaymentDiscountTerms.BasisAmount := TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisAmount');
321-
paymentTerm.ApplicableTradePaymentDiscountTerms.CalculationPercent := TZUGFeRDXmlUtils.NodeAsDouble(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:CalculationPercent');
314+
paymentTerm.DueDate:= TZUGFeRDXmlUtils.NodeAsDateTime(nodes[i], './/ram:DueDateDateTime/udt:DateTimeString');
315+
paymentTerm.PartialPaymentAmount:= TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:PartialPaymentAmount');
316+
var discountPercent: ZUGFeRDNullable<Double> := TZUGFeRDXmlUtils.NodeAsDouble(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:CalculationPercent');
317+
var penaltyPercent: ZUGFeRDNullable<Double> := TZUGFeRDXmlUtils.NodeAsDouble(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:CalculationPercent');
318+
var Days: ZUGFeRDNullable<Integer>;
319+
if discountPercent.HasValue then
320+
begin
321+
paymentTerm.PaymentTermsType:= TZUGFeRDPaymentTermsType.Skonto;
322+
paymentTerm.Percentage:= discountPercent;
323+
if TZUGFeRDQuantityCodes.DAY = TZUGFeRDQuantityCodesExtensions.FromString(TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisPeriodMeasure/@unitCode')) then
324+
paymentTerm.DueDays:= TZUGFeRDXmlUtils.NodeAsInt(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisPeriodMeasure');
325+
paymentTerm.MaturityDate:= TZUGFeRDXmlUtils.NodeAsDateTime(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisDateTime/udt:DateTimeString'); //BT-X-282-0
326+
paymentTerm.BaseAmount:= TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisAmount');
327+
paymentTerm.ActualAmount:= TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:ActualDiscountAmount');
328+
end
329+
else
330+
if penaltyPercent.HasValue then
331+
begin
332+
paymentTerm.PaymentTermsType:= TZUGFeRDPaymentTermsType.Verzug;
333+
paymentTerm.Percentage:= penaltyPercent;
334+
if TZUGFeRDQuantityCodes.DAY = TZUGFeRDQuantityCodesExtensions.FromString(TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:BasisPeriodMeasure/@unitCode')) then
335+
paymentTerm.DueDays:= TZUGFeRDXmlUtils.NodeAsInt(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:BasisPeriodMeasure');
336+
paymentTerm.MaturityDate:= TZUGFeRDXmlUtils.NodeAsDateTime(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:BasisDateTime/udt:DateTimeString'); // BT-X-276-0
337+
paymentTerm.BaseAmount:= TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:BasisAmount');
338+
paymentTerm.ActualAmount:= TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:ActualPenaltyAmount');
339+
end;
340+
322341
Result.PaymentTermsList.Add(paymentTerm);
323342
end;
324343

intf.ZUGFeRDInvoiceDescriptor1Writer.pas

+59-19
Original file line numberDiff line numberDiff line change
@@ -428,29 +428,69 @@ procedure TZUGFeRDInvoiceDescriptor1Writer.Save(
428428
Writer.WriteEndElement();
429429
end;
430430

431-
for var PaymentTerms: TZUGFeRDPaymentTerms in Descriptor.PaymentTermsList do
432-
begin
433-
Writer.WriteStartElement('ram:SpecifiedTradePaymentTerms');
434-
Writer.WriteOptionalElementString('ram:Description', PaymentTerms.Description);
435-
if (PaymentTerms.DueDate.HasValue) then
431+
case Descriptor.Profile of
432+
TZUGFeRDProfile.Unknown,
433+
TZUGFeRDProfile.Minimum: {do nothing};
434+
435+
TZUGFeRDProfile.Extended:
436436
begin
437-
Writer.WriteStartElement('ram:DueDateDateTime');
438-
_writeElementWithAttribute(Writer, 'udt:DateTimeString', 'format', '102', _formatDate(PaymentTerms.DueDate.Value));
439-
Writer.WriteEndElement(); // !ram:DueDateDateTime
437+
for var PaymentTerms: TZUGFeRDPaymentTerms in Descriptor.PaymentTermsList do
438+
begin
439+
Writer.WriteStartElement('ram:SpecifiedTradePaymentTerms');
440+
Writer.WriteOptionalElementString('ram:Description', PaymentTerms.Description);
441+
if (PaymentTerms.DueDate.HasValue) then
442+
begin
443+
Writer.WriteStartElement('ram:DueDateDateTime');
444+
_writeElementWithAttribute(Writer, 'udt:DateTimeString', 'format', '102', _formatDate(PaymentTerms.DueDate.Value));
445+
Writer.WriteEndElement(); // !ram:DueDateDateTime
446+
end;
447+
Writer.WriteOptionalElementString('ram:DirectDebitMandateID', _descriptor.PaymentMeans.SEPAMandateReference);
448+
_writeOptionalAmount(Writer, 'ram:PartialPaymentAmount', paymentTerms.PartialPaymentAmount);
449+
if PaymentTerms.PaymentTermsType.HasValue then
450+
begin
451+
if PaymentTerms.PaymentTermsType = TZUGFeRDPaymentTermsType.Skonto then
452+
Writer.WriteStartElement('ram:ApplicableTradePaymentDiscountTerms')
453+
else
454+
Writer.WriteStartElement('ram:ApplicableTradePaymentPenaltyTerms');
455+
if PaymentTerms.MaturityDate.HasValue then
456+
begin
457+
Writer.WriteStartElement('ram:BasisDateTime');
458+
_writeElementWithAttribute(Writer, 'udt:DateTimeString', 'format', '102', _formatDate(PaymentTerms.MaturityDate.Value));
459+
Writer.WriteEndElement(); // !ram:BasisDateTime
460+
end;
461+
if paymentTerms.DueDays.HasValue then
462+
_writeElementWithAttribute(Writer, 'ram:BasisPeriodMeasure', 'unitCode', TZUGFeRDQuantityCodesExtensions.EnumToString(TZUGFeRDQuantityCodes.DAY), IntToStr(paymentTerms.DueDays.Value));
463+
_writeOptionalAmount(Writer, 'ram:BasisAmount', paymentTerms.BaseAmount); // forceCurrency false by default
464+
Writer.WriteOptionalElementString('ram:CalculationPercent', _formatDecimal(paymentTerms.Percentage));
465+
if PaymentTerms.PaymentTermsType = TZUGFeRDPaymentTermsType.Skonto then
466+
_writeOptionalAmount(Writer, 'ram:ActualDiscountAmount', paymentTerms.ActualAmount)
467+
else
468+
_writeOptionalAmount(Writer, 'ram:ActualPenaltyAmount', paymentTerms.ActualAmount);
469+
Writer.WriteEndElement(); // !ram:ApplicableTradePaymentDiscountTerms or !ram:ApplicableTradePaymentPenaltyTerms
470+
end;
471+
Writer.WriteEndElement();
472+
end;
473+
if (_descriptor.PaymentTermsList.Count=0) and (_descriptor.PaymentMeans.SEPAMandateReference<>'') then
474+
begin
475+
Writer.WriteStartElement('ram:SpecifiedTradePaymentTerms');
476+
Writer.WriteOptionalElementString('ram:DirectDebitMandateID', _descriptor.PaymentMeans.SEPAMandateReference);
477+
Writer.WriteEndElement();
478+
end;
440479
end;
441-
Writer.WriteOptionalElementString('ram:DirectDebitMandateID', PaymentTerms.DirectDebitMandateID);
442-
//TODO PaymentTerms.PartialPaymentAmount
443-
//TODO PaymentTerms.ApplicableTradePaymentPenaltyTerms
444-
if (PaymentTerms.ApplicableTradePaymentDiscountTerms.BasisAmount <> 0.0) and
445-
(PaymentTerms.ApplicableTradePaymentDiscountTerms.CalculationPercent <> 0.0) then
480+
else
481+
for var PaymentTerms: TZUGFeRDPaymentTerms in Descriptor.PaymentTermsList do
446482
begin
447-
Writer.WriteStartElement('ram:ApplicableTradePaymentDiscountTerms');
448-
_writeOptionalAmount(Writer, 'ram:BasisAmount', PaymentTerms.ApplicableTradePaymentDiscountTerms.BasisAmount);
449-
_writeOptionalAmount(Writer, 'ram:CalculationPercent', PaymentTerms.ApplicableTradePaymentDiscountTerms.CalculationPercent,4);
450-
Writer.WriteEndElement();
451-
//TODO PaymentTerms.ApplicableTradePaymentDiscountTerms.ActualPenaltyAmount
483+
Writer.WriteStartElement('ram:SpecifiedTradePaymentTerms');
484+
Writer.WriteOptionalElementString('ram:Description', PaymentTerms.Description);
485+
if (PaymentTerms.DueDate.HasValue) then
486+
begin
487+
Writer.WriteStartElement('ram:DueDateDateTime');
488+
_writeElementWithAttribute(Writer, 'udt:DateTimeString', 'format', '102', _formatDate(PaymentTerms.DueDate.Value));
489+
Writer.WriteEndElement(); // !ram:DueDateDateTime
490+
end;
491+
Writer.WriteOptionalElementString('ram:DirectDebitMandateID', _descriptor.PaymentMeans.SEPAMandateReference);
492+
Writer.WriteEndElement(); // !ram:SpecifiedTradePaymentTerms
452493
end;
453-
Writer.WriteEndElement();
454494
end;
455495

456496
Writer.WriteStartElement('ram:SpecifiedTradeSettlementMonetarySummation');

intf.ZUGFeRDInvoiceDescriptor20Reader.pas

+27-8
Original file line numberDiff line numberDiff line change
@@ -360,14 +360,33 @@ function TZUGFeRDInvoiceDescriptor20Reader.Load(xmldocument : IXMLDocument): TZU
360360
begin
361361
var paymentTerm : TZUGFeRDPaymentTerms := TZUGFeRDPaymentTerms.Create;
362362
paymentTerm.Description := TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:Description');
363-
paymentTerm.DueDate:= TZUGFeRDXmlUtils.NodeAsDateTime(nodes[i], './/ram:DueDateDateTime');
364-
paymentTerm.DirectDebitMandateID := TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:DirectDebitMandateID');
365-
//TODO paymentTerm.PartialPaymentAmount
366-
//TODO paymentTerm.ApplicableTradePaymentPenaltyTerms
367-
paymentTerm.ApplicableTradePaymentDiscountTerms.BasisPeriodMeasure := TZUGFeRDXmlUtils.NodeAsDouble(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisPeriodMeasure');
368-
paymentTerm.ApplicableTradePaymentDiscountTerms.UnitCode := TZUGFeRDQuantityCodesExtensions.FromString(TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisPeriodMeasure/@unitCode'));
369-
paymentTerm.ApplicableTradePaymentDiscountTerms.BasisAmount := TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisAmount');
370-
paymentTerm.ApplicableTradePaymentDiscountTerms.CalculationPercent := TZUGFeRDXmlUtils.NodeAsDouble(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:CalculationPercent');
363+
paymentTerm.DueDate:= TZUGFeRDXmlUtils.NodeAsDateTime(nodes[i], './/ram:DueDateDateTime/udt:DateTimeString');
364+
paymentTerm.PartialPaymentAmount:= TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:PartialPaymentAmount');
365+
var discountPercent: ZUGFeRDNullable<Double> := TZUGFeRDXmlUtils.NodeAsDouble(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:CalculationPercent');
366+
var penaltyPercent: ZUGFeRDNullable<Double> := TZUGFeRDXmlUtils.NodeAsDouble(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:CalculationPercent');
367+
var Days: ZUGFeRDNullable<Integer>;
368+
if discountPercent.HasValue then
369+
begin
370+
paymentTerm.PaymentTermsType:= TZUGFeRDPaymentTermsType.Skonto;
371+
paymentTerm.Percentage:= discountPercent;
372+
if TZUGFeRDQuantityCodes.DAY = TZUGFeRDQuantityCodesExtensions.FromString(TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisPeriodMeasure/@unitCode')) then
373+
paymentTerm.DueDays:= TZUGFeRDXmlUtils.NodeAsInt(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisPeriodMeasure');
374+
paymentTerm.MaturityDate:= TZUGFeRDXmlUtils.NodeAsDateTime(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisDateTime/udt:DateTimeString'); //BT-X-282-0
375+
paymentTerm.BaseAmount:= TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:BasisAmount');
376+
paymentTerm.ActualAmount:= TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:ApplicableTradePaymentDiscountTerms/ram:ActualDiscountAmount');
377+
end
378+
else
379+
if penaltyPercent.HasValue then
380+
begin
381+
paymentTerm.PaymentTermsType:= TZUGFeRDPaymentTermsType.Verzug;
382+
paymentTerm.Percentage:= penaltyPercent;
383+
if TZUGFeRDQuantityCodes.DAY = TZUGFeRDQuantityCodesExtensions.FromString(TZUGFeRDXmlUtils.NodeAsString(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:BasisPeriodMeasure/@unitCode')) then
384+
paymentTerm.DueDays:= TZUGFeRDXmlUtils.NodeAsInt(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:BasisPeriodMeasure');
385+
paymentTerm.MaturityDate:= TZUGFeRDXmlUtils.NodeAsDateTime(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:BasisDateTime/udt:DateTimeString'); // BT-X-276-0
386+
paymentTerm.BaseAmount:= TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:BasisAmount');
387+
paymentTerm.ActualAmount:= TZUGFeRDXmlUtils.NodeAsDecimal(nodes[i], './/ram:ApplicableTradePaymentPenaltyTerms/ram:ActualPenaltyAmount');
388+
end;
389+
371390
Result.PaymentTermsList.Add(paymentTerm);
372391
end;
373392

0 commit comments

Comments
 (0)