From f9e901d67436530a476bf1c8a1941c6125b0f63d Mon Sep 17 00:00:00 2001 From: Jevinca Marvella Date: Sat, 6 Dec 2025 15:17:33 +0700 Subject: [PATCH] Transaksi, Favorite Cafe --- detail_transaksi.csv | 1 + favorites.csv | 1 + main.py | 140 ++++++++++++++++++++++++++++++++++++++++++- transaksi.csv | 1 + 4 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 detail_transaksi.csv create mode 100644 favorites.csv create mode 100644 transaksi.csv diff --git a/detail_transaksi.csv b/detail_transaksi.csv new file mode 100644 index 0000000..2d5d78e --- /dev/null +++ b/detail_transaksi.csv @@ -0,0 +1 @@ +id,transaksi_id,menu_id,nama_menu,jumlah,harga_satuan,subtotal \ No newline at end of file diff --git a/favorites.csv b/favorites.csv new file mode 100644 index 0000000..e7e46c7 --- /dev/null +++ b/favorites.csv @@ -0,0 +1 @@ +user_id,menu_id,count \ No newline at end of file diff --git a/main.py b/main.py index 446dfcd..ebd608c 100644 --- a/main.py +++ b/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): diff --git a/transaksi.csv b/transaksi.csv new file mode 100644 index 0000000..8d64c03 --- /dev/null +++ b/transaksi.csv @@ -0,0 +1 @@ +id,user_id,tanggal,nomor_meja,total,status,metode_pembayaran \ No newline at end of file