From a53bfef53e1fa2c929eb6781b1102e67a120574e Mon Sep 17 00:00:00 2001 From: "ds.731" <122613372+ds731@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:09:30 -0600 Subject: [PATCH] Phase IV - Added BankAcctAppGUI as a GUI frontend to replace CLI - Enhanced DataEntry to use Regex patterns for input validation --- bin/bankAcctApp/BankAcctApp.class | Bin 8622 -> 8724 bytes bin/bankAcctApp/BankAcctAppGUI$1.class | Bin 0 -> 790 bytes bin/bankAcctApp/BankAcctAppGUI$10.class | Bin 0 -> 861 bytes bin/bankAcctApp/BankAcctAppGUI$2.class | Bin 0 -> 793 bytes bin/bankAcctApp/BankAcctAppGUI$3.class | Bin 0 -> 787 bytes bin/bankAcctApp/BankAcctAppGUI$4.class | Bin 0 -> 8059 bytes bin/bankAcctApp/BankAcctAppGUI$5.class | Bin 0 -> 2224 bytes bin/bankAcctApp/BankAcctAppGUI$6.class | Bin 0 -> 1071 bytes bin/bankAcctApp/BankAcctAppGUI$7.class | Bin 0 -> 3465 bytes bin/bankAcctApp/BankAcctAppGUI$8.class | Bin 0 -> 4135 bytes bin/bankAcctApp/BankAcctAppGUI$9.class | Bin 0 -> 3895 bytes bin/bankAcctApp/BankAcctAppGUI.class | Bin 0 -> 11759 bytes bin/bankAcctApp/Customer.class | Bin 2598 -> 2698 bytes bin/bankAcctApp/DataEntry.class | Bin 3938 -> 6429 bytes src/bankAcctApp/Account.java | 158 ++--- src/bankAcctApp/AccountInterface.java | 2 +- src/bankAcctApp/BankAcctApp.java | 3 +- src/bankAcctApp/BankAcctAppGUI.java | 763 ++++++++++++++++++++++++ src/bankAcctApp/CheckingAccount.java | 21 +- src/bankAcctApp/Customer.java | 5 +- src/bankAcctApp/DataEntry.java | 94 ++- src/bankAcctApp/SavingsAccount.java | 12 +- 22 files changed, 957 insertions(+), 101 deletions(-) create mode 100644 bin/bankAcctApp/BankAcctAppGUI$1.class create mode 100644 bin/bankAcctApp/BankAcctAppGUI$10.class create mode 100644 bin/bankAcctApp/BankAcctAppGUI$2.class create mode 100644 bin/bankAcctApp/BankAcctAppGUI$3.class create mode 100644 bin/bankAcctApp/BankAcctAppGUI$4.class create mode 100644 bin/bankAcctApp/BankAcctAppGUI$5.class create mode 100644 bin/bankAcctApp/BankAcctAppGUI$6.class create mode 100644 bin/bankAcctApp/BankAcctAppGUI$7.class create mode 100644 bin/bankAcctApp/BankAcctAppGUI$8.class create mode 100644 bin/bankAcctApp/BankAcctAppGUI$9.class create mode 100644 bin/bankAcctApp/BankAcctAppGUI.class create mode 100644 src/bankAcctApp/BankAcctAppGUI.java diff --git a/bin/bankAcctApp/BankAcctApp.class b/bin/bankAcctApp/BankAcctApp.class index b629ecc617d8ca8d3aec0660927248fced430458..9f654205789726ed613363f1fbcb5b9d66a1c77e 100644 GIT binary patch literal 8724 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 literal 8622 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 diff --git a/bin/bankAcctApp/BankAcctAppGUI$1.class b/bin/bankAcctApp/BankAcctAppGUI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..7f26ebde53f418ccc3f7800d8cc180cc04728928 GIT binary patch literal 790 zcmaJ;ZBG+H5Pr6;z4kn91;mO4e5pw(fs@2jP{J@&?O5iWC)6OmxY)SNbCQ?x zu|AE`bTG}Wo(OZmmB<(vscy$}x-j_f_0%Ndm2?v>{(rM=mr2rhRg&pks>8R!j&=3`V`5i&;CvJW%IJfAn5(n7C0=+@u`&h&hMGUvGJge}6{;oo;_YJ`h x+_}j23w(?EZWlF{&v~;Nlz}!@DZ7F-$}eG^^n#)m9^esqPNP%cz7AOlt$z(pw_pGO literal 0 HcmV?d00001 diff --git a/bin/bankAcctApp/BankAcctAppGUI$10.class b/bin/bankAcctApp/BankAcctAppGUI$10.class new file mode 100644 index 0000000000000000000000000000000000000000..760c54ccc0b5ffe82695eca421ecbcb3c5b518cb GIT binary patch literal 861 zcmaJ<+iuf95IyUJICTwi(o&$LluHUpif|E6s0b0F7K%ct1mu0=Y{?d9H?p@0zlB6W z;(-s~Ul4o&W!6NhxHOi=GdnwH=J<@i{`~yq_!w=hyKop*dR)D2MUiQZM&aX=_{r;? z+T9Hod4}MCk9in#^(K7LI}nj^Q6ONJDyCz6If%d%8jcp#ND4;k*&XZ8FaxY1?Ew{>64 zfuZEXMbSoOA9L_LtrbUgsEpV!@mXGvSMyFx*n>y;$np+|EqGmu|_vxG?Uuv!& z;av0f5rXC?RNiNW=jmObLO9>BM6m@?DK6k5d4@|^p0;^J-Zm~aKOp#s%O`lx=AG|w rogZ0`rQdba9)uvW*9e`*b;3Kifg1Td)^H0AiaffrQ|;3vbFlUcB{#}4 literal 0 HcmV?d00001 diff --git a/bin/bankAcctApp/BankAcctAppGUI$2.class b/bin/bankAcctApp/BankAcctAppGUI$2.class new file mode 100644 index 0000000000000000000000000000000000000000..706e5090c0de717af4ab6d001359c6215c8aa599 GIT binary patch literal 793 zcmaJ;ZBG+H5Pr6;z4kn91%-+Qe5pyP(IeGwHO8|+B{{)F?Dy^6N*9k^vbTl!vrK$R z{NNApM~SmX6Ji3rWcFqz&&>18%%8u%exIIVh=(3Z4DB&jpQ9wP(a}-(>fC?xal6y^ zP+@2u@M9ikT@RV;HWlrRicJCS*3lL+F=83u%V zE|s(|7}mSt74Z4SK7D0XDHfZ&3I?7IBjzhFe&gb$CgC*P+(?hTsR5 w&+Gjn-zVOuMUSO3+^h#xpp8|ku3(MoOIRnpps0m=ctD=h=oGlGLsmlTA5h}Br~m)} literal 0 HcmV?d00001 diff --git a/bin/bankAcctApp/BankAcctAppGUI$3.class b/bin/bankAcctApp/BankAcctAppGUI$3.class new file mode 100644 index 0000000000000000000000000000000000000000..41e7f34c3f09380b14573188f0c72c234daf0dea GIT binary patch literal 787 zcmaJ;e@_!Z5PjR$UVEOlfI`Ir0wpOWcqT|NsWH|DwaI}bX#d|{7rJollDjR9AIroa ziGT0`{7~ZT(S(>lFPXiWmp3zSX8!#BeR*|-Hr5Ya$tILI?Bq$nR5Ut9=f{8nhBR)I{6P$Fi?n}JMfFQ`FqcZVkN zUP~p-8-}I&B;tCPA=lP@Q3S&S4-N`0vM6~dqRf!3TS6(2O6(8MdLsVJdy!z64s^() zE{~;+$6(G%V_2NfueL?fN<5wEK*UEnJ`?>^-w+7&d{yDlo2ckqN^{_deYJhhUi zl7Sv|r5JV8kv`x`L=221SAz*H7~DfWj6?BW+VN)oKiG4dNxFAc80kc+<2_*px^H*1 z!mwGtt~@j{@>_AtzuIdxZw2i(y^f+wwj-V-g4R{o7m4|(6N6`Tf-KoRuyWa60zihW z2$#_NO8@`> literal 0 HcmV?d00001 diff --git a/bin/bankAcctApp/BankAcctAppGUI$4.class b/bin/bankAcctApp/BankAcctAppGUI$4.class new file mode 100644 index 0000000000000000000000000000000000000000..14e9ea89e76f25dda42eaff3b5364f2e330ad951 GIT binary patch literal 8059 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 L49xeKEQPs0K9vQc literal 0 HcmV?d00001 diff --git a/bin/bankAcctApp/BankAcctAppGUI$7.class b/bin/bankAcctApp/BankAcctAppGUI$7.class new file mode 100644 index 0000000000000000000000000000000000000000..92dcf793cd9d094845bd1b8acfb5ad743e28d4d5 GIT binary patch literal 3465 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 A*Z=?k literal 0 HcmV?d00001 diff --git a/bin/bankAcctApp/BankAcctAppGUI$9.class b/bin/bankAcctApp/BankAcctAppGUI$9.class new file mode 100644 index 0000000000000000000000000000000000000000..59a8b1b94761831ee291b10f552459a1d27d2f27 GIT binary patch literal 3895 zcmds4i+3DV8UNkM?#^a&^B^VADQ$@uAX$=Zt+mo@spQen#k_1nYfGz6Hj`x9&CW72 zn>6)-3L@YG-wLRRulQD^yDcD4UsYOO%A-I53m*0OFL*r0@0*#eyGh^=u;*;8EcFZ8&G%^z;Uc=(%#DG3-WCYHy6!cgUk}Tvn*+9y> zBBML*kUnDsTqBE2nsx^L(mCE$hs|91es0>zmiEt? zH#VOuaSeRPxK18Tm#8&Nxwf8lbkC1F$d8si-)$SZz=f4ovO9RAlW&v4#mGAjV-m^CO|H++mZ>4#@AKP{bgnF$BqZ$GiOQ?u4 zdW%FgVvOD@Q3J{7Qi)n0T`p1Qqc(|pA6+5Q;G+(S^L&($X!OzBBv$$8?Goqv=p7PG zK6al;8&u>dJ1T)5s)ne6pa(PmL5UABFNyCj^#Bzw+Y( zDHY$Mm%>ZuvbyQXo0$p2j^Q3$#rAwh;=A}BsYLdSEqiY0fKu&MmV{R^3lcxT56Ru8 zYuGwHPgK$s;;Dd7*5JqZsfwQj>6GveEA2}B3_quQ%&t)EfqAU%eG&}pODHXw9zT+W@UwMh)TD})!c!cZVQF2g4 z9hBaLD1J>g1?ke9wcO@Os``n}D1J*>v)#5WTgC5#IGmebhI2d`jp&?szr!CS{)oqD z@NuTCxk1Bm^eLmy)HBwUz}B*6+H1|^C|9Y8E{}g16NEp-&0bJ}ul4sNCQ(v;yY?-&`H^NfkWQgTPd!w}FU*-(-!wH(Tc3egfzvcjZKiUgL=Iez2Umg!Q8 zCbf^UACVQKuAV+PsOP-rOT~-yEO>UTXf~DasFkXfN0jkvuuQ91@S#^{jYxH~MzMKe9bRrCp?zM+9< z1E8UiCj)P#xxia#D)3gC3A~ji0&k^xz*}h=@K%}yyp<*aZ>2fFTWJdLR+<64l_mgh zrS~6zLZ6GUmb6$$=ob3kKGXu2mP%8P{S3Y=~<$1#FCKvVcu-t+s&8ajmX^E8|*y0bTK<*m|FL>$~W0gl>g$ z0#_53jIj^h=%H26|2O)4os`>r&xn!u5i}REeNYUEu29wH@B(^?T7LxZZVDIip5xeE z#Gdvd_T7ogmuw9A-^T+%qbsz4rklf}DI5qEF?H|ak&Y8MtA$SB46&DJp&||zktN*1 z*!A&cjOTpZ%J{I4$wftc*vIXRKkDO7#y9zR1LIqKypi#3KHk((#HW3@x$%zB!>HO* zMbzhy;mf1Pa5wEdgnRZJ#l2l&qQ70l_q)^utku*9@FRia*xwb=!dj$=Uo;+}Kf8IO zC~()}SyKK=jlA<<5f3k*p1yW99&h|j)iIplI8=e-Fw3!59z#?)iI{Q0@kBS|598XX_ z#za4!#8aeet?0$m_!B~uqdW0uJcFYgV4aE@^Ld6Rz z_N&;fg36gJ`WNaJ=~am?*;A>-tMmY1^&*u>c*!nkP!HiHI$FUQyi99|#;aHG7eX;o OnA4a4ou!Y0f&T*XBq5{# literal 0 HcmV?d00001 diff --git a/bin/bankAcctApp/BankAcctAppGUI.class b/bin/bankAcctApp/BankAcctAppGUI.class new file mode 100644 index 0000000000000000000000000000000000000000..6274c42e5010c5f444e6331f715955c4df249ebe GIT binary patch literal 11759 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 delta 36 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 diff --git a/src/bankAcctApp/Account.java b/src/bankAcctApp/Account.java index 14092d1..5960b3c 100644 --- a/src/bankAcctApp/Account.java +++ b/src/bankAcctApp/Account.java @@ -1,102 +1,102 @@ -/* Phase III */ +/* Phase IV */ package bankAcctApp; import java.util.ArrayList; -// Abstract class defining the structure for account types -public abstract class Account implements AccountInterface { - private String accountNumber; // Account number for each account - private String accountType; // Type of account (CHK or SAV) - private double svcFee; // Service fee for transactions - private double interestRate; // Interest rate for the account - private double overDraftFee; // Overdraft fee for checking accounts - private double balance = 0.00; // Initial balance of the account + // Abstract class defining the structure for account types + public abstract class Account implements AccountInterface { + private String accountNumber; // Account number for each account + private String accountType; // Type of account (CHK or SAV) + private double svcFee; // Service fee for transactions + private double interestRate; // Interest rate for the account + private double overDraftFee; // Overdraft fee for checking accounts + private double balance = 0.00; // Initial balance of the account - // Transaction history stored as strings - private ArrayList transactionHistory = new ArrayList<>(); + // Transaction history stored as strings + private ArrayList transactionHistory = new ArrayList<>(); - // Getter for account number - public String getAccountNumber() { - return accountNumber; - } + // Getter for account number + public String getAccountNumber() { + return accountNumber; + } - // Setter for account number - public void setAccountNumber(String accountNumber) { - this.accountNumber = accountNumber; - } + // Setter for account number + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } - // Getter for account type - public String getAccountType() { - return accountType; - } + // Getter for account type + public String getAccountType() { + return accountType; + } - // Setter for account type - public void setAccountType(String accountType) { - this.accountType = accountType; - } + // Setter for account type + public void setAccountType(String accountType) { + this.accountType = accountType; + } - // Getter for service fee - public double getSvcFee() { - return svcFee; - } + // Getter for service fee + public double getSvcFee() { + return svcFee; + } - // Setter for service fee - public void setSvcFee(double svcFee) { - this.svcFee = svcFee; - } + // Setter for service fee + public void setSvcFee(double svcFee) { + this.svcFee = svcFee; + } - // Getter for interest rate - public double getInterestRate() { - return interestRate; - } + // Getter for interest rate + public double getInterestRate() { + return interestRate; + } - // Setter for interest rate - public void setInterestRate(double interestRate) { - this.interestRate = interestRate; - } + // Setter for interest rate + public void setInterestRate(double interestRate) { + this.interestRate = interestRate; + } - // Getter for overdraft fee - public double getOverDraftFee() { - return overDraftFee; - } + // Getter for overdraft fee + public double getOverDraftFee() { + return overDraftFee; + } - // Setter for overdraft fee - public void setOverDraftFee(double overDraftFee) { - this.overDraftFee = overDraftFee; - } + // Setter for overdraft fee + public void setOverDraftFee(double overDraftFee) { + this.overDraftFee = overDraftFee; + } - // Getter for account balance - public double getBalance() { - return balance; - } + // Getter for account balance + public double getBalance() { + return balance; + } - // Setter for account balance - public void setBalance(double balance) { - this.balance = balance; - } + // Setter for account balance + public void setBalance(double balance) { + this.balance = balance; + } - // Getter for transaction history - public ArrayList getTransactionHistory() { - return transactionHistory; - } + // Getter for transaction history + public ArrayList getTransactionHistory() { + return transactionHistory; + } - // Method to log a transaction and store it in the transaction history - public String logTransaction(String date, String type, double amount) { - String transaction = String.format( - "Date: %s | Type: %s | Amount: $%.2f | Balance: $%.2f", - date, type, amount, this.balance - ); - transactionHistory.add(transaction); // Add transaction to history - return transaction; // Return the formatted transaction string - } + // Method to log a transaction and store it in the transaction history + public String logTransaction(String date, String type, double amount) { + String transaction = String.format( + "Date: %s | Type: %s | Amount: $%.2f | Balance: $%.2f", + date, type, amount, this.balance + ); + transactionHistory.add(transaction); // Add transaction to history + return transaction; // Return the formatted transaction string + } - // Abstract method for withdrawals, to be implemented in subclasses - public abstract void withdrawal(double amount); + // Abstract method for withdrawals, to be implemented in subclasses + public abstract void withdrawal(double amount); - // Abstract method for deposits, to be implemented in subclasses - public abstract void deposit(double amount); + // Abstract method for deposits, to be implemented in subclasses + public abstract void deposit(double amount); - // Abstract method for applying accrued interest - public abstract double applyAccruedInterest(String transactionDate); -} \ No newline at end of file + // Abstract method for applying accrued interest + public abstract double applyAccruedInterest(String transactionDate); + } \ No newline at end of file diff --git a/src/bankAcctApp/AccountInterface.java b/src/bankAcctApp/AccountInterface.java index 82c5a23..5cef221 100644 --- a/src/bankAcctApp/AccountInterface.java +++ b/src/bankAcctApp/AccountInterface.java @@ -1,4 +1,4 @@ -/* Phase III */ +/* Phase IV */ package bankAcctApp; diff --git a/src/bankAcctApp/BankAcctApp.java b/src/bankAcctApp/BankAcctApp.java index 241774a..ff69fad 100644 --- a/src/bankAcctApp/BankAcctApp.java +++ b/src/bankAcctApp/BankAcctApp.java @@ -1,4 +1,4 @@ -/* Phase III */ +/* Phase IV */ package bankAcctApp; @@ -10,6 +10,7 @@ public class BankAcctApp { ArrayList customers = new ArrayList<>(); ArrayList accounts = new ArrayList<>(); + new BankAcctAppGUI(customers, accounts); boolean moreCustomers = true; // Add customers and accounts diff --git a/src/bankAcctApp/BankAcctAppGUI.java b/src/bankAcctApp/BankAcctAppGUI.java new file mode 100644 index 0000000..d677d44 --- /dev/null +++ b/src/bankAcctApp/BankAcctAppGUI.java @@ -0,0 +1,763 @@ +/* Phase IV */ + +package bankAcctApp; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + +public class BankAcctAppGUI extends JFrame { + private JButton addCustomerBtn, addTransactionBtn, viewInfoBtn; + private ArrayList customers; + private ArrayList accounts; + + public BankAcctAppGUI(ArrayList customers, ArrayList accounts) { + super("Bank Account Application"); + this.customers = customers; + this.accounts = accounts; + setSize(800, 600); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setLayout(new BorderLayout()); + + JPanel mainPanel = new JPanel(); + mainPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); + addCustomerBtn = new JButton("Add Customer and Account"); + addCustomerBtn.setPreferredSize(new Dimension(200, 50)); + addTransactionBtn = new JButton("Add Transactions to Existing Account"); + addTransactionBtn.setPreferredSize(new Dimension(200, 50)); + viewInfoBtn = new JButton("View Customer Account Info"); + viewInfoBtn.setPreferredSize(new Dimension(200, 50)); + mainPanel.add(addCustomerBtn); + mainPanel.add(addTransactionBtn); + mainPanel.add(viewInfoBtn); + + JPanel centerPanel = new JPanel(new GridBagLayout()); + centerPanel.add(mainPanel); + add(centerPanel, BorderLayout.CENTER); + + addCustomerBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + showAddCustomerPanel(); + } + }); + addTransactionBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + showAddTransactionPanel(); + } + }); + viewInfoBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + showViewInfoPanel(); + } + }); + + setVisible(true); + } + + private void showAddCustomerPanel() { + JFrame addCustomerFrame = new JFrame("Add Customer and Account"); + addCustomerFrame.setSize(800, 600); + addCustomerFrame.setLayout(new BorderLayout()); + + JPanel customerPanel = new JPanel(new GridBagLayout()); + JPanel accountPanel = new JPanel(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(5, 5, 5, 5); + gbc.fill = GridBagConstraints.HORIZONTAL; + + // Customer Information + gbc.gridx = 0; + gbc.gridy = 0; + customerPanel.add(new JLabel("Customer ID:"), gbc); + gbc.gridx = 1; + JTextField idTxtFld = new JTextField(15); + customerPanel.add(idTxtFld, gbc); + gbc.gridx = 0; + gbc.gridy = 1; + customerPanel.add(new JLabel("SSN:"), gbc); + gbc.gridx = 1; + JTextField ssnTxtFld = new JTextField(15); + customerPanel.add(ssnTxtFld, gbc); + gbc.gridx = 0; + gbc.gridy = 2; + customerPanel.add(new JLabel("Last Name:"), gbc); + gbc.gridx = 1; + JTextField lastNameTxtFld = new JTextField(15); + customerPanel.add(lastNameTxtFld, gbc); + gbc.gridx = 0; + gbc.gridy = 3; + customerPanel.add(new JLabel("First Name:"), gbc); + gbc.gridx = 1; + JTextField firstNameTxtFld = new JTextField(15); + customerPanel.add(firstNameTxtFld, gbc); + gbc.gridx = 0; + gbc.gridy = 4; + customerPanel.add(new JLabel("Street Address:"), gbc); + gbc.gridx = 1; + JTextField streetTxtFld = new JTextField(15); + customerPanel.add(streetTxtFld, gbc); + gbc.gridx = 0; + gbc.gridy = 5; + customerPanel.add(new JLabel("City:"), gbc); + gbc.gridx = 1; + JTextField cityTxtFld = new JTextField(15); + customerPanel.add(cityTxtFld, gbc); + gbc.gridx = 0; + gbc.gridy = 6; + customerPanel.add(new JLabel("State:"), gbc); + gbc.gridx = 1; + String[] states = { + "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", + "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", + "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", + "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", + "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY" + }; + JComboBox stateDropdown = new JComboBox<>(states); + customerPanel.add(stateDropdown, gbc); + + gbc.gridx = 0; + gbc.gridy = 7; + customerPanel.add(new JLabel("ZIP Code:"), gbc); + gbc.gridx = 1; + JTextField zipTxtFld = new JTextField(15); + customerPanel.add(zipTxtFld, gbc); + + gbc.gridx = 0; + gbc.gridy = 8; + customerPanel.add(new JLabel("Phone:"), gbc); + gbc.gridx = 1; + JTextField phoneTxtFld = new JTextField(10); + customerPanel.add(phoneTxtFld, gbc); + + // Account Information + gbc.gridx = 0; + gbc.gridy = 0; + accountPanel.add(new JLabel("Account Number:"), gbc); + gbc.gridx = 1; + JTextField acctNumTxtFld = new JTextField(15); + accountPanel.add(acctNumTxtFld, gbc); + gbc.gridx = 0; + gbc.gridy = 1; + accountPanel.add(new JLabel("Account Type:"), gbc); + gbc.gridx = 1; + JRadioButton chkRadio = new JRadioButton("Checking"); + JRadioButton savRadio = new JRadioButton("Savings"); + ButtonGroup acctTypeGroup = new ButtonGroup(); + acctTypeGroup.add(chkRadio); + acctTypeGroup.add(savRadio); + JPanel radioPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + radioPanel.add(chkRadio); + radioPanel.add(savRadio); + accountPanel.add(radioPanel, gbc); + gbc.gridx = 0; + gbc.gridy = 2; + accountPanel.add(new JLabel("Service Fee:"), gbc); + gbc.gridx = 1; + JTextField svcFeeTxtFld = new JTextField(15); + accountPanel.add(svcFeeTxtFld, gbc); + gbc.gridx = 0; + gbc.gridy = 3; + accountPanel.add(new JLabel("Interest Rate:"), gbc); + gbc.gridx = 1; + JTextField intRateTxtFld = new JTextField(15); + accountPanel.add(intRateTxtFld, gbc); + gbc.gridx = 0; + gbc.gridy = 4; + accountPanel.add(new JLabel("Overdraft Fee: "), gbc); + gbc.gridx = 1; + JTextField ovDrftTxtFld = new JTextField(15); + accountPanel.add(ovDrftTxtFld, gbc); + gbc.gridx = 0; + gbc.gridy = 5; + accountPanel.add(new JLabel("Starting Balance:"), gbc); + gbc.gridx = 1; + JTextField startBalTxtFld = new JTextField(15); + accountPanel.add(startBalTxtFld, gbc); + + JPanel buttonPanel = new JPanel(); + JButton saveBtn = new JButton("Save"); + JButton clearBtn = new JButton("Clear"); + JButton cancelBtn = new JButton("Cancel"); + buttonPanel.add(saveBtn); + buttonPanel.add(clearBtn); + buttonPanel.add(cancelBtn); + + addCustomerFrame.add(customerPanel, BorderLayout.NORTH); + addCustomerFrame.add(accountPanel, BorderLayout.CENTER); + addCustomerFrame.add(buttonPanel, BorderLayout.SOUTH); + addCustomerFrame.setVisible(true); + + // Add action listeners for buttons + saveBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + System.out.println("--Action Event-- saveBtn clicked DataEntry validation engine starting."); + try { + // Create a new instance of Customer and Account at the beginning + System.out.println("Attempting to create new Customer."); + Customer customer = new Customer(); + System.out.println("New Customer created."); + + System.out.println("\nStarting Customer Information validation."); + // ----------------- Customer Information ----------------- + System.out.println("Starting [id] validation."); + String id = idTxtFld.getText().trim(); + DataEntry.inputIDGUI(id); // Use the GUI-specific validation method for ID + customer.setID(id); + System.out.println("[id] validated."); + + System.out.println("Starting [ssn] validation."); + String ssn = ssnTxtFld.getText().trim(); + DataEntry.inputSSNGUI(ssn); // Use the GUI-specific validation method for SSN + customer.setSSN(ssn); + System.out.println("[ssn] validated."); + + System.out.println("Starting [lastName] validation."); + String lastName = lastNameTxtFld.getText().trim(); + DataEntry.inputLastNameGUI(lastName); // Use the GUI-specific validation method for last name + customer.setLastName(lastName); + System.out.println("[lastName] validated."); + + System.out.println("Starting [firstName] validation."); + String firstName = firstNameTxtFld.getText().trim(); + DataEntry.inputFirstNameGUI(firstName); // Use the GUI-specific validation method for first name + customer.setFirstName(firstName); + System.out.println("[firstName] validated."); + + System.out.println("Starting [street] validation."); + String street = streetTxtFld.getText().trim(); + DataEntry.inputStreetGUI(street); // Use the GUI-specific validation method for street + customer.setStreet(street); + System.out.println("[street] validated."); + + System.out.println("Starting [city] validation."); + String city = cityTxtFld.getText().trim(); + DataEntry.inputCityGUI(city); // Use the GUI-specific validation method for city + customer.setCity(city); + System.out.println("[city] validated"); + + // Handle dropdown for State + System.out.println("Starting [state] validation."); + String state = (String) stateDropdown.getSelectedItem(); + if (state == null || state.isEmpty()) { + throw new IllegalArgumentException("State must be selected."); + } + customer.setState(state); + System.out.println("[state] validated."); + + System.out.println("Starting [zip] validation."); + String zip = zipTxtFld.getText().trim(); + DataEntry.inputZipGUI(zip); // Use the GUI-specific validation method for zip + customer.setZip(zip); + System.out.println("[zip] validated."); + + System.out.println("Starting [phone] validation."); + String phone = phoneTxtFld.getText().trim(); + DataEntry.inputPhoneGUI(phone); // Use the GUI-specific validation method for phone + customer.setPhone(phone); + System.out.println("[phone] validated."); + + System.out.println("Customer Information validation completed."); + + // ----------------- Account Information ----------------- + // Create Null account object + Account account = null; + // Determine account type + System.out.println("Checking for account type."); + System.out.println("Attempting to create new account."); + if (chkRadio.isSelected()) { + account = new CheckingAccount(); + account.setAccountType("CHK"); + System.out.println("Account type accepted."); + System.out.println("New Checking Account created."); + } else if (savRadio.isSelected()) { + account = new SavingsAccount(); + account.setAccountType("SAV"); + System.out.println("Account type accepted."); + System.out.println("New Savings Account created."); + } else { + throw new IllegalArgumentException("Account type must be selected."); + } + + // Account number validation + System.out.println("Starting [accountNumber] validation."); + String accountNumber = acctNumTxtFld.getText().trim(); + DataEntry.inputNumericStringGUI(accountNumber, 5); // Use GUI-specific validation method for account number + account.setAccountNumber(accountNumber); // Set account number in the account instance + System.out.println("[accountNumber] validated."); + + // Service fee validation + System.out.println("Starting [svcFee] validation."); + String svcFeeStr = svcFeeTxtFld.getText().trim(); + try { + double svcFee = DataEntry.inputDecimalInRangeGUI(svcFeeStr, 0.00, 10.00); // Validate and convert to double + account.setSvcFee(svcFee); // Set service fee in the same Account instance + System.out.println("[svcFee] validated."); + } catch (IllegalArgumentException ex) { + JOptionPane.showMessageDialog(addCustomerFrame, ex.getMessage(), "Input Error", JOptionPane.ERROR_MESSAGE); + return; // Prevent further processing if invalid input + } + + // Interest rate validation + System.out.println("Starting [interestRate] validation."); + String intRateStr = intRateTxtFld.getText().trim(); + try { + double interestRate = DataEntry.inputDecimalInRangeGUI(intRateStr, 0.0, 10.0); // Validate and convert to double + account.setInterestRate(interestRate); // Set interest rate + System.out.println("[interestRate] validated."); + } catch (IllegalArgumentException ex) { + JOptionPane.showMessageDialog(addCustomerFrame, ex.getMessage(), "Input Error", JOptionPane.ERROR_MESSAGE); + return; // Prevent further processing if invalid input + } + + // Overdraft fee validation + System.out.println("Starting [overdraftFee] validation."); + String ovDrftFeeStr = ovDrftTxtFld.getText().trim(); + try { + double overdraftFee = DataEntry.inputDecimalGUI(ovDrftFeeStr); // Validate and convert to double + account.setOverDraftFee(overdraftFee); // Set overdraft fee + System.out.println("[overdraftFee] validated."); + } catch (IllegalArgumentException ex) { + JOptionPane.showMessageDialog(addCustomerFrame, ex.getMessage(), "Input Error", JOptionPane.ERROR_MESSAGE); + return; // Prevent further processing if invalid input + } + + // Starting balance validation + System.out.println("Starting [startingBalance] validation."); + String startBalStr = startBalTxtFld.getText().trim(); + try { + double startingBalance = DataEntry.inputDecimalGUI(startBalStr); // Validate and convert to double + account.setBalance(startingBalance); // Set starting balance + System.out.println("[startingBalance] validated."); + } catch (IllegalArgumentException ex) { + JOptionPane.showMessageDialog(addCustomerFrame, ex.getMessage(), "Input Error", JOptionPane.ERROR_MESSAGE); + return; // Prevent further processing if invalid input + } + + // ----------------- Add to Collections ----------------- + System.out.println("Adding customer instance to customers collection."); + customers.add(customer); // Add customer to collection + System.out.println("Customer was successfully added."); + System.out.println("Adding account instance to accounts collection."); + accounts.add(account); // Add account to collection + System.out.println("Account was successfully added."); + + // ----------------- Success Message ----------------- + JOptionPane.showMessageDialog(addCustomerFrame, "Customer and Account added successfully!"); + + // ----------------- Clear Fields ----------------- + System.out.println("Clearing JTextField form controls."); + idTxtFld.setText(""); + ssnTxtFld.setText(""); + lastNameTxtFld.setText(""); + firstNameTxtFld.setText(""); + streetTxtFld.setText(""); + cityTxtFld.setText(""); + stateDropdown.setSelectedIndex(0); + zipTxtFld.setText(""); + phoneTxtFld.setText(""); + acctNumTxtFld.setText(""); + svcFeeTxtFld.setText(""); + intRateTxtFld.setText(""); + ovDrftTxtFld.setText(""); + startBalTxtFld.setText(""); + System.out.println("JTextField form controls cleared successfully."); + + } catch (IllegalArgumentException ex) { + // Display validation error message and keep fields unchanged for correction + JOptionPane.showMessageDialog(addCustomerFrame, ex.getMessage(), "Validation Error", JOptionPane.ERROR_MESSAGE); + } + } + }); + + clearBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // Clear all text fields + System.out.println("--Action Event-- clearBtn clicked."); + System.out.println("Clearing JTextField form controls."); + idTxtFld.setText(""); + ssnTxtFld.setText(""); + lastNameTxtFld.setText(""); + firstNameTxtFld.setText(""); + streetTxtFld.setText(""); + cityTxtFld.setText(""); + stateDropdown.setSelectedIndex(0); + zipTxtFld.setText(""); + acctNumTxtFld.setText(""); + svcFeeTxtFld.setText(""); + intRateTxtFld.setText(""); + ovDrftTxtFld.setText(""); + startBalTxtFld.setText(""); + System.out.println("JTextField form controls cleared successfully."); + + } + }); + + + cancelBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + System.out.println("--Action Event-- cancelBtn Clicked -- Operation canceled."); + addCustomerFrame.dispose(); + } + }); + } + + private void showAddTransactionPanel() { + JFrame addTransactionFrame = new JFrame("Add Transaction"); + addTransactionFrame.setSize(800, 600); + addTransactionFrame.setLayout(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(5, 5, 5, 5); + gbc.fill = GridBagConstraints.HORIZONTAL; + + // Account Number + gbc.gridx = 0; + gbc.gridy = 0; + addTransactionFrame.add(new JLabel("Account Number:"), gbc); + gbc.gridx = 1; + JTextField acctNumTxtFld = new JTextField(15); + addTransactionFrame.add(acctNumTxtFld, gbc); + + // Transaction Type (Radio Buttons for Deposit or Withdrawal) + gbc.gridx = 0; + gbc.gridy = 1; + addTransactionFrame.add(new JLabel("Transaction Type:"), gbc); + gbc.gridx = 1; + + // Create the radio buttons for deposit and withdrawal types + JRadioButton depositButton = new JRadioButton("Deposit"); + JRadioButton withdrawalButton = new JRadioButton("Withdrawal"); + + // Group the radio buttons + ButtonGroup transactionTypeGroup = new ButtonGroup(); + transactionTypeGroup.add(depositButton); + transactionTypeGroup.add(withdrawalButton); + + // Add the radio buttons to the panel + JPanel transactionTypePanel = new JPanel(); + transactionTypePanel.add(depositButton); + transactionTypePanel.add(withdrawalButton); + + addTransactionFrame.add(transactionTypePanel, gbc); + + // Date (Transaction Date) + gbc.gridx = 0; + gbc.gridy = 2; + addTransactionFrame.add(new JLabel("Transaction Date (MM/dd/yyyy):"), gbc); + gbc.gridx = 1; + JTextField dateTxtFld = new JTextField(15); + addTransactionFrame.add(dateTxtFld, gbc); + + // Amount (For deposit/withdrawal) + gbc.gridx = 0; + gbc.gridy = 3; + addTransactionFrame.add(new JLabel("Amount:"), gbc); + gbc.gridx = 1; + JTextField amountTxtFld = new JTextField(15); + addTransactionFrame.add(amountTxtFld, gbc); + + // Apply Interest Button + JButton applyInterestBtn = new JButton("Apply Interest"); + gbc.gridx = 0; + gbc.gridy = 4; + addTransactionFrame.add(applyInterestBtn, gbc); + + // Submit Button + gbc.gridx = 2; + gbc.gridy = 4; + JButton submitBtn = new JButton("Submit"); + addTransactionFrame.add(submitBtn, gbc); + + // Transaction History + gbc.gridx = 0; + gbc.gridy = 5; + addTransactionFrame.add(new JLabel("Transaction History:"), gbc); + gbc.gridx = 1; + JTextArea transactionHistoryArea = new JTextArea(10, 40); + transactionHistoryArea.setEditable(false); + addTransactionFrame.add(new JScrollPane(transactionHistoryArea), gbc); + + addTransactionFrame.setVisible(true); + + // Action listener for Apply Interest button + applyInterestBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String accountNumber = acctNumTxtFld.getText(); + String transactionDate = dateTxtFld.getText(); + Account selectedAccount = null; + Customer selectedCustomer = null; + + // Validate the date format (MM/dd/yyyy) + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy"); + try { + LocalDate.parse(transactionDate, formatter); // Check if the date is valid + } catch (DateTimeParseException ex) { + JOptionPane.showMessageDialog(addTransactionFrame, "Invalid date format. Please use MM/dd/yyyy.", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + + // Find the account and customer based on the account number + for (int i = 0; i < accounts.size(); i++) { + if (accounts.get(i).getAccountNumber().equals(accountNumber)) { + selectedAccount = accounts.get(i); + selectedCustomer = customers.get(i); + break; + } + } + + // Handle interest application if account found + if (selectedAccount != null && selectedCustomer != null) { + // Apply interest to the account + selectedAccount.applyAccruedInterest(transactionDate); + + // Log the interest applied transaction + String transaction = selectedAccount.logTransaction(transactionDate, "Interest Applied", 0); + + // Update transaction history display + StringBuilder historyText = new StringBuilder(); + for (String trans : selectedAccount.getTransactionHistory()) { + historyText.append(trans).append("\n"); + } + transactionHistoryArea.setText(historyText.toString()); + } else { + JOptionPane.showMessageDialog(addTransactionFrame, "Account not found.", "Error", JOptionPane.ERROR_MESSAGE); + } + } + }); + + // Action listener for Submit button (Deposit/Withdrawal) + submitBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String accountNumber = acctNumTxtFld.getText(); + String transactionDate = dateTxtFld.getText(); + Account selectedAccount = null; + Customer selectedCustomer = null; + + // Validate the date format (MM/dd/yyyy) + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy"); + try { + LocalDate.parse(transactionDate, formatter); // Check if the date is valid + } catch (DateTimeParseException ex) { + JOptionPane.showMessageDialog(addTransactionFrame, "Invalid date format. Please use MM/dd/yyyy.", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + + // Find the account and customer based on the account number + for (int i = 0; i < accounts.size(); i++) { + if (accounts.get(i).getAccountNumber().equals(accountNumber)) { + selectedAccount = accounts.get(i); + selectedCustomer = customers.get(i); + break; + } + } + + // Handle deposit/withdrawal if account found + if (selectedAccount != null && selectedCustomer != null) { + String transactionType = ""; + double amount = 0; + + if (depositButton.isSelected()) { + transactionType = "Deposit"; + amount = Double.parseDouble(amountTxtFld.getText()); + } else if (withdrawalButton.isSelected()) { + transactionType = "Withdrawal"; + amount = Double.parseDouble(amountTxtFld.getText()); + } + + // Process Deposit or Withdrawal + String transaction = ""; + switch (transactionType) { + case "Deposit": + selectedAccount.deposit(amount); + transaction = selectedAccount.logTransaction(transactionDate, "Deposit", amount); + break; + case "Withdrawal": + selectedAccount.withdrawal(amount); + transaction = selectedAccount.logTransaction(transactionDate, "Withdrawal", amount); + break; + } + + // Update the transaction history display + StringBuilder historyText = new StringBuilder(); + for (String trans : selectedAccount.getTransactionHistory()) { + historyText.append(trans).append("\n"); + } + transactionHistoryArea.setText(historyText.toString()); + } else { + JOptionPane.showMessageDialog(addTransactionFrame, "Account not found.", "Error", JOptionPane.ERROR_MESSAGE); + } + } + }); + } + + private void showViewInfoPanel() { + JFrame viewInfoFrame = new JFrame("View Customer and Account Info"); + viewInfoFrame.setSize(800, 600); + viewInfoFrame.setLayout(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(5, 5, 5, 5); + gbc.fill = GridBagConstraints.HORIZONTAL; + + // Account Number + gbc.gridx = 0; + gbc.gridy = 0; + viewInfoFrame.add(new JLabel("Account Number:"), gbc); + gbc.gridx = 1; + JTextField acctNumTxtFld = new JTextField(15); + viewInfoFrame.add(acctNumTxtFld, gbc); + + // Submit Button + gbc.gridx = 2; + gbc.gridy = 0; + JButton submitBtn = new JButton("Submit"); + viewInfoFrame.add(submitBtn, gbc); + + // Customer and Account Info Labels + gbc.gridx = 0; + gbc.gridy = 1; + gbc.gridwidth = 1; + viewInfoFrame.add(new JLabel("Customer ID:"), gbc); + gbc.gridx = 1; + JLabel idLabel = new JLabel(); + viewInfoFrame.add(idLabel, gbc); + gbc.gridx = 0; + gbc.gridy = 2; + viewInfoFrame.add(new JLabel("SSN:"), gbc); + gbc.gridx = 1; + JLabel ssnLabel = new JLabel(); + viewInfoFrame.add(ssnLabel, gbc); + gbc.gridx = 0; + gbc.gridy = 3; + viewInfoFrame.add(new JLabel("Last Name:"), gbc); + gbc.gridx = 1; + JLabel lastNameLabel = new JLabel(); + viewInfoFrame.add(lastNameLabel, gbc); + gbc.gridx = 0; + gbc.gridy = 4; + viewInfoFrame.add(new JLabel("First Name:"), gbc); + gbc.gridx = 1; + JLabel firstNameLabel = new JLabel(); + viewInfoFrame.add(firstNameLabel, gbc); + gbc.gridx = 0; + gbc.gridy = 5; + viewInfoFrame.add(new JLabel("Street Address:"), gbc); + gbc.gridx = 1; + JLabel streetLabel = new JLabel(); + viewInfoFrame.add(streetLabel, gbc); + gbc.gridx = 0; + gbc.gridy = 6; + viewInfoFrame.add(new JLabel("City:"), gbc); + gbc.gridx = 1; + JLabel cityLabel = new JLabel(); + viewInfoFrame.add(cityLabel, gbc); + gbc.gridx = 0; + gbc.gridy = 7; + viewInfoFrame.add(new JLabel("State:"), gbc); + gbc.gridx = 1; + JLabel stateLabel = new JLabel(); + viewInfoFrame.add(stateLabel, gbc); + gbc.gridx = 0; + gbc.gridy = 8; + viewInfoFrame.add(new JLabel("ZIP Code:"), gbc); + gbc.gridx = 1; + JLabel zipLabel = new JLabel(); + viewInfoFrame.add(zipLabel, gbc); + gbc.gridx = 0; + gbc.gridy = 9; + viewInfoFrame.add(new JLabel("Phone:"), gbc); + gbc.gridx = 1; + JLabel phoneLabel = new JLabel(); + viewInfoFrame.add(phoneLabel, gbc); + gbc.gridx = 0; + gbc.gridy = 10; + viewInfoFrame.add(new JLabel("Account Type:"), gbc); + gbc.gridx = 1; + JLabel acctTypeLabel = new JLabel(); + viewInfoFrame.add(acctTypeLabel, gbc); + gbc.gridx = 0; + gbc.gridy = 11; + viewInfoFrame.add(new JLabel("Balance:"), gbc); + gbc.gridx = 1; + JLabel balanceLabel = new JLabel(); + viewInfoFrame.add(balanceLabel, gbc); + + // Transaction History Section + gbc.gridx = 0; + gbc.gridy = 12; + viewInfoFrame.add(new JLabel("Transaction History:"), gbc); + gbc.gridx = 1; + gbc.gridy = 12; + gbc.gridwidth = 3; + JTextArea transactionHistoryArea = new JTextArea(10, 40); + transactionHistoryArea.setEditable(false); + JScrollPane scrollPane = new JScrollPane(transactionHistoryArea); + viewInfoFrame.add(scrollPane, gbc); + + // Done Button + JButton doneBtn = new JButton("Done"); + gbc.gridx = 2; + gbc.gridy = 13; + viewInfoFrame.add(doneBtn, gbc); + + viewInfoFrame.setVisible(true); + + // Add action listener for the submit button + submitBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // Retrieve and display customer and account info + String accountNumber = acctNumTxtFld.getText(); + Account selectedAccount = null; + Customer selectedCustomer = null; + for (int i = 0; i < accounts.size(); i++) { + if (accounts.get(i).getAccountNumber().equals(accountNumber)) { + selectedAccount = accounts.get(i); + selectedCustomer = customers.get(i); + break; + } + } + if (selectedAccount != null && selectedCustomer != null) { + idLabel.setText(selectedCustomer.getID()); + ssnLabel.setText(selectedCustomer.getSSN()); + lastNameLabel.setText(selectedCustomer.getLastName()); + firstNameLabel.setText(selectedCustomer.getFirstName()); + streetLabel.setText(selectedCustomer.getStreet()); + cityLabel.setText(selectedCustomer.getCity()); + stateLabel.setText(selectedCustomer.getState()); + zipLabel.setText(selectedCustomer.getZip()); + phoneLabel.setText(selectedCustomer.getPhone()); + acctTypeLabel.setText(selectedAccount.getAccountType()); + balanceLabel.setText(String.format("$%.2f", selectedAccount.getBalance())); + + // Populate transaction history + StringBuilder transactionHistoryText = new StringBuilder(); + for (String transaction : selectedAccount.getTransactionHistory()) { + transactionHistoryText.append(transaction).append("\n"); + } + transactionHistoryArea.setText(transactionHistoryText.toString()); + } else { + JOptionPane.showMessageDialog(viewInfoFrame, "Account not found.", "Error", JOptionPane.ERROR_MESSAGE); + } + } + }); + + // Add action listener for the done button + doneBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + viewInfoFrame.dispose(); // Close the window when done is clicked + } + }); + } + + + + public static void main(String[] args) { + ArrayList customers = new ArrayList<>(); + ArrayList accounts = new ArrayList<>(); + new BankAcctAppGUI(customers, accounts); + } +} \ No newline at end of file diff --git a/src/bankAcctApp/CheckingAccount.java b/src/bankAcctApp/CheckingAccount.java index fb31cd2..00ba6c4 100644 --- a/src/bankAcctApp/CheckingAccount.java +++ b/src/bankAcctApp/CheckingAccount.java @@ -1,8 +1,8 @@ -/* Phase III */ +/* Phase IV */ package bankAcctApp; -// Class representing checking accounts +//Class representing checking accounts public class CheckingAccount extends Account { // Overridden method for withdrawals in checking accounts @@ -14,29 +14,30 @@ public class CheckingAccount extends Account { } setBalance(newBalance); // Update balance } - + // Overridden method for deposits in checking accounts @Override public void deposit(double amount) { setBalance(getBalance() + amount - getSvcFee()); // Add amount and deduct service fee } - + // Overridden method for applying accrued interest in checking accounts @Override public double applyAccruedInterest(String transactionDate) { double interest = 0.0; - if (getBalance() <= 0.0) { // Ensure balance is positive for interest accrual + if (getBalance() <= 0.0) { // Ensure balance is positive for interest accrual System.out.println("This account has an insufficient balance for interest to apply."); } else { - interest = getBalance() * (getInterestRate() / 100); // Calculate interest - setBalance(getBalance() + interest); // Add interest to the balance - logTransaction(transactionDate, "INT", interest); // Log the interest transaction + interest = getBalance() * (getInterestRate() / 100); // Calculate interest + setBalance(getBalance() + interest); // Add interest to the balance + logTransaction(transactionDate, "INT", interest); // Log the interest transaction } - return interest; + return interest; } // Implementation of balance() method from AccountInterface @Override public double balance() { return getBalance(); // Return the current balance } -} \ No newline at end of file + } + \ No newline at end of file diff --git a/src/bankAcctApp/Customer.java b/src/bankAcctApp/Customer.java index 0bd4093..aea7c3d 100644 --- a/src/bankAcctApp/Customer.java +++ b/src/bankAcctApp/Customer.java @@ -1,4 +1,4 @@ -/* Phase III */ +/* Phase IV */ package bankAcctApp; @@ -108,4 +108,7 @@ public class Customer { id, lastName, firstName, ssn, phone, street, city, state, zip ); } +public Object getAccountNumber() { + return null; +} } \ No newline at end of file diff --git a/src/bankAcctApp/DataEntry.java b/src/bankAcctApp/DataEntry.java index c880d66..a45e4f8 100644 --- a/src/bankAcctApp/DataEntry.java +++ b/src/bankAcctApp/DataEntry.java @@ -1,4 +1,4 @@ -/* Phase III */ +/* Phase IV */ package bankAcctApp; @@ -73,7 +73,7 @@ public class DataEntry { return input; } -// Static method to validate decimals. +// Static method to validate decimals (specific to the CLI) public static double inputDecimal(String prompt) { boolean isValid = false; double decimalValue = 0.0; @@ -91,7 +91,7 @@ public class DataEntry { return decimalValue; } -// Static method to validate decimals are within a range. +// Static method to validate decimals are within a range (specific to the CLI) public static double inputDecimalInRange(String prompt, double min, double max) { double value; do { @@ -105,6 +105,7 @@ public class DataEntry { return value; } + // Static method to validate a date in MM/DD/YYYY format. public static String inputDate(String prompt) { Pattern patternDate = Pattern.compile("^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/(\\d{4})$"); @@ -121,4 +122,91 @@ public class DataEntry { } return date; } + + +// Validation methods specific to the GUI + // Reusable patterns for string v // Reusable patterns for string validation (no prompt messages, just validation) + private static final Pattern patternID = Pattern.compile("[A-Z0-9]{5}"); + private static final Pattern patternSSN = Pattern.compile("[0-9]{9}"); + private static final Pattern patternName = Pattern.compile("[A-Za-z\\s,\\.\\-']{1,20}"); + private static final Pattern patternStreet = Pattern.compile("[0-9]+[A-Za-z\\s,\\.\\-]{1,19}"); + private static final Pattern patternCity = Pattern.compile("[A-Za-z\\s]{1,20}"); + private static final Pattern patternState = Pattern.compile("[A-Z]{2}"); + private static final Pattern patternZip = Pattern.compile("[0-9]{5}"); + private static final Pattern patternPhone = Pattern.compile("[0-9]{10}"); + + // Validate input for strings using regex (for GUI) + private static void validateInput(Pattern pattern, String input) { + if (!pattern.matcher(input).matches()) { + throw new IllegalArgumentException("Invalid input: " + input); + } + } + + // Validate and convert string input to double + private static double validateAndConvertToDouble(String input) { + try { + return Double.parseDouble(input); // Convert to double + } catch (NumberFormatException ex) { + throw new IllegalArgumentException("Invalid decimal input: " + input); + } + } + + // Validate and convert decimal numbers for account information within a range (for GUI) + public static double inputDecimalInRangeGUI(String input, double min, double max) { + double value = validateAndConvertToDouble(input); // Validate as double + if (value < min || value > max) { + throw new IllegalArgumentException("Value out of range: " + value); + } + return value; + } + + // Validate decimal input (no range validation) + public static double inputDecimalGUI(String input) { + return validateAndConvertToDouble(input); // Simply convert the valid decimal input + } + + // Field-specific validation methods for GUI + + public static void inputIDGUI(String id) { + validateInput(patternID, id); // Validate ID format + } + + public static void inputSSNGUI(String ssn) { + validateInput(patternSSN, ssn); // Validate SSN format + } + + public static void inputLastNameGUI(String lastName) { + validateInput(patternName, lastName); // Validate last name format + } + + public static void inputFirstNameGUI(String firstName) { + validateInput(patternName, firstName); // Validate first name format + } + + public static void inputStreetGUI(String street) { + validateInput(patternStreet, street); // Validate street format + } + + public static void inputCityGUI(String city) { + validateInput(patternCity, city); // Validate city format + } + + public static void inputStateGUI(String state) { + validateInput(patternState, state); // Validate state format + } + + public static void inputZipGUI(String zip) { + validateInput(patternZip, zip); // Validate zip format + } + + public static void inputPhoneGUI(String phone) { + validateInput(patternPhone, phone); // Validate phone format + } + + // For numeric string validation (e.g., for account number) + public static void inputNumericStringGUI(String input, int length) { + if (input.length() != length || !input.matches("[0-9]+")) { + throw new IllegalArgumentException("Invalid numeric input. Must be " + length + " digits."); + } + } } \ No newline at end of file diff --git a/src/bankAcctApp/SavingsAccount.java b/src/bankAcctApp/SavingsAccount.java index a73d0e8..25dedb7 100644 --- a/src/bankAcctApp/SavingsAccount.java +++ b/src/bankAcctApp/SavingsAccount.java @@ -1,8 +1,8 @@ -/* Phase III */ +/* Phase IV */ package bankAcctApp; -// Class representing savings accounts +//Class representing savings accounts public class SavingsAccount extends Account { // Overridden method for withdrawals in savings accounts @@ -14,13 +14,13 @@ public class SavingsAccount extends Account { throw new IllegalArgumentException("Insufficient funds for withdrawal. Savings accounts cannot overdraft."); } } - + // Overridden method for deposits in savings accounts @Override public void deposit(double amount) { setBalance(getBalance() + amount - getSvcFee()); // Add amount and deduct service fee } - + // Overridden method for applying accrued interest in savings accounts @Override public double applyAccruedInterest(String transactionDate) { @@ -32,10 +32,10 @@ public class SavingsAccount extends Account { logTransaction(transactionDate, "INT", interest); // Log the interest transaction return interest; } - + // Implementation of balance() method from AccountInterface @Override public double balance() { return getBalance(); // Return the current balance } -} \ No newline at end of file + } \ No newline at end of file