Compare commits

..

No commits in common. "02aa1da64fddbec3a53e2ac8ace0610b86c512d2" and "69e133c6e3bc167390736ac431b960c844d611df" have entirely different histories.

8 changed files with 51 additions and 82 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.

View File

@ -7,38 +7,23 @@ 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="SISTEM CAFE", font=("Arial", 24, "bold")).pack(pady=30)
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)
# --- 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):
def login(self):
username = self.username_entry.get()
password = self.password_entry.get()
@ -51,35 +36,34 @@ class LoginScreen:
if result:
role = result[0]
self.frame.destroy()
if role=="pembeli":
PembeliMenu(self.root)
if role == "kasir":
elif role=="kasir":
KasirPage(self.root, self.root)
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")
else:
messagebox.showerror("Error","Username / Password salah")
def masuk_pelanggan(self):
# Langsung buka menu tanpa cek password
self.frame.destroy()
PembeliMenu(self.root)
# --- App Class ---
# --- App ---
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("Sistem Cafe Python")
self.geometry("800x600")
self.title("Sistem Cafe")
self.geometry("700x600")
# --- Run Program ---
if __name__=="__main__":
setup_database()
app = App()

View File

@ -10,33 +10,30 @@ class PembeliMenu:
self.frame = tk.Frame(parent)
self.frame.pack(fill="both", expand=True)
self.cart = []
self.cart = [] # List dictionary: {'nama':, 'harga':, 'jumlah':}
self.images = []
# Header
tk.Label(self.frame, text="SELAMAT DATANG", font=("Arial", 18, "bold")).pack(pady=10)
tk.Label(self.frame, text="MENU PELANGGAN", font=("Arial", 18, "bold")).pack(pady=10)
# --- 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)
# --- 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)
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)
# Logout
tk.Button(self.frame, text="Logout", bg="#f9e79f", command=self.logout).pack(pady=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)
# Tombol Kembali
tk.Button(self.frame, text="Kembali ke Utama", bg="#f9e79f", command=self.logout).pack(pady=5)
# Area Menu
# Area Menu & Cart
self.menu_frame = tk.Frame(self.frame)
self.menu_frame.pack(pady=10, fill="both", expand=True)
# Load Menu
self.load_menu()
# Keranjang
# Listbox Keranjang
tk.Label(self.frame, text="Keranjang Pesanan:").pack()
self.listbox = tk.Listbox(self.frame, width=50, height=6)
self.listbox.pack()
@ -44,10 +41,9 @@ 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="KIRIM PESANAN", bg="#d1e7dd", font=("Arial", 11, "bold"), command=self.checkout).pack(pady=10)
tk.Button(self.frame, text="PESAN SEKARANG", bg="#d1e7dd", 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")
@ -64,6 +60,7 @@ 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)
@ -88,11 +85,9 @@ 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 nama_pemesan or not meja:
messagebox.showwarning("Data Kurang", "Mohon isi Nama dan Nomor Meja!")
if not meja:
messagebox.showwarning("Peringatan", "Isi nomor meja dulu!")
return
if not self.cart:
messagebox.showwarning("Kosong", "Pilih menu dulu!")
@ -104,21 +99,12 @@ class PembeliMenu:
db = connect()
cur = db.cursor()
# 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.
# 1. Buat Header Transaksi (Status = Pending)
cur.execute("INSERT INTO transaksi (tanggal, total, meja_id, status) VALUES (?, ?, ?, ?)",
(f"{tanggal} ({nama_pemesan})", total_belanja, meja, "Pending"))
transaksi_id = cur.lastrowid
(tanggal, total_belanja, meja, "Pending"))
transaksi_id = cur.lastrowid # Ambil ID transaksi yang baru dibuat
# 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']))
@ -126,10 +112,9 @@ class PembeliMenu:
db.commit()
db.close()
messagebox.showinfo("Berhasil", f"Pesanan a.n {nama_pemesan} berhasil dikirim!")
messagebox.showinfo("Berhasil", "Pesanan terkirim ke Dapur/Waiter!")
self.cart.clear()
self.refresh_cart()
self.entry_nama.delete(0, tk.END)
self.entry_meja.delete(0, tk.END)
def logout(self):