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
from tkinter import ttk, messagebox, filedialog
from PIL import Image, ImageTk
from datetime import datetime
USERS_CSV = "users.csv"
MENU_CSV = "menu.csv"
PROMO_CSV = "promo.csv"
TRANSAKSI_CSV = "transaksi.csv"
DETAIL_TRANSAKSI_CSV = "detail_transaksi.csv"
FAVORITES_CSV = "favorites.csv"
IMG_PREVIEW_SIZE = (120, 80)
@ -57,7 +61,9 @@ def init_db_csv():
ensure_file(USERS_CSV, ["id", "username", "password", "role"])
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(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()
@ -429,16 +435,146 @@ def apply_discounts_and_promo(cart_items, promo_code=None):
'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.session = None
self.img_cache = {}
self.cart = []
self.setup_ui()
def setup_ui(self):
@ -495,6 +632,7 @@ class App:
def logout(self):
self.session = None
self.img_cache.clear()
self.cart = []
self.login_frame()
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