From 5cb88dc6691c856ec1b747c3efa66b2c9e2d0794 Mon Sep 17 00:00:00 2001 From: Nathan Date: Sun, 7 Dec 2025 18:19:21 +0700 Subject: [PATCH] input --- __pycache__/database.cpython-313.pyc | Bin 0 -> 1825 bytes 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 -> 3692 bytes screens/login_screen.py | 57 ++++++++++++++++++ screens/menu_crud.py | 27 +++++++++ screens/payment_screen.py | 13 ++++ test.py | 1 - 12 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 __pycache__/database.cpython-313.pyc 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 delete mode 100644 test.py diff --git a/__pycache__/database.cpython-313.pyc b/__pycache__/database.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3520dd4b360021fe33c09da50f3a32e1e35569e9 GIT binary patch literal 1825 zcmb_dO=}ZD7@keCNt)6ROAqR4D7LtuJt#dWVo7ytW9_zVw$RW*on)uUHrbsxGmEyT z7A!@3=&2z13;Z44MetIi2SE_L72^+ZX48DINeL8R$h))8`^@a~ybN#ZLqjPb;?wgP zM^yp%DPNiqIbYPTip2@Yf~>L#D9A>x1FB@BB1ejf7W*w}M&X?{CaI z6$}l;OUT<;+2JMP-Cn|;zhNVe@`&N->JAmAK#-&!c15H;@O^OXc=qk=yL(>-CqKs~ zX+ogA^-l<0LjSos0A>VJh6h%GDNhVVtFEjnru=j$+D;+3fDvi-;zCBWFC*5Mp>{BU zDH{-qrW2t8m;<4rcx~54NjI!pEw?h6@*XGjNgf0{kP(~aV33Wnn3DF{I+HRX;oRquKEy78siG%(ow$bHH z5SP$y5sV}5vrZXb`^n%Gc?^}Ab7?IcdBq~Cgqp_*7ufloX*bWsoY;7?irqZgLE_t? zZ7$wMo9)Zi-q>yJS3heu=E$jR{s)K69`#fvZ)4BGw(nL@sk;Zv&tK3T+hJwmHFpI5 zG))Z#Vl7_qDI>I&z^`z@=U4#5bsb()3l+k!n7$D^Pv!pulVck~niP+k$}snwEJ*VyQ!8-#7#D@qxb}uBOgLfjZcLk`hV^XuJif z5>f>;+=6HYU~VE9i=QKstgJIY9~=O5`5cwPVi literal 0 HcmV?d00001 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..ba781b39162fac6cd871c68f07c4deaef874242e GIT binary patch literal 3692 zcmcH+U2GFade+`ukN;vD8xlxJmXxD7ghZkQ)#xaNBoN||fENpT$#rjSZ{oeI?R0j1 zkUShbRY`j%f-2PXUPzzXyQkjMg(qJ7bc!LBqajF0hjhwYrBEG@_s#l;U~;|cdW@3s zH{Unk&&+&(yXE(L5RAY7rcXbL5&8#P)P_(6wmt^nE|QVV#S!7)*AYj<4&sn1I45xe z&Kc*21tQouJ}wTsh|7kBI39Krw+)MN&#;$xZP*p}4f}~-LM^Bh$#@@<-4k4*t)~3t zZ=bUQlfV=g^=z`mXq2O#oMxKpl$I*ofR!s<$mg}R1z^*eOis@asAe`*P)UYi;;N~W z?U=w-RkyTPP~J;gE~OdzMJ-=UztoP9qq^AY0pLTphza`=h(qRxGl`CKvST0mEhfC| z+=qxD^F&OdQyg&}L{WiyM+#GVUQQED%Wtx~PFIg(OLf7_)?1fA%X{2iG;X8WbOmJp z8lE7@^>G!Xgsw?O%^H+M3C7(pWUxkd#vBqFhv%$}g#E;|Rpqx6_+?%eWHIL4QI1Q- zG43Zxam${VV<#DXRh6$u@x5vXTiLd_WN*xoL`MBgaK5J3_x@x(|LM%W|C6<#`5dw0FgYu`&i4ua&!>r^=u<9E6Zc~|A-rcg9IO8Hd5%3g^&C_kwi1{Jj% zGip9F7aAEme_>RTFUVI0FG~Gq&J9MLR5(L))!5tvx)`64VQiLm!vf|)-r8&j0z?x( zqh@9)PMR9Yt2r&ok#L0|T-P&Jmf}mQXUMbY!Rr6|+`(QT1}VE`7?r>CjIng($y1S}N>fi_E1A=u?_*aFMC6d@@bu9DAlDmZ>pkR9w2^5S?syX}-Wpd>nFJ}EY#ceZO2 zW#QyCgw!JljkBn;$Ikg7!Q!}K?7Z{kX~rHWMOl2K8vX(rTy+h5YX zUy&e@YSOvH*hPt@OjEi#G?*B)VV2KNotDmw4oJ1^dFnJ_&Q4u&F`b5vYp%&oYm%v@ z)G1Y$=6o|+PB-*vDXmUwR8U#-MTKeBaZ&NQ-DXi2>|wnXt9QhYyv)hsxouQn>3;xO*P&gnQW4$SOTVK#Wot}3-#opWA1@CHPWPSJk)yU!JPR`x+G!*%~?M~Zg?epS4y`lB+ z-lYR~V)FwVzCC4M$3tJovis`~R|Zy2tR6YL=IehN2rvHrQQ#LF!S*HV-pwy=mOI`p zb-cTB@ImkW-tU6L>!ICC&7XDr406k((1DF$$1?v_;LAW+ij}0;%JB!M@1OoI7-!P= zJ_>bi1Y4H|?u~shR&MJnwe@{t{q5#oZ>|N;zj!Vpe{xZ<)fl%R4D;Pnbe7C8Q=){f}+^v zx$;=Mq0(EbrKc6uvWT7nzk=dV{nb7otr>=*K!?-Ko{$x?_bV^Wx=X?)_HVLG{NiKu zgCig$xPNu-7sB5om~5l%UC|(QS<`wRJ~_x+jMes7m-&$aUm@>MoPjV%sSu2|r#DyI ziXJ