Senin, 13 Oktober 2025

ETS PEMROGRAMAN BERBASIS OBJEK

Nama        : Safa Mashita

NRP          : 5025241022

Link YouTube    : https://youtu.be/wu2RTOUz3sk?si=kzOYO2I_LccgZcAS


ETS PEMROGRAMAN BERBASIS OBJEK


SOAL

Deskripsi Umum

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

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

JAWABAN

A. Fitur yang Terdapat pada Vending Coffee Machine

Program Vending Coffee Machine merupakan simulasi mesin penjual otomatis kopi yang saya buat menggunakan bahasa pemrograman Java (BlueJ).
Fitur-fitur utama yang tersedia antara lain:

  1. Menampilkan daftar menu kopi (Espresso, Latte, Americano, Cappuccino, Mocha).

  2. Pengguna dapat memilih ukuran gelas (Small, Medium, Large).

  3. Pengguna dapat menambahkan gula dan/atau susu secara opsional.

  4. Sistem menghitung total harga berdasarkan pilihan pengguna.

  5. Pengguna melakukan pembayaran, termasuk kembalian jika uang berlebih.

  6. Sistem mengurangi stok kopi setiap kali transaksi berhasil.

  7. Menampilkan riwayat transaksi pembelian kopi.

  8. Admin dapat melihat stok, melakukan refill stok, dan keluar dari sistem.

  9. Program memberikan notifikasi ketika stok habis.


B. Rancangan Kelas dan Rancangan Obyek Vending Coffee Machine

Program Vending Coffee Machine dibuat menggunakan konsep pemrograman berorientasi objek (OOP). Rancangan sistem ini dibangun dari beberapa kelas yang saling berinteraksi untuk mensimulasikan proses mesin kopi otomatis, mulai dari pemilihan kopi, pembayaran, hingga pencatatan transaksi.

1. Rancangan Kelas

Sistem ini terdiri dari lima kelas utama, yaitu:

  1. CoffeeMachine
    Berperan sebagai pusat sistem. Kelas ini mengatur seluruh alur kerja mesin kopi, mulai dari menampilkan menu, menerima input dari pengguna, memproses pesanan, mengelola stok, hingga mencatat transaksi.

  2. Coffee
    Kelas yang merepresentasikan jenis kopi. Di dalamnya terdapat atribut seperti nama kopi dan harga dasarnya.

  3. Order
    Kelas yang digunakan untuk menyimpan data pesanan pengguna. Order berisi objek kopi yang dipilih, ukuran gelas, serta pilihan tambahan seperti gula dan susu.

  4. Payment
    Bertugas untuk menangani proses pembayaran. Kelas ini memverifikasi jumlah uang yang dimasukkan oleh pengguna, menentukan apakah cukup, dan menghitung kembalian.

  5. Transaction
    Digunakan untuk menyimpan catatan setiap transaksi yang berhasil dilakukan. Informasi transaksi ini mencakup detail pesanan, harga, dan waktu transaksi.


2. Rancangan Obyek

Saat program dijalankan, objek-objek akan dibuat dan berinteraksi sesuai urutan berikut:

  1. Sistem mengaktifkan mesin dan menampilkan daftar menu kopi.

  2. Pengguna memilih jenis kopi, lalu menentukan ukuran gelas serta tambahan gula atau susu.

  3. Setelah pesanan terbentuk, sistem membuat objek Order yang berisi detail pilihan pengguna.

  4. Sistem menampilkan total harga, lalu pengguna melakukan pembayaran.

  5. Kelas Payment digunakan untuk mengecek apakah jumlah uang mencukupi. Jika cukup, sistem akan menghitung kembalian.

  6. Mesin kemudian menyajikan kopi, mengurangi stok, dan mencatat transaksi ke dalam log menggunakan kelas Transaction.

  7. Admin dapat melihat log transaksi, memeriksa stok, atau melakukan pengisian ulang bila stok habis.


3. Hubungan Antar Kelas

Kelas CoffeeMachine menjadi pusat dari sistem.
Kelas ini berinteraksi langsung dengan semua kelas lain:

  • CoffeeMachine membuat objek dari kelas Coffee sesuai pilihan pengguna.

  • Setelah pengguna memilih ukuran dan tambahan, CoffeeMachine membuat objek Order yang berisi detail pesanan.

  • Ketika pengguna membayar, CoffeeMachine memanggil kelas Payment untuk memproses transaksi dan menghitung kembalian.

  • Jika pembayaran berhasil, CoffeeMachine akan membuat objek Transaction untuk mencatat transaksi ke dalam log.

Selain itu, di dalam kelas CoffeeMachine juga terdapat pengelolaan stok untuk setiap jenis kopi agar mesin dapat memeriksa ketersediaan bahan sebelum pesanan dibuat.



C. Code dan Penjelasan Vending Coffee Machine

1. Class CoffeeMachine

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class CoffeeMachine {
    private static HashMap<String, Integer> ingredientStock = new HashMap<>();
    private static ArrayList<Transaction> transactions = new ArrayList<>();

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Payment payment = new Payment();

        ingredientStock.put("Kopi", 5);
        ingredientStock.put("Gula", 5);
        ingredientStock.put("Susu", 5);
        ingredientStock.put("Air", 5);

        System.out.println("STATUS: MESIN AKTIF");
        System.out.println("==================================");
        System.out.println("      VENDING COFFEE MACHINE");
        System.out.println("==================================");

        boolean running = true;
        while (running) {
            System.out.println("\nMenu Kopi:");
            System.out.println("1. Espresso - Rp15000");
            System.out.println("2. Latte - Rp17000");
            System.out.println("3. Americano - Rp16000");
            System.out.println("4. Cappuccino - Rp18000");
            System.out.println("5. Mocha - Rp19000");
            System.out.println("\nMenu Admin:");
            System.out.println("6. Lihat Stok");
            System.out.println("7. Refill Stok");
            System.out.println("8. Lihat Transaksi");
            System.out.println("9. Keluar");
            System.out.print("\nPilih menu: ");
            int choice = input.nextInt();

            if (choice >= 6 && choice <= 9) {
                handleAdminMenu(choice, input);
                if (choice == 9) break;
                continue;
            }

            String name = "";
            int price = 0;
            switch (choice) {
                case 1: name = "Espresso"; price = 15000; break;
                case 2: name = "Latte"; price = 17000; break;
                case 3: name = "Americano"; price = 16000; break;
                case 4: name = "Cappuccino"; price = 18000; break;
                case 5: name = "Mocha"; price = 19000; break;
                default:
                    System.out.println("Pilihan tidak valid!");
                    continue;
            }

            ArrayList<String> empty = new ArrayList<>();
            if (ingredientStock.get("Kopi") <= 0) empty.add("Kopi");
            if (ingredientStock.get("Air") <= 0) empty.add("Air");
            if (ingredientStock.get("Gula") <= 0) empty.add("Gula");
            if (ingredientStock.get("Susu") <= 0) empty.add("Susu");

            if (!empty.isEmpty()) {
                System.out.println("Stok bahan habis! Harap isi ulang dulu.");
                System.out.println("Bahan yang habis: " + String.join(", ", empty));
                continue;
            }

            System.out.println("\nPilih ukuran:");
            System.out.println("1. Small (harga normal)");
            System.out.println("2. Medium (+Rp 2000)");
            System.out.println("3. Large (+Rp 4000)");
            System.out.print("Ukuran: ");
            int sizeOpt = input.nextInt();

            String size;
            if (sizeOpt == 1) size = "Small";
            else if (sizeOpt == 2) { size = "Medium"; price += 2000; }
            else if (sizeOpt == 3) { size = "Large"; price += 4000; }
            else {
                System.out.println("Input ukuran tidak valid! Kembali ke menu utama.\n");
                continue;
            }

            System.out.print("Tambah gula? (y/n): ");
            String sugarInput = input.next();
            if (!sugarInput.equalsIgnoreCase("y") && !sugarInput.equalsIgnoreCase("n")) {
                System.out.println("Input tidak valid! Kembali ke menu utama.\n");
                continue;
            }
            boolean sugar = sugarInput.equalsIgnoreCase("y");

            System.out.print("Tambah susu? (y/n): ");
            String milkInput = input.next();
            if (!milkInput.equalsIgnoreCase("y") && !milkInput.equalsIgnoreCase("n")) {
                System.out.println("Input tidak valid! Kembali ke menu utama.\n");
                continue;
            }
            boolean milk = milkInput.equalsIgnoreCase("y");

            Coffee coffee = new Coffee(name, size, price);
            Order order = new Order(coffee, sugar, milk);
            int total = order.getTotalPrice();

            System.out.println("\nTotal harga: Rp " + total);
            System.out.print("Masukkan uang: Rp ");
            int money = input.nextInt();

            if (payment.processPayment(total, money)) {
                ingredientStock.put("Kopi", ingredientStock.get("Kopi") - 1);
                ingredientStock.put("Air", ingredientStock.get("Air") - 1);
                if (sugar) ingredientStock.put("Gula", ingredientStock.get("Gula") - 1);
                if (milk) ingredientStock.put("Susu", ingredientStock.get("Susu") - 1);

                System.out.println("Membuat kopi...");
                System.out.println(order + " siap dinikmati!\n");

                transactions.add(new Transaction(order.toString(), total));
            }
        }

        System.out.println("Mesin dimatikan. Terima kasih telah menggunakan mesin kopi.");
        input.close();
    }

    private static void handleAdminMenu(int choice, Scanner input) {
        switch (choice) {
            case 6:
                System.out.println("\nStok Bahan:");
                for (String key : ingredientStock.keySet()) {
                    System.out.println(key + " : " + ingredientStock.get(key) + " unit");
                }
                break;

            case 7:
                System.out.println("\nBahan yang ingin di-refill:");
                System.out.println("1. Kopi\n2. Gula\n3. Susu\n4. Air\n");
                System.out.print("Pilih: ");
                int opt = input.nextInt();

                String bahan = "";
                switch (opt) {
                    case 1: bahan = "Kopi"; break;
                    case 2: bahan = "Gula"; break;
                    case 3: bahan = "Susu"; break;
                    case 4: bahan = "Air"; break;
                    default:
                        System.out.println("Pilihan tidak valid!");
                        return;
                }

                System.out.print("Tambah berapa unit: ");
                int tambah = input.nextInt();
                ingredientStock.put(bahan, ingredientStock.get(bahan) + tambah);
                System.out.println("Berhasil menambah " + tambah + " unit " + bahan + ".");
                break;

            case 8:
                System.out.println("\nRiwayat Transaksi:");
                if (transactions.isEmpty()) {
                    System.out.println("(Belum ada transaksi)");
                } else {
                    for (Transaction t : transactions) {
                        t.showTransaction();
                    }
                }
                break;

            case 9:
                System.out.println("Keluar dari sistem...");
                break;
        }
    }
}

Atribut    :
  • HashMap<String, Integer> coffeeStock : menyimpan stok tiap jenis kopi.

  • ArrayList<Transaction> transactions : menyimpan daftar transaksi pembelian.

Method utama    :

  • main() : menjalankan seluruh simulasi.

  • handleAdminMenu() : mengatur fitur admin (lihat stok, refill, transaksi, keluar).

Hubungan    :

  • Menggunakan class Coffee, Order, Payment, dan Transaction.


2. Class Coffee

public class Coffee {

    private String name;

    private String size;

    private int basePrice;


    public Coffee(String name, String size, int basePrice) {

        this.name = name;

        this.size = size;

        this.basePrice = basePrice;

    }


    public String getName() {

        return name;

    }


    public String getSize() {

        return size;

    }


    public int getBasePrice() {

        return basePrice;

    }


    public void setBasePrice(int basePrice) {

        this.basePrice = basePrice;

    }


    @Override

    public String toString() {

        return name + " (" + size + ")";

    }

}

Atribut    :

  • name : nama kopi.

  • size : ukuran kopi (Small, Medium, Large).

  • basePrice : harga dasar kopi.

Method utama    :

  • getPrice() mengembalikan harga kopi.

  • toString() menampilkan nama dan ukuran kopi.

Hubungan    :

  • Dipakai oleh class Order untuk menghitung total harga.


3. Class Order

 public class Order {
    private Coffee coffee;
    private boolean addSugar;
    private boolean addMilk;
    private int totalPrice;

    public Order(Coffee coffee, boolean addSugar, boolean addMilk) {
        this.coffee = coffee;
        this.addSugar = addSugar;
        this.addMilk = addMilk;
        this.totalPrice = coffee.getBasePrice(); 
    }

    public int getTotalPrice() {
        return totalPrice;
    }

    public Coffee getCoffee() {
        return coffee;
    }

    public boolean hasSugar() {
        return addSugar;
    }

    public boolean hasMilk() {
        return addMilk;
    }

    public String toString() {
        String desc = coffee.toString();
        if (addSugar) desc += " + Gula";
        if (addMilk) desc += " + Susu";
        return desc;
    }
}

Atribut    :
  • coffee : objek kopi yang dipesan.

  • sugar : penambahan gula.

  • milk : penambahan susu.

Method utama    :

  • getTotalPrice() menghitung total harga pesanan.

  • toString() menampilkan deskripsi pesanan.

Hubungan    :

  • Berhubungan langsung dengan Coffee dan digunakan di CoffeeMachine.


4. Class Payment

public class Payment {

    public boolean processPayment(int total, int money) {

        if (money < total) {

            System.out.println("Uang tidak cukup! Transaksi dibatalkan.");

            return false;

        } else {

            int change = money - total;

            System.out.println("Pembayaran berhasil!");

            if (change > 0) {

                System.out.println("Kembalian: Rp " + change);

            }

            return true;

        }

    }

}

Atribut    : Tidak memiliki atribut (semua dilakuka di method).

Method utama    :

  • processPayment() memverifikasi pembayaran dan menampilkan kembalian.

Hubungan    :

  • Dipanggil dari CoffeeMachine untuk setiap transaksi.


5. Class Transaction

public class Transaction {

    private String orderDesc;

    private int totalPrice;


    public Transaction(String orderDesc, int totalPrice) {

        this.orderDesc = orderDesc;

        this.totalPrice = totalPrice;

    }


    public void showTransaction() {

        System.out.println(orderDesc + " - Rp " + totalPrice);

    }

}

Atribut    :

  • orderDesc : deskripsi pesanan.

  • totalPrice : total harga transaksi.

Method utama    :

  • showTransaction() menampilkan riwayat transaksi.

Hubungan    :

  • Disimpan dalam ArrayList<Transaction> di CoffeeMachine.


C. Output Vending Coffee Machine

1. Tampilan Awal (Vending Coffee Machine Aktif & Menu)



2.  Tampilan Pemilihan Kopi dan Ukuran



3. Tampilan Penambahan Gula atau Susu


4. Tampilan Pembayaran dan Hasil Transaksi

Tampilan Pembayaran Berhasil


Tampilan Jika Uang Kurang 


5. Tampilan Menu Admin (Lihat Stok)



6. Tampilan Menu Admin (Refill)


Stok kopi bertambah 1

7. Tampilan Pengingat Jika Stok Habis


8. Tampilan Lihat Transaksi


9. Tampilan Keluar 



D. Kesimpulan

Program Vending Coffee Machine berhasil dibuat dengan menggunakan bahasa pemrograman Java dalam lingkungan BlueJ. Aplikasi ini mampu menampilkan simulasi mesin penjual otomatis kopi yang interaktif, meliputi pemilihan menu, ukuran, penambahan bahan, pembayaran, serta pengelolaan stok dan transaksi oleh admin.

Program ini menunjukkan penerapan konsep OOP (Object-Oriented Programming) dengan baik melalui penggunaan lima kelas utama (CoffeeMachine, Coffee, Order, Payment, Transaction) yang saling berhubungan untuk membentuk sistem yang terstruktur.


Tidak ada komentar:

Posting Komentar

Pertemuan 16 - Membuat Aplikasi CRUD Java

 Nama          : Safa Mashita  NRP            : 5025241022 Membuat Aplikasi CRUD Java - Manajemen Buku Perpustakaan Pada pertemuan ini, saya...