Skip to content

Commit 0acfc3c

Browse files
feat: Refactor trade allowance/charge writing logic.
Extracted redundant logic into a new private method `_WriteItemLevelSpecifiedTradeAllowanceCharge` to improve code readability and maintainability. Simplified loop structure by reusing this method for both trade allowances and trade charges.
1 parent 9112b02 commit 0acfc3c

File tree

1 file changed

+45
-28
lines changed

1 file changed

+45
-28
lines changed

ZUGFeRD/InvoiceDescriptor22UBLWriter.cs

+45-28
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
using System.Collections.Generic;
2222
using System.IO;
2323
using System.Linq;
24-
using System.Xml.Linq;
2524

2625
namespace s2industries.ZUGFeRD
2726
{
@@ -654,35 +653,14 @@ private void _WriteTradeLineItem(TradeLineItem tradeLineItem, bool isInvoice = t
654653
}
655654
}
656655

656+
foreach (var specifiedTradeAllowanceCharge in tradeLineItem.GetSpecifiedTradeAllowances())
657+
{
658+
_WriteItemLevelSpecifiedTradeAllowanceCharge(specifiedTradeAllowanceCharge);
659+
}
660+
657661
foreach (var specifiedTradeAllowanceCharge in tradeLineItem.GetSpecifiedTradeCharges())
658662
{
659-
Writer.WriteStartElement("cac", "AllowanceCharge");
660-
Writer.WriteElementString("cbc", "ChargeIndicator",
661-
specifiedTradeAllowanceCharge.ChargeIndicator ? "true" : "false"); // BG-28-0
662-
Writer.WriteOptionalElementString("cbc", "AllowanceChargeReasonCode",
663-
specifiedTradeAllowanceCharge.ReasonCode.EnumToString()); // BT-140, BT-145
664-
Writer.WriteOptionalElementString("cbc", "AllowanceChargeReason",
665-
specifiedTradeAllowanceCharge.Reason); // BT-139, BT-144
666-
667-
if (specifiedTradeAllowanceCharge.ChargePercentage.HasValue)
668-
{
669-
Writer.WriteOptionalElementString("cbc", "MultiplierFactorNumeric",
670-
_formatDecimal(specifiedTradeAllowanceCharge.ChargePercentage));
671-
}
672-
673-
Writer.WriteStartElement("cbc", "Amount");
674-
Writer.WriteAttributeString("currencyID", this.Descriptor.Currency.EnumToString());
675-
Writer.WriteValue(_formatDecimal(specifiedTradeAllowanceCharge.ActualAmount));
676-
Writer.WriteEndElement(); // !Amount
677-
if (specifiedTradeAllowanceCharge.BasisAmount.HasValue)
678-
{
679-
Writer.WriteStartElement("cbc", "BaseAmount"); // BT-137, BT-142
680-
Writer.WriteAttributeString("currencyID", this.Descriptor.Currency.EnumToString());
681-
Writer.WriteValue(_formatDecimal(specifiedTradeAllowanceCharge.BasisAmount));
682-
Writer.WriteEndElement(); // !BaseAmount
683-
}
684-
685-
Writer.WriteEndElement(); // !AllowanceCharge
663+
_WriteItemLevelSpecifiedTradeAllowanceCharge(specifiedTradeAllowanceCharge);
686664
}
687665

688666
Writer.WriteStartElement("cac", "Item");
@@ -785,6 +763,45 @@ private void _WriteTradeLineItem(TradeLineItem tradeLineItem, bool isInvoice = t
785763
Writer.WriteEndElement(); //!InvoiceLine
786764
}
787765

766+
private void _WriteItemLevelSpecifiedTradeAllowanceCharge(AbstractTradeAllowanceCharge specifiedTradeAllowanceCharge)
767+
{
768+
Writer.WriteStartElement("cac", "AllowanceCharge");
769+
Writer.WriteElementString("cbc", "ChargeIndicator",
770+
specifiedTradeAllowanceCharge.ChargeIndicator ? "true" : "false"); // BG-28-0
771+
switch (specifiedTradeAllowanceCharge)
772+
{
773+
case TradeAllowance allowance when allowance.ReasonCode != null:
774+
Writer.WriteOptionalElementString("ram", "ReasonCode", allowance.ReasonCode.EnumToString()); // BT-140
775+
break;
776+
case TradeCharge charge when charge.ReasonCode != null:
777+
Writer.WriteOptionalElementString("ram", "ReasonCode", charge.ReasonCode.EnumToString()); // BT-145
778+
break;
779+
}
780+
781+
Writer.WriteOptionalElementString("cbc", "AllowanceChargeReason",
782+
specifiedTradeAllowanceCharge.Reason); // BT-139, BT-144
783+
784+
if (specifiedTradeAllowanceCharge.ChargePercentage.HasValue)
785+
{
786+
Writer.WriteOptionalElementString("cbc", "MultiplierFactorNumeric",
787+
_formatDecimal(specifiedTradeAllowanceCharge.ChargePercentage));
788+
}
789+
790+
Writer.WriteStartElement("cbc", "Amount");
791+
Writer.WriteAttributeString("currencyID", this.Descriptor.Currency.EnumToString());
792+
Writer.WriteValue(_formatDecimal(specifiedTradeAllowanceCharge.ActualAmount));
793+
Writer.WriteEndElement(); // !Amount
794+
if (specifiedTradeAllowanceCharge.BasisAmount.HasValue)
795+
{
796+
Writer.WriteStartElement("cbc", "BaseAmount"); // BT-137, BT-142
797+
Writer.WriteAttributeString("currencyID", this.Descriptor.Currency.EnumToString());
798+
Writer.WriteValue(_formatDecimal(specifiedTradeAllowanceCharge.BasisAmount));
799+
Writer.WriteEndElement(); // !BaseAmount
800+
}
801+
802+
Writer.WriteEndElement(); // !AllowanceCharge
803+
}
804+
788805

789806
private void _WriteCommodityClassification(ProfileAwareXmlTextWriter writer, List<DesignatedProductClassification> designatedProductClassifications)
790807
{

0 commit comments

Comments
 (0)