Nama : Erlangga Rizqi Dwi Raswanto
NRP : 5025241179
Kelas : PBO A
Demo : https://youtu.be/ucMWWojthF8
Link Github : https://github.com/erlanggardr/ETS_PBO_5025241179
Mengimplementasikan Vending Coffee Machine
Adapun fitur-fitur yang ada didalam program ini adalah :
- Menu Kopi dengan harga dasar ukuran S
- Pemilihan Ukuran Gelas, terdapat 3 pilihan yaitu S/M/L (Small/Medium/Large)
- Multiplier harga per ukuran (M=1.2, L=1.4)
- Multiplier penggunaan resource per ukuran (M=1.1, L=1.4)
- Pemilihan addon
- Gula : gratis
- Susu : +Rp2000
- Pembayaran & Kembalian
- Manajemen stok & Peringatan Refill saat mau habis
- Menu Admin:
- Laporan stok
- Log Transaksi dengan keterangan tanggal/jam, id transaksi, nama produk, total harga, beserta keterangan kembalian jika ada
Diagram pada BlueJ
Rancangan Kelas :
Coffee
├─ name:String
├─ price:int
└─ +getName():String, +getPrice():int
Size
├─ SMALL=1, MEDIUM=2, LARGE=3
├─ +sizeCup(int):String
├─ +multiplierPrice(int):double // S=1.0, M=1.2, L=1.4
└─ +multiplierResource(int):double// S=1.0, M=1.1, L=1.2
Inventory
├─ coffeeGram:int, waterML:int, sugarGram:int, milkML:int
├─ BASE_COFFEE=5g, BASE_WATER=150ml, MILK_PER_CUP=50ml, SUGAR_PER_CUP=10g
├─ +enoughFor(addSugar, addMilk, size):boolean
├─ +lackingMessage(addSugar, addMilk, size):String
├─ +consume(addSugar, addMilk, size):void
├─ +quickRefill():void
├─ +lowStockWarning():String
└─ +toString():String
Transaction
├─ id:int, time:String (yyyy-MM-dd HH:mm:ss)
├─ coffeeName:String, size:int, sugar:boolean, milk:boolean
├─ total:int, paid:int, change:int
└─ +toString():String
CoffeeMachine (program utama)
├─ menu: Coffee[]
├─ inv: Inventory
├─ log: ArrayList<Transaction>
├─ +main(String[]):void
├─ +showMenu():void
├─ +showReport():void
├─ +readInt(Scanner,String):int
└─ +readYesNo(Scanner,String):boolean
Rancangan objek :
CoffeeMachine
├─ menu[4] → Coffee("Espresso",13000), ("Americano",10000),
│ ("Cappuccino",15000), ("Latte",18000)
├─ inv → Inventory(coffeeGram=300, waterML=2000, sugarGram=100, milkML=500)
└─ log → [] Penjelasan masing-masing class/file :
Coffee.java
Kelas Coffee merepresentasikan satu item menu kopi. Kelas ini hanya menyimpan dua informasi: name (nama kopi) dan price.
Atribut:
-
name: String- nama kopi yang ditampilkan di menu dan dicetak pada transaksi. -
price: int- harga dasar (ukuran Small).
Konstruktor:
-
Menerima
namedanpricelalu menyimpannya ke field.
Metode:
-
getName()- mengembalikan nama kopi. -
getPrice()- mengembalikan harga dasar.
Size.java
Kelas Size menyediakan konstanta untuk ukuran cup (SMALL=1, MEDIUM=2, LARGE=3) dan fungsi bantu untuk:
-
menampilkan label ukuran S/M/L,
-
mengembalikan multiplier harga (untuk menghitung total rupiah),
-
mengembalikan multiplier resource (untuk menghitung pemakaian bahan).
Konstanta:
-
SMALL=1,MEDIUM=2,LARGE=3
Fungsi Bantu:
-
sizeCup(int s)→"S","M", atau"L"sesuai kode ukuran. Jika kode tidak cocok, mengembalikan"Not Valid". -
multiplierPrice(int s)→ pengali harga:-
M → 1.2 (naik 20%), L → 1.4 (naik 40%), S → 1.0 (tidak berubah).
-
-
multiplierResource(int s)→ pengali pemakaian bahan (kopi & air):-
M → 1.1 (naik 10%), L → 1.4 (naik 40%), S → 1.0.
-
Transaction.java
Kelas Transaction merekam satu transaksi yang berhasil: identitas, waktu, pilihan user, dan angka-angka uangnya. Dengan menyimpan jejak transaksi, aplikasi bisa menampilkan laporan di menu admin.
Field:
-
id: int- nomor urut transaksi. -
time: String- timestamp transaksi dalam formatyyyy-MM-dd HH:mm:ss. -
coffeeName: String- nama kopi yang dibeli. -
size: int- kode ukuran (1/2/3) -
sugar: boolean- apakah menambah gula. -
milk: boolean- apakah menambah susu. -
total: int- total harga yang dihitung. -
paid: int- jumlah uang yang dibayarkan pengguna. -
change: int- kembalian (paid − total).
Konstruktor:
-
Mengisi semua field berdasarkan parameter.
-
Membentuk waktu sekarang dengan
LocalDateTime.now()dan memformatnya secara manual menggunakanString.formatagar menjadiYYYY-MM-DD HH:MM:SS.
Representasi Teks:
-
toString()menghasilkan satu baris ringkas untuk laporan, misalnya:
[2025-10-15 10:07:02] #002 Espresso ukuran M + susu. total Rp14000, bayar Rp20000, kembali Rp6000
Label ukuran didapat dariSize.sizeCup(size)→S/M/L. Add-on (gula/susu) hanya dituliskan jika true.
Inventory.java
Kelas Inventory menyimpan stok bahan untuk:
Menghitung kebutuhan bahan per 1 gelas berdasarkan ukuran + add-on,
Memeriksa apakah stok cukup,
Menghasilkan pesan komponen mana yang kurang,
Mengurangi stok setelah transaksi sukses,
Memberi peringatan stok rendah,
Menampilkan ringkasan stok sebagai teks.
Field Stok (state mesin):
coffeeGram: int- stok kopi dalam gram.waterML: int- stok air dalam mililiter.sugarGram: int- stok gula dalam gram.milkML: int- stok susu dalam mililiter.
Konstanta konsumsi (ukuran Small):
BASE_COFFEE = 5gram kopi per cup ukuran S.BASE_WATER = 150ml air per cup ukuran S.MILK_PER_CUP = 50ml susu jika pengguna pilih susu.SUGAR_PER_CUP = 10gram gula jika pengguna pilih gula.
Konstruktor:
Menerima nilai awal stok untuk keempat bahan. Nilai ini menjadi state awal mesin saat aplikasi mulai.
Perhitungan Kebutuhan Bahan (per 1 gelas):
Kopi:
ceil(BASE_COFFEE × multiplierResource(size)).Air:
ceil(BASE_WATER × multiplierResource(size)).Susu: tetap 50 ml jika dipilih.
Gula: tetap 10 g jika dipilih.
Pemeriksaan & Konsumsi:
enoughFor(addSugar, addMilk, size)
Menghitung kebutuhan bahan untuk kombinasi tersebut lalu membandingkan dengan stok. Mengembalikan true jika semua bahan mencukupi.lackingMessage(addSugar, addMilk, size)
Jika ada yang kurang, membangun string “Stok tidak cukup: …” yang menyebutkan bahan mana saja yang kurang (kopi/air/gula/susu).consume(addSugar, addMilk, size)
Mengurangi stok sesuai kebutuhan yang telah dihitung. Dipanggil hanya setelah pembayaran cukup (transaksi sukses).
Informasi & Peringatan:
lowStockWarning()
Mengembalikan teks peringatan jika ada bahan di bawah ambang (kopi < 30g, air < 200ml, gula < 20g, susu < 50ml). Jika aman, mengembalikan “Stok aman.”.toString()
Mengembalikan ringkasan stok: “Stok: Kopi Xg, Air Yml, Gula Zg, Susu Wml”.
CoffeeMachine.java
Kelas CoffeeMachine adalah program utama yaitu: membaca input, menampilkan menu, memanggil perhitungan harga & stok, memverifikasi pembayaran, mengurangi stok, mencatat transaksi, dan menyediakan laporan admin.
Data statis:
-
menu: Coffee[]- daftar item kopi -
MILK_PRICE: int- biaya tambahan -
inven: Inventory- stok awal bahan -
log: ArrayList<Transaction>- daftar transaksi yang berhasil, untuk laporan.
Metode main :
-
Membuat
Scanneruntuk baca input dari konsol. -
While loop sebagai representasi mesin yang selalu aktif sampai user keluar:
-
Tampilkan menu dengan
showMenu():
a) nomor 1..N untuk kopi,
b) 8 untuk Laporan admin,
c) 0 untuk Keluar. -
Baca pilihan pengguna dengan
readInt(...). Metode ini memaksa input angka non-negatif; jika bukan angka, token dibuang dan diminta ulang. -
Kondisi khusus pilihan:
-
0 → ucapkan terima kasih dan
break(keluar dari program). -
8 → panggil
showReport()untuk menampilkan stok & semua transaksi; kemudiancontinue(kembali ke menu).
-
-
Validasi pilihan kopi: jika tidak di rentang 1..
menu.length, tampilkan error dan kembali ke menu. -
Ambil kopi terpilih:
Coffee pesanan = menu[pilih - 1]. -
Pilih ukuran: tampilkan opsi
1) S 2) M 3) L -
Pilih add-on: tanya
Tambah gula? (y/n)danTambah susu? (y/n). -
Cek stok: panggil
inven.enoughFor(addSugar, addMilk, size).-
Jika tidak cukup, tampilkan
inven.lackingMessage(...)(menyebut bahan apa yang kurang), cetak ringkasan stok (inven.toString()) dan peringatan (inven.lowStockWarning()), lalu kembali ke menu.
-
-
Hitung total:
-
priceMult = Size.multiplierPrice(size) -
total = round(pesanan.getPrice() × priceMult) + (addMilk ? MILK_PRICE : 0)
-
-
Pembayaran:
-
Cetak total dan minta
Bayar (Rp):. -
Jika bayar kurang dari total → tolak transaksi (“Kurang Rp …”) dan kembali ke menu.
-
Jika cukup → lanjut.
-
-
Seduh & konsumsi stok:
-
Cetak “Menyeduh … (S/M/L) + gula/susu …” sebagai feedback proses.
-
Kurangi stok dengan
inven.consume(addSugar, addMilk, size).
-
-
Kembalian & log:
-
Hitung kembalian =
bayar − totaldan cetak. -
Buat ID transaksi baru =
log.size() + 1. -
Tambahkan objek
Transactionbaru kelog(berisi waktu, item, ukuran, add-on, total, bayar, kembalian).
-
-
Info stok:
-
Cetak
inven.lowStockWarning()untuk memberi tau kalau bahan ada yang mulai menipis.
-
-
-
Menutup
Scannersaat keluar loop.
Metode helper:
-
showMenu()- Mencetak daftar menu + opsi admin/keluar. -
showReport()- Mencetak ringkasan stok (inven.toString()), lalu setiap transaksi (t.toString()), atau pesan “Belum ada transaksi.” jika log kosong. -
readInt(Scanner, String): int -Membaca input bilangan bulat non-negatif. Jika input bukan angka, menolak dan meminta ulang -
readYesNo(Scanner, String): boolean- Membaca jawaban"y"atau"n".
Flowchart / Alur Sistem Program
Tidak ada komentar:
Posting Komentar