diff --git a/project/database.py b/project/database.py index 0a4f512..4857e5f 100644 --- a/project/database.py +++ b/project/database.py @@ -1,5 +1,4 @@ import sqlite3 -import datetime def connect(): return sqlite3.connect("cafe.db") @@ -24,12 +23,11 @@ def setup_database(): id INTEGER PRIMARY KEY AUTOINCREMENT, nama TEXT, harga REAL, - gambar TEXT, - kategori TEXT + gambar TEXT ) """) - # Tabel Transaksi (Header nota) + # Tabel Transaksi cur.execute(""" CREATE TABLE IF NOT EXISTS transaksi( id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -39,9 +37,8 @@ def setup_database(): status TEXT ) """) - # Status: 'Pending' (Masuk Dapur), 'Disajikan' (Waiter selesai), 'Lunas' (Kasir) - # Tabel Detail Transaksi (Isi makanan per nota) + # Tabel Detail Transaksi cur.execute(""" CREATE TABLE IF NOT EXISTS detail_transaksi( id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -53,7 +50,7 @@ def setup_database(): ) """) - # Insert Akun Default jika kosong + # Insert Akun Default cur.execute("SELECT COUNT(*) FROM users") if cur.fetchone()[0] == 0: users = [ @@ -66,11 +63,18 @@ def setup_database(): cur.executemany("INSERT INTO users(username,password,role) VALUES (?,?,?)", users) db.commit() - # Insert Menu Dummy jika kosong + # --- UPDATE DAFTAR MENU SESUAI FOLDER ASET --- cur.execute("SELECT COUNT(*) FROM menu") if cur.fetchone()[0] == 0: - cur.execute("INSERT INTO menu (nama, harga, gambar) VALUES ('Mie Ayam', 15000, 'mie_ayam.webp')") - cur.execute("INSERT INTO menu (nama, harga, gambar) VALUES ('Es Teh', 5000, 'es_teh.webp')") + menus = [ + ('Ayam Goreng', 20000, 'aset/ayam_goreng.jpg'), + ('Bakso', 15000, 'aset/bakso.jpg'), + ('Es Teh', 5000, 'aset/es_teh.jpg'), + ('Es Teler', 15000, 'aset/es_teler.jpg'), + ('Jus Jeruk', 8000, 'aset/jus_jeruk.jpg'), + ('Mie Ayam', 12000, 'aset/mie_ayam.jpg') + ] + cur.executemany("INSERT INTO menu (nama, harga, gambar) VALUES (?,?,?)", menus) db.commit() db.close() \ No newline at end of file diff --git a/project/pembeli_menu.py b/project/pembeli_menu.py index 7f9159a..c8d2d96 100644 --- a/project/pembeli_menu.py +++ b/project/pembeli_menu.py @@ -1,8 +1,9 @@ import tkinter as tk -from tkinter import messagebox +from tkinter import messagebox, ttk # Tambahkan ttk untuk Dropdown from PIL import Image, ImageTk from database import connect import datetime +import os class PembeliMenu: def __init__(self, parent): @@ -10,8 +11,8 @@ class PembeliMenu: self.frame = tk.Frame(parent) self.frame.pack(fill="both", expand=True) - self.cart = [] # List untuk menyimpan belanjaan sementara - self.images = [] # List untuk reference gambar agar tidak hilang + self.cart = [] + self.images = [] # --- Header --- tk.Label(self.frame, text="SELAMAT DATANG", font=("Arial", 18, "bold")).pack(pady=10) @@ -24,9 +25,19 @@ class PembeliMenu: self.entry_nama = tk.Entry(info_frame) self.entry_nama.grid(row=0, column=1, padx=5) - tk.Label(info_frame, text="No. Meja:").grid(row=0, column=2, sticky="e") - self.entry_meja = tk.Entry(info_frame, width=5) - self.entry_meja.grid(row=0, column=3, padx=5) + # --- LOGIKA PILIHAN MEJA (Update Disini) --- + 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.combo_meja = ttk.Combobox(info_frame, textvariable=self.meja_var, state="readonly", width=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) # Tombol Kembali tk.Button(self.frame, text="Kembali ke Utama", bg="#f9e79f", command=self.logout).pack(pady=5) @@ -41,7 +52,7 @@ class PembeliMenu: self.listbox = tk.Listbox(self.frame, width=50, height=6) self.listbox.pack() - # [BARU] Tombol Hapus Item + # Tombol Hapus Item 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")) @@ -49,6 +60,30 @@ class PembeliMenu: 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): + # Anggap kita punya Meja nomor 1 sampai 10 + total_meja = [str(i) for i in range(1, 11)] + + db = connect() + 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'") + terisi = [str(row[0]) for row in cur.fetchall()] + db.close() + + # Filter: Meja yang tersedia adalah Total Meja dikurangi Meja Terisi + tersedia = [m for m in total_meja if m not in terisi] + + if not tersedia: + self.combo_meja['values'] = ["Penuh"] + self.combo_meja.set("Penuh") + else: + self.combo_meja['values'] = tersedia + self.combo_meja.current(0) # Pilih otomatis yang pertama tersedia + def load_menu(self): db = connect() cur = db.cursor() @@ -66,12 +101,15 @@ class PembeliMenu: f.pack(side=tk.LEFT, padx=5) try: - img = Image.open(gambar).resize((100, 80)) - photo = ImageTk.PhotoImage(img) - self.images.append(photo) - tk.Label(f, image=photo).pack() - except: - tk.Label(f, text="[No Image]").pack() + if os.path.exists(gambar): + img = Image.open(gambar).resize((100, 80)) + photo = ImageTk.PhotoImage(img) + self.images.append(photo) + tk.Label(f, image=photo).pack() + else: + tk.Label(f, text="[Img Not Found]").pack() + except Exception as e: + tk.Label(f, text="Error").pack() tk.Label(f, text=nama, font=("Arial",10,"bold")).pack() tk.Label(f, text=f"Rp {harga:,.0f}").pack() @@ -81,22 +119,14 @@ class PembeliMenu: self.cart.append({'nama': nama, 'harga': harga}) self.refresh_cart() - # [BARU] Fungsi Logic Hapus def hapus_item_cart(self): - # Ambil index item yang dipilih di listbox idx = self.listbox.curselection() - if not idx: messagebox.showwarning("Peringatan", "Pilih menu di keranjang yang ingin dihapus!") return - index = idx[0] - # Hapus data dari list cart - item_removed = self.cart.pop(index) - - # Update tampilan listbox dan total harga + self.cart.pop(index) self.refresh_cart() - # Opsional: Tampilkan pesan kecil di console atau status bar (disini saya skip biar tidak ganggu user) def refresh_cart(self): self.listbox.delete(0, tk.END) @@ -108,10 +138,13 @@ class PembeliMenu: def checkout(self): nama_pemesan = self.entry_nama.get() - meja = self.entry_meja.get() + meja = self.combo_meja.get() # Ambil dari dropdown - if not nama_pemesan or not meja: - messagebox.showwarning("Data Kurang", "Mohon isi Nama dan Nomor Meja!") + if not nama_pemesan: + messagebox.showwarning("Data Kurang", "Mohon isi Nama Anda!") + return + if not meja or meja == "Penuh": + messagebox.showwarning("Penuh", "Mohon maaf, meja penuh atau belum dipilih.") return if not self.cart: messagebox.showwarning("Kosong", "Pilih menu dulu!") @@ -123,10 +156,10 @@ class PembeliMenu: db = connect() cur = db.cursor() - # Menyimpan nama pemesan di dalam string tanggal (Trik agar tidak ubah struktur DB) - # Format: "2023-12-15 10:00:00 (Budi)" + # Simpan nama pemesan di string tanggal agar terlihat di Kasir 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 (?, ?, ?, ?)", (tanggal_custom, total_belanja, meja, "Pending")) @@ -139,11 +172,13 @@ class PembeliMenu: db.commit() db.close() - messagebox.showinfo("Berhasil", f"Pesanan a.n {nama_pemesan} berhasil dikirim ke Dapur!") + messagebox.showinfo("Berhasil", f"Pesanan a.n {nama_pemesan} di Meja {meja} berhasil dikirim!") self.cart.clear() self.refresh_cart() self.entry_nama.delete(0, tk.END) - self.entry_meja.delete(0, tk.END) + + # Refresh lagi mejanya supaya Meja yang baru dipakai langsung hilang dari daftar + self.refresh_available_tables() def logout(self): self.frame.destroy()