Senin, 13 Oktober 2025

Pertemuan 8 - ETS Coffee Machine

Evaluasi Tengah Semester Pemrograman Berbasis Objek (PBO)



Nama  : Hosea Felix sanjaya

NRP    : 5025231177

Kelas  : A

Tahun : 2025


Pendahuluan

Dalam evaluasi tengah semester mata kuliah Pemrograman Berbasis Objek (PBO) ini, saya diminta untuk mengimplementasikan konsep Object-Oriented Programming (OOP) dalam bentuk simulasi Coffee Machine (Mesin Penjual Kopi Otomatis) menggunakan bahasa pemrograman Java.


Soal

Sistem Vending Coffee Machine 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.

Alur Sistem (Flow)

Alur kerja Vending Coffee Machine
  • Mesin aktif → menampilkan menu pilihan kopi.
  • Pengguna memilih jenis dan ukuran kopi.
  • Pengguna menambah gula/susu (opsional).
  • Mesin menampilkan total harga.
  • Pengguna melakukan pembayaran.
  • Mesin memverifikasi pembayaran → jika cukup → membuat kopi.
  • Kopi disajikan → sistem mengurangi stok.
  • Transaksi disimpan ke log.
  • Jika stok habis → admin diingatkan untuk refill.

Ketentuan

  • Tentukan fitur yang ada pada mesin.
  • Gambarkan rancangan kelas dan rancangan obyek vending coffee mashin.
  • Buatkan output simulasi vending coffe machine.
  • Implementasikan dalam bentuk aplikasi simulasi vending coffe machine.
  • Buatlah Video Presentasi yang menjelaskan pekerjaanmu kemudian upload di Youtube.
  • Buat Dokumentasi pengerjaan di blog, kemudian isi google form  Link Pengumpulan ETS.

Deskripsi Sistem

Sistem Coffee Machine ini bekerja seperti mesin penjual otomatis yang menyediakan berbagai jenis kopi.
Pengguna dapat:

  • Memasukkan uang.

  • Memilih jenis kopi (20 varian).

  • Menentukan ukuran (Small, Medium, Large).

  • Menambah gula atau susu jika stok tersedia.

  • Memesan lebih dari satu kopi sekaligus.

Program juga mencatat setiap transaksi ke dalam file transaction_log.txt dan menampilkan pesan jika stok habis.


Kode Program Lengkap

Kelas CoffeeMachine

/**
 * Coffee Machine in JAVA.
 *
 * @author Hosea Felix
 * @version 14 Oktober 2025
 */

import java.util.*;
import java.io.*;

public class CoffeeMachine {
    private int balance;
    private int coffeeStock;
    private int milkStock;
    private int sugarStock;

    public CoffeeMachine() {
        this.balance = 0;
        this.coffeeStock = 10;
        this.milkStock = 5;
        this.sugarStock = 5;
    }

    private static class CoffeeItem {
        String name;
        int price;
        CoffeeItem(String name, int price) {
            this.name = name;
            this.price = price;
        }
    }

    private final CoffeeItem[] menu = {
        new CoffeeItem("Americano", 30000),
        new CoffeeItem("Latte", 35000),
        new CoffeeItem("Cappuccino", 35000),
        new CoffeeItem("Espresso", 15000),
        new CoffeeItem("Macchiato", 32000),
        new CoffeeItem("Mocha", 37000),
        new CoffeeItem("Flat White", 33000),
        new CoffeeItem("Affogato", 28000),
        new CoffeeItem("Cold Brew", 25000),
        new CoffeeItem("Caramel Latte", 38000),
        new CoffeeItem("Hazelnut Coffee", 39000),
        new CoffeeItem("Vanilla Latte", 36000),
        new CoffeeItem("Irish Coffee", 40000),
        new CoffeeItem("Turkish Coffee", 42000),
        new CoffeeItem("Coconut Latte", 37000),
        new CoffeeItem("Pumpkin Spice Latte", 41000),
        new CoffeeItem("Matcha Latte", 36000),
        new CoffeeItem("Honey Cappuccino", 38000),
        new CoffeeItem("Toffee Nut Latte", 39000),
        new CoffeeItem("Double Espresso", 28000)
    };

    public void start() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("===== ☕ Welcome to Hosee Coffee Machine ☕ =====");

        while (true) {
            if (coffeeStock <= 0) {
                System.out.println("\n❌ Stok kopi habis! Mesin tutup sementara.");
                System.out.println("Silakan isi ulang stok kopi sebelum beroperasi kembali.");
                break;
            }

            printMenu();
            System.out.print("\nMasukkan uang Anda (Rp): ");
            int money = scanner.nextInt();
            insertMoney(money);

            System.out.print("\nPilih nomor kopi (1-" + menu.length + "): ");
            int coffeeChoice = scanner.nextInt();

            System.out.print("Pilih ukuran (1. Small  2. Medium +5000  3. Large +10000): ");
            int sizeChoice = scanner.nextInt();

            boolean addSugar = false;
            boolean addMilk = false;

            if (sugarStock > 0) {
                System.out.print("Tambah gula? +2000 (y/n): ");
                addSugar = scanner.next().equalsIgnoreCase("y");
            } else {
                System.out.println("⚠️  Stok gula habis! Tidak dapat menambahkan gula.");
            }

            if (milkStock > 0) {
                System.out.print("Tambah susu? +3000 (y/n): ");
                addMilk = scanner.next().equalsIgnoreCase("y");
            } else {
                System.out.println("⚠️  Stok susu habis! Tidak dapat menambahkan susu.");
            }

            System.out.print("Masukkan jumlah pesanan: ");
            int quantity = scanner.nextInt();

            processOrder(coffeeChoice, sizeChoice, addSugar, addMilk, quantity);

            System.out.print("\nApakah ingin memesan lagi? (y/n): ");
            String again = scanner.next();
            if (!again.equalsIgnoreCase("y")) {
                System.out.println("\nTerima kasih telah menggunakan Hosee Coffee Machine!");
                System.out.println("Saldo akhir Anda: Rp " + balance);
                break;
            }
        }
    }

    public void printMenu() {
        System.out.println("\n===== MENU KOPI =====");
        for (int i = 0; i < menu.length; i++) {
            System.out.printf("%2d. %-25s Rp %d\n", (i + 1), menu[i].name, menu[i].price);
        }
        System.out.println("\nStok saat ini → Kopi: " + coffeeStock + ", Susu: " + milkStock + ", Gula: " + sugarStock);
    }

    public void insertMoney(int amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("Saldo Anda: Rp " + balance);
        } else {
            System.out.println("Nominal tidak valid!");
        }
    }

    public void processOrder(int choice, int size, boolean sugar, boolean milk, int quantity) {
        if (choice < 1 || choice > menu.length) {
            System.out.println("❌ Pilihan kopi tidak valid.");
            return;
        }

        if (coffeeStock <= 0) {
            System.out.println("❌ Kopi habis! Mesin tidak bisa melayani pesanan.");
            return;
        }

        if (quantity <= 0) {
            System.out.println("❌ Jumlah pesanan tidak valid.");
            return;
        }

        CoffeeItem item = menu[choice - 1];
        int basePrice = item.price;
        int sizeAdd = (size == 2) ? 5000 : (size == 3) ? 10000 : 0;
        int totalExtra = 0;

        if (quantity > coffeeStock) {
            System.out.println("⚠️  Stok kopi tidak cukup untuk jumlah tersebut. Ulangi pemesanan.");
            return;
        }

        if (sugar && sugarStock < quantity) {
            System.out.println("⚠️  Stok gula tidak cukup. Pesanan dibatalkan.");
            return;
        }
        if (milk && milkStock < quantity) {
            System.out.println("⚠️  Stok susu tidak cukup. Pesanan dibatalkan.");
            return;
        }

        if (sugar) totalExtra += 2000;
        if (milk) totalExtra += 3000;

        int totalPrice = (basePrice + sizeAdd + totalExtra) * quantity;

        System.out.println("\nAnda memesan: " + quantity + " " + item.name + (quantity > 1 ? "s" : ""));
        System.out.println("Total harga: Rp " + totalPrice);
        System.out.println("Saldo Anda: Rp " + balance);

        if (balance >= totalPrice) {
            balance -= totalPrice;
            makeCoffee(item.name, sugar, milk, quantity);
            logTransaction(item.name, totalPrice, quantity);
            System.out.println("💵 Kembalian sementara Anda: Rp " + balance);
        } else {
            System.out.println("❌ Saldo tidak cukup. Transaksi dibatalkan.");
        }
    }

    public void makeCoffee(String name, boolean sugar, boolean milk, int quantity) {
        coffeeStock -= quantity;
        if (sugar) sugarStock -= quantity;
        if (milk) milkStock -= quantity;

        System.out.println("\n☕ Membuat pesanan Anda...");
        for (int i = 1; i <= quantity; i++) {
            System.out.println("Sedang membuat " + name + " ke-" + i + "...");
        }
        if (sugar) System.out.println("Menambahkan gula...");
        if (milk) System.out.println("Menambahkan susu...");
        System.out.println("✅ Pesanan selesai! Selamat menikmati kopi Anda.");

        checkStock();
    }

    public void checkStock() {
        if (coffeeStock <= 0) {
            System.out.println("\n❌ Kopi habis! Mesin tidak bisa melanjutkan penjualan.");
        } else if (coffeeStock <= 3 || milkStock <= 2 || sugarStock <= 2) {
            System.out.println("\n⚠️  Peringatan: Stok hampir habis!");
            System.out.println("Stok kopi: " + coffeeStock + ", susu: " + milkStock + ", gula: " + sugarStock);
        }
    }

    public void logTransaction(String coffeeName, int totalPrice, int quantity) {
        try (FileWriter writer = new FileWriter("transaction_log.txt", true)) {
            writer.write("[" + new Date() + "] " + quantity + "x " + coffeeName + " - Rp " + totalPrice + "\n");
        } catch (IOException e) {
            System.out.println("Gagal menulis log: " + e.getMessage());
        }
    }
}



Kode Main (Untuk Menjalankan Program)

Kelas Main

/**
 * The main engine.
 *
 * @author Hosea Felix Sanjaya
 * @version 14 Oktober 2025
 */
public class Main {
    public static void main(String[] args) {
        CoffeeMachine machine = new CoffeeMachine();
        machine.start();
    }
}


Penjelasan Fitur Utama

Fitur Deskripsi
Enkapsulasi Atribut balance, coffeeStock, milkStock, dan sugarStock dibuat private agar hanya bisa diakses lewat method.
Menu Array Menggunakan CoffeeItem (inner class) agar menu mudah diperluas.
Validasi stok Program memeriksa stok sebelum memproses pesanan.
Kondimen dinamis Hanya menampilkan opsi tambah gula/susu jika stok masih ada.
Transaksi log Semua pembelian dicatat ke file transaction_log.txt.
Interaktif Program berbasis teks interaktif seperti vending machine nyata.

Gambar Rancangan Kelas







Output Program









Kasus Jika Pesan Melebihi Stok Awal

Tidak ada komentar:

Posting Komentar

Pertemuan 15 : Aplikasi CRUD JAVA

Pertemuan 15 - Java CRUD Database Tanggal: 9 Desember 2025 Nama: Hosea Felix Sanjaya NRP: 5025241177 a. Setup & Persiapan Envi...