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 waiter_dashboard import WaiterDashboard
from tkinter import messagebox from tkinter import messagebox
# --- Login Screen ---
class LoginScreen: class LoginScreen:
def __init__(self, root): def __init__(self, root):
self.root = root self.root = root
self.frame = tk.Frame(root) self.frame = tk.Frame(root)
self.frame.pack(fill="both", expand=True) 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 --- def login(self):
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() username = self.username_entry.get()
password = self.password_entry.get() password = self.password_entry.get()
@ -51,35 +36,34 @@ class LoginScreen:
if result: if result:
role = result[0] role = result[0]
self.frame.destroy() self.frame.destroy()
if role=="pembeli":
PembeliMenu(self.root)
if role == "kasir": elif role=="kasir":
KasirPage(self.root, self.root) KasirPage(self.root, self.root)
elif role=="pemilik": elif role=="pemilik":
PemilikPage(self.root, self.root) PemilikPage(self.root, self.root)
elif role == "admin": elif role == "admin":
AdminMenu(self.root) AdminMenu(self.root)
elif role == "waiter": elif role == "waiter":
WaiterDashboard(self.root) WaiterDashboard(self.root)
elif role == "pembeli":
# Jika ada user iseng login pakai akun pembeli di database
PembeliMenu(self.root)
else: else:
messagebox.showerror("Error","Role tidak dikenali") messagebox.showerror("Error","Role tidak dikenali")
else: else:
messagebox.showerror("Error","Username / Password salah") messagebox.showerror("Error","Username / Password salah")
def masuk_pelanggan(self): # --- App ---
# Langsung buka menu tanpa cek password
self.frame.destroy()
PembeliMenu(self.root)
# --- App Class ---
class App(tk.Tk): class App(tk.Tk):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.title("Sistem Cafe Python") self.title("Sistem Cafe")
self.geometry("800x600") self.geometry("700x600")
# --- Run Program ---
if __name__=="__main__": if __name__=="__main__":
setup_database() setup_database()
app = App() app = App()

View File

@ -10,33 +10,30 @@ class PembeliMenu:
self.frame = tk.Frame(parent) self.frame = tk.Frame(parent)
self.frame.pack(fill="both", expand=True) self.frame.pack(fill="both", expand=True)
self.cart = [] self.cart = [] # List dictionary: {'nama':, 'harga':, 'jumlah':}
self.images = [] self.images = []
# Header # 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) --- # --- INPUT NOMOR MEJA (Fitur Baru) ---
info_frame = tk.Frame(self.frame, bd=2, relief="groove", padx=10, pady=10) frame_meja = tk.Frame(self.frame)
info_frame.pack(pady=5) 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") # Logout
self.entry_nama = tk.Entry(info_frame) tk.Button(self.frame, text="Logout", bg="#f9e79f", command=self.logout).pack(pady=5)
self.entry_nama.grid(row=0, column=1, padx=5)
tk.Label(info_frame, text="No. Meja:").grid(row=0, column=2, sticky="e") # Area Menu & Cart
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 = tk.Frame(self.frame)
self.menu_frame.pack(pady=10, fill="both", expand=True) self.menu_frame.pack(pady=10, fill="both", expand=True)
# Load Menu
self.load_menu() self.load_menu()
# Keranjang # Listbox Keranjang
tk.Label(self.frame, text="Keranjang Pesanan:").pack() tk.Label(self.frame, text="Keranjang Pesanan:").pack()
self.listbox = tk.Listbox(self.frame, width=50, height=6) self.listbox = tk.Listbox(self.frame, width=50, height=6)
self.listbox.pack() 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 = 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="PESAN SEKARANG", bg="#d1e7dd", command=self.checkout).pack(pady=10)
def load_menu(self): def load_menu(self):
# (SAMA SEPERTI KODE SEBELUMNYA)
db = connect() db = connect()
cur = db.cursor() cur = db.cursor()
cur.execute("SELECT nama, harga, gambar FROM menu") cur.execute("SELECT nama, harga, gambar FROM menu")
@ -64,6 +60,7 @@ class PembeliMenu:
f.pack(side=tk.LEFT, padx=5) f.pack(side=tk.LEFT, padx=5)
try: try:
# Pastikan nama file gambar sesuai dengan yang ada di folder project/
img = Image.open(gambar).resize((100, 80)) img = Image.open(gambar).resize((100, 80))
photo = ImageTk.PhotoImage(img) photo = ImageTk.PhotoImage(img)
self.images.append(photo) self.images.append(photo)
@ -88,11 +85,9 @@ class PembeliMenu:
self.total_lbl.config(text=f"Total: Rp {total:,.0f}") self.total_lbl.config(text=f"Total: Rp {total:,.0f}")
def checkout(self): def checkout(self):
nama_pemesan = self.entry_nama.get()
meja = self.entry_meja.get() meja = self.entry_meja.get()
if not meja:
if not nama_pemesan or not meja: messagebox.showwarning("Peringatan", "Isi nomor meja dulu!")
messagebox.showwarning("Data Kurang", "Mohon isi Nama dan Nomor Meja!")
return return
if not self.cart: if not self.cart:
messagebox.showwarning("Kosong", "Pilih menu dulu!") messagebox.showwarning("Kosong", "Pilih menu dulu!")
@ -104,21 +99,12 @@ class PembeliMenu:
db = connect() db = connect()
cur = db.cursor() 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) # 1. Buat Header Transaksi (Status = Pending)
# 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 (?, ?, ?, ?)", cur.execute("INSERT INTO transaksi (tanggal, total, meja_id, status) VALUES (?, ?, ?, ?)",
(f"{tanggal} ({nama_pemesan})", total_belanja, meja, "Pending")) (tanggal, total_belanja, meja, "Pending"))
transaksi_id = cur.lastrowid # Ambil ID transaksi yang baru dibuat
transaksi_id = cur.lastrowid
# 2. Masukkan Detail Item
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'], 1, item['harga']))
@ -126,10 +112,9 @@ class PembeliMenu:
db.commit() db.commit()
db.close() 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.cart.clear()
self.refresh_cart() self.refresh_cart()
self.entry_nama.delete(0, tk.END)
self.entry_meja.delete(0, tk.END) self.entry_meja.delete(0, tk.END)
def logout(self): def logout(self):