Transaksi, Favorite Cafe

This commit is contained in:
Jevinca Marvella 2025-12-06 15:17:33 +07:00
parent 388d55be6a
commit f9e901d674
4 changed files with 142 additions and 1 deletions

1
detail_transaksi.csv Normal file
View File

@ -0,0 +1 @@
id,transaksi_id,menu_id,nama_menu,jumlah,harga_satuan,subtotal
1 id transaksi_id menu_id nama_menu jumlah harga_satuan subtotal

1
favorites.csv Normal file
View File

@ -0,0 +1 @@
user_id,menu_id,count
1 user_id menu_id count

140
main.py
View File

@ -11,10 +11,14 @@ import csv
import tkinter as tk import tkinter as tk
from tkinter import ttk, messagebox, filedialog from tkinter import ttk, messagebox, filedialog
from PIL import Image, ImageTk from PIL import Image, ImageTk
from datetime import datetime
USERS_CSV = "users.csv" USERS_CSV = "users.csv"
MENU_CSV = "menu.csv" MENU_CSV = "menu.csv"
PROMO_CSV = "promo.csv" PROMO_CSV = "promo.csv"
TRANSAKSI_CSV = "transaksi.csv"
DETAIL_TRANSAKSI_CSV = "detail_transaksi.csv"
FAVORITES_CSV = "favorites.csv"
IMG_PREVIEW_SIZE = (120, 80) IMG_PREVIEW_SIZE = (120, 80)
@ -57,7 +61,9 @@ def init_db_csv():
ensure_file(USERS_CSV, ["id", "username", "password", "role"]) ensure_file(USERS_CSV, ["id", "username", "password", "role"])
ensure_file(MENU_CSV, ["id", "nama", "kategori", "harga", "stok", "foto", "tersedia", "item_discount_pct"]) ensure_file(MENU_CSV, ["id", "nama", "kategori", "harga", "stok", "foto", "tersedia", "item_discount_pct"])
ensure_file(PROMO_CSV, ["code", "type", "value", "min_total"]) ensure_file(PROMO_CSV, ["code", "type", "value", "min_total"])
ensure_file(TRANSAKSI_CSV, ["id", "user_id", "tanggal", "nomor_meja", "total", "status", "metode_pembayaran"])
ensure_file(DETAIL_TRANSAKSI_CSV, ["id", "transaksi_id", "menu_id", "nama_menu", "jumlah", "harga_satuan", "subtotal"])
ensure_file(FAVORITES_CSV, ["user_id", "menu_id", "count"])
seed_defaults() seed_defaults()
@ -429,16 +435,146 @@ def apply_discounts_and_promo(cart_items, promo_code=None):
'total': round(total, 2) 'total': round(total, 2)
} }
# TRANSAKSI FUNCTIONS (2nd Person : Jevvvv)
from datetime import datetime
def create_transaksi(user_id, nomor_meja, cart_items):
"""Membuat transaksi baru dengan status 'Menunggu'"""
rows = read_all(TRANSAKSI_CSV)
trans_id = next_int_id(rows, "id")
# Hitung total
total = 0.0
for item in cart_items:
total += item['subtotal']
trans = {
"id": trans_id,
"user_id": str(user_id),
"tanggal": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"nomor_meja": str(nomor_meja),
"total": str(total),
"status": "Menunggu", # Status: Menunggu, Diproses, Selesai
"metode_pembayaran": ""
}
rows.append(trans)
write_all(TRANSAKSI_CSV, ["id", "user_id", "tanggal", "nomor_meja", "total", "status", "metode_pembayaran"], rows)
# Simpan detail transaksi
detail_rows = read_all(DETAIL_TRANSAKSI_CSV)
for item in cart_items:
detail_id = next_int_id(detail_rows, "id")
detail = {
"id": detail_id,
"transaksi_id": trans_id,
"menu_id": str(item['menu_id']),
"nama_menu": item['nama'],
"jumlah": str(item['qty']),
"harga_satuan": str(item['harga']),
"subtotal": str(item['subtotal'])
}
detail_rows.append(detail)
write_all(DETAIL_TRANSAKSI_CSV, ["id", "transaksi_id", "menu_id", "nama_menu", "jumlah", "harga_satuan", "subtotal"], detail_rows)
# Kurangi stok
for item in cart_items:
menu_decrease_stock(item['menu_id'], item['qty'])
return trans_id
def get_all_transaksi(status=None):
"""Ambil semua transaksi, bisa filter by status"""
rows = read_all(TRANSAKSI_CSV)
result = []
for r in rows:
if status and r.get("status") != status:
continue
result.append({
'id': r.get('id'),
'user_id': r.get('user_id'),
'tanggal': r.get('tanggal'),
'nomor_meja': r.get('nomor_meja'),
'total': float(r.get('total', 0)),
'status': r.get('status'),
'metode_pembayaran': r.get('metode_pembayaran', '')
})
return result
def get_transaksi_detail(transaksi_id):
"""Ambil detail item dari transaksi"""
rows = read_all(DETAIL_TRANSAKSI_CSV)
result = []
for r in rows:
if r.get("transaksi_id") == str(transaksi_id):
result.append({
'id': r.get('id'),
'menu_id': r.get('menu_id'),
'nama_menu': r.get('nama_menu'),
'jumlah': int(r.get('jumlah', 0)),
'harga_satuan': float(r.get('harga_satuan', 0)),
'subtotal': float(r.get('subtotal', 0))
})
return result
def update_transaksi_status(transaksi_id, status):
"""Update status transaksi (Menunggu -> Diproses -> Selesai)"""
rows = read_all(TRANSAKSI_CSV)
for r in rows:
if r.get("id") == str(transaksi_id):
r["status"] = status
break
write_all(TRANSAKSI_CSV, ["id", "user_id", "tanggal", "nomor_meja", "total", "status", "metode_pembayaran"], rows)
# FAVORITES FUNCTIONS (2nd Person: JEVVVV)
def add_to_favorites(user_id, menu_id):
"""Tambah atau update counter menu favorit user"""
rows = read_all(FAVORITES_CSV)
found = False
for r in rows:
if r.get("user_id") == str(user_id) and r.get("menu_id") == str(menu_id):
r["count"] = str(int(r.get("count", 0)) + 1)
found = True
break
if not found:
rows.append({
"user_id": str(user_id),
"menu_id": str(menu_id),
"count": "1"
})
write_all(FAVORITES_CSV, ["user_id", "menu_id", "count"], rows)
def get_user_favorites(user_id, limit=5):
"""Ambil menu favorit user (paling sering dipesan)"""
rows = read_all(FAVORITES_CSV)
user_favs = []
for r in rows:
if r.get("user_id") == str(user_id):
user_favs.append({
'menu_id': int(r.get("menu_id")),
'count': int(r.get("count", 0))
})
# Sort by count descending
user_favs.sort(key=lambda x: x['count'], reverse=True)
# Ambil detail menu
result = []
for fav in user_favs[:limit]:
menu = menu_get(fav['menu_id'])
if menu:
result.append({
'menu': menu,
'count': fav['count']
})
return result
@ -453,6 +589,7 @@ class App:
self.root.title("Cafe Totoro Mania") self.root.title("Cafe Totoro Mania")
self.session = None self.session = None
self.img_cache = {} self.img_cache = {}
self.cart = []
self.setup_ui() self.setup_ui()
def setup_ui(self): def setup_ui(self):
@ -495,6 +632,7 @@ class App:
def logout(self): def logout(self):
self.session = None self.session = None
self.img_cache.clear() self.img_cache.clear()
self.cart = []
self.login_frame() self.login_frame()
def dashboard_frame(self): def dashboard_frame(self):

1
transaksi.csv Normal file
View File

@ -0,0 +1 @@
id,user_id,tanggal,nomor_meja,total,status,metode_pembayaran
1 id user_id tanggal nomor_meja total status metode_pembayaran