From d5a8c8e9f43de3aa06feaa507c98db839a133cf6 Mon Sep 17 00:00:00 2001 From: Sebastian Serfling Date: Mon, 17 Feb 2025 16:16:53 +0100 Subject: [PATCH] First Upload --- .idea/.gitignore | 3 + .idea/Shopware-API.iml | 10 + .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/vcs.xml | 4 + Lieferschein_17.02.2025.pdf | 74 ++++ check_api.py | 108 ++++++ logo.png | Bin 0 -> 23823 bytes main.py | 342 ++++++++++++++++++ 10 files changed, 561 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/Shopware-API.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 Lieferschein_17.02.2025.pdf create mode 100644 check_api.py create mode 100644 logo.png create mode 100644 main.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/Shopware-API.iml b/.idea/Shopware-API.iml new file mode 100644 index 0000000..99560ea --- /dev/null +++ b/.idea/Shopware-API.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1c944f7 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..a446cdf --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..d843f34 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Lieferschein_17.02.2025.pdf b/Lieferschein_17.02.2025.pdf new file mode 100644 index 0000000..9b0ec3b --- /dev/null +++ b/Lieferschein_17.02.2025.pdf @@ -0,0 +1,74 @@ +%PDF-1.3 +% ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R /F2 3 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/Contents 8 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 7 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +5 0 obj +<< +/PageMode /UseNone /Pages 7 0 R /Type /Catalog +>> +endobj +6 0 obj +<< +/Author (anonymous) /CreationDate (D:20250217154506+01'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20250217154506+01'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (unspecified) /Title (Lieferschein 17.02.2025) /Trapped /False +>> +endobj +7 0 obj +<< +/Count 1 /Kids [ 4 0 R ] /Type /Pages +>> +endobj +8 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 582 +>> +stream +Gau0@b>,r/&A7TLHNYUG]sd6[,GK.N!mq9+>ccM4TI(f%'mr2_*c5S"LJ"4-OlFS[B%Ji95hnf/k9:/@9]>o<.4jI7Kaq]./*IUPY]eVQb)0,ekVrZN._a#+HBE3_ei$>K5.CPg8Bp0<=_#mOWiRQ,I*i0=rL\4qVjb[P=F?@[bAN\2MF%R.Crp@Cm[*FR5(Z]/+]K(;PQf7OMKX4Ksh(9.a00pk]=5\0^fWFpJKKEO32"5Yjc)XQg9>GrZR/)_>NP43kO/5Q&+WXS9endstream +endobj +xref +0 9 +0000000000 65535 f +0000000073 00000 n +0000000114 00000 n +0000000221 00000 n +0000000333 00000 n +0000000536 00000 n +0000000604 00000 n +0000000915 00000 n +0000000974 00000 n +trailer +<< +/ID +[<52cc85184a6e7bde8ef927cb4ba48ccd><52cc85184a6e7bde8ef927cb4ba48ccd>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 6 0 R +/Root 5 0 R +/Size 9 +>> +startxref +1646 +%%EOF diff --git a/check_api.py b/check_api.py new file mode 100644 index 0000000..88588b7 --- /dev/null +++ b/check_api.py @@ -0,0 +1,108 @@ +import os +import customtkinter as ctk +import winreg +from PIL import Image +import webbrowser + +REG_PATH = r"Software\ShopwareDeliver" + +def rerun(): + """Löscht Registry-Werte und ruft run() auf, falls Werte fehlen""" + try: + with winreg.OpenKey(winreg.HKEY_CURRENT_USER, REG_PATH, 0, winreg.KEY_SET_VALUE) as key: + all_deleted = True # Flag, um zu prüfen, ob alle Werte gelöscht wurden + + for name in ["CLIENT_ID", "CLIENT_SECRET", "API_URL"]: + try: + winreg.DeleteValue(key, name) + print(f"✅ {name} wurde gelöscht.") + except FileNotFoundError: + print(f"⚠️ {name} war nicht vorhanden.") + all_deleted = False # Mindestens ein Wert fehlte bereits + + if all_deleted: + print("✅ Alle Werte erfolgreich gelöscht.") + run() # Falls alles erfolgreich gelöscht wurde, rufe run() auf + else: + print("⚠️ Einige Werte waren nicht vorhanden, run() wird nicht aufgerufen.") + + except FileNotFoundError: + print("⚠️ Fehler: Registry-Schlüssel nicht gefunden!") + run() # Falls die gesamte Registry fehlt, rufe run() auf + + +def run(): + REG_PATH = r"Software\ShopwareDeliver" + + def get_registry_value(name): + """Liest einen Wert aus der Windows-Registry""" + try: + with winreg.OpenKey(winreg.HKEY_CURRENT_USER, REG_PATH, 0, winreg.KEY_READ) as key: + value, _ = winreg.QueryValueEx(key, name) + return value + except FileNotFoundError: + return None + + def set_registry_value(name, value): + """Speichert einen Wert in der Windows-Registry""" + with winreg.CreateKey(winreg.HKEY_CURRENT_USER, REG_PATH) as key: + winreg.SetValueEx(key, name, 0, winreg.REG_SZ, value) + + def open_link(event=None): + webbrowser.open("https://itdata-gera.de") + + # Prüfe, ob die Werte existieren + CLIENT_ID = get_registry_value("CLIENT_ID") + CLIENT_SECRET = get_registry_value("CLIENT_SECRET") + API_URL = get_registry_value("API_URL") + + # Falls Werte fehlen, öffne das Eingabe-Fenster + if not CLIENT_ID or not CLIENT_SECRET or not API_URL: + + class SecretInputApp(ctk.CTk): + def __init__(self): + super().__init__() + + self.title("API-Konfiguration") + self.geometry("400x300") + + ctk.CTkLabel(self, text="Shopware Deliver", font=("Arial", 20)).pack(pady=5) + ctk.CTkLabel(self, text="Bitte geben Sie die API-Daten ein:", font=("Arial", 16)).pack(pady=10) + + self.client_id_entry = ctk.CTkEntry(self, placeholder_text="Client ID") + self.client_id_entry.pack(pady=5, padx=10, fill="x") + + self.client_secret_entry = ctk.CTkEntry(self, placeholder_text="Client Secret", show="*") + self.client_secret_entry.pack(pady=5, padx=10, fill="x") + + self.api_url_entry = ctk.CTkEntry(self, placeholder_text="Shopware URL") + self.api_url_entry.pack(pady=5, padx=10, fill="x") + + self.save_button = ctk.CTkButton(self, text="Speichern", command=self.save_keys) + self.save_button.pack(pady=20) + + def save_keys(self): + client_id = self.client_id_entry.get() + client_secret = self.client_secret_entry.get() + api_url = self.api_url_entry.get() + + if client_id and client_secret and api_url: + # Speichere die Werte in der Windows-Registry + set_registry_value("CLIENT_ID", client_id) + set_registry_value("CLIENT_SECRET", client_secret) + set_registry_value("API_URL", api_url) + + self.destroy() # Fenster schließen nach dem Speichern + else: + ctk.CTkLabel(self, text="Alle Felder müssen ausgefüllt sein!", text_color="red").pack(pady=5) + + # Starte die GUI + app = SecretInputApp() + app.mainloop() + + # Jetzt sind die Werte sicher gespeichert und können im restlichen Skript genutzt werden + CLIENT_ID = get_registry_value("CLIENT_ID") + CLIENT_SECRET = get_registry_value("CLIENT_SECRET") + API_URL = get_registry_value("API_URL") + + return CLIENT_ID, CLIENT_SECRET, API_URL \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9845063cbfbebd0b9eb54837b78d2f2f345ca662 GIT binary patch literal 23823 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", show_order_details) + +button_update = ctk.CTkButton(frame_orders, text="Bestellungen laden", command=lambda: execute_with_error_handling(update_table), fg_color="lightblue",text_color="black",anchor=tkinter.RIGHT) +button_update.pack(side="left",pady=5,padx=10) + +logo = ctk.CTkImage(dark_image=Image.open('logo.png'),size=(130,30)) +logo_label = ctk.CTkLabel(root, text="", image=logo, fg_color="#2b2b2b",cursor="hand2") +logo_label.bind("", open_link) +logo_label.place(relx=0.5, rely=1.0, anchor="s",y=-15) + +button_all_print = ctk.CTkButton(frame_orders, text="Gesammelten Lieferschein drucken", command=lambda: execute_with_error_handling(print_all_orders),fg_color="orange",text_color="black") +button_all_print.pack(side="right",pady=15, padx=10) + +frame_orders.pack(fill="both", expand=True) + +# **Detailansicht** +frame_details = ctk.CTkFrame(root) +label_details = ctk.CTkLabel(frame_details, text="", font=("Helvetica", 12)) +label_details.pack(pady=5) + +columns_details = ("Produkt", "Anzahl", "Preis") +tree_details = ttk.Treeview(frame_details, columns=columns_details, show="headings") +for col in columns_details: + tree_details.heading(col, text=col) +tree_details.pack(expand=True, fill="both") + +button_back = ctk.CTkButton(frame_details, text="Zurück", command=back_to_orders) +button_back.pack(side="left", padx=20, pady=15) + +logo_label_1 = ctk.CTkLabel(root, text="", image=logo, fg_color="#2b2b2b",cursor="hand2") +logo_label_1.bind("", open_link) +logo_label_1.place(relx=0.5, rely=1.0, anchor="s",y=-15) + +button_print = ctk.CTkButton(frame_details, text="Diese Bestellung drucken", command=print_single_order, fg_color="lightgreen", text_color="black") +button_print.pack(side="right", padx=20,pady=15) + +# Error Handling für Timeout +root.after(100, lambda: execute_with_error_handling(update_table)) +root.mainloop()