From 2fc82b177ae427ecde082e9ee78804f6ebc63029 Mon Sep 17 00:00:00 2001 From: Om Date: Fri, 21 Oct 2022 18:26:05 +0530 Subject: [PATCH 01/56] Initial Commit --- .gitignore | 3 ++ check.py | 6 ++++ main.py | 3 ++ setup.py | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 .gitignore create mode 100644 check.py create mode 100644 main.py create mode 100644 setup.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4572c76 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__/ +firsttime.txt +cred.dat \ No newline at end of file diff --git a/check.py b/check.py new file mode 100644 index 0000000..885e2d4 --- /dev/null +++ b/check.py @@ -0,0 +1,6 @@ +def check(): + with open("firsttime.txt","r") as a: + if a.read()=="True": + return True + else: + return False \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..6622f9a --- /dev/null +++ b/main.py @@ -0,0 +1,3 @@ +import setup + +connection=setup.setup() diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..c5ad103 --- /dev/null +++ b/setup.py @@ -0,0 +1,84 @@ +import check + +import pickle +import mysql.connector + + +query="" +Password="" +Database="" +def sqlpwd(): + global Password + cred = open("cred.dat","rb") + dat=pickle.load(cred) + cred.close() + Password=dat[0] + return Password + +def sqldb(): + global Database + cred = open("cred.dat","rb") + dat=pickle.load(cred) + cred.close() + Database=dat[1] + return Database + +def connectionquery(): + try: + Databa=sqldb() + Passwo=sqlpwd() + query=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) + except: + import traceback + traceback.print_exc() + query="" + return query + +def querycheck(): + conn=connectionquery() + ans=False + if conn!="": + if conn.is_connected: + print("Connection established successfully.") + with open("firsttime.txt","w") as f: + f.write("False") + ans=True + + if not ans: + print("There was a problem in connection") + print("Maybe this is because you entered wrong credentials(password and database name)") + return ans + +def mysqlsetup(): + print("\n-----------------MYSQL Setup-------------------\n") + print("Remember that you can't change the database afterwards\n") + print("Create a database in your MYSQL Workbench.\n") + Database=input("Enter database name: ") + Password=input("Enter sql password (enter '' if nothing):") + cred2= open("cred.dat","wb") + data=[Password,Database] + pickle.dump(data,cred2) + cred2.close() + querycheck() + +def setup(): + while check.check(): + print("\n\n-----------------Welcome to the Project!!!-------------------") + print("This is the setup process which runs when the user uses the program for the first time.") + print("\n----------------------Database Setup------------------------\n") + print("1.Mysql 8.0 (Dependency MYSQL)") + print("2.Standalone (Data files)") + print("0.Cancel operation\n") + ans2=input("How do you want to store the data? (1/2): ") + if ans2 == "0": + break + if ans2=="1": + mysqlsetup() + if ans2=="2": + print("\nThis is under development :). Please use mysql till then...") + elif ans2 != "1" or ans2 != "2": + print("\nWrong input, (1/2).........") + else: + if querycheck(): + connectionquery() +setup() From 5d3afe225e618b66cdcc216984d9bd67086d93b6 Mon Sep 17 00:00:00 2001 From: Om Date: Fri, 21 Oct 2022 22:00:44 +0530 Subject: [PATCH 02/56] account type, table setup initialisation --- accounttype.py | 32 ++++++++++++++++++++++++++++++++ setup.py | 2 ++ sqltables.py | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 accounttype.py create mode 100644 sqltables.py diff --git a/accounttype.py b/accounttype.py new file mode 100644 index 0000000..7ba0e27 --- /dev/null +++ b/accounttype.py @@ -0,0 +1,32 @@ +def acctype(): + while True: + print("--------------Account Selector Menu--------------") + print("1.Admin.") + print("2.Employee.") + print("3.Client.") + print("Enter 0 to end process.") + a=int(input("\nEnter your account type:")) + + if a==1: + b=input("\nEnter admin password:") + if b=="admin123": + return 1 + else: + print("\nWrong password!\n") + + elif a==2: + b=input("\nEnter employee password:") + if b=="emp123": + return 2 + else: + print("\nWrong password!\n") + + elif a==3: + return 3 + + elif a==0: + print("\nShutting down the program.") + break + + else: + print("\nWrong input!") \ No newline at end of file diff --git a/setup.py b/setup.py index c5ad103..3261920 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,5 @@ import check +import sqltables import pickle import mysql.connector @@ -42,6 +43,7 @@ def querycheck(): print("Connection established successfully.") with open("firsttime.txt","w") as f: f.write("False") + sqltables.tables() ans=True if not ans: diff --git a/sqltables.py b/sqltables.py new file mode 100644 index 0000000..8a3e93c --- /dev/null +++ b/sqltables.py @@ -0,0 +1,36 @@ +import setup +import mysql.connector +from mysql.connector import errorcode +conn=setup.setup() +cursor=conn.cursor() + +DB_NAME = setup.sqldb() + +TABLES = {} +TABLES['employees'] = ( + "CREATE TABLE `employees` (" + " `emp_no` int(5) NOT NULL AUTO_INCREMENT," + " `birth_date` date NOT NULL," + " `first_name` varchar(15) NOT NULL," + " `last_name` varchar(15) NOT NULL," + " `gender` enum('M','F') NOT NULL," + " `hire_date` date NOT NULL," + " `age` int(2) NOT NULL" + " PRIMARY KEY (`emp_no`)" + ") ") + +TABLES['client'] = ( + "CREATE TABLE `clients` (" + " `acc_no` int(5) NOT NULL AUTO_INCREMENT," + " `acc_type` enum('S','C') NOT NULL" + " `first_name` varchar(15) NOT NULL," + " `last_name` varchar(15) NOT NULL," + " `gender` enum('M','F') NOT NULL," + " `birth_date` date NOT NULL," + " `acc_creation_date` date NOT NULL," + " PRIMARY KEY (`acc_no`)" +) + +#https://education.github.com/git-cheat-sheet-education.pdf +#https://dev.mysql.com/doc/connector-python/en/connector-python-example-ddl.html + \ No newline at end of file From 7dcd017500fb73d3ffc9c279580092171d7b515f Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 22 Oct 2022 00:04:29 +0530 Subject: [PATCH 03/56] Added method to create tables in sql --- setup.py | 120 ++++++++++++++++++++++++++++++++++++++++++++++++--- sqltables.py | 67 ++++++++++++++++++++++++++-- 2 files changed, 177 insertions(+), 10 deletions(-) diff --git a/setup.py b/setup.py index 3261920..1155cf2 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,83 @@ import check -import sqltables import pickle import mysql.connector +from mysql.connector import errorcode +TABLES = {} +TABLES['employees'] = ( + "CREATE TABLE `employees` (" + " `emp_no` int(5) NOT NULL AUTO_INCREMENT," + " `birth_date` date NOT NULL," + " `first_name` varchar(15) NOT NULL," + " `last_name` varchar(15) NOT NULL," + " `gender` enum('M','F') NOT NULL," + " `hire_date` date NOT NULL," + " `age` int(2) NOT NULL," + " PRIMARY KEY (`emp_no`)" + ") ") + +TABLES['clients'] = ( + "CREATE TABLE `clients` (" + " `acc_no` int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY," + " `acc_type` enum('S','C') NOT NULL," + " `first_name` varchar(15) NOT NULL," + " `last_name` varchar(15) NOT NULL," + " `gender` enum('M','F') NOT NULL," + " `birth_date` date NOT NULL," + " `acc_creation_date` date NOT NULL," + " `mobile_no` int(10) NOT NULL," + " `email_id` varchar(25) NOT NULL" + ") " +) + +TABLES['savings'] = ( + "CREATE TABLE `savings` (" + " `acc_no` int(5) NOT NULL," + " `balance` int NOT NULL," + " `loan` enum('YES','NO') NOT NULL," + " PRIMARY KEY (`acc_no`)," + " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" + ") " +) + +TABLES['current'] = ( + "CREATE TABLE `current` (" + " `acc_no` int(5) NOT NULL," + " `balance` int NOT NULL," + " `overdraft` int NOT NULL," + " PRIMARY KEY (`acc_no`)," + " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" + ") " +) + +TABLES['loan'] = ( + "CREATE TABLE `loan` (" + " `acc_no` int(5) NOT NULL," + " `loan_type` enum('PL','HL','EL','TL','BL') NOT NULL," + " `loan_amt` int NOT NULL," + " `time_period_months` int NOT NULL," + " `iterest_perc_per_annum` int(1) NOT NULL," + " `amt-per-month` int NOT NULL," + " `remaining_amt` int NOT NULL," + " PRIMARY KEY (`acc_no`)," + " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" + ") " +) + +TABLES['overdraft']=( + "CREATE TABLE `overdraft` (" + " `acc_no` int(5) NOT NULL," + " `overdraft_amt` int NOT NULL," + " `od_with_interest_remaining` int NOT NULL," + " PRIMARY KEY (`acc_no`)," + " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" + ") " +) + + +############################################################################################ query="" Password="" Database="" @@ -41,10 +114,24 @@ def querycheck(): if conn!="": if conn.is_connected: print("Connection established successfully.") - with open("firsttime.txt","w") as f: - f.write("False") - sqltables.tables() - ans=True + if check.check()==True: + cursor=conn.cursor() + #Table creation + for table_name in TABLES: + table_description = TABLES[table_name] + try: + print("Creating table {}: ".format(table_name), end='') + cursor.execute(table_description) + except mysql.connector.Error as err: + if err.errno == errorcode.ER_TABLE_EXISTS_ERROR: + print("already exists.") + else: + print(err.msg) + else: + print("OK") + with open("firsttime.txt","w") as f: + f.write("False") + ans=True if not ans: print("There was a problem in connection") @@ -83,4 +170,25 @@ def setup(): else: if querycheck(): connectionquery() -setup() + +"""def tables(): + conn=setup() + cursor=conn.cursor() + for table_name in TABLES: + table_description = TABLES[table_name] + try: + print("Creating table {}: ".format(table_name), end='') + cursor.execute(table_description) + except mysql.connector.Error as err: + if err.errno == errorcode.ER_TABLE_EXISTS_ERROR: + print("already exists.") + else: + print(err.msg) + else: + print("OK")""" + + +################################################################################################## +#Links +#https://education.github.com/git-cheat-sheet-education.pdf +#https://dev.mysql.com/doc/connector-python/en/connector-python-example-ddl.html diff --git a/sqltables.py b/sqltables.py index 8a3e93c..add9a72 100644 --- a/sqltables.py +++ b/sqltables.py @@ -15,22 +15,81 @@ " `last_name` varchar(15) NOT NULL," " `gender` enum('M','F') NOT NULL," " `hire_date` date NOT NULL," - " `age` int(2) NOT NULL" + " `age` int(2) NOT NULL," " PRIMARY KEY (`emp_no`)" ") ") -TABLES['client'] = ( +TABLES['clients'] = ( "CREATE TABLE `clients` (" " `acc_no` int(5) NOT NULL AUTO_INCREMENT," - " `acc_type` enum('S','C') NOT NULL" + " `acc_type` enum('S','C') NOT NULL," " `first_name` varchar(15) NOT NULL," " `last_name` varchar(15) NOT NULL," " `gender` enum('M','F') NOT NULL," " `birth_date` date NOT NULL," " `acc_creation_date` date NOT NULL," + " `mobile_no int(10) NOT NULL`," + " `email_id varchar(25) NOT NULL`," " PRIMARY KEY (`acc_no`)" + ") " ) +TABLES['savings'] = ( + "CREATE TABLE `savings` (" + " `acc_no` int(5) NOT NULL," + " `balance` int NOT NULL," + " `loan` enum('YES','NO') NOT NULL," + " PRIMARY KEY (`acc_no`)," + " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" + ") " +) + +TABLES['current'] = ( + "CREATE TABLE `current` (" + " `acc_no` int(5) NOT NULL," + " `balance` int NOT NULL," + " `overdraft` int NOT NULL," + " PRIMARY KEY (`acc_no`)," + " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" + ") " +) + +TABLES['loan'] = ( + "CREATE TABLE `loan` (" + " `acc_no` int(5) NOT NULL," + " `loan_type` enum('PL','HL','EL','TL','BL') NOT NULL," + " `loan_amt` int NOT NULL," + " `time_period_months` int NOT NULL," + " `iterest_perc_per_annum` int(1) NOT NULL," + " `amt-per-month` int NOT NULL," + " `remaining_amt` int NOT NULL," + " PRIMARY KEY (`acc_no`)," + " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" + ") " +) + +TABLES['overdraft']=( + "CREATE TABLE `overdraft` (" + " `acc_no` int(5) NOT NULL," + " `overdraft_amt` int NOT NULL," + " `od_with_interest_remaining int NOT NULL," + " PRIMARY KEY (`acc_no`)," + " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" + ") " +) +def tables(): + for table_name in TABLES: + table_description = TABLES[table_name] + try: + print("Creating table {}: ".format(table_name), end='') + cursor.execute(table_description) + except mysql.connector.Error as err: + if err.errno == errorcode.ER_TABLE_EXISTS_ERROR: + print("already exists.") + else: + print(err.msg) + else: + print("OK") +#Credits #https://education.github.com/git-cheat-sheet-education.pdf #https://dev.mysql.com/doc/connector-python/en/connector-python-example-ddl.html - \ No newline at end of file From d6b3f72907e41c5ada41a9a8133b22caad5f7705 Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 22 Oct 2022 00:09:09 +0530 Subject: [PATCH 04/56] Removed unnecessary comments --- .gitignore | 3 +- setup.py | 22 ------------ sqltables.py | 95 ---------------------------------------------------- 3 files changed, 2 insertions(+), 118 deletions(-) delete mode 100644 sqltables.py diff --git a/.gitignore b/.gitignore index 4572c76..e0acd6b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ __pycache__/ firsttime.txt -cred.dat \ No newline at end of file +cred.dat +links.txt \ No newline at end of file diff --git a/setup.py b/setup.py index 1155cf2..a7ccb56 100644 --- a/setup.py +++ b/setup.py @@ -170,25 +170,3 @@ def setup(): else: if querycheck(): connectionquery() - -"""def tables(): - conn=setup() - cursor=conn.cursor() - for table_name in TABLES: - table_description = TABLES[table_name] - try: - print("Creating table {}: ".format(table_name), end='') - cursor.execute(table_description) - except mysql.connector.Error as err: - if err.errno == errorcode.ER_TABLE_EXISTS_ERROR: - print("already exists.") - else: - print(err.msg) - else: - print("OK")""" - - -################################################################################################## -#Links -#https://education.github.com/git-cheat-sheet-education.pdf -#https://dev.mysql.com/doc/connector-python/en/connector-python-example-ddl.html diff --git a/sqltables.py b/sqltables.py deleted file mode 100644 index add9a72..0000000 --- a/sqltables.py +++ /dev/null @@ -1,95 +0,0 @@ -import setup -import mysql.connector -from mysql.connector import errorcode -conn=setup.setup() -cursor=conn.cursor() - -DB_NAME = setup.sqldb() - -TABLES = {} -TABLES['employees'] = ( - "CREATE TABLE `employees` (" - " `emp_no` int(5) NOT NULL AUTO_INCREMENT," - " `birth_date` date NOT NULL," - " `first_name` varchar(15) NOT NULL," - " `last_name` varchar(15) NOT NULL," - " `gender` enum('M','F') NOT NULL," - " `hire_date` date NOT NULL," - " `age` int(2) NOT NULL," - " PRIMARY KEY (`emp_no`)" - ") ") - -TABLES['clients'] = ( - "CREATE TABLE `clients` (" - " `acc_no` int(5) NOT NULL AUTO_INCREMENT," - " `acc_type` enum('S','C') NOT NULL," - " `first_name` varchar(15) NOT NULL," - " `last_name` varchar(15) NOT NULL," - " `gender` enum('M','F') NOT NULL," - " `birth_date` date NOT NULL," - " `acc_creation_date` date NOT NULL," - " `mobile_no int(10) NOT NULL`," - " `email_id varchar(25) NOT NULL`," - " PRIMARY KEY (`acc_no`)" - ") " -) - -TABLES['savings'] = ( - "CREATE TABLE `savings` (" - " `acc_no` int(5) NOT NULL," - " `balance` int NOT NULL," - " `loan` enum('YES','NO') NOT NULL," - " PRIMARY KEY (`acc_no`)," - " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" - ") " -) - -TABLES['current'] = ( - "CREATE TABLE `current` (" - " `acc_no` int(5) NOT NULL," - " `balance` int NOT NULL," - " `overdraft` int NOT NULL," - " PRIMARY KEY (`acc_no`)," - " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" - ") " -) - -TABLES['loan'] = ( - "CREATE TABLE `loan` (" - " `acc_no` int(5) NOT NULL," - " `loan_type` enum('PL','HL','EL','TL','BL') NOT NULL," - " `loan_amt` int NOT NULL," - " `time_period_months` int NOT NULL," - " `iterest_perc_per_annum` int(1) NOT NULL," - " `amt-per-month` int NOT NULL," - " `remaining_amt` int NOT NULL," - " PRIMARY KEY (`acc_no`)," - " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" - ") " -) - -TABLES['overdraft']=( - "CREATE TABLE `overdraft` (" - " `acc_no` int(5) NOT NULL," - " `overdraft_amt` int NOT NULL," - " `od_with_interest_remaining int NOT NULL," - " PRIMARY KEY (`acc_no`)," - " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" - ") " -) -def tables(): - for table_name in TABLES: - table_description = TABLES[table_name] - try: - print("Creating table {}: ".format(table_name), end='') - cursor.execute(table_description) - except mysql.connector.Error as err: - if err.errno == errorcode.ER_TABLE_EXISTS_ERROR: - print("already exists.") - else: - print(err.msg) - else: - print("OK") -#Credits -#https://education.github.com/git-cheat-sheet-education.pdf -#https://dev.mysql.com/doc/connector-python/en/connector-python-example-ddl.html From c4756d782fdf905f6d80e0ca2ba4051f7a87763a Mon Sep 17 00:00:00 2001 From: Om J Shah <79356504+OJASisLive@users.noreply.github.com> Date: Sat, 22 Oct 2022 01:00:16 +0530 Subject: [PATCH 05/56] Create firsttime.txt --- firsttime.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 firsttime.txt diff --git a/firsttime.txt b/firsttime.txt new file mode 100644 index 0000000..0ca9514 --- /dev/null +++ b/firsttime.txt @@ -0,0 +1 @@ +True From 7248552b6752ccc88cfa54cd7ef1c04d89b66fe6 Mon Sep 17 00:00:00 2001 From: Om J Shah <79356504+OJASisLive@users.noreply.github.com> Date: Sat, 22 Oct 2022 01:01:39 +0530 Subject: [PATCH 06/56] Create README.md --- README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..2ced7b5 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# Bank Management System: +First of all, whole code is written by me and nothing has been copy pasted fron anywhere. + +The project has Dependencies which are all open sourced (modules such as pickle, csv, mysql-connector) + +# Requirements: +1. Python 3 +2. MySQL workbench 8.0 + +because I've tested the code using these versions only... + +# Setup: +Run the file named "main.py" and follow the instructions of the program... + +# How to reset: +Open the file named "firsttime.txt" and change the value from False to True (case sensitive) + +# Troubleshooting: +1.I suspect that the people who haven't set a password for SQL may encounter an error. (will fix it later) + +I strongly suggest users to have a password set in MySQL. + +2.Check if the terminal shows the message "Connection established successfully" + +That means you entered your credentials properly + +3.Any other exception will pop up in the terminal... + +# About: +This project aims to create a bridge between Python and SQL and use it in real world problems/applications... + +This project is currently under development... + +# Done by: +Om J Shah From 328ecd92da259c79a4ee73e06003e8a2812de8c2 Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 22 Oct 2022 01:03:11 +0530 Subject: [PATCH 07/56] added readme --- README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..2ced7b5 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# Bank Management System: +First of all, whole code is written by me and nothing has been copy pasted fron anywhere. + +The project has Dependencies which are all open sourced (modules such as pickle, csv, mysql-connector) + +# Requirements: +1. Python 3 +2. MySQL workbench 8.0 + +because I've tested the code using these versions only... + +# Setup: +Run the file named "main.py" and follow the instructions of the program... + +# How to reset: +Open the file named "firsttime.txt" and change the value from False to True (case sensitive) + +# Troubleshooting: +1.I suspect that the people who haven't set a password for SQL may encounter an error. (will fix it later) + +I strongly suggest users to have a password set in MySQL. + +2.Check if the terminal shows the message "Connection established successfully" + +That means you entered your credentials properly + +3.Any other exception will pop up in the terminal... + +# About: +This project aims to create a bridge between Python and SQL and use it in real world problems/applications... + +This project is currently under development... + +# Done by: +Om J Shah From 2ac3e89da1aa101321b9831217ee035c3615da2c Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 23 Oct 2022 10:49:45 +0530 Subject: [PATCH 08/56] fixed major bugs (to continue if tables already exist) --- check.py | 2 +- firsttime.txt | 2 +- setup.py | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/check.py b/check.py index 885e2d4..d0aee5d 100644 --- a/check.py +++ b/check.py @@ -1,6 +1,6 @@ def check(): with open("firsttime.txt","r") as a: - if a.read()=="True": + if a.read().strip()=="True": return True else: return False \ No newline at end of file diff --git a/firsttime.txt b/firsttime.txt index 0ca9514..c1f22fb 100644 --- a/firsttime.txt +++ b/firsttime.txt @@ -1 +1 @@ -True +False \ No newline at end of file diff --git a/setup.py b/setup.py index a7ccb56..02412eb 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ import mysql.connector from mysql.connector import errorcode - +existing=0 TABLES = {} TABLES['employees'] = ( "CREATE TABLE `employees` (" @@ -109,6 +109,7 @@ def connectionquery(): return query def querycheck(): + global existing conn=connectionquery() ans=False if conn!="": @@ -125,6 +126,7 @@ def querycheck(): except mysql.connector.Error as err: if err.errno == errorcode.ER_TABLE_EXISTS_ERROR: print("already exists.") + existing+=1 else: print(err.msg) else: @@ -151,6 +153,7 @@ def mysqlsetup(): querycheck() def setup(): + global existing while check.check(): print("\n\n-----------------Welcome to the Project!!!-------------------") print("This is the setup process which runs when the user uses the program for the first time.") @@ -163,6 +166,10 @@ def setup(): break if ans2=="1": mysqlsetup() + if existing==6: + with open("firsttime.txt","w") as f: + f.write("False") + continue if ans2=="2": print("\nThis is under development :). Please use mysql till then...") elif ans2 != "1" or ans2 != "2": From 12a4aa147d8ebe34f2a59f3ed6de502ca47a311b Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 23 Oct 2022 10:57:23 +0530 Subject: [PATCH 09/56] added licence --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..77c0b10 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Om J Shah + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From bb1963c896cdbe8eed6ce730e7aa2c6b152ba327 Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 23 Oct 2022 13:03:02 +0530 Subject: [PATCH 10/56] Started creation of admin panel --- accounttype.py | 10 +-- adminpanel.py | 183 +++++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 4 +- 3 files changed, 190 insertions(+), 7 deletions(-) create mode 100644 adminpanel.py diff --git a/accounttype.py b/accounttype.py index 7ba0e27..05567cf 100644 --- a/accounttype.py +++ b/accounttype.py @@ -5,26 +5,26 @@ def acctype(): print("2.Employee.") print("3.Client.") print("Enter 0 to end process.") - a=int(input("\nEnter your account type:")) + a=input("\nEnter your account type:") - if a==1: + if a=='1': b=input("\nEnter admin password:") if b=="admin123": return 1 else: print("\nWrong password!\n") - elif a==2: + elif a=='2': b=input("\nEnter employee password:") if b=="emp123": return 2 else: print("\nWrong password!\n") - elif a==3: + elif a=='3': return 3 - elif a==0: + elif a=='0': print("\nShutting down the program.") break diff --git a/adminpanel.py b/adminpanel.py new file mode 100644 index 0000000..b305168 --- /dev/null +++ b/adminpanel.py @@ -0,0 +1,183 @@ +from datetime import date +from traceback import format_exc, format_exception + +def ap1(): + print("-------------Hire Employee Process-------------") + while True: + emp_no=input("Enter emp_no (max 5 int): ") + if len(emp_no) <= 5: + try: + emp_no=int(emp_no) + print("Done OK") + except ValueError: + print("emp_no should be an integer!!") + else: + break + else: + print("Maximum length is 5!") + + while True: + while True: + year=input("Enter birth year (4 int): ") + if len(year) == 4: + try: + year=int(year) + print("Done OK") + except ValueError: + print("year should be an integer!!") + else: + break + else: + print("Year consists of 4 integers!!") + + while True: + month=input("Enter birth month (2 int) (01 to 12): ") + if len(month) == 2: + try: + month=int(month) + print("Done OK") + except ValueError: + print("month should be an integer!!") + else: + break + else: + print("Month consists of 2 integers!!") + + while True: + day=input("Enter birth day (2 int) : ") + if len(day) == 2: + try: + day=int(day) + print("Done OK") + except ValueError: + print("Date should be an integer!!") + else: + break + else: + print("Date consists of 2 integers!!") + + try: + birth_date=date(year,month,day) + break + except ValueError: + import traceback + traceback.print_exc + + while True: + first_name=input("Enter first name (max 15 char)") + if len(first_name)<= 15: + break + else: + print("Max 15 characters") + + while True: + last_name=input("Enter last name (max 15 char)") + if len(last_name)<= 15: + break + else: + print("Max 15 characters") + + while True: + print("1.Male") + print("2.Female") + a=input("Enter choice (1 or 2):") + if a== '1': + gender='M' + break + elif a=='2': + gender='F' + break + else: + print("Wrong input!!") + + while True: + while True: + hyear=input("Enter hire year (4 int): ") + if len(hyear) == 4: + try: + hyear=int(hyear) + print("Done OK") + except ValueError: + print("year should be an integer!!") + else: + break + else: + print("Year consists of 4 integers!!") + + while True: + hmonth=input("Enter hire month (2 int) (01 to 12): ") + if len(hmonth) == 2: + try: + hmonth=int(hmonth) + print("Done OK") + except ValueError: + print("month should be an integer!!") + else: + break + else: + print("Month consists of 2 integers!!") + + while True: + hday=input("Enter hire day (2 int) (01 to 31): ") + if len(hday) == 2: + try: + hday=int(hday) + print("Done OK") + except ValueError: + print("Date should be an integer!!") + else: + break + else: + print("Date consists of 2 integers!!") + + try: + hire_date=date(hyear,hmonth,hday) + break + except ValueError: + import traceback + traceback.print_exc + + while True: + age=input("Enter employee age:") + if len(age) == 2: + try: + age=int(age) + print("Done OK") + except ValueError: + print("Age should be an integer!!") + else: + break + else: + print("Age consists of 2 integers!!") + + print("=========== Final Data ===========\n") + print(emp_no, + birth_date, + first_name, + last_name, + gender, + hire_date, + age) +ap1() + +# def ap(): +# print("\nWelcome Admin!!") + +# while True: +# print("\n---------------------Admin Panel-----------------------") +# print("\n1.Hire Employee") +# print("2.Fire Employee") +# print("3.Change employee data") +# print("\nInput 0 to quit.") +# a=input("Enter choice:") +# if a=='1': +# ap1() +# elif a=='2': +# ap2() +# elif a=='3': +# ap3() +# elif a=='0': +# print("Quit Admin Panel.") +# break +# else: +# print("Wrong input!(1,2,3)") \ No newline at end of file diff --git a/setup.py b/setup.py index 02412eb..9770efe 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ TABLES = {} TABLES['employees'] = ( "CREATE TABLE `employees` (" - " `emp_no` int(5) NOT NULL AUTO_INCREMENT," + " `emp_no` int(5) NOT NULL ," " `birth_date` date NOT NULL," " `first_name` varchar(15) NOT NULL," " `last_name` varchar(15) NOT NULL," @@ -20,7 +20,7 @@ TABLES['clients'] = ( "CREATE TABLE `clients` (" - " `acc_no` int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY," + " `acc_no` int(5) NOT NULL PRIMARY KEY," " `acc_type` enum('S','C') NOT NULL," " `first_name` varchar(15) NOT NULL," " `last_name` varchar(15) NOT NULL," From 248706ed3d42c46f03e98aa48564fddcb26644de Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 23 Oct 2022 16:03:36 +0530 Subject: [PATCH 11/56] Created algorithm for age checking --- adminpanel.py | 49 +++++++++++++++++++++++++------------------------ setup.py | 1 - 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/adminpanel.py b/adminpanel.py index b305168..6062003 100644 --- a/adminpanel.py +++ b/adminpanel.py @@ -1,8 +1,14 @@ from datetime import date -from traceback import format_exc, format_exception + +def age(birthdate): + today = date.today() + age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) + return age def ap1(): print("-------------Hire Employee Process-------------") + +#Employee number while True: emp_no=input("Enter emp_no (max 5 int): ") if len(emp_no) <= 5: @@ -15,7 +21,7 @@ def ap1(): break else: print("Maximum length is 5!") - +#Employee Birth date while True: while True: year=input("Enter birth year (4 int): ") @@ -58,11 +64,15 @@ def ap1(): try: birth_date=date(year,month,day) - break except ValueError: import traceback - traceback.print_exc - + traceback.print_exc() + else: + if age(birth_date)>=20: + break + else: + print("Employee must be atleast 20 years of age!!") +#Employee name while True: first_name=input("Enter first name (max 15 char)") if len(first_name)<= 15: @@ -76,7 +86,7 @@ def ap1(): break else: print("Max 15 characters") - +#Employee Gender while True: print("1.Male") print("2.Female") @@ -89,7 +99,7 @@ def ap1(): break else: print("Wrong input!!") - +#Employee hire date while True: while True: hyear=input("Enter hire year (4 int): ") @@ -132,32 +142,23 @@ def ap1(): try: hire_date=date(hyear,hmonth,hday) - break except ValueError: import traceback - traceback.print_exc - - while True: - age=input("Enter employee age:") - if len(age) == 2: - try: - age=int(age) - print("Done OK") - except ValueError: - print("Age should be an integer!!") - else: - break + traceback.print_exc() else: - print("Age consists of 2 integers!!") + if age(birth_date)-age(hire_date)>=20: + break + else: + print("Employee must atleast be 20 years of age!!") + - print("=========== Final Data ===========\n") + print("=========== Final Data ===========") print(emp_no, birth_date, first_name, last_name, gender, - hire_date, - age) + hire_date) ap1() # def ap(): diff --git a/setup.py b/setup.py index 9770efe..83b13f6 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,6 @@ " `last_name` varchar(15) NOT NULL," " `gender` enum('M','F') NOT NULL," " `hire_date` date NOT NULL," - " `age` int(2) NOT NULL," " PRIMARY KEY (`emp_no`)" ") ") From 3d455359ace1fab05849599fd590768a9bd0409b Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 23 Oct 2022 17:38:41 +0530 Subject: [PATCH 12/56] Sorted code to different modules --- accounttype.py | 3 +- adminpanel.py | 216 ++++++++---------------------------------------- hireemployee.py | 162 ++++++++++++++++++++++++++++++++++++ main.py | 4 +- 4 files changed, 202 insertions(+), 183 deletions(-) create mode 100644 hireemployee.py diff --git a/accounttype.py b/accounttype.py index 05567cf..ea63a0a 100644 --- a/accounttype.py +++ b/accounttype.py @@ -1,3 +1,4 @@ +import adminpanel def acctype(): while True: print("--------------Account Selector Menu--------------") @@ -10,7 +11,7 @@ def acctype(): if a=='1': b=input("\nEnter admin password:") if b=="admin123": - return 1 + adminpanel.ap() else: print("\nWrong password!\n") diff --git a/adminpanel.py b/adminpanel.py index 6062003..485315b 100644 --- a/adminpanel.py +++ b/adminpanel.py @@ -1,184 +1,40 @@ -from datetime import date - -def age(birthdate): - today = date.today() - age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) - return age - -def ap1(): - print("-------------Hire Employee Process-------------") - -#Employee number - while True: - emp_no=input("Enter emp_no (max 5 int): ") - if len(emp_no) <= 5: - try: - emp_no=int(emp_no) - print("Done OK") - except ValueError: - print("emp_no should be an integer!!") - else: - break - else: - print("Maximum length is 5!") -#Employee Birth date - while True: - while True: - year=input("Enter birth year (4 int): ") - if len(year) == 4: - try: - year=int(year) - print("Done OK") - except ValueError: - print("year should be an integer!!") - else: - break - else: - print("Year consists of 4 integers!!") - - while True: - month=input("Enter birth month (2 int) (01 to 12): ") - if len(month) == 2: - try: - month=int(month) - print("Done OK") - except ValueError: - print("month should be an integer!!") - else: - break - else: - print("Month consists of 2 integers!!") - - while True: - day=input("Enter birth day (2 int) : ") - if len(day) == 2: - try: - day=int(day) - print("Done OK") - except ValueError: - print("Date should be an integer!!") - else: - break - else: - print("Date consists of 2 integers!!") - - try: - birth_date=date(year,month,day) - except ValueError: - import traceback - traceback.print_exc() - else: - if age(birth_date)>=20: - break - else: - print("Employee must be atleast 20 years of age!!") -#Employee name - while True: - first_name=input("Enter first name (max 15 char)") - if len(first_name)<= 15: - break - else: - print("Max 15 characters") - - while True: - last_name=input("Enter last name (max 15 char)") - if len(last_name)<= 15: - break - else: - print("Max 15 characters") -#Employee Gender +import pickle +import mysql.connector +import hireemployee + +def cursor(): + cred = open("cred.dat","rb") + dat=pickle.load(cred) + cred.close() + Passwo=dat[0] + Databa=dat[1] + query=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) + return query.cursor() + +def ap2(): + print("ap2") + +def ap3(): + print("ap3") + +def ap(): + print("\nWelcome Admin!!") + while True: - print("1.Male") - print("2.Female") - a=input("Enter choice (1 or 2):") - if a== '1': - gender='M' - break + print("\n---------------------Admin Panel-----------------------") + print("\n1.Hire Employee") + print("2.Fire Employee") + print("3.Change employee data") + print("\nInput 0 to quit.") + a=input("Enter choice:") + if a=='1': + hireemployee.ap1() elif a=='2': - gender='F' + ap2() + elif a=='3': + ap3() + elif a=='0': + print("Quit Admin Panel.") break else: - print("Wrong input!!") -#Employee hire date - while True: - while True: - hyear=input("Enter hire year (4 int): ") - if len(hyear) == 4: - try: - hyear=int(hyear) - print("Done OK") - except ValueError: - print("year should be an integer!!") - else: - break - else: - print("Year consists of 4 integers!!") - - while True: - hmonth=input("Enter hire month (2 int) (01 to 12): ") - if len(hmonth) == 2: - try: - hmonth=int(hmonth) - print("Done OK") - except ValueError: - print("month should be an integer!!") - else: - break - else: - print("Month consists of 2 integers!!") - - while True: - hday=input("Enter hire day (2 int) (01 to 31): ") - if len(hday) == 2: - try: - hday=int(hday) - print("Done OK") - except ValueError: - print("Date should be an integer!!") - else: - break - else: - print("Date consists of 2 integers!!") - - try: - hire_date=date(hyear,hmonth,hday) - except ValueError: - import traceback - traceback.print_exc() - else: - if age(birth_date)-age(hire_date)>=20: - break - else: - print("Employee must atleast be 20 years of age!!") - - - print("=========== Final Data ===========") - print(emp_no, - birth_date, - first_name, - last_name, - gender, - hire_date) -ap1() - -# def ap(): -# print("\nWelcome Admin!!") - -# while True: -# print("\n---------------------Admin Panel-----------------------") -# print("\n1.Hire Employee") -# print("2.Fire Employee") -# print("3.Change employee data") -# print("\nInput 0 to quit.") -# a=input("Enter choice:") -# if a=='1': -# ap1() -# elif a=='2': -# ap2() -# elif a=='3': -# ap3() -# elif a=='0': -# print("Quit Admin Panel.") -# break -# else: -# print("Wrong input!(1,2,3)") \ No newline at end of file + print("Wrong input!(1,2,3)") \ No newline at end of file diff --git a/hireemployee.py b/hireemployee.py new file mode 100644 index 0000000..0ec18ff --- /dev/null +++ b/hireemployee.py @@ -0,0 +1,162 @@ +from datetime import date +def age(birthdate): + today = date.today() + age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) + return age + +def ap1(): + print("-------------Hire Employee Process-------------") + +#Employee number + while True: + emp_no=input("Enter emp_no (max 5 int): ") + if len(emp_no) <= 5: + try: + emp_no=int(emp_no) + print("Done OK") + except ValueError: + print("emp_no should be an integer!!") + else: + break + else: + print("Maximum length is 5!") +#Employee Birth date + while True: + while True: + year=input("Enter birth year (4 int): ") + if len(year) == 4: + try: + year=int(year) + print("Done OK") + except ValueError: + print("year should be an integer!!") + else: + break + else: + print("Year consists of 4 integers!!") + + while True: + month=input("Enter birth month (2 int) (01 to 12): ") + if len(month) == 2: + try: + month=int(month) + print("Done OK") + except ValueError: + print("month should be an integer!!") + else: + break + else: + print("Month consists of 2 integers!!") + + while True: + day=input("Enter birth day (2 int) : ") + if len(day) == 2: + try: + day=int(day) + print("Done OK") + except ValueError: + print("Date should be an integer!!") + else: + break + else: + print("Date consists of 2 integers!!") + + try: + birth_date=date(year,month,day) + except ValueError: + import traceback + traceback.print_exc() + else: + if age(birth_date)>=20: + break + else: + print("Employee must be atleast 20 years of age!!") +#Employee name + while True: + first_name=input("Enter first name (max 15 char)") + if len(first_name)<= 15: + break + else: + print("Max 15 characters") + + while True: + last_name=input("Enter last name (max 15 char)") + if len(last_name)<= 15: + break + else: + print("Max 15 characters") +#Employee Gender + while True: + print("1.Male") + print("2.Female") + a=input("Enter choice (1 or 2):") + if a== '1': + gender='M' + break + elif a=='2': + gender='F' + break + else: + print("Wrong input!!") +#Employee hire date + while True: + while True: + hyear=input("Enter hire year (4 int): ") + if len(hyear) == 4: + try: + hyear=int(hyear) + print("Done OK") + except ValueError: + print("year should be an integer!!") + else: + break + else: + print("Year consists of 4 integers!!") + + while True: + hmonth=input("Enter hire month (2 int) (01 to 12): ") + if len(hmonth) == 2: + try: + hmonth=int(hmonth) + print("Done OK") + except ValueError: + print("month should be an integer!!") + else: + break + else: + print("Month consists of 2 integers!!") + + while True: + hday=input("Enter hire day (2 int) (01 to 31): ") + if len(hday) == 2: + try: + hday=int(hday) + print("Done OK") + except ValueError: + print("Date should be an integer!!") + else: + break + else: + print("Date consists of 2 integers!!") + + try: + hire_date=date(hyear,hmonth,hday) + except ValueError: + import traceback + traceback.print_exc() + else: + if age(birth_date)-age(hire_date)>=20: + break + else: + print("Employee must atleast be 20 years of age!!") + + + print("=========== Final Data ===========") + x=(emp_no, + birth_date, + first_name, + last_name, + gender, + hire_date) + print(x) + return x \ No newline at end of file diff --git a/main.py b/main.py index 6622f9a..2e0c186 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,3 @@ import setup - -connection=setup.setup() +def getconnection(): + return setup.setup() From 144085735033ef8737b508ee5a42662a173a98b5 Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 23 Oct 2022 20:10:00 +0530 Subject: [PATCH 13/56] Added functionality to add data to the sql table --- adminpanel.py | 10 ---------- hireemployee.py | 33 +++++++++++++++++++++++++-------- main.py | 5 +++-- setup.py | 2 +- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/adminpanel.py b/adminpanel.py index 485315b..e7dead5 100644 --- a/adminpanel.py +++ b/adminpanel.py @@ -1,15 +1,5 @@ -import pickle -import mysql.connector import hireemployee -def cursor(): - cred = open("cred.dat","rb") - dat=pickle.load(cred) - cred.close() - Passwo=dat[0] - Databa=dat[1] - query=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) - return query.cursor() def ap2(): print("ap2") diff --git a/hireemployee.py b/hireemployee.py index 0ec18ff..74ca109 100644 --- a/hireemployee.py +++ b/hireemployee.py @@ -1,9 +1,20 @@ from datetime import date +import pickle +import mysql.connector + def age(birthdate): today = date.today() age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) return age +cred = open("cred.dat","rb") +dat=pickle.load(cred) +cred.close() +Passwo=dat[0] +Databa=dat[1] +query=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) +cur=query.cursor() + def ap1(): print("-------------Hire Employee Process-------------") @@ -152,11 +163,17 @@ def ap1(): print("=========== Final Data ===========") - x=(emp_no, - birth_date, - first_name, - last_name, - gender, - hire_date) - print(x) - return x \ No newline at end of file + print(emp_no,birth_date,first_name,last_name,gender,hire_date) + add_employee=("INSERT INTO employees " + "(emp_no,birth_date,first_name,last_name,gender,hire_date) " + "VALUES (%s,%s,%s,%s,%s,%s)") + data_employee=(emp_no,birth_date,first_name,last_name,gender,hire_date) + try: + cur.execute(add_employee, data_employee) + query.commit() + cur.close() + query.close() + except mysql.connector.Error as err: + print(err.msg()) + else: + print("Values added successfully!!") \ No newline at end of file diff --git a/main.py b/main.py index 2e0c186..9a47edf 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,4 @@ import setup -def getconnection(): - return setup.setup() +import accounttype +conn=setup.setup() +accounttype.acctype() \ No newline at end of file diff --git a/setup.py b/setup.py index 83b13f6..8c04424 100644 --- a/setup.py +++ b/setup.py @@ -127,7 +127,7 @@ def querycheck(): print("already exists.") existing+=1 else: - print(err.msg) + print(err.msg()) else: print("OK") with open("firsttime.txt","w") as f: From c18b1a9c401da7475aed7833de96413127f001b3 Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 29 Oct 2022 18:14:04 +0530 Subject: [PATCH 14/56] Added fire employee process... --- fireemployee.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ hireemployee.py | 12 ++++++------ 2 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 fireemployee.py diff --git a/fireemployee.py b/fireemployee.py new file mode 100644 index 0000000..183130e --- /dev/null +++ b/fireemployee.py @@ -0,0 +1,44 @@ +import mysql.connector +import pickle + +cred = open("cred.dat","rb") +dat=pickle.load(cred) +cred.close() +Passwo=dat[0] +Databa=dat[1] +conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) +cur=conn.cursor() + +def ap2(): + print("---------Fire employee process----------\n") + while True: + emp_no=input(("Enter emp_no of the employee to fire them: ")) + if len(emp_no) <= 5: + try: + emp_no=int(emp_no) + print("Checking...") + except ValueError: + print("emp_no should be an integer!!") + else: + break + else: + print("Maximum length is 5!") + + query="delete from employees where emp_no = {}".format(emp_no) + cur.execute("select emp_no from employees") + record=cur.fetchall() + changed=False + for r in record: + if r[0]==emp_no: + try: + cur.execute(query) + conn.commit() + changed=True + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------\n") + else: + print("Employee fired successfully...\n") + if not changed: + print("The employee number does not exist.") + print("------------Could not fire employee-----------\n") \ No newline at end of file diff --git a/hireemployee.py b/hireemployee.py index 74ca109..ca0bbd1 100644 --- a/hireemployee.py +++ b/hireemployee.py @@ -84,14 +84,14 @@ def ap1(): print("Employee must be atleast 20 years of age!!") #Employee name while True: - first_name=input("Enter first name (max 15 char)") + first_name=input("Enter first name (max 15 char): ") if len(first_name)<= 15: break else: print("Max 15 characters") while True: - last_name=input("Enter last name (max 15 char)") + last_name=input("Enter last name (max 15 char): ") if len(last_name)<= 15: break else: @@ -171,9 +171,9 @@ def ap1(): try: cur.execute(add_employee, data_employee) query.commit() - cur.close() - query.close() except mysql.connector.Error as err: - print(err.msg()) + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") else: - print("Values added successfully!!") \ No newline at end of file + print("Values added successfully!!") +ap1() \ No newline at end of file From bee5139923a44e38362e9eda3495bc046a877394 Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 29 Oct 2022 18:32:29 +0530 Subject: [PATCH 15/56] Fixed minor bugs... --- adminpanel.py | 7 ++----- hireemployee.py | 3 +-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/adminpanel.py b/adminpanel.py index e7dead5..a252887 100644 --- a/adminpanel.py +++ b/adminpanel.py @@ -1,8 +1,5 @@ import hireemployee - - -def ap2(): - print("ap2") +import fireemployee def ap3(): print("ap3") @@ -20,7 +17,7 @@ def ap(): if a=='1': hireemployee.ap1() elif a=='2': - ap2() + fireemployee.ap2() elif a=='3': ap3() elif a=='0': diff --git a/hireemployee.py b/hireemployee.py index ca0bbd1..8ad848f 100644 --- a/hireemployee.py +++ b/hireemployee.py @@ -175,5 +175,4 @@ def ap1(): print(err.msg) print("-----------Value addition was unsuccessful!!!!-------------") else: - print("Values added successfully!!") -ap1() \ No newline at end of file + print("Values added successfully!!") \ No newline at end of file From d778cbdb22f467271fd96ce681e9198e9776cb97 Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 29 Oct 2022 20:58:57 +0530 Subject: [PATCH 16/56] added new method (temporary commit) --- editemployee.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 editemployee.py diff --git a/editemployee.py b/editemployee.py new file mode 100644 index 0000000..41d530c --- /dev/null +++ b/editemployee.py @@ -0,0 +1,42 @@ +import mysql.connector +import pickle + +cred = open("cred.dat","rb") +dat=pickle.load(cred) +cred.close() +Passwo=dat[0] +Databa=dat[1] +conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) +cur=conn.cursor() + +def ap3(): + print("---------Edit employee process----------\n") + while True: + emp_no=input(("Enter emp_no of the employee to edit the details: ")) + if len(emp_no) <= 5: + try: + emp_no=int(emp_no) + print("Checking...") + except ValueError: + print("emp_no should be an integer!!") + else: + break + else: + print("Maximum length is 5!") + cur.execute("select * from employees where emp_no={}".format(emp_no)) + results=cur.fetchall() + if results == []: + print("That employee number does not exist.") + else: + print(results) +ap3() + +def f2(): + print("1.emp_no") + print("2.birth_date") + print("3.first_name") + print("4.last-name") + print("5.gender") + print("6.hire_date") + print("0 to quit.") + a=input("What would you like to change from the above:") \ No newline at end of file From da92cf48b62902c9f32f3a74b8a62146bcc95865 Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 5 Nov 2022 21:20:23 +0530 Subject: [PATCH 17/56] Completed editemployee file --- .gitignore | 3 +- adminpanel.py | 6 +- editemployee.py | 260 +++++++++++++++++++++++++++++++++++++++++++++--- fireemployee.py | 20 ++-- hireemployee.py | 19 ++-- 5 files changed, 268 insertions(+), 40 deletions(-) diff --git a/.gitignore b/.gitignore index e0acd6b..20074ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ __pycache__/ firsttime.txt cred.dat -links.txt \ No newline at end of file +links.txt +tempCodeRunnerFile.py \ No newline at end of file diff --git a/adminpanel.py b/adminpanel.py index a252887..9106253 100644 --- a/adminpanel.py +++ b/adminpanel.py @@ -1,8 +1,6 @@ import hireemployee import fireemployee - -def ap3(): - print("ap3") +import editemployee def ap(): print("\nWelcome Admin!!") @@ -19,7 +17,7 @@ def ap(): elif a=='2': fireemployee.ap2() elif a=='3': - ap3() + editemployee.ap3() elif a=='0': print("Quit Admin Panel.") break diff --git a/editemployee.py b/editemployee.py index 41d530c..7d94809 100644 --- a/editemployee.py +++ b/editemployee.py @@ -1,15 +1,31 @@ import mysql.connector import pickle +from datetime import date -cred = open("cred.dat","rb") -dat=pickle.load(cred) -cred.close() -Passwo=dat[0] -Databa=dat[1] -conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) -cur=conn.cursor() +def age(birthdate): + today = date.today() + age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) + return age +cur=None +conn=None +emp_no=0 +hire_date=None +birth_date=None def ap3(): + global cur + global conn + cred = open("cred.dat","rb") + dat=pickle.load(cred) + cred.close() + Passwo=dat[0] + Databa=dat[1] + conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) + cur=conn.cursor() + + global emp_no + global birth_date + global hire_date print("---------Edit employee process----------\n") while True: emp_no=input(("Enter emp_no of the employee to edit the details: ")) @@ -26,17 +42,229 @@ def ap3(): cur.execute("select * from employees where emp_no={}".format(emp_no)) results=cur.fetchall() if results == []: + print(results) print("That employee number does not exist.") else: - print(results) -ap3() + results1=results[0] + print("1.emp_no:",results1[0]) + print("2.birth_date:",results1[1]) + print("3.first_name:",results1[2]) + print("4.last-name:",results1[3]) + print("5.gender:",results1[4]) + print("6.hire_date:",results1[5]) + birth_date=results1[1] + hire_date=results1[5] + f2() def f2(): - print("1.emp_no") - print("2.birth_date") - print("3.first_name") - print("4.last-name") - print("5.gender") - print("6.hire_date") + global emp_no + global birth_date + global hire_date print("0 to quit.") - a=input("What would you like to change from the above:") \ No newline at end of file + a=input("What would you like to change from the above:") + if a == '1': + while True: + en=input("Enter emp_no (max 5 int): ") + if len(en) <= 5: + try: + en=int(en) + print("Done OK") + except ValueError: + print("emp_no should be an integer!!") + else: + try: + cur.execute("update employees set emp_no={} where emp_no={}".format(en,emp_no)) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") + else: + print("Updated employee number...") + break + else: + print("Maximum length is 5!") + if a == '2': + while True: + while True: + year=input("Enter birth year (4 int): ") + if len(year) == 4: + try: + year=int(year) + print("Done OK") + except ValueError: + print("year should be an integer!!") + else: + break + else: + print("Year consists of 4 integers!!") + + while True: + month=input("Enter birth month (2 int) (01 to 12): ") + if len(month) == 2: + try: + month=int(month) + print("Done OK") + except ValueError: + print("month should be an integer!!") + else: + break + else: + print("Month consists of 2 integers!!") + + while True: + day=input("Enter birth day (2 int) : ") + if len(day) == 2: + try: + day=int(day) + print("Done OK") + except ValueError: + print("Date should be an integer!!") + else: + break + else: + print("Date consists of 2 integers!!") + + try: + birth_date=date(year,month,day) + except ValueError: + import traceback + traceback.print_exc() + else: + if age(birth_date)>=20: + if age(birth_date)-age(hire_date)>=20: + try: + cur.execute("update employees set birth_date='{}' where emp_no={}".format(birth_date,emp_no)) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") + break + else: + print("Updated birth date...") + break + else: + print("Employee must be atleast 20 years of age when hired!!") + print(birth_date,": birth_date") + print(hire_date,":hire date you entered") + else: + print("Employee must be atleast 20 years of age!!") + if a == '3': + while True: + first_name=input("Enter first name (max 15 char): ") + if len(first_name)<= 15: + try: + cur.execute("update employees set first_name={} where emp_no={}".format(first_name,emp_no)) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") + break + else: + print("Updated first name...") + break + else: + print("Max 15 characters") + + if a == '4': + while True: + last_name=input("Enter last name (max 15 char): ") + if len(last_name)<= 15: + try: + cur.execute("update employees set last_name={} where emp_no={}".format(last_name,emp_no)) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") + break + else: + print("Updated last name...") + break + else: + print("Max 15 characters") + if a == '5': + while True: + print("1.Male") + print("2.Female") + a=input("Enter choice (1 or 2):") + if a== '1': + try: + cur.execute("update employees set gender='M' where emp_no={}".format(emp_no)) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") + break + else: + print("Updated first name...") + break + + elif a=='2': + gender='F' + try: + cur.execute("update employees set gender='F' where emp_no={}".format(emp_no)) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") + break + else: + print("Updated first name...") + break + + else: + print("Wrong input!!") + + if a == '6': + while True: + while True: + hyear=input("Enter hire year (4 int): ") + if len(hyear) == 4: + try: + hyear=int(hyear) + print("Done OK") + except ValueError: + print("year should be an integer!!") + else: + break + else: + print("Year consists of 4 integers!!") + + while True: + hmonth=input("Enter hire month (2 int) (01 to 12): ") + if len(hmonth) == 2: + try: + hmonth=int(hmonth) + print("Done OK") + except ValueError: + print("month should be an integer!!") + else: + break + else: + print("Month consists of 2 integers!!") + + while True: + hday=input("Enter hire day (2 int) (01 to 31): ") + if len(hday) == 2: + try: + hday=int(hday) + print("Done OK") + except ValueError: + print("Date should be an integer!!") + else: + break + else: + print("Date consists of 2 integers!!") + + try: + hire_date=date(hyear,hmonth,hday) + except ValueError: + import traceback + traceback.print_exc() + else: + if age(birth_date)-age(hire_date)>=20: + break + else: + print("Employee must atleast be 20 years of age!!") + + cur.close() + conn.close() \ No newline at end of file diff --git a/fireemployee.py b/fireemployee.py index 183130e..0881743 100644 --- a/fireemployee.py +++ b/fireemployee.py @@ -1,15 +1,13 @@ import mysql.connector import pickle - -cred = open("cred.dat","rb") -dat=pickle.load(cred) -cred.close() -Passwo=dat[0] -Databa=dat[1] -conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) -cur=conn.cursor() - def ap2(): + cred = open("cred.dat","rb") + dat=pickle.load(cred) + cred.close() + Passwo=dat[0] + Databa=dat[1] + conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) + cur=conn.cursor() print("---------Fire employee process----------\n") while True: emp_no=input(("Enter emp_no of the employee to fire them: ")) @@ -41,4 +39,6 @@ def ap2(): print("Employee fired successfully...\n") if not changed: print("The employee number does not exist.") - print("------------Could not fire employee-----------\n") \ No newline at end of file + print("------------Could not fire employee-----------\n") + cur.close() + conn.close() \ No newline at end of file diff --git a/hireemployee.py b/hireemployee.py index 8ad848f..e134392 100644 --- a/hireemployee.py +++ b/hireemployee.py @@ -7,15 +7,14 @@ def age(birthdate): age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) return age -cred = open("cred.dat","rb") -dat=pickle.load(cred) -cred.close() -Passwo=dat[0] -Databa=dat[1] -query=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) -cur=query.cursor() - def ap1(): + cred = open("cred.dat","rb") + dat=pickle.load(cred) + cred.close() + Passwo=dat[0] + Databa=dat[1] + query=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) + cur=query.cursor() print("-------------Hire Employee Process-------------") #Employee number @@ -175,4 +174,6 @@ def ap1(): print(err.msg) print("-----------Value addition was unsuccessful!!!!-------------") else: - print("Values added successfully!!") \ No newline at end of file + print("Values added successfully!!") + cur.close() + query.close() \ No newline at end of file From f066fd2f9994046f8334a2eaaeb7b89bc5214ad2 Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 5 Nov 2022 23:59:10 +0530 Subject: [PATCH 18/56] Fixed bugs and completed admin panel and functions --- .gitignore | 3 ++- adminpanel.py | 4 ++++ editemployee.py | 12 +++++++++--- hireemployee.py | 12 +++++++++--- showemployee.py | 20 ++++++++++++++++++++ 5 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 showemployee.py diff --git a/.gitignore b/.gitignore index 20074ee..d510687 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ __pycache__/ firsttime.txt cred.dat links.txt -tempCodeRunnerFile.py \ No newline at end of file +tempCodeRunnerFile.py +start program.bat \ No newline at end of file diff --git a/adminpanel.py b/adminpanel.py index 9106253..6650314 100644 --- a/adminpanel.py +++ b/adminpanel.py @@ -1,6 +1,7 @@ import hireemployee import fireemployee import editemployee +import showemployee def ap(): print("\nWelcome Admin!!") @@ -10,6 +11,7 @@ def ap(): print("\n1.Hire Employee") print("2.Fire Employee") print("3.Change employee data") + print("4.Show employee table") print("\nInput 0 to quit.") a=input("Enter choice:") if a=='1': @@ -18,6 +20,8 @@ def ap(): fireemployee.ap2() elif a=='3': editemployee.ap3() + elif a=='4': + showemployee.ap4() elif a=='0': print("Quit Admin Panel.") break diff --git a/editemployee.py b/editemployee.py index 7d94809..86feffe 100644 --- a/editemployee.py +++ b/editemployee.py @@ -57,6 +57,8 @@ def ap3(): f2() def f2(): + global cur + global conn global emp_no global birth_date global hire_date @@ -130,7 +132,7 @@ def f2(): import traceback traceback.print_exc() else: - if age(birth_date)>=20: + if age(birth_date)>=20 and age(birth_date)<=60: if age(birth_date)-age(hire_date)>=20: try: cur.execute("update employees set birth_date='{}' where emp_no={}".format(birth_date,emp_no)) @@ -147,7 +149,11 @@ def f2(): print(birth_date,": birth_date") print(hire_date,":hire date you entered") else: - print("Employee must be atleast 20 years of age!!") + if age(birth_date)<20: + print("Employee must be atleast 20 years of age!!") + else: + print("Maximum age is 60 years!!!") + print("\nwrong input\n") if a == '3': while True: first_name=input("Enter first name (max 15 char): ") @@ -264,7 +270,7 @@ def f2(): if age(birth_date)-age(hire_date)>=20: break else: - print("Employee must atleast be 20 years of age!!") + print("Employee must atleast be 20 years of age when hired!!") cur.close() conn.close() \ No newline at end of file diff --git a/hireemployee.py b/hireemployee.py index e134392..a386fdb 100644 --- a/hireemployee.py +++ b/hireemployee.py @@ -77,10 +77,14 @@ def ap1(): import traceback traceback.print_exc() else: - if age(birth_date)>=20: + if age(birth_date)>=20 and age(birth_date)<=60: break else: - print("Employee must be atleast 20 years of age!!") + if age(birth_date)<20: + print("Employee must be atleast 20 years of age!!") + else: + print("Maximum age is 60 years!!!") + print("\nwrong input\n") #Employee name while True: first_name=input("Enter first name (max 15 char): ") @@ -155,7 +159,9 @@ def ap1(): import traceback traceback.print_exc() else: - if age(birth_date)-age(hire_date)>=20: + if age(hire_date)>60: + print("Employee must be below 60 years of age!!") + elif age(birth_date)-age(hire_date)>=20: break else: print("Employee must atleast be 20 years of age!!") diff --git a/showemployee.py b/showemployee.py new file mode 100644 index 0000000..3d49304 --- /dev/null +++ b/showemployee.py @@ -0,0 +1,20 @@ +import mysql.connector +import pickle +def ap4(): + cred = open("cred.dat","rb") + dat=pickle.load(cred) + cred.close() + Passwo=dat[0] + Databa=dat[1] + conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) + cur=conn.cursor() + cur.execute("select * from employees") + results=cur.fetchall() + print("---------------------------------------------------------------------------------------") + print("|","%7s"%"EMP_NO","|","%11s"%"BIRTH_DATE","|","%16s"%"FIRST_NAME","|","%16s"%"LAST_NAME","|","%7s"%"GENDER","|","%11s"%"HIRE_DATE","|") + for row in results: + print("---------------------------------------------------------------------------------------") + print("|","%7s"%row[0],"|","%11s"%row[1],"|","%16s"%row[2],"|","%16s"%row[3],"|","%7s"%row[4],"|","%11s"%row[5],"|") + cur.close() + conn.close() + print("---------------------------------------------------------------------------------------") \ No newline at end of file From 53644cd1f521ff7a9cc82453d64033de43afe0db Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 6 Nov 2022 00:20:47 +0530 Subject: [PATCH 19/56] Fixed minor bug --- main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 9a47edf..ca62589 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,6 @@ import setup +from check import check import accounttype conn=setup.setup() -accounttype.acctype() \ No newline at end of file +if not check: + accounttype.acctype() \ No newline at end of file From 69760af68797e2343846374575c4286ee7a5d500 Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 6 Nov 2022 00:27:17 +0530 Subject: [PATCH 20/56] Fixed minor bug --- main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index ca62589..677940c 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,6 @@ import setup -from check import check +import check import accounttype conn=setup.setup() -if not check: - accounttype.acctype() \ No newline at end of file +if not check.check(): + accounttype.acctype() From bc9925a7d3aeddb31d2369bd0a1ec114b3513d8d Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 6 Nov 2022 17:52:30 +0530 Subject: [PATCH 21/56] fixed major bugs, added password for employees --- check.py | 15 ++++++++++----- editemployee.py | 39 +++++++++++++++++++++++++++++++++++++-- fireemployee.py | 4 ++-- hireemployee.py | 16 ++++++++++++++++ main.py | 9 ++++++--- setup.py | 27 ++++++++++++++++++++++----- 6 files changed, 93 insertions(+), 17 deletions(-) diff --git a/check.py b/check.py index d0aee5d..0dbeb76 100644 --- a/check.py +++ b/check.py @@ -1,6 +1,11 @@ def check(): - with open("firsttime.txt","r") as a: - if a.read().strip()=="True": - return True - else: - return False \ No newline at end of file + try: + with open("firsttime.txt","r") as a: + if a.read().strip()=="True": + return True + else: + return False + except FileNotFoundError: + with open("firsttime.txt","w") as a: + a.write("True") + return True \ No newline at end of file diff --git a/editemployee.py b/editemployee.py index 86feffe..5d890f1 100644 --- a/editemployee.py +++ b/editemployee.py @@ -52,6 +52,7 @@ def ap3(): print("4.last-name:",results1[3]) print("5.gender:",results1[4]) print("6.hire_date:",results1[5]) + print("7.password") birth_date=results1[1] hire_date=results1[5] f2() @@ -268,9 +269,43 @@ def f2(): traceback.print_exc() else: if age(birth_date)-age(hire_date)>=20: - break + try: + cur.execute("update employees set hire_date='{}' where emp_no={}".format(hire_date,emp_no)) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") + break + else: + print("Updated hire date...") + break else: print("Employee must atleast be 20 years of age when hired!!") - + if a=='7': + print("1.Show the password") + print("2.Change the password") + ans=input("Enter your choice (1,2):") + if ans=='1': + cur.execute("SELECT pass from empass where emp_no={}".format(emp_no)) + result=cur.fetchall() + print(result[0][0], "is the password.") + elif ans=='2': + while True: + password=input("Enter employee login password(max 8 characters, min 4): ") + lp=len(password) + if lp>8: + print("Max 8 characters only.") + elif lp<4: + print("Minimum 4 characters to be entered.") + else: + try: + cur.execute("UPDATE empass set pass=LPAD({},{},'0') where emp_no={}".format(password,lp,emp_no)) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Password change was unsuccessful!!!!-------------") + else: + print("Password changed successfully!!!") + break cur.close() conn.close() \ No newline at end of file diff --git a/fireemployee.py b/fireemployee.py index 0881743..2d82668 100644 --- a/fireemployee.py +++ b/fireemployee.py @@ -22,7 +22,7 @@ def ap2(): else: print("Maximum length is 5!") - query="delete from employees where emp_no = {}".format(emp_no) + query="delete from employees,empass where emp_no = {}".format(emp_no) cur.execute("select emp_no from employees") record=cur.fetchall() changed=False @@ -34,7 +34,7 @@ def ap2(): changed=True except mysql.connector.Error as err: print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------\n") + print("-----------Value deletion was unsuccessful!!!!-------------\n") else: print("Employee fired successfully...\n") if not changed: diff --git a/hireemployee.py b/hireemployee.py index a386fdb..bdddba5 100644 --- a/hireemployee.py +++ b/hireemployee.py @@ -181,5 +181,21 @@ def ap1(): print("-----------Value addition was unsuccessful!!!!-------------") else: print("Values added successfully!!") + while True: + password=input("Enter employee login password(max 8 characters, min 4): ") + if len(password)>8: + print("Max 8 characters only.") + elif len(password)<4: + print("Minimum 4 characters to be entered.") + else: + try: + cur.execute("INSERT INTO empass values({},LPAD({},{},'0')".format(emp_no,password,len(password))) + query.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Password addition was unsuccessful!!!!-------------") + else: + print("Password added successfully!!!") + break cur.close() query.close() \ No newline at end of file diff --git a/main.py b/main.py index 677940c..1822858 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,9 @@ import setup import check import accounttype -conn=setup.setup() -if not check.check(): - accounttype.acctype() +while True: + if not check.check(): + accounttype.acctype() + break + else: + setup.setup() diff --git a/setup.py b/setup.py index 8c04424..61ce1b6 100644 --- a/setup.py +++ b/setup.py @@ -5,6 +5,10 @@ from mysql.connector import errorcode existing=0 + +conn=None +cursor=None + TABLES = {} TABLES['employees'] = ( "CREATE TABLE `employees` (" @@ -27,10 +31,21 @@ " `birth_date` date NOT NULL," " `acc_creation_date` date NOT NULL," " `mobile_no` int(10) NOT NULL," - " `email_id` varchar(25) NOT NULL" + " `email_id` varchar(25) NOT NULL," + " `pass` varchar(8) NOT NULL" + ") " +) + +TABLES['empass'] = ( + "CREATE TABLE `empass` (" + " `emp_no` int(5) NOT NULL," + " `pass` varchar(8) NOT NULL," + " PRIMARY KEY (`emp_no`)," + " FOREIGN KEY(`emp_no`) REFERENCES employees(emp_no)" ") " ) + TABLES['savings'] = ( "CREATE TABLE `savings` (" " `acc_no` int(5) NOT NULL," @@ -108,6 +123,8 @@ def connectionquery(): return query def querycheck(): + global conn + global cursor global existing conn=connectionquery() ans=False @@ -130,8 +147,6 @@ def querycheck(): print(err.msg()) else: print("OK") - with open("firsttime.txt","w") as f: - f.write("False") ans=True if not ans: @@ -152,6 +167,8 @@ def mysqlsetup(): querycheck() def setup(): + global cursor + global conn global existing while check.check(): print("\n\n-----------------Welcome to the Project!!!-------------------") @@ -165,7 +182,7 @@ def setup(): break if ans2=="1": mysqlsetup() - if existing==6: + if existing==7: with open("firsttime.txt","w") as f: f.write("False") continue @@ -175,4 +192,4 @@ def setup(): print("\nWrong input, (1/2).........") else: if querycheck(): - connectionquery() + return True \ No newline at end of file From 490e3f71ecbec8ceb21c544ef5c8447e8c6815d3 Mon Sep 17 00:00:00 2001 From: Om Date: Tue, 8 Nov 2022 16:46:06 +0530 Subject: [PATCH 22/56] fixed many bugs --- editemployee.py | 8 ++++---- fireemployee.py | 5 ++++- hireemployee.py | 7 ++++--- main.py | 15 ++++++++++++--- setup.py | 8 +++++--- showemployee.py | 6 +++--- 6 files changed, 32 insertions(+), 17 deletions(-) diff --git a/editemployee.py b/editemployee.py index 5d890f1..6c7381d 100644 --- a/editemployee.py +++ b/editemployee.py @@ -160,7 +160,7 @@ def f2(): first_name=input("Enter first name (max 15 char): ") if len(first_name)<= 15: try: - cur.execute("update employees set first_name={} where emp_no={}".format(first_name,emp_no)) + cur.execute("update employees set first_name='{}' where emp_no={}".format(first_name,emp_no)) conn.commit() except mysql.connector.Error as err: print(err.msg) @@ -177,7 +177,7 @@ def f2(): last_name=input("Enter last name (max 15 char): ") if len(last_name)<= 15: try: - cur.execute("update employees set last_name={} where emp_no={}".format(last_name,emp_no)) + cur.execute("update employees set last_name='{}' where emp_no={}".format(last_name,emp_no)) conn.commit() except mysql.connector.Error as err: print(err.msg) @@ -202,7 +202,7 @@ def f2(): print("-----------Value addition was unsuccessful!!!!-------------") break else: - print("Updated first name...") + print("Updated gender...") break elif a=='2': @@ -215,7 +215,7 @@ def f2(): print("-----------Value addition was unsuccessful!!!!-------------") break else: - print("Updated first name...") + print("Updated gender...") break else: diff --git a/fireemployee.py b/fireemployee.py index 2d82668..01f76cd 100644 --- a/fireemployee.py +++ b/fireemployee.py @@ -22,13 +22,16 @@ def ap2(): else: print("Maximum length is 5!") - query="delete from employees,empass where emp_no = {}".format(emp_no) + query="delete from employees where emp_no = {}".format(emp_no) + query2="delete from empass where emp_no = {}".format(emp_no) cur.execute("select emp_no from employees") record=cur.fetchall() changed=False for r in record: if r[0]==emp_no: try: + cur.execute(query2) + conn.commit() cur.execute(query) conn.commit() changed=True diff --git a/hireemployee.py b/hireemployee.py index bdddba5..9af8f14 100644 --- a/hireemployee.py +++ b/hireemployee.py @@ -183,13 +183,14 @@ def ap1(): print("Values added successfully!!") while True: password=input("Enter employee login password(max 8 characters, min 4): ") - if len(password)>8: + lp=len(password) + if lp>8: print("Max 8 characters only.") - elif len(password)<4: + elif lp<4: print("Minimum 4 characters to be entered.") else: try: - cur.execute("INSERT INTO empass values({},LPAD({},{},'0')".format(emp_no,password,len(password))) + cur.execute("INSERT INTO empass values({},LPAD({},{},'0'))".format(emp_no,password,lp)) query.commit() except mysql.connector.Error as err: print(err.msg) diff --git a/main.py b/main.py index 1822858..f6af9ed 100644 --- a/main.py +++ b/main.py @@ -2,8 +2,17 @@ import check import accounttype while True: - if not check.check(): - accounttype.acctype() + print("1.Continue") + print("2.Quit") + a=input("Enter your choice(1,2): ") + if a == "1": + if not check.check(): + accounttype.acctype() + break + else: + setup.setup() + elif a == "2": + print("Shutting down the program") break else: - setup.setup() + print("Wrong input.") \ No newline at end of file diff --git a/setup.py b/setup.py index 61ce1b6..0055895 100644 --- a/setup.py +++ b/setup.py @@ -139,6 +139,7 @@ def querycheck(): try: print("Creating table {}: ".format(table_name), end='') cursor.execute(table_description) + existing+=1 except mysql.connector.Error as err: if err.errno == errorcode.ER_TABLE_EXISTS_ERROR: print("already exists.") @@ -147,7 +148,10 @@ def querycheck(): print(err.msg()) else: print("OK") - ans=True + if existing==7: + with open("firsttime.txt","w") as f: + f.write("False") + ans=True if not ans: print("There was a problem in connection") @@ -183,8 +187,6 @@ def setup(): if ans2=="1": mysqlsetup() if existing==7: - with open("firsttime.txt","w") as f: - f.write("False") continue if ans2=="2": print("\nThis is under development :). Please use mysql till then...") diff --git a/showemployee.py b/showemployee.py index 3d49304..d9b2016 100644 --- a/showemployee.py +++ b/showemployee.py @@ -10,11 +10,11 @@ def ap4(): cur=conn.cursor() cur.execute("select * from employees") results=cur.fetchall() - print("---------------------------------------------------------------------------------------") + print("+---------+-------------+------------------+------------------+---------+-------------+") print("|","%7s"%"EMP_NO","|","%11s"%"BIRTH_DATE","|","%16s"%"FIRST_NAME","|","%16s"%"LAST_NAME","|","%7s"%"GENDER","|","%11s"%"HIRE_DATE","|") for row in results: - print("---------------------------------------------------------------------------------------") + print("+---------+-------------+------------------+------------------+---------+-------------+") print("|","%7s"%row[0],"|","%11s"%row[1],"|","%16s"%row[2],"|","%16s"%row[3],"|","%7s"%row[4],"|","%11s"%row[5],"|") cur.close() conn.close() - print("---------------------------------------------------------------------------------------") \ No newline at end of file + print("+---------+-------------+------------------+------------------+---------+-------------+") \ No newline at end of file From 9f95f5a0b5a6aa0ec0971db17001bcce1908e3fc Mon Sep 17 00:00:00 2001 From: Om Date: Tue, 8 Nov 2022 18:13:39 +0530 Subject: [PATCH 23/56] added a photo for wiki --- employeepanel.py | 0 photos/Structure.png | Bin 0 -> 107609 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 employeepanel.py create mode 100644 photos/Structure.png diff --git a/employeepanel.py b/employeepanel.py new file mode 100644 index 0000000..e69de29 diff --git a/photos/Structure.png b/photos/Structure.png new file mode 100644 index 0000000000000000000000000000000000000000..bd09944b080d534ddf101716995c15981b70bb23 GIT binary patch literal 107609 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

C@T9et5A+fuuFrUcE3mJlPfzG$jR92NQOVc!>D* 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 literal 0 HcmV?d00001 From a908f01b9683f8e6547d50128db014bf24ac099a Mon Sep 17 00:00:00 2001 From: Om Date: Tue, 8 Nov 2022 18:38:00 +0530 Subject: [PATCH 24/56] added more photos for wiki --- photos/Clients.png | Bin 0 -> 39294 bytes photos/Current.png | Bin 0 -> 16553 bytes photos/empass.png | Bin 0 -> 14560 bytes photos/employees.png | Bin 0 -> 26359 bytes photos/loan.png | Bin 0 -> 30735 bytes photos/overdraft.png | Bin 0 -> 18939 bytes photos/savings.png | Bin 0 -> 17521 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 photos/Clients.png create mode 100644 photos/Current.png create mode 100644 photos/empass.png create mode 100644 photos/employees.png create mode 100644 photos/loan.png create mode 100644 photos/overdraft.png create mode 100644 photos/savings.png diff --git a/photos/Clients.png b/photos/Clients.png new file mode 100644 index 0000000000000000000000000000000000000000..1755109574cfb04e22ff5f16e7458dfa72263bdc GIT binary patch literal 39294 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 X=4fIC7oHL0pN*M`_5OmrC$IbmzEI_^ literal 0 HcmV?d00001 diff --git a/photos/Current.png b/photos/Current.png new file mode 100644 index 0000000000000000000000000000000000000000..faef729871740216d9340d416d204ca2ba7ac454 GIT binary patch literal 16553 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 IJ%832@Py#-dggGBMs8HRlH3j~#%MA-t!(()2 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 W|KQP=a_|HN1$+33L)8b*UjIK4r;S(u literal 0 HcmV?d00001 diff --git a/photos/employees.png b/photos/employees.png new file mode 100644 index 0000000000000000000000000000000000000000..17a02d9dcefc1af51c3bb1cf9786e584b957ce21 GIT binary patch literal 26359 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 literal 0 HcmV?d00001 diff --git a/photos/loan.png b/photos/loan.png new file mode 100644 index 0000000000000000000000000000000000000000..163d94b2649c7be74433bdd403779f4fcc15d205 GIT binary patch literal 30735 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 literal 0 HcmV?d00001 diff --git a/photos/overdraft.png b/photos/overdraft.png new file mode 100644 index 0000000000000000000000000000000000000000..62df3985591f7c959202d385604fc6435ce95931 GIT binary patch literal 18939 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 literal 0 HcmV?d00001 From fc1186cb64cba4f9eaa2d0ad60139508c28bb175 Mon Sep 17 00:00:00 2001 From: Om J Shah <79356504+OJASisLive@users.noreply.github.com> Date: Tue, 8 Nov 2022 18:56:48 +0530 Subject: [PATCH 25/56] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2ced7b5..ae0a9d4 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,9 @@ That means you entered your credentials properly 3.Any other exception will pop up in the terminal... +# More information/Structure/Wiki +[Wiki](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/wiki) + # About: This project aims to create a bridge between Python and SQL and use it in real world problems/applications... From 2b517ca4a3eba594664426f036da0cae8bae80b1 Mon Sep 17 00:00:00 2001 From: Om Date: Wed, 16 Nov 2022 22:41:51 +0530 Subject: [PATCH 26/56] Added Creation of client accounts --- accounttype.py | 3 +- createaccount.py | 234 +++++++++++++++++++++++++++++++++++++++++++++++ employeepanel.py | 87 ++++++++++++++++++ setup.py | 2 +- 4 files changed, 324 insertions(+), 2 deletions(-) create mode 100644 createaccount.py diff --git a/accounttype.py b/accounttype.py index ea63a0a..9973f60 100644 --- a/accounttype.py +++ b/accounttype.py @@ -1,4 +1,5 @@ import adminpanel +import employeepanel def acctype(): while True: print("--------------Account Selector Menu--------------") @@ -18,7 +19,7 @@ def acctype(): elif a=='2': b=input("\nEnter employee password:") if b=="emp123": - return 2 + employeepanel.ep() else: print("\nWrong password!\n") diff --git a/createaccount.py b/createaccount.py new file mode 100644 index 0000000..dc57abe --- /dev/null +++ b/createaccount.py @@ -0,0 +1,234 @@ +import pickle +from datetime import date + +import mysql.connector + + +def age(birthdate): + today = date.today() + age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) + return age + +def ap1(): + cred = open("cred.dat","rb") + dat=pickle.load(cred) + cred.close() + Passwo=dat[0] + Databa=dat[1] + query=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) + cur=query.cursor() + print("-------------Create account Process-------------") + +#client number + while True: + acc_no=input("Enter acc_no (max 5 int): ") + if len(acc_no) <= 5: + try: + acc_no=int(acc_no) + print("Done OK") + except ValueError: + print("acc_no should be an integer!!") + else: + break + else: + print("Maximum length is 5!") +#client Birth date + while True: + while True: + year=input("Enter birth year (4 int): ") + if len(year) == 4: + try: + year=int(year) + print("Done OK") + except ValueError: + print("year should be an integer!!") + else: + break + else: + print("Year consists of 4 integers!!") + + while True: + month=input("Enter birth month (2 int) (01 to 12): ") + if len(month) == 2: + try: + month=int(month) + print("Done OK") + except ValueError: + print("month should be an integer!!") + else: + break + else: + print("Month consists of 2 integers!!") + + while True: + day=input("Enter birth day (2 int) : ") + if len(day) == 2: + try: + day=int(day) + print("Done OK") + except ValueError: + print("Date should be an integer!!") + else: + break + else: + print("Date consists of 2 integers!!") + + try: + birth_date=date(year,month,day) + except ValueError: + import traceback + traceback.print_exc() + else: + if age(birth_date)>=10: + break + else: + print("Account holder must be atleast 10 years of age!!") +#client name + while True: + first_name=input("Enter first name (max 15 char): ") + if len(first_name)<= 15: + break + else: + print("Max 15 characters") + + while True: + last_name=input("Enter last name (max 15 char): ") + if len(last_name)<= 15: + break + else: + print("Max 15 characters") +#client Gender + while True: + print("1.Male") + print("2.Female") + a=input("Enter choice (1 or 2):") + if a== '1': + gender='M' + break + elif a=='2': + gender='F' + break + else: + print("Wrong input!!") + +#client Account Type + while True: + print("1.Savings account") + print("2.Current account") + a=input("Enter choice (1 or 2):") + if a== '1': + acc_type='S' + break + elif a=='2': + acc_type='C' + break + else: + print("Wrong input!!") + +#Account creation date + while True: + while True: + hyear=input("Enter account_creation year (4 int): ") + if len(hyear) == 4: + try: + hyear=int(hyear) + print("Done OK") + except ValueError: + print("year should be an integer!!") + else: + break + else: + print("Year consists of 4 integers!!") + + while True: + hmonth=input("Enter account_creation month (2 int) (01 to 12): ") + if len(hmonth) == 2: + try: + hmonth=int(hmonth) + print("Done OK") + except ValueError: + print("month should be an integer!!") + else: + break + else: + print("Month consists of 2 integers!!") + + while True: + hday=input("Enter account_creation day (2 int) (01 to 31): ") + if len(hday) == 2: + try: + hday=int(hday) + print("Done OK") + except ValueError: + print("Date should be an integer!!") + else: + break + else: + print("Date consists of 2 integers!!") + + try: + acc_creation_date=date(hyear,hmonth,hday) + except ValueError: + import traceback + traceback.print_exc() + else: + if age(birth_date)-age(acc_creation_date)>=10: + break + else: + print("client must atleast be 10 years of age!!") +#client password/pin + while True: + password=input("Enter client login password(max 8 characters, min 4): ") + lp=len(password) + if lp>8: + print("Max 8 characters only.") + elif lp<4: + print("Minimum 4 characters to be entered.") + else: + break + +#mobile no + while True: + mobile_no_str=input("Enter mobile no. (7 to 15 int)") + mobile_no=mobile_no_str + #Thanks to the international phone numbering plan (ITU-T E. 164), + #phone numbers cannot contain more than 15 digits. The shortest + #international phone numbers in use contain seven digits. + try: + mobile_no=int(mobile_no) + except ValueError: + print("acc_no should be an integer!!") + else: + if len(mobile_no_str)>6 and len(mobile_no_str)<16: + mobile_no=mobile_no_str + lmn=len(mobile_no) + break + else: + print("Mobile number can have min 7 digits and max 15!!") + +#email-id + while True: + email_id=input("Enter client Email ID (max 25 char):") + if len(email_id)<26: + break + else: + print("Maximum 25 characters") + + + + print("=========== Final Data ===========") + print(acc_no,acc_type,first_name,last_name,gender,birth_date,acc_creation_date,mobile_no,email_id,password) + add_client=("INSERT INTO clients " + "(acc_no,acc_type,first_name,last_name,gender,birth_date,acc_creation_date,mobile_no,email_id,pass) " + "VALUES (%s,%s,%s,%s,%s,%s,%s,LPAD(%s,%s,'0'),%s,LPAD(%s,%s,'0'))") + data_client=(acc_no,acc_type,first_name,last_name,gender,birth_date,acc_creation_date,mobile_no,lmn,email_id,password,lp) + try: + cur.execute(add_client, data_client) + query.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") + else: + print("Values added successfully!!") + cur.close() + query.close() \ No newline at end of file diff --git a/employeepanel.py b/employeepanel.py index e69de29..22c5ead 100644 --- a/employeepanel.py +++ b/employeepanel.py @@ -0,0 +1,87 @@ +import pickle +import mysql.connector +import createaccount + +conn=None +cur=None +def ep(): + global conn + global cur + print("\nWelcome employee!!") + print("Please log in with your creds (emp_id and password):") + + cred = open("cred.dat","rb") + dat=pickle.load(cred) + cred.close() + Passwo=dat[0] + Databa=dat[1] + conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) + cur=conn.cursor() + + while True: + print("---------------------Employee Panel--------------------") + print("1.Employee login.") + print("2.Quit.") + ch = input("Enter your choice:") + if ch == "1": + print("------------login panel-------------") + elif ch == "2": + cur.close() + conn.close() + break + else: + print("Wrong input!!!(1 or 2 only)") + while True: + emp_no=input("Enter emp_no (max 5 int): ") + if len(emp_no) <= 5: + try: + emp_no=int(emp_no) + print("Done OK") + except ValueError: + print("emp_no should be an integer!!") + else: + break + else: + print("Maximum length is 5!") + + cur.execute("select * from empass where emp_no = {}".format(emp_no)) + record=cur.fetchall() + if record == []: + print("This emp_no doesn't exist!!!") + else: + while True: + password=record[0][1] + a=input("Enter your password:") + if a==password: + choice=menu(emp_no) + if choice=="1": + createaccount.ep1() + elif choice=="2": + break + elif choice=="3": + break + elif choice=="4": + break + elif choice=="0": + cur.close() + conn.close() + break + else: + print("Wrong input!") + else: + print("Wrong password!!") + break + +def menu(x): + global conn + global cur + cur.execute("select first_name,last_name from employees where emp_no = {}".format(x)) + record=cur.fetchone() + print("---------------Welcome {} {} ----------------".format(record[0],record[1])) + print("1.Create client account") + print("2.Change client pin") + print("3.Close client account") + print("4.Show client table") + print("Enter 0 to quit.") + choice=input("Enter your choice: ") + return choice \ No newline at end of file diff --git a/setup.py b/setup.py index 0055895..7c55a98 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ " `gender` enum('M','F') NOT NULL," " `birth_date` date NOT NULL," " `acc_creation_date` date NOT NULL," - " `mobile_no` int(10) NOT NULL," + " `mobile_no` varchar(20) NOT NULL," " `email_id` varchar(25) NOT NULL," " `pass` varchar(8) NOT NULL" ") " From ad3aa129d51e3aed8f0078d83cdc23f5cd40215a Mon Sep 17 00:00:00 2001 From: Om J Shah <79356504+OJASisLive@users.noreply.github.com> Date: Wed, 16 Nov 2022 22:45:44 +0530 Subject: [PATCH 27/56] Update .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d510687..d92380b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ firsttime.txt cred.dat links.txt tempCodeRunnerFile.py -start program.bat \ No newline at end of file +start program.bat +README.md From 501ead448c5f8ed2d4db77d48a1758b4030e55d4 Mon Sep 17 00:00:00 2001 From: Om Date: Wed, 16 Nov 2022 22:46:23 +0530 Subject: [PATCH 28/56] changed .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d510687..755a068 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ firsttime.txt cred.dat links.txt tempCodeRunnerFile.py -start program.bat \ No newline at end of file +start program.bat +Readme.md \ No newline at end of file From be2c516ba602a80558d05ff2e55311d80ab3917c Mon Sep 17 00:00:00 2001 From: Om Date: Wed, 16 Nov 2022 22:49:21 +0530 Subject: [PATCH 29/56] changed .gitignore --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 755a068..d510687 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,4 @@ firsttime.txt cred.dat links.txt tempCodeRunnerFile.py -start program.bat -Readme.md \ No newline at end of file +start program.bat \ No newline at end of file From b627a7ea249f75072146e2b62d7cd575c99d4f76 Mon Sep 17 00:00:00 2001 From: Om Date: Wed, 16 Nov 2022 22:57:15 +0530 Subject: [PATCH 30/56] matched to github --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ced7b5..cd09493 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,13 @@ That means you entered your credentials properly 3.Any other exception will pop up in the terminal... +# More information/Structure/Wiki +[Wiki](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/wiki) + # About: This project aims to create a bridge between Python and SQL and use it in real world problems/applications... This project is currently under development... # Done by: -Om J Shah +Om J Shah \ No newline at end of file From 05cb8d456b3060f9429a317f602dbd12ea0956bb Mon Sep 17 00:00:00 2001 From: Om Date: Wed, 16 Nov 2022 23:25:04 +0530 Subject: [PATCH 31/56] matched to github --- photos/Clients.png | Bin 39294 -> 39927 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/photos/Clients.png b/photos/Clients.png index 1755109574cfb04e22ff5f16e7458dfa72263bdc..e4c127ef3a130b53032b186bc542c09b3401bd26 100644 GIT binary patch literal 39927 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 IgJ-Y*53i|97XSbN literal 39294 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 X=4fIC7oHL0pN*M`_5OmrC$IbmzEI_^ From cd3b2766f3f8d0bb8ab84d2168937a60da9a8594 Mon Sep 17 00:00:00 2001 From: Om Date: Wed, 16 Nov 2022 23:41:37 +0530 Subject: [PATCH 32/56] matched to github --- createaccount.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/createaccount.py b/createaccount.py index dc57abe..a502d69 100644 --- a/createaccount.py +++ b/createaccount.py @@ -9,7 +9,7 @@ def age(birthdate): age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) return age -def ap1(): +def ep1(): cred = open("cred.dat","rb") dat=pickle.load(cred) cred.close() From 1df5a9918caa438b162af793390424f27c7ad3e5 Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 4 Dec 2022 14:17:01 +0530 Subject: [PATCH 33/56] Tried to shorten code by shortening connection --- adminpanel.py | 13 ++++++------- connection.py | 13 +++++++++++++ editemployee.py | 25 ++++--------------------- employeepanel.py | 2 +- fireemployee.py | 14 ++------------ hireemployee.py | 24 +++++++++++++++--------- showemployee.py | 13 ++----------- 7 files changed, 43 insertions(+), 61 deletions(-) create mode 100644 connection.py diff --git a/adminpanel.py b/adminpanel.py index 6650314..a46431d 100644 --- a/adminpanel.py +++ b/adminpanel.py @@ -1,7 +1,4 @@ import hireemployee -import fireemployee -import editemployee -import showemployee def ap(): print("\nWelcome Admin!!") @@ -17,13 +14,15 @@ def ap(): if a=='1': hireemployee.ap1() elif a=='2': - fireemployee.ap2() + hireemployee.ap2() elif a=='3': - editemployee.ap3() + hireemployee.ap3() elif a=='4': - showemployee.ap4() + hireemployee.ap4() elif a=='0': print("Quit Admin Panel.") break else: - print("Wrong input!(1,2,3)") \ No newline at end of file + print("Wrong input!(1,2,3)") + +ap() \ No newline at end of file diff --git a/connection.py b/connection.py new file mode 100644 index 0000000..3fc55f4 --- /dev/null +++ b/connection.py @@ -0,0 +1,13 @@ +import mysql.connector +import pickle +def cc(): + global cur + global conn + cred = open("cred.dat","rb") + dat=pickle.load(cred) + cred.close() + Passwo=dat[0] + Databa=dat[1] + conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) + cur=conn.cursor() + return conn,cur \ No newline at end of file diff --git a/editemployee.py b/editemployee.py index 6c7381d..db3dc9b 100644 --- a/editemployee.py +++ b/editemployee.py @@ -6,23 +6,10 @@ def age(birthdate): today = date.today() age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) return age - -cur=None -conn=None emp_no=0 hire_date=None birth_date=None -def ap3(): - global cur - global conn - cred = open("cred.dat","rb") - dat=pickle.load(cred) - cred.close() - Passwo=dat[0] - Databa=dat[1] - conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) - cur=conn.cursor() - +def ap3(conn,cur): global emp_no global birth_date global hire_date @@ -55,11 +42,9 @@ def ap3(): print("7.password") birth_date=results1[1] hire_date=results1[5] - f2() + f2(conn,cur) -def f2(): - global cur - global conn +def f2(conn,cur): global emp_no global birth_date global hire_date @@ -306,6 +291,4 @@ def f2(): print("-----------Password change was unsuccessful!!!!-------------") else: print("Password changed successfully!!!") - break - cur.close() - conn.close() \ No newline at end of file + break \ No newline at end of file diff --git a/employeepanel.py b/employeepanel.py index 22c5ead..d09ae8f 100644 --- a/employeepanel.py +++ b/employeepanel.py @@ -79,7 +79,7 @@ def menu(x): record=cur.fetchone() print("---------------Welcome {} {} ----------------".format(record[0],record[1])) print("1.Create client account") - print("2.Change client pin") + print("2.Change client details") print("3.Close client account") print("4.Show client table") print("Enter 0 to quit.") diff --git a/fireemployee.py b/fireemployee.py index 01f76cd..7f5a360 100644 --- a/fireemployee.py +++ b/fireemployee.py @@ -1,13 +1,5 @@ import mysql.connector -import pickle -def ap2(): - cred = open("cred.dat","rb") - dat=pickle.load(cred) - cred.close() - Passwo=dat[0] - Databa=dat[1] - conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) - cur=conn.cursor() +def ap2(conn,cur): print("---------Fire employee process----------\n") while True: emp_no=input(("Enter emp_no of the employee to fire them: ")) @@ -42,6 +34,4 @@ def ap2(): print("Employee fired successfully...\n") if not changed: print("The employee number does not exist.") - print("------------Could not fire employee-----------\n") - cur.close() - conn.close() \ No newline at end of file + print("------------Could not fire employee-----------\n") \ No newline at end of file diff --git a/hireemployee.py b/hireemployee.py index 9af8f14..b83a5ea 100644 --- a/hireemployee.py +++ b/hireemployee.py @@ -1,20 +1,16 @@ from datetime import date import pickle import mysql.connector +import connection def age(birthdate): today = date.today() age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) return age +query,cur=connection.cc() def ap1(): - cred = open("cred.dat","rb") - dat=pickle.load(cred) - cred.close() - Passwo=dat[0] - Databa=dat[1] - query=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) - cur=query.cursor() + global query,cur print("-------------Hire Employee Process-------------") #Employee number @@ -198,5 +194,15 @@ def ap1(): else: print("Password added successfully!!!") break - cur.close() - query.close() \ No newline at end of file + +import editemployee +def ap3(): + editemployee.ap3(query,cur) + +import fireemployee +def ap2(): + fireemployee.ap2(query,cur) + +import showemployee +def ap4(): + showemployee.ap4(cur) \ No newline at end of file diff --git a/showemployee.py b/showemployee.py index d9b2016..eb26833 100644 --- a/showemployee.py +++ b/showemployee.py @@ -1,13 +1,6 @@ import mysql.connector -import pickle -def ap4(): - cred = open("cred.dat","rb") - dat=pickle.load(cred) - cred.close() - Passwo=dat[0] - Databa=dat[1] - conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) - cur=conn.cursor() + +def ap4(cur): cur.execute("select * from employees") results=cur.fetchall() print("+---------+-------------+------------------+------------------+---------+-------------+") @@ -15,6 +8,4 @@ def ap4(): for row in results: print("+---------+-------------+------------------+------------------+---------+-------------+") print("|","%7s"%row[0],"|","%11s"%row[1],"|","%16s"%row[2],"|","%16s"%row[3],"|","%7s"%row[4],"|","%11s"%row[5],"|") - cur.close() - conn.close() print("+---------+-------------+------------------+------------------+---------+-------------+") \ No newline at end of file From c209b0ddc0a04756c59acb61a57dbe66041f506b Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 4 Dec 2022 16:25:36 +0530 Subject: [PATCH 34/56] Shortened the code,more --- accounttype.py | 6 +- adminpanel.py | 18 ++--- createaccount.py | 10 +-- dataentering.py | 171 +++++++++++++++++++++++++++++++++++++++++++++ editaccount.py | 25 +++++++ editemployee.py | 178 +++++++++-------------------------------------- employeepanel.py | 23 ++---- hireemployee.py | 174 +++------------------------------------------ main.py | 4 +- 9 files changed, 257 insertions(+), 352 deletions(-) create mode 100644 dataentering.py create mode 100644 editaccount.py diff --git a/accounttype.py b/accounttype.py index 9973f60..052630b 100644 --- a/accounttype.py +++ b/accounttype.py @@ -1,6 +1,6 @@ import adminpanel import employeepanel -def acctype(): +def acctype(query,cur): while True: print("--------------Account Selector Menu--------------") print("1.Admin.") @@ -12,14 +12,14 @@ def acctype(): if a=='1': b=input("\nEnter admin password:") if b=="admin123": - adminpanel.ap() + adminpanel.ap(query,cur) else: print("\nWrong password!\n") elif a=='2': b=input("\nEnter employee password:") if b=="emp123": - employeepanel.ep() + employeepanel.ep(query,cur) else: print("\nWrong password!\n") diff --git a/adminpanel.py b/adminpanel.py index a46431d..11221ed 100644 --- a/adminpanel.py +++ b/adminpanel.py @@ -1,6 +1,8 @@ import hireemployee - -def ap(): +import fireemployee +import editemployee +import showemployee +def ap(query,conn): print("\nWelcome Admin!!") while True: @@ -12,17 +14,15 @@ def ap(): print("\nInput 0 to quit.") a=input("Enter choice:") if a=='1': - hireemployee.ap1() + hireemployee.ap1(query,conn) elif a=='2': - hireemployee.ap2() + fireemployee.ap2(query,conn) elif a=='3': - hireemployee.ap3() + editemployee.ap3(query,conn) elif a=='4': - hireemployee.ap4() + showemployee.ap4(conn) elif a=='0': print("Quit Admin Panel.") break else: - print("Wrong input!(1,2,3)") - -ap() \ No newline at end of file + print("Wrong input!(1,2,3)") \ No newline at end of file diff --git a/createaccount.py b/createaccount.py index a502d69..7438c8e 100644 --- a/createaccount.py +++ b/createaccount.py @@ -1,4 +1,3 @@ -import pickle from datetime import date import mysql.connector @@ -9,14 +8,7 @@ def age(birthdate): age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) return age -def ep1(): - cred = open("cred.dat","rb") - dat=pickle.load(cred) - cred.close() - Passwo=dat[0] - Databa=dat[1] - query=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) - cur=query.cursor() +def ep1(query,cur): print("-------------Create account Process-------------") #client number diff --git a/dataentering.py b/dataentering.py new file mode 100644 index 0000000..50ab857 --- /dev/null +++ b/dataentering.py @@ -0,0 +1,171 @@ +from datetime import date + +def age(birthdate): + today = date.today() + age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) + return age + + +def primary_key_no(x): +#Employee number and client number + while True: + emp_no=input("Enter {} (max 5 int): ".format(x)) + if len(emp_no) <= 5: + try: + emp_no=int(emp_no) + print("Done OK") + except ValueError: + print("{} should be an integer!!".format(x)) + else: + return emp_no + break + else: + print("Maximum length is 5!") + +def birthdate(person,minage,maxage): +#Employee Birth date and client birth date + while True: + while True: + year=input("Enter birth year (4 int): ") + if len(year) == 4: + try: + year=int(year) + print("Done OK") + except ValueError: + print("year should be an integer!!") + else: + break + else: + print("Year consists of 4 integers!!") + + while True: + month=input("Enter birth month (2 int) (01 to 12): ") + if len(month) == 2: + try: + month=int(month) + print("Done OK") + except ValueError: + print("month should be an integer!!") + else: + break + else: + print("Month consists of 2 integers!!") + + while True: + day=input("Enter birth day (2 int) : ") + if len(day) == 2: + try: + day=int(day) + print("Done OK") + except ValueError: + print("Date should be an integer!!") + else: + break + else: + print("Date consists of 2 integers!!") + + try: + birth_date=date(year,month,day) + except ValueError: + import traceback + traceback.print_exc() + else: + if age(birth_date)>=minage and age(birth_date)<=maxage: + return birth_date + break + else: + if age(birth_date)maxage: + print("{} must be below {} years of age!!".format(person,maxage)) + elif age(birth_date)-age(hire_date)>=minage: + break + else: + print("{} must atleast be {} years of age!!".format(person,maxage)) + return hire_date \ No newline at end of file diff --git a/editaccount.py b/editaccount.py new file mode 100644 index 0000000..d4ce64c --- /dev/null +++ b/editaccount.py @@ -0,0 +1,25 @@ +import pickle +import mysql.connector + +from datetime import date + +def age(birthdate): + today = date.today() + age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) + return age +acc_no=0 +acc_creation_date=None +birth_date=None +def ep2(conn,cur): + while True: + acc_no=input("Enter acc_no (max 5 int) to edit details: ") + if len(acc_no) <= 5: + try: + acc_no=int(acc_no) + print("Done OK") + except ValueError: + print("acc_no should be an integer!!") + else: + break + else: + print("Maximum length is 5!") \ No newline at end of file diff --git a/editemployee.py b/editemployee.py index db3dc9b..bb215e9 100644 --- a/editemployee.py +++ b/editemployee.py @@ -1,6 +1,6 @@ import mysql.connector -import pickle from datetime import date +import dataentering def age(birthdate): today = date.today() @@ -51,95 +51,32 @@ def f2(conn,cur): print("0 to quit.") a=input("What would you like to change from the above:") if a == '1': - while True: - en=input("Enter emp_no (max 5 int): ") - if len(en) <= 5: - try: - en=int(en) - print("Done OK") - except ValueError: - print("emp_no should be an integer!!") - else: - try: - cur.execute("update employees set emp_no={} where emp_no={}".format(en,emp_no)) - conn.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") - else: - print("Updated employee number...") - break - else: - print("Maximum length is 5!") - if a == '2': - while True: - while True: - year=input("Enter birth year (4 int): ") - if len(year) == 4: - try: - year=int(year) - print("Done OK") - except ValueError: - print("year should be an integer!!") - else: - break - else: - print("Year consists of 4 integers!!") - - while True: - month=input("Enter birth month (2 int) (01 to 12): ") - if len(month) == 2: - try: - month=int(month) - print("Done OK") - except ValueError: - print("month should be an integer!!") - else: - break - else: - print("Month consists of 2 integers!!") - - while True: - day=input("Enter birth day (2 int) : ") - if len(day) == 2: - try: - day=int(day) - print("Done OK") - except ValueError: - print("Date should be an integer!!") - else: - break - else: - print("Date consists of 2 integers!!") + en=dataentering.primary_key_no("emp_no") + try: + cur.execute("update employees set emp_no={} where emp_no={}".format(en,emp_no)) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") + else: + print("Updated employee number...") + if a == '2': + birth_date=dataentering.birthdate("employee",20,60) + if age(birth_date)-age(hire_date)>=20: try: - birth_date=date(year,month,day) - except ValueError: - import traceback - traceback.print_exc() + cur.execute("update employees set birth_date='{}' where emp_no={}".format(birth_date,emp_no)) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") else: - if age(birth_date)>=20 and age(birth_date)<=60: - if age(birth_date)-age(hire_date)>=20: - try: - cur.execute("update employees set birth_date='{}' where emp_no={}".format(birth_date,emp_no)) - conn.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") - break - else: - print("Updated birth date...") - break - else: - print("Employee must be atleast 20 years of age when hired!!") - print(birth_date,": birth_date") - print(hire_date,":hire date you entered") - else: - if age(birth_date)<20: - print("Employee must be atleast 20 years of age!!") - else: - print("Maximum age is 60 years!!!") - print("\nwrong input\n") + print("Updated birth date...") + else: + print("Employee must be atleast 20 years of age when hired!!") + print(birth_date,": birth_date") + print(hire_date,":hire date you entered") + if a == '3': while True: first_name=input("Enter first name (max 15 char): ") @@ -207,65 +144,16 @@ def f2(conn,cur): print("Wrong input!!") if a == '6': - while True: - while True: - hyear=input("Enter hire year (4 int): ") - if len(hyear) == 4: - try: - hyear=int(hyear) - print("Done OK") - except ValueError: - print("year should be an integer!!") - else: - break - else: - print("Year consists of 4 integers!!") - - while True: - hmonth=input("Enter hire month (2 int) (01 to 12): ") - if len(hmonth) == 2: - try: - hmonth=int(hmonth) - print("Done OK") - except ValueError: - print("month should be an integer!!") - else: - break - else: - print("Month consists of 2 integers!!") - - while True: - hday=input("Enter hire day (2 int) (01 to 31): ") - if len(hday) == 2: - try: - hday=int(hday) - print("Done OK") - except ValueError: - print("Date should be an integer!!") - else: - break - else: - print("Date consists of 2 integers!!") + hire_date=dataentering.date2("employee",birth_date,"hire",20,60) + try: + cur.execute("update employees set hire_date='{}' where emp_no={}".format(hire_date,emp_no)) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") + else: + print("Updated hire date...") - try: - hire_date=date(hyear,hmonth,hday) - except ValueError: - import traceback - traceback.print_exc() - else: - if age(birth_date)-age(hire_date)>=20: - try: - cur.execute("update employees set hire_date='{}' where emp_no={}".format(hire_date,emp_no)) - conn.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") - break - else: - print("Updated hire date...") - break - else: - print("Employee must atleast be 20 years of age when hired!!") if a=='7': print("1.Show the password") print("2.Change the password") diff --git a/employeepanel.py b/employeepanel.py index d09ae8f..d7cecb4 100644 --- a/employeepanel.py +++ b/employeepanel.py @@ -1,23 +1,10 @@ -import pickle import mysql.connector import createaccount -conn=None -cur=None -def ep(): - global conn - global cur +def ep(conn,cur): print("\nWelcome employee!!") print("Please log in with your creds (emp_id and password):") - cred = open("cred.dat","rb") - dat=pickle.load(cred) - cred.close() - Passwo=dat[0] - Databa=dat[1] - conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) - cur=conn.cursor() - while True: print("---------------------Employee Panel--------------------") print("1.Employee login.") @@ -53,9 +40,9 @@ def ep(): password=record[0][1] a=input("Enter your password:") if a==password: - choice=menu(emp_no) + choice=menu(emp_no,conn,cur) if choice=="1": - createaccount.ep1() + createaccount.ep1(conn,cur) elif choice=="2": break elif choice=="3": @@ -72,9 +59,7 @@ def ep(): print("Wrong password!!") break -def menu(x): - global conn - global cur +def menu(x,conn,cur): cur.execute("select first_name,last_name from employees where emp_no = {}".format(x)) record=cur.fetchone() print("---------------Welcome {} {} ----------------".format(record[0],record[1])) diff --git a/hireemployee.py b/hireemployee.py index b83a5ea..59bf5f1 100644 --- a/hireemployee.py +++ b/hireemployee.py @@ -1,166 +1,20 @@ from datetime import date -import pickle import mysql.connector -import connection +import dataentering -def age(birthdate): - today = date.today() - age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) - return age - -query,cur=connection.cc() -def ap1(): - global query,cur +def ap1(query,cur): print("-------------Hire Employee Process-------------") #Employee number - while True: - emp_no=input("Enter emp_no (max 5 int): ") - if len(emp_no) <= 5: - try: - emp_no=int(emp_no) - print("Done OK") - except ValueError: - print("emp_no should be an integer!!") - else: - break - else: - print("Maximum length is 5!") + emp_no=dataentering.primary_key_no("emp_no") #Employee Birth date - while True: - while True: - year=input("Enter birth year (4 int): ") - if len(year) == 4: - try: - year=int(year) - print("Done OK") - except ValueError: - print("year should be an integer!!") - else: - break - else: - print("Year consists of 4 integers!!") - - while True: - month=input("Enter birth month (2 int) (01 to 12): ") - if len(month) == 2: - try: - month=int(month) - print("Done OK") - except ValueError: - print("month should be an integer!!") - else: - break - else: - print("Month consists of 2 integers!!") - - while True: - day=input("Enter birth day (2 int) : ") - if len(day) == 2: - try: - day=int(day) - print("Done OK") - except ValueError: - print("Date should be an integer!!") - else: - break - else: - print("Date consists of 2 integers!!") - - try: - birth_date=date(year,month,day) - except ValueError: - import traceback - traceback.print_exc() - else: - if age(birth_date)>=20 and age(birth_date)<=60: - break - else: - if age(birth_date)<20: - print("Employee must be atleast 20 years of age!!") - else: - print("Maximum age is 60 years!!!") - print("\nwrong input\n") -#Employee name - while True: - first_name=input("Enter first name (max 15 char): ") - if len(first_name)<= 15: - break - else: - print("Max 15 characters") - - while True: - last_name=input("Enter last name (max 15 char): ") - if len(last_name)<= 15: - break - else: - print("Max 15 characters") + birth_date=dataentering.birthdate("employee",20,60) +#Employee name + first_name,last_name=dataentering.name() #Employee Gender - while True: - print("1.Male") - print("2.Female") - a=input("Enter choice (1 or 2):") - if a== '1': - gender='M' - break - elif a=='2': - gender='F' - break - else: - print("Wrong input!!") + gender=dataentering.gender() #Employee hire date - while True: - while True: - hyear=input("Enter hire year (4 int): ") - if len(hyear) == 4: - try: - hyear=int(hyear) - print("Done OK") - except ValueError: - print("year should be an integer!!") - else: - break - else: - print("Year consists of 4 integers!!") - - while True: - hmonth=input("Enter hire month (2 int) (01 to 12): ") - if len(hmonth) == 2: - try: - hmonth=int(hmonth) - print("Done OK") - except ValueError: - print("month should be an integer!!") - else: - break - else: - print("Month consists of 2 integers!!") - - while True: - hday=input("Enter hire day (2 int) (01 to 31): ") - if len(hday) == 2: - try: - hday=int(hday) - print("Done OK") - except ValueError: - print("Date should be an integer!!") - else: - break - else: - print("Date consists of 2 integers!!") - - try: - hire_date=date(hyear,hmonth,hday) - except ValueError: - import traceback - traceback.print_exc() - else: - if age(hire_date)>60: - print("Employee must be below 60 years of age!!") - elif age(birth_date)-age(hire_date)>=20: - break - else: - print("Employee must atleast be 20 years of age!!") + hire_date=dataentering.date2("Employee",birth_date,"hire",20,60) print("=========== Final Data ===========") @@ -194,15 +48,3 @@ def ap1(): else: print("Password added successfully!!!") break - -import editemployee -def ap3(): - editemployee.ap3(query,cur) - -import fireemployee -def ap2(): - fireemployee.ap2(query,cur) - -import showemployee -def ap4(): - showemployee.ap4(cur) \ No newline at end of file diff --git a/main.py b/main.py index f6af9ed..50d5d22 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,15 @@ import setup import check import accounttype +import connection +query,cur=connection.cc() while True: print("1.Continue") print("2.Quit") a=input("Enter your choice(1,2): ") if a == "1": if not check.check(): - accounttype.acctype() + accounttype.acctype(query,cur) break else: setup.setup() From 01f3b97e9e3dd3b65a97ec57c7b846aefb4f8f3c Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 4 Dec 2022 16:36:54 +0530 Subject: [PATCH 35/56] updated branch info in readme --- README.md | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index cd09493..e7fb34b 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,13 @@ -# Bank Management System: -First of all, whole code is written by me and nothing has been copy pasted fron anywhere. +# Branch Information: +The purpose of this branch is to shorten the number of lines of code by removing duplicate lines +as much as possible. -The project has Dependencies which are all open sourced (modules such as pickle, csv, mysql-connector) - -# Requirements: -1. Python 3 -2. MySQL workbench 8.0 - -because I've tested the code using these versions only... - -# Setup: -Run the file named "main.py" and follow the instructions of the program... - -# How to reset: -Open the file named "firsttime.txt" and change the value from False to True (case sensitive) - -# Troubleshooting: -1.I suspect that the people who haven't set a password for SQL may encounter an error. (will fix it later) - -I strongly suggest users to have a password set in MySQL. - -2.Check if the terminal shows the message "Connection established successfully" - -That means you entered your credentials properly - -3.Any other exception will pop up in the terminal... +- I have not tested the whole code over here, so if anyone finds any bug, please post it in the issues section + and I will look after it then # More information/Structure/Wiki +[Main and tested branch](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/tree/main) + [Wiki](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/wiki) # About: From ee076156d4a18ba88bb5ea1f80d697848081f5ea Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 4 Dec 2022 16:39:11 +0530 Subject: [PATCH 36/56] updated branch info in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e7fb34b..e7eec97 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ The purpose of this branch is to shorten the number of lines of code by removing duplicate lines as much as possible. -- I have not tested the whole code over here, so if anyone finds any bug, please post it in the issues section +- I have not tested the whole code over here, so if anyone finds any bug, please post it in the [issues section](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/issues/new/choose) and I will look after it then # More information/Structure/Wiki From 2d2b34bdc62bfc0b5c2b1c4615c156a8b0d95823 Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 4 Dec 2022 16:54:45 +0530 Subject: [PATCH 37/56] Updated Notice in Readme --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index cd09493..5ddfe88 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,10 @@ +# NOTICE: +Further updates would be pushed on the ["shorten-the-code"](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/tree/shorten-the-code) branch where I am planning to shorten the code by +removing duplicate code and referencing them. + +- I will test the code from the surface and "won't test till depth" (atleast till the project is over). +- I will "hard-test" the code when the project is complete. + # Bank Management System: First of all, whole code is written by me and nothing has been copy pasted fron anywhere. From 8e4cb159de0ddee0f1f617a48cf8a982aa1a21a1 Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 4 Dec 2022 18:24:47 +0530 Subject: [PATCH 38/56] fixed first issue --- createaccount.py | 162 +++-------------------------------------------- employeepanel.py | 5 +- setup.py | 6 +- 3 files changed, 14 insertions(+), 159 deletions(-) diff --git a/createaccount.py b/createaccount.py index 7438c8e..087c53e 100644 --- a/createaccount.py +++ b/createaccount.py @@ -1,108 +1,17 @@ -from datetime import date - +import dataentering import mysql.connector - -def age(birthdate): - today = date.today() - age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) - return age - def ep1(query,cur): print("-------------Create account Process-------------") #client number - while True: - acc_no=input("Enter acc_no (max 5 int): ") - if len(acc_no) <= 5: - try: - acc_no=int(acc_no) - print("Done OK") - except ValueError: - print("acc_no should be an integer!!") - else: - break - else: - print("Maximum length is 5!") + acc_no=dataentering.primary_key_no("acc_no") #client Birth date - while True: - while True: - year=input("Enter birth year (4 int): ") - if len(year) == 4: - try: - year=int(year) - print("Done OK") - except ValueError: - print("year should be an integer!!") - else: - break - else: - print("Year consists of 4 integers!!") - - while True: - month=input("Enter birth month (2 int) (01 to 12): ") - if len(month) == 2: - try: - month=int(month) - print("Done OK") - except ValueError: - print("month should be an integer!!") - else: - break - else: - print("Month consists of 2 integers!!") - - while True: - day=input("Enter birth day (2 int) : ") - if len(day) == 2: - try: - day=int(day) - print("Done OK") - except ValueError: - print("Date should be an integer!!") - else: - break - else: - print("Date consists of 2 integers!!") - - try: - birth_date=date(year,month,day) - except ValueError: - import traceback - traceback.print_exc() - else: - if age(birth_date)>=10: - break - else: - print("Account holder must be atleast 10 years of age!!") -#client name - while True: - first_name=input("Enter first name (max 15 char): ") - if len(first_name)<= 15: - break - else: - print("Max 15 characters") - - while True: - last_name=input("Enter last name (max 15 char): ") - if len(last_name)<= 15: - break - else: - print("Max 15 characters") + birth_date=dataentering.birthdate("Client",10,100) +#client name + first_name,last_name=dataentering.name() #client Gender - while True: - print("1.Male") - print("2.Female") - a=input("Enter choice (1 or 2):") - if a== '1': - gender='M' - break - elif a=='2': - gender='F' - break - else: - print("Wrong input!!") - + gender=dataentering.gender() #client Account Type while True: print("1.Savings account") @@ -118,56 +27,7 @@ def ep1(query,cur): print("Wrong input!!") #Account creation date - while True: - while True: - hyear=input("Enter account_creation year (4 int): ") - if len(hyear) == 4: - try: - hyear=int(hyear) - print("Done OK") - except ValueError: - print("year should be an integer!!") - else: - break - else: - print("Year consists of 4 integers!!") - - while True: - hmonth=input("Enter account_creation month (2 int) (01 to 12): ") - if len(hmonth) == 2: - try: - hmonth=int(hmonth) - print("Done OK") - except ValueError: - print("month should be an integer!!") - else: - break - else: - print("Month consists of 2 integers!!") - - while True: - hday=input("Enter account_creation day (2 int) (01 to 31): ") - if len(hday) == 2: - try: - hday=int(hday) - print("Done OK") - except ValueError: - print("Date should be an integer!!") - else: - break - else: - print("Date consists of 2 integers!!") - - try: - acc_creation_date=date(hyear,hmonth,hday) - except ValueError: - import traceback - traceback.print_exc() - else: - if age(birth_date)-age(acc_creation_date)>=10: - break - else: - print("client must atleast be 10 years of age!!") + acc_creation_date=dataentering.date2("client",birth_date,"account_creation",10,100) #client password/pin while True: password=input("Enter client login password(max 8 characters, min 4): ") @@ -206,12 +66,10 @@ def ep1(query,cur): else: print("Maximum 25 characters") - - print("=========== Final Data ===========") print(acc_no,acc_type,first_name,last_name,gender,birth_date,acc_creation_date,mobile_no,email_id,password) add_client=("INSERT INTO clients " - "(acc_no,acc_type,first_name,last_name,gender,birth_date,acc_creation_date,mobile_no,email_id,pass) " + "(acc_no,type,first_name,last_name,gender,birth_date,accd,mobile_no,email_id,pass) " "VALUES (%s,%s,%s,%s,%s,%s,%s,LPAD(%s,%s,'0'),%s,LPAD(%s,%s,'0'))") data_client=(acc_no,acc_type,first_name,last_name,gender,birth_date,acc_creation_date,mobile_no,lmn,email_id,password,lp) try: @@ -221,6 +79,4 @@ def ep1(query,cur): print(err.msg) print("-----------Value addition was unsuccessful!!!!-------------") else: - print("Values added successfully!!") - cur.close() - query.close() \ No newline at end of file + print("Values added successfully!!") \ No newline at end of file diff --git a/employeepanel.py b/employeepanel.py index d7cecb4..2ea8334 100644 --- a/employeepanel.py +++ b/employeepanel.py @@ -1,4 +1,3 @@ -import mysql.connector import createaccount def ep(conn,cur): @@ -40,7 +39,7 @@ def ep(conn,cur): password=record[0][1] a=input("Enter your password:") if a==password: - choice=menu(emp_no,conn,cur) + choice=menu(emp_no,cur) if choice=="1": createaccount.ep1(conn,cur) elif choice=="2": @@ -59,7 +58,7 @@ def ep(conn,cur): print("Wrong password!!") break -def menu(x,conn,cur): +def menu(x,cur): cur.execute("select first_name,last_name from employees where emp_no = {}".format(x)) record=cur.fetchone() print("---------------Welcome {} {} ----------------".format(record[0],record[1])) diff --git a/setup.py b/setup.py index 7c55a98..bc233d9 100644 --- a/setup.py +++ b/setup.py @@ -23,13 +23,13 @@ TABLES['clients'] = ( "CREATE TABLE `clients` (" - " `acc_no` int(5) NOT NULL PRIMARY KEY," - " `acc_type` enum('S','C') NOT NULL," + " `acc_no` int NOT NULL PRIMARY KEY," + " `type` enum('S','C') NOT NULL," " `first_name` varchar(15) NOT NULL," " `last_name` varchar(15) NOT NULL," " `gender` enum('M','F') NOT NULL," " `birth_date` date NOT NULL," - " `acc_creation_date` date NOT NULL," + " `accd` date NOT NULL," " `mobile_no` varchar(20) NOT NULL," " `email_id` varchar(25) NOT NULL," " `pass` varchar(8) NOT NULL" From 0d263749f3f2e513e989f4d830372991ff770d85 Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 24 Dec 2022 00:09:13 +0530 Subject: [PATCH 39/56] Initial commit --- editemployee.py => src/main/OmJShah/admin/editemployee.py | 2 +- fireemployee.py => src/main/OmJShah/admin/fireemployee.py | 0 hireemployee.py => src/main/OmJShah/admin/hireemployee.py | 3 +-- showemployee.py => src/main/OmJShah/admin/showemployee.py | 2 -- .../main/OmJShah/employee/createaccount.py | 2 +- .../main/OmJShah/employee/editaccount.py | 3 --- check.py => src/main/OmJShah/initialization/check.py | 0 setup.py => src/main/OmJShah/initialization/setup.py | 2 +- main.py => src/main/OmJShah/main.py | 8 ++++---- accounttype.py => src/main/OmJShah/panels/accounttype.py | 4 ++-- adminpanel.py => src/main/OmJShah/panels/adminpanel.py | 8 ++++---- .../main/OmJShah/panels/employeepanel.py | 2 +- connection.py => src/main/OmJShah/tools/connection.py | 0 dataentering.py => src/main/OmJShah/tools/dataentering.py | 0 14 files changed, 15 insertions(+), 21 deletions(-) rename editemployee.py => src/main/OmJShah/admin/editemployee.py (99%) rename fireemployee.py => src/main/OmJShah/admin/fireemployee.py (100%) rename hireemployee.py => src/main/OmJShah/admin/hireemployee.py (97%) rename showemployee.py => src/main/OmJShah/admin/showemployee.py (96%) rename createaccount.py => src/main/OmJShah/employee/createaccount.py (98%) rename editaccount.py => src/main/OmJShah/employee/editaccount.py (94%) rename check.py => src/main/OmJShah/initialization/check.py (100%) rename setup.py => src/main/OmJShah/initialization/setup.py (99%) rename main.py => src/main/OmJShah/main.py (75%) rename accounttype.py => src/main/OmJShah/panels/accounttype.py (93%) rename adminpanel.py => src/main/OmJShah/panels/adminpanel.py (85%) rename employeepanel.py => src/main/OmJShah/panels/employeepanel.py (98%) rename connection.py => src/main/OmJShah/tools/connection.py (100%) rename dataentering.py => src/main/OmJShah/tools/dataentering.py (100%) diff --git a/editemployee.py b/src/main/OmJShah/admin/editemployee.py similarity index 99% rename from editemployee.py rename to src/main/OmJShah/admin/editemployee.py index bb215e9..7eb2fc6 100644 --- a/editemployee.py +++ b/src/main/OmJShah/admin/editemployee.py @@ -1,6 +1,6 @@ import mysql.connector from datetime import date -import dataentering +from tools import dataentering def age(birthdate): today = date.today() diff --git a/fireemployee.py b/src/main/OmJShah/admin/fireemployee.py similarity index 100% rename from fireemployee.py rename to src/main/OmJShah/admin/fireemployee.py diff --git a/hireemployee.py b/src/main/OmJShah/admin/hireemployee.py similarity index 97% rename from hireemployee.py rename to src/main/OmJShah/admin/hireemployee.py index 59bf5f1..c1cab84 100644 --- a/hireemployee.py +++ b/src/main/OmJShah/admin/hireemployee.py @@ -1,6 +1,5 @@ -from datetime import date import mysql.connector -import dataentering +from tools import dataentering def ap1(query,cur): print("-------------Hire Employee Process-------------") diff --git a/showemployee.py b/src/main/OmJShah/admin/showemployee.py similarity index 96% rename from showemployee.py rename to src/main/OmJShah/admin/showemployee.py index eb26833..fa89c0d 100644 --- a/showemployee.py +++ b/src/main/OmJShah/admin/showemployee.py @@ -1,5 +1,3 @@ -import mysql.connector - def ap4(cur): cur.execute("select * from employees") results=cur.fetchall() diff --git a/createaccount.py b/src/main/OmJShah/employee/createaccount.py similarity index 98% rename from createaccount.py rename to src/main/OmJShah/employee/createaccount.py index 087c53e..eaa80ab 100644 --- a/createaccount.py +++ b/src/main/OmJShah/employee/createaccount.py @@ -1,4 +1,4 @@ -import dataentering +from tools import dataentering import mysql.connector def ep1(query,cur): diff --git a/editaccount.py b/src/main/OmJShah/employee/editaccount.py similarity index 94% rename from editaccount.py rename to src/main/OmJShah/employee/editaccount.py index d4ce64c..8fc0a48 100644 --- a/editaccount.py +++ b/src/main/OmJShah/employee/editaccount.py @@ -1,6 +1,3 @@ -import pickle -import mysql.connector - from datetime import date def age(birthdate): diff --git a/check.py b/src/main/OmJShah/initialization/check.py similarity index 100% rename from check.py rename to src/main/OmJShah/initialization/check.py diff --git a/setup.py b/src/main/OmJShah/initialization/setup.py similarity index 99% rename from setup.py rename to src/main/OmJShah/initialization/setup.py index bc233d9..303a131 100644 --- a/setup.py +++ b/src/main/OmJShah/initialization/setup.py @@ -1,4 +1,4 @@ -import check +from initialization import check import pickle import mysql.connector diff --git a/main.py b/src/main/OmJShah/main.py similarity index 75% rename from main.py rename to src/main/OmJShah/main.py index 50d5d22..a31c458 100644 --- a/main.py +++ b/src/main/OmJShah/main.py @@ -1,7 +1,7 @@ -import setup -import check -import accounttype -import connection +from initialization import setup +from initialization import check +from panels import accounttype +from tools import connection query,cur=connection.cc() while True: print("1.Continue") diff --git a/accounttype.py b/src/main/OmJShah/panels/accounttype.py similarity index 93% rename from accounttype.py rename to src/main/OmJShah/panels/accounttype.py index 052630b..bbe254d 100644 --- a/accounttype.py +++ b/src/main/OmJShah/panels/accounttype.py @@ -1,5 +1,5 @@ -import adminpanel -import employeepanel +from panels import adminpanel +from panels import employeepanel def acctype(query,cur): while True: print("--------------Account Selector Menu--------------") diff --git a/adminpanel.py b/src/main/OmJShah/panels/adminpanel.py similarity index 85% rename from adminpanel.py rename to src/main/OmJShah/panels/adminpanel.py index 11221ed..612eb24 100644 --- a/adminpanel.py +++ b/src/main/OmJShah/panels/adminpanel.py @@ -1,7 +1,7 @@ -import hireemployee -import fireemployee -import editemployee -import showemployee +from admin import hireemployee +from admin import fireemployee +from admin import editemployee +from admin import showemployee def ap(query,conn): print("\nWelcome Admin!!") diff --git a/employeepanel.py b/src/main/OmJShah/panels/employeepanel.py similarity index 98% rename from employeepanel.py rename to src/main/OmJShah/panels/employeepanel.py index 2ea8334..6220229 100644 --- a/employeepanel.py +++ b/src/main/OmJShah/panels/employeepanel.py @@ -1,4 +1,4 @@ -import createaccount +from employee import createaccount def ep(conn,cur): print("\nWelcome employee!!") diff --git a/connection.py b/src/main/OmJShah/tools/connection.py similarity index 100% rename from connection.py rename to src/main/OmJShah/tools/connection.py diff --git a/dataentering.py b/src/main/OmJShah/tools/dataentering.py similarity index 100% rename from dataentering.py rename to src/main/OmJShah/tools/dataentering.py From 0426782c170a4c6ad078669eea03df33a99b9ca6 Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 24 Dec 2022 00:15:37 +0530 Subject: [PATCH 40/56] updated readme info for specific branch --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e7eec97..2a48215 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Branch Information: -The purpose of this branch is to shorten the number of lines of code by removing duplicate lines -as much as possible. +The purpose of this branch is to organize the code in packages and modules. This will soon be merged into the "[shorten-the-code](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/tree/shorten-the-code)" branch. + +After merger, this branch will be deleted. - I have not tested the whole code over here, so if anyone finds any bug, please post it in the [issues section](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/issues/new/choose) and I will look after it then From b4ae5a74a269128eae4e5de53dacbd219577a1da Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 24 Dec 2022 21:32:11 +0530 Subject: [PATCH 41/56] added edit client options. --- .gitignore | 1 + src/main/OmJShah/admin/editemployee.py | 147 +++++++-------------- src/main/OmJShah/employee/createaccount.py | 47 +------ src/main/OmJShah/employee/deleteaccount.py | 0 src/main/OmJShah/employee/editaccount.py | 144 +++++++++++++++++++- src/main/OmJShah/initialization/setup.py | 5 - src/main/OmJShah/panels/employeepanel.py | 7 +- src/main/OmJShah/tools/dataentering.py | 60 ++++++++- 8 files changed, 253 insertions(+), 158 deletions(-) create mode 100644 src/main/OmJShah/employee/deleteaccount.py diff --git a/.gitignore b/.gitignore index d92380b..248fbda 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ links.txt tempCodeRunnerFile.py start program.bat README.md +.vscode/ \ No newline at end of file diff --git a/src/main/OmJShah/admin/editemployee.py b/src/main/OmJShah/admin/editemployee.py index 7eb2fc6..6a374d8 100644 --- a/src/main/OmJShah/admin/editemployee.py +++ b/src/main/OmJShah/admin/editemployee.py @@ -6,16 +6,17 @@ def age(birthdate): today = date.today() age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) return age -emp_no=0 +emp_no=None hire_date=None birth_date=None + def ap3(conn,cur): - global emp_no - global birth_date - global hire_date + global emp_no,birth_date,hire_date print("---------Edit employee process----------\n") while True: + print("input ~ to quit") emp_no=input(("Enter emp_no of the employee to edit the details: ")) + if emp_no=="~": break if len(emp_no) <= 5: try: emp_no=int(emp_no) @@ -23,13 +24,15 @@ def ap3(conn,cur): except ValueError: print("emp_no should be an integer!!") else: + next(conn,cur) break else: print("Maximum length is 5!") + +def next(conn,cur): cur.execute("select * from employees where emp_no={}".format(emp_no)) results=cur.fetchall() - if results == []: - print(results) + if len(results)==0: print("That employee number does not exist.") else: results1=results[0] @@ -45,113 +48,60 @@ def ap3(conn,cur): f2(conn,cur) def f2(conn,cur): - global emp_no - global birth_date - global hire_date + global emp_no,birth_date,hire_date print("0 to quit.") a=input("What would you like to change from the above:") if a == '1': en=dataentering.primary_key_no("emp_no") - try: - cur.execute("update employees set emp_no={} where emp_no={}".format(en,emp_no)) - conn.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") - else: + query="update employees set emp_no=%s where emp_no=%s" + data=(en,emp_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: print("Updated employee number...") if a == '2': birth_date=dataentering.birthdate("employee",20,60) if age(birth_date)-age(hire_date)>=20: - try: - cur.execute("update employees set birth_date='{}' where emp_no={}".format(birth_date,emp_no)) - conn.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") - else: - print("Updated birth date...") + query="update employees set birth_date=%s where emp_no=%s" + data=(birth_date,emp_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated birth date") else: print("Employee must be atleast 20 years of age when hired!!") print(birth_date,": birth_date") print(hire_date,":hire date you entered") if a == '3': - while True: - first_name=input("Enter first name (max 15 char): ") - if len(first_name)<= 15: - try: - cur.execute("update employees set first_name='{}' where emp_no={}".format(first_name,emp_no)) - conn.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") - break - else: - print("Updated first name...") - break - else: - print("Max 15 characters") + first_name=dataentering.fname() + query="update employees set first_name=%s where emp_no=%s" + data=(first_name,emp_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated first name...") if a == '4': - while True: - last_name=input("Enter last name (max 15 char): ") - if len(last_name)<= 15: - try: - cur.execute("update employees set last_name='{}' where emp_no={}".format(last_name,emp_no)) - conn.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") - break - else: - print("Updated last name...") - break - else: - print("Max 15 characters") + last_name=dataentering.lname() + query="update employees set last_name=%s where emp_no=%s" + data=(last_name,emp_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated last name...") + if a == '5': - while True: - print("1.Male") - print("2.Female") - a=input("Enter choice (1 or 2):") - if a== '1': - try: - cur.execute("update employees set gender='M' where emp_no={}".format(emp_no)) - conn.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") - break - else: - print("Updated gender...") - break - - elif a=='2': - gender='F' - try: - cur.execute("update employees set gender='F' where emp_no={}".format(emp_no)) - conn.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") - break - else: - print("Updated gender...") - break - - else: - print("Wrong input!!") + gender=dataentering.gender() + query="update employees set gender=%s where emp_no=%s" + data=(gender,emp_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated gender...") if a == '6': hire_date=dataentering.date2("employee",birth_date,"hire",20,60) - try: - cur.execute("update employees set hire_date='{}' where emp_no={}".format(hire_date,emp_no)) - conn.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") - else: + query="update employees set hire_date=%s where emp_no=%s" + data=(hire_date,emp_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: print("Updated hire date...") if a=='7': @@ -171,12 +121,11 @@ def f2(conn,cur): elif lp<4: print("Minimum 4 characters to be entered.") else: - try: - cur.execute("UPDATE empass set pass=LPAD({},{},'0') where emp_no={}".format(password,lp,emp_no)) - conn.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Password change was unsuccessful!!!!-------------") - else: + query="UPDATE empass set pass=LPAD(%s,%s,'0') where emp_no=%s" + data=(password,lp,emp_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: print("Password changed successfully!!!") + break + else: break \ No newline at end of file diff --git a/src/main/OmJShah/employee/createaccount.py b/src/main/OmJShah/employee/createaccount.py index eaa80ab..6f16f00 100644 --- a/src/main/OmJShah/employee/createaccount.py +++ b/src/main/OmJShah/employee/createaccount.py @@ -9,7 +9,7 @@ def ep1(query,cur): #client Birth date birth_date=dataentering.birthdate("Client",10,100) #client name - first_name,last_name=dataentering.name() + first_name,last_name=dataentering.fname(),dataentering.lname() #client Gender gender=dataentering.gender() #client Account Type @@ -29,42 +29,13 @@ def ep1(query,cur): #Account creation date acc_creation_date=dataentering.date2("client",birth_date,"account_creation",10,100) #client password/pin - while True: - password=input("Enter client login password(max 8 characters, min 4): ") - lp=len(password) - if lp>8: - print("Max 8 characters only.") - elif lp<4: - print("Minimum 4 characters to be entered.") - else: - break + password,lp=dataentering.clientpassword() #mobile no - while True: - mobile_no_str=input("Enter mobile no. (7 to 15 int)") - mobile_no=mobile_no_str - #Thanks to the international phone numbering plan (ITU-T E. 164), - #phone numbers cannot contain more than 15 digits. The shortest - #international phone numbers in use contain seven digits. - try: - mobile_no=int(mobile_no) - except ValueError: - print("acc_no should be an integer!!") - else: - if len(mobile_no_str)>6 and len(mobile_no_str)<16: - mobile_no=mobile_no_str - lmn=len(mobile_no) - break - else: - print("Mobile number can have min 7 digits and max 15!!") + mobile_no,lmn=dataentering.mobileno() #email-id - while True: - email_id=input("Enter client Email ID (max 25 char):") - if len(email_id)<26: - break - else: - print("Maximum 25 characters") + email_id=dataentering.email() print("=========== Final Data ===========") print(acc_no,acc_type,first_name,last_name,gender,birth_date,acc_creation_date,mobile_no,email_id,password) @@ -72,11 +43,7 @@ def ep1(query,cur): "(acc_no,type,first_name,last_name,gender,birth_date,accd,mobile_no,email_id,pass) " "VALUES (%s,%s,%s,%s,%s,%s,%s,LPAD(%s,%s,'0'),%s,LPAD(%s,%s,'0'))") data_client=(acc_no,acc_type,first_name,last_name,gender,birth_date,acc_creation_date,mobile_no,lmn,email_id,password,lp) - try: - cur.execute(add_client, data_client) - query.commit() - except mysql.connector.Error as err: - print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") - else: + + done=dataentering.tableupdate(query,cur,add_client,data_client) + if done: print("Values added successfully!!") \ No newline at end of file diff --git a/src/main/OmJShah/employee/deleteaccount.py b/src/main/OmJShah/employee/deleteaccount.py new file mode 100644 index 0000000..e69de29 diff --git a/src/main/OmJShah/employee/editaccount.py b/src/main/OmJShah/employee/editaccount.py index 8fc0a48..a38833c 100644 --- a/src/main/OmJShah/employee/editaccount.py +++ b/src/main/OmJShah/employee/editaccount.py @@ -1,22 +1,154 @@ from datetime import date +from tools import dataentering +import mysql.connector + +acc_no=None +first_name=None +last_name=None +gender=None +birth_date=None +acc_creation_date=None +mobile_no=None +email_id=None +password = None def age(birthdate): today = date.today() age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) return age -acc_no=0 -acc_creation_date=None -birth_date=None + def ep2(conn,cur): + global acc_no,first_name,last_name,gender,birth_date,acc_creation_date,mobile_no,email_id,password while True: + print("input ~ to quit") acc_no=input("Enter acc_no (max 5 int) to edit details: ") + if acc_no=="~": break if len(acc_no) <= 5: try: acc_no=int(acc_no) print("Done OK") except ValueError: print("acc_no should be an integer!!") - else: - break else: - print("Maximum length is 5!") \ No newline at end of file + print("Maximum length is 5!") + cur.execute("select * from clients where acc_no={}".format(acc_no)) + results=cur.fetchall() + if len(results)==0: + print("That employee number does not exist.") + else: + results1=results[0] + first_name=results1[2] + last_name=results1[3] + gender=results1[4] + birth_date=results1[5] + acc_creation_date=results1[6] + mobile_no=results1[7] + email_id=results1[8] + password=results1[9] + + print("1. first_name",first_name) + print("2. last_name",last_name) + print("3. gender",gender) + print("4. birth_date",birth_date) + print("5. account_creation_date",acc_creation_date) + print("6. mobile_no",mobile_no) + print("7. email_id",email_id) + print("8. password") + print("0 to quit") + ep2f2(conn,cur) + +def ep2f2(conn,cur): + global acc_no,first_name,last_name,gender,birth_date,acc_creation_date,mobile_no,email_id,password + choice=input("What would you like to change from here: ") +#First-name + if choice == "1": + first_name=dataentering.fname() + query="update clients set first_name=%s where acc_no=%s" + data=(first_name,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated first name") + +#Last-name + elif choice == "2": + last_name=dataentering.lname() + query="update clients set last_name=%s where acc_no=%s" + data=(last_name,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated last name") + +#Gender + elif choice == "3": + gender=dataentering.gender() + query="update clients set gender=%s where acc_no=%s" + data=(gender,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated gender") + +#Birth-date + elif choice == "4": + birth_date=dataentering.birthdate("Client",10,100) + if age(birth_date)-age(acc_creation_date)>=10: + query="update clients set birth_date=%s where acc_no=%s" + data=(birth_date,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated birth date") + else: + print("The client should atleast be 10 years of age.") + print("Birth date:",birth_date) + print("Account Creation Date:",acc_creation_date) + +#Account-creation-date(accd) + elif choice == "5": + acc_creation_date=dataentering.date2("client",birth_date,"account_creation",10,100) + query="update clients set accd=%s where acc_no=%s" + data=(acc_creation_date,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated account creation date") + +#Mobile No + elif choice == "6": + mobile_no,lmn=dataentering.mobileno() + query="update clients set mobile_no=LPAD(%s,%s,'0') where acc_no=%s" + data=(mobile_no,lmn,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated mobile number") + +#Email ID + elif choice == "7": + email_id=dataentering.email() + query="update clients set email=%s where acc_no=%s" + data=(mobile_no,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated mobile number") +#Password + elif choice == "8": + while True: + print("1.Show Password") + print("2.Change Password") + print("0 to quit") + if choice == "1": + print("\nThe password will be printed on the next line") + print(password) + print() + elif choice == "2": + password,lp=dataentering.clientpassword() + query="update clients set pass=LPAD(%s,%s,'0') where acc_no=%s" + data=(password,lp,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Updated password") + elif choice == "0": + break + else: + print("Wrong input!!") + elif choice == "0": + pass + else: + print("Wrong input!!") \ No newline at end of file diff --git a/src/main/OmJShah/initialization/setup.py b/src/main/OmJShah/initialization/setup.py index 303a131..08f74c1 100644 --- a/src/main/OmJShah/initialization/setup.py +++ b/src/main/OmJShah/initialization/setup.py @@ -41,7 +41,6 @@ " `emp_no` int(5) NOT NULL," " `pass` varchar(8) NOT NULL," " PRIMARY KEY (`emp_no`)," - " FOREIGN KEY(`emp_no`) REFERENCES employees(emp_no)" ") " ) @@ -52,7 +51,6 @@ " `balance` int NOT NULL," " `loan` enum('YES','NO') NOT NULL," " PRIMARY KEY (`acc_no`)," - " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" ") " ) @@ -62,7 +60,6 @@ " `balance` int NOT NULL," " `overdraft` int NOT NULL," " PRIMARY KEY (`acc_no`)," - " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" ") " ) @@ -76,7 +73,6 @@ " `amt-per-month` int NOT NULL," " `remaining_amt` int NOT NULL," " PRIMARY KEY (`acc_no`)," - " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" ") " ) @@ -86,7 +82,6 @@ " `overdraft_amt` int NOT NULL," " `od_with_interest_remaining` int NOT NULL," " PRIMARY KEY (`acc_no`)," - " FOREIGN KEY(`acc_no`) REFERENCES clients(acc_no)" ") " ) diff --git a/src/main/OmJShah/panels/employeepanel.py b/src/main/OmJShah/panels/employeepanel.py index 6220229..b8f441b 100644 --- a/src/main/OmJShah/panels/employeepanel.py +++ b/src/main/OmJShah/panels/employeepanel.py @@ -1,4 +1,5 @@ from employee import createaccount +from employee import editaccount def ep(conn,cur): print("\nWelcome employee!!") @@ -12,8 +13,6 @@ def ep(conn,cur): if ch == "1": print("------------login panel-------------") elif ch == "2": - cur.close() - conn.close() break else: print("Wrong input!!!(1 or 2 only)") @@ -43,14 +42,12 @@ def ep(conn,cur): if choice=="1": createaccount.ep1(conn,cur) elif choice=="2": - break + editaccount.ep2(conn,cur) elif choice=="3": break elif choice=="4": break elif choice=="0": - cur.close() - conn.close() break else: print("Wrong input!") diff --git a/src/main/OmJShah/tools/dataentering.py b/src/main/OmJShah/tools/dataentering.py index 50ab857..5adc439 100644 --- a/src/main/OmJShah/tools/dataentering.py +++ b/src/main/OmJShah/tools/dataentering.py @@ -1,4 +1,5 @@ from datetime import date +import mysql.connector def age(birthdate): today = date.today() @@ -80,7 +81,7 @@ def birthdate(person,minage,maxage): print("Maximum age is {} years!!!".format(maxage)) print("\nwrong input\n") -def name(): +def fname(): #Employee name and client name while True: first_name=input("Enter first name (max 15 char): ") @@ -88,7 +89,9 @@ def name(): break else: print("Max 15 characters") + return first_name +def lname(): while True: last_name=input("Enter last name (max 15 char): ") if len(last_name)<= 15: @@ -96,7 +99,7 @@ def name(): else: print("Max 15 characters") - return first_name,last_name + return last_name def gender(): #Employee Gender and client gender @@ -168,4 +171,55 @@ def date2(person,birth_date,hire_or_creation,minage,maxage): break else: print("{} must atleast be {} years of age!!".format(person,maxage)) - return hire_date \ No newline at end of file + return hire_date + +def mobileno(): + while True: + mobile_no_str=input("Enter mobile no. (7 to 15 int)") + mobile_no=mobile_no_str + #Thanks to the international phone numbering plan (ITU-T E. 164), + #phone numbers cannot contain more than 15 digits. The shortest + #international phone numbers in use contain seven digits. + try: + mobile_no=int(mobile_no) + except ValueError: + print("mobile_no should be an integer!!") + else: + if len(mobile_no_str)>6 and len(mobile_no_str)<16: + mobile_no=mobile_no_str + lmn=len(mobile_no) + break + else: + print("Mobile number can have min 7 digits and max 15!!") + return mobile_no,lmn + +def email(): + while True: + email_id=input("Enter client Email ID (max 25 char):") + if len(email_id)<26: + break + else: + print("Maximum 25 characters") + return email_id + +def clientpassword(): + while True: + password=input("Enter client login password(max 8 characters, min 4): ") + lp=len(password) + if lp>8: + print("Max 8 characters only.") + elif lp<4: + print("Minimum 4 characters to be entered.") + else: + break + return password,lp + +def tableupdate(conn,cur,query,data): + try: + cur.execute(query,data) + conn.commit() + except mysql.connector.Error as err: + print(err.msg) + print("-----------Value addition was unsuccessful!!!!-------------") + else: + return bool(True) \ No newline at end of file From 75e8bbfc2159dca06bb071e9aeca1a7487a6ff06 Mon Sep 17 00:00:00 2001 From: Om J Shah <79356504+OJASisLive@users.noreply.github.com> Date: Sat, 24 Dec 2022 22:00:04 +0530 Subject: [PATCH 42/56] Update README.md --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2a48215..3387133 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -# Branch Information: +# Latest Branch Info: +I have successfully merged the "organize-the-code" branch into this branch. The former branch is deleted now. + +# Old Branch Information: The purpose of this branch is to organize the code in packages and modules. This will soon be merged into the "[shorten-the-code](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/tree/shorten-the-code)" branch. After merger, this branch will be deleted. @@ -17,4 +20,4 @@ This project aims to create a bridge between Python and SQL and use it in real w This project is currently under development... # Done by: -Om J Shah \ No newline at end of file +Om J Shah From 0cde1aeab5d103f0466b7e1f67739c4623a5107d Mon Sep 17 00:00:00 2001 From: Om J Shah <79356504+OJASisLive@users.noreply.github.com> Date: Sat, 24 Dec 2022 22:02:05 +0530 Subject: [PATCH 43/56] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 3387133..4bf3bc6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # Latest Branch Info: +The purpose of this branch is to shorten the code by referencing duplicate code blocks. + +# NOTE: I have successfully merged the "organize-the-code" branch into this branch. The former branch is deleted now. # Old Branch Information: From 62009b36d212176006cb5fdb6f3006b8da8875a9 Mon Sep 17 00:00:00 2001 From: Om Date: Thu, 29 Dec 2022 14:53:43 +0530 Subject: [PATCH 44/56] Added method to show client table --- src/main/OmJShah/admin/editemployee.py | 1 - src/main/OmJShah/employee/createaccount.py | 1 - src/main/OmJShah/employee/deleteaccount.py | 42 ++++++++++++++++++++++ src/main/OmJShah/employee/editaccount.py | 5 ++- src/main/OmJShah/panels/employeepanel.py | 35 ++++++++++-------- src/main/OmJShah/tools/dataentering.py | 1 - 6 files changed, 64 insertions(+), 21 deletions(-) diff --git a/src/main/OmJShah/admin/editemployee.py b/src/main/OmJShah/admin/editemployee.py index 6a374d8..d9320d3 100644 --- a/src/main/OmJShah/admin/editemployee.py +++ b/src/main/OmJShah/admin/editemployee.py @@ -1,4 +1,3 @@ -import mysql.connector from datetime import date from tools import dataentering diff --git a/src/main/OmJShah/employee/createaccount.py b/src/main/OmJShah/employee/createaccount.py index 6f16f00..42b6bdc 100644 --- a/src/main/OmJShah/employee/createaccount.py +++ b/src/main/OmJShah/employee/createaccount.py @@ -1,5 +1,4 @@ from tools import dataentering -import mysql.connector def ep1(query,cur): print("-------------Create account Process-------------") diff --git a/src/main/OmJShah/employee/deleteaccount.py b/src/main/OmJShah/employee/deleteaccount.py index e69de29..604693f 100644 --- a/src/main/OmJShah/employee/deleteaccount.py +++ b/src/main/OmJShah/employee/deleteaccount.py @@ -0,0 +1,42 @@ +from tools import dataentering + +acc_no=None +def ep3(conn,cur): + global acc_no + while True: + print("\n----------------Account Deleteion Menu-----------------\n") + print("input ~ to quit") + acc_no=input("Enter acc_no (max 5 int) to DELETE THE ACCOUNT: ") + if acc_no=="~": break + elif len(acc_no) <= 5: + try: + acc_no=int(acc_no) + print("Done OK") + except ValueError: + print("acc_no should be an integer!!") + else: + print("Maximum length is 5!") + cur.execute("select * from clients where acc_no={}".format(acc_no)) + results=cur.fetchall() + if len(results)==0: + print("That account number does not exist.") + else : + results1=results[0] + first_name=results1[2] + last_name=results1[3] + print(first_name,last_name,"found.") + print(" Y - Deletes the account") + print(" N - Cancel process") + print("It's case sensitive") + choice=input("Do you really wish to delete the account of {} {}: ".format(first_name,last_name)) + if choice == "Y": + query="delete from clients where acc_no = %s" + data=(acc_no,) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Deleted {} {}'s account.".format(first_name,last_name)) + break + else: + print("Deletion was unsuccessful") + else: + break diff --git a/src/main/OmJShah/employee/editaccount.py b/src/main/OmJShah/employee/editaccount.py index a38833c..2fbdad5 100644 --- a/src/main/OmJShah/employee/editaccount.py +++ b/src/main/OmJShah/employee/editaccount.py @@ -1,6 +1,5 @@ from datetime import date from tools import dataentering -import mysql.connector acc_no=None first_name=None @@ -23,7 +22,7 @@ def ep2(conn,cur): print("input ~ to quit") acc_no=input("Enter acc_no (max 5 int) to edit details: ") if acc_no=="~": break - if len(acc_no) <= 5: + elif len(acc_no) <= 5: try: acc_no=int(acc_no) print("Done OK") @@ -34,7 +33,7 @@ def ep2(conn,cur): cur.execute("select * from clients where acc_no={}".format(acc_no)) results=cur.fetchall() if len(results)==0: - print("That employee number does not exist.") + print("That account number does not exist.") else: results1=results[0] first_name=results1[2] diff --git a/src/main/OmJShah/panels/employeepanel.py b/src/main/OmJShah/panels/employeepanel.py index b8f441b..58099f6 100644 --- a/src/main/OmJShah/panels/employeepanel.py +++ b/src/main/OmJShah/panels/employeepanel.py @@ -1,21 +1,24 @@ from employee import createaccount from employee import editaccount +from employee import deleteaccount +from employee import showaccounts def ep(conn,cur): print("\nWelcome employee!!") print("Please log in with your creds (emp_id and password):") - - while True: - print("---------------------Employee Panel--------------------") - print("1.Employee login.") - print("2.Quit.") - ch = input("Enter your choice:") - if ch == "1": - print("------------login panel-------------") - elif ch == "2": - break - else: - print("Wrong input!!!(1 or 2 only)") + print("---------------------Employee Panel--------------------") + print("1.Employee login.") + print("2.Quit.") + ch = input("Enter your choice:") + logged_in= bool(False) + if ch == "1": + print("------------login panel-------------") + logged_in=bool(True) + elif ch == "2": + pass + else: + print("Wrong input!!!(1 or 2 only)") + if logged_in: while True: emp_no=input("Enter emp_no (max 5 int): ") if len(emp_no) <= 5: @@ -36,7 +39,8 @@ def ep(conn,cur): else: while True: password=record[0][1] - a=input("Enter your password:") + a=input("\nEnter your password to continue:") + print("Input ~ to quit.") if a==password: choice=menu(emp_no,cur) if choice=="1": @@ -44,13 +48,14 @@ def ep(conn,cur): elif choice=="2": editaccount.ep2(conn,cur) elif choice=="3": - break + deleteaccount.ep3(conn,cur) elif choice=="4": - break + showaccounts.ep4(cur) elif choice=="0": break else: print("Wrong input!") + elif a == "~" : break else: print("Wrong password!!") break diff --git a/src/main/OmJShah/tools/dataentering.py b/src/main/OmJShah/tools/dataentering.py index 5adc439..4049cc9 100644 --- a/src/main/OmJShah/tools/dataentering.py +++ b/src/main/OmJShah/tools/dataentering.py @@ -73,7 +73,6 @@ def birthdate(person,minage,maxage): else: if age(birth_date)>=minage and age(birth_date)<=maxage: return birth_date - break else: if age(birth_date) Date: Thu, 29 Dec 2022 14:55:13 +0530 Subject: [PATCH 45/56] implemented changes --- src/main/OmJShah/employee/showaccounts.py | 11 +++++++++++ src/main/OmJShah/tests.py | 8 ++++++++ 2 files changed, 19 insertions(+) create mode 100644 src/main/OmJShah/employee/showaccounts.py create mode 100644 src/main/OmJShah/tests.py diff --git a/src/main/OmJShah/employee/showaccounts.py b/src/main/OmJShah/employee/showaccounts.py new file mode 100644 index 0000000..97def00 --- /dev/null +++ b/src/main/OmJShah/employee/showaccounts.py @@ -0,0 +1,11 @@ +from tools import dataentering + +def ep4(cur): + cur.execute("select * from clients") + results=cur.fetchall() + print("+---------+-------+------------------+------------------+---------+-------------+-------------+------------------+---------------------------+") + print("|","%7s"%"ACC_NO","|","%5s"%"TYPE","|","%16s"%"FIRST_NAME","|","%16s"%"LAST_NAME","|","%7s"%"GENDER","|","%11s"%"BIRTH_DATE","|","%11s"%"ACCD","|","%16s"%"MOBILE_NO","|","%25s"%"EMAIL_ID","|") + for row in results: + print("+---------+-------+------------------+------------------+---------+-------------+-------------+------------------+---------------------------+") + print("|","%7s"%row[0],"|","%5s"%row[1],"|","%16s"%row[2],"|","%16s"%row[3],"|","%7s"%row[4],"|","%11s"%row[5],"|","%11s"%row[6],"|","%16s"%row[7],"|","%25s"%row[8],"|") + print("+---------+-------+------------------+------------------+---------+-------------+-------------+------------------+---------------------------+") diff --git a/src/main/OmJShah/tests.py b/src/main/OmJShah/tests.py new file mode 100644 index 0000000..74a1dfb --- /dev/null +++ b/src/main/OmJShah/tests.py @@ -0,0 +1,8 @@ +from employee import deleteaccount +from tools import connection +from admin import showemployee +from employee import showaccounts +conn,cur=connection.cc() +showaccounts.ep4(cur) +#showemployee.ap4(cur) +#deleteaccount.ep3(conn,cur) \ No newline at end of file From dcd5518e3d099234ccd431842bae1f31479a1fc8 Mon Sep 17 00:00:00 2001 From: Om Date: Thu, 29 Dec 2022 21:39:30 +0530 Subject: [PATCH 46/56] Implemented addition of data in savings and current tables --- src/main/OmJShah/employee/createaccount.py | 27 ++++++++++++++++++++++ src/main/OmJShah/initialization/setup.py | 4 ++-- src/main/OmJShah/tests.py | 3 ++- src/main/OmJShah/tools/dataentering.py | 20 ++++++++++++++-- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/main/OmJShah/employee/createaccount.py b/src/main/OmJShah/employee/createaccount.py index 42b6bdc..fb37626 100644 --- a/src/main/OmJShah/employee/createaccount.py +++ b/src/main/OmJShah/employee/createaccount.py @@ -45,4 +45,31 @@ def ep1(query,cur): done=dataentering.tableupdate(query,cur,add_client,data_client) if done: + if acc_type=='S': + bank_balance=dataentering.balance() + add_savings=("INSERT INTO SAVINGS VALUES(%s,%s,'NO')") + data_savings=(acc_no,bank_balance) + done2=dataentering.tableupdate(query,cur,add_savings,data_savings) + if done2: + pass + else: + print("Unable to add to savings table.") + print("Deleting from main table.......") + delete_client=("delete from clients where acc_no = %s") + data_delete_client=(acc_no) + done=dataentering.tableupdate(query,cur,delete_client,data_delete_client) + else: + bank_balance=dataentering.balance() + add_current=("INSERT INTO current VALUES(%s,%s,'NO')") + data_current=(acc_no,bank_balance) + done2=dataentering.tableupdate(query,cur,add_current,data_current) + if done2: + pass + else: + print("Unable to add to savings table.") + print("Deleting from main table.......") + delete_client=("delete from clients where acc_no = %s") + data_delete_client=(acc_no) + done=dataentering.tableupdate(query,cur,delete_client,data_delete_client) + print("Values added successfully!!") \ No newline at end of file diff --git a/src/main/OmJShah/initialization/setup.py b/src/main/OmJShah/initialization/setup.py index 08f74c1..e88fe29 100644 --- a/src/main/OmJShah/initialization/setup.py +++ b/src/main/OmJShah/initialization/setup.py @@ -58,7 +58,7 @@ "CREATE TABLE `current` (" " `acc_no` int(5) NOT NULL," " `balance` int NOT NULL," - " `overdraft` int NOT NULL," + " `overdraft` enum('YES','NO') NOT NULL," " PRIMARY KEY (`acc_no`)," ") " ) @@ -140,7 +140,7 @@ def querycheck(): print("already exists.") existing+=1 else: - print(err.msg()) + print(err.msg) else: print("OK") if existing==7: diff --git a/src/main/OmJShah/tests.py b/src/main/OmJShah/tests.py index 74a1dfb..3a4e29c 100644 --- a/src/main/OmJShah/tests.py +++ b/src/main/OmJShah/tests.py @@ -5,4 +5,5 @@ conn,cur=connection.cc() showaccounts.ep4(cur) #showemployee.ap4(cur) -#deleteaccount.ep3(conn,cur) \ No newline at end of file +#deleteaccount.ep3(conn,cur) +#alter table current modify column overdraft enum('YES','NO'); \ No newline at end of file diff --git a/src/main/OmJShah/tools/dataentering.py b/src/main/OmJShah/tools/dataentering.py index 4049cc9..b02121e 100644 --- a/src/main/OmJShah/tools/dataentering.py +++ b/src/main/OmJShah/tools/dataentering.py @@ -219,6 +219,22 @@ def tableupdate(conn,cur,query,data): conn.commit() except mysql.connector.Error as err: print(err.msg) - print("-----------Value addition was unsuccessful!!!!-------------") + print("-----------Value addition/deletion was unsuccessful!!!!-------------") else: - return bool(True) \ No newline at end of file + return bool(True) + +#bank balance +def balance(): + while True: + bank_balance=input("Enter starting balance (min 1000 currency): ") + if len(bank_balance) >= 3: + try: + bank_balance=int(bank_balance) + print("Done OK") + except ValueError: + print("Balance should be an integer!!") + else: + if bank_balance>=1000: + return bank_balance + else: + print("Minimum balance is 1000 currency") \ No newline at end of file From 74ae71b84b454bdf68af25c51550d42548e4d978 Mon Sep 17 00:00:00 2001 From: Om Date: Fri, 30 Dec 2022 00:00:00 +0530 Subject: [PATCH 47/56] Fixed bugs, implemented extra deletion --- src/main/OmJShah/employee/deleteaccount.py | 13 +++++++++++-- src/main/OmJShah/panels/employeepanel.py | 5 +++-- src/main/OmJShah/tests.py | 4 +++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/OmJShah/employee/deleteaccount.py b/src/main/OmJShah/employee/deleteaccount.py index 604693f..f0c7957 100644 --- a/src/main/OmJShah/employee/deleteaccount.py +++ b/src/main/OmJShah/employee/deleteaccount.py @@ -22,6 +22,9 @@ def ep3(conn,cur): print("That account number does not exist.") else : results1=results[0] + acc_type=results1[1] + if acc_type == 'S': acc_type="savings" + if acc_type == 'C': acc_type="current" first_name=results1[2] last_name=results1[3] print(first_name,last_name,"found.") @@ -32,10 +35,16 @@ def ep3(conn,cur): if choice == "Y": query="delete from clients where acc_no = %s" data=(acc_no,) + query2="delete from {} where acc_no = %s".format(acc_type) + data2=(acc_no,) done=dataentering.tableupdate(conn,cur,query,data) if done: - print("Deleted {} {}'s account.".format(first_name,last_name)) - break + done2=dataentering.tableupdate(conn,cur,query2,data2) + if done2: + print("Deleted {} {}'s account.".format(first_name,last_name)) + break + else: + print("Deletion from {} table was unsuccessful".format(acc_type)) else: print("Deletion was unsuccessful") else: diff --git a/src/main/OmJShah/panels/employeepanel.py b/src/main/OmJShah/panels/employeepanel.py index 58099f6..91cba8b 100644 --- a/src/main/OmJShah/panels/employeepanel.py +++ b/src/main/OmJShah/panels/employeepanel.py @@ -39,8 +39,9 @@ def ep(conn,cur): else: while True: password=record[0][1] - a=input("\nEnter your password to continue:") - print("Input ~ to quit.") + print("\nInput ~ to quit.") + a=input("Enter your password to continue:") + print() if a==password: choice=menu(emp_no,cur) if choice=="1": diff --git a/src/main/OmJShah/tests.py b/src/main/OmJShah/tests.py index 3a4e29c..167b1de 100644 --- a/src/main/OmJShah/tests.py +++ b/src/main/OmJShah/tests.py @@ -6,4 +6,6 @@ showaccounts.ep4(cur) #showemployee.ap4(cur) #deleteaccount.ep3(conn,cur) -#alter table current modify column overdraft enum('YES','NO'); \ No newline at end of file +#alter table current modify column overdraft enum('YES','NO'); +#alter table current drop foreign key current_ibfk_1; +#alter table savings drop foreign key savings_ibfk_1; \ No newline at end of file From 907b06a728a64fc85c44a02af26bca082132e556 Mon Sep 17 00:00:00 2001 From: Om Date: Fri, 30 Dec 2022 15:21:18 +0530 Subject: [PATCH 48/56] Added Client panel, fixed bugs... --- src/main/OmJShah/admin/hireemployee.py | 2 +- src/main/OmJShah/employee/editaccount.py | 17 ++++---- src/main/OmJShah/initialization/setup.py | 10 ++--- src/main/OmJShah/main.py | 2 +- src/main/OmJShah/panels/accounttype.py | 7 ++-- src/main/OmJShah/panels/clientpanel.py | 51 ++++++++++++++++++++++++ src/main/OmJShah/tests.py | 7 +--- src/main/OmJShah/tools/connection.py | 20 ++++++---- src/main/OmJShah/tools/dataentering.py | 5 +-- 9 files changed, 87 insertions(+), 34 deletions(-) create mode 100644 src/main/OmJShah/panels/clientpanel.py diff --git a/src/main/OmJShah/admin/hireemployee.py b/src/main/OmJShah/admin/hireemployee.py index c1cab84..fed7e35 100644 --- a/src/main/OmJShah/admin/hireemployee.py +++ b/src/main/OmJShah/admin/hireemployee.py @@ -9,7 +9,7 @@ def ap1(query,cur): #Employee Birth date birth_date=dataentering.birthdate("employee",20,60) #Employee name - first_name,last_name=dataentering.name() + first_name,last_name=dataentering.fname(),dataentering.lname() #Employee Gender gender=dataentering.gender() #Employee hire date diff --git a/src/main/OmJShah/employee/editaccount.py b/src/main/OmJShah/employee/editaccount.py index 2fbdad5..cf290ef 100644 --- a/src/main/OmJShah/employee/editaccount.py +++ b/src/main/OmJShah/employee/editaccount.py @@ -19,7 +19,7 @@ def age(birthdate): def ep2(conn,cur): global acc_no,first_name,last_name,gender,birth_date,acc_creation_date,mobile_no,email_id,password while True: - print("input ~ to quit") + print("\ninput ~ to quit") acc_no=input("Enter acc_no (max 5 int) to edit details: ") if acc_no=="~": break elif len(acc_no) <= 5: @@ -45,13 +45,13 @@ def ep2(conn,cur): email_id=results1[8] password=results1[9] - print("1. first_name",first_name) - print("2. last_name",last_name) - print("3. gender",gender) - print("4. birth_date",birth_date) - print("5. account_creation_date",acc_creation_date) - print("6. mobile_no",mobile_no) - print("7. email_id",email_id) + print("1. first_name = ",first_name) + print("2. last_name = ",last_name) + print("3. gender = ",gender) + print("4. birth_date = ",birth_date) + print("5. account_creation_date = ",acc_creation_date) + print("6. mobile_no = ",mobile_no) + print("7. email_id = ",email_id) print("8. password") print("0 to quit") ep2f2(conn,cur) @@ -132,6 +132,7 @@ def ep2f2(conn,cur): print("1.Show Password") print("2.Change Password") print("0 to quit") + choice=input("Enter choice: ") if choice == "1": print("\nThe password will be printed on the next line") print(password) diff --git a/src/main/OmJShah/initialization/setup.py b/src/main/OmJShah/initialization/setup.py index e88fe29..9e94974 100644 --- a/src/main/OmJShah/initialization/setup.py +++ b/src/main/OmJShah/initialization/setup.py @@ -40,7 +40,7 @@ "CREATE TABLE `empass` (" " `emp_no` int(5) NOT NULL," " `pass` varchar(8) NOT NULL," - " PRIMARY KEY (`emp_no`)," + " PRIMARY KEY (`emp_no`)" ") " ) @@ -50,7 +50,7 @@ " `acc_no` int(5) NOT NULL," " `balance` int NOT NULL," " `loan` enum('YES','NO') NOT NULL," - " PRIMARY KEY (`acc_no`)," + " PRIMARY KEY (`acc_no`)" ") " ) @@ -59,7 +59,7 @@ " `acc_no` int(5) NOT NULL," " `balance` int NOT NULL," " `overdraft` enum('YES','NO') NOT NULL," - " PRIMARY KEY (`acc_no`)," + " PRIMARY KEY (`acc_no`)" ") " ) @@ -72,7 +72,7 @@ " `iterest_perc_per_annum` int(1) NOT NULL," " `amt-per-month` int NOT NULL," " `remaining_amt` int NOT NULL," - " PRIMARY KEY (`acc_no`)," + " PRIMARY KEY (`acc_no`)" ") " ) @@ -81,7 +81,7 @@ " `acc_no` int(5) NOT NULL," " `overdraft_amt` int NOT NULL," " `od_with_interest_remaining` int NOT NULL," - " PRIMARY KEY (`acc_no`)," + " PRIMARY KEY (`acc_no`)" ") " ) diff --git a/src/main/OmJShah/main.py b/src/main/OmJShah/main.py index a31c458..40fdd60 100644 --- a/src/main/OmJShah/main.py +++ b/src/main/OmJShah/main.py @@ -2,13 +2,13 @@ from initialization import check from panels import accounttype from tools import connection -query,cur=connection.cc() while True: print("1.Continue") print("2.Quit") a=input("Enter your choice(1,2): ") if a == "1": if not check.check(): + query,cur=connection.cc() accounttype.acctype(query,cur) break else: diff --git a/src/main/OmJShah/panels/accounttype.py b/src/main/OmJShah/panels/accounttype.py index bbe254d..bdcae35 100644 --- a/src/main/OmJShah/panels/accounttype.py +++ b/src/main/OmJShah/panels/accounttype.py @@ -1,12 +1,13 @@ from panels import adminpanel from panels import employeepanel +from panels import clientpanel def acctype(query,cur): while True: print("--------------Account Selector Menu--------------") print("1.Admin.") print("2.Employee.") print("3.Client.") - print("Enter 0 to end process.") + print("Enter ~ to end process.") a=input("\nEnter your account type:") if a=='1': @@ -24,9 +25,9 @@ def acctype(query,cur): print("\nWrong password!\n") elif a=='3': - return 3 + clientpanel.cp(query,cur) - elif a=='0': + elif a=='~': print("\nShutting down the program.") break diff --git a/src/main/OmJShah/panels/clientpanel.py b/src/main/OmJShah/panels/clientpanel.py new file mode 100644 index 0000000..383d54d --- /dev/null +++ b/src/main/OmJShah/panels/clientpanel.py @@ -0,0 +1,51 @@ +from tools import dataentering +def cp(conn,cur): + print("\n------------------Client Panel------------------") + print("Welcome client!!") + acc_no=dataentering.primary_key_no("acc_no") + cur.execute("select first_name,last_name,pass,type from clients where acc_no = {}".format(acc_no)) + result=cur.fetchall() + if result == []: + print("No account holder with this account number.") + else: + acc_type=result[0][3] + if acc_type == 'S': acc_type="savings" + if acc_type == 'C': acc_type="current" + while True: + print("\nInput ~ to quit") + passwd=input("Enter password to continue: ") + if passwd == "~": + break + elif passwd == result[0][2]: + print("\n--------------------Welcome {} {}-------------------".format(result[0][0],result[0][1])) + cmenu(conn,cur,acc_no,acc_type) + else: + print("Wrong password") + +def cmenu(conn,cur,acc_no,acc_type): + print("1.Show Balance") + print("2.Deposit money") + print("3.Withdraw money") + if acc_type=='savings': + print("4.Ask for loan") + print("5.Check loan status") + else: + print("4.Check overdraft status") + print("~ to quit") + choice=input("Enter your choice: ") + if choice=="~": pass + elif choice=="1": + cur.execute("select balance from {} where acc_no={}".format(acc_type,acc_no)) + balance=cur.fetchall() + print("Your balance is: ",balance[0][0]) + print() + elif choice=="2": + pass + elif choice=="3": + pass + elif choice=="4": + pass + elif choice=="5": + pass + else: + print("Wrong input!!!!\n") diff --git a/src/main/OmJShah/tests.py b/src/main/OmJShah/tests.py index 167b1de..61c983b 100644 --- a/src/main/OmJShah/tests.py +++ b/src/main/OmJShah/tests.py @@ -1,11 +1,8 @@ from employee import deleteaccount from tools import connection -from admin import showemployee -from employee import showaccounts +from panels import clientpanel conn,cur=connection.cc() -showaccounts.ep4(cur) -#showemployee.ap4(cur) -#deleteaccount.ep3(conn,cur) +clientpanel.cp(conn,cur) #alter table current modify column overdraft enum('YES','NO'); #alter table current drop foreign key current_ibfk_1; #alter table savings drop foreign key savings_ibfk_1; \ No newline at end of file diff --git a/src/main/OmJShah/tools/connection.py b/src/main/OmJShah/tools/connection.py index 3fc55f4..70bd1ef 100644 --- a/src/main/OmJShah/tools/connection.py +++ b/src/main/OmJShah/tools/connection.py @@ -1,13 +1,17 @@ +from initialization import check import mysql.connector import pickle def cc(): global cur global conn - cred = open("cred.dat","rb") - dat=pickle.load(cred) - cred.close() - Passwo=dat[0] - Databa=dat[1] - conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) - cur=conn.cursor() - return conn,cur \ No newline at end of file + if not check.check(): + cred = open("cred.dat","rb") + dat=pickle.load(cred) + cred.close() + Passwo=dat[0] + Databa=dat[1] + conn=mysql.connector.connect(host="localhost",user="root",password=Passwo,database=Databa) + cur=conn.cursor() + return conn,cur + else: + return 0,0 \ No newline at end of file diff --git a/src/main/OmJShah/tools/dataentering.py b/src/main/OmJShah/tools/dataentering.py index b02121e..327cb8a 100644 --- a/src/main/OmJShah/tools/dataentering.py +++ b/src/main/OmJShah/tools/dataentering.py @@ -19,7 +19,6 @@ def primary_key_no(x): print("{} should be an integer!!".format(x)) else: return emp_no - break else: print("Maximum length is 5!") @@ -174,7 +173,7 @@ def date2(person,birth_date,hire_or_creation,minage,maxage): def mobileno(): while True: - mobile_no_str=input("Enter mobile no. (7 to 15 int)") + mobile_no_str=input("Enter mobile no. (7 to 15 int): ") mobile_no=mobile_no_str #Thanks to the international phone numbering plan (ITU-T E. 164), #phone numbers cannot contain more than 15 digits. The shortest @@ -194,7 +193,7 @@ def mobileno(): def email(): while True: - email_id=input("Enter client Email ID (max 25 char):") + email_id=input("Enter client Email ID (max 25 char): ") if len(email_id)<26: break else: From a8240058caa4674e65eed74dcf8172d60ce49c9e Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 31 Dec 2022 01:56:17 +0530 Subject: [PATCH 49/56] 2 methods added for clients --- photos/cash_in_hand.png | Bin 0 -> 14373 bytes src/main/OmJShah/client/depositmoney.py | 37 +++++++++++++++++++++++ src/main/OmJShah/client/redeemcode.py | 13 ++++++++ src/main/OmJShah/initialization/setup.py | 10 +++++- src/main/OmJShah/panels/clientpanel.py | 13 +++++--- src/main/OmJShah/tools/dataentering.py | 30 +++++++++++++++++- 6 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 photos/cash_in_hand.png create mode 100644 src/main/OmJShah/client/depositmoney.py create mode 100644 src/main/OmJShah/client/redeemcode.py diff --git a/photos/cash_in_hand.png b/photos/cash_in_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..4135927ca1e33eb164b1348c1cc11e2a0ee05924 GIT binary patch literal 14373 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ΞXXw zcC4jh0!8i(mHcm28)D+qoP}A378jB|qDab)cr@BJ7RGLJ2j>xUJ^CRhxo;9z#EE)- zw{G)B5nVgT+_S66E-M~zxtj4qx-(Bs&Uw5V$Sp*n5iME^As<$M_YTlgC1wtjOj_6?(8$!xc%STDEjd7nZt}s zjF0yX*+&C==S8o&Z{AEE4SPm?Ki|uysDN)-=vG4>s;wfF-g~<|8&cPKaiUclnS-2Q|-x8LPOfL?CF3t`s1YFz`` zwfRWqkZ{SFbjvx+2Yh{Yi!S(*hVx0diPE0F2UQM`cglxaFoBk(8!hm=S|hbeJ`;*n z;wgZX+njj2bC1$z%;4ydu2XP$+)HEPZ>);pYBu}hgCk*ahS4>;Efgl*2UUGO4x7tK zS@iIdjx0huy~gpq1k;mltO}kkbqqKoezYyNyw@paI@Jm@u&X!M>loB3@2BI?-dWb< z+mHL%Wx>&xWb=pI23=yFVjNt}@GUG%1Y z0XZ2xdUE)kN}lh;6Uf6X)^sX|8o>=>@M5Pwrce)PMd5Ua$3cye8 zw!>*vQ`IShe8;wn$SrDx%-FIQy^n7NCxH+1qCzi}X6#*yJ=3m`j^lRb)_XT?BI&6S zJNS%xJn1e!aWNNn3|x{I44pgXn7$?FSCrEMvslN;Cl|&pu*$D6VA3gRcRTM>j1m9& z$fvl1S&V~<8u=mP6ga2rSeYUG+63KG(PfZhYeEV*%pp<5ixG+Y%Nu%1_jnW;Nl+N5X8Nu(d*3vu+4*hC9ii3pqi0lHP?rXQvS92w^bN=k1E z=gV&t__npcH4)gn(|HI?ym27-CO~~WZJ@*CoqrfN{izXH-uw3IZd+aO3etEr?chXB z;9j-s{$;UMC790@1^j?kWH-aO;tPWejx=Ic#i0mMZkC!~57HiabQ1!4>Rr8>n^sh< z6G*o9-wL#l-5Nh?PADEnp`m=J|LRyRVrnfoe?7VHBs{;CyXDG?`=^pKJ8FQefSo5N za3hmmgsJ(Dll=18ygZMV0#Y=cbUYlMKdeR`ochFgl5e&*!OTdXTVv^?Sw#sJn{k{i z^vzPZ)hR6qL*`8iW-35FxPU_smikWo0oeJb3Vt11NF(qaQhe>esd1`6uwt*=n0o|n zo$793Dmbz3y^*&0g|n!yzm@8?ECVQY0ZxNHya2u#W|m{2pHC?G*rjFH1XI;o+xIPC z_u?e`;!haGxyatN@Mhz6sZcOG$6?lWn*#WCrCoR)c=zHnHy>cGn@K`6hcY2g*Mq4o t=>M=F_}>R8V8Z?nU#2sa)d9cE*UTNBg{XnA^vTH`J96T1@xily{x7$cjWPfL literal 0 HcmV?d00001 diff --git a/src/main/OmJShah/client/depositmoney.py b/src/main/OmJShah/client/depositmoney.py new file mode 100644 index 0000000..d0651d0 --- /dev/null +++ b/src/main/OmJShah/client/depositmoney.py @@ -0,0 +1,37 @@ +from tools import dataentering +def cp2(conn,cur,acc_type,acc_no): + cur.execute("select cash_in_hand from cash_in_hand where acc_no={}".format(acc_no)) + cash_in_hand=cur.fetchall() + if cash_in_hand==[]: + query="insert into cash_in_hand values(%s,0)" + data=(acc_no,) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + cash_in_hand=0 + else: + print("Unable to figure out your cash in hand values.") + else: + cash_in_hand=cash_in_hand[0][0] + + deposit_amt=dataentering.amounts("deposit",cash_in_hand,acc_type) + if deposit_amt: + query2="update {} set balance = balance+{} where acc_no = %s".format(acc_type,deposit_amt) + data2=(acc_no,) + done2=dataentering.tableupdate(conn,cur,query2,data2) + if done2: + query3="update cash_in_hand set cash_in_hand = cash_in_hand-%s where acc_no = %s" + data3=(cash_in_hand,acc_no) + done3=dataentering.tableupdate(conn,cur,query3,data3) + if done3: + print("Deposit of {} currency successful".format(deposit_amt)) + print() + else: + query2="update {} set balance = balance-{} where acc_no = %s".format(acc_type,deposit_amt) + data2=(acc_no,) + done2=dataentering.tableupdate(conn,cur,query2,data2) + if done2: + print("Unable to subtract amount from cash_in_hand\n") + else: + print("Error while trying to add amount to balance.\n") + else: + pass \ No newline at end of file diff --git a/src/main/OmJShah/client/redeemcode.py b/src/main/OmJShah/client/redeemcode.py new file mode 100644 index 0000000..1b39543 --- /dev/null +++ b/src/main/OmJShah/client/redeemcode.py @@ -0,0 +1,13 @@ +from tools import dataentering +def cp4(conn,cur,acc_type,acc_no): + rc=input("Enter redeem code: ") + if rc=="TESTREDEEMCODE": + query="update {} set balance = balance+%s where acc_no = %s".format(acc_type) + data=(5000,acc_no) + done = dataentering.tableupdate(conn,cur,query,data) + if done: + print("Added 5000 currency to your account!!") + else: + print("There was a problem while processing the request") + else: + print("Sorry! This redeem code doesn't work") \ No newline at end of file diff --git a/src/main/OmJShah/initialization/setup.py b/src/main/OmJShah/initialization/setup.py index 9e94974..51fb5be 100644 --- a/src/main/OmJShah/initialization/setup.py +++ b/src/main/OmJShah/initialization/setup.py @@ -85,6 +85,14 @@ ") " ) +TABLES['cash_in_hand']=( + "CREATE TABLE `cash_in_hand` (" + " `acc_no` int(5) NOT NULL," + " `cash_in_hand` int NOT NULL," + " PRIMARY KEY (`acc_no`)" + ") " +) + ############################################################################################ query="" @@ -143,7 +151,7 @@ def querycheck(): print(err.msg) else: print("OK") - if existing==7: + if existing==8: with open("firsttime.txt","w") as f: f.write("False") ans=True diff --git a/src/main/OmJShah/panels/clientpanel.py b/src/main/OmJShah/panels/clientpanel.py index 383d54d..183cebf 100644 --- a/src/main/OmJShah/panels/clientpanel.py +++ b/src/main/OmJShah/panels/clientpanel.py @@ -1,4 +1,6 @@ from tools import dataentering +from client import redeemcode +from client import depositmoney def cp(conn,cur): print("\n------------------Client Panel------------------") print("Welcome client!!") @@ -26,11 +28,12 @@ def cmenu(conn,cur,acc_no,acc_type): print("1.Show Balance") print("2.Deposit money") print("3.Withdraw money") + print("4.Redeem Code") if acc_type=='savings': - print("4.Ask for loan") - print("5.Check loan status") + print("5.Ask for loan") + print("6.Check loan status") else: - print("4.Check overdraft status") + print("5.Check overdraft status") print("~ to quit") choice=input("Enter your choice: ") if choice=="~": pass @@ -40,11 +43,11 @@ def cmenu(conn,cur,acc_no,acc_type): print("Your balance is: ",balance[0][0]) print() elif choice=="2": - pass + depositmoney.cp2(conn,cur,acc_type,acc_no) elif choice=="3": pass elif choice=="4": - pass + redeemcode.cp4(conn,cur,acc_type,acc_no) elif choice=="5": pass else: diff --git a/src/main/OmJShah/tools/dataentering.py b/src/main/OmJShah/tools/dataentering.py index 327cb8a..285b353 100644 --- a/src/main/OmJShah/tools/dataentering.py +++ b/src/main/OmJShah/tools/dataentering.py @@ -236,4 +236,32 @@ def balance(): if bank_balance>=1000: return bank_balance else: - print("Minimum balance is 1000 currency") \ No newline at end of file + print("Minimum balance is 1000 currency") + +#Withdraw amount and Deposit amount +def amounts(deposit_or_withdraw,cash_in_hand,acc_type): + while True: + print() + print("--------------------{} screen-------------------") + amt=input("Enter amount to {}: ".format(deposit_or_withdraw)) + try: + amt=int(amt) + print("Done OK") + except ValueError: + print("{} amount should be an integer!!".format(deposit_or_withdraw)) + else: + if amt Date: Sat, 31 Dec 2022 02:05:19 +0530 Subject: [PATCH 50/56] Updated info about pr --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ddfe88..224519b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -# NOTICE: +# LATEST NOTICE: +See [this pull request](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/pull/6) for details about merger of ["shorten-the-code"](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/tree/shorten-the-code) branch into the main branch. + +# OLD NOTICE: Further updates would be pushed on the ["shorten-the-code"](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/tree/shorten-the-code) branch where I am planning to shorten the code by removing duplicate code and referencing them. From ee42a87e7d264fb9056ecb932cbe9a096e483bdd Mon Sep 17 00:00:00 2001 From: Om Date: Sat, 31 Dec 2022 16:45:23 +0530 Subject: [PATCH 51/56] Added some more client methods --- firsttime.txt | 1 - src/main/OmJShah/client/depositmoney.py | 22 +++-------- src/main/OmJShah/client/loan_od.py | 3 ++ src/main/OmJShah/client/transfermoney.py | 49 ++++++++++++++++++++++++ src/main/OmJShah/client/withdrawmoney.py | 28 ++++++++++++++ src/main/OmJShah/initialization/check.py | 4 +- src/main/OmJShah/initialization/setup.py | 8 ++-- src/main/OmJShah/panels/clientpanel.py | 19 +++++++-- src/main/OmJShah/tests.py | 8 ++-- src/main/OmJShah/tools/connection.py | 2 +- src/main/OmJShah/tools/dataentering.py | 44 ++++++++++++++------- 11 files changed, 142 insertions(+), 46 deletions(-) delete mode 100644 firsttime.txt create mode 100644 src/main/OmJShah/client/loan_od.py create mode 100644 src/main/OmJShah/client/transfermoney.py create mode 100644 src/main/OmJShah/client/withdrawmoney.py diff --git a/firsttime.txt b/firsttime.txt deleted file mode 100644 index c1f22fb..0000000 --- a/firsttime.txt +++ /dev/null @@ -1 +0,0 @@ -False \ No newline at end of file diff --git a/src/main/OmJShah/client/depositmoney.py b/src/main/OmJShah/client/depositmoney.py index d0651d0..0ddf3d7 100644 --- a/src/main/OmJShah/client/depositmoney.py +++ b/src/main/OmJShah/client/depositmoney.py @@ -1,22 +1,12 @@ from tools import dataentering def cp2(conn,cur,acc_type,acc_no): - cur.execute("select cash_in_hand from cash_in_hand where acc_no={}".format(acc_no)) - cash_in_hand=cur.fetchall() - if cash_in_hand==[]: - query="insert into cash_in_hand values(%s,0)" - data=(acc_no,) - done=dataentering.tableupdate(conn,cur,query,data) - if done: - cash_in_hand=0 - else: - print("Unable to figure out your cash in hand values.") - else: - cash_in_hand=cash_in_hand[0][0] + cash_in_hand=dataentering.handcash(conn,cur,acc_no) deposit_amt=dataentering.amounts("deposit",cash_in_hand,acc_type) + deposit_amt=deposit_amt[0] if deposit_amt: - query2="update {} set balance = balance+{} where acc_no = %s".format(acc_type,deposit_amt) - data2=(acc_no,) + query2="update {} set balance = balance+%s where acc_no = %s".format(acc_type) + data2=(deposit_amt,acc_no) done2=dataentering.tableupdate(conn,cur,query2,data2) if done2: query3="update cash_in_hand set cash_in_hand = cash_in_hand-%s where acc_no = %s" @@ -26,8 +16,8 @@ def cp2(conn,cur,acc_type,acc_no): print("Deposit of {} currency successful".format(deposit_amt)) print() else: - query2="update {} set balance = balance-{} where acc_no = %s".format(acc_type,deposit_amt) - data2=(acc_no,) + query2="update {} set balance = balance-%s where acc_no = %s".format(acc_type) + data2=(deposit_amt,acc_no) done2=dataentering.tableupdate(conn,cur,query2,data2) if done2: print("Unable to subtract amount from cash_in_hand\n") diff --git a/src/main/OmJShah/client/loan_od.py b/src/main/OmJShah/client/loan_od.py new file mode 100644 index 0000000..ee71c9d --- /dev/null +++ b/src/main/OmJShah/client/loan_od.py @@ -0,0 +1,3 @@ +from tools import dataentering +def cp5(conn,cur,acc_type,acc_no): + pass \ No newline at end of file diff --git a/src/main/OmJShah/client/transfermoney.py b/src/main/OmJShah/client/transfermoney.py new file mode 100644 index 0000000..c9cec87 --- /dev/null +++ b/src/main/OmJShah/client/transfermoney.py @@ -0,0 +1,49 @@ +from tools import dataentering +def cp6(conn,cur,acc_type,acc_no,balance): + acc_to_transfer=dataentering.primary_key_no("acc_no of receiver") + cur.execute("select * from clients where acc_no={}".format(acc_to_transfer)) + result=cur.fetchall() + if result==[]: + print("That account number doesn't exist\n") + elif acc_to_transfer==acc_no: + print("You can't transfer to yourself\n") + else: + acc_type_receiver=result[0][1] + if acc_type_receiver == 'S': acc_type_receiver="savings" + if acc_type_receiver == 'C': acc_type_receiver="current" + fname,lname=result[0][2],result[0][3] + transfer_amt,overdraft=dataentering.amounts("transfer",balance,acc_type) + print(" Y - Yes") + print(" N - No") + ch=input("Do you want transfer {} currency to {} {}'s account: ".format(transfer_amt,fname,lname)) + if ch == "Y" : + + if transfer_amt: + if acc_type=="current": + if overdraft!=None: + print('''You will be notified about the overdraft status when an employee + sanctions your overdraft...''') + #TODO:some more stuff + else: + query="update {} set balance=balance-%s where acc_no = %s".format(acc_type) + data=(transfer_amt,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + query2="update {} set balance=balance+%s where acc_no=%s".format(acc_type_receiver) + data2=(transfer_amt,acc_to_transfer) + done2=dataentering.tableupdate(conn,cur,query2,data2) + if done2: + print("Successfully transferred {} currency\n".format(transfer_amt)) + else: + query="update {} set balance=balance+%s where acc_no = %s".format(acc_type) + data=(transfer_amt,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Couldn't update receiver's balance\n") + else: + print("Couldn't transfer money.") + else : + print("You do not have enough balance!!") + + else: + print("Cancelled transfer") \ No newline at end of file diff --git a/src/main/OmJShah/client/withdrawmoney.py b/src/main/OmJShah/client/withdrawmoney.py new file mode 100644 index 0000000..158b859 --- /dev/null +++ b/src/main/OmJShah/client/withdrawmoney.py @@ -0,0 +1,28 @@ +from tools import dataentering +def cp3(conn,cur,acc_type,acc_no): + cur.execute("select balance from {} where acc_no={}".format(acc_type,acc_no)) + balance=cur.fetchall() + balance=balance[0][0] + withdraw_amt=dataentering.amounts("withdraw",balance,acc_type) + withdraw_amt=withdraw_amt[0] + if withdraw_amt: + query="update {} set balance = balance-%s where acc_no=%s".format(acc_type) + data=(withdraw_amt,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + query2="update cash_in_hand set cash_in_hand=cash_in_hand+%s where acc_no=%s" + data2=(withdraw_amt,acc_no) + done2=dataentering.tableupdate(conn,cur,query2,data2) + if done2: + print("Successfully withdrawn {} currency".format(withdraw_amt)) + print() + else: + query="update {} set balance = balance+%s where acc_no=%s".format(acc_type) + data=(withdraw_amt,acc_no) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + print("Couldn't remove money from cash_in_hand\n") + else: + print("couldn't update balance\n") + else: + print("Couldn't withdraw amount\n") \ No newline at end of file diff --git a/src/main/OmJShah/initialization/check.py b/src/main/OmJShah/initialization/check.py index 0dbeb76..69b4620 100644 --- a/src/main/OmJShah/initialization/check.py +++ b/src/main/OmJShah/initialization/check.py @@ -1,11 +1,11 @@ def check(): try: - with open("firsttime.txt","r") as a: + with open("files//firsttime.txt","r") as a: if a.read().strip()=="True": return True else: return False except FileNotFoundError: - with open("firsttime.txt","w") as a: + with open("files//firsttime.txt","w") as a: a.write("True") return True \ No newline at end of file diff --git a/src/main/OmJShah/initialization/setup.py b/src/main/OmJShah/initialization/setup.py index 51fb5be..d10e5ad 100644 --- a/src/main/OmJShah/initialization/setup.py +++ b/src/main/OmJShah/initialization/setup.py @@ -100,7 +100,7 @@ Database="" def sqlpwd(): global Password - cred = open("cred.dat","rb") + cred = open("files//cred.dat","rb") dat=pickle.load(cred) cred.close() Password=dat[0] @@ -108,7 +108,7 @@ def sqlpwd(): def sqldb(): global Database - cred = open("cred.dat","rb") + cred = open("files//cred.dat","rb") dat=pickle.load(cred) cred.close() Database=dat[1] @@ -152,7 +152,7 @@ def querycheck(): else: print("OK") if existing==8: - with open("firsttime.txt","w") as f: + with open("files//firsttime.txt","w") as f: f.write("False") ans=True @@ -167,7 +167,7 @@ def mysqlsetup(): print("Create a database in your MYSQL Workbench.\n") Database=input("Enter database name: ") Password=input("Enter sql password (enter '' if nothing):") - cred2= open("cred.dat","wb") + cred2= open("files//cred.dat","wb") data=[Password,Database] pickle.dump(data,cred2) cred2.close() diff --git a/src/main/OmJShah/panels/clientpanel.py b/src/main/OmJShah/panels/clientpanel.py index 183cebf..beac826 100644 --- a/src/main/OmJShah/panels/clientpanel.py +++ b/src/main/OmJShah/panels/clientpanel.py @@ -1,6 +1,9 @@ from tools import dataentering from client import redeemcode from client import depositmoney +from client import withdrawmoney +from client import loan_od +from client import transfermoney def cp(conn,cur): print("\n------------------Client Panel------------------") print("Welcome client!!") @@ -25,15 +28,18 @@ def cp(conn,cur): print("Wrong password") def cmenu(conn,cur,acc_no,acc_type): + cash_in_hand=dataentering.handcash(conn,cur,acc_no) + print("\n Your Cash_In_Hand is {} currency".format(cash_in_hand)) + print() print("1.Show Balance") print("2.Deposit money") print("3.Withdraw money") print("4.Redeem Code") if acc_type=='savings': - print("5.Ask for loan") - print("6.Check loan status") + print("5.Ask for loan / Check loan status") else: print("5.Check overdraft status") + print("6.Transfer money to other account") print("~ to quit") choice=input("Enter your choice: ") if choice=="~": pass @@ -45,10 +51,15 @@ def cmenu(conn,cur,acc_no,acc_type): elif choice=="2": depositmoney.cp2(conn,cur,acc_type,acc_no) elif choice=="3": - pass + withdrawmoney.cp3(conn,cur,acc_type,acc_no) elif choice=="4": redeemcode.cp4(conn,cur,acc_type,acc_no) elif choice=="5": - pass + loan_od.cp5(conn,cur,acc_type,acc_no) + elif choice=="6": + cur.execute("select balance from {} where acc_no={}".format(acc_type,acc_no)) + balance=cur.fetchall() + balance=balance[0][0] + transfermoney.cp6(conn,cur,acc_type,acc_no,balance) else: print("Wrong input!!!!\n") diff --git a/src/main/OmJShah/tests.py b/src/main/OmJShah/tests.py index 61c983b..163a11a 100644 --- a/src/main/OmJShah/tests.py +++ b/src/main/OmJShah/tests.py @@ -1,8 +1,6 @@ -from employee import deleteaccount -from tools import connection -from panels import clientpanel -conn,cur=connection.cc() -clientpanel.cp(conn,cur) +file=open("files//config.txt","r") +x=file.read() +print(x) #alter table current modify column overdraft enum('YES','NO'); #alter table current drop foreign key current_ibfk_1; #alter table savings drop foreign key savings_ibfk_1; \ No newline at end of file diff --git a/src/main/OmJShah/tools/connection.py b/src/main/OmJShah/tools/connection.py index 70bd1ef..4e5d229 100644 --- a/src/main/OmJShah/tools/connection.py +++ b/src/main/OmJShah/tools/connection.py @@ -5,7 +5,7 @@ def cc(): global cur global conn if not check.check(): - cred = open("cred.dat","rb") + cred = open("files//cred.dat","rb") dat=pickle.load(cred) cred.close() Passwo=dat[0] diff --git a/src/main/OmJShah/tools/dataentering.py b/src/main/OmJShah/tools/dataentering.py index 285b353..0f89da1 100644 --- a/src/main/OmJShah/tools/dataentering.py +++ b/src/main/OmJShah/tools/dataentering.py @@ -168,7 +168,7 @@ def date2(person,birth_date,hire_or_creation,minage,maxage): elif age(birth_date)-age(hire_date)>=minage: break else: - print("{} must atleast be {} years of age!!".format(person,maxage)) + print("{} must atleast be {} years of age!!".format(person,minage)) return hire_date def mobileno(): @@ -239,29 +239,47 @@ def balance(): print("Minimum balance is 1000 currency") #Withdraw amount and Deposit amount -def amounts(deposit_or_withdraw,cash_in_hand,acc_type): +def amounts(deposit_or_withdraw_or_transfer,cash_in_hand_or_balance,acc_type): while True: print() - print("--------------------{} screen-------------------") - amt=input("Enter amount to {}: ".format(deposit_or_withdraw)) + print("--------------------{} screen-------------------".format(deposit_or_withdraw_or_transfer)) + amt=input("Enter amount to {}: ".format(deposit_or_withdraw_or_transfer)) try: amt=int(amt) print("Done OK") except ValueError: - print("{} amount should be an integer!!".format(deposit_or_withdraw)) + print("{} amount should be an integer!!".format(deposit_or_withdraw_or_transfer)) else: - if amt Date: Sun, 1 Jan 2023 13:01:16 +0530 Subject: [PATCH 52/56] Initialised loan and overdraft methods (Untested) --- src/main/OmJShah/client/loan_od.py | 77 +++++++++++++++++++++- src/main/OmJShah/employee/deleteaccount.py | 56 +++++++++------- src/main/OmJShah/panels/clientpanel.py | 2 +- 3 files changed, 110 insertions(+), 25 deletions(-) diff --git a/src/main/OmJShah/client/loan_od.py b/src/main/OmJShah/client/loan_od.py index ee71c9d..60ea87f 100644 --- a/src/main/OmJShah/client/loan_od.py +++ b/src/main/OmJShah/client/loan_od.py @@ -1,3 +1,76 @@ from tools import dataentering -def cp5(conn,cur,acc_type,acc_no): - pass \ No newline at end of file +def cp5(cur,acc_type,acc_no): + loan_or_od=None + if acc_type=="current": + loan_or_od="overdraft" + else: + loan_or_od="loan" + cur.execute("select {} from {} where acc_no={}".format(loan_or_od,acc_type,acc_no)) + a=cur.fetchall() + if a[0][0]=="NO" and acc_type=="savings": + loan_process() + elif a[0][0]=="NO" and acc_type=="current": + #TODO:Check status of pending overdraft request if any + print("Congratulations! You don't have any overdraft to repay.") + elif a[0][0]=="YES" and acc_type=="current": + cur.execute("select {}_amt from {} where acc_no={}".format(loan_or_od,loan_or_od,acc_no)) + od=cur.fetchall() + od=od[0][0] + print("Your remaining od amount is {}") + else: + print("You already have a loan pending to repay...") + cur.execute("select {}_amt,{}_type from {} where acc_no={}".format(loan_or_od,loan_or_od,loan_or_od,acc_no)) + loan=cur.fetchall() + loan_type=loan[0][1] + if loan_type=='PL':loan_type='Personal Loan' + if loan_type=='HL':loan_type='Health Loan' + if loan_type=='EL':loan_type='Education Loan' + if loan_type=='TL':loan_type='Term Loan' + else:loan_type='Business Loan' + loan_amt=loan[0][0] + print("Your remaining od amount is {} of loan type {}".format(loan_amt,loan_type)) + + +def loan_process(): + while True: + loan_amt=input("Enter loan amount: ") + try: + loan_amt=int(loan_amt) + except ValueError: + print("Loan amount should be an integer") + else: + print("Done OK") + break + + while True: + print() + print("1.Personal Loan") + print("2.Home Loan") + print("3.Education Loan") + print("4.Term Loan") + print("5.Business Loan") + print(" Input ~ to quit\n") + loan_type=input("Enter choice: ") + if loan_type=="1": + loan_type='PL' + break + elif loan_type=="2": + loan_type='HL' + break + elif loan_type=="3": + loan_type='EL' + break + elif loan_type=="4": + loan_type='TL' + break + elif loan_type=="5": + loan_type='BL' + break + elif loan_type=="~": + break + else: + print("Wrong Input!!") + + if loan_type!="~": + return loan_amt,loan_type + #TODO: Add a method to store requests in dat file or csv file... diff --git a/src/main/OmJShah/employee/deleteaccount.py b/src/main/OmJShah/employee/deleteaccount.py index f0c7957..9f57fdb 100644 --- a/src/main/OmJShah/employee/deleteaccount.py +++ b/src/main/OmJShah/employee/deleteaccount.py @@ -23,29 +23,41 @@ def ep3(conn,cur): else : results1=results[0] acc_type=results1[1] - if acc_type == 'S': acc_type="savings" - if acc_type == 'C': acc_type="current" + if acc_type == 'S': + loan_or_od="loan" + acc_type="savings" + if acc_type == 'C': + loan_or_od="overdraft" + acc_type="current" + cur.execute("select {} from {} where acc_no={}".format(loan_or_od,acc_type,acc_no)) + status=cur.fetchall() + status=status[0][0] first_name=results1[2] last_name=results1[3] - print(first_name,last_name,"found.") - print(" Y - Deletes the account") - print(" N - Cancel process") - print("It's case sensitive") - choice=input("Do you really wish to delete the account of {} {}: ".format(first_name,last_name)) - if choice == "Y": - query="delete from clients where acc_no = %s" - data=(acc_no,) - query2="delete from {} where acc_no = %s".format(acc_type) - data2=(acc_no,) - done=dataentering.tableupdate(conn,cur,query,data) - if done: - done2=dataentering.tableupdate(conn,cur,query2,data2) - if done2: - print("Deleted {} {}'s account.".format(first_name,last_name)) - break + if status == "YES": + print("The Client {} {} has {} money to repay".format(first_name,last_name,loan_or_od)) + print("The account can't be deleted until {} is repayed".format(loan_or_od)) + break + else: + print(first_name,last_name,"found.") + print(" Y - Deletes the account") + print(" N - Cancel process") + print("It's case sensitive") + choice=input("Do you really wish to delete the account of {} {}: ".format(first_name,last_name)) + if choice == "Y": + query="delete from clients where acc_no = %s" + data=(acc_no,) + query2="delete from {} where acc_no = %s".format(acc_type) + data2=(acc_no,) + done=dataentering.tableupdate(conn,cur,query,data) + if done: + done2=dataentering.tableupdate(conn,cur,query2,data2) + if done2: + print("Deleted {} {}'s account.".format(first_name,last_name)) + break + else: + print("Deletion from {} table was unsuccessful".format(acc_type)) else: - print("Deletion from {} table was unsuccessful".format(acc_type)) + print("Deletion was unsuccessful") else: - print("Deletion was unsuccessful") - else: - break + break diff --git a/src/main/OmJShah/panels/clientpanel.py b/src/main/OmJShah/panels/clientpanel.py index beac826..597ad57 100644 --- a/src/main/OmJShah/panels/clientpanel.py +++ b/src/main/OmJShah/panels/clientpanel.py @@ -55,7 +55,7 @@ def cmenu(conn,cur,acc_no,acc_type): elif choice=="4": redeemcode.cp4(conn,cur,acc_type,acc_no) elif choice=="5": - loan_od.cp5(conn,cur,acc_type,acc_no) + loan_od.cp5(cur,acc_type,acc_no) elif choice=="6": cur.execute("select balance from {} where acc_no={}".format(acc_type,acc_no)) balance=cur.fetchall() From 162724b29c4b9c66657c82054e2b6daf40f16de1 Mon Sep 17 00:00:00 2001 From: Om J Shah <79356504+OJASisLive@users.noreply.github.com> Date: Tue, 17 Jan 2023 12:01:48 +0530 Subject: [PATCH 53/56] Update README.md --- README.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/README.md b/README.md index e69de29..ae704ca 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,42 @@ +# OLD NOTICE: +See [this pull request](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/pull/6) for details about merger of ["shorten-the-code"](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/tree/shorten-the-code) branch into the main branch. + + +# Bank Management System: +First of all, whole code is written by me and nothing has been copy pasted fron anywhere. + +The project has Dependencies which are all open sourced (modules such as pickle, csv, mysql-connector) + +# Requirements: +1. Python 3 +2. MySQL workbench 8.0 + +because I've tested the code using these versions only... + +# Setup: +Run the file named "main.py" and follow the instructions of the program... + +# How to reset: +Open the file named "firsttime.txt" and change the value from False to True (case sensitive) + +# Troubleshooting: +1.I suspect that the people who haven't set a password for SQL may encounter an error. (will fix it later) + +I strongly suggest users to have a password set in MySQL. + +2.Check if the terminal shows the message "Connection established successfully" + +That means you entered your credentials properly + +3.Any other exception will pop up in the terminal... + +# More information/Structure/Wiki +[Wiki](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/wiki) + +# About: +This project aims to create a bridge between Python and SQL and use it in real world problems/applications... + +This project is currently under development... + +# Done by: +Om J Shah From a8906866688d4d70e3752151303339aca233930f Mon Sep 17 00:00:00 2001 From: Om J Shah <79356504+OJASisLive@users.noreply.github.com> Date: Tue, 17 Jan 2023 12:05:06 +0530 Subject: [PATCH 54/56] Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ae704ca..ff9ab29 100644 --- a/README.md +++ b/README.md @@ -20,15 +20,15 @@ Run the file named "main.py" and follow the instructions of the program... Open the file named "firsttime.txt" and change the value from False to True (case sensitive) # Troubleshooting: -1.I suspect that the people who haven't set a password for SQL may encounter an error. (will fix it later) +1. I suspect that the people who haven't set a password for SQL may encounter an error. (will fix it later) + + I strongly suggest users to have a password set in MySQL. -I strongly suggest users to have a password set in MySQL. +2. Check if the terminal shows the message "Connection established successfully" -2.Check if the terminal shows the message "Connection established successfully" + That means you entered your credentials properly -That means you entered your credentials properly - -3.Any other exception will pop up in the terminal... +3. Any other exception will pop up in the terminal... # More information/Structure/Wiki [Wiki](https://github.com/OJASisLive/Bank-Management-System-Python-SQL/wiki) From 522e5078bfd58f0beec0dbe7d342db010eb45b33 Mon Sep 17 00:00:00 2001 From: Om Date: Tue, 17 Jan 2023 12:20:20 +0530 Subject: [PATCH 55/56] fixed minor bug --- src/main/OmJShah/admin/editemployee.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/OmJShah/admin/editemployee.py b/src/main/OmJShah/admin/editemployee.py index d9320d3..0c0bb94 100644 --- a/src/main/OmJShah/admin/editemployee.py +++ b/src/main/OmJShah/admin/editemployee.py @@ -53,10 +53,13 @@ def f2(conn,cur): if a == '1': en=dataentering.primary_key_no("emp_no") query="update employees set emp_no=%s where emp_no=%s" + query2="update empass set emp_no=%s where emp_no=%s" data=(en,emp_no) done=dataentering.tableupdate(conn,cur,query,data) if done: - print("Updated employee number...") + done=dataentering.tableupdate(conn,cur,query2,data) + if done: + print("Updated employee number...") if a == '2': birth_date=dataentering.birthdate("employee",20,60) From badae0c91f0d0838078ab22ea61e9a7cbe6f53f9 Mon Sep 17 00:00:00 2001 From: Om Date: Sun, 29 Jan 2023 16:11:23 +0530 Subject: [PATCH 56/56] fixed minor glitch --- src/main/OmJShah/initialization/setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/OmJShah/initialization/setup.py b/src/main/OmJShah/initialization/setup.py index d10e5ad..ba40e73 100644 --- a/src/main/OmJShah/initialization/setup.py +++ b/src/main/OmJShah/initialization/setup.py @@ -187,13 +187,13 @@ def setup(): ans2=input("How do you want to store the data? (1/2): ") if ans2 == "0": break - if ans2=="1": + elif ans2=="1": mysqlsetup() if existing==7: continue - if ans2=="2": + elif ans2=="2": print("\nThis is under development :). Please use mysql till then...") - elif ans2 != "1" or ans2 != "2": + else: print("\nWrong input, (1/2).........") else: if querycheck():