Transaksi, Favorite Cafe
This commit is contained in:
parent
388d55be6a
commit
f9e901d674
1
detail_transaksi.csv
Normal file
1
detail_transaksi.csv
Normal file
@ -0,0 +1 @@
|
||||
id,transaksi_id,menu_id,nama_menu,jumlah,harga_satuan,subtotal
|
||||
|
1
favorites.csv
Normal file
1
favorites.csv
Normal file
@ -0,0 +1 @@
|
||||
user_id,menu_id,count
|
||||
|
140
main.py
140
main.py
@ -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
1
transaksi.csv
Normal file
@ -0,0 +1 @@
|
||||
id,user_id,tanggal,nomor_meja,total,status,metode_pembayaran
|
||||
|
Loading…
x
Reference in New Issue
Block a user