diff --git a/main.py b/main.py index db5a8c3..73d414f 100644 --- a/main.py +++ b/main.py @@ -590,3 +590,163 @@ def select_file(self, var): filetypes=[("Image files","*.png;*.jpg;*.jpeg;*.gif;*.bmp"),("All files","*.*")]) if p: var.set(p) + + + + + + + + +# Promo manage Khusus Admin + + +def build_promo_tab(self, parent): + for w in parent.winfo_children(): + w.destroy() + top = ttk.Frame(parent) + top.pack(fill='x', pady=6) + ttk.Label(top, text="Promo Codes", font=("Arial", 14, "bold")).pack(side='left', padx=6) + ttk.Button(top, text="Tambah Promo", command=self.open_add_promo).pack(side='right', padx=6) + cols = ("Code","Type","Value","MinTotal") + self.promo_tree = ttk.Treeview(parent, columns=cols, show='headings', height=12) + for c in cols: + self.promo_tree.heading(c, text=c) + self.promo_tree.column(c, width=120) + self.promo_tree.pack(fill='x', padx=6, pady=6) + btnfrm = ttk.Frame(parent) + btnfrm.pack(pady=6) + ttk.Button(btnfrm, text="Edit Promo", command=self.open_edit_promo).pack(side='left', padx=6) + ttk.Button(btnfrm, text="Hapus Promo", command=self.delete_selected_promo).pack(side='left', padx=6) + ttk.Button(btnfrm, text="Reload", command=self.reload_promo_table).pack(side='left', padx=6) + self.reload_promo_table() + +def reload_promo_table(self): + for r in self.promo_tree.get_children(): + self.promo_tree.delete(r) + for p in promo_list(): + self.promo_tree.insert("", tk.END, values=p) + +def open_add_promo(self): + w = tk.Toplevel(self.root) + w.title("Tambah Promo") + w.geometry("350x230") + w.transient(self.root) + w.grab_set() + + frm = ttk.Frame(w, padding=15) + frm.pack(fill="both", expand=True) + + vars = { + 'code': tk.StringVar(), + 'type': tk.StringVar(value='percent'), + 'value': tk.StringVar(), + 'min_total': tk.StringVar(value='0') + } + + ttk.Label(frm, text="Code:").grid(row=0, column=0, sticky='e', pady=5) + ttk.Entry(frm, textvariable=vars['code'], width=20).grid(row=0, column=1) + + ttk.Label(frm, text="Type (percent/fixed):").grid(row=1, column=0, sticky='e', pady=5) + ttk.Entry(frm, textvariable=vars['type'], width=20).grid(row=1, column=1) + + ttk.Label(frm, text="Value:").grid(row=2, column=0, sticky='e', pady=5) + ttk.Entry(frm, textvariable=vars['value'], width=20).grid(row=2, column=1) + + ttk.Label(frm, text="Min Total:").grid(row=3, column=0, sticky='e', pady=5) + ttk.Entry(frm, textvariable=vars['min_total'], width=20).grid(row=3, column=1) + + def save(): + try: + code = vars['code'].get().strip().upper() + ptype = vars['type'].get().strip() + val = float(vars['value'].get()) + mt = float(vars['min_total'].get() or 0) + + if ptype not in ('percent', 'fixed'): + raise ValueError("type harus 'percent' atau 'fixed'") + except Exception as e: + messagebox.showerror("Error", f"Input salah: {e}") + return + + try: + promo_add(code, ptype, val, mt) + messagebox.showinfo("Sukses", "Promo ditambahkan") + w.destroy() + self.reload_promo_table() + except sqlite3.IntegrityError: + messagebox.showerror("Error", "Kode promo sudah ada") + + ttk.Button(frm, text="Simpan", command=save).grid(row=4, column=1, pady=12) + + +def open_edit_promo(self): + sel = self.promo_tree.selection() + if not sel: + messagebox.showwarning("Pilih", "Pilih promo untuk diedit") + return + + code = self.promo_tree.item(sel)['values'][0] + row = promo_get(code) + if not row: + messagebox.showerror("Error", "Promo tidak ditemukan") + return + + code, ptype, val, min_total = row + + w = tk.Toplevel(self.root) + w.title("Edit Promo") + w.geometry("350x230") + w.transient(self.root) + w.grab_set() + + frm = ttk.Frame(w, padding=15) + frm.pack(fill="both", expand=True) + + vars = { + 'type': tk.StringVar(value=ptype), + 'value': tk.StringVar(value=str(val)), + 'min_total': tk.StringVar(value=str(min_total)) + } + + ttk.Label(frm, text=f"Code: {code}", font=("Arial", 10, "bold")).grid(row=0, column=0, columnspan=2, pady=5) + + ttk.Label(frm, text="Type (percent/fixed):").grid(row=1, column=0, sticky='e', pady=5) + ttk.Entry(frm, textvariable=vars['type'], width=20).grid(row=1, column=1) + + ttk.Label(frm, text="Value:").grid(row=2, column=0, sticky='e', pady=5) + ttk.Entry(frm, textvariable=vars['value'], width=20).grid(row=2, column=1) + + ttk.Label(frm, text="Min Total:").grid(row=3, column=0, sticky='e', pady=5) + ttk.Entry(frm, textvariable=vars['min_total'], width=20).grid(row=3, column=1) + + def save(): + try: + ptype = vars['type'].get().strip() + val = float(vars['value'].get()) + mt = float(vars['min_total'].get() or 0) + + if ptype not in ('percent', 'fixed'): + raise ValueError("type harus 'percent' atau 'fixed'") + except Exception as e: + messagebox.showerror("Error", f"Input salah: {e}") + return + + promo_update(code, ptype, val, mt) + messagebox.showinfo("Sukses", "Promo diperbarui") + w.destroy() + self.reload_promo_table() + + ttk.Button(frm, text="Update", command=save).grid(row=4, column=1, pady=12) + + +def delete_selected_promo(self): + sel = self.promo_tree.selection() + if not sel: + messagebox.showwarning("Pilih", "Pilih promo") + return + code = self.promo_tree.item(sel)['values'][0] + if messagebox.askyesno("Konfirmasi", f"Hapus promo {code}?"): + promo_delete(code) + messagebox.showinfo("Dihapus","Promo terhapus") + self.reload_promo_table()