169 lines
6.4 KiB
Python
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() |