mikrowerk-edi-invoicing 0.2.0__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mikrowerk_edi_invoicing-0.2.0/mikrowerk_edi_invoicing.egg-info → mikrowerk_edi_invoicing-0.3.0}/PKG-INFO +2 -3
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/__init__.py +17 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/__init__.py +6 -0
- mikrowerk_edi_invoicing-0.2.0/edi_invoice_parser/x_mapper/drafthorse_elements_helper.py → mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/dom_elements_helper.py +7 -7
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/__init__.py +10 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/accounting.py +246 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/container.py +94 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/delivery.py +65 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/document.py +112 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/elements.py +432 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/fields.py +343 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/note.py +13 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/party.py +198 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/payment.py +207 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/product.py +105 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/references.py +145 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/trade.py +225 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/models/tradelines.py +188 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/pdf.py +353 -0
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/utils.py +22 -0
- {mikrowerk_edi_invoicing-0.2.0/edi_invoice_parser/x_mapper → mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser}/xml_cii_dom_parser.py +4 -5
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/cii_dom_parser/xmp_schema.py +86 -0
- {mikrowerk_edi_invoicing-0.2.0/edi_invoice_parser/x_mapper → mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser}/cross_industry_invoice_mapper.py +12 -4
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/model/__init__.py +4 -0
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0}/edi_invoice_parser/model/x_rechnung.py +4 -1
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/tests/__init__.py +3 -0
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0}/edi_invoice_parser/tests/test_parse_x_rechnung.py +1 -1
- mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/ubl_sax_parser/__init__.py +3 -0
- {mikrowerk_edi_invoicing-0.2.0/edi_invoice_parser/x_mapper → mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/ubl_sax_parser}/xml_ubl_sax_parser.py +32 -3
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0/mikrowerk_edi_invoicing.egg-info}/PKG-INFO +2 -3
- mikrowerk_edi_invoicing-0.3.0/mikrowerk_edi_invoicing.egg-info/SOURCES.txt +72 -0
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0}/mikrowerk_edi_invoicing.egg-info/requires.txt +0 -1
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0}/setup.py +3 -4
- mikrowerk_edi_invoicing-0.2.0/edi_invoice_parser/model/__init__.py +0 -3
- mikrowerk_edi_invoicing-0.2.0/edi_invoice_parser/tests/__init__.py +0 -4
- mikrowerk_edi_invoicing-0.2.0/edi_invoice_parser/util/__init__.py +0 -0
- mikrowerk_edi_invoicing-0.2.0/edi_invoice_parser/x_mapper/__init__.py +0 -8
- mikrowerk_edi_invoicing-0.2.0/mikrowerk_edi_invoicing.egg-info/SOURCES.txt +0 -36
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0}/LICENSE +0 -0
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0}/README.md +0 -0
- {mikrowerk_edi_invoicing-0.2.0/edi_invoice_parser/x_mapper → mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/model}/xml_abstract_x_rechnung_parser.py +0 -0
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0}/edi_invoice_parser/tests/test_iban_handling.py +0 -0
- {mikrowerk_edi_invoicing-0.2.0/edi_invoice_parser → mikrowerk_edi_invoicing-0.3.0/edi_invoice_parser/util}/__init__.py +0 -0
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0}/edi_invoice_parser/util/file_helper.py +0 -0
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0}/mikrowerk_edi_invoicing.egg-info/dependency_links.txt +0 -0
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0}/mikrowerk_edi_invoicing.egg-info/top_level.txt +0 -0
- {mikrowerk_edi_invoicing-0.2.0 → mikrowerk_edi_invoicing-0.3.0}/setup.cfg +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: mikrowerk_edi_invoicing
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Parser for EDI invoices in CII or UBL format
|
|
5
5
|
Author: Mikrowerk a Gammadata Division
|
|
6
6
|
Author-email: info@mikrowerk.com
|
|
7
|
-
License: Affero
|
|
7
|
+
License: GNU Affero General Public License v3
|
|
8
8
|
Classifier: Programming Language :: Python :: 3
|
|
9
9
|
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
|
|
10
10
|
Classifier: Operating System :: OS Independent
|
|
@@ -18,7 +18,6 @@ Requires-Dist: isort
|
|
|
18
18
|
Requires-Dist: black
|
|
19
19
|
Requires-Dist: coverage
|
|
20
20
|
Requires-Dist: codecov
|
|
21
|
-
Requires-Dist: drafthorse~=2.4.0
|
|
22
21
|
Requires-Dist: factur-x==3.6
|
|
23
22
|
Requires-Dist: jsonpickle~=4.0.1
|
|
24
23
|
Requires-Dist: parameterized
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from .cross_industry_invoice_mapper import parse_and_map_x_rechnung
|
|
2
|
+
from .model.x_rechnung import (XRechnung, XRechnungTradeParty, XRechnungTradeAddress, XRechnungTradeContact,
|
|
3
|
+
XRechnungPaymentMeans, XRechnungBankAccount, XRechnungCurrency, XRechnungTradeLine,
|
|
4
|
+
XRechnungAppliedTradeTax, XRechnungFinancialCard)
|
|
5
|
+
|
|
6
|
+
__all__ = ["parse_and_map_x_rechnung",
|
|
7
|
+
"XRechnung",
|
|
8
|
+
"XRechnungTradeParty",
|
|
9
|
+
"XRechnungTradeAddress",
|
|
10
|
+
"XRechnungTradeContact",
|
|
11
|
+
"XRechnungPaymentMeans",
|
|
12
|
+
"XRechnungBankAccount",
|
|
13
|
+
"XRechnungCurrency",
|
|
14
|
+
"XRechnungTradeLine",
|
|
15
|
+
"XRechnungAppliedTradeTax",
|
|
16
|
+
"XRechnungFinancialCard"
|
|
17
|
+
]
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
from
|
|
5
|
-
from
|
|
6
|
-
from
|
|
7
|
-
from
|
|
1
|
+
from .models.elements import (StringElement, DirectDateTimeElement, DateTimeElement, DecimalElement,
|
|
2
|
+
IndicatorElement, QuantityElement, CurrencyElement, ClassificationElement,
|
|
3
|
+
Container)
|
|
4
|
+
from .models.party import EmailURI, PhoneNumber, FaxNumber
|
|
5
|
+
from .models.note import IncludedNote
|
|
6
|
+
from .models.payment import PaymentTerms
|
|
7
|
+
from .models.container import IDContainer, StringContainer, CurrencyContainer
|
|
8
8
|
|
|
9
9
|
"""
|
|
10
10
|
Code zur Beschreibung des Datumsformats
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
NS_RSM = "urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100"
|
|
2
|
+
NS_UDT = "urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100"
|
|
3
|
+
NS_A = "urn:un:unece:uncefact:data:standard:QualifiedDataType:100"
|
|
4
|
+
NS_RAM = (
|
|
5
|
+
"urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100"
|
|
6
|
+
)
|
|
7
|
+
NS_QDT = "urn:un:unece:uncefact:data:standard:QualifiedDataType:100"
|
|
8
|
+
BASIC = "BASIC"
|
|
9
|
+
COMFORT = "COMFORT"
|
|
10
|
+
EXTENDED = "EXTENDED"
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
from . import BASIC, COMFORT, EXTENDED, NS_RAM
|
|
2
|
+
from .elements import Element
|
|
3
|
+
from .fields import (
|
|
4
|
+
CurrencyField,
|
|
5
|
+
DateTimeField,
|
|
6
|
+
DecimalField,
|
|
7
|
+
IndicatorField,
|
|
8
|
+
MultiCurrencyField,
|
|
9
|
+
MultiField,
|
|
10
|
+
QuantityField,
|
|
11
|
+
StringField,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BillingSpecifiedPeriod(Element):
|
|
16
|
+
description = StringField(
|
|
17
|
+
NS_RAM,
|
|
18
|
+
"Description",
|
|
19
|
+
required=True,
|
|
20
|
+
profile=COMFORT,
|
|
21
|
+
_d="Freitext der Zahlungsbedingungen",
|
|
22
|
+
)
|
|
23
|
+
start = DateTimeField(NS_RAM, "StartDateTime", required=True, profile=COMFORT)
|
|
24
|
+
end = DateTimeField(NS_RAM, "EndDateTime", required=True, profile=COMFORT)
|
|
25
|
+
|
|
26
|
+
class Meta:
|
|
27
|
+
namespace = NS_RAM
|
|
28
|
+
tag = "BillingSpecifiedPeriod"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ApplicableTradeTax(Element):
|
|
32
|
+
calculated_amount = DecimalField(
|
|
33
|
+
NS_RAM, "CalculatedAmount", required=True, profile=BASIC, _d="Steuerbetrag"
|
|
34
|
+
)
|
|
35
|
+
type_code = StringField(
|
|
36
|
+
NS_RAM, "TypeCode", required=True, profile=BASIC, _d="Steuerart (Code)"
|
|
37
|
+
)
|
|
38
|
+
exemption_reason = StringField(
|
|
39
|
+
NS_RAM,
|
|
40
|
+
"ExemptionReason",
|
|
41
|
+
required=False,
|
|
42
|
+
profile=BASIC,
|
|
43
|
+
_d="Grund der Steuerbefreiung (Freitext)",
|
|
44
|
+
)
|
|
45
|
+
basis_amount = DecimalField(
|
|
46
|
+
NS_RAM,
|
|
47
|
+
"BasisAmount",
|
|
48
|
+
required=True,
|
|
49
|
+
profile=BASIC,
|
|
50
|
+
_d="Basisbetrag der Steuerberechnung",
|
|
51
|
+
)
|
|
52
|
+
line_total_basis_amount = DecimalField(
|
|
53
|
+
NS_RAM,
|
|
54
|
+
"LineTotalBasisAmount",
|
|
55
|
+
required=False,
|
|
56
|
+
profile=EXTENDED,
|
|
57
|
+
_d="Warenbetrag des Steuersatzes",
|
|
58
|
+
)
|
|
59
|
+
allowance_charge_basis_amount = DecimalField(
|
|
60
|
+
NS_RAM,
|
|
61
|
+
"AllowanceChargeBasisAmount",
|
|
62
|
+
required=False,
|
|
63
|
+
profile=EXTENDED,
|
|
64
|
+
_d="Gesamtbetrag Zu- und Abschläge des Steuersatzes",
|
|
65
|
+
)
|
|
66
|
+
category_code = StringField(
|
|
67
|
+
NS_RAM,
|
|
68
|
+
"CategoryCode",
|
|
69
|
+
required=False,
|
|
70
|
+
profile=BASIC,
|
|
71
|
+
_d="Steuerkategorie (Wert)",
|
|
72
|
+
)
|
|
73
|
+
exemption_reason_code = StringField(
|
|
74
|
+
NS_RAM,
|
|
75
|
+
"ExemptionReasonCode",
|
|
76
|
+
required=False,
|
|
77
|
+
profile=BASIC,
|
|
78
|
+
_d="Grund der Steuerbefreiung (Code)",
|
|
79
|
+
)
|
|
80
|
+
tax_point_date = DateTimeField(
|
|
81
|
+
NS_RAM, "TaxPointDate", required=False, profile=COMFORT
|
|
82
|
+
)
|
|
83
|
+
due_date_type_code = StringField(
|
|
84
|
+
NS_RAM,
|
|
85
|
+
"DueDateTypeCode",
|
|
86
|
+
required=False,
|
|
87
|
+
profile=BASIC,
|
|
88
|
+
)
|
|
89
|
+
rate_applicable_percent = DecimalField(
|
|
90
|
+
NS_RAM, "RateApplicablePercent", required=True, profile=BASIC
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
class Meta:
|
|
94
|
+
namespace = NS_RAM
|
|
95
|
+
tag = "ApplicableTradeTax"
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class AccountingAccount(Element):
|
|
99
|
+
id = StringField(
|
|
100
|
+
NS_RAM, "ID", required=True, profile=EXTENDED, _d="Buchungsreferenz"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
class Meta:
|
|
104
|
+
namespace = NS_RAM
|
|
105
|
+
tag = "SpecifiedTradeAccountingAccount"
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class ReceivableAccountingAccount(Element):
|
|
109
|
+
id = StringField(
|
|
110
|
+
NS_RAM, "ID", required=True, profile=EXTENDED, _d="Buchungsreferenz"
|
|
111
|
+
)
|
|
112
|
+
type_code = StringField(NS_RAM, "TypeCode", required=True, profile=EXTENDED)
|
|
113
|
+
|
|
114
|
+
class Meta:
|
|
115
|
+
namespace = NS_RAM
|
|
116
|
+
tag = "ReceivableSpecifiedTradeAccountingAccount"
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class MonetarySummation(Element):
|
|
120
|
+
line_total = DecimalField(
|
|
121
|
+
NS_RAM,
|
|
122
|
+
"LineTotalAmount",
|
|
123
|
+
required=True,
|
|
124
|
+
profile=BASIC,
|
|
125
|
+
_d="Gesamtbetrag der Positionen",
|
|
126
|
+
)
|
|
127
|
+
charge_total = DecimalField(
|
|
128
|
+
NS_RAM,
|
|
129
|
+
"ChargeTotalAmount",
|
|
130
|
+
required=True,
|
|
131
|
+
profile=BASIC,
|
|
132
|
+
_d="Gesamtbetrag der Zuschläge",
|
|
133
|
+
)
|
|
134
|
+
allowance_total = DecimalField(
|
|
135
|
+
NS_RAM,
|
|
136
|
+
"AllowanceTotalAmount",
|
|
137
|
+
required=True,
|
|
138
|
+
profile=BASIC,
|
|
139
|
+
_d="Gesamtbetrag der Abschläge",
|
|
140
|
+
)
|
|
141
|
+
tax_basis_total = CurrencyField(
|
|
142
|
+
NS_RAM,
|
|
143
|
+
"TaxBasisTotalAmount",
|
|
144
|
+
required=True,
|
|
145
|
+
profile=BASIC,
|
|
146
|
+
_d="Steuerbasisbetrag",
|
|
147
|
+
)
|
|
148
|
+
tax_total = CurrencyField(
|
|
149
|
+
NS_RAM, "TaxTotalAmount", required=True, profile=BASIC, _d="Steuergesamtbetrag"
|
|
150
|
+
)
|
|
151
|
+
tax_total_other_currency = MultiCurrencyField(
|
|
152
|
+
NS_RAM, "TaxTotalAmount", profile=EXTENDED, _d="Steuergesamtbetrag"
|
|
153
|
+
)
|
|
154
|
+
rounding_amount = DecimalField(
|
|
155
|
+
NS_RAM,
|
|
156
|
+
"RoundingAmount",
|
|
157
|
+
required=False,
|
|
158
|
+
profile=COMFORT,
|
|
159
|
+
)
|
|
160
|
+
grand_total = CurrencyField(
|
|
161
|
+
NS_RAM, "GrandTotalAmount", required=True, profile=BASIC, _d="Bruttosumme"
|
|
162
|
+
)
|
|
163
|
+
prepaid_total = DecimalField(
|
|
164
|
+
NS_RAM,
|
|
165
|
+
"TotalPrepaidAmount",
|
|
166
|
+
required=False,
|
|
167
|
+
profile=COMFORT,
|
|
168
|
+
_d="Anzahlungsbetrag",
|
|
169
|
+
)
|
|
170
|
+
due_amount = DecimalField(
|
|
171
|
+
NS_RAM, "DuePayableAmount", required=False, profile=COMFORT, _d="Zahlbetrag"
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
class Meta:
|
|
175
|
+
namespace = NS_RAM
|
|
176
|
+
tag = "SpecifiedTradeSettlementHeaderMonetarySummation"
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class AppliedTradeTax(Element):
|
|
180
|
+
type_code = StringField(NS_RAM, "TypeCode", required=True, profile=COMFORT)
|
|
181
|
+
category_code = StringField(NS_RAM, "CategoryCode", required=True, profile=COMFORT)
|
|
182
|
+
rate_applicable_percent = DecimalField(
|
|
183
|
+
NS_RAM, "RateApplicablePercent", required=True, profile=COMFORT
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
class Meta:
|
|
187
|
+
namespace = NS_RAM
|
|
188
|
+
tag = "AppliedTradeTax"
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class CategoryTradeTax(AppliedTradeTax):
|
|
192
|
+
class Meta:
|
|
193
|
+
namespace = NS_RAM
|
|
194
|
+
tag = "CategoryTradeTax"
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
class TradeAllowanceCharge(Element):
|
|
198
|
+
indicator = IndicatorField(
|
|
199
|
+
NS_RAM,
|
|
200
|
+
"ChargeIndicator",
|
|
201
|
+
required=False,
|
|
202
|
+
profile=COMFORT,
|
|
203
|
+
_d="Schalter für Zu-/Abschlag",
|
|
204
|
+
)
|
|
205
|
+
sequence_numeric = DecimalField(
|
|
206
|
+
NS_RAM,
|
|
207
|
+
"SequenceNumeric",
|
|
208
|
+
required=False,
|
|
209
|
+
profile=EXTENDED,
|
|
210
|
+
_d="Berechnungsreihenfolge",
|
|
211
|
+
)
|
|
212
|
+
calculation_percent = DecimalField( # TODO: Should be deprecated?
|
|
213
|
+
NS_RAM,
|
|
214
|
+
"CalculationPercent",
|
|
215
|
+
required=False,
|
|
216
|
+
profile=COMFORT,
|
|
217
|
+
_d="Rabatt in Prozent",
|
|
218
|
+
)
|
|
219
|
+
basis_amount = DecimalField( # TODO: Should be deprecated?
|
|
220
|
+
NS_RAM,
|
|
221
|
+
"BasisAmount",
|
|
222
|
+
required=False,
|
|
223
|
+
profile=COMFORT,
|
|
224
|
+
_d="Basisbetrag des Rabatts",
|
|
225
|
+
)
|
|
226
|
+
basis_quantity = QuantityField(
|
|
227
|
+
NS_RAM,
|
|
228
|
+
"BasisQuantity",
|
|
229
|
+
required=False,
|
|
230
|
+
profile=EXTENDED,
|
|
231
|
+
_d="Basismenge des Rabatts",
|
|
232
|
+
)
|
|
233
|
+
actual_amount = DecimalField(
|
|
234
|
+
NS_RAM,
|
|
235
|
+
"ActualAmount",
|
|
236
|
+
required=True,
|
|
237
|
+
profile=COMFORT,
|
|
238
|
+
_d="Betrag des Zu-/Abschlags",
|
|
239
|
+
)
|
|
240
|
+
reason_code = StringField(NS_RAM, "ReasonCode", required=False, profile=COMFORT)
|
|
241
|
+
reason = StringField(NS_RAM, "Reason", required=False, profile=COMFORT)
|
|
242
|
+
trade_tax = MultiField(CategoryTradeTax, required=False, profile=COMFORT)
|
|
243
|
+
|
|
244
|
+
class Meta:
|
|
245
|
+
namespace = NS_RAM
|
|
246
|
+
tag = "SpecifiedTradeAllowanceCharge"
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
class Container:
|
|
2
|
+
def __init__(self, child_type):
|
|
3
|
+
super().__init__()
|
|
4
|
+
self.children = []
|
|
5
|
+
self.child_type = child_type
|
|
6
|
+
|
|
7
|
+
def add(self, item):
|
|
8
|
+
if isinstance(self.child_type, type) and not isinstance(item, self.child_type):
|
|
9
|
+
raise TypeError("{} is not of type {}".format(item, self.child_type))
|
|
10
|
+
self.children.append(item)
|
|
11
|
+
|
|
12
|
+
def append_to(self, node):
|
|
13
|
+
for child in self.children:
|
|
14
|
+
child.append_to(node)
|
|
15
|
+
|
|
16
|
+
def get_tag(self):
|
|
17
|
+
return "{%s}%s" % (self.child_type.Meta.namespace, self.child_type.Meta.tag)
|
|
18
|
+
|
|
19
|
+
def empty_element(self):
|
|
20
|
+
return self.child_type()
|
|
21
|
+
|
|
22
|
+
def add_from_etree(self, root):
|
|
23
|
+
childel = self.empty_element()
|
|
24
|
+
childel.from_etree(root)
|
|
25
|
+
self.add(childel)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class SimpleContainer(Container):
|
|
29
|
+
def __init__(self, child_type, namespace, tag):
|
|
30
|
+
super().__init__(child_type)
|
|
31
|
+
self.namespace = namespace
|
|
32
|
+
self.tag = tag
|
|
33
|
+
|
|
34
|
+
def get_tag(self):
|
|
35
|
+
return "{%s}%s" % (self.namespace, self.tag)
|
|
36
|
+
|
|
37
|
+
def empty_element(self):
|
|
38
|
+
raise NotImplementedError()
|
|
39
|
+
|
|
40
|
+
def set_element(self, el, child):
|
|
41
|
+
raise NotImplementedError()
|
|
42
|
+
|
|
43
|
+
def append_to(self, node):
|
|
44
|
+
for child in self.children:
|
|
45
|
+
el = self.empty_element()
|
|
46
|
+
self.set_element(el, child)
|
|
47
|
+
el.append_to(node)
|
|
48
|
+
|
|
49
|
+
def add_from_etree(self, root):
|
|
50
|
+
self.add(root.text)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class CurrencyContainer(SimpleContainer):
|
|
54
|
+
def empty_element(self):
|
|
55
|
+
from .elements import CurrencyElement
|
|
56
|
+
|
|
57
|
+
return CurrencyElement(namespace=self.namespace, tag=self.tag)
|
|
58
|
+
|
|
59
|
+
def set_element(self, el, child):
|
|
60
|
+
el._amount = child[0]
|
|
61
|
+
el._currency = child[1]
|
|
62
|
+
|
|
63
|
+
def add_from_etree(self, root):
|
|
64
|
+
if root.attrib.get("currencyID"):
|
|
65
|
+
self.add((root.text, root.attrib["currencyID"]))
|
|
66
|
+
else:
|
|
67
|
+
self.add(root.text)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class IDContainer(SimpleContainer):
|
|
71
|
+
def empty_element(self):
|
|
72
|
+
from .elements import IDElement
|
|
73
|
+
|
|
74
|
+
return IDElement(namespace=self.namespace, tag=self.tag)
|
|
75
|
+
|
|
76
|
+
def set_element(self, el, child):
|
|
77
|
+
el._text = child[1]
|
|
78
|
+
el._scheme_id = child[0]
|
|
79
|
+
|
|
80
|
+
def add_from_etree(self, root):
|
|
81
|
+
self.add((root.attrib["schemeID"], root.text))
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class StringContainer(SimpleContainer):
|
|
85
|
+
def empty_element(self):
|
|
86
|
+
from .elements import StringElement
|
|
87
|
+
|
|
88
|
+
return StringElement(namespace=self.namespace, tag=self.tag)
|
|
89
|
+
|
|
90
|
+
def set_element(self, el, child):
|
|
91
|
+
el._text = child
|
|
92
|
+
|
|
93
|
+
def add_from_etree(self, root):
|
|
94
|
+
self.add(root.text)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
from . import BASIC, EXTENDED, NS_RAM
|
|
2
|
+
from .elements import Element
|
|
3
|
+
from .fields import DateTimeField, Field, StringField
|
|
4
|
+
from .party import (
|
|
5
|
+
ShipFromTradeParty,
|
|
6
|
+
ShipToTradeParty,
|
|
7
|
+
UltimateShipToTradeParty,
|
|
8
|
+
)
|
|
9
|
+
from .references import (
|
|
10
|
+
DeliveryNoteReferencedDocument,
|
|
11
|
+
DespatchAdviceReferencedDocument,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class SupplyChainEvent(Element):
|
|
16
|
+
occurrence = DateTimeField(
|
|
17
|
+
NS_RAM,
|
|
18
|
+
"OccurrenceDateTime",
|
|
19
|
+
required=False,
|
|
20
|
+
profile=BASIC,
|
|
21
|
+
_d="Tatsächlicher Lieferungszeitpunkt",
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
class Meta:
|
|
25
|
+
namespace = NS_RAM
|
|
26
|
+
tag = "ActualDeliverySupplyChainEvent"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class LogisticsTransportMovement(Element):
|
|
30
|
+
mode_code = StringField(NS_RAM, "ModeCode", required=False, profile=EXTENDED)
|
|
31
|
+
|
|
32
|
+
class Meta:
|
|
33
|
+
namespace = NS_RAM
|
|
34
|
+
tag = "SpecifiedLogisticsTransportMovement"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class SupplyChainConsignment(Element): # TODO: Deprecated?
|
|
38
|
+
movement = Field(LogisticsTransportMovement, required=False, profile=EXTENDED)
|
|
39
|
+
|
|
40
|
+
class Meta:
|
|
41
|
+
namespace = NS_RAM
|
|
42
|
+
tag = "RelatedSupplyChainConsignment"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class TradeDelivery(Element):
|
|
46
|
+
consignment = Field(
|
|
47
|
+
SupplyChainConsignment,
|
|
48
|
+
default=False,
|
|
49
|
+
required=False,
|
|
50
|
+
_d="Detailinformationen zur Konsignation oder Sendung",
|
|
51
|
+
)
|
|
52
|
+
ship_to = Field(ShipToTradeParty, required=False, profile=EXTENDED)
|
|
53
|
+
ultimate_ship_to = Field(UltimateShipToTradeParty, required=False, profile=EXTENDED)
|
|
54
|
+
ship_from = Field(ShipFromTradeParty, required=False, profile=EXTENDED)
|
|
55
|
+
event = Field(SupplyChainEvent, required=False, profile=BASIC)
|
|
56
|
+
despatch_advice = Field(
|
|
57
|
+
DespatchAdviceReferencedDocument, required=False, profile=EXTENDED
|
|
58
|
+
)
|
|
59
|
+
delivery_note = Field(
|
|
60
|
+
DeliveryNoteReferencedDocument, required=False, profile=EXTENDED
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
class Meta:
|
|
64
|
+
namespace = NS_RAM
|
|
65
|
+
tag = "ApplicableHeaderTradeDelivery"
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import xml.etree.cElementTree as ET
|
|
2
|
+
|
|
3
|
+
from .note import IncludedNote
|
|
4
|
+
|
|
5
|
+
from . import BASIC, EXTENDED, NS_A, NS_QDT, NS_RAM, NS_RSM, NS_UDT
|
|
6
|
+
from .elements import Element
|
|
7
|
+
from .fields import (
|
|
8
|
+
DateTimeField,
|
|
9
|
+
Field,
|
|
10
|
+
IndicatorField,
|
|
11
|
+
MultiField,
|
|
12
|
+
MultiStringField,
|
|
13
|
+
StringField,
|
|
14
|
+
)
|
|
15
|
+
from .trade import TradeTransaction
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class GuidelineDocumentContextParameter(Element):
|
|
19
|
+
id = StringField(NS_RAM, "ID")
|
|
20
|
+
|
|
21
|
+
class Meta:
|
|
22
|
+
namespace = NS_RAM
|
|
23
|
+
tag = "GuidelineSpecifiedDocumentContextParameter"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class BusinessDocumentContextParameter(Element):
|
|
27
|
+
id = StringField(NS_RAM, "ID")
|
|
28
|
+
|
|
29
|
+
class Meta:
|
|
30
|
+
namespace = NS_RAM
|
|
31
|
+
tag = "BusinessProcessSpecifiedDocumentContextParameter"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class DocumentContext(Element):
|
|
35
|
+
test_indicator = IndicatorField(
|
|
36
|
+
NS_RAM, "TestIndicator", required=False, profile=EXTENDED, _d="Testkennzeichen"
|
|
37
|
+
)
|
|
38
|
+
business_parameter = Field(
|
|
39
|
+
BusinessDocumentContextParameter,
|
|
40
|
+
required=False,
|
|
41
|
+
profile=EXTENDED,
|
|
42
|
+
_d="Geschäftsprozess, Wert",
|
|
43
|
+
)
|
|
44
|
+
guideline_parameter = Field(
|
|
45
|
+
GuidelineDocumentContextParameter,
|
|
46
|
+
required=True,
|
|
47
|
+
profile=BASIC,
|
|
48
|
+
_d="Anwendungsempfehlung",
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
class Meta:
|
|
52
|
+
namespace = NS_RSM
|
|
53
|
+
tag = "ExchangedDocumentContext"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class EffectivePeriod(Element):
|
|
57
|
+
complete = DateTimeField(NS_RAM, "CompleteDateTime")
|
|
58
|
+
|
|
59
|
+
class Meta:
|
|
60
|
+
namespace = NS_RAM
|
|
61
|
+
tag = "EffectiveSpecifiedPeriod"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class Header(Element):
|
|
65
|
+
id = StringField(NS_RAM, "ID", required=True, profile=BASIC, _d="Rechnungsnummer")
|
|
66
|
+
name = StringField(
|
|
67
|
+
NS_RAM, "Name", required=True, profile=BASIC, _d="Dokumentenart (Freitext)"
|
|
68
|
+
)
|
|
69
|
+
type_code = StringField(
|
|
70
|
+
NS_RAM, "TypeCode", required=True, profile=BASIC, _d="Dokumentenart (Code)"
|
|
71
|
+
)
|
|
72
|
+
issue_date_time = DateTimeField(
|
|
73
|
+
NS_RAM, "IssueDateTime", required=True, profile=BASIC, _d="Rechnungsdatum"
|
|
74
|
+
)
|
|
75
|
+
copy_indicator = IndicatorField(
|
|
76
|
+
NS_RAM,
|
|
77
|
+
"CopyIndicator",
|
|
78
|
+
required=False,
|
|
79
|
+
profile=EXTENDED,
|
|
80
|
+
_d="Indikator Original/Kopie",
|
|
81
|
+
)
|
|
82
|
+
languages = MultiStringField(NS_RAM, "LanguageID", required=False, profile=EXTENDED)
|
|
83
|
+
effective_period = Field(
|
|
84
|
+
EffectivePeriod,
|
|
85
|
+
required=False,
|
|
86
|
+
profile=EXTENDED,
|
|
87
|
+
_d="Vertragliches Fälligkeitsdatum der Rechnung",
|
|
88
|
+
)
|
|
89
|
+
notes = MultiField(IncludedNote)
|
|
90
|
+
|
|
91
|
+
class Meta:
|
|
92
|
+
namespace = NS_RSM
|
|
93
|
+
tag = "ExchangedDocument"
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class Document(Element):
|
|
97
|
+
context = Field(DocumentContext, required=True)
|
|
98
|
+
header = Field(Header, required=True)
|
|
99
|
+
trade = Field(TradeTransaction, required=True)
|
|
100
|
+
|
|
101
|
+
def __init__(self):
|
|
102
|
+
super().__init__()
|
|
103
|
+
ET.register_namespace("a", NS_A)
|
|
104
|
+
ET.register_namespace("rsm", NS_RSM)
|
|
105
|
+
ET.register_namespace("qdt", NS_QDT)
|
|
106
|
+
ET.register_namespace("ram", NS_RAM)
|
|
107
|
+
ET.register_namespace("xsi", "http://www.w3.org/2001/XMLSchema")
|
|
108
|
+
ET.register_namespace("udt", NS_UDT)
|
|
109
|
+
|
|
110
|
+
class Meta:
|
|
111
|
+
namespace = NS_RSM
|
|
112
|
+
tag = "CrossIndustryInvoice"
|