ETS: Membuat Vending Coffee Machine

ETS

Nama: Farrel Aqilla Novianto

NRP: 5025241015

Kelas: Pemrograman Berorientasi Objek (A)

Source Code

Video Demo

Mesin Kopi - myCoffee

myCoffee adalah aplikasi yang mensimulasikan mesin penjual otomatis untuk minuman kopi. Pengguna dapat memilih jenis kopi, ukuran gelas, menambahkan gula atau susu, melakukan pembayaran, dan menerima kopi yang telah disiapkan oleh mesin. Sistem ini mengelola stok bahan (kopi, gula, susu, air), memproses pembayaran, serta memberikan laporan transaksi dan status mesin.

Fitur myCoffee

  1. Menampilkan menu pilihan kopi.
  2. Konsumen dapat memilih jenis dan ukuran kopi.
  3. Konsumen dapat memilih gula atau menambah susu.
  4. Mesin menampilkan total harga dan dapat menghitung kembalian.
  5. Transaksi disimpan ke log dan hanya admin yang bisa mengakses.
  6. Jika stok habis, admin diingatkan untuk refill di menu stok.
Untuk kelas dan objek ada 3, yaitu Menu sebagai halaman utama myCoffee, Coffee untuk menyimpan data-data kopi yang tersedia, dan BuyLog untuk mencatat log setiap pembelian.

Kode Menu.java

/**
 *
 * @author Farrel Aqilla Novianto
 */
 
import java.util.Scanner;
import java.util.ArrayList;

public class Menu{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int choice;
        ArrayList menu = new ArrayList<>();
        ArrayList logs = new ArrayList<>();
        menu.add(new Coffee("Espresso", 15000, 10));
        menu.add(new Coffee("Latte", 20000, 8));
        menu.add(new Coffee("Cappuccino", 25000, 5));
        menu.add(new Coffee("Americano", 18000, 0));
        do{
            System.out.println("--- Coffee Machine ---");
            System.out.println("1. Lihat Menu");
            System.out.println("2. Beli");
            System.out.println("3. Stok (ADMIN)");
            System.out.println("4. Log (ADMIN)");
            System.out.println("5. Keluar");
            System.out.print("Pilih menu: ");
            choice = scanner.nextInt();
            scanner.nextLine();

            switch(choice){
                case 1:
                    System.out.print("\n");
                    for(Coffee coffee : menu){
                        System.out.println(coffee.getName() + " - Rp." + coffee.getPrice() + " (Stok: " + coffee.getStock() + ")");
                    }
                    System.out.print("\n");
                    break;

                case 2:
                    System.out.print("\n");
                    for(int i = 0; i < menu.size(); i++){
                        System.out.println(i + 1 + ". " + menu.get(i).getName() + " - Rp." + menu.get(i).getPrice());
                    }
                    System.out.print("Pilih kopi yang ingin dibeli: ");
                    int coffeeChoice = scanner.nextInt();
                    scanner.nextLine();
                    String coffeeName = "";
                    switch(coffeeChoice){
                        case 1:
                            coffeeName = "Espresso";
                            break;
                        case 2:
                            coffeeName = "Latte";
                            break;
                        case 3:
                            coffeeName = "Cappuccino";
                            break;
                        case 4:
                            coffeeName = "Americano";
                            break;
                        default:
                            System.out.println("Pilihan tidak valid");
                            System.out.print("\n");
                            break;
                    }
                    for(Coffee coffee : menu){
                        if(coffee.getName().equals(coffeeName)){
                            if(coffee.getStock() > 0){
                                System.out.print("\n");
                                System.out.println("1. Small");
                                System.out.println("2. Medium (+ Rp.2000)");
                                System.out.println("3. Large (+ Rp.5000)");
                                System.out.print("Pilih size kopi: ");
                                int sizeChoice = scanner.nextInt();
                                scanner.nextLine();
                                String size = "";
                                switch(sizeChoice){
                                    case 1:
                                        size = "Small";
                                        break;
                                    case 2:
                                        size = "Medium";
                                        coffee.setPrice(coffee.getPrice() + 2000);
                                        break;
                                    case 3:
                                        size = "Large";
                                        coffee.setPrice(coffee.getPrice() + 5000);
                                        break;
                                    default:
                                        System.out.println("Pilihan tidak valid");
                                        System.out.print("\n");
                                        break;
                                }
                                System.out.println("Anda memilih " + size + " " + coffee.getName() + " seharga Rp." + coffee.getPrice() + "\n");
                                System.out.println("1. 0% gula");
                                System.out.println("2. 50% gula");
                                System.out.println("3. 100% gula");
                                System.out.println("4. Dengan susu (+ Rp.3000)");
                                System.out.print("Pilih gula dan susu: ");
                                int addOnChoice = scanner.nextInt();
                                scanner.nextLine();
                                switch (addOnChoice){
                                    case 1:
                                        System.out.println("Anda memilih 0% gula");
                                        break;
                                    case 2:
                                        System.out.println("Anda memilih 50% gula");
                                        break;
                                    case 3:
                                        System.out.println("Anda memilih 100% gula");
                                        break;
                                    case 4:
                                        System.out.println("Anda memilih dengan susu");
                                        coffee.setPrice(coffee.getPrice() + 3000);
                                        break;
                                    default:
                                        System.out.println("Pilihan tidak valid");
                                        System.out.print("\n");
                                        break;
                                }
                                System.out.println("\nTotal harga: Rp." + coffee.getPrice());
                                System.out.print("Masukkan jumlah uang: ");
                                int money = scanner.nextInt();
                                scanner.nextLine();
                                if(money < coffee.getPrice()){
                                    System.out.println("\nUang tidak cukup. Pembelian gagal");
                                    System.out.print("\n");
                                    break;
                                }
                                System.out.println("\nKopi " + coffee.getName() + " berhasil dibeli seharga Rp." + coffee.getPrice());
                                coffee.setStock(coffee.getStock() - 1);
                                if(money > coffee.getPrice()){
                                    System.out.println("Kembalian: Rp." + (money - coffee.getPrice()));
                                }
                                System.out.println("Terima kasih telah membeli kopi di myCoffee!");
                                System.out.print("\n");
                                logs.add(new BuyLog(coffee.getName(), coffee.getPrice(), coffee.getStock(), coffee.getPrice()));
                                break;
                            } 
                            else{
                                System.out.println("Maaf, stok kopi " + coffee.getName() + " habis");
                                System.out.print("\n");
                            }
                            break;
                        }
                    }
                    break;
                
                case 3:
                    System.out.println("\nMasukkan password admin: ");
                    String password = scanner.nextLine();
                    if(password.equals("admin123")){
                        System.out.println("Akses stok berhasil");
                        System.out.print("\n");
                        for(Coffee coffee : menu){
                            if(coffee.getStock() <= 3 && coffee.getStock() > 0){
                                System.out.println("PERINGATAN: Stok " + coffee.getName() + " hampir habis!");
                            } else if(coffee.getStock() == 0){
                                System.out.print("\n");
                                System.out.println("PERINGATAN: Stok " + coffee.getName() + " habis!");
                            }
                            System.out.println(coffee.getName() + " - Stok: " + coffee.getStock());
                        }
                        System.out.print("\n");
                    } else{
                        System.out.println("Password salah. Akses ditolak");
                        System.out.print("\n");
                    }
                    break;
                    
                case 4:
                    System.out.println("\nMasukkan password admin: ");
                    String passwordLog = scanner.nextLine();
                    if(passwordLog.equals("admin123")){
                        System.out.println("Akses log berhasil\n");
                        if(logs.isEmpty()){
                            System.out.println("Belum ada pembelian yang dilakukan");
                        } 
                        else{
                            System.out.println("------------ Log Pembelian ------------");
                            for(int i = 0; i < logs.size(); i++){
                                BuyLog log = logs.get(i);
                                System.out.println((i + 1) + ". " + log.getCoffeeName() + " - Rp." + log.getPrice() + " (Sisa Stok: " + log.getStock() + ")");
                            }
                            int totalIncome = 0;
                            for(BuyLog log : logs){
                                totalIncome += log.getIncome();
                            }
                            System.out.println("Total Pendapatan: Rp." + totalIncome + "\n");
                        }
                    } else{
                        System.out.println("Password salah. Akses ditolak");
                        System.out.print("\n");
                    }
                    break;

                case 5:
                    System.out.println("Keluar dari menu myCoffee. Sampai jumpa!");
                    break;

                default:
                    System.out.println("Pilihan tidak valid, coba lagi");
            }
        }
        while (choice != 5);
        scanner.close();
    }
}

Penjelasan

Alur utama:

  1. Inisialisasi scanner
  2. Menambahkan empat item kopi default ke menu.
  3. Menampilkan menu pilihan berulang (do-while) hingga pengguna memilih keluar (opsi 5).

Pilihan menu:

Lihat Menu, menampilkan semua item di menu dengan harga dan stok.

Beli

  1. Menampilkan daftar kopi, meminta pilihan kopi.
  2. Memetakan pilihan angka ke nama kopi (switch).
  3. Mencari objek Coffee sesuai nama, cek stok > 0.
  4. Menampilkan pilihan ukuran
  5. Jika memilih medium atau large, kode memanggil coffee.setPrice(coffee.getPrice() + X), yang mengubah harga di objek Coffee.
  6. Pilihan gula/susu:
  7. Menampilkan total harga (mengambil coffee.getPrice() setelah modifikasi).
  8. Meminta input jumlah uang dari pengguna.
  9. Jika uang cukup: mengurangi stok (coffee.setStock(coffee.getStock() - 1)), menampilkan kembalian bila ada, menambahkan BuyLog ke list logs.
  10. Jika uang kurang: transaksi dibatalkan.

Stok (Admin)

  1. Meminta password admin (admin123).
  2. Jika benar: mencetak peringatan stok hampir habis (stok < 5) dan stok habis (stok == 0), lalu menampilkan stok tiap kopi.

Log (Admin)

  1. Meminta password admin (admin123).
  2. Jika benar: menampilkan daftar transaksi yang tersimpan di logs dan menghitung total pendapatan (menjumlah income di setiap BuyLog).

Keluar, mengakhiri loop dan menutup scanner.

Kode Coffee.java

/**
 *
 * @author Farrel Aqilla Novianto
 */

public class Coffee{
    private String name;
    private int price;
    private int stock;

    public Coffee(String name, int price, int stock){
        this.name = name;
        this.price = price;
        this.stock = stock;
    }

    public String getName(){
        return name;
    }

    public int getPrice(){
        return price;
    }

    public int getStock(){
        return stock;
    }

    public void setStock(int stock){
        this.stock = stock;
    }

    public void setPrice(int price){
        this.price = price;
    }
}
Penjelasan
Merepresentasikan setiap menu kopi. Kode inti (penjelasan):

Properti:
name (String): nama kopi.
price (int): harga saat ini.
stock (int): jumlah stok yang tersedia.
Konstruktor: public Coffee(String name, int price, int stock) untuk inisialisasi.
Getter: getName(), getPrice(), getStock() untuk membaca nilai properti.
Setter: setStock(int stock), setPrice(int price) untuk memperbarui nilai.

Kode BuyLog.java
/**
 *
 * @author Farrel Aqilla Novianto
 */

public class BuyLog{
    private String coffeeName;
    private int price;
    private int stock;
    private int income;

    public BuyLog(String coffeeName, int price, int stock, int income){
        this.coffeeName = coffeeName;
        this.price = price;
        this.stock = stock;
        this.income = income;
    }

    public String getCoffeeName(){
        return coffeeName;
    }

    public int getPrice(){
        return price;
    }

    public int getStock(){
        return stock;
    }

    public int getIncome(){
        return income;
    }
}
Penjelasan
Menyimpan catatan setiap transaksi pembelian untuk tampilan log. Properti:

coffeeName (String): nama kopi.
price (int): harga pada saat transaksi.
stock (int): sisa stok setelah pembelian.
income (int): pendapatan dari transaksi (diimplementasikan sama dengan price pada log saat ini).
Metode: getter sederhana untuk setiap properti.

Dokumentasi






Komentar

Postingan populer dari blog ini

Final Project: Tetris

Pertemuan 4: Membuat Clock Display