ich habe mit heute ein kleines Programm gebastelt um die Umsatzsteueridentifikationsnummern(VAT) ausländischer Unternehmen zu prüfen. Nun wollte ich das Ganze auch anderen zur Verfügung stellen und habe schon einen Account bei GitHub erstellt. Vor dem hochladen würde ich jedoch gerne noch ein paar Dinge verbessern und würde mich über Kommentare zu dem Code freuen.
Man trägt die eigene und die zu prüfende VAT-Nummer ein und mit einem klick auf den "Check"-Button wir eine Anfrage mittels xmlrpc an das Bundeszentralamt für Steuern gesendet. Die Werte des zurückgelieferte Ergebnisses werden mittels xml.etree.ElementTree ausgelesen und als Dict gespeichert. Einer dieser Werte ist der "ErrorCode". Mit diesem wird die dazu passende Erläuterung aus dem "error_dict" geladen. Die Erläuterung sowie alle zurückgelieferten Werte werden in einem TextView angezeigt.
Hinweis: Mit "Request Confirmation via Letter" kann man eine schriftliche Bestätigung anfragen. Bitte nicht zum Spaß drücken.
Mehr Informationen dazu:
https://evatr.bff-online.de/eVatR/xmlrpc/
Probleme habe ich mit der Strukturierung. Auf Fehler bin ich gar nicht eingegangen und auch die Werte auslesen und anzeigen erinnert eher an einen Hack.
Wie gesagt, freue mich über Rückmeldungen und Verbesserungsvorschläge.
Code: Alles auswählen
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import gtk
import xmlrpclib
import xml.etree.ElementTree as ET
server_url = 'https://evatr.bff-online.de/'
server = xmlrpclib.Server(server_url)
xmlrpclib.socket.setdefaulttimeout(5)
error_dict = {
"200" : "Die angefragte USt-IdNr. ist 219.",
"201" : "Die angefragte USt-IdNr. ist ungültig.",
"202" : "Die angefragte USt-IdNr. ist ungültig. Sie ist nicht in der Unternehmerdatei des betreffenden EU-Mitgliedstaates registriert.\nHinweis:\nIhr Geschäftspartner kann seine gültige USt-IdNr. bei der für ihn zuständigen Finanzbehörde in Erfahrung bringen. Möglicherweise muss er einen Antrag stellen, damit seine USt-IdNr. in die Datenbank aufgenommen wird.",
"203" : "Die angefragte USt-IdNr. ist ungültig. Sie ist erst ab dem ... gültig (siehe Feld 'Gueltig_ab').",
"204" : "Die angefragte USt-IdNr. ist ungültig. Sie war im Zeitraum von ... bis ... gültig (siehe Feld 'Gueltig_ab' und 'Gueltig_bis').",
"205" : "Ihre Anfrage kann derzeit durch den angefragten EU-Mitgliedstaat oder aus anderen Gründen nicht beantwortet werden. Bitte versuchen Sie es später noch einmal. Bei wiederholten Problemen wenden Sie sich bitte an das Bundeszentralamt für Steuern - Dienstsitz Saarlouis.",
"206" : "Ihre deutsche USt-IdNr. ist ungültig. Eine Bestätigungsanfrage ist daher nicht möglich. Den Grund hierfür können Sie beim Bundeszentralamt für Steuern - Dienstsitz Saarlouis - erfragen.",
"207" : "Ihnen wurde die deutsche USt-IdNr. ausschliesslich zu Zwecken der Besteuerung des innergemeinschaftlichen Erwerbs erteilt. Sie sind somit nicht berechtigt, Bestätigungsanfragen zu stellen.",
"208" : "Für die von Ihnen angefragte USt-IdNr. läuft gerade eine Anfrage von einem anderen Nutzer. Eine Bearbeitung ist daher nicht möglich. Bitte versuchen Sie es später noch einmal.",
"209" : "Die angefragte USt-IdNr. ist ungültig. Sie entspricht nicht dem Aufbau der für diesen EU-Mitgliedstaat gilt. ( Aufbau der USt-IdNr. aller EU-Länder)",
"210" : "Die angefragte USt-IdNr. ist ungültig. Sie entspricht nicht den Prüfziffernregeln die für diesen EU-Mitgliedstaat gelten.",
"211" : "Die angefragte USt-IdNr. ist ungültig. Sie enthält unzulässige Zeichen.",
"212" : "Die angefragte USt-IdNr. ist ungültig. Sie enthält ein unzulässiges Länderkennzeichen.",
"213" : "Die Abfrage einer deutschen USt-IdNr. ist nicht möglich.",
"214" : "Ihre deutsche USt-IdNr. ist fehlerhaft. Sie beginnt mit 'DE' gefolgt von 9 Ziffern.",
"215" : "Ihre Anfrage enthält nicht alle notwendigen Angaben für eine einfache Bestätigungsanfrage (Ihre deutsche USt-IdNr. und die ausl. USt-IdNr.).\nIhre Anfrage kann deshalb nicht bearbeitet werden.",
"216" : "Ihre Anfrage enthält nicht alle notwendigen Angaben für eine qualifizierte Bestätigungsanfrage (Ihre deutsche USt-IdNr., die ausl. USt-IdNr., Firmenname einschl. Rechtsform und Ort).\nEs wurde eine einfache Bestätigungsanfrage durchgeführt mit folgenden Ergebnis:\nDie angefragte USt-IdNr. ist gültig.",
"217" : "Bei der Verarbeitung der Daten aus dem angefragten EU-Mitgliedstaat ist ein Fehler aufgetreten. Ihre Anfrage kann deshalb nicht bearbeitet werden.",
"218" : "Eine qualifizierte Bestätigung ist zur Zeit nicht möglich. Es wurde eine einfache Bestätigungsanfrage mit folgendem Ergebnis durchgeführt:\nDie angefragte USt-IdNr. ist gültig.",
"219" : "Bei der Durchführung der qualifizierten Bestätigungsanfrage ist ein Fehler aufgetreten. Es wurde eine einfache Bestätigungsanfrage mit folgendem Ergebnis durchgeführt:\nDie angefragte USt-IdNr. ist gültig.",
"220" : "Bei der Anforderung der amtlichen Bestätigungsmitteilung ist ein Fehler aufgetreten. Sie werden kein Schreiben erhalten.",
"999" : "Eine Bearbeitung Ihrer Anfrage ist zurzeit nicht möglich. Bitte versuchen Sie es später noch einmal."
}
yellow = "#FFFF66"
green = "#66FF66"
red = "#ff8080"
orange = "#FFAD66"
# Basisklasse
class CheckVAT:
# define close
def destroy(selb, widget, data=None):
gtk.main_quit()
def check(self, widget):
# necessary
UstId_1 = self.self_vat_entry.get_text()
UstId_2 = self.external_vat_entry.get_text()
# extended
Firmenname = self.external_name_entry.get_text()
Ort = self.external_city_entry.get_text()
# optional
PLZ = self.external_zip_code_entry.get_text()
Strasse = self.external_street_entry.get_text()
if self.checkbutton_print.get_active():
Druck = "ja"
else:
Druck = "nein"
# request
rpc = server.evatrRPC(UstId_1, UstId_2, Firmenname, Ort, PLZ, Strasse, Druck)
# result
root = ET.fromstring(rpc)
# results to dict
return_dict={}
for s_element in root.findall("param"):
keyvalue = []
for child in s_element.iter('string'):
keyvalue.append( child.text )
return_dict[keyvalue[0]] = keyvalue[1]
# create result output text
printdata = ""
for d in return_dict.keys():
if return_dict[d]:
printdata += d+": "+return_dict[d]+"\n"
errorcode = error_dict[return_dict["ErrorCode"]]
printresults = printdata + "\n\n" + errorcode
# color output view background
if return_dict["ErrorCode"] == "200":
self.content_textview.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse(green))
elif return_dict["ErrorCode"] in ["216,219"]:
self.content_textview.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse(orange))
else:
self.content_textview.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse(red))
#show result
self.content_textbuffer.set_text(printresults)
def __init__(self):
# define main window
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_position(gtk.WIN_POS_CENTER)
self.window.set_size_request(600, 500)
self.window.set_title("Check VAT CODEs")
# HBOX 1 - Own Data
self.hbox1_selfinfo = gtk.VBox()
self.selfinfo_label = gtk.Label("Own Data:")
self.hbox1_selfinfo.pack_start(self.selfinfo_label)
self.self_vat_box = gtk.HBox(homogeneous=True)
self.self_vat = ''
self.self_vat_label = gtk.Label("Own VAT Code (necessary)")
self.self_vat_entry = gtk.Entry()
self.self_vat_entry.set_text(self.self_vat)
self.self_vat_box.pack_start(self.self_vat_label)
self.self_vat_box.pack_start(self.self_vat_entry)
self.hbox1_selfinfo.pack_start(self.self_vat_box)
# HBox 2 - Firmendaten Externe Firma
self.hbox2_external = gtk.VBox()
self.hbox2_external_label = gtk.Label("Other Company Data:")
self.hbox2_external.pack_start(self.hbox2_external_label, expand = False, fill = False)
# VAT
self.external_vat_box = gtk.HBox(homogeneous=True)
self.external_vat = ''
self.external_vat_label = gtk.Label("VAT Code (necessary)")
self.external_vat_entry = gtk.Entry()
self.external_vat_entry.set_text(self.external_vat)
self.external_vat_box.pack_start(self.external_vat_label)
self.external_vat_box.pack_start(self.external_vat_entry)
self.hbox2_external.pack_start(self.external_vat_box, expand = False, fill = False)
# Name
self.external_name_box = gtk.HBox(homogeneous=True)
self.external_name = ''
self.external_name_label = gtk.Label("Name (extended)")
self.external_name_entry = gtk.Entry()
self.external_name_entry.set_text(self.external_name)
self.external_name_box.pack_start(self.external_name_label)
self.external_name_box.pack_start(self.external_name_entry)
self.hbox2_external.pack_start(self.external_name_box, expand = False, fill = False)
# City
self.external_city_box = gtk.HBox(homogeneous=True)
self.external_city = ''
self.external_city_label = gtk.Label("City (extended)")
self.external_city_entry = gtk.Entry()
self.external_city_entry.set_text(self.external_city)
self.external_city_box.pack_start(self.external_city_label)
self.external_city_box.pack_start(self.external_city_entry)
self.hbox2_external.pack_start(self.external_city_box, expand = False, fill = False)
# Zip code
self.external_zip_code_box = gtk.HBox(homogeneous=True)
self.external_zip_code = ''
self.external_zip_code_label = gtk.Label("Zip code (optional)")
self.external_zip_code_entry = gtk.Entry()
self.external_zip_code_entry.set_text(self.external_zip_code)
self.external_zip_code_box.pack_start(self.external_zip_code_label)
self.external_zip_code_box.pack_start(self.external_zip_code_entry)
self.hbox2_external.pack_start(self.external_zip_code_box, expand = False, fill = False)
# Street
self.external_street_box = gtk.HBox(homogeneous=True)
self.external_street = ''
self.external_street_label = gtk.Label("Street (optional)")
self.external_street_entry = gtk.Entry()
self.external_street_entry.set_text(self.external_street)
self.external_street_box.pack_start(self.external_street_label)
self.external_street_box.pack_start(self.external_street_entry)
self.hbox2_external.pack_start(self.external_street_box, expand = False, fill = False)
## BUTTONS
self.buttonbox = gtk.HBox()
# Check Button
self.check_button = gtk.Button("Check")
self.check_button.connect("clicked", self.check)
self.buttonbox.pack_start(self.check_button)
# Print Checkbutton
self.checkbutton_print = gtk.CheckButton("Request Confirmation via Letter")
self.buttonbox.pack_start(self.checkbutton_print)
# Exit Button
self.exitbutton = gtk.Button("Exit")
self.exitbutton.connect("clicked", self.destroy)
self.buttonbox.pack_start(self.exitbutton)
## RESULTS
self.result_box = gtk.VBox()
# Label
self.result_label = gtk.Label("Results:")
self.result_box.pack_start(self.result_label, expand = False, fill = False)
# Content
self.content_textbuffer = gtk.TextBuffer()
self.content_textbuffer.set_text("...")
self.content_textview = gtk.TextView(buffer=self.content_textbuffer)
#self.content_textview.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse(yellow))
self.content_textview.set_wrap_mode("GTK_WRAP_WORD")
self.result_box.pack_start(self.content_textview)
## Set boxes and content
self.box1 = gtk.VBox(spacing=8)
self.box1.pack_start(self.hbox1_selfinfo, expand = False, fill = False)
self.box1.pack_start(self.hbox2_external, expand = False, fill = False)
self.box1.pack_start(self.buttonbox, expand = False, fill = False)
self.box1.pack_start(self.result_box)
# Add box to main window
self.window.add(self.box1)
# call all
self.window.show_all()
#connect exit button and exit function
self.window.connect("destroy", self.destroy)
def main(self):
gtk.main()
if __name__ == "__main__":
checkvat = CheckVAT()
checkvat.main()