NS_RSM = "urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100"
NS_UDT = "urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100"
+NS_A = "urn:un:unece:uncefact:data:standard:UnqualifiedDataType:10"
NS_RAM = "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100"
NS_QDT = "urn:un:unece:uncefact:data:standard:QualifiedDataType:10"
BASIC = "BASIC"
+
from . import BASIC, COMFORT, EXTENDED, NS_RAM
from .elements import Element
from .fields import (
class LineApplicableTradeTax(Element):
- calculated_amount = CurrencyField(NS_RAM, "CalculatedAmount", required=True,
- profile=BASIC, _d="Steuerbetrag")
+ calculated_amount = DecimalField(NS_RAM, "CalculatedAmount", required=True,
+ profile=BASIC, _d="Steuerbetrag")
type_code = StringField(NS_RAM, "TypeCode", required=True, profile=BASIC,
_d="Steuerart (Code)")
exemption_reason = StringField(NS_RAM, "ExemptionReason", required=False,
class ApplicableTradeTax(Element):
- calculated_amount = CurrencyField(NS_RAM, "CalculatedAmount", required=True,
+ calculated_amount = DecimalField(NS_RAM, "CalculatedAmount", required=True,
profile=BASIC, _d="Steuerbetrag")
type_code = StringField(NS_RAM, "TypeCode", required=True, profile=BASIC,
_d="Steuerart (Code)")
profile=COMFORT, _d="Grund der Steuerbefreiung (Freitext)")
exemption_reason_code = StringField(NS_RAM, "ExemptionReasonCode", required=False,
profile=EXTENDED, _d="Grund der Steuerbefreiung (Code)")
- basis_amount = CurrencyField(NS_RAM, "BasisAmount", required=True,
+ basis_amount = DecimalField(NS_RAM, "BasisAmount", required=True,
profile=BASIC, _d="Basisbetrag der Steuerberechnung")
- line_total_basis_amount = CurrencyField(NS_RAM, "LineTotalBasisAmount",
+ line_total_basis_amount = DecimalField(NS_RAM, "LineTotalBasisAmount",
required=False, profile=EXTENDED,
_d="Warenbetrag des Steuersatzes")
- allowance_charge_basis_amount = CurrencyField(NS_RAM, "AllowanceChargeBasisAmount",
+ allowance_charge_basis_amount = DecimalField(NS_RAM, "AllowanceChargeBasisAmount",
required=False, profile=EXTENDED,
_d="Gesamtbetrag Zu- und Abschläge des Steuersatzes")
category_code = StringField(NS_RAM, "CategoryCode", required=False,
class MonetarySummation(Element):
- line_total = CurrencyField(NS_RAM, "LineTotalAmount", required=True,
+ line_total = DecimalField(NS_RAM, "LineTotalAmount", required=True,
profile=BASIC, _d="Gesamtbetrag der Positionen")
- charge_total = CurrencyField(NS_RAM, "ChargeTotalAmount", required=True,
+ charge_total = DecimalField(NS_RAM, "ChargeTotalAmount", required=True,
profile=BASIC, _d="Gesamtbetrag der Zuschläge")
- allowance_total = CurrencyField(NS_RAM, "AllowanceTotalAmount", required=True,
+ allowance_total = DecimalField(NS_RAM, "AllowanceTotalAmount", required=True,
profile=BASIC, _d="Gesamtbetrag der Abschläge")
- tax_basis_total = CurrencyField(NS_RAM, "TaxBasisTotalAmount", required=True,
+ tax_basis_total = DecimalField(NS_RAM, "TaxBasisTotalAmount", required=True,
profile=BASIC, _d="Steuerbasisbetrag")
tax_total = CurrencyField(NS_RAM, "TaxTotalAmount", required=True,
profile=BASIC, _d="Steuergesamtbetrag")
- grand_total = CurrencyField(NS_RAM, "GrandTotalAmount", required=True,
+ grand_total = DecimalField(NS_RAM, "GrandTotalAmount", required=True,
profile=BASIC, _d="Bruttosumme")
- prepaid_total = CurrencyField(NS_RAM, "TotalPrepaidAmount", required=False,
+ prepaid_total = DecimalField(NS_RAM, "TotalPrepaidAmount", required=False,
profile=COMFORT, _d="Anzahlungsbetrag")
- due_amount = CurrencyField(NS_RAM, "DuePayableAmount", required=False,
+ due_amount = DecimalField(NS_RAM, "DuePayableAmount", required=False,
profile=COMFORT, _d="Zahlbetrag")
class Meta:
calculation_percent = DecimalField(NS_RAM, "CalculationPercent",
required=False, profile=EXTENDED,
_d="Rabatt in Prozent")
- basis_amount = CurrencyField(NS_RAM, "BasisAmount", required=False,
+ basis_amount = DecimalField(NS_RAM, "BasisAmount", required=False,
profile=EXTENDED, _d="Basisbetrag des Rabatts")
basis_quantity = QuantityField(NS_RAM, "BasisQuantity", required=False,
profile=EXTENDED, _d="Basismenge des Rabatts")
- actual_amount = CurrencyField(NS_RAM, "ActualAmount", required=True,
+ actual_amount = DecimalField(NS_RAM, "ActualAmount", required=True,
profile=COMFORT, _d="Betrag des Zu-/Abschlags")
reason_code = StringField(NS_RAM, "ReasonCode", required=False, profile=EXTENDED)
reason = StringField(NS_RAM, "Reason", required=False, profile=COMFORT)
return CurrencyElement(namespace=self.namespace, tag=self.tag)
def set_element(self, el, child):
- el.amount = child
+ el.amount = child[0]
+ el.currency = child[1]
def add_from_etree(self, root):
- self.add(root.text)
+ self.add((root.text, root.attrib['currencyID']))
class IDContainer(SimpleContainer):
from drafthorse.models.note import IncludedNote
-from . import BASIC, EXTENDED, NS_RAM, NS_UDT, NS_RSM
+from . import BASIC, EXTENDED, NS_RAM, NS_UDT, NS_RSM, NS_QDT, NS_A
from .elements import Element
from .fields import (
DateTimeField, Field, IndicatorField, MultiField, MultiStringField,
def __init__(self):
super().__init__()
- ET.register_namespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")
+ ET.register_namespace("a", NS_A)
ET.register_namespace("rsm", NS_RSM)
+ ET.register_namespace("qdt", NS_QDT)
ET.register_namespace("ram", NS_RAM)
+ ET.register_namespace("xsi", "http://www.w3.org/2001/XMLSchema")
ET.register_namespace("udt", NS_UDT)
class Meta:
class CurrencyElement(StringElement):
- def __init__(self, namespace, tag, amount=""):
+ def __init__(self, namespace, tag, amount="", currency="EUR"):
super().__init__(namespace, tag)
self.amount = amount
+ self.currency = currency
def to_etree(self):
node = self._etree_node()
node.text = str(self.amount)
+ node.attrib["currencyID"] = self.currency
return node
def from_etree(self, root):
self.amount = Decimal(root.text)
+ self.currency = root.attrib.get('currencyID', 'EUR')
return self
def __str__(self):
- return self.amount
+ return "{} {}".format(self.amount, self.currency)
class ClassificationElement(StringElement):
if instance._data.get(self.name, None) is None:
instance._data[self.name] = self.initialize()
- instance._data[self.name].amount = value
+ if not isinstance(value, (tuple, list)):
+ raise TypeError("Please pass a 2-tuple of including amount and currency.")
+
+ instance._data[self.name].amount = value[0]
+ instance._data[self.name].currency = value[1]
def initialize(self):
return self.cls(self.namespace, self.tag)
return self.cls(child_type=str, namespace=self.namespace, tag=self.tag)
-class MultiCurrencyField(Field):
+class MultiDecimalField(Field):
def __init__(self, namespace, tag, default=False, required=False, profile=BASIC, _d=None):
super().__init__(CurrencyContainer, default, required, profile, _d)
self.namespace = namespace
from . import BASIC, COMFORT, EXTENDED, NS_RAM
from .elements import Element
from .fields import (
- AgencyIDField, CurrencyField, DateTimeField, DecimalField, Field,
- MultiCurrencyField, MultiStringField, QuantityField, StringField,
+ AgencyIDField, DecimalField, DateTimeField, DecimalField, Field,
+ MultiDecimalField, MultiStringField, QuantityField, StringField,
)
profile=EXTENDED, _d="Bezugsdatum der Fälligkeit")
basis_period_measure = QuantityField(NS_RAM, "BasisPeriodMeasure", required=False,
profile=EXTENDED, _d="Fälligkeitszeitraum")
- basis_amount = CurrencyField(NS_RAM, "BasisAmount", required=False,
+ basis_amount = DecimalField(NS_RAM, "BasisAmount", required=False,
profile=EXTENDED, _d="Basisbetrag des Zahlungszuschlags")
calculation_percent = DecimalField(NS_RAM, "CalculationPercent", required=False,
profile=EXTENDED, _d="Prozentwert des Zahlungszuschlags")
- actual_amount = CurrencyField(NS_RAM, "ActualPenaltyAmount", required=False,
+ actual_amount = DecimalField(NS_RAM, "ActualPenaltyAmount", required=False,
profile=EXTENDED, _d="Betrag des Zahlungszuschlags")
class Meta:
profile=EXTENDED, _d="Bezugsdatum der Fälligkeit")
basis_period_measure = QuantityField(NS_RAM, "BasisPeriodMeasure", required=False,
profile=EXTENDED, _d="Fälligkeitszeitraum")
- basis_amount = CurrencyField(NS_RAM, "BasisAmount", required=False,
+ basis_amount = DecimalField(NS_RAM, "BasisAmount", required=False,
profile=EXTENDED, _d="Basisbetrag des Zahlungsabschlags")
calculation_percent = DecimalField(NS_RAM, "CalculationPercent", required=False,
profile=EXTENDED, _d="Prozentwert des Zahlungsabschlags")
- actual_amount = CurrencyField(NS_RAM, "ActualDiscountAmount", required=False,
+ actual_amount = DecimalField(NS_RAM, "ActualDiscountAmount", required=False,
profile=EXTENDED, _d="Betrag des Zahlungsabschlags")
class Meta:
_d="Freitext der Zahlungsbedingungen")
due = DateTimeField(NS_RAM, "DueDateDateTime", required=False, profile=COMFORT,
_d="Fälligkeitsdatum")
- partial_amount = MultiCurrencyField(NS_RAM, "PartialPaymentAmount", profile=EXTENDED,
+ partial_amount = MultiDecimalField(NS_RAM, "PartialPaymentAmount", profile=EXTENDED,
required=False, _d="Betrag der Teilzahlung")
penalty_terms = Field(PaymentPenaltyTerms, required=False, profile=EXTENDED,
_d="Detailinformationen zu Zahlungszuschlägen")
)
from .delivery import TradeDelivery
from .elements import Element
-from .fields import CurrencyField, Field, MultiField, StringField
+from .fields import DecimalField, Field, MultiField, StringField
from .party import (
BuyerTradeParty, EndUserTradeParty, InvoiceeTradeParty, PayeeTradeParty,
SellerTradeParty,
class LogisticsServiceCharge(Element):
description = StringField(NS_RAM, "Description", required=True, profile=COMFORT,
_d="Identifikation der Servicegebühr")
- applied_amount = CurrencyField(NS_RAM, "AppliedAmount", required=True,
+ applied_amount = DecimalField(NS_RAM, "AppliedAmount", required=True,
profile=COMFORT, _d="Betrag der Servicegebühr")
trade_tax = MultiField(AppliedTradeTax, required=False, profile=COMFORT)
from .delivery import SupplyChainEvent
from .elements import Element
from .fields import (
- CurrencyField, Field, MultiField, QuantityField, StringField,
+ DecimalField, Field, MultiField, QuantityField, StringField,
)
from .note import IncludedNote
from .party import ShipToTradeParty, UltimateShipToTradeParty
class GrossPrice(Element):
- amount = CurrencyField(NS_RAM, "ChargeAmount", required=True, profile=COMFORT,
+ amount = DecimalField(NS_RAM, "ChargeAmount", required=True, profile=COMFORT,
_d="Bruttopreis")
basis_quantity = QuantityField(NS_RAM, "BasisQuantity", required=False,
profile=COMFORT, _d="Preisbasismenge")
class NetPrice(Element):
- amount = CurrencyField(NS_RAM, "ChargeAmount", required=True, profile=COMFORT)
+ amount = DecimalField(NS_RAM, "ChargeAmount", required=True, profile=COMFORT)
basis_quantity = QuantityField(NS_RAM, "BasisQuantity", required=False,
profile=COMFORT, _d="Preisbasismenge")
class LineSummation(Element):
- total_amount = CurrencyField(NS_RAM, "LineTotalAmount", required=True,
+ total_amount = DecimalField(NS_RAM, "LineTotalAmount", required=True,
profile=COMFORT)
- total_allowance_charge = CurrencyField(NS_RAM, "TotalAllowanceChargeAmount",
+ total_allowance_charge = DecimalField(NS_RAM, "TotalAllowanceChargeAmount",
required=False, profile=EXTENDED, _d="Gesamtbetrag der Zu- und Abschläge")
class Meta: