Professional Documents
Culture Documents
Project 38
Project 38
Online Recruitment Management System can be used by employers to recruit the candidates
based on their experience and the further interviews easily. Achieving this objective is
difficult using the manual system as the information is scattered, can be redundant, and
collecting relevant information may be very time-consuming.
All these problems are solved by this project. This system helps in maintaining the
information of potential candidates in one place. It can be easily accessed by both applicants
and employers. It is kept safe for a long period of time without any changes or omissions. It
reduces the time employer take to make few recruitments in their firm.
This system helps the job seekers to get every information required for the process.
Modules of Online Recruitment System
The system has a different segment to process a specific task which is the modules. This will
help the system to developed easily and makes it more user-friendly.
The modules of the project are: –
Login Module: –
This will help users to login into the system using id and password. A user who has the valid
id and password can only log in to their respective accounts. It will help the authentication of
the user who enters the system. The module provides a layer of security over the system as
only authorized personal can login into the system.
This prevents any anonymous person to enter the system and mishandle the records. It is
better than the manual method as they do not have any security measure of who can access
the system and who cannot.
Registration Module: –
In this segment, we will register the new user of the system. As they are two different types
of users i.e. employer and job seekers this module can be fragmented into two parts. Each
part has its own interface and information required to get registered in the system.
Post Requisition: –
In this interface, the employer who has registered themselves in the system can post the jobs.
They can give the requisition specifying the post and skill needed for that post. It also implies
the criteria of recruitment the employer has planned for the post.
Job Search:
This module is for the job seeker where they can search all the requisition present in the
system. One can filter the search based on their skill and experience of the job. Once selected
a requisition applicant can apply for the post.
System Design of Online Recruitment System
Once the planning and analysis of the project are completed, the design phase begins. The
goal of system design is to transform the information collected about the project into the
blueprint structure which will serve as a base while constructing the system. It is considered
to be an unwieldy process as most of the errors are introduced in this phase.
However, if an error gets unnoticed in the later process it may become difficult to track them
down. In our system, we are developing a system which helps in recruitment management for
the employer. It will minimize the problems faces by both candidates and the recruiters in the
process.
Let’s discuss the system in detail:
Er Diagram of Online Recruitment System
The description above figure shows the E-R diagram of the proposed system. The ER model
defines the conceptual view of a database. It works around real-world entities and the
associations among them. At the view level, the ER model is considered a good option for
designing databases.
So, let’s see each entity in Details-:
Administrator:
The information of the admin of the system is stored in this entity. It is stored data of login
and the password. This provides security to the system and keeps the record of which user
entered in the system at what instance of time. This entity will have the access to all the
entities as it will add the job seeker to the system. This will manage the employer and its
requisition having specific skills and manage them.
It has the following attributes:
Username:
It stores the name of the admin which acts as the unique name given to the manager of the
firm. Through this login into the system and the work they made will be recorded against this
name. It will help their seniors to see what employer or seeker has the login to the system and
how much engagement he has with the interface.
Password:
This attribute holds the secured keyword given to every manager of the educational
institutions who need access to the system. This should not be shared with any other member.
As it would make any staff employee enter the system and see the information regarding a
candidate or the organization which can make them unbiased.
Login-Time:
The login time of the admin will be recorded in this field which helps in tracking the admin
performance.
Logout-Time:
It stores the logout time of the admin from the system.
Job Seeker:
To store the information of the candidate who registers to the system for participation in the
recruitment process, the Job Seeker entity is created. It will have all the required data about
the applicant. This has information which is personal like contact detail and the also
qualification of the user under the skill is.
It helps the employer also to get all the background information about the candidate if they
want to hire it. The entity also covers the major part of every recruitment process that is the
resume of the applicant. Once the resume is uploaded by the job seeker it will match with the
skill for the provided requisitions given by the employers.
It has following attributes:
Can-Id:
Candidate Id is a unique number given to each candidate who registers in the system. This
helps in identifying each applicant as distinct and different from others. Thus, it acts as the
primary key to the entity. To remove the redundancy in the system and further creating the
error in the system this type of attribute is introduced in the system.
Can-Name:
Candidate Name is the information required for details of the applicant who registers in the
system. It makes the system more realistic and aids the administrator in search of any specific
applicant on demand of the employer.
Resume/CV:
In this attribute job, seekers can store their resumes which can be reviewed by the
organization if they want to further check the candidate.
Projects:
Every candidate has many projects which they have created or worked on, which they want to
share with them, recruiters. This attribute will aid them to store the projects and write a full
fledge detail about them.
Personal-Info:
This attribute holds all the information the recruiters needed from the candidate apart from its
technical skills and eligibility. As it is the composite attributes it has further fields which
store the information. DOB store the date of birth of the candidate and the address will have
the residential address of the candidate which help in getting the location of the applicant as
some recruiters might need that. It also has the father’s name.
Contact:
This stores the contact information of the candidate like phone number and email id.
Skill:
It is an essential part of the system as it works on both from recruiter and job seeker. As the
recruiter gives the requisitions which have some specific eligibility criteria which are stored
in this skill whereas every seeker has its own set of skills that can be shared with the
employer. If the skills matched recruiters got their potential candidate for the post.
That is why this entity is needed in the system. It will be in relation to every requisition and
each job seeker. It will not only store the skills and talents required or possessed; it will also
have the academic qualification for the requisition.
It has the following attributes: –
Skill-Id:
As every set of skills is unique so every set is given a unique number that acts as its id in the
system. Thus, Skill-id stores the distinct number given to each skill. This helps in
differentiate every skill and identify them individually. This would help the applicant in
deciding which unique skill it belongs to without mixing it.
Technical:
It will store the technical skill by the applicant. It depends on the post for which he/she
applying for in the system.
Academic-details:
It will store the detailed information of the student in an academic field like high school
marks, senior secondary marks. It will also have the graduation percentage is necessary for
the skill. So, this attribute becomes a composite attribute for the entity. Each field in this
attribute will contribute to the qualification required for the skill.
Cocurricular-activities:
Every skill does not only require the technical talent of the student it also needs other social
skills. If an employer wants to check the social skill of the candidate, it could have referred to
the co-curricular activities in which the applicant has taken part. Like if some employer has
posted of receptionist, it would check the candidate’s communication skill apart from its
academic eligibility.
Requisition:
In the recruitment management system, every employer will make the requisition of the
application for the given post. From the application received from the number of the job
seekers, the company will check their eligibility and decide whether he/she is compatible for
the post or not. Then the shortlisted student will go for further rounds of the recruitment
process as per the employer.
This demand is stored in this entity. It helps the system and employer to get all the data in one
place instead of getting the information from different centers and offices where recruitment
is going on. This entity will also aid the applicant to search all the employers based on the
requisition they made.
As every post require a set of skills so the skill entity has a relation with this entity and this
also has a relation with the employer as it provides the requisition. Every post requires the
employer to test the applicants before handing them an offer letter. Thus, this has a relation
with the interview entity to make a record of which interview process will take place with
which post.
It has following attributes:
Req-Id:
Every requisition present in the system given by each employer has unique numbers assigned
to it. It helps in differentiating them and identify each of them individually. It aids the job
seeker in referencing every requisition differently as it may be possible it is applying for
more than one.
Emp-Id:
This attribute will hold the information of the employer who is giving this requisition. It will
be just a reference to the employer entity.
Post:
Every requisition given by the employer belongs to a specific post. The company provides
this information and specifies the details. It mentions what work they are hiring for which
helps the job seekers to make the sound decision of whether apply in it or not.
Skill-Id:
It is a reference to a skilled entity that implies the required skill set for the specific post. It
helps in normalizing the data in the system. It avoids the redundancy and multiplicity of
information in the system.
Package:
This attribute stores the information regarding the pay scale or salary. The amount of money
in form of salary the employer is expecting to give to the applicant for the post.
Criteria:
In the criteria attribute, data regarding the process of recruitment is stored. As for every
requisition is there are different criteria for testing the candidate eligible for the post. It has
info like how many interview rounds will be there or if there is group discussion before the
interview.
Employer:
It will store the detailed information of the employer present or registered in the system.
Thus, making it one of the essential entities in the system. Before applying for any post, the
applicant also wants to know about the company or the employer who has given the
requisition.
It will hold the data about the person and the post in the company who the job seekers may
contact for further information or any query regarding the post. This entity will have the
relationship with the requisition as the employer gives these so there is employer reference in
that entity.
The administrator of the system manages this entity to check the requisition employer is
giving and track its recruitment data. It also has relationships with the offer letter entity as
this will be provided by the entity to the candidate. Only given if the job seeker has applied
for one of the posts given by the company and he/she completed every criterion they have set
for that requisition with the good remark.
It is one of the parts of the recruitment process also to have the full knowledge about the
company candidate is applying for.
It has the following attributes-:
Emp-Id:
It is the unique number given to the employer to differentiate from others. It aids in the
situation where more than one employer has the same name or when referencing it in some
other entity. Instead of writing the whole data about the employer again, we can write this id
which can be further referenced in this entity.
Emp-Name:
It will hold the name of the employer which is registered in the system. The name should be
the same as mention in the official record of the employer. As it acts as the employer details
for the applicant.
Information:
This entity will hold the information of the employer like when it is founded, what kind of
projects they are working on. It also holds the information of what kind of social skill they
want in their employees or what they see in their candidate. It also mentions the work culture
in their workplace.
Key-Persons:
It holds the data of the important persons of the company and the point of the contact for the
interested candidates.
Interview:
It has information about the interviews that will happen for the specific requisition. As the
interview is an important part of any recruitment process as in this the employer and
candidates come face to face and they can judge each other.
Int-id:
It is the unique number given to each interview process that happens in the system. It makes
the whole process distinctive and able to identify each when need.
Int-type-id:
As there are many kinds of interviews that can happen during the recruitment process. It
holds the reference to which type was a specific interview was.
Req-Id:
It will hold the reference of the requisition for which a specific employer is conducting this
interview.
Remarks:
This has the remarks of the interviews which is given by the employers.
Emp-Id:
It holds the data of the employer who is conducting this interview and managing the whole
process.
Interview-Type:
As there is various type of interview process which happens in the recruitment like technical
for checking the technical knowledge of the candidate or the HR interview to test the social
and interpersonal skill of the applicant.
Int-type-id:
It is the unique number given to each type of interview. It helps in making the type distinct
and able to find when needed.
Int-type-Name:
It holds the name of the type of interview. It aids the employee or candidate when need to go
into details about the interview process.
Offer-Letter:
When candidates apply for the job and it takes every criterion provided for a specific post. If
it qualifies for the post the company will provide him/her with the offer letter. It is a
document that makes the offer to the candidate for joining the employer’s firm. It has detailed
information regarding the package and the work environment of the company.
Of-id:
Each offer letter is given a unique and distinct number. So, every candidate can identify them
differentially. As one applicant can get many letters.
Emp-Id:
It is the number given to the employer as it gives the information about which company has
given this letter.
Experience:
To show the talent each applicant writes the experience they have gain in the previous years.
It helps the employer to see which applicant has the relevant knowledge required for the post.
It is a weak entity dependent on the job seeker’s profile. So, they can hire a person who has
more potential than others.
Exp-Details:
It holds the information candidate has learned during the work. It can be the specific topic or
any social skill it has gained. It also includes the time duration of the work.
Exp-Organization:
The name of the organization in which the applicant has gained the experience.
Feedback:
A good system is where everyone has a say in everything. So, the feedback system is an
entity that holds the feedback of the job seekers about their recruitment process for an
employer or a requisition.
It has the following attributes:
Feed-Id:
It is a unique number given to each feedback. It makes the remark distinct and identifiable for
the employers to take note of.
Emp-id:
It is a reference to the employer for which this feedback is given.
Feed-details:
It holds the remark given by the applicant.
User Interface of Online Recruitment System:
To show the user interface of the system a use diagram is a mention below, it gives the wide-
angle of how the system is working from the perspective of the user. In the above diagram of
the online recruitment system, there are three users. First is job seeker its login in the system
and find the job and apply for it if approved by admin which is second user foster’s details
are sent to the third user i.e. employer.
Admin job is managing the system and approves the seeker’s application. The employers
check the eligibility of the candidate and allow it interview dates. In the above diagram, there
are three users. First is job seeker its login in the system and find the job and apply for it if
approved by admin which is second user foster’s details are sent to the third user i.e.
employer.
Admin job is managing the system and approves the seeker’s application. The employers
check the eligibility of the candidate and allow it interview dates.
Requirement Analysis of Online Recruitment
System
Hardware Requirements of Online Recruitment System
The hardware required for online recruitment system for the development of the
project is:
Processor: Intel P-IV System
Processor Speed: 250 MHz to 833 MHz
Ram: 512 Mb
Ram Hard Disk: 40 Gb
Software Requirements of Online Recruitment System
The software required for online recruitment system for the development of the project
is:
Operating System: Windows 2000 Professional
Environment: Visual Studio .NET 2002
Net Framework: Version 1.0
Language: Visual Basic .NET
Backend: SQL Server 2000
Functional Requirement of Online Recruitment System:
Creation of the new record for the new job seeker or the new employer.
Deletion of the record which already exists in the system based on the admin’s
request.
Posting the requisition for the candidates and able to retrieve them if required.
Candidates can apply for the job and see the further details.
Admin handles employers and their job posts, this function eases the process of
management.
Non-Functional Requirement of Online Recruitment System:
The security of the system is maintained by providing a login interface to the user.
Only those who have the login is and password can enter the system.
User-Friendly as the system is very interactive and can be easily operated.
Maintainability and reliability if the system is kept very thoroughly as all the records
kept in the database have the backups and system can restore if there is power loss.
SYSTEM DEVELOPMENT LIFE CYCLE (SDLC)
The systems development life cycle is a project management technique that
divides complex projects into smaller, more easily managed segments or phases.
Segmenting projects allows managers to verify the successful completion of project
phases before allocating resources to subsequent phases.
Software development projects typically include initiation, planning,design,
development, testing, implementation,and maintenance phases. However, the
phases may be divided differently depending on the organization involved.
For example, initial project activities might be designated as request,
requirements-definition, and planning phases, or initiation, concept-development,and
planning phases. End users of the system under development should be involved in
reviewing the output of each phase to ensure the system is being built to deliver the
needed functionality.
INITIATION PHASE
REQUIREMENTS ANALYSISPHASE
This phase formally defines the detailed functional user requirements using
high-level requirements identified in the Initiation, System Concept, and Planning
phases. It also delineates the requirements in terms of data, system performance,
security, and maintainability requirements for the system. The requirements are
defined in this phase to alevel of detail sufficient for systems design to proceed. They
need to be measurable, testable, and relate to the business need or opportunity
identified in the Initiation Phase. The requirements that will be used to determine
acceptance of the system are captured in the Test and Evaluation MasterPlan.
Further define and refine the functional and data requirements and document
them in the Requirements Document,
Complete business process reengineering of the functions to be supported
(i.e., verify what information drives the business process, what information is
generated, who generates it, where does the information go, and who
processes it),
Develop detailed data and process models (system inputs, outputs, and the
process.
Develop the test and evaluation requirements that will be used to determine
acceptable system performance.
DESIGN PHASE
DEVELOPMENT PHASE
Testing as a deployed system with end users working together with contract
personnel
IMPLEMENTATION PHASE
This phase is initiated after the system has been tested and accepted by the
user. In this phase, the system is installed to support the intended business
functions. System performance is compared to performance objectives established
during the planning phase. Implementation includes user notification, user training,
installation of hardware, installation of software onto production computers, and
integration of the system into daily work processes. This phase continues until the
system is operating in production in accordance with the defined user requirements.
Main.py
from tkinter import *
root = Tk()
root.geometry("1050x700")
root.title("Hire ME")
root.resizable(0, 0)
root.iconbitmap(r'elements\\favicon.ico')
log(root)
root.mainloop()
db_init.py
cur = mycon.cursor()
cur.execute(CREATE_SCHEMA)
cur.execute(Create_users_Table)
cur.execute(Create_recruiter_Table)
cur.execute(Create_client_Table)
cur.execute(Create_Job_Table)
cur.execute(Create_Application_Table)
mycon.close()
cv_schema
CREATE_SCHEMA = """
Create_users_Table = """
"""
Create_recruiter_Table = """
UNIQUE (REmail)
);
"""
Create_client_Table = """
CREATE TABLE IF NOT EXISTS mydb.Client (
UNIQUE (CEmail),
);
"""
Create_Job_Table = """
);
"""
Create_Application_Table="""
PRIMARY KEY(AID),
);
"""
Client.py
import modules.login as l
def get_details(email):
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(q)
d = cur.fetchall()
mycon.close()
name = d[0][0]
location = d[0][1]
gen = d[0][2]
clicid = d[0][3]
def logi(root):
try:
bg.destroy()
except:
pass
l.log(root)
# ---------------------------------------------Apply a Job---------------------------------------------------
def apply(table):
ajid = selectedvalues[0]
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(chkquery)
tempbuff = cur.fetchall()
mycon.close()
if(tempbuff):
messagebox.showinfo(
'Oops', 'It seems like you have already applied to this job')
else:
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(queryapplyjob)
mycon.commit()
mycon.close()
def delet(table):
selectedindex = table.focus()
aaid = selectedvalues[0]
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(
mycon.commit()
mycon.close()
myapp()
def sort_alljobs(table):
criteria = search_d.get()
if(criteria == "Select"):
pass
else:
table.delete(*table.get_children())
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(
jobs = cur.fetchall()
mycon.close()
i=0
for r in jobs:
i += 1
def sort_myapplications(table):
criteria = search_d.get()
if(criteria == "Select"):
pass
else:
table.delete(*table.get_children())
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(
jobs = cur.fetchall()
mycon.close()
i=0
for r in jobs:
i += 1
def showalljobs(table):
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(
jobs = cur.fetchall()
mycon.close()
i=0
for r in jobs:
table.insert('', i, text="", values=(
i += 1
# ----------------------------------------------Show my
Applications-----------------------------------------------------
def show_myapplications(table):
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(
applications = cur.fetchall()
mycon.close()
print(applications)
i=0
for x in applications:
i += 1
# ----------------------------------------------Available
Jobs----------------------------------------------------
def available():
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
widget.destroy()
widget.destroy()
bgr.destroy()
global search_d
search_d.current(0)
xscrollcommand=scx.set, yscrollcommand=scy.set)
scx.pack(side="bottom", fill="x")
scy.pack(side="right", fill="y")
table.heading("JID", text="JID")
table.heading("JobRole", text="JobRole")
table.heading("JobType", text="JobType")
table.heading("CompanyName", text='CompanyName')
table.heading("CompanyLocation", text="CompanyLocation")
table.heading("Qualification", text='Qualification')
table.heading("MinExp", text='MinExp')
table.heading("Salary", text="Salary")
table['show'] = 'headings'
scx.config(command=table.xview)
scy.config(command=table.yview)
table.column("JID", width=100)
table.column("JobRole", width=150)
table.column("JobType", width=150)
table.column("CompanyName", width=150)
table.column("CompanyLocation", width=150)
table.column("Qualification", width=100)
table.column("MinExp", width=100)
table.column("Salary", width=150)
showalljobs(table)
table.pack(fill="both", expand=1)
mycon.close()
# -----------------------------------------My
Applictions----------------------------------------------------------------
def myapp():
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
widget.destroy()
widget.destroy()
bgr.destroy()
global search_d
search_d.current(0)
xscrollcommand=scx.set, yscrollcommand=scy.set)
scx.pack(side="bottom", fill="x")
scy.pack(side="right", fill="y")
table.heading("AID", text="AID")
table.heading("JobRole", text="JobRole")
table.heading("JobType", text="JobType")
table.heading("CompanyName", text='CompanyName')
table.heading("CompanyLocation", text="CompanyLocation")
table.heading("Qualification", text='Qualification')
table.heading("MinExp", text='MinExp')
table.heading("Salary", text="Salary")
table['show'] = 'headings'
scx.config(command=table.xview)
scy.config(command=table.yview)
table.column("AID", width=50)
table.column("JobRole", width=150)
table.column("JobType", width=150)
table.column("CompanyName", width=150)
table.column("CompanyLocation", width=150)
table.column("Qualification", width=100)
table.column("MinExp", width=100)
table.column("Salary", width=150)
show_myapplications(table)
table.pack(fill="both", expand=1)
mycon.close()
#
----------------------------------------------------------------------------------------------------------------
-----------
def cli(root, email1):
global email
email = email1
bg.place(x=0, y=0)
get_details(email)
bg.load = PhotoImage(file=f'elements\\bg{gen}.png')
img.place(x=0, y=0)
# Navbar
nm.place(x=300, y=50)
cp.place(x=300, y=120)
bn.place(x=800, y=75)
# Left
# Right
rt.place(x=450, y=220)
bgrf.load = PhotoImage(file="elements\\bgr.png")
bgr.place(x=440, y=210)
# root = Tk()
# root.geometry("1050x700")
# root.title("Client")
# root.resizable(0, 0)
# cli()
# root.mainloop()
login.py
from tkinter import *
from tkinter import messagebox
from tkinter_uix.Entry import Entry
import mysql.connector as sql
from modules.register import *
from modules.recruiter import *
from modules.client import *
from modules.creds import user_pwd
if q[0][0] == "recruiter":
rec(root, email1)
else:
cli(root, email1)
def submit(root):
mycon = sql.connect(host='localhost', user='root',
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute('select email,password from users')
total = cur.fetchall()
mycon.close()
email1 = email.get()
password = pwd.get()
if email1 and password:
for i in total:
if email1 == i[0] and password == i[1]:
return success(root, email1)
elif email1 == i[0] and password != i[1]:
messagebox.showinfo('Alert!', 'Invalid Credentials')
break
else:
messagebox.showinfo(
'Alert!', 'Email is not registered, Please register')
else:
messagebox.showinfo(
'Alert!', 'Please Enter both Email and Password')
def reg(root):
try:
f1.destroy()
except:
pass
mai(root)
def log(root):
global f1, email, pwd
try:
f2.destroy()
except:
pass
f1 = Frame(root, width=1050, height=700, bg='#FFFFFF')
f1.place(x=0, y=0)
# Background
f1.render = PhotoImage(file='elements\\bg.png')
img = Label(f1, image=f1.render)
img.place(x=0, y=0)
# Email
email_l = Label(f1, text="Email : ", bg='#FFFFFF',
font=('normal', 20, 'bold'), fg="#00B9ED")
email_l.place(x=620, y=300)
email = Entry(f1, width=24, placeholder="Enter your Email..")
email.place(x=720, y=300)
# Password
pwd_l = Label(f1, text="Password : ", bg='#FFFFFF',
font=('normal', 20, 'bold'), fg="#00B9ED")
pwd_l.place(x=565, y=350)
pwd = Entry(f1, show="*", width=24, placeholder="Enter your Password..")
pwd.place(x=720, y=350)
# Buttons
f1.bn = PhotoImage(file="elements\\login2.png")
btn = Button(f1, image=f1.bn, bg='#FFFFFF', bd=0,
activebackground="#ffffff", command=lambda: submit(root))
btn.place(x=820, y=420)
f1.bn1 = PhotoImage(file="elements\\reg.png")
btn1 = Button(f1, image=f1.bn1, bg='#FFFFFF', bd=0,
activebackground="#ffffff", command=lambda: reg(root))
btn1.place(x=620, y=420)
recruiter.py
from tkinter import *
from tkinter import ttk
from tkinter import messagebox, Label
from tkinter_uix.Entry import Entry
import mysql.connector as sql
import modules.login as l
from modules.creds import user_pwd
def get_details(email):
global name, company, gen, recid
q = f'select RName,CompanyName,RGender,RID from mydb.recruiter where REmail="{email}"'
mycon = sql.connect(host='localhost', user='root',
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(q)
d = cur.fetchall()
mycon.close()
name = d[0][0]
company = d[0][1]
gen = d[0][2]
recid = d[0][3]
def logi(root):
try:
bg.destroy()
except:
pass
l.log(root)
def submit_job():
global role1, jtype1, qual1, exp1, sal1
role1 = role.get()
jtype1 = jtype.get()
qual1 = qual.get()
exp1 = exp.get()
sal1 = sal.get()
print(role1, jtype1, qual1, exp1, sal1)
if role1 and jtype1 and qual1 and exp1 and sal1:
if jtype1 == "Select":
messagebox.showinfo('ALERT!', 'Please provide Job Type')
else:
exe1 = f'INSERT INTO mydb.Job(RID, JID, JobRole, JobType, Qualification, MinExp, Salary)
VALUES({recid}, NULL, "{role1}", "{jtype1}", "{qual1}", {exp1}, {sal1})'
try:
mycon = sql.connect(host='localhost', user='root',passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(exe1)
role.delete(0, END)
jtype.delete(0, END)
qual.delete(0, END)
exp.delete(0, END)
sal.delete(0, END)
mycon.commit()
mycon.close()
messagebox.showinfo('SUCCESS!', 'You have successfully created a Job')
except:
pass
else:
messagebox.showinfo('ALERT!', 'ALL FIELDS ARE MUST BE FILLED')
cur = mycon.cursor()
cur.execute(
f'select RID,JID, JobRole, JobType, Qualification, MinExp, Salary FROM mydb.Job where
RID={recid} order by {criteria}')
all_jobs = cur.fetchall()
mycon.close()
i=0
for r in all_jobs:
table.insert('', i, text="", values=(
r[1], r[2], r[3], r[4], r[5], r[6]))
i += 1
def sort_applicants(table):
criteria = search_d.get()
if(criteria == "Select"):
pass
else:
table.delete(*table.get_children())
mycon = sql.connect(host='localhost', user='root',
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(
f'SELECT job.JobRole, client.CName, client.CEmail, client.CAge, client.CLocation,
client.CGender, client.CExp, client.CSkills, client.CQualification FROM application JOIN client ON
application.cid=client.CID JOIN job ON job.jid=application.jid where job.rid={recid} order by
{criteria}')
applicats = cur.fetchall()
mycon.close()
print(applicats)
i=0
for x in applicats:
table.insert('', i, text="", values=(
x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8]))
i += 1
# ----------------------------------------------Posted jobs Query-----------------------------------------------
def show_all(table):
mycon = sql.connect(host='localhost', user='root',
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(
f'select RID,JID, JobRole, JobType, Qualification, MinExp, Salary FROM mydb.Job where
RID={recid}')
all_jobs = cur.fetchall()
mycon.close()
i=0
for r in all_jobs:
table.insert('', i, text="", values=(
r[1], r[2], r[3], r[4], r[5], r[6]))
i += 1
# ----------------------------------------------Applicants-----------------------------------------------------
def show_applicants(table):
mycon = sql.connect(host='localhost', user='root',
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(
f'SELECT job.JobRole, client.CName, client.CEmail, client.CAge, client.CLocation, client.CGender,
client.CExp, client.CSkills, client.CQualification FROM application JOIN client ON
application.cid=client.CID JOIN job ON job.jid=application.jid where job.rid={recid}')
applicats = cur.fetchall()
mycon.close()
print(applicats)
i=0
for x in applicats:
table.insert('', i, text="", values=(
x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8]))
i += 1
# ---------------------------------------------Post a Job---------------------------------------------------
def create():
global role, jtype, qual, exp, sal
for widget in rt.winfo_children():
widget.destroy()
for widget in tab.winfo_children():
widget.destroy()
bgr.destroy()
# Create Form
f1 = Frame(rt, width=520)
f1.load = PhotoImage(file="elements\\create.png")
img = Label(rt, image=f1.load, bg="#FFFFFF")
img.grid(row=0, column=1, padx=150, pady=10)
# Form
# Labels
role_l = Label(tab, text="Role :", font=(
'normal', 18, 'bold'), bg="#FFFFFF")
role_l.grid(row=0, column=0, pady=10, padx=10)
type_l = Label(tab, text="Type :", font=(
'normal', 18, 'bold'), bg="#FFFFFF")
type_l.grid(row=1, column=0, pady=10, padx=10)
qual_l = Label(tab, text="Qualification :", font=(
'normal', 18, 'bold'), bg="#FFFFFF")
qual_l.grid(row=2, column=0, pady=10, padx=10)
exp_l = Label(tab, text="Experience :", font=(
'normal', 18, 'bold'), bg="#FFFFFF")
exp_l.grid(row=3, column=0, pady=10, padx=10)
sal_l = Label(tab, text="Salary :", font=(
'normal', 18, 'bold'), bg="#FFFFFF")
sal_l.grid(row=4, column=0, pady=10, padx=10)
# Entries
style = ttk.Style(tab)
style.configure("TCombobox", background="white",
foreground="#696969")
# -------------------------------------------------Delete A Posted
Job----------------------------------------------------------
def deletjob(table):
selectedindex = table.focus()
selectedvalues = table.item(selectedindex, 'values')
ajid = selectedvalues[0]
mycon = sql.connect(host='localhost', user='root',
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(f'delete from mydb.application where jid={ajid}')
cur.execute(f'delete from mydb.job where jid={ajid}')
mycon.commit()
mycon.close()
messagebox.showinfo('Thanks', 'Your Job has been Deleted')
posted()
def posted():
for widget in rt.winfo_children():
widget.destroy()
for widget in tab.winfo_children():
widget.destroy()
bgr.destroy()
table['show'] = 'headings'
scx.config(command=table.xview)
scy.config(command=table.yview)
table.column("JID", width=100)
table.column("JobRole", width=150)
table.column("JobType", width=150)
table.column("Qualification", width=100)
table.column("MinExp", width=100)
table.column("Salary", width=150)
show_all(table)
table.pack(fill="both", expand=1)
table['show'] = 'headings'
scx.config(command=table.xview)
scy.config(command=table.yview)
table.column("JobRole", width=150)
table.column("CName", width=200)
table.column("CEmail", width=100)
table.column("CAge", width=50)
table.column("CLocation", width=150)
table.column("CGender", width=100)
table.column("CExp", width=100)
table.column("CSkills", width=200)
table.column("CQualification", width=150)
show_applicants(table)
table.pack(fill="both", expand=1)
# ---------------------------------------------------------------------------------------------------------------------------
def rec(root, email1):
global email
email = email1
bg = Frame(root, width=1050, height=700)
bg.place(x=0, y=0)
get_details(email)
bg.load = PhotoImage(file=f'elements\\bg{gen}.png')
img = Label(root, image=bg.load)
img.place(x=0, y=0)
# Navbar
nm = Label(root, text=f'{name}', font=(
'normal', 36, 'bold'), bg="#ffffff", fg="#0A3D62")
nm.place(x=300, y=50)
cp = Label(root, text=f'{company}', font=(
'normal', 24), bg="#ffffff", fg="#0A3D62")
cp.place(x=300, y=120)
bn = Button(root, text="LOGOUT", font=(
'normal', 20), bg="#b32e2e", fg="#ffffff", command=lambda: logi(root))
bn.place(x=800, y=75)
# Left
lf = Frame(root, width=330, height=440, bg="#ffffff")
lf.place(x=60, y=220)
cj = Button(lf, text="Post a Job", font=(
'normal', 20), bg="#b32e2e", fg="#ffffff", command=create)
cj.grid(row=0, column=0, padx=80, pady=40)
pj = Button(lf, text="Posted Jobs", font=(
'normal', 20), bg="#b32e2e", fg="#ffffff", command=posted)
pj.grid(row=1, column=0, padx=80, pady=40)
ap = Button(lf, text="Applications", font=(
'normal', 20), bg="#b32e2e", fg="#ffffff", command=app)
ap.grid(row=2, column=0, padx=80, pady=40)
# Right
global rt, tab, bgr
rt = Frame(root, width=540, height=420, bg="#ffffff")
rt.place(x=450, y=220)
tab = Frame(root, bg="#FFFFFF")
tab.place(x=460, y=300, width=520, height=350)
bgrf = Frame(root, width=540, height=420)
bgrf.load = PhotoImage(file="elements\\bgr.png")
bgr = Label(root, image=bgrf.load, bg="#00b9ed")
bgr.place(x=440, y=210)
register.py
from tkinter import *
from tkinter import ttk
from tkinter import messagebox, Label
from tkinter_uix.Entry import Entry
import mysql.connector as sql
import modules.login as l
from modules.creds import user_pwd
def logi(root):
try:
r2.destroy()
r3.destroy()
except:
pass
l.log(root)
def mai(root):
try:
r2.destroy()
except:
pass
global r1
r1 = Frame(root, height=700, width=1050)
r1.place(x=0, y=0)
r1.render = PhotoImage(file="elements/Registration_bg.png")
img = Label(r1, image=r1.render)
img.place(x=0, y=0)
r1.Img1 = PhotoImage(file="elements/recruiter_element.png")
recruit = Button(r1, image=r1.Img1, border=0, bg="#03DDEE",
relief="raised", activebackground="#03EAFD", command=lambda: recruiter_regis(root))
recruit.place(x=140, y=340)
r1.Img2 = PhotoImage(file="elements/client_element.png")
recruit2 = Button(r1, image=r1.Img2, border=0, bg="#05edFC",
relief="raised", activebackground="#05F6FD", command=lambda: client_regis(root))
recruit2.place(x=360, y=340)
r1.bn = PhotoImage(file="elements\\backlogin.png")
btn = Button(r1, image=r1.bn, bg='#05e4f6',
bd=0, activebackground="#05e4f6", command=lambda: logi(root))
btn.place(x=220, y=550)
def recruiter_regis(root):
global name, email, pwd, cpwd
print("hello recruiter")
r1.destroy()
r2 = Frame(root, height=700, width=1050)
r2.place(x=0, y=0)
r2.render = PhotoImage(file="elements/reg_bg.png")
img = Label(r2, image=r2.render)
img.place(x=0, y=0)
name_l = Label(r2, text="Name : ", bg='#FFFFFF', fg="#00B9ED",
font=('normal', 20, 'bold'))
name_l.place(x=100, y=250)
name = Entry(r2, placeholder='Enter Your Full Name...', width=20)
name.place(x=290, y=250)
r2.bn = PhotoImage(file="elements\\next1.png")
btn = Button(r2, image=r2.bn, bg='#FFFFFF', bd=0,
activebackground="#ffffff", command=lambda: recruiter_check(root))
btn.place(x=320, y=500)
r2.back = PhotoImage(file="elements\\back.png")
btn2 = Button(r2, image=r2.back, bg='#FFFFFF', bd=0,
activebackground="#ffffff", command=lambda: mai(root))
btn2.place(x=120, y=500)
def recruiter_check(root):
global name1, email1, pwd1, cpwd1
name1 = name.get()
email1 = email.get()
pwd1 = pwd.get()
cpwd1 = cpwd.get()
print(name1, email1, pwd1, cpwd1)
if name1 and email1 and pwd1 and cpwd1:
mycon = sql.connect(host='localhost', user='root',
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute('select email from users')
total = cur.fetchall()
mycon.close()
exist_email = []
for i in total:
exist_email.append(i[0])
print("existing users:", exist_email)
if email1 in exist_email:
messagebox.showinfo('ALERT!', 'EMAIL ALREADY REGISTERED')
email.delete(0, END)
else:
if pwd1 == cpwd1:
recruit_complete(root)
else:
messagebox.showinfo('ALERT!', 'PASSWORDS DO NOT MATCH')
else:
messagebox.showinfo('ALERT!', 'ALL FIELDS ARE MUST BE FILLED')
def recruit_complete(root):
print("hello ", name1, ", Let's complete your profile")
r3 = Frame(root, height=700, width=1050)
r3.place(x=0, y=0)
r3.render = PhotoImage(file="elements/reg_bg.png")
img = Label(r3, image=r3.render)
img.place(x=0, y=0)
r3.bn = PhotoImage(file="elements\\reg.png")
btn = Button(r3, image=r3.bn, bg='#FFFFFF', bd=0,
activebackground="#ffffff", command=lambda: recruiter_submit(root))
btn.place(x=320, y=500)
def recruiter_submit(root):
global gender1, company1, loc1
gender1 = gender.get()
company1 = company.get()
loc1 = loc.get()
print(name1, email1, gender1, company1, loc1)
if gender1 and company1 and loc1:
exe = f'insert into users values("{name1}","{email1}","recruiter","{pwd1}")'
exe1 = f'INSERT INTO mydb.Recruiter(RID, RName, REmail, CompanyName,
CompanyLocation ,RGender) VALUES
(NULL,"{name1}","{email1}","{company1}","{loc1}","{gender1}")'
try:
mycon = sql.connect(host='localhost', user='root',
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(exe)
cur.execute(exe1)
name.delete(0, END)
email.delete(0, END)
pwd.delete(0, END)
cpwd.delete(0, END)
# gender.delete(0, END)
loc.delete(0, END)
company.delete(0, END)
mycon.commit()
mycon.close()
messagebox.showinfo('SUCCESS!', 'Registration Successful')
logi(root)
except:
pass
else:
messagebox.showinfo('ALERT!', 'ALL FIELDS ARE MUST BE FILLED')
def client_regis(root):
global name, email, pwd, cpwd
print("hello client")
r1.destroy()
r2 = Frame(root, height=700, width=1050)
r2.place(x=0, y=0)
r2.render = PhotoImage(file="elements/reg_bg.png")
img = Label(r2, image=r2.render)
img.place(x=0, y=0)
r2.bn = PhotoImage(file="elements\\next1.png")
btn = Button(r2, image=r2.bn, bg='#FFFFFF', bd=0,
activebackground="#ffffff", command=lambda: client_check(root))
btn.place(x=320, y=500)
r2.back = PhotoImage(file="elements\\back.png")
btn2 = Button(r2, image=r2.back, bg='#FFFFFF', bd=0,
activebackground="#ffffff", command=lambda: mai(root))
btn2.place(x=120, y=500)
def client_check(root):
global name1, email1, pwd1, cpwd1
name1 = name.get()
email1 = email.get()
pwd1 = pwd.get()
cpwd1 = cpwd.get()
print(name1, email1, pwd1, cpwd1)
if name1 and email1 and pwd1 and cpwd1:
mycon = sql.connect(host='localhost', user='root',
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute('select email from users')
total = cur.fetchall()
mycon.close()
exist_email = []
for i in total:
exist_email.append(i[0])
print("existing users:", exist_email)
if email1 in exist_email:
messagebox.showinfo('ALERT!', 'EMAIL ALREADY REGISTERED')
email.delete(0, END)
else:
if pwd1 == cpwd1:
client_complete(root)
else:
messagebox.showinfo('ALERT!', 'PASSWORDS DO NOT MATCH')
else:
messagebox.showinfo('ALERT!', 'ALL FIELDS ARE MUST BE FILLED')
def client_complete(root):
print("hello ", name1, ", Let's complete your profile")
r3 = Frame(root, height=700, width=1050)
r3.place(x=0, y=0)
r3.render = PhotoImage(file="elements/reg_bg.png")
img = Label(r3, image=r3.render)
img.place(x=0, y=0)
r3.bn = PhotoImage(file="elements\\reg.png")
btn = Button(r3, image=r3.bn, bg='#FFFFFF', bd=0,
activebackground="#ffffff", command=lambda: client_submit(root))
btn.place(x=320, y=550)
def client_submit(root):
global gender1, age1, loc1, workxp1, qualification1, skills1
gender1 = gender.get()
age1 = age.get()
loc1 = loc.get()
workxp1 = workxp.get()
qualification1 = qualification.get()
skills1 = skills.get()
print(name1, email1, gender1, age1, loc1, workxp1, qualification1, skills1)
if gender1 and age1 and loc1 and workxp1:
exe = f'insert into users values("{name1}","{email1}","client","{pwd1}")'
exe1 = f'INSERT INTO mydb.Client(CID, CName , CEmail, CAge, CLocation, CGender, CExp, CSkills,
CQualification ) VALUES (NULL, "{name1}", "{email1}", {age1}, "{loc1}", "{gender1}", {workxp1},
"{skills1}", "{qualification1}");'
try:
mycon = sql.connect(host='localhost', user='root',
passwd=user_pwd, database='mydb')
cur = mycon.cursor()
cur.execute(exe)
cur.execute(exe1)
name.delete(0, END)
email.delete(0, END)
pwd.delete(0, END)
cpwd.delete(0, END)
# gender.delete(0, END)
loc.delete(0, END)
age.delete(0, END)
workxp.delete(0, END)
qualification.delete(0, END)
skills.delete(0, END)
mycon.commit()
mycon.close()
messagebox.showinfo('SUCCESS!', 'Registration Successful')
logi(root)
except:
pass
else:
messagebox.showinfo('ALERT!', 'ALL FIELDS ARE MUST BE FILLED')
Sample output: