Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d0d57b6575 | ||
|
|
d2c3a2af28 | ||
|
|
8eb1f9f4be | ||
|
|
6b87fdfcd8 | ||
|
|
934388d769 | ||
|
|
08b4d93bef | ||
|
|
3016ef518d | ||
|
|
6798312a78 | ||
|
|
ea106119ab | ||
|
|
ca3492e30e | ||
|
|
8dacf2a8f1 | ||
|
|
16ce8fe461 | ||
|
|
51f9897ca2 | ||
|
|
208d62d167 | ||
|
|
7c5c28047d | ||
|
|
2881319247 |
157
CHANGELOG.txt
157
CHANGELOG.txt
@@ -1,157 +0,0 @@
|
||||
Release note v9.1
|
||||
-----------------
|
||||
### Fixes
|
||||
*Add missing S3FileSystem class
|
||||
|
||||
Release note v9.0
|
||||
-----------------
|
||||
### Features
|
||||
*New user interface
|
||||
*Decimal leave counts supported
|
||||
|
||||
|
||||
Release note v8.4
|
||||
-----------------
|
||||
### Fixes
|
||||
* Fix leave carry forward rounding issues
|
||||
* Fix issue: select2 default value not getting set for select2
|
||||
* Fix issue: email not sent when admin changing leave status
|
||||
|
||||
Release note v8.3
|
||||
-----------------
|
||||
### Fixes
|
||||
* Fix user table issue on windows, this will resolve errors such as: (Note that this fix has no effect on unix based installations)
|
||||
* Admin not able to view user uploaded documents
|
||||
* Admin not able to upload documants for users
|
||||
* Admin can not view employee attendance records
|
||||
* Employee projects can not be added
|
||||
|
||||
|
||||
Release note v8.2
|
||||
-----------------
|
||||
### Features
|
||||
*Instance verification added
|
||||
|
||||
Release note v8.1
|
||||
-----------------
|
||||
### Fixes
|
||||
*Fixed bug that caused a fatal error in php v5.4
|
||||
*aws2.7.11 phar file replaced by a aws2.7.11 extracted files
|
||||
*old aws sdk removed
|
||||
|
||||
Release note v8.0
|
||||
-----------------
|
||||
### Features
|
||||
*Admin dashbord module
|
||||
*If the employee joined in current leave period, his leave entitlement is calculated proportional to joined date
|
||||
*Improvements to reporting module
|
||||
*Adding new employee time tracking report
|
||||
*Join date for employees made mandatory
|
||||
*Sending welcome email when a user is added
|
||||
*Let users directly reply to admin user from any email sent out from icehrm
|
||||
*All the users who are not admins must have an employee object attached
|
||||
*Upgrade aws sdk to v2.7.11
|
||||
*Allow employees to change password
|
||||
*Use only the email address defined under user for sending mails
|
||||
*Making work_email and private_email fields optional
|
||||
|
||||
|
||||
### Fixes
|
||||
*Upload dialog close button issue fixed
|
||||
|
||||
|
||||
Release note v7.2
|
||||
-----------------
|
||||
*Fixes
|
||||
*Some critical vulnerabilities are fixed as recommend by http://zeroscience.mk/en/
|
||||
|
||||
Release note v7.1
|
||||
-----------------
|
||||
*Features
|
||||
*Improved company structure graph
|
||||
*Leave notes implementation – Supervisor can add a note when approving or rejecting leaves
|
||||
*Filtering support
|
||||
*Select boxes with long lists are now searchable
|
||||
*Add/Edit/Delete company structure permissions added for managers
|
||||
*Add ability to disable employee information editing
|
||||
|
||||
*Fixes
|
||||
*Make loans editable only by admin
|
||||
*Fix: permissions not getting applied to employee documents
|
||||
*Fix error adding employee documents when no user assigned to the admin
|
||||
|
||||
*Code Quality
|
||||
*Moving all module related code and data into module folders
|
||||
|
||||
Release note v6.0
|
||||
-----------------
|
||||
* Features
|
||||
* Notifications for leaves and timesheets
|
||||
* Leave module accrue and leave carry forward
|
||||
* Employee leave entitlement sub module
|
||||
* Ability to put system on debug mode
|
||||
* Allow admins to see documents of all the employees at one place
|
||||
* Backup data when deleting an employee
|
||||
* Employee attendance report added
|
||||
* Changes to time entry form in timesheet module to make time entry process faster
|
||||
* Admin can make all projects available to employees or just the set of prjects assigned to them using Setting "Projects: Make All Projects Available to Employees"
|
||||
* Employee document, date added field can not be changed by the employee anymore
|
||||
* About dialog added for admins
|
||||
|
||||
* Fixes
|
||||
* Fix default employee delete issue (when the default employee is deleted the admin user attached to it also get deleted)
|
||||
* Fix user duplicate email issue
|
||||
* Fix manager can not logout from switched employee
|
||||
* Remove admin guide from non admin users
|
||||
|
||||
Release note v5.3
|
||||
-----------------
|
||||
* Fixes
|
||||
* Fix missing employee name in employee details report
|
||||
|
||||
Release note v5.2
|
||||
-----------------
|
||||
* Fixes
|
||||
* Remove unwanted error logs
|
||||
* Fix attendance module employee permission issue
|
||||
* Resolve warnings
|
||||
* Remove add new button from subordinates module
|
||||
* Adding administrators' guide
|
||||
|
||||
Release note v5.1
|
||||
-----------------
|
||||
* Fixes
|
||||
* Fixing for non updating null fields
|
||||
* https://bitbucket.org/thilina/icehrm-opensource/commits/df57308b53484a2e43ef5c72967ed1cd0dc756cc
|
||||
|
||||
Release note v5.0
|
||||
-----------------
|
||||
* Features
|
||||
* New user permission implementation
|
||||
* Adding new user level - Manager
|
||||
|
||||
* Fixes
|
||||
* Fixing remote table loading issue
|
||||
|
||||
Release note v4.2
|
||||
-----------------
|
||||
* Fixes
|
||||
* https://bitbucket.org/thilina/icehrm-opensource/issue/23/subordinate-leaves-pagination-not-working
|
||||
* https://bitbucket.org/thilina/icehrm-opensource/issue/20/error-occured-while-time-punch
|
||||
|
||||
|
||||
Release note v4.1
|
||||
-----------------
|
||||
* Features
|
||||
* Better email format for notifications
|
||||
* Convert upload dialog to a bootstrp model
|
||||
|
||||
* Fixes
|
||||
* Fix error sending emails with amazon SES
|
||||
* Fix errors related to XAMPP and WAMPP servers
|
||||
* Fix php warnings and notifications
|
||||
* Fix company structure graph issues
|
||||
* Allow icehrm client to work without an internet connection
|
||||
* Fix installer incorrect base url issue
|
||||
* Fix empty user creation issue
|
||||
|
||||
@@ -11,7 +11,7 @@ define('APP_DB', '_APP_DB_');
|
||||
define('APP_USERNAME', '_APP_USERNAME_');
|
||||
define('APP_PASSWORD', '_APP_PASSWORD_');
|
||||
define('APP_HOST', '_APP_HOST_');
|
||||
define('APP_CON_STR', 'mysql://'.APP_USERNAME.':'.APP_PASSWORD.'@'.APP_HOST.'/'.APP_DB);
|
||||
define('APP_CON_STR', 'mysqli://'.APP_USERNAME.':'.APP_PASSWORD.'@'.APP_HOST.'/'.APP_DB);
|
||||
|
||||
//file upload
|
||||
define('FILE_TYPES', 'jpg,png,jpeg');
|
||||
|
||||
@@ -7,7 +7,7 @@ class NotificationManager{
|
||||
$this->baseService = $baseService;
|
||||
}
|
||||
|
||||
public function addNotification($toEmployee, $message, $action, $type, $toUserId = null, $fromSystem = false){
|
||||
public function addNotification($toEmployee, $message, $action, $type, $toUserId = null, $fromSystem = false, $sendEmail = false){
|
||||
|
||||
$userEmp = new User();
|
||||
|
||||
@@ -63,6 +63,11 @@ class NotificationManager{
|
||||
$ok = $noti->Save();
|
||||
if(!$ok){
|
||||
error_log("Error adding notification: ".$noti->ErrorMsg());
|
||||
}else if($sendEmail){
|
||||
$emailSender = BaseService::getInstance()->getEmailSender();
|
||||
if(!empty($emailSender)){
|
||||
$emailSender->sendEmailFromNotification($noti);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
1
core-ext/common.cron.tasks.ext.php
Normal file
1
core-ext/common.cron.tasks.ext.php
Normal file
@@ -0,0 +1 @@
|
||||
<?php
|
||||
@@ -9,13 +9,13 @@ define('HOME_LINK_ADMIN', CLIENT_BASE_URL."?g=admin&n=dashboard&m=admin_Admin");
|
||||
define('HOME_LINK_OTHERS', CLIENT_BASE_URL."?g=modules&n=dashboard&m=module_Personal_Information");
|
||||
|
||||
//Version
|
||||
define('VERSION', '13.1.OS');
|
||||
define('CACHE_VALUE', '13.1');
|
||||
define('VERSION_DATE', '09/10/2015');
|
||||
define('VERSION', '14.0.OS');
|
||||
define('CACHE_VALUE', '14.0.OS');
|
||||
define('VERSION_DATE', '12/12/2015');
|
||||
|
||||
if(!defined('CONTACT_EMAIL')){define('CONTACT_EMAIL','icehrm@gamonoid.com');}
|
||||
if(!defined('KEY_PREFIX')){define('KEY_PREFIX','IceHrm');}
|
||||
if(!defined('APP_SEC')){define('APP_SEC','dbcs234d2saaqw');}
|
||||
if(!defined('APP_SEC')){define('APP_SEC','dbcs234d2s111');}
|
||||
|
||||
define('UI_SHOW_SWITCH_PROFILE', true);
|
||||
define('CRON_LOG', '/var/log/nginx/icehrmcron.log');
|
||||
@@ -1,519 +0,0 @@
|
||||
.redFont{
|
||||
color: red;
|
||||
}
|
||||
.box_ws{
|
||||
background: white;
|
||||
border-left: 1px solid #DDD;
|
||||
border-right: 1px solid #DDD;
|
||||
border-bottom: 1px solid #DDD;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.cal_box_ws{
|
||||
background: white;
|
||||
border: 1px solid #DDD;
|
||||
color: #555;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
.cal_box_ws .wd_date_full{
|
||||
font-weight:bold;
|
||||
font-size:10px;
|
||||
float: right;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.cal_box_ws .wd_date{
|
||||
font-size:10px;
|
||||
float: right;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.nav-pills li a:hover{
|
||||
background: #1D64AD;
|
||||
color:white;
|
||||
};
|
||||
|
||||
.navbar-inverse .brand, .navbar-inverse .nav > li > a {
|
||||
font-weight: bold;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.categoryWrap p{
|
||||
font-size:16px;
|
||||
font-weight:bold;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.categoryWrap p:hover{
|
||||
font-size:16px;
|
||||
font-weight:bold;
|
||||
color:white;
|
||||
background: gray;
|
||||
padding: 3px;
|
||||
cursor:pointer;
|
||||
border-radius: 4px;
|
||||
|
||||
}
|
||||
|
||||
.resultLogo{
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.pbar{
|
||||
font-weight:bold;
|
||||
font-size:11px;
|
||||
}
|
||||
|
||||
.pbar .progress{
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
.bs-docs-sidenav {
|
||||
width: 228px;
|
||||
margin: 30px 0 0;
|
||||
padding: 0;
|
||||
background-color: #fff;
|
||||
-webkit-border-radius: 6px;
|
||||
-moz-border-radius: 6px;
|
||||
border-radius: 6px;
|
||||
-webkit-box-shadow: 0 1px 4px rgba(0,0,0,.065);
|
||||
-moz-box-shadow: 0 1px 4px rgba(0,0,0,.065);
|
||||
box-shadow: 0 1px 4px rgba(0,0,0,.065);
|
||||
}
|
||||
.bs-docs-sidenav > li > a {
|
||||
display: block;
|
||||
*width: 190px;
|
||||
margin: 0 0 -1px;
|
||||
padding: 8px 14px;
|
||||
border: 1px solid #e5e5e5;
|
||||
}
|
||||
.bs-docs-sidenav > li:first-child > a {
|
||||
-webkit-border-radius: 6px 6px 0 0;
|
||||
-moz-border-radius: 6px 6px 0 0;
|
||||
border-radius: 6px 6px 0 0;
|
||||
}
|
||||
.bs-docs-sidenav > li:last-child > a {
|
||||
-webkit-border-radius: 0 0 6px 6px;
|
||||
-moz-border-radius: 0 0 6px 6px;
|
||||
border-radius: 0 0 6px 6px;
|
||||
}
|
||||
.bs-docs-sidenav > .active > a {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
padding: 9px 15px;
|
||||
border: 0;
|
||||
text-shadow: 0 1px 0 rgba(0,0,0,.15);
|
||||
-webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1);
|
||||
-moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1);
|
||||
box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1);
|
||||
}
|
||||
/* Chevrons */
|
||||
.bs-docs-sidenav .icon-chevron-right {
|
||||
float: right;
|
||||
margin-top: 2px;
|
||||
margin-right: -6px;
|
||||
opacity: .25;
|
||||
}
|
||||
.bs-docs-sidenav > li > a:hover {
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
.bs-docs-sidenav a:hover .icon-chevron-right {
|
||||
opacity: .5;
|
||||
}
|
||||
.bs-docs-sidenav .active .icon-chevron-right,
|
||||
.bs-docs-sidenav .active a:hover .icon-chevron-right {
|
||||
background-image: url(../img/glyphicons-halflings-white.png);
|
||||
opacity: 1;
|
||||
}
|
||||
.bs-docs-sidenav.affix {
|
||||
top: 40px;
|
||||
}
|
||||
.bs-docs-sidenav.affix-bottom {
|
||||
position: absolute;
|
||||
top: auto;
|
||||
bottom: 270px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Responsive
|
||||
-------------------------------------------------- */
|
||||
|
||||
/* Desktop large
|
||||
------------------------- */
|
||||
@media (min-width: 1200px) {
|
||||
.bs-docs-container {
|
||||
max-width: 970px;
|
||||
}
|
||||
.bs-docs-sidenav {
|
||||
width: 258px;
|
||||
}
|
||||
}
|
||||
|
||||
.reviewPoints{
|
||||
margin-top:10px;
|
||||
}
|
||||
|
||||
.reviewPoints .star{
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.reviewBlock {
|
||||
position: relative;
|
||||
margin: 0px 0;
|
||||
padding: 39px 19px 14px;
|
||||
background-color: white;
|
||||
border: 1px solid #DDD;
|
||||
/*
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
*/
|
||||
font-size:12px;
|
||||
}
|
||||
|
||||
/*.reviewBlock::after {
|
||||
content: attr(data-content);
|
||||
position: absolute;
|
||||
top: -1px;
|
||||
left: -1px;
|
||||
padding: 3px 7px;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
background-color: whiteSmoke;
|
||||
border: 1px solid #DDD;
|
||||
color: #9DA0A4;
|
||||
-webkit-border-radius: 4px 0 4px 0;
|
||||
-moz-border-radius: 4px 0 4px 0;
|
||||
border-radius: 4px 0 4px 0;
|
||||
}*/
|
||||
|
||||
.box_ws{
|
||||
background: white;
|
||||
border-left: 1px solid #DDD;
|
||||
border-right: 1px solid #DDD;
|
||||
border-bottom: 1px solid #DDD;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.cal_box_ws{
|
||||
background: white;
|
||||
border: 1px solid #DDD;
|
||||
color: #555;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
.cal_box_ws .wd_date_full{
|
||||
font-weight:bold;
|
||||
font-size:10px;
|
||||
float: right;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.cal_box_ws .wd_date{
|
||||
font-size:10px;
|
||||
float: right;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.nav-pills li a:hover{
|
||||
background: #1D64AD;
|
||||
color:white;
|
||||
};
|
||||
|
||||
.nav-tabs > li > a {
|
||||
color:white;
|
||||
}
|
||||
|
||||
.nav-tabs > li > a:hover{
|
||||
color:#555;
|
||||
}
|
||||
|
||||
|
||||
.topheader {
|
||||
background: -moz-linear-gradient(#829AA8, #405A6A);
|
||||
background: -webkit-linear-gradient(#829AA8, #405A6A);
|
||||
background: linear-gradient(#829AA8, #405A6A);
|
||||
border: 1px solid #677C89;
|
||||
border-bottom-color: #6B808D;
|
||||
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4),0 0px 10px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
|
||||
.bgbody{
|
||||
background: #FAFAFA;
|
||||
background: -moz-linear-gradient(#FAFAFA, #EAEAEA);
|
||||
background: -webkit-linear-gradient(#FAFAFA, #EAEAEA);
|
||||
background: linear-gradient(#FAFAFA, #EAEAEA);
|
||||
border-bottom: 1px solid #CACACA;
|
||||
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4),0 0px 10px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.leftMenu{
|
||||
background-color: #E9F1F4;
|
||||
border-style: solid;
|
||||
border-width: 1px 1px 2px;
|
||||
border-color: #E9F1F4 #D8DEE2 #D8DEE2;
|
||||
border-radius: 0 0 5px 5px;
|
||||
}
|
||||
|
||||
.nav > li > a:hover {
|
||||
text-decoration: none;
|
||||
background-color: whitesmoke;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
/*
|
||||
.nav-list > .active > a, .nav-list > .active > a:hover{
|
||||
color: white;
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
|
||||
background-color: #405A6A;
|
||||
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4),0 0px 10px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 5px;
|
||||
}
|
||||
*/
|
||||
|
||||
a {
|
||||
color: #405A6A;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.nav-header {
|
||||
display: block;
|
||||
padding: 3px 15px;
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
line-height: 20px;
|
||||
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
|
||||
text-transform: none;
|
||||
background: -moz-linear-gradient(#829AA8, #405A6A);
|
||||
background: -webkit-linear-gradient(#829AA8, #405A6A);
|
||||
background: linear-gradient(#829AA8, #405A6A);
|
||||
color: white;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.modal-backdrop,
|
||||
.modal-backdrop.fade.in {
|
||||
opacity: 0.4;
|
||||
filter: alpha(opacity=40);
|
||||
}
|
||||
|
||||
.error{
|
||||
color:red;
|
||||
}
|
||||
|
||||
.columnMain{
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.borderBox{
|
||||
padding-bottom: 10px;
|
||||
padding-left: 10px;
|
||||
padding-top: 10px;
|
||||
-moz-border-radius: 5px;
|
||||
border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
margin-bottom: 20px;
|
||||
-moz-box-shadow: 1px 3px 3px rgba(0, 0, 0, 0.1);
|
||||
-webkit-box-shadow: 1px 3px 3px rgba(0, 0, 0, 0.1);
|
||||
box-shadow: 1px 3px 3px rgba(0, 0, 0, 0.1);
|
||||
border: 1px solid #EEE;
|
||||
}
|
||||
|
||||
|
||||
.iceicon_edit{
|
||||
background-image: url("../images/edit.png");
|
||||
}
|
||||
|
||||
.iceicon_delete{
|
||||
background-image: url("../images/delete.png");
|
||||
}
|
||||
|
||||
.iceicon_user{
|
||||
background-image: url("../images/user.png");
|
||||
}
|
||||
|
||||
.dropdown-menu{
|
||||
z-index: 10000;
|
||||
}
|
||||
|
||||
.lightface .lightfaceContent .lightfaceTitle {
|
||||
font-size: 14px;
|
||||
color: #fff;
|
||||
background-color: #405A6A;
|
||||
border: 1px solid #405A6A;
|
||||
font-weight: bold;
|
||||
margin: -1px;
|
||||
margin-bottom: 0;
|
||||
padding: 5px 10px;
|
||||
line-height: 30px;
|
||||
}
|
||||
|
||||
.label-ice, .badge-ice{
|
||||
background-color: #405A6A;
|
||||
}
|
||||
|
||||
.dataTables_processing{
|
||||
position: absolute;
|
||||
margin-left: 40px;
|
||||
font-weight: bold;
|
||||
font-size: 13px;
|
||||
color: gray;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*changes to full caledar*/
|
||||
.fc-header-title h2 {
|
||||
margin-top: 0;
|
||||
white-space: nowrap;
|
||||
font-size: 20px;
|
||||
margin-left: 10px;
|
||||
color:#405A6A;
|
||||
}
|
||||
|
||||
table.dataTable{
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
.form-horizontal{
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.form-horizontal .row{
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.table.dataTable {width:100% !important;}
|
||||
|
||||
.iceLabel{
|
||||
font-size: 12px !important;
|
||||
font-weight: bold;
|
||||
color: #3c8dbc;
|
||||
}
|
||||
|
||||
.nav-tabs>li>a{
|
||||
border-radius:0px;
|
||||
}
|
||||
|
||||
.nav > li > a:hover {
|
||||
border-radius:0px;
|
||||
}
|
||||
|
||||
.btn {
|
||||
-webkit-border-radius: 0px;
|
||||
-moz-border-radius: 0px;
|
||||
border-radius: 0px;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* select2 style overide */
|
||||
.select2-choice{
|
||||
border: none !important;
|
||||
width: 100% !important;
|
||||
border-radius: 0px !important;
|
||||
background-color: #FFF !important;
|
||||
background-image: none !important;
|
||||
}
|
||||
|
||||
|
||||
.select2-container{
|
||||
padding:3px !important;
|
||||
}
|
||||
|
||||
.select2-container-multi{
|
||||
padding:0px !important;
|
||||
border:none;
|
||||
}
|
||||
|
||||
.select2-arrow{
|
||||
background-image: none !important;
|
||||
background: #FFF !important;
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.select2-drop-active {
|
||||
/*border: 1px solid black !important;*/
|
||||
border-top: none !important;
|
||||
background: #f0f0f0 !important;
|
||||
}
|
||||
|
||||
.logTime{
|
||||
font-weight: bold;
|
||||
font-size: 13px;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.popupForm{
|
||||
border: none !important;
|
||||
padding: 0px 19px 14px !important;
|
||||
}
|
||||
|
||||
.content {
|
||||
background: #FFF;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
background: #FFF;
|
||||
}
|
||||
|
||||
.user-panel > .info > p {
|
||||
margin-bottom: 9px;
|
||||
max-width: 135px;
|
||||
line-height: 17px;
|
||||
}
|
||||
|
||||
.list-group-item-text{
|
||||
margin-bottom:5px;
|
||||
}
|
||||
|
||||
.list-group-item{
|
||||
padding-bottom:30px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/custom for v11.0 */
|
||||
|
||||
|
||||
.table-bordered>thead>tr>th{
|
||||
border:none !important;
|
||||
}
|
||||
|
||||
.table-bordered>thead>tr>th, .table-bordered>thead>tr>td {
|
||||
border-bottom-width: 2px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.table{
|
||||
-webkit-transition: margin-left .15s linear;
|
||||
transition: margin-left .15s linear;
|
||||
-webkit-user-select: none;
|
||||
background-color: #fff;
|
||||
-webkit-box-shadow: 0 1px 2px 0 rgba(0,0,0,.2);
|
||||
box-shadow: 0 1px 2px 0 rgba(0,0,0,.2);
|
||||
}
|
||||
|
||||
.reviewBlock{
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box
|
||||
}
|
||||
|
||||
.treeview-menu li:hover{
|
||||
font-weight:bold;
|
||||
}
|
||||
145
core-ext/db_upgrade/icehrmdb_upgrade_v13.3.OS_v14.0.OS.sql
Normal file
145
core-ext/db_upgrade/icehrmdb_upgrade_v13.3.OS_v14.0.OS.sql
Normal file
@@ -0,0 +1,145 @@
|
||||
ALTER TABLE EmployeeTravelRecords ADD COLUMN `funding` decimal(10,3) NULL AFTER `details`;
|
||||
ALTER TABLE EmployeeTravelRecords ADD COLUMN `currency` bigint(20) NULL AFTER `funding`;
|
||||
ALTER TABLE EmployeeTravelRecords ADD COLUMN `status` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending';
|
||||
|
||||
|
||||
REPLACE INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`, `type`) VALUES
|
||||
('Travel Request Report', 'This report list employees travel requests for a specified period',
|
||||
'[\r\n[ "employee", {"label":"Employee","type":"select2multi","allow-null":true,"null-label":"All Employees","remote-source":["Employee","id","first_name+last_name"]}],\r\n[ "date_start", {"label":"Start Date","type":"date"}],\r\n[ "date_end", {"label":"End Date","type":"date"}],\r\n[ "status", {"label":"Status","type":"select","source":[["NULL","All Statuses"],["Approved","Approved"],["Pending","Pending"],["Rejected","Rejected"],["Cancellation Requested","Cancellation Requested"],["Cancelled","Cancelled"]]}]\r\n]',
|
||||
'TravelRequestReport',
|
||||
'["employee","date_start","date_end","status"]', 'Class');
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('Travel: Pre-Approve Travel Request', '0', '','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]');
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('Attendance: Use Department Time Zone', '0', '','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]');
|
||||
|
||||
UPDATE `Settings` set value = '1' where name = 'System: Reset Modules and Permissions';
|
||||
|
||||
ALTER TABLE `CompanyStructures` ADD COLUMN `timezone` varchar(100) not null default 'Europe/London';
|
||||
|
||||
create table `Timezones` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) not null default '',
|
||||
`details` varchar(255) not null default '',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
INSERT INTO `Timezones`(`id`, `name`, `details`) VALUES
|
||||
(1, 'Pacific/Midway', '(GMT-11:00) Midway Island'),
|
||||
(2, 'US/Samoa', '(GMT-11:00) Samoa'),
|
||||
(3, 'US/Hawaii', '(GMT-10:00) Hawaii'),
|
||||
(4, 'US/Alaska', '(GMT-09:00) Alaska'),
|
||||
(5, 'US/Pacific', '(GMT-08:00) Pacific Time (US & Canada)'),
|
||||
(6, 'America/Tijuana', '(GMT-08:00) Tijuana'),
|
||||
(7, 'US/Arizona', '(GMT-07:00) Arizona'),
|
||||
(8, 'US/Mountain', '(GMT-07:00) Mountain Time (US & Canada)'),
|
||||
(9, 'America/Chihuahua', '(GMT-07:00) Chihuahua'),
|
||||
(10, 'America/Mazatlan', '(GMT-07:00) Mazatlan'),
|
||||
(11, 'America/Mexico_City', '(GMT-06:00) Mexico City'),
|
||||
(12, 'America/Monterrey', '(GMT-06:00) Monterrey'),
|
||||
(13, 'Canada/Saskatchewan', '(GMT-06:00) Saskatchewan'),
|
||||
(14, 'US/Central', '(GMT-06:00) Central Time (US & Canada)'),
|
||||
(15, 'US/Eastern', '(GMT-05:00) Eastern Time (US & Canada)'),
|
||||
(16, 'US/East-Indiana', '(GMT-05:00) Indiana (East)'),
|
||||
(17, 'America/Bogota', '(GMT-05:00) Bogota'),
|
||||
(18, 'America/Lima', '(GMT-05:00) Lima'),
|
||||
(19, 'America/Caracas', '(GMT-04:30) Caracas'),
|
||||
(20, 'Canada/Atlantic', '(GMT-04:00) Atlantic Time (Canada)'),
|
||||
(21, 'America/La_Paz', '(GMT-04:00) La Paz'),
|
||||
(22, 'America/Santiago', '(GMT-04:00) Santiago'),
|
||||
(23, 'Canada/Newfoundland', '(GMT-03:30) Newfoundland'),
|
||||
(24, 'America/Buenos_Aires', '(GMT-03:00) Buenos Aires'),
|
||||
(25, 'Greenland', '(GMT-03:00) Greenland'),
|
||||
(26, 'Atlantic/Stanley', '(GMT-02:00) Stanley'),
|
||||
(27, 'Atlantic/Azores', '(GMT-01:00) Azores'),
|
||||
(28, 'Atlantic/Cape_Verde', '(GMT-01:00) Cape Verde Is.'),
|
||||
(29, 'Africa/Casablanca', '(GMT) Casablanca'),
|
||||
(30, 'Europe/Dublin', '(GMT) Dublin'),
|
||||
(31, 'Europe/Lisbon', '(GMT) Lisbon'),
|
||||
(32, 'Europe/London', '(GMT) London'),
|
||||
(33, 'Africa/Monrovia', '(GMT) Monrovia'),
|
||||
(34, 'Europe/Amsterdam', '(GMT+01:00) Amsterdam'),
|
||||
(35, 'Europe/Belgrade', '(GMT+01:00) Belgrade'),
|
||||
(36, 'Europe/Berlin', '(GMT+01:00) Berlin'),
|
||||
(37, 'Europe/Bratislava', '(GMT+01:00) Bratislava'),
|
||||
(38, 'Europe/Brussels', '(GMT+01:00) Brussels'),
|
||||
(39, 'Europe/Budapest', '(GMT+01:00) Budapest'),
|
||||
(40, 'Europe/Copenhagen', '(GMT+01:00) Copenhagen'),
|
||||
(41, 'Europe/Ljubljana', '(GMT+01:00) Ljubljana'),
|
||||
(42, 'Europe/Madrid', '(GMT+01:00) Madrid'),
|
||||
(43, 'Europe/Paris', '(GMT+01:00) Paris'),
|
||||
(44, 'Europe/Prague', '(GMT+01:00) Prague'),
|
||||
(45, 'Europe/Rome', '(GMT+01:00) Rome'),
|
||||
(46, 'Europe/Sarajevo', '(GMT+01:00) Sarajevo'),
|
||||
(47, 'Europe/Skopje', '(GMT+01:00) Skopje'),
|
||||
(48, 'Europe/Stockholm', '(GMT+01:00) Stockholm'),
|
||||
(49, 'Europe/Vienna', '(GMT+01:00) Vienna'),
|
||||
(50, 'Europe/Warsaw', '(GMT+01:00) Warsaw'),
|
||||
(51, 'Europe/Zagreb', '(GMT+01:00) Zagreb'),
|
||||
(52, 'Europe/Athens', '(GMT+02:00) Athens'),
|
||||
(53, 'Europe/Bucharest', '(GMT+02:00) Bucharest'),
|
||||
(54, 'Africa/Cairo', '(GMT+02:00) Cairo'),
|
||||
(55, 'Africa/Harare', '(GMT+02:00) Harare'),
|
||||
(56, 'Europe/Helsinki', '(GMT+02:00) Helsinki'),
|
||||
(57, 'Europe/Istanbul', '(GMT+02:00) Istanbul'),
|
||||
(58, 'Asia/Jerusalem', '(GMT+02:00) Jerusalem'),
|
||||
(59, 'Europe/Kiev', '(GMT+02:00) Kyiv'),
|
||||
(60, 'Europe/Minsk', '(GMT+02:00) Minsk'),
|
||||
(61, 'Europe/Riga', '(GMT+02:00) Riga'),
|
||||
(62, 'Europe/Sofia', '(GMT+02:00) Sofia'),
|
||||
(63, 'Europe/Tallinn', '(GMT+02:00) Tallinn'),
|
||||
(64, 'Europe/Vilnius', '(GMT+02:00) Vilnius'),
|
||||
(65, 'Asia/Baghdad', '(GMT+03:00) Baghdad'),
|
||||
(66, 'Asia/Kuwait', '(GMT+03:00) Kuwait'),
|
||||
(67, 'Africa/Nairobi', '(GMT+03:00) Nairobi'),
|
||||
(68, 'Asia/Riyadh', '(GMT+03:00) Riyadh'),
|
||||
(69, 'Europe/Moscow', '(GMT+03:00) Moscow'),
|
||||
(70, 'Asia/Tehran', '(GMT+03:30) Tehran'),
|
||||
(71, 'Asia/Baku', '(GMT+04:00) Baku'),
|
||||
(72, 'Europe/Volgograd', '(GMT+04:00) Volgograd'),
|
||||
(73, 'Asia/Muscat', '(GMT+04:00) Muscat'),
|
||||
(74, 'Asia/Tbilisi', '(GMT+04:00) Tbilisi'),
|
||||
(75, 'Asia/Yerevan', '(GMT+04:00) Yerevan'),
|
||||
(76, 'Asia/Kabul', '(GMT+04:30) Kabul'),
|
||||
(77, 'Asia/Karachi', '(GMT+05:00) Karachi'),
|
||||
(78, 'Asia/Tashkent', '(GMT+05:00) Tashkent'),
|
||||
(79, 'Asia/Kolkata', '(GMT+05:30) Kolkata'),
|
||||
(80, 'Asia/Kathmandu', '(GMT+05:45) Kathmandu'),
|
||||
(81, 'Asia/Yekaterinburg', '(GMT+06:00) Ekaterinburg'),
|
||||
(82, 'Asia/Almaty', '(GMT+06:00) Almaty'),
|
||||
(83, 'Asia/Dhaka', '(GMT+06:00) Dhaka'),
|
||||
(84, 'Asia/Novosibirsk', '(GMT+07:00) Novosibirsk'),
|
||||
(85, 'Asia/Bangkok', '(GMT+07:00) Bangkok'),
|
||||
(86, 'Asia/Jakarta', '(GMT+07:00) Jakarta'),
|
||||
(87, 'Asia/Krasnoyarsk', '(GMT+08:00) Krasnoyarsk'),
|
||||
(88, 'Asia/Chongqing', '(GMT+08:00) Chongqing'),
|
||||
(89, 'Asia/Hong_Kong', '(GMT+08:00) Hong Kong'),
|
||||
(90, 'Asia/Kuala_Lumpur', '(GMT+08:00) Kuala Lumpur'),
|
||||
(91, 'Australia/Perth', '(GMT+08:00) Perth'),
|
||||
(92, 'Asia/Singapore', '(GMT+08:00) Singapore'),
|
||||
(93, 'Asia/Taipei', '(GMT+08:00) Taipei'),
|
||||
(94, 'Asia/Ulaanbaatar', '(GMT+08:00) Ulaan Bataar'),
|
||||
(95, 'Asia/Urumqi', '(GMT+08:00) Urumqi'),
|
||||
(96, 'Asia/Irkutsk', '(GMT+09:00) Irkutsk'),
|
||||
(97, 'Asia/Seoul', '(GMT+09:00) Seoul'),
|
||||
(98, 'Asia/Tokyo', '(GMT+09:00) Tokyo'),
|
||||
(99, 'Australia/Adelaide', '(GMT+09:30) Adelaide'),
|
||||
(100, 'Australia/Darwin', '(GMT+09:30) Darwin'),
|
||||
(101, 'Asia/Yakutsk', '(GMT+10:00) Yakutsk'),
|
||||
(102, 'Australia/Brisbane', '(GMT+10:00) Brisbane'),
|
||||
(103, 'Australia/Canberra', '(GMT+10:00) Canberra'),
|
||||
(104, 'Pacific/Guam', '(GMT+10:00) Guam'),
|
||||
(105, 'Australia/Hobart', '(GMT+10:00) Hobart'),
|
||||
(106, 'Australia/Melbourne', '(GMT+10:00) Melbourne'),
|
||||
(107, 'Pacific/Port_Moresby', '(GMT+10:00) Port Moresby'),
|
||||
(108, 'Australia/Sydney', '(GMT+10:00) Sydney'),
|
||||
(109, 'Asia/Vladivostok', '(GMT+11:00) Vladivostok'),
|
||||
(110, 'Asia/Magadan', '(GMT+12:00) Magadan'),
|
||||
(111, 'Pacific/Auckland', '(GMT+12:00) Auckland'),
|
||||
(112, 'Pacific/Fiji', '(GMT+12:00) Fiji');
|
||||
|
||||
|
||||
|
||||
@@ -91,12 +91,13 @@ if(!file_exists($logoFileName)){
|
||||
|
||||
/* The white background content wrapper */
|
||||
.container > .content {
|
||||
min-height: 0px !important;
|
||||
background-color: #fff;
|
||||
padding: 20px;
|
||||
margin: 0 -20px;
|
||||
-webkit-border-radius: 10px 10px 10px 10px;
|
||||
-moz-border-radius: 10px 10px 10px 10px;
|
||||
border-radius: 10px 10px 10px 10px;
|
||||
-webkit-border-radius:0px;
|
||||
-moz-border-radius:0px;
|
||||
border-radius: 0px;
|
||||
-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15);
|
||||
-moz-box-shadow: 0 1px 2px rgba(0,0,0,.15);
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,.15);
|
||||
@@ -112,10 +113,22 @@ if(!file_exists($logoFileName)){
|
||||
color: #404040;
|
||||
}
|
||||
|
||||
.add-on{
|
||||
-webkit-border-radius:0px;
|
||||
-moz-border-radius:0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
input{
|
||||
-webkit-border-radius:0px;
|
||||
-moz-border-radius:0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
|
||||
</head>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div itemscope itemtype="http://schema.org/WebApplication" style="display: none;">
|
||||
|
||||
@@ -52,6 +52,41 @@
|
||||
</div>
|
||||
<!-- Plain Message Modal -->
|
||||
|
||||
<!-- Data Message Modal -->
|
||||
<div class="modal fade" id="dataMessageModel" tabindex="-1" role="dialog" aria-labelledby="dataMessageModelLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header" style="border-bottom:none;/*background-color: #3c8dbc;*/">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" style="margin-top:-10px;"><li class="fa fa-times"/></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p id="dataMessageModelBody"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Data Message Modal -->
|
||||
|
||||
<!-- Yes No Modal -->
|
||||
<div class="modal fade" id="yesnoModel" tabindex="-1" role="dialog" aria-labelledby="yesnoModelLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><li class="fa fa-times"/></button>
|
||||
<h3 id="yesnoModelLabel" style="font-size: 17px;"></h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p id="yesnoModelBody"></p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button id="yesnoModelNoBtn" class="btn" onclick="modJs.cancelYesno();">No</button>
|
||||
<button id="yesnoModelYesBtn" class="btn btn-primary">Yes</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Yes No Modal -->
|
||||
|
||||
<!-- Upload Modal -->
|
||||
<div class="modal fade" id="uploadModel" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
|
||||
@@ -1,3 +1,119 @@
|
||||
INSERT INTO `Timezones`(`id`, `name`, `details`) VALUES
|
||||
(1, 'Pacific/Midway', '(GMT-11:00) Midway Island'),
|
||||
(2, 'US/Samoa', '(GMT-11:00) Samoa'),
|
||||
(3, 'US/Hawaii', '(GMT-10:00) Hawaii'),
|
||||
(4, 'US/Alaska', '(GMT-09:00) Alaska'),
|
||||
(5, 'US/Pacific', '(GMT-08:00) Pacific Time (US, Canada)'),
|
||||
(6, 'America/Tijuana', '(GMT-08:00) Tijuana'),
|
||||
(7, 'US/Arizona', '(GMT-07:00) Arizona'),
|
||||
(8, 'US/Mountain', '(GMT-07:00) Mountain Time (US, Canada)'),
|
||||
(9, 'America/Chihuahua', '(GMT-07:00) Chihuahua'),
|
||||
(10, 'America/Mazatlan', '(GMT-07:00) Mazatlan'),
|
||||
(11, 'America/Mexico_City', '(GMT-06:00) Mexico City'),
|
||||
(12, 'America/Monterrey', '(GMT-06:00) Monterrey'),
|
||||
(13, 'Canada/Saskatchewan', '(GMT-06:00) Saskatchewan'),
|
||||
(14, 'US/Central', '(GMT-06:00) Central Time (US , Canada)'),
|
||||
(15, 'US/Eastern', '(GMT-05:00) Eastern Time (US , Canada)'),
|
||||
(16, 'US/East-Indiana', '(GMT-05:00) Indiana (East)'),
|
||||
(17, 'America/Bogota', '(GMT-05:00) Bogota'),
|
||||
(18, 'America/Lima', '(GMT-05:00) Lima'),
|
||||
(19, 'America/Caracas', '(GMT-04:30) Caracas'),
|
||||
(20, 'Canada/Atlantic', '(GMT-04:00) Atlantic Time (Canada)'),
|
||||
(21, 'America/La_Paz', '(GMT-04:00) La Paz'),
|
||||
(22, 'America/Santiago', '(GMT-04:00) Santiago'),
|
||||
(23, 'Canada/Newfoundland', '(GMT-03:30) Newfoundland'),
|
||||
(24, 'America/Buenos_Aires', '(GMT-03:00) Buenos Aires'),
|
||||
(25, 'Greenland', '(GMT-03:00) Greenland'),
|
||||
(26, 'Atlantic/Stanley', '(GMT-02:00) Stanley'),
|
||||
(27, 'Atlantic/Azores', '(GMT-01:00) Azores'),
|
||||
(28, 'Atlantic/Cape_Verde', '(GMT-01:00) Cape Verde Is.'),
|
||||
(29, 'Africa/Casablanca', '(GMT) Casablanca'),
|
||||
(30, 'Europe/Dublin', '(GMT) Dublin'),
|
||||
(31, 'Europe/Lisbon', '(GMT) Lisbon'),
|
||||
(32, 'Europe/London', '(GMT) London'),
|
||||
(33, 'Africa/Monrovia', '(GMT) Monrovia'),
|
||||
(34, 'Europe/Amsterdam', '(GMT+01:00) Amsterdam'),
|
||||
(35, 'Europe/Belgrade', '(GMT+01:00) Belgrade'),
|
||||
(36, 'Europe/Berlin', '(GMT+01:00) Berlin'),
|
||||
(37, 'Europe/Bratislava', '(GMT+01:00) Bratislava'),
|
||||
(38, 'Europe/Brussels', '(GMT+01:00) Brussels'),
|
||||
(39, 'Europe/Budapest', '(GMT+01:00) Budapest'),
|
||||
(40, 'Europe/Copenhagen', '(GMT+01:00) Copenhagen'),
|
||||
(41, 'Europe/Ljubljana', '(GMT+01:00) Ljubljana'),
|
||||
(42, 'Europe/Madrid', '(GMT+01:00) Madrid'),
|
||||
(43, 'Europe/Paris', '(GMT+01:00) Paris'),
|
||||
(44, 'Europe/Prague', '(GMT+01:00) Prague'),
|
||||
(45, 'Europe/Rome', '(GMT+01:00) Rome'),
|
||||
(46, 'Europe/Sarajevo', '(GMT+01:00) Sarajevo'),
|
||||
(47, 'Europe/Skopje', '(GMT+01:00) Skopje'),
|
||||
(48, 'Europe/Stockholm', '(GMT+01:00) Stockholm'),
|
||||
(49, 'Europe/Vienna', '(GMT+01:00) Vienna'),
|
||||
(50, 'Europe/Warsaw', '(GMT+01:00) Warsaw'),
|
||||
(51, 'Europe/Zagreb', '(GMT+01:00) Zagreb'),
|
||||
(52, 'Europe/Athens', '(GMT+02:00) Athens'),
|
||||
(53, 'Europe/Bucharest', '(GMT+02:00) Bucharest'),
|
||||
(54, 'Africa/Cairo', '(GMT+02:00) Cairo'),
|
||||
(55, 'Africa/Harare', '(GMT+02:00) Harare'),
|
||||
(56, 'Europe/Helsinki', '(GMT+02:00) Helsinki'),
|
||||
(57, 'Europe/Istanbul', '(GMT+02:00) Istanbul'),
|
||||
(58, 'Asia/Jerusalem', '(GMT+02:00) Jerusalem'),
|
||||
(59, 'Europe/Kiev', '(GMT+02:00) Kyiv'),
|
||||
(60, 'Europe/Minsk', '(GMT+02:00) Minsk'),
|
||||
(61, 'Europe/Riga', '(GMT+02:00) Riga'),
|
||||
(62, 'Europe/Sofia', '(GMT+02:00) Sofia'),
|
||||
(63, 'Europe/Tallinn', '(GMT+02:00) Tallinn'),
|
||||
(64, 'Europe/Vilnius', '(GMT+02:00) Vilnius'),
|
||||
(65, 'Asia/Baghdad', '(GMT+03:00) Baghdad'),
|
||||
(66, 'Asia/Kuwait', '(GMT+03:00) Kuwait'),
|
||||
(67, 'Africa/Nairobi', '(GMT+03:00) Nairobi'),
|
||||
(68, 'Asia/Riyadh', '(GMT+03:00) Riyadh'),
|
||||
(69, 'Europe/Moscow', '(GMT+03:00) Moscow'),
|
||||
(70, 'Asia/Tehran', '(GMT+03:30) Tehran'),
|
||||
(71, 'Asia/Baku', '(GMT+04:00) Baku'),
|
||||
(72, 'Europe/Volgograd', '(GMT+04:00) Volgograd'),
|
||||
(73, 'Asia/Muscat', '(GMT+04:00) Muscat'),
|
||||
(74, 'Asia/Tbilisi', '(GMT+04:00) Tbilisi'),
|
||||
(75, 'Asia/Yerevan', '(GMT+04:00) Yerevan'),
|
||||
(76, 'Asia/Kabul', '(GMT+04:30) Kabul'),
|
||||
(77, 'Asia/Karachi', '(GMT+05:00) Karachi'),
|
||||
(78, 'Asia/Tashkent', '(GMT+05:00) Tashkent'),
|
||||
(79, 'Asia/Kolkata', '(GMT+05:30) Kolkata'),
|
||||
(80, 'Asia/Kathmandu', '(GMT+05:45) Kathmandu'),
|
||||
(81, 'Asia/Yekaterinburg', '(GMT+06:00) Ekaterinburg'),
|
||||
(82, 'Asia/Almaty', '(GMT+06:00) Almaty'),
|
||||
(83, 'Asia/Dhaka', '(GMT+06:00) Dhaka'),
|
||||
(84, 'Asia/Novosibirsk', '(GMT+07:00) Novosibirsk'),
|
||||
(85, 'Asia/Bangkok', '(GMT+07:00) Bangkok'),
|
||||
(86, 'Asia/Jakarta', '(GMT+07:00) Jakarta'),
|
||||
(87, 'Asia/Krasnoyarsk', '(GMT+08:00) Krasnoyarsk'),
|
||||
(88, 'Asia/Chongqing', '(GMT+08:00) Chongqing'),
|
||||
(89, 'Asia/Hong_Kong', '(GMT+08:00) Hong Kong'),
|
||||
(90, 'Asia/Kuala_Lumpur', '(GMT+08:00) Kuala Lumpur'),
|
||||
(91, 'Australia/Perth', '(GMT+08:00) Perth'),
|
||||
(92, 'Asia/Singapore', '(GMT+08:00) Singapore'),
|
||||
(93, 'Asia/Taipei', '(GMT+08:00) Taipei'),
|
||||
(94, 'Asia/Ulaanbaatar', '(GMT+08:00) Ulaan Bataar'),
|
||||
(95, 'Asia/Urumqi', '(GMT+08:00) Urumqi'),
|
||||
(96, 'Asia/Irkutsk', '(GMT+09:00) Irkutsk'),
|
||||
(97, 'Asia/Seoul', '(GMT+09:00) Seoul'),
|
||||
(98, 'Asia/Tokyo', '(GMT+09:00) Tokyo'),
|
||||
(99, 'Australia/Adelaide', '(GMT+09:30) Adelaide'),
|
||||
(100, 'Australia/Darwin', '(GMT+09:30) Darwin'),
|
||||
(101, 'Asia/Yakutsk', '(GMT+10:00) Yakutsk'),
|
||||
(102, 'Australia/Brisbane', '(GMT+10:00) Brisbane'),
|
||||
(103, 'Australia/Canberra', '(GMT+10:00) Canberra'),
|
||||
(104, 'Pacific/Guam', '(GMT+10:00) Guam'),
|
||||
(105, 'Australia/Hobart', '(GMT+10:00) Hobart'),
|
||||
(106, 'Australia/Melbourne', '(GMT+10:00) Melbourne'),
|
||||
(107, 'Pacific/Port_Moresby', '(GMT+10:00) Port Moresby'),
|
||||
(108, 'Australia/Sydney', '(GMT+10:00) Sydney'),
|
||||
(109, 'Asia/Vladivostok', '(GMT+11:00) Vladivostok'),
|
||||
(110, 'Asia/Magadan', '(GMT+12:00) Magadan'),
|
||||
(111, 'Pacific/Auckland', '(GMT+12:00) Auckland'),
|
||||
(112, 'Pacific/Fiji', '(GMT+12:00) Fiji');
|
||||
|
||||
|
||||
|
||||
INSERT INTO `CurrencyTypes`(`id`, `code`, `name`) VALUES
|
||||
(3, 'AED', 'Utd. Arab Emir. Dirham'),
|
||||
(4, 'AFN', 'Afghanistan Afghani'),
|
||||
@@ -665,14 +781,6 @@ INSERT INTO `Nationality` (`id`, `name`) VALUES
|
||||
(192, 'Zambian'),
|
||||
(193, 'Zimbabwean');
|
||||
|
||||
INSERT INTO `WorkDays` (`id`, `name`, `status`, `country`) VALUES
|
||||
(1, 'Monday', 'Full Day',NULL),
|
||||
(2, 'Tuesday', 'Full Day',NULL),
|
||||
(3, 'Wednesday', 'Full Day',NULL),
|
||||
(4, 'Thursday', 'Full Day',NULL),
|
||||
(5, 'Friday', 'Full Day',NULL),
|
||||
(6, 'Saturday', 'Non-working Day',NULL),
|
||||
(7, 'Sunday', 'Non-working Day',NULL);
|
||||
|
||||
|
||||
INSERT INTO `Reports` (`id`, `name`, `details`, `parameters`, `query`, `paramOrder`, `type`) VALUES
|
||||
@@ -681,10 +789,17 @@ INSERT INTO `Reports` (`id`, `name`, `details`, `parameters`, `query`, `paramOrd
|
||||
(4, 'Employee Attendance Report', 'This report list all employee attendance entries by employee and date range', '[\r\n[ "employee", {"label":"Employee","type":"select2multi","allow-null":true,"null-label":"All Employees","remote-source":["Employee","id","first_name+last_name"]}],\r\n[ "date_start", {"label":"Start Date","type":"date"}],\r\n[ "date_end", {"label":"End Date","type":"date"}]\r\n]', 'EmployeeAttendanceReport', '["employee","date_start","date_end"]', 'Class'),
|
||||
(5, 'Employee Time Tracking Report', 'This report list employee working hours and attendance details for each day for a given period ', '[\r\n[ "employee", {"label":"Employee","type":"select2","allow-null":false,"remote-source":["Employee","id","first_name+last_name"]}],\r\n[ "date_start", {"label":"Start Date","type":"date"}],\r\n[ "date_end", {"label":"End Date","type":"date"}]\r\n]', 'EmployeeTimeTrackReport', '["employee","date_start","date_end"]', 'Class');
|
||||
|
||||
REPLACE INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`, `type`) VALUES
|
||||
('Expense Report', 'This report list employees expenses for a specified period',
|
||||
'[\r\n[ "employee", {"label":"Employee","type":"select2multi","allow-null":true,"null-label":"All Employees","remote-source":["Employee","id","first_name+last_name"]}],\r\n[ "date_start", {"label":"Start Date","type":"date"}],\r\n[ "date_end", {"label":"End Date","type":"date"}],\r\n[ "status", {"label":"Status","type":"select","source":[["NULL","All Statuses"],["Approved","Approved"],["Pending","Pending"],["Rejected","Rejected"],["Cancellation Requested","Cancellation Requested"],["Cancelled","Cancelled"]]}]\r\n]',
|
||||
'ExpenseReport',
|
||||
'["employee","date_start","date_end","status"]', 'Class');
|
||||
|
||||
|
||||
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('Company: Logo', '', '','[ "value", {"label":"Logo","type":"fileupload","validation":"none"}]'),
|
||||
('Company: Name', 'Sample Company Pvt Ltd', 'Update your company name - For updating company logo copy a file named logo.png to /app/data/ folder', ''),
|
||||
('Company: Description', 'This is a company using icehrm.com', '',''),
|
||||
('Email: Enable', '1', '0 will disable all outgoing emails from modules. Value 1 will enable outgoing emails','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]'),
|
||||
('Email: Mode', 'SMTP', 'SMTP, PHP Mailer or Amazon SES. SMTP = send emails using local or a remote smtp server. PHP Mailer = send emails using mail function provided by php. Amazon SES = send emails trough amazon Simple Email Service.','["value", {"label":"Value","type":"select","source":[["SMTP","SMTP"],["PHP Mailer","PHP Mailer"],["SES","Amazon SES"]]}]'),
|
||||
('Email: SMTP Host', 'localhost', 'SMTP host IP',''),
|
||||
@@ -704,6 +819,17 @@ INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('Api: REST Api Enabled', '0', '','["value", {"label":"Value","type":"select","source":[["0","No"],["1","Yes"]]}]');
|
||||
|
||||
|
||||
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('Travel: Pre-Approve Travel Request', '0', '','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]');
|
||||
|
||||
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('Attendance: Use Department Time Zone', '0', '','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]');
|
||||
|
||||
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('Analytics: Google Key', 'UA-48048570-2', 'Google Analytics Key','');
|
||||
|
||||
|
||||
|
||||
INSERT INTO `Certifications` (`id`, `name`, `description`) VALUES
|
||||
(1, 'Red Hat Certified Architect (RHCA)', 'Red Hat Certified Architect (RHCA)'),
|
||||
(2, 'GIAC Secure Software Programmer -Java', 'GIAC Secure Software Programmer -Java'),
|
||||
@@ -746,11 +872,6 @@ INSERT INTO `CompanyStructures` (`id`, `title`, `description`, `address`, `type`
|
||||
(3, 'Marketing Department', 'Marketing Department', 'PO Box 001002\nSample Road, Sample Town', 'Department', 'US', 2);
|
||||
|
||||
|
||||
INSERT INTO `Documents` (`id`, `name`, `details`) VALUES
|
||||
(1, 'ID Copy', 'Your ID copy'),
|
||||
(2, 'Degree Ceritficate', 'Degree Ceritficate'),
|
||||
(3, 'Driving License', 'Driving License');
|
||||
|
||||
|
||||
INSERT INTO `Educations` (`id`, `name`, `description`) VALUES
|
||||
(1, 'Bachelors Degree', 'Bachelors Degree'),
|
||||
@@ -758,9 +879,6 @@ INSERT INTO `Educations` (`id`, `name`, `description`) VALUES
|
||||
(3, 'Masters Degree', 'Masters Degree'),
|
||||
(4, 'Doctorate', 'Doctorate');
|
||||
|
||||
INSERT INTO `HoliDays` (`id`, `name`, `dateh`, `status`) VALUES
|
||||
(1, 'New Year''s Day', '2015-01-01', 'Full Day'),
|
||||
(2, 'Christmas Day', '2015-12-25', 'Full Day');
|
||||
|
||||
|
||||
INSERT INTO `JobTitles` (`id`, `code`, `name`, `description`, `specification`) VALUES
|
||||
@@ -887,6 +1005,33 @@ INSERT INTO `SalaryComponentType` (`id`,`code`, `name`) VALUES
|
||||
(2,'B002', 'Allowance');
|
||||
|
||||
|
||||
INSERT INTO `SalaryComponent` VALUES
|
||||
(1,'Basic Salary', 1,''),(2,'Fixed Allowance', 1,''),(3,'Car Allowance', 2,''),(4,'Telephone Allowance', 2,'');
|
||||
INSERT INTO `SalaryComponent` (`id`,`name`, `componentType`) VALUES
|
||||
(1,'Basic Salary', 1),
|
||||
(2,'Fixed Allowance', 1),
|
||||
(3,'Car Allowance', 2),
|
||||
(4,'Telephone Allowance', 2);
|
||||
INSERT INTO `ExpensesPaymentMethods` (`name`) VALUES
|
||||
('Cash'),
|
||||
('Check'),
|
||||
('Credit Card'),
|
||||
('Debit Card');
|
||||
|
||||
|
||||
INSERT INTO `ExpensesCategories` (`name`) VALUES
|
||||
('Auto - Gas'),
|
||||
('Auto - Insurance'),
|
||||
('Auto - Maintenance'),
|
||||
('Auto - Payment'),
|
||||
('Transportation'),
|
||||
('Bank Fees'),
|
||||
('Dining Out'),
|
||||
('Entertainment'),
|
||||
('Hotel / Motel'),
|
||||
('Insurance'),
|
||||
('Interest Charges'),
|
||||
('Loan Payment'),
|
||||
('Medical'),
|
||||
('Mileage'),
|
||||
('Rent'),
|
||||
('Rental Car'),
|
||||
('Utility');
|
||||
|
||||
@@ -36,8 +36,7 @@ INSERT INTO `EmployeeDependents` (`id`, `employee`, `name`, `relationship`, `dob
|
||||
(2, 1, 'Mica Singroo', 'Other', '2000-06-13', '');
|
||||
|
||||
|
||||
INSERT INTO `EmployeeDocuments` (`id`, `employee`, `document`, `date_added`, `valid_until`, `status`, `details`) VALUES
|
||||
(1, 2, 2, '2013-01-08', '0000-00-00', 'Active', 'zxczx');
|
||||
|
||||
|
||||
|
||||
INSERT INTO `EmployeeEducations` (`id`, `education_id`, `employee`, `institute`, `date_start`, `date_end`) VALUES
|
||||
@@ -59,9 +58,9 @@ INSERT INTO `EmployeeProjects` (`id`, `employee`, `project`, `date_start`, `date
|
||||
|
||||
|
||||
INSERT INTO `EmployeeSalary` (`id`, `employee`, `component`, `pay_frequency`, `currency`, `amount`, `details`) VALUES
|
||||
(1, 1, 'Basic', 'Monthly', 131, '2700.00', ''),
|
||||
(2, 2, 'Basic Salary', 'Monthly', 151, '12000.00', ''),
|
||||
(3, 2, 'Travelling Allowance', 'Monthly', 131, '5000.00', '');
|
||||
(1, 1, 1, 'Monthly', 131, '2700.00', ''),
|
||||
(2, 2, 2, 'Monthly', 151, '12000.00', ''),
|
||||
(3, 2, 3, 'Monthly', 131, '5000.00', '');
|
||||
|
||||
|
||||
INSERT INTO `EmployeeSkills` (`id`, `skill_id`, `employee`, `details`) VALUES
|
||||
|
||||
@@ -1,248 +0,0 @@
|
||||
/* Upgrade v10.2 to v11.0 */
|
||||
|
||||
ALTER TABLE `LeaveTypes` ADD COLUMN `leave_color` varchar(10) NULL;
|
||||
|
||||
create table `RestAccessTokens` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`userId` bigint(20) NOT NULL,
|
||||
`hash` varchar(32) default null,
|
||||
`token` varchar(500) default null,
|
||||
`created` DATETIME default '0000-00-00 00:00:00',
|
||||
`updated` DATETIME default '0000-00-00 00:00:00',
|
||||
primary key (`id`),
|
||||
unique key `userId` (`userId`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('Api: REST Api Enabled', '0', '','["value", {"label":"Value","type":"select","source":[["0","No"],["1","Yes"]]}]');
|
||||
|
||||
ALTER TABLE Employees ADD COLUMN `status` enum('Active','Terminated') default 'Active';
|
||||
|
||||
ALTER TABLE EmployeeLeaves MODIFY COLUMN `status` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending';
|
||||
|
||||
ALTER TABLE EmployeeLeaveLog MODIFY COLUMN `status_from` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending';
|
||||
ALTER TABLE EmployeeLeaveLog MODIFY COLUMN `status_to` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending';
|
||||
|
||||
create table `ArchivedEmployees` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`ref_id` bigint(20) NOT NULL,
|
||||
`employee_id` varchar(50) default null,
|
||||
`first_name` varchar(100) default '' not null,
|
||||
`last_name` varchar(100) default '' not null,
|
||||
`gender` enum('Male','Female') default NULL,
|
||||
`ssn_num` varchar(100) default '',
|
||||
`nic_num` varchar(100) default '',
|
||||
`other_id` varchar(100) default '',
|
||||
`work_email` varchar(100) default null,
|
||||
`joined_date` DATETIME default '0000-00-00 00:00:00',
|
||||
`confirmation_date` DATETIME default '0000-00-00 00:00:00',
|
||||
`supervisor` bigint(20) default null,
|
||||
`department` bigint(20) default null,
|
||||
`termination_date` DATETIME default '0000-00-00 00:00:00',
|
||||
`notes` text default null,
|
||||
`data` longtext default null,
|
||||
primary key (`id`)
|
||||
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
/* Upgrade v11.0 to v11.1 */
|
||||
|
||||
create table `FieldNameMappings` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`type` varchar(20) NOT NULL,
|
||||
`name` varchar(20) NOT NULL,
|
||||
`textOrig` varchar(200) default null,
|
||||
`textMapped` varchar(200) default null,
|
||||
`display` enum('Form','Table and Form','Hidden') default 'Form',
|
||||
`created` DATETIME default '0000-00-00 00:00:00',
|
||||
`updated` DATETIME default '0000-00-00 00:00:00',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
INSERT INTO `FieldNameMappings` (`type`, `name`, `textOrig`, `textMapped`, `display`) VALUES
|
||||
('Employee', 'employee_id', 'Employee Number', 'Employee Number', 'Table and Form'),
|
||||
('Employee', 'first_name', 'First Name', 'First Name', 'Table and Form'),
|
||||
('Employee', 'middle_name', 'Middle Name', 'Middle Name', 'Form'),
|
||||
('Employee', 'last_name', 'Last Name', 'Last Name', 'Table and Form'),
|
||||
('Employee', 'nationality', 'Nationality', 'Nationality', 'Form'),
|
||||
('Employee', 'ethnicity', 'Ethnicity', 'Ethnicity', 'Form'),
|
||||
('Employee', 'immigration_status', 'Immigration Status', 'Immigration Status', 'Form'),
|
||||
('Employee', 'birthday', 'Date of Birth', 'Date of Birth', 'Form'),
|
||||
('Employee', 'gender', 'Gender', 'Gender', 'Form'),
|
||||
('Employee', 'marital_status', 'Marital Status', 'Marital Status', 'Form'),
|
||||
('Employee', 'ssn_num', 'SSN/NRIC', 'SSN/NRIC', 'Form'),
|
||||
('Employee', 'nic_num', 'NIC', 'NIC', 'Form'),
|
||||
('Employee', 'other_id', 'Other ID', 'Other ID', 'Form'),
|
||||
('Employee', 'driving_license', 'Driving License No', 'Driving License No', 'Form'),
|
||||
('Employee', 'employment_status', 'Employment Status', 'Employment Status', 'Form'),
|
||||
('Employee', 'job_title', 'Job Title', 'Job Title', 'Form'),
|
||||
('Employee', 'pay_grade', 'Pay Grade', 'Pay Grade', 'Form'),
|
||||
('Employee', 'work_station_id', 'Work Station Id', 'Work Station Id', 'Form'),
|
||||
('Employee', 'address1', 'Address Line 1', 'Address Line 1', 'Form'),
|
||||
('Employee', 'address2', 'Address Line 2', 'Address Line 2', 'Form'),
|
||||
('Employee', 'city', 'City', 'City', 'Form'),
|
||||
('Employee', 'country', 'Country', 'Country', 'Form'),
|
||||
('Employee', 'province', 'Province', 'Province', 'Form'),
|
||||
('Employee', 'postal_code', 'Postal/Zip Code', 'Postal/Zip Code', 'Form'),
|
||||
('Employee', 'home_phone', 'Home Phone', 'Home Phone', 'Form'),
|
||||
('Employee', 'mobile_phone', 'Mobile Phone', 'Mobile Phone', 'Table and Form'),
|
||||
('Employee', 'work_phone', 'Work Phone', 'Work Phone', 'Form'),
|
||||
('Employee', 'work_email', 'Work Email', 'Work Email', 'Form'),
|
||||
('Employee', 'private_email', 'Private Email', 'Private Email', 'Form'),
|
||||
('Employee', 'joined_date', 'Joined Date', 'Joined Date', 'Form'),
|
||||
('Employee', 'confirmation_date', 'Confirmation Date', 'Confirmation Date', 'Form'),
|
||||
('Employee', 'termination_date', 'Termination Date', 'Termination Date', 'Form'),
|
||||
('Employee', 'supervisor', 'Supervisor', 'Supervisor', 'Table and Form'),
|
||||
('Employee', 'department', 'Department', 'Department', 'Table and Form'),
|
||||
('Employee', 'notes', 'Notes', 'Notes', 'Form');
|
||||
|
||||
|
||||
create table `CustomFields` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`type` varchar(20) NOT NULL,
|
||||
`name` varchar(20) NOT NULL,
|
||||
`data` text default null,
|
||||
`display` enum('Form','Table and Form','Hidden') default 'Form',
|
||||
`created` DATETIME default '0000-00-00 00:00:00',
|
||||
`updated` DATETIME default '0000-00-00 00:00:00',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
INSERT INTO `CustomFields` (`type`, `name`, `data`,`display`) VALUES
|
||||
('Employee', 'custom1', '', 'Hidden'),
|
||||
('Employee', 'custom2', '', 'Hidden'),
|
||||
('Employee', 'custom3', '', 'Hidden'),
|
||||
('Employee', 'custom4', '', 'Hidden'),
|
||||
('Employee', 'custom5', '', 'Hidden'),
|
||||
('Employee', 'custom6', '', 'Hidden'),
|
||||
('Employee', 'custom7', '', 'Hidden'),
|
||||
('Employee', 'custom8', '', 'Hidden'),
|
||||
('Employee', 'custom9', '', 'Hidden'),
|
||||
('Employee', 'custom10', '', 'Hidden');
|
||||
|
||||
|
||||
Alter table `Employees` MODIFY COLUMN `middle_name` varchar(100) default null;
|
||||
Alter table `Employees` MODIFY COLUMN `last_name` varchar(100) default null;
|
||||
Alter table `Employees` MODIFY COLUMN `ssn_num` varchar(100) default NULL;
|
||||
Alter table `Employees` MODIFY COLUMN `nic_num` varchar(100) default NULL;
|
||||
Alter table `Employees` MODIFY COLUMN `other_id` varchar(100) default NULL;
|
||||
Alter table `Employees` MODIFY COLUMN `driving_license` varchar(100) default NULL;
|
||||
Alter table `Employees` MODIFY COLUMN `work_station_id` varchar(100) default NULL;
|
||||
Alter table `Employees` MODIFY COLUMN `address1` varchar(100) default NULL;
|
||||
Alter table `Employees` MODIFY COLUMN `address2` varchar(100) default NULL;
|
||||
Alter table `Employees` MODIFY COLUMN `city` varchar(150) default NULL;
|
||||
|
||||
|
||||
Alter table `Employees` ADD COLUMN `ethnicity` bigint(20) default null;
|
||||
Alter table `Employees` ADD COLUMN `immigration_status` bigint(20) default null;
|
||||
|
||||
|
||||
Alter table `EmployeeSalary` MODIFY COLUMN `component` bigint(20) NOT NULL;
|
||||
Alter table `EmployeeSalary` MODIFY COLUMN `currency` bigint(20) NULL;
|
||||
|
||||
INSERT INTO `SalaryComponentType` (`id`,`code`, `name`) VALUES
|
||||
(1,'B001', 'Basic'),
|
||||
(2,'B002', 'Allowance');
|
||||
|
||||
|
||||
INSERT INTO `SalaryComponent` VALUES
|
||||
(1,'Basic Salary', 1,''),(2,'Fixed Allowance', 1,''),(3,'Car Allowance', 2,''),(4,'Telephone Allowance', 2,'');
|
||||
|
||||
|
||||
|
||||
/* Upgrade v11.1 to v12.0 */
|
||||
|
||||
ALTER TABLE Users ADD COLUMN user_roles text null;
|
||||
ALTER TABLE Users ADD COLUMN `default_module` bigint(20) null after `employee`;
|
||||
ALTER TABLE Modules ADD COLUMN user_roles text null AFTER `user_levels`;
|
||||
ALTER TABLE Modules ADD COLUMN label varchar(100) NOT NULL AFTER `name`;
|
||||
|
||||
create table `UserRoles` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) default null,
|
||||
primary key (`id`),
|
||||
unique key `name` (`name`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
ALTER TABLE `Users` CHANGE `user_level` `user_level` enum('Admin','Employee','Manager','Other') default NULL;
|
||||
|
||||
create table `EmployeeEducationsTemp` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`education_id` bigint(20) NULL,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`institute` varchar(400) default null,
|
||||
`date_start` date default '0000-00-00',
|
||||
`date_end` date default '0000-00-00',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
insert into EmployeeEducationsTemp select * from EmployeeEducations;
|
||||
|
||||
drop table EmployeeEducations;
|
||||
|
||||
create table `EmployeeEducations` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`education_id` bigint(20) NULL,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`institute` varchar(400) default null,
|
||||
`date_start` date default '0000-00-00',
|
||||
`date_end` date default '0000-00-00',
|
||||
CONSTRAINT `Fk_EmployeeEducations_Educations` FOREIGN KEY (`education_id`) REFERENCES `Educations` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeEducations_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
insert into EmployeeEducations select * from EmployeeEducationsTemp;
|
||||
|
||||
drop table EmployeeEducationsTemp;
|
||||
|
||||
UPDATE `Settings` set value = '1' where name = 'System: Reset Modules and Permissions';
|
||||
UPDATE `Settings` set value = '1' where name = 'System: Add New Permissions';
|
||||
|
||||
create table `SalaryComponentType` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`code` varchar(10) NOT NULL,
|
||||
`name` varchar(100) NOT NULL,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `SalaryComponent` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`componentType` bigint(20) NULL,
|
||||
`details` text default null,
|
||||
CONSTRAINT `Fk_SalaryComponent_SalaryComponentType` FOREIGN KEY (`componentType`) REFERENCES `SalaryComponentType` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `ImmigrationStatus` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `Ethnicity` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `EmployeeImmigrationStatus` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`status` bigint(20) NOT NULL,
|
||||
CONSTRAINT `Fk_EmployeeImmigrationStatus_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeImmigrationStatus_Type` FOREIGN KEY (`status`) REFERENCES `ImmigrationStatus` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `EmployeeEthnicity` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`ethnicity` bigint(20) NOT NULL,
|
||||
CONSTRAINT `Fk_EmployeeEthnicity_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeEthnicity_Ethnicity` FOREIGN KEY (`ethnicity`) REFERENCES `Ethnicity` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
@@ -6,6 +6,7 @@ create table `CompanyStructures` (
|
||||
`type` enum('Company','Head Office','Regional Office','Department','Unit','Sub Unit','Other') default NULL,
|
||||
`country` varchar(2) not null default '0',
|
||||
`parent` bigint(20) NULL,
|
||||
`timezone` varchar(100) not null default 'Europe/London',
|
||||
CONSTRAINT `Fk_CompanyStructures_Own` FOREIGN KEY (`parent`) REFERENCES `CompanyStructures` (`id`),
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
@@ -364,26 +365,7 @@ create table `EmployeeTimeEntry` (
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `Documents` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`details` text default null,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `EmployeeDocuments` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`document` bigint(20) NULL,
|
||||
`date_added` date NOT NULL,
|
||||
`valid_until` date NOT NULL,
|
||||
`status` enum('Active','Inactive','Draft') default 'Active',
|
||||
`details` text default null,
|
||||
`attachment` varchar(100) NULL,
|
||||
CONSTRAINT `Fk_EmployeeDocuments_Documents` FOREIGN KEY (`document`) REFERENCES `Documents` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeDocuments_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `CompanyLoans` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
@@ -513,54 +495,6 @@ create table `Notifications` (
|
||||
KEY `toUser_status_time` (`toUser`,`status`,`time`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `Courses` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`code` varchar(300) NOT NULL,
|
||||
`name` varchar(300) NOT NULL,
|
||||
`description` text default null,
|
||||
`coordinator` bigint(20) NULL,
|
||||
`trainer` varchar(300) NULL,
|
||||
`trainer_info` text default null,
|
||||
`paymentType` enum('Company Sponsored','Paid by Employee') default 'Company Sponsored',
|
||||
`currency` varchar(3) not null,
|
||||
`cost` decimal(12,2) DEFAULT 0.00,
|
||||
`status` enum('Active','Inactive') default 'Active',
|
||||
`created` datetime default '0000-00-00 00:00:00',
|
||||
`updated` datetime default '0000-00-00 00:00:00',
|
||||
CONSTRAINT `Fk_Courses_Employees` FOREIGN KEY (`coordinator`) REFERENCES `Employees` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `TrainingSessions` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(300) NOT NULL,
|
||||
`course` bigint(20) NOT NULL,
|
||||
`description` text default null,
|
||||
`scheduled` datetime default '0000-00-00 00:00:00',
|
||||
`dueDate` datetime default '0000-00-00 00:00:00',
|
||||
`deliveryMethod` enum('Classroom','Self Study','Online') default 'Classroom',
|
||||
`deliveryLocation` varchar(500) NULL,
|
||||
`status` enum('Pending','Approved','Completed','Cancelled') default 'Pending',
|
||||
`attendanceType` enum('Sign Up','Assign') default 'Sign Up',
|
||||
`attachment` varchar(300) NULL,
|
||||
`created` datetime default '0000-00-00 00:00:00',
|
||||
`updated` datetime default '0000-00-00 00:00:00',
|
||||
CONSTRAINT `Fk_TrainingSessions_Courses` FOREIGN KEY (`course`) REFERENCES `Courses` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `EmployeeTrainingSessions` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`trainingSession` bigint(20) NULL,
|
||||
`feedBack` varchar(1500) NULL,
|
||||
`status` enum('Scheduled','Attended','Not-Attended') default 'Scheduled',
|
||||
CONSTRAINT `Fk_EmployeeTrainingSessions_TrainingSessions` FOREIGN KEY (`trainingSession`) REFERENCES `TrainingSessions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeTrainingSessions_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `ImmigrationDocuments` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
@@ -604,11 +538,14 @@ create table `EmployeeTravelRecords` (
|
||||
`travel_date` datetime NULL default '0000-00-00 00:00:00',
|
||||
`return_date` datetime NULL default '0000-00-00 00:00:00',
|
||||
`details` varchar(500) default null,
|
||||
`funding` decimal(10,3) NULL,
|
||||
`currency` bigint(20) NULL,
|
||||
`attachment1` varchar(100) NULL,
|
||||
`attachment2` varchar(100) NULL,
|
||||
`attachment3` varchar(100) NULL,
|
||||
`created` timestamp NULL default '0000-00-00 00:00:00',
|
||||
`updated` timestamp NULL default '0000-00-00 00:00:00',
|
||||
`status` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending',
|
||||
CONSTRAINT `Fk_EmployeeTravelRecords_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
@@ -773,3 +710,69 @@ create table `DeductionRules` (
|
||||
|
||||
|
||||
|
||||
create table `Emails` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`subject` varchar(300) NOT NULL,
|
||||
`toEmail` varchar(300) NOT NULL,
|
||||
`template` text NULL,
|
||||
`params` text NULL,
|
||||
`cclist` varchar(500) NULL,
|
||||
`bcclist` varchar(500) NULL,
|
||||
`error` varchar(500) NULL,
|
||||
`created` DATETIME default '0000-00-00 00:00:00',
|
||||
`updated` DATETIME default '0000-00-00 00:00:00',
|
||||
`status` enum('Pending','Sent','Error') default 'Pending',
|
||||
primary key (`id`),
|
||||
key `KEY_Emails_status` (`status`),
|
||||
key `KEY_Emails_created` (`created`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `ExpensesCategories` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(500) NOT NULL,
|
||||
`created` timestamp NULL default '0000-00-00 00:00:00',
|
||||
`updated` timestamp NULL default '0000-00-00 00:00:00',
|
||||
`pre_approve` enum('Yes','No') default 'Yes',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `ExpensesPaymentMethods` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(500) NOT NULL,
|
||||
`created` timestamp NULL default '0000-00-00 00:00:00',
|
||||
`updated` timestamp NULL default '0000-00-00 00:00:00',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `EmployeeExpenses` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`expense_date` date NULL default '0000-00-00',
|
||||
`payment_method` bigint(20) NOT NULL,
|
||||
`transaction_no` varchar(300) NOT NULL,
|
||||
`payee` varchar(500) NOT NULL,
|
||||
`category` bigint(20) NOT NULL,
|
||||
`notes` text,
|
||||
`amount` decimal(10,3) NULL,
|
||||
`currency` bigint(20) NULL,
|
||||
`attachment1` varchar(100) NULL,
|
||||
`attachment2` varchar(100) NULL,
|
||||
`attachment3` varchar(100) NULL,
|
||||
`created` timestamp NULL default '0000-00-00 00:00:00',
|
||||
`updated` timestamp NULL default '0000-00-00 00:00:00',
|
||||
`status` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending',
|
||||
CONSTRAINT `Fk_EmployeeExpenses_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeExpenses_pm` FOREIGN KEY (`payment_method`) REFERENCES `ExpensesPaymentMethods` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeExpenses_category` FOREIGN KEY (`category`) REFERENCES `ExpensesCategories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `Timezones` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) not null default '',
|
||||
`details` varchar(255) not null default '',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
@@ -158,6 +158,13 @@ AttendanceAdapter.method('saveFailCallback', function(callBackData) {
|
||||
this.showMessage("Error saving attendance entry", callBackData);
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('isSubProfileTable', function() {
|
||||
if(this.user.user_level == "Admin"){
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
@@ -216,3 +223,12 @@ AttendanceStatusAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
}
|
||||
return html;
|
||||
});
|
||||
|
||||
|
||||
AttendanceStatusAdapter.method('isSubProfileTable', function() {
|
||||
if(this.user.user_level == "Admin"){
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
});
|
||||
@@ -3,7 +3,7 @@
|
||||
"menu":"Employees",
|
||||
"order":"8",
|
||||
"icon":"fa-clock-o",
|
||||
"user_levels":["Admin"],
|
||||
"user_levels":["Admin","Manager"],
|
||||
|
||||
"permissions":
|
||||
{}
|
||||
|
||||
@@ -50,3 +50,23 @@ if (!class_exists('CompanyStructure')) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!class_exists('Timezone')) {
|
||||
class Timezone extends ICEHRM_Record {
|
||||
var $_table = 'Timezones';
|
||||
|
||||
public function getAdminAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getManagerAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getUserAccess(){
|
||||
return array("get","element");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@ CompanyStructureAdapter.method('getDataMapping', function() {
|
||||
"address",
|
||||
"type",
|
||||
"country",
|
||||
"timezone",
|
||||
"parent"
|
||||
];
|
||||
});
|
||||
@@ -28,6 +29,7 @@ CompanyStructureAdapter.method('getHeaders', function() {
|
||||
{ "sTitle": "Address","bSortable":false},
|
||||
{ "sTitle": "Type"},
|
||||
{ "sTitle": "Country", "sClass": "center" },
|
||||
{ "sTitle": "Time Zone"},
|
||||
{ "sTitle": "Parent Structure"}
|
||||
];
|
||||
});
|
||||
@@ -40,6 +42,7 @@ CompanyStructureAdapter.method('getFormFields', function() {
|
||||
[ "address", {"label":"Address","type":"textarea","validation":"none"}],
|
||||
[ "type", {"label":"Type","type":"select","source":[["Company","Company"],["Head Office","Head Office"],["Regional Office","Regional Office"],["Department","Department"],["Unit","Unit"],["Sub Unit","Sub Unit"],["Other","Other"]]}],
|
||||
[ "country", {"label":"Country","type":"select","remote-source":["Country","code","name"]}],
|
||||
[ "timezone", {"label":"Time Zone","type":"select","allow-null":false,"remote-source":["Timezone","name","details"]}],
|
||||
[ "parent", {"label":"Parent Structure","type":"select","allow-null":true,"remote-source":["CompanyStructure","id","title"]}]
|
||||
];
|
||||
});
|
||||
@@ -298,7 +301,7 @@ CompanyGraphAdapter.method('fixCyclicParent', function(sourceData) {
|
||||
});
|
||||
|
||||
CompanyGraphAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/?page_id=61';
|
||||
return 'http://blog.icehrm.com/docs/companystructure/';
|
||||
});
|
||||
|
||||
|
||||
|
||||
@@ -41,8 +41,7 @@ class DashboardActionManager extends SubActionManager{
|
||||
$attendance = new Attendance();
|
||||
$data['numberOfAttendanceLastWeek'] = $attendance->Count("in_time > '".date("Y-m-d H:i:s",strtotime("-1 week"))."'");
|
||||
|
||||
$empLeave = new EmployeeLeave();
|
||||
$data['numberOfLeaves'] = $empLeave->Count("date_start > '".date("Y-m-d")."'");
|
||||
$data['numberOfLeaves'] = 0;
|
||||
|
||||
$timeEntry = new EmployeeTimeEntry();
|
||||
$data['numberOfAttendanceLastWeek'] = $attendance->Count("in_time > '".date("Y-m-d H:i:s",strtotime("-1 week"))."'");
|
||||
|
||||
@@ -26,24 +26,9 @@ define('MODULE_PATH',dirname(__FILE__));
|
||||
include APP_BASE_PATH.'header.php';
|
||||
include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
?><div class="span9">
|
||||
<div id="iceannon">
|
||||
<div class="callout callout-warning lead" style="font-size: 14px;">
|
||||
<h4>Why not upgrade to IceHrm Pro Version</h4>
|
||||
<p>
|
||||
IceHrm Pro is the feature rich upgrade to IceHrm open source version. It comes with improved modules for
|
||||
employee management, leave management, LDAP support and number of other features over open source version.
|
||||
Hit this <a href="http://icehrm.com/#compare" class="btn btn-primary btn-xs target="_blank">link</a> to do a full one to one comparison.
|
||||
|
||||
Also you can learn more about IceHrm Pro <a href="http://blog.icehrm.com/icehrm-pro/" class="btn btn-primary btn-xs" target="_blank">here</a>
|
||||
<br/>
|
||||
<br/>
|
||||
<a href="http://icehrm.com/modules.php" class="btn btn-success btm-xs" target="_blank"><i class="fa fa-checkout"></i> Buy IceHrm Pro</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-aqua">
|
||||
<div class="inner">
|
||||
@@ -62,7 +47,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-green">
|
||||
<div class="inner">
|
||||
@@ -79,7 +64,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-yellow">
|
||||
<div class="inner">
|
||||
@@ -96,7 +81,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
@@ -113,10 +98,8 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-yellow">
|
||||
<div class="inner">
|
||||
@@ -135,22 +118,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
<h3 id="numberOfLeaves">..</h3>
|
||||
<p >Upcoming Leaves</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-calendar"></i>
|
||||
</div>
|
||||
<a href="#" class="small-box-footer" id="leaveLink">
|
||||
Leave Management <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-teal">
|
||||
<div class="inner">
|
||||
@@ -167,7 +135,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-green">
|
||||
<div class="inner">
|
||||
@@ -184,6 +152,60 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
Travel
|
||||
</h3>
|
||||
<p id="numberOfTravel">
|
||||
Requests
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-plane"></i>
|
||||
</div>
|
||||
<a href="#" class="small-box-footer" id="travelLink">
|
||||
Manage Travel <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-yellow">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
Help
|
||||
</h3>
|
||||
<p>
|
||||
User Guide
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-help"></i>
|
||||
</div>
|
||||
<a href="http://blog.icehrm.com/docs/home/" target="_blank" class="small-box-footer" id="icehrmHelpLink">
|
||||
Documentation <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="iceannon">
|
||||
<div class="callout callout-danger lead" style="font-size: 14px;font-weight: bold;">
|
||||
<h4>Why not upgrade to IceHrm Pro Version</h4>
|
||||
<p>
|
||||
IceHrm Pro is the feature rich upgrade to IceHrm open source version. It comes with improved modules for
|
||||
employee management, leave management, LDAP support and number of other features over open source version.
|
||||
Hit this <a href="http://icehrm.com/#compare" class="btn btn-primary btn-xs target="_blank">link</a> to do a full one to one comparison.
|
||||
|
||||
Also you can learn more about IceHrm Pro <a href="http://blog.icehrm.com/docs/icehrm-pro/" class="btn btn-primary btn-xs" target="_blank">here</a>
|
||||
<br/>
|
||||
<br/>
|
||||
<a href="http://icehrm.com/modules.php" class="btn btn-success btm-xs" target="_blank"><i class="fa fa-checkout"></i> Buy IceHrm Pro</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -204,6 +226,8 @@ $("#attendanceLink").attr("href",modJs.getCustomUrl('?g=admin&n=attendance&m=adm
|
||||
$("#leaveLink").attr("href",modJs.getCustomUrl('?g=admin&n=leaves&m=admin_Admin'));
|
||||
$("#reportsLink").attr("href",modJs.getCustomUrl('?g=admin&n=reports&m=admin_Reports'));
|
||||
$("#settingsLink").attr("href",modJs.getCustomUrl('?g=admin&n=settings&m=admin_System'));
|
||||
$("#travelLink").attr("href",modJs.getCustomUrl('?g=admin&n=travel&m=admin_Employees'));
|
||||
|
||||
|
||||
modJs.getInitData();
|
||||
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
<?php
|
||||
if (!class_exists('DocumentsAdminManager')) {
|
||||
class DocumentsAdminManager extends AbstractModuleManager{
|
||||
|
||||
public function initializeUserClasses(){
|
||||
|
||||
}
|
||||
|
||||
public function initializeFieldMappings(){
|
||||
$this->addFileFieldMapping('EmployeeDocument', 'attachment', 'name');
|
||||
}
|
||||
|
||||
public function initializeDatabaseErrorMappings(){
|
||||
$this->addDatabaseErrorMapping('CONSTRAINT `Fk_EmployeeDocuments_Documents` FOREIGN KEY','Can not delete Document Type, users have already uploaded these types of documents');
|
||||
}
|
||||
|
||||
public function setupModuleClassDefinitions(){
|
||||
|
||||
$this->addModelClass('Document');
|
||||
$this->addModelClass('EmployeeDocument');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!class_exists('Document')) {
|
||||
class Document extends ICEHRM_Record {
|
||||
var $_table = 'Documents';
|
||||
|
||||
public function getAdminAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
|
||||
public function getUserAccess(){
|
||||
return array();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!class_exists('EmployeeDocument')) {
|
||||
class EmployeeDocument extends ICEHRM_Record {
|
||||
var $_table = 'EmployeeDocuments';
|
||||
|
||||
public function getAdminAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getManagerAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getUserAccess(){
|
||||
return array("get");
|
||||
}
|
||||
|
||||
public function getUserOnlyMeAccess(){
|
||||
return array("element","save","delete");
|
||||
}
|
||||
|
||||
public function Insert(){
|
||||
if(empty($this->date_added)){
|
||||
$this->date_added = date("Y-m-d H:i:s");
|
||||
}
|
||||
return parent::Insert();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
This file is part of iCE Hrm.
|
||||
|
||||
iCE Hrm is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
iCE Hrm is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
$moduleName = 'documents';
|
||||
define('MODULE_PATH',dirname(__FILE__));
|
||||
include APP_BASE_PATH.'header.php';
|
||||
include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
?><div class="span9">
|
||||
|
||||
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
|
||||
<li class="active"><a id="tabDocument" href="#tabPageDocument">Document Types</a></li>
|
||||
<li class=""><a id="tabEmployeeDocument" href="#tabPageEmployeeDocument">Employee Documents</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane active" id="tabPageDocument">
|
||||
<div id="Document" class="reviewBlock" data-content="List" style="padding-left:5px;">
|
||||
|
||||
</div>
|
||||
<div id="DocumentForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane" id="tabPageEmployeeDocument">
|
||||
<div id="EmployeeDocument" class="reviewBlock" data-content="List" style="padding-left:5px;">
|
||||
|
||||
</div>
|
||||
<div id="EmployeeDocumentForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<script>
|
||||
var modJsList = new Array();
|
||||
|
||||
modJsList['tabDocument'] = new DocumentAdapter('Document','Document');
|
||||
modJsList['tabEmployeeDocument'] = new EmployeeDocumentAdapter('EmployeeDocument','EmployeeDocument');
|
||||
|
||||
var modJs = modJsList['tabDocument'];
|
||||
|
||||
</script>
|
||||
<?php include APP_BASE_PATH.'footer.php';?>
|
||||
@@ -1,107 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* DocumentAdapter
|
||||
*/
|
||||
|
||||
function DocumentAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
DocumentAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
DocumentAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"details"
|
||||
];
|
||||
});
|
||||
|
||||
DocumentAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Details"}
|
||||
];
|
||||
});
|
||||
|
||||
DocumentAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}],
|
||||
[ "details", {"label":"Details","type":"textarea","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
DocumentAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/?page_id=88';
|
||||
});
|
||||
|
||||
|
||||
function EmployeeDocumentAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
EmployeeDocumentAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
EmployeeDocumentAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"document",
|
||||
"details",
|
||||
"date_added",
|
||||
"status",
|
||||
"attachment"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeDocumentAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Document" },
|
||||
{ "sTitle": "Details" },
|
||||
{ "sTitle": "Date Added"},
|
||||
{ "sTitle": "Status"},
|
||||
{ "sTitle": "Attachment","bVisible":false}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeDocumentAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}],
|
||||
[ "document", {"label":"Document","type":"select2","remote-source":["Document","id","name"]}],
|
||||
[ "date_added", {"label":"Date Added","type":"date","validation":""}],
|
||||
[ "valid_until", {"label":"Valid Until","type":"date","validation":"none"}],
|
||||
[ "status", {"label":"Status","type":"select","source":[["Active","Active"],["Inactive","Inactive"],["Draft","Draft"]]}],
|
||||
[ "details", {"label":"Details","type":"textarea","validation":"none"}],
|
||||
[ "attachment", {"label":"Attachment","type":"fileupload","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
EmployeeDocumentAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
EmployeeDocumentAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img><img class="tableActionButton" src="_BASE_images/download.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Download Document" onclick="download(\'_attachment_\');return false;"></img><img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img></div>';
|
||||
html = html.replace(/_id_/g,id);
|
||||
html = html.replace(/_attachment_/g,data[6]);
|
||||
html = html.replace(/_BASE_/g,this.baseUrl);
|
||||
return html;
|
||||
});
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"label":"Document Management",
|
||||
"menu":"Employees",
|
||||
"order":"2",
|
||||
"icon":"fa-files-o",
|
||||
"user_levels":["Admin"],
|
||||
|
||||
"permissions":
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -42,7 +42,7 @@ JobTitleAdapter.method('getFormFields', function() {
|
||||
});
|
||||
|
||||
JobTitleAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/?page_id=80';
|
||||
return 'http://blog.icehrm.com/docs/jobdetails/';
|
||||
});
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"label":"Company Loans",
|
||||
"menu":"Admin",
|
||||
"order":"7",
|
||||
"order":"81",
|
||||
"icon":"fa-shield",
|
||||
"user_levels":["Admin"],
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ ClientAdapter.method('getFormFields', function() {
|
||||
});
|
||||
|
||||
ClientAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/?page_id=85';
|
||||
return 'http://blog.icehrm.com/docs/projects/';
|
||||
});
|
||||
|
||||
/**
|
||||
@@ -116,7 +116,7 @@ ProjectAdapter.method('getFormFields', function() {
|
||||
});
|
||||
|
||||
ProjectAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/?page_id=85';
|
||||
return 'http://blog.icehrm.com/docs/projects/';
|
||||
});
|
||||
|
||||
|
||||
@@ -172,6 +172,6 @@ EmployeeProjectAdapter.method('getFilters', function() {
|
||||
});
|
||||
|
||||
EmployeeProjectAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/?page_id=85';
|
||||
return 'http://blog.icehrm.com/docs/projects/';
|
||||
});
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ SkillAdapter.method('getFormFields', function() {
|
||||
});
|
||||
|
||||
SkillAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/?page_id=83';
|
||||
return 'http://blog.icehrm.com/docs/qualifications/';
|
||||
});
|
||||
|
||||
|
||||
|
||||
@@ -162,6 +162,3 @@ ReportAdapter.method('fillForm', function(object) {
|
||||
}
|
||||
});
|
||||
|
||||
ReportAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/?page_id=118';
|
||||
});
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
<?php
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once MODULE_PATH.'/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class EmployeeLeavesReport extends ReportBuilder{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "SELECT
|
||||
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = employee) as 'Employee',
|
||||
(SELECT name from LeaveTypes where id = leave_type) as 'Leave Type',
|
||||
(SELECT name from LeavePeriods where id = leave_type) as 'Leave Type',
|
||||
date_start as 'Start Date',
|
||||
date_end as 'End Date',
|
||||
details as 'Reason',
|
||||
status as 'Leave Status',
|
||||
(select count(*) from EmployeeLeaveDays d where d.employee_leave = lv.id and leave_type = 'Full Day') as 'Full Day Count',
|
||||
(select count(*) from EmployeeLeaveDays d where d.employee_leave = lv.id and leave_type = 'Half Day - Morning') as 'Half Day (Morning) Count',
|
||||
(select count(*) from EmployeeLeaveDays d where d.employee_leave = lv.id and leave_type = 'Half Day - Afternoon') as 'Half Day (Afternoon) Count'
|
||||
from EmployeeLeaves lv";
|
||||
|
||||
return $query;
|
||||
|
||||
}
|
||||
|
||||
public function getWhereQuery($request){
|
||||
|
||||
$employeeList = array();
|
||||
if(!empty($request['employee'])){
|
||||
$employeeList = json_decode($request['employee'],true);
|
||||
}
|
||||
|
||||
if(in_array("NULL", $employeeList) ){
|
||||
$employeeList = array();
|
||||
}
|
||||
|
||||
|
||||
if(!empty($employeeList) && ($request['status'] != "NULL" && !empty($request['status']))){
|
||||
$query = "where employee in (".implode(",", $employeeList).") and date_start >= ? and date_end <= ? and status = ?;";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end'],
|
||||
$request['status']
|
||||
);
|
||||
}else if(!empty($employeeList)){
|
||||
$query = "where employee in (".implode(",", $employeeList).") and date_start >= ? and date_end <= ?;";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end']
|
||||
);
|
||||
}else if(($request['status'] != "NULL" && !empty($request['status']))){
|
||||
$query = "where status = ? and date_start >= ? and date_end <= ?;";
|
||||
$params = array(
|
||||
$request['status'],
|
||||
$request['date_start'],
|
||||
$request['date_end']
|
||||
);
|
||||
}else{
|
||||
$query = "where date_start >= ? and date_end <= ?;";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end']
|
||||
);
|
||||
}
|
||||
|
||||
LogManager::getInstance()->info("Query:".$query);
|
||||
LogManager::getInstance()->info("Params:".json_encode($params));
|
||||
|
||||
return array($query, $params);
|
||||
}
|
||||
}
|
||||
@@ -63,5 +63,5 @@ SettingAdapter.method('fillForm', function(object) {
|
||||
|
||||
|
||||
SettingAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/?page_id=126';
|
||||
return 'http://blog.icehrm.com/docs/settings/';
|
||||
});
|
||||
19
ext/admin/travel/api/TravelActionManager.php
Normal file
19
ext/admin/travel/api/TravelActionManager.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
class TravelActionManager extends ApproveAdminActionManager{
|
||||
|
||||
public function getModelClass(){
|
||||
return "EmployeeTravelRecord";
|
||||
}
|
||||
|
||||
public function getItemName(){
|
||||
return "TravelRequest";
|
||||
}
|
||||
|
||||
public function getModuleName(){
|
||||
return "Travel Management";
|
||||
}
|
||||
|
||||
public function getModuleTabUrl(){
|
||||
return "g=modules&n=travel&m=module_Travel_Management";
|
||||
}
|
||||
}
|
||||
128
ext/admin/travel/api/TravelAdminManager.php
Normal file
128
ext/admin/travel/api/TravelAdminManager.php
Normal file
@@ -0,0 +1,128 @@
|
||||
<?php
|
||||
if (!class_exists('TravelAdminManager')) {
|
||||
|
||||
class TravelAdminManager extends AbstractModuleManager{
|
||||
|
||||
public function initializeUserClasses(){
|
||||
if(defined('MODULE_TYPE') && MODULE_TYPE != 'admin'){
|
||||
$this->addUserClass("EmployeeImmigration");
|
||||
$this->addUserClass("EmployeeTravelRecord");
|
||||
}
|
||||
}
|
||||
|
||||
public function initializeFieldMappings(){
|
||||
$this->addFileFieldMapping('EmployeeImmigration', 'attachment1', 'name');
|
||||
$this->addFileFieldMapping('EmployeeImmigration', 'attachment2', 'name');
|
||||
$this->addFileFieldMapping('EmployeeImmigration', 'attachment3', 'name');
|
||||
|
||||
$this->addFileFieldMapping('EmployeeTravelRecord', 'attachment1', 'name');
|
||||
$this->addFileFieldMapping('EmployeeTravelRecord', 'attachment2', 'name');
|
||||
$this->addFileFieldMapping('EmployeeTravelRecord', 'attachment3', 'name');
|
||||
}
|
||||
|
||||
public function initializeDatabaseErrorMappings(){
|
||||
|
||||
}
|
||||
|
||||
public function setupModuleClassDefinitions(){
|
||||
|
||||
$this->addModelClass('ImmigrationDocument');
|
||||
$this->addModelClass('EmployeeImmigration');
|
||||
$this->addModelClass('EmployeeTravelRecord');
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!class_exists('ImmigrationDocument')) {
|
||||
class ImmigrationDocument extends ICEHRM_Record {
|
||||
var $_table = 'ImmigrationDocuments';
|
||||
|
||||
public function getAdminAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getManagerAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getUserAccess(){
|
||||
return array("get");
|
||||
}
|
||||
|
||||
public function getUserOnlyMeAccess(){
|
||||
return array("get","element");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!class_exists('EmployeeImmigration')) {
|
||||
class EmployeeImmigration extends ICEHRM_Record {
|
||||
var $_table = 'EmployeeImmigrations';
|
||||
|
||||
public function getAdminAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getManagerAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getUserAccess(){
|
||||
return array("get");
|
||||
}
|
||||
|
||||
public function getUserOnlyMeAccess(){
|
||||
return array("element","save","delete");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!class_exists('EmployeeTravelRecord')) {
|
||||
class EmployeeTravelRecord extends ApproveModel
|
||||
{
|
||||
var $_table = 'EmployeeTravelRecords';
|
||||
|
||||
var $notificationModuleName = "Travel Management";
|
||||
var $notificationUnitName = "TravelRequest";
|
||||
var $notificationUnitPrefix = "A";
|
||||
var $notificationUnitAdminUrl = "g=admin&n=travel&m=admin_Employees";
|
||||
var $preApproveSettingName = "Travel: Pre-Approve Travel Request";
|
||||
|
||||
public function getAdminAccess()
|
||||
{
|
||||
return array("get", "element", "save", "delete");
|
||||
}
|
||||
|
||||
public function getManagerAccess()
|
||||
{
|
||||
return array("get", "element", "save", "delete");
|
||||
}
|
||||
|
||||
public function getUserAccess()
|
||||
{
|
||||
return array("get");
|
||||
}
|
||||
|
||||
public function getUserOnlyMeAccess()
|
||||
{
|
||||
return array("element", "save", "delete");
|
||||
}
|
||||
|
||||
public function fieldsNeedToBeApproved()
|
||||
{
|
||||
return array(
|
||||
"travel_from",
|
||||
"travel_to",
|
||||
"travel_date",
|
||||
"return_date",
|
||||
"funding",
|
||||
"currency"
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
78
ext/admin/travel/index.php
Normal file
78
ext/admin/travel/index.php
Normal file
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
/*
|
||||
This file is part of iCE Hrm.
|
||||
|
||||
iCE Hrm is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
iCE Hrm is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
$moduleName = 'travel';
|
||||
define('MODULE_PATH',dirname(__FILE__));
|
||||
include APP_BASE_PATH.'header.php';
|
||||
include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
|
||||
$options = array();
|
||||
$options['setRemoteTable'] = 'true';
|
||||
|
||||
$moduleBuilder = new ModuleBuilder();
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('EmployeeTravelRecord','EmployeeTravelRecord','Travel Requests','EmployeeTravelRecordAdapter','','',true,$options));
|
||||
echo UIManager::getInstance()->renderModule($moduleBuilder);
|
||||
|
||||
|
||||
$itemName = 'TravelRequest';
|
||||
$moduleName = 'Travel Management';
|
||||
$itemNameLower = strtolower($itemName);
|
||||
|
||||
$statuses = array("Approved","Pending","Rejected","Cancelled");
|
||||
|
||||
?><div class="modal" id="<?=$itemNameLower?>StatusModel" tabindex="-1" role="dialog" aria-labelledby="messageModelLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><li class="fa fa-times"/></button>
|
||||
<h3 style="font-size: 17px;">Change <?=$itemName?> Status</h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form id="expenseStatusForm">
|
||||
<div class="control-group">
|
||||
<label class="control-label" for="expense_status"><?=$itemName?> Status</label>
|
||||
<div class="controls">
|
||||
<select type="text" id="<?=$itemNameLower?>_status" class="form-control" name="<?=$itemNameLower?>_status" value="">
|
||||
<?php foreach($statuses as $status){?>
|
||||
<option value="<?=$status?>"><?=$status?></option>
|
||||
<?php }?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" for="expense_status">Status Change Note</label>
|
||||
<div class="controls">
|
||||
<textarea id="<?=$itemNameLower?>_reason" class="form-control" name="<?=$itemNameLower?>_reason" maxlength="500"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-primary" onclick="modJs.changeStatus();">Change <?=$itemName?> Status</button>
|
||||
<button class="btn" onclick="modJs.closeDialog();">Not Now</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
include APP_BASE_PATH.'footer.php';
|
||||
182
ext/admin/travel/lib.js
Normal file
182
ext/admin/travel/lib.js
Normal file
@@ -0,0 +1,182 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* ImmigrationDocumentAdapter
|
||||
*/
|
||||
|
||||
function ImmigrationDocumentAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
ImmigrationDocumentAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
ImmigrationDocumentAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"details",
|
||||
"required",
|
||||
"alert_on_missing",
|
||||
"alert_before_expiry"
|
||||
];
|
||||
});
|
||||
|
||||
ImmigrationDocumentAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Details"},
|
||||
{ "sTitle": "Compulsory"},
|
||||
{ "sTitle": "Alert If Not Found"},
|
||||
{ "sTitle": "Alert Before Expiry"}
|
||||
];
|
||||
});
|
||||
|
||||
ImmigrationDocumentAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}],
|
||||
[ "details", {"label":"Details","type":"textarea","validation":"none"}],
|
||||
[ "required", {"label":"Compulsory","type":"select","source":[["No","No"],["Yes","Yes"]]}],
|
||||
[ "alert_on_missing", {"label":"Alert If Not Found","type":"select","source":[["No","No"],["Yes","Yes"]]}],
|
||||
[ "alert_before_expiry", {"label":"Alert Before Expiry","type":"select","source":[["No","No"],["Yes","Yes"]]}],
|
||||
[ "alert_before_day_number", {"label":"Days for Expiry Alert","type":"text","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* EmployeeImmigrationAdapter
|
||||
*/
|
||||
|
||||
|
||||
function EmployeeImmigrationAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
EmployeeImmigrationAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
EmployeeImmigrationAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"document",
|
||||
"documentname",
|
||||
"valid_until",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeImmigrationAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Document" },
|
||||
{ "sTitle": "Document Id" },
|
||||
{ "sTitle": "Valid Until"},
|
||||
{ "sTitle": "Status"}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeImmigrationAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}],
|
||||
[ "document", {"label":"Document","type":"select2","remote-source":["ImmigrationDocument","id","name"]}],
|
||||
[ "documentname", {"label":"Document Id","type":"text","validation":""}],
|
||||
[ "valid_until", {"label":"Valid Until","type":"date","validation":"none"}],
|
||||
[ "status", {"label":"Status","type":"select","source":[["Active","Active"],["Inactive","Inactive"],["Draft","Draft"]]}],
|
||||
[ "details", {"label":"Details","type":"textarea","validation":"none"}],
|
||||
[ "attachment1", {"label":"Attachment 1","type":"fileupload","validation":"none"}],
|
||||
[ "attachment2", {"label":"Attachment 2","type":"fileupload","validation":"none"}],
|
||||
[ "attachment3", {"label":"Attachment 3","type":"fileupload","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
EmployeeImmigrationAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* EmployeeTravelRecordAdapter
|
||||
*/
|
||||
|
||||
|
||||
function EmployeeTravelRecordAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
this.itemName = 'TravelRequest';
|
||||
this.itemNameLower = 'travelrequest';
|
||||
this.modulePathName = 'travel';
|
||||
}
|
||||
|
||||
EmployeeTravelRecordAdapter.inherits(ApproveAdminAdapter);
|
||||
|
||||
|
||||
|
||||
EmployeeTravelRecordAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"type",
|
||||
"purpose",
|
||||
"travel_from",
|
||||
"travel_to",
|
||||
"travel_date",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Travel Type" },
|
||||
{ "sTitle": "Purpose" },
|
||||
{ "sTitle": "From"},
|
||||
{ "sTitle": "To"},
|
||||
{ "sTitle": "Travel Date"},
|
||||
{ "sTitle": "Status"}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
["id", {"label": "ID", "type": "hidden"}],
|
||||
["employee", {
|
||||
"label": "Employee",
|
||||
"type": "select2",
|
||||
"sort": "none",
|
||||
"allow-null": false,
|
||||
"remote-source": ["Employee", "id", "first_name+last_name", "getActiveSubordinateEmployees"]
|
||||
}],
|
||||
["type", {
|
||||
"label": "Travel Type",
|
||||
"type": "select",
|
||||
"source": [["Local", "Local"], ["International", "International"]]
|
||||
}],
|
||||
["purpose", {"label": "Purpose of Travel", "type": "textarea", "validation": ""}],
|
||||
["travel_from", {"label": "Travel From", "type": "text", "validation": ""}],
|
||||
["travel_to", {"label": "Travel To", "type": "text", "validation": ""}],
|
||||
["travel_date", {"label": "Travel Date", "type": "datetime", "validation": ""}],
|
||||
["return_date", {"label": "Return Date", "type": "datetime", "validation": ""}],
|
||||
["details", {"label": "Notes", "type": "textarea", "validation": "none"}],
|
||||
["currency", {"label": "Currency", "type": "select2", "allow-null":false, "remote-source": ["CurrencyType", "id", "code"]}],
|
||||
["funding", {"label": "Total Funding Proposed", "type": "text", "validation": "float"}],
|
||||
["attachment1", {"label": "Itinerary / Cab Receipt", "type": "fileupload", "validation": "none"}],
|
||||
["attachment2", {"label": "Other Attachment 1", "type": "fileupload", "validation": "none"}],
|
||||
["attachment3", {"label": "Other Attachment 2", "type": "fileupload", "validation": "none"}]
|
||||
];
|
||||
});
|
||||
|
||||
11
ext/admin/travel/meta.json
Normal file
11
ext/admin/travel/meta.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"label":"Travel Administration",
|
||||
"menu":"Employees",
|
||||
"order":"6",
|
||||
"icon":"fa-plane",
|
||||
"user_levels":["Admin","Manager"],
|
||||
|
||||
"permissions":
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -46,13 +46,20 @@ class AttendanceActionManager extends SubActionManager{
|
||||
|
||||
|
||||
public function savePunch($req){
|
||||
$req->date = $req->time;
|
||||
|
||||
/*
|
||||
if(strtotime($req->date) > strtotime($req->cdate)){
|
||||
return new IceResponse(IceResponse::ERROR,"You are not allowed to punch a future time");
|
||||
$useServerTime = SettingsManager::getInstance()->getSetting('Attendance: Use Department Time Zone');
|
||||
$currentEmployeeTimeZone = BaseService::getInstance()->getCurrentEmployeeTimeZone();
|
||||
|
||||
if($useServerTime == '1' && !empty($currentEmployeeTimeZone)){
|
||||
date_default_timezone_set('Asia/Colombo');
|
||||
|
||||
$date = new DateTime("now", new DateTimeZone('Asia/Colombo'));
|
||||
|
||||
$date->setTimezone(new DateTimeZone($currentEmployeeTimeZone));
|
||||
$req->time = $date->format('Y-m-d H:i:s');
|
||||
}
|
||||
*/
|
||||
|
||||
$req->date = $req->time;
|
||||
|
||||
//check if there is an open punch
|
||||
$openPunch = $this->getPunch($req)->getData();
|
||||
@@ -65,13 +72,7 @@ class AttendanceActionManager extends SubActionManager{
|
||||
$arr = explode(" ",$dateTime);
|
||||
$date = $arr[0];
|
||||
|
||||
$currentDateTime = $req->cdate;
|
||||
$arr = explode(" ",$currentDateTime);
|
||||
$currentDate = $arr[0];
|
||||
|
||||
if($currentDate != $date){
|
||||
return new IceResponse(IceResponse::ERROR,"You are not allowed to punch time for a previous date");
|
||||
}
|
||||
|
||||
$employee = $this->baseService->getElement('Employee',$this->getCurrentProfileId(),null,true);
|
||||
|
||||
@@ -98,18 +99,18 @@ class AttendanceActionManager extends SubActionManager{
|
||||
}
|
||||
if(strtotime($attendance->out_time) >= strtotime($dateTime) && strtotime($attendance->in_time) <= strtotime($dateTime)){
|
||||
//-1---0---1---0 || ---0--1---1---0
|
||||
return new IceResponse(IceResponse::ERROR,"Time entry is overlapping with an existing one 1");
|
||||
return new IceResponse(IceResponse::ERROR,"Time entry is overlapping with an existing one");
|
||||
}else if(strtotime($attendance->out_time) >= strtotime($openPunch->in_time) && strtotime($attendance->in_time) <= strtotime($openPunch->in_time)){
|
||||
//---0---1---0---1 || ---0--1---1---0
|
||||
return new IceResponse(IceResponse::ERROR,"Time entry is overlapping with an existing one 2");
|
||||
return new IceResponse(IceResponse::ERROR,"Time entry is overlapping with an existing one");
|
||||
}else if(strtotime($attendance->out_time) <= strtotime($dateTime) && strtotime($attendance->in_time) >= strtotime($openPunch->in_time)){
|
||||
//--1--0---0--1--
|
||||
return new IceResponse(IceResponse::ERROR,"Time entry is overlapping with an existing one 3 ".$attendance->id);
|
||||
return new IceResponse(IceResponse::ERROR,"Time entry is overlapping with an existing one ".$attendance->id);
|
||||
}
|
||||
}else{
|
||||
if(strtotime($attendance->out_time) >= strtotime($dateTime) && strtotime($attendance->in_time) <= strtotime($dateTime)){
|
||||
//---0---1---0
|
||||
return new IceResponse(IceResponse::ERROR,"Time entry is overlapping with an existing one 4");
|
||||
return new IceResponse(IceResponse::ERROR,"Time entry is overlapping with an existing one");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,11 @@ $moduleName = 'attendance';
|
||||
define('MODULE_PATH',dirname(__FILE__));
|
||||
include APP_BASE_PATH.'header.php';
|
||||
include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
$useServerTime = SettingsManager::getInstance()->getSetting('Attendance: Use Department Time Zone');
|
||||
$currentEmployeeTimeZone = BaseService::getInstance()->getCurrentEmployeeTimeZone();
|
||||
if(empty($currentEmployeeTimeZone)){
|
||||
$useServerTime = 0;
|
||||
}
|
||||
?><div class="span9">
|
||||
|
||||
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
|
||||
@@ -48,9 +53,11 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
<script>
|
||||
var modJsList = new Array();
|
||||
modJsList['tabAttendance'] = new AttendanceAdapter('Attendance','Attendance','','in_time desc');
|
||||
modJsList['tabAttendance'].setUseServerTime(<?=$useServerTime?>);
|
||||
modJsList['tabAttendance'].setRemoteTable(true);
|
||||
modJsList['tabAttendance'].updatePunchButton(true);
|
||||
|
||||
|
||||
var modJs = modJsList['tabAttendance'];
|
||||
|
||||
</script>
|
||||
|
||||
@@ -23,6 +23,7 @@ Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilin
|
||||
function AttendanceAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
this.punch = null;
|
||||
this.useServerTime = 0;
|
||||
}
|
||||
|
||||
AttendanceAdapter.inherits(AdapterBase);
|
||||
@@ -31,6 +32,10 @@ AttendanceAdapter.method('updatePunchButton', function() {
|
||||
this.getPunch('changePunchButtonSuccessCallBack');
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('setUseServerTime', function(val) {
|
||||
this.useServerTime = val;
|
||||
});
|
||||
|
||||
|
||||
AttendanceAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
@@ -51,11 +56,19 @@ AttendanceAdapter.method('getHeaders', function() {
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('getFormFields', function() {
|
||||
if(this.useServerTime == 0){
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "time", {"label":"Time","type":"datetime"}],
|
||||
[ "note", {"label":"Note","type":"textarea","validation":"none"}]
|
||||
];
|
||||
}else{
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "note", {"label":"Note","type":"textarea","validation":"none"}]
|
||||
];
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
@@ -21,19 +21,12 @@ Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
include (APP_BASE_PATH."modules/leaves/api/LeavesActionManager.php");
|
||||
|
||||
class DashboardActionManager extends SubActionManager{
|
||||
|
||||
public function getPendingLeaves($req){
|
||||
|
||||
$lam = new LeavesActionManager();
|
||||
$leavePeriod = $lam->getCurrentLeavePeriod(date("Y-m-d H:i:s"), date("Y-m-d H:i:s"));
|
||||
|
||||
$leave = new EmployeeLeave();
|
||||
$pendingLeaves = $leave->Find("status = ? and employee = ?",array("Pending", $this->getCurrentProfileId()));
|
||||
|
||||
return new IceResponse(IceResponse::SUCCESS,count($pendingLeaves));
|
||||
return new IceResponse(IceResponse::SUCCESS,0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
?><div class="span9">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-aqua">
|
||||
<div class="inner">
|
||||
@@ -47,24 +47,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-green">
|
||||
<div class="inner">
|
||||
<h3 id="pendingLeaveCount">..</h3>
|
||||
<p>
|
||||
Pending Leaves
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-calendar"></i>
|
||||
</div>
|
||||
<a href="#" class="small-box-footer" id="leavesLink">
|
||||
Check Leave Status <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-yellow">
|
||||
<div class="inner">
|
||||
@@ -81,7 +64,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
@@ -98,6 +81,130 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-teal">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
My Travel
|
||||
</h3>
|
||||
<p>
|
||||
Requests
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-plane"></i>
|
||||
</div>
|
||||
<a href="#" class="small-box-footer" id="travelLink">
|
||||
Travel Requests <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-yellow">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
Help
|
||||
</h3>
|
||||
<p>
|
||||
User Guide
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-help"></i>
|
||||
</div>
|
||||
<a href="http://blog.icehrm.com/docs/home/" target="_blank" class="small-box-footer" id="icehrmHelpLink">
|
||||
Documentation <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if($user->user_level == "Manager" || $user->user_level == "Admin"){?>
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-aqua">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
Employees
|
||||
</h3>
|
||||
<p id="numberOfEmployees">
|
||||
Subordinates
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-person-stalker"></i>
|
||||
</div>
|
||||
<a href="#" class="small-box-footer" id="employeeLink">
|
||||
Manage Subordinates <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
|
||||
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-yellow">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
Travel
|
||||
</h3>
|
||||
<p id="numberOfTravel">
|
||||
Management
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-plane"></i>
|
||||
</div>
|
||||
<a href="#" class="small-box-footer" id="traveAdminlLink">
|
||||
Manage Travel <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
Attendance
|
||||
</h3>
|
||||
<p id="numberOfDocuments">
|
||||
Monitor
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-ios7-timer"></i>
|
||||
</div>
|
||||
<a href="#" class="small-box-footer" id="attendanceAdminLink">
|
||||
View Attendance <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-teal">
|
||||
<div class="inner">
|
||||
<h3>Reports</h3>
|
||||
<p>
|
||||
View / Download Reports
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-document-text"></i>
|
||||
</div>
|
||||
<a href="#" class="small-box-footer" id="reportsLink">
|
||||
Create a Report <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- ./col -->
|
||||
|
||||
|
||||
<?php }?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -109,9 +216,15 @@ modJsList['tabDashboard'] = new DashboardAdapter('Dashboard','Dashboard');
|
||||
var modJs = modJsList['tabDashboard'];
|
||||
|
||||
$("#atteandanceLink").attr("href",modJs.getCustomUrl('?g=modules&n=attendance&m=module_Time_Management'));
|
||||
$("#attendanceAdminLink").attr("href",modJs.getCustomUrl('?g=admin&n=attendance&m=admin_Admin'));
|
||||
$("#leavesLink").attr("href",modJs.getCustomUrl('?g=modules&n=leaves&m=module_Leaves'));
|
||||
$("#timesheetLink").attr("href",modJs.getCustomUrl('?g=modules&n=time_sheets&m=module_Time_Management'));
|
||||
$("#projectsLink").attr("href",modJs.getCustomUrl('?g=modules&n=projects&m=module_Personal_Information'));
|
||||
$("#projectsLink").attr("href",modJs.getCustomUrl('?g=modules&n=projects&m=module_Time_Management'));
|
||||
$("#traveAdminlLink").attr("href",modJs.getCustomUrl('?g=admin&n=travel&m=admin_Employees'));
|
||||
$("#travelLink").attr("href",modJs.getCustomUrl('?g=modules&n=travel&m=module_Travel_Management'));
|
||||
$("#reportsLink").attr("href",modJs.getCustomUrl('?g=admin&n=reports&m=admin_Reports'));
|
||||
|
||||
|
||||
|
||||
modJs.getPunch();
|
||||
modJs.getPendingLeaves();
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
This file is part of iCE Hrm.
|
||||
|
||||
iCE Hrm is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
iCE Hrm is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
$moduleName = 'documents';
|
||||
define('MODULE_PATH',dirname(__FILE__));
|
||||
include APP_BASE_PATH.'header.php';
|
||||
include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
?><div class="span9">
|
||||
|
||||
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
|
||||
<li class="active"><a id="tabEmployeeDocument" href="#tabPageEmployeeDocument">My Documents</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane active" id="tabPageEmployeeDocument">
|
||||
<div id="EmployeeDocument" class="reviewBlock" data-content="List" style="padding-left:5px;">
|
||||
|
||||
</div>
|
||||
<div id="EmployeeDocumentForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<script>
|
||||
var modJsList = new Array();
|
||||
|
||||
modJsList['tabEmployeeDocument'] = new EmployeeDocumentAdapter('EmployeeDocument','EmployeeDocument');
|
||||
|
||||
<?php if(isset($modulePermissions['perm']['Add Documents']) && $modulePermissions['perm']['Add Documents'] == "No"){?>
|
||||
modJsList['tabEmployeeDocument'].setShowAddNew(false);
|
||||
<?php }?>
|
||||
<?php if(isset($modulePermissions['perm']['Delete Documents']) && $modulePermissions['perm']['Delete Documents'] == "No"){?>
|
||||
modJsList['tabEmployeeDocument'].setShowDelete(false);
|
||||
<?php }?>
|
||||
<?php if(isset($modulePermissions['perm']['Edit Documents']) && $modulePermissions['perm']['Edit Documents'] == "No"){?>
|
||||
modJsList['tabEmployeeDocument'].setShowEdit(false);
|
||||
<?php }?>
|
||||
|
||||
var modJs = modJsList['tabEmployeeDocument'];
|
||||
|
||||
</script>
|
||||
<?php include APP_BASE_PATH.'footer.php';?>
|
||||
@@ -1,90 +0,0 @@
|
||||
/*
|
||||
This file is part of iCE Hrm.
|
||||
|
||||
iCE Hrm is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
iCE Hrm is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
function EmployeeDocumentAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
EmployeeDocumentAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
EmployeeDocumentAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"document",
|
||||
"details",
|
||||
"date_added",
|
||||
"status",
|
||||
"attachment"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeDocumentAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Document" },
|
||||
{ "sTitle": "Details" },
|
||||
{ "sTitle": "Date Added"},
|
||||
{ "sTitle": "Status"},
|
||||
{ "sTitle": "Attachment","bVisible":false}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeDocumentAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "document", {"label":"Document","type":"select2","remote-source":["Document","id","name"]}],
|
||||
//[ "date_added", {"label":"Date Added","type":"date","validation":""}],
|
||||
[ "valid_until", {"label":"Valid Until","type":"date","validation":"none"}],
|
||||
[ "status", {"label":"Status","type":"select","source":[["Active","Active"],["Inactive","Inactive"],["Draft","Draft"]]}],
|
||||
[ "details", {"label":"Details","type":"textarea","validation":"none"}],
|
||||
[ "attachment", {"label":"Attachment","type":"fileupload","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
EmployeeDocumentAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var downloadButton = '<img class="tableActionButton" src="_BASE_images/download.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Download Document" onclick="download(\'_attachment_\');return false;"></img>';
|
||||
var editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
|
||||
var deleteButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img>';
|
||||
var html = '<div style="width:80px;">_edit__download__delete_</div>';
|
||||
|
||||
html = html.replace('_download_',downloadButton);
|
||||
|
||||
if(this.showDelete){
|
||||
html = html.replace('_delete_',deleteButton);
|
||||
}else{
|
||||
html = html.replace('_delete_','');
|
||||
}
|
||||
|
||||
if(this.showEdit){
|
||||
html = html.replace('_edit_',editButton);
|
||||
}else{
|
||||
html = html.replace('_edit_','');
|
||||
}
|
||||
|
||||
html = html.replace(/_id_/g,id);
|
||||
html = html.replace(/_attachment_/g,data[5]);
|
||||
html = html.replace(/_BASE_/g,this.baseUrl);
|
||||
return html;
|
||||
});
|
||||
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"label":"My Documents",
|
||||
"menu":"Documents",
|
||||
"order":"1",
|
||||
"icon":"fa-files-o",
|
||||
"user_levels":["Admin","Manager","Employee"],
|
||||
|
||||
"permissions":
|
||||
{
|
||||
"Manager":{
|
||||
"Add Documents":"Yes",
|
||||
"Edit Documents":"Yes",
|
||||
"Delete Documents":"Yes"
|
||||
},
|
||||
|
||||
"Employee":{
|
||||
"Add Documents":"Yes",
|
||||
"Edit Documents":"Yes",
|
||||
"Delete Documents":"Yes"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"label":"Loans",
|
||||
"menu":"Loans",
|
||||
"order":"1",
|
||||
"menu":"Finance",
|
||||
"order":"3",
|
||||
"icon":"fa-shield",
|
||||
"user_levels":["Admin","Manager","Employee"],
|
||||
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
{
|
||||
"Personal Information":"fa-male",
|
||||
"Subordinates":"fa-user",
|
||||
"Leaves":"fa-calendar-o",
|
||||
"Time Management":"fa-clock-o",
|
||||
"Documents":"fa-files-o",
|
||||
"Training":"fa-briefcase",
|
||||
"Loans":"fa-list-alt"
|
||||
"Travel Management":"fa-plane",
|
||||
"Finance":"fa-money"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"label":"Salary",
|
||||
"menu":"Personal Information",
|
||||
"order":"4",
|
||||
"menu":"Finance",
|
||||
"order":"2",
|
||||
"icon":"fa-calculator",
|
||||
"user_levels":["Admin","Manager","Employee"],
|
||||
|
||||
|
||||
59
ext/modules/travel/api/TravelActionManager.php
Normal file
59
ext/modules/travel/api/TravelActionManager.php
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
class TravelActionManager extends ApproveModuleActionManager{
|
||||
|
||||
public function getModelClass(){
|
||||
return "EmployeeTravelRecord";
|
||||
}
|
||||
|
||||
public function getItemName(){
|
||||
return "TravelRequest";
|
||||
}
|
||||
|
||||
public function getModuleName(){
|
||||
return "Travel Management";
|
||||
}
|
||||
|
||||
public function getModuleTabUrl(){
|
||||
return "g=admin&n=travel&m=admin_Employees#tabEmployeeTravelRecord";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
class TravelActionManager extends SubActionManager{
|
||||
public function cancelTravel($req){
|
||||
|
||||
$employee = $this->baseService->getElement('Employee',$this->getCurrentProfileId(),null,true);
|
||||
|
||||
$employeeTravel = new EmployeeTravelRecord();
|
||||
$employeeTravel->Load("id = ?",array($req->id));
|
||||
if($employeeTravel->id != $req->id){
|
||||
return new IceResponse(IceResponse::ERROR,"Travel record not found");
|
||||
}
|
||||
|
||||
|
||||
if($this->user->user_level != 'Admin' && $this->getCurrentProfileId() != $employeeTravel->employee){
|
||||
return new IceResponse(IceResponse::ERROR,"Only an admin or owner of the travel request can do this");
|
||||
}
|
||||
|
||||
if($employeeTravel->status != 'Approved'){
|
||||
return new IceResponse(IceResponse::ERROR,"Only an approved travel request can be cancelled");
|
||||
}
|
||||
|
||||
$employeeTravel->status = 'Cancellation Requested';
|
||||
$ok = $employeeTravel->Save();
|
||||
if(!$ok){
|
||||
LogManager::getInstance()->error("Error occured while cancelling the travel:".$employeeTravel->ErrorMsg());
|
||||
return new IceResponse(IceResponse::ERROR,"Error occurred while cancelling the travel request. Please contact admin.");
|
||||
}
|
||||
|
||||
|
||||
$this->baseService->audit(IceConstants::AUDIT_ACTION, "Travel cancellation \ start:".$employeeTravel->date_start."\ end:".$employeeTravel->date_end);
|
||||
$notificationMsg = $employee->first_name." ".$employee->last_name." cancelled a travel. Visit travel management module to approve";
|
||||
|
||||
$this->baseService->notificationManager->addNotification($employee->supervisor,$notificationMsg,'{"type":"url","url":"g=admin&n=travel&m=admin_Employees#tabEmployeeTravelRecord"}',
|
||||
"Travel Module", null, false, true);
|
||||
return new IceResponse(IceResponse::SUCCESS,$employeeTravel);
|
||||
}
|
||||
}
|
||||
*/
|
||||
@@ -1,12 +1,10 @@
|
||||
<?php
|
||||
if (!class_exists('DocumentsModulesManager')) {
|
||||
if (!class_exists('TravelModulesManager')) {
|
||||
|
||||
class DocumentsModulesManager extends AbstractModuleManager{
|
||||
class TravelModulesManager extends AbstractModuleManager{
|
||||
|
||||
public function initializeUserClasses(){
|
||||
if(defined('MODULE_TYPE') && MODULE_TYPE != 'admin'){
|
||||
$this->addUserClass("EmployeeDocument");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function initializeFieldMappings(){
|
||||
@@ -19,6 +17,7 @@ if (!class_exists('DocumentsModulesManager')) {
|
||||
|
||||
public function setupModuleClassDefinitions(){
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
66
ext/modules/travel/index.php
Normal file
66
ext/modules/travel/index.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
/*
|
||||
This file is part of iCE Hrm.
|
||||
|
||||
iCE Hrm is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
iCE Hrm is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
$moduleName = 'travel';
|
||||
$moduleMainName = "EmployeeTravelRecord";
|
||||
$moduleItemName = "Travel Request";
|
||||
define('MODULE_PATH',dirname(__FILE__));
|
||||
include APP_BASE_PATH.'header.php';
|
||||
include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
?><div class="span9">
|
||||
|
||||
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
|
||||
<li class="active"><a id="tab<?=$moduleMainName?>" href="#tabPage<?=$moduleMainName?>">Travel Requests</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane active" id="tabPage<?=$moduleMainName?>">
|
||||
<div id="<?=$moduleMainName?>" class="reviewBlock" data-content="List" style="padding-left:5px;">
|
||||
|
||||
</div>
|
||||
<div id="<?=$moduleMainName?>Form" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<script>
|
||||
var modJsList = new Array();
|
||||
|
||||
modJsList['tab<?=$moduleMainName?>'] = new <?=$moduleMainName?>Adapter('<?=$moduleMainName?>','<?=$moduleMainName?>');
|
||||
|
||||
<?php if(isset($modulePermissions['perm']['Add '.$moduleItemName]) && $modulePermissions['perm']['Add '.$moduleItemName] == "No"){?>
|
||||
modJsList['tab<?=$moduleMainName?>'].setShowAddNew(false);
|
||||
<?php }?>
|
||||
<?php if(isset($modulePermissions['perm']['Delete '.$moduleItemName]) && $modulePermissions['perm']['Delete '.$moduleItemName] == "No"){?>
|
||||
modJsList['tab<?=$moduleMainName?>'].setShowDelete(false);
|
||||
<?php }?>
|
||||
<?php if(isset($modulePermissions['perm']['Edit '.$moduleItemName]) && $modulePermissions['perm']['Edit '.$moduleItemName] == "No"){?>
|
||||
modJsList['tab<?=$moduleMainName?>'].setShowEdit(false);
|
||||
<?php }?>
|
||||
|
||||
var modJs = modJsList['tab<?=$moduleMainName?>'];
|
||||
|
||||
</script>
|
||||
<?php include APP_BASE_PATH.'footer.php';?>
|
||||
158
ext/modules/travel/lib.js
Normal file
158
ext/modules/travel/lib.js
Normal file
@@ -0,0 +1,158 @@
|
||||
/*
|
||||
This file is part of iCE Hrm.
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
function EmployeeImmigrationAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
EmployeeImmigrationAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
EmployeeImmigrationAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"document",
|
||||
"documentname",
|
||||
"valid_until",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeImmigrationAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Document" },
|
||||
{ "sTitle": "Document Id" },
|
||||
{ "sTitle": "Valid Until"},
|
||||
{ "sTitle": "Status"}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeImmigrationAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "document", {"label":"Document","type":"select2","remote-source":["ImmigrationDocument","id","name"]}],
|
||||
[ "documentname", {"label":"Document Id","type":"text","validation":""}],
|
||||
[ "valid_until", {"label":"Valid Until","type":"date","validation":"none"}],
|
||||
[ "status", {"label":"Status","type":"select","source":[["Active","Active"],["Inactive","Inactive"],["Draft","Draft"]]}],
|
||||
[ "details", {"label":"Details","type":"textarea","validation":"none"}],
|
||||
[ "attachment1", {"label":"Attachment 1","type":"fileupload","validation":"none"}],
|
||||
[ "attachment2", {"label":"Attachment 2","type":"fileupload","validation":"none"}],
|
||||
[ "attachment3", {"label":"Attachment 3","type":"fileupload","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function EmployeeTravelRecordAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
EmployeeTravelRecordAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
EmployeeTravelRecordAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"type",
|
||||
"purpose",
|
||||
"travel_from",
|
||||
"travel_to",
|
||||
"travel_date",
|
||||
"return_date",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Travel Type" },
|
||||
{ "sTitle": "Purpose" },
|
||||
{ "sTitle": "From"},
|
||||
{ "sTitle": "To"},
|
||||
{ "sTitle": "Travel Date"},
|
||||
{ "sTitle": "Return Date"},
|
||||
{ "sTitle": "Status"}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "type", {"label":"Travel Type","type":"select","source":[["Local","Local"],["International","International"]]}],
|
||||
[ "purpose", {"label":"Purpose of Travel","type":"textarea","validation":""}],
|
||||
[ "travel_from", {"label":"Travel From","type":"text","validation":""}],
|
||||
[ "travel_to", {"label":"Travel To","type":"text","validation":""}],
|
||||
[ "travel_date", {"label":"Travel Date","type":"datetime","validation":""}],
|
||||
[ "return_date", {"label":"Return Date","type":"datetime","validation":""}],
|
||||
[ "details", {"label":"Notes","type":"textarea","validation":"none"}],
|
||||
[ "currency", {"label":"Currency","type":"select2","allow-null":false,"remote-source":["CurrencyType","id","code"]}],
|
||||
[ "funding", {"label":"Total Funding Proposed","type":"text","validation":"float"}],
|
||||
[ "attachment1", {"label":"Itinerary / Cab Receipt","type":"fileupload","validation":"none"}],
|
||||
[ "attachment2", {"label":"Other Attachment 1","type":"fileupload","validation":"none"}],
|
||||
[ "attachment3", {"label":"Other Attachment 2","type":"fileupload","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
|
||||
var deleteButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img>';
|
||||
var requestCancellationButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Cancel Travel Request" onclick="modJs.cancelTravel(_id_);return false;"></img>';
|
||||
|
||||
var html = '<div style="width:80px;">_edit__delete_</div>';
|
||||
|
||||
if(this.showDelete){
|
||||
if(data[7] == "Approved"){
|
||||
html = html.replace('_delete_',requestCancellationButton);
|
||||
}else{
|
||||
html = html.replace('_delete_',deleteButton);
|
||||
}
|
||||
|
||||
}else{
|
||||
html = html.replace('_delete_','');
|
||||
}
|
||||
|
||||
if(this.showEdit){
|
||||
html = html.replace('_edit_',editButton);
|
||||
}else{
|
||||
html = html.replace('_edit_','');
|
||||
}
|
||||
|
||||
html = html.replace(/_id_/g,id);
|
||||
html = html.replace(/_BASE_/g,this.baseUrl);
|
||||
return html;
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdapter.method('cancelTravel', function(id) {
|
||||
var that = this;
|
||||
var object = {};
|
||||
object['id'] = id;
|
||||
|
||||
var reqJson = JSON.stringify(object);
|
||||
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'cancelSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'cancelFailCallBack';
|
||||
|
||||
this.customAction('cancelTravel','modules=travel',reqJson,callBackData);
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdapter.method('cancelSuccessCallBack', function(callBackData) {
|
||||
this.showMessage("Successful", "Travel request cancellation request sent");
|
||||
this.get([]);
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdapter.method('cancelFailCallBack', function(callBackData) {
|
||||
this.showMessage("Error Occurred while cancelling Travel request", callBackData);
|
||||
});
|
||||
|
||||
23
ext/modules/travel/meta.json
Normal file
23
ext/modules/travel/meta.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"label":"Travel",
|
||||
"menu":"Travel Management",
|
||||
"order":"1",
|
||||
"icon":"fa-plane",
|
||||
"user_levels":["Admin","Manager","Employee"],
|
||||
|
||||
"permissions":
|
||||
{
|
||||
"Manager":{
|
||||
"Add Travel Request":"Yes",
|
||||
"Edit Travel Request":"Yes",
|
||||
"Delete Travel Request":"Yes"
|
||||
},
|
||||
|
||||
"Employee":{
|
||||
"Add Travel Request":"Yes",
|
||||
"Edit Travel Request":"Yes",
|
||||
"Delete Travel Request":"Yes"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
710
readme.md
710
readme.md
@@ -1,21 +1,574 @@
|
||||
IceHrm
|
||||
===========
|
||||
|
||||
IceHrm is a [HRM software](http://icehrm.com) which enable companies of all sizes to [manage HR activities](http://icehrm.com)
|
||||
properly.
|
||||
|
||||
Note: IceHrm is now fully compatible with PHP 7
|
||||
|
||||
Installation
|
||||
------------
|
||||
Download the latest release https://github.com/gamonoid/icehrm/releases/latest
|
||||
* Download the latest release https://github.com/gamonoid/icehrm/releases/latest
|
||||
|
||||
Copy the downloaded file to the path you want to install iCE Hrm in your server and extract.
|
||||
* Copy the downloaded file to the path you want to install iCE Hrm in your server and extract.
|
||||
|
||||
Create a mysql DB for and user. Grant all on iCE Hrm DB to new DB user.
|
||||
* Create a mysql DB for and user. Grant all on iCE Hrm DB to new DB user.
|
||||
|
||||
Visit iCE Hrm installation path in your browser.
|
||||
* Visit iCE Hrm installation path in your browser.
|
||||
|
||||
During the installation form, fill in details appropriately.
|
||||
* During the installation form, fill in details appropriately.
|
||||
|
||||
Once the application is installed use the username = admin and password = admin to login to your system.
|
||||
* Once the application is installed use the username = admin and password = admin to login to your system.
|
||||
|
||||
Note: Please rename or delete the install folder (<ice hrm root>/app/install) since it could pose a security threat to your iCE Hrm instance.
|
||||
Note: Please rename or delete the install folder (<ice hrm root>/app/install) since it could pose a security threat to your iCE Hrm instance.
|
||||
|
||||
|
||||
Upgrade from Previous Versions to Latest Version
|
||||
------------------------------------------------
|
||||
|
||||
* Backup icehrm installation file and DB
|
||||
* Remove all folders except icehrm/app from your existing installation
|
||||
* Copy all folders except icehrm/app into installation folder
|
||||
* Use sql scripts inside 'db_upgrade/(version)' folder to upgrade the icehrm current version
|
||||
|
||||
|
||||
Note: If you are upgrading from older versions of icehrm please note that the icehrm leave module is removed since v13.0
|
||||
|
||||
|
||||
|
||||
Following is a list of features supported in each version of icehrm
|
||||
-------------------------------------------------------------------
|
||||
|
||||
### IceHrm Open Source Version
|
||||
* IceHrm Core Modules - Both Enterprise and Open source versions developed on same core concept. But the core modules in professional and enterprise versions are more feature rich and updated with latest security improvements.
|
||||
* [Company Information Management](http://icehrm.com/compare.php) - Store and manage details about how companies, departments and branches of the organisation are connected
|
||||
* Basic [Employee Management](http://icehrm.com) - Store, manage and retrieve employee information when required
|
||||
* Time sheets - IceHrm is a [timesheet app](http://icehrm.com) / [Open source timesheet management](http://icehrm.com) application to track time spent by employees on various projects
|
||||
* [Attendance Management](http://icehrm.com) - IceHrm can be used as a [attendance management system](http://icehrm.com) effectively for any size a company.
|
||||
* [Performance Charts](http://icehrm.com) - Charts for monitoring attendance hours and comparing attendance with time sheets
|
||||
* [Travel Management](http://icehrm.com) - Module for managing travel requests
|
||||
|
||||
|
||||
### IceHrm Pro Version | [Buy now for 199 USD](http://icehrm.com)
|
||||
|
||||
IceHrm Profession version (in short IceHrmPro) is the feature rich commercial alternative for icehrm
|
||||
open source version. IceHrm Pro supports following features
|
||||
|
||||
Following features are supported in IceHrm Pro version in addition to the features supported in open source version.
|
||||
|
||||
#### Advanced Employee Module
|
||||
|
||||

|
||||
|
||||
- Update all employee information without having to switch employees.
|
||||
- Search employee skills, qualifications and other information<br/>easily across whole company.
|
||||
- Terminate employees while keeping data in system.
|
||||
- Re-enable temporarily terminated employees with one click.
|
||||
- Employee archive feature to archive data of terminated employees.
|
||||
|
||||
#### Leave Management
|
||||
|
||||
IceHrm [Leave management system](http://icehrm.com) is only available in IceHrm Pro or Enterprise versions. IceHrm leave module is a complete [leave management system](http://icehrm.com) for any type of a company
|
||||
|
||||
To learn more about leave management in icehrm refer:
|
||||
- [Leave Admin Guide](http://blog.icehrm.com/docs/leave-admin)
|
||||
- [Configuring Leave Module](http://blog.icehrm.com/docs/leave-setup)
|
||||
- [Leave Rules](http://blog.icehrm.com/docs/leave-rules)
|
||||
|
||||
#### Audit Trial
|
||||
|
||||
Sometimes you need to access audit trail for your HRM system. Audit module records all the write actions (which alters your HRM system)
|
||||
of your employees in a quickly accessible and understandable manor. This help you to identify potential issues with the way employees
|
||||
are using the system.
|
||||
|
||||
#### Expense Tracking
|
||||
|
||||
[Track Employee Expenses](http://icehrm.com) with expense management module.
|
||||
|
||||
You can learn more about [IceHrm Pro here](http://blog.icehrm.com/docs/icehrm-pro/)
|
||||
|
||||
To purchase IceHrmPro please visit [http://icehrm.com/modules.php](http://icehrm.com/modules.php)
|
||||
|
||||
|
||||
### IceHrm Enterprise Version [Starts from 575 USD](http://icehrm.com)
|
||||
|
||||
In addition to pro version features icehrm enterprise version includes following features
|
||||
|
||||
#### Candidate / Recruitment Management
|
||||
|
||||
Recruitment module can be used as a [applicant tracking system](http://icehrm.com) or a [recruiting software](http://icehrm.com). IceHrm recruitment management system offers
|
||||
following features
|
||||
|
||||

|
||||
|
||||
- Post jobs
|
||||
- Let candidates apply for these jobs
|
||||
- Schedule interviews
|
||||
- Track candidate progress with notes
|
||||
- Share job links with linkedIn, facebook, twitter and google+ directly from icehrm
|
||||
|
||||

|
||||
|
||||
More about [recruitment module](http://blog.icehrm.com/docs/recruitment/)
|
||||
|
||||
#### LDAP Support
|
||||
|
||||
#### Training Management
|
||||
|
||||
Icehrm [training management system](http://icehrm.com) is for Module for managing courses, training sessions and employee attendance to training sessions.
|
||||
|
||||
|
||||
Your Company Structure (Departments / Branches and other Organization Units)
|
||||
-------------------------------------------
|
||||
|
||||
Company structure module allows you to define the structure of you company by
|
||||
creating parent structure of the company, branches, departments and other
|
||||
company units. Also it provides a graphical overview of how each of
|
||||
your company units are interconnected.
|
||||
|
||||

|
||||
|
||||
Employee Management
|
||||
-------------------
|
||||
|
||||
Employees module is used to list, edit, add and search employees in your company.
|
||||
You can use the search box to search employees by ID, name or department.
|
||||
Also you can use filter button to filter employees by job title, department or supervisor.
|
||||
|
||||
###Difference Between Users and Employees
|
||||
|
||||
A user is a person who can login to icehrm. It’s not required for admin users to have an employee attached but
|
||||
each non admin user must have an associated employee. Having an employee added in icehrm won’t
|
||||
allow the person to login to icehrm. You need to create user with a Manager or Employee user level
|
||||
for that employee to be able to login to the system.
|
||||
|
||||
###Adding Employees
|
||||
|
||||
Adding employees to ICE Hrm can only be done by the admin. The employee Id field should have a unique value.
|
||||
In order to complete adding an employee you need to provide job title, employment status and pay grade.
|
||||
These values can be defined in admin: Jobs module.
|
||||
|
||||
Once an employee is added to the system you will be asked to create a user for the newly added employee
|
||||
|
||||
###Switching Employees
|
||||
|
||||
One of the key features of ICE Hrm, is admins and mangers ability to login as another employee.
|
||||
This feature can be used to apply leaves, add attendance records or update time sheets behalf of other employees.
|
||||
|
||||
To login as an employee you can use the switch user icon on employee list or the “Switch Employee” menu in top right hand corner.
|
||||
|
||||
In open source version you must switch employee to edit employee basic information like skills and qualifications.
|
||||
But on Pro and Enterprise versions you can directly update employee information through Advanced Employee Management module.
|
||||
|
||||
|
||||
Settings
|
||||
--------
|
||||
|
||||
After installation the settings module can be accessed by login in as admin and going to System->Settings
|
||||
|
||||
## Global Settings
|
||||
|
||||
<div class="mobile-side-scroller">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Setting</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><p><code>Company: Name</code></p></td>
|
||||
<td><p>
|
||||
Name of the company
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Company: Logo</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Company logo. You may upload the company logo here.
|
||||
Ideally should be 200px wide and height between 50px to 150 px.
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Company: Description</code></p></td>
|
||||
<td><p>
|
||||
|
||||
A short description about the company. Will be used mainly in recruitment module
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: Enable</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Set this to "No" to disable all outgoing emails from modules. Value "Yes" will enable outgoing emails
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
## Email Settings
|
||||
|
||||
### Configuring Email with SMTP
|
||||
|
||||
<div class="mobile-side-scroller">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Setting</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><p><code>Email: Mode</code></p></td>
|
||||
<td><p>
|
||||
|
||||
This should be set to SMTP
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: SMTP Host</code></p></td>
|
||||
<td><p>
|
||||
|
||||
If you are using local machine to send emails, set this to localhost. If not set the IP address of the server you are using to send emails
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: SMTP Authentication</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Set this to "Yes" if SMTP server authorization is enabled
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: SMTP User</code></p></td>
|
||||
<td><p>
|
||||
|
||||
User name of the SMTP user
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: SMTP Password</code></p></td>
|
||||
<td><p>
|
||||
|
||||
SMTP user password
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: SMTP Port</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Port configured in SMTP server (Default 25)
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: Email From</code></p></td>
|
||||
<td><p>
|
||||
|
||||
From email address (e.g icehrm@mydomain.com)
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
### Configuring Email with Amazon SES
|
||||
|
||||
<div class="mobile-side-scroller">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Setting</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><p><code>Email: Mode</code></p></td>
|
||||
<td><p>
|
||||
|
||||
This should be set to SES
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: Amazon SES Key</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Amazon access key Id (You can get this through AWS console)
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: Amazone SES Secret</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Amazon access key secret
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: Email From</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Authorized email address for sending emails through SES
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
### Configuring Email with Gmail
|
||||
|
||||
<div class="mobile-side-scroller">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Setting</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><p><code>Email: Mode</code></p></td>
|
||||
<td><p>
|
||||
|
||||
This should be set to SMTP
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: SMTP Host</code></p></td>
|
||||
<td><p>
|
||||
|
||||
ssl://smtp.gmail.com
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: SMTP Authentication</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Yes
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: SMTP User</code></p></td>
|
||||
<td><p>
|
||||
|
||||
yourgmailaddress@gmail.com
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: SMTP Password</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Gmail password
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: SMTP Port</code></p></td>
|
||||
<td><p>
|
||||
|
||||
465
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Email: Email From</code></p></td>
|
||||
<td><p>
|
||||
|
||||
yourgmailaddress@gmail.com
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
## Developer Settings
|
||||
|
||||
<div class="mobile-side-scroller">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Setting</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><p><code>System: Do not pass JSON in request</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Select Yes if you are having trouble loading data for some tables
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>System: Reset Modules and Permissions</code></p></td>
|
||||
<td><p>
|
||||
|
||||
When this is set to “Yes” IceHrm will reset all values given in System->Permissions module. This setting can be used to reload permissions after adding new permissions to module meta.json file
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>System: Add New Permissions</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Add new permissions without resetting modules
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>System: Debug Mode</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Print debug log messages
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
## Other Settings
|
||||
|
||||
<div class="mobile-side-scroller">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Setting</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><p><code>Leave: Share Calendar to Whole Company</code></p></td>
|
||||
<td><p>
|
||||
|
||||
If "Yes" all the employees of company can see other peoples' leave schedules.
|
||||
If set to "No" only admins and supervisors will be able to see leave schedule of subordinates
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Leave: CC Emails</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Every email sent though leave module will be CC to these comma seperated list of emails addresses
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Leave: BCC Emails</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Every email sent though leave module will be BCC to these comma seperated list of emails addresses
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Attendance: Time-sheet Cross Check</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Only allow users to add an entry to a timesheet only if they have marked atteandance for the selected period
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Recruitment: Show Quick Apply</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Show quick apply button when candidates are applying for jobs. Quick apply allow candidates to apply with minimum amount of information
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p><code>Recruitment: Show Apply</code></p></td>
|
||||
<td><p>
|
||||
|
||||
Show apply button when candidates are applying for jobs
|
||||
|
||||
</p></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
Projects Module
|
||||
---------------
|
||||
|
||||
Projects module is used to add clients, projects and assign projects to employees
|
||||
|
||||
Each and every project is attached to a client. Because of that, ICE Hrm allow adding
|
||||
clients with basic information. Once clients are added, you can start creating project
|
||||
for these clients. The clients section represent both external and internal clients of the company.
|
||||
That way you can attach each and every project to a client.
|
||||
|
||||
###Employee Projects
|
||||
Under employee projects tab you can assign projects to employees. You need to add projects to employees to enable them to add time against
|
||||
these projects in time-sheets.
|
||||
|
||||
Release note v14.0
|
||||
------------------
|
||||
|
||||
### Features
|
||||
* IceHrm is now fully compatible with PHP 7
|
||||
* Improvements to travel management module to change the process of applying for travel requests
|
||||
* New report add for getting travel requests
|
||||
* Improvements to user interface
|
||||
* Bunch of UI improvements including changing menu order and font sizes
|
||||
* Add a setting to use server time for time zone defined on department that a user is attached to create new attendance records
|
||||
* Improvements to admin/manager and user dashboard
|
||||
* Managers allowed to view/add/edit employee documents
|
||||
* New reports added for employee expenses and travel
|
||||
|
||||
### Fixes
|
||||
* Fix unavailable help links
|
||||
|
||||
|
||||
Release note v13.4
|
||||
-----------------
|
||||
|
||||
### Features
|
||||
|
||||
### Fixes
|
||||
* Fix employee leave report leave type field
|
||||
|
||||
Release note v13.0
|
||||
-----------------
|
||||
|
||||
### Features
|
||||
* Recruitment module
|
||||
* Allow managers to edit attendance of direct report employees
|
||||
|
||||
### Fixes
|
||||
* Employee switching issue fixed
|
||||
* Fix terminated employee labels
|
||||
* Fix issue with punch-in
|
||||
|
||||
Release note v12.6
|
||||
-----------------
|
||||
@@ -27,31 +580,38 @@ Release note v12.6
|
||||
### Fixes
|
||||
* Employee switching issue fixed
|
||||
|
||||
Release note v10.2
|
||||
|
||||
Release note v11.1
|
||||
-----------------
|
||||
|
||||
### Features
|
||||
* Add/Edit or remove employee fields
|
||||
|
||||
|
||||
Release note v11.0
|
||||
-----------------
|
||||
|
||||
### Features
|
||||
* Employee data archiving
|
||||
* Leave cancellation requests
|
||||
* Adding view employee feature
|
||||
|
||||
### Fixes
|
||||
* Improvements to date time pickers
|
||||
* Fixing fatal error due to non writable log file
|
||||
* Latest changes from ice-framework v2.0
|
||||
|
||||
|
||||
Release note v10.1
|
||||
-----------------
|
||||
|
||||
### Features
|
||||
* Integration with ice-framework (http://github.com/thilinah/ice-framework)
|
||||
* Travel module
|
||||
* Meta data module
|
||||
* Integration with ice-framework (http://githun.com/thilinah/ice-framework)
|
||||
* Option for only allow users to add an entry to a timesheet only if they have marked atteandance for the selected period
|
||||
* Restricting availability of leave types to employees using leave groups
|
||||
|
||||
### Fixes
|
||||
* Add missing S3FileSystem class
|
||||
* Fix issue: passing result of a method call directly into empty method is not supported in php v5.3
|
||||
|
||||
* Admins and add notes to employees
|
||||
|
||||
Release note v9.1
|
||||
-----------------
|
||||
|
||||
### Fixes
|
||||
* Add missing S3FileSystem class
|
||||
* Fix issue: passing result of a method call directly into empty method is not supported in php v5.3
|
||||
@@ -59,12 +619,14 @@ Release note v9.1
|
||||
|
||||
Release note v9.0
|
||||
-----------------
|
||||
|
||||
### Features
|
||||
* New user interface
|
||||
* Decimal leave counts supported
|
||||
|
||||
Update icehrm v8.4 to v9.0
|
||||
--------------------------
|
||||
|
||||
* Make a backup of your icehrm db
|
||||
* Run db script "icehrmdb_update_v8.4_to_v9.0.sql" which can be found inside script folder of icehrm_v9.0
|
||||
* remove all folders except app folder in icehrm root folder
|
||||
@@ -73,6 +635,7 @@ Update icehrm v8.4 to v9.0
|
||||
|
||||
Release note v8.4
|
||||
-----------------
|
||||
|
||||
### Fixes
|
||||
* Fix leave carry forward rounding issues
|
||||
* Fix issue: select2 default value not getting set for select2
|
||||
@@ -80,102 +643,83 @@ Release note v8.4
|
||||
|
||||
Release note v8.3
|
||||
-----------------
|
||||
|
||||
### Fixes
|
||||
* Fix user table issue on windows, this will resolve errors such as: (Note that this fix has no effect on unix based installations)
|
||||
* Fix user table issue on windows, this will resolve errors such as: (Note that this fix has no effect on unix based installations)
|
||||
* Admin not able to view user uploaded documents
|
||||
* Admin not able to upload documants for users
|
||||
* Admin can not view employee attendance records
|
||||
* Employee projects can not be added
|
||||
|
||||
|
||||
Update icehrm v8.2 to v8.3
|
||||
--------------------------
|
||||
|
||||
Copy server.includes.inc.php from v8.3 to your icehrm folder
|
||||
|
||||
Update icehrm v7.x to v8.0
|
||||
--------------------------
|
||||
Delete all folders except <icehrm>/app directory
|
||||
|
||||
Copy contents of icehrm_v8.0.zip to existing icehrm directory except app directory
|
||||
|
||||
Execute 'icehrmdb_os_update_v7.x_to_v8.0.sql' on your icehrm database
|
||||
|
||||
Update icehrm v7.1 to v7.2
|
||||
--------------------------
|
||||
Download update from https://bitbucket.org/thilina/icehrm-opensource/downloads/icehrm_update_from_7.1_to_7.2.zip
|
||||
|
||||
Unzip icehrm_update_from_7.1_to_7.2.zip inside your icehrm installation
|
||||
|
||||
Update icehrm v6.1 to v7.1
|
||||
--------------------------
|
||||
Delete all folders except <icehrm>/app directory
|
||||
|
||||
Copy contents of icehrm_v7.1.zip to existing icehrm directory except app directory
|
||||
|
||||
Execute 'icehrmdb_os_update_v6.1_to_v7.1.sql' on your icehrm database
|
||||
|
||||
Release note v8.2
|
||||
-----------------
|
||||
|
||||
### Features
|
||||
*Instance verification added
|
||||
* Instance verification added
|
||||
|
||||
Release note v8.1
|
||||
-----------------
|
||||
|
||||
### Fixes
|
||||
*Fixed bug that caused a fatal error in php v5.4
|
||||
*aws2.7.11 phar file replaced by a aws2.7.11 extracted files
|
||||
*old aws sdk removed
|
||||
* Fixed bug that caused a fatal error in php v5.4
|
||||
* aws2.7.11 phar file replaced by a aws2.7.11 extracted files
|
||||
* old aws sdk removed
|
||||
|
||||
Release note v8.0
|
||||
-----------------
|
||||
|
||||
### Features
|
||||
*Admin dashbord module
|
||||
*If the employee joined in current leave period, his leave entitlement is calculated proportional to joined date
|
||||
*Improvements to reporting module
|
||||
*Adding new employee time tracking report
|
||||
*Join date for employees made mandatory
|
||||
*Sending welcome email when a user is added
|
||||
*Let users directly reply to admin user from any email sent out from icehrm
|
||||
*All the users who are not admins must have an employee object attached
|
||||
*Upgrade aws sdk to v2.7.11
|
||||
*Allow employees to change password
|
||||
*Use only the email address defined under user for sending mails
|
||||
*Making work_email and private_email fields optional
|
||||
* Admin dashbord module
|
||||
* If the employee joined in current leave period, his leave entitlement is calculated proportional to joined date
|
||||
* Improvements to reporting module
|
||||
* Adding new employee time tracking report
|
||||
* Join date for employees made mandatory
|
||||
* Sending welcome email when a user is added
|
||||
* Let users directly reply to admin user from any email sent out from icehrm
|
||||
* All the users who are not admins must have an employee object attached
|
||||
* Upgrade aws sdk to v2.7.11
|
||||
* Allow employees to change password
|
||||
* Use only the email address defined under user for sending mails
|
||||
* Making work_email and private_email fields optional
|
||||
|
||||
|
||||
### Fixes
|
||||
*Upload dialog close button issue fixed
|
||||
* Upload dialog close button issue fixed
|
||||
|
||||
Release note v7.2
|
||||
-----------------
|
||||
*Fixes
|
||||
*Some critical vulnerabilities are fixed as recommend by http://zeroscience.mk/en/
|
||||
|
||||
### Fixes
|
||||
* Some critical vulnerabilities are fixed as recommend by http://zeroscience.mk/en/
|
||||
|
||||
Release note v7.1
|
||||
-----------------
|
||||
*Features
|
||||
*Improved company structure graph
|
||||
*Leave notes implementation <20> Supervisor can add a note when approving or rejecting leaves
|
||||
*Filtering support
|
||||
*Select boxes with long lists are now searchable
|
||||
*Add/Edit/Delete company structure permissions added for managers
|
||||
*Add ability to disable employee information editing
|
||||
|
||||
*Fixes
|
||||
*Make loans editable only by admin
|
||||
*Fix: permissions not getting applied to employee documents
|
||||
*Fix error adding employee documents when no user assigned to the admin
|
||||
### Features
|
||||
* Improved company structure graph
|
||||
* Leave notes implementation <20> Supervisor can add a note when approving or rejecting leaves
|
||||
* Filtering support
|
||||
* Select boxes with long lists are now searchable
|
||||
* Add/Edit/Delete company structure permissions added for managers
|
||||
* Add ability to disable employee information editing
|
||||
|
||||
*Code Quality
|
||||
*Moving all module related code and data into module folders
|
||||
### Fixes
|
||||
* Make loans editable only by admin
|
||||
* Fix: permissions not getting applied to employee documents
|
||||
* Fix error adding employee documents when no user assigned to the admin
|
||||
|
||||
### Code Quality
|
||||
* Moving all module related code and data into module folders
|
||||
|
||||
Release note v6.1
|
||||
-----------------
|
||||
|
||||
Leave carry forwared related isue fixed
|
||||
|
||||
Release note v6.0
|
||||
-----------------
|
||||
|
||||
* Features
|
||||
* Notifications for leaves and timesheets
|
||||
* Leave module accrue and leave carry forward
|
||||
@@ -197,11 +741,13 @@ Release note v6.0
|
||||
|
||||
Release note v5.3
|
||||
-----------------
|
||||
|
||||
* Fixes
|
||||
* Fix missing employee name in employee details report
|
||||
|
||||
Release note v5.2
|
||||
-----------------
|
||||
|
||||
* Fixes
|
||||
* Remove unwanted error logs
|
||||
* Fix attendance module employee permission issue
|
||||
@@ -211,12 +757,14 @@ Release note v5.2
|
||||
|
||||
Release note v5.1
|
||||
-----------------
|
||||
|
||||
* Fixes
|
||||
* Fixing for non updating null fields
|
||||
* https://bitbucket.org/thilina/icehrm-opensource/commits/df57308b53484a2e43ef5c72967ed1cd0dc756cc
|
||||
|
||||
Release note v5.0
|
||||
-----------------
|
||||
|
||||
* Features
|
||||
* New user permission implementation
|
||||
* Adding new user level - Manager
|
||||
@@ -226,14 +774,16 @@ Release note v5.0
|
||||
|
||||
Release note v4.2
|
||||
-----------------
|
||||
* Fixes
|
||||
|
||||
### Fixes
|
||||
* https://bitbucket.org/thilina/icehrm-opensource/issue/23/subordinate-leaves-pagination-not-working
|
||||
* https://bitbucket.org/thilina/icehrm-opensource/issue/20/error-occured-while-time-punch
|
||||
|
||||
|
||||
Release note v4.1
|
||||
-----------------
|
||||
* Features
|
||||
|
||||
### Features
|
||||
* Better email format for notifications
|
||||
* Convert upload dialog to a bootstrp model
|
||||
|
||||
|
||||
@@ -117,6 +117,9 @@ AdapterBase.method('addSuccessCallBack', function(callBackData,serverData, callG
|
||||
});
|
||||
|
||||
AdapterBase.method('addFailCallBack', function(callBackData,serverData) {
|
||||
try{
|
||||
this.closePlainMessage();
|
||||
}catch(e){}
|
||||
this.showMessage("Error saving",serverData);
|
||||
this.trackEvent("addFailed",this.tab,this.table);
|
||||
});
|
||||
@@ -513,6 +516,163 @@ IdNameAdapter.method('getFormFields', function() {
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* ApproveAdminAdapter
|
||||
*/
|
||||
|
||||
function ApproveAdminAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
ApproveAdminAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
ApproveAdminAdapter.method('openStatus', function(id,status) {
|
||||
$('#'+this.itemNameLower+'StatusModel').modal('show');
|
||||
$('#'+this.itemNameLower+'_status').val(status);
|
||||
this.statusChangeId = id;
|
||||
});
|
||||
|
||||
ApproveAdminAdapter.method('closeDialog', function() {
|
||||
$('#'+this.itemNameLower+'StatusModel').modal('hide');
|
||||
});
|
||||
|
||||
ApproveAdminAdapter.method('changeStatus', function() {
|
||||
var status = $('#'+this.itemNameLower+'_status').val();
|
||||
var reason = $('#'+this.itemNameLower+'_reason').val();
|
||||
|
||||
if(status == undefined || status == null || status == ""){
|
||||
this.showMessage("Error", "Please select "+this.itemNameLower+" status");
|
||||
return;
|
||||
}
|
||||
|
||||
var object = {"id":this.statusChangeId,"status":status,"reason":reason};
|
||||
|
||||
var reqJson = JSON.stringify(object);
|
||||
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'changeStatusSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'changeStatusFailCallBack';
|
||||
|
||||
this.customAction('changeStatus','admin='+this.modulePathName,reqJson,callBackData);
|
||||
|
||||
this.closeDialog();
|
||||
this.statusChangeId = null;
|
||||
});
|
||||
|
||||
ApproveAdminAdapter.method('changeStatusSuccessCallBack', function(callBackData) {
|
||||
this.showMessage("Successful", this.itemName + " Request status changed successfully");
|
||||
this.get([]);
|
||||
});
|
||||
|
||||
ApproveAdminAdapter.method('changeStatusFailCallBack', function(callBackData) {
|
||||
this.showMessage("Error", "Error occurred while changing "+this.itemName+" request status");
|
||||
});
|
||||
|
||||
|
||||
|
||||
ApproveAdminAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
|
||||
var deleteButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img>';
|
||||
var statusChangeButton = '<img class="tableActionButton" src="_BASE_images/run.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Change Status" onclick="modJs.openStatus(_id_);return false;"></img>';
|
||||
|
||||
var html = '<div style="width:80px;">_edit__delete__status_</div>';
|
||||
|
||||
html = html.replace('_status_',statusChangeButton);
|
||||
|
||||
if(this.showDelete){
|
||||
html = html.replace('_delete_',deleteButton);
|
||||
|
||||
}else{
|
||||
html = html.replace('_delete_','');
|
||||
}
|
||||
|
||||
if(this.showEdit){
|
||||
html = html.replace('_edit_',editButton);
|
||||
}else{
|
||||
html = html.replace('_edit_','');
|
||||
}
|
||||
|
||||
html = html.replace(/_id_/g,id);
|
||||
html = html.replace(/_BASE_/g,this.baseUrl);
|
||||
return html;
|
||||
});
|
||||
|
||||
ApproveAdminAdapter.method('isSubProfileTable', function() {
|
||||
if(this.user.user_level == "Admin"){
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* ApproveModuleAdapter
|
||||
*/
|
||||
|
||||
function ApproveModuleAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
ApproveModuleAdapter.inherits(AdapterBase);
|
||||
|
||||
ApproveModuleAdapter.method('cancelRequest', function(id) {
|
||||
var that = this;
|
||||
var object = {};
|
||||
object['id'] = id;
|
||||
|
||||
var reqJson = JSON.stringify(object);
|
||||
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'cancelSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'cancelFailCallBack';
|
||||
|
||||
this.customAction('cancel','modules='+this.modulePathName,reqJson,callBackData);
|
||||
});
|
||||
|
||||
ApproveModuleAdapter.method('cancelSuccessCallBack', function(callBackData) {
|
||||
this.showMessage("Successful", this.itemName + " cancellation request sent");
|
||||
this.get([]);
|
||||
});
|
||||
|
||||
ApproveModuleAdapter.method('cancelFailCallBack', function(callBackData) {
|
||||
this.showMessage("Error Occurred while cancelling "+this.itemName, callBackData);
|
||||
});
|
||||
|
||||
ApproveModuleAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
|
||||
var deleteButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img>';
|
||||
var requestCancellationButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Cancel '+this.itemName+'" onclick="modJs.cancelRequest(_id_);return false;"></img>';
|
||||
|
||||
var html = '<div style="width:80px;">_edit__delete_</div>';
|
||||
|
||||
if(this.showDelete){
|
||||
if(data[7] == "Approved"){
|
||||
html = html.replace('_delete_',requestCancellationButton);
|
||||
}else{
|
||||
html = html.replace('_delete_',deleteButton);
|
||||
}
|
||||
|
||||
}else{
|
||||
html = html.replace('_delete_','');
|
||||
}
|
||||
|
||||
if(this.showEdit){
|
||||
html = html.replace('_edit_',editButton);
|
||||
}else{
|
||||
html = html.replace('_edit_','');
|
||||
}
|
||||
|
||||
html = html.replace(/_id_/g,id);
|
||||
html = html.replace(/_BASE_/g,this.baseUrl);
|
||||
return html;
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* RequestCache
|
||||
@@ -538,7 +698,16 @@ RequestCache.method('getData', function(key) {
|
||||
|
||||
var strData = localStorage.getItem(key);
|
||||
if(strData != undefined && strData != null && strData != ""){
|
||||
return JSON.parse(strData);
|
||||
data = JSON.parse(strData);
|
||||
if(data == undefined || data == null){
|
||||
return null;
|
||||
}
|
||||
|
||||
if(data.status != undefined && data.status != null && data.status != "SUCCESS"){
|
||||
return null;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -550,6 +719,10 @@ RequestCache.method('setData', function(key, data) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if(data.status != undefined && data.status != null && data.status != "SUCCESS"){
|
||||
return null;
|
||||
}
|
||||
|
||||
var strData = JSON.stringify(data);
|
||||
var strData = localStorage.setItem(key,strData);
|
||||
return strData;
|
||||
|
||||
@@ -411,7 +411,7 @@ IceHRMBase.method('getTableTopButtonHtml', function() {
|
||||
if(html != ""){
|
||||
html += " ";
|
||||
}
|
||||
html+='<button onclick="modJs.showFilters();return false;" class="btn btn-small btn-primary">Fillter <i class="fa fa-filter"></i></button>';
|
||||
html+='<button onclick="modJs.showFilters();return false;" class="btn btn-small btn-primary">Filter <i class="fa fa-filter"></i></button>';
|
||||
html += " ";
|
||||
if(this.filtersAlreadySet){
|
||||
html+='<button id="__id___resetFilters" onclick="modJs.resetFilters();return false;" class="btn btn-small btn-default">__filterString__ <i class="fa fa-times"></i></button>';
|
||||
@@ -445,6 +445,10 @@ IceHRMBase.method('getTableHTMLTemplate', function() {
|
||||
return '<div class="box-body table-responsive"><table cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped" id="grid"></table></div>';
|
||||
});
|
||||
|
||||
IceHRMBase.method('isSortable', function() {
|
||||
return true;
|
||||
});
|
||||
|
||||
/**
|
||||
* Create the data table on provided element id
|
||||
* @method createTable
|
||||
@@ -453,6 +457,9 @@ IceHRMBase.method('getTableHTMLTemplate', function() {
|
||||
|
||||
IceHRMBase.method('createTable', function(elementId) {
|
||||
|
||||
|
||||
var that = this;
|
||||
|
||||
if(this.getRemoteTable()){
|
||||
this.createTableServer(elementId);
|
||||
return;
|
||||
@@ -497,7 +504,7 @@ IceHRMBase.method('createTable', function(elementId) {
|
||||
},
|
||||
"aaData": data,
|
||||
"aoColumns": headers,
|
||||
"bSort": true,
|
||||
"bSort": that.isSortable(),
|
||||
"iDisplayLength": 15,
|
||||
"iDisplayStart": start
|
||||
};
|
||||
@@ -559,7 +566,7 @@ IceHRMBase.method('createTableServer', function(elementId) {
|
||||
"bServerSide": true,
|
||||
"sAjaxSource": that.getDataUrl(that.getDataMapping()),
|
||||
"aoColumns": headers,
|
||||
"bSort": true,
|
||||
"bSort": that.isSortable(),
|
||||
"parent":that,
|
||||
"iDisplayLength": 15,
|
||||
"iDisplayStart": start
|
||||
@@ -683,6 +690,38 @@ IceHRMBase.method('renderModel', function(id,header,body) {
|
||||
$('#'+id+'ModelBody').html(body);
|
||||
});
|
||||
|
||||
|
||||
IceHRMBase.method('renderYesNoModel', function(header,body,yesBtnName,noBtnName,callback, callbackParams) {
|
||||
var that = this;
|
||||
var modelId = "#yesnoModel";
|
||||
|
||||
if(body == undefined || body == null){
|
||||
body = "";
|
||||
}
|
||||
|
||||
$(modelId+'Label').html(header);
|
||||
$(modelId+'Body').html(body);
|
||||
if(yesBtnName != null){
|
||||
$(modelId+'YesBtn').html(yesBtnName);
|
||||
}
|
||||
if(noBtnName != null){
|
||||
$(modelId+'NoBtn').html(noBtnName);
|
||||
}
|
||||
|
||||
$(modelId+'YesBtn').off().on('click',function(){
|
||||
if(callback != undefined && callback != null){
|
||||
callback.apply(that,callbackParams);
|
||||
that.cancelYesno();
|
||||
}
|
||||
});
|
||||
|
||||
$(modelId).modal({
|
||||
backdrop: 'static'
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
IceHRMBase.method('renderModelFromDom', function(id,header,element) {
|
||||
$('#'+id+'ModelBody').html("");
|
||||
|
||||
@@ -746,8 +785,8 @@ IceHRMBase.method('showDomElement', function(title,element,closeCallback,closeCa
|
||||
var that = this;
|
||||
var modelId = "";
|
||||
if(isPlain){
|
||||
modelId = "#plainMessageModel";
|
||||
this.renderModelFromDom('plainMessage',title,element);
|
||||
modelId = "#dataMessageModel";
|
||||
this.renderModelFromDom('dataMessage',title,element);
|
||||
}else{
|
||||
modelId = "#messageModel";
|
||||
this.renderModelFromDom('message',title,element);
|
||||
@@ -781,10 +820,18 @@ IceHRMBase.method('closeMessage', function() {
|
||||
$('#messageModel').modal('hide');
|
||||
});
|
||||
|
||||
IceHRMBase.method('cancelYesno', function() {
|
||||
$('#yesnoModel').modal('hide');
|
||||
});
|
||||
|
||||
IceHRMBase.method('closePlainMessage', function() {
|
||||
$('#plainMessageModel').modal('hide');
|
||||
});
|
||||
|
||||
IceHRMBase.method('closeDataMessage', function() {
|
||||
$('#dataMessageModel').modal('hide');
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* Create or edit an element
|
||||
@@ -1435,7 +1482,7 @@ IceHRMBase.method('addDataGroup', function() {
|
||||
|
||||
$("#"+field[0]+"_div").html(html);
|
||||
|
||||
this.closePlainMessage();
|
||||
this.closeDataMessage();
|
||||
|
||||
}
|
||||
});
|
||||
@@ -1482,7 +1529,7 @@ IceHRMBase.method('editDataGroup', function() {
|
||||
|
||||
$("#"+field[0]+"_div").html(html);
|
||||
|
||||
this.closePlainMessage();
|
||||
this.closeDataMessage();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ define('APP_DB', '_APP_DB_');
|
||||
define('APP_USERNAME', '_APP_USERNAME_');
|
||||
define('APP_PASSWORD', '_APP_PASSWORD_');
|
||||
define('APP_HOST', '_APP_HOST_');
|
||||
define('APP_CON_STR', 'mysql://'.APP_USERNAME.':'.APP_PASSWORD.'@'.APP_HOST.'/'.APP_DB);
|
||||
define('APP_CON_STR', 'mysqli://'.APP_USERNAME.':'.APP_PASSWORD.'@'.APP_HOST.'/'.APP_DB);
|
||||
|
||||
//file upload
|
||||
define('FILE_TYPES', 'jpg,png,jpeg');
|
||||
|
||||
7
src/app/cron.php
Normal file
7
src/app/cron.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
if(php_sapi_name() != 'cli'){
|
||||
exit();
|
||||
}
|
||||
|
||||
include ('config.php');
|
||||
include (APP_BASE_PATH.'crons/cron.php');
|
||||
18
src/app/entry.php
Normal file
18
src/app/entry.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
include ('config.php');
|
||||
if(!isset($_REQUEST['g']) || !isset($_REQUEST['n'])){
|
||||
header("Location:".CLIENT_BASE_URL."login.php");
|
||||
exit();
|
||||
}
|
||||
$group = $_REQUEST['g'];
|
||||
$name= $_REQUEST['n'];
|
||||
|
||||
$groups = array('admin','modules');
|
||||
|
||||
if($group == 'admin' || $group == 'modules'){
|
||||
$name = str_replace("..","",$name);
|
||||
$name = str_replace("/","",$name);
|
||||
include APP_BASE_PATH.'/'.$group.'/'.$name.'/entry.php';
|
||||
}else{
|
||||
exit();
|
||||
}
|
||||
@@ -21,7 +21,7 @@ $action = $_REQUEST['action'];
|
||||
|
||||
if($action == "TEST_DB"){
|
||||
|
||||
$db = NewADOConnection('mysql');
|
||||
$db = NewADOConnection('mysqli');
|
||||
$res = $db->Connect($_REQUEST["APP_HOST"], $_REQUEST["APP_USERNAME"], $_REQUEST["APP_PASSWORD"], $_REQUEST["APP_DB"]);
|
||||
|
||||
if (!$res){
|
||||
@@ -72,7 +72,7 @@ if($action == "TEST_DB"){
|
||||
|
||||
$con = mysql_connect($_REQUEST["APP_HOST"],$_REQUEST["APP_USERNAME"],$_REQUEST["APP_PASSWORD"]);
|
||||
|
||||
$db = NewADOConnection('mysql');
|
||||
$db = NewADOConnection('mysqli');
|
||||
$res = $db->Connect($_REQUEST["APP_HOST"], $_REQUEST["APP_USERNAME"], $_REQUEST["APP_PASSWORD"], $_REQUEST["APP_DB"]);
|
||||
|
||||
|
||||
|
||||
18
src/app/update.php
Normal file
18
src/app/update.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
include ('config.php');
|
||||
if(!isset($_REQUEST['g']) || !isset($_REQUEST['n'])){
|
||||
header("Location:".CLIENT_BASE_URL."login.php");
|
||||
exit();
|
||||
}
|
||||
$group = $_REQUEST['g'];
|
||||
$name= $_REQUEST['n'];
|
||||
|
||||
$groups = array('admin','modules');
|
||||
|
||||
if($group == 'admin' || $group == 'modules'){
|
||||
$name = str_replace("..","",$name);
|
||||
$name = str_replace("/","",$name);
|
||||
include APP_BASE_PATH.'/'.$group.'/'.$name.'/update.php';
|
||||
}else{
|
||||
exit();
|
||||
}
|
||||
@@ -61,6 +61,11 @@ abstract class AbstractModuleManager{
|
||||
public abstract function setupModuleClassDefinitions();
|
||||
|
||||
|
||||
public function getDashboardItem(){
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public function setupRestEndPoints(){
|
||||
|
||||
}
|
||||
|
||||
218
src/classes/ApproveActionManager.php
Normal file
218
src/classes/ApproveActionManager.php
Normal file
@@ -0,0 +1,218 @@
|
||||
<?php
|
||||
abstract class ApproveAdminActionManager extends SubActionManager{
|
||||
|
||||
public abstract function getModelClass();
|
||||
public abstract function getItemName();
|
||||
public abstract function getModuleName();
|
||||
public abstract function getModuleTabUrl();
|
||||
|
||||
public function changeStatus($req){
|
||||
|
||||
$class = $this->getModelClass();
|
||||
$itemName = $this->getItemName();
|
||||
|
||||
|
||||
$obj = new $class();
|
||||
$obj->Load("id = ?",array($req->id));
|
||||
|
||||
if($obj->id != $req->id){
|
||||
return new IceResponse(IceResponse::ERROR,"$itemName not found");
|
||||
}
|
||||
|
||||
if($this->user->user_level != 'Admin' && $this->user->user_level != 'Manager'){
|
||||
return new IceResponse(IceResponse::ERROR,"Only an admin or manager can do this");
|
||||
}
|
||||
|
||||
$oldStatus = $obj->status;
|
||||
$obj->status = $req->status;
|
||||
$ok = $obj->Save();
|
||||
if(!$ok){
|
||||
LogManager::getInstance()->info($obj->ErrorMsg());
|
||||
return new IceResponse(IceResponse::ERROR,"Error occurred while saving $itemName information. Please contact admin");
|
||||
}
|
||||
|
||||
$this->baseService->audit(IceConstants::AUDIT_ACTION, "$itemName status changed from:".$oldStatus." to:".$obj->status." id:".$obj->id);
|
||||
|
||||
$currentEmpId = $this->getCurrentProfileId();
|
||||
|
||||
if(!empty($currentEmpId)){
|
||||
$employee = $this->baseService->getElement('Employee',$currentEmpId);
|
||||
|
||||
$notificationMsg = "Your $itemName has been $obj->status by ".$employee->first_name." ".$employee->last_name;
|
||||
if(!empty($req->reason)){
|
||||
$notificationMsg.=" (Note:".$req->reason.")";
|
||||
}
|
||||
|
||||
$this->baseService->notificationManager->addNotification($obj->employee,$notificationMsg,'{"type":"url","url":"'.$this->getModuleTabUrl().'"}',$this->getModuleName(), null, false, true);
|
||||
|
||||
}
|
||||
|
||||
|
||||
return new IceResponse(IceResponse::SUCCESS,"");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
abstract class ApproveModuleActionManager extends SubActionManager{
|
||||
|
||||
public abstract function getModelClass();
|
||||
public abstract function getItemName();
|
||||
public abstract function getModuleName();
|
||||
public abstract function getModuleTabUrl();
|
||||
|
||||
public function cancel($req){
|
||||
|
||||
$employee = $this->baseService->getElement('Employee',$this->getCurrentProfileId(),null,true);
|
||||
|
||||
$class = $this->getModelClass();
|
||||
$itemName = $this->getItemName();
|
||||
$obj = new $class();
|
||||
$obj->Load("id = ?",array($req->id));
|
||||
if($obj->id != $req->id){
|
||||
return new IceResponse(IceResponse::ERROR,"$itemName record not found");
|
||||
}
|
||||
|
||||
|
||||
if($this->user->user_level != 'Admin' && $this->getCurrentProfileId() != $obj->employee){
|
||||
return new IceResponse(IceResponse::ERROR,"Only an admin or owner of the $itemName can do this");
|
||||
}
|
||||
|
||||
if($obj->status != 'Approved'){
|
||||
return new IceResponse(IceResponse::ERROR,"Only an approved $itemName can be cancelled");
|
||||
}
|
||||
|
||||
$obj->status = 'Cancellation Requested';
|
||||
$ok = $obj->Save();
|
||||
if(!$ok){
|
||||
LogManager::getInstance()->error("Error occurred while cancelling the $itemName:".$obj->ErrorMsg());
|
||||
return new IceResponse(IceResponse::ERROR,"Error occurred while cancelling the $itemName. Please contact admin.");
|
||||
}
|
||||
|
||||
|
||||
$this->baseService->audit(IceConstants::AUDIT_ACTION, "Expense cancellation | start:".$obj->date_start."| end:".$obj->date_end);
|
||||
$notificationMsg = $employee->first_name." ".$employee->last_name." cancelled a expense. Visit expense management module to approve";
|
||||
|
||||
$this->baseService->notificationManager->addNotification($employee->supervisor,$notificationMsg,'{"type":"url","url":"'.$this->getModuleTabUrl().'"}',
|
||||
$this->getModuleTabUrl(), null, false, true);
|
||||
return new IceResponse(IceResponse::SUCCESS,$obj);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
class ApproveModel extends ICEHRM_Record {
|
||||
|
||||
public function executePreSaveActions($obj){
|
||||
$preApprove = SettingsManager::getInstance()->getSetting($this->preApproveSettingName);
|
||||
$sendNotificationEmail = true;
|
||||
if(empty($obj->status)){
|
||||
if($preApprove == "1"){
|
||||
$obj->status = "Approved";
|
||||
$sendNotificationEmail = false;
|
||||
}else{
|
||||
$obj->status = "Pending";
|
||||
}
|
||||
}
|
||||
|
||||
if($preApprove){
|
||||
return new IceResponse(IceResponse::SUCCESS,$obj);
|
||||
}
|
||||
|
||||
$currentEmpId = BaseService::getInstance()->getCurrentProfileId();
|
||||
|
||||
//Auto approve if the current user is an admin
|
||||
|
||||
if(!empty($currentEmpId)){
|
||||
$employee = BaseService::getInstance()->getElement('Employee',$currentEmpId);
|
||||
|
||||
if(!empty($employee->supervisor)) {
|
||||
$notificationMsg = "A new ".$this->notificationUnitName." has been added by " . $employee->first_name . " " . $employee->last_name . ". Please visit ".$this->notificationModuleName." module to review it";
|
||||
|
||||
BaseService::getInstance()->notificationManager->addNotification($employee->supervisor, $notificationMsg, '{"type":"url","url":"'.$this->notificationUnitAdminUrl.'"}', $this->notificationModuleName, null, false, $sendNotificationEmail);
|
||||
}else{
|
||||
|
||||
$user = BaseService::getInstance()->getCurrentUser();
|
||||
|
||||
if($user->user_level == "Admin"){
|
||||
//Auto approve
|
||||
$obj->status = "Approved";
|
||||
$notificationMsg = "Your ".$this->notificationUnitName." is auto approved since you are an administrator and do not have any supervisor assigned";
|
||||
BaseService::getInstance()->notificationManager->addNotification(null, $notificationMsg, '{"type":"url","url":"'.$this->notificationUnitAdminUrl.'"}', $this->notificationModuleName, $user->id, false, $sendNotificationEmail);
|
||||
}else{
|
||||
//If the user do not have a supervisor, notify all admins
|
||||
$admins = BaseService::getInstance()->getAllAdmins();
|
||||
foreach($admins as $admin){
|
||||
$notificationMsg = "A new ".$this->notificationUnitName." has been added by " . $employee->first_name . " " . $employee->last_name . ". Please visit ".$this->notificationModuleName." module to review it. You are getting this notification since you are an administrator and the user do not have any supervisor assigned.";
|
||||
BaseService::getInstance()->notificationManager->addNotification(null, $notificationMsg, '{"type":"url","url":"'.$this->notificationUnitAdminUrl.'"}', $this->notificationModuleName, $admin->id, false, $sendNotificationEmail);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return new IceResponse(IceResponse::SUCCESS,$obj);
|
||||
}
|
||||
|
||||
public function executePreUpdateActions($obj){
|
||||
|
||||
$preApprove = SettingsManager::getInstance()->getSetting($this->preApproveSettingName);
|
||||
$sendNotificationEmail = true;
|
||||
|
||||
$fieldsToCheck = $this->fieldsNeedToBeApproved();
|
||||
|
||||
$travelRequest = new EmployeeTravelRecord();
|
||||
$travelRequest->Load('id = ?',array($obj->id));
|
||||
|
||||
$needToApprove = false;
|
||||
if($preApprove != "1"){
|
||||
foreach($fieldsToCheck as $field){
|
||||
if($obj->$field != $travelRequest->$field) {
|
||||
$needToApprove = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
$sendNotificationEmail = false;
|
||||
}
|
||||
|
||||
if($preApprove){
|
||||
return new IceResponse(IceResponse::SUCCESS,$obj);
|
||||
}
|
||||
|
||||
if($needToApprove && $obj->status != 'Pending'){
|
||||
$currentEmpId = BaseService::getInstance()->getCurrentProfileId();
|
||||
|
||||
//Auto approve if the current user is an admin
|
||||
|
||||
if(!empty($currentEmpId)){
|
||||
$employee = BaseService::getInstance()->getElement('Employee',$currentEmpId);
|
||||
|
||||
if(!empty($employee->supervisor)) {
|
||||
$notificationMsg = $this->notificationUnitPrefix." ".$this->notificationUnitName." has been updated by " . $employee->first_name . " " . $employee->last_name . ". Please visit ".$this->notificationModuleName." module to review it";
|
||||
|
||||
BaseService::getInstance()->notificationManager->addNotification($employee->supervisor, $notificationMsg, '{"type":"url","url":"'.$this->notificationUnitAdminUrl.'"}', $this->notificationModuleName, null, false, $sendNotificationEmail);
|
||||
}else{
|
||||
|
||||
$user = BaseService::getInstance()->getCurrentUser();
|
||||
|
||||
if($user->user_level == "Admin"){
|
||||
|
||||
}else{
|
||||
//If the user do not have a supervisor, notify all admins
|
||||
$admins = BaseService::getInstance()->getAllAdmins();
|
||||
foreach($admins as $admin){
|
||||
$notificationMsg = $this->notificationUnitPrefix." ".$this->notificationUnitName." request has been updated by " . $employee->first_name . " " . $employee->last_name . ". Please visit ".$this->notificationModuleName." module to review it. You are getting this notification since you are an administrator and the user do not have any supervisor assigned.";
|
||||
BaseService::getInstance()->notificationManager->addNotification(null, $notificationMsg, '{"type":"url","url":"g=admin&n=travel&m=admin_Employees"}', "Travel Module", $admin->id, false, $sendNotificationEmail);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new IceResponse(IceResponse::SUCCESS,$obj);
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,7 @@ Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilin
|
||||
* of the tasks related to retriving and saving data. This can be referred within any module using
|
||||
* BaseService::getInstance()
|
||||
*
|
||||
@class BaseService
|
||||
@class BaseService
|
||||
*/
|
||||
|
||||
class BaseService{
|
||||
@@ -1022,7 +1022,7 @@ class BaseService{
|
||||
}
|
||||
|
||||
public function getGAKey(){
|
||||
return "";
|
||||
return SettingsManager::getInstance()->getSetting('Analytics: Google Key');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1103,6 +1103,30 @@ class BaseService{
|
||||
$data = $customField->Find("type = ?",array($type));
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function getAllAdmins(){
|
||||
$user = new User();
|
||||
$admins = $user->Find('user_level = ?',array('Admin'));
|
||||
return $admins;
|
||||
}
|
||||
|
||||
public function getCurrentEmployeeTimeZone(){
|
||||
$cemp = $this->getCurrentProfileId();
|
||||
if(empty($cemp)){
|
||||
return NULL;
|
||||
}
|
||||
$emp = new Employee();
|
||||
$emp->Load("id = ?",array($cemp));
|
||||
if(empty($emp->id) || empty($emp->department)){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
$dept = new CompanyStructure();
|
||||
$dept->Load("id = ?",array($emp->department));
|
||||
|
||||
return $dept->timezone;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class IceConstants{
|
||||
|
||||
@@ -6,7 +6,7 @@ class CronUtils{
|
||||
private static $me = null;
|
||||
|
||||
private function __construct($clientBasePath, $cronFile){
|
||||
$this->clientBasePath = $clientBasePath;
|
||||
$this->clientBasePath = $clientBasePath."/";
|
||||
$this->cronFile = $cronFile;
|
||||
}
|
||||
|
||||
@@ -20,13 +20,177 @@ class CronUtils{
|
||||
|
||||
public function run(){
|
||||
$ams = scandir($this->clientBasePath);
|
||||
|
||||
$count = 0;
|
||||
foreach($ams as $am){
|
||||
if(is_dir($this->clientBasePath.$am) && $am != '.' && $am != '..'){
|
||||
$command = "php ".$this->cronFile." -c".$this->clientBasePath.$am;
|
||||
//$command = "php ".$this->cronFile." -c".$this->clientBasePath.$am;
|
||||
$command = "php ".$this->clientBasePath.$am."/".$this->cronFile;
|
||||
echo "Run:".$command."\r\n";
|
||||
passthru($command, $res);
|
||||
echo "Result :".$res."\r\n";
|
||||
|
||||
$count++;
|
||||
if($count > 25){
|
||||
sleep(1);
|
||||
$count = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class IceCron{
|
||||
|
||||
const MINUTELY = "Minutely";
|
||||
const HOURLY = "Hourly";
|
||||
const DAILY = "Daily";
|
||||
const WEEKLY = "Weekly";
|
||||
const MONTHLY = "Monthly";
|
||||
const YEARLY = "Yearly";
|
||||
|
||||
private $cron;
|
||||
|
||||
public function __construct($cron){
|
||||
$this->cron = $cron;
|
||||
}
|
||||
|
||||
public function isRunNow(){
|
||||
LogManager::getInstance()->debug("Cron ".print_r($this->cron,true));
|
||||
$lastRunTime = $this->cron->lastrun;
|
||||
if(empty($lastRunTime)){
|
||||
LogManager::getInstance()->debug("Cron ".$this->cron->name." is running since last run time is empty");
|
||||
return true;
|
||||
}
|
||||
|
||||
$type = $this->cron->type;
|
||||
$frequency = intval($this->cron->frequency);
|
||||
$time = intval($this->cron->time);
|
||||
|
||||
if(empty($frequency) || !is_int($frequency)){
|
||||
LogManager::getInstance()->debug("Cron ".$this->cron->name." is not running since frequency is not an integer");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if($type == self::MINUTELY){
|
||||
|
||||
$diff = (strtotime("now") - strtotime($lastRunTime));
|
||||
if(empty($this->time) || !is_int($time)){
|
||||
if($diff > 60){
|
||||
return true;
|
||||
}
|
||||
}else{
|
||||
if($diff > 60 * $time){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}else if($type == self::HOURLY){
|
||||
if(empty($time) || !is_int($time)){
|
||||
|
||||
if(date('H') != date('H',strtotime($lastRunTime))){
|
||||
return true;
|
||||
}
|
||||
}else{
|
||||
if(intval(date('m')) <= intval($time) && date('H') != date('H',strtotime($lastRunTime))){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}else if($type == self::DAILY){
|
||||
if(empty($time) || !is_int($time)){
|
||||
|
||||
if(date('d') != date('d',strtotime($lastRunTime))){
|
||||
return true;
|
||||
}
|
||||
}else{
|
||||
if(intval(date('H')) <= intval($time) && date('d') != date('d',strtotime($lastRunTime))){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}else if($type == self::MONTHLY){
|
||||
if(empty($time) || !is_int($time)){
|
||||
|
||||
if(date('m') != date('m',strtotime($lastRunTime))){
|
||||
return true;
|
||||
}
|
||||
}else{
|
||||
if(intval(date('d')) <= intval($time) && date('m') != date('m',strtotime($lastRunTime))){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}else if($type == self::YEARLY){
|
||||
if(empty($time) || !is_int($time)){
|
||||
if(date('Y') != date('Y',strtotime($lastRunTime))){
|
||||
return true;
|
||||
}
|
||||
}else{
|
||||
if(intval(date('m')) <= intval($time) && date('Y') != date('Y',strtotime($lastRunTime))){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function execute(){
|
||||
$class = $this->cron->class;
|
||||
$obj = new $class();
|
||||
$obj->execute($this->cron);
|
||||
$this->cronCompleted();
|
||||
}
|
||||
|
||||
|
||||
private function cronCompleted(){
|
||||
$this->cron->lastrun = date("Y-m-d H:i:s");
|
||||
$ok = $this->cron->Save();
|
||||
if(!$ok){
|
||||
LogManager::getInstance()->error("Error saving cron due to :".$this->cron->ErrorMsg());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
interface IceTask{
|
||||
public function execute($cron);
|
||||
}
|
||||
|
||||
abstract class EmailIceTask implements IceTask{
|
||||
public abstract function execute($cron);
|
||||
|
||||
public function sendEmployeeEmails($emailList, $subject){
|
||||
|
||||
|
||||
foreach($emailList as $employeeId => $emailData){
|
||||
$ccList = array();
|
||||
if(SettingsManager::getInstance()->getSetting('Notifications: Copy Document Expiry Emails to Manager') == '1'){
|
||||
$employee = new Employee();
|
||||
$employee->Load("id = ?",array($employeeId));
|
||||
if(!empty($employee->supervisor)){
|
||||
$supperuser = BaseService::getInstance()->getUserFromProfileId($employee->supervisor);
|
||||
if(!empty($supperuser)){
|
||||
$ccList[] = $supperuser->email;
|
||||
}
|
||||
}
|
||||
}
|
||||
$user = BaseService::getInstance()->getUserFromProfileId($employeeId);
|
||||
if(!empty($user) && !empty($user->email)){
|
||||
$email = new IceEmail();
|
||||
$email->subject = $subject;
|
||||
$email->toEmail = $user->email;
|
||||
$email->template = $emailData;
|
||||
$email->params = '[]';
|
||||
$email->cclist = json_encode($ccList);
|
||||
$email->bcclist = '[]';
|
||||
$email->status = 'Pending';
|
||||
$email->created = date('Y-m-d H:i:s');
|
||||
$email->updated = date('Y-m-d H:i:s');
|
||||
$ok = $email->Save();
|
||||
if(!$ok){
|
||||
LogManager::getInstance()->error("Error Saving Email: ".$email->ErrorMsg());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,56 @@ abstract class EmailSender{
|
||||
$this->settings = $settings;
|
||||
}
|
||||
|
||||
public function sendEmailFromNotification($notification){
|
||||
$toEmail = null;
|
||||
$user = new User();
|
||||
$user->Load("id = ?",array($notification->toUser));
|
||||
|
||||
if(!empty($user->email)){
|
||||
$name = "User";
|
||||
$employee = new Employee();
|
||||
$employee->Load("id = ?",array($user->employee));
|
||||
if($employee->id == $user->employee && !empty($employee->id)){
|
||||
$name = $employee->first_name;
|
||||
}
|
||||
|
||||
$action = json_decode($notification->action);
|
||||
|
||||
$emailBody = file_get_contents(APP_BASE_PATH.'/templates/email/notificationEmail.html');
|
||||
$emailBody = str_replace("#_user_#", $name, $emailBody);
|
||||
$emailBody = str_replace("#_message_#", $notification->message, $emailBody);
|
||||
if($action->type == "url"){
|
||||
$emailBody = str_replace("#_url_#", CLIENT_BASE_URL."?".$action->url, $emailBody);
|
||||
}
|
||||
$this->sendEmail('IceHrm Notification from '.$notification->type,
|
||||
$user->email,
|
||||
$emailBody,
|
||||
array(),
|
||||
array(),
|
||||
array()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public function sendEmailFromDB($email){
|
||||
$params = array();
|
||||
if(!empty($email->params)){
|
||||
$params = json_decode($email->params, true);
|
||||
}
|
||||
|
||||
$cclist = array();
|
||||
if(!empty($email->cclist)){
|
||||
$cclist = json_decode($email->cclist, true);
|
||||
}
|
||||
|
||||
$bcclist = array();
|
||||
if(!empty($email->bcclist)){
|
||||
$bcclist = json_decode($email->bcclist, true);
|
||||
}
|
||||
|
||||
$resp = $this->sendEmail($email->subject, $email->toEmail, $email->template, $params, $cclist, $bcclist);
|
||||
}
|
||||
|
||||
public function sendEmail($subject, $toEmail, $template, $params, $ccList = array(), $bccList = array()){
|
||||
|
||||
$body = $template;
|
||||
@@ -225,7 +275,7 @@ class SMTPEmailSender extends EmailSender{
|
||||
$mail = $smtp->send($toEmail, $headers, $body);
|
||||
|
||||
|
||||
return true;
|
||||
return $mail;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -255,6 +305,6 @@ class PHPMailer extends EmailSender{
|
||||
|
||||
LogManager::getInstance()->info("PHP mailer result : ".$res);
|
||||
|
||||
return true;
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
@@ -12,8 +12,8 @@ class ReportHandler{
|
||||
return $this->executeReport($report,$query,$where[1]);
|
||||
}else if($report->type == 'Class'){
|
||||
$className = $report->query;
|
||||
include MODULE_PATH.'/reportClasses/ReportBuilder.php';
|
||||
include MODULE_PATH.'/reportClasses/'.$className.".php";
|
||||
include APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
include APP_BASE_PATH.'admin/reports/reportClasses/'.$className.".php";
|
||||
$cls = new $className();
|
||||
$data = $cls->getData($report,$request);
|
||||
return $this->generateReport($report,$data);
|
||||
|
||||
@@ -153,10 +153,27 @@ class UIManager{
|
||||
}
|
||||
|
||||
if($this->user->user_level == "Admin"){
|
||||
|
||||
$reg = '';
|
||||
$num = '';
|
||||
if(class_exists('ProVersion')){
|
||||
$pro = new ProVersion();
|
||||
if(!empty($pro->employeeLimit)){
|
||||
$num = "<br/>Employee Limit: ".$pro->employeeLimit;
|
||||
}
|
||||
|
||||
if(method_exists($pro,'getRegisteredTo')){
|
||||
$reg = "<br/>Registered To: ".$pro->getRegisteredTo();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$manuItems[] = new MenuItemTemplate('menuButtonHelp', array(
|
||||
"APP_NAME"=>APP_NAME,
|
||||
"VERSION"=>VERSION,
|
||||
"VERSION_DATE"=>VERSION_DATE
|
||||
"VERSION_DATE"=>VERSION_DATE,
|
||||
"REG"=>$reg,
|
||||
"NUM"=>$num
|
||||
));
|
||||
}
|
||||
|
||||
@@ -199,6 +216,23 @@ class UIManager{
|
||||
return $str;
|
||||
}
|
||||
|
||||
|
||||
public function getCompanyLogoUrl(){
|
||||
$logoFileSet = false;
|
||||
$logoFileName = CLIENT_BASE_PATH."data/logo.png";
|
||||
$logoSettings = SettingsManager::getInstance()->getSetting("Company: Logo");
|
||||
if(!empty($logoSettings)){
|
||||
$logoFileName = FileService::getInstance()->getFileUrl($logoSettings);
|
||||
$logoFileSet = true;
|
||||
}
|
||||
|
||||
if(!$logoFileSet && !file_exists($logoFileName)){
|
||||
return BASE_URL."images/logo.png";
|
||||
}
|
||||
|
||||
return $logoFileName;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
23
src/common.cron.tasks.php
Normal file
23
src/common.cron.tasks.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
class EmailSenderTask implements IceTask{
|
||||
public function execute($cron){
|
||||
$email = new IceEmail();
|
||||
$emails = $email->Find("status = ? limit 10",array('Pending'));
|
||||
$emailSender = BaseService::getInstance()->getEmailSender();
|
||||
foreach($emails as $email){
|
||||
try{
|
||||
$emailSender->sendEmailFromDB($email);
|
||||
}catch(Exception $e){
|
||||
LogManager::getInstance()->error("Error sending email:".$e->getMessage());
|
||||
}
|
||||
|
||||
$email->status = 'Sent';
|
||||
$email->updated = date('Y-m-d H:i:s');
|
||||
$email->Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
include('common.cron.tasks.ext.php');
|
||||
@@ -9,4 +9,4 @@ if(!defined('SIGN_IN_ELEMENT_MAPPING_FIELD_NAME')){define('SIGN_IN_ELEMENT_MAPPI
|
||||
|
||||
if(!defined('CONTACT_EMAIL')){define('CONTACT_EMAIL','ice-framework@gamonoid.com');}
|
||||
if(!defined('KEY_PREFIX')){define('KEY_PREFIX','iCEf');}
|
||||
if(!defined('APP_SEC')){define('APP_SEC','4dcxswfrds');}
|
||||
if(!defined('APP_SEC')){define('APP_SEC','4dcxudersqw');}
|
||||
22
src/crons/cron.php
Normal file
22
src/crons/cron.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
include dirname(__FILE__).'/include.cron.php';
|
||||
|
||||
$cron = new Cron();
|
||||
$crons = $cron->Find("status = ?",array('Enabled'));
|
||||
|
||||
if(!$crons){
|
||||
LogManager::getInstance()->info(CLIENT_NAME." error :".$cron->ErrorMsg());
|
||||
}
|
||||
|
||||
LogManager::getInstance()->info(CLIENT_NAME." cron count :".count($crons));
|
||||
foreach($crons as $cron){
|
||||
$count++;
|
||||
$iceCron = new IceCron($cron);
|
||||
LogManager::getInstance()->info(CLIENT_NAME." check cron :".$cron->name);
|
||||
if($iceCron->isRunNow()){
|
||||
LogManager::getInstance()->info(CLIENT_NAME." execute cron :".$cron->name);
|
||||
$iceCron->execute();
|
||||
sleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ $basePath = $opts['p'];
|
||||
|
||||
include (dirname(__FILE__)."/../classes/CronUtils.php");
|
||||
|
||||
$cronUtils = CronUtils::getInstance($basePath, dirname(__FILE__)."/".$file);
|
||||
$cronUtils = CronUtils::getInstance($basePath, $file);
|
||||
|
||||
echo "Cron Runner created \r\n";
|
||||
|
||||
|
||||
@@ -2,14 +2,10 @@
|
||||
if(php_sapi_name() != 'cli'){
|
||||
exit();
|
||||
}
|
||||
$opts = getopt('c:');
|
||||
$clientPath = $opts['c'];
|
||||
|
||||
if(empty($clientPath)){
|
||||
echo "No client path defined\r\n";
|
||||
exit();
|
||||
}
|
||||
define('CLIENT_PATH',dirname(__FILE__)."/..");
|
||||
|
||||
include (APP_BASE_PATH."config.base.php");
|
||||
|
||||
include $clientPath."/config.php";
|
||||
include (APP_BASE_PATH."include.common.php");
|
||||
include("server.includes.inc.php");
|
||||
include(APP_BASE_PATH."server.includes.inc.php");
|
||||
@@ -407,7 +407,7 @@ table.dataTable{
|
||||
-webkit-border-radius: 0px;
|
||||
-moz-border-radius: 0px;
|
||||
border-radius: 0px;
|
||||
|
||||
box-shadow: 0 1px 1px rgba(0,0,0,.12),0 1px 1px rgba(0,0,0,.24);
|
||||
}
|
||||
|
||||
|
||||
@@ -457,6 +457,13 @@ table.dataTable{
|
||||
background: #FFF;
|
||||
}
|
||||
|
||||
/*
|
||||
@media (min-width:1025px) {
|
||||
.content {
|
||||
min-height: 1100px;
|
||||
}
|
||||
}*/
|
||||
|
||||
.wrapper {
|
||||
background: #FFF;
|
||||
}
|
||||
@@ -481,6 +488,16 @@ table.dataTable{
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*custom for v11.0 */
|
||||
|
||||
|
||||
.table-bordered>thead>tr>th{
|
||||
border:none !important;
|
||||
}
|
||||
@@ -499,9 +516,11 @@ table.dataTable{
|
||||
box-shadow: 0 1px 2px 0 rgba(0,0,0,.2);
|
||||
}
|
||||
|
||||
.reviewBlock{
|
||||
.reviewBlock{/*
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box
|
||||
box-sizing: border-box*/
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24);
|
||||
border: none;
|
||||
}
|
||||
|
||||
.treeview-menu li:hover{
|
||||
@@ -589,3 +608,47 @@ table.dataTable{
|
||||
.fc-toolbar h2{
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.navbar, .right-side{
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24);
|
||||
border: none;
|
||||
}
|
||||
|
||||
.right-side{
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.sidebar .sidebar-menu {
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24);
|
||||
border: none;
|
||||
background: #FFF;
|
||||
}
|
||||
|
||||
.treeview.active{
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24);
|
||||
border: none;
|
||||
background: #FFF;
|
||||
}
|
||||
|
||||
.sidebar .sidebar-menu .treeview-menu > li {
|
||||
background: #FFF;
|
||||
}
|
||||
|
||||
.skin-blue .sidebar > .sidebar-menu > li > a:hover, .skin-blue .sidebar > .sidebar-menu > li.active > a {
|
||||
color: #222;
|
||||
background: #fff !important;
|
||||
}
|
||||
|
||||
.right-side > .content-header > h1 > small {
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.panel {
|
||||
border-radius: 0px;
|
||||
-moz-border-radius: 0px;
|
||||
-webkit-border-radius: 0px;
|
||||
}
|
||||
49
src/entry_footer.php
Normal file
49
src/entry_footer.php
Normal file
@@ -0,0 +1,49 @@
|
||||
</section><!-- /.content -->
|
||||
</aside><!-- /.right-side -->
|
||||
</div><!-- ./wrapper -->
|
||||
<script type="text/javascript">
|
||||
|
||||
|
||||
|
||||
for (var prop in modJsList) {
|
||||
if(modJsList.hasOwnProperty(prop)){
|
||||
modJsList[prop].setPermissions(<?=json_encode($modulePermissions['perm'])?>);
|
||||
modJsList[prop].setFieldTemplates(<?=json_encode($fieldTemplates)?>);
|
||||
modJsList[prop].setTemplates(<?=json_encode($templates)?>);
|
||||
modJsList[prop].setCustomTemplates(<?=json_encode($customTemplates)?>);
|
||||
<?php if(isset($emailTemplates)){?>
|
||||
modJsList[prop].setEmailTemplates(<?=json_encode($emailTemplates)?>);
|
||||
<?php } ?>
|
||||
modJsList[prop].setUser(<?=json_encode($user)?>);
|
||||
//Test
|
||||
<?php if(isset($_REQUEST['action']) && $_REQUEST['action'] == "new"){?>
|
||||
if(modJsList[prop].newInitObject == undefined || modJsList[prop].newInitObject == null){
|
||||
modJsList[prop].initFieldMasterData(null,modJsList[prop].renderForm);
|
||||
}else{
|
||||
modJsList[prop].initFieldMasterData(null,modJsList[prop].renderForm, modJsList[prop].newInitObject);
|
||||
}
|
||||
<?php }else{?>
|
||||
modJsList[prop].initFieldMasterData(null, modJs.loadingFunction);
|
||||
<?php }?>
|
||||
modJsList[prop].setBaseUrl('<?=BASE_URL?>');
|
||||
modJsList[prop].setCurrentProfile(<?=json_encode($activeProfile)?>);
|
||||
modJsList[prop].setInstanceId('<?=$baseService->getInstanceId()?>');
|
||||
modJsList[prop].setNoJSONRequests('<?=$noJSONRequests?>');
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//Other static js objects
|
||||
|
||||
var timeUtils = new TimeUtils();
|
||||
timeUtils.setServerGMToffset('<?=$diffHoursBetweenServerTimezoneWithGMT?>');
|
||||
|
||||
var clientUrl = '<?=CLIENT_BASE_URL?>';
|
||||
|
||||
</script>
|
||||
<?php include 'popups.php';?>
|
||||
<?php include APP_BASE_PATH.'js/bootstrapDataTable.php';?>
|
||||
</body>
|
||||
</html>
|
||||
91
src/entry_header.php
Normal file
91
src/entry_header.php
Normal file
@@ -0,0 +1,91 @@
|
||||
<?php
|
||||
$logoFileName = CLIENT_BASE_PATH."data/logo.png";
|
||||
$logoFileUrl = CLIENT_BASE_URL."data/logo.png";
|
||||
if(!file_exists($logoFileName)){
|
||||
$logoFileUrl = BASE_URL."images/logo.png";
|
||||
}
|
||||
?><!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title><?=$meta->title?></title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<link rel="image_src" href="<?=!empty($meta->imageUrl)?$meta->imageUrl:$logoFileUrl?>"/>
|
||||
<meta property="og:image" content="<?=!empty($meta->imageUrl)?$meta->imageUrl:$logoFileUrl?>"/>
|
||||
<meta property="og:url" content="<?=$meta->url?>"/>
|
||||
<meta property="og:title" content="<?=$meta->title?>"/>
|
||||
<meta property="og:description" content="<?=$meta->description?>"/>
|
||||
|
||||
|
||||
<link href="<?=BASE_URL?>themecss/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="<?=BASE_URL?>themecss/font-awesome.min.css" rel="stylesheet">
|
||||
<link href="<?=BASE_URL?>themecss/ionicons.min.css" rel="stylesheet">
|
||||
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript" src="<?=BASE_URL?>js/jquery2.0.2.min.js"></script>
|
||||
|
||||
<script src="<?=BASE_URL?>themejs/bootstrap.js"></script>
|
||||
<script src="<?=BASE_URL?>js/jquery.placeholder.js"></script>
|
||||
<script src="<?=BASE_URL?>js/base64.js"></script>
|
||||
|
||||
|
||||
<script src="<?=BASE_URL?>js/bootstrap-datepicker.js"></script>
|
||||
<script src="<?=BASE_URL?>js/jquery.timepicker.js"></script>
|
||||
<script src="<?=BASE_URL?>js/bootstrap-datetimepicker.js"></script>
|
||||
<script src="<?=BASE_URL?>js/fullcalendar.min.js"></script>
|
||||
<script src="<?=BASE_URL?>js/select2/select2.min.js"></script>
|
||||
<script src="<?=BASE_URL?>js/bootstrap-colorpicker-2.1.1/js/bootstrap-colorpicker.min.js"></script>
|
||||
|
||||
|
||||
|
||||
<link href="<?=BASE_URL?>themecss/datatables/dataTables.bootstrap.css" rel="stylesheet">
|
||||
<link href="<?=BASE_URL?>css/jquery.timepicker.css" rel="stylesheet">
|
||||
<link href="<?=BASE_URL?>css/datepicker.css" rel="stylesheet">
|
||||
<link href="<?=BASE_URL?>css/bootstrap-datetimepicker.min.css" rel="stylesheet">
|
||||
<link href="<?=BASE_URL?>css/fullcalendar.css" rel="stylesheet">
|
||||
<link href="<?=BASE_URL?>js/select2/select2.css" rel="stylesheet">
|
||||
<link href="<?=BASE_URL?>js/bootstrap-colorpicker-2.1.1/css/bootstrap-colorpicker.min.css" rel="stylesheet">
|
||||
|
||||
|
||||
<link href="<?=BASE_URL?>themecss/AdminLTE.css" rel="stylesheet">
|
||||
|
||||
<script src="<?=BASE_URL?>themejs/plugins/datatables/jquery.dataTables.js"></script>
|
||||
<script src="<?=BASE_URL?>themejs/plugins/datatables/dataTables.bootstrap.js"></script>
|
||||
<script src="<?=BASE_URL?>themejs/AdminLTE/app.js"></script>
|
||||
|
||||
|
||||
<link href="<?=BASE_URL?>css/style.css?v=<?=$cssVersion?>" rel="stylesheet">
|
||||
|
||||
|
||||
<script type="text/javascript" src="<?=BASE_URL?>js/date.js"></script>
|
||||
<script type="text/javascript" src="<?=BASE_URL?>js/json2.js"></script>
|
||||
<script type="text/javascript" src="<?=BASE_URL?>js/CrockfordInheritance.v0.1.js"></script>
|
||||
|
||||
<script type="text/javascript" src="<?=BASE_URL?>api/Base.js?v=<?=$jsVersion?>"></script>
|
||||
<script type="text/javascript" src="<?=BASE_URL?>api/AdapterBase.js?v=<?=$jsVersion?>"></script>
|
||||
<script type="text/javascript" src="<?=BASE_URL?>api/FormValidation.js?v=<?=$jsVersion?>"></script>
|
||||
<script type="text/javascript" src="<?=BASE_URL?>api/Notifications.js?v=<?=$jsVersion?>"></script>
|
||||
<script type="text/javascript" src="<?=BASE_URL?>api/TimeUtils.js?v=<?=$jsVersion?>"></script>
|
||||
<script type="text/javascript" src="<?=BASE_URL?>api/AesCrypt.js?v=<?=$jsVersion?>"></script>
|
||||
<?php include APP_BASE_PATH.'/modulejslibs.inc.php';?>
|
||||
|
||||
|
||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<script>
|
||||
var baseUrl = '<?=CLIENT_BASE_URL?>service.php';
|
||||
var CLIENT_BASE_URL = '<?=CLIENT_BASE_URL?>';
|
||||
</script>
|
||||
<script type="text/javascript" src="<?=BASE_URL?>js/app-global.js"></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
@@ -70,7 +70,7 @@ class qqFileUploader {
|
||||
*/
|
||||
function handleUpload($uploadDirectory,$saveFileName, $replaceOldFile = FALSE){
|
||||
if (!is_writable($uploadDirectory)){
|
||||
return array('success'=>0,'error' => "Server error. Upload directory isn't writable.");
|
||||
return array('success'=>0,'error' => "Server error. Upload directory ($uploadDirectory) is not writable");
|
||||
}
|
||||
|
||||
if (!$this->file){
|
||||
|
||||
BIN
src/font/roboto/Roboto-Black-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-Black-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-BlackItalic-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-BlackItalic-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-Bold-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-Bold-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-BoldCondensed-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-BoldCondensed-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-BoldCondensedItalic-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-BoldCondensedItalic-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-BoldItalic-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-BoldItalic-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-Condensed-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-Condensed-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-CondensedItalic-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-CondensedItalic-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-Italic-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-Italic-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-Light-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-Light-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-LightItalic-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-LightItalic-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-Medium-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-Medium-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-MediumItalic-webfont.eot
Normal file
BIN
src/font/roboto/Roboto-MediumItalic-webfont.eot
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-MediumItalic-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-MediumItalic-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-Regular-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-Regular-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-Thin-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-Thin-webfont.woff
Normal file
Binary file not shown.
BIN
src/font/roboto/Roboto-ThinItalic-webfont.woff
Normal file
BIN
src/font/roboto/Roboto-ThinItalic-webfont.woff
Normal file
Binary file not shown.
106
src/font/roboto/Roboto.css
Normal file
106
src/font/roboto/Roboto.css
Normal file
@@ -0,0 +1,106 @@
|
||||
@font-face {
|
||||
font-family: 'Roboto';
|
||||
src: local('Roboto'), url('https://roboto-webfont.googlecode.com/files/Roboto-Regular-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Roboto';
|
||||
src: local('Roboto'), url('https://roboto-webfont.googlecode.com/files/Roboto-Italic-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Roboto';
|
||||
src: local('Roboto'), url('https://roboto-webfont.googlecode.com/files/Roboto-Bold-webfont.woff') format('woff');
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Roboto';
|
||||
src: local('Roboto'), url('https://roboto-webfont.googlecode.com/files/Roboto-BoldItalic-webfont.woff') format('woff');
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Roboto Condensed';
|
||||
src: local('Roboto Condensed'), url('https://roboto-webfont.googlecode.com/files/Roboto-Condensed-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Roboto Condensed';
|
||||
src: local('Roboto Condensed'), url('https://roboto-webfont.googlecode.com/files/Roboto-CondensedItalic-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Roboto Condensed';
|
||||
src: local('Roboto Condensed'), url('https://roboto-webfont.googlecode.com/files/Roboto-BoldCondensed-webfont.woff') format('woff');
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Roboto Condensed';
|
||||
src: local('Roboto Condensed'), url('https://roboto-webfont.googlecode.com/files/Roboto-BoldCondensedItalic-webfont.woff') format('woff');
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Roboto Thin';
|
||||
src: local('Roboto Thin'), url('https://roboto-webfont.googlecode.com/files/Roboto-Thin-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Roboto Thin';
|
||||
src: local('Roboto Thin'), url('https://roboto-webfont.googlecode.com/files/Roboto-ThinItalic-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Roboto Light';
|
||||
src: local('Roboto Light'), url('https://roboto-webfont.googlecode.com/files/Roboto-Light-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Roboto Light';
|
||||
src: local('Roboto Light'), url('https://roboto-webfont.googlecode.com/files/Roboto-LightItalic-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Roboto Medium';
|
||||
src: local('Roboto Medium'), url('https://roboto-webfont.googlecode.com/files/Roboto-Medium-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Roboto Medium';
|
||||
src: local('Roboto Medium'), url('https://roboto-webfont.googlecode.com/files/Roboto-MediumItalic-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Roboto Black';
|
||||
src: local('Roboto Black'), url('https://roboto-webfont.googlecode.com/files/Roboto-Black-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Roboto Black';
|
||||
src: local('Roboto Black'), url('https://roboto-webfont.googlecode.com/files/Roboto-BlackItalic-webfont.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
}
|
||||
@@ -23,6 +23,8 @@ Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilin
|
||||
|
||||
include 'includes.inc.php';
|
||||
if(empty($user)){
|
||||
$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
|
||||
SessionUtils::saveSessionObject('loginRedirect',$actual_link);
|
||||
header("Location:".CLIENT_BASE_URL."login.php");
|
||||
}
|
||||
|
||||
@@ -54,6 +56,7 @@ if(!in_array($user->user_level, $modulePermissions['user'])){
|
||||
$commonRoles = array_intersect($modulePermissions['user_roles'], $userRoles);
|
||||
if(empty($commonRoles)){
|
||||
echo "You are not allowed to access this page";
|
||||
header("Location:".CLIENT_BASE_URL."logout.php");
|
||||
exit();
|
||||
}
|
||||
|
||||
@@ -75,7 +78,7 @@ include('configureUIManager.php');
|
||||
|
||||
?><!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title><?=APP_NAME?></title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
@@ -154,24 +157,24 @@ include('configureUIManager.php');
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body class="skin-blue">
|
||||
<script>
|
||||
</head>
|
||||
<body class="skin-blue">
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
|
||||
ga('create', '<?=BaseService::getInstance()->getGAKey()?>', 'gamonoid.com');
|
||||
ga('send', 'pageview');
|
||||
ga('create', '<?=BaseService::getInstance()->getGAKey()?>', 'auto');
|
||||
ga('send','pageview');
|
||||
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
|
||||
|
||||
</script>
|
||||
</script>
|
||||
|
||||
<header id="delegationDiv" class="header">
|
||||
<header id="delegationDiv" class="header">
|
||||
<a href="<?=$homeLink?>" class="logo" style="font-family: 'Source Sans Pro', sans-serif;">
|
||||
<?=APP_NAME?>
|
||||
</a>
|
||||
@@ -190,8 +193,8 @@ include('configureUIManager.php');
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
<div class="wrapper row-offcanvas row-offcanvas-left">
|
||||
</header>
|
||||
<div class="wrapper row-offcanvas row-offcanvas-left">
|
||||
<!-- Left side column. contains the logo and sidebar -->
|
||||
<aside class="left-side sidebar-offcanvas">
|
||||
<!-- sidebar: style can be found in sidebar.less -->
|
||||
@@ -266,7 +269,7 @@ include('configureUIManager.php');
|
||||
<?=$meta['label']?>
|
||||
<small>
|
||||
<?=$meta['menu']?>
|
||||
<a href="#" class="helpLink" target="_blank" style="display:none;"><i class="glyphicon glyphicon-question-sign"></i></a>
|
||||
<a href="#" class="helpLink" target="_blank" style="display:none;color:#fff;"><i class="glyphicon glyphicon-question-sign"></i></a>
|
||||
</small>
|
||||
</h1>
|
||||
</section>
|
||||
@@ -275,4 +278,3 @@ include('configureUIManager.php');
|
||||
<section class="content">
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ $_GET = InputCleaner::cleanParameters($_GET);
|
||||
$_POST = InputCleaner::cleanParameters($_POST);
|
||||
|
||||
|
||||
|
||||
date_default_timezone_set('Asia/Colombo');
|
||||
//Find timezone diff with GMT
|
||||
$dateTimeZoneColombo = new DateTimeZone("Asia/Colombo");
|
||||
$dateTimeColombo = new DateTime("now", $dateTimeZoneColombo);
|
||||
|
||||
@@ -46,12 +46,13 @@ if(empty($user)){
|
||||
|
||||
$tuser = SessionUtils::getSessionObject('user');
|
||||
//check user
|
||||
|
||||
/*
|
||||
$logoFileName = CLIENT_BASE_PATH."data/logo.png";
|
||||
$logoFileUrl = CLIENT_BASE_URL."data/logo.png";
|
||||
if(!file_exists($logoFileName)){
|
||||
$logoFileUrl = BASE_URL."images/logo.png";
|
||||
}
|
||||
}*/
|
||||
$logoFileUrl = UIManager::getInstance()->getCompanyLogoUrl();
|
||||
|
||||
?><!DOCTYPE html>
|
||||
<html lang="en">
|
||||
@@ -90,16 +91,18 @@ if(!file_exists($logoFileName)){
|
||||
}
|
||||
.container {
|
||||
width: 300px;
|
||||
min-height: 0px !important;
|
||||
}
|
||||
|
||||
/* The white background content wrapper */
|
||||
.container > .content {
|
||||
min-height: 0px !important;
|
||||
background-color: #fff;
|
||||
padding: 20px;
|
||||
margin: 0 -20px;
|
||||
-webkit-border-radius: 10px 10px 10px 10px;
|
||||
-moz-border-radius: 10px 10px 10px 10px;
|
||||
border-radius: 10px 10px 10px 10px;
|
||||
-webkit-border-radius:0px;
|
||||
-moz-border-radius:0px;
|
||||
border-radius: 0px;
|
||||
-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15);
|
||||
-moz-box-shadow: 0 1px 2px rgba(0,0,0,.15);
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,.15);
|
||||
@@ -115,6 +118,18 @@ if(!file_exists($logoFileName)){
|
||||
color: #404040;
|
||||
}
|
||||
|
||||
.add-on{
|
||||
-webkit-border-radius:0px;
|
||||
-moz-border-radius:0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
input{
|
||||
-webkit-border-radius:0px;
|
||||
-moz-border-radius:0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
|
||||
|
||||
@@ -83,5 +83,13 @@ class RestAccessToken extends ICEHRM_Record {
|
||||
var $_table = 'RestAccessTokens';
|
||||
}
|
||||
|
||||
class Cron extends ICEHRM_Record {
|
||||
var $_table = 'Crons';
|
||||
}
|
||||
|
||||
class IceEmail extends ICEHRM_Record {
|
||||
var $_table = 'Emails';
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -51,6 +51,42 @@
|
||||
</div>
|
||||
<!-- Plain Message Modal -->
|
||||
|
||||
<!-- Data Message Modal -->
|
||||
<div class="modal fade" id="dataMessageModel" tabindex="-1" role="dialog" aria-labelledby="dataMessageModelLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header" style="border-bottom:none;/*background-color: #3c8dbc;*/">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" style="margin-top:-10px;"><li class="fa fa-times"/></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p id="dataMessageModelBody"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Data Message Modal -->
|
||||
|
||||
<!-- Yes No Modal -->
|
||||
<div class="modal fade" id="yesnoModel" tabindex="-1" role="dialog" aria-labelledby="yesnoModelLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><li class="fa fa-times"/></button>
|
||||
<h3 id="yesnoModelLabel" style="font-size: 17px;"></h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p id="yesnoModelBody"></p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button id="yesnoModelNoBtn" class="btn" onclick="modJs.cancelYesno();">No</button>
|
||||
<button id="yesnoModelYesBtn" class="btn btn-primary">Yes</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Yes No Modal -->
|
||||
|
||||
|
||||
<!-- Upload Modal -->
|
||||
<div class="modal fade" id="uploadModel" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
|
||||
@@ -667,6 +667,8 @@ INSERT INTO `Nationality` (`id`, `name`) VALUES
|
||||
|
||||
|
||||
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('Company: Logo', '', '','[ "value", {"label":"Logo","type":"fileupload","validation":"none"}]'),
|
||||
('Company: Name', 'Sample Company Pvt Ltd', 'Update your company name - For updating company logo copy a file named logo.png to /app/data/ folder', ''),
|
||||
('Email: Enable', '1', '0 will disable all outgoing emails from modules. Value 1 will enable outgoing emails','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]'),
|
||||
('Email: Mode', 'SMTP', 'SMTP, PHP Mailer or Amazon SES. SMTP = send emails using local or a remote smtp server. PHP Mailer = send emails using mail function provided by php. Amazon SES = send emails trough amazon Simple Email Service.','["value", {"label":"Value","type":"select","source":[["SMTP","SMTP"],["PHP Mailer","PHP Mailer"],["SES","Amazon SES"]]}]'),
|
||||
('Email: SMTP Host', 'localhost', 'SMTP host IP',''),
|
||||
|
||||
@@ -205,3 +205,33 @@ create table `Files` (
|
||||
primary key (`id`),
|
||||
unique key `filename` (`filename`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `Crons` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`class` varchar(100) NOT NULL,
|
||||
`lastrun` DATETIME default '0000-00-00 00:00:00',
|
||||
`frequency` int(4) NOT NULL,
|
||||
`time` varchar(50) NOT NULL,
|
||||
`type` enum('Minutely','Hourly','Daily','Weekly','Monthly','Yearly') default 'Hourly',
|
||||
`status` enum('Enabled','Disabled') default 'Enabled',
|
||||
primary key (`id`),
|
||||
key `KEY_Crons_frequency` (`frequency`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `Emails` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`subject` varchar(300) NOT NULL,
|
||||
`toEmail` varchar(300) NOT NULL,
|
||||
`template` text NULL,
|
||||
`params` text NULL,
|
||||
`cclist` varchar(500) NULL,
|
||||
`bcclist` varchar(500) NULL,
|
||||
`error` varchar(500) NULL,
|
||||
`created` DATETIME default '0000-00-00 00:00:00',
|
||||
`updated` DATETIME default '0000-00-00 00:00:00',
|
||||
`status` enum('Pending','Sent','Error') default 'Pending',
|
||||
primary key (`id`),
|
||||
key `KEY_Emails_status` (`status`),
|
||||
key `KEY_Emails_created` (`created`)
|
||||
) engine=innodb default charset=utf8;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user