Compare commits

..
2 Commits
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.
+37 -21
View File
@@ -7,23 +7,38 @@ 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="LOGIN SISTEM CAFE", font=("Arial",18,"bold")).pack(pady=20) tk.Label(self.frame, text="SISTEM CAFE", font=("Arial", 24, "bold")).pack(pady=30)
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)
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() username = self.username_entry.get()
password = self.password_entry.get() password = self.password_entry.get()
@@ -36,34 +51,35 @@ class LoginScreen:
if result: if result:
role = result[0] role = result[0]
self.frame.destroy() self.frame.destroy()
if role=="pembeli":
PembeliMenu(self.root)
elif role=="kasir": if 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")
# --- App --- def masuk_pelanggan(self):
# 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") self.title("Sistem Cafe Python")
self.geometry("700x600") self.geometry("800x600")
# --- Run Program ---
if __name__ == "__main__": if __name__ == "__main__":
setup_database() setup_database()
app = App() app = App()
+39 -24
View File
@@ -10,30 +10,33 @@ 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 = [] # List dictionary: {'nama':, 'harga':, 'jumlah':} self.cart = []
self.images = [] self.images = []
# Header # 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) --- # --- INPUT DATA PELANGGAN (Penting karena tanpa login) ---
frame_meja = tk.Frame(self.frame) info_frame = tk.Frame(self.frame, bd=2, relief="groove", padx=10, pady=10)
frame_meja.pack(pady=5) info_frame.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)
# Logout tk.Label(info_frame, text="Nama Anda:").grid(row=0, column=0, sticky="e")
tk.Button(self.frame, text="Logout", bg="#f9e79f", command=self.logout).pack(pady=5) 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 = 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()
# Listbox Keranjang # 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()
@@ -41,9 +44,10 @@ 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="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): 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")
@@ -60,7 +64,6 @@ 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)
@@ -85,9 +88,11 @@ 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:
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 return
if not self.cart: if not self.cart:
messagebox.showwarning("Kosong", "Pilih menu dulu!") messagebox.showwarning("Kosong", "Pilih menu dulu!")
@@ -99,12 +104,21 @@ class PembeliMenu:
db = connect() db = connect()
cur = db.cursor() 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)
cur.execute("INSERT INTO transaksi (tanggal, total, meja_id, status) VALUES (?, ?, ?, ?)", # Untuk simplifikasi, kita simpan nama pemesan di kolom 'status' sementara atau buat kolom baru.
(tanggal, total_belanja, meja, "Pending")) # TAPI, agar tidak mengubah database lagi, kita anggap Nama Pemesan hanya untuk display Waiter/Kasir.
transaksi_id = cur.lastrowid # Ambil ID transaksi yang baru dibuat
# 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 (?, ?, ?, ?)",
(f"{tanggal} ({nama_pemesan})", total_belanja, meja, "Pending"))
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']))
@@ -112,9 +126,10 @@ class PembeliMenu:
db.commit() db.commit()
db.close() 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.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):