-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
357 lines (304 loc) · 12.8 KB
/
main.py
File metadata and controls
357 lines (304 loc) · 12.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
import os
from datetime import datetime # untuk mengambil waktu saat ini
import json
from tabulate import tabulate
# data admin dan user yang disatukan dalam satu dictionary
users = {
'admin': {'password': 'admin123', 'role': 'admin'},
'user1': {'password': 'user123', 'role': 'user'}
}
def load_data():
global users, produk, pesanan
try:
with open("data.json", "r") as file:
data = json.load(file)
users = data.get("users", users)
produk = data.get("produk", produk)
pesanan = data.get("pesanan", pesanan)
except FileNotFoundError:
pass
def save_data():
data = {
"users": users,
"produk": produk,
"pesanan": pesanan
}
with open("data.json", "w") as file:
json.dump(data, file, indent=4)
produk = {} # dictionary untuk menyimpan data produk
keranjang = {} # dictionary untuk menyimpan data keranjang belanja
pesanan = [] # list untuk menyimpan data pesanan
def clear_screen(): # fungsi untuk me-refresh layar ketika membuka setiap menu/fungsi lainnya
os.system('cls' if os.name == 'nt' else 'clear')
def login(): # fungsi login
while True:
print("\n=== LOGIN ===")
username = input("Username: ")
password = input("Password: ")
if username in users and users[username]['password'] == password:
return username, users[username]['role'] # mengembalikan username dan role user jika login berhasil
print("Username atau password salah")
def register_user(): # fungsi register user
while True:
print("\n=== REGISTER USER ===")
username = input("Masukkan username baru: ")
if username in users:# cek apakah username sudah digunakan
print("Username sudah digunakan! Tekan Enter untuk mencoba lagi.")
input()
continue
password = input("Masukkan password: ")
konfirmasi_password = input("Konfirmasi password: ")
if password != konfirmasi_password: # cek apakah password dan konfirmasi password cocok
print("Password tidak cocok! Tekan Enter untuk mencoba lagi.")
input()
continue
users[username] = {'password': password, 'role': 'user'} # tambahkan user baru ke dictionary users
save_data() # menyimpan data ke file JSON setelah registrasi user baru
print("Registrasi berhasil! Tekan Enter untuk kembali ke menu utama.")
input()
break
def admin_menu(): # fungsi menu admin
while True:
clear_screen()
print("\n=== ADMIN MENU ===")
print("1. Lihat Produk")
print("2. Tambah Produk")
print("3. Edit Produk")
print("4. Hapus Produk")
print("5. Lihat Pesanan")
print("6. Logout")
choice = input("Pilih menu (1-6): ")
if choice == '1':
lihat_produk()
elif choice == '2':
tambah_produk()
elif choice == '3':
edit_produk()
elif choice == '4':
hapus_produk()
elif choice == '5':
lihat_pesanan()
elif choice == '6':
break
def user_menu(username): # fungsi menu user
while True:
clear_screen()
print("\n=== USER MENU ===")
print("1. Lihat Produk")
print("2. Tambah ke Keranjang")
print("3. Lihat Keranjang")
print("4. Checkout")
print("5. Riwayat Pesanan")
print("6. Logout")
choice = input("Pilih menu (1-6): ")
if choice == '1':
lihat_produk()
elif choice == '2':
keranjang_belanja(username) # memanggil fungsi keranjang belanja dengan username
elif choice == '3':
lihat_keranjang(username)
elif choice == '4':
checkout(username)
elif choice == '5':
user_pesanan(username)
elif choice == '6':
break
def lihat_produk():
print("\n=== DAFTAR PRODUK ===")
if not produk:
print("Belum ada produk!")
else:
data = [
[id_produk, p['nama'], f"Rp{p['harga']:,}", p['stok']]
for id_produk, p in produk.items()
]
print(tabulate(data, headers=["ID", "Nama", "Harga", "Stok"], tablefmt="grid"))
input("\nTekan Enter untuk kembali...")
def tambah_produk(): # fungsi tambah produk
print("\n=== TAMBAH PRODUK ===")
nama = input("Nama produk: ")
harga = int(input("Harga: "))
stok = int(input("Stok: "))
# menentukan ID produk berikutnya jika ada produk sebelumnya
id_produk = max(produk.keys()) + 1 if produk else 1 # atau jika tidak ada produk, ID produk awal adalah 1
produk[id_produk] = { # menambahkan produk baru ke dictionary produk
'nama': nama,
'harga': harga,
'stok': stok
}
save_data() # menyimpan data ke file JSON setelah menambahkan produk baru
print("Produk berhasil ditambahkan!")
input("\nTekan Enter untuk kembali...")
def edit_produk(): # fungsi edit produk
lihat_produk() # menampilkan daftar produk
id_produk = int(input("\nMasukkan ID produk yang akan diedit: "))
if id_produk in produk:
print("\nMasukkan data baru (kosongkan jika tidak ingin mengubah):")
nama = input(f"Nama ({produk[id_produk]['nama']}): ")
harga = input(f"Harga ({produk[id_produk]['harga']}): ")
stok = input(f"Stok ({produk[id_produk]['stok']}): ")
if nama:
produk[id_produk]['nama'] = nama
if harga:
produk[id_produk]['harga'] = int(harga)
if stok:
produk[id_produk]['stok'] = int(stok)
save_data() # menyimpan data ke file JSON setelah mengedit produk
print("Produk berhasil diedit!")
else:
print("ID produk tidak ditemukan!")
input("\nTekan Enter untuk kembali...")
def hapus_produk(): # fungsi hapus produk
lihat_produk() # menampilkan daftar produk
id_produk = int(input("\nMasukkan ID produk yang akan dihapus: "))
if id_produk in produk: # jika ID produk ditemukan dalam dictionary
del produk[id_produk] # maka hapus produk dengan ID tersebut
save_data() # menyimpan data ke file JSON setelah menghapus produk
print("Produk berhasil dihapus!")
else:
print("ID produk tidak ditemukan!")
input("\nTekan Enter untuk kembali...")
def keranjang_belanja(username): # fungsi keranjang belanja
if username not in keranjang: # jika username belum ada dalam dictionary keranjang belanja
keranjang[username] = {} # maka buat keranjang belanja baru
lihat_produk() # menampilkan daftar produk
id_produk = int(input("\nMasukkan ID produk: "))
if id_produk in produk:
kuantitas = int(input("Masukkan jumlah: "))
if kuantitas <= produk[id_produk]['stok']:
if id_produk in keranjang[username]:
keranjang[username][id_produk] += kuantitas # jika produk sudah ada dalam keranjang, tambahkan kuantitas
else:
keranjang[username][id_produk] = kuantitas # jika produk belum ada dalam keranjang, tambahkan produk baru
print("Produk berhasil ditambahkan ke keranjang!")
else:
print("Stok tidak mencukupi!")
else:
print("ID produk tidak ditemukan!")
input("\nTekan Enter untuk kembali...")
def lihat_keranjang(username): # fungsi lihat keranjang
if username not in keranjang or not keranjang[username]:
print("\nKeranjang kosong!")
input("\nTekan Enter untuk kembali...")
return
print("\n=== ISI KERANJANG ===")
total = 0
for id_produk, kuantitas in keranjang[username].items(): # menampilkan isi keranjang belanja dengan format ID, Nama, Harga dan Kuantitas
subtotal = kuantitas * produk[id_produk]['harga']
total += subtotal
print(f"{produk[id_produk]['nama']} | {kuantitas} x Rp{produk[id_produk]['harga']:,} = Rp{subtotal:,}")
print("-" * 40)
print(f"Total: Rp{total:,}")
input("\nTekan Enter untuk kembali...")
def checkout(username): # fungsi checkout
if username not in keranjang or not keranjang[username]: # jika keranjang belanja kosong atau username tidak ada dalam keranjang
print("\nKeranjang kosong!") # maka tampilkan pesan keranjang kosong
input("\nTekan Enter untuk kembali...")
return
print("\n=== CHECKOUT ===")
lihat_keranjang(username) # menampilkan isi keranjang belanja
confirm = input("\nLanjutkan checkout? (y/n): ") # meminta konfirmasi untuk melanjutkan checkout
if confirm.lower() == 'y':
order = { # membuat pesanan baru dengan data pesanan dari keranjang belanja
'username': username,
'items': {}, # dictionary untuk menyimpan item-item pesanan
'total': 0, # variabel untuk menyimpan total harga
'date': datetime.now().strftime('%Y-%m-%d %H:%M:%S') # variabel untuk menyimpan tanggal pesanan
}
for id_produk, kuantitas in keranjang[username].items(): # menambahkan item-item pesanan ke dictionary
if kuantitas <= produk[id_produk]['stok']:
produk[id_produk]['stok'] -= kuantitas
subtotal = kuantitas * produk[id_produk]['harga']
order['items'][id_produk] = {
'nama': produk[id_produk]['nama'],
'kuantitas': kuantitas,
'harga': produk[id_produk]['harga'],
'subtotal': subtotal
}
order['total'] += subtotal # menambahkan subtotal ke total pesanan
print(f"Produk {produk[id_produk]['nama']} berhasil di-checkout")
else:
print(f"Stok {produk[id_produk]['nama']} tidak mencukupi!")
return
pesanan.append(order) # menambahkan pesanan baru ke list pesanan
keranjang[username].clear() # mengosongkan keranjang belanja setelah checkout
save_data() # menyimpan data ke file JSON setelah checkout
print("Checkout berhasil!")
input("\nTekan Enter untuk kembali...")
def lihat_pesanan():
print("\n=== DAFTAR PESANAN ===")
if not pesanan:
print("Belum ada pesanan.")
else:
for i, order in enumerate(pesanan, 1):
print(f"\nPesanan #{i}")
print(f"Username: {order['username']}")
print(f"Tanggal: {order['date']}")
# Pastikan ada item di dalam pesanan
if order.get('items'):
items = [
[
item['nama'],
item['kuantitas'],
f"Rp{item['harga']:,}",
f"Rp{item['subtotal']:,}"
]
for item in order['items'].values()
]
print(tabulate(items, headers=["Nama", "Qty", "Harga", "Subtotal"], tablefmt="grid"))
print(f"Total: Rp{order['total']:,}")
else:
print("(Pesanan kosong)")
input("\nTekan Enter untuk kembali...")
from tabulate import tabulate
def user_pesanan(username):
print(f"\n=== RIWAYAT PESANAN {username.upper()} ===")
# Ambil semua pesanan milik user
pesanan_pengguna = [order for order in pesanan if order['username'] == username]
if not pesanan_pengguna:
print("Belum ada riwayat pesanan.")
else:
for i, order in enumerate(pesanan_pengguna, 1):
print(f"\nPesanan #{i}")
print(f"Tanggal: {order['date']}")
if order.get('items'):
items = [
[
item['nama'],
item['kuantitas'],
f"Rp{item['harga']:,}",
f"Rp{item['subtotal']:,}"
]
for item in order['items'].values()
]
# Pastikan ada item di dalam pesanan
print(tabulate(items, headers=["Nama", "Qty", "Harga", "Subtotal"], tablefmt="grid"))
print(f"Total: Rp{order['total']:,}")
else:
print("(Pesanan kosong)")
input("\nTekan Enter untuk kembali...")
def main(): # fungsi utama
load_data() # memuat data dari file JSON saat program dimulai
while True:
clear_screen()
print("=== SISTEM E-COMMERCE ===")
print("1. Login")
print("2. Registrasi")
print("3. Keluar")
choice = input("Pilih menu (1-3): ")
if choice == '1':
username, role = login()
if role == 'admin':
admin_menu()
else:
user_menu(username)
elif choice == '2':
register_user()
elif choice == '3':
print("Terima kasih! Sampai jumpa.")
break
else:
print("Pilihan tidak valid! Tekan Enter untuk kembali.")
input()
if __name__ == "__main__":
main()