#7 Nick Satinover

Open
nsatinover wants to merge 5 commits from nsatinover/CashMachine:master into master

+ 4
- 0
src/main/java/rocks/zipcode/atm/ActionResult.java View File

32
         return new ActionResult<E>(data);
32
         return new ActionResult<E>(data);
33
     }
33
     }
34
 
34
 
35
+    public static <E> ActionResult<E> overdrawn(String overdrawnMessage) {
36
+        return new ActionResult<E>(overdrawnMessage);
37
+    }
38
+
35
     public static <E> ActionResult<E> fail(String errorMessage) {
39
     public static <E> ActionResult<E> fail(String errorMessage) {
36
         return new ActionResult<E>(errorMessage);
40
         return new ActionResult<E>(errorMessage);
37
     }
41
     }

+ 15
- 3
src/main/java/rocks/zipcode/atm/CashMachine.java View File

23
     };
23
     };
24
 
24
 
25
     public void login(int id) {
25
     public void login(int id) {
26
+
26
         tryCall(
27
         tryCall(
27
                 () -> bank.getAccountById(id),
28
                 () -> bank.getAccountById(id),
28
                 update
29
                 update
29
         );
30
         );
30
     }
31
     }
31
 
32
 
32
-    public void deposit(int amount) {
33
+    public void deposit(float amount) {
33
         if (accountData != null) {
34
         if (accountData != null) {
34
             tryCall(
35
             tryCall(
35
                     () -> bank.deposit(accountData, amount),
36
                     () -> bank.deposit(accountData, amount),
38
         }
39
         }
39
     }
40
     }
40
 
41
 
41
-    public void withdraw(int amount) {
42
+    public void withdraw(float amount) {
42
         if (accountData != null) {
43
         if (accountData != null) {
43
             tryCall(
44
             tryCall(
44
                     () -> bank.withdraw(accountData, amount),
45
                     () -> bank.withdraw(accountData, amount),
51
         if (accountData != null) {
52
         if (accountData != null) {
52
             accountData = null;
53
             accountData = null;
53
         }
54
         }
55
+
56
+    }
57
+
58
+    public boolean isValidId(int id){
59
+        if (bank.isValidId(id)) {
60
+            return true;
61
+        } else {
62
+            return false;
63
+        }
54
     }
64
     }
55
 
65
 
56
     @Override
66
     @Override
57
     public String toString() {
67
     public String toString() {
58
-        return accountData != null ? accountData.toString() : "Try account 1000 or 2000 and click submit.";
68
+//
69
+        // if (accountData != null){isValidId();}
70
+        return accountData != null ? accountData.toString() : "Set Account ID:\n1000\n2000\n6666\n7337";
59
     }
71
     }
60
 
72
 
61
     private <T> void tryCall(Supplier<ActionResult<T> > action, Consumer<T> postAction) {
73
     private <T> void tryCall(Supplier<ActionResult<T> > action, Consumer<T> postAction) {

+ 78
- 23
src/main/java/rocks/zipcode/atm/CashMachineApp.java View File

1
 package rocks.zipcode.atm;
1
 package rocks.zipcode.atm;
2
 
2
 
3
+import javafx.geometry.Pos;
4
+import javafx.scene.layout.GridPane;
3
 import rocks.zipcode.atm.bank.Bank;
5
 import rocks.zipcode.atm.bank.Bank;
4
 import javafx.application.Application;
6
 import javafx.application.Application;
5
 import javafx.scene.Parent;
7
 import javafx.scene.Parent;
7
 import javafx.scene.control.Button;
9
 import javafx.scene.control.Button;
8
 import javafx.scene.control.TextArea;
10
 import javafx.scene.control.TextArea;
9
 import javafx.scene.control.TextField;
11
 import javafx.scene.control.TextField;
10
-import javafx.scene.layout.VBox;
11
 import javafx.stage.Stage;
12
 import javafx.stage.Stage;
12
-import javafx.scene.layout.FlowPane;
13
+import javafx.scene.paint.Color;
13
 
14
 
14
 /**
15
 /**
15
  * @author ZipCodeWilmington
16
  * @author ZipCodeWilmington
16
  */
17
  */
17
 public class CashMachineApp extends Application {
18
 public class CashMachineApp extends Application {
19
+    Color blue = Color.rgb(0,0,255);
18
 
20
 
19
-    private TextField field = new TextField();
20
     private CashMachine cashMachine = new CashMachine(new Bank());
21
     private CashMachine cashMachine = new CashMachine(new Bank());
21
 
22
 
23
+    private TextField setAccountIdField = new TextField();
24
+    private TextField setDepositField = new TextField();
25
+    private TextField setWithdrawField = new TextField();
26
+
22
     private Parent createContent() {
27
     private Parent createContent() {
23
-        VBox vbox = new VBox(10);
24
-        vbox.setPrefSize(600, 600);
28
+        setAccountIdField.setMinSize(250, 40);
29
+        setDepositField.setMinSize(250, 40);
30
+        setWithdrawField.setMinSize(250, 40);
25
 
31
 
26
-        TextArea areaInfo = new TextArea();
32
+        GridPane gridPane = new GridPane();
33
+        gridPane.setPrefSize(500, 400);
34
+        gridPane.setAlignment(Pos.CENTER);
35
+        gridPane.setStyle("-fx-background-color: Green;");
27
 
36
 
28
-        Button btnSubmit = new Button("Set Account ID");
29
-        btnSubmit.setOnAction(e -> {
30
-            int id = Integer.parseInt(field.getText());
31
-            cashMachine.login(id);
37
+        TextArea areaInfo = new TextArea();
38
+        areaInfo.setMaxSize(250, 160);
32
 
39
 
33
-            areaInfo.setText(cashMachine.toString());
34
-        });
35
 
40
 
36
         Button btnDeposit = new Button("Deposit");
41
         Button btnDeposit = new Button("Deposit");
42
+        btnDeposit.setMinSize(250, 40);
43
+        btnDeposit.setTextFill(blue);
44
+        btnDeposit.setDisable(true);
37
         btnDeposit.setOnAction(e -> {
45
         btnDeposit.setOnAction(e -> {
38
-            int amount = Integer.parseInt(field.getText());
46
+            float amount = Float.parseFloat(setWithdrawField.getText());
39
             cashMachine.deposit(amount);
47
             cashMachine.deposit(amount);
40
-
41
             areaInfo.setText(cashMachine.toString());
48
             areaInfo.setText(cashMachine.toString());
42
         });
49
         });
43
 
50
 
44
         Button btnWithdraw = new Button("Withdraw");
51
         Button btnWithdraw = new Button("Withdraw");
52
+        btnWithdraw.setMinSize(250, 40);
53
+        btnWithdraw.setTextFill(blue);
54
+        btnWithdraw.setDisable(true);
45
         btnWithdraw.setOnAction(e -> {
55
         btnWithdraw.setOnAction(e -> {
46
-            int amount = Integer.parseInt(field.getText());
56
+            float amount = Float.parseFloat(setWithdrawField.getText());
47
             cashMachine.withdraw(amount);
57
             cashMachine.withdraw(amount);
48
-
49
             areaInfo.setText(cashMachine.toString());
58
             areaInfo.setText(cashMachine.toString());
50
         });
59
         });
51
 
60
 
52
         Button btnExit = new Button("Exit");
61
         Button btnExit = new Button("Exit");
62
+        btnExit.setMinSize(250, 160);
63
+        btnExit.setTextFill(blue);
64
+        btnExit.setDisable(true);
53
         btnExit.setOnAction(e -> {
65
         btnExit.setOnAction(e -> {
66
+            btnDeposit.setDisable(true);
67
+            btnWithdraw.setDisable(true);
68
+            btnExit.setDisable(true);
69
+            resetOnExit();
54
             cashMachine.exit();
70
             cashMachine.exit();
71
+            areaInfo.setText(cashMachine.toString());
72
+        });
73
+
74
+        Button btnSubmit = new Button("Set Account ID");
75
+        btnSubmit.setMinSize(250, 40);
76
+        btnSubmit.setTextFill(blue);
77
+        btnSubmit.setOnAction(e -> {
78
+            int id = Integer.parseInt(setAccountIdField.getText());
79
+            if (isValidId(id)){
80
+                btnDeposit.setDisable(false);
81
+                btnWithdraw.setDisable(false);
82
+                btnExit.setDisable(false);
83
+            }
84
+            else {
85
+                btnDeposit.setDisable(true);
86
+                btnWithdraw.setDisable(true);
87
+                btnExit.setDisable(true);
88
+            }
89
+            cashMachine.login(id);
55
 
90
 
56
             areaInfo.setText(cashMachine.toString());
91
             areaInfo.setText(cashMachine.toString());
57
         });
92
         });
58
 
93
 
59
-        FlowPane flowpane = new FlowPane();
60
 
94
 
61
-        flowpane.getChildren().add(btnSubmit);
62
-        flowpane.getChildren().add(btnDeposit);
63
-        flowpane.getChildren().add(btnWithdraw);
64
-        flowpane.getChildren().add(btnExit);
65
-        vbox.getChildren().addAll(field, flowpane, areaInfo);
66
-        return vbox;
95
+        GridPane.setConstraints(btnSubmit, 0, 0);
96
+        GridPane.setConstraints(btnDeposit, 0, 1);
97
+        GridPane.setConstraints(btnWithdraw, 0, 2);
98
+        GridPane.setConstraints(btnExit, 0, 3);
99
+        GridPane.setConstraints(setAccountIdField, 1, 0);
100
+        setWithdrawField.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
101
+        GridPane.setConstraints(setWithdrawField, 1, 1, 1, 2);
102
+        GridPane.setConstraints(areaInfo, 1, 3);
103
+        gridPane.getChildren().addAll(btnSubmit, btnDeposit, btnWithdraw, btnExit,
104
+                setAccountIdField, setWithdrawField, areaInfo);
105
+        return gridPane;
67
     }
106
     }
68
 
107
 
69
     @Override
108
     @Override
70
     public void start(Stage stage) throws Exception {
109
     public void start(Stage stage) throws Exception {
71
         stage.setScene(new Scene(createContent()));
110
         stage.setScene(new Scene(createContent()));
111
+        stage.setTitle("Zip Code ATM");
72
         stage.show();
112
         stage.show();
73
     }
113
     }
74
 
114
 
115
+    public boolean isValidId(int id){
116
+        if (cashMachine.isValidId(id)) {
117
+            return true;
118
+        }
119
+        else {
120
+            return false;
121
+        }
122
+    }
123
+
124
+    public void resetOnExit(){
125
+        setAccountIdField.clear();
126
+        setDepositField.clear();
127
+        setWithdrawField.clear();
128
+    }
129
+
75
     public static void main(String[] args) {
130
     public static void main(String[] args) {
76
         launch(args);
131
         launch(args);
77
     }
132
     }

+ 5
- 5
src/main/java/rocks/zipcode/atm/bank/Account.java View File

15
         return accountData;
15
         return accountData;
16
     }
16
     }
17
 
17
 
18
-    public void deposit(int amount) {
18
+    public void deposit(float amount) {
19
         updateBalance(getBalance() + amount);
19
         updateBalance(getBalance() + amount);
20
     }
20
     }
21
 
21
 
22
-    public boolean withdraw(int amount) {
22
+    public boolean withdraw(float amount) {
23
         if (canWithdraw(amount)) {
23
         if (canWithdraw(amount)) {
24
             updateBalance(getBalance() - amount);
24
             updateBalance(getBalance() - amount);
25
             return true;
25
             return true;
28
         }
28
         }
29
     }
29
     }
30
 
30
 
31
-    protected boolean canWithdraw(int amount) {
31
+    protected boolean canWithdraw(float amount) {
32
         return getBalance() >= amount;
32
         return getBalance() >= amount;
33
     }
33
     }
34
 
34
 
35
-    public int getBalance() {
35
+    public float getBalance() {
36
         return accountData.getBalance();
36
         return accountData.getBalance();
37
     }
37
     }
38
 
38
 
39
-    private void updateBalance(int newBalance) {
39
+    private void updateBalance(float newBalance) {
40
         accountData = new AccountData(accountData.getId(), accountData.getName(), accountData.getEmail(),
40
         accountData = new AccountData(accountData.getId(), accountData.getName(), accountData.getEmail(),
41
                 newBalance);
41
                 newBalance);
42
     }
42
     }

+ 3
- 3
src/main/java/rocks/zipcode/atm/bank/AccountData.java View File

9
     private final String name;
9
     private final String name;
10
     private final String email;
10
     private final String email;
11
 
11
 
12
-    private final int balance;
12
+    private final float balance;
13
 
13
 
14
-    AccountData(int id, String name, String email, int balance) {
14
+    AccountData(int id, String name, String email, float balance) {
15
         this.id = id;
15
         this.id = id;
16
         this.name = name;
16
         this.name = name;
17
         this.email = email;
17
         this.email = email;
30
         return email;
30
         return email;
31
     }
31
     }
32
 
32
 
33
-    public int getBalance() {
33
+    public float getBalance() {
34
         return balance;
34
         return balance;
35
     }
35
     }
36
 
36
 

+ 27
- 4
src/main/java/rocks/zipcode/atm/bank/Bank.java View File

1
 package rocks.zipcode.atm.bank;
1
 package rocks.zipcode.atm.bank;
2
 
2
 
3
 import rocks.zipcode.atm.ActionResult;
3
 import rocks.zipcode.atm.ActionResult;
4
+import rocks.zipcode.atm.CashMachine;
5
+import rocks.zipcode.atm.CashMachineApp;
4
 
6
 
5
 import java.util.HashMap;
7
 import java.util.HashMap;
6
 import java.util.Map;
8
 import java.util.Map;
20
         accounts.put(2000, new PremiumAccount(new AccountData(
22
         accounts.put(2000, new PremiumAccount(new AccountData(
21
                 2000, "Example 2", "example2@gmail.com", 200
23
                 2000, "Example 2", "example2@gmail.com", 200
22
         )));
24
         )));
25
+
26
+        accounts.put(6666, new PremiumAccount(new AccountData(
27
+                6666, "Nick Satinover", "nsatinover@gmail.com", 20000
28
+        )));
29
+
30
+        accounts.put(7337, new BasicAccount(new AccountData(
31
+                7337, "Kris HaHaYourBroke", "kris@onedollar.com", 1
32
+        )));
23
     }
33
     }
24
 
34
 
25
     public ActionResult<AccountData> getAccountById(int id) {
35
     public ActionResult<AccountData> getAccountById(int id) {
26
         Account account = accounts.get(id);
36
         Account account = accounts.get(id);
27
-
28
         if (account != null) {
37
         if (account != null) {
29
             return ActionResult.success(account.getAccountData());
38
             return ActionResult.success(account.getAccountData());
30
         } else {
39
         } else {
31
-            return ActionResult.fail("No account with id: " + id + "\nTry account 1000 or 2000");
40
+            return ActionResult.fail("No account with id: " + id + "\nTry account 1000, 2000, 6666, 7337");
32
         }
41
         }
33
     }
42
     }
34
 
43
 
35
-    public ActionResult<AccountData> deposit(AccountData accountData, int amount) {
44
+    public ActionResult<AccountData> deposit(AccountData accountData, float amount) {
36
         Account account = accounts.get(accountData.getId());
45
         Account account = accounts.get(accountData.getId());
37
         account.deposit(amount);
46
         account.deposit(amount);
38
 
47
 
39
         return ActionResult.success(account.getAccountData());
48
         return ActionResult.success(account.getAccountData());
40
     }
49
     }
41
 
50
 
42
-    public ActionResult<AccountData> withdraw(AccountData accountData, int amount) {
51
+    public ActionResult<AccountData> withdraw(AccountData accountData, float amount) {
43
         Account account = accounts.get(accountData.getId());
52
         Account account = accounts.get(accountData.getId());
44
         boolean ok = account.withdraw(amount);
53
         boolean ok = account.withdraw(amount);
45
 
54
 
46
         if (ok) {
55
         if (ok) {
56
+            if (account.getBalance() < 0) {
57
+                Overdraft.popupMessage("Overdraft", "Warning, your account is now in overdraft");
58
+            }
47
             return ActionResult.success(account.getAccountData());
59
             return ActionResult.success(account.getAccountData());
48
         } else {
60
         } else {
61
+            Overdraft.popupMessage("Declined", "Declined, account contains insufficient funds");
49
             return ActionResult.fail("Withdraw failed: " + amount + ". Account has: " + account.getBalance());
62
             return ActionResult.fail("Withdraw failed: " + amount + ". Account has: " + account.getBalance());
50
         }
63
         }
51
     }
64
     }
65
+
66
+    public boolean isValidId(int id){
67
+        Account account = accounts.get(id);
68
+        if (account != null) {
69
+            return true;
70
+        } else {
71
+            return false;
72
+        }
73
+    }
74
+
52
 }
75
 }

+ 54
- 0
src/main/java/rocks/zipcode/atm/bank/Overdraft.java View File

1
+package rocks.zipcode.atm.bank;
2
+
3
+import javafx.scene.control.Button;
4
+import javafx.scene.control.Label;
5
+import javafx.stage.Stage;
6
+import javafx.scene.*;
7
+import javafx.scene.layout.*;
8
+import javafx.scene.control.*;
9
+import javafx.geometry.*;
10
+import javafx.stage.Modality;
11
+
12
+import java.awt.*;
13
+
14
+public class Overdraft {
15
+
16
+    public static void popupMessage(String title, String message){
17
+        // "Warning, your account is now in popupMessage";
18
+        Stage window = new Stage();
19
+        window.initModality(Modality.APPLICATION_MODAL); //Block Input until window closed/ resolved
20
+        window.setTitle(title);
21
+        window.setMinWidth(250);
22
+
23
+        Label label = new Label();
24
+        label.setText(message);
25
+
26
+        Button closeButton = new Button("Close");
27
+        closeButton.setOnAction(e -> window.close());
28
+
29
+        VBox layout = new VBox(10);
30
+        layout.getChildren().addAll(label, closeButton);
31
+        layout.setAlignment(Pos.CENTER);
32
+
33
+        Scene scene = new Scene(layout);
34
+        window.setScene(scene);
35
+        window.showAndWait();
36
+
37
+    }
38
+}
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+

+ 2
- 2
src/main/java/rocks/zipcode/atm/bank/PremiumAccount.java View File

5
  */
5
  */
6
 public class PremiumAccount extends Account {
6
 public class PremiumAccount extends Account {
7
 
7
 
8
-    private static final int OVERDRAFT_LIMIT = 100;
8
+    private static final int OVERDRAFT_LIMIT = 1000;
9
 
9
 
10
     public PremiumAccount(AccountData accountData) {
10
     public PremiumAccount(AccountData accountData) {
11
         super(accountData);
11
         super(accountData);
12
     }
12
     }
13
 
13
 
14
     @Override
14
     @Override
15
-    protected boolean canWithdraw(int amount) {
15
+    protected boolean canWithdraw(float amount) {
16
         return getBalance() + OVERDRAFT_LIMIT >= amount;
16
         return getBalance() + OVERDRAFT_LIMIT >= amount;
17
     }
17
     }
18
 }
18
 }