Skip to content

Commit

Permalink
Readme.md and submodules
Browse files Browse the repository at this point in the history
  • Loading branch information
harshpatel23 committed Aug 23, 2020
0 parents commit a8566a8
Show file tree
Hide file tree
Showing 11 changed files with 318 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[submodule "Candidate-Tracker-Server"]
path = Candidate-Tracker-Server
url = https://github.com/harshpatel23/Candidate-Tracker-Server.git
[submodule "Candidate-Tracker-App"]
path = Candidate-Tracker-App
url = https://github.com/shivaneej/Candidate-Tracker-App.git
1 change: 1 addition & 0 deletions Candidate-Tracker-App
Submodule Candidate-Tracker-App added at b68eda
1 change: 1 addition & 0 deletions Candidate-Tracker-Server
60 changes: 60 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<div align="center">
<h1>Candidate Tracker</h1>

[![GitHub contributors](https://img.shields.io/badge/Contributors-3-blueviolet?style=flat-square)](#contributors)&emsp;
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-orange.svg?style=flat-square)](http://makeapullrequest.com)&emsp;
[![npm version](https://img.shields.io/badge/npm-v6.9.0-blue?style=flat-square)](https://www.npmjs.com/)&emsp;
[![Spring Boot](https://img.shields.io/badge/Made%20with-Spring%20Boot-brightgreen?style=flat-square)](https://start.spring.io/)&emsp;
[![Angular](https://img.shields.io/badge/Made%20with-Angular-red?style=flat-square)](https://angular.io/)&emsp;
[![Build](https://img.shields.io/badge/Build-Passing-green?style=flat-square)]()
</div>

* Candidate Tracker is web-based recruitment platform. It can be used to track profile of candidate and supports end to end recruitment process from picking up a candidate's profile to onboarding of the candidate.


## Features
* Dedicated dashboard for every user role. User role is automatically identified upon successful login.
* JWT based authentication and authorization.
* Support for virtual interview between candidate and interviewer using Google Meet.
* Email notifications for account creation, candidate hired or rejected.
* Calendar invite for interviews scheduled.
* Option to upload candidate CV.
* Search, sort and filter candidates.
* Statistics for custom duration.

## Screenshots
<img src="./assets/dashboard.png" height=280px width=480px>&emsp;&emsp;&emsp;
<img src="./assets/interview.png" height=280px width=480px><br><br>
<img src="./assets/candidates.png" height=280px width=480px>&emsp;&emsp;&emsp;
<img src="./assets/calendar.png" height=280px width=480px><br>

## Technology Stack
* Java
* Angular 9
* MySQL Database
* Spring Boot
* Gradle

## Repositories
* [Candidate-Tracker-Server](https://github.com/harshpatel23/Candidate-Tracker-Server)
* [Candidate-Tracker-App](https://github.com/shivaneej/Candidate-Tracker-App)

## How To Run
1. Clone the repository with all the submodule<br>
`git clone --recurse-submodules <URL here>`
2. Import `database/candidate_tracker_schema` in MySQL Workbench.
3. Start the Spring Server by running<br>
`./Candidate-Tracker-Server/gradlew/bootRun`
4. Navigate to `Candidate-Tracker-App`<br>
`cd Candidate-Tracker-App`
4. Install npm dependencies by running<br>
`npm install`
5. Start the Application Server by running<br>
`ng serve`
6. Open `http://localhost:4200/` in your browser to view the application.


## Contributors
* [Shivanee Jaiswal](https://www.github.com/shivaneej)
* [Harsh Patel](https://github.com/harshpatel23)
* [Hitanshu Shah](https://github.com/hitanshu310)
Binary file added assets/calendar.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/candidates.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/dashboard.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/interview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added database/candidate_tracker_EER.pdf
Binary file not shown.
209 changes: 209 additions & 0 deletions database/candidate_tracker_schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

-- -----------------------------------------------------
-- Schema candidate_tracker
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema candidate_tracker
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `candidate_tracker` DEFAULT CHARACTER SET utf8 ;
USE `candidate_tracker` ;

-- -----------------------------------------------------
-- Table `candidate_tracker`.`roles`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `candidate_tracker`.`roles` (
`role` VARCHAR(20) NOT NULL,
`role_string` VARCHAR(30) NOT NULL,
`h_level` FLOAT NOT NULL,
PRIMARY KEY (`role`),
UNIQUE INDEX `role_UNIQUE` (`role` ASC) VISIBLE,
UNIQUE INDEX `role_string_UNIQUE` (`role_string` ASC) VISIBLE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `candidate_tracker`.`user`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `candidate_tracker`.`user` (
`id` INT NOT NULL AUTO_INCREMENT,
`email` VARCHAR(45) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`r_id` VARCHAR(20) NOT NULL,
`first_name` VARCHAR(45) NULL DEFAULT NULL,
`last_name` VARCHAR(45) NULL DEFAULT NULL,
`contact` VARCHAR(10) NULL DEFAULT NULL,
`is_active` TINYINT NULL DEFAULT '1',
`manager_id` INT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE,
INDEX `fk_role_idx` (`r_id` ASC) VISIBLE,
CONSTRAINT `fk_role`
FOREIGN KEY (`r_id`)
REFERENCES `candidate_tracker`.`roles` (`role`),
CONSTRAINT `fk_manager_id`
FOREIGN KEY (`manager_id`)
REFERENCES `candidate_tracker`.`user` (`id`))
ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `candidate_tracker`.`candidate`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `candidate_tracker`.`candidate` (
`id` INT NOT NULL AUTO_INCREMENT,
`email` VARCHAR(45) NOT NULL,
`recruiter_id` INT NOT NULL,
`first_name` VARCHAR(45) NULL DEFAULT NULL,
`last_name` VARCHAR(45) NULL DEFAULT NULL,
`contact` VARCHAR(10) NULL DEFAULT NULL,
`address` TEXT NULL DEFAULT NULL,
`preferred_loc` VARCHAR(45) NULL DEFAULT NULL,
`ectc` INT NULL DEFAULT NULL,
`ctct` INT NULL DEFAULT NULL,
`source` VARCHAR(45) NULL DEFAULT NULL,
`cv` MEDIUMBLOB NULL DEFAULT NULL,
`current_round` INT NULL DEFAULT 0,
`status` ENUM('ready', 'hold', 'hired', 'rejected') NULL DEFAULT 'ready',
`last_updated` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE,
INDEX `fk_recruiter_id_idx` (`recruiter_id` ASC) VISIBLE,
CONSTRAINT `fk_recruiter_id`
FOREIGN KEY (`recruiter_id`)
REFERENCES `candidate_tracker`.`user` (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `candidate_tracker`.`skills`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `candidate_tracker`.`skills` (
`skill_id` INT NOT NULL AUTO_INCREMENT,
`skill_name` VARCHAR(45) NOT NULL,
PRIMARY KEY (`skill_id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `candidate_tracker`.`candidate_skills`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `candidate_tracker`.`candidate_skills` (
`candidate_id` INT NOT NULL,
`skill_id` INT NOT NULL,
PRIMARY KEY (`candidate_id`, `skill_id`),
INDEX `fk_skill_id_idx` (`skill_id` ASC) VISIBLE,
CONSTRAINT `fk_candidate_id`
FOREIGN KEY (`candidate_id`)
REFERENCES `candidate_tracker`.`candidate` (`id`),
CONSTRAINT `fk_skill_id`
FOREIGN KEY (`skill_id`)
REFERENCES `candidate_tracker`.`skills` (`skill_id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `candidate_tracker`.`interview`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `candidate_tracker`.`interview` (
`interview_id` INT NOT NULL AUTO_INCREMENT,
`candidate_id` INT NOT NULL,
`interviewer_id` INT NOT NULL,
`start_time` DATETIME NULL DEFAULT NULL,
`end_time` DATETIME NULL DEFAULT NULL,
`feedback` TEXT NULL DEFAULT NULL,
`updated_by` INT NULL DEFAULT NULL,
`round_no` INT NULL DEFAULT NULL,
`approval_status` ENUM('recruiter_approved', 'interviewer_approved', 'both_approved') NULL DEFAULT 'recruiter_approved',
`is_complete` TINYINT NULL DEFAULT '0',
PRIMARY KEY (`interview_id`),
INDEX `fk_interviewer_id_idx` (`interviewer_id` ASC) VISIBLE,
INDEX `fk_candidate_id_idx` (`candidate_id` ASC) VISIBLE,
INDEX `fk_updated_by_idx` (`updated_by` ASC) VISIBLE,
CONSTRAINT `fk_interview_candidate_id`
FOREIGN KEY (`candidate_id`)
REFERENCES `candidate_tracker`.`candidate` (`id`),
CONSTRAINT `fk_interview_interviewer_id`
FOREIGN KEY (`interviewer_id`)
REFERENCES `candidate_tracker`.`user` (`id`),
CONSTRAINT `fk_updated_by`
FOREIGN KEY (`updated_by`)
REFERENCES `candidate_tracker`.`user` (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `candidate_tracker`.`interviewer_skills`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `candidate_tracker`.`interviewer_skills` (
`interviewer_id` INT NOT NULL,
`skill_id` INT NOT NULL,
PRIMARY KEY (`interviewer_id`, `skill_id`),
INDEX `fk_skill_id_idx` (`skill_id` ASC) VISIBLE,
CONSTRAINT `fk_interviewer_id`
FOREIGN KEY (`interviewer_id`)
REFERENCES `candidate_tracker`.`user` (`id`),
CONSTRAINT `fk_skill_interviewer_id`
FOREIGN KEY (`skill_id`)
REFERENCES `candidate_tracker`.`skills` (`skill_id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `candidate_tracker`.`user_closure`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `candidate_tracker`.`user_closure` (
`mapping_id` INT NOT NULL AUTO_INCREMENT,
`parent_id` INT NULL DEFAULT NULL,
`child_id` INT NULL DEFAULT NULL,
`depth` INT NULL DEFAULT NULL,
PRIMARY KEY (`mapping_id`),
CONSTRAINT `fk_parent_id`
FOREIGN KEY (`parent_id`)
REFERENCES `candidate_tracker`.`user` (`id`),
CONSTRAINT `fk_child_id`
FOREIGN KEY (`child_id`)
REFERENCES `candidate_tracker`.`user` (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

USE `candidate_tracker`;

DELIMITER $$
USE `candidate_tracker`$$
CREATE
DEFINER=`root`@`localhost`
TRIGGER `candidate_tracker`.`user_AFTER_INSERT`
AFTER INSERT ON `candidate_tracker`.`user`
FOR EACH ROW
BEGIN

insert into user_closure(parent_id,child_id,depth) values (new.id, new.id, 0);

INSERT INTO user_closure(parent_id, child_id, depth)
SELECT p.parent_id, c.child_id, p.depth+c.depth+1
FROM user_closure p, user_closure c
WHERE p.child_id = new.manager_id AND c.parent_id = new.id;

END$$


DELIMITER ;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
41 changes: 41 additions & 0 deletions database/populate_data.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
INSERT INTO `candidate_tracker`.`roles` (`role`,`role_string`,`h_level`) VALUES ('root','Root',1),('admin','Admin',2),('ops','OPS',3),('recruiter','Recruiter',4),('interviewer','Interviewer',4);

INSERT into `candidate_tracker`.`skills` (`skill_name`) VALUES ('Java'),('Cyber Security'),('Artificial Intelligence'),('SQL'),('DS'),('Algorithms');

INSERT INTO `candidate_tracker`.`user` (`email`,`password`,`r_id`,`first_name`,`last_name`,`contact`) VALUES ('[email protected]','$2a$10$WB99cJN1ir.MgOOXgew6.eVrmvcxJnTDQMKRXteMJwoD22c6HeYR6','root','Wissen','Technology','123456789');
INSERT INTO `candidate_tracker`.`user` (`email`,`password`,`r_id`,`first_name`,`last_name`,`contact`,`manager_id`) VALUES ('[email protected]','$2a$10$X7A6XWsoJx5cKNR.mTd/vuwbX3PWw8tKl8FaYqbBRt0l5FUbZvENq','admin','Harsh','Patel','1864513287',1);
INSERT INTO `candidate_tracker`.`user` (`email`,`password`,`r_id`,`first_name`,`last_name`,`contact`,`manager_id`) VALUES ('[email protected]','$2a$10$rh5Tp067kFIf3DTDdNRo/uZqjRbQ.bAao/iJSZlk5mC6k3bf4g7Cy','admin','Shivani','Jaiswal','8745852147',1);
INSERT INTO `candidate_tracker`.`user` (`email`,`password`,`r_id`,`first_name`,`last_name`,`contact`,`manager_id`) VALUES ('[email protected]','$2a$10$es0OyjA7a/dd3IJu5UgtsOIo0ydRpsffNY5udjQJcWEb.rYT95Pwq','ops','Hitanshu','Shah','8451284511',2);
INSERT INTO `candidate_tracker`.`user` (`email`,`password`,`r_id`,`first_name`,`last_name`,`contact`,`manager_id`) VALUES ('[email protected]','$2a$10$10rXQLRvVPp0a3xbzkXZgOBmKW2HBzzok/JYv78Mmna0jT6d0XyMi','ops','Murtaza','Patrawala','8541484511',2);
INSERT INTO `candidate_tracker`.`user` (`email`,`password`,`r_id`,`first_name`,`last_name`,`contact`,`manager_id`) VALUES ('[email protected]','$2a$10$YuuxJUGrMMVn46tsKRH8YuCubD98ETKnuXE5tIFJeYphulfNn6rhi','recruiter','Ojas','Kapre','8451247511',4);
INSERT INTO `candidate_tracker`.`user` (`email`,`password`,`r_id`,`first_name`,`last_name`,`contact`,`manager_id`) VALUES ('[email protected]','$2a$10$1jHD2OsY3CSC7/TgCtjRyORsUnlPJOQ7x5p9WWq.2FihdnpQR8l/.','interviewer','Tanay','Raul','7141284511',5);

INSERT INTO `candidate_tracker`.`candidate` (`email`,`recruiter_id`,`first_name`,`last_name`,`contact`,`address`,`preferred_loc`,`ectc`,`ctct`,`source`, `current_round`, `status`)
VALUES ('[email protected]',6,'Manish','Potey','9224659941','Alibaug','Mumbai',4, 3, 'College Placement', 1, 'hold');
INSERT INTO `candidate_tracker`.`candidate` (`email`,`recruiter_id`,`first_name`,`last_name`,`contact`,`address`,`preferred_loc`,`ectc`,`ctct`,`source`, `current_round`, `status`)
VALUES ('[email protected]',6,'Hitansh','Shah','7506847230','Sion','Pune',5, 6, 'College Placement', 2, 'hold');
INSERT INTO `candidate_tracker`.`candidate` (`email`,`recruiter_id`,`first_name`,`last_name`,`contact`,`address`,`preferred_loc`,`ectc`,`ctct`,`source`, `current_round`, `status`)
VALUES ('[email protected]',6,'Jash','Gopnai','8659321547','Borivali','Bangalore',8, 8, 'College Placement', 0, 'ready');
INSERT INTO `candidate_tracker`.`candidate` (`email`,`recruiter_id`,`first_name`,`last_name`,`contact`,`address`,`preferred_loc`,`ectc`,`ctct`,`source`, `current_round`, `status`)
VALUES ('[email protected]',6,'Mikin','Padalia','9869710860','Rajkot','Surat',7, 6, 'College Placement', 1, 'hold');
INSERT INTO `candidate_tracker`.`candidate` (`email`,`recruiter_id`,`first_name`,`last_name`,`contact`,`address`,`preferred_loc`,`ectc`,`ctct`,`source`, `current_round`, `status`)
VALUES ('[email protected]',4,'Jugal','Bharmani','7786381542','Andheri','Mumbai',6, 6, 'College Placement', 2, 'hold');

INSERT INTO `candidate_tracker`.`candidate_skills` (`candidate_id`, `skill_id`) VALUES (1, 1), (1, 2), (1, 3), (1, 4);

INSERT INTO `candidate_tracker`.`interview` (`candidate_id`, `interviewer_id`, `start_time`, `end_time`, `feedback`, `updated_by`, `round_no`)
VALUES (1, 7, '2020-07-15 10:30:00', '2020-07-15 12:30:00', 'Good', 7, 1);

INSERT INTO `candidate_tracker`.`interview` (`candidate_id`, `interviewer_id`, `start_time`, `end_time`, `feedback`, `updated_by`, `round_no`)
VALUES (1, 7, '2020-08-15 14:30:00', '2020-08-15 16:30:00', 'Amazing', 7, 1);

INSERT INTO `candidate_tracker`.`interview` (`candidate_id`, `interviewer_id`, `start_time`, `end_time`, `feedback`, `updated_by`, `round_no`)
VALUES (1, 7, '2020-10-15 16:00:00', '2020-07-15 18:00:00', 'Great', 7, 1);

select * from candidate_tracker.roles;
select * from candidate_tracker.user;
select * from candidate_tracker.interviewuser_closure;

# retreiving all children of an admin (Harsh -> id = 1)
use candidate_Tracker;
select first_name, last_name, email from user inner join user_closure on user.id = user_closure.child_id where user_closure.parent_id = 5;

0 comments on commit a8566a8

Please sign in to comment.