Python-Menu/project/pembeli_menu.py

169 lines
6.4 KiB
Python

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("<Configure>", 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()