Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b2f83c51e4 | ||
|
|
585036b209 | ||
|
|
91c6867e2f | ||
|
|
912ff56260 | ||
|
|
1bd4014cb9 | ||
|
|
d226a18912 | ||
|
|
1e9e6f31a2 | ||
|
|
698c5d3daa | ||
|
|
271a39b3d4 | ||
|
|
217664e636 | ||
|
|
6e4d32933b | ||
|
|
a10fbba14a | ||
|
|
9e243073df | ||
|
|
1757421d9f | ||
|
|
37299ac1a8 | ||
|
|
f614e0ebf0 | ||
|
|
66ced28bad | ||
|
|
22a371eef9 | ||
|
|
143961cf3f | ||
|
|
aae74a8cc9 | ||
|
|
3c89cb277c | ||
|
|
48619a086c | ||
|
|
ace8020028 | ||
|
|
acf281371b | ||
|
|
39820b84e0 | ||
|
|
5656910eab | ||
|
|
0594d84ed1 | ||
|
|
fbd77cedf7 | ||
|
|
045e85f3ad | ||
|
|
f6d5202ad5 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@
|
||||
/.buildpath
|
||||
/.project
|
||||
/.idea
|
||||
build
|
||||
|
||||
76
build.xml
76
build.xml
@@ -8,14 +8,15 @@
|
||||
<property name="env.appname" value="icehrm"/>
|
||||
<property name="env.Version" value="dev"/>
|
||||
<property name="installpath" value="/var/www/apps.gamonoid.com/icehrm-open-core"/>
|
||||
<property name="installLocalpath" value="/Applications/XAMPP/xamppfiles/htdocs/icehrm-open-core"/>
|
||||
|
||||
|
||||
<target name="build"
|
||||
depends="prepare,lint,phpunit,copyapp,release,install"
|
||||
depends="prepare,lint,copyapp,release,install"
|
||||
description=""/>
|
||||
|
||||
<target name="buildlocal"
|
||||
depends="prepare,copyapp"
|
||||
<target name="buildlocal"
|
||||
depends="prepare,copyapp,installLocal"
|
||||
description=""/>
|
||||
|
||||
<target name="clean"
|
||||
@@ -37,6 +38,7 @@
|
||||
depends="clean"
|
||||
description="Prepare for build">
|
||||
<mkdir dir="${basedir}/build/api"/>
|
||||
<mkdir dir="${basedir}/build/api"/>
|
||||
<mkdir dir="${basedir}/build/coverage"/>
|
||||
<mkdir dir="${basedir}/build/logs"/>
|
||||
<mkdir dir="${basedir}/build/pdepend"/>
|
||||
@@ -47,29 +49,6 @@
|
||||
<mkdir dir="${basedir}/build/release/data/${env.appname}_${env.Version}"/>
|
||||
<mkdir dir="${basedir}/src/lib"/>
|
||||
|
||||
<copy todir="${basedir}/src/lib" overwrite="true">
|
||||
<fileset dir="${basedir}/lib">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<copy todir="${basedir}/src" overwrite="true">
|
||||
<fileset dir="${basedir}/core-ext">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<copy todir="${basedir}/src">
|
||||
<fileset dir="${basedir}/ext">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<copy todir="${basedir}/src">
|
||||
<fileset dir="${basedir}/tp">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<property name="prepare.done" value="true"/>
|
||||
</target>
|
||||
@@ -80,6 +59,7 @@
|
||||
|
||||
<fileset dir="${basedir}/src">
|
||||
<include name="**/*.php" />
|
||||
<exclude name="composer/**"/>
|
||||
<modified />
|
||||
</fileset>
|
||||
|
||||
@@ -204,7 +184,6 @@
|
||||
|
||||
|
||||
<target name="copyapp"
|
||||
depends=""
|
||||
description="Copy generated files to QA app">
|
||||
|
||||
<delete includeemptydirs="true">
|
||||
@@ -213,12 +192,30 @@
|
||||
</fileset>
|
||||
</delete>
|
||||
|
||||
<copy todir="${destination}">
|
||||
<copy todir="${destination}" overwrite="true">
|
||||
<fileset dir="${origin}">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<copy todir="${destination}/lib" overwrite="true">
|
||||
<fileset dir="${basedir}/lib">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<copy todir="${destination}" overwrite="true">
|
||||
<fileset dir="${basedir}/core-ext">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<copy todir="${destination}" overwrite="true">
|
||||
<fileset dir="${basedir}/ext">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
</target>
|
||||
|
||||
<target name="install"
|
||||
@@ -233,8 +230,8 @@
|
||||
|
||||
<mkdir dir="${installpath}"/>
|
||||
|
||||
<copy todir="${installpath}">
|
||||
<fileset dir="${origin}">
|
||||
<copy todir="${installpath}" overwrite="true">
|
||||
<fileset dir="${destination}">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
@@ -246,6 +243,25 @@
|
||||
</delete>
|
||||
</target>
|
||||
|
||||
<target name="installLocal"
|
||||
depends="copyapp"
|
||||
description="">
|
||||
|
||||
<delete includeemptydirs="true" failonerror="false">
|
||||
<fileset dir="${installLocalpath}">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
|
||||
<mkdir dir="${installLocalpath}"/>
|
||||
|
||||
<copy todir="${installLocalpath}">
|
||||
<fileset dir="${destination}">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="release"
|
||||
depends="copyapp"
|
||||
description="Create a release">
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
<?php
|
||||
//Nothing here
|
||||
?>
|
||||
@@ -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");
|
||||
|
||||
//Version
|
||||
define('VERSION', '16.0.OS');
|
||||
define('CACHE_VALUE', '16.0.OS');
|
||||
define('VERSION_DATE', '14/04/2016');
|
||||
define('VERSION', '18.0.OS');
|
||||
define('CACHE_VALUE', '18.0.OS');
|
||||
define('VERSION_DATE', '04/08/2016');
|
||||
|
||||
if(!defined('CONTACT_EMAIL')){define('CONTACT_EMAIL','icehrm@gamonoid.com');}
|
||||
if(!defined('KEY_PREFIX')){define('KEY_PREFIX','IceHrm');}
|
||||
@@ -19,3 +19,10 @@ if(!defined('APP_SEC')){define('APP_SEC','dbcs234d2s111');}
|
||||
|
||||
define('UI_SHOW_SWITCH_PROFILE', true);
|
||||
define('CRON_LOG', '/var/log/nginx/icehrmcron.log');
|
||||
|
||||
define('MEMCACHE_HOST', '127.0.0.1');
|
||||
define('MEMCACHE_PORT', '11211');
|
||||
|
||||
if(!defined('WK_HTML_PATH')){
|
||||
define('WK_HTML_PATH', '/usr/bin/wkhtmltopdf');
|
||||
}
|
||||
|
||||
@@ -1,187 +0,0 @@
|
||||
ALTER TABLE `Users` ADD COLUMN `login_hash` varchar(64) default null;
|
||||
ALTER TABLE `Users` ADD INDEX login_hash_index (`login_hash`);
|
||||
|
||||
INSERT INTO `ImmigrationStatus` VALUES
|
||||
(1,'Citizen'),
|
||||
(2,'Permanent Resident'),
|
||||
(3,'Work Permit Holder'),
|
||||
(4,'Dependant Pass Holder');
|
||||
|
||||
INSERT INTO `Ethnicity` VALUES
|
||||
(1,'White American'),
|
||||
(2,'Black or African American'),
|
||||
(3,'Native American'),
|
||||
(4,'Alaska Native'),
|
||||
(5,'Asian American'),
|
||||
(6,'Native Hawaiian'),
|
||||
(7,'Pacific Islander');
|
||||
|
||||
REPLACE 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"]]}]');
|
||||
|
||||
REPLACE 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"]]}]');
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('System: Reset Module Names', '1', 'Select this to reset module names in Database','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]');
|
||||
|
||||
REPLACE 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', ''),
|
||||
('Api: REST Api Enabled', '1', '','["value", {"label":"Value","type":"select","source":[["0","No"],["1","Yes"]]}]'),
|
||||
('Api: REST Api Token', 'Click on edit icon', '','["value", {"label":"Value","type":"placeholder"}]');
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('System: Allowed Countries', '0', 'Only these countries will be allowed in select boxes','["value", {"label":"Value","type":"select2multi","remote-source":["Country","id","name"]}]');
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('System: Allowed Currencies', '0', 'Only these currencies will be allowed in select boxes','["value", {"label":"Value","type":"select2multi","remote-source":["CurrencyType","id","code+name"]}]');
|
||||
|
||||
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('System: Allowed Nationality', '', 'Only these nationalities will be allowed in select boxes','["value", {"label":"Value","type":"select2multi","remote-source":["Nationality","id","name"]}]');
|
||||
|
||||
|
||||
REPLACE 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');
|
||||
|
||||
REPLACE 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');
|
||||
|
||||
create table `EmployeeDataHistory` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`type` varchar(100) not null,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`field` varchar(100) not null,
|
||||
`old_value` varchar(500) default null,
|
||||
`new_value` varchar(500) default null,
|
||||
`description` varchar(800) default null,
|
||||
`user` bigint(20) NULL,
|
||||
`updated` timestamp default '0000-00-00 00:00:00',
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
CONSTRAINT `Fk_EmployeeDataHistory_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeDataHistory_Users` FOREIGN KEY (`user`) REFERENCES `Users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
|
||||
REPLACE INTO `FieldNameMappings` (`type`, `name`, `textOrig`, `textMapped`, `display`) VALUES
|
||||
('Employee', 'indirect_supervisors', 'Indirect Supervisors', 'Indirect Supervisors', 'Form');
|
||||
|
||||
Update Crons set time = (FLOOR( 1 + RAND( ) *58 )), type = 'Hourly' where name = 'Document Expire Alert';
|
||||
|
||||
CREATE TABLE `PayFrequency` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(200) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB default charset=utf8;
|
||||
|
||||
INSERT INTO `PayFrequency` VALUES
|
||||
(1,'Bi Weekly'),
|
||||
(2,'Weekly'),
|
||||
(3,'Semi Monthly'),
|
||||
(4,'Monthly'),
|
||||
(5,'Yearly');
|
||||
|
||||
|
||||
CREATE TABLE `PayrollColumnTemplates` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(50) DEFAULT NULL,
|
||||
`columns` varchar(500) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB default charset=utf8;
|
||||
|
||||
create table `Payroll` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(200) NULL,
|
||||
`pay_period` bigint(20) NOT NULL,
|
||||
`department` bigint(20) NOT NULL,
|
||||
`column_template` bigint(20) NOT NULL,
|
||||
`columns` varchar(500) DEFAULT NULL,
|
||||
`date_start` DATE NULL default '0000-00-00',
|
||||
`date_end` DATE NULL default '0000-00-00',
|
||||
`status` enum('Draft','Completed','Processing') default 'Draft',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
CREATE TABLE `PayrollData` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`payroll` bigint(20) NOT NULL,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`payroll_item` int(11) NOT NULL,
|
||||
`amount` varchar(25) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `PayrollDataUniqueKey` (`payroll`,`employee`,`payroll_item`),
|
||||
CONSTRAINT `Fk_PayrollData_Payroll` FOREIGN KEY (`payroll`) REFERENCES `Payroll` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB default charset=utf8;
|
||||
|
||||
|
||||
CREATE TABLE `PayrollColumns` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(50) DEFAULT NULL,
|
||||
`calculation_hook` varchar(200) DEFAULT NULL,
|
||||
`salary_components` varchar(500) DEFAULT NULL,
|
||||
`deductions` varchar(500) DEFAULT NULL,
|
||||
`add_columns` varchar(500) DEFAULT NULL,
|
||||
`sub_columns` varchar(500) DEFAULT NULL,
|
||||
`colorder` int(11) DEFAULT NULL,
|
||||
`editable` enum('Yes','No') default 'Yes',
|
||||
`enabled` enum('Yes','No') default 'Yes',
|
||||
`default_value` varchar(25) DEFAULT NULL,
|
||||
`calculation_columns` varchar(500) DEFAULT NULL,
|
||||
`calculation_function` varchar(100) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB default charset=utf8;
|
||||
|
||||
|
||||
|
||||
|
||||
INSERT INTO `PayrollColumns` (`id`,`name`,`calculation_hook`,`salary_components`,`deductions`,`add_columns`,`sub_columns`,`editable`) VALUES
|
||||
(1,'Total Hours','AttendanceUtil_getTimeWorkedHours','','','','','No'),
|
||||
(2,'Regular Hours','AttendanceUtil_getRegularWorkedHours','','','','','No'),
|
||||
(3,'Overtime Hours','AttendanceUtil_getOverTimeWorkedHours','','','','','No'),
|
||||
(4,'Leave Hours','LeaveUtil_getLeaveHours','','','','','No');
|
||||
|
||||
create table `PayrollEmployees` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`pay_frequency` int(11) default null,
|
||||
`currency` bigint(20) NULL,
|
||||
`deduction_exemptions` varchar(250) default null,
|
||||
`deduction_allowed` varchar(250) default null,
|
||||
CONSTRAINT `Fk_PayrollEmployee_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`),
|
||||
unique key `PayrollEmployees_employee` (`employee`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `DeductionGroup` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`description` varchar(100) NOT NULL,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
drop table `DeductionRules`;
|
||||
drop table `Deductions`;
|
||||
|
||||
create table `Deductions` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`componentType` varchar(250) NULL,
|
||||
`component` varchar(250) NULL,
|
||||
`payrollColumn` int(11) DEFAULT NULL,
|
||||
`rangeAmounts` text default null,
|
||||
`deduction_group` bigint(20) NULL,
|
||||
CONSTRAINT `Fk_Deductions_DeductionGroup` FOREIGN KEY (`deduction_group`) REFERENCES `DeductionGroup` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Update Reports set parameters = '[\r\n[ "department", {"label":"Department (Company)","type":"select2","remote-source":["CompanyStructure","id","title"],"allow-null":true}],\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":"Leave Status","type":"select","source":[["NULL","All Statuses"],["Approved","Approved"],["Pending","Pending"],["Rejected","Rejected"],["Cancellation Requested","Cancellation Requested"],["Cancelled","Cancelled"]]}]\r\n]' where name = "Employee Leaves Report";
|
||||
|
||||
|
||||
Delete from `Settings` where name = 'System: Default Country';
|
||||
@@ -8,7 +8,7 @@ error_log(print_r($_REQUEST,true));
|
||||
|
||||
if(empty($user)){
|
||||
|
||||
if(!isset($_REQUEST['f']) && isset($_COOKIE['icehrmLF']) && $_REQUEST['login'] != 'no' && !isset($_REQUEST['username'])){
|
||||
if(!isset($_REQUEST['f']) && isset($_COOKIE['icehrmLF']) && @$_REQUEST['login'] != 'no' && !isset($_REQUEST['username'])){
|
||||
$tempUser = new User();
|
||||
$tempUser->Load("login_hash = ?",array($_COOKIE['icehrmLF']));
|
||||
|
||||
@@ -30,14 +30,15 @@ if(empty($user)){
|
||||
LogManager::getInstance()->debug("LDAP: Enabled :" . SettingsManager::getInstance()->getSetting("LDAP: Enabled"));
|
||||
if (SettingsManager::getInstance()->getSetting("LDAP: Enabled") == "1") {
|
||||
$ldapResp = LDAPManager::getInstance()->checkLDAPLogin($_REQUEST['username'], $_REQUEST['password']);
|
||||
LogManager::getInstance()->debug("LDAP Response :" . json_encode($ldapResp));
|
||||
LogManager::getInstance()->debug("LDAP Response :" . print_r($ldapResp, true));
|
||||
LogManager::getInstance()->debug("LDAP Response Status :" . $ldapResp->getStatus());
|
||||
if ($ldapResp->getStatus() == IceResponse::ERROR) {
|
||||
header("Location:" . CLIENT_BASE_URL . "login.php?f=1");
|
||||
exit();
|
||||
} else {
|
||||
$suser = new User();
|
||||
$suser->Load("username = ?", array($_REQUEST['username']));
|
||||
|
||||
LogManager::getInstance()->debug("LDAP Response :[".$_REQUEST['username']."]" . print_r($suser, true));
|
||||
if (empty($suser)) {
|
||||
header("Location:" . CLIENT_BASE_URL . "login.php?f=1");
|
||||
exit();
|
||||
@@ -52,8 +53,6 @@ if(empty($user)){
|
||||
if(!isset($_REQUEST['hashedPwd'])){
|
||||
$_REQUEST['hashedPwd'] = md5($_REQUEST['password']);
|
||||
}
|
||||
$suser = null;
|
||||
$ssoUserLoaded = false;
|
||||
|
||||
include 'login.com.inc.php';
|
||||
|
||||
|
||||
@@ -1,6 +1,19 @@
|
||||
<?php
|
||||
class ICEHRM_Record extends ADOdb_Active_Record{
|
||||
|
||||
var $keysToIgnore = array(
|
||||
"_table",
|
||||
"_dbat",
|
||||
"_tableat",
|
||||
"_where",
|
||||
"_saved",
|
||||
"_lasterr",
|
||||
"_original",
|
||||
"foreignName",
|
||||
"a",
|
||||
"t"
|
||||
);
|
||||
|
||||
public function getAdminAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
@@ -77,4 +90,49 @@ class ICEHRM_Record extends ADOdb_Active_Record{
|
||||
public function allowIndirectMapping(){
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getDisplayName() {
|
||||
return get_called_class();
|
||||
}
|
||||
|
||||
public function getObjectKeys(){
|
||||
$keys = array();
|
||||
|
||||
foreach($this as $k=>$v){
|
||||
if(in_array($k,$this->keysToIgnore )){
|
||||
continue;
|
||||
}
|
||||
|
||||
if(is_array($v) || is_object($v)){
|
||||
continue;
|
||||
}
|
||||
|
||||
$keys[$k] = $k;
|
||||
}
|
||||
|
||||
return $keys;
|
||||
}
|
||||
|
||||
public function getCustomFields($obj){
|
||||
$keys = array();
|
||||
$objKeys = $this->getObjectKeys();
|
||||
foreach($obj as $k=>$v){
|
||||
if(isset($objKeys[$k])){
|
||||
continue;
|
||||
}
|
||||
|
||||
if(is_array($v) || is_object($v)){
|
||||
continue;
|
||||
}
|
||||
|
||||
if(in_array($k,$this->keysToIgnore )){
|
||||
continue;
|
||||
}
|
||||
|
||||
$keys[$k] = $k;
|
||||
}
|
||||
|
||||
return $keys;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -118,8 +118,8 @@
|
||||
<p id="verifyModelBody">
|
||||
<b>Step 1:</b><br/>
|
||||
Please get your Instance Key from here:<br/>
|
||||
<a target="_blank" href="http://icehrm.com/generateInstanceKey.php?id=<?=$baseService->getInstanceId()?>">
|
||||
http://icehrm.com/generateInstanceKey.php?id=<?=$baseService->getInstanceId()?>
|
||||
<a target="_blank" href="https://icehrm.com/generateInstanceKey.php?id=<?=$baseService->getInstanceId()?>">
|
||||
https://icehrm.com/generateInstanceKey.php?id=<?=$baseService->getInstanceId()?>
|
||||
</a>
|
||||
|
||||
<br/><b>Step 2:</b><br/>
|
||||
@@ -157,10 +157,10 @@
|
||||
<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="myModalLabel">Switch Employee</h3>
|
||||
<h3 id="myModalLabel"><?=LanguageManager::tran('Switch Employee')?></h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>Select the employee to Edit</p>
|
||||
<p><?=LanguageManager::tran('Select The Employee to Switch Into')?></p>
|
||||
<div style="border: solid 1px #EEE;">
|
||||
<select id="switch_emp" style="width:100%;">
|
||||
<!--
|
||||
@@ -176,11 +176,47 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
|
||||
<button class="btn btn-primary" onclick="modJs.setAdminProfile($('#switch_emp').val());return false;">Switch</button>
|
||||
<button class="btn" data-dismiss="modal" aria-hidden="true"><?=LanguageManager::tran('Close')?></button>
|
||||
<button class="btn btn-primary" onclick="modJs.setAdminProfile($('#switch_emp').val());return false;"><?=LanguageManager::tran('Switch')?></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Modal -->
|
||||
<?php }?>
|
||||
|
||||
|
||||
<?php if(isset($itemNameLower)){?>
|
||||
<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="">
|
||||
|
||||
</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 } ?>
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -43,6 +43,10 @@ INSERT INTO `Employees` (`id`, `employee_id`, `first_name`, `middle_name`, `last
|
||||
(15, CONCAT('EMP', RAND()), generate_fname(), '', generate_fname(), 10, '1979-07-15 18:30:00', 'Female', 'Single', '158-06-2292', '158-06-2292', '', '', NULL, 1, 5, 2, '', '1164', 'Walnut Avenue', 'Rochelle Park', 'US', 35, '7662', '201-474-8048', '201-474-8048', '201-474-8048', 'icehrm+user2@web-stalk.com', 'icehrm+user2@web-stalk.com', '2006-07-12 18:30:00', '0000-00-00 00:00:00', 2, 2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
|
||||
|
||||
UPDATE `Employees` set supervisor = 2, indirect_supervisors = '[3,4]', approver1 = 5, approver2 = 6, approver3 = 7 where id = 1;
|
||||
UPDATE `Employees` set supervisor = 1, indirect_supervisors = '[3,4]', approver1 = 5, approver2 = 6 where id = 2;
|
||||
UPDATE `Employees` set supervisor = 2, indirect_supervisors = '[1,4]', approver1 = 5 where id = 3;
|
||||
|
||||
INSERT INTO `EmergencyContacts` (`id`, `employee`, `name`, `relationship`, `home_phone`, `work_phone`, `mobile_phone`) VALUES
|
||||
(1, 1, 'Emma Owns', 'Mother', '+874463422', '+874463422', '+874463422'),
|
||||
(2, 2, 'Casey Watson', 'Sister', '231-453-876', '231-453-876', '231-453-876');
|
||||
@@ -129,7 +133,13 @@ INSERT INTO `Users` (`id`, `username`, `email`, `password`, `employee`,`default_
|
||||
(2, 'manager', 'icehrm+manager@web-stalk.com', '4048bb914a704a0728549a26b92d8550', 2,NULL, 'Manager','', '2013-01-03 02:47:37', '2013-01-03 02:47:37', '2013-01-03 02:47:37'),
|
||||
(3, 'user1', 'icehrm+user1@web-stalk.com', '4048bb914a704a0728549a26b92d8550', 3,NULL, 'Employee','', '2013-01-03 02:48:32', '2013-01-03 02:48:32', '2013-01-03 02:48:32'),
|
||||
(4, 'user2', 'icehrm+user2@web-stalk.com', '4048bb914a704a0728549a26b92d8550', 4,NULL, 'Employee','', '2013-01-03 02:58:55', '2013-01-03 02:58:55', '2013-01-03 02:58:55'),
|
||||
(5, 'user3', 'icehrm+user3@web-stalk.com', '4048bb914a704a0728549a26b92d8550', NULL,NULL, 'Other','["1"]', '2013-01-03 02:58:55', '2013-01-03 02:58:55', '2013-01-03 02:58:55');
|
||||
(5, 'user3', 'icehrm+user3@web-stalk.com', '4048bb914a704a0728549a26b92d8550', NULL,NULL, 'Other','["1"]', '2013-01-03 02:58:55', '2013-01-03 02:58:55', '2013-01-03 02:58:55'),
|
||||
(6, 'user4', 'icehrm+user4@web-stalk.com', '4048bb914a704a0728549a26b92d8550', 5,NULL, 'Manager','', '2013-01-03 02:58:55', '2013-01-03 02:58:55', '2013-01-03 02:58:55'),
|
||||
(7, 'user5', 'icehrm+user5@web-stalk.com', '4048bb914a704a0728549a26b92d8550', 6,NULL, 'Employee','', '2013-01-03 02:58:55', '2013-01-03 02:58:55', '2013-01-03 02:58:55'),
|
||||
(8, 'user6', 'icehrm+user6@web-stalk.com', '4048bb914a704a0728549a26b92d8550', 7,NULL, 'Employee','', '2013-01-03 02:58:55', '2013-01-03 02:58:55', '2013-01-03 02:58:55'),
|
||||
(9, 'user7', 'icehrm+user7@web-stalk.com', '4048bb914a704a0728549a26b92d8550', 8,NULL, 'Employee','', '2013-01-03 02:58:55', '2013-01-03 02:58:55', '2013-01-03 02:58:55'),
|
||||
(10, 'user8', 'icehrm+user8@web-stalk.com', '4048bb914a704a0728549a26b92d8550', 9,NULL, 'Employee','', '2013-01-03 02:58:55', '2013-01-03 02:58:55', '2013-01-03 02:58:55'),
|
||||
(11, 'user9', 'icehrm+user9@web-stalk.com', '4048bb914a704a0728549a26b92d8550', 10,NULL, 'Employee','', '2013-01-03 02:58:55', '2013-01-03 02:58:55', '2013-01-03 02:58:55');
|
||||
|
||||
INSERT INTO `Job` VALUES
|
||||
(1,'Software Engineer','More than 375,000 users world-wide rely on our software for their daily business as it makes creating graphical presentations so much easier, faster and more enjoyable. Among our customers are many renowned consulting companies and large international corporations.','More than 375,000 users world-wide rely on our software for their daily business as it makes creating graphical presentations so much easier, faster and more enjoyable. Among our customers are many renowned consulting companies and large international corporations.\n\nWe follow our own strategy and do not have to make compromises with regard to code quality and beauty, because think-cell is profitable and has no outside investors. We are flourishing without program managers, meetings, and marketing-driven deadlines. Our code quality is extraordinarily high because we only release software when it is ready. We are willing to do the leg work of developing sophisticated algorithms and refining our user interface, which makes working with think-cell’s software so satisfying.','Challenging C++ coding with high personal responsibility\nWork with a competent and creative team in a modern loft office in Berlin\nFamily-friendly working hours, no deadlines\nAbove-average salary (we offer our developers EUR 120,000 annually after one year of employment)\nFree supply of drinks, fruits, sweets and snacks\nFlat hierarchies and plenty of room for your ideas\nA full-time company nanny who is available for free when children are sick, or when you just feel like spending an evening out','[\"Health plan\",\"Paid vacations\"]',226,2,NULL,'JC001',1,NULL,7,14,9,151,'Yes',3500,5500,'job, engineer','Active','0000-00-00 00:00:00',NULL,'Text Only',1),
|
||||
@@ -191,10 +201,13 @@ INSERT INTO `Attendance` (`employee`,`in_time`,`out_time`,`note`) VALUES
|
||||
(3, FROM_UNIXTIME((UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 23 DAY))) + FLOOR(28800 + (RAND() * 3600)),'%Y-%m-%d %T'), FROM_UNIXTIME((UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 23 DAY))) + FLOOR(57600 + (RAND() * 21600)),'%Y-%m-%d %T'), ''),
|
||||
(3, FROM_UNIXTIME((UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 22 DAY))) + FLOOR(28800 + (RAND() * 3600)),'%Y-%m-%d %T'), FROM_UNIXTIME((UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 22 DAY))) + FLOOR(57600 + (RAND() * 21600)),'%Y-%m-%d %T'), '');
|
||||
|
||||
INSERT INTO `PayslipTemplates` (`id`, `name`, `data`, `status`, `created`, `updated`) VALUES
|
||||
(1, 'Basic', '[{"type":"Company Logo","payrollColumn":"NULL","label":"","text":"","fontSize":"Normal","fontStyle":"Normal","fontColor":"#000000","status":"Show","id":"data_1"},{"type":"Company Name","payrollColumn":"NULL","label":"","text":"","fontSize":"Normal","fontStyle":"Normal","fontColor":"","status":"Show","id":"data_2"},{"type":"Separators","payrollColumn":"NULL","label":"","text":"","fontSize":"Normal","fontStyle":"Normal","fontColor":"","status":"Show","id":"data_8"},{"type":"Payroll Column","payrollColumn":"5","label":"","text":"","fontSize":"Normal","fontStyle":"Normal","fontColor":"","status":"Show","id":"data_3"},{"type":"Payroll Column","payrollColumn":"6","label":"","text":"","fontSize":"Normal","fontStyle":"Normal","fontColor":"","status":"Show","id":"data_4"},{"type":"Payroll Column","payrollColumn":"17","label":"","text":"","fontSize":"Normal","fontStyle":"Normal","fontColor":"","status":"Show","id":"data_5"},{"type":"Separators","payrollColumn":"NULL","label":"","text":"","fontSize":"Normal","fontStyle":"Normal","fontColor":"","status":"Show","id":"data_9"},{"type":"Payroll Column","payrollColumn":"18","label":"","text":"","fontSize":"Normal","fontStyle":"Normal","fontColor":"","status":"Show","id":"data_6"},{"type":"Separators","payrollColumn":"NULL","label":"","text":"","fontSize":"Normal","fontStyle":"Normal","fontColor":"","status":"Show","id":"data_10"},{"type":"Text","payrollColumn":"NULL","label":"","text":"Big Company Ltd. is a limited company registered in England and Wales. Registered number: 1234567. Registered office: 123 Some Street, Somewhere, Someshire.","fontSize":"Normal","fontStyle":"Normal","fontColor":"","status":"Show","id":"data_7"}]', NULL, '2016-06-30 03:37:12', '2016-06-30 03:37:12');
|
||||
|
||||
|
||||
INSERT INTO `Payroll` VALUES
|
||||
(1,'2016-03',4,1,1,'[\"5\",\"8\",\"9\",\"10\",\"6\",\"7\",\"4\",\"3\",\"2\",\"1\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\"]','2016-03-01','2016-03-31','Draft'),
|
||||
(2,'2016-03-Weekly',2,1,2,'[\"1\",\"2\",\"3\"]','2016-03-01','2016-03-31','Draft');
|
||||
(1,'2016-03',4,1,1,'[\"5\",\"8\",\"9\",\"10\",\"6\",\"7\",\"4\",\"3\",\"2\",\"1\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\"]','2016-03-01','2016-03-31','Draft', 1),
|
||||
(2,'2016-03-Weekly',2,1,2,'[\"1\",\"2\",\"3\"]','2016-03-01','2016-03-31','Draft', 1);
|
||||
|
||||
INSERT INTO `PayrollColumns` VALUES
|
||||
(5,'Basic Salary',NULL,'[\"1\"]','[]','[]','[]',5,'No','Yes','0.00',NULL,NULL),
|
||||
@@ -276,6 +289,9 @@ INSERT INTO `EmployeeLeaveDays` VALUES
|
||||
(17,3,FROM_UNIXTIME((UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 21 DAY))),'%Y-%m-%d'),'Full Day'),
|
||||
(18,3,FROM_UNIXTIME((UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 22 DAY))),'%Y-%m-%d'),'Full Day');
|
||||
|
||||
INSERT INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('Instance : ID', '0847429146712c108e23c435e8f93b4d', '',''),
|
||||
('Instance: Key', 'UQHEYBx9H1eNR66nhNCNCz1WCDDhkjtx1OuJbO3ZQMt+8tfSGvuOH/YEHntRajY=', '','');
|
||||
|
||||
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
|
||||
@@ -7,6 +7,7 @@ create table `CompanyStructures` (
|
||||
`country` varchar(2) not null default '0',
|
||||
`parent` bigint(20) NULL,
|
||||
`timezone` varchar(100) not null default 'Europe/London',
|
||||
`heads` varchar(255) NULL default NULL,
|
||||
CONSTRAINT `Fk_CompanyStructures_Own` FOREIGN KEY (`parent`) REFERENCES `CompanyStructures` (`id`),
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
@@ -93,6 +94,13 @@ create table `Languages` (
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `SupportedLanguages` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) default null,
|
||||
`description` varchar(100) default null,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `Nationality` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) default null,
|
||||
@@ -155,6 +163,9 @@ create table `Employees` (
|
||||
`status` enum('Active','Terminated') default 'Active',
|
||||
`ethnicity` bigint(20) default null,
|
||||
`immigration_status` bigint(20) default null,
|
||||
`approver1` bigint(20) default null,
|
||||
`approver2` bigint(20) default null,
|
||||
`approver3` bigint(20) default null,
|
||||
CONSTRAINT `Fk_Employee_Nationality` FOREIGN KEY (`nationality`) REFERENCES `Nationality` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_Employee_JobTitle` FOREIGN KEY (`job_title`) REFERENCES `JobTitles` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_Employee_EmploymentStatus` FOREIGN KEY (`employment_status`) REFERENCES `EmploymentStatus` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
@@ -211,7 +222,9 @@ create table `Users` (
|
||||
`last_update` timestamp default '0000-00-00 00:00:00',
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
`login_hash` varchar(64) default null,
|
||||
`lang` bigint(20) default null,
|
||||
CONSTRAINT `Fk_User_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_User_SupportedLanguages` FOREIGN KEY (`lang`) REFERENCES `SupportedLanguages` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
primary key (`id`),
|
||||
unique key `username` (`username`),
|
||||
INDEX login_hash_index (`login_hash`)
|
||||
@@ -394,7 +407,7 @@ create table `EmployeeLeaves` (
|
||||
`date_start` date default '0000-00-00',
|
||||
`date_end` date default '0000-00-00',
|
||||
`details` text default null,
|
||||
`status` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending',
|
||||
`status` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled','Processing') default 'Pending',
|
||||
`attachment` varchar(100) NULL,
|
||||
CONSTRAINT `Fk_EmployeeLeaves_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeLeaves_LeaveTypes` FOREIGN KEY (`leave_type`) REFERENCES `LeaveTypes` (`id`),
|
||||
@@ -407,8 +420,8 @@ create table `EmployeeLeaveLog` (
|
||||
`employee_leave` bigint(20) NOT NULL,
|
||||
`user_id` bigint(20) NULL,
|
||||
`data` varchar(500) NOT NULL,
|
||||
`status_from` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending',
|
||||
`status_to` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending',
|
||||
`status_from` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled','Processing') default 'Pending',
|
||||
`status_to` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled','Processing') default 'Pending',
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
CONSTRAINT `Fk_EmployeeLeaveLog_EmployeeLeaves` FOREIGN KEY (`employee_leave`) REFERENCES `EmployeeLeaves` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeLeaveLog_Users` FOREIGN KEY (`user_id`) REFERENCES `Users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
@@ -454,7 +467,7 @@ create table `Projects` (
|
||||
`client` bigint(20) NULL,
|
||||
`details` text default null,
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
`status` enum('Active','Inactive') default 'Active',
|
||||
`status` enum('Active','On Hold','Completed', 'Dropped') default 'Active',
|
||||
CONSTRAINT `Fk_Projects_Client` FOREIGN KEY (`client`) REFERENCES `Clients` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
@@ -612,6 +625,7 @@ create table `Reports` (
|
||||
`paramOrder` varchar(500) NOT NULL,
|
||||
`type` enum('Query','Class') default 'Query',
|
||||
`report_group` varchar(500) NULL,
|
||||
`output` varchar(15) NOT NULL default 'CSV',
|
||||
primary key (`id`),
|
||||
UNIQUE KEY `Reports_Name` (`name`)
|
||||
) engine=innodb default charset=utf8;
|
||||
@@ -780,7 +794,7 @@ create table `EmployeeTravelRecords` (
|
||||
`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',
|
||||
`status` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled','Processing') 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;
|
||||
@@ -818,7 +832,14 @@ create table `CustomFields` (
|
||||
`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`)
|
||||
`field_type` varchar(20) NULL,
|
||||
`field_label` varchar(50) NULL,
|
||||
`field_validation` varchar(50) NULL,
|
||||
`field_options` varchar(500) NULL,
|
||||
`display_order` int(11) default 0,
|
||||
`display_section` varchar(50) NULL,
|
||||
primary key (`id`),
|
||||
unique key `CustomFields_name` (`type`,`name`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
@@ -930,11 +951,12 @@ create table `Payroll` (
|
||||
`name` varchar(200) NULL,
|
||||
`pay_period` bigint(20) NOT NULL,
|
||||
`department` bigint(20) NOT NULL,
|
||||
`column_template` bigint(20) NOT NULL,
|
||||
`column_template` bigint(20) NULL,
|
||||
`columns` varchar(500) DEFAULT NULL,
|
||||
`date_start` DATE NULL default '0000-00-00',
|
||||
`date_end` DATE NULL default '0000-00-00',
|
||||
`status` enum('Draft','Completed','Processing') default 'Draft',
|
||||
`payslipTemplate` bigint(20) NULL,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
@@ -1225,7 +1247,7 @@ create table `EmployeeExpenses` (
|
||||
`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',
|
||||
`status` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled','Processing') 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,
|
||||
@@ -1257,3 +1279,146 @@ create table `EmployeeDataHistory` (
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `EmployeeAttendanceSheets` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`date_start` date NOT NULL,
|
||||
`date_end` date NOT NULL,
|
||||
`status` enum('Approved','Pending','Rejected','Submitted') default 'Pending',
|
||||
CONSTRAINT `Fk_EmployeeAttendanceSheets_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
UNIQUE KEY `EmployeeAttendanceSheetsKey` (`employee`,`date_start`,`date_end`),
|
||||
KEY `EmployeeAttendanceSheets_date_end` (`date_end`),
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `CustomFieldValues` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`type` varchar(20) not null,
|
||||
`name` varchar(60) not null,
|
||||
`object_id` varchar(60) not null,
|
||||
`value` text default NULL,
|
||||
`updated` timestamp default '0000-00-00 00:00:00',
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
primary key (`id`),
|
||||
UNIQUE key `CustomFields_type_name_object_id` (`type`,`name`,`object_id`),
|
||||
INDEX `CustomFields_type_object_id` (`type`,`object_id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `DataImport` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(60) not null,
|
||||
`dataType` varchar(60) not null,
|
||||
`details` text default NULL,
|
||||
`columns` text default NULL,
|
||||
`updated` timestamp default '0000-00-00 00:00:00',
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `DataImportFiles` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(60) not null,
|
||||
`data_import_definition` varchar(200) not null,
|
||||
`status` varchar(15) null,
|
||||
`file` varchar(100) null,
|
||||
`details` text default NULL,
|
||||
`updated` timestamp default '0000-00-00 00:00:00',
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `UserReports` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`details` text default null,
|
||||
`parameters` text default null,
|
||||
`query` text default null,
|
||||
`paramOrder` varchar(500) NOT NULL,
|
||||
`type` enum('Query','Class') default 'Query',
|
||||
`report_group` varchar(500) NULL,
|
||||
`output` varchar(15) NOT NULL default 'CSV',
|
||||
primary key (`id`),
|
||||
UNIQUE KEY `UserReports_Name` (`name`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `ReportFiles` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NULL,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`attachment` varchar(100) NOT NULL,
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
unique key `ReportFiles_attachment` (`attachment`),
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `PayslipTemplates` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`data` longtext NULL,
|
||||
`status` enum('Show','Hide') default 'Show',
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
`updated` timestamp default '0000-00-00 00:00:00',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `EmployeeApprovals` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`type` varchar(100) NOT NULL,
|
||||
`element` bigint(20) NOT NULL,
|
||||
`approver` bigint(20) NULL,
|
||||
`level` int(11) default 0,
|
||||
`status` int(11) default 0,
|
||||
`active` int(11) default 0,
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
`updated` timestamp default '0000-00-00 00:00:00',
|
||||
UNIQUE key `EmployeeApprovals_type_element_level` (`type`,`element`,`level`),
|
||||
INDEX `EmployeeApprovals_type_element_status_level` (`type`,`element`,`status`,`level`),
|
||||
INDEX `EmployeeApprovals_type_element` (`type`,`element`),
|
||||
INDEX `EmployeeApprovals_type` (`type`),
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `StatusChangeLogs` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`type` varchar(100) NOT NULL,
|
||||
`element` bigint(20) NOT NULL,
|
||||
`user_id` bigint(20) NULL,
|
||||
`data` varchar(500) NOT NULL,
|
||||
`status_from` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled','Processing') default 'Pending',
|
||||
`status_to` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled','Processing') default 'Pending',
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
INDEX `EmployeeApprovals_type_element` (`type`,`element`),
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `OvertimeCategories` (
|
||||
`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 `EmployeeOvertime` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`start_time` timestamp NULL default '0000-00-00 00:00:00',
|
||||
`end_time` timestamp NULL default '0000-00-00 00:00:00',
|
||||
`category` bigint(20) NOT NULL,
|
||||
`project` bigint(20) NULL,
|
||||
`notes` text 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','Processing') default 'Pending',
|
||||
CONSTRAINT `Fk_EmployeeOvertime_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeOvertime_Category` FOREIGN KEY (`category`) REFERENCES `OvertimeCategories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
839
core-ext/scripts/upgrade_v15.2.OS_to_v16.0.OS.sql
Normal file
839
core-ext/scripts/upgrade_v15.2.OS_to_v16.0.OS.sql
Normal file
@@ -0,0 +1,839 @@
|
||||
REPLACE INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`, `type`,`report_group`) VALUES
|
||||
('Employee Details Report', 'This report list all employee details and you can filter employees by department, employment status or job title', '[\r\n[ "department", {"label":"Department","type":"select2","remote-source":["CompanyStructure","id","title"],"allow-null":true}],\r\n[ "employment_status", {"label":"Employment Status","type":"select2","remote-source":["EmploymentStatus","id","name"],"allow-null":true}],\r\n[ "job_title", {"label":"Job Title","type":"select2","remote-source":["JobTitle","id","name"],"allow-null":true}]\r\n]', 'Select id, employee_id as ''Employee ID'',\r\nconcat(`first_name`,'' '',`middle_name`,'' '', `last_name`) as ''Name'',\r\n(SELECT name from Nationality where id = nationality) as ''Nationality'',\r\nbirthday as ''Birthday'',\r\ngender as ''Gender'',\r\nmarital_status as ''Marital Status'',\r\nssn_num as ''SSN Number'',\r\nnic_num as ''NIC Number'',\r\nother_id as ''Other IDs'',\r\ndriving_license as ''Driving License Number'',\r\n(SELECT name from EmploymentStatus where id = employment_status) as ''Employment Status'',\r\n(SELECT name from JobTitles where id = job_title) as ''Job Title'',\r\n(SELECT name from PayGrades where id = pay_grade) as ''Pay Grade'',\r\nwork_station_id as ''Work Station ID'',\r\naddress1 as ''Address 1'',\r\naddress2 as ''Address 2'',\r\ncity as ''City'',\r\n(SELECT name from Country where code = country) as ''Country'',\r\n(SELECT name from Province where id = province) as ''Province'',\r\npostal_code as ''Postal Code'',\r\nhome_phone as ''Home Phone'',\r\nmobile_phone as ''Mobile Phone'',\r\nwork_phone as ''Work Phone'',\r\nwork_email as ''Work Email'',\r\nprivate_email as ''Private Email'',\r\njoined_date as ''Joined Date'',\r\nconfirmation_date as ''Confirmation Date'',\r\n(SELECT title from CompanyStructures where id = department) as ''Department'',\r\n(SELECT concat(`first_name`,'' '',`middle_name`,'' '', `last_name`,'' [Employee ID:'',`employee_id`,'']'') from Employees e1 where e1.id = e.supervisor) as ''Supervisor'' \r\nFROM Employees e _where_', '["department","employment_status","job_title"]', 'Query', 'Employee Information'),
|
||||
('Employee Time Entry Report', 'This report list all employee time entries by employee, date range and project', '[\r\n[ "employee", {"label":"Employee","type":"select2multi","allow-null":true,"null-label":"All Employees","remote-source":["Employee","id","first_name+last_name"]}],\r\n[ "project", {"label":"Project","type":"select","allow-null":true,"remote-source":["Project","id","name"]}],\r\n[ "date_start", {"label":"Start Date","type":"date"}],\r\n[ "date_end", {"label":"End Date","type":"date"}]\r\n]', 'EmployeeTimesheetReport', '["employee","date_start","date_end","status"]', 'Class','Time Management'),
|
||||
('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','Time Management'),
|
||||
('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','Time Management');
|
||||
|
||||
REPLACE INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`, `type`,`report_group`) VALUES
|
||||
('Active Employee Report', 'This report list employees who are currently active based on joined date and termination date ',
|
||||
'[\r\n[ "department", {"label":"Department","type":"select2","remote-source":["CompanyStructure","id","title"],"allow-null":true}]\r\n]',
|
||||
'ActiveEmployeeReport',
|
||||
'["department"]', 'Class','Employee Information');
|
||||
|
||||
REPLACE INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`, `type`, `report_group`) VALUES
|
||||
('New Hires Employee Report', 'This report list employees who are joined between given two dates ',
|
||||
'[[ "department", {"label":"Department","type":"select2","remote-source":["CompanyStructure","id","title"],"allow-null":true}],\r\n[ "date_start", {"label":"Start Date","type":"date"}],\r\n[ "date_end", {"label":"End Date","type":"date"}]\r\n]',
|
||||
'NewHiresEmployeeReport',
|
||||
'["department","date_start","date_end"]', 'Class','Employee Information');
|
||||
|
||||
REPLACE INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`, `type`, `report_group`) VALUES
|
||||
('Terminated Employee Report', 'This report list employees who are terminated between given two dates ',
|
||||
'[[ "department", {"label":"Department","type":"select2","remote-source":["CompanyStructure","id","title"],"allow-null":true}],\r\n[ "date_start", {"label":"Start Date","type":"date"}],\r\n[ "date_end", {"label":"End Date","type":"date"}]\r\n]',
|
||||
'TerminatedEmployeeReport',
|
||||
'["department","date_start","date_end"]', 'Class','Employee Information');
|
||||
|
||||
|
||||
|
||||
|
||||
REPLACE INTO `Reports` (`name`, `details`, `parameters`, `query`, `paramOrder`, `type`,`report_group`) VALUES
|
||||
('Employee Time Sheet Report', 'This report list all employee time sheets 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[ "status", {"label":"Status","allow-null":true,"null-label":"All Status","type":"select","source":[["Approved","Approved"],["Pending","Pending"],["Rejected","Rejected"]]}]\r\n]', 'EmployeeTimeSheetData', '["employee","date_start","date_end","status"]', 'Class','Time Management');
|
||||
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('LDAP: Enabled', '0', '','["value", {"label":"Value","type":"select","source":[["0","No"],["1","Yes"]]}]'),
|
||||
('LDAP: Server', '', 'LDAP Server IP or DNS',''),
|
||||
('LDAP: Port', '389', 'LDAP Server Port',''),
|
||||
('LDAP: Root DN', '', 'e.g: dc=mycompany,dc=net',''),
|
||||
('LDAP: Manager DN', '', 'e.g: cn=admin,dc=mycompany,dc=net',''),
|
||||
('LDAP: Manager Password', '', 'Password of the manager user',''),
|
||||
('LDAP: Version 3', '1', 'Are you using LDAP v3','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]'),
|
||||
('LDAP: User Filter', '', 'e.g: uid={}, we will replace {} with actual username provided by the user at the time of login','');
|
||||
|
||||
|
||||
|
||||
|
||||
/* v15.0.PRO to v16.0.PRO */
|
||||
|
||||
ALTER TABLE `Users` ADD COLUMN `login_hash` varchar(64) default null;
|
||||
ALTER TABLE `Users` ADD INDEX login_hash_index (`login_hash`);
|
||||
|
||||
INSERT INTO `ImmigrationStatus` VALUES
|
||||
(1,'Citizen'),
|
||||
(2,'Permanent Resident'),
|
||||
(3,'Work Permit Holder'),
|
||||
(4,'Dependant Pass Holder');
|
||||
|
||||
INSERT INTO `Ethnicity` VALUES
|
||||
(1,'White American'),
|
||||
(2,'Black or African American'),
|
||||
(3,'Native American'),
|
||||
(4,'Alaska Native'),
|
||||
(5,'Asian American'),
|
||||
(6,'Native Hawaiian'),
|
||||
(7,'Pacific Islander');
|
||||
|
||||
REPLACE 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"]]}]');
|
||||
|
||||
REPLACE 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"]]}]');
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('System: Reset Module Names', '1', 'Select this to reset module names in Database','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]');
|
||||
|
||||
REPLACE 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', ''),
|
||||
('Api: REST Api Enabled', '1', '','["value", {"label":"Value","type":"select","source":[["0","No"],["1","Yes"]]}]'),
|
||||
('Api: REST Api Token', 'Click on edit icon', '','["value", {"label":"Value","type":"placeholder"}]');
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('System: Allowed Countries', '0', 'Only these countries will be allowed in select boxes','["value", {"label":"Value","type":"select2multi","remote-source":["Country","id","name"]}]');
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('System: Allowed Currencies', '0', 'Only these currencies will be allowed in select boxes','["value", {"label":"Value","type":"select2multi","remote-source":["CurrencyType","id","code+name"]}]');
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('System: Allowed Nationality', '', 'Only these nationalities will be allowed in select boxes','["value", {"label":"Value","type":"select2multi","remote-source":["Nationality","id","name"]}]');
|
||||
|
||||
|
||||
REPLACE 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');
|
||||
|
||||
REPLACE 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');
|
||||
|
||||
create table `EmployeeDataHistory` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`type` varchar(100) not null,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`field` varchar(100) not null,
|
||||
`old_value` varchar(500) default null,
|
||||
`new_value` varchar(500) default null,
|
||||
`description` varchar(800) default null,
|
||||
`user` bigint(20) NULL,
|
||||
`updated` timestamp default '0000-00-00 00:00:00',
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
CONSTRAINT `Fk_EmployeeDataHistory_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeDataHistory_Users` FOREIGN KEY (`user`) REFERENCES `Users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
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';
|
||||
|
||||
|
||||
REPLACE INTO `FieldNameMappings` (`type`, `name`, `textOrig`, `textMapped`, `display`) VALUES
|
||||
('Employee', 'indirect_supervisors', 'Indirect Supervisors', 'Indirect Supervisors', 'Form');
|
||||
|
||||
Update Crons set time = (FLOOR( 1 + RAND( ) *58 )), type = 'Hourly' where name = 'Document Expire Alert';
|
||||
|
||||
CREATE TABLE `PayFrequency` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(200) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB default charset=utf8;
|
||||
|
||||
INSERT INTO `PayFrequency` VALUES
|
||||
(1,'Bi Weekly'),
|
||||
(2,'Weekly'),
|
||||
(3,'Semi Monthly'),
|
||||
(4,'Monthly'),
|
||||
(5,'Yearly');
|
||||
|
||||
|
||||
CREATE TABLE `PayrollColumnTemplates` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(50) DEFAULT NULL,
|
||||
`columns` varchar(500) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB default charset=utf8;
|
||||
|
||||
create table `Payroll` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(200) NULL,
|
||||
`pay_period` bigint(20) NOT NULL,
|
||||
`department` bigint(20) NOT NULL,
|
||||
`column_template` bigint(20) NOT NULL,
|
||||
`columns` varchar(500) DEFAULT NULL,
|
||||
`date_start` DATE NULL default '0000-00-00',
|
||||
`date_end` DATE NULL default '0000-00-00',
|
||||
`status` enum('Draft','Completed','Processing') default 'Draft',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
CREATE TABLE `PayrollData` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`payroll` bigint(20) NOT NULL,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`payroll_item` int(11) NOT NULL,
|
||||
`amount` varchar(25) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `PayrollDataUniqueKey` (`payroll`,`employee`,`payroll_item`),
|
||||
CONSTRAINT `Fk_PayrollData_Payroll` FOREIGN KEY (`payroll`) REFERENCES `Payroll` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB default charset=utf8;
|
||||
|
||||
|
||||
CREATE TABLE `PayrollColumns` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(50) DEFAULT NULL,
|
||||
`calculation_hook` varchar(200) DEFAULT NULL,
|
||||
`salary_components` varchar(500) DEFAULT NULL,
|
||||
`deductions` varchar(500) DEFAULT NULL,
|
||||
`add_columns` varchar(500) DEFAULT NULL,
|
||||
`sub_columns` varchar(500) DEFAULT NULL,
|
||||
`colorder` int(11) DEFAULT NULL,
|
||||
`editable` enum('Yes','No') default 'Yes',
|
||||
`enabled` enum('Yes','No') default 'Yes',
|
||||
`default_value` varchar(25) DEFAULT NULL,
|
||||
`calculation_columns` varchar(500) DEFAULT NULL,
|
||||
`calculation_function` varchar(100) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB default charset=utf8;
|
||||
|
||||
|
||||
|
||||
|
||||
INSERT INTO `PayrollColumns` (`id`,`name`,`calculation_hook`,`salary_components`,`deductions`,`add_columns`,`sub_columns`,`editable`) VALUES
|
||||
(1,'Total Hours','AttendanceUtil_getTimeWorkedHours','','','','','No'),
|
||||
(2,'Regular Hours','AttendanceUtil_getRegularWorkedHours','','','','','No'),
|
||||
(3,'Overtime Hours','AttendanceUtil_getOverTimeWorkedHours','','','','','No'),
|
||||
(4,'Leave Hours','LeaveUtil_getLeaveHours','','','','','No');
|
||||
|
||||
create table `PayrollEmployees` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`pay_frequency` int(11) default null,
|
||||
`currency` bigint(20) NULL,
|
||||
`deduction_exemptions` varchar(250) default null,
|
||||
`deduction_allowed` varchar(250) default null,
|
||||
CONSTRAINT `Fk_PayrollEmployee_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`),
|
||||
unique key `PayrollEmployees_employee` (`employee`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `DeductionGroup` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`description` varchar(100) NOT NULL,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
drop table `DeductionRules`;
|
||||
drop table `Deductions`;
|
||||
|
||||
create table `Deductions` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`componentType` varchar(250) NULL,
|
||||
`component` varchar(250) NULL,
|
||||
`payrollColumn` int(11) DEFAULT NULL,
|
||||
`rangeAmounts` text default null,
|
||||
`deduction_group` bigint(20) NULL,
|
||||
CONSTRAINT `Fk_Deductions_DeductionGroup` FOREIGN KEY (`deduction_group`) REFERENCES `DeductionGroup` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Update Reports set parameters = '[\r\n[ "department", {"label":"Department (Company)","type":"select2","remote-source":["CompanyStructure","id","title"],"allow-null":true}],\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":"Leave Status","type":"select","source":[["NULL","All Statuses"],["Approved","Approved"],["Pending","Pending"],["Rejected","Rejected"],["Cancellation Requested","Cancellation Requested"],["Cancelled","Cancelled"]]}]\r\n]' where name = "Employee Leaves Report";
|
||||
|
||||
|
||||
Delete from `Settings` where name = 'System: Default Country';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
create table `LeaveTypes` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`supervisor_leave_assign` enum('Yes','No') default 'Yes',
|
||||
`employee_can_apply` enum('Yes','No') default 'Yes',
|
||||
`apply_beyond_current` enum('Yes','No') default 'Yes',
|
||||
`leave_accrue` enum('No','Yes') default 'No',
|
||||
`carried_forward` enum('No','Yes') default 'No',
|
||||
`default_per_year` decimal(10,3) NOT NULL,
|
||||
`carried_forward_percentage` int(11) NULL default 0,
|
||||
`carried_forward_leave_availability` int(11) NULL default 365,
|
||||
`propotionate_on_joined_date` enum('No','Yes') default 'No',
|
||||
`send_notification_emails` enum('Yes','No') default 'Yes',
|
||||
`leave_group` bigint(20) NULL,
|
||||
`leave_color` varchar(10) NULL,
|
||||
`max_carried_forward_amount` int(11) NULL default 0,
|
||||
primary key (`id`),
|
||||
unique key (`name`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `LeaveRules` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`leave_type` bigint(20) NOT NULL,
|
||||
`job_title` bigint(20) NULL,
|
||||
`employment_status` bigint(20) NULL,
|
||||
`employee` bigint(20) NULL,
|
||||
`supervisor_leave_assign` enum('Yes','No') default 'Yes',
|
||||
`employee_can_apply` enum('Yes','No') default 'Yes',
|
||||
`apply_beyond_current` enum('Yes','No') default 'Yes',
|
||||
`leave_accrue` enum('No','Yes') default 'No',
|
||||
`carried_forward` enum('No','Yes') default 'No',
|
||||
`default_per_year` decimal(10,3) NOT NULL,
|
||||
`carried_forward_percentage` int(11) NULL default 0,
|
||||
`carried_forward_leave_availability` int(11) NULL default 365,
|
||||
`propotionate_on_joined_date` enum('No','Yes') default 'No',
|
||||
`leave_group` bigint(20) NULL,
|
||||
`max_carried_forward_amount` int(11) NULL default 0,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `LeaveGroups` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`details` text default 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 `LeaveGroupEmployees` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`leave_group` bigint(20) NOT NULL,
|
||||
`created` timestamp NULL default '0000-00-00 00:00:00',
|
||||
`updated` timestamp NULL default '0000-00-00 00:00:00',
|
||||
CONSTRAINT `Fk_LeaveGroupEmployees_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_LeaveGroupEmployees_LeaveGroups` FOREIGN KEY (`leave_group`) REFERENCES `LeaveGroups` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
primary key (`id`),
|
||||
unique key `LeaveGroupEmployees_employee` (`employee`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `LeavePeriods` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`date_start` date default '0000-00-00',
|
||||
`date_end` date default '0000-00-00',
|
||||
`status` enum('Active','Inactive') default 'Inactive',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `WorkDays` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`status` enum('Full Day','Half Day','Non-working Day') default 'Full Day',
|
||||
`country` bigint(20) DEFAULT NULL,
|
||||
primary key (`id`),
|
||||
unique key `workdays_name_country` (`name`,`country`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `HoliDays` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`dateh` date default '0000-00-00',
|
||||
`status` enum('Full Day','Half Day') default 'Full Day',
|
||||
`country` bigint(20) DEFAULT NULL,
|
||||
primary key (`id`),
|
||||
unique key `holidays_dateh_country` (`dateh`,`country`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `EmployeeLeaves` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee` bigint(20) NOT NULL,
|
||||
`leave_type` bigint(20) NOT NULL,
|
||||
`leave_period` bigint(20) NOT NULL,
|
||||
`date_start` date default '0000-00-00',
|
||||
`date_end` date default '0000-00-00',
|
||||
`details` text default null,
|
||||
`status` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending',
|
||||
`attachment` varchar(100) NULL,
|
||||
CONSTRAINT `Fk_EmployeeLeaves_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeLeaves_LeaveTypes` FOREIGN KEY (`leave_type`) REFERENCES `LeaveTypes` (`id`),
|
||||
CONSTRAINT `Fk_EmployeeLeaves_LeavePeriods` FOREIGN KEY (`leave_period`) REFERENCES `LeavePeriods` (`id`),
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `EmployeeLeaveLog` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee_leave` bigint(20) NOT NULL,
|
||||
`user_id` bigint(20) NULL,
|
||||
`data` varchar(500) NOT NULL,
|
||||
`status_from` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending',
|
||||
`status_to` enum('Approved','Pending','Rejected','Cancellation Requested','Cancelled') default 'Pending',
|
||||
`created` timestamp default '0000-00-00 00:00:00',
|
||||
CONSTRAINT `Fk_EmployeeLeaveLog_EmployeeLeaves` FOREIGN KEY (`employee_leave`) REFERENCES `EmployeeLeaves` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_EmployeeLeaveLog_Users` FOREIGN KEY (`user_id`) REFERENCES `Users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `EmployeeLeaveDays` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`employee_leave` bigint(20) NOT NULL,
|
||||
`leave_date` date default '0000-00-00',
|
||||
`leave_type` enum('Full Day','Half Day - Morning','Half Day - Afternoon','1 Hour - Morning','2 Hours - Morning','3 Hours - Morning','1 Hour - Afternoon','2 Hours - Afternoon','3 Hours - Afternoon') NOT NULL,
|
||||
CONSTRAINT `Fk_EmployeeLeaveDays_EmployeeLeaves` FOREIGN KEY (`employee_leave`) REFERENCES `EmployeeLeaves` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
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,
|
||||
`expire_notification` enum('Yes','No') default 'Yes',
|
||||
`expire_notification_month` enum('Yes','No') default 'Yes',
|
||||
`expire_notification_week` enum('Yes','No') default 'Yes',
|
||||
`expire_notification_day` enum('Yes','No') default 'Yes',
|
||||
`sign` enum('Yes','No') default 'Yes',
|
||||
`sign_label` 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`)
|
||||
) 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,
|
||||
`signature` text default null,
|
||||
`expire_notification_last` int(4) 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`),
|
||||
KEY `KEY_EmployeeDocuments_valid_until` (`valid_until`),
|
||||
KEY `KEY_EmployeeDocuments_valid_until_status` (`valid_until`,`status`,`expire_notification_last`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `CompanyDocuments` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`details` text default null,
|
||||
`valid_until` date NOT NULL,
|
||||
`status` enum('Active','Inactive','Draft') default 'Active',
|
||||
`notify_employees` enum('Yes','No') default 'Yes',
|
||||
`attachment` varchar(100) NULL,
|
||||
primary key (`id`)
|
||||
) 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) 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',
|
||||
`requireProof` enum('Yes','No') default 'Yes',
|
||||
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','Completed') default 'Scheduled',
|
||||
`proof` varchar(300) NULL,
|
||||
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 `LeaveStartingBalance` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`leave_type` bigint(20) NOT NULL,
|
||||
`employee` bigint(20) NULL,
|
||||
`leave_period` bigint(20) NOT NULL,
|
||||
`amount` decimal(10,3) NOT NULL,
|
||||
`note` text DEFAULT NULL,
|
||||
`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;
|
||||
|
||||
|
||||
|
||||
/* Sync with Default Schema */
|
||||
|
||||
create table `EmployementType` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(250) not null default '',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `Industry` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(250) not null default '',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `ExperienceLevel` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(250) not null default '',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `JobFunction` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(250) not null default '',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `EducationLevel` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(250) not null default '',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `Benifits` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(250) not null default '',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `Tags` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(250) not null default '',
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `Job` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(200) NOT NULL,
|
||||
`shortDescription` text DEFAULT NULL,
|
||||
`description` text DEFAULT NULL,
|
||||
`requirements` text DEFAULT NULL,
|
||||
`benefits` text DEFAULT NULL,
|
||||
`country` bigint(20) DEFAULT NULL,
|
||||
`company` bigint(20) DEFAULT NULL,
|
||||
`department` VARCHAR(100) NULL,
|
||||
`code` VARCHAR(20) NULL,
|
||||
`employementType` bigint(20) DEFAULT NULL,
|
||||
`industry` bigint(20) DEFAULT NULL,
|
||||
`experienceLevel` bigint(20) DEFAULT NULL,
|
||||
`jobFunction` bigint(20) DEFAULT NULL,
|
||||
`educationLevel` bigint(20) DEFAULT NULL,
|
||||
`currency` bigint(20) DEFAULT NULL,
|
||||
`showSalary` enum('Yes','No') default NULL,
|
||||
`salaryMin` bigint(20) DEFAULT NULL,
|
||||
`salaryMax` bigint(20) DEFAULT NULL,
|
||||
`keywords` text DEFAULT NULL,
|
||||
`status` enum('Active','On hold','Closed') default NULL,
|
||||
`closingDate` DATETIME default '0000-00-00 00:00:00',
|
||||
`attachment` varchar(100) NULL,
|
||||
`display` varchar(200) NOT NULL,
|
||||
`postedBy` bigint(20) DEFAULT NULL,
|
||||
INDEX `Job_status` (`status`),
|
||||
primary key (`id`)
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `Candidates` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`first_name` varchar(100) default '' not null,
|
||||
`last_name` varchar(100) default '' not null,
|
||||
`nationality` bigint(20) default null,
|
||||
`birthday` DATETIME default '0000-00-00 00:00:00',
|
||||
`gender` enum('Male','Female') default NULL,
|
||||
`marital_status` enum('Married','Single','Divorced','Widowed','Other') default NULL,
|
||||
`address1` varchar(100) default '',
|
||||
`address2` varchar(100) default '',
|
||||
`city` varchar(150) default '',
|
||||
`country` char(2) default null,
|
||||
`province` bigint(20) default null,
|
||||
`postal_code` varchar(20) default null,
|
||||
`email` varchar(200) default null,
|
||||
`home_phone` varchar(50) default null,
|
||||
`mobile_phone` varchar(50) default null,
|
||||
`cv_title` varchar(200) default '' not null,
|
||||
`cv` varchar(150) NULL,
|
||||
`cvtext` text NULL,
|
||||
`industry` text DEFAULT NULL,
|
||||
`profileImage` varchar(150) NULL,
|
||||
`head_line` text DEFAULT NULL,
|
||||
`objective` text DEFAULT NULL,
|
||||
`work_history` text DEFAULT NULL,
|
||||
`education` text DEFAULT NULL,
|
||||
`skills` text DEFAULT NULL,
|
||||
`referees` text DEFAULT NULL,
|
||||
`linkedInUrl` varchar(500) DEFAULT NULL,
|
||||
`linkedInData` text DEFAULT NULL,
|
||||
`totalYearsOfExperience` int(11) default null,
|
||||
`totalMonthsOfExperience` int(11) default null,
|
||||
`htmlCVData` longtext DEFAULT NULL,
|
||||
`generatedCVFile` varchar(150) DEFAULT NULL,
|
||||
`created` DATETIME default '0000-00-00 00:00:00',
|
||||
`updated` DATETIME default '0000-00-00 00:00:00',
|
||||
`expectedSalary` int(11) default null,
|
||||
`preferedPositions` text default null,
|
||||
`preferedJobtype` varchar(60) default null,
|
||||
`preferedCountries` text default null,
|
||||
`tags` text default null,
|
||||
`notes` text default null,
|
||||
`calls` text default null,
|
||||
`age` int(11) default null,
|
||||
`hash` varchar(100) DEFAULT NULL,
|
||||
`linkedInProfileLink` varchar(250) DEFAULT NULL,
|
||||
`linkedInProfileId` varchar(50) DEFAULT NULL,
|
||||
`facebookProfileLink` varchar(250) DEFAULT NULL,
|
||||
`facebookProfileId` varchar(50) DEFAULT NULL,
|
||||
`twitterProfileLink` varchar(250) DEFAULT NULL,
|
||||
`twitterProfileId` varchar(50) DEFAULT NULL,
|
||||
`googleProfileLink` varchar(250) DEFAULT NULL,
|
||||
`googleProfileId` varchar(50) DEFAULT NULL,
|
||||
primary key (`id`)
|
||||
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `Applications` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`job` bigint(20) NOT NULL,
|
||||
`candidate` bigint(20) DEFAULT NULL,
|
||||
`created` DATETIME default '0000-00-00 00:00:00',
|
||||
`referredByEmail` varchar(200) DEFAULT NULL,
|
||||
`notes` text DEFAULT NULL,
|
||||
primary key (`id`),
|
||||
unique key (`job`,`candidate`),
|
||||
CONSTRAINT `Fk_Applications_Job` FOREIGN KEY (`job`) REFERENCES `Job` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_Applications_Candidates` FOREIGN KEY (`candidate`) REFERENCES `Candidates` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
create table `Interviews` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`job` bigint(20) NOT NULL,
|
||||
`candidate` bigint(20) DEFAULT NULL,
|
||||
`level` varchar(100) DEFAULT NULL,
|
||||
`created` DATETIME default '0000-00-00 00:00:00',
|
||||
`updated` DATETIME default '0000-00-00 00:00:00',
|
||||
`scheduled` DATETIME default '0000-00-00 00:00:00',
|
||||
`location` varchar(500) DEFAULT NULL,
|
||||
`mapId` bigint(20) NULL,
|
||||
`status` varchar(100) default null,
|
||||
`notes` text DEFAULT NULL,
|
||||
primary key (`id`),
|
||||
CONSTRAINT `Fk_Interviews_Job` FOREIGN KEY (`job`) REFERENCES `Job` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_Interviews_Candidates` FOREIGN KEY (`candidate`) REFERENCES `Candidates` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
create table `Calls` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`job` bigint(20) NOT NULL,
|
||||
`candidate` bigint(20) DEFAULT NULL,
|
||||
`phone` varchar(20) default null,
|
||||
`created` DATETIME default '0000-00-00 00:00:00',
|
||||
`updated` DATETIME default '0000-00-00 00:00:00',
|
||||
`status` varchar(100) default null,
|
||||
`notes` text DEFAULT NULL,
|
||||
primary key (`id`),
|
||||
CONSTRAINT `Fk_Calls_Job` FOREIGN KEY (`job`) REFERENCES `Job` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `Fk_Calls_Candidates` FOREIGN KEY (`candidate`) REFERENCES `Candidates` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) engine=innodb default charset=utf8;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Add Missing Master Data */
|
||||
|
||||
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);
|
||||
|
||||
|
||||
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('System: Reset Module Names', '1', 'Select this to reset module names in Database','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]'),
|
||||
('Leave: Share Calendar to Whole Company', '1', '','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]'),
|
||||
('Leave: CC Emails', '', 'Every email sent though leave module will be CC to these comma seperated list of emails addresses',''),
|
||||
('Leave: BCC Emails', '', 'Every email sent though leave module will be BCC to these comma seperated list of emails addresses',''),
|
||||
('Api: REST Api Enabled', '1', '','["value", {"label":"Value","type":"select","source":[["0","No"],["1","Yes"]]}]'),
|
||||
('Api: REST Api Token', 'Click on edit icon', '','["value", {"label":"Value","type":"placeholder"}]');
|
||||
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('LDAP: Enabled', '0', '','["value", {"label":"Value","type":"select","source":[["0","No"],["1","Yes"]]}]'),
|
||||
('LDAP: Server', '', 'LDAP Server IP or DNS',''),
|
||||
('LDAP: Port', '389', 'LDAP Server Port',''),
|
||||
('LDAP: Root DN', '', 'e.g: dc=mycompany,dc=net',''),
|
||||
('LDAP: Manager DN', '', 'e.g: cn=admin,dc=mycompany,dc=net',''),
|
||||
('LDAP: Manager Password', '', 'Password of the manager user',''),
|
||||
('LDAP: Version 3', '1', 'Are you using LDAP v3','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]'),
|
||||
('LDAP: User Filter', '', 'e.g: uid={}, we will replace {} with actual username provided by the user at the time of login','');
|
||||
|
||||
REPLACE INTO `Settings` (`name`, `value`, `description`, `meta`) VALUES
|
||||
('Leave: Allow Indirect Admins to Approve', '0', 'Allow indirect admins to approve leave requests','["value", {"label":"Value","type":"select","source":[["1","Yes"],["0","No"]]}]');
|
||||
|
||||
|
||||
REPLACE INTO `Documents` (`id`, `name`, `details`, `expire_notification`, `expire_notification_month`, `expire_notification_week`, `expire_notification_day`,`sign`,`created`, `updated`) VALUES
|
||||
(1, 'ID Copy', 'Your ID copy','Yes','Yes','Yes','Yes','No',NOW(), NOW()),
|
||||
(2, 'Degree Certificate', 'Degree Certificate','Yes','Yes','Yes','Yes','Yes',NOW(), NOW()),
|
||||
(3, 'Driving License', 'Driving License','Yes','Yes','Yes','Yes','Yes',NOW(), NOW());
|
||||
|
||||
REPLACE 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');
|
||||
|
||||
REPLACE INTO `LeavePeriods` (`id`, `name`, `date_start`, `date_end`, `status`) VALUES
|
||||
(3, 'Year 2015', '2015-01-01', '2015-12-31', 'Active'),
|
||||
(4, 'Year 2016', '2016-01-01', '2016-12-31', 'Active'),
|
||||
(5, 'Year 2017', '2017-01-01', '2017-12-31', 'Active');
|
||||
|
||||
REPLACE INTO `LeaveTypes` (`id`, `name`, `supervisor_leave_assign`, `employee_can_apply`, `apply_beyond_current`, `leave_accrue`, `carried_forward`, `default_per_year`) VALUES
|
||||
(1, 'Annual leave', 'No', 'Yes', 'No', 'No', 'No', 14),
|
||||
(2, 'Casual leave', 'Yes', 'Yes', 'No', 'No', 'No', 7),
|
||||
(3, 'Medical leave', 'Yes', 'Yes', 'Yes', 'No', 'No', 7);
|
||||
|
||||
REPLACE INTO `Courses` (`id`,`code`, `name`, `description`, `coordinator`, `trainer`, `trainer_info`, `paymentType`, `currency`, `cost`, `status`, `created`, `updated`) VALUES
|
||||
(1,'C0001', 'Info Marketing', 'Learn how to Create and Outsource Info Marketing Products', 1, 'Tim Jhon', 'Tim Jhon has a background in business management and has been working with small business to establish their online presence','Company Sponsored','USD','55','Active',now(), now()),
|
||||
(2,'C0002', 'People Management', 'Learn how to Manage People', 1, 'Tim Jhon', 'Tim Jhon has a background in business management and has been working with small business to establish their online presence','Company Sponsored','USD','59','Active',now(), now());
|
||||
|
||||
REPLACE INTO `EmployementType` (`name`) VALUES
|
||||
('Full-time'),
|
||||
('Part-time'),
|
||||
('Contract'),
|
||||
('Temporary'),
|
||||
('Other');
|
||||
|
||||
REPLACE INTO `Benifits` (`name`) VALUES
|
||||
('Retirement plan'),
|
||||
('Health plan'),
|
||||
('Life insurance'),
|
||||
('Paid vacations');
|
||||
|
||||
|
||||
|
||||
REPLACE INTO `ExperienceLevel` (`name`) VALUES
|
||||
('Not Applicable'),
|
||||
('Internship'),
|
||||
('Entry level'),
|
||||
('Associate'),
|
||||
('Mid-Senior level'),
|
||||
('Director'),
|
||||
('Executive');
|
||||
|
||||
REPLACE INTO `JobFunction` (`name`) VALUES
|
||||
('Accounting/Auditing'),
|
||||
('Administrative'),
|
||||
('Advertising'),
|
||||
('Business Analyst'),
|
||||
('Financial Analyst'),
|
||||
('Data Analyst'),
|
||||
('Art/Creative'),
|
||||
('Business Development'),
|
||||
('Consulting'),
|
||||
('Customer Service'),
|
||||
('Distribution'),
|
||||
('Design'),
|
||||
('Education'),
|
||||
('Engineering'),
|
||||
('Finance'),
|
||||
('General Business'),
|
||||
('Health Care Provider'),
|
||||
('Human Resources'),
|
||||
('Information Technology'),
|
||||
('Legal'),
|
||||
('Management'),
|
||||
('Manufacturing'),
|
||||
('Marketing'),
|
||||
('Other'),
|
||||
('Public Relations'),
|
||||
('Purchasing'),
|
||||
('Product Management'),
|
||||
('Project Management'),
|
||||
('Production'),
|
||||
('Quality Assurance'),
|
||||
('Research'),
|
||||
('Sales'),
|
||||
('Science'),
|
||||
('Strategy/Planning'),
|
||||
('Supply Chain'),
|
||||
('Training'),
|
||||
('Writing/Editing');
|
||||
|
||||
|
||||
REPLACE INTO `EducationLevel` (`name`) VALUES
|
||||
('Unspecified'),
|
||||
('High School or equivalent'),
|
||||
('Certification'),
|
||||
('Vocational'),
|
||||
('Associate Degree'),
|
||||
('Bachelor\'s Degree'),
|
||||
('Master\'s Degree'),
|
||||
('Doctorate'),
|
||||
('Professional'),
|
||||
('Some College Coursework Completed'),
|
||||
('Vocational - HS Diploma'),
|
||||
('Vocational - Degree'),
|
||||
('Some High School Coursework');
|
||||
|
||||
|
||||
REPLACE INTO `Crons` (`name`,`class`, `lastrun`, `frequency`, `time`, `type`, `status`) VALUES
|
||||
('Email Sender Task', 'EmailSenderTask', NULL, 1, 1, 'Minutely', 'Enabled'),
|
||||
('Document Expire Alert', 'DocumentExpiryNotificationTask', NULL, 1, (FLOOR( 1 + RAND( ) *58 )), 'Hourly', 'Enabled');
|
||||
|
||||
|
||||
REPLACE INTO `ExpensesPaymentMethods` (`name`) VALUES
|
||||
('Cash'),
|
||||
('Check'),
|
||||
('Credit Card'),
|
||||
('Debit Card');
|
||||
|
||||
|
||||
REPLACE 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');
|
||||
481
core-ext/scripts/upgrade_v16.0.PRO_v18.0.PRO.sql
Normal file
481
core-ext/scripts/upgrade_v16.0.PRO_v18.0.PRO.sql
Normal file
File diff suppressed because one or more lines are too long
2
docker/docker.md
Normal file
2
docker/docker.md
Normal file
@@ -0,0 +1,2 @@
|
||||
https://hub.docker.com/r/thilinah/icehrm/
|
||||
docker run -i -t -p 192.168.99.100:80:80 thilinah/icehrm /bin/start.sh
|
||||
30
docker/start.sh
Normal file
30
docker/start.sh
Normal file
@@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
service nginx start
|
||||
service php5-fpm start
|
||||
service mysql start
|
||||
|
||||
if [ -d "/usr/share/nginx/www/" ]; then
|
||||
echo 'Already Installed'
|
||||
else
|
||||
echo 'Installing IceHrm'
|
||||
cd /usr/share/nginx
|
||||
curl -s https://api.github.com/repos/gamonoid/icehrm/releases/latest | jq -r ".assets[] | select(.name) | .browser_download_url" | grep '.zip' | xargs wget
|
||||
ls | grep 'zip' | xargs unzip
|
||||
mv `ls -d */ | grep icehrm | head -1` www/
|
||||
rm *.zip
|
||||
|
||||
echo 'Your MySQL root password : icehrmpwd'
|
||||
|
||||
echo "Following will be needed during installation"
|
||||
echo "--------------------------------------------"
|
||||
echo 'IceHrm Database : icehrmdb'
|
||||
echo 'IceHrm User : icehrmuser'
|
||||
echo 'IceHrm User Password : icehrmuserpwd'
|
||||
echo 'IceHrm Database host : localhost'
|
||||
|
||||
echo 'Please visit your docker installation url to begin installation.'
|
||||
|
||||
fi
|
||||
|
||||
|
||||
/bin/bash
|
||||
@@ -41,7 +41,7 @@ class AttendanceActionManager extends SubActionManager{
|
||||
|
||||
//check if dates are differnet
|
||||
if(!empty($outDate) && $inDate != $outDate){
|
||||
return new IceResponse(IceResponse::ERROR,"Attendance entry should be within a single day");
|
||||
return new IceResponse(IceResponse::ERROR,LanguageManager::tran("Attendance entry should be within a single day"));
|
||||
}
|
||||
|
||||
//compare dates
|
||||
|
||||
@@ -38,6 +38,8 @@ if (!class_exists('AttendanceAdminManager')) {
|
||||
$this->addCalculationHook('AttendanceUtil_getTimeWorkedHours','Total Hours from Attendance','AttendanceUtil','getTimeWorkedHours');
|
||||
$this->addCalculationHook('AttendanceUtil_getRegularWorkedHours','Total Regular Hours from Attendance','AttendanceUtil','getRegularWorkedHours');
|
||||
$this->addCalculationHook('AttendanceUtil_getOverTimeWorkedHours','Total Overtime Hours from Attendance','AttendanceUtil','getOverTimeWorkedHours');
|
||||
$this->addCalculationHook('AttendanceUtil_getWeeklyRegularWorkedHours','Total Weekly Regular Hours from Attendance','AttendanceUtil','getWeeklyBasedRegularHours');
|
||||
$this->addCalculationHook('AttendanceUtil_getWeeklyOverTimeWorkedHours','Total Weekly Overtime Hours from Attendance','AttendanceUtil','getWeeklyBasedOvertimeHours');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -249,6 +251,80 @@ if (!class_exists('AttendanceUtil')) {
|
||||
$atSum = $this->getAttendanceSummary($employeeId, $startDate, $endDate);
|
||||
return round(($atSum['o']/60)/60,2);
|
||||
}
|
||||
|
||||
public function getWeeklyBasedRegularHours($employeeId, $startDate, $endDate){
|
||||
$atSum = $this->getWeeklyBasedOvertimeSummary($employeeId, $startDate, $endDate);
|
||||
return round(($atSum['r']/60)/60,2);
|
||||
}
|
||||
|
||||
public function getWeeklyBasedOvertimeHours($employeeId, $startDate, $endDate){
|
||||
$atSum = $this->getWeeklyBasedOvertimeSummary($employeeId, $startDate, $endDate);
|
||||
return round(($atSum['o']/60)/60,2);
|
||||
}
|
||||
|
||||
public function getWeeklyBasedOvertimeSummary($employeeId, $startDate, $endDate){
|
||||
|
||||
$attendance = new Attendance();
|
||||
$atTimeByWeek = array();
|
||||
|
||||
//Find weeks starting from sunday and ending from saturday in day period
|
||||
|
||||
$weeks = $this->getWeeklyDays($startDate,$endDate);
|
||||
foreach($weeks as $k=>$week){
|
||||
$startTime = $week[0]." 00:00:00";
|
||||
$endTime = $week[count($week) - 1]." 23:59:59";
|
||||
$atts = $attendance->Find("employee = ? and in_time >= ? and out_time <= ?",array($employeeId, $startTime, $endTime));
|
||||
foreach($atts as $atEntry){
|
||||
if($atEntry->out_time == "0000-00-00 00:00:00" || empty($atEntry->out_time)){
|
||||
continue;
|
||||
}
|
||||
if(!isset($atTimeByWeek[$k])){
|
||||
$atTimeByWeek[$k] = 0;
|
||||
}
|
||||
|
||||
$diff = strtotime($atEntry->out_time) - strtotime($atEntry->in_time);
|
||||
if($diff < 0){
|
||||
$diff = 0;
|
||||
}
|
||||
|
||||
$atTimeByWeek[$k] += $diff;
|
||||
}
|
||||
}
|
||||
|
||||
$overtimeStarts = SettingsManager::getInstance()->getSetting('Attendance: Overtime Start Hour');
|
||||
$overtimeStarts = (is_numeric($overtimeStarts))?floatval($overtimeStarts)*60*60*5:0;
|
||||
$regTime = 0;
|
||||
$overTime = 0;
|
||||
foreach($atTimeByWeek as $value){
|
||||
if($value > $overtimeStarts){
|
||||
$regTime += $overtimeStarts;
|
||||
$overTime = $value - $overtimeStarts;
|
||||
}else{
|
||||
$regTime += $value;
|
||||
}
|
||||
}
|
||||
|
||||
return array('r'=>$regTime,'o'=>$overTime);
|
||||
|
||||
}
|
||||
|
||||
private function getWeeklyDays($startDate,$endDate){
|
||||
$start = new DateTime($startDate);
|
||||
$end = new DateTime($endDate.' 23:59');
|
||||
$interval = new DateInterval('P1D');
|
||||
$dateRange = new DatePeriod($start, $interval, $end);
|
||||
|
||||
$weekNumber = 1;
|
||||
$weeks = array();
|
||||
foreach ($dateRange as $date) {
|
||||
$weeks[$weekNumber][] = $date->format('Y-m-d');
|
||||
if ($date->format('w') == 6) {
|
||||
$weekNumber++;
|
||||
}
|
||||
}
|
||||
|
||||
return $weeks;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,17 +2,17 @@
|
||||
<div class="small-box bg-yellow">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
Attendance
|
||||
<t>Attendance</t>
|
||||
</h3>
|
||||
<p id="numberOfAttendanceLastWeek">
|
||||
#_numberOfAttendanceLastWeek_# Entries Last Week
|
||||
#_numberOfAttendanceLastWeek_# <t>Entries Last Week</t>
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-clock"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="attendanceLink">
|
||||
Monitor Attendance <i class="fa fa-arrow-circle-right"></i>
|
||||
<t>Monitor Attendance</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -28,11 +28,8 @@ 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="tabAttendance" href="#tabPageAttendance">Monitor Attendance</a></li>
|
||||
<li class=""><a id="tabAttendanceStatus" href="#tabPageAttendanceStatus">Current Clocked In Status</a></li>
|
||||
<!--
|
||||
<li class=""><a id="tabAttendanceData" href="#tabPageAttendanceData">Attendance Data Update</a></li>
|
||||
-->
|
||||
<li class="active"><a id="tabAttendance" href="#tabPageAttendance"><?=LanguageManager::tran('Monitor Attendance')?></a></li>
|
||||
<li class=""><a id="tabAttendanceStatus" href="#tabPageAttendanceStatus"><?=LanguageManager::tran('Current Clocked In Status')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
@@ -52,20 +49,6 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!--
|
||||
<div class="tab-pane" id="tabPageAttendanceData">
|
||||
<div class="control-group" id="field__id_">
|
||||
<div class="controls">
|
||||
<textarea class="input-xxlarge" placeholder="Insert CSV data to submit" type="textarea" width="96%" rows="100" id="attendanceData" name="attendanceData"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<button onclick="return false;" class="btn">Update Attendance Data</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
-->
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
ICEHRM END USER LICENSE AGREEMENT
|
||||
NOTICE TO ALL USERS: BY PURCHASING THE MODULE, YOU (EITHER AN INDIVIDUAL OR A SINGLE ENTITY) CONSENT TO BE BOUND BY AND BECOME A PARTY TO THIS AGREEMENT.
|
||||
|
||||
All references to "Software" herein shall be deemed to include the software license with which you will be provided by Gamonoid Media Pvt Ltd, as part of the Software.
|
||||
|
||||
1. LICENSE GRANT. Subject to the payment of the applicable licence fees, and subject to the terms and conditions of this Agreement, ICEHRM hereby grants to you a non-exclusive, non-transferable right to use one copy of the specified version of the Software and the accompanying documentation (the "Documentation") for the term of this Agreement solely for your own internal business purposes. You may install one copy of the Software for production use.
|
||||
.
|
||||
2. USE. The Software is licensed as a single product; it may not be used on more than one ICEHRM Server at a time. The Software is "in use" on a Server when its installed on a Server. You shall not, nor permit any third party to copy (other than as expressly permitted herein). You shall not rent, lease or lend the Software to any other person, nor transfer or sub-licence your licence rights to any other person.
|
||||
|
||||
3. TERM. This Agreement is effective until terminated as set forth herein. This Agreement will terminate automatically if you fail to comply with any of the conditions, limitations or other requirements described herein. Upon any termination of this Agreement, you must immediately destroy all copies of the Software and the Documentation. You may terminate this Agreement at any point by destroying all copies of the Software and the Documentation.
|
||||
|
||||
4. SUPPORT. Gamonoid Media Pvt Ltd will provide you support according to the support agreement subscribed by the company.
|
||||
|
||||
5. OWNERSHIP RIGHTS. The Software is protected by copyright laws. ICEHRM and Gamonoid Media Pvt Ltd own and retain all right, title and interest in and to the Software, including all copyrights, patents, trademarks and other intellectual property rights therein. Your possession, installation, or use of the Software does not transfer to you any title to the intellectual property in the Software, and you will not acquire any rights to the Software except as expressly set forth in this Agreement.
|
||||
|
||||
6. LIMITED WARRANTY. You may not rent, lease, loan or resell the Software. You may not permit third parties to benefit from the use or functionality of the Software via a timesharing, service bureau or other arrangement, except to the extent such use is specified in the applicable list price or product packaging for the Software. You may not transfer any of the rights granted to you under this Agreement. You may not modify, or create derivative works based upon, the Software in whole or in part. You may not copy the Software or Documentation except as expressly permitted in Section 1 above. You may not remove any proprietary notices or labels on the Software. All rights not expressly set forth hereunder are reserved by ICEHRM. ICEHRM reserves the right to periodically conduct audits upon advance written notice to verify compliance with the terms of this Agreement.
|
||||
|
||||
7. WARRANTY and DISCLAIMER.
|
||||
|
||||
(i) Gamonoid Media Pvt Ltd. warrants that for 30 days from first download or installation the Software will perform substantially in accordance with the functionality described in the Documentation (http://blog.icehrm.com) when operated properly and in the manner specified in the Documentation.
|
||||
|
||||
(ii) You accept all responsibility for the selection of this Software to meet your requirements.
|
||||
|
||||
(iii) Gamonoid Media Pvt Ltd. does not warrant that the Software and/or the Documentation will be suitable for such requirements nor that any use will be uninterrupted and error free.
|
||||
|
||||
(iv) The warranty in (i) shall not apply if you (a) make or cause to be made any modifications to this Software, (b) use the Software in a manner for which it was not intended or (c) use the Software other than as permitted under this Agreement.
|
||||
|
||||
(vii) The warranties and conditions stated in this Agreement are in lieu of all other conditions, warranties or other terms concerning the supply or purported supply of, failure to supply or delay in supplying the Software or the Documentation which might but for this paragraph (vii) have effect between the ICEHRM and you or would otherwise be implied into or incorporated into this Agreement or any collateral contract, whether by statute, common law or otherwise, all of which are hereby excluded (including, without limitation, the implied conditions, warranties or other terms as to satisfactory quality, fitness for purpose or as to the use of reasonable skill and care).
|
||||
|
||||
8. LIMITATION of LIABILITY. Gamonoid Media Pvt Ltd. shall have no liability (whether in contract, tort, restitution or otherwise) for any of the following losses or damage (whether such losses or damage were foreseen, foreseeable, known or otherwise):
|
||||
- Loss of revenue;
|
||||
- Loss of actual or anticipated profits (including for loss of profits on contracts);
|
||||
- Loss of the use of money;
|
||||
- Loss of anticipated savings;
|
||||
- Loss of business;
|
||||
- Loss of opportunity;
|
||||
- Loss of goodwill;
|
||||
- Loss of reputation;
|
||||
- Loss of, damage to or corruption of data;
|
||||
or
|
||||
Any indirect or consequential loss or damage howsoever caused (including, for the avoidance of doubt, where such loss or damage is of the type specified in paragraph (ii), (a) to (ii), (i).
|
||||
The ICEHRM liability (whether in contract, tort, restitution or otherwise) arising out of or in connection with the supply of the Software shall in no circumstances exceed a sum equal to the amount equally paid by you for the Software.
|
||||
The construction and interpretation of this Agreement shall be governed in accordance with the laws of Sri Lanka. The parties hereby submit to the jurisdiction of the courts of Sri Lanka save that ICEHRM as claimant shall be entitled to initiate proceedings in any court of competent jurisdiction.
|
||||
This Agreement contains the entire understanding of the parties with respect to the subject matter hereof and supersedes all and any prior understandings, undertakings and promises between you and ICEHRM, whether oral or in writing, which have been given or may be implied from anything written or said in negotiations between us or our representatives prior to this Agreement and all prior agreements between the parties relating to the matters aforesaid shall cease to have effect as from the Effective Date.
|
||||
@@ -1,7 +0,0 @@
|
||||
This module is licensed under IceHrm Commercial License, which can be found in LICENSE.txt.
|
||||
You are allowed to make any modification required to these module, but only allowed to use
|
||||
the module in one production server (even with modifications).
|
||||
|
||||
Installation
|
||||
------------
|
||||
Copy this module into <icehrm path>/admin/ directory
|
||||
@@ -1,156 +0,0 @@
|
||||
<?php
|
||||
if (!class_exists('ChartsActionManager')) {
|
||||
class ChartsActionManager extends SubActionManager{
|
||||
|
||||
public function getTimeUtilization($req){
|
||||
|
||||
if(empty($req->start)){
|
||||
$req->start = date("Y-m-01");
|
||||
}
|
||||
|
||||
if(empty($req->end)){
|
||||
$req->end = date("Y-m-t",strtotime($req->start));
|
||||
}
|
||||
|
||||
//Find Time Entries
|
||||
|
||||
$employeeTimeEntry = new EmployeeTimeEntry();
|
||||
if(empty($req->employee)){
|
||||
$timeEntryList = $employeeTimeEntry->Find("date(date_start) >= ? and date(date_end) <= ?",array($req->start, $req->end));
|
||||
}else{
|
||||
$timeEntryList = $employeeTimeEntry->Find("employee = ? and date(date_start) >= ? and date(date_end) <= ?",array($req->employee, $req->start, $req->end));
|
||||
}
|
||||
|
||||
$seconds = 0;
|
||||
$graphTimeArray = array();
|
||||
foreach($timeEntryList as $entry){
|
||||
$seconds = (strtotime($entry->date_end) - strtotime($entry->date_start));
|
||||
$key = date("Y-m-d",strtotime($entry->date_end));
|
||||
if(isset($graphTimeArray[$key])){
|
||||
$graphTimeArray[$key] += $seconds;
|
||||
}else{
|
||||
$graphTimeArray[$key] = $seconds;
|
||||
}
|
||||
}
|
||||
|
||||
//$minutes = (int)($seconds/60);
|
||||
|
||||
|
||||
//Find Attendance Entries
|
||||
|
||||
$attendance = new Attendance();
|
||||
if(empty($req->employee)){
|
||||
$atteandanceList = $attendance->Find("date(in_time) >= ? and date(out_time) <= ? and in_time < out_time",array($req->start, $req->end));
|
||||
}else{
|
||||
$atteandanceList = $attendance->Find("employee = ? and date(in_time) >= ? and date(out_time) <= ? and in_time < out_time",array($req->employee, $req->start, $req->end));
|
||||
}
|
||||
|
||||
$seconds = 0;
|
||||
$graphAttendanceArray = array();
|
||||
foreach($atteandanceList as $entry){
|
||||
$seconds = (strtotime($entry->out_time) - strtotime($entry->in_time));
|
||||
$key = date("Y-m-d",strtotime($entry->in_time));
|
||||
if(isset($graphAttendanceArray[$key])){
|
||||
$graphAttendanceArray[$key] += $seconds;
|
||||
}else{
|
||||
$graphAttendanceArray[$key] = $seconds;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$data = array();
|
||||
$data[] = array("key"=>"Hours in Attendance", "values"=>array());
|
||||
$data[] = array("key"=>"Hours Worked", "values"=>array());
|
||||
|
||||
|
||||
//Iterate date range
|
||||
|
||||
$interval = DateInterval::createFromDateString('1 day');
|
||||
$period = new DatePeriod(new DateTime($req->start), $interval, new DateTime($req->end));
|
||||
|
||||
foreach ( $period as $dt ){
|
||||
$key = $dt->format("Y-m-d");
|
||||
if(isset($graphAttendanceArray[$key])){
|
||||
$data[0]['values'][] = array("x"=>$key, "y"=>round(($graphAttendanceArray[$key]/3600),2));
|
||||
}else{
|
||||
$data[0]['values'][] = array("x"=>$key, "y"=>0);
|
||||
}
|
||||
|
||||
if(isset($graphTimeArray[$key])){
|
||||
$data[1]['values'][] = array("x"=>$key, "y"=>round(($graphTimeArray[$key]/3600),2));
|
||||
}else{
|
||||
$data[1]['values'][] = array("x"=>$key, "y"=>0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
//Test data
|
||||
|
||||
for($i = 1; $i<31; $i++){
|
||||
$data[0]['values'][] = array("x"=>$i, "y"=>rand(2,9));
|
||||
$data[1]['values'][] = array("x"=>$i, "y"=>rand(2,8));
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
return new IceResponse(IceResponse::SUCCESS,$data);
|
||||
}
|
||||
|
||||
public function getAttendance($req){
|
||||
|
||||
if(empty($req->start)){
|
||||
$req->start = date("Y-m-01");
|
||||
}
|
||||
|
||||
if(empty($req->end)){
|
||||
$req->end = date("Y-m-t",strtotime($req->start));
|
||||
}
|
||||
|
||||
|
||||
//Find Attendance Entries
|
||||
|
||||
$attendance = new Attendance();
|
||||
if(empty($req->employee)){
|
||||
$atteandanceList = $attendance->Find("date(in_time) >= ? and date(out_time) <= ? and in_time < out_time",array($req->start, $req->end));
|
||||
}else{
|
||||
$atteandanceList = $attendance->Find("employee = ? and date(in_time) >= ? and date(out_time) <= ? and in_time < out_time",array($req->employee, $req->start, $req->end));
|
||||
}
|
||||
|
||||
$seconds = 0;
|
||||
$graphAttendanceArray = array();
|
||||
foreach($atteandanceList as $entry){
|
||||
$seconds = (strtotime($entry->out_time) - strtotime($entry->in_time));
|
||||
$key = date("Y-m-d",strtotime($entry->in_time));
|
||||
if(isset($graphAttendanceArray[$key])){
|
||||
$graphAttendanceArray[$key] += $seconds;
|
||||
}else{
|
||||
$graphAttendanceArray[$key] = $seconds;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$data[0] = array();
|
||||
$data[0] = array("key"=>"Attendance", "values"=>array());
|
||||
|
||||
|
||||
//Iterate date range
|
||||
|
||||
$interval = DateInterval::createFromDateString('1 day');
|
||||
$period = new DatePeriod(new DateTime($req->start), $interval, new DateTime($req->end));
|
||||
|
||||
foreach ( $period as $dt ){
|
||||
$key = $dt->format("Y-m-d");
|
||||
if(isset($graphAttendanceArray[$key])){
|
||||
$data[0]['values'][] = array("x"=>$key, "y"=>round(($graphAttendanceArray[$key]/3600),2));
|
||||
}else{
|
||||
$data[0]['values'][] = array("x"=>$key, "y"=>0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return new IceResponse(IceResponse::SUCCESS,$data);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
<?php
|
||||
|
||||
$moduleName = 'company_structure';
|
||||
define('MODULE_PATH',dirname(__FILE__));
|
||||
include APP_BASE_PATH.'header.php';
|
||||
include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
?>
|
||||
|
||||
<link href="<?=BASE_URL.'js/nvd3/src/nv.d3.css?v='.$jsVersion?>" rel="stylesheet" type="text/css">
|
||||
|
||||
<script src="<?=BASE_URL.'js/nvd3/lib/d3.v3.js?v='.$jsVersion?>"></script>
|
||||
<script src="<?=BASE_URL.'js/nvd3/nv.d3.js?v='.$jsVersion?>"></script>
|
||||
<script src="<?=BASE_URL.'js/nvd3/src/tooltip.js?v='.$jsVersion?>"></script>
|
||||
<script src="<?=BASE_URL.'js/nvd3/src/utils.js?v='.$jsVersion?>"></script>
|
||||
<script src="<?=BASE_URL.'js/nvd3/src/models/legend.js?v='.$jsVersion?>"></script>
|
||||
<script src="<?=BASE_URL.'js/nvd3/src/models/axis.js?v='.$jsVersion?>"></script>
|
||||
<script src="<?=BASE_URL.'js/nvd3/src/models/multiBar.js?v='.$jsVersion?>"></script>
|
||||
<script src="<?=BASE_URL.'js/nvd3/src/models/discreteBar.js?v='.$jsVersion?>"></script>
|
||||
<script src="<?=BASE_URL.'js/nvd3/src/models/discreteBarChart.js?v='.$jsVersion?>"></script>
|
||||
<script src="<?=BASE_URL.'js/nvd3/stream_layers.js?v='.$jsVersion?>"></script>
|
||||
|
||||
<style type="text/css">
|
||||
svg .tooltip { opacity: 1; }
|
||||
</style>
|
||||
|
||||
<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="tabAttendanceGraph" href="#tabPageAttendanceGraph">Attendance Graph</a></li>
|
||||
<li><a id="tabTimeUtilizationGraph" href="#tabPageTimeUtilizationGraph">Hours in Office vs Hours Worked Graph</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane active reviewBlock with-3d-shadow with-transitions" id="tabPageAttendanceGraph" style="height: 500px;position: relative;">
|
||||
<svg></svg>
|
||||
</div>
|
||||
<div class="tab-pane reviewBlock with-3d-shadow with-transitions" id="tabPageTimeUtilizationGraph" style="height: 500px;position: relative;">
|
||||
<svg></svg>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<script>
|
||||
var modJsList = new Array();
|
||||
modJsList['tabAttendanceGraph'] = new AttendanceGraphAdapter('AttendanceGraph');
|
||||
modJsList['tabAttendanceGraph'].setShowAddNew(false);
|
||||
|
||||
modJsList['tabTimeUtilizationGraph'] = new TimeUtilizationGraphAdapter('TimeUtilizationGraph');
|
||||
modJsList['tabTimeUtilizationGraph'].setShowAddNew(false);
|
||||
|
||||
var modJs = modJsList['tabAttendanceGraph'];
|
||||
|
||||
</script>
|
||||
|
||||
<?php include APP_BASE_PATH.'footer.php';?>
|
||||
@@ -1,284 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
function BaseGraphAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
BaseGraphAdapter.inherits(AdapterBase);
|
||||
|
||||
BaseGraphAdapter.method('getDataMapping', function() {
|
||||
return [];
|
||||
});
|
||||
|
||||
BaseGraphAdapter.method('getHeaders', function() {
|
||||
return [];
|
||||
});
|
||||
|
||||
BaseGraphAdapter.method('getFormFields', function() {
|
||||
return [];
|
||||
});
|
||||
|
||||
BaseGraphAdapter.method('createTable', function(elementId) {
|
||||
|
||||
});
|
||||
|
||||
/*
|
||||
* TimeUtilizationGraphAdapter
|
||||
*/
|
||||
|
||||
|
||||
function AttendanceGraphAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
AttendanceGraphAdapter.inherits(BaseGraphAdapter);
|
||||
|
||||
AttendanceGraphAdapter.method('getFormFields', function() {
|
||||
return [];
|
||||
});
|
||||
|
||||
AttendanceGraphAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "employee", {"label":"Employee","type":"select2","allow-null":true,"null-label":"All Employees","remote-source":["Employee","id","first_name+last_name"]}],
|
||||
[ "start", {"label":"Start Date","type":"date","validation":""}],
|
||||
[ "end", {"label":"End Date","type":"date","validation":""}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
AttendanceGraphAdapter.method('get', function() {
|
||||
this.initFieldMasterData();
|
||||
this.getTimeUtilization();
|
||||
});
|
||||
|
||||
AttendanceGraphAdapter.method('doCustomFilterValidation', function(params) {
|
||||
$("#"+this.table+"_filter_error").html("");
|
||||
$("#"+this.table+"_filter_error").hide();
|
||||
if(Date.parse(params.start).getTime() > Date.parse(params.end).getTime()){
|
||||
$("#"+this.table+"_filter_error").html("End date should be a later date than start date");
|
||||
$("#"+this.table+"_filter_error").show();
|
||||
return false;
|
||||
}
|
||||
|
||||
var dateDiff = (Date.parse(params.end).getTime() - Date.parse(params.start).getTime())/(1000*60*60*24);
|
||||
|
||||
if(dateDiff > 45 && (params['employee'] == undefined || params['employee'] == null || params['employee'] == "NULL")){
|
||||
$("#"+this.table+"_filter_error").html("Differance between start and end dates should not be more than 45 days, when creating chart for all employees");
|
||||
$("#"+this.table+"_filter_error").show();
|
||||
return false;
|
||||
|
||||
}else if(dateDiff > 90){
|
||||
$("#"+this.table+"_filter_error").html("Differance between start and end dates should not be more than 90 days");
|
||||
$("#"+this.table+"_filter_error").show();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
AttendanceGraphAdapter.method('getTimeUtilization', function(object,callBackData) {
|
||||
var that = this;
|
||||
object = {};
|
||||
|
||||
|
||||
if(this.filter != null && this.filter != undefined){
|
||||
if(this.filter.employee != "NULL"){
|
||||
object['employee'] = this.filter.employee;
|
||||
}
|
||||
|
||||
object['start'] = this.filter.start;
|
||||
object['end'] = this.filter.end;
|
||||
}
|
||||
|
||||
var reqJson = JSON.stringify(object);
|
||||
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'getAttendanceSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'getAttendanceFailCallBack';
|
||||
|
||||
this.customAction('getAttendance','admin=charts',reqJson,callBackData);
|
||||
});
|
||||
|
||||
|
||||
AttendanceGraphAdapter.method('getAttendanceFailCallBack', function(callBackData) {
|
||||
this.showMessage("Error Occured while getting data for chart", callBackData);
|
||||
});
|
||||
|
||||
|
||||
AttendanceGraphAdapter.method('getAttendanceSuccessCallBack', function(callBackData) {
|
||||
|
||||
var that = this;
|
||||
var chart;
|
||||
|
||||
var filterHtml = that.getTableTopButtonHtml();
|
||||
$("#tabPageAttendanceGraph svg").remove();
|
||||
$("#tabPageAttendanceGraph div").remove();
|
||||
$("#tabPageAttendanceGraph").html("");
|
||||
$("#tabPageAttendanceGraph").html(filterHtml+"<svg></svg>");
|
||||
|
||||
|
||||
nv.addGraph(function() {
|
||||
|
||||
var chart = nv.models.multiBarChart()
|
||||
.margin({bottom: 200})
|
||||
.transitionDuration(0)
|
||||
.reduceXTicks(true) //If 'false', every single x-axis tick label will be rendered.
|
||||
.rotateLabels(45) //Angle to rotate x-axis labels.
|
||||
.showControls(false) //Allow user to switch between 'Grouped' and 'Stacked' mode.
|
||||
.groupSpacing(0.1) //Distance between each group of bars.
|
||||
;
|
||||
|
||||
chart.yAxis
|
||||
.tickFormat(d3.format(',.1f'));
|
||||
|
||||
chart.dispatch.on('stateChange', function(e) { nv.log('New State:', JSON.stringify(e)); });
|
||||
|
||||
chart.tooltip(function (key, x, y, e, graph) {
|
||||
return '<p><strong>' + key + '</strong></p>' +
|
||||
'<p>' + y + ' on ' + x + '</p>';
|
||||
});
|
||||
|
||||
|
||||
d3.select('#tabPageAttendanceGraph svg')
|
||||
.datum(callBackData)
|
||||
.call(chart);
|
||||
|
||||
return chart;
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
/*
|
||||
* TimeUtilizationGraphAdapter
|
||||
*/
|
||||
|
||||
|
||||
function TimeUtilizationGraphAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
TimeUtilizationGraphAdapter.inherits(BaseGraphAdapter);
|
||||
|
||||
TimeUtilizationGraphAdapter.method('getFormFields', function() {
|
||||
return [];
|
||||
});
|
||||
|
||||
TimeUtilizationGraphAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "employee", {"label":"Employee","type":"select2","allow-null":true,"null-label":"All Employees","remote-source":["Employee","id","first_name+last_name"]}],
|
||||
[ "start", {"label":"Start Date","type":"date","validation":""}],
|
||||
[ "end", {"label":"End Date","type":"date","validation":""}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
TimeUtilizationGraphAdapter.method('get', function() {
|
||||
this.initFieldMasterData();
|
||||
this.getTimeUtilization();
|
||||
});
|
||||
|
||||
TimeUtilizationGraphAdapter.method('doCustomFilterValidation', function(params) {
|
||||
$("#"+this.table+"_filter_error").html("");
|
||||
$("#"+this.table+"_filter_error").hide();
|
||||
if(Date.parse(params.start).getTime() > Date.parse(params.end).getTime()){
|
||||
$("#"+this.table+"_filter_error").html("End date should be a later date than start date");
|
||||
$("#"+this.table+"_filter_error").show();
|
||||
return false;
|
||||
}
|
||||
|
||||
var dateDiff = (Date.parse(params.end).getTime() - Date.parse(params.start).getTime())/(1000*60*60*24);
|
||||
|
||||
if(dateDiff > 45 && (params['employee'] == undefined || params['employee'] == null || params['employee'] == "NULL")){
|
||||
$("#"+this.table+"_filter_error").html("Differance between start and end dates should not be more than 45 days, when creating chart for all employees");
|
||||
$("#"+this.table+"_filter_error").show();
|
||||
return false;
|
||||
|
||||
}else if(dateDiff > 90){
|
||||
$("#"+this.table+"_filter_error").html("Differance between start and end dates should not be more than 90 days");
|
||||
$("#"+this.table+"_filter_error").show();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
TimeUtilizationGraphAdapter.method('getTimeUtilization', function(object,callBackData) {
|
||||
var that = this;
|
||||
object = {};
|
||||
|
||||
|
||||
if(this.filter != null && this.filter != undefined){
|
||||
if(this.filter.employee != "NULL"){
|
||||
object['employee'] = this.filter.employee;
|
||||
}
|
||||
|
||||
object['start'] = this.filter.start;
|
||||
object['end'] = this.filter.end;
|
||||
}
|
||||
|
||||
var reqJson = JSON.stringify(object);
|
||||
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'getTimeUtilizationSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'getTimeUtilizationFailCallBack';
|
||||
|
||||
this.customAction('getTimeUtilization','admin=charts',reqJson,callBackData);
|
||||
});
|
||||
|
||||
|
||||
TimeUtilizationGraphAdapter.method('getTimeUtilizationFailCallBack', function(callBackData) {
|
||||
this.showMessage("Error Occured while getting data for chart", callBackData);
|
||||
});
|
||||
|
||||
|
||||
TimeUtilizationGraphAdapter.method('getTimeUtilizationSuccessCallBack', function(callBackData) {
|
||||
|
||||
var that = this;
|
||||
var chart;
|
||||
|
||||
var filterHtml = that.getTableTopButtonHtml();
|
||||
$("#tabPageTimeUtilizationGraph svg").remove();
|
||||
$("#tabPageTimeUtilizationGraph div").remove();
|
||||
$("#tabPageTimeUtilizationGraph").html("");
|
||||
$("#tabPageTimeUtilizationGraph").html(filterHtml+"<svg></svg>");
|
||||
|
||||
nv.addGraph(function() {
|
||||
|
||||
var chart = nv.models.multiBarChart()
|
||||
.margin({bottom: 200})
|
||||
.transitionDuration(0)
|
||||
.reduceXTicks(true) //If 'false', every single x-axis tick label will be rendered.
|
||||
.rotateLabels(45) //Angle to rotate x-axis labels.
|
||||
.showControls(true) //Allow user to switch between 'Grouped' and 'Stacked' mode.
|
||||
.groupSpacing(0.1) //Distance between each group of bars.
|
||||
;
|
||||
|
||||
chart.yAxis
|
||||
.tickFormat(d3.format(',.1f'));
|
||||
|
||||
|
||||
|
||||
d3.select('#tabPageTimeUtilizationGraph svg')
|
||||
.datum(callBackData)
|
||||
.call(chart);
|
||||
|
||||
chart.dispatch.on('stateChange', function(e) { nv.log('New State:', JSON.stringify(e)); });
|
||||
|
||||
chart.tooltip(function (key, x, y, e, graph) {
|
||||
return '<p><strong>' + key + '</strong></p>' +
|
||||
'<p>' + y + ' on ' + x + '</p>';
|
||||
});
|
||||
|
||||
return chart;
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"label":"Performance Charts",
|
||||
"menu":"Employees",
|
||||
"order":"93",
|
||||
"icon":"fa-bar-chart-o",
|
||||
"user_levels":["Admin","Manager"],
|
||||
|
||||
"permissions":
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -87,6 +87,20 @@ if (!class_exists('CompanyStructure')) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function isHeadOfCompanyStructure($companyStructureId, $profileId){
|
||||
$companyStructure = new CompanyStructure();
|
||||
$companyStructure->Load("id = ?",array($companyStructureId));
|
||||
|
||||
if(isset($companyStructure->heads) && !empty($companyStructure->heads)){
|
||||
$heads = json_decode($companyStructure->heads);
|
||||
if(is_array($heads) && !empty($heads) && in_array($profileId, $heads)){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
|
||||
<div class="small-box bg-green">
|
||||
<div class="inner">
|
||||
<h3>Company</h3>
|
||||
<h3><t>Company</t></h3>
|
||||
<p id="numberOfCompanyStuctures">
|
||||
#_numberOfCompanyStuctures_# Departments
|
||||
#_numberOfCompanyStuctures_# <t>Departments</t>
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-shuffle"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="companyLink">
|
||||
Manage Company <i class="fa fa-arrow-circle-right"></i>
|
||||
<t>Manage</t> <t>Company</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -54,8 +54,8 @@ path.link {
|
||||
<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="tabCompanyStructure" href="#tabPageCompanyStructure">Company Structure</a></li>
|
||||
<li><a id="tabCompanyGraph" href="#tabPageCompanyGraph">Company Graph</a></li>
|
||||
<li class="active"><a id="tabCompanyStructure" href="#tabPageCompanyStructure"><?=LanguageManager::tran('Company Structure')?></a></li>
|
||||
<li><a id="tabCompanyGraph" href="#tabPageCompanyGraph"><?=LanguageManager::tran('Company Graph')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -43,7 +43,8 @@ CompanyStructureAdapter.method('getFormFields', function() {
|
||||
[ "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":"select2","remote-source":["Country","code","name"]}],
|
||||
[ "timezone", {"label":"Time Zone","type":"select2","allow-null":false,"remote-source":["Timezone","name","details"]}],
|
||||
[ "parent", {"label":"Parent Structure","type":"select","allow-null":true,"remote-source":["CompanyStructure","id","title"]}]
|
||||
[ "parent", {"label":"Parent Structure","type":"select","allow-null":true,"remote-source":["CompanyStructure","id","title"]}],
|
||||
[ "heads", {"label":"Heads","type":"select2multi","allow-null":true,"remote-source":["Employee","id","first_name+last_name"]}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
@@ -93,6 +93,6 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
} catch (e) {
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<?php include APP_BASE_PATH.'footer.php';?>
|
||||
@@ -35,7 +35,7 @@ class EmployeesActionManager extends SubActionManager{
|
||||
|
||||
$ok = $employee->Save();
|
||||
if(!$ok){
|
||||
return new IceResponse(IceResponse::ERROR, "Error occured while activating employee");
|
||||
return new IceResponse(IceResponse::ERROR, "Error occurred while activating employee");
|
||||
}
|
||||
|
||||
return new IceResponse(IceResponse::SUCCESS, $employee);
|
||||
|
||||
@@ -30,6 +30,7 @@ if (!class_exists('EmployeesAdminManager')) {
|
||||
public function setupModuleClassDefinitions(){
|
||||
$this->addModelClass('Employee');
|
||||
$this->addModelClass('EmploymentStatus');
|
||||
$this->addModelClass('EmployeeApproval');
|
||||
}
|
||||
|
||||
public function getDashboardItemData(){
|
||||
@@ -288,6 +289,25 @@ if (!class_exists('EmploymentStatus')) {
|
||||
}
|
||||
}
|
||||
|
||||
if (!class_exists('EmployeeApproval')) {
|
||||
class EmployeeApproval extends ICEHRM_Record {
|
||||
|
||||
var $_table = 'EmployeeApprovals';
|
||||
|
||||
public function getAdminAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getManagerAccess(){
|
||||
return array("get","element","save");
|
||||
}
|
||||
|
||||
public function getUserAccess(){
|
||||
return array();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!class_exists('EmployeeRestEndPoint')) {
|
||||
class EmployeeRestEndPoint extends RestEndPoint{
|
||||
|
||||
@@ -56,8 +56,7 @@
|
||||
<div class="row" style="margin-left:10px;margin-top:20px;">
|
||||
<div class="panel panel-default" style="width:97.5%;">
|
||||
<div class="panel-heading"><h4>Personal Information</h4></div>
|
||||
<div class="panel-body">
|
||||
<div class="row-fluid">
|
||||
<div class="panel-body" id="cont_personal_information">
|
||||
<div class="col-xs-6 col-md-3" style="font-size:16px;">
|
||||
<label class="control-label col-xs-12" style="font-size:13px;">#_label_driving_license_#</label>
|
||||
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="driving_license"></label>
|
||||
@@ -74,9 +73,6 @@
|
||||
<label class="control-label col-xs-12" style="font-size:13px;">#_label_gender_#</label>
|
||||
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="gender"></label>
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
<div class="row-fluid">
|
||||
|
||||
<div class="col-xs-6 col-md-3" style="font-size:16px;">
|
||||
<label class="control-label col-xs-12" style="font-size:13px;">#_label_nationality_#</label>
|
||||
@@ -93,13 +89,11 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" style="margin-left:10px;margin-top:20px;">
|
||||
<div class="panel panel-default" style="width:97.5%;">
|
||||
<div class="panel-heading"><h4>Contact Information</h4></div>
|
||||
<div class="panel-body">
|
||||
<div class="row-fluid">
|
||||
<div class="panel-body" id="cont_contact_information">
|
||||
<div class="col-xs-6 col-md-3" style="font-size:16px;">
|
||||
<label class="control-label col-xs-12" style="font-size:13px;">#_label_address1_#</label>
|
||||
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="address1"></label>
|
||||
@@ -116,9 +110,6 @@
|
||||
<label class="control-label col-xs-12" style="font-size:13px;">#_label_country_#</label>
|
||||
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="country_Name"></label>
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
<div class="row-fluid">
|
||||
<div class="col-xs-6 col-md-3" style="font-size:16px;">
|
||||
<label class="control-label col-xs-12" style="font-size:13px;">#_label_postal_code_#</label>
|
||||
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="postal_code"></label>
|
||||
@@ -138,13 +129,11 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" style="margin-left:10px;margin-top:20px;">
|
||||
<div class="panel panel-default" style="width:97.5%;">
|
||||
<div class="panel-heading"><h4>Job Details</h4></div>
|
||||
<div class="panel-body">
|
||||
<div class="row-fluid">
|
||||
<div class="panel-body" id="cont_job_details">
|
||||
<div class="col-xs-6 col-md-3" style="font-size:16px;">
|
||||
<label class="control-label col-xs-12" style="font-size:13px;">#_label_job_title_#</label>
|
||||
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="job_title_Name"></label>
|
||||
@@ -161,9 +150,6 @@
|
||||
<label class="control-label col-xs-12" style="font-size:13px;">Direct Reports</label>
|
||||
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="subordinates"></label>
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
<div class="row-fluid">
|
||||
<div class="col-xs-6 col-md-3" style="font-size:16px;">
|
||||
<label class="control-label col-xs-12" style="font-size:13px;">#_label_department_#</label>
|
||||
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="department_Name"></label>
|
||||
@@ -171,6 +157,10 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="customFieldsCont">
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@@ -3,17 +3,17 @@
|
||||
<div class="small-box bg-aqua">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
People
|
||||
<t>People</t>
|
||||
</h3>
|
||||
<p id="numberOfEmployees">
|
||||
#_numberOfEmployees_# Employees
|
||||
#_numberOfEmployees_# <t>Employees</t>
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-person-stalker"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="employeeLink">
|
||||
Manage Employees <i class="fa fa-arrow-circle-right"></i>
|
||||
<t>Manage</t> <t>Employees</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -11,30 +11,30 @@ $customFields = BaseService::getInstance()->getCustomFields("Employee");
|
||||
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
|
||||
<?php if($user->user_level != "Admin"){
|
||||
?>
|
||||
<li class="active"><a id="tabEmployee" href="#tabPageEmployee">Employees (Direct Reports)</a></li>
|
||||
<li class="active"><a id="tabEmployee" href="#tabPageEmployee"><?=LanguageManager::tran('Employees (Direct Reports)')?></a></li>
|
||||
<?php }else{ ?>
|
||||
<li class="active"><a id="tabEmployee" href="#tabPageEmployee">Employees</a></li>
|
||||
<li class="active"><a id="tabEmployee" href="#tabPageEmployee"><?=LanguageManager::tran('Employees')?></a></li>
|
||||
<?php }?>
|
||||
|
||||
<?php if($user->user_level == "Admin"){
|
||||
?>
|
||||
<li><a id="tabEmployeeSkill" href="#tabPageEmployeeSkill">Skills</a></li>
|
||||
<li><a id="tabEmployeeEducation" href="#tabPageEmployeeEducation">Education</a></li>
|
||||
<li><a id="tabEmployeeCertification" href="#tabPageEmployeeCertification">Certifications</a></li>
|
||||
<li><a id="tabEmployeeLanguage" href="#tabPageEmployeeLanguage">Languages</a></li>
|
||||
<li><a id="tabEmployeeDependent" href="#tabPageEmployeeDependent">Dependents</a></li>
|
||||
<li><a id="tabEmergencyContact" href="#tabPageEmergencyContact">Emergency Contacts</a></li>
|
||||
<?php if (!class_exists('DocumentsAdminManager')) {?>
|
||||
<li><a id="tabEmployeeDocument" href="#tabPageEmployeeDocument">Documents</a></li>
|
||||
<li><a id="tabEmployeeSkill" href="#tabPageEmployeeSkill"><?=LanguageManager::tran('Skills')?></a></li>
|
||||
<li><a id="tabEmployeeEducation" href="#tabPageEmployeeEducation"><?=LanguageManager::tran('Education')?></a></li>
|
||||
<li><a id="tabEmployeeCertification" href="#tabPageEmployeeCertification"><?=LanguageManager::tran('Certifications')?></a></li>
|
||||
<li><a id="tabEmployeeLanguage" href="#tabPageEmployeeLanguage"><?=LanguageManager::tran('Languages')?></a></li>
|
||||
<li><a id="tabEmployeeDependent" href="#tabPageEmployeeDependent"><?=LanguageManager::tran('Dependents')?></a></li>
|
||||
<li><a id="tabEmergencyContact" href="#tabPageEmergencyContact"><?=LanguageManager::tran('Emergency Contacts')?></a></li>
|
||||
<?php if (class_exists('DocumentsAdminManager')) {?>
|
||||
<li><a id="tabEmployeeDocument" href="#tabPageEmployeeDocument"><?=LanguageManager::tran('Documents')?></a></li>
|
||||
<?php } ?>
|
||||
<?php }?>
|
||||
<?php if($user->user_level == "Admin"){
|
||||
?>
|
||||
<li class="dropdown">
|
||||
<a href="#" id="terminatedEmployeeMenu" class="dropdown-toggle" data-toggle="dropdown" aria-controls="terminatedEmployeeMenu-contents">Suspended Employees <span class="caret"></span></a>
|
||||
<a href="#" id="terminatedEmployeeMenu" class="dropdown-toggle" data-toggle="dropdown" aria-controls="terminatedEmployeeMenu-contents"><?=LanguageManager::tran('Deactivated Employees')?> <span class="caret"></span></a>
|
||||
<ul class="dropdown-menu" role="menu" aria-labelledby="terminatedEmployeeMenu" id="terminatedEmployeeMenu-contents">
|
||||
<li><a id="tabTerminatedEmployee" href="#tabPageTerminatedEmployee">Temporarily Suspended Employees</a></li>
|
||||
<li><a id="tabArchivedEmployee" href="#tabPageArchivedEmployee">Terminated Employee Data</a></li>
|
||||
<li><a id="tabTerminatedEmployee" href="#tabPageTerminatedEmployee"><?=LanguageManager::tran('Temporarily Deactivated Employees')?></a></li>
|
||||
<li><a id="tabArchivedEmployee" href="#tabPageArchivedEmployee"><?=LanguageManager::tran('Terminated Employee Data')?></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<?php }?>
|
||||
@@ -115,7 +115,7 @@ $customFields = BaseService::getInstance()->getCustomFields("Employee");
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<?php if (!class_exists('DocumentsAdminManager')) {?>
|
||||
<?php if (class_exists('DocumentsAdminManager')) {?>
|
||||
<div class="tab-pane" id="tabPageEmployeeDocument">
|
||||
<div id="EmployeeDocument" class="reviewBlock" data-content="List" style="padding-left:5px;">
|
||||
|
||||
@@ -133,7 +133,7 @@ $customFields = BaseService::getInstance()->getCustomFields("Employee");
|
||||
var modJsList = new Array();
|
||||
<?php if($user->user_level != "Admin"){
|
||||
?>
|
||||
modJsList['tabEmployee'] = new EmployeeAdapter('Employee','Employee',{"status":"Active", "supervisor":"__myid__"});
|
||||
modJsList['tabEmployee'] = new EmployeeAdapter('Employee','Employee',{"status":"Active"});
|
||||
modJsList['tabEmployee'].setShowAddNew(false);
|
||||
<?php
|
||||
}else{
|
||||
@@ -176,7 +176,7 @@ modJsList['tabTerminatedEmployee'] = new TerminatedEmployeeAdapter('Employee','T
|
||||
modJsList['tabTerminatedEmployee'].setRemoteTable(true);
|
||||
modJsList['tabTerminatedEmployee'].setShowAddNew(false);
|
||||
|
||||
<?php if (!class_exists('DocumentsAdminManager')) {?>
|
||||
<?php if (class_exists('DocumentsAdminManager')) {?>
|
||||
modJsList['tabEmployeeDocument'] = new EmployeeDocumentAdapter('EmployeeDocument','EmployeeDocument');
|
||||
modJsList['tabTerminatedEmployee'].setRemoteTable(true);
|
||||
<?php } ?>
|
||||
@@ -193,10 +193,10 @@ var modJs = modJsList['tabEmployee'];
|
||||
<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;">Employee Saved Successfully</h3>
|
||||
<h3 style="font-size: 17px;"><?=LanguageManager::tran('Employee Saved Successfully')?></h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
Employee needs a User to login to IceHrm. Do you want to create a user for this employee now? <br/><br/>You can do this later through Users module if required.
|
||||
<?=LanguageManager::tran('Employee needs a User to login to IceHrm. Do you want to create a user for this employee now?')?> <br/><br/><?=LanguageManager::tran('You can do this later through Users module if required.')?>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-primary" onclick="modJs.createUser();">Yes</button>
|
||||
|
||||
@@ -36,7 +36,7 @@ EmployeeAdapter.method('setFieldNameMap', function(fields) {
|
||||
if(field.display == "Hidden"){
|
||||
this.hiddenFields[field.name] = field;
|
||||
}else{
|
||||
if(field.display == "Table and Form"){
|
||||
if(field.display == "Table and Form" || field.display == "Form"){
|
||||
this.tableFields[field.name] = field;
|
||||
}else{
|
||||
this.formOnlyFields[field.name] = field;
|
||||
@@ -447,6 +447,43 @@ EmployeeAdapter.method('renderEmployee', function(data) {
|
||||
|
||||
$("#"+this.getTableName()+" #profile_image_"+data.id).attr('src',data.image);
|
||||
|
||||
|
||||
var sectionTemplate = '<div class="row" style="margin-left:10px;margin-top:20px;"><div class="panel panel-default" style="width:97.5%;"><div class="panel-heading"><h4>#_section.name_#</h4></div> <div class="panel-body" id="cont_#_section_#"> </div></div></div>';
|
||||
var sectionId = '';
|
||||
var sectionHtml = '';
|
||||
//Add custom fields
|
||||
if(data.customFields != undefined && data.customFields != null && Object.keys(data.customFields).length > 0) {
|
||||
|
||||
|
||||
var ct = '<div class="col-xs-6 col-md-3" style="font-size:16px;"><label class="control-label col-xs-12" style="font-size:13px;">#_label_#</label><label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;">#_value_#</label></div>';
|
||||
var customFieldHtml;
|
||||
for (index in data.customFields) {
|
||||
|
||||
if(!data.customFields[index][1]){
|
||||
data.customFields[index][1] = 'Other Details';
|
||||
}
|
||||
|
||||
sectionId = data.customFields[index][1].toLocaleLowerCase();
|
||||
sectionId = sectionId.replace(' ','_');
|
||||
|
||||
if($("#cont_"+sectionId).length <= 0){
|
||||
//Add section
|
||||
sectionHtml = sectionTemplate;
|
||||
sectionHtml = sectionHtml.replace('#_section_#', sectionId);
|
||||
sectionHtml = sectionHtml.replace('#_section.name_#', data.customFields[index][1]);
|
||||
$("#customFieldsCont").append($(sectionHtml));
|
||||
}
|
||||
|
||||
customFieldHtml = ct;
|
||||
customFieldHtml = customFieldHtml.replace('#_label_#', index);
|
||||
customFieldHtml = customFieldHtml.replace('#_value_#', data.customFields[index][0]);
|
||||
$("#cont_"+sectionId).append($(customFieldHtml));
|
||||
}
|
||||
}else{
|
||||
$("#customFieldsCont").remove();
|
||||
}
|
||||
|
||||
|
||||
this.cancel();
|
||||
|
||||
if(!this.isModuleInstalled("admin","documents")) {
|
||||
|
||||
@@ -53,5 +53,30 @@ if (!class_exists('CustomField')) {
|
||||
public function getAnonymousAccess(){
|
||||
return array("get","element");
|
||||
}
|
||||
|
||||
public function validateSave($obj){
|
||||
$type = $obj->type;
|
||||
$baseObject = new $type();
|
||||
$fields = $baseObject->getObjectKeys();
|
||||
if(isset($fields[$obj->name])){
|
||||
return new IceResponse(IceResponse::ERROR,"Column name already exists by default");
|
||||
}
|
||||
|
||||
$cf = new CustomField();
|
||||
if(empty($obj->id)){
|
||||
$cf->Load("type = ? and name = ?",array($obj->type, $obj->name));
|
||||
if($cf->name == $obj->name){
|
||||
return new IceResponse(IceResponse::ERROR,"Another custom field with same name has already been added");
|
||||
}
|
||||
}else{
|
||||
$cf->Load("type = ? and name = ? and id <> ?",array($obj->type, $obj->name, $obj->id));
|
||||
if($cf->name == $obj->name){
|
||||
return new IceResponse(IceResponse::ERROR,"Another custom field with same name has already been added");
|
||||
}
|
||||
}
|
||||
|
||||
return new IceResponse(IceResponse::SUCCESS,"");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -15,13 +15,8 @@ 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="dropdown">
|
||||
<a href="#" id="settingsEmployeeMenu" class="dropdown-toggle" data-toggle="dropdown" aria-controls="settingsEmployeeMenu-contents">Employee Fields <span class="caret"></span></a>
|
||||
<ul class="dropdown-menu" role="menu" aria-labelledby="settingsEmployeeMenu" id="settingsEmployeeMenu-contents">
|
||||
<li><a id="tabEmployeeFieldName" href="#tabPageEmployeeFieldName">Employee Field Name Mapping</a></li>
|
||||
<li><a id="tabEmployeeCustomField" href="#tabPageEmployeeCustomField">Employee Custom Fields</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="active"><a id="tabEmployeeFieldName" href="#tabPageEmployeeFieldName"><?=LanguageManager::tran('Employee Field Names')?></a></li>
|
||||
<li><a id="tabEmployeeCustomField" href="#tabPageEmployeeCustomField"><?=LanguageManager::tran('Employee Custom Fields')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
@@ -51,9 +46,9 @@ modJsList['tabEmployeeFieldName'] = new FieldNameAdapter('FieldNameMapping','Emp
|
||||
modJsList['tabEmployeeFieldName'].setRemoteTable(true);
|
||||
modJsList['tabEmployeeFieldName'].setShowAddNew(false);
|
||||
|
||||
modJsList['tabEmployeeCustomField'] = new CustomFieldAdapter('CustomField','EmployeeCustomField',{"type":"Employee"});
|
||||
modJsList['tabEmployeeCustomField'] = new CustomFieldAdapter('CustomField','EmployeeCustomField',{"type":"Employee"},"display_order desc");
|
||||
modJsList['tabEmployeeCustomField'].setRemoteTable(true);
|
||||
modJsList['tabEmployeeCustomField'].setShowAddNew(false);
|
||||
modJsList['tabEmployeeCustomField'].setTableType("Employee");
|
||||
|
||||
|
||||
var modJs = modJsList['tabEmployeeFieldName'];
|
||||
|
||||
@@ -52,6 +52,7 @@ FieldNameAdapter.method('getFormFields', function() {
|
||||
|
||||
function CustomFieldAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
this.tableType = "";
|
||||
}
|
||||
|
||||
CustomFieldAdapter.inherits(AdapterBase);
|
||||
@@ -62,7 +63,8 @@ CustomFieldAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"display"
|
||||
"display",
|
||||
"display_order"
|
||||
];
|
||||
});
|
||||
|
||||
@@ -70,17 +72,74 @@ CustomFieldAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Display Status"}
|
||||
{ "sTitle": "Display Status"},
|
||||
{ "sTitle": "Priority"}
|
||||
];
|
||||
});
|
||||
|
||||
CustomFieldAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "type", {"label":"Type","type":"placeholder","validation":""}],
|
||||
[ "name", {"label":"Name","type":"placeholder","validation":""}],
|
||||
[ "data", {"label":"Data","type":"textarea","validation":""}],
|
||||
[ "display", {"label":"Display Status","type":"select","source":[["Form","Form"],["Table and Form","Table and Form"],["Hidden","Hidden"]]}]
|
||||
//[ "type", {"label":"Type","type":"placeholder","validation":""}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}],
|
||||
[ "display", {"label":"Display Status","type":"select","source":[["Form","Show"],["Hidden","Hidden"]]}],
|
||||
[ "field_type", {"label":"Field Type","type":"select","source":[["text","Text Field"],["textarea","Text Area"],["select","Select"],["select2","Select2"],["select2multi","Multi Select"],["fileupload","File Upload"],["date","Date"],["datetime","Date Time"],["time","Time"]]}],
|
||||
[ "field_label", {"label":"Field Label","type":"text","validation":""}],
|
||||
[ "field_validation", {"label":"Validation","type":"select","validation":"none","sort":"none","source":[["","Required"],["none","None"],["number","Number"],["numberOrEmpty","Number or Empty"],["float","Decimal"],["email","Email"],["emailOrEmpty","Email or Empty"]]}],
|
||||
[ "field_options", {"label":"Field Options","type":"datagroup",
|
||||
"form":[
|
||||
[ "label", {"label":"Label","type":"text","validation":""}],
|
||||
[ "value", {"label":"Value","type":"text","validation":"none"}]
|
||||
],
|
||||
"html":'<div id="#_id_#" class="panel panel-default"><div class="panel-body">#_delete_##_edit_#<span style="color:#999;font-size:13px;font-weight:bold">#_label_#</span>:#_value_#</div></div>',
|
||||
"validation":"none"
|
||||
}],
|
||||
[ "display_order", {"label":"Priority","type":"text","validation":"number"}],
|
||||
[ "display_section", {"label":"Display Section","type":"text","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
CustomFieldAdapter.method('setTableType', function(type) {
|
||||
this.tableType = type;
|
||||
});
|
||||
|
||||
CustomFieldAdapter.method('doCustomValidation', function(params) {
|
||||
var validateName= function (str) {
|
||||
var name = /^[a-z][a-z0-9\._]+$/;
|
||||
return str != null && name.test(str);
|
||||
};
|
||||
|
||||
if(!validateName(params.name)){
|
||||
return "Invalid name for custom field";
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
CustomFieldAdapter.method('forceInjectValuesBeforeSave', function(params) {
|
||||
|
||||
|
||||
//Build data field
|
||||
var data = [params.name], options = [], optionsData;
|
||||
data.push({});
|
||||
data[1]['label'] = params.field_label;
|
||||
data[1]['type'] = params.field_type;
|
||||
data[1]['validation'] = params.field_validation;
|
||||
if(["select","select2","select2multi"].indexOf(params.field_type) >= 0){
|
||||
optionsData = JSON.parse(params.field_options);
|
||||
for(index in optionsData){
|
||||
options.push([optionsData[index].value, optionsData[index].label]);
|
||||
}
|
||||
data[1]['source'] = options;
|
||||
}
|
||||
if(params.field_validation == null || params.field_validation == undefined){
|
||||
params.field_validation = "";
|
||||
}
|
||||
params.data = JSON.stringify(data);
|
||||
params.type = this.tableType;
|
||||
return params;
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@ 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 = 'jobs';
|
||||
define('MODULE_PATH',dirname(__FILE__));
|
||||
include APP_BASE_PATH.'header.php';
|
||||
@@ -28,9 +27,9 @@ 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="tabJobTitles" href="#tabPageJobTitles">Job Titles</a></li>
|
||||
<li><a id="tabPayGrades" href="#tabPagePayGrades">Pay Grades</a></li>
|
||||
<li><a id="tabEmploymentStatus" href="#tabPageEmploymentStatus">Employment Status</a></li>
|
||||
<li class="active"><a id="tabJobTitles" href="#tabPageJobTitles"><?=LanguageManager::tran('Job Titles')?></a></li>
|
||||
<li><a id="tabPayGrades" href="#tabPagePayGrades"><?=LanguageManager::tran('Pay Grades')?></a></li>
|
||||
<li><a id="tabEmploymentStatus" href="#tabPageEmploymentStatus"><?=LanguageManager::tran('Employment Status')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -28,8 +28,8 @@ 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="tabCompanyLoan" href="#tabPageCompanyLoan">Loan Types</a></li>
|
||||
<li><a id="tabEmployeeCompanyLoan" href="#tabPageEmployeeCompanyLoan">Employee Loans</a></li>
|
||||
<li class="active"><a id="tabCompanyLoan" href="#tabPageCompanyLoan"><?=LanguageManager::tran('Loan Types')?></a></li>
|
||||
<li><a id="tabEmployeeCompanyLoan" href="#tabPageEmployeeCompanyLoan"><?=LanguageManager::tran('Employee Loans')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"Admin":"fa-cubes",
|
||||
"Employees":"fa-users",
|
||||
"Reports":"fa-file-text",
|
||||
"Admin Reports":"fa-file-text",
|
||||
"System":"fa-cogs",
|
||||
"Payroll":"fa-money"
|
||||
}
|
||||
|
||||
@@ -52,7 +52,12 @@ if (!class_exists('Country')) {
|
||||
}
|
||||
|
||||
if(!empty($allowedCountries)){
|
||||
return parent::Find("id in (".implode(",",$allowedCountries).")" , array());
|
||||
$res = parent::Find("id in (".implode(",",$allowedCountries).")" , array());
|
||||
if(empty($res)){
|
||||
SettingsManager::getInstance()->setSetting('System: Allowed Countries','');
|
||||
}else{
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
return parent::Find($whereOrderBy, $bindarr, $pkeysArr, $extra);
|
||||
@@ -103,7 +108,12 @@ if (!class_exists('CurrencyType')) {
|
||||
}
|
||||
|
||||
if(!empty($allowedCountries)){
|
||||
return parent::Find("id in (".implode(",",$allowedCountries).")" , array());
|
||||
$res = parent::Find("id in (".implode(",",$allowedCountries).")" , array());
|
||||
if(empty($res)){
|
||||
SettingsManager::getInstance()->setSetting('System: Allowed Currencies','');
|
||||
}else{
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
return parent::Find($whereOrderBy, $bindarr, $pkeysArr, $extra);
|
||||
@@ -136,7 +146,12 @@ if (!class_exists('Nationality')) {
|
||||
}
|
||||
|
||||
if(!empty($allowedCountries)){
|
||||
return parent::Find("id in (".implode(",",$allowedCountries).")" , array());
|
||||
$res = parent::Find("id in (".implode(",",$allowedCountries).")" , array());
|
||||
if(empty($res)){
|
||||
SettingsManager::getInstance()->setSetting('System: Allowed Currencies','');
|
||||
}else{
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
return parent::Find($whereOrderBy, $bindarr, $pkeysArr, $extra);
|
||||
@@ -210,6 +225,42 @@ if (!class_exists('CalculationHook')) {
|
||||
}
|
||||
}
|
||||
|
||||
if (!class_exists('CustomFieldValue')) {
|
||||
class CustomFieldValue extends ICEHRM_Record {
|
||||
var $_table = 'CustomFieldValues';
|
||||
|
||||
public function getAdminAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getUserAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getAnonymousAccess(){
|
||||
return array();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!class_exists('SupportedLanguage')) {
|
||||
class SupportedLanguage extends ICEHRM_Record {
|
||||
var $_table = 'SupportedLanguages';
|
||||
|
||||
public function getAdminAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getUserAccess(){
|
||||
return array();
|
||||
}
|
||||
|
||||
public function getAnonymousAccess(){
|
||||
return array("get","element");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ 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="tabModule" href="#tabPageModule">Modules</a></li>
|
||||
<li class="active"><a id="tabModule" href="#tabPageModule"><?=LanguageManager::tran('Modules')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -3,17 +3,17 @@
|
||||
<div class="small-box bg-aqua">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
Permission
|
||||
<t>Permission</t>
|
||||
</h3>
|
||||
<p>
|
||||
Management
|
||||
<t>Management</t>
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-locked"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="permissionLink">
|
||||
Manage Permissions <i class="fa fa-arrow-circle-right"></i>
|
||||
<t>Manage</t> <t>Permissions</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -28,7 +28,7 @@ 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="tabPermission" href="#tabPagePermission">Permissions</a></li>
|
||||
<li class="active"><a id="tabPermission" href="#tabPagePermission"><?=LanguageManager::tran('Permissions')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -69,5 +69,52 @@ if (!class_exists('Project')) {
|
||||
public function getUserAccess(){
|
||||
return array("get","element");
|
||||
}
|
||||
|
||||
public function getAllProjects(){
|
||||
$project = new Project();
|
||||
$projects = $project->Find("status = ?",'Active');
|
||||
foreach($projects as $project){
|
||||
$client = new Client();
|
||||
$client->Load("id = ?",array($project->client));
|
||||
|
||||
$project->name = $project->name." (".$client->name.")";
|
||||
$employeeProjects[] = $project;
|
||||
}
|
||||
return $employeeProjects;
|
||||
}
|
||||
|
||||
public function getEmployeeProjects(){
|
||||
$allowAllProjects = SettingsManager::getInstance()->getSetting("Projects: Make All Projects Available to Employees");
|
||||
$employeeProjects = array();
|
||||
if($allowAllProjects == 0){
|
||||
$employeeProjectsTemp = new EmployeeProject();
|
||||
$employeeProjectsTemp = $employeeProjectsTemp->Find("employee = ?",array(BaseService::getInstance()->getCurrentProfileId()));
|
||||
foreach($employeeProjectsTemp as $p){
|
||||
$project = new Project();
|
||||
$project->Load("id = ?",array($p->project));
|
||||
if($project->status == 'Active'){
|
||||
|
||||
$client = new Client();
|
||||
$client->Load("id = ?",array($project->client));
|
||||
|
||||
$project->name = $project->name." (".$client->name.")";
|
||||
$employeeProjects[] = $project;
|
||||
}
|
||||
|
||||
}
|
||||
}else{
|
||||
$project = new Project();
|
||||
$projects = $project->Find("status = ?",array('Active'));
|
||||
foreach($projects as $project){
|
||||
$client = new Client();
|
||||
$client->Load("id = ?",array($project->client));
|
||||
|
||||
$project->name = $project->name." (".$client->name.")";
|
||||
$employeeProjects[] = $project;
|
||||
}
|
||||
}
|
||||
|
||||
return $employeeProjects;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,16 +2,16 @@
|
||||
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
<h3>Projects</h3>
|
||||
<h3><t>Projects</t></h3>
|
||||
<p id="numberOfProjects">
|
||||
#_numberOfProjects_# Active Projects
|
||||
#_numberOfProjects_# <t>Active Projects</t>
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-pie-graph"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="projectsLink">
|
||||
Update Clients/Projects <i class="fa fa-arrow-circle-right"></i>
|
||||
<t>Update Clients/Projects</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -28,9 +28,9 @@ 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="tabClient" href="#tabPageClient">Clients</a></li>
|
||||
<li><a id="tabProject" href="#tabPageProject">Projects</a></li>
|
||||
<li><a id="tabEmployeeProject" href="#tabPageEmployeeProject">Employee Projects</a></li>
|
||||
<li class="active"><a id="tabClient" href="#tabPageClient"><?=LanguageManager::tran('Clients')?></a></li>
|
||||
<li><a id="tabProject" href="#tabPageProject"><?=LanguageManager::tran('Projects')?></a></li>
|
||||
<li><a id="tabEmployeeProject" href="#tabPageEmployeeProject"><?=LanguageManager::tran('Employee Projects')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -95,13 +95,14 @@ ProjectAdapter.method('getHeaders', function() {
|
||||
});
|
||||
|
||||
ProjectAdapter.method('getFormFields', function() {
|
||||
|
||||
if(this.showSave){
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text"}],
|
||||
[ "client", {"label":"Client","type":"select2","allow-null":true,"remote-source":["Client","id","name"]}],
|
||||
[ "details", {"label":"Details","type":"textarea","validation":"none"}],
|
||||
[ "status", {"label":"Status","type":"select","source":[["Active","Active"],["Inactive","Inactive"]]}]
|
||||
[ "status", {"label":"Status","type":"select","source":[["Active","Active"],["On Hold","On Hold"],["Completed","Completed"],["Dropped","Dropped"]]}]
|
||||
];
|
||||
}else{
|
||||
return [
|
||||
@@ -109,7 +110,7 @@ ProjectAdapter.method('getFormFields', function() {
|
||||
[ "name", {"label":"Name","type":"placeholder"}],
|
||||
[ "client", {"label":"Client","type":"placeholder","allow-null":true,"remote-source":["Client","id","name"]}],
|
||||
[ "details", {"label":"Details","type":"placeholder","validation":"none"}],
|
||||
[ "status", {"label":"Status","type":"placeholder","source":[["Active","Active"],["Inactive","Inactive"]]}]
|
||||
[ "status", {"label":"Status","type":"select","source":[["Active","Active"],["On Hold","On Hold"],["Completed","Completed"],["Dropped","Dropped"]]}]
|
||||
];
|
||||
}
|
||||
|
||||
@@ -137,8 +138,7 @@ EmployeeProjectAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"project",
|
||||
"status"
|
||||
"project"
|
||||
];
|
||||
});
|
||||
|
||||
@@ -146,9 +146,7 @@ EmployeeProjectAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Project" },
|
||||
/*{ "sTitle": "Start Date"},*/
|
||||
{ "sTitle": "Status"}
|
||||
{ "sTitle": "Project" }
|
||||
];
|
||||
});
|
||||
|
||||
@@ -157,9 +155,6 @@ EmployeeProjectAdapter.method('getFormFields', function() {
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}],
|
||||
[ "project", {"label":"Project","type":"select2","remote-source":["Project","id","name"]}],
|
||||
/*[ "date_start", {"label":"Start Date","type":"date","validation":""}],
|
||||
[ "date_end", {"label":"End Date","type":"date","validation":"none"}],*/
|
||||
[ "status", {"label":"Status","type":"select","source":[["Current","Current"],["Inactive","Inactive"],["Completed","Completed"]]}],
|
||||
[ "details", {"label":"Details","type":"textarea","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
@@ -28,10 +28,10 @@ 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="tabSkill" href="#tabPageSkill">Skills</a></li>
|
||||
<li><a id="tabEducation" href="#tabPageEducation">Education</a></li>
|
||||
<li><a id="tabCertification" href="#tabPageCertification">Certifications</a></li>
|
||||
<li><a id="tabLanguage" href="#tabPageLanguage">Languages</a></li>
|
||||
<li class="active"><a id="tabSkill" href="#tabPageSkill"><?=LanguageManager::tran('Skills')?></a></li>
|
||||
<li><a id="tabEducation" href="#tabPageEducation"><?=LanguageManager::tran('Education')?></a></li>
|
||||
<li><a id="tabCertification" href="#tabPageCertification"><?=LanguageManager::tran('Certifications')?></a></li>
|
||||
<li><a id="tabLanguage" href="#tabPageLanguage"><?=LanguageManager::tran('Languages')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
|
||||
<div class="small-box bg-teal">
|
||||
<div class="inner">
|
||||
<h3>Reports</h3>
|
||||
<h3><t>Reports</t></h3>
|
||||
<p>
|
||||
View / Download Reports
|
||||
<t>View / Download Reports</t>
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-document-text"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="reportsLink">
|
||||
Create a Report <i class="fa fa-arrow-circle-right"></i>
|
||||
<t>Generate a Report</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -7,7 +7,7 @@ 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="tabReport" href="#tabPageReport">Reports</a></li>
|
||||
<li class="active"><a id="tabReport" href="#tabPageReport"><?=LanguageManager::tran('Reports')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
@@ -30,10 +30,7 @@ modJsList['tabReport'] = new ReportAdapter('Report','Report','','report_group');
|
||||
modJsList['tabReport'].setShowAddNew(false);
|
||||
modJsList['tabReport'].setRemoteTable(true);
|
||||
|
||||
/*
|
||||
modJsList['tabReport'] = new ReportGenAdapter('File','File','{"file_group":"Report"}','group');
|
||||
modJsList['tabReport'].setShowAddNew(false);
|
||||
*/
|
||||
|
||||
|
||||
var modJs = modJsList['tabReport'];
|
||||
|
||||
|
||||
@@ -10,14 +10,19 @@
|
||||
|
||||
function ReportAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
this._construct();
|
||||
}
|
||||
|
||||
ReportAdapter.inherits(AdapterBase);
|
||||
|
||||
ReportAdapter.method('_construct', function() {
|
||||
this._formFileds = [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"label","validation":""}],
|
||||
[ "parameters", {"label":"Parameters","type":"fieldset","validation":"none"}]
|
||||
];
|
||||
}
|
||||
|
||||
ReportAdapter.inherits(AdapterBase);
|
||||
this.remoteFieldsExists = false;
|
||||
});
|
||||
|
||||
ReportAdapter.method('_initLocalFormFields', function() {
|
||||
this._formFileds = [
|
||||
@@ -27,9 +32,14 @@ ReportAdapter.method('_initLocalFormFields', function() {
|
||||
];
|
||||
});
|
||||
|
||||
ReportAdapter.method('setRemoteFieldExists', function(val) {
|
||||
this.remoteFieldsExists = val;
|
||||
});
|
||||
|
||||
ReportAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"icon",
|
||||
"name",
|
||||
"details",
|
||||
"parameters"
|
||||
@@ -39,12 +49,14 @@ ReportAdapter.method('getDataMapping', function() {
|
||||
ReportAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "","bSortable":false,"sWidth":"22px"},
|
||||
{ "sTitle": "Name","sWidth":"30%"},
|
||||
{ "sTitle": "Details"},
|
||||
{ "sTitle": "Parameters","bVisible":false},
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
ReportAdapter.method('getFormFields', function() {
|
||||
return this._formFileds;
|
||||
});
|
||||
@@ -55,12 +67,16 @@ ReportAdapter.method('processFormFieldsWithObject', function(object) {
|
||||
var len = this._formFileds.length;
|
||||
var fieldIDsToDelete = [];
|
||||
var fieldsToDelete = [];
|
||||
this.remoteFieldsExists = false;
|
||||
for(var i=0;i<len;i++){
|
||||
if(this._formFileds[i][1]['type']=="fieldset"){
|
||||
var newFields = JSON.parse(object[this._formFileds[i][0]]);
|
||||
fieldsToDelete.push(this._formFileds[i][0]);
|
||||
newFields.forEach(function(entry) {
|
||||
that._formFileds.push(entry);
|
||||
if(entry[1]['remote-source'] != undefined && entry[1]['remote-source'] != null){
|
||||
that.remoteFieldsExists = true;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
@@ -76,13 +92,178 @@ ReportAdapter.method('processFormFieldsWithObject', function(object) {
|
||||
that._formFileds = tempArray;
|
||||
});
|
||||
|
||||
|
||||
ReportAdapter.method('renderForm', function(object) {
|
||||
var that = this;
|
||||
this.processFormFieldsWithObject(object);
|
||||
if(this.remoteFieldsExists){
|
||||
var cb = function(){
|
||||
that.uber('renderForm',object);
|
||||
that.renderFormNew(object);
|
||||
};
|
||||
this.initFieldMasterData(cb);
|
||||
}else{
|
||||
this.initFieldMasterData();
|
||||
that.renderFormNew(object);
|
||||
}
|
||||
|
||||
this.currentReport = object;
|
||||
|
||||
});
|
||||
|
||||
ReportAdapter.method('renderFormNew', function(object) {
|
||||
|
||||
var that = this;
|
||||
var signatureIds = [];
|
||||
if(object == null || object == undefined){
|
||||
this.currentId = null;
|
||||
}
|
||||
|
||||
this.preRenderForm(object);
|
||||
|
||||
var formHtml = this.templates['formTemplate'];
|
||||
var html = "";
|
||||
var fields = this.getFormFields();
|
||||
|
||||
for(var i=0;i<fields.length;i++){
|
||||
var metaField = this.getMetaFieldForRendering(fields[i][0]);
|
||||
if(metaField == "" || metaField == undefined){
|
||||
html += this.renderFormField(fields[i]);
|
||||
}else{
|
||||
var metaVal = object[metaField];
|
||||
if(metaVal != '' && metaVal != null && metaVal != undefined && metaVal.trim() != ''){
|
||||
html += this.renderFormField(JSON.parse(metaVal));
|
||||
}else{
|
||||
html += this.renderFormField(fields[i]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
formHtml = formHtml.replace(/_id_/g,this.getTableName()+"_submit");
|
||||
formHtml = formHtml.replace(/_fields_/g,html);
|
||||
|
||||
|
||||
var $tempDomObj;
|
||||
var randomFormId = this.generateRandom(14);
|
||||
if(!this.showFormOnPopup){
|
||||
$tempDomObj = $("#"+this.getTableName()+'Form');
|
||||
}else{
|
||||
$tempDomObj = $('<div class="reviewBlock popupForm" data-content="Form"></div>');
|
||||
$tempDomObj.attr('id',randomFormId);
|
||||
|
||||
}
|
||||
|
||||
$tempDomObj.html(formHtml);
|
||||
|
||||
|
||||
$tempDomObj.find('.datefield').datepicker({'viewMode':2});
|
||||
$tempDomObj.find('.timefield').datetimepicker({
|
||||
language: 'en',
|
||||
pickDate: false
|
||||
});
|
||||
$tempDomObj.find('.datetimefield').datetimepicker({
|
||||
language: 'en'
|
||||
});
|
||||
|
||||
$tempDomObj.find('.colorpick').colorpicker();
|
||||
|
||||
//$tempDomObj.find('.select2Field').select2();
|
||||
$tempDomObj.find('.select2Field').each(function() {
|
||||
$(this).select2().select2('val', $(this).find("option:eq(0)").val());
|
||||
|
||||
});
|
||||
|
||||
$tempDomObj.find('.select2Multi').each(function() {
|
||||
$(this).select2().on("change",function(e){
|
||||
var parentRow = $(this).parents(".row");
|
||||
var height = parentRow.find(".select2-choices").height();
|
||||
parentRow.height(parseInt(height));
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
$tempDomObj.find('.signatureField').each(function() {
|
||||
//$(this).data('signaturePad',new SignaturePad($(this)));
|
||||
signatureIds.push($(this).attr('id'));
|
||||
});
|
||||
|
||||
for(var i=0;i<fields.length;i++){
|
||||
if(fields[i][1].type == "datagroup"){
|
||||
$tempDomObj.find("#"+fields[i][0]).data('field',fields[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if(this.showSave == false){
|
||||
$tempDomObj.find('.saveBtn').remove();
|
||||
}else{
|
||||
$tempDomObj.find('.saveBtn').off();
|
||||
$tempDomObj.find('.saveBtn').data("modJs",this);
|
||||
$tempDomObj.find('.saveBtn').on( "click", function() {
|
||||
if($(this ).data('modJs').saveSuccessItemCallback != null && $(this ).data('modJs').saveSuccessItemCallback!= undefined){
|
||||
$(this ).data('modJs').save($(this ).data('modJs').retriveItemsAfterSave(), $(this ).data('modJs').saveSuccessItemCallback);
|
||||
}else{
|
||||
$(this ).data('modJs').save();
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
if(this.showCancel== false){
|
||||
$tempDomObj.find('.cancelBtn').remove();
|
||||
}else{
|
||||
$tempDomObj.find('.cancelBtn').off();
|
||||
$tempDomObj.find('.cancelBtn').data("modJs",this);
|
||||
$tempDomObj.find('.cancelBtn').on( "click", function() {
|
||||
$(this ).data('modJs').cancel();
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
if(!this.showFormOnPopup){
|
||||
$("#"+this.getTableName()+'Form').show();
|
||||
$("#"+this.getTableName()).hide();
|
||||
|
||||
for(var i=0;i<signatureIds.length;i++){
|
||||
$("#"+signatureIds[i])
|
||||
.data('signaturePad',
|
||||
new SignaturePad(document.getElementById(signatureIds[i])));
|
||||
|
||||
}
|
||||
|
||||
if(object != undefined && object != null){
|
||||
this.fillForm(object);
|
||||
}
|
||||
|
||||
}else{
|
||||
|
||||
|
||||
|
||||
//var tHtml = $tempDomObj.wrap('<div>').parent().html();
|
||||
//this.showMessage("Edit",tHtml,null,null,true);
|
||||
this.showMessage("Edit","",null,null,true);
|
||||
|
||||
$("#plainMessageModel .modal-body").html("");
|
||||
$("#plainMessageModel .modal-body").append($tempDomObj);
|
||||
|
||||
|
||||
for(var i=0;i<signatureIds.length;i++){
|
||||
$("#"+signatureIds[i])
|
||||
.data('signaturePad',
|
||||
new SignaturePad(document.getElementById(signatureIds[i])));
|
||||
|
||||
}
|
||||
|
||||
if(object != undefined && object != null){
|
||||
this.fillForm(object,"#"+randomFormId);
|
||||
}
|
||||
}
|
||||
|
||||
this.postRenderForm(object,$tempDomObj);
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
@@ -94,9 +275,6 @@ ReportAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
});
|
||||
|
||||
ReportAdapter.method('addSuccessCallBack', function(callBackData,serverData) {
|
||||
//var link = '<a href="'+this.getCustomActionUrl("download",{'file':serverData})+'" target="_blank">Download Report <i class="icon-download-alt"></i> </a>';
|
||||
//this.showMessage("Download Report",link);
|
||||
|
||||
var fileName = serverData[0];
|
||||
var link;
|
||||
|
||||
@@ -107,6 +285,17 @@ ReportAdapter.method('addSuccessCallBack', function(callBackData,serverData) {
|
||||
}
|
||||
link = link.replace(/_BASE_/g,this.baseUrl);
|
||||
|
||||
if(this.currentReport.output == "PDF"){
|
||||
|
||||
this.showMessage("Download Report",link);
|
||||
|
||||
}else{
|
||||
if(serverData[1].length == 0){
|
||||
this.showMessage("Empty Report","There were no data for selected filters");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
var tableHtml = link+'<br/><br/><div class="box-body table-responsive" style="overflow-x:scroll;padding: 5px;border: solid 1px #DDD;"><table id="tempReportTable" cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped"></table></div>';
|
||||
|
||||
//Delete existing temp report table
|
||||
@@ -114,9 +303,9 @@ ReportAdapter.method('addSuccessCallBack', function(callBackData,serverData) {
|
||||
|
||||
//this.showMessage("Report",tableHtml);
|
||||
|
||||
$("#Report").html(tableHtml);
|
||||
$("#Report").show();
|
||||
$("#ReportForm").hide();
|
||||
$("#"+this.table).html(tableHtml);
|
||||
$("#"+this.table).show();
|
||||
$("#"+this.table+"Form").hide();
|
||||
|
||||
//Prepare headers
|
||||
var headers = [];
|
||||
@@ -148,6 +337,10 @@ ReportAdapter.method('addSuccessCallBack', function(callBackData,serverData) {
|
||||
return (this.nodeType == 3);
|
||||
}).remove();
|
||||
$('.tableActionButton').tooltip();
|
||||
}
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
@@ -201,4 +394,3 @@ ReportGenAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
html = html.replace(/_BASE_/g,this.baseUrl);
|
||||
return html;
|
||||
});
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"label":"Reports",
|
||||
"menu":"Reports",
|
||||
"menu":"Admin Reports",
|
||||
"order":"1",
|
||||
"icon":"fa-file-o",
|
||||
"user_levels":["Admin","Manager"],
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class ActiveEmployeeReport extends ReportBuilder{
|
||||
class ActiveEmployeeReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "Select id, employee_id as 'Employee ID',
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class EmployeeAttendanceReport extends ReportBuilder{
|
||||
class EmployeeAttendanceReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "SELECT
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
<?php
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
if(!interface_exists('ReportBuilderInterface')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilderInterface.php';
|
||||
}
|
||||
@@ -6,7 +9,7 @@ if(!interface_exists('ReportBuilderInterface')){
|
||||
if(!class_exists('LeavesActionManager')){
|
||||
include_once APP_BASE_PATH.'modules/leaves/api/LeavesActionManager.php';
|
||||
}
|
||||
class EmployeeLeaveEntitlementReport implements ReportBuilderInterface{
|
||||
class EmployeeLeaveEntitlementReport extends ClassBasedReportBuilder implements ReportBuilderInterface{
|
||||
public function getData($report,$req){
|
||||
|
||||
$leaveActionManager = new LeavesActionManager();
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class EmployeeLeavesReport extends ReportBuilder{
|
||||
class EmployeeLeavesReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "SELECT
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
<?php
|
||||
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
if(!interface_exists('ReportBuilderInterface')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilderInterface.php';
|
||||
}
|
||||
|
||||
class EmployeeTimeSheetData implements ReportBuilderInterface{
|
||||
class EmployeeTimeSheetData extends ClassBasedReportBuilder implements ReportBuilderInterface{
|
||||
public function getData($report,$request){
|
||||
|
||||
$employeeCache = array();
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
<?php
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
if(!interface_exists('ReportBuilderInterface')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilderInterface.php';
|
||||
}
|
||||
class EmployeeTimeTrackReport implements ReportBuilderInterface{
|
||||
class EmployeeTimeTrackReport extends ClassBasedReportBuilder implements ReportBuilderInterface{
|
||||
public function getData($report,$req){
|
||||
|
||||
LogManager::getInstance()->info(json_encode($report));
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class EmployeeTimesheetReport extends ReportBuilder{
|
||||
class EmployeeTimesheetReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "SELECT
|
||||
@@ -29,28 +29,50 @@ FROM EmployeeTimeEntry te";
|
||||
$employeeList = array();
|
||||
}
|
||||
|
||||
if(($request['client'] != "NULL" && !empty($request['client']))) {
|
||||
|
||||
if(!empty($employeeList) && ($request['project'] != "NULL" && !empty($request['project']))){
|
||||
$query = "where employee in (".implode(",", $employeeList).") and date_start >= ? and date_end <= ? and project = ?;";
|
||||
$project = new Project();
|
||||
$projects = $project->Find("client = ?",array($request['client']));
|
||||
$projectIds = array();
|
||||
foreach($projects as $project){
|
||||
$projectIds[] = $project->id;
|
||||
}
|
||||
|
||||
if (!empty($employeeList) && ($request['project'] != "NULL" && !empty($request['project']))) {
|
||||
$query = "where employee in (" . implode(",", $employeeList) . ") and date_start >= ? and date_end <= ? and project in (".implode(",",$projectIds).");";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end']
|
||||
);
|
||||
} else {
|
||||
$query = "where date_start >= ? and date_end <= ? and project in (".implode(",",$projectIds).");";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end']
|
||||
);
|
||||
}
|
||||
}else{
|
||||
if (!empty($employeeList) && ($request['project'] != "NULL" && !empty($request['project']))) {
|
||||
$query = "where employee in (" . implode(",", $employeeList) . ") and date_start >= ? and date_end <= ? and project = ?;";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end'],
|
||||
$request['project']
|
||||
);
|
||||
}else if(!empty($employeeList)){
|
||||
$query = "where employee in (".implode(",", $employeeList).") and date_start >= ? and date_end <= ?;";
|
||||
} 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['project'] != "NULL" && !empty($request['project']))){
|
||||
} else if (($request['project'] != "NULL" && !empty($request['project']))) {
|
||||
$query = "where project = ? and date_start >= ? and date_end <= ?;";
|
||||
$params = array(
|
||||
$request['project'],
|
||||
$request['date_start'],
|
||||
$request['date_end']
|
||||
);
|
||||
}else{
|
||||
} else {
|
||||
$query = "where date_start >= ? and date_end <= ?;";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
@@ -58,6 +80,8 @@ FROM EmployeeTimeEntry te";
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
LogManager::getInstance()->info("Query:".$query);
|
||||
LogManager::getInstance()->info("Params:".json_encode($params));
|
||||
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class ExpenseReport extends ReportBuilder{
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class ExpenseReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "SELECT
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
<?php
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
if(!interface_exists('ReportBuilderInterface')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilderInterface.php';
|
||||
}
|
||||
@@ -6,7 +9,7 @@ if(!interface_exists('ReportBuilderInterface')){
|
||||
if(!class_exists('AttendanceAdminManager')){
|
||||
include_once APP_BASE_PATH.'admin/attendance/api/AttendanceAdminManager.php';
|
||||
}
|
||||
class OvertimeReport implements ReportBuilderInterface{
|
||||
class OvertimeReport extends ClassBasedReportBuilder implements ReportBuilderInterface{
|
||||
public function getData($report,$request){
|
||||
|
||||
$employeeList = array();
|
||||
|
||||
@@ -2,14 +2,7 @@
|
||||
if(!interface_exists('ReportBuilderInterface')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilderInterface.php';
|
||||
}
|
||||
abstract class ReportBuilder implements ReportBuilderInterface{
|
||||
|
||||
public function getData($report,$request){
|
||||
$query = $this->getMainQuery();
|
||||
$where = $this->getWhereQuery($request);
|
||||
$query.=" ".$where[0];
|
||||
return $this->execute($report, $query, $where[1]);
|
||||
}
|
||||
abstract class ReportBuilder{
|
||||
|
||||
protected function execute($report, $query, $parameters){
|
||||
$report->DB()->SetFetchMode(ADODB_FETCH_ASSOC);
|
||||
@@ -47,11 +40,169 @@ abstract class ReportBuilder implements ReportBuilderInterface{
|
||||
return $reportData;
|
||||
}
|
||||
|
||||
abstract public function getWhereQuery($request);
|
||||
|
||||
abstract public function getMainQuery();
|
||||
|
||||
public function transformData($name, $value){
|
||||
return $value;
|
||||
}
|
||||
|
||||
public function createReportFile($report, $data){
|
||||
$fileFirstPart = "Report_".str_replace(" ", "_", $report->name)."-".date("Y-m-d_H-i-s");
|
||||
$fileName = $fileFirstPart.".csv";
|
||||
|
||||
$fileFullName = CLIENT_BASE_PATH.'data/'.$fileName;
|
||||
$fp = fopen($fileFullName, 'w');
|
||||
|
||||
foreach ($data as $fields) {
|
||||
fputcsv($fp, $fields);
|
||||
}
|
||||
|
||||
fclose($fp);
|
||||
return array($fileFirstPart, $fileName, $fileFullName);
|
||||
}
|
||||
|
||||
public function saveFile($fileFirstPart, $file, $fileFullName){
|
||||
$uploadedToS3 = false;
|
||||
|
||||
$uploadFilesToS3 = SettingsManager::getInstance()->getSetting("Files: Upload Files to S3");
|
||||
$uploadFilesToS3Key = SettingsManager::getInstance()->getSetting("Files: Amazon S3 Key for File Upload");
|
||||
$uploadFilesToS3Secret = SettingsManager::getInstance()->getSetting("Files: Amazone S3 Secret for File Upload");
|
||||
$s3Bucket = SettingsManager::getInstance()->getSetting("Files: S3 Bucket");
|
||||
$s3WebUrl = SettingsManager::getInstance()->getSetting("Files: S3 Web Url");
|
||||
|
||||
if($uploadFilesToS3.'' == '1' && !empty($uploadFilesToS3Key)
|
||||
&& !empty($uploadFilesToS3Secret) && !empty($s3Bucket) && !empty($s3WebUrl)){
|
||||
|
||||
$uploadname = CLIENT_NAME."/".$file;
|
||||
$s3FileSys = new S3FileSystem($uploadFilesToS3Key, $uploadFilesToS3Secret);
|
||||
$res = $s3FileSys->putObject($s3Bucket, $uploadname, $fileFullName, 'authenticated-read');
|
||||
|
||||
if(empty($res)){
|
||||
return array("ERROR",$file);
|
||||
}
|
||||
|
||||
unlink($fileFullName);
|
||||
$file_url = $s3WebUrl.$uploadname;
|
||||
$file_url = $s3FileSys->generateExpiringURL($file_url);
|
||||
$uploadedToS3 = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
$fileObj = new File();
|
||||
$fileObj->name = $fileFirstPart;
|
||||
$fileObj->filename = $file;
|
||||
$fileObj->file_group = "Report";
|
||||
$ok = $fileObj->Save();
|
||||
|
||||
if(!$ok){
|
||||
LogManager::getInstance()->info($fileObj->ErrorMsg());
|
||||
return array("ERROR","Error generating report");
|
||||
}
|
||||
|
||||
$reportFile = new ReportFile();
|
||||
$reportFile->name = $fileObj->filename;
|
||||
$reportFile->attachment = $fileObj->name;
|
||||
$reportFile->created = date("Y-m-d H:i:s");
|
||||
$reportFile->employee = BaseService::getInstance()->getCurrentProfileId();
|
||||
$ok = $reportFile->Save();
|
||||
|
||||
if(!$ok){
|
||||
LogManager::getInstance()->info($reportFile->ErrorMsg());
|
||||
return array("ERROR","Error generating report");
|
||||
}
|
||||
|
||||
|
||||
if($uploadedToS3){
|
||||
return array("SUCCESS",$file_url);
|
||||
}else{
|
||||
return array("SUCCESS",$file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class CSVReportBuilder extends ReportBuilder{
|
||||
public function getData($report,$request){
|
||||
$query = $this->getMainQuery();
|
||||
$where = $this->getWhereQuery($request);
|
||||
if($query == null || $where == null){
|
||||
return null;
|
||||
}
|
||||
$query.=" ".$where[0];
|
||||
return $this->execute($report, $query, $where[1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class ClassBasedReportBuilder extends ReportBuilder{
|
||||
|
||||
}
|
||||
|
||||
class PDFReportBuilder extends ReportBuilder{
|
||||
|
||||
var $twig;
|
||||
|
||||
protected function getDefaultData(){
|
||||
$defaultData = array();
|
||||
$defaultData['BASE_URL'] = BASE_URL;
|
||||
$defaultData['LOGO'] = UIManager::getInstance()->getCompanyLogoUrl();
|
||||
$defaultData['LOGO'] = str_replace("https:","http:",$defaultData['LOGO']);
|
||||
$defaultData['companyName'] = SettingsManager::getInstance()->getSetting("Company: Name");
|
||||
LogManager::getInstance()->debug("Logo Url:".$defaultData['LOGO']);
|
||||
return $defaultData;
|
||||
}
|
||||
|
||||
protected function initTemplateEngine($report){
|
||||
if($report->_table = "UserReports"){
|
||||
$path = APP_BASE_PATH."modules/reports/customTemplates/";
|
||||
}else{
|
||||
$path = APP_BASE_PATH."admin/reports/customTemplates/";
|
||||
}
|
||||
$loader = new Twig_Loader_Filesystem($path);
|
||||
$twigOptions = array();
|
||||
//false
|
||||
if(defined('CACHE_THEME') && CACHE_THEME){
|
||||
$twigOptions = array(
|
||||
);
|
||||
}else{
|
||||
$twigOptions = array(
|
||||
"cache"=>false
|
||||
);
|
||||
}
|
||||
$this->twig = new Twig_Environment($loader, $twigOptions);
|
||||
}
|
||||
|
||||
public function createReportFile($report, $data){
|
||||
$fileFirstPart = "Report_".str_replace(" ", "_", $report->name)."-".date("Y-m-d_H-i-s");
|
||||
$fileName = $fileFirstPart.".html";
|
||||
|
||||
$fileFullName = CLIENT_BASE_PATH.'data/'.$fileName;
|
||||
|
||||
$this->initTemplateEngine($report);
|
||||
|
||||
$template = $this->twig->loadTemplate($this->getTemplate());
|
||||
$result = $template->render($data);
|
||||
|
||||
|
||||
$fp = fopen($fileFullName, 'w');
|
||||
fwrite($fp,$result);
|
||||
fclose($fp);
|
||||
|
||||
try{
|
||||
$fileFullNamePdf = CLIENT_BASE_PATH.'data/'.$fileFirstPart.".pdf";
|
||||
//Try generating the pdf
|
||||
exec(WK_HTML_PATH." ".$fileFullName." ".$fileFullNamePdf, $output, $ret);
|
||||
|
||||
LogManager::getInstance()->debug("wkhtmltopdf:".print_r($output,true));
|
||||
LogManager::getInstance()->debug("wkhtmltopdf:".print_r($ret,true));
|
||||
|
||||
if(file_exists($fileFullNamePdf)){
|
||||
$fileName = $fileFirstPart.".pdf";
|
||||
$fileFullName = $fileFullNamePdf;
|
||||
}
|
||||
}catch(Exception $exp){
|
||||
|
||||
}
|
||||
return array($fileFirstPart, $fileName, $fileFullName);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,18 @@
|
||||
<?php
|
||||
interface ReportBuilderInterface{
|
||||
public function getData($report,$request);
|
||||
public function createReportFile($report, $data);
|
||||
}
|
||||
|
||||
interface CSVReportBuilderInterface{
|
||||
public function getData($report,$request);
|
||||
public function createReportFile($report, $data);
|
||||
public function getMainQuery();
|
||||
public function getWhereQuery($request);
|
||||
}
|
||||
|
||||
interface PDFReportBuilderInterface{
|
||||
public function getData($report,$request);
|
||||
public function createReportFile($report, $data);
|
||||
public function getTemplate();
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class TravelRequestReport extends ReportBuilder{
|
||||
class TravelRequestReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "SELECT
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
_fields_
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<button onclick="try{modJs.save()}catch(e){};return false;" class="btn">Download</button>
|
||||
<button onclick="modJs.cancel();return false;" class="btn">Cancel</button>
|
||||
<button onclick="try{modJs.save()}catch(e){};return false;" class="btn"><t>Download</t></button>
|
||||
<button onclick="modJs.cancel();return false;" class="btn"><t>Cancel</t></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@@ -17,7 +17,7 @@ if (!class_exists('SalaryAdminManager')) {
|
||||
public function setupModuleClassDefinitions(){
|
||||
$this->addModelClass('SalaryComponentType');
|
||||
$this->addModelClass('SalaryComponent');
|
||||
$this->addModelClass('Deduction');
|
||||
$this->addModelClass('PayrollEmployee');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -51,33 +51,6 @@ if (!class_exists('SalaryComponent')) {
|
||||
}
|
||||
}
|
||||
|
||||
if (!class_exists('Deduction')) {
|
||||
class Deduction extends ICEHRM_Record {
|
||||
var $_table = 'Deductions';
|
||||
|
||||
public function getAdminAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getUserAccess(){
|
||||
return array("get","element");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!class_exists('DeductionGroup')) {
|
||||
class DeductionGroup extends ICEHRM_Record {
|
||||
var $_table = 'DeductionGroup';
|
||||
|
||||
public function getAdminAccess(){
|
||||
return array("get","element","save","delete");
|
||||
}
|
||||
|
||||
public function getUserAccess(){
|
||||
return array("get","element");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!class_exists('PayrollEmployee')) {
|
||||
class PayrollEmployee extends ICEHRM_Record {
|
||||
@@ -93,3 +66,20 @@ if (!class_exists('PayrollEmployee')) {
|
||||
}
|
||||
}
|
||||
|
||||
if (!class_exists('PayFrequency')) {
|
||||
class PayFrequency extends ICEHRM_Record {
|
||||
var $_table = 'PayFrequency';
|
||||
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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,15 +3,12 @@
|
||||
$moduleName = 'salary';
|
||||
define('MODULE_PATH',dirname(__FILE__));
|
||||
include APP_BASE_PATH.'header.php';
|
||||
include APP_BASE_PATH.'mod-houlejslibs.inc.php';
|
||||
include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
|
||||
$moduleBuilder = new ModuleBuilder();
|
||||
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('SalaryComponentType','SalaryComponentType','Salary Component Types','SalaryComponentTypeAdapter','','',true));
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('SalaryComponent','SalaryComponent','Salary Components','SalaryComponentAdapter','',''));
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('DeductionGroup','DeductionGroup','Calculation Groups','DeductionGroupAdapter','',''));
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('Deduction','Deduction','Calculation Methods','DeductionAdapter','',''));
|
||||
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('EmployeeSalary','EmployeeSalary','Employee Salary Components','EmployeeSalaryAdapter','','',false,array("setRemoteTable"=>"true")));
|
||||
|
||||
|
||||
|
||||
@@ -79,162 +79,6 @@ SalaryComponentAdapter.method('getFormFields', function() {
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* DeductionAdapter
|
||||
*/
|
||||
|
||||
function DeductionAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
DeductionAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
DeductionAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"deduction_group"
|
||||
];
|
||||
});
|
||||
|
||||
DeductionAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Calculation Group"}
|
||||
];
|
||||
});
|
||||
|
||||
DeductionAdapter.method('getFormFields', function() {
|
||||
|
||||
var rangeAmounts = [ "rangeAmounts", {"label":"Calculation Process","type":"datagroup",
|
||||
"form":[
|
||||
[ "lowerCondition", {"label":"Lower Limit Condition","type":"select","source":[["No Lower Limit","No Lower Limit"],["gt","Greater than"],["gte","Greater than or Equal"]]}],
|
||||
[ "lowerLimit", {"label":"Lower Limit","type":"text","validation":"float"}],
|
||||
[ "upperCondition", {"label":"Upper Limit Condition","type":"select","source":[["No Upper Limit","No Upper Limit"],["lt","Less than"],["lte","Less than or Equal"]]}],
|
||||
[ "upperLimit", {"label":"Upper Limit","type":"text","validation":"float"}],
|
||||
[ "amount", {"label":"Value","type":"text","validation":""}]
|
||||
],
|
||||
"html":'<div id="#_id_#" class="panel panel-default">#_delete_##_edit_#<div class="panel-body">#_renderFunction_#</div></div>',
|
||||
"validation":"none",
|
||||
"custom-validate-function":function (data){
|
||||
var res = {};
|
||||
res['valid'] = true;
|
||||
if(lowerCondition != 'No Lower Limit'){
|
||||
data.lowerLimit = 0;
|
||||
}
|
||||
if(upperCondition != 'No Upper Limit'){
|
||||
data.upperLimit = 0;
|
||||
}
|
||||
res['params'] = data;
|
||||
return res;
|
||||
},
|
||||
"render":function(item){
|
||||
var output = "";
|
||||
var getSymbol = function(text){
|
||||
var map = {};
|
||||
map['gt'] = '>';
|
||||
map['gte'] = '>=';
|
||||
map['lt'] = '<';
|
||||
map['lte'] = '<=';
|
||||
|
||||
return map[text];
|
||||
}
|
||||
if(item.lowerCondition != "No Lower Limit"){
|
||||
output += item.lowerLimit + " " + getSymbol(item.lowerCondition) + " ";
|
||||
}
|
||||
|
||||
if(item.upperCondition != "No Upper Limit"){
|
||||
output += " and ";
|
||||
output += getSymbol(item.upperCondition) + " " + item.upperLimit + " ";
|
||||
}
|
||||
if(output == ""){
|
||||
return "Deduction is "+item.amount + " for all ranges";
|
||||
}else{
|
||||
return "If salary component "+output+ " deduction is "+item.amount;
|
||||
}
|
||||
|
||||
|
||||
return output;
|
||||
|
||||
}
|
||||
|
||||
}];
|
||||
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}],
|
||||
[ "componentType", {"label":"Salary Component Type","type":"select2multi","allow-null":true,"remote-source":["SalaryComponentType","id","name"]}],
|
||||
[ "component", {"label":"Salary Component","type":"select2multi","allow-null":true,"remote-source":["SalaryComponent","id","name"]}],
|
||||
[ "payrollColumn", {"label":"Payroll Report Column","type":"select2","allow-null":true,"remote-source":["PayrollColumn","id","name"]}],
|
||||
rangeAmounts,
|
||||
[ "deduction_group", {"label":"Calculation Group","type":"select2","allow-null":true,"null-label":"None","remote-source":["DeductionGroup","id","name"]}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
/*
|
||||
DeductionAdapter.method('doCustomValidation', function(params) {
|
||||
if(params.type == "Fixed"){
|
||||
return null;
|
||||
}
|
||||
if(params.percentage_type == "On Component Type"){
|
||||
params.component = "NULL";
|
||||
if(params.componentType == "NULL"){
|
||||
return "Salary component type should be selected";
|
||||
}
|
||||
}else if(params.percentage_type == "On Component"){
|
||||
params.componentType = "NULL";
|
||||
if(params.component == "NULL"){
|
||||
return "Salary component should be selected";
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
});
|
||||
*/
|
||||
/*
|
||||
DeductionAdapter.method('postRenderForm', function(object, $tempDomObj) {
|
||||
|
||||
$tempDomObj.find("#field_componentType").hide();
|
||||
$tempDomObj.find("#field_percentage_type").hide();
|
||||
$tempDomObj.find("#field_component").hide();
|
||||
|
||||
|
||||
$tempDomObj.find("#percentage_type").off().on('change',function(e){
|
||||
if(e.val == "On Component"){
|
||||
$("#componentType").hide();
|
||||
$("#component").show();
|
||||
}else{
|
||||
$("#componentType").show();
|
||||
$("#component").hide();
|
||||
}
|
||||
});
|
||||
|
||||
$tempDomObj.find("#type").off().on('change',function(e){
|
||||
if(e.val == "Fixed"){
|
||||
$("#componentType").hide();
|
||||
$("#percentage_type").hide();
|
||||
$("#component").hide();
|
||||
}else{
|
||||
$("#percentage_type").show();
|
||||
if($("#percentage_type").select2('data').id == 'On Component'){
|
||||
$("#field_componentType").hide();
|
||||
$("#field_component").show();
|
||||
}else{
|
||||
$("#field_componentType").show();
|
||||
$("#field_component").hide();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
});
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
@@ -288,43 +132,3 @@ EmployeeSalaryAdapter.method('getFilters', function() {
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* DeductionGroupAdapter
|
||||
*/
|
||||
|
||||
function DeductionGroupAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
DeductionGroupAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
DeductionGroupAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"description"
|
||||
];
|
||||
});
|
||||
|
||||
DeductionGroupAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Details" }
|
||||
];
|
||||
});
|
||||
|
||||
DeductionGroupAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}],
|
||||
[ "description", {"label":"Details","type":"textarea","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -26,6 +26,9 @@ class SettingsInitialize extends AbstractInitialize{
|
||||
public function init(){
|
||||
if(SettingsManager::getInstance()->getSetting("Api: REST Api Enabled") == "1"){
|
||||
$user = BaseService::getInstance()->getCurrentUser();
|
||||
if(empty($user)){
|
||||
return;
|
||||
}
|
||||
$dbUser = new User();
|
||||
$dbUser->Load("id = ?",array($user->id));
|
||||
$resp = RestApiManager::getInstance()->getAccessTokenForUser($dbUser);
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
|
||||
<div class="small-box bg-green">
|
||||
<div class="inner">
|
||||
<h3>Settings</h3>
|
||||
<h3><t>Settings</t></h3>
|
||||
<p>
|
||||
Configure IceHrm
|
||||
<t>Configure</t> IceHrm
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-settings"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="settingsLink">
|
||||
Update Settings <i class="fa fa-arrow-circle-right"></i>
|
||||
<t>Update</t> <t>Settings</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -34,9 +34,9 @@ $options1['setShowAddNew'] = 'false';
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('CompanySetting','Setting','Company','SettingAdapter','{"name":["Company:"]}','name',true,$options1));
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('SystemSetting','Setting','System','SettingAdapter','{"name":["System:"]}','name',false,$options1));
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('EmailSetting','Setting','Email','SettingAdapter','{"name":["Email:"]}','name',false,$options1));
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('LeaveSetting','Setting','Leave / PTO','SettingAdapter','{"name":["Leave:"]}','name',false,$options1));
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('LDAPSetting','Setting','LDAP','SettingAdapter','{"name":["LDAP:"]}','name',false,$options1));
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('OtherSetting','Setting','Other','SettingAdapter','{"name":["Projects:","Attendance:","Recruitment:","Notifications:","Expense:","Travel:","Api:"]}','name',false,$options1));
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('AttendanceSetting','Setting','Attendance','SettingAdapter','{"name":["Attendance:"]}','name',false,$options1));
|
||||
$moduleBuilder->addModuleOrGroup(new ModuleTab('OtherSetting','Setting','Other','SettingAdapter','{"name":["Projects:","Recruitment:","Notifications:","Expense:","Travel:","Api:","Overtime:"]}','name',false,$options1));
|
||||
echo UIManager::getInstance()->renderModule($moduleBuilder);
|
||||
?>
|
||||
</div>
|
||||
|
||||
@@ -86,6 +86,7 @@ SettingAdapter.method('loadRemoteDataForSettings', function () {
|
||||
fields.push(["country", {"label": "Country", "type": "select2multi", "remote-source": ["Country", "id", "name"]}]);
|
||||
fields.push(["currency", {"label": "Currency", "type": "select2multi", "remote-source": ["CurrencyType","id","code+name"]}]);
|
||||
fields.push(["nationality", {"label": "Nationality", "type": "select2multi", "remote-source": ["Nationality","id","name"]}]);
|
||||
fields.push(["supportedLanguage", {"label":"Value","type":"select2","allow-null":false,"remote-source":["SupportedLanguage","name","description"]}]);
|
||||
|
||||
for(index in fields){
|
||||
field = fields[index];
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<button onclick="try{modJs.save()}catch(e){};return false;" class="btn">Save</button>
|
||||
<button onclick="modJs.cancel();return false;" class="btn">Cancel</button>
|
||||
<button onclick="try{modJs.save()}catch(e){};return false;" class="btn"><t>Save</t></button>
|
||||
<button onclick="modJs.cancel();return false;" class="btn"><t>Cancel</t></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
27
ext/admin/travel/api/TravelActionManager.php
Normal file
27
ext/admin/travel/api/TravelActionManager.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?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#tabEmployeeTravelRecord";
|
||||
}
|
||||
|
||||
public function getModuleSubordinateTabUrl(){
|
||||
return "g=modules&n=travel&m=module_Travel_Management#tabSubordinateEmployeeTravelRecord";
|
||||
}
|
||||
|
||||
public function getModuleApprovalTabUrl(){
|
||||
return "g=modules&n=travel&m=module_Travel_Management#tabEmployeeTravelRecordApproval";
|
||||
}
|
||||
}
|
||||
155
ext/admin/travel/api/TravelAdminManager.php
Normal file
155
ext/admin/travel/api/TravelAdminManager.php
Normal file
@@ -0,0 +1,155 @@
|
||||
<?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=modules&n=travel&m=module_Travel_Management#tabSubordinateEmployeeTravelRecord";
|
||||
var $preApproveSettingName = "Travel: Pre-Approve Travel Request";
|
||||
|
||||
public function isMultiLevelApprovalsEnabled(){
|
||||
return (SettingsManager::getInstance()->getSetting('Travel: Enable Multi Level Approvals') == '1');
|
||||
}
|
||||
|
||||
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"
|
||||
);
|
||||
}
|
||||
|
||||
public function getType(){
|
||||
return 'EmployeeTravelRecord';
|
||||
}
|
||||
|
||||
public function allowIndirectMapping(){
|
||||
if(SettingsManager::getInstance()->getSetting('Travel: Allow Indirect Admins to Approve') == '1'){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!class_exists('EmployeeTravelRecordApproval')) {
|
||||
|
||||
class EmployeeTravelRecordApproval extends EmployeeTravelRecord
|
||||
{
|
||||
|
||||
public function Find($whereOrderBy,$bindarr=false,$pkeysArr=false,$extra=array()){
|
||||
return $this->findApprovals(new EmployeeTravelRecord(), $whereOrderBy,$bindarr,$pkeysArr,$extra);
|
||||
}
|
||||
}
|
||||
}
|
||||
19
ext/admin/travel/dashboard.html
Normal file
19
ext/admin/travel/dashboard.html
Normal file
@@ -0,0 +1,19 @@
|
||||
<div class="col-lg-3 col-xs-12">
|
||||
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<t>Travel</t>
|
||||
</h3>
|
||||
<p id="numberOfTravel">
|
||||
<t>Requests</t>
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-plane"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="travelLink">
|
||||
<t>Manage</t> <t>Travel</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
41
ext/admin/travel/index.php
Normal file
41
ext/admin/travel/index.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?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','EmployeeTravelRecordAdminAdapter','','',true,$options));
|
||||
echo UIManager::getInstance()->renderModule($moduleBuilder);
|
||||
|
||||
|
||||
$itemName = 'TravelRequest';
|
||||
$moduleName = 'Travel Management';
|
||||
$itemNameLower = strtolower($itemName);
|
||||
|
||||
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"]}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* EmployeeTravelRecordAdminAdapter
|
||||
*/
|
||||
|
||||
|
||||
function EmployeeTravelRecordAdminAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
this.itemName = 'TravelRequest';
|
||||
this.itemNameLower = 'travelrequest';
|
||||
this.modulePathName = 'travel';
|
||||
}
|
||||
|
||||
EmployeeTravelRecordAdminAdapter.inherits(ApproveAdminAdapter);
|
||||
|
||||
|
||||
|
||||
EmployeeTravelRecordAdminAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"type",
|
||||
"purpose",
|
||||
"travel_from",
|
||||
"travel_to",
|
||||
"travel_date",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdminAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Travel Type" },
|
||||
{ "sTitle": "Purpose" },
|
||||
{ "sTitle": "From"},
|
||||
{ "sTitle": "To"},
|
||||
{ "sTitle": "Travel Date"},
|
||||
{ "sTitle": "Status"}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdminAdapter.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"}]
|
||||
];
|
||||
});
|
||||
|
||||
12
ext/admin/travel/meta.json
Normal file
12
ext/admin/travel/meta.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"label":"Travel Administration",
|
||||
"menu":"Employees",
|
||||
"order":"6",
|
||||
"icon":"fa-plane",
|
||||
"user_levels":["Admin","Manager"],
|
||||
"dashboardPosition":12,
|
||||
|
||||
"permissions":
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -2,16 +2,16 @@
|
||||
|
||||
<div class="small-box bg-yellow">
|
||||
<div class="inner">
|
||||
<h3>Users</h3>
|
||||
<h3><t>Users</t></h3>
|
||||
<p id="numberOfUsers">
|
||||
#_numberOfUsers_# Users
|
||||
#_numberOfUsers_# <t>Users</t>
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-person-add"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="usersLink">
|
||||
Manage Users <i class="fa fa-arrow-circle-right"></i>
|
||||
<t>Manage</t> <t>Users</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -29,8 +29,8 @@ 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="tabUser" href="#tabPageUser">Users</a></li>
|
||||
<li class=""><a id="tabUserRole" href="#tabPageUserRole">User Roles</a></li>
|
||||
<li class="active"><a id="tabUser" href="#tabPageUser"><?=LanguageManager::tran('Users')?></a></li>
|
||||
<li class=""><a id="tabUserRole" href="#tabPageUserRole"><?=LanguageManager::tran('User Roles')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -37,6 +37,7 @@ UserAdapter.method('getFormFields', function() {
|
||||
[ "employee", {"label":"Employee","type":"select2","allow-null":true,"remote-source":["Employee","id","first_name+last_name"]}],
|
||||
[ "user_level", {"label":"User Level","type":"select","source":[["Admin","Admin"],["Manager","Manager"],["Employee","Employee"],["Other","Other"]]}],
|
||||
[ "user_roles", {"label":"User Roles","type":"select2multi","remote-source":["UserRole","id","name"]}],
|
||||
[ "lang", {"label":"Language","type":"select2","allow-null":true,"remote-source":["SupportedLanguage","name","description"]}],
|
||||
[ "default_module", {"label":"Default Module","type":"select2","null-label":"No Default Module","allow-null":true,"remote-source":["Module","id","menu+label"]}]
|
||||
];
|
||||
});
|
||||
@@ -186,6 +187,11 @@ UserRoleAdapter.method('getHeaders', function() {
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
UserRoleAdapter.method('postRenderForm', function(object, $tempDomObj) {
|
||||
$tempDomObj.find("#changePasswordBtn").remove();
|
||||
});
|
||||
|
||||
UserRoleAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
|
||||
@@ -135,4 +135,44 @@ class AttendanceActionManager extends SubActionManager{
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function createPreviousAttendnaceSheet($req){
|
||||
$employee = $this->baseService->getElement('Employee',$this->getCurrentProfileId(),null,true);
|
||||
|
||||
|
||||
|
||||
$timeSheet = new EmployeeAttendanceSheet();
|
||||
$timeSheet->Load("id = ?",array($req->id));
|
||||
if($timeSheet->id != $req->id){
|
||||
return new IceResponse(IceResponse::ERROR,"Attendance Sheet not found");
|
||||
}
|
||||
|
||||
if($timeSheet->employee != $employee->id){
|
||||
return new IceResponse(IceResponse::ERROR,"You don't have permissions to add this Attendance Sheet");
|
||||
}
|
||||
|
||||
$end = date("Y-m-d", strtotime("last Saturday", strtotime($timeSheet->date_start)));
|
||||
$start = date("Y-m-d", strtotime("last Sunday", strtotime($end)));
|
||||
|
||||
$tempTimeSheet = new EmployeeTimeSheet();
|
||||
$tempTimeSheet->Load("employee = ? and date_start = ?",array($employee->id, $start));
|
||||
if($employee->id == $tempTimeSheet->employee){
|
||||
return new IceResponse(IceResponse::ERROR,"Attendance Sheet already exists");
|
||||
}
|
||||
|
||||
$newTimeSheet = new EmployeeTimeSheet();
|
||||
$newTimeSheet->employee = $employee->id;
|
||||
$newTimeSheet->date_start = $start;
|
||||
$newTimeSheet->date_end = $end;
|
||||
$newTimeSheet->status = "Pending";
|
||||
$ok = $newTimeSheet->Save();
|
||||
if(!$ok){
|
||||
LogManager::getInstance()->info("Error creating time sheet : ".$newTimeSheet->ErrorMsg());
|
||||
return new IceResponse(IceResponse::ERROR,"Error creating Attendance Sheet");
|
||||
}
|
||||
|
||||
|
||||
return new IceResponse(IceResponse::SUCCESS,"");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,15 +3,15 @@
|
||||
<div class="small-box bg-aqua">
|
||||
<div class="inner">
|
||||
<h3 id="lastPunchTime">
|
||||
Punch In
|
||||
<t>Punch In</t>
|
||||
</h3>
|
||||
<p>or punch out</p>
|
||||
<p><t>or</t> <t>Punch Out</t></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-ios7-alarm-outline"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="atteandanceLink">
|
||||
Record Attendance <i class="fa fa-arrow-circle-right"></i>
|
||||
<t>Record Attendance</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -33,7 +33,7 @@ if(empty($currentEmployeeTimeZone)){
|
||||
?><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="tabAttendance" href="#tabPageAttendance">Attendance</a></li>
|
||||
<li class="active"><a id="tabAttendance" href="#tabPageAttendance"><?=LanguageManager::tran('Attendance')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -247,3 +247,212 @@ AttendanceAdapter.method('getClientGMTOffset', function () {
|
||||
return std_time_offset;
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function EmployeeAttendanceSheetAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
EmployeeAttendanceSheetAdapter.inherits(AdapterBase);
|
||||
|
||||
this.currentTimesheetId = null;
|
||||
this.currentTimesheet = null;
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"date_start",
|
||||
"date_end",
|
||||
"total_time",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Start Date"},
|
||||
{ "sTitle": "End Date"},
|
||||
{ "sTitle": "Total Time"},
|
||||
{ "sTitle": "Status"}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "date_start", {"label":"TimeSheet Start Date","type":"date","validation":""}],
|
||||
[ "date_end", {"label":"TimeSheet End Date","type":"date","validation":""}],
|
||||
[ "details", {"label":"Reason","type":"textarea","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('preProcessTableData', function(row) {
|
||||
row[1] = Date.parse(row[1]).toString('MMM d, yyyy (dddd)');
|
||||
row[2] = Date.parse(row[2]).toString('MMM d, yyyy (dddd)');
|
||||
return row;
|
||||
});
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('renderForm', function(object) {
|
||||
var formHtml = this.templates['formTemplate'];
|
||||
var html = "";
|
||||
|
||||
$("#"+this.getTableName()+'Form').html(formHtml);
|
||||
$("#"+this.getTableName()+'Form').show();
|
||||
$("#"+this.getTableName()).hide();
|
||||
|
||||
$('#attendnacesheet_start').html(Date.parse(object.date_start).toString('MMM d, yyyy (dddd)'));
|
||||
$('#attendnacesheet_end').html(Date.parse(object.date_end).toString('MMM d, yyyy (dddd)'));
|
||||
|
||||
this.currentTimesheet = object;
|
||||
|
||||
this.getTimeEntries();
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('getTimeEntries', function() {
|
||||
timesheetId = this.currentId;
|
||||
var sourceMappingJson = JSON.stringify(modJsList['tabEmployeeTimeEntry'].getSourceMapping());
|
||||
object = {"id":timesheetId,"sm":sourceMappingJson};
|
||||
|
||||
var reqJson = JSON.stringify(object);
|
||||
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'getTimeEntriesSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'getTimeEntriesFailCallBack';
|
||||
|
||||
this.customAction('getTimeEntries','modules=time_sheets',reqJson,callBackData);
|
||||
});
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('getTimeEntriesSuccessCallBack', function(callBackData) {
|
||||
var entries = callBackData;
|
||||
var html = "";
|
||||
var temp = '<tr><td><img class="tableActionButton" src="_BASE_images/delete.png" style="cursor:pointer;" rel="tooltip" title="Delete" onclick="modJsList[\'tabEmployeeTimeEntry\'].deleteRow(_id_);return false;"></img></td><td>_start_</td><td>_end_</td><td>_duration_</td><td>_project_</td><td>_details_</td>';
|
||||
|
||||
for(var i=0;i<entries.length;i++){
|
||||
try{
|
||||
var t = temp;
|
||||
t = t.replace(/_start_/g,Date.parse(entries[i].date_start).toString('MMM d, yyyy [hh:mm tt]'));
|
||||
t = t.replace(/_end_/g,Date.parse(entries[i].date_end).toString('MMM d, yyyy [hh:mm tt]'));
|
||||
|
||||
var mili = Date.parse(entries[i].date_end) - Date.parse(entries[i].date_start);
|
||||
var minutes = Math.round(mili/60000);
|
||||
var hourMinutes = (minutes % 60);
|
||||
var hours = (minutes-hourMinutes)/60;
|
||||
|
||||
t = t.replace(/_duration_/g,"Hours ("+hours+") - Min ("+hourMinutes+")");
|
||||
if(entries[i].project == 'null' || entries[i].project == null || entries[i].project == undefined){
|
||||
t = t.replace(/_project_/g,"None");
|
||||
}else{
|
||||
t = t.replace(/_project_/g,entries[i].project);
|
||||
}
|
||||
t = t.replace(/_project_/g,entries[i].project);
|
||||
t = t.replace(/_details_/g,entries[i].details);
|
||||
t = t.replace(/_id_/g,entries[i].id);
|
||||
t = t.replace(/_BASE_/g,this.baseUrl);
|
||||
html += t;
|
||||
}catch(e){}
|
||||
}
|
||||
|
||||
$('.timesheet_entries_table_body').html(html);
|
||||
if(modJs.getTableName() == 'SubEmployeeTimeSheetAll'){
|
||||
$('#submit_sheet').hide();
|
||||
$('#add_time_sheet_entry').hide();
|
||||
}else{
|
||||
if(this.currentElement.status == 'Approved'){
|
||||
$('#submit_sheet').hide();
|
||||
$('#add_time_sheet_entry').hide();
|
||||
}else{
|
||||
$('#submit_sheet').show();
|
||||
$('#add_time_sheet_entry').show();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('getTimeEntriesFailCallBack', function(callBackData) {
|
||||
this.showMessage("Error", "Error occured while getting timesheet entries");
|
||||
});
|
||||
|
||||
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('createPreviousAttendnacesheet', function(id) {
|
||||
object = {"id":id};
|
||||
|
||||
var reqJson = JSON.stringify(object);
|
||||
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'createPreviousAttendnacesheetSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'createPreviousAttendnacesheetFailCallBack';
|
||||
|
||||
this.customAction('createPreviousAttendnaceSheet','modules=attendnace',reqJson,callBackData);
|
||||
});
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('createPreviousAttendnacesheetSuccessCallBack', function(callBackData) {
|
||||
$('.tooltip').css("display","none");
|
||||
$('.tooltip').remove();
|
||||
//this.showMessage("Success", "Previous Timesheet created");
|
||||
this.get([]);
|
||||
});
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('createPreviousAttendnacesheetFailCallBack', function(callBackData) {
|
||||
this.showMessage("Error", callBackData);
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var html = '';
|
||||
if(this.getTableName() == "EmployeeTimeSheetAll"){
|
||||
html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/view.png" style="cursor:pointer;" rel="tooltip" title="Edit Timesheet Entries" onclick="modJs.edit(_id_);return false;"></img><img class="tableActionButton" src="_BASE_images/redo.png" style="cursor:pointer;margin-left:15px;" rel="tooltip" title="Create previous time sheet" onclick="modJs.createPreviousAttendnacesheet(_id_);return false;"></img></div>';
|
||||
}else{
|
||||
html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/view.png" style="cursor:pointer;" rel="tooltip" title="Edit Timesheet Entries" onclick="modJs.edit(_id_);return false;"></img></div>';
|
||||
}
|
||||
html = html.replace(/_id_/g,id);
|
||||
html = html.replace(/_BASE_/g,this.baseUrl);
|
||||
return html;
|
||||
});
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('getCustomTableParams', function() {
|
||||
var that = this;
|
||||
var dataTableParams = {
|
||||
"aoColumnDefs": [
|
||||
{
|
||||
"fnRender": function(data, cell){
|
||||
return that.preProcessRemoteTableData(data, cell, 1)
|
||||
} ,
|
||||
"aTargets": [1]
|
||||
},
|
||||
{
|
||||
"fnRender": function(data, cell){
|
||||
return that.preProcessRemoteTableData(data, cell, 2)
|
||||
} ,
|
||||
"aTargets": [2]
|
||||
},
|
||||
{
|
||||
"fnRender": that.getActionButtons,
|
||||
"aTargets": [that.getDataMapping().length]
|
||||
}
|
||||
]
|
||||
};
|
||||
return dataTableParams;
|
||||
});
|
||||
|
||||
EmployeeAttendanceSheetAdapter.method('preProcessRemoteTableData', function(data, cell, id) {
|
||||
return Date.parse(cell).toString('MMM d, yyyy (dddd)');
|
||||
});
|
||||
|
||||
@@ -53,7 +53,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
ksort($dashBoardList);
|
||||
|
||||
foreach($dashBoardList as $k=>$v){
|
||||
echo $v;
|
||||
echo LanguageManager::translateTnrText($v);
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ 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="tabEmployeeDependent" href="#tabPageEmployeeDependent">Dependents</a></li>
|
||||
<li class="active"><a id="tabEmployeeDependent" href="#tabPageEmployeeDependent"><?=LanguageManager::tran('Dependents')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -28,7 +28,7 @@ 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="tabEmergencyContact" href="#tabPageEmergencyContact">Emergency Contacts</a></li>
|
||||
<li class="active"><a id="tabEmergencyContact" href="#tabPageEmergencyContact"><?=LanguageManager::tran('Emergency Contacts')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -24,6 +24,47 @@ Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilin
|
||||
class EmployeesActionManager extends SubActionManager{
|
||||
public function get($req){
|
||||
$profileId = $this->getCurrentProfileId();
|
||||
$cemp = $profileId;
|
||||
$obj = new Employee();
|
||||
|
||||
$cempObj = new Employee();
|
||||
$cempObj->Load("id = ?",array($cemp));
|
||||
if($obj->getUserOnlyMeAccessField() == 'id' &&
|
||||
SettingsManager::getInstance()->getSetting('System: Company Structure Managers Enabled') == 1 &&
|
||||
CompanyStructure::isHeadOfCompanyStructure($cempObj->department, $cemp)){
|
||||
|
||||
$subordinates = $obj->Find("supervisor = ?",array($cemp));
|
||||
|
||||
if(empty($subordinates)){
|
||||
$subordinates = array();
|
||||
}
|
||||
|
||||
$childCompaniesIds = array();
|
||||
if(SettingsManager::getInstance()->getSetting('System: Child Company Structure Managers Enabled') == '1'){
|
||||
$childCompaniesResp = CompanyStructure::getAllChildCompanyStructures($cempObj->department);
|
||||
$childCompanies = $childCompaniesResp->getObject();
|
||||
|
||||
foreach($childCompanies as $cc){
|
||||
$childCompaniesIds[] = $cc->id;
|
||||
}
|
||||
}else{
|
||||
$childCompaniesIds[] = $cempObj->department;
|
||||
}
|
||||
|
||||
|
||||
if(!empty($childCompaniesIds)) {
|
||||
$childStructureSubordinates = $obj->Find("department in (" . implode(',', $childCompaniesIds) . ") and id != ?", array($cemp));
|
||||
$subordinates = array_merge($subordinates, $childStructureSubordinates);
|
||||
}
|
||||
|
||||
foreach ($subordinates as $subordinate){
|
||||
if($subordinate->id == $req->id){
|
||||
$id = $req->id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}else{
|
||||
$subordinate = new Employee();
|
||||
$subordinatesCount = $subordinate->Count("supervisor = ? and id = ?",array($profileId, $req->id));
|
||||
|
||||
@@ -31,6 +72,9 @@ class EmployeesActionManager extends SubActionManager{
|
||||
if($this->user->user_level == 'Admin' || $subordinatesCount > 0){
|
||||
$id = $req->id;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(empty($id)){
|
||||
$id = $profileId;
|
||||
@@ -57,6 +101,12 @@ class EmployeesActionManager extends SubActionManager{
|
||||
$employee->joined_date = date("F jS, Y",strtotime($employee->joined_date));
|
||||
}
|
||||
|
||||
//Read custom fields
|
||||
try {
|
||||
$employee = BaseService::getInstance()->customFieldManager->enrichObjectCustomFields('Employee', $employee);
|
||||
}catch(Exception $e){
|
||||
|
||||
}
|
||||
|
||||
if(empty($employee->id)){
|
||||
return new IceResponse(IceResponse::ERROR,$employee);
|
||||
|
||||
@@ -166,6 +166,11 @@
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row" id="customFieldsCont" style="margin-left:10px;margin-top:20px;">
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="modal" id="adminUsersModel" tabindex="-1" role="dialog" aria-labelledby="messageModelLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
<h3>My Profile</h3>
|
||||
<h3><t>My Profile</t></h3>
|
||||
<p>
|
||||
Edit Details
|
||||
<t>Edit Details</t>
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-ios7-person"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="myProfileLink">
|
||||
Manage Profile <i class="fa fa-arrow-circle-right"></i>
|
||||
<t>View/Edit Profile</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -54,8 +54,8 @@ path.link {
|
||||
<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="tabEmployee" href="#tabPageEmployee">My Details</a></li>
|
||||
<li><a id="tabCompanyGraph" href="#tabPageCompanyGraph">Company</a></li>
|
||||
<li class="active"><a id="tabEmployee" href="#tabPageEmployee"><?=LanguageManager::tran('My Details')?></a></li>
|
||||
<li><a id="tabCompanyGraph" href="#tabPageCompanyGraph"><?=LanguageManager::tran('Company')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
@@ -290,6 +290,38 @@ EmployeeAdapter.method('modEmployeeGetSuccessCallBack' , function(data) {
|
||||
subordinates += "<br/>";
|
||||
}
|
||||
|
||||
//Add custom fields
|
||||
if(data.customFields != undefined && data.customFields != null && Object.keys(data.customFields).length > 0) {
|
||||
|
||||
|
||||
var ct = '<div class="col-xs-6 col-md-3" style="font-size:16px;"><label class="control-label col-xs-12" style="font-size:13px;">#_label_#</label><label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;">#_value_#</label></div>';
|
||||
var customFieldHtml;
|
||||
for (index in data.customFields) {
|
||||
|
||||
if(!data.customFields[index][1]){
|
||||
data.customFields[index][1] = 'Other Details';
|
||||
}
|
||||
|
||||
sectionId = data.customFields[index][1].toLocaleLowerCase();
|
||||
sectionId = sectionId.replace(' ','_');
|
||||
|
||||
if($("#cont_"+sectionId).length <= 0){
|
||||
//Add section
|
||||
sectionHtml = sectionTemplate;
|
||||
sectionHtml = sectionHtml.replace('#_section_#', sectionId);
|
||||
sectionHtml = sectionHtml.replace('#_section.name_#', data.customFields[index][1]);
|
||||
$("#customFieldsCont").append($(sectionHtml));
|
||||
}
|
||||
|
||||
customFieldHtml = ct;
|
||||
customFieldHtml = customFieldHtml.replace('#_label_#', index);
|
||||
customFieldHtml = customFieldHtml.replace('#_value_#', data.customFields[index][0]);
|
||||
$("#cont_"+sectionId).append($(customFieldHtml));
|
||||
}
|
||||
}else{
|
||||
$("#customFieldsCont").remove();
|
||||
}
|
||||
|
||||
$("#"+this.getTableName()+" #subordinates").html(subordinates);
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user