This commit is contained in:
Nathan 2025-12-15 01:29:49 +07:00
commit 67c6169a7e

View File

@ -1,5 +1,5 @@
import tkinter as tk import tkinter as tk
from tkinter import messagebox, ttk # Tambahkan ttk untuk Dropdown from tkinter import messagebox, ttk
from PIL import Image, ImageTk from PIL import Image, ImageTk
from database import connect from database import connect
import datetime import datetime
@ -25,19 +25,16 @@ class PembeliMenu:
self.entry_nama = tk.Entry(info_frame) self.entry_nama = tk.Entry(info_frame)
self.entry_nama.grid(row=0, column=1, padx=5) self.entry_nama.grid(row=0, column=1, padx=5)
# --- LOGIKA PILIHAN MEJA (Update Disini) --- # --- LOGIKA MEJA ---
tk.Label(info_frame, text="Pilih Meja:").grid(row=0, column=2, sticky="e") tk.Label(info_frame, text="Pilih Meja:").grid(row=0, column=2, sticky="e")
# 1. Siapkan variabel untuk dropdown
self.meja_var = tk.StringVar() self.meja_var = tk.StringVar()
self.combo_meja = ttk.Combobox(info_frame, textvariable=self.meja_var, state="readonly", width=5) self.combo_meja = ttk.Combobox(info_frame, textvariable=self.meja_var, state="readonly", width=5)
self.combo_meja.grid(row=0, column=3, padx=5) self.combo_meja.grid(row=0, column=3, padx=5)
# 2. Isi dropdown dengan meja yang KOSONG saja
self.refresh_available_tables()
# Tombol Refresh Meja (jika kasir baru saja menyelesaikan pembayaran meja lain)
tk.Button(info_frame, text="🔄", command=self.refresh_available_tables, bd=1).grid(row=0, column=4, padx=2) tk.Button(info_frame, text="🔄", command=self.refresh_available_tables, bd=1).grid(row=0, column=4, padx=2)
self.refresh_available_tables()
# Tombol Kembali # Tombol Kembali
tk.Button(self.frame, text="Kembali ke Utama", bg="#f9e79f", command=self.logout).pack(pady=5) tk.Button(self.frame, text="Kembali ke Utama", bg="#f9e79f", command=self.logout).pack(pady=5)
@ -49,32 +46,25 @@ class PembeliMenu:
# --- Keranjang Belanja --- # --- Keranjang Belanja ---
tk.Label(self.frame, text="Keranjang Pesanan:", font=("Arial", 10, "bold")).pack() tk.Label(self.frame, text="Keranjang Pesanan:", font=("Arial", 10, "bold")).pack()
self.listbox = tk.Listbox(self.frame, width=50, height=6)
self.listbox = tk.Listbox(self.frame, width=60, height=8, font=("Courier", 10))
self.listbox.pack() self.listbox.pack()
# Tombol Hapus Item tk.Button(self.frame, text=" Kurangi / Hapus Item", fg="red", font=("Arial", 9), command=self.kurangi_item_cart).pack(pady=2)
tk.Button(self.frame, text="❌ Hapus Item Terpilih", fg="red", font=("Arial", 9), command=self.hapus_item_cart).pack(pady=2)
self.total_lbl = tk.Label(self.frame, text="Total: Rp 0", font=("Arial", 12, "bold")) self.total_lbl = tk.Label(self.frame, text="Total: Rp 0", font=("Arial", 12, "bold"))
self.total_lbl.pack(pady=5) self.total_lbl.pack(pady=5)
tk.Button(self.frame, text="✅ KIRIM PESANAN", bg="#d1e7dd", font=("Arial", 11, "bold"), command=self.checkout).pack(pady=10) tk.Button(self.frame, text="✅ KIRIM PESANAN", bg="#d1e7dd", font=("Arial", 11, "bold"), command=self.checkout).pack(pady=10)
# --- FUNGSI BARU: CEK MEJA KOSONG ---
def refresh_available_tables(self): def refresh_available_tables(self):
# Anggap kita punya Meja nomor 1 sampai 10
total_meja = [str(i) for i in range(1, 11)] total_meja = [str(i) for i in range(1, 11)]
db = connect() db = connect()
cur = db.cursor() cur = db.cursor()
# Cari meja yang statusnya BELUM 'Selesai' (artinya masih ada orang)
# Kita cek status != 'Selesai' agar yang 'Pending' atau 'Dimasak' dianggap terisi
cur.execute("SELECT DISTINCT meja_id FROM transaksi WHERE status != 'Selesai'") cur.execute("SELECT DISTINCT meja_id FROM transaksi WHERE status != 'Selesai'")
terisi = [str(row[0]) for row in cur.fetchall()] terisi = [str(row[0]) for row in cur.fetchall()]
db.close() db.close()
# Filter: Meja yang tersedia adalah Total Meja dikurangi Meja Terisi
tersedia = [m for m in total_meja if m not in terisi] tersedia = [m for m in total_meja if m not in terisi]
if not tersedia: if not tersedia:
@ -82,7 +72,7 @@ class PembeliMenu:
self.combo_meja.set("Penuh") self.combo_meja.set("Penuh")
else: else:
self.combo_meja['values'] = tersedia self.combo_meja['values'] = tersedia
self.combo_meja.current(0) # Pilih otomatis yang pertama tersedia self.combo_meja.current(0)
def load_menu(self): def load_menu(self):
db = connect() db = connect()
@ -107,38 +97,73 @@ class PembeliMenu:
self.images.append(photo) self.images.append(photo)
tk.Label(f, image=photo).pack() tk.Label(f, image=photo).pack()
else: else:
tk.Label(f, text="[Img Not Found]").pack() tk.Label(f, text="[No Image]").pack()
except Exception as e: except:
tk.Label(f, text="Error").pack() tk.Label(f, text="Error Img").pack()
tk.Label(f, text=nama, font=("Arial",10,"bold")).pack() tk.Label(f, text=nama, font=("Arial",10,"bold")).pack()
tk.Label(f, text=f"Rp {harga:,.0f}").pack() tk.Label(f, text=f"Rp {harga:,.0f}").pack()
tk.Button(f, text="Tambah", bg="#cfe2ff", command=lambda n=nama, h=harga: self.add_to_cart(n, h)).pack(pady=2) tk.Button(f, text="Tambah", bg="#cfe2ff", command=lambda n=nama, h=harga: self.add_to_cart(n, h)).pack(pady=2)
def add_to_cart(self, nama, harga): def add_to_cart(self, nama, harga):
self.cart.append({'nama': nama, 'harga': harga}) item_found = False
for item in self.cart:
if item['nama'] == nama:
item['qty'] += 1
item['subtotal'] = item['qty'] * harga
item_found = True
break
if not item_found:
self.cart.append({
'nama': nama,
'harga_satuan': harga,
'qty': 1,
'subtotal': harga
})
self.refresh_cart() self.refresh_cart()
def hapus_item_cart(self): def kurangi_item_cart(self):
idx = self.listbox.curselection() idx = self.listbox.curselection()
if not idx: if not idx:
messagebox.showwarning("Peringatan", "Pilih menu di keranjang yang ingin dihapus!") messagebox.showwarning("Peringatan", "Pilih menu yang mau dikurangi!")
return return
index = idx[0] index = idx[0]
self.cart.pop(index) item = self.cart[index]
self.refresh_cart()
# Kurangi jumlah
item['qty'] -= 1
if item['qty'] > 0:
item['subtotal'] = item['qty'] * item['harga_satuan']
self.refresh_cart()
# AUTO-SELECT: Pilih kembali item yang sama
self.listbox.selection_set(index)
self.listbox.activate(index)
else:
self.cart.pop(index)
self.refresh_cart()
# AUTO-SELECT (Opsional): Pilih item yang menggantikan posisinya (jika ada)
if index < self.listbox.size():
self.listbox.selection_set(index)
self.listbox.activate(index)
def refresh_cart(self): def refresh_cart(self):
self.listbox.delete(0, tk.END) self.listbox.delete(0, tk.END)
total = 0 total_belanja = 0
for item in self.cart: for item in self.cart:
self.listbox.insert(tk.END, f"{item['nama']} - Rp {item['harga']:,.0f}") display_text = f"{item['nama']} (x{item['qty']}) - Rp {item['subtotal']:,.0f}"
total += item['harga'] self.listbox.insert(tk.END, display_text)
self.total_lbl.config(text=f"Total: Rp {total:,.0f}") total_belanja += item['subtotal']
self.total_lbl.config(text=f"Total: Rp {total_belanja:,.0f}")
def checkout(self): def checkout(self):
nama_pemesan = self.entry_nama.get() nama_pemesan = self.entry_nama.get()
meja = self.combo_meja.get() # Ambil dari dropdown meja = self.combo_meja.get()
if not nama_pemesan: if not nama_pemesan:
messagebox.showwarning("Data Kurang", "Mohon isi Nama Anda!") messagebox.showwarning("Data Kurang", "Mohon isi Nama Anda!")
@ -150,16 +175,14 @@ class PembeliMenu:
messagebox.showwarning("Kosong", "Pilih menu dulu!") messagebox.showwarning("Kosong", "Pilih menu dulu!")
return return
total_belanja = sum(item['harga'] for item in self.cart) total_belanja = sum(item['subtotal'] for item in self.cart)
tanggal = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") tanggal = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
db = connect() db = connect()
cur = db.cursor() cur = db.cursor()
# Simpan nama pemesan di string tanggal agar terlihat di Kasir
tanggal_custom = f"{tanggal} ({nama_pemesan})" tanggal_custom = f"{tanggal} ({nama_pemesan})"
# Status 'Pending' berarti meja ini sekarang TERISI (Occupied)
cur.execute("INSERT INTO transaksi (tanggal, total, meja_id, status) VALUES (?, ?, ?, ?)", cur.execute("INSERT INTO transaksi (tanggal, total, meja_id, status) VALUES (?, ?, ?, ?)",
(tanggal_custom, total_belanja, meja, "Pending")) (tanggal_custom, total_belanja, meja, "Pending"))
@ -167,17 +190,15 @@ class PembeliMenu:
for item in self.cart: for item in self.cart:
cur.execute("INSERT INTO detail_transaksi (transaksi_id, menu_nama, harga, jumlah, subtotal) VALUES (?, ?, ?, ?, ?)", cur.execute("INSERT INTO detail_transaksi (transaksi_id, menu_nama, harga, jumlah, subtotal) VALUES (?, ?, ?, ?, ?)",
(transaksi_id, item['nama'], item['harga'], 1, item['harga'])) (transaksi_id, item['nama'], item['harga_satuan'], item['qty'], item['subtotal']))
db.commit() db.commit()
db.close() db.close()
messagebox.showinfo("Berhasil", f"Pesanan a.n {nama_pemesan} di Meja {meja} berhasil dikirim!") messagebox.showinfo("Berhasil", f"Pesanan a.n {nama_pemesan} berhasil dikirim!")
self.cart.clear() self.cart.clear()
self.refresh_cart() self.refresh_cart()
self.entry_nama.delete(0, tk.END) self.entry_nama.delete(0, tk.END)
# Refresh lagi mejanya supaya Meja yang baru dipakai langsung hilang dari daftar
self.refresh_available_tables() self.refresh_available_tables()
def logout(self): def logout(self):