b195a8f8b393cd4bb7c108bd9bdd7dff4dc22df6
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py                1) # -*- coding: utf-8 -*-
Invoice/InvoiceToZUGFeRD.py                2) 
Bernd Wurst Kontoinhaber im XML einsetzen

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py                3) import os.path
Invoice/InvoiceToZUGFeRD.py                4) import sys
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 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
Bernd Wurst Codestyle-Fixes

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py               20) from .InvoiceObjects import InvoiceTable, InvoiceText, RECHNUNG, GUTSCHRIFT, KORREKTUR, \
Bernd Wurst Einheiten soweit möglich al...

Bernd Wurst authored 8 months ago

Invoice/InvoiceToZUGFeRD.py               21)     VAT_REGULAR, VAT_KLEINUNTERNEHMER, VAT_INNERGEM, PAYMENT_UEBERWEISUNG, PAYMENT_LASTSCHRIFT, UNITS
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 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
Bernd Wurst Fehlendenden Namespace QDT...

Bernd Wurst authored 1 month ago

Invoice/InvoiceToZUGFeRD.py               25) from drafthorse.models import NS_QDT
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py               26) from drafthorse.pdf import attach_xml
Bernd Wurst Fehlendenden Namespace QDT...

Bernd Wurst authored 1 month ago

Invoice/InvoiceToZUGFeRD.py               27) import re
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py               28) 
Bernd Wurst Test-Script lauffähig

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py               29) 
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py               30) def InvoiceToXML(invoice):
Invoice/InvoiceToZUGFeRD.py               31)     doc = Document()
Bernd Wurst Nettopreis mit drei Dezimal...

Bernd Wurst authored 1 month ago

Invoice/InvoiceToZUGFeRD.py               32) 
Bernd Wurst Falscher ID-String

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py               33)     doc.context.guideline_parameter.id = "urn:cen.eu:en16931:2017"
Bernd Wurst Das XML validiert jetzt als...

Bernd Wurst authored 7 months ago

Invoice/InvoiceToZUGFeRD.py               34)     if invoice.leitweg_id:
Invoice/InvoiceToZUGFeRD.py               35)         doc.context.guideline_parameter.id = "urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0"
Bernd Wurst business_parameter nur bei...

Bernd Wurst authored 7 months ago

Invoice/InvoiceToZUGFeRD.py               36)         # Standardwert für XRechnung 3.0.1
Invoice/InvoiceToZUGFeRD.py               37)         doc.context.business_parameter.id = "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0"
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py               38)     doc.header.id = invoice.id
Invoice/InvoiceToZUGFeRD.py               39)     # Typecodes:
Invoice/InvoiceToZUGFeRD.py               40)     # 380: Handelsrechnungen
Invoice/InvoiceToZUGFeRD.py               41)     # 381: Gutschrift
Invoice/InvoiceToZUGFeRD.py               42)     # 384: Korrekturrechnung
Invoice/InvoiceToZUGFeRD.py               43)     # 389: Eigenrechnung (vom Käufer im Namen des Lieferanten erstellt).
Invoice/InvoiceToZUGFeRD.py               44)     # 261: Selbstverfasste Gutschrift.
Invoice/InvoiceToZUGFeRD.py               45)     # 386: Vorauszahlungsrechnung
Invoice/InvoiceToZUGFeRD.py               46)     # 326: Teilrechnung
Invoice/InvoiceToZUGFeRD.py               47)     # 751: Rechnungsinformation - KEINE RECHNUNG
Invoice/InvoiceToZUGFeRD.py               48)     if invoice.type == RECHNUNG:
Invoice/InvoiceToZUGFeRD.py               49)         doc.header.type_code = "380"
Invoice/InvoiceToZUGFeRD.py               50)     elif invoice.type == GUTSCHRIFT:
Invoice/InvoiceToZUGFeRD.py               51)         doc.header.type_code = "381"
Invoice/InvoiceToZUGFeRD.py               52)     elif invoice.type == KORREKTUR:
Invoice/InvoiceToZUGFeRD.py               53)         doc.header.type_code = "384"
Invoice/InvoiceToZUGFeRD.py               54)     else:
Invoice/InvoiceToZUGFeRD.py               55)         raise TypeError("Unbekannter Rechnungstyp, kann kein XML erstellen")
Invoice/InvoiceToZUGFeRD.py               56)     doc.header.issue_date_time = invoice.date
Invoice/InvoiceToZUGFeRD.py               57) 
Invoice/InvoiceToZUGFeRD.py               58)     # Seller-Address
Invoice/InvoiceToZUGFeRD.py               59)     if invoice.seller['trade_name']:
Bernd Wurst Änderungen an der Upstream-...

Bernd Wurst authored 9 months ago

Invoice/InvoiceToZUGFeRD.py               60)         doc.trade.agreement.seller.legal_organization.trade_name = invoice.seller['trade_name']
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py               61)     doc.trade.agreement.seller.name = invoice.seller['name']
Invoice/InvoiceToZUGFeRD.py               62)     doc.trade.agreement.seller.address.country_id = invoice.seller['address']['country_id']
Invoice/InvoiceToZUGFeRD.py               63)     doc.trade.agreement.seller.address.postcode = invoice.seller['address']['postcode']
Invoice/InvoiceToZUGFeRD.py               64)     doc.trade.agreement.seller.address.city_name = invoice.seller['address']['city_name']
Invoice/InvoiceToZUGFeRD.py               65)     doc.trade.agreement.seller.address.line_one = invoice.seller['address']['line1']
Invoice/InvoiceToZUGFeRD.py               66)     doc.trade.agreement.seller.address.line_two = invoice.seller['address']['line2']
Invoice/InvoiceToZUGFeRD.py               67)     doc.trade.agreement.seller.address.line_three = invoice.seller['address']['line3']
Bernd Wurst Das XML validiert jetzt als...

Bernd Wurst authored 7 months ago

Invoice/InvoiceToZUGFeRD.py               68)     # Für XRECHNUNG muss das Contact-Array mindestens eine Angabe enthalten
Invoice/InvoiceToZUGFeRD.py               69)     if invoice.seller['contactPerson']:
Invoice/InvoiceToZUGFeRD.py               70)         doc.trade.agreement.seller.contact.person_name = invoice.seller['contactPerson']
Bernd Wurst Telefonnummer

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py               71)     if invoice.seller['phone']:
Invoice/InvoiceToZUGFeRD.py               72)         doc.trade.agreement.seller.contact.telephone.number = invoice.seller['phone']
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py               73)     if invoice.seller_vat_id:
Invoice/InvoiceToZUGFeRD.py               74)         tax_reg = TaxRegistration()
Invoice/InvoiceToZUGFeRD.py               75)         tax_reg.id = ('VA', invoice.seller_vat_id)
Invoice/InvoiceToZUGFeRD.py               76)         doc.trade.agreement.seller.tax_registrations.add(tax_reg)
Invoice/InvoiceToZUGFeRD.py               77)     if invoice.seller['email']:
Invoice/InvoiceToZUGFeRD.py               78)         email = URIUniversalCommunication()
Invoice/InvoiceToZUGFeRD.py               79)         email.uri_ID = ('EM', invoice.seller['email'])
Bernd Wurst Änderungen an der Upstream-...

Bernd Wurst authored 9 months ago

Invoice/InvoiceToZUGFeRD.py               80)         doc.trade.agreement.seller.electronic_address.add(email)
Bernd Wurst Das XML validiert jetzt als...

Bernd Wurst authored 7 months ago

Invoice/InvoiceToZUGFeRD.py               81)         doc.trade.agreement.seller.contact.email.address = invoice.seller['email']
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py               82) 
Invoice/InvoiceToZUGFeRD.py               83)     # Buyer-Address
Invoice/InvoiceToZUGFeRD.py               84)     doc.trade.agreement.buyer.name = invoice.customer['name']
Invoice/InvoiceToZUGFeRD.py               85)     doc.trade.agreement.buyer.address.country_id = invoice.customer['address']['country_id']
Invoice/InvoiceToZUGFeRD.py               86)     doc.trade.agreement.buyer.address.postcode = invoice.customer['address']['postcode']
Invoice/InvoiceToZUGFeRD.py               87)     doc.trade.agreement.buyer.address.city_name = invoice.customer['address']['city_name']
Invoice/InvoiceToZUGFeRD.py               88)     doc.trade.agreement.buyer.address.line_one = invoice.customer['address']['line1']
Invoice/InvoiceToZUGFeRD.py               89)     doc.trade.agreement.buyer.address.line_two = invoice.customer['address']['line2']
Invoice/InvoiceToZUGFeRD.py               90)     doc.trade.agreement.buyer.address.line_three = invoice.customer['address']['line3']
Bernd Wurst Käufer-E-Mail und -Telefon...

Bernd Wurst authored 4 months ago

Invoice/InvoiceToZUGFeRD.py               91)     # E-Mail-Adresse des Kunden auf jeden Fall in den Kontakt
Invoice/InvoiceToZUGFeRD.py               92)     if invoice.buyer['email']:
Invoice/InvoiceToZUGFeRD.py               93)         doc.trade.agreement.buyer.contact.email.address = invoice.buyer['email']
Invoice/InvoiceToZUGFeRD.py               94)     if invoice.buyer['phone']:
Invoice/InvoiceToZUGFeRD.py               95)         doc.trade.agreement.buyer.contact.telephone.number = invoice.buyer['phone']
Bernd Wurst Käufer-USt-ID inkludieren w...

Bernd Wurst authored 5 months ago

Invoice/InvoiceToZUGFeRD.py               96)     if invoice.buyer_vat_id:
Invoice/InvoiceToZUGFeRD.py               97)         tax_reg = TaxRegistration()
Invoice/InvoiceToZUGFeRD.py               98)         tax_reg.id = ('VA', invoice.buyer_vat_id)
Invoice/InvoiceToZUGFeRD.py               99)         doc.trade.agreement.buyer.tax_registrations.add(tax_reg)
Bernd Wurst Das XML validiert jetzt als...

Bernd Wurst authored 7 months ago

Invoice/InvoiceToZUGFeRD.py              100)     if invoice.leitweg_id:
Invoice/InvoiceToZUGFeRD.py              101)         leitwegid = URIUniversalCommunication()
Invoice/InvoiceToZUGFeRD.py              102)         leitwegid.uri_ID = ('0204', invoice.leitweg_id)
Invoice/InvoiceToZUGFeRD.py              103)         doc.trade.agreement.buyer.electronic_address.add(leitwegid)
Invoice/InvoiceToZUGFeRD.py              104)     # Bei ZUGFeRD 2.1 darf das Feld nur einmal vorkommen. In XRechnung 3.0 darf es mehrmals drin sein.
Invoice/InvoiceToZUGFeRD.py              105)     # drafthorse kann aktuell noch kein XRechnung 3.0 erzeugen, daher hier als "elif".
Invoice/InvoiceToZUGFeRD.py              106)     elif invoice.buyer['email']:
Invoice/InvoiceToZUGFeRD.py              107)         email = URIUniversalCommunication()
Invoice/InvoiceToZUGFeRD.py              108)         email.uri_ID = ('EM', invoice.buyer['email'])
Invoice/InvoiceToZUGFeRD.py              109)         doc.trade.agreement.buyer.electronic_address.add(email)
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              110) 
Bernd Wurst Telefonnummer

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              111)     if invoice.buyer_reference:
Invoice/InvoiceToZUGFeRD.py              112)         doc.trade.agreement.buyer_reference = invoice.buyer_reference
Bernd Wurst Das XML validiert jetzt als...

Bernd Wurst authored 7 months ago

Invoice/InvoiceToZUGFeRD.py              113)     elif invoice.leitweg_id:
Invoice/InvoiceToZUGFeRD.py              114)         # "Leitweg-ID" in XRechnung
Invoice/InvoiceToZUGFeRD.py              115)         # Wenn wir hier sind, ist die aber bereits in der electronic_address eingetragen,
Invoice/InvoiceToZUGFeRD.py              116)         # daher hier nur noch wiederholen, wenn wir das Feld nicht für was anderes brauchen (Kunden-Referenz).
Invoice/InvoiceToZUGFeRD.py              117)         doc.trade.agreement.buyer_reference = invoice.leitweg_id
Bernd Wurst Referenznummern auf allen A...

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              118)     if invoice.order_number:
Invoice/InvoiceToZUGFeRD.py              119)         doc.trade.agreement.buyer_order.issuer_assigned_id = invoice.order_number
Invoice/InvoiceToZUGFeRD.py              120)     if invoice.contract_number:
Invoice/InvoiceToZUGFeRD.py              121)         doc.trade.agreement.contract.issuer_assigned_id = invoice.contract_number
Bernd Wurst Telefonnummer

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              122) 
Bernd Wurst Nutze das globale Leistungs...

Bernd Wurst authored 7 months ago

Invoice/InvoiceToZUGFeRD.py              123)     # Wenn alle Leistungsdaten aller Posten exakt ein fixes Datum sind, sollte statt dem Datumbereich der
Invoice/InvoiceToZUGFeRD.py              124)     # einzelnen Posten doc.trade.delivery.event.occurence verwendet werden. Dazu müssen vorab alle Posten
Invoice/InvoiceToZUGFeRD.py              125)     # aller Tabellen geprüft werden
Invoice/InvoiceToZUGFeRD.py              126)     only_one_date = True
Invoice/InvoiceToZUGFeRD.py              127)     deliverydate = None
Invoice/InvoiceToZUGFeRD.py              128)     try:
Invoice/InvoiceToZUGFeRD.py              129)         for part in invoice.parts:
Invoice/InvoiceToZUGFeRD.py              130)             if not isinstance(part, InvoiceTable):
Invoice/InvoiceToZUGFeRD.py              131)                 continue
Invoice/InvoiceToZUGFeRD.py              132)             for el in part.entries:
Invoice/InvoiceToZUGFeRD.py              133)                 end = None
Invoice/InvoiceToZUGFeRD.py              134)                 start = None
Invoice/InvoiceToZUGFeRD.py              135)                 if 'period_end' in el and el['period_end']:
Invoice/InvoiceToZUGFeRD.py              136)                     end = el['period_end']
Invoice/InvoiceToZUGFeRD.py              137)                 if 'period_start' in el and el['period_start']:
Invoice/InvoiceToZUGFeRD.py              138)                     start = el['period_start']
Invoice/InvoiceToZUGFeRD.py              139)                 if start and end and start != end:
Invoice/InvoiceToZUGFeRD.py              140)                     deliverydate = None
Invoice/InvoiceToZUGFeRD.py              141)                     only_one_date = False
Invoice/InvoiceToZUGFeRD.py              142)                     raise Exception('loop abort')
Invoice/InvoiceToZUGFeRD.py              143)                 if start and not deliverydate:
Invoice/InvoiceToZUGFeRD.py              144)                     deliverydate = el['period_start']
Invoice/InvoiceToZUGFeRD.py              145)                     continue
Invoice/InvoiceToZUGFeRD.py              146)                 if start != deliverydate:
Invoice/InvoiceToZUGFeRD.py              147)                     deliverydate = None
Invoice/InvoiceToZUGFeRD.py              148)                     only_one_date = False
Invoice/InvoiceToZUGFeRD.py              149)                     raise Exception('loop abort')
Invoice/InvoiceToZUGFeRD.py              150)     except Exception as e:
Invoice/InvoiceToZUGFeRD.py              151)         pass
Invoice/InvoiceToZUGFeRD.py              152)     if only_one_date and deliverydate:
Invoice/InvoiceToZUGFeRD.py              153)         doc.trade.delivery.event.occurrence = deliverydate
Invoice/InvoiceToZUGFeRD.py              154) 
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              155)     # Line Items
Invoice/InvoiceToZUGFeRD.py              156)     summe_netto = 0.0
Invoice/InvoiceToZUGFeRD.py              157)     summe_brutto = 0.0
Invoice/InvoiceToZUGFeRD.py              158)     summe_bezahlt = 0.0
Invoice/InvoiceToZUGFeRD.py              159)     summe_ust = 0.0
Invoice/InvoiceToZUGFeRD.py              160)     line_id_count = 0
Invoice/InvoiceToZUGFeRD.py              161)     textparts = []
Invoice/InvoiceToZUGFeRD.py              162)     for part in invoice.parts:
Bernd Wurst Codestyle-Fixes

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              163)         if isinstance(part, InvoiceText):
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              164)             textparts += part.paragraphs
Bernd Wurst Codestyle-Fixes

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              165)         if isinstance(part, InvoiceTable):
Bernd Wurst Zwischenüberschriften in de...

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              166)             last_title = None
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              167)             for el in part.entries:
Bernd Wurst Zwischenüberschriften in de...

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              168)                 if el['type'] == 'title':
Invoice/InvoiceToZUGFeRD.py              169)                     # Diese Information ist im XML nicht auf diese Weise darstellbar
Invoice/InvoiceToZUGFeRD.py              170)                     last_title = el['title']
Invoice/InvoiceToZUGFeRD.py              171)                     continue
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              172)                 line_id_count += 1
Invoice/InvoiceToZUGFeRD.py              173)                 li = LineItem()
Invoice/InvoiceToZUGFeRD.py              174)                 li.document.line_id = f"{line_id_count}"
Bernd Wurst Zwischenüberschriften in de...

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              175)                 if last_title:
Invoice/InvoiceToZUGFeRD.py              176)                     title = IncludedNote()
Invoice/InvoiceToZUGFeRD.py              177)                     title.content.add(last_title)
Invoice/InvoiceToZUGFeRD.py              178)                     li.document.notes.add(title)
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              179)                 li.product.name = el['subject']
Invoice/InvoiceToZUGFeRD.py              180)                 if 'desc' in el and el['desc'] != '':
Bernd Wurst typo

Bernd Wurst authored 10 months ago

src/rechnung/Invoice/InvoiceToZUGFeRD.py 181)                     li.product.description = el['desc']
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              182) 
Bernd Wurst Nutze das globale Leistungs...

Bernd Wurst authored 7 months ago

Invoice/InvoiceToZUGFeRD.py              183)                 if not only_one_date:
Invoice/InvoiceToZUGFeRD.py              184)                     if 'period_start' in el and el['period_start']:
Invoice/InvoiceToZUGFeRD.py              185)                         li.settlement.period.start = el['period_start']
Invoice/InvoiceToZUGFeRD.py              186)                         if 'period_end' in el and el['period_end']:
Invoice/InvoiceToZUGFeRD.py              187)                             li.settlement.period.end = el['period_end']
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              188) 
Bernd Wurst Einheiten soweit möglich al...

Bernd Wurst authored 8 months ago

Invoice/InvoiceToZUGFeRD.py              189)                 unit = 'C62'
Invoice/InvoiceToZUGFeRD.py              190)                 if el['unit']:
Invoice/InvoiceToZUGFeRD.py              191)                     for key, value in UNITS.items():
Invoice/InvoiceToZUGFeRD.py              192)                         if el['unit'] in value:
Invoice/InvoiceToZUGFeRD.py              193)                             unit = key
Invoice/InvoiceToZUGFeRD.py              194)                 li.delivery.billed_quantity = (Decimal(el['count']), unit)
Bernd Wurst Kleine Korrekturen, mache B...

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              195)                 # C62 = ohne Einheit
Invoice/InvoiceToZUGFeRD.py              196)                 # H87 = Stück
Bernd Wurst Einheiten soweit möglich al...

Bernd Wurst authored 8 months ago

Invoice/InvoiceToZUGFeRD.py              197)                 # MON = Month, SEC = second, MIN = minute, HUR = hour, DAY = day, WEE = week, ANN = year
Invoice/InvoiceToZUGFeRD.py              198)                 # LTR = Liter, MTQ = m³
Invoice/InvoiceToZUGFeRD.py              199)                 # GRM = gram, KGM = Kilogram, TNE = Tonne, DTN = decitonne,
Invoice/InvoiceToZUGFeRD.py              200)                 # MTR = Meter, MMT = Millimeter, KMT = Kilometer
Invoice/InvoiceToZUGFeRD.py              201)                 # MTK = m²
Invoice/InvoiceToZUGFeRD.py              202)                 # KWT = kW, MAW = MW, KWH = kWh, MWH = MWh
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              203) 
Invoice/InvoiceToZUGFeRD.py              204)                 li.settlement.trade_tax.type_code = "VAT"
Invoice/InvoiceToZUGFeRD.py              205)                 if invoice.vat_type == VAT_REGULAR:
Invoice/InvoiceToZUGFeRD.py              206)                     li.settlement.trade_tax.category_code = "S"
Invoice/InvoiceToZUGFeRD.py              207)                 elif invoice.vat_type == VAT_KLEINUNTERNEHMER:
Invoice/InvoiceToZUGFeRD.py              208)                     li.settlement.trade_tax.category_code = "E"
Invoice/InvoiceToZUGFeRD.py              209)                 elif invoice.vat_type == VAT_INNERGEM:
Invoice/InvoiceToZUGFeRD.py              210)                     li.settlement.trade_tax.category_code = "K"
Invoice/InvoiceToZUGFeRD.py              211)                 # FIXME: Typ bei uns nur global gesetzt, nicht pro Artikel
Invoice/InvoiceToZUGFeRD.py              212)                 # S = Standard VAT rate
Invoice/InvoiceToZUGFeRD.py              213)                 # Z = Zero rated goods
Invoice/InvoiceToZUGFeRD.py              214)                 # E = VAT exempt
Invoice/InvoiceToZUGFeRD.py              215)                 # AE = Reverse charge
Invoice/InvoiceToZUGFeRD.py              216)                 # K = Intra-Community supply (specific reverse charge)
Invoice/InvoiceToZUGFeRD.py              217)                 # G = Exempt VAT for Export outside EU
Invoice/InvoiceToZUGFeRD.py              218)                 # O = Outside VAT scope
Bernd Wurst Kontoinhaber im XML einsetzen

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              219)                 li.settlement.trade_tax.rate_applicable_percent = Decimal(f"{el['vat'] * 100:.1f}")
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              220) 
Invoice/InvoiceToZUGFeRD.py              221)                 nettopreis = el['price']
Invoice/InvoiceToZUGFeRD.py              222)                 if part.vatType == 'gross':
Invoice/InvoiceToZUGFeRD.py              223)                     nettopreis = el['price'] / (1 + el['vat'])
Bernd Wurst Nettopreis mit drei Dezimal...

Bernd Wurst authored 1 month ago

Invoice/InvoiceToZUGFeRD.py              224)                 li.agreement.net.amount = Decimal(f"{nettopreis:.3f}")
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              225) 
Invoice/InvoiceToZUGFeRD.py              226)                 nettosumme = el['total']
Invoice/InvoiceToZUGFeRD.py              227)                 if part.vatType == 'gross':
Invoice/InvoiceToZUGFeRD.py              228)                     nettosumme = el['total'] / (1 + el['vat'])
Bernd Wurst Nettopreis mit drei Dezimal...

Bernd Wurst authored 1 month ago

Invoice/InvoiceToZUGFeRD.py              229)                 li.settlement.monetary_summation.total_amount = Decimal(f"{nettosumme:.3f}")
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              230) 
Invoice/InvoiceToZUGFeRD.py              231)                 summe_netto += nettosumme
Bernd Wurst Bei Nettorechnungen waren d...

Bernd Wurst authored 5 months ago

Invoice/InvoiceToZUGFeRD.py              232)                 if part.vatType == 'net':
Invoice/InvoiceToZUGFeRD.py              233)                     summe_brutto += el['total'] * (1 + el['vat'])
Invoice/InvoiceToZUGFeRD.py              234)                 else:
Invoice/InvoiceToZUGFeRD.py              235)                     summe_brutto += el['total']
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              236)                 doc.trade.items.add(li)
Invoice/InvoiceToZUGFeRD.py              237) 
Invoice/InvoiceToZUGFeRD.py              238)             for pay in part.payments:
Invoice/InvoiceToZUGFeRD.py              239)                 summe_bezahlt += pay['amount']
Invoice/InvoiceToZUGFeRD.py              240) 
Invoice/InvoiceToZUGFeRD.py              241)             for vat, vatdata in part.vat.items():
Invoice/InvoiceToZUGFeRD.py              242)                 trade_tax = ApplicableTradeTax()
Invoice/InvoiceToZUGFeRD.py              243)                 # Steuerbetrag dieses Steuersatzes
Bernd Wurst Bei Nettorechnungen waren d...

Bernd Wurst authored 5 months ago

Invoice/InvoiceToZUGFeRD.py              244)                 amount = vatdata[0] * vat
Invoice/InvoiceToZUGFeRD.py              245)                 if part.vatType == 'gross':
Invoice/InvoiceToZUGFeRD.py              246)                     amount = (vatdata[0] / (vat + 1)) * vat
Invoice/InvoiceToZUGFeRD.py              247)                 trade_tax.calculated_amount = Decimal(f"{amount:.2f}")
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              248)                 # Nettosumme dieses Steuersatzes
Bernd Wurst Bei Nettorechnungen waren d...

Bernd Wurst authored 5 months ago

Invoice/InvoiceToZUGFeRD.py              249)                 amount = vatdata[0]
Invoice/InvoiceToZUGFeRD.py              250)                 if part.vatType == 'gross':
Invoice/InvoiceToZUGFeRD.py              251)                     amount = amount / (1 + vat)
Invoice/InvoiceToZUGFeRD.py              252)                 trade_tax.basis_amount = Decimal(f"{amount:.2f}")
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              253)                 trade_tax.type_code = "VAT"
Invoice/InvoiceToZUGFeRD.py              254)                 if invoice.vat_type == VAT_REGULAR:
Invoice/InvoiceToZUGFeRD.py              255)                     trade_tax.category_code = "S"
Invoice/InvoiceToZUGFeRD.py              256)                 elif invoice.vat_type == VAT_KLEINUNTERNEHMER:
Invoice/InvoiceToZUGFeRD.py              257)                     trade_tax.category_code = "E"
Invoice/InvoiceToZUGFeRD.py              258)                     trade_tax.exemption_reason = 'Als Kleinunternehmer wird gemäß §19 UStG keine USt in Rechnung gestellt.'
Invoice/InvoiceToZUGFeRD.py              259)                 elif invoice.vat_type == VAT_INNERGEM:
Invoice/InvoiceToZUGFeRD.py              260)                     trade_tax.category_code = "K"
Bernd Wurst Kontoinhaber im XML einsetzen

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              261)                 trade_tax.rate_applicable_percent = Decimal(f"{vat * 100:.1f}")
Bernd Wurst Bei Nettorechnungen waren d...

Bernd Wurst authored 5 months ago

Invoice/InvoiceToZUGFeRD.py              262)                 if part.vatType == 'gross':
Invoice/InvoiceToZUGFeRD.py              263)                     summe_ust += (vatdata[0] / (vat + 1)) * vat
Invoice/InvoiceToZUGFeRD.py              264)                 else:
Invoice/InvoiceToZUGFeRD.py              265)                     summe_ust += vatdata[0] * vat
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              266)                 doc.trade.settlement.trade_tax.add(trade_tax)
Invoice/InvoiceToZUGFeRD.py              267) 
Invoice/InvoiceToZUGFeRD.py              268)     for paragraph in textparts:
Invoice/InvoiceToZUGFeRD.py              269)         note = IncludedNote()
Invoice/InvoiceToZUGFeRD.py              270)         note.content.add(paragraph)
Invoice/InvoiceToZUGFeRD.py              271)         doc.header.notes.add(note)
Invoice/InvoiceToZUGFeRD.py              272) 
Invoice/InvoiceToZUGFeRD.py              273)     rest = summe_brutto - summe_bezahlt
Invoice/InvoiceToZUGFeRD.py              274) 
Invoice/InvoiceToZUGFeRD.py              275)     if invoice.creditor_reference_id:
Invoice/InvoiceToZUGFeRD.py              276)         # Gläubiger-ID für SEPA
Invoice/InvoiceToZUGFeRD.py              277)         doc.trade.settlement.creditor_reference_id = invoice.creditor_reference_id
Invoice/InvoiceToZUGFeRD.py              278)     doc.trade.settlement.payment_reference = invoice.id
Invoice/InvoiceToZUGFeRD.py              279)     doc.trade.settlement.currency_code = 'EUR'
Bernd Wurst WiP

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              280)     if invoice.payment_type:
Invoice/InvoiceToZUGFeRD.py              281)         doc.trade.settlement.payment_means.type_code = invoice.payment_type
Invoice/InvoiceToZUGFeRD.py              282) 
Invoice/InvoiceToZUGFeRD.py              283)     if invoice.seller_bank_data['iban'] and invoice.payment_type == PAYMENT_UEBERWEISUNG:
Bernd Wurst Kontoinhaber im XML einsetzen

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              284)         doc.trade.settlement.payment_means.payee_account.account_name = \
Invoice/InvoiceToZUGFeRD.py              285)             invoice.seller_bank_data['kontoinhaber'] or invoice.seller['trade_name'] or invoice.seller['name']
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              286)         doc.trade.settlement.payment_means.payee_account.iban = invoice.seller_bank_data['iban']
Bernd Wurst Kleine Korrekturen, mache B...

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              287)         if invoice.seller_bank_data['bic']:
Invoice/InvoiceToZUGFeRD.py              288)             doc.trade.settlement.payment_means.payee_institution.bic = invoice.seller_bank_data['bic']
Bernd Wurst WiP

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              289)     if invoice.buyer_bank_data['iban'] and invoice.payment_type == PAYMENT_LASTSCHRIFT:
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              290)         # Kunden-Bankverbindung bei Lastschrift
Invoice/InvoiceToZUGFeRD.py              291)         doc.trade.settlement.payment_means.payer_account.iban = invoice.buyer_bank_data['iban']
Invoice/InvoiceToZUGFeRD.py              292) 
Invoice/InvoiceToZUGFeRD.py              293)     terms = PaymentTerms()
Bernd Wurst WiP

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              294)     if invoice.due_date and invoice.payment_type == PAYMENT_UEBERWEISUNG:
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              295)         terms.description = f"Bitte begleichen Sie den Betrag bis zum {invoice.due_date.strftime('%d.%m.%Y')} ohne Abzüge."
Invoice/InvoiceToZUGFeRD.py              296)         terms.due = invoice.due_date
Bernd Wurst Kleine Korrekturen, mache B...

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              297)     if invoice.type in [GUTSCHRIFT, KORREKTUR]:
Bernd Wurst WiP

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              298)         terms.description = f"Wir überweisen den Betrag auf Ihr Konto."
Invoice/InvoiceToZUGFeRD.py              299)     elif invoice.debit:
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              300)         if invoice.debit_mandate_id:
Invoice/InvoiceToZUGFeRD.py              301)             # Mandatsreferenz für Lastschrift
Invoice/InvoiceToZUGFeRD.py              302)             terms.debit_mandate_id = invoice.debit_mandate_id
Invoice/InvoiceToZUGFeRD.py              303)         terms.description = 'Wir buchen von Ihrem Konto ab.'
Invoice/InvoiceToZUGFeRD.py              304)     doc.trade.settlement.terms.add(terms)
Invoice/InvoiceToZUGFeRD.py              305) 
Invoice/InvoiceToZUGFeRD.py              306)     doc.trade.settlement.monetary_summation.line_total = Decimal(f"{summe_netto:.2f}")
Invoice/InvoiceToZUGFeRD.py              307)     doc.trade.settlement.monetary_summation.charge_total = Decimal("0.00")
Invoice/InvoiceToZUGFeRD.py              308)     doc.trade.settlement.monetary_summation.allowance_total = Decimal("0.00")
Invoice/InvoiceToZUGFeRD.py              309)     doc.trade.settlement.monetary_summation.tax_basis_total = Decimal(f"{summe_netto:.2f}")
Invoice/InvoiceToZUGFeRD.py              310)     doc.trade.settlement.monetary_summation.tax_total = (Decimal(f"{summe_ust:.2f}"), "EUR")
Invoice/InvoiceToZUGFeRD.py              311)     doc.trade.settlement.monetary_summation.prepaid_total = Decimal(f"{summe_bezahlt:.2f}")
Invoice/InvoiceToZUGFeRD.py              312)     doc.trade.settlement.monetary_summation.grand_total = Decimal(f"{summe_brutto:.2f}")
Invoice/InvoiceToZUGFeRD.py              313)     doc.trade.settlement.monetary_summation.due_amount = Decimal(f"{rest:.2f}")
Invoice/InvoiceToZUGFeRD.py              314) 
Invoice/InvoiceToZUGFeRD.py              315)     # Generate XML file
Bernd Wurst Fehlendenden Namespace QDT...

Bernd Wurst authored 1 month ago

Invoice/InvoiceToZUGFeRD.py              316)     xml = add_namespace(doc.serialize(schema="FACTUR-X_EXTENDED"))
Bernd Wurst In eigenes GIT ausgelagert

Bernd Wurst authored 10 months ago

Invoice/InvoiceToZUGFeRD.py              317)     return xml