From 3d622c56e23adb16a4ef043aa374ebaacef2ebbc Mon Sep 17 00:00:00 2001 From: Nathan Date: Sun, 7 Dec 2025 18:19:21 +0700 Subject: [PATCH] input --- cafe app.css | 10 +++ database.py | 56 +++++++++++++++++ laporan_screen.py | 1 + main.py | 28 +++++++++ order_screen.py | 37 ++++++++++++ screens/__pycache__/database.cpython-313.pyc | Bin 0 -> 1841 bytes .../__pycache__/login_screen.cpython-313.pyc | Bin 0 -> 3708 bytes screens/login_screen.py | 57 ++++++++++++++++++ screens/menu_crud.py | 27 +++++++++ screens/payment_screen.py | 13 ++++ 10 files changed, 229 insertions(+) create mode 100644 cafe app.css create mode 100644 database.py create mode 100644 laporan_screen.py create mode 100644 main.py create mode 100644 order_screen.py create mode 100644 screens/__pycache__/database.cpython-313.pyc create mode 100644 screens/__pycache__/login_screen.cpython-313.pyc create mode 100644 screens/login_screen.py create mode 100644 screens/menu_crud.py create mode 100644 screens/payment_screen.py diff --git a/cafe app.css b/cafe app.css new file mode 100644 index 0000000..620f21f --- /dev/null +++ b/cafe app.css @@ -0,0 +1,10 @@ +Projek UAS/ +│ +├── main.py +├── database.py +│ +├── screens/ +│ ├── login_screen.py +│ ├── admin_dashboard.py +│ ├── kasir_dashboard.py +│ └── \ No newline at end of file diff --git a/database.py b/database.py new file mode 100644 index 0000000..4d8418e --- /dev/null +++ b/database.py @@ -0,0 +1,56 @@ +import sqlite3 + +def connect(): + return sqlite3.connect("cafe.db") + +def setup(): + db = connect() + cursor = db.cursor() + + cursor.execute(""" + CREATE TABLE IF NOT EXISTS users ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + username TEXT, + password TEXT, + role TEXT + )""") + + cursor.execute(""" + CREATE TABLE IF NOT EXISTS menu ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + nama TEXT, + kategori TEXT, + harga INTEGER, + stok INTEGER, + foto TEXT + )""") + + cursor.execute(""" + CREATE TABLE IF NOT EXISTS meja ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + nomor INTEGER, + status TEXT + )""") + + cursor.execute(""" + CREATE TABLE IF NOT EXISTS transaksi ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + tanggal TEXT, + total INTEGER, + metode_pembayaran TEXT, + meja_id INTEGER, + status TEXT + )""") + + cursor.execute(""" + CREATE TABLE IF NOT EXISTS detail_transaksi ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + transaksi_id INTEGER, + menu_id INTEGER, + jumlah INTEGER, + subtotal INTEGER, + diskon INTEGER + )""") + + db.commit() + db.close() diff --git a/laporan_screen.py b/laporan_screen.py new file mode 100644 index 0000000..6cd9cb0 --- /dev/null +++ b/laporan_screen.py @@ -0,0 +1 @@ +import matplotlib.pyplot as plt \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..ceb8393 --- /dev/null +++ b/main.py @@ -0,0 +1,28 @@ +import tkinter as tk +from database import setup +from screens.login_screen import LoginScreen + +# Setup database saat awal run +setup() + +class CafeApp(tk.Tk): + def __init__(self): + super().__init__() + self.title("Cafe Application - Tkinter") + self.geometry("900x600") + self.resizable(False, False) + + # Frame container + self.container = tk.Frame(self) + self.container.pack(fill="both", expand=True) + + self.show_login() + + def show_login(self): + for widget in self.container.winfo_children(): + widget.destroy() + LoginScreen(self.container, self) + +if __name__ == "__main__": + app = CafeApp() + app.mainloop() \ No newline at end of file diff --git a/order_screen.py b/order_screen.py new file mode 100644 index 0000000..7fba832 --- /dev/null +++ b/order_screen.py @@ -0,0 +1,37 @@ +import tkinter as tk +from tkinter import ttk, messagebox +from database import connect + +class PembeliMenu(tk.Frame): + def __init__(self, parent, controller): + super().__init__(parent) + self.controller = controller + self.pack(fill="both", expand=True) + + tk.Label(self, text="MENU CAFE", font=("Arial", 18, "bold")).pack(pady=20) + + self.tree = ttk.Treeview(self, columns=("nama","kategori","harga","stok"), show="headings") + self.tree.heading("nama", text="Nama") + self.tree.heading("kategori", text="Kategori") + self.tree.heading("harga", text="Harga") + self.tree.heading("stok", text="Stok") + self.tree.pack(fill="both", expand=True) + + tk.Button(self, text="Pesan", command=self.pesan).pack(pady=10) + + self.load_menu() + + def load_menu(self): + db = connect() + cur = db.cursor() + cur.execute("SELECT nama, kategori, harga, stok FROM menu") + for row in cur.fetchall(): + self.tree.insert("", tk.END, values=row) + db.close() + + def pesan(self): + item = self.tree.selection() + if not item: + messagebox.showwarning("Pilih Item", "Pilih menu yang ingin dipesan") + return + messagebox.showinfo("Pesanan", "Menu berhasil ditambahkan ke pesanan!") diff --git a/screens/__pycache__/database.cpython-313.pyc b/screens/__pycache__/database.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42a936b4f4eedbec79b599c44b8e8a730cfe6a5c GIT binary patch literal 1841 zcmb_dU279T6rD}7Nt)6ROCQvyrC2c_c~B}SVoBR=8*4XZvw;Q!Ws;qyn`C$5%&giz zwO}dQhk{TL{006F|A632jXns1;9D``voo7dHYtJPh1}ge_uScYW`~=`*jNnk`1>|t z$ua;x#6vp*t((SGesc;kAS0~-0y2T?fJm7j&w-K@5B(A}t=J-ammtsL*GTYm3Z8nP zNP2tC4g$aoUw2Mw0yjWBpzTG9a2qAeLOf89&}UVPp}X}+5jzelvJapksP%h`5As=x z2+iy1m3-PkOT>DP@=Lhr+Q?xvzd>*rRg`QplQ$uQ1xQh%woAB4;3c7tUg2pUd>frQ znSV3??*8Y|*-xQa65;4zKQmk>_tR1fz#M0aa6lI5Vnttc>QYwH#jAbMb*_L57=iZQ zT*wFxWrT(@#Anl?yyC-18t-j z>ShmIgOt9&#Pq=gSDQ?)Kfd>Im^glf+)HcYx}Z-$1u|5^#PY#Akd$ECcGnzbxYCbq zV}`x{mWjjRCd%;gCa{f3zX-}8b7`-PFT-Ro0v!q~)Vj152Axs~R(+etFymP3%yc); zMhu&1tA^|X+=cwzzBU_`;a2ysbsPJw{Tyb^L=0Nht^eS#y+;F;iPJc+PJ~289n+!}?6f#7f{HP& zC?v`+b(tdO*2o0E4~yC%Pkg41Odem`UpO0^ILW=v9Y5V){vL`QX$RUl2v3jv0bx0I zJ_+Q}CKMG=lta@UNEVRHq45qhfYl2{j#3AyS8HdX@X_kQ>fvK=j>m%}#053yzR*a7 rNUzkCAAM+J)2*UMWRe%eWT#U+od+dJ`U=K>ha~A{BYa1i@Ou6MW;TA( literal 0 HcmV?d00001 diff --git a/screens/__pycache__/login_screen.cpython-313.pyc b/screens/__pycache__/login_screen.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4577b765a74f7d9e4d024b127ba42fcb618ce4a GIT binary patch literal 3708 zcmcH+U2GFade+{x$A7Vn4GAP9OO8?;(nM+rs!=HoNg%`_0WTKx;_GT{Z<1{`-gI_d zAP)ymRnp#xpb9nZ3%RH3-BbJ2@Wksq+K|f85G14`Re7rvs`7Z>tbYh5*Q>6_C>ekA zee?ay%=fojfq)mmcxSmsdjli%16$OFPzAO=0pK>0ki;br;o#SiKqC&~5Gyz*aRSbn z;70@^*f>7n8gUc14GRf8;vpUzb|t(cKH{@scfvmsAOR7zpiU&=eMs`8xnx^S`SagC zX9Xs~DK6&SWQ(yFN4>MEX)04{#<&VAch<<~)vN_zQ-5w&%MU8%bjDCfj$smtsgdoN z;3Y+~)E7{`^XhCy)wOeKzL0&c9U(_`vDE{>2XGN-`x1yl;)pYaj&hP?ANmjzUUKe3 zM38vmN}&@RaUVo6f%-;`DJ?H$iK^x|*?%Yw1Tf%Yf zH%akG-ne5Y8GTiiFG%sfXa`%_wzwr<+>t_h{Y-GarkD5rWMtAwE?Lq4lktF zZyD?j{SJF~z07OhOHc}djVOEHXyXXzprx3<)fSKu$<*W{DvTX9O7De#}JvDGV&CY73 zljCR7<9T(EXdkQTK_gq31x7P{o){mhGh(V=N}G0=n`v8xTv_$ZT_YkB9^IA+dTK{w zCpMqJ^y~)Oz=1_~3AZfoS;OM`zJq@Wu4DgA&!T7P>!f zf^(v5HJdRQu@YnFKON@VET`G%7pElK(J*ScCC>p5d#i@=t2~a0dX}lnai*L}PlFIx z*6DnTPqN2q7!r4R*HK4bH7kn@AMG+FKDxOY`pA%UMHN{KAL&+fw#v&y7O1%)+ZRG48M7Z;uw2@Z{ z%NG>0lB4A(4Z`B9n%`L+Q8d^>Tnx$50AUrJdf0A2gFqpx8>Sj_6L?GzQ!6VJ*RFs% zavACb_0&aFv!FwLWLIc1X;3oQAa5|qF(x3qJ?-0tf%UlNaY%zV(0Zh~963~q94be; zN|CMyk?sY&6YfbM`q}#nj`gO{O>I&8Y-Yjv82fJe7JbF&==$#c#pvOuPR`TyI2`?= z?N;08?F+6Sec|=U-sJd|{A@1FcVlwi{LJ_vVigj$ye?~H#rUT*6vwe@{teRuua>uaGi&z`zapt|In*Z!$R{s|9U%jLk?htwi=H(TiU@j8FtY=_O%X$V`o;7j>oxy%t{-~hnRZ38n zCpBVPIyge!kY&3(R~~CORDMgbw5+UH7SS@`SI`X5K(#N(s=6-A(D8J$CuD`}y~<0o zZj-Qy{hKTkKl=pz><9`;?w8K}LgXg|lWnxUD;A<|Yevh%CkXiiW3@fjZGNP~SIJux z=O7F+3IwC=>CM%)qQ{OUIam9#u^pS%sdk8MqcRVtEj8Xs7;1xf+l%v^0fE zLL8KTySV=F}9wQ@Pf6NeY(i4orss$;oltLlk|4+8?5(N2u))dei