Release note v15.2

------------------

### Features
 * Overtime Reports
 * Overtime calculation for california

### Fixes
 * Fix issue: uncaught error when placeholder value is empty
 * Log email sending success status
 * Fix broken longer company name issue
 * Make the application accessible when client on an intranet with no internet connection
 * Fix issue: when a module is disabled other modules depend on it stops working
This commit is contained in:
Thilina Hasantha
2016-03-13 12:30:20 +05:30
parent 78faf64770
commit 2041071d00
21 changed files with 18018 additions and 45 deletions

View File

@@ -9,9 +9,9 @@ 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"); define('HOME_LINK_OTHERS', CLIENT_BASE_URL."?g=modules&n=dashboard&m=module_Personal_Information");
//Version //Version
define('VERSION', '15.0.OS'); define('VERSION', '15.3.OS');
define('CACHE_VALUE', '15.0.OS'); define('CACHE_VALUE', '15.3.OS');
define('VERSION_DATE', '07/02/2016'); define('VERSION_DATE', '12/03/2016');
if(!defined('CONTACT_EMAIL')){define('CONTACT_EMAIL','icehrm@gamonoid.com');} if(!defined('CONTACT_EMAIL')){define('CONTACT_EMAIL','icehrm@gamonoid.com');}
if(!defined('KEY_PREFIX')){define('KEY_PREFIX','IceHrm');} if(!defined('KEY_PREFIX')){define('KEY_PREFIX','IceHrm');}

View File

@@ -0,0 +1,23 @@
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
('System: Default Country', '0', 'Set the default Country','[ "value", {"label":"Country","type":"select2","remote-source":["Country","code","name"]}]');
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
('Attendance: Overtime Calculation Class', 'BasicOvertimeCalculator', 'Set the method used to calculate overtime','["value", {"label":"Value","type":"select","source":[["BasicOvertimeCalculator","BasicOvertimeCalculator"],["CaliforniaOvertimeCalculator","CaliforniaOvertimeCalculator"]]}]');
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
('Attendance: Overtime Start Hour', '8', 'Overtime calculation will start after an employee work this number of hours per day, 0 to indicate no overtime', ''),
('Attendance: Double time Start Hour', '12', 'Double time calculation will start after an employee work this number of hours per day, 0 to indicate no double time', '');
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
('Attendance: Work Week Start Day', '0', 'Set the starting day of the work week','["value", {"label":"Value","type":"select","source":[["0","Sunday"],["1","Monday"],["2","Tuesday"],["3","Wednesday"],["4","Thursday"],["5","Friday"],["6","Saturday"]]}]');
INSERT INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`, `type`,`report_group`) VALUES
('Overtime Report', 'This report list all employee attendance entries by employee with overtime calculations', '[\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]', 'OvertimeReport', '["employee","date_start","date_end"]', 'Class','Time Management');
INSERT INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`, `type`,`report_group`) VALUES
('Overtime Summary Report', 'This report list all employee attendance entries by employee with overtime calculation summary', '[\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]', 'OvertimeSummaryReport', '["employee","date_start","date_end"]', 'Class','Time Management');
Alter table `Employees` modify column `joined_date` date default '0000-00-00';
Alter table `Employees` modify column `confirmation_date` date default '0000-00-00';
Alter table `Employees` modify column `termination_date` date default '0000-00-00';
Alter table `Employees` modify column `birthday` date default '0000-00-00';

View File

@@ -798,6 +798,25 @@ REPLACE INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`,
'["employee","date_start","date_end","status"]', 'Class'); '["employee","date_start","date_end","status"]', 'Class');
INSERT INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`, `type`,`report_group`) VALUES
('Overtime Report', 'This report list all employee attendance entries by employee with overtime calculations', '[\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]', 'OvertimeReport', '["employee","date_start","date_end"]', 'Class','Time Management');
INSERT INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`, `type`,`report_group`) VALUES
('Overtime Summary Report', 'This report list all employee attendance entries by employee with overtime calculation summary', '[\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]', 'OvertimeSummaryReport', '["employee","date_start","date_end"]', 'Class','Time Management');
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
('Attendance: Overtime Calculation Class', 'BasicOvertimeCalculator', 'Set the method used to calculate overtime','["value", {"label":"Value","type":"select","source":[["BasicOvertimeCalculator","BasicOvertimeCalculator"],["CaliforniaOvertimeCalculator","CaliforniaOvertimeCalculator"]]}]');
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
('Attendance: Overtime Start Hour', '8', 'Overtime calculation will start after an employee work this number of hours per day, 0 to indicate no overtime', ''),
('Attendance: Double time Start Hour', '12', 'Double time calculation will start after an employee work this number of hours per day, 0 to indicate no double time', '');
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
('Attendance: Work Week Start Day', '0', 'Set the starting day of the work week','["value", {"label":"Value","type":"select","source":[["0","Sunday"],["1","Monday"],["2","Tuesday"],["3","Wednesday"],["4","Thursday"],["5","Friday"],["6","Saturday"]]}]');
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
('Company: Logo', '', '','[ "value", {"label":"Logo","type":"fileupload","validation":"none"}]'), ('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: Name', 'Sample Company Pvt Ltd', 'Update your company name - For updating company logo copy a file named logo.png to /app/data/ folder', ''),

View File

@@ -532,6 +532,21 @@ That way you can attach each and every project to a client.
Under employee projects tab you can assign projects to employees. You need to add projects to employees to enable them to add time against 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. these projects in time-sheets.
Release note v15.2
------------------
### Features
* Overtime Reports
* Overtime calculation for california
### Fixes
* Fix issue: uncaught error when placeholder value is empty
* Log email sending success status
* Fix broken longer company name issue
* Make the application accessible when client on an intranet with no internet connection
* Fix issue: when a module is disabled other modules depend on it stops working
Release note v15.0 Release note v15.0
------------------ ------------------

View File

@@ -1678,7 +1678,10 @@ IceHRMBase.method('fillForm', function(object, formId, fields) {
if(placeHolderVal == undefined || placeHolderVal == null){ if(placeHolderVal == undefined || placeHolderVal == null){
placeHolderVal = ""; placeHolderVal = "";
}else{ }else{
placeHolderVal = placeHolderVal.replace(/(?:\r\n|\r|\n)/g, '<br />'); try{
placeHolderVal = placeHolderVal.replace(/(?:\r\n|\r|\n)/g, '<br />');
}catch(e){}
} }
@@ -2160,3 +2163,12 @@ IceHRMBase.method('generateOptions', function (data) {
return options; return options;
}); });
IceHRMBase.method('isModuleInstalled', function (type, name) {
if(modulesInstalled == undefined || modulesInstalled == null){
return false;
}
return (modulesInstalled[type+"_"+name] == 1);
});

View File

@@ -194,5 +194,19 @@ abstract class AbstractModuleManager{
$this->modelClasses[] = $className; $this->modelClasses[] = $className;
} }
protected function addHistoryGeneric($type, $table, $refName, $refId, $field, $oldValue, $newValue){
$eh = new $table();
$eh->type = $type;
$eh->$refName = $refId;
$eh->field = $field;
$eh->user = BaseService::getInstance()->getCurrentUser()->id;
$eh->old_value = $oldValue;
$eh->new_value = $newValue;
$eh->created = date("Y-m-d H:i:s");
$eh->updated = date("Y-m-d H:i:s");
$eh->Save();
}
} }

View File

@@ -45,6 +45,7 @@ class BaseService{
var $moduleManagers = null; var $moduleManagers = null;
var $emailSender = null; var $emailSender = null;
var $user = null; var $user = null;
var $historyManagers = array();
private static $me = null; private static $me = null;
@@ -89,17 +90,23 @@ class BaseService{
$queryData = array(); $queryData = array();
if(!empty($filterStr)){ if(!empty($filterStr)){
$filter = json_decode($filterStr, true); $filter = json_decode($filterStr, true);
if(!empty($filter)){
foreach($filter as $k=>$v){ if(!empty($filter)){
LogManager::getInstance()->info($filterStr); LogManager::getInstance()->debug("Building filter query");
if($v == '__myid__'){ if(method_exists($obj,'getCustomFilterQuery')){
$v = $this->getCurrentProfileId(); LogManager::getInstance()->debug("Method: getCustomFilterQuery exists");
} $response = $obj->getCustomFilterQuery($filter);
$query.=" and ".$k."=?"; $query = $response[0];
$queryData[] = $v; $queryData = $response[1];
} }else{
} LogManager::getInstance()->debug("Method: getCustomFilterQuery not found");
$defaultFilterResp = $this->buildDefaultFilterQuery($filter);
$query = $defaultFilterResp[0];
$queryData = $defaultFilterResp[1];
}
}
} }
if(empty($orderBy)){ if(empty($orderBy)){
@@ -112,13 +119,17 @@ class BaseService{
if(in_array($table, $this->userTables)){ if(in_array($table, $this->userTables)){
$cemp = $this->getCurrentProfileId(); $cemp = $this->getCurrentProfileId();
if(!empty($cemp)){ if(!empty($cemp)){
$signInMappingField = SIGN_IN_ELEMENT_MAPPING_FIELD_NAME; $signInMappingField = SIGN_IN_ELEMENT_MAPPING_FIELD_NAME;
$list = $obj->Find($signInMappingField." = ?".$query.$orderBy, array_merge(array($cemp),$queryData)); LogManager::getInstance()->debug("Query: ".$signInMappingField." = ?".$query.$orderBy);
LogManager::getInstance()->debug("Query Data: ".print_r(array_merge(array($cemp),$queryData),true));
$list = $obj->Find($signInMappingField." = ?".$query.$orderBy, array_merge(array($cemp),$queryData));
}else{ }else{
$list = array(); $list = array();
} }
}else{ }else{
LogManager::getInstance()->debug("Query: "."1=1".$query.$orderBy);
LogManager::getInstance()->debug("Query Data: ".print_r($queryData,true));
$list = $obj->Find("1=1".$query.$orderBy,$queryData); $list = $obj->Find("1=1".$query.$orderBy,$queryData);
} }
@@ -136,19 +147,19 @@ class BaseService{
if(empty($v)){ if(empty($v)){
continue; continue;
} }
$vArr = json_decode($v); if(is_array($v)){
if(is_array($vArr)){ if(empty($v)){
if(empty($vArr)){
continue; continue;
} }
$v = $vArr;
$length = count($v); $length = count($v);
for($i=0; $i<$length; $i++){ for($i=0; $i<$length; $i++){
$query.=$k." like ?";
if($i == 0){ if($i == 0){
$query.=" and ("; $query.=" and (";
} }
$query.=$k." like ?";
if($i < $length -1){ if($i < $length -1){
$query.=" or "; $query.=" or ";
@@ -477,7 +488,7 @@ class BaseService{
} }
} }
} }
return $obj; return $obj->postProcessGetData($obj);
} }
return null; return null;
} }
@@ -1065,6 +1076,37 @@ class BaseService{
return true; return true;
}
public function isModuleAllowedForGivenUser($moduleManagerObj, $user){
$moduleObject = $moduleManagerObj->getModuleObject();
//Check if the module is disabled
if($moduleObject['status'] == 'Disabled'){
return false;
}
//Check if user has permissions to this module
//Check Module Permissions
$modulePermissions = BaseService::getInstance()->loadModulePermissions($moduleManagerObj->getModuleType(), $moduleObject['name'],$user->user_level);
if(!in_array($user->user_level, $modulePermissions['user'])){
if(!empty($user->user_roles)){
$userRoles = json_decode($user->user_roles,true);
}else{
$userRoles = array();
}
$commonRoles = array_intersect($modulePermissions['user_roles'], $userRoles);
if(empty($commonRoles)){
return false;
}
}
return true;
} }
public function getGAKey(){ public function getGAKey(){
@@ -1123,12 +1165,27 @@ class BaseService{
if(empty($this->moduleManagers)){ if(empty($this->moduleManagers)){
$this->moduleManagers = array(); $this->moduleManagers = array();
} }
$this->moduleManagers[] = $moduleManager; $moduleObject = $moduleManager->getModuleObject();
$this->moduleManagers[$moduleManager->getModuleType()."_".$moduleObject['name']] = $moduleManager;
} }
public function getModuleManagers(){ public function getModuleManagers(){
return $this->moduleManagers; return array_values($this->moduleManagers);
} }
public function getModuleManagerNames(){
$keys = array_keys($this->moduleManagers);
$arr = array();
foreach($keys as $key){
$arr[$key] = 1;
}
return $arr;
}
public function getModuleManager($type, $name){
return $this->moduleManagers[$type."_".$name];
}
public function setEmailSender($emailSender){ public function setEmailSender($emailSender){
$this->emailSender = $emailSender; $this->emailSender = $emailSender;
@@ -1173,8 +1230,116 @@ class BaseService{
return $dept->timezone; return $dept->timezone;
} }
public function setupHistoryManager($type, $historyManager){
$this->historyManagers[$type] = $historyManager;
}
public function addHistoryItem($historyManagerType, $type, $refId , $field, $oldVal, $newVal){
if(isset($this->historyManagers[$historyManagerType])){
return $this->historyManagers[$historyManagerType]->addHistory($type, $refId , $field, $oldVal, $newVal);
}
return false;
}
public function getItemFromCache($class, $id){
$data = MemcacheService::getInstance()->get($class."-".$id);
if($data !== false){
return unserialize($data);
}
$obj = new $class();
$obj->Load("id = ?",array($id));
if($obj->id != $id){
return null;
}
MemcacheService::getInstance()->set($class."-".$id, serialize($obj), 10 * 60);
return $obj;
}
} }
class MemcacheService {
private $connection = null;
public static $openConnections = array();
private static $me = null;
private function __construct(){}
public static function getInstance(){
if(self::$me == null){
self::$me = new MemcacheService();
}
return self::$me;
}
private function connect() {
if($this->connection == null) {
$this->connection = new Memcached();
$this->connection->addServer(MEMCACHE_HOST, MEMCACHE_PORT);
if(!$this->isConnected()) {
$this->connection = null;
} else {
self::$openConnections[] = $this->connection;
}
}
return $this->connection;
}
private function isConnected(){
$statuses = $this->connection->getStats();
return isset($statuses[$this->memcacheHost.":".$this->memcachePort]);
}
private function compressKey($key) {
return crc32(APP_DB.$key).md5(CLIENT_NAME);
}
public function set($key, $value, $expiry = 3600) {
$key = $this->compressKey($key);
$memcache = $this->connect();
if (!empty($memcache) && $this->isConnected()) {
$ok = $memcache->set($key, $value, time() + $expiry);
if(!$ok) {
return false;
}
return true;
}
return false;
}
public function get($key) {
$key = $this->compressKey($key);
$memcache = $this->connect();
if(!empty($memcache) && $this->isConnected()) {
return $memcache->get($key);
} else {
return false;
}
}
public function close() {
if($this->connection != null) {
if($this->isConnected()) {
$this->connection->quit();
}
$this->connection = null;
}
}
}
class IceConstants{ class IceConstants{
const AUDIT_AUTHENTICATION = "Authentication"; const AUDIT_AUTHENTICATION = "Authentication";
const AUDIT_ADD = "Add"; const AUDIT_ADD = "Add";
@@ -1186,4 +1351,8 @@ class IceConstants{
const NOTIFICATION_LEAVE = "Leave Module"; const NOTIFICATION_LEAVE = "Leave Module";
const NOTIFICATION_TIMESHEET = "Time Module"; const NOTIFICATION_TIMESHEET = "Time Module";
const NOTIFICATION_TRAINING = "Training Module"; const NOTIFICATION_TRAINING = "Training Module";
}
interface HistoryManager{
public function addHistory($type, $refId, $field, $oldValue, $newValue);
} }

View File

@@ -40,7 +40,7 @@ abstract class EmailSender{
array(), array(),
array(), array(),
array() array()
); );
} }
} }
@@ -281,7 +281,9 @@ class SMTPEmailSender extends EmailSender{
$mail = $smtp->send($toEmail, $headers, $body); $mail = $smtp->send($toEmail, $headers, $body);
if (PEAR::isError($mail)) {
LogManager::getInstance()->info("SMTP Error Response:".$mail->getMessage());
}
return $mail; return $mail;
} }

View File

@@ -41,17 +41,22 @@ class FileService{
public function getFromCache($key){ public function getFromCache($key){
try{ try{
/*
if(empty($this->memcache)){ if(empty($this->memcache)){
$this->memcache = new Memcached(); $this->memcache = new Memcached();
$this->memcache->addServer("127.0.0.1", 11211); $this->memcache->addServer("127.0.0.1", 11211);
} }
$data = $this->memcache->get($key); $data = $this->memcache->get($key);
*/
$data = MemcacheService::getInstance()->get($key);
if(!empty($data)){ if(!empty($data)){
return $data; return $data;
} }
return null; return null;
}catch(Exception $e){ }catch(Exception $e){
return null; return null;
} }

View File

@@ -651,4 +651,14 @@ table.dataTable{
border-radius: 0px; border-radius: 0px;
-moz-border-radius: 0px; -moz-border-radius: 0px;
-webkit-border-radius: 0px; -webkit-border-radius: 0px;
}
.logoResponsive{
background: #3c8dbc !important;
text-align: left !important;
width:50% !important;
}
@media screen and (min-width: 0px) and (max-width: 600px) {
.logoResponsive { display: none !important;}
} }

View File

@@ -14,9 +14,9 @@ if($_REQUEST['file_type']=="image"){
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.js?v=1.1"></script> <script type="text/javascript" src="<?=BASE_URL?>js/jquery-1.5.2.js"></script>
<script type="text/javascript" src="https://webstalk-js.s3.amazonaws.com/date.js"></script> <script type="text/javascript" src="<?=BASE_URL?>js/date.js"></script>
<script type="text/javascript" src="https://webstalk-js.s3.amazonaws.com/json2.js"></script> <script type="text/javascript" src="<?=BASE_URL?>js/json2.js"></script>
</head> </head>
<body> <body>

View File

@@ -105,6 +105,8 @@
}); });
var clientUrl = '<?=CLIENT_BASE_URL?>'; var clientUrl = '<?=CLIENT_BASE_URL?>';
var modulesInstalled = <?=json_encode(BaseService::getInstance()->getModuleManagerNames())?>;
$(document).ready(function() { $(document).ready(function() {
$(".dataTables_paginate ul").addClass("pagination"); $(".dataTables_paginate ul").addClass("pagination");

View File

@@ -58,8 +58,12 @@ if(!in_array($user->user_level, $modulePermissions['user'])){
} }
$commonRoles = array_intersect($modulePermissions['user_roles'], $userRoles); $commonRoles = array_intersect($modulePermissions['user_roles'], $userRoles);
if(empty($commonRoles)){ if(empty($commonRoles)){
echo "You are not allowed to access this page"; session_start();
header("Location:".CLIENT_BASE_URL."logout.php"); $_SESSION['user'] = null;
session_destroy();
session_write_close();
$user = null;
header("Location:".CLIENT_BASE_URL."login.php?f=1&fm=You are not allowed to access this module");
exit(); exit();
} }
@@ -149,8 +153,8 @@ include('configureUIManager.php');
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- 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:// --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="<?=BASE_URL?>js/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> <script src="<?=BASE_URL?>js/respond.min.js"></script>
<![endif]--> <![endif]-->
<script> <script>
var baseUrl = '<?=CLIENT_BASE_URL?>service.php'; var baseUrl = '<?=CLIENT_BASE_URL?>service.php';
@@ -190,7 +194,7 @@ include('configureUIManager.php');
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</a> </a>
<div class="logo" style="background: #3c8dbc;text-align: left;"> <div class="logo logoResponsive">
<?=$companyName?> <?=$companyName?>
</div> </div>
<div class="navbar-right"> <div class="navbar-right">

8
src/js/html5.js Normal file
View File

@@ -0,0 +1,8 @@
/*
HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}</style>";
c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);
if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);

8
src/js/html5shiv.js vendored Normal file
View File

@@ -0,0 +1,8 @@
/*
HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}</style>";
c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);
if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);

8374
src/js/jquery-1.5.2.js vendored Normal file

File diff suppressed because it is too large Load Diff

9301
src/js/jquery-1.8.1.js vendored Normal file

File diff suppressed because it is too large Load Diff

6
src/js/respond.min.js vendored Normal file
View File

@@ -0,0 +1,6 @@
/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
window.matchMedia=window.matchMedia||function(a){"use strict";var c,d=a.documentElement,e=d.firstElementChild||d.firstChild,f=a.createElement("body"),g=a.createElement("div");return g.id="mq-test-1",g.style.cssText="position:absolute;top:-100em",f.style.background="none",f.appendChild(g),function(a){return g.innerHTML='&shy;<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',d.insertBefore(f,e),c=42===g.offsetWidth,d.removeChild(f),{matches:c,media:a}}}(document);
/*! Respond.js v1.3.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */
(function(a){"use strict";function x(){u(!0)}var b={};if(a.respond=b,b.update=function(){},b.mediaQueriesSupported=a.matchMedia&&a.matchMedia("only all").matches,!b.mediaQueriesSupported){var q,r,t,c=a.document,d=c.documentElement,e=[],f=[],g=[],h={},i=30,j=c.getElementsByTagName("head")[0]||d,k=c.getElementsByTagName("base")[0],l=j.getElementsByTagName("link"),m=[],n=function(){for(var b=0;l.length>b;b++){var c=l[b],d=c.href,e=c.media,f=c.rel&&"stylesheet"===c.rel.toLowerCase();d&&f&&!h[d]&&(c.styleSheet&&c.styleSheet.rawCssText?(p(c.styleSheet.rawCssText,d,e),h[d]=!0):(!/^([a-zA-Z:]*\/\/)/.test(d)&&!k||d.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&m.push({href:d,media:e}))}o()},o=function(){if(m.length){var b=m.shift();v(b.href,function(c){p(c,b.href,b.media),h[b.href]=!0,a.setTimeout(function(){o()},0)})}},p=function(a,b,c){var d=a.match(/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi),g=d&&d.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+b+"$2$3")},i=!g&&c;b.length&&(b+="/"),i&&(g=1);for(var j=0;g>j;j++){var k,l,m,n;i?(k=c,f.push(h(a))):(k=d[j].match(/@media *([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1,f.push(RegExp.$2&&h(RegExp.$2))),m=k.split(","),n=m.length;for(var o=0;n>o;o++)l=m[o],e.push({media:l.split("(")[0].match(/(only\s+)?([a-zA-Z]+)\s?/)&&RegExp.$2||"all",rules:f.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},s=function(){var a,b=c.createElement("div"),e=c.body,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",e||(e=f=c.createElement("body"),e.style.background="none"),e.appendChild(b),d.insertBefore(e,d.firstChild),a=b.offsetWidth,f?d.removeChild(e):e.removeChild(b),a=t=parseFloat(a)},u=function(b){var h="clientWidth",k=d[h],m="CSS1Compat"===c.compatMode&&k||c.body[h]||k,n={},o=l[l.length-1],p=(new Date).getTime();if(b&&q&&i>p-q)return a.clearTimeout(r),r=a.setTimeout(u,i),void 0;q=p;for(var v in e)if(e.hasOwnProperty(v)){var w=e[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?t||s():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?t||s():1)),w.hasquery&&(z&&A||!(z||m>=x)||!(A||y>=m))||(n[w.media]||(n[w.media]=[]),n[w.media].push(f[w.rules]))}for(var C in g)g.hasOwnProperty(C)&&g[C]&&g[C].parentNode===j&&j.removeChild(g[C]);for(var D in n)if(n.hasOwnProperty(D)){var E=c.createElement("style"),F=n[D].join("\n");E.type="text/css",E.media=D,j.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(c.createTextNode(F)),g.push(E)}},v=function(a,b){var c=w();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},w=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}();n(),b.update=n,a.addEventListener?a.addEventListener("resize",x,!1):a.attachEvent&&a.attachEvent("onresize",x)}})(this);

View File

@@ -66,7 +66,7 @@ $logoFileUrl = UIManager::getInstance()->getCompanyLogoUrl();
<!-- Le styles --> <!-- Le styles -->
<link href="<?=BASE_URL?>bootstrap/css/bootstrap.css" rel="stylesheet"> <link href="<?=BASE_URL?>bootstrap/css/bootstrap.css" rel="stylesheet">
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.js"></script> <script type="text/javascript" src="<?=BASE_URL?>js/jquery-1.8.1.js"></script>
<script src="<?=BASE_URL?>bootstrap/js/bootstrap.js"></script> <script src="<?=BASE_URL?>bootstrap/js/bootstrap.js"></script>
<script src="<?=BASE_URL?>js/jquery.placeholder.js"></script> <script src="<?=BASE_URL?>js/jquery.placeholder.js"></script>
<script src="<?=BASE_URL?>js/jquery.dataTables.js"></script> <script src="<?=BASE_URL?>js/jquery.dataTables.js"></script>

View File

@@ -47,6 +47,7 @@ class Setting extends ICEHRM_Record {
public function getUserAccess(){ public function getUserAccess(){
return array(); return array();
} }
var $_table = 'Settings'; var $_table = 'Settings';
} }

View File

@@ -103,10 +103,6 @@ foreach($ams as $am){
if($addNewPermissions && isset($meta->permissions)){ if($addNewPermissions && isset($meta->permissions)){
createPermissions($meta, $dbModule->id); createPermissions($meta, $dbModule->id);
} }
if($dbModule->status == 'Disabled'){
continue;
}
$arr['name'] = $dbModule->name; $arr['name'] = $dbModule->name;
@@ -140,6 +136,9 @@ foreach($ams as $am){
} }
includeModuleManager('admin',$am, $arr); includeModuleManager('admin',$am, $arr);
if($dbModule->status == 'Disabled'){
continue;
}
if(!isset($adminModulesTemp[$arr['menu']])){ if(!isset($adminModulesTemp[$arr['menu']])){
$adminModulesTemp[$arr['menu']] = array(); $adminModulesTemp[$arr['menu']] = array();
@@ -191,10 +190,7 @@ foreach($ams as $am){
if($addNewPermissions && isset($meta->permissions)){ if($addNewPermissions && isset($meta->permissions)){
createPermissions($meta, $dbModule->id); createPermissions($meta, $dbModule->id);
} }
if($dbModule->status == 'Disabled'){
continue;
}
$arr['name'] = $dbModule->name; $arr['name'] = $dbModule->name;
$arr['label'] = $dbModule->label; $arr['label'] = $dbModule->label;
@@ -226,6 +222,10 @@ foreach($ams as $am){
} }
includeModuleManager('modules',$am, $arr); includeModuleManager('modules',$am, $arr);
if($dbModule->status == 'Disabled'){
continue;
}
if(!isset($userModulesTemp[$arr['menu']])){ if(!isset($userModulesTemp[$arr['menu']])){
$userModulesTemp[$arr['menu']] = array(); $userModulesTemp[$arr['menu']] = array();