import tkinter as tk from tkinter import messagebox, ttk from database import connect class PembeliPage(tk.Frame): # Ganti nama class jadi PembeliPage def __init__(self, parent, controller): super().__init__(parent) self.controller = controller self.cart = {} self.nama_pelanggan = "" self.no_meja = "" self.login_frame = tk.Frame(self) self.menu_frame = tk.Frame(self) self.show_login_ui() # --- UI 1: LOGIN PEMBELI --- def show_login_ui(self): self.menu_frame.pack_forget() self.login_frame.pack(fill="both", expand=True) for w in self.login_frame.winfo_children(): w.destroy() tk.Label(self.login_frame, text="SELAMAT DATANG", font=("Arial", 20, "bold")).pack(pady=50) box = tk.Frame(self.login_frame, bd=2, relief="groove", padx=20, pady=20) box.pack() tk.Label(box, text="Nama Anda:").pack(anchor="w") self.entry_nama = tk.Entry(box, width=30) self.entry_nama.pack(pady=5) tk.Label(box, text="Nomor Meja:").pack(anchor="w") self.combo_meja = ttk.Combobox(box, values=[str(i) for i in range(1, 21)], state="readonly") self.combo_meja.current(0) self.combo_meja.pack(pady=5) tk.Button(box, text="MULAI PESAN", bg="#4CAF50", fg="white", command=self.validate_login).pack(pady=20, fill="x") tk.Button(self.login_frame, text="Kembali", command=lambda: self.controller.show_frame("LoginPage")).pack(pady=10) def validate_login(self): if not self.entry_nama.get(): messagebox.showwarning("Oops", "Nama wajib diisi!") return self.nama_pelanggan = self.entry_nama.get() self.no_meja = self.combo_meja.get() self.show_menu_ui() # --- UI 2: MENU MAKANAN --- def show_menu_ui(self): self.login_frame.pack_forget() self.menu_frame.pack(fill="both", expand=True) # Bersihkan frame lama biar gak numpuk for w in self.menu_frame.winfo_children(): w.destroy() # Header top = tk.Frame(self.menu_frame, bg="#eee", pady=10) top.pack(fill="x") tk.Label(top, text=f"👤 {self.nama_pelanggan} | Meja {self.no_meja}", font=("Arial", 12)).pack(side="left", padx=20) tk.Button(top, text="Keluar", bg="#ff6b6b", fg="white", command=self.logout).pack(side="right", padx=20) content = tk.Frame(self.menu_frame) content.pack(fill="both", expand=True, padx=10, pady=10) # Kiri: Daftar Menu left_frame = tk.LabelFrame(content, text=" Menu Tersedia ") left_frame.pack(side="left", fill="both", expand=True) canvas = tk.Canvas(left_frame) scrollbar = tk.Scrollbar(left_frame, orient="vertical", command=canvas.yview) self.scroll_frame = tk.Frame(canvas) self.scroll_frame.bind("", lambda e: canvas.configure(scrollregion=canvas.bbox("all"))) canvas.create_window((0, 0), window=self.scroll_frame, anchor="nw") canvas.configure(yscrollcommand=scrollbar.set) canvas.pack(side="left", fill="both", expand=True) scrollbar.pack(side="right", fill="y") # Kanan: Keranjang right_frame = tk.LabelFrame(content, text=" Keranjang ") right_frame.pack(side="right", fill="both", width=300, padx=5) self.cart_list = tk.Listbox(right_frame) self.cart_list.pack(fill="both", expand=True, padx=5, pady=5) self.lbl_total = tk.Label(right_frame, text="Total: Rp 0", font=("Arial", 14, "bold"), fg="red") self.lbl_total.pack(pady=5) tk.Button(right_frame, text="PESAN SEKARANG", bg="green", fg="white", height=2, command=self.checkout).pack(fill="x", padx=5, pady=5) self.load_menu_items() def load_menu_items(self): for w in self.scroll_frame.winfo_children(): w.destroy() db = connect() cur = db.cursor() cur.execute("SELECT id, nama, harga, stok FROM menu WHERE stok > 0") items = cur.fetchall() db.close() row, col = 0, 0 for item in items: m_id, nama, harga, stok = item card = tk.Frame(self.scroll_frame, bd=2, relief="ridge", padx=5, pady=5) card.grid(row=row, column=col, padx=5, pady=5, sticky="nsew") tk.Label(card, text=nama, font=("Arial", 10, "bold")).pack() tk.Label(card, text=f"Rp {int(harga):,}", fg="green").pack() tk.Button(card, text="Tambah +", command=lambda i=m_id, n=nama, h=harga: self.add_to_cart(i, n, h)).pack(pady=2) col += 1 if col > 2: col = 0 row += 1 def add_to_cart(self, m_id, nama, harga): if m_id in self.cart: self.cart[m_id]['qty'] += 1 else: self.cart[m_id] = {'nama': nama, 'harga': harga, 'qty': 1} self.refresh_cart() def refresh_cart(self): self.cart_list.delete(0, tk.END) total = 0 for m_id, item in self.cart.items(): sub = item['harga'] * item['qty'] total += sub self.cart_list.insert(tk.END, f"{item['qty']}x {item['nama']} = {sub:,}") self.lbl_total.config(text=f"Total: Rp {int(total):,}") def checkout(self): if not self.cart: return total_val = int(self.lbl_total.cget("text").replace("Total: Rp ","").replace(",","")) db = connect() cur = db.cursor() # Simpan ke tabel TRANSAKSI (Bukan orders) cur.execute("INSERT INTO transaksi (nama_pelanggan, meja_id, total, status) VALUES (?, ?, ?, 'Pending')", (self.nama_pelanggan, self.no_meja, total_val)) trans_id = cur.lastrowid # Simpan Detail for m_id, item in self.cart.items(): sub = item['harga'] * item['qty'] cur.execute("INSERT INTO detail_transaksi (transaksi_id, menu_id, jumlah, subtotal) VALUES (?,?,?,?)", (trans_id, m_id, item['qty'], sub)) # Kurangi Stok cur.execute("UPDATE menu SET stok = stok - ? WHERE id=?", (item['qty'], m_id)) db.commit() db.close() messagebox.showinfo("Sukses", "Pesanan terkirim! Mohon tunggu.") self.cart = {} self.refresh_cart() self.load_menu_items() def logout(self): self.cart = {} self.show_login_ui() def update_data(self): self.show_login_ui()