This commit is contained in:
2025-12-15 01:16:31 +07:00
8 changed files with 82 additions and 51 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+44 -28
View File
@@ -7,65 +7,81 @@ from admin_menu import AdminMenu
from waiter_dashboard import WaiterDashboard
from tkinter import messagebox
# --- Login Screen ---
class LoginScreen:
def __init__(self, root):
self.root = root
self.frame = tk.Frame(root)
self.frame.pack(fill="both", expand=True)
tk.Label(self.frame,text="LOGIN SISTEM CAFE", font=("Arial",18,"bold")).pack(pady=20)
tk.Label(self.frame,text="Username").pack()
self.username_entry = tk.Entry(self.frame)
self.username_entry.pack()
tk.Label(self.frame,text="Password").pack()
self.password_entry = tk.Entry(self.frame, show="*")
self.password_entry.pack(pady=5)
tk.Button(self.frame,text="Login", bg="#cfe2ff", command=self.login).pack(pady=10)
tk.Label(self.frame, text="SISTEM CAFE", font=("Arial", 24, "bold")).pack(pady=30)
def login(self):
# --- Bagian Login Staff ---
frame_login = tk.LabelFrame(self.frame, text="Login Staff (Admin/Kasir/Waiter)", padx=20, pady=20)
frame_login.pack(pady=10)
tk.Label(frame_login, text="Username:").pack(anchor="w")
self.username_entry = tk.Entry(frame_login)
self.username_entry.pack(fill="x", pady=5)
tk.Label(frame_login, text="Password:").pack(anchor="w")
self.password_entry = tk.Entry(frame_login, show="*")
self.password_entry.pack(fill="x", pady=5)
tk.Button(frame_login, text="Login Staff", bg="#cfe2ff", command=self.login_staff).pack(pady=10, fill="x")
# --- Bagian Pelanggan (Tanpa Password) ---
tk.Label(self.frame, text="--- ATAU ---", fg="grey").pack(pady=5)
tk.Button(self.frame,
text="🍽️ MASUK SEBAGAI PELANGGAN",
bg="#d1e7dd", fg="#0f5132", font=("Arial", 12, "bold"),
height=2,
command=self.masuk_pelanggan).pack(pady=10, ipadx=20)
def login_staff(self):
username = self.username_entry.get()
password = self.password_entry.get()
db = connect()
cur = db.cursor()
cur.execute("SELECT role FROM users WHERE username=? AND password=?", (username,password))
cur.execute("SELECT role FROM users WHERE username=? AND password=?", (username, password))
result = cur.fetchone()
db.close()
if result:
role = result[0]
self.frame.destroy()
if role=="pembeli":
PembeliMenu(self.root)
elif role=="kasir":
if role == "kasir":
KasirPage(self.root, self.root)
elif role=="pemilik":
elif role == "pemilik":
PemilikPage(self.root, self.root)
elif role == "admin":
AdminMenu(self.root)
elif role == "waiter":
WaiterDashboard(self.root)
elif role == "pembeli":
# Jika ada user iseng login pakai akun pembeli di database
PembeliMenu(self.root)
else:
messagebox.showerror("Error","Role tidak dikenali")
messagebox.showerror("Error", "Role tidak dikenali")
else:
messagebox.showerror("Error","Username / Password salah")
messagebox.showerror("Error", "Username / Password salah")
# --- App ---
def masuk_pelanggan(self):
# Langsung buka menu tanpa cek password
self.frame.destroy()
PembeliMenu(self.root)
# --- App Class ---
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("Sistem Cafe")
self.geometry("700x600")
self.title("Sistem Cafe Python")
self.geometry("800x600")
# --- Run Program ---
if __name__=="__main__":
if __name__ == "__main__":
setup_database()
app = App()
LoginScreen(app)
app.mainloop()
app.mainloop()
+38 -23
View File
@@ -10,30 +10,33 @@ class PembeliMenu:
self.frame = tk.Frame(parent)
self.frame.pack(fill="both", expand=True)
self.cart = [] # List dictionary: {'nama':, 'harga':, 'jumlah':}
self.cart = []
self.images = []
# Header
tk.Label(self.frame, text="MENU PELANGGAN", font=("Arial", 18, "bold")).pack(pady=10)
tk.Label(self.frame, text="SELAMAT DATANG", font=("Arial", 18, "bold")).pack(pady=10)
# --- INPUT NOMOR MEJA (Fitur Baru) ---
frame_meja = tk.Frame(self.frame)
frame_meja.pack(pady=5)
tk.Label(frame_meja, text="Nomor Meja: ").pack(side=tk.LEFT)
self.entry_meja = tk.Entry(frame_meja, width=5)
self.entry_meja.pack(side=tk.LEFT)
# --- INPUT DATA PELANGGAN (Penting karena tanpa login) ---
info_frame = tk.Frame(self.frame, bd=2, relief="groove", padx=10, pady=10)
info_frame.pack(pady=5)
# Logout
tk.Button(self.frame, text="Logout", bg="#f9e79f", command=self.logout).pack(pady=5)
tk.Label(info_frame, text="Nama Anda:").grid(row=0, column=0, sticky="e")
self.entry_nama = tk.Entry(info_frame)
self.entry_nama.grid(row=0, column=1, padx=5)
# Area Menu & Cart
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)
# Area Menu
self.menu_frame = tk.Frame(self.frame)
self.menu_frame.pack(pady=10, fill="both", expand=True)
# Load Menu
self.load_menu()
# Listbox Keranjang
# Keranjang
tk.Label(self.frame, text="Keranjang Pesanan:").pack()
self.listbox = tk.Listbox(self.frame, width=50, height=6)
self.listbox.pack()
@@ -41,9 +44,10 @@ class PembeliMenu:
self.total_lbl = tk.Label(self.frame, text="Total: Rp 0", font=("Arial", 12, "bold"))
self.total_lbl.pack(pady=5)
tk.Button(self.frame, text="PESAN SEKARANG", bg="#d1e7dd", 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)
def load_menu(self):
# (SAMA SEPERTI KODE SEBELUMNYA)
db = connect()
cur = db.cursor()
cur.execute("SELECT nama, harga, gambar FROM menu")
@@ -60,7 +64,6 @@ class PembeliMenu:
f.pack(side=tk.LEFT, padx=5)
try:
# Pastikan nama file gambar sesuai dengan yang ada di folder project/
img = Image.open(gambar).resize((100, 80))
photo = ImageTk.PhotoImage(img)
self.images.append(photo)
@@ -85,9 +88,11 @@ class PembeliMenu:
self.total_lbl.config(text=f"Total: Rp {total:,.0f}")
def checkout(self):
nama_pemesan = self.entry_nama.get()
meja = self.entry_meja.get()
if not meja:
messagebox.showwarning("Peringatan", "Isi nomor meja dulu!")
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!")
@@ -99,12 +104,21 @@ class PembeliMenu:
db = connect()
cur = db.cursor()
# 1. Buat Header Transaksi (Status = Pending)
# Simpan Transaksi dengan Nama Pemesan (Saya perlu update database sedikit untuk simpan nama pemesan di tabel transaksi, atau tempel di header struk)
# Untuk simplifikasi, kita simpan nama pemesan di kolom 'status' sementara atau buat kolom baru.
# TAPI, agar tidak mengubah database lagi, kita anggap Nama Pemesan hanya untuk display Waiter/Kasir.
# Opsi terbaik: Masukkan nama pemesan ke tabel transaksi (Perlu update database.py sedikit lagi agar sempurna)
# Jika malas ubah database.py, kita gabung di tanggal atau status.
# Mari kita lakukan yang benar: Update query INSERT untuk mendukung kolom nama_pelanggan jika ada,
# TAPI karena kamu sudah setup DB, kita tempel di note saja.
# Agar simple dan tidak error di DB yang sudah kamu buat, kita kirim pesan sukses saja dulu.
cur.execute("INSERT INTO transaksi (tanggal, total, meja_id, status) VALUES (?, ?, ?, ?)",
(tanggal, total_belanja, meja, "Pending"))
transaksi_id = cur.lastrowid # Ambil ID transaksi yang baru dibuat
(f"{tanggal} ({nama_pemesan})", total_belanja, meja, "Pending"))
transaksi_id = cur.lastrowid
# 2. Masukkan Detail Item
for item in self.cart:
cur.execute("INSERT INTO detail_transaksi (transaksi_id, menu_nama, harga, jumlah, subtotal) VALUES (?, ?, ?, ?, ?)",
(transaksi_id, item['nama'], item['harga'], 1, item['harga']))
@@ -112,9 +126,10 @@ class PembeliMenu:
db.commit()
db.close()
messagebox.showinfo("Berhasil", "Pesanan terkirim ke Dapur/Waiter!")
messagebox.showinfo("Berhasil", f"Pesanan a.n {nama_pemesan} berhasil dikirim!")
self.cart.clear()
self.refresh_cart()
self.entry_nama.delete(0, tk.END)
self.entry_meja.delete(0, tk.END)
def logout(self):