Tugas 2 Pemrograman Berbasis Desktop - Sistem Pemesanan Restoran
Oleh: Khafid Ilham
#TetaplahBerbeda
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:
- Gunakan Scanner.nextLine() setelah nextInt() untuk menghindari bug input
- Selalu validasi input pengguna untuk mencegah crash
- Implementasikan konfirmasi untuk operasi penting
- 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);
}
}