In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 1) # -*- coding: utf-8 -*-
Invoice/InvoiceToZUGFeRD.py 2)
|
Kontoinhaber im XML einsetzen
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 3) import os.path
Invoice/InvoiceToZUGFeRD.py 4) import sys
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 5) from decimal import Decimal
Invoice/InvoiceToZUGFeRD.py 6)
Invoice/InvoiceToZUGFeRD.py 7) # Search for included submodule python-drafthorse
Invoice/InvoiceToZUGFeRD.py 8) atoms = os.path.abspath(os.path.dirname(__file__)).split('/')
Invoice/InvoiceToZUGFeRD.py 9) dir = ''
Invoice/InvoiceToZUGFeRD.py 10) while atoms:
Invoice/InvoiceToZUGFeRD.py 11) candidate = os.path.join('/'.join(atoms), 'external/python-drafthorse')
Invoice/InvoiceToZUGFeRD.py 12) if os.path.exists(candidate):
Invoice/InvoiceToZUGFeRD.py 13) dir = candidate
Invoice/InvoiceToZUGFeRD.py 14) break
Invoice/InvoiceToZUGFeRD.py 15) atoms = atoms[:-1]
Invoice/InvoiceToZUGFeRD.py 16) sys.path.insert(0, dir)
Invoice/InvoiceToZUGFeRD.py 17) from drafthorse.models.document import Document
Invoice/InvoiceToZUGFeRD.py 18) from drafthorse.models.accounting import ApplicableTradeTax
Invoice/InvoiceToZUGFeRD.py 19) from drafthorse.models.tradelines import LineItem
|
Codestyle-Fixes
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 20) from .InvoiceObjects import InvoiceTable, InvoiceText, RECHNUNG, GUTSCHRIFT, KORREKTUR, \
|
Einheiten soweit möglich al...
Bernd Wurst authored 3 months ago
|
Invoice/InvoiceToZUGFeRD.py 21) VAT_REGULAR, VAT_KLEINUNTERNEHMER, VAT_INNERGEM, PAYMENT_UEBERWEISUNG, PAYMENT_LASTSCHRIFT, UNITS
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 22) from drafthorse.models.party import TaxRegistration, URIUniversalCommunication
Invoice/InvoiceToZUGFeRD.py 23) from drafthorse.models.payment import PaymentTerms
Invoice/InvoiceToZUGFeRD.py 24) from drafthorse.models.note import IncludedNote
Invoice/InvoiceToZUGFeRD.py 25) from drafthorse.pdf import attach_xml
Invoice/InvoiceToZUGFeRD.py 26)
|
Test-Script lauffähig
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 27)
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 28) def InvoiceToXML(invoice):
Invoice/InvoiceToZUGFeRD.py 29) doc = Document()
|
Falscher ID-String
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 30) doc.context.guideline_parameter.id = "urn:cen.eu:en16931:2017"
|
Das XML validiert jetzt als...
Bernd Wurst authored 1 month ago
|
Invoice/InvoiceToZUGFeRD.py 31) if invoice.leitweg_id:
Invoice/InvoiceToZUGFeRD.py 32) doc.context.guideline_parameter.id = "urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0"
|
business_parameter nur bei...
Bernd Wurst authored 1 month ago
|
Invoice/InvoiceToZUGFeRD.py 33) # Standardwert für XRechnung 3.0.1
Invoice/InvoiceToZUGFeRD.py 34) doc.context.business_parameter.id = "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0"
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 35) doc.header.id = invoice.id
Invoice/InvoiceToZUGFeRD.py 36) # Typecodes:
Invoice/InvoiceToZUGFeRD.py 37) # 380: Handelsrechnungen
Invoice/InvoiceToZUGFeRD.py 38) # 381: Gutschrift
Invoice/InvoiceToZUGFeRD.py 39) # 384: Korrekturrechnung
Invoice/InvoiceToZUGFeRD.py 40) # 389: Eigenrechnung (vom Käufer im Namen des Lieferanten erstellt).
Invoice/InvoiceToZUGFeRD.py 41) # 261: Selbstverfasste Gutschrift.
Invoice/InvoiceToZUGFeRD.py 42) # 386: Vorauszahlungsrechnung
Invoice/InvoiceToZUGFeRD.py 43) # 326: Teilrechnung
Invoice/InvoiceToZUGFeRD.py 44) # 751: Rechnungsinformation - KEINE RECHNUNG
Invoice/InvoiceToZUGFeRD.py 45) if invoice.type == RECHNUNG:
Invoice/InvoiceToZUGFeRD.py 46) doc.header.type_code = "380"
Invoice/InvoiceToZUGFeRD.py 47) elif invoice.type == GUTSCHRIFT:
Invoice/InvoiceToZUGFeRD.py 48) doc.header.type_code = "381"
Invoice/InvoiceToZUGFeRD.py 49) elif invoice.type == KORREKTUR:
Invoice/InvoiceToZUGFeRD.py 50) doc.header.type_code = "384"
Invoice/InvoiceToZUGFeRD.py 51) else:
Invoice/InvoiceToZUGFeRD.py 52) raise TypeError("Unbekannter Rechnungstyp, kann kein XML erstellen")
Invoice/InvoiceToZUGFeRD.py 53) doc.header.issue_date_time = invoice.date
Invoice/InvoiceToZUGFeRD.py 54)
Invoice/InvoiceToZUGFeRD.py 55) # Seller-Address
Invoice/InvoiceToZUGFeRD.py 56) if invoice.seller['trade_name']:
|
Änderungen an der Upstream-...
Bernd Wurst authored 3 months ago
|
Invoice/InvoiceToZUGFeRD.py 57) doc.trade.agreement.seller.legal_organization.trade_name = invoice.seller['trade_name']
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 58) doc.trade.agreement.seller.name = invoice.seller['name']
Invoice/InvoiceToZUGFeRD.py 59) doc.trade.agreement.seller.address.country_id = invoice.seller['address']['country_id']
Invoice/InvoiceToZUGFeRD.py 60) doc.trade.agreement.seller.address.postcode = invoice.seller['address']['postcode']
Invoice/InvoiceToZUGFeRD.py 61) doc.trade.agreement.seller.address.city_name = invoice.seller['address']['city_name']
Invoice/InvoiceToZUGFeRD.py 62) doc.trade.agreement.seller.address.line_one = invoice.seller['address']['line1']
Invoice/InvoiceToZUGFeRD.py 63) doc.trade.agreement.seller.address.line_two = invoice.seller['address']['line2']
Invoice/InvoiceToZUGFeRD.py 64) doc.trade.agreement.seller.address.line_three = invoice.seller['address']['line3']
|
Das XML validiert jetzt als...
Bernd Wurst authored 1 month ago
|
Invoice/InvoiceToZUGFeRD.py 65) # Für XRECHNUNG muss das Contact-Array mindestens eine Angabe enthalten
Invoice/InvoiceToZUGFeRD.py 66) if invoice.seller['contactPerson']:
Invoice/InvoiceToZUGFeRD.py 67) doc.trade.agreement.seller.contact.person_name = invoice.seller['contactPerson']
|
Telefonnummer
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 68) if invoice.seller['phone']:
Invoice/InvoiceToZUGFeRD.py 69) doc.trade.agreement.seller.contact.telephone.number = invoice.seller['phone']
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 70) if invoice.seller_vat_id:
Invoice/InvoiceToZUGFeRD.py 71) tax_reg = TaxRegistration()
Invoice/InvoiceToZUGFeRD.py 72) tax_reg.id = ('VA', invoice.seller_vat_id)
Invoice/InvoiceToZUGFeRD.py 73) doc.trade.agreement.seller.tax_registrations.add(tax_reg)
Invoice/InvoiceToZUGFeRD.py 74) if invoice.seller['email']:
Invoice/InvoiceToZUGFeRD.py 75) email = URIUniversalCommunication()
Invoice/InvoiceToZUGFeRD.py 76) email.uri_ID = ('EM', invoice.seller['email'])
|
Änderungen an der Upstream-...
Bernd Wurst authored 3 months ago
|
Invoice/InvoiceToZUGFeRD.py 77) doc.trade.agreement.seller.electronic_address.add(email)
|
Das XML validiert jetzt als...
Bernd Wurst authored 1 month ago
|
Invoice/InvoiceToZUGFeRD.py 78) doc.trade.agreement.seller.contact.email.address = invoice.seller['email']
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 79)
Invoice/InvoiceToZUGFeRD.py 80) # Buyer-Address
Invoice/InvoiceToZUGFeRD.py 81) doc.trade.agreement.buyer.name = invoice.customer['name']
Invoice/InvoiceToZUGFeRD.py 82) doc.trade.agreement.buyer.address.country_id = invoice.customer['address']['country_id']
Invoice/InvoiceToZUGFeRD.py 83) doc.trade.agreement.buyer.address.postcode = invoice.customer['address']['postcode']
Invoice/InvoiceToZUGFeRD.py 84) doc.trade.agreement.buyer.address.city_name = invoice.customer['address']['city_name']
Invoice/InvoiceToZUGFeRD.py 85) doc.trade.agreement.buyer.address.line_one = invoice.customer['address']['line1']
Invoice/InvoiceToZUGFeRD.py 86) doc.trade.agreement.buyer.address.line_two = invoice.customer['address']['line2']
Invoice/InvoiceToZUGFeRD.py 87) doc.trade.agreement.buyer.address.line_three = invoice.customer['address']['line3']
|
Das XML validiert jetzt als...
Bernd Wurst authored 1 month ago
|
Invoice/InvoiceToZUGFeRD.py 88) if invoice.leitweg_id:
Invoice/InvoiceToZUGFeRD.py 89) leitwegid = URIUniversalCommunication()
Invoice/InvoiceToZUGFeRD.py 90) leitwegid.uri_ID = ('0204', invoice.leitweg_id)
Invoice/InvoiceToZUGFeRD.py 91) doc.trade.agreement.buyer.electronic_address.add(leitwegid)
Invoice/InvoiceToZUGFeRD.py 92) # Bei ZUGFeRD 2.1 darf das Feld nur einmal vorkommen. In XRechnung 3.0 darf es mehrmals drin sein.
Invoice/InvoiceToZUGFeRD.py 93) # drafthorse kann aktuell noch kein XRechnung 3.0 erzeugen, daher hier als "elif".
Invoice/InvoiceToZUGFeRD.py 94) elif invoice.buyer['email']:
Invoice/InvoiceToZUGFeRD.py 95) email = URIUniversalCommunication()
Invoice/InvoiceToZUGFeRD.py 96) email.uri_ID = ('EM', invoice.buyer['email'])
Invoice/InvoiceToZUGFeRD.py 97) doc.trade.agreement.buyer.electronic_address.add(email)
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 98)
|
Telefonnummer
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 99) if invoice.buyer_reference:
Invoice/InvoiceToZUGFeRD.py 100) doc.trade.agreement.buyer_reference = invoice.buyer_reference
|
Das XML validiert jetzt als...
Bernd Wurst authored 1 month ago
|
Invoice/InvoiceToZUGFeRD.py 101) elif invoice.leitweg_id:
Invoice/InvoiceToZUGFeRD.py 102) # "Leitweg-ID" in XRechnung
Invoice/InvoiceToZUGFeRD.py 103) # Wenn wir hier sind, ist die aber bereits in der electronic_address eingetragen,
Invoice/InvoiceToZUGFeRD.py 104) # daher hier nur noch wiederholen, wenn wir das Feld nicht für was anderes brauchen (Kunden-Referenz).
Invoice/InvoiceToZUGFeRD.py 105) doc.trade.agreement.buyer_reference = invoice.leitweg_id
|
Referenznummern auf allen A...
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 106) if invoice.order_number:
Invoice/InvoiceToZUGFeRD.py 107) doc.trade.agreement.buyer_order.issuer_assigned_id = invoice.order_number
Invoice/InvoiceToZUGFeRD.py 108) if invoice.contract_number:
Invoice/InvoiceToZUGFeRD.py 109) doc.trade.agreement.contract.issuer_assigned_id = invoice.contract_number
|
Telefonnummer
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 110)
|
Nutze das globale Leistungs...
Bernd Wurst authored 1 month ago
|
Invoice/InvoiceToZUGFeRD.py 111) # Wenn alle Leistungsdaten aller Posten exakt ein fixes Datum sind, sollte statt dem Datumbereich der
Invoice/InvoiceToZUGFeRD.py 112) # einzelnen Posten doc.trade.delivery.event.occurence verwendet werden. Dazu müssen vorab alle Posten
Invoice/InvoiceToZUGFeRD.py 113) # aller Tabellen geprüft werden
Invoice/InvoiceToZUGFeRD.py 114) only_one_date = True
Invoice/InvoiceToZUGFeRD.py 115) deliverydate = None
Invoice/InvoiceToZUGFeRD.py 116) try:
Invoice/InvoiceToZUGFeRD.py 117) for part in invoice.parts:
Invoice/InvoiceToZUGFeRD.py 118) if not isinstance(part, InvoiceTable):
Invoice/InvoiceToZUGFeRD.py 119) continue
Invoice/InvoiceToZUGFeRD.py 120) for el in part.entries:
Invoice/InvoiceToZUGFeRD.py 121) end = None
Invoice/InvoiceToZUGFeRD.py 122) start = None
Invoice/InvoiceToZUGFeRD.py 123) if 'period_end' in el and el['period_end']:
Invoice/InvoiceToZUGFeRD.py 124) end = el['period_end']
Invoice/InvoiceToZUGFeRD.py 125) if 'period_start' in el and el['period_start']:
Invoice/InvoiceToZUGFeRD.py 126) start = el['period_start']
Invoice/InvoiceToZUGFeRD.py 127) if start and end and start != end:
Invoice/InvoiceToZUGFeRD.py 128) print(f"{start} != {end}")
Invoice/InvoiceToZUGFeRD.py 129) deliverydate = None
Invoice/InvoiceToZUGFeRD.py 130) only_one_date = False
Invoice/InvoiceToZUGFeRD.py 131) raise Exception('loop abort')
Invoice/InvoiceToZUGFeRD.py 132) if start and not deliverydate:
Invoice/InvoiceToZUGFeRD.py 133) deliverydate = el['period_start']
Invoice/InvoiceToZUGFeRD.py 134) continue
Invoice/InvoiceToZUGFeRD.py 135) if start != deliverydate:
Invoice/InvoiceToZUGFeRD.py 136) print(f"{start} != {deliverydate}")
Invoice/InvoiceToZUGFeRD.py 137) deliverydate = None
Invoice/InvoiceToZUGFeRD.py 138) only_one_date = False
Invoice/InvoiceToZUGFeRD.py 139) raise Exception('loop abort')
Invoice/InvoiceToZUGFeRD.py 140) except Exception as e:
Invoice/InvoiceToZUGFeRD.py 141) print('exception: ' + str(e))
Invoice/InvoiceToZUGFeRD.py 142) pass
Invoice/InvoiceToZUGFeRD.py 143) if only_one_date and deliverydate:
Invoice/InvoiceToZUGFeRD.py 144) doc.trade.delivery.event.occurrence = deliverydate
Invoice/InvoiceToZUGFeRD.py 145)
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 146) # Line Items
Invoice/InvoiceToZUGFeRD.py 147) summe_netto = 0.0
Invoice/InvoiceToZUGFeRD.py 148) summe_brutto = 0.0
Invoice/InvoiceToZUGFeRD.py 149) summe_bezahlt = 0.0
Invoice/InvoiceToZUGFeRD.py 150) summe_ust = 0.0
Invoice/InvoiceToZUGFeRD.py 151) line_id_count = 0
Invoice/InvoiceToZUGFeRD.py 152) textparts = []
Invoice/InvoiceToZUGFeRD.py 153) for part in invoice.parts:
|
Codestyle-Fixes
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 154) if isinstance(part, InvoiceText):
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 155) textparts += part.paragraphs
|
Codestyle-Fixes
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 156) if isinstance(part, InvoiceTable):
|
Zwischenüberschriften in de...
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 157) last_title = None
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 158) for el in part.entries:
|
Zwischenüberschriften in de...
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 159) if el['type'] == 'title':
Invoice/InvoiceToZUGFeRD.py 160) # Diese Information ist im XML nicht auf diese Weise darstellbar
Invoice/InvoiceToZUGFeRD.py 161) last_title = el['title']
Invoice/InvoiceToZUGFeRD.py 162) continue
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 163) line_id_count += 1
Invoice/InvoiceToZUGFeRD.py 164) li = LineItem()
Invoice/InvoiceToZUGFeRD.py 165) li.document.line_id = f"{line_id_count}"
|
Zwischenüberschriften in de...
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 166) if last_title:
Invoice/InvoiceToZUGFeRD.py 167) title = IncludedNote()
Invoice/InvoiceToZUGFeRD.py 168) title.content.add(last_title)
Invoice/InvoiceToZUGFeRD.py 169) li.document.notes.add(title)
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 170) li.product.name = el['subject']
Invoice/InvoiceToZUGFeRD.py 171) if 'desc' in el and el['desc'] != '':
|
typo
Bernd Wurst authored 4 months ago
|
src/rechnung/Invoice/InvoiceToZUGFeRD.py 172) li.product.description = el['desc']
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 173)
|
Nutze das globale Leistungs...
Bernd Wurst authored 1 month ago
|
Invoice/InvoiceToZUGFeRD.py 174) if not only_one_date:
Invoice/InvoiceToZUGFeRD.py 175) if 'period_start' in el and el['period_start']:
Invoice/InvoiceToZUGFeRD.py 176) li.settlement.period.start = el['period_start']
Invoice/InvoiceToZUGFeRD.py 177) if 'period_end' in el and el['period_end']:
Invoice/InvoiceToZUGFeRD.py 178) li.settlement.period.end = el['period_end']
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 179)
|
Einheiten soweit möglich al...
Bernd Wurst authored 3 months ago
|
Invoice/InvoiceToZUGFeRD.py 180) unit = 'C62'
Invoice/InvoiceToZUGFeRD.py 181) if el['unit']:
Invoice/InvoiceToZUGFeRD.py 182) for key, value in UNITS.items():
Invoice/InvoiceToZUGFeRD.py 183) if el['unit'] in value:
Invoice/InvoiceToZUGFeRD.py 184) unit = key
Invoice/InvoiceToZUGFeRD.py 185) li.delivery.billed_quantity = (Decimal(el['count']), unit)
|
Kleine Korrekturen, mache B...
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 186) # C62 = ohne Einheit
Invoice/InvoiceToZUGFeRD.py 187) # H87 = Stück
|
Einheiten soweit möglich al...
Bernd Wurst authored 3 months ago
|
Invoice/InvoiceToZUGFeRD.py 188) # MON = Month, SEC = second, MIN = minute, HUR = hour, DAY = day, WEE = week, ANN = year
Invoice/InvoiceToZUGFeRD.py 189) # LTR = Liter, MTQ = m³
Invoice/InvoiceToZUGFeRD.py 190) # GRM = gram, KGM = Kilogram, TNE = Tonne, DTN = decitonne,
Invoice/InvoiceToZUGFeRD.py 191) # MTR = Meter, MMT = Millimeter, KMT = Kilometer
Invoice/InvoiceToZUGFeRD.py 192) # MTK = m²
Invoice/InvoiceToZUGFeRD.py 193) # KWT = kW, MAW = MW, KWH = kWh, MWH = MWh
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 194)
Invoice/InvoiceToZUGFeRD.py 195) li.settlement.trade_tax.type_code = "VAT"
Invoice/InvoiceToZUGFeRD.py 196) if invoice.vat_type == VAT_REGULAR:
Invoice/InvoiceToZUGFeRD.py 197) li.settlement.trade_tax.category_code = "S"
Invoice/InvoiceToZUGFeRD.py 198) elif invoice.vat_type == VAT_KLEINUNTERNEHMER:
Invoice/InvoiceToZUGFeRD.py 199) li.settlement.trade_tax.category_code = "E"
Invoice/InvoiceToZUGFeRD.py 200) elif invoice.vat_type == VAT_INNERGEM:
Invoice/InvoiceToZUGFeRD.py 201) li.settlement.trade_tax.category_code = "K"
Invoice/InvoiceToZUGFeRD.py 202) # FIXME: Typ bei uns nur global gesetzt, nicht pro Artikel
Invoice/InvoiceToZUGFeRD.py 203) # S = Standard VAT rate
Invoice/InvoiceToZUGFeRD.py 204) # Z = Zero rated goods
Invoice/InvoiceToZUGFeRD.py 205) # E = VAT exempt
Invoice/InvoiceToZUGFeRD.py 206) # AE = Reverse charge
Invoice/InvoiceToZUGFeRD.py 207) # K = Intra-Community supply (specific reverse charge)
Invoice/InvoiceToZUGFeRD.py 208) # G = Exempt VAT for Export outside EU
Invoice/InvoiceToZUGFeRD.py 209) # O = Outside VAT scope
|
Kontoinhaber im XML einsetzen
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 210) li.settlement.trade_tax.rate_applicable_percent = Decimal(f"{el['vat'] * 100:.1f}")
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 211)
Invoice/InvoiceToZUGFeRD.py 212) nettopreis = el['price']
Invoice/InvoiceToZUGFeRD.py 213) if part.vatType == 'gross':
Invoice/InvoiceToZUGFeRD.py 214) nettopreis = el['price'] / (1 + el['vat'])
Invoice/InvoiceToZUGFeRD.py 215) li.agreement.net.amount = Decimal(f"{nettopreis:.2f}")
Invoice/InvoiceToZUGFeRD.py 216)
Invoice/InvoiceToZUGFeRD.py 217) nettosumme = el['total']
Invoice/InvoiceToZUGFeRD.py 218) if part.vatType == 'gross':
Invoice/InvoiceToZUGFeRD.py 219) nettosumme = el['total'] / (1 + el['vat'])
Invoice/InvoiceToZUGFeRD.py 220) li.settlement.monetary_summation.total_amount = Decimal(f"{nettosumme:.2f}")
Invoice/InvoiceToZUGFeRD.py 221)
Invoice/InvoiceToZUGFeRD.py 222) summe_netto += nettosumme
Invoice/InvoiceToZUGFeRD.py 223) summe_brutto += el['total']
Invoice/InvoiceToZUGFeRD.py 224) doc.trade.items.add(li)
Invoice/InvoiceToZUGFeRD.py 225)
Invoice/InvoiceToZUGFeRD.py 226) for pay in part.payments:
Invoice/InvoiceToZUGFeRD.py 227) summe_bezahlt += pay['amount']
Invoice/InvoiceToZUGFeRD.py 228)
Invoice/InvoiceToZUGFeRD.py 229) for vat, vatdata in part.vat.items():
Invoice/InvoiceToZUGFeRD.py 230) trade_tax = ApplicableTradeTax()
Invoice/InvoiceToZUGFeRD.py 231) # Steuerbetrag dieses Steuersatzes
Invoice/InvoiceToZUGFeRD.py 232) trade_tax.calculated_amount = Decimal(f"{(vatdata[0] / (vat + 1)) * vat:.2f}")
Invoice/InvoiceToZUGFeRD.py 233) # Nettosumme dieses Steuersatzes
Invoice/InvoiceToZUGFeRD.py 234) trade_tax.basis_amount = Decimal(f"{(vatdata[0] / (vat + 1)):.2f}")
Invoice/InvoiceToZUGFeRD.py 235) trade_tax.type_code = "VAT"
Invoice/InvoiceToZUGFeRD.py 236) if invoice.vat_type == VAT_REGULAR:
Invoice/InvoiceToZUGFeRD.py 237) trade_tax.category_code = "S"
Invoice/InvoiceToZUGFeRD.py 238) elif invoice.vat_type == VAT_KLEINUNTERNEHMER:
Invoice/InvoiceToZUGFeRD.py 239) trade_tax.category_code = "E"
Invoice/InvoiceToZUGFeRD.py 240) trade_tax.exemption_reason = 'Als Kleinunternehmer wird gemäß §19 UStG keine USt in Rechnung gestellt.'
Invoice/InvoiceToZUGFeRD.py 241) elif invoice.vat_type == VAT_INNERGEM:
Invoice/InvoiceToZUGFeRD.py 242) trade_tax.category_code = "K"
|
Kontoinhaber im XML einsetzen
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 243) trade_tax.rate_applicable_percent = Decimal(f"{vat * 100:.1f}")
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 244) summe_ust += (vatdata[0] / (vat + 1)) * vat
Invoice/InvoiceToZUGFeRD.py 245) doc.trade.settlement.trade_tax.add(trade_tax)
Invoice/InvoiceToZUGFeRD.py 246)
Invoice/InvoiceToZUGFeRD.py 247) for paragraph in textparts:
Invoice/InvoiceToZUGFeRD.py 248) note = IncludedNote()
Invoice/InvoiceToZUGFeRD.py 249) note.content.add(paragraph)
Invoice/InvoiceToZUGFeRD.py 250) doc.header.notes.add(note)
Invoice/InvoiceToZUGFeRD.py 251)
Invoice/InvoiceToZUGFeRD.py 252) rest = summe_brutto - summe_bezahlt
Invoice/InvoiceToZUGFeRD.py 253)
Invoice/InvoiceToZUGFeRD.py 254) if invoice.creditor_reference_id:
Invoice/InvoiceToZUGFeRD.py 255) # Gläubiger-ID für SEPA
Invoice/InvoiceToZUGFeRD.py 256) doc.trade.settlement.creditor_reference_id = invoice.creditor_reference_id
Invoice/InvoiceToZUGFeRD.py 257) doc.trade.settlement.payment_reference = invoice.id
Invoice/InvoiceToZUGFeRD.py 258) doc.trade.settlement.currency_code = 'EUR'
|
WiP
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 259) if invoice.payment_type:
Invoice/InvoiceToZUGFeRD.py 260) doc.trade.settlement.payment_means.type_code = invoice.payment_type
Invoice/InvoiceToZUGFeRD.py 261)
Invoice/InvoiceToZUGFeRD.py 262) if invoice.seller_bank_data['iban'] and invoice.payment_type == PAYMENT_UEBERWEISUNG:
|
Kontoinhaber im XML einsetzen
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 263) doc.trade.settlement.payment_means.payee_account.account_name = \
Invoice/InvoiceToZUGFeRD.py 264) invoice.seller_bank_data['kontoinhaber'] or invoice.seller['trade_name'] or invoice.seller['name']
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 265) doc.trade.settlement.payment_means.payee_account.iban = invoice.seller_bank_data['iban']
|
Kleine Korrekturen, mache B...
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 266) if invoice.seller_bank_data['bic']:
Invoice/InvoiceToZUGFeRD.py 267) doc.trade.settlement.payment_means.payee_institution.bic = invoice.seller_bank_data['bic']
|
WiP
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 268) if invoice.buyer_bank_data['iban'] and invoice.payment_type == PAYMENT_LASTSCHRIFT:
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 269) # Kunden-Bankverbindung bei Lastschrift
Invoice/InvoiceToZUGFeRD.py 270) doc.trade.settlement.payment_means.payer_account.iban = invoice.buyer_bank_data['iban']
Invoice/InvoiceToZUGFeRD.py 271)
Invoice/InvoiceToZUGFeRD.py 272) terms = PaymentTerms()
|
WiP
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 273) if invoice.due_date and invoice.payment_type == PAYMENT_UEBERWEISUNG:
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 274) terms.description = f"Bitte begleichen Sie den Betrag bis zum {invoice.due_date.strftime('%d.%m.%Y')} ohne Abzüge."
Invoice/InvoiceToZUGFeRD.py 275) terms.due = invoice.due_date
|
Kleine Korrekturen, mache B...
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 276) if invoice.type in [GUTSCHRIFT, KORREKTUR]:
|
WiP
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 277) terms.description = f"Wir überweisen den Betrag auf Ihr Konto."
Invoice/InvoiceToZUGFeRD.py 278) elif invoice.debit:
|
In eigenes GIT ausgelagert
Bernd Wurst authored 4 months ago
|
Invoice/InvoiceToZUGFeRD.py 279) if invoice.debit_mandate_id:
Invoice/InvoiceToZUGFeRD.py 280) # Mandatsreferenz für Lastschrift
Invoice/InvoiceToZUGFeRD.py 281) terms.debit_mandate_id = invoice.debit_mandate_id
Invoice/InvoiceToZUGFeRD.py 282) terms.description = 'Wir buchen von Ihrem Konto ab.'
Invoice/InvoiceToZUGFeRD.py 283) doc.trade.settlement.terms.add(terms)
Invoice/InvoiceToZUGFeRD.py 284)
Invoice/InvoiceToZUGFeRD.py 285) doc.trade.settlement.monetary_summation.line_total = Decimal(f"{summe_netto:.2f}")
Invoice/InvoiceToZUGFeRD.py 286) doc.trade.settlement.monetary_summation.charge_total = Decimal("0.00")
Invoice/InvoiceToZUGFeRD.py 287) doc.trade.settlement.monetary_summation.allowance_total = Decimal("0.00")
Invoice/InvoiceToZUGFeRD.py 288) doc.trade.settlement.monetary_summation.tax_basis_total = Decimal(f"{summe_netto:.2f}")
Invoice/InvoiceToZUGFeRD.py 289) doc.trade.settlement.monetary_summation.tax_total = (Decimal(f"{summe_ust:.2f}"), "EUR")
Invoice/InvoiceToZUGFeRD.py 290) doc.trade.settlement.monetary_summation.prepaid_total = Decimal(f"{summe_bezahlt:.2f}")
Invoice/InvoiceToZUGFeRD.py 291) doc.trade.settlement.monetary_summation.grand_total = Decimal(f"{summe_brutto:.2f}")
Invoice/InvoiceToZUGFeRD.py 292) doc.trade.settlement.monetary_summation.due_amount = Decimal(f"{rest:.2f}")
Invoice/InvoiceToZUGFeRD.py 293)
Invoice/InvoiceToZUGFeRD.py 294) # Generate XML file
|
Das XML validiert jetzt als...
Bernd Wurst authored 1 month ago
|
Invoice/InvoiceToZUGFeRD.py 295) xml = doc.serialize(schema="FACTUR-X_EXTENDED")
|