Compare commits

...

12 Commits

11 changed files with 176 additions and 10 deletions

View File

@ -44,7 +44,6 @@ To install docker compose
sudo chmod +x /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
And finally the containers can be initialized by running And finally the containers can be initialized by running
.. code-block:: bash .. code-block:: bash
sudo docker-compose up --build -d sudo docker-compose up --build -d

View File

@ -103,6 +103,8 @@
<div class="row col-md-offset-6"> <div class="row col-md-offset-6">
<div class="form-group"> <div class="form-group">
<a href="#" class="btn btn-lg btn-success " onclick="updateEmployee();">Update</a> <a href="#" class="btn btn-lg btn-success " onclick="updateEmployee();">Update</a>
<a href="#" class="btn btn-lg btn-primary " onclick="loadView(currentView);">Clear</a>
<a href="#" class="btn btn-lg btn-danger " onclick="deleteEmployee();">Delete</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -85,6 +85,7 @@
<div class="row col-md-offset-6"> <div class="row col-md-offset-6">
<div class="form-group"> <div class="form-group">
<a href="#" class="btn btn-lg btn-success " onclick="saveNewEmployee();">Create</a> <a href="#" class="btn btn-lg btn-success " onclick="saveNewEmployee();">Create</a>
<a href="#" class="btn btn-lg btn-primary " onclick="loadView(currentView);">Clear</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -134,6 +134,7 @@
<div class="row col-md-offset-6"> <div class="row col-md-offset-6">
<div class="form-group"> <div class="form-group">
<a href="#" class="btn btn-lg btn-success " onclick="processSaveActionWorkDay();">Save</a> <a href="#" class="btn btn-lg btn-success " onclick="processSaveActionWorkDay();">Save</a>
<a href="#" class="btn btn-lg btn-primary " onclick="loadView(currentView);">Clear</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -134,6 +134,43 @@ function loadEmployeeData(code){
}); });
} }
/**
* Will change the status of an employee to remove them from the
* active employee list
*/
function deleteEmployee(){
let baseUrl = getbaseUrl();
let code = $('#editEmployeeCode').val();
$.ajax({
url: baseUrl + '/api/employee/' + code,
type: 'DELETE',
dataType: 'json',
success:function(data){
$('#modalServerResponseSuccess').modal('show');
document.getElementById('serverResponseSuccess').innerHTML = 'The employee ' + data['firstName'] + ' ' + data['middleName'] + ' ' + data['lastName'] + ' has been deleted.';
},
error:function(x,e) {
let responseText = $.parseJSON(x["responseText"]);
if (x.status==0) {
$('#modalErrorInternetConnection').modal('show');
} else if(x.status==404) {
$('#modalError404').modal('show');
} else if(x.status==500) {
$('#modalServerResponseError').modal('show');
document.getElementById('modalResponseError').innerHTML = responseText['message'];
} else if(e=='parsererror') {
$('#modalErrorParsererror').modal('show');
} else if(e=='timeout'){
$('#modalErrorTimeout').modal('show');
} else {
$('#modalErrorOther').modal('show');
}
},
});
}
function updateEmployee(){ function updateEmployee(){
let baseUrl = getbaseUrl(); let baseUrl = getbaseUrl();

View File

@ -1,3 +1,6 @@
// will contain the current loaded view
let currentView;
/** /**
* Destorys the session for the current user and redirects * Destorys the session for the current user and redirects
* back to the login form * back to the login form
@ -59,6 +62,8 @@ function loadView(requestedView){
url: baseUrl + '/html/' + requestedView, url: baseUrl + '/html/' + requestedView,
type: 'get', type: 'get',
success:function(data){ success:function(data){
currentView = requestedView;
$("#newViewBody").hide().html(data).show('slow'); $("#newViewBody").hide().html(data).show('slow');
}, },
error:function(x,e) { error:function(x,e) {
@ -81,3 +86,11 @@ function loadView(requestedView){
}, },
}); });
} }
/**
* Reloads the last view that was accessed as a way of fully clearing and
* resetting the values of the form
*/
function clearView(view){
loadView(view);
}

View File

@ -518,9 +518,19 @@ class EmployeeApplication{
return $response; return $response;
} }
function disableEmployeeRecord($idEmployee){ /**
* @param $code string
* @return array
* @throws Exception
*/
function disableEmployeeRecord($code){
$this->asserts->isNotEmpty($code, "The code can't be empty.");
$idEmployee = $this->getIdEmployeeByCode($code);
$this->asserts->higherThanZero($idEmployee, "idEmployee must be higher than 0"); $this->asserts->higherThanZero($idEmployee, "idEmployee must be higher than 0");
$employeeData = $this->proxyGetEmployeeDataById($idEmployee);
try { try {
$stmt = $this->pdo->prepare("UPDATE employees $stmt = $this->pdo->prepare("UPDATE employees
SET SET
@ -532,8 +542,12 @@ class EmployeeApplication{
$this->pdo->commit(); $this->pdo->commit();
$stmt = null; $stmt = null;
return $employeeData;
} catch( PDOExecption $e ) { } catch( PDOExecption $e ) {
$this->pdo->rollback(); $this->pdo->rollback();
throw new Exception("The employee you tried to delete could not be found.");
} }
} }

View File

@ -65,12 +65,12 @@ $app->put('/api/employee', function ($request, $response) {
->write(json_encode($this->employeeApplication->updateEmployeeData($requestData))); ->write(json_encode($this->employeeApplication->updateEmployeeData($requestData)));
}); });
$app->DELETE('/api/employee/{idEmployee}', function (Request $request, Response $response, array $args) { $app->DELETE('/api/employee/{code}', function (Request $request, Response $response, array $args) {
$idEmployee = $args['idEmployee']; $code = $args['code'];
return $response->withStatus(200) return $response->withStatus(200)
->withHeader('Content-Type', 'application/json') ->withHeader('Content-Type', 'application/json')
->write(json_encode($this->employeeApplication->disableEmployeeRecord($idEmployee))); ->write(json_encode($this->employeeApplication->disableEmployeeRecord($code)));
}); });
$app->get('/api/employee/type/{code}', function (Request $request, Response $response, array $args) { $app->get('/api/employee/type/{code}', function (Request $request, Response $response, array $args) {

BIN
calculatingSalary.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

99
documentation/README.rst Normal file
View File

@ -0,0 +1,99 @@
================
Documentation
================
.. contents::
Requirements
----------------------------------
Funtional:
- A user name and password auth
- Encrypted sensitive data
- The employee need to have their full name captured
- The last name must tolerate being null
- An email will be needed for the employee
- The email format must be formated
- Employees will need a phone number
- Searching employees despite the encryption
- Employees must have a unique code to reference them
- Being able to modify the name, email and phone values of already existing employees
- Having the values for the different payments parametrized
- Allowing for employees to perform other roles during their work day
- Only for the auxiliary personnel
- Taking into account only the current month for the salary
- Reducing the taxes for the salary
- If it goes beyond the threshold a different percentage is paid in taxes
- The way the extra tax is handled should be parametrized
Funtional:
- Session management
- Data integrity
- Data security
- Accessible through web
- Containerized
Software behaivor
-----------------
In:
- Employee details
- First name
- Middle name
- Last name
- Birth date
- Email
- Phone number
- Work per day
- Number of deliveries
- Rol performed
Process:
- Register a new employee
- Modify employee
- Search employee
- Add new work day for employee
- Calculate monthly payment for employee
Out:
- Upon registering
- Employee code
- In the work days registry
- Raw salary for the the month
- Taxes discounted
- Real salary for the month
- Vouchers (if applicable)
Calculating the monthly salary
--------------------------------
.. image:: https://raw.githubusercontent.com/PootisPenserHere/payroll_manager/master/documentation/calculatingSalary.bmp
Tests cases
-----------------
+----+----------------------------------------------------------------------------------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------+
| Id | Description | Input | Expected output |
+----+----------------------------------------------------------------------------------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------+
| 1 | Displaying current salary for the outgoing month | Selecting an employee from the search field | On the right side of the window a break down of the employee's salary for the month will be displayed |
+----+----------------------------------------------------------------------------------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------+
| 2 | Submitting incomplete form | All of the input but one of the fields | An error shown in a red modal describing the missing field |
+----+----------------------------------------------------------------------------------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------+
| 3 | Altering the sent data to change the performed rol to one that can't be done by the employee | A employee other than aux performing a different rol than their own | An error displaying that the employee can't perform that task |
+----+----------------------------------------------------------------------------------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------+
Executed tests
---------------
+----+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------+------------------+
| Id | Description | Result | What went wrong? |
+----+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------+------------------+
| 1 | Displaying current salary for the outgoing month | When the employee was selected the current salary was loaded succesfully | |
+----+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------+------------------+
| 2 | Submitting incomplete form | Got the error "The number of deliveries cannot be empty or 0" | |
+----+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------+------------------+
| 3 | Altering the sent data to change the performed rol to one that can't be done by the employee | Got the error "The selected rol can't be done by this type of employee" | |
+----+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------+------------------+
Tools
----------------------------------
The following tools and software were used:
- phpstorm
- git
- docker && docker-compose
- Ubuntu 16

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB