Compare commits

..

No commits in common. "20386a867aa4b7a956d1ac4ed989dfb07b333fdb" and "6359376da02ce4fbab68da651dfcac73832bb29d" have entirely different histories.

2 changed files with 39 additions and 78 deletions

View File

@ -1,4 +1,5 @@
import sqlite3
import datetime
def connect():
return sqlite3.connect("cafe.db")
@ -23,11 +24,12 @@ def setup_database():
id INTEGER PRIMARY KEY AUTOINCREMENT,
nama TEXT,
harga REAL,
gambar TEXT
gambar TEXT,
kategori TEXT
)
""")
# Tabel Transaksi
# Tabel Transaksi (Header nota)
cur.execute("""
CREATE TABLE IF NOT EXISTS transaksi(
id INTEGER PRIMARY KEY AUTOINCREMENT,
@ -37,8 +39,9 @@ def setup_database():
status TEXT
)
""")
# Status: 'Pending' (Masuk Dapur), 'Disajikan' (Waiter selesai), 'Lunas' (Kasir)
# Tabel Detail Transaksi
# Tabel Detail Transaksi (Isi makanan per nota)
cur.execute("""
CREATE TABLE IF NOT EXISTS detail_transaksi(
id INTEGER PRIMARY KEY AUTOINCREMENT,
@ -50,7 +53,7 @@ def setup_database():
)
""")
# Insert Akun Default
# Insert Akun Default jika kosong
cur.execute("SELECT COUNT(*) FROM users")
if cur.fetchone()[0] == 0:
users = [
@ -63,18 +66,11 @@ def setup_database():
cur.executemany("INSERT INTO users(username,password,role) VALUES (?,?,?)", users)
db.commit()
# --- UPDATE DAFTAR MENU SESUAI FOLDER ASET ---
# Insert Menu Dummy jika kosong
cur.execute("SELECT COUNT(*) FROM menu")
if cur.fetchone()[0] == 0:
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)
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')")
db.commit()
db.close()

View File

@ -1,9 +1,8 @@
import tkinter as tk
from tkinter import messagebox, ttk # Tambahkan ttk untuk Dropdown
from tkinter import messagebox
from PIL import Image, ImageTk
from database import connect
import datetime
import os
class PembeliMenu:
def __init__(self, parent):
@ -11,8 +10,8 @@ class PembeliMenu:
self.frame = tk.Frame(parent)
self.frame.pack(fill="both", expand=True)
self.cart = []
self.images = []
self.cart = [] # List untuk menyimpan belanjaan sementara
self.images = [] # List untuk reference gambar agar tidak hilang
# --- Header ---
tk.Label(self.frame, text="SELAMAT DATANG", font=("Arial", 18, "bold")).pack(pady=10)
@ -25,19 +24,9 @@ class PembeliMenu:
self.entry_nama = tk.Entry(info_frame)
self.entry_nama.grid(row=0, column=1, 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)
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)
# Tombol Kembali
tk.Button(self.frame, text="Kembali ke Utama", bg="#f9e79f", command=self.logout).pack(pady=5)
@ -52,7 +41,7 @@ class PembeliMenu:
self.listbox = tk.Listbox(self.frame, width=50, height=6)
self.listbox.pack()
# Tombol Hapus Item
# [BARU] 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"))
@ -60,30 +49,6 @@ 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()
@ -101,15 +66,12 @@ class PembeliMenu:
f.pack(side=tk.LEFT, padx=5)
try:
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()
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()
tk.Label(f, text=nama, font=("Arial",10,"bold")).pack()
tk.Label(f, text=f"Rp {harga:,.0f}").pack()
@ -119,14 +81,22 @@ 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]
self.cart.pop(index)
# Hapus data dari list cart
item_removed = self.cart.pop(index)
# Update tampilan listbox dan total harga
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)
@ -138,13 +108,10 @@ class PembeliMenu:
def checkout(self):
nama_pemesan = self.entry_nama.get()
meja = self.combo_meja.get() # Ambil dari dropdown
meja = self.entry_meja.get()
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.")
if not nama_pemesan or not meja:
messagebox.showwarning("Data Kurang", "Mohon isi Nama dan Nomor Meja!")
return
if not self.cart:
messagebox.showwarning("Kosong", "Pilih menu dulu!")
@ -156,10 +123,10 @@ class PembeliMenu:
db = connect()
cur = db.cursor()
# Simpan nama pemesan di string tanggal agar terlihat di Kasir
# Menyimpan nama pemesan di dalam string tanggal (Trik agar tidak ubah struktur DB)
# Format: "2023-12-15 10:00:00 (Budi)"
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"))
@ -172,13 +139,11 @@ class PembeliMenu:
db.commit()
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 ke Dapur!")
self.cart.clear()
self.refresh_cart()
self.entry_nama.delete(0, tk.END)
# Refresh lagi mejanya supaya Meja yang baru dipakai langsung hilang dari daftar
self.refresh_available_tables()
self.entry_meja.delete(0, tk.END)
def logout(self):
self.frame.destroy()