Bernd Wurst commited on 2024-05-17 15:17:16
Zeige 4 geänderte Dateien mit 31 Einfügungen und 7 Löschungen.
| ... | ... |
@@ -28,6 +28,10 @@ from drafthorse.pdf import attach_xml |
| 28 | 28 |
def InvoiceToXML(invoice): |
| 29 | 29 |
doc = Document() |
| 30 | 30 |
doc.context.guideline_parameter.id = "urn:cen.eu:en16931:2017" |
| 31 |
+ if invoice.leitweg_id: |
|
| 32 |
+ doc.context.guideline_parameter.id = "urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0" |
|
| 33 |
+ # Standardwert für XRechnung 3.0.1 |
|
| 34 |
+ doc.context.business_parameter.id = "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0" |
|
| 31 | 35 |
doc.header.id = invoice.id |
| 32 | 36 |
# Typecodes: |
| 33 | 37 |
# 380: Handelsrechnungen |
| ... | ... |
@@ -58,6 +62,9 @@ def InvoiceToXML(invoice): |
| 58 | 62 |
doc.trade.agreement.seller.address.line_one = invoice.seller['address']['line1'] |
| 59 | 63 |
doc.trade.agreement.seller.address.line_two = invoice.seller['address']['line2'] |
| 60 | 64 |
doc.trade.agreement.seller.address.line_three = invoice.seller['address']['line3'] |
| 65 |
+ # Für XRECHNUNG muss das Contact-Array mindestens eine Angabe enthalten |
|
| 66 |
+ if invoice.seller['contactPerson']: |
|
| 67 |
+ doc.trade.agreement.seller.contact.person_name = invoice.seller['contactPerson'] |
|
| 61 | 68 |
if invoice.seller['phone']: |
| 62 | 69 |
doc.trade.agreement.seller.contact.telephone.number = invoice.seller['phone'] |
| 63 | 70 |
if invoice.seller_vat_id: |
| ... | ... |
@@ -68,6 +75,7 @@ def InvoiceToXML(invoice): |
| 68 | 75 |
email = URIUniversalCommunication() |
| 69 | 76 |
email.uri_ID = ('EM', invoice.seller['email'])
|
| 70 | 77 |
doc.trade.agreement.seller.electronic_address.add(email) |
| 78 |
+ doc.trade.agreement.seller.contact.email.address = invoice.seller['email'] |
|
| 71 | 79 |
|
| 72 | 80 |
# Buyer-Address |
| 73 | 81 |
doc.trade.agreement.buyer.name = invoice.customer['name'] |
| ... | ... |
@@ -77,10 +85,24 @@ def InvoiceToXML(invoice): |
| 77 | 85 |
doc.trade.agreement.buyer.address.line_one = invoice.customer['address']['line1'] |
| 78 | 86 |
doc.trade.agreement.buyer.address.line_two = invoice.customer['address']['line2'] |
| 79 | 87 |
doc.trade.agreement.buyer.address.line_three = invoice.customer['address']['line3'] |
| 88 |
+ if invoice.leitweg_id: |
|
| 89 |
+ leitwegid = URIUniversalCommunication() |
|
| 90 |
+ leitwegid.uri_ID = ('0204', invoice.leitweg_id)
|
|
| 91 |
+ doc.trade.agreement.buyer.electronic_address.add(leitwegid) |
|
| 92 |
+ # Bei ZUGFeRD 2.1 darf das Feld nur einmal vorkommen. In XRechnung 3.0 darf es mehrmals drin sein. |
|
| 93 |
+ # drafthorse kann aktuell noch kein XRechnung 3.0 erzeugen, daher hier als "elif". |
|
| 94 |
+ elif invoice.buyer['email']: |
|
| 95 |
+ email = URIUniversalCommunication() |
|
| 96 |
+ email.uri_ID = ('EM', invoice.buyer['email'])
|
|
| 97 |
+ doc.trade.agreement.buyer.electronic_address.add(email) |
|
| 80 | 98 |
|
| 81 | 99 |
if invoice.buyer_reference: |
| 82 |
- # "Leitweg-ID" in XRechnung |
|
| 83 | 100 |
doc.trade.agreement.buyer_reference = invoice.buyer_reference |
| 101 |
+ elif invoice.leitweg_id: |
|
| 102 |
+ # "Leitweg-ID" in XRechnung |
|
| 103 |
+ # Wenn wir hier sind, ist die aber bereits in der electronic_address eingetragen, |
|
| 104 |
+ # daher hier nur noch wiederholen, wenn wir das Feld nicht für was anderes brauchen (Kunden-Referenz). |
|
| 105 |
+ doc.trade.agreement.buyer_reference = invoice.leitweg_id |
|
| 84 | 106 |
if invoice.order_number: |
| 85 | 107 |
doc.trade.agreement.buyer_order.issuer_assigned_id = invoice.order_number |
| 86 | 108 |
if invoice.contract_number: |
| ... | ... |
@@ -236,5 +258,5 @@ def InvoiceToXML(invoice): |
| 236 | 258 |
doc.trade.settlement.monetary_summation.due_amount = Decimal(f"{rest:.2f}")
|
| 237 | 259 |
|
| 238 | 260 |
# Generate XML file |
| 239 |
- xml = doc.serialize(schema="FACTUR-X_EN16931") |
|
| 261 |
+ xml = doc.serialize(schema="FACTUR-X_EXTENDED") |
|
| 240 | 262 |
return xml |
| ... | ... |
@@ -43,10 +43,11 @@ if __name__ == '__main__': |
| 43 | 43 |
if 'vertragsnummer' in referenzen: |
| 44 | 44 |
invoice.contract_number = referenzen['vertragsnummer'] |
| 45 | 45 |
invoice.seller['name'] = 'Bernd Wurst / Johannes Böck' |
| 46 |
+ invoice.seller['contactPerson'] = 'Bernd Wurst / Johannes Böck' |
|
| 46 | 47 |
invoice.seller['trade_name'] = 'schokokeks.org GbR' |
| 47 |
- invoice.seller['email'] = 'xxxxxxx' |
|
| 48 |
+ invoice.seller['email'] = 'xxx@example.com' |
|
| 48 | 49 |
invoice.seller['website'] = 'www.schokokeks.org' |
| 49 |
- invoice.seller['phone'] = None |
|
| 50 |
+ invoice.seller['phone'] = '+49 123456789' |
|
| 50 | 51 |
invoice.seller['address']['country_id'] = 'DE' |
| 51 | 52 |
invoice.seller['address']['postcode'] = '71540' |
| 52 | 53 |
invoice.seller['address']['city_name'] = 'Murrhardt' |
| ... | ... |
@@ -6,7 +6,7 @@ data = {
|
| 6 | 6 |
'city': 'Murrhardt', |
| 7 | 7 |
'company': None, |
| 8 | 8 |
'country': 'DE', |
| 9 |
- 'email': None, |
|
| 9 |
+ 'email': "kunde@kunde.de", |
|
| 10 | 10 |
'fax': None, |
| 11 | 11 |
'mobile': None, |
| 12 | 12 |
'name': 'Bernd Wurst', |
| ... | ... |
@@ -43,6 +43,6 @@ data = {
|
| 43 | 43 |
'mahnung': None, |
| 44 | 44 |
'notizen': None, |
| 45 | 45 |
'pdfdata': None, |
| 46 |
- 'referenzen': '{"kundenreferenz": "KrfzNr", "bestellnummer": '
|
|
| 47 |
- '"08/15-BestNr4711"}', |
|
| 46 |
+ 'referenzen': '{"kundenreferenz": "KrfzNr", "vertragsnummer": "654321", "bestellnummer": '
|
|
| 47 |
+ '"08/15-BestNr4711", "leitwegid": "012345678"}', |
|
| 48 | 48 |
'sepamandat': None}} |
| 49 | 49 |