Semua Artikel
Diposting pada 26 November 2024

Arsip Tugas 2 - Pemrograman Berbasis Desktop - Universitas Terbuka - 2024

By Khafid Ilham
Penulis

Tugas 2 Pemrograman Berbasis Desktop - Sistem Pemesanan Restoran

Oleh: Khafid Ilham

#TetaplahBerbeda

Catatan Penting: Artikel ini adalah penjelasan dari arsip Tugas 2 yang sudah selesai dikerjakan. Tujuan saya membagikan ini adalah untuk membantu teman-teman yang mungkin masih kesulitan memahami konsep pemrograman desktop, khususnya implementasi sistem restoran sederhana menggunakan Java. Mari kita belajar bersama! 😊

Pendahuluan

Hai teman-teman! Hari ini saya akan berbagi pengalaman dalam mengembangkan aplikasi manajemen restoran sederhana menggunakan Java. Aplikasi ini merupakan bagian dari Tugas 2 mata kuliah Pemrograman Berbasis Desktop di Universitas Terbuka.

Struktur Program

1. Class Menu

Class ini merupakan blueprint untuk setiap item menu di restoran. Setiap menu memiliki tiga properti utama:

  • name: Nama menu makanan/minuman
  • price: Harga menu dalam Rupiah
  • category: Kategori menu (Makanan/Minuman)

2. Class Main

Class ini mengandung logika utama aplikasi dan method-method penting seperti:

  • handleOrdering(): Menangani proses pemesanan
  • handleMenuManagement(): Mengatur manajemen menu
  • printReceipt(): Mencetak struk pembayaran

Fitur-Fitur Utama

1. Sistem Pemesanan

Fitur pemesanan memiliki beberapa keunggulan:

  • Perhitungan otomatis total harga
  • Penambahan pajak 10%
  • Biaya layanan tetap Rp 20.000
  • Diskon 10% untuk pembelian di atas Rp 100.000
  • Promo spesial: Gratis 1 minuman untuk pembelian di atas Rp 50.000

2. Manajemen Menu

Sistem manajemen menu menyediakan tiga operasi dasar:

  • Penambahan menu baru (addMenu)
  • Pengubahan harga menu (updateMenu)
  • Penghapusan menu (deleteMenu)

Implementasi Menarik

1. Array Dinamis

Salah satu implementasi menarik adalah penggunaan array dinamis untuk menyimpan menu. Ketika menambah atau menghapus menu, program membuat array baru dengan ukuran yang sesuai:


Menu[] newMenus = new Menu[menus.length + 1]; // untuk penambahan
Menu[] newMenus = new Menu[menus.length - 1]; // untuk penghapusan
                

2. Validasi Input

Program dilengkapi dengan validasi input yang komprehensif:

  • Pengecekan nomor menu valid
  • Validasi kategori menu
  • Konfirmasi sebelum mengubah/menghapus menu

Keunikan Program (#TetaplahBerbeda)

Yang membuat program ini berbeda adalah:

  • Sistem promo yang fleksibel dengan dua jenis (diskon dan gratis minuman)
  • Format struk yang lengkap dan profesional
  • Pengelolaan menu yang user-friendly
  • Implementasi validasi yang menyeluruh

Tips Implementasi

Beberapa tips yang bisa saya bagikan:

  1. Gunakan Scanner.nextLine() setelah nextInt() untuk menghindari bug input
  2. Selalu validasi input pengguna untuk mencegah crash
  3. Implementasikan konfirmasi untuk operasi penting
  4. Gunakan format mata uang yang konsisten

Penutup

Program ini mungkin sederhana, tapi mengandung banyak konsep penting dalam pemrograman Java:

  • Object-Oriented Programming
  • Array Manipulation
  • Input/Output Handling
  • Error Handling

Semoga penjelasan ini bermanfaat bagi teman-teman yang sedang belajar Java. Ingat, dalam programming tidak ada jalan pintas - yang ada adalah proses belajar yang konsisten. #TetaplahBerbeda!

Source Code Lengkap


import java.text.DecimalFormat;
import java.util.Scanner;

class Menu {
    String name;
    double price;
    String category;

    // Konstruktor
    public Menu(String name, double price, String category) {
        this.name = name;
        this.price = price;
        this.category = category;
    }

    // Method untuk menampilkan detail menu
    public void displayMenu() {
        System.out.println(name + " - " + category + " : " + formatRupiah(price));
    }

    // Fungsi untuk format angka dalam Rupiah
    public static String formatRupiah(double angka) {
        DecimalFormat formatter = new DecimalFormat("#,###");
        return "Rp. " + formatter.format(angka);
    }
}

public class Main {
    static Scanner scanner = new Scanner(System.in);
    static Menu[] menus = new Menu[]{
        new Menu("Nasi Goreng", 25000, "Makanan"),
        new Menu("Sate Ayam", 30000, "Makanan"),
        new Menu("Es Teh", 10000, "Minuman"),
        new Menu("Kopi", 15000, "Minuman")
    };

    public static void main(String[] args) {
        boolean running = true;

        // Perulangan untuk menampilkan menu utama
        while (running) {
            System.out.println("\n===== MENU RESTORAN =====");
            System.out.println("1. Pemesanan");
            System.out.println("2. Manajemen Menu");
            System.out.println("3. Keluar");
            System.out.print("Pilih menu (1/2/3): ");
            String choice = scanner.nextLine();

            // Menangani pilihan menu utama
            switch (choice) {
                case "1":
                    handleOrdering();
                    break;
                case "2":
                    handleMenuManagement();
                    break;
                case "3":
                    running = false;
                    break;
                default:
                    System.out.println("Pilihan tidak valid. Silakan pilih lagi.");
            }
        }
    }

    // Menangani proses pemesanan
    public static void handleOrdering() {
        double totalPrice = 0;
        int[] orderCount = new int[menus.length];

        // Menampilkan daftar menu yang tersedia
        System.out.println("\nDaftar Menu:");
        displayMenu();
        System.out.println("Notes : Penawaran beli satu gratis satu untuk salah satu kategori minuman jika total biaya keseluruhan pesanan melebihi Rp 50.000");

        // Menerima pesanan dari pengguna
        while (true) {
            System.out.print("\nMasukkan nomor menu yang ingin dipesan (atau ketik 'selesai' untuk selesai): ");
            String input = scanner.nextLine();

            if (input.equalsIgnoreCase("selesai")) {
                break;
            }

            try {
                int menuNumber = Integer.parseInt(input) - 1;
                if (menuNumber < 0 || menuNumber >= menus.length) {
                    System.out.println("Menu tidak tersedia. Silakan pilih lagi.");
                } else {
                    System.out.print("Masukkan jumlah pesanan untuk " + menus[menuNumber].name + ": ");
                    int quantity = scanner.nextInt();
                    scanner.nextLine();  // mengkonsumsi karakter newline
                    orderCount[menuNumber] += quantity;
                    System.out.println("Anda memilih " + menus[menuNumber].name + " " + formatRupiah(menus[menuNumber].price) + " x " + quantity + " = " + formatRupiah(menus[menuNumber].price * quantity));
                    totalPrice += menus[menuNumber].price * quantity;
                }
            } catch (NumberFormatException e) {
                System.out.println("Input tidak valid. Silakan masukkan nomor menu yang benar.");
            }
        }

        // Menghitung total harga dengan pajak dan biaya layanan
        double tax = totalPrice * 0.1;
        double serviceCharge = 20000;
        double discount = 0;

        if (totalPrice > 100000) {
            discount = totalPrice * 0.1;
        }

        double finalPrice = totalPrice + tax + serviceCharge - discount;

        // Mencetak struk pesanan
        printReceipt(orderCount, totalPrice, tax, serviceCharge, discount, finalPrice);
    }

    // Menampilkan daftar menu untuk pilihan pengguna
    public static void displayMenu() {
        for (int i = 0; i < menus.length; i++) {
            System.out.print((i + 1) + ". ");
            menus[i].displayMenu();
        }
    }

    // Mencetak struk pesanan
    public static void printReceipt(int[] orderCount, double totalPrice, double tax, double serviceCharge, double discount, double finalPrice) {
        // Penawaran minuman gratis jika total lebih dari 50.000
        String pilihanMinuman = null;
        int menuNumberMinumanGratis = 0;

        if (finalPrice > 50000) {
            while (true) {
                System.out.print("\nAnda berhak memilih minuman gratis. Masukkan nomor minuman: ");
                pilihanMinuman = scanner.nextLine();
                
                try {
                    menuNumberMinumanGratis = Integer.parseInt(pilihanMinuman) - 1;
                    if (menuNumberMinumanGratis < 0 || menuNumberMinumanGratis >= menus.length) {
                        System.out.println("Menu tidak tersedia. Silakan pilih lagi.");
                    } else if(menus[menuNumberMinumanGratis].category == "Makanan" || menus[menuNumberMinumanGratis].category == "makanan"){
                        System.out.println("Yang anda pilih kategori makanan, bukan minuman");
                    } else {
                        break;
                    }
                } catch (NumberFormatException e) {
                    System.out.println("Input tidak valid. Silakan masukkan nomor menu yang benar.");
                }
            }
        }
        
        System.out.println("\n===== STRUK PEMESANAN =====");
        System.out.println("Daftar Pesanan:");
        for (int i = 0; i < menus.length; i++) {
            if (orderCount[i] > 0) {
                double itemTotal = menus[i].price * orderCount[i];
                System.out.println(menus[i].name + " " + formatRupiah(menus[i].price) + " x " + orderCount[i] + " = " + formatRupiah(itemTotal));
            }
        }
        if (finalPrice > 50000) {
            System.out.println("\nGratis Minuman: " + menus[menuNumberMinumanGratis].name + " 1");
        }

        System.out.println("\nTotal Harga: " + formatRupiah(totalPrice));
        System.out.println("Pajak (10%): " + formatRupiah(tax));
        System.out.println("Biaya Pelayanan: " + formatRupiah(serviceCharge));
        if (discount > 0) {
            System.out.println("Diskon 10%: - " + formatRupiah(discount));
        }
        System.out.println("Total Pembayaran: " + formatRupiah(finalPrice));
    }

    // Manajemen menu untuk pemilik restoran
    public static void handleMenuManagement() {
        boolean manageRunning = true;
        while (manageRunning) {
            System.out.println("\n===== MANAGEMEN MENU =====");
            System.out.println("1. Tambah Menu");
            System.out.println("2. Ubah Harga Menu");
            System.out.println("3. Hapus Menu");
            System.out.println("4. Kembali ke Menu Utama");
            System.out.print("Pilih menu (1/2/3/4): ");
            String choice = scanner.nextLine();

            // Menangani pilihan manajemen menu
            switch (choice) {
                case "1":
                    addMenu();
                    break;
                case "2":
                    updateMenu();
                    break;
                case "3":
                    deleteMenu();
                    break;
                case "4":
                    manageRunning = false;
                    break;
                default:
                    System.out.println("Pilihan tidak valid. Silakan pilih lagi.");
            }
        }
    }

    // Menambah item menu baru
    public static void addMenu() {
        System.out.println("\n===== MENU YANG SAAT INI TERSEDIA =====");
        displayMenu();
        System.out.print("Masukkan nama menu baru: ");
        String name = scanner.nextLine();
        System.out.print("Masukkan harga menu baru: ");
        double price = scanner.nextDouble();
        scanner.nextLine();  // mengkonsumsi karakter newline
        System.out.print("Masukkan kategori menu baru (Makanan/Minuman): ");
        String category = scanner.nextLine();

        Menu[] newMenus = new Menu[menus.length + 1];
        System.arraycopy(menus, 0, newMenus, 0, menus.length);
        newMenus[menus.length] = new Menu(name, price, category);
        menus = newMenus;

        System.out.println("Menu berhasil ditambahkan.");
    }

    // Memperbarui harga menu
    public static void updateMenu() {
        System.out.println("\n===== MENU YANG SAAT INI TERSEDIA =====");
        displayMenu();
        System.out.print("Masukkan nomor menu yang ingin diubah: ");
        int menuNumber = scanner.nextInt() - 1;
        scanner.nextLine();  // mengkonsumsi karakter newline

        if (menuNumber < 0 || menuNumber >= menus.length) {
            System.out.println("Menu tidak ditemukan.");
            return;
        }

        System.out.print("Apakah Anda yakin ingin mengubah harga menu " + menus[menuNumber].name + " (Ya/Tidak)? ");
        String confirmation = scanner.nextLine();

        if (confirmation.equalsIgnoreCase("Ya")) {
            System.out.print("Masukkan harga baru untuk " + menus[menuNumber].name + ": ");
            double newPrice = scanner.nextDouble();
            scanner.nextLine();  // mengkonsumsi karakter newline
            menus[menuNumber].price = newPrice;
            System.out.println("Harga menu berhasil diperbarui.");
        } else {
            System.out.println("Perubahan harga dibatalkan.");
        }
    }

    // Menghapus item menu
    public static void deleteMenu() {
        System.out.println("\n===== MENU YANG SAAT INI TERSEDIA =====");
        displayMenu();
        System.out.print("Masukkan nomor menu yang ingin dihapus: ");
        int menuNumber = scanner.nextInt() - 1;
        scanner.nextLine();  // mengkonsumsi karakter newline

        if (menuNumber < 0 || menuNumber >= menus.length) {
            System.out.println("Menu tidak ditemukan.");
            return;
        }

        System.out.print("Apakah Anda yakin ingin menghapus menu " + menus[menuNumber].name + " (Ya/Tidak)? ");
        String confirmation = scanner.nextLine();

        if (confirmation.equalsIgnoreCase("Ya")) {
            Menu[] newMenus = new Menu[menus.length - 1];
            for (int i = 0, j = 0; i < menus.length; i++) {
                if (i != menuNumber) {
                    newMenus[j++] = menus[i];
                }
            }
            menus = newMenus;
            System.out.println("Menu berhasil dihapus.");
        } else {
            System.out.println("Penghapusan menu dibatalkan.");
        }
    }

    // Fungsi untuk format angka dalam Rupiah
    public static String formatRupiah(double angka) {
        DecimalFormat formatter = new DecimalFormat("#,###");
        return "Rp. " + formatter.format(angka);
    }
}