Minggu, 14 Oktober 2018

ETS PBO A Parkir Elektronik


1. Main Class (GTO)

 public class GTO{  
   private boolean userAuthenticated;  
   private int currentAccountNumber;  
   private Screen screen;  
   private Keypad keypad;  
   private CashDispenser cashDispenser;  
   private BankDatabase bankDatabase;  
   private static final int BALANCE_INQUIRY = 1;  
   private static final int WITHDRAWAL = 2;  
   private static final int EXIT = 3;  
   public GTO(){  
     userAuthenticated = false;  
     currentAccountNumber = 0;  
     screen = new Screen();  
     keypad = new Keypad();  
     cashDispenser = new CashDispenser();  
     bankDatabase = new BankDatabase();  
   }  
   public void run(){  
     while(true){  
       while(!userAuthenticated){  
         screen.displayMessageLine("\nWelcome!");  
         authenticateUser();  
       }  
       performTransactions();  
       userAuthenticated = false;  
       currentAccountNumber = 0;  
       screen.displayMessageLine("\nThank You!\nGoodbye!");  
     }  
   }  
   private void authenticateUser(){  
     screen.displayMessage("\nPlease enter your account number : ");  
     int accountNumber = keypad.getInput();  
     userAuthenticated = bankDatabase.authenticateUser(accountNumber);  
     if(userAuthenticated){  
       currentAccountNumber = accountNumber;  
     }  
     else{  
       screen.displayMessageLine("Invalid ID.");  
       screen.displayMessageLine("Please Try Again.");  
     }  
   }  
   private void performTransactions(){  
     Transaction currentTransaction = null;  
     boolean userExited = false;  
     while(!userExited){  
       int mainMenuSelection = displayMainMenu();  
       switch(mainMenuSelection){  
         case BALANCE_INQUIRY :  
         case WITHDRAWAL :  
         //case DEPOSIT :  
           currentTransaction = createTransaction(mainMenuSelection);  
           currentTransaction.execute();  
           break;  
         case EXIT :  
           screen.displayMessageLine("\nExiting the system...");  
           userExited = true;  
           break;  
         default :  
           screen.displayMessageLine("\nYou did not enter a valid selection.");  
           screen.displayMessageLine("Please try again.");  
           break;  
       }  
     }  
   }  
   private int displayMainMenu(){  
     screen.displayMessageLine("\nChoose to continue :");  
     screen.displayMessageLine("1 - Saldo Kartu");  
     screen.displayMessageLine("2 - Durasi Parkir");  
     screen.displayMessageLine("3 - Exit\n");  
     screen.displayMessage("Enter a choice : ");  
     return keypad.getInput();  
   }  
   private Transaction createTransaction(int type){  
     Transaction temp = null;  
     switch(type){  
       case BALANCE_INQUIRY :  
         temp = new BalanceInquiry(currentAccountNumber, screen, bankDatabase);  
         break;  
       case WITHDRAWAL :  
         temp = new Withdrawal(currentAccountNumber, screen, bankDatabase, keypad, cashDispenser);  
         break;  
     }  
     return temp;  
   }  
 }  

2.  Screen
= menjalankan semua proses yang menampilkan output

 public class Screen{  
   public void displayMessage(String message){  
     System.out.print(message);  
   }  
   public void displayMessageLine(String message){  
     System.out.println(message);  
   }  
   public void displayDollarAmount(double amount){  
     System.out.printf("$%,.2f", amount);  
   }  
 }  

3. Keypad
= menerima inputan pengunjung

 import java.util.Scanner;  
 public class Keypad{  
   private Scanner input;  
   public Keypad(){  
     input = new Scanner(System.in);  
   }  
   public int getInput(){  
     return input.nextInt();  
   }  
 }  

4. CashDispenser
= mengecek saldo mencukupi atau tidak untuk membeli tiket

 public class CashDispenser{  
   private final static int INITIAL_COUNT = 500;  
   private int count;  
   public CashDispenser(){  
     count = INITIAL_COUNT;  
   }  
   public void dispenseCash(int amount){  
     int billsRequired = amount / 20;  
     count -= billsRequired;  
   }  
   public boolean isSufficientCashAvailable(int amount){  
     int billsRequired = amount / 20;  
     if(count >= billsRequired){  
       return true;  
     }  
     else{  
       return false;  
     }  
   }  
 }  

5. Transaction
= mengatur pembayaran dan sisa saldo

 public abstract class Transaction{  
   private int accountNumber;  
   private Screen screen;  
   private BankDatabase bankDatabase;  
   public Transaction(int userAccountNumber, Screen gtoScreen, BankDatabase gtoBankDatabase){  
     accountNumber = userAccountNumber;  
     screen = gtoScreen;  
     bankDatabase = gtoBankDatabase;  
   }  
   public int getAccountNumber(){  
     return accountNumber;  
   }  
   public Screen getScreen(){  
     return screen;  
   }  
   public BankDatabase getBankDatabase(){  
     return bankDatabase;  
   }  
   abstract public void execute();  
 }  

6. Withdrawal
= mengetur proses pembayaran dengan mengecek variabel

 import java.text.DateFormat;  
 import java.text.SimpleDateFormat;  
 import java.time.LocalDateTime;  
 import java.time.format.DateTimeFormatter;  
 import java.util.Calendar;  
 import java.util.Date;  
 public class Withdrawal extends Transaction{  
   private int amount;  
   private Keypad keypad;  
   int price;  
   int[] amounts = {0, 20, 40, 60, 100, 200};  
   private CashDispenser cashDispenser;  
   private final static int CANCELED = 6;  
   public Withdrawal(int userAccountNumber, Screen gtoScreen, BankDatabase gtoBankDatabase, Keypad gtoKeypad, CashDispenser gtoCashDispenser){  
     super(userAccountNumber, gtoScreen, gtoBankDatabase);  
     keypad = gtoKeypad;  
     cashDispenser = gtoCashDispenser;  
   }  
   @Override  
   public void execute(){  
     boolean cashDispensed = false;  
     double availableBalance;  
     BankDatabase bankDatabase = getBankDatabase();  
     Screen screen = getScreen();  
     do{  
       amount = displayMenuOfAmounts();  
       if(amount != CANCELED){  
         availableBalance = bankDatabase.getAvailableBalance(getAccountNumber());  
         if(amount <= availableBalance){  
           if(cashDispenser.isSufficientCashAvailable(amount)){  
             bankDatabase.debit(getAccountNumber(), amount);  
             cashDispenser.dispenseCash(amount);  
             cashDispensed = true;  
             screen.displayMessageLine("\nYour cash has been dispensed. Please take your struct now.");  
             //BankDatabase bankDatabase = getBankDatabase();  
             availableBalance = bankDatabase.getAvailableBalance(getAccountNumber());  
             screen.displayMessageLine("\nParkir Information : ");  
             screen.displayMessage(" - TAMAN BUNGKUL -\n");  
             screen.displayMessage(" - Tanggal Transaksi : " + dateFormat.format(date) + " \n");  
             screen.displayMessage(" - Harga Tiket : ");  
             screen.displayDollarAmount(amounts[price]);  
             screen.displayMessage("\n");  
             screen.displayMessage(" - Sisa Saldo Anda : ");  
             screen.displayDollarAmount(availableBalance);  
             screen.displayMessageLine("");  
           }  
         }  
         else{  
           screen.displayMessageLine("\nInsufficient funds in your account.");  
         }  
       }  
       else{  
         screen.displayMessageLine("\nCancelling transactions...");  
         return;  
       }  
     }  while(!cashDispensed);  
   }  
   private Date date;  
   private DateFormat dateFormat;  
   private int displayMenuOfAmounts(){  
     int userChoice = 0;  
     dateFormat = new SimpleDateFormat("dd/MM/yyyy");  
     date = new Date();  
     Screen screen = getScreen();  
     while(userChoice == 0){  
       screen.displayMessageLine("\nDurasi Parkir : ");  
       screen.displayMessageLine("1 - motor 1 jam $20");  
       screen.displayMessageLine("2 - motor 3 jam $40");  
       screen.displayMessageLine("3 - motor >3 jam $60");  
       screen.displayMessageLine("4 - mobil 1 jam $100");  
       screen.displayMessageLine("5 - mobil 3 jam $200");  
       screen.displayMessageLine("6 - mobil >3 jam $300");  
       screen.displayMessageLine("7 - Cancel Transaction");  
       screen.displayMessage("\nPilih durasi Anda : ");  
       int input = keypad.getInput();  
       price = input;  
       switch(input){  
         case 1 :  
         case 2 :  
         case 3 :  
         case 4 :  
         case 5 :  
           userChoice = amounts[input];  
           break;  
         case CANCELED :  
           userChoice = CANCELED;  
           break;  
         default :  
           screen.displayMessageLine("\nInvalid selection.");  
           screen.displayMessageLine("Try again.");  
       }  
     }  
     return userChoice;  
   }  
 }  

7. BalanceInquiry
= mengeluarkan output jumlah saldo

 public class BalanceInquiry extends Transaction{  
   public BalanceInquiry(int userAccountNumber, Screen gtoScreen, BankDatabase gtoBankDatabase){  
     super(userAccountNumber, gtoScreen, gtoBankDatabase);  
   }  
   @Override  
   public void execute(){  
     BankDatabase bankDatabase = getBankDatabase();  
     Screen screen = getScreen();  
     double availableBalance = bankDatabase.getAvailableBalance(getAccountNumber());  
     screen.displayMessageLine("\nBalance Information : \n");  
     screen.displayMessage(" - Available Balance : ");  
     screen.displayDollarAmount(availableBalance);  
     screen.displayMessageLine("");  
   }  
 }  

8. BankDatabase
= menyimpan id dan saldo

 public class BankDatabase{  
   private Account[] accounts;  
   public BankDatabase(){  
     accounts = new Account[1];  
     accounts[0] = new Account(79344, 200.0);  
   }  
   private Account getAccount(int accountNumber){  
     for(Account currentAccount : accounts){  
       if(currentAccount.getAccountNumber() == accountNumber) return currentAccount;  
     }  
     return null;  
   }  
   public boolean authenticateUser(int userAccountNumber){    
     Account userAccount = getAccount(userAccountNumber);     
     if(userAccount != null){  
       return true;  
     }  
     else{  
       return false;  
     }   
   }  
   public double getAvailableBalance(int userAccountNumber){  
     return getAccount(userAccountNumber).getAvailableBalance();  
   }  
   public void debit(int userAccountNumber, double amount){  
     getAccount(userAccountNumber).debit(amount);  
   }  
 }  

9. Account
=mengecek input yang masuk dan memanggil fungsi nilai saldo

 public class Account{  
   private int accountNumber;  
   private double availableBalance;  
   public Account(int theAccountNumber, double theAvailableBalance){  
     accountNumber = theAccountNumber;  
     availableBalance = theAvailableBalance;  
   }  
   public double getAvailableBalance(){  
     return availableBalance;  
   }  
   public void debit(double amount){  
     availableBalance -= amount;  
   }  
   public int getAccountNumber(){  
     return accountNumber;  
   }  
 }  

10. GTOCasestudy
= memanggil ulang fungsi main

 public class GTOCaseStudy{  
   public static void main(String[] args){  
     GTO theGTO = new GTO();  
     theGTO.run();  
   }  
 }  





Tidak ada komentar:

Posting Komentar