282 lines
15 KiB
Python
282 lines
15 KiB
Python
#######################################################################################################################
|
|
##### Import #####
|
|
#######################################################################################################################
|
|
from tkinter import*
|
|
from datetime import datetime
|
|
import cv2
|
|
import numpy as np
|
|
from pyzbar.pyzbar import decode
|
|
import requests
|
|
|
|
|
|
#######################################################################################################################
|
|
##### Server-Options #####
|
|
#######################################################################################################################
|
|
WebServiceURL = "172.24.12.56"
|
|
WebServiceBenutzerName = "a"
|
|
WebServiceBenutzerPasswort = "b"
|
|
WinLineMandant = "MEDT"
|
|
WebServiceTemplateSTART = "Zeitnahme"
|
|
WebServiceTemplateSTOP = "STOP"
|
|
WebServiceType = "36"
|
|
WebServiceActioncode = "1"
|
|
|
|
#######################################################################################################################
|
|
##### WinLine-Options #####
|
|
#######################################################################################################################
|
|
Fehlzeitenstamm = "1"
|
|
|
|
#######################################################################################################################
|
|
###### Frame ######
|
|
#######################################################################################################################
|
|
def BuildMainFrame():
|
|
fenster = Tk()
|
|
fenster.configure(bg="white")
|
|
fenster.title("DD-Zeiterfassung")
|
|
fenster.geometry("1024x768")
|
|
|
|
start_button = Button(fenster, text="Arbeitstag beginnen", fg="white", bg="green", command=Startbutton_action)
|
|
exit_button = Button (fenster, text="Arbeitstag beenden ", fg="white", bg="red", command=Stopbutton_action)
|
|
pause_button = Button (fenster, text="Pause beginnen", fg="white", bg="#b47a0e", command=PauseStartbutton_action)
|
|
pause_end_button = Button (fenster, text="Pause beenden", fg="white", bg="#b47a0e", command=PauseStopbutton_action)
|
|
anweisungs_label = Label(fenster, justify=CENTER, text="Wählen Sie eine Buchungsart")
|
|
anweisungs_label2 = Label(fenster, bg="white", justify=CENTER, fg="black")
|
|
|
|
anweisungs_label.grid(row=0, column=2, pady=20, padx=10, sticky='ew')
|
|
anweisungs_label2.grid(row=1, column=2, pady=20, padx=10, sticky='ew')
|
|
start_button.grid(row=2, column=1, pady=20, padx=10, sticky='ew')
|
|
exit_button.grid(row=2, column=2, pady=20, padx=10, sticky='ew')
|
|
pause_button.grid(row=2, column=3, pady=20, padx=10, sticky='ew')
|
|
pause_end_button.grid(row=2, column=4, pady=20, padx=10, sticky='ew')
|
|
fenster.mainloop()
|
|
|
|
#######################################################################################################################
|
|
##### Build Start-XML #####
|
|
#######################################################################################################################
|
|
def BuildXMLStart(RequestTyp, myData, Datumvon):
|
|
if RequestTyp == 1:
|
|
ArbeitsZeitPause = "0"
|
|
else:
|
|
ArbeitsZeitPause = "1"
|
|
myDataListe = myData.split("-")
|
|
AN_Gruppe_Ressource = myDataListe[0]
|
|
XML_Start = ""
|
|
XML_Start = XML_Start + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
|
XML_Start = XML_Start + "<MESOWebService TemplateType=\"" + WebServiceType + "\"" " Template=\"" + WebServiceTemplateSTART + "\">"
|
|
XML_Start = XML_Start + "<" + WebServiceTemplateSTART + ">"
|
|
#Location for WinLine fields
|
|
XML_Start = XML_Start + "<Datumvon>" + Datumvon + "</Datumvon>"
|
|
XML_Start = XML_Start + "<Fehlzeitenstamm>" + Fehlzeitenstamm + "</Fehlzeitenstamm>"
|
|
XML_Start = XML_Start + "<ANGruppeRessource>" + AN_Gruppe_Ressource + "</ANGruppeRessource>"
|
|
XML_Start = XML_Start + "<TypZeitartPause>" + ArbeitsZeitPause + "</TypZeitartPause>"
|
|
XML_Start = XML_Start + "</" + WebServiceTemplateSTART + ">"
|
|
XML_Start = XML_Start + "</MESOWebService>"
|
|
return XML_Start
|
|
#######################################################################################################################
|
|
##### Build Start-URL #####
|
|
#######################################################################################################################
|
|
|
|
def BuildURLStart(XML_Start):
|
|
URL_Start = "http://%SERVER%/ewlservice/import?User=%USER%&Password=%PASSWORD%&Company=%COMPANY%&Type=%TYPE%&Vorlage=%VORLAGE%&Actioncode=%ACTIONCODE%&byref=0&Data=%DATA%"
|
|
URL_Start = URL_Start.replace("%SERVER%", WebServiceURL)
|
|
URL_Start = URL_Start.replace("%USER%", WebServiceBenutzerName)
|
|
URL_Start = URL_Start.replace("%PASSWORD%", WebServiceBenutzerPasswort)
|
|
URL_Start = URL_Start.replace("%COMPANY%", WinLineMandant)
|
|
URL_Start = URL_Start.replace("%TYPE%", WebServiceType)
|
|
URL_Start = URL_Start.replace("%VORLAGE%", WebServiceTemplateSTART)
|
|
URL_Start = URL_Start.replace("%ACTIONCODE%", WebServiceActioncode)
|
|
URL_Start = URL_Start.replace("%DATA%", XML_Start)
|
|
return URL_Start
|
|
|
|
#######################################################################################################################
|
|
##### Build Export-URL #####
|
|
#######################################################################################################################
|
|
def BuildURLExport(myData,RequestTyp):
|
|
myDataListe = myData.split("-")
|
|
Arbeitnehmernummer = myDataListe[0]
|
|
if RequestTyp == 4:
|
|
WebServiceTemplateExport = "ExportPause"
|
|
Filter = "FilterTestP-" + Arbeitnehmernummer
|
|
else:
|
|
WebServiceTemplateExport = "Export"
|
|
Filter = "FilterTest-" + Arbeitnehmernummer
|
|
XMLExport = Filter
|
|
URL_Export = "http://%SERVER%/ewlservice/export?User=%USER%&Password=%PASSWORD%&Company=%COMPANY%&Type=%TYPE%&Vorlage=%VORLAGE%&Actioncode=%ACTIONCODE%&byref=0&Key=%KEY%"
|
|
URL_Export = URL_Export.replace("%SERVER%", WebServiceURL)
|
|
URL_Export = URL_Export.replace("%USER%", WebServiceBenutzerName)
|
|
URL_Export = URL_Export.replace("%PASSWORD%", WebServiceBenutzerPasswort)
|
|
URL_Export = URL_Export.replace("%COMPANY%", WinLineMandant)
|
|
URL_Export = URL_Export.replace("%TYPE%", WebServiceType)
|
|
URL_Export = URL_Export.replace("%VORLAGE%", WebServiceTemplateExport)
|
|
URL_Export = URL_Export.replace("%ACTIONCODE%", WebServiceActioncode)
|
|
URL_Export = URL_Export.replace("%KEY%", XMLExport)
|
|
URL_Export = URL_Export.replace("%FILTER%", Filter)
|
|
print("URL_Export = " + URL_Export)
|
|
HTTPRequest_Export = requests.post(URL_Export)
|
|
IndexVonDatum = HTTPRequest_Export.text.find("<Datumvon>")
|
|
v1 = IndexVonDatum + len("<Datumvon>")
|
|
v2 = v1 + 19
|
|
Datumvon = HTTPRequest_Export.text[v1:v2]
|
|
return Datumvon
|
|
|
|
|
|
#######################################################################################################################
|
|
##### Build End-XML #####
|
|
#######################################################################################################################
|
|
def BuildXMLEnde(RequestTyp, myData, OrgDateTime, ActDateTime):
|
|
|
|
if RequestTyp == 2:
|
|
ArbeitsZeitPause = "0"
|
|
else:
|
|
ArbeitsZeitPause = "1"
|
|
|
|
myDataListe = myData.split("-")
|
|
AN_Gruppe_Ressource = myDataListe[0]
|
|
|
|
XML_Ende = ""
|
|
XML_Ende = XML_Ende + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
|
XML_Ende = XML_Ende + "<MESOWebService TemplateType=\"" + WebServiceType + "\"" " Template=\"" + WebServiceTemplateSTOP + "\">"
|
|
XML_Ende = XML_Ende + "<" + WebServiceTemplateSTOP + ">"
|
|
XML_Ende = XML_Ende + "<Datumvon>" + OrgDateTime + "</Datumvon>"
|
|
XML_Ende = XML_Ende + "<Datumbis>" + ActDateTime + "</Datumbis>"
|
|
XML_Ende = XML_Ende + "<Fehlzeitenstamm>" + Fehlzeitenstamm + "</Fehlzeitenstamm>"
|
|
XML_Ende = XML_Ende + "<ANGruppeRessource>" + AN_Gruppe_Ressource + "</ANGruppeRessource>"
|
|
XML_Ende = XML_Ende + "<TypZeitartPause>" + ArbeitsZeitPause + "</TypZeitartPause>"
|
|
XML_Ende = XML_Ende + "<Importoption>" + "1" + "</Importoption>"
|
|
XML_Ende = XML_Ende + "</" + WebServiceTemplateSTOP + ">"
|
|
XML_Ende = XML_Ende + "</MESOWebService>"
|
|
return XML_Ende
|
|
|
|
#######################################################################################################################
|
|
##### Build End-URL #####
|
|
#######################################################################################################################
|
|
def BuildURLEnde(XML_Ende):
|
|
|
|
URL_Ende = "http://%SERVER%/ewlservice/import?User=%USER%&Password=%PASSWORD%&Company=%COMPANY%&Type=%TYPE%&Vorlage=%VORLAGE%&Actioncode=%ACTIONCODE%&byref=0&Data=%DATA%"
|
|
URL_Ende = URL_Ende.replace("%SERVER%", WebServiceURL)
|
|
URL_Ende = URL_Ende.replace("%USER%", WebServiceBenutzerName)
|
|
URL_Ende = URL_Ende.replace("%PASSWORD%", WebServiceBenutzerPasswort)
|
|
URL_Ende = URL_Ende.replace("%COMPANY%", WinLineMandant)
|
|
URL_Ende = URL_Ende.replace("%TYPE%", WebServiceType)
|
|
URL_Ende = URL_Ende.replace("%VORLAGE%", WebServiceTemplateSTOP)
|
|
URL_Ende = URL_Ende.replace("%ACTIONCODE%", WebServiceActioncode)
|
|
URL_Ende = URL_Ende.replace("%DATA%", XML_Ende)
|
|
return URL_Ende
|
|
|
|
#######################################################################################################################
|
|
###### WinLine Requests ######
|
|
#######################################################################################################################
|
|
|
|
def MakeWinLineRequest(RequestTyp, myData, actDateTime):
|
|
if RequestTyp == 1:
|
|
XMLStart = BuildXMLStart(RequestTyp, myData, actDateTime)
|
|
URLStart = BuildURLStart(XMLStart)
|
|
HTTPRequest_Start = requests.post(URLStart)
|
|
print(HTTPRequest_Start.text)
|
|
|
|
elif RequestTyp == 2:
|
|
OrgDateTime = BuildURLExport(myData, RequestTyp)
|
|
XMLEnde = BuildXMLEnde(RequestTyp, myData, OrgDateTime, actDateTime)
|
|
URLEnde = BuildURLEnde(XMLEnde)
|
|
HTTPRequest_Ende = requests.post(URLEnde)
|
|
print(HTTPRequest_Ende.text)
|
|
|
|
elif RequestTyp == 3:
|
|
XMLStart = BuildXMLStart(RequestTyp, myData, actDateTime)
|
|
URLStart = BuildURLStart(XMLStart)
|
|
HTTPRequest_Start = requests.post(URLStart)
|
|
print(HTTPRequest_Start.text)
|
|
|
|
elif RequestTyp == 4:
|
|
OrgDateTime = BuildURLExport(myData, RequestTyp)
|
|
XMLEnde = BuildXMLEnde(RequestTyp, myData, OrgDateTime, actDateTime)
|
|
URLEnde = BuildURLEnde(XMLEnde)
|
|
HTTPRequest_Ende = requests.post(URLEnde)
|
|
print(HTTPRequest_Ende.text)
|
|
#######################################################################################################################
|
|
##### Scanner ######
|
|
#######################################################################################################################
|
|
def Scanner():
|
|
cap = cv2.VideoCapture(0)
|
|
cap.set(3, 640)
|
|
cap.set(4, 480)
|
|
x = True
|
|
myData = None
|
|
while x == True:
|
|
success, img = cap.read()
|
|
for barcode in decode(img):
|
|
myData = barcode.data.decode('utf-8')
|
|
|
|
cv2.imshow('Result', img)
|
|
cv2.waitKey(1)
|
|
if myData is not None:
|
|
x = False
|
|
return myData
|
|
#######################################################################################################################
|
|
###### Button-Action ######
|
|
# Legende #
|
|
# RequestTyp = 1 = Arbeitstag beginnen #
|
|
# RequestTyp = 2 = Arbeitstag beenden #
|
|
# RequestTyp = 3 = Pause beginnen #
|
|
# RequestTyp = 4 = Pause beenden #
|
|
#######################################################################################################################
|
|
def Button_action(self, RequestTyp):
|
|
myData = Scanner()
|
|
myDataListe = myData.split("-")
|
|
name = myDataListe[1]
|
|
now = datetime.now()
|
|
actDateTime = now.strftime('%Y-%m-%d') + "T" + now.strftime('%H:%M:%S')
|
|
TimeWithoutsec = now.strftime('%H:%M:%S')
|
|
MakeWinLineRequest(RequestTyp, myData, actDateTime)
|
|
|
|
if RequestTyp == 1:
|
|
anweisungs_label = Label(text="Hallo, " + str(name))
|
|
anweisungs_label.grid(row=0, column=2, sticky='ew')
|
|
anweisungs_label2 = Label(text="Es ist " + str(TimeWithoutsec) + " Uhr ")
|
|
anweisungs_label2.grid(row=1, column=2, sticky='ew')
|
|
self.after(3000, LabelReset)
|
|
|
|
elif RequestTyp == 2:
|
|
anweisungs_label = Label(text="Auf Wiedersehen, " + str(name))
|
|
anweisungs_label.grid(row=0, column=2, sticky='ew')
|
|
anweisungs_label2 = Label(text="Es ist " + str(TimeWithoutsec) + " Uhr ")
|
|
anweisungs_label2.grid(row=1, column=2, sticky='ew')
|
|
|
|
elif RequestTyp == 3:
|
|
anweisungs_label = Label(text="Eine schöne Pause, " + str(name))
|
|
anweisungs_label.grid(row=0, column=2, sticky='ew')
|
|
anweisungs_label2 = Label(text="Es ist " + str(TimeWithoutsec) + " Uhr ")
|
|
anweisungs_label2.grid(row=1, column=2, sticky='ew')
|
|
|
|
elif RequestTyp == 4:
|
|
anweisungs_label = Label(text="Willkommen zurück, " + str(name))
|
|
anweisungs_label.grid(row=0, column=2, sticky='ew')
|
|
anweisungs_label2 = Label(text="Es ist " + str(TimeWithoutsec) + " Uhr ")
|
|
anweisungs_label2.grid(row=1, column=2, sticky='ew')
|
|
|
|
def LabelReset():
|
|
anweisungs_label = Label(text="Hallo2!!")
|
|
anweisungs_label.grid(row=0, column=2, sticky='ew')
|
|
|
|
#######################################################################################################################
|
|
###### Diffrent-Buttons ######
|
|
#######################################################################################################################
|
|
def Startbutton_action():
|
|
RequestTyp = 1
|
|
Button_action(RequestTyp)
|
|
#######################################################################################################################
|
|
def Stopbutton_action():
|
|
RequestTyp = 2
|
|
Button_action(RequestTyp)
|
|
#######################################################################################################################
|
|
def PauseStartbutton_action():
|
|
RequestTyp = 3
|
|
Button_action(RequestTyp)
|
|
#######################################################################################################################
|
|
def PauseStopbutton_action():
|
|
RequestTyp = 4
|
|
Button_action(RequestTyp)
|
|
#######################################################################################################################
|
|
##### Main #####
|
|
#######################################################################################################################
|
|
BuildMainFrame() |