File: /home/dmstechonline/crm.dmstech.online/modules/timesheets/controllers/Timesheets.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');
/**
* timesheets
*/
class timesheets extends AdminController
{
public function __construct()
{
parent::__construct();
$this->load->model('timesheets_model');
$this->load->model('departments_model');
require_once module_dir_path(TIMESHEETS_MODULE_NAME) . '/third_party/excel/PHPExcel.php';
}
/* List all announcements */
public function index()
{
if (!has_permission('timesheets_dashboard', '', 'view')) {
access_denied('timesheets');
}
$data['google_ids_calendars'] = $this->misc_model->get_google_calendar_ids();
$data['title'] = _l('timesheets');
$this->load->view('timesheets_dashboard', $data);
}
/**
* setting
* @return
*/
public function setting()
{
$this->load->model('staff_model');
$this->load->model('roles_model');
$this->load->model('contracts_model');
$data['group'] = $this->input->get('group');
$data['title'] = _l('setting');
$data['tab'][] = 'manage_leave';
$data['tab'][] = 'manage_dayoff';
$data['tab'][] = 'approval_process';
$data['tab'][] = 'timekeeping_settings';
$data['tab'][] = 'default_settings';
if($data['group'] == ''){
$data['group'] = 'contract_type';
}elseif ($data['group'] == 'manage_dayoff') {
$data['holiday'] = $this->timesheets_model->get_break_dates();
}elseif ($data['group'] == 'overtime_setting') {
$data['overtime_setting'] = $this->timesheets_model->get_overtime_setting();
}elseif ($data['group'] == 'shift') {
$data['shift'] = $this->timesheets_model->get_shift_sc();
}
$data['tabs']['view'] = 'includes/'.$data['group'];
$data['month'] = $this->timesheets_model->get_month();
$data['staff'] = $this->staff_model->get();
$data['department'] = $this->departments_model->get();
$data['role'] = $this->roles_model->get();
if($data['group'] == 'approval_process'){
if ($this->input->post()) {
$data = $this->input->post();
$id = $data['approval_setting_id'];
unset($data['approval_setting_id']);
if ($id == '') {
if (!has_permission('staffmanage_approval', '', 'create')) {
access_denied('approval_process');
}
$id = $this->timesheets_model->add_approval_process($data);
if ($id) {
set_alert('success', _l('added_successfully', _l('approval_process')));
}
} else {
if (!has_permission('staffmanage_approval', '', 'edit')) {
access_denied('approval_process');
}
$success = $this->timesheets_model->update_approval_process($id, $data);
if ($success) {
set_alert('success', _l('updated_successfully', _l('approval_process')));
}
}
}
$data['approval_setting'] = $this->timesheets_model->get_approval_process();
$data['title'] = _l('approval_process');
$data['staffs'] = $this->staff_model->get();
}
if($data['group'] == 'manage_leave'){
$new_array_obj = [];
foreach ($data['staff'] as $key => $value) {
$department_name = '';
$data_department = $this->departments_model->get_staff_departments($value['staffid']);
if($data_department){
$department_name = $data_department[0]['name'];
}
$role_name = '';
if($value['role']!=''){
$data_role = $this->timesheets_model->get_role($value['role']);
if(isset($data_role)){
if($data_role){
if(isset($data_role->name)){
$role_name = $data_role->name;
}
}
}
}
$day = 0;
$data_leave = $this->timesheets_model->get_day_off($value['staffid']);
if($data_leave){
if($data_leave->total != ''){
$day = $data_leave->total;
}
}
array_push($new_array_obj, array('staffid' => $value['staffid'], 'staff'=> $value['firstname'].' '.$value['lastname'], 'department' => $department_name, 'role' => $role_name,'maximum_leave_of_the_year' => $day));
}
$data['leave_of_the_year'] = json_encode($new_array_obj);
}
$this->load->view('manage_setting', $data);
}
/**
* leave
* leave
* @return view
*/
public function leave()
{
$data['title'] = _l('manage_leave');
$data['positions'] = $this->timesheets_model->get_job_position();
$data['workplace'] = $this->timesheets_model->get_workplace();
$data['contract_type'] = $this->timesheets_model->get_contracttype();
$data['staff'] = $this->staff_model->get();
$data['allowance_type'] = $this->timesheets_model->get_allowance_type();
$data['salary_form'] = $this->timesheets_model->get_salary_form();
$this->load->view('timesheets/manage_leave',$data);
}
/**
* table leave
* @return view
*/
public function table_leave(){
$this->app->get_table_data(module_views_path('timesheets', 'table_leave'));
}
/**
* timesheets file
* @param int $id
* @param int $rel_id
* @return view
*/
public function timesheets_file($id, $rel_id)
{
$data['discussion_user_profile_image_url'] = staff_profile_image_url(get_staff_user_id());
$data['current_user_is_admin'] = is_admin();
$data['file'] = $this->timesheets_model->get_file($id, $rel_id);
if (!$data['file']) {
header('HTTP/1.0 404 Not Found');
die;
}
$this->load->view('timesheets/includes/_file', $data);
}
/**
* get staff role
* @return json
*/
public function get_staff_role(){
if ($this->input->is_ajax_request()) {
if ($this->input->post()) {
$id = $this->input->post('id');
$name_object = $this->db->query('select r.name from '.db_prefix().'staff as s join '.db_prefix().'roles as r on s.role = r.roleid where s.staffid = ' .$id)->row();
}
}
if($name_object){
echo json_encode([
'name' => $name_object->name,
]);
}
}
/**
* timekeeping
* @return view
*/
public function timekeeping(){
if (!(has_permission('attendance_management', '', 'view_own') || has_permission('attendance_management', '', 'view') || is_admin())) {
access_denied('timekeeping');
}
$this->load->model('staff_model');
$data['title'] = _l('timesheets');
$month = date('m');
$month_year = date('Y');
$days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $month_year);
$data['check_latch_timesheet'] = $this->timesheets_model->check_latch_timesheet(date('m-Y'));
$data['departments'] = $this->departments_model->get();
$data['roles'] = $this->roles_model->get();
$data['day_by_month_tk'] = [];
$data['day_by_month_tk'][] = _l('staff_id');
$data['day_by_month_tk'][] = _l('staff');
$data['set_col_tk'] = [];
$data['set_col_tk'][] = ['data' => _l('staff_id'), 'type' => 'text'];
$data['set_col_tk'][] = ['data' => _l('staff'), 'type' => 'text','readOnly' => true,'width' => 200];
for ($d = 1; $d <= $days_in_month; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
if (date('m', $time) == $month) {
array_push($data['day_by_month_tk'], date('D d', $time));
array_push($data['set_col_tk'],[ 'data' => date('D d', $time), 'type' => 'text']);
}
}
$data['day_by_month_tk'] = json_encode($data['day_by_month_tk']);
$data_map = [];
$data_timekeeping_form = get_timesheets_option('timekeeping_form');
$data_timekeeping_manually_role = get_timesheets_option('timekeeping_manually_role');
$data['data_timekeeping_form'] = $data_timekeeping_form;
$data['staff_row_tk'] = [];
$staffs = $this->timesheets_model->get_staff_timekeeping_applicable_object();
$data['staffs'] = $staffs;
if($data_timekeeping_form == 'timekeeping_task' && $data['check_latch_timesheet'] == false){
$result = $this->timesheets_model->get_attendance_task($staffs, $month, $month_year);
$data['staff_row_tk'] = $result['staff_row_tk'];
}
else{
if($data['check_latch_timesheet'] == false){
$result = $this->timesheets_model->get_attendance_manual($staffs, $month, $month_year);
$data['staff_row_tk'] = $result['staff_row_tk'];
}
}
$data_lack = [];
$data['data_lack'] = $data_lack;
$data['set_col_tk'] = json_encode($data['set_col_tk']);
$this->load->view('timekeeping/manage_timekeeping', $data);
}
/**
* add or update day off
*/
public function day_off(){
if($this->input->post()){
$data = $this->input->post();
if (!$this->input->post('id')) {
$add = $this->timesheets_model->add_day_off($data);
if($add > 0){
$message = _l('added_successfully', _l('day_off'));
set_alert('success',$message);
}
redirect(admin_url('timesheets/setting?group=manage_dayoff'));
}else{
$id = $data['id'];
unset($data['id']);
$success = $this->timesheets_model->update_day_off($data,$id);
if($success == true){
$message = _l('updated_successfully', _l('day_off'));
set_alert('success', $message);
}
redirect(admin_url('timesheets/setting?group=manage_dayoff'));
}
}
}
/**
* delete day off
* @param int $id
*/
public function delete_day_off($id){
if (!$id) {
redirect(admin_url('timesheets/setting?group=manage_dayoff'));
}
$response = $this->timesheets_model->delete_day_off($id);
if (is_array($response) && isset($response['referenced'])) {
set_alert('warning', _l('is_referenced').' '. _l('day_off'));
} elseif ($response == true) {
set_alert('success', _l('deleted').' '._l('day_off'));
} else {
set_alert('warning', _l('problem_deleting').' '. _l('day_off'));
}
redirect(admin_url('timesheets/setting?group=manage_dayoff'));
}
/**
* add or edit shifts
*/
public function shifts(){
if($this->input->post()){
$data = $this->input->post();
if ($data['id'] == '') {
$add = $this->timesheets_model->add_work_shift($data);
if($add > 0){
$message = _l('added_successfully', _l('shift'));
set_alert('success',$message);
}
redirect(admin_url('timesheets/shift_management'));
}else{
$success = $this->timesheets_model->update_work_shift($data);
if($success == true){
$message = _l('updated_successfully', _l('shift'));
set_alert('success', $message);
}
redirect(admin_url('timesheets/shift_management'));
}
}
}
/**
* get_data_edit_shift
* @param int $id
*/
public function get_data_edit_shift($id){
$shift_handson = $this->timesheets_model->get_data_edit_shift($id);
$result = [];
$node = [];
foreach ($shift_handson as $key => $value) {
foreach ($value as $col => $val) {
if($col == 'detail'){
if($key == 0){
$node[_l($col)] = _l('time_start_work');
}elseif ($key == 1) {
$node[_l($col)] = _l('time_end_work');
}elseif($key == 2){
$node[_l($col)] = _l('start_lunch_break_time');
}elseif($key == 3){
$node[_l($col)] = _l('end_lunch_break_time');
}elseif($key == 4){
$node[_l($col)] = _l('late_latency_allowed');
}
}else{
$node[_l($col)] = $val;
}
}
$result[] = $node;
}
echo json_encode([
'handson' => $result,
]);
}
/**
* delete shift
* @param int $id
*/
public function delete_shift($id){
if (!$id) {
redirect(admin_url('timesheets/shift_management'));
}
$response = $this->timesheets_model->delete_shift($id);
if (is_array($response) && isset($response['referenced'])) {
set_alert('warning', _l('is_referenced').' '. _l('shift'));
} elseif ($response == true) {
set_alert('success', _l('deleted').' '._l('shift'));
} else {
set_alert('warning', _l('problem_deleting').' '. _l('shift'));
}
redirect(admin_url('timesheets/shift_management'));
}
/**
* manage timesheets
*/
public function manage_timesheets(){
if($this->input->post()){
$data = $this->input->post();
if(isset($data)){
if($data['latch'] == 1){
if(isset($data['month']) && $data['month'] != ""){
$data_month = explode("-", $data['month']);
if(strlen($data['month'][0]) == 4){
$month_latch = $data_month[1].'-'.$data_month[0];
}else{
$month_latch = $data_month[0].'-'.$data_month[1];
}
}else{
$month_latch = date("m-Y");
}
$day_month = [];
$day_by_month_tk = [];
$day_month_tk[] = 'staff_id';
$day_month_tk[] = 'staff_name';
$month = explode('-',$data['month'])[0];
$month_year = explode('-',$data['month'])[1];
for ($d = 1; $d <= 31; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
if (date('m', $time) == $month) {
array_push($day_month, date('Y-m-d', $time));
array_push($day_month_tk, date('Y-m-d', $time));
}
}
$data['time_sheet'] = json_decode($data['time_sheet']);
$ts_val = [];
foreach ($data['time_sheet'] as $key => $value) {
$ts_val[] = array_combine($day_month_tk, $value);
}
unset($data['time_sheet']);
$add = $this->timesheets_model->add_update_timesheet($ts_val, true);
$success = $this->timesheets_model->latch_timesheet($month_latch);
if($success){
set_alert('success',_l('timekeeping_latch_successful'));
}else{
set_alert('warning',_l('timekeeping_latch_false'));
}
redirect(admin_url('timesheets/timekeeping?group=timesheets'));
}elseif($data['unlatch'] == 1){
if(isset($data['month']) && $data['month'] != ""){
$data['month'] = explode("-", $data['month']);
if(strlen($data['month'][0]) == 4){
$month = $data['month'][1].'-'.$data['month'][0];
}else{
$month = $data['month'][0].'-'.$data['month'][1];
}
}else{
$month = date("m-Y");
}
$success = $this->timesheets_model->unlatch_timesheet($month);
if($success){
set_alert('success',_l('timekeeping_unlatch_successful'));
}else{
set_alert('warning',_l('timekeeping_unlatch_false'));
}
redirect(admin_url('timesheets/timekeeping?group=timesheets'));
}else{
$day_month = [];
$day_by_month_tk = [];
$day_month_tk[] = 'staff_id';
$day_month_tk[] = 'staff_name';
$month = explode('-',$data['month'])[0];
$month_year = explode('-',$data['month'])[1];
for ($d = 1; $d <= 31; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
if (date('m', $time) == $month) {
array_push($day_month, date('Y-m-d', $time));
array_push($day_month_tk, date('Y-m-d', $time));
}
}
$data['time_sheet'] = json_decode($data['time_sheet']);
$ts_val = [];
foreach ($data['time_sheet'] as $key => $value) {
$ts_val[] = array_combine($day_month_tk, $value);
}
unset($data['time_sheet']);
$add = $this->timesheets_model->add_update_timesheet($ts_val, true);
if($add > 0){
set_alert('success',_l('timekeeping').' '._l('successfully'));
}else{
set_alert('warning',_l('alert_ts'));
}
redirect(admin_url('timesheets/timekeeping?group=timesheets'));
}
}
}
}
/**
* approval status
* @return json
*/
public function approval_status(){
if ($this->input->is_ajax_request()) {
if ($this->input->post()) {
$data = $this->input->post();
$success = $this->timesheets_model->update_approval_status($data);
if ($success) {
$message = _l('success');
echo json_encode([
'success' => true,
'message' => $message,
]);
}else{
$message = _l('payslip_latch_false');
echo json_encode([
'success' => false,
'message' => $message,
]);
}
}
}
}
/**
* reload timesheets byfilter
* @return json
*/
public function reload_timesheets_byfilter(){
$data = $this->input->post();
$date_ts = $this->timesheets_model->format_date($data['month'].'-01');
$date_ts_end = $this->timesheets_model->format_date($data['month'].'-'.date('t'));
$year = date('Y', strtotime($date_ts));
$g_month = date('m', strtotime($date_ts));
$month_filter = date('Y-m', strtotime($date_ts));
$querystring = 'active=1';
$department = $data['department'];
$job_position = $data['job_position'];
$data['month'] = date('m-Y', strtotime($date_ts));
$data['check_latch_timesheet'] = $this->timesheets_model->check_latch_timesheet($data['month']);
$staff = '';
if(isset($data['staff'])){
$staff = $data['staff'];
}
$staff_querystring='';
$job_position_querystring = '';
$department_querystring='';
$month_year_querystring='';
if($department != ''){
$arrdepartment = $this->staff_model->get('', 'staffid in (select '.db_prefix().'staff_departments.staffid from '.db_prefix().'staff_departments where departmentid = '.$department.')');
$temp = '';
foreach ($arrdepartment as $value) {
$temp = $temp.$value['staffid'].',';
}
$temp = rtrim($temp,",");
$department_querystring = 'FIND_IN_SET(staffid, "'.$temp.'")';
}
if($job_position != ''){
$job_position_querystring = 'role = "'.$job_position.'"';
}
if($staff != ''){
$temp = '';
$araylengh = count($staff);
for ($i = 0; $i < $araylengh; $i++) {
$temp = $temp.$staff[$i];
if($i != $araylengh-1){
$temp = $temp.',';
}
}
$staff_querystring = 'FIND_IN_SET(staffid, "'.$temp.'")';
}else{
$data_timekeeping_form = get_timesheets_option('timekeeping_form');
$timekeeping_applicable_object = [];
if($data_timekeeping_form == 'timekeeping_task'){
if(get_timesheets_option('timekeeping_task_role') != ''){
$timekeeping_applicable_object = get_timesheets_option('timekeeping_task_role');
}
}elseif($data_timekeeping_form == 'timekeeping_manually'){
if(get_timesheets_option('timekeeping_manually_role') != ''){
$timekeeping_applicable_object = get_timesheets_option('timekeeping_manually_role');
}
}elseif($data_timekeeping_form == 'csv_clsx'){
if(get_timesheets_option('csv_clsx_role') != ''){
$timekeeping_applicable_object = get_timesheets_option('csv_clsx_role');
}
}
$staff_querystring != '';
if($data['job_position'] != ''){
$staff_querystring .= 'role = '.$data['job_position'];
}
else{
if($timekeeping_applicable_object){
if($timekeeping_applicable_object != ''){
$staff_querystring .= 'FIND_IN_SET(role, "'.$timekeeping_applicable_object.'")';
}
}
}
}
$arrQuery = array($staff_querystring,$department_querystring, $month_year_querystring, $job_position_querystring, $querystring);
$newquerystring = '';
foreach ($arrQuery as $string) {
if($string != ''){
$newquerystring = $newquerystring.$string.' AND ';
}
}
$newquerystring=rtrim($newquerystring,"AND ");
if($newquerystring == ''){
$newquerystring = [];
}
$days_in_month = cal_days_in_month(CAL_GREGORIAN, $g_month, $year);
if($year != ''){
$month_new = (string)$g_month;
if(strlen($month_new)==1){
$month_new='0'.$month_new;
}
$g_month = $month_new;
}
$data['departments'] = $this->departments_model->get();
$data['staffs_li'] = $this->staff_model->get();
$data['roles'] = $this->roles_model->get();
$data['job_position'] = $this->roles_model->get();
$data['positions'] = $this->roles_model->get();
$data['shifts'] = $this->timesheets_model->get_shifts();
$data['day_by_month_tk'] = [];
$data['day_by_month_tk'][] = _l('staff_id');
$data['day_by_month_tk'][] = _l('staff');
$data['set_col_tk'] = [];
$data['set_col_tk'][] = ['data' => _l('staff_id'), 'type' => 'text'];
$data['set_col_tk'][] = ['data' => _l('staff'), 'type' => 'text','readOnly' => true,'width' => 200];
for ($d = 1; $d <= $days_in_month; $d++) {
$time = mktime(12, 0, 0, $g_month, $d, (int)$year);
if (date('m', $time) == $g_month) {
array_push($data['day_by_month_tk'], date('D d', $time));
array_push($data['set_col_tk'],[ 'data' => date('D d', $time), 'type' => 'text']);
}
}
$data['day_by_month_tk'] = $data['day_by_month_tk'];
$data_map = [];
$data_timekeeping_form = get_timesheets_option('timekeeping_form');
$data['staff_row_tk'] = [];
$staffs = $this->timesheets_model->getStaff('', $newquerystring);
$data['staffs_setting'] = $this->staff_model->get();
$data['staffs'] = $staffs;
if($data_timekeeping_form == 'timekeeping_task' && $data['check_latch_timesheet'] == false){
$result = $this->timesheets_model->get_attendance_task($staffs, $g_month, $year);
$data['staff_row_tk'] = $result['staff_row_tk'];
}
else{
if($data['check_latch_timesheet'] == false){
$result = $this->timesheets_model->get_attendance_manual($staffs, $g_month, $year);
$data['staff_row_tk'] = $result['staff_row_tk'];
}
}
$data_lack = [];
$data['data_lack'] = $data_lack;
echo json_encode([
'arr' => $data['staff_row_tk'],
'set_col_tk' => $data['set_col_tk'],
'day_by_month_tk' => $data['day_by_month_tk'],
'check_latch_timesheet' => $data['check_latch_timesheet'],
'month' => $data['month'],
'data_lack' => $data['data_lack'],
]);
die;
}
/**
* add requisition ajax
*/
public function add_requisition_ajax(){
if($_FILES['file']['name'] != ''){
$_FILES = $_FILES;
}else{
unset($_FILES);
}
if ($this->input->post()) {
$data = $this->input->post();
if($data['rel_type'] == 1){
$data['start_time'] = $this->timesheets_model->format_date_time($data['start_time']);
$data['end_time'] = $this->timesheets_model->format_date_time($data['end_time']);
}
else{
$data['start_time'] = $this->timesheets_model->format_date_time($data['start_time_s']);
$data['end_time'] = $this->timesheets_model->format_date_time($data['end_time_s']);
}
unset($data['start_time_s']);
unset($data['end_time_s']);
$data['staff_id'] = get_staff_user_id();
if(isset($data['according_to_the_plan'])){
$data['according_to_the_plan'] = 0;
}
$result = $this->timesheets_model->add_requisition_ajax($data);
if ($result != '') {
echo json_encode([
'message' => 'success',
'success' => true,
]);
$rel_type = '';
if($data['rel_type'] == '1'){
$rel_type = 'Leave';
}elseif($data['rel_type'] == '2'){
$rel_type = 'late';
}elseif($data['rel_type'] == '3'){
$rel_type = 'Go_out';
}elseif($data['rel_type'] == '4'){
$rel_type = 'Go_on_bussiness';
}elseif($data['rel_type'] == '5'){
$rel_type = 'quit_job';
}elseif($data['rel_type'] == '6'){
$rel_type = 'early';
}
$data_app['rel_id'] = $result;
$data_app['rel_type'] = $rel_type;
$data_app['addedfrom'] = $data['staff_id'];
$check_proccess = $this->timesheets_model->get_approve_setting($rel_type, false);
$check = '';
if($check_proccess){
if($check_proccess->choose_when_approving == 0){
$check = 'not_choose';
}else{
$check = 'choose';
}
}else{
$check = 'no_proccess';
}
$followers_id = $data['followers_id'];
$staffid = $data['staff_id'];
$subject = $data['subject'];
$link = 'timesheets/requisition_detail/' . $result;
if($followers_id != ''){
if ($staffid != $followers_id) {
$notification_data = [
'description' => _l('you_are_added_to_follow_the_leave_application').'-'.$subject,
'touserid' => $followers_id,
'link' => $link,
];
$notification_data['additional_data'] = serialize([
$subject,
]);
if (add_notification($notification_data)) {
pusher_trigger_notification([$followers_id]);
}
}
}
redirect(admin_url('timesheets/requisition_detail/'.$result.'?check='.$check));
}else{
redirect(admin_url('timesheets/requisition_manage'));
}
}
}
/**
* table registration leave
* @return
*/
public function table_registration_leave()
{
$this->app->get_table_data(module_views_path('timesheets', 'table_registration_leave'));
}
/**
* table additional timesheets
* @return
*/
public function table_additional_timesheets()
{
$this->app->get_table_data(module_views_path('timesheets', 'timekeeping/table_additional_timesheets'));
}
/**
* get request leave data ajax
* @return
*/
public function get_request_leave_data_ajax()
{
$data[] = $this->timesheets_model->get_category_for_leave();
}
/**
* requisition detail
* @param int $id
* @return view
*/
public function requisition_detail($id){
if (!(has_permission('leave_management', '', 'view_own') || has_permission('leave_management', '', 'view') || is_admin())) {
access_denied('approval_process');
}
$send_mail_approve = $this->session->userdata("send_mail_approve");
if((isset($send_mail_approve)) && $send_mail_approve != ''){
$data['send_mail_approve'] = $send_mail_approve;
$this->session->unset_userdata("send_mail_approve");
}
$data['request_leave'] = $this->timesheets_model->get_request_leave($id);
$status_leave = $this->timesheets_model->get_number_of_days_off($data['request_leave']->staff_id);
$day_off = $this->timesheets_model->get_day_off($data['request_leave']->staff_id);
$data['number_day_off'] = 0;
if($day_off != null){
$data['number_day_off'] = $day_off->remain;
}
$leave_isset = $this->db->query('select * from '.db_prefix().'timesheets_requisition_leave')->result_array();
$data['id'] = $id;
$data['leave_isset'] = $leave_isset;
$rel_type = '';
if($data['request_leave']->rel_type == '1'){
$rel_type = 'Leave';
}elseif($data['request_leave']->rel_type == '2'){
$rel_type = 'late';
}elseif($data['request_leave']->rel_type == '3'){
$rel_type = 'Go_out';
}elseif($data['request_leave']->rel_type == '4'){
$rel_type = 'Go_on_bussiness';
}elseif($data['request_leave']->rel_type == '5'){
$rel_type = 'quit_job';
}elseif($data['request_leave']->rel_type == '6'){
$rel_type = 'early';
}
$this->load->model('staff_model');
if($data['request_leave']->rel_type == '4'){
$data['advance_payment'] = $this->timesheets_model->get_go_bussiness_advance_payment($id);
}
$id_file = $this->db->query('select id from '.db_prefix().'files where rel_id ='.$id)->row();
$data['id_file'] = $id_file;
$data['rel_type'] = $rel_type;
$data['list_staff'] = $this->staff_model->get();
$data['check_approve_status'] = $this->timesheets_model->check_approval_details($id,$rel_type);
$data['list_approve_status'] = $this->timesheets_model->get_list_approval_details($id,$rel_type);
$this->load->view('timesheets/requisition_detail', $data);
}
/**
* delete requisition
* @param int $id
* @return redirect
*/
public function delete_requisition($id)
{
$response = $this->timesheets_model->delete_requisition($id);
if (is_array($response) && isset($response['referenced'])) {
set_alert('warning', _l('is_referenced', _l('lead_source_lowercase')));
} elseif ($response == true) {
set_alert('success', _l('deleted', _l('lead_source')));
} else {
set_alert('warning', _l('problem_deleting', _l('lead_source_lowercase')));
}
redirect(admin_url('timesheets/requisition_manage'));
}
/**
* infor staff
* @param int $id
* @return data
*/
public function infor_staff($id)
{
$this->db->select('s.email,r.name as name_role, d.name');
$this->db->from('staff as s');
$this->db->join('staff_departments as sd','s.staffid = sd.staffid');
$this->db->join('departments as d','sd.departmentid = d.departmentid');
$this->db->join('roles as r','s.role = r.roleid');
$this->db->where('s.staffid',$id);
$data = $this->db->get()->row();
json_encode($data);
return $data;
}
/**
* approve request leave
* @param int $status
* @param int $id
* @return redirect
*/
public function approve_request_leave($status,$id){
$result = $this->timesheets_model->approve_request_leave($status, $id);
if($result == 'approved'){
set_alert('success',_l('approved').' '._l('request_leave').' '._l('successfully'));
}elseif($result == 'reject'){
set_alert('success',_l('reject').' '._l('request_leave').' '._l('successfully'));
}else{
set_alert('warning',_l('action').' '._l('fail'));
}
redirect(admin_url('timesheets/requisition_detail/'.$id));
}
/**
* file
* @param int $id
* @param int $rel_id
* @return view
*/
public function file($id, $rel_id)
{
$data['discussion_user_profile_image_url'] = staff_profile_image_url(get_staff_user_id());
$data['current_user_is_admin'] = is_admin();
$data['file'] = $this->timesheets_model->get_file($id, $rel_id);
if (!$data['file']) {
header('HTTP/1.0 404 Not Found');
die;
}
$this->load->view('_file', $data);
}
/**
* requisition manage
* @return view
*/
public function requisition_manage(){
if (!(has_permission('leave_management', '', 'view_own') || has_permission('leave_management', '', 'view') || is_admin())) {
access_denied('approval_process');
}
$send_mail_approve = $this->session->userdata("send_mail_approve");
if((isset($send_mail_approve)) && $send_mail_approve != ''){
$data['send_mail_approve'] = $send_mail_approve;
$this->session->unset_userdata("send_mail_approve");
}
$status_leave = $this->timesheets_model->get_number_of_days_off();
$day_off = $this->timesheets_model->get_day_off();
$data['number_day_off'] = 0;
$data['days_off'] = 0;
if($day_off != null){
$data['number_day_off'] = $day_off->remain;
if($data['number_day_off'] < 0){
$data['number_day_off'] = 0;
}
$data['days_off'] = $day_off->days_off;
if($data['days_off'] > $day_off->total){
$data['days_off'] = $day_off->total;
}
}
$data['data_timekeeping_form'] = get_timesheets_option('timekeeping_form');
$this->load->model('departments_model');
$data['departments'] = $this->departments_model->get();
$data['current_date'] = date('Y-m-d H:i:s');
$status_leave = $this->timesheets_model->get_option_val();
$this->load->model('staff_model');
$data['pro'] = $this->staff_model->get();
$data['userid'] = get_staff_user_id();
$data['tab'] = $this->input->get('tab');
$data['title'] = _l('leave');
$data['additional_timesheets_id'] = $this->input->get('additional_timesheets_id');
$data['additional_timesheets'] = $this->timesheets_model->get_additional_timesheets();
$this->load->view('timesheets/timekeeping/manage_requisition_hrm', $data);
}
/**
* automatic timekeeping
* @param $data
* @return json
*/
public function automatic_timekeeping($data){
$success = $this->timesheets_model->automatic_timekeeping($data);
if ($success) {
set_alert('success', _l('successfully'));
} else {
set_alert('warning', _l('fail'));
}
echo json_encode([
'success' => $success,
]);
die();
}
/**
* setting timekeeper
* @return redirect
*/
public function setting_timekeeper(){
$data = $this->input->post();
$success = $this->timesheets_model->setting_timekeeper($data);
if($success){
set_alert('success',_l('save_setting_success'));
}else{
set_alert('danger',_l('no_data_changes'));
}
redirect(admin_url('timesheets/setting?group=timekeeping_settings'));
}
/**
* edit timesheets
* @return redirect
*/
public function edit_timesheets(){
$data = $this->input->post();
$success = $this->timesheets_model->edit_timesheets($data);
if($success){
set_alert('success',_l('save_setting_success'));
}else{
set_alert('danger',_l('save_setting_fail'));
}
redirect(admin_url('timesheets/timekeeping?group=timesheets'));
}
/**
* send additional timesheets
* @return redirect
*/
public function send_additional_timesheets(){
$data = $this->input->post();
$success = false;
if(isset($data['additional_day'])){
$check_latch_timesheet = $this->timesheets_model->check_latch_timesheet(date('m-Y',strtotime(to_sql_date($data['additional_day']))));
if($check_latch_timesheet){
set_alert('danger',_l('timekeeping_latched'));
redirect(admin_url('timesheets/member/'.get_staff_user_id().'?tab=timekeeping'));
}
$success = $this->timesheets_model->add_additional_timesheets($data);
}
if($success){
set_alert('success', _l('added_successfully', _l('additional_timesheets')));
}else{
set_alert('warning', _l('fail'));
}
redirect(admin_url('timesheets/requisition_manage?tab=additional_timesheets&additional_timesheets_id='.$success));
}
/**
* approve additional timesheets
* @param int $id
* @return json
*/
public function approve_additional_timesheets($id){
$data = $this->input->post();
$message = _l('rejected_successfully');
$success = $this->timesheets_model->update_additional_timesheets($data, $id);
if($success){
$this->db->where('id', $id);
$additional_timesheet = $this->db->get(db_prefix().'timesheets_additional_timesheet')->row();
$this->timesheets_model->edit_timesheets($additional_timesheet);
$ci = &get_instance();
$staff_id = get_staff_user_id();
$additional_data = '';
if($data['status'] == 1){
$mes_creator = 'notify_send_creator_additional_timesheet_approved';
}else{
$mes_creator = 'notify_send_creator_additional_timesheet_rejected';
}
$title_creator = 'approval';
$link = 'timesheets/requisition_manage?tab=additional_timesheets?additional_timesheets_id='.$id;
if(isset($additional_timesheet->creator) && $additional_timesheet->creator != $staff_id){
$notified = add_notification([
'description' => $mes_creator,
'touserid' => $additional_timesheet->creator,
'link' => $link,
'additional_data' => serialize([
$additional_data,
]),
]);
if ($notified) {
pusher_trigger_notification([$additional_timesheet->creator]);
}
$ci->email->initialize();
$ci->load->library('email');
$ci->email->clear(true);
$ci->email->from(get_staff_email_by_id($staff_id), get_staff_full_name($staff_id));
$ci->email->to(get_staff_email_by_id($additional_timesheet->creator));
$ci->email->subject(_l($title_creator));
$ci->email->message(_l($mes_creator).' <a target="_blank" class="u6" href="'.admin_url($link).'">Link</a>');
$ci->email->send(true);
}
if($data['status'] == 1){
$message = _l('approved_successfully');
}else{
$message = _l('rejected_successfully');
}
}
echo json_encode([
'success' => $success,
'message' => $message,
]);
die();
}
/**
* show detail timesheets
* @return json
*/
public function show_detail_timesheets(){
$data = $this->input->post();
$d = substr($data['ColHeader'], 4, 2);
$time = $data['month'].'-'.$d;
$d = _d($time);
$st = $this->staff_model->get($data['staffid']);
if(!isset($st->staffid)){
echo json_encode([
'title' => '',
'html' => '',
]);
die();
}
$title = get_staff_full_name($st->staffid). ' - '. $d;
$data['value'] = explode('; ', $data['value']);
$html = '';
foreach ($data['value'] as $key => $value) {
$value = explode(':', $value);
if(isset($value[1]) && $value[1] > 0 || $value[0] == 'M' || $value[0] == 'HO' || $value[0] == 'B'){
switch ($value[0]) {
case 'AL':
$html .= '<li class="list-group-item justify-content-between">
'._l('p_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_p">'.round($value[1], 2).'</span>
</li>';
break;
case 'W':
$html .= '<li class="list-group-item justify-content-between">
'._l('W_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_w">'.round($value[1], 2).'</span>
</li>';
break;
case 'A':
$html .= '<li class="list-group-item justify-content-between">
'._l('A_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_a">'.round($value[1], 2).'</span>
</li>';
break;
case 'HO':
$html .= '<li class="list-group-item justify-content-between">
'._l('Le_timekeeping').'
</li>';
break;
case 'E':
$html .= '<li class="list-group-item justify-content-between">
'._l('E_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_e">'.round($value[1], 2).'</span>
</li>';
break;
case 'L':
$html .= '<li class="list-group-item justify-content-between">
'._l('L_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_l">'.round($value[1], 2).'</span>
</li>';
break;
case 'B':
$tripid = '';
$bstrip = $this->timesheets_model->get_bussiness_trip_info($time);
if($bstrip){
$tripid = $bstrip->id;
}
$html .= '<li class="list-group-item justify-content-between"><a href="'.admin_url('timesheets/requisition_detail/'.$tripid).'">
'._l('CT_timekeeping').'
</a><span class="badgetext badge badge-primary badge-pill style_b"></span>
</li>';
break;
case 'U':
$html .= '<li class="list-group-item justify-content-between">
'._l('U_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_u">'.round($value[1], 2).'</span>
</li>';
break;
case 'OM':
$html .= '<li class="list-group-item justify-content-between">
'._l('OM_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_om">'.round($value[1], 2).'</span>
</li>';
break;
case 'M':
$html .= '<li class="list-group-item justify-content-between">
'._l('TS_timekeeping').'
</li>';
break;
case 'R':
$html .= '<li class="list-group-item justify-content-between">
'._l('R_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_u">'.round($value[1], 2).'</span>
</li>';
break;
case 'P':
$html .= '<li class="list-group-item justify-content-between">
'._l('P_timekeepings').'
<span class="badgetext badge badge-primary badge-pill style_u">'.round($value[1], 2).'</span>
</li>';
break;
case 'SI':
$html .= '<li class="list-group-item justify-content-between">
'._l('CD_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_u">'.round($value[1], 2).'</span>
</li>';
break;
case 'CO':
$html .= '<li class="list-group-item justify-content-between">
'._l('CO_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_u">'.round($value[1], 2).'</span>
</li>';
break;
case 'ME':
$html .= '<li class="list-group-item justify-content-between">
'._l('H_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_me">'.round($value[1], 2).'</span>
</li>';
break;
case 'OT':
$html .= '<li class="list-group-item justify-content-between">
'._l('OT_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_me">'.round($value[1], 2).'</span>
</li>';
break;
case 'PO':
$html .= '<li class="list-group-item justify-content-between">
'._l('PN_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_po">'.round($value[1], 2).'</span>
</li>';
break;
}
}
}
if(!($value[0] == 'HO' || $value[0] == 'EB' || $value[0] == 'UB')){
$ws_day ='';
$color = '';
$list_shift = $this->timesheets_model->get_shift_work_staff_by_date($data['staffid'], $time);
foreach ($list_shift as $ss) {
$data_shift_type = $this->timesheets_model->get_shift_type($ss);
if($data_shift_type){
$ws_day .= '<li class="list-group-item justify-content-between">'._l('work_times').': '.$data_shift_type->time_start_work.' - '.$data_shift_type->time_end_work.'</li><li class="list-group-item justify-content-between">'._l('lunch_break').': '.$data_shift_type->start_lunch_break_time.' - '.$data_shift_type->end_lunch_break_time.'</li>';
}
}
if($ws_day != ''){
$html .= $ws_day;
}
$access_history_string = '';
$access_history = $this->timesheets_model->get_list_check_in_out( $time,$data['staffid']);
if($access_history){
foreach ($access_history as $key => $value) {
if($value['type_check'] == '1'){
$access_history_string .= '<li class="list-group-item"><i class="fa fa-sign-in text-success" aria-hidden="true"></i> '._dt($value['date']).'</li>';
}else{
$access_history_string .= '<li class="list-group-item"><i class="fa fa-sign-out text-danger" aria-hidden="true"></i> '._dt($value['date']).'</li>';
}
}
}
if($access_history_string != ''){
$html .= '<li class="list-group-item justify-content-between"><ul class="list-group">
<li class="list-group-item active">'._l('access_history').'</li>
'.$access_history_string.'
</ul></li>';
}
}
echo json_encode([
'title' => $title,
'html' => $html,
]);
die();
}
/**
* approval process
* @param string $id
* @return redirect
*/
public function approval_process($id = ''){
if (!has_permission('staffmanage_approval', '', 'view') && !is_admin() ) {
access_denied('approval_process');
}
if ($this->input->post()) {
$data = $this->input->post();
$id = $data['approval_setting_id'];
unset($data['approval_setting_id']);
if ($id == '') {
if (!has_permission('staffmanage_approval', '', 'create')) {
access_denied('approval_process');
}
$id = $this->timesheets_model->add_approval_process($data);
if ($id) {
set_alert('success', _l('added_successfully', _l('approval_process')));
}
} else {
if (!has_permission('staffmanage_approval', '', 'edit')) {
access_denied('approval_process');
}
$success = $this->timesheets_model->update_approval_process($id, $data);
if ($success) {
set_alert('success', _l('updated_successfully', _l('approval_process')));
}
}
redirect(admin_url('timesheets/setting?group=approval_process'));
}
}
/**
* table approval process
* @return
*/
public function table_approval_process(){
if ($this->input->is_ajax_request()) {
$this->app->get_table_data(module_views_path('timesheets', 'approval_process/table_approval_process'));
}
}
/**
* get html approval setting
* @param string $id
* @return
*/
public function get_html_approval_setting($id = '')
{
$html = '';
$staffs = $this->staff_model->get();
$approver = [
0 => ['id' => 'direct_manager', 'name' => _l('direct_manager')],
1 => ['id' => 'department_manager', 'name' => _l('department_manager')],
2 => ['id' => 'staff', 'name' => _l('staff')]];
if(is_numeric($id)){
$approval_setting = $this->accounting_model->get_approval_setting($id);
$setting = json_decode($approval_setting->setting);
foreach ($setting as $key => $value) {
if($key == 0){
$html .= '<div id="item_approve">
<div class="col-md-11">
<div class="col-md-4"> '.
render_select('approver['.$key.']',$approver,array('id','name'),'task_single_related', $value->approver).'
</div>
<div class="col-md-4">
'. render_select('staff['.$key.']',$staffs,array('staffid','full_name'),'staff', $value->staff).'
</div>
<div class="col-md-4">
'. render_select('action['.$key.']',$action,array('id','name'),'action', $value->action).'
</div>
</div>
<div class="col-md-1 contents-nowrap">
<span class="pull-bot">
<button name="add" class="btn new_vendor_requests btn-success" data-ticket="true" type="button"><i class="fa fa-plus"></i></button>
</span>
</div>
</div>';
}else{
$direct_manager = '';
$department_manager = '';
$staff = '';
if($value->approver == 'direct_manager'){
$direct_manager = 'selected';
}elseif($value->approver == 'department_manager'){
$department_manager = 'selected';
}elseif($value->approver == 'staff'){
$staff = 'selected';
}
$html .= '<div id="item_approve">
<div class="col-md-11">
<div class="col-md-4">
'.
render_select('approver['.$key.']',$approver,array('id','name'),'task_single_related', $value->approver).'
</div>
<div class="col-md-6">
<div class="select-placeholder form-group">
<label for="approver['.$key.']">'. _l('approver').'</label>
<select name="approver['.$key.']" id="approver['.$key.']" data-id="'.$key.'" class="selectpicker" data-width="100%" data-none-selected-text="'. _l('dropdown_non_selected_tex').'" data-hide-disabled="true" required>
<option value=""></option>
<option value="direct_manager" '.$direct_manager.'>'. _l('direct_manager').'</option>
<option value="department_manager" '.$department_manager.'>'. _l('department_manager').'</option>
<option value="staff" '.$staff.'>'. _l('staff').'</option>
</select>
</div>
</div>
<div class="col-md-6 hide" id="is_staff_'.$key.'">
<div class="select-placeholder form-group">
<label for="staff['.$key.']">'. _l('staff').'</label>
<select name="staff['.$key.']" id="staff['.$key.']" class="selectpicker" data-width="100%" data-none-selected-text="'. _l('dropdown_non_selected_tex').'" data-hide-disabled="true" data-live-search="true">
<option value=""></option>';
foreach($staffs as $val){
if($value->staff == $val){
$html .= '<option value="'. $val['staffid'].'" selected>
'. get_staff_full_name($val['staffid']).'
</option>';
}else{
$html .= '<option value="'. $val['staffid'].'">
'. get_staff_full_name($val['staffid']).'
</option>';
}
}
$html .= '</select>
</div>
</div>
</div>
<div class="col-md-1 contents-nowrap">
<span class="pull-bot">
<button name="add" class="btn remove_vendor_requests btn-danger" data-ticket="true" type="button"><i class="fa fa-minus"></i></button>
</span>
</div>
</div>';
}
}
}else{
$html .= '<div id="item_approve">
<div class="col-md-11">
<div class="col-md-6">
<div class="select-placeholder form-group">
<label for="approver[0]">'. _l('approver').'</label>
<select name="approver[0]" id="approver[0]" data-id="0" class="selectpicker" data-width="100%" data-none-selected-text="'. _l('dropdown_non_selected_tex').'" data-hide-disabled="true" required>
<option value=""></option>
<option value="direct_manager">'. _l('direct_manager').'</option>
<option value="department_manager">'. _l('department_manager').'</option>
<option value="staff">'. _l('staff').'</option>
</select>
</div>
</div>
<div class="col-md-6 hide" id="is_staff_0">
<div class="select-placeholder form-group">
<label for="staff[0]">'. _l('staff').'</label>
<select name="staff[0]" id="staff[0]" class="selectpicker" data-width="100%" data-none-selected-text="'. _l('dropdown_non_selected_tex').'" data-hide-disabled="true" data-live-search="true">
<option value=""></option>';
foreach($staffs as $val){
$html .= '<option value="'. $val['staffid'].'">
'. get_staff_full_name($val['staffid']).'
</option>';
}
$html .= '</select>
</div>
</div>
</div>
<div class="col-md-1 contents-nowrap">
<span class="pull-bot">
<button name="add" class="btn new_vendor_requests btn-success" data-ticket="true" type="button"><i class="fa fa-plus"></i></button>
</span>
</div>
</div>';
}
echo json_encode([
$html
]);
}
/**
* new approval setting
* @return view
*/
public function new_approval_setting(){
$data['title'] = _l('add_approval_process');
$this->load->model('roles_model');
$data['staffs'] = $this->staff_model->get();
$data['departments'] = $this->departments_model->get();
$data['job_positions'] = $this->roles_model->get();
$this->load->view('approval_process/add_edit_approval_process', $data);
}
/**
* edit approval setting
* @param string $id
* @return
*/
public function edit_approval_setting($id = ''){
$data['approval_setting'] = $this->timesheets_model->get_approval_process($id);
$data['title'] = _l('edit_approval_process');
$data['departments'] = $this->departments_model->get();
$data['job_positions'] = $this->roles_model->get();
$data['staffs'] = $this->staff_model->get();
$this->load->view('approval_process/add_edit_approval_process', $data);
}
/**
* delete approval setting
* @param [type] $id [description]
* @return [type] [description]
*/
public function delete_approval_setting($id)
{
if (!$id) {
redirect(admin_url('timesheets/approval_process'));
}
$response = $this->timesheets_model->delete_approval_setting($id);
if (is_array($response) && isset($response['referenced'])) {
set_alert('warning', _l('is_referenced', _l('approval_process')));
} elseif ($response == true) {
set_alert('success', _l('deleted', _l('approval_process')));
} else {
set_alert('warning', _l('problem_deleting', _l('approval_process')));
}
redirect(admin_url('timesheets/setting?group=approval_process'));
}
/**
* send request approve
* @return json
*/
public function send_request_approve(){
$data = $this->input->post();
$message = 'Send request approval fail';
$check = $this->timesheets_model->check_choose_when_approving($data['rel_type']);
if($check == 0){
$success = $this->timesheets_model->send_request_approve($data);
if ($success === true) {
$message = _l('send_request_approval_success');
$data_new = [];
$data_new['send_mail_approve'] = $data;
$this->session->set_userdata($data_new);
}elseif($success === false){
$message = _l('no_matching_process_found');
$success = false;
}else{
$message = _l('could_not_find_approver_with', _l($success));
$success = false;
}
echo json_encode([
'type' => 'choose',
'success' => $success,
'message' => $message,
]);
die;
}else{
$this->load->model('staff_model');
$list_staff = $this->staff_model->get();
$html = '<div class="col-md-12">';
$html .= '<div class="col-md-9"><select name="approver_c" class="selectpicker" data-live-search="true" id="approver_c" data-width="100%" data-none-selected-text="'. _l('please_choose_approver').'" required>
<option value=""></option>';
foreach($list_staff as $staff){
$html .= '<option value="'.$staff['staffid'].'">'.$staff['firstname'].' '.$staff['lastname'].'</option>';
}
$html .= '</select></div>';
if($data['rel_type'] == 'additional_timesheets'){
$html .= '<div class="col-md-3"><a href="#" onclick="choose_approver('.$data['rel_id'].','.$data['addedfrom'].');" class="btn btn-success lead-top-btn lead-view" data-loading-text="'._l('wait_text').'">'._l('choose').'</a></div>';
}else{
$html .= '<div class="col-md-3"><a href="#" onclick="choose_approver();" class="btn btn-success lead-top-btn lead-view" data-loading-text="'._l('wait_text').'">'._l('choose').'</a></div>';
}
$html .= '</div>';
echo json_encode([
'type' => 'not_choose',
'html' => $html,
'message' => _l('please_choose_approver'),
]);
}
}
/**
* send request approve requisition
* @param data
* @return
*/
public function send_request_approve_requisition($data){
$message = 'Send request approval fail';
$success = $this->timesheets_model->send_request_approve($data);
if ($success === true) {
$message = _l('send_request_approval_success');
$data_new = [];
$data_new['send_mail_approve'] = $data;
$this->session->set_userdata($data_new);
}elseif($success === false){
$message = _l('no_matching_process_found');
$success = false;
}else{
$message = _l('could_not_find_approver_with', _l($success));
$success = false;
}
}
/**
* approve request
* @return json
*/
public function approve_request(){
$data = $this->input->post();
$data['staff_approve'] = get_staff_user_id();
$success = false;
$code = '';
$status_string = 'status_'.$data['approve'];
$message = '';
$check_approve_status = $this->timesheets_model->check_approval_details($data['rel_id'], $data['rel_type']);
if(isset($data['approve']) && in_array(get_staff_user_id(), $check_approve_status['staffid'])){
$success = $this->timesheets_model->update_approval_details($check_approve_status['id'], $data);
$message = _l('approved_successfully');
if ($success) {
if($data['approve'] == 1){
$message = _l('approved_successfully');
$data_log = [];
$data_log['note'] = "approve_request";
$check_approve_status = $this->timesheets_model->check_approval_details($data['rel_id'],$data['rel_type']);
if ($check_approve_status === true){
$this->timesheets_model->update_approve_request($data['rel_id'],$data['rel_type'], 1);
if($data['rel_type'] == 'quit_job'){
$this->load->model('staff_model');
$this->db->where('id',$data['rel_id']);
$requisition = $this->db->get(db_prefix().'timesheets_requisition_leave')->row();
if($requisition){
$data_quitting_work=[];
$staff = $this->staff_model->get($requisition->staff_id);
if($staff){
$department = $this->departments_model->get_staff_departments($requisition->staff_id);
$role_name = $this->roles_model->get($requisition->staff_id);
$data_quitting_work['staffs'] = array('0' => $requisition->staff_id, );
$data_quitting_work['email'] = $staff->email;
$data_quitting_work['department'] = '';
$data_quitting_work['role'] = '';
if(count($department) > 0){
$data_quitting_work['department'] = $department[0]['name'];
}
if($role_name){
$data_quitting_work['role'] = $role_name->name;
}
$this->timesheets_model->add_tbllist_staff_quitting_work($data_quitting_work);
}
}
}
}
}else{
$message = _l('rejected_successfully');
$this->timesheets_model->update_approve_request($data['rel_id'],$data['rel_type'], 2);
}
}
}
$data_new = [];
$data_new['send_mail_approve'] = $data;
$this->session->set_userdata($data_new);
echo json_encode([
'success' => $success,
'message' => $message,
]);
die();
}
/**
* send mail
* @return json
*/
public function send_mail()
{
if ($this->input->is_ajax_request()) {
$data = $this->input->post();
if((isset($data)) && $data != ''){
$this->timesheets_model->send_mail($data);
$success = 'success';
echo json_encode([
'success' => $success,
]);
}
}
}
/**
* choose approver
* @return json
*/
public function choose_approver(){
$data = $this->input->post();
$message = 'Send request approval fail';
$success = $this->timesheets_model->choose_approver($data);
if ($success === true) {
$message = 'Send request approval success';
$data_new = [];
$data_new['send_mail_approve'] = $data;
$this->session->set_userdata($data_new);
}elseif($success === false){
$message = _l('no_matching_process_found');
$success = false;
}else{
$message = _l('could_not_find_approver_with', _l($success));
$success = false;
}
echo json_encode([
'type' => 'choose',
'success' => $success,
'message' => $message,
]);
die;
}
public function get_data_additional_timesheets($id){
$check_approve_status = $this->timesheets_model->check_approval_details($id,'additional_timesheets');
$list_approve_status = $this->timesheets_model->get_list_approval_details($id,'additional_timesheets');
$additional_timesheets = $this->timesheets_model->get_additional_timesheets($id);
$html ='
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title">
<span>'. _l('additional_timesheets') .'</span>
</h4>
</div>
<div class="modal-body">';
$html .= '<div class="col-md-12">';
if($additional_timesheets){
$status_class = 'info';
$status_text = 'status_0';
if($additional_timesheets->status == 1){
$status_class = 'success';
$status_text = 'status_1';
}elseif ($additional_timesheets->status == 2) {
$status_class = 'danger';
$status_text = 'status_-1';
}
$creator = '';
if(isset($additional_timesheets->creator)){
$creator = '<a href="' . admin_url('staff/profile/' . $additional_timesheets->creator) . '">' . staff_profile_image($additional_timesheets->creator, [
'staff-profile-image-small',
]) . '</a> <a href="' . admin_url('staff/profile/' . $additional_timesheets->creator) . '">' . get_staff_full_name($additional_timesheets->creator) . '</a>';
}
$html .= '<table class="table border table-striped margin-top-0">
<tbody>
<tr class="project-overview">
<td class="bold" width="30%">'. _l('creator') .'</td>
<td><a href="' . admin_url('staff/profile/' . $additional_timesheets->creator) . '">' . staff_profile_image($additional_timesheets->creator, [
'staff-profile-image-small',
]) . '</a> <a href="' . admin_url('staff/profile/' . $additional_timesheets->creator) . '">' . get_staff_full_name($additional_timesheets->creator) . '</a>
</td>
</tr>
<tr class="project-overview">
<td class="bold" width="30%">'. _l('status') .'</td>
<td><span class="label label-'. $status_class .' mr-1 mb-1 mt-1">'. _l($status_text) .'</span></td>
</tr>
<tr class="project-overview">
<td class="bold">'. _l('additional_day') .'</td>
<td>'. _d($additional_timesheets->additional_day).'</td>
</tr>
<tr class="project-overview">
<td class="bold">'. _l('time_in') .'</td>
<td>'. $additional_timesheets->time_in.'</td>
</tr>
<tr class="project-overview">
<td class="bold">'. _l('time_out') .'</td>
<td>'. $additional_timesheets->time_out.'</td>
</tr>
';
$html .= ' <tr class="project-overview">
<td class="bold" width="30%">'. _l('timekeeping_value') .'</td>
<td>'.$additional_timesheets->timekeeping_value.'</td>
</tr>
<tr class="project-overview">
<td class="bold" width="30%">'. _l('reason_') .'</td>
<td>'.$additional_timesheets->reason.'</td>
</tr>
</tbody>
</table>';
}
$html .='
<p class="bold margin-top-15">'._l('approval_infor').'</p>
<hr class="border-0-5" /><div>
<div class="project-overview-right">';
if(count($list_approve_status) > 0){
$html .= '<div class="row">
<div class="col-md-12 project-overview-expenses-finance">';
$this->load->model('staff_model');
$enter_charge_code = 0;
foreach ($list_approve_status as $value) {
$value['staffid'] = explode(', ',$value['staffid']);
$html .= '<div class="col-md-6" class="font-15">
<p class="text-uppercase text-muted no-mtop bold">';
$staff_name = '';
foreach ($value['staffid'] as $key => $val) {
if($staff_name != '')
{
$staff_name .= ' or ';
}
$staff_name .= $this->staff_model->get($val)->firstname;
}
$html .= $staff_name.'</p>';
if($value['approve'] == 1){
$html .= '<img src="'.site_url(TIMESHEETS_PATH.'approval/approved.png').'" class="wh-150-80">';
$html .= '<br><br>
<p class="bold text-center text-success">'. _dt($value['date']).'</p>
';
}elseif($value['approve'] == 2){
$html .= '<img src="'.site_url(TIMESHEETS_PATH.'approval/rejected.png').'" class="wh-150-80">';
$html .= '<br><br>
<p class="bold text-center text-danger">'. _dt($value['date']).'</p>
';
}
$html .= '</div>';
}
$html .= '</div></div>';
}
$html .= '</div>
<div class="clearfix"></div></br>
<div class="modal-footer">';
$check_proccess = $this->timesheets_model->get_approve_setting('additional_timesheets', false);
$check = '';
if($check_proccess){
if($check_proccess->choose_when_approving == 0){
$check = 'not_choose';
}else{
$check = 'choose';
}
}else{
$check = 'no_proccess';
}
if($additional_timesheets->status == 0 && ($check_approve_status == false || $check_approve_status == 'reject')){
if($check != 'choose'){
$html .= '<a data-toggle="tooltip" data-loading-text="'._l('wait_text').'" class="btn btn-success lead-top-btn lead-view" data-placement="top" href="#" onclick="send_request_approve('.$additional_timesheets->id.','.$additional_timesheets->creator.'); return false;">'. _l('send_request_approve').'</a>';
}
if($check == 'choose'){
$this->load->model('staff_model');
$list_staff = $this->staff_model->get();
$html .= '<div class="row"><div class="row"><div class="col-md-7"><select name="approver_c" class="selectpicker" data-live-search="true" id="approver_c" data-width="100%" data-none-selected-text="'. _l('please_choose_approver').'" required>';
$current_user = get_staff_user_id();
foreach($list_staff as $staff){
if($staff['staffid'] != $current_user || is_admin()){
$html .= '<option value="'.$staff['staffid'].'">'.$staff['staff_identifi'].' - '.$staff['firstname'].' '.$staff['lastname'].'</option>';
}
}
$html .= '</select></div>';
$html .= '<div class="col-md-5"><a href="#" class="btn btn-default pull-right mleft15" data-toggle="modal" data-target=".additional-timesheets-sidebar">'. _l('close') .'</a>';
$html .= '<a href="#" onclick="choose_approver('.$additional_timesheets->id.','.$additional_timesheets->creator.');" class="btn btn-success lead-top-btn lead-view pull-right" data-loading-text="'._l('wait_text').'">'._l('choose').'</a></div></div></div>';
}
}
if(isset($check_approve_status['staffid'])){
if(in_array(get_staff_user_id(), $check_approve_status['staffid'])){
$html .= '<div class="btn-group pull-left" >
<a href="#" class="btn btn-success dropdown-toggle " data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">'. _l('approve').'<span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-left wh-500-190">
<li>
<div class="col-md-12">
'.render_textarea('reason', 'reason').'
</div>
</li>
<li>
<div class="row text-right col-md-12">
<a href="#" data-loading-text="'._l('wait_text').'" onclick="approve_request('.$additional_timesheets->id.',\'additional_timesheets\'); return false;" class="btn btn-success margin-left-right-15">'. _l('approve').'</a>
<a href="#" data-loading-text="'._l('wait_text').'" onclick="deny_request('. $additional_timesheets->id.',\'additional_timesheets\'); return false;" class="btn btn-warning">'._l('deny').'</a>
</div>
</li>
</ul>
</div>';
}
}
if($check != 'choose'){
$html .= '<a href="#" class="btn btn-default pull-right" data-toggle="modal" data-target=".additional-timesheets-sidebar">'. _l('close') .'</a>';
}
$html .= '</div></div>
</div>
<div class="clearfix"></div>
</div>
</div>';
echo json_encode([
'html' => $html,
]);
die();
}
/**
* reports
* @return view
*/
public function reports()
{
if (!(has_permission('report_management', '', 'view_own') || has_permission('report_management', '', 'view') || is_admin())) {
access_denied('reports');
}
$this->load->model('staff_model');
$this->load->model('departments_model');
$this->load->model('roles_model');
$data['mysqlVersion'] = $this->db->query('SELECT VERSION() as version')->row();
$data['sqlMode'] = $this->db->query('SELECT @@sql_mode as mode')->row();
$data['staff'] = $this->staff_model->get();
$data['department'] = $this->departments_model->get();
$data['roles'] = $this->roles_model->get();
$data['workplace'] = $this->timesheets_model->get_workplace();
$data['route_point'] = $this->timesheets_model->get_route_point();
$data['word_shift'] = $this->timesheets_model->get_shift_type();
$data['title'] = _l('hr_reports');
$this->load->view('reports/manage_reports', $data);
}
/**
* report by leave statistics
* @return json
*/
public function report_by_leave_statistics()
{
echo json_encode($this->timesheets_model->report_by_leave_statistics());
}
/**
* report by working hours
* @return json
*/
public function report_by_working_hours()
{
echo json_encode($this->timesheets_model->report_by_working_hours());
}
/**
* [HR_is_working description]
*/
public function HR_is_working(){
if ($this->input->is_ajax_request()) {
$year = (string)date('Y');
$months_report = $this->input->post('months_report');
if($months_report == '' || !isset($months_report)){
}
if($months_report == 'this_month'){
}
if($months_report == '1'){
}
if($months_report == 'this_year'){
$year = (string)date('Y');
}
if($months_report == 'last_year'){
$year = (string)((int)date('Y')-1);
}
if($months_report == '3'){
}
if($months_report == '6'){
}
if($months_report == '12'){
}
$month_default = 12;
$list_data = array();
for ($i=1; $i <= $month_default; $i++) {
$staff_list = $this->timesheets_model->get_dstafflist_by_year($year ,$i);
$count = count($staff_list);
array_push($list_data, $count);
}
echo json_encode([
'data' => $list_data,
'data_ratio' => $list_data,
]);
}
}
/**
* file view requisition
* @param int $id
* @param int $rel_id
* @return
*/
public function file_view_requisition($id, $rel_id)
{
$data['file'] = $this->timesheets_model->get_file_requisition($id, $rel_id);
$data['rel_id'] = $rel_id;
if (!$data['file']) {
header('HTTP/1.0 404 Not Found');
die;
}
$this->load->view('includes/_file', $data);
}
/**
* leave reports
* @return json
*/
public function leave_reports()
{
if ($this->input->is_ajax_request()) {
if($this->input->post()){
$months_report = $this->input->post('months_filter');
$role_filter = $this->input->post('role_filter');
$department_filter = $this->input->post('department_filter');
$staff_filter = $this->input->post('staff_filter');
$year_filter = $this->input->post('year_requisition');
$year = date('Y');
if($months_report == 'last_year'){
$year = (int)$year-1;
}
$select = [
'staffid',
'firstname',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
];
$query = '';
if(isset($role_filter)){
$position_list = implode(',', $role_filter);
$query .= ' role in ('.$position_list.') and';
}
if(has_permission('report_management', '', 'view') || is_admin()){
if(isset($staff_filter)){
$staffid_list = implode(',', $staff_filter);
$query .= ' staffid in ('.$staffid_list.') and';
}
}
else{
$query .= ' staffid = '.get_staff_user_id().' and';
}
if(isset($department_filter)){
$department_list = implode(',', $department_filter);
$query .= ' staffid in (SELECT staffid FROM '.db_prefix().'staff_departments where departmentid in ('.$department_list.')) and';
}
if(isset($year_filter)){
$year_leave = $year_filter;
}else{
$year_leave = date('Y');
}
$total_query = '';
if(($query)&&($query != '')){
$total_query = rtrim($query, ' and');
$total_query = ' where '.$total_query;
}
$where = [$total_query];
$aColumns = $select;
$sIndexColumn = 'staffid';
$sTable = db_prefix() . 'staff';
$join = [];
$result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [
'lastname',
]);
$output = $result['output'];
$rResult = $result['rResult'];
foreach ($rResult as $aRow) {
$requisition_number_of_day_off = $this->timesheets_model->get_requisition_number_of_day_off($aRow['staffid'], $year_leave);
$timesheets_max_leave_in_year = $requisition_number_of_day_off['total_day_off_in_year'];
$timesheets_total_day_off = 0;
$row = [];
$row[] = $aRow['staffid'];
$row[] = trim($aRow['firstname'].' '.$aRow['lastname']);
$total_leave = $timesheets_max_leave_in_year;
$row[] = $total_leave;
$sum_count = 0;
for($i=1;$i<=12;$i++){
if($i < 10){
$months_filter = $year_leave.'-0'.$i;
}else{
$months_filter = $year_leave.'-'.$i;
}
$count =$this->timesheets_model->get_date_leave_in_month($aRow['staffid'], $months_filter);
$row[] = $count;
$timesheets_total_day_off += $count;
}
$row[] = $timesheets_total_day_off;
$row[] = $total_leave - $timesheets_total_day_off;
$output['aaData'][] = $row;
}
echo json_encode($output);
die();
}
}
}
/**
* general summation
* @param int $month
* @param int $year
* @param int $staffid
* @return
*/
public function general_summation($month, $year, $staffid){
$result = 0;
$data_leave = $this->timesheets_model->get_timesheets_day_leave_by_staffid($staffid,$year);
foreach ($data_leave as $key => $value) {
$start_month = $value['start_month'];
$end_month = $value['end_month'];
if($start_month == $end_month){
if($month == $start_month){
$result += $value['day_leave'];
}
}
if($start_month != $end_month){
if($month == $start_month){
$result += $value['day_start_for'];
}
if($month == $end_month){
$result += $value['day_end_for'];
}
}
}
return $result;
}
/**
* general public report
* @return json
*/
public function general_public_report(){
if ($this->input->is_ajax_request()) {
if($this->input->post()){
$months_report = $this->input->post('months_filter');
$role_filter = $this->input->post('role_filter');
$department_filter = $this->input->post('department_filter');
$staff_filter = $this->input->post('staff_filter');
if($months_report == 'this_month'){
$from_date = date('Y-m-01');
$to_date = date('Y-m-t');
}
if($months_report == '1'){
$from_date = date('Y-m-01', strtotime('first day of last month'));
$to_date = date('Y-m-t', strtotime('last day of last month'));
}
if($months_report == 'this_year'){
$from_date = date('Y-m-d', strtotime(date('Y-01-01')));
$to_date = date('Y-m-d', strtotime(date('Y-12-31')));
}
if($months_report == 'last_year'){
$from_date = date('Y-m-d', strtotime(date(date('Y', strtotime('last year')) . '-01-01')));
$to_date = date('Y-m-d', strtotime(date(date('Y', strtotime('last year')) . '-12-31')));
}
if($months_report == '3'){
$months_report--;
$from_date = date('Y-m-01', strtotime("-$months_report MONTH"));
$to_date = date('Y-m-t');
}
if($months_report == '6'){
$months_report--;
$from_date = date('Y-m-01', strtotime("-$months_report MONTH"));
$to_date = date('Y-m-t');
}
if($months_report == '12'){
$months_report--;
$from_date = date('Y-m-01', strtotime("-$months_report MONTH"));
$to_date = date('Y-m-t');
}
if($months_report == 'custom'){
$from_date = $this->timesheets_model->format_date($this->input->post('report_from'));
$to_date = $this->timesheets_model->format_date($this->input->post('report_to'));
}
$select = [
'staffid',
'firstname',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
'staffid',
];
$query = '';
if(isset($role_filter)){
$position_list = implode(',', $role_filter);
$query .= ' role in ('.$position_list.') and';
}
if(has_permission('report_management', '', 'view') || is_admin()){
if(isset($staff_filter)){
$staffid_list = implode(',', $staff_filter);
$query .= ' staffid in ('.$staffid_list.') and';
}
}
else{
$query .= ' staffid = '.get_staff_user_id().' and';
}
if(isset($department_filter)){
$department_list = implode(',', $department_filter);
$query .= ' staffid in (SELECT staffid FROM '.db_prefix().'staff_departments where departmentid in ('.$department_list.')) and';
}
$total_query = '';
if(($query)&&($query != '')){
$total_query = rtrim($query, ' and');
$total_query = ' where '.$total_query;
}
$where = [$total_query];
$aColumns = $select;
$sIndexColumn = 'staffid';
$sTable = db_prefix() . 'staff';
$join = [];
$result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [
'staffid',
'firstname',
'lastname',
'email',
]);
$output = $result['output'];
$rResult = $result['rResult'];
$data_timekeeping_form = get_timesheets_option('timekeeping_form');
$data_timesheet = [];
if($data_timekeeping_form == 'timekeeping_task'){
$data_timesheet = $this->timesheets_model->get_attendance_task($rResult, '', '', $from_date, $to_date);
}
else{
$data_timesheet = $this->timesheets_model->get_attendance_manual($rResult, '', '', $from_date, $to_date);
}
$index_hr_code = _l('staff_id');
if($data_timesheet){
foreach ($rResult as $aRow) {
$row = [];
$row[] = $aRow['staffid'];
$row[] = $aRow['firstname'].' '.$aRow['lastname'];
$total = 0;
$total2 = 0;
$total3 = 0;
$total7 = 0;
$total8 = 0;
$total9 = 0;
$total10 = 0;
$total11 = 0;
$total12 = 0;
$total13 = 0;
$total14 = 0;
$data_row_attendance = [];
$index = 0;
$total_shift = 0;
foreach ($data_timesheet['staff_row_tk'] as $attendance_row) {
if($attendance_row[$index_hr_code] == $aRow['staffid']){
foreach ($data_timesheet['staff_row_tk_detailt'][$index] as $date => $list_attendance) {
$shift_hour = $this->timesheets_model->get_hour_shift_staff($aRow['staffid'], $date);
if($shift_hour > 0){
$total_shift++;
}
if(($list_attendance != '') && ($shift_hour > 0)){
$list_tks = explode(';', $list_attendance);
foreach ($list_tks as $key_tk => $tk) {
$split_val = explode(':', trim($tk));
if(strtolower($split_val[0])== 'w'){
if(is_numeric($split_val[1]) && $shift_hour > 0){
$cal = $split_val[1]/$shift_hour;
$total+=$cal;
}
}
if(strtolower($split_val[0])== 'al'){
if(is_numeric($split_val[1]) && $shift_hour > 0){
$cal = $split_val[1]/$shift_hour;
$total2+=$cal;
}
}
if(strtolower($split_val[0])== 'p'){
if(is_numeric($split_val[1]) && $shift_hour > 0){
$cal = $split_val[1]/$shift_hour;
$total3+=$cal;
}
}
if(strtolower($split_val[0])== 'b'){
$total7+=1;
}
if(strtolower($split_val[0])== 'si'){
if(is_numeric($split_val[1]) && $shift_hour > 0){
$cal = $split_val[1]/$shift_hour;
$total8+=$cal;
}
}
if(strtolower($split_val[0])== 'm'){
if(is_numeric($split_val[1]) && $shift_hour > 0){
$cal = $split_val[1]/$shift_hour;
$total9+=$cal;
}
}
if(strtolower($split_val[0])== 'u'){
if(is_numeric($split_val[1]) && $shift_hour > 0){
$cal = $split_val[1]/$shift_hour;
$total10+=$cal;
}
}
if(strtolower($split_val[0])== 'ho'){
$total11+= 1;
}
if(strtolower($split_val[0])== 'e'){
if(is_numeric($split_val[1]) && $shift_hour > 0){
$cal = $split_val[1]/$shift_hour;
$total12+=$cal;
}
}
if(strtolower($split_val[0])== 'l'){
if(is_numeric($split_val[1]) && $shift_hour > 0){
$cal = $split_val[1]/$shift_hour;
$total13+=$cal;
}
}
if(strtolower($split_val[0])== 'me'){
if(is_numeric($split_val[1]) && $shift_hour > 0){
$cal = $split_val[1]/$shift_hour;
$total14+=$cal;
}
}
}
}
}
}
$index++;
}
$row[] = $total_shift;
$row[] = ($total > 0) ? (float)number_format($total,2) : 0;
$row[] = ($total2 > 0) ? (float)number_format($total2,2) : 0;
$row[] = ($total3 > 0) ? (float)number_format($total3,2) : 0;
$row[] = ($total7 > 0) ? (float)number_format($total7,2) : 0;
$row[] = ($total8 > 0) ? (float)number_format($total8,2) : 0;
$row[] = ($total9 > 0) ? (float)number_format($total9,2) : 0;
$row[] = ($total10 > 0) ? (float)number_format($total10,2) : 0;
$row[] = ($total11 > 0) ? (float)number_format($total11,2) : 0;
$row[] = ($total12 > 0) ? (float)number_format($total12,2) : 0;
$row[] = ($total13 > 0) ? (float)number_format($total13,2) : 0;
$row[] = ($total14 > 0) ? (float)number_format($total14,2) : 0;
// $total_row = number_format($total - ($total2 + $total3 + $total7 + $total8 + $total9 + $total10 + $total11 + $total12 + $total13 + $total14),2);
// $row[] = $total_row;
$output['aaData'][] = $row;
}
}
echo json_encode($output);
die();
}
}
}
/*mass delete for multiple feature*/
public function timesheets_delete_bulk_action()
{
if (!is_staff_member()) {
ajax_access_denied();
}
$total_deleted = 0;
if ($this->input->post()) {
$ids = $this->input->post('ids');
$rel_type = $this->input->post('rel_type');
/*check permission*/
switch ($rel_type) {
case 'timesheets_requisition':
if (!has_permission('timesheets_manage_requisition', '', 'delete') && !is_admin()) {
access_denied('manage_requisition');
}
break;
default:
# code...
break;
}
/*delete data*/
if ($this->input->post('mass_delete')) {
if (is_array($ids)) {
foreach ($ids as $id) {
switch ($rel_type) {
case 'timesheets_requisition':
if ($this->timesheets_model->delete_requisition($id)) {
$total_deleted++;
break;
}else{
break;
}
default:
# code...
break;
}
}
}
/*return result*/
switch ($rel_type) {
case 'timesheets_requisition':
set_alert('success', _l('total_requisition'). ": " .$total_deleted);
break;
default:
# code...
break;
}
}
}
}
/**
* get rest time
* @return json
*/
public function get_rest_time(){
$data = $this->input->post();
$rest_time = $this->timesheets_model->get_rest_time($data['date']);
echo json_encode($rest_time);
}
/**
* delete additional timesheets
* @param int $id
* @return redirect
*/
public function delete_additional_timesheets($id)
{
$response = $this->timesheets_model->delete_additional_timesheets($id);
if (is_array($response) && isset($response['referenced'])) {
set_alert('warning', _l('is_referenced'));
} elseif ($response == true) {
set_alert('success', _l('deleted'));
} else {
set_alert('warning', _l('problem_deleting'));
}
redirect(admin_url('timesheets/requisition_manage?tab=additional_timesheets'));
}
/**
* table shiftwork
* @return view
*/
public function table_shiftwork()
{
if (!(has_permission('table_shiftwork_management', '', 'view_own') || has_permission('table_shiftwork_management', '', 'view') || is_admin())) {
access_denied('table_shiftwork');
}
$this->load->model('staff_model');
$data['title'] = _l('table_shiftwork');
$data['departments'] = $this->departments_model->get();
$data['staffs'] = $this->staff_model->get();
$data['roles'] = $this->roles_model->get();
$data['job_position'] = $this->roles_model->get();
$data['positions'] = $this->roles_model->get();
$data['shifts'] = $this->timesheets_model->get_shifts();
$date = date('Y-m-01');
$month = date('m', strtotime($date));
$month_year = date('Y', strtotime($date));
$this->load->model('staff_model');
$list_staff_id = [];
if(has_permission('table_shiftwork_management', '', 'view') || is_admin()){
$data_staff_list = $this->staff_model->get('', ['active' => 1]);
foreach ($data_staff_list as $key => $value) {
$list_staff_id[] = $value['staffid'];
}
}
else{
$list_staff_id[] = get_staff_user_id();
}
$data_hs = $this->set_col_tk(1, 31, $month, $month_year, true, $list_staff_id);
$data['day_by_month'] = json_encode($data_hs->day_by_month);
$data['list_data'] = json_encode($data_hs->list_data);
$list_date = $this->timesheets_model->get_list_date($date, date('Y-m-t'));
$data_object = [];
foreach ($list_staff_id as $key => $value) {
$row_data_staff = new stdClass();
$row_data_staff->staffid = $value;
$row_data_staff->staff = get_staff_full_name($value);
$row_data_color = new stdClass();
$row_data_color->staffid = '';
$row_data_color->staff = '';
foreach ($list_date as $kdbm => $day) {
$shift_s = '';
$color = '';
$list_shift = $this->timesheets_model->get_shift_work_staff_by_date($value, $day);
foreach ($list_shift as $ss) {
$data_shift_type = $this->timesheets_model->get_shift_type($ss);
if($data_shift_type){
if($color == ''){
$color = $data_shift_type->color;
}
$start_date = $data_shift_type->time_start_work;
$st_1 = explode(':',$start_date);
$st_time = $st_1[0].'h'.$st_1[1];
$end_date = $data_shift_type->time_end_work;
$e_2 = explode(':',$end_date);
$e_time = $e_2[0].'h'.$e_2[1];
$shift_s .= $data_shift_type->shift_type_name.' ('.$st_time.' - '.$e_time.')'."\n";
}
}
$day_s = date('D d',strtotime($day));
$row_data_staff->$day_s = $shift_s;
$row_data_color->$day_s = $color;
}
$data_object[] = $row_data_staff;
$data_color[] = $row_data_color;
}
$data['data_object'] = $data_object;
$data['data_color'] = $data_color;
$this->load->view('timekeeping/manage_table_shiftwork', $data);
}
/**
* reload shift work byfilter
* @return json
*/
public function reload_shift_work_byfilter(){
$data = $this->input->post();
$year = date('Y',strtotime(to_sql_date('01/'.$data['month'])));
$g_month = date('m',strtotime(to_sql_date('01/'.$data['month'])));
$department = $data['department'];
$role = $data['role'];
$data['month'] = date('m-Y',strtotime(to_sql_date('01/'.$data['month'])));
$data['check_latch_timesheet'] = $this->timesheets_model->check_latch_timesheet($data['month']);
$staff = '';
if(isset($data['staff'])){
$staff = $data['staff'];
}
$staff_querystring='';
$role_querystring = '';
$department_querystring = '';
$month_year_querystring = '';
$month = date('m');
$month_year = date('Y');
$cmonth = date('m');
$cyear = date('Y');
if($year != ''){
$month_new = (string)$g_month;
if(strlen($month_new)==1){
$month_new='0'.$month_new;
}
$month = $month_new;
$month_year = (int)$year;
}
if($department != ''){
$arrdepartment = $this->staff_model->get('', 'staffid in (select '.db_prefix().'staff_departments.staffid from '.db_prefix().'staff_departments where departmentid = '.$department.')');
$temp = '';
foreach ($arrdepartment as $value) {
$temp = $temp.$value['staffid'].',';
}
$temp = rtrim($temp,",");
$department_querystring = 'FIND_IN_SET(staffid, "'.$temp.'")';
}
if($role != ''){
$role_querystring = 'role = "'.$role.'"';
}
if($staff != ''){
$temp = '';
$araylengh = count($staff);
for ($i = 0; $i < $araylengh; $i++) {
$temp = $temp.$staff[$i];
if($i != $araylengh-1){
$temp = $temp.',';
}
}
$staff_querystring = 'FIND_IN_SET(staffid, "'.$temp.'")';
}else{
$staff_querystring = 'FIND_IN_SET(staffid, "'.get_timesheets_option('timekeeping_applicable_object').'")';
}
$arrQuery = array($staff_querystring,$department_querystring, $month_year_querystring, $role_querystring);
$newquerystring = '';
foreach ($arrQuery as $string) {
if($string != ''){
$newquerystring = $newquerystring.$string.' AND ';
}
}
$newquerystring=rtrim($newquerystring,"AND ");
if($newquerystring == ''){
$newquerystring = [];
}
$data['staff_row'] = [];
$shift_staff = [];
if($newquerystring != ''){
$data['day_by_month'] = [];
$data['day_by_month'][] = _l('staff');
$data['set_col'] = [];
$data['set_col'][] = ['data' => _l('staff'), 'type' => 'text'];
$month = $g_month;
$month_year = $year;
for ($d = 1; $d <= 31; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
if (date('m', $time) == $month) {
array_push($data['day_by_month'], date('D d', $time));
array_push($data['set_col'],[ 'data' => date('D d', $time), 'type' => 'text']);
}
}
$data['staffs_setting'] = $this->timesheets_model->getStaff('', $newquerystring);
foreach($data['staffs_setting'] as $ss){
$work_shift['shift_s'] = $this->timesheets_model->get_data_edit_shift_by_staff($ss['staffid']);
$shift_staff = [_l('staff') => $ss['firstname'].' '.$ss['lastname']];
if(isset($work_shift['shift_s'])){
for ($d = 1; $d <= 31; $d++) {
$time = mktime(12, 0, 0, $g_month, $d, $year);
if (date('m', $time) == $g_month) {
if(date('N', $time) == 1){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['monday'] .' - '.$work_shift['shift_s'][1]['monday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['monday'].' - '.$work_shift['shift_s'][3]['monday'];
}elseif(date('N', $time) == 2){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['tuesday'] .' - '.$work_shift['shift_s'][1]['tuesday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['tuesday'].' - '.$work_shift['shift_s'][3]['tuesday'];
}elseif(date('N', $time) == 3){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['wednesday'] .' - '.$work_shift['shift_s'][1]['wednesday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['wednesday'].' - '.$work_shift['shift_s'][3]['wednesday'];
}elseif(date('N', $time) == 4){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['thursday'] .' - '.$work_shift['shift_s'][1]['thursday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['thursday'].' - '.$work_shift['shift_s'][3]['thursday'];
}elseif(date('N', $time) == 5){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['friday'] .' - '.$work_shift['shift_s'][1]['friday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['friday'].' - '.$work_shift['shift_s'][3]['friday'];
}elseif(date('N', $time) == 7){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['sunday'] .' - '.$work_shift['shift_s'][1]['sunday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['sunday'].' - '.$work_shift['shift_s'][3]['sunday'];
}elseif(date('N', $time) == 6 && (date('d', $time)%2) == 1){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['saturday_odd'] .' - '.$work_shift['shift_s'][1]['saturday_odd'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['saturday_odd'].' - '.$work_shift['shift_s'][3]['saturday_odd'];
}elseif(date('N', $time) == 6 && (date('d', $time)%2) == 0){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['saturday_even'] .' - '.$work_shift['shift_s'][1]['saturday_even'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['saturday_even'].' - '.$work_shift['shift_s'][3]['saturday_even'];
}
}
}
}
if($shift_staff != 'null' && $shift_staff !=''){
array_push($data['staff_row'], $shift_staff);
}
}
}
echo json_encode([
'staff_row' => $data['staff_row'],
'day_by_month_n' => $data['day_by_month'],
'set_col_n' => $data['set_col'],
]);
die;
}
/**
* show detail timesheets mem
* @return
*/
public function show_detail_timesheets_mem(){
$data = $this->input->post();
$year = date("Y");
$day = $data['day'];
$month = implode($data['month']);
$member_id = $data['member_id'];
$t = $day.'/'.$month;
$time = strtotime(to_sql_date($t.'/'.date('Y')));
$d = date('Y-m-d', strtotime($year.'-'.$month.'-'.$day));
$title = get_staff_full_name($member_id). ' - '. _d($d);
$work_shift = $this->timesheets_model->get_data_edit_shift_by_staff($member_id);
$data['value'] = explode('; ', $data['value']);
$html = '';
foreach ($data['value'] as $key => $value) {
$value = explode(':', $value);
if(isset($value[1]) && $value[1] > 0 || $value[0] == 'M' || $value[0] == 'HO'){
switch ($value[0]) {
case 'L':
$html .= '<li class="list-group-item justify-content-between">
'._l('p_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_p">'.round($value[1], 2).'</span>
</li>';
break;
case 'W':
$html .= '<li class="list-group-item justify-content-between">
'._l('W_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_w">'.round($value[1], 2).'</span>
</li>';
break;
case 'U':
$html .= '<li class="list-group-item justify-content-between">
'._l('A_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_a">'.round($value[1], 2).'</span>
</li>';
break;
case 'HO':
$html .= '<li class="list-group-item justify-content-between">
'._l('Le_timekeeping').'
</li>';
break;
case 'E':
$html .= '<li class="list-group-item justify-content-between">
'._l('E_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_e">'.round($value[1], 2).'</span>
</li>';
break;
case 'L':
$html .= '<li class="list-group-item justify-content-between">
'._l('L_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_l">'.round($value[1], 2).'</span>
</li>';
break;
case 'B':
$html .= '<li class="list-group-item justify-content-between">
'._l('CT_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_l">'.round($value[1], 2).'</span>
</li>';
break;
case 'OM':
$html .= '<li class="list-group-item justify-content-between">
'._l('OM_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_u">'.round($value[1], 2).'</span>
</li>';
break;
case 'M':
$html .= '<li class="list-group-item justify-content-between">
'._l('TS_timekeeping').'
</li>';
break;
case 'R':
$html .= '<li class="list-group-item justify-content-between">
'._l('R_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_u">'.round($value[1], 2).'</span>
</li>';
break;
case 'P':
$html .= '<li class="list-group-item justify-content-between">
'._l('P_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_u">'.round($value[1], 2).'</span>
</li>';
break;
case 'SI':
$html .= '<li class="list-group-item justify-content-between">
'._l('CD_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_u">'.round($value[1], 2).'</span>
</li>';
break;
case 'CO':
$html .= '<li class="list-group-item justify-content-between">
'._l('CO_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_u">'.round($value[1], 2).'</span>
</li>';
break;
case 'H':
$html .= '<li class="list-group-item justify-content-between">
'._l('H_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_me">'.round($value[1], 2).'</span>
</li>';
break;
case 'OT':
$html .= '<li class="list-group-item justify-content-between">
'._l('OT_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_me">'.round($value[1], 2).'</span>
</li>';
break;
case 'PN':
$html .= '<li class="list-group-item justify-content-between">
'._l('PN_timekeeping').'
<span class="badgetext badge badge-primary badge-pill style_p">'.round($value[1], 2).'</span>
</li>';
break;
}
}
}
$ws_day ='';
$data['staff_sc'] = $this->timesheets_model->get_staff_shift_applicable_object();
$list_staff_sc = [];
foreach ($data['staff_sc'] as $key => $value) {
$list_staff_sc[] = $value['staffid'];
}
if(in_array($member_id, $list_staff_sc)){
$shift = $this->timesheets_model->get_shiftwork_sc_date_and_staff($d, $member_id);
if(isset($shift)){
$work_shift = $this->timesheets_model->get_shift_sc($shift);
$ws_day = '<li class="list-group-item justify-content-between">'._l('work_times').': '.$work_shift->time_start_work.' - '.$work_shift->time_end_work.'</li><li class="list-group-item justify-content-between">'._l('lunch_break').': '.$work_shift->start_lunch_break_time.' - '.$work_shift->end_lunch_break_time.'</li>';
}
}else{
if(date('N', $time) == 1){
$ws_day = '<li class="list-group-item justify-content-between">'._l('work_times').': '.$work_shift[0]['monday'] .' - '.$work_shift[1]['monday'].'</li><li class="list-group-item justify-content-between">'._l('lunch_break').': '.$work_shift[2]['monday'].' - '.$work_shift[3]['monday'].'</li>';
}elseif(date('N', $time) == 2){
$ws_day = '<li class="list-group-item justify-content-between">'._l('work_times').': '.$work_shift[0]['tuesday'] .' - '.$work_shift[1]['tuesday'].'</li><li class="list-group-item justify-content-between">'._l('lunch_break').': '.$work_shift[2]['tuesday'].' - '.$work_shift[3]['tuesday'].'</li>';
}elseif(date('N', $time) == 3){
$ws_day = '<li class="list-group-item justify-content-between">'._l('work_times').': '.$work_shift[0]['wednesday'] .' - '.$work_shift[1]['wednesday'].'</li><li class="list-group-item justify-content-between">'._l('lunch_break').': '.$work_shift[2]['wednesday'].' - '.$work_shift[3]['wednesday'].'</li>';
}elseif(date('N', $time) == 4){
$ws_day = '<li class="list-group-item justify-content-between">'._l('work_times').': '.$work_shift[0]['thursday'] .' - '.$work_shift[1]['thursday'].'</li><li class="list-group-item justify-content-between">'._l('lunch_break').': '.$work_shift[2]['thursday'].' - '.$work_shift[3]['thursday'].'</li>';
}elseif(date('N', $time) == 5){
$ws_day = '<li class="list-group-item justify-content-between">'._l('work_times').': '.$work_shift[0]['friday'] .' - '.$work_shift[1]['friday'].'</li><li class="list-group-item justify-content-between">'._l('lunch_break').': '.$work_shift[2]['friday'].' - '.$work_shift[3]['friday'].'</li>';
}elseif(date('N', $time) == 7){
$ws_day = '<li class="list-group-item justify-content-between">'._l('work_times').': '.$work_shift[0]['sunday'] .' - '.$work_shift[1]['sunday'].'</li><li class="list-group-item justify-content-between">'._l('lunch_break').': '.$work_shift[2]['sunday'].' - '.$work_shift[3]['sunday'].'</li>';
}elseif(date('N', $time) == 6 && (date('d', $time)%2) == 1){
$ws_day = '<li class="list-group-item justify-content-between">'._l('work_times').': '.$work_shift[0]['saturday_odd'] .' - '.$work_shift[1]['saturday_odd'].'</li><li class="list-group-item justify-content-between">'._l('lunch_break').': '.$work_shift[2]['saturday_odd'].' - '.$work_shift[3]['saturday_odd'].'</li>';
}elseif(date('N', $time) == 6 && (date('d', $time)%2) == 0){
$ws_day = '<li class="list-group-item justify-content-between">'._l('work_times').': '.$work_shift[0]['saturday_even'] .' - '.$work_shift[1]['saturday_even'].'</li><li class="list-group-item justify-content-between">'._l('lunch_break').': '.$work_shift[2]['saturday_even'].' - '.$work_shift[3]['saturday_even'].'</li>';
}
}
if($ws_day != ''){
$html .= $ws_day;
}
$access_history_string = '';
$staff_identifi = $this->timesheets_model->get_staff_identifi($member_id);
$access_history = $this->timesheets_model->get_access_history($staff_identifi, $d);
if($access_history){
foreach ($access_history as $key => $value) {
if($value['type'] == 'in'){
$access_history_string .= '<li class="list-group-item"><i class="fa fa-sign-in text-success" aria-hidden="true"></i> '._dt($value['time']).'</li>';
}else{
$access_history_string .= '<li class="list-group-item"><i class="fa fa-sign-out text-danger" aria-hidden="true"></i> '._dt($value['time']).'</li>';
}
}
}
if($access_history_string != ''){
$html .= '<li class="list-group-item justify-content-between"><ul class="list-group">
<li class="list-group-item active">'._l('access_history').'</li>
'.$access_history_string.'
</ul></li>';
}
echo json_encode([
'title' => $title,
'html' => $html,
]);
die();
}
/**
* Calculates the number days off.
*/
public function calculate_number_days_off(){
$data = $this->input->post();
$start_time = $this->timesheets_model->format_date($data['start_time']);
$end_time = $this->timesheets_model->format_date($data['end_time']);
$list_af_date = [];
if($start_time != '' && $end_time != ''){
if($start_time && $end_time){
if(strtotime($start_time) <= strtotime($end_time)){
$list_date = $this->timesheets_model->get_list_date($start_time, $end_time);
foreach ($list_date as $key => $next_start_date) {
$data_work_time = $this->timesheets_model->get_hour_shift_staff($data['staffid'], $next_start_date);
$data_day_off = $this->timesheets_model->get_day_off_staff_by_date($data['staffid'], $next_start_date);
if($data_work_time > 0 && count($data_day_off) == 0){
$list_af_date[] = $next_start_date;
}
}
}
}
}
$count = count($list_af_date);
echo json_encode($count);
}
/**
* table registration leave
*/
public function table_registration_leave_by_staff()
{
$this->app->get_table_data(module_views_path('timesheets', 'table_registration_leave_by_staff'));
}
/**
* [get_data_date_leave description]
* @param [type] $id [description]
* @return [type] [description]
*/
public function get_data_date_leave()
{
$memberid = $this->input->post('memberid');
$year_requisition = $this->input->post('year_requisition');
$list = $this->timesheets_model->get_requisition_number_of_day_off($memberid, $year_requisition);
echo json_encode([
'total_day_off_in_year' => $list['total_day_off_in_year'],
'total_day_off' => $list['total_day_off'],
'total_day_off_allowed_in_year' => $list['total_day_off_allowed_in_year'],
]);
}
/**
* shifts sc
* @return [type] [description]
*/
public function shifts_sc(){
if($this->input->post()){
$data = $this->input->post();
if (!$this->input->post('id')) {
$add = $this->timesheets_model->add_shift_sc($data);
if($add > 0){
$message = _l('added_successfully', _l('shift'));
set_alert('success',$message);
}
redirect(admin_url('timesheets/setting?group=shift'));
}else{
$id = $data['id'];
unset($data['id']);
$success = $this->timesheets_model->update_shift_sc($data,$id);
if($success == true){
$message = _l('updated_successfully', _l('shift'));
set_alert('success', $message);
}
redirect(admin_url('timesheets/setting?group=shift'));
}
}
}
/**
* delete shift sc
* @param int $id
* @return redirect
*/
public function delete_shift_sc($id){
if (!$id) {
redirect(admin_url('timesheets/setting?group=shift'));
}
$response = $this->timesheets_model->delete_shift_sc($id);
if ($response == true) {
set_alert('success', _l('deleted', _l('shift')));
} else {
set_alert('warning', _l('problem_deleting').' '. _l('shift'));
}
redirect(admin_url('timesheets/setting?group=shift'));
}
/**
* setting shift
* @return redirect
*/
public function setting_shift(){
$data = $this->input->post();
$success = $this->timesheets_model->setting_shift($data);
if($success){
set_alert('success',_l('save_setting_success'));
}else{
set_alert('danger',_l('save_setting_fail'));
}
redirect(admin_url('timesheets/setting?group=shift_setting'));
}
/**
* [shiftwork_sc description]
* @return [type] [description]
*/
public function shiftwork_sc(){
$data = $this->input->post();
$success = $this->timesheets_model->update_shiftwork_sc($data);
if($success > 0){
$message = _l('updated_successfully');
set_alert('success', $message);
}
redirect(admin_url('timesheets/timekeeping?group=table_shiftwork_sc'));
}
/**
* reload shiftwork sc by filter
* @return json
*/
public function reload_shiftwork_sc_byfilter(){
$data = $this->input->post();
$year = date('Y',strtotime(to_sql_date('01/'.$data['month'])));
$g_month = date('m',strtotime(to_sql_date('01/'.$data['month'])));
$days_in_month = cal_days_in_month(CAL_GREGORIAN,$g_month,$year);
$month_filter = date('Y-m',strtotime(to_sql_date('01/'.$data['month'])));
$querystring = '(select count(*) from '.db_prefix().'staff_contract where staff = '.db_prefix().'staff.staffid and DATE_FORMAT(start_valid, "%Y-%m") <="'.$month_filter.'" and IF(end_valid != null, DATE_FORMAT(end_valid, "%Y-%m") >="'.$month_filter.'",1=1)) > 0 and status_work="working" and active=1';
$department = $data['department'];
$job_position = $data['job_position'];
$data['month'] = date('m-Y',strtotime(to_sql_date('01/'.$data['month'])));
$staff = '';
if(isset($data['staff'])){
$staff = $data['staff'];
}
$staff_querystring='';
$job_position_querystring = '';
$department_querystring='';
$month_year_querystring='';
$month = date('m');
$month_year = date('Y');
$cmonth = date('m');
$cyear = date('Y');
if($year != ''){
$month_new = (string)$g_month;
if(strlen($month_new)==1){
$month_new='0'.$month_new;
}
$month = $month_new;
$month_year = (int)$year;
}
if($department != ''){
$arrdepartment = $this->staff_model->get('', 'staffid in (select '.db_prefix().'staff_departments.staffid from '.db_prefix().'staff_departments where departmentid = '.$department.')');
$temp = '';
foreach ($arrdepartment as $value) {
$temp = $temp.$value['staffid'].',';
}
$temp = rtrim($temp,",");
$department_querystring = 'FIND_IN_SET(staffid, "'.$temp.'")';
}
if($job_position != ''){
$job_position_querystring = 'job_position = "'.$job_position.'"';
}
if($staff != ''){
$temp = '';
$araylengh = count($staff);
for ($i = 0; $i < $araylengh; $i++) {
$temp = $temp.$staff[$i];
if($i != $araylengh-1){
$temp = $temp.',';
}
}
$staff_querystring = 'FIND_IN_SET(staffid, "'.$temp.'")';
}else{
$staff_querystring = 'FIND_IN_SET(job_position, "'.get_timesheets_option('shift_applicable_object').'")';
}
$arrQuery = array($staff_querystring,$department_querystring, $month_year_querystring, $job_position_querystring, $querystring);
$newquerystring = '';
foreach ($arrQuery as $string) {
if($string != ''){
$newquerystring = $newquerystring.$string.' AND ';
}
}
$newquerystring=rtrim($newquerystring,"AND ");
if($newquerystring == ''){
$newquerystring = [];
}
$data['staff_row_sc'] = [];
$data['days_in_month'] = $days_in_month;
if($newquerystring != ''){
$staffs = $this->timesheets_model->getStaff('', $newquerystring);
$shift_staff = [];
foreach($staffs as $s)
{
$work_shift['shift_s'] = $this->timesheets_model->get_data_edit_shift_by_staff($s['staffid'], $month_year.'-'.$month.'-01');
$shift_staff = ['staffid' => $s['staffid'], _l('staff') => $s['firstname'].' '.$s['lastname']];
if(isset($work_shift['shift_s'])){
for ($d = 1; $d <= $days_in_month; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
$shift_staff[date('d/m D', $time)] = $this->timesheets_model->get_shiftwork_sc_date_and_staff(date('Y-m-d', $time),$s['staffid']);
}
}
array_push($data['staff_row_sc'], $shift_staff);
}
}
$data['set_col_sc'] = [];
$data['shift_sc'] = $this->timesheets_model->get_shift_sc();
$data['select_shift_sc'] = [];
foreach ($data['shift_sc'] as $key => $value) {
$node = [];
$node['id'] = $value['id'];
$node['label'] = $value['shift_symbol'];
$data['select_shift_sc'][] = $node;
}
for ($d = 1; $d <= $days_in_month; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
if (date('m', $time) == $month) {
$data['set_col_sc'][] = date('d/m D', $time);
}
}
$data['set_col_sc'] = $data['set_col_sc'];
$data['day_by_month'] = [];
$data['day_by_month'][] = _l('staff_id');
$data['day_by_month'][] = _l('staff');
for ($d = 1; $d <= 31; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
if (date('m', $time) == $month) {
array_push($data['day_by_month'], date('d/m D', $time));
}
}
$data['day_by_month'] = $data['day_by_month'];
echo json_encode([
'arr' => $data['staff_row_sc'],
'set_col_sc' => $data['set_col_sc'],
'select_shift_sc' => $data['select_shift_sc'],
'month' => $data['month'],
'day_by_month' => $data['day_by_month'],
'days_in_month' => $data['days_in_month'],
]);
die;
}
/**
* cancel request
* @return
*/
public function cancel_request(){
$data = $this->input->post();
$success = false;
$message = '';
$success = $this->timesheets_model->cancel_request($data);
if($success == true){
$message = _l('cancel_successful');
}
else{
$message = _l('cancel_failed');
}
echo json_encode([
'success' => $success,
'message' => $message
]);
die();
}
/**
* add allocate shiftwork
* @param string $id
*/
public function add_allocate_shiftwork($id = '')
{
$this->load->model('staff_model');
$data['additional_timesheets_id'] = $this->input->get('additional_timesheets_id');
$data['group'] = $this->input->get('group');
$data['title'] = _l($data['group']);
$status_leave = $this->timesheets_model->get_option_val();
$data['tab'][] = 'table_shiftwork';
$data['tab'][] = 'allocate_shiftwork';
if($data['group'] == ''){
$data['group'] == 'table_shiftwork';
}
if($data['group'] == 'timesheets'){
$data['check_latch_timesheet'] = $this->timesheets_model->check_latch_timesheet(date('m-Y'));
}
$data['departments'] = $this->departments_model->get();
$data['staffs_li'] = $this->staff_model->get();
$data['roles'] = $this->roles_model->get();
$data['job_position'] = $this->roles_model->get();
$data['positions'] = $this->roles_model->get();
$data['additional_timesheets'] = $this->timesheets_model->get_additional_timesheets();
$data['holiday'] = $this->timesheets_model->get_break_dates('holiday');
$data['event_break'] = $this->timesheets_model->get_break_dates('event_break');
$data['unexpected_break'] = $this->timesheets_model->get_break_dates('unexpected_break');
$data['shifts'] = $this->timesheets_model->get_shifts();
$data['day_by_month'] = [];
$data['day_by_month_tk'] = [];
$data['day_by_month'][] = _l('staff');
$data['day_by_month_tk'][] = _l('staff_id');
$data['day_by_month_tk'][] = _l('hr_code');
$data['day_by_month_tk'][] = _l('staff');
$data['set_col'] = [];
$data['set_col_tk'] = [];
$data['set_col_tk'][] = ['data' => _l('staff_id'), 'type' => 'text'];
$data['set_col_tk'][] = ['data' => _l('hr_code'), 'type' => 'text','readOnly' => true, 'width' => 55];
$data['set_col_tk'][] = ['data' => _l('staff'), 'type' => 'text','readOnly' => true,'width' => 200];
$data['set_col'][] = ['data' => _l('staff'), 'type' => 'text'];
$month = date('m');
$month_year = date('Y');
for ($d = 1; $d <= 31; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
if (date('m', $time) == $month) {
array_push($data['day_by_month_tk'], date('D d', $time));
array_push($data['day_by_month'], date('D d', $time));
array_push($data['set_col'],[ 'data' => date('D d', $time), 'type' => 'text']);
array_push($data['set_col_tk'],[ 'data' => date('D d', $time), 'type' => 'text']);
}
}
$data['day_by_month'] = json_encode($data['day_by_month']);
$data['day_by_month_tk'] = json_encode($data['day_by_month_tk']);
$data['set_col'] = json_encode($data['set_col']);
$data['set_col_tk'] = json_encode($data['set_col_tk']);
$data_ts = $this->timesheets_model->get_timesheets_ts_by_month(date('m'), date('Y'));
$data_map = [];
foreach($data_ts as $ts){
$staff_info = array();
$staff_info['date'] = date('D d', strtotime($ts['date_work']));
$ts_type = $this->timesheets_model->get_ts_by_date_and_staff($ts['date_work'],$ts['staff_id']);
if(count($ts_type) <= 1){
$staff_info['ts'] = $ts['type'].':'.$ts['value'];
}else{
$str = '';
foreach($ts_type as $tp){
if($str == ''){
$str .= $tp['type'].':'.$tp['value'];
}else{
$str .= '-'.$tp['type'].':'.$tp['value'];
}
}
$staff_info['ts'] = $str;
}
if(!isset($data_map[$ts['staff_id']])){
$data_map[$ts['staff_id']] = array();
}
$data_map[$ts['staff_id']][$staff_info['date']] = $staff_info;
}
$data['staff_row_tk'] = [];
$data['staff_row'] = [];
$staffs = $this->timesheets_model->get_staff_timekeeping_applicable_object();
$data['staffs_setting'] = $this->staff_model->get();
$data['staffs'] = $staffs;
$shift_staff = [];
foreach($data['staffs_setting'] as $ss){
$work_shift['shift_s'] = $this->timesheets_model->get_data_edit_shift_by_staff($ss['staffid']);
$shift_staff = [_l('staff') => $ss['firstname'].' '.$ss['lastname']];
if(isset($work_shift['shift_s'])){
if($work_shift['shift_s']){
for ($d = 1; $d <= 31; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
if (date('m', $time) == $month) {
if(date('N', $time) == 1){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['monday'] .' - '.$work_shift['shift_s'][1]['monday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['monday'].' - '.$work_shift['shift_s'][3]['monday'];
}elseif(date('N', $time) == 2){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['tuesday'] .' - '.$work_shift['shift_s'][1]['tuesday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['tuesday'].' - '.$work_shift['shift_s'][3]['tuesday'];
}elseif(date('N', $time) == 3){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['wednesday'] .' - '.$work_shift['shift_s'][1]['wednesday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['wednesday'].' - '.$work_shift['shift_s'][3]['wednesday'];
}elseif(date('N', $time) == 4){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['thursday'] .' - '.$work_shift['shift_s'][1]['thursday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['thursday'].' - '.$work_shift['shift_s'][3]['thursday'];
}elseif(date('N', $time) == 5){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['friday'] .' - '.$work_shift['shift_s'][1]['friday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['friday'].' - '.$work_shift['shift_s'][3]['friday'];
}elseif(date('N', $time) == 7){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['sunday'] .' - '.$work_shift['shift_s'][1]['sunday'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['sunday'].' - '.$work_shift['shift_s'][3]['sunday'];
}elseif(date('N', $time) == 6 && (date('d', $time)%2) == 1){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['saturday_odd'] .' - '.$work_shift['shift_s'][1]['saturday_odd'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['saturday_odd'].' - '.$work_shift['shift_s'][3]['saturday_odd'];
}elseif(date('N', $time) == 6 && (date('d', $time)%2) == 0){
$shift_staff[date('D d', $time)] = _l('time_working').': '.$work_shift['shift_s'][0]['saturday_even'] .' - '.$work_shift['shift_s'][1]['saturday_even'].' '._l('time_lunch').': '.$work_shift['shift_s'][2]['saturday_even'].' - '.$work_shift['shift_s'][3]['saturday_even'];
}
}
}
}
}
array_push($data['staff_row'], $shift_staff);
}
foreach($staffs as $s){
$ts_date = '';
$ts_ts = '';
$result_tb = [];
if(isset($data_map[$s['staffid']])){
foreach ($data_map[$s['staffid']] as $key => $value) {
$ts_date = $data_map[$s['staffid']][$key]['date'];
$ts_ts = $data_map[$s['staffid']][$key]['ts'];
$result_tb[] = [$ts_date => $ts_ts];
}
}
$dt_ts = [];
$dt_ts = [_l('staff_id') => $s['staffid'],_l('hr_code') => $s['staff_identifi'],_l('staff') => $s['firstname'].' '.$s['lastname']];
foreach ($result_tb as $key => $rs) {
foreach ($rs as $day => $val) {
$dt_ts[$day] = $val;
}
}
array_push($data['staff_row_tk'], $dt_ts);
}
$data['tabs']['view'] = 'timekeeping/'.$data['group'];
$this->load->view('timekeeping/add_allocate_shiftwork', $data);
}
/**
* get date leave
* @return date
*/
public function get_date_leave(){
$data = $this->input->post();
$staffid = $data['staffid'];
$number_of_days = $data['number_of_days'];
$start_date = date('Y-m-d');
if(!$this->timesheets_model->check_format_date_ymd($data['startdate'])){
$start_date = to_sql_date($data['startdate']);
}else{
$start_date = $data['startdate'];
}
$ceiling_number_of_days = ceil($number_of_days);
$list_date = [];
$i = 0;
while(count($list_date) != $ceiling_number_of_days) {
$next_start_date = date('Y-m-d', strtotime($start_date .' +'.$i.' day'));
$data_work_time = $this->timesheets_model->get_hour_shift_staff($staffid, $next_start_date);
$data_day_off = $this->timesheets_model->get_day_off_staff_by_date($staffid, $next_start_date);
if($data_work_time > 0 && count($data_day_off) == 0){
$list_date[] = $next_start_date;
}
$i++;
if($i > 100){
break;
}
}
$end_date = ($list_date[count($list_date) - 1]);
echo json_encode([
'end_date' => _d($end_date)
]);
die;
}
/**
* table shift type
* @return json
*/
public function table_shift_type(){
if ($this->input->is_ajax_request()) {
if($this->input->post()){
$select = [
'id',
'shift_type_name',
'description',
'id'
];
$where = [];
$aColumns = $select;
$sIndexColumn = 'id';
$sTable = db_prefix() . 'shift_type';
$join = [];
$result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [
'id',
'shift_type_name',
'color',
'time_start',
'time_end',
'time_start_work',
'time_end_work',
'start_lunch_break_time',
'end_lunch_break_time',
'description',
]);
$output = $result['output'];
$rResult = $result['rResult'];
foreach ($rResult as $aRow) {
$row = [];
$row[] = $aRow['id'];
$row[] = $aRow['shift_type_name'];
$row[] = $aRow['description'];
$option = '';
if (has_permission('table_shiftwork_management', '', 'view') || is_admin()){
$option .= '<a href="#" class="btn btn-default btn-icon" onclick="edit_shift_type(this); return false;" data-id="'.$aRow['id'].'" data-shift_type_name="'.$aRow['shift_type_name'].'" data-color="'.$aRow['color'].'" data-time_start="'.$aRow['time_start'].'" data-time_end="'.$aRow['time_end'].'" data-time_start_work="'.$aRow['time_start_work'].'" data-time_end_work="'.$aRow['time_end_work'].'" data-start_lunch_break_time="'.$aRow['start_lunch_break_time'].'" data-end_lunch_break_time="'.$aRow['end_lunch_break_time'].'" data-description="'.$aRow['description'].'" >';
$option .= '<i class="fa fa-edit"></i>';
$option .= '</a>';
$option .= '<a href="' . admin_url('timesheets/delete_shift_type/' . $aRow['id']) . '" class="btn btn-danger btn-icon _delete">';
$option .= '<i class="fa fa-remove"></i>';
$option .= '</a>';
}
$row[] = $option;
$output['aaData'][] = $row;
}
echo json_encode($output);
die();
}
}
}
public function manage_shift_type(){
if (!(has_permission('table_shiftwork_management', '', 'view_own') || has_permission('table_shiftwork_management', '', 'view') || is_admin())) {
access_denied('timekeeping');
}
$data['title'] = _l('manage_shift_type');
if($this->input->post()){
$data = $this->input->post();
$data['datecreated'] = date('Y-m-d');
$data['add_from'] = get_staff_user_id();
$message = '';
if($data['id'] == ''){
$result = $this->timesheets_model->add_shift_type($data);
if($result > 0){
$message = _l('added_successfully');
}
}
else{
$success = $this->timesheets_model->update_shift_type($data);
if($success == true){
$message = _l('updated_successfully');
}
}
set_alert('success', $message);
redirect(admin_url('timesheets/manage_shift_type'));
}
$this->load->view('manage_shift_type', $data);
}
public function shift_management(){
if (!(has_permission('table_shiftwork_management', '', 'view_own') || has_permission('table_shiftwork_management', '', 'view') || is_admin())) {
access_denied('timekeeping');
}
$data['title'] = _l('shift_management');
$this->load->view('shift_management', $data);
}
public function set_col_tk($from_day, $to_day, $month, $month_year, $absolute_type = true, $stafflist = '', $work_shift_id = ''){
$list_data = [];
$data_day_by_month = [];
$data_time = [];
$data_day_by_month_tk = [];
$data_set_col = [];
$data_set_col_tk = [];
$data_object = [];
$data_shift_type = $this->timesheets_model->get_shift_type();
$new_list_shift = [];
if($absolute_type == true){
if($stafflist){
array_push($data_day_by_month, 'staffid');
array_push($data_day_by_month, _l('staff'));
array_push($list_data,[
'data' => 'staffid', 'type' => 'text','readOnly' => true
]);
array_push($list_data,[
'data' => 'staff', 'type' => 'text','readOnly' => true
]);
}
for ($d = $from_day; $d <= $to_day; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
if (date('m', $time) == $month) {
array_push($data_time, $time);
array_push($data_day_by_month_tk, date('D d', $time));
array_push($data_day_by_month, date('D d', $time));
array_push($data_set_col,[ 'data' => date('D d', $time), 'type' => 'text']);
array_push($data_set_col_tk,[ 'data' => date('D d', $time), 'type' => 'text']);
array_push($data_set_col_tk,[ 'data' => date('D d', $time), 'type' => 'text']);
array_push($list_data,[
'data' => date('D d', $time),
'editor' => "chosen",
'chosenOptions' => [
'data' => $new_list_shift
]
]);
}
}
if($stafflist){
$this->load->model('staff_model');
foreach ($stafflist as $key => $value) {
$data_staff = $this->staff_model->get($value);
$staff_id = $data_staff->staffid;
$staff_name = $data_staff->firstname.' '.$data_staff->lastname;
$data_shift_staff = [];
$row_data_staff = new stdClass();
$row_data_staff->staffid = $staff_id;
$row_data_staff->staff = $staff_name;
foreach ($data_time as $k => $time) {
$times = date('D d', $time);
$date_s = date('Y-m-d', $time);
$row_data_staff->$times = $this->timesheets_model->get_id_shift_type_by_date_and_master_id($staff_id, $date_s, $work_shift_id);
}
$data_object[] = $row_data_staff;
}
}
else{
$row_data_staff = new stdClass();
foreach ($data_time as $k => $time) {
$times = date('D d', $time);
$date_s = date('Y-m-d', $time);
$id_shift_type = '';
$staff_id = '';
$first_staff = $this->timesheets_model->get_first_staff_work_shift($work_shift_id);
if($first_staff){
$staff_id = $first_staff->staff_id;
}
$data_s = $this->timesheets_model->get_id_shift_type_by_date_and_master_id($staff_id, $date_s, $work_shift_id);
$row_data_staff->$times = $data_s;
}
$data_object[] = $row_data_staff;
}
}
else{
$day_list = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
if($stafflist){
array_push($data_day_by_month, 'staffid');
array_push($data_day_by_month, _l('staff'));
array_push($list_data,[
'data' => 'staffid', 'type' => 'text','readOnly' => true
]);
array_push($list_data,[
'data' => 'staff', 'type' => 'text','readOnly' => true
]);
}
foreach ($day_list as $key => $value) {
array_push($data_day_by_month_tk, $value);
array_push($data_day_by_month, $value);
array_push($data_set_col,[ 'data' => $value, 'type' => 'text']);
array_push($data_set_col_tk,[ 'data' => $value, 'type' => 'text']);
array_push($list_data,[
'data' => $value,
'editor' => "chosen",
'chosenOptions' => [
'data' => $new_list_shift
]
]);
}
if($stafflist){
$this->load->model('staff_model');
foreach ($stafflist as $key => $value) {
$data_staff = $this->staff_model->get($value);
$staff_id = $data_staff->staffid;
$staff_name = $data_staff->firstname.' '.$data_staff->lastname;
$data_shift_staff = [];
$row_data_staff = new stdClass();
$row_data_staff->staffid = $staff_id;
$row_data_staff->staff = $staff_name;
for($i = 1; $i <= 7; $i++){
$shift_type_id = '';
$data_shift_type = $this->timesheets_model->get_shift_type_id_by_number_day($work_shift_id, $i, $staff_id);
if($data_shift_type){
$shift_type_id = $data_shift_type->shift_id;
}
$day_name = $day_list[$i-1];
$row_data_staff->$day_name = $shift_type_id;
}
$data_object[] = $row_data_staff;
}
}
else{
$row_data_staff = new stdClass();
for($i = 1; $i <= 7; $i++){
$shift_type_id = '';
$data_shift_type = $this->timesheets_model->get_shift_type_id_by_number_day($work_shift_id, $i);
if($data_shift_type){
$shift_type_id = $data_shift_type->shift_id;
}
$day_name = $day_list[$i-1];
$row_data_staff->$day_name = $shift_type_id;
}
$data_object[] = $row_data_staff;
}
}
$obj = new stdClass();
$obj->day_by_month = $data_day_by_month;
$obj->day_by_month_tk = $data_day_by_month_tk;
$obj->set_col = $data_set_col;
$obj->set_col_tk = $data_set_col_tk;
$obj->list_data = $list_data;
$obj->data_object = $data_object;
return $obj;
}
/**
* add allocation shiftwork
* @param integer $id
* @param view
*/
public function add_allocation_shiftwork($id = ''){
$data['title'] = _l('new_shift');
$data['departments'] = $this->departments_model->get();
$data['staffs'] = $this->staff_model->get();
$data['roles'] = $this->roles_model->get();
$month = date('m');
$month_year = date('Y');
$data_hs = $this->set_col_tk(1,8, $month, $month_year,false);
$data['head_data'] = $data_hs->day_by_month;
$data['list_data'] = $data_hs->list_data;
$data['data_object'] = $data_hs->data_object;
$data_shift_type = $this->timesheets_model->get_shift_type();
$new_list_shift = [];
foreach ($data_shift_type as $key => $value) {
$start_date = $value['time_start_work'];
$st_1 = explode(':',$start_date);
$st_time = $st_1[0].'h'.$st_1[1];
$end_date = $value['time_end_work'];
$e_2 = explode(':',$end_date);
$e_time = $e_2[0].'h'.$e_2[1];
array_push($new_list_shift, array('id' => $value['id'],
'label' => $value['shift_type_name'].' ('.$st_time.' - '.$e_time.')'
));
}
if($id != ''){
$data['word_shift'] = $this->timesheets_model->get_workshiftms($id);
$month = date('m');
$month_year = date('Y');
$department = $data['word_shift']->department;
$role = $data['word_shift']->position;
if($data['word_shift']->staff!=''){
$staff = explode(',',$data['word_shift']->staff);
}
else{
$staff = '';
}
$from_date = $data['word_shift']->from_date;
$to_date = $data['word_shift']->to_date;
// $type_shiftwork = $this->input->post('type_shiftwork');
if($data['word_shift']->type_shiftwork == 'repeat_periodically'){
$data_hs = $this->set_col_tk(1,8, $month, $month_year,false,$staff, $id);
$data['head_data'] = $data_hs->day_by_month;
$data['list_data'] = $data_hs->list_data;
$data['data_object'] = $data_hs->data_object;
}
if($data['word_shift']->type_shiftwork == 'by_absolute_time'){
$start_month = 1;
$end_month = 31;
if($from_date){
$temp = explode('-', $from_date);
$start_month = $temp[2];
$month = $temp[1];
$month_year = $temp[0];
}
if($to_date){
$temp = explode('-', $to_date);
$end_month = $temp[2];
$month = $temp[1];
$month_year = $temp[0];
}
$data_hs = $this->set_col_tk($start_month, $end_month, $month, $month_year,true,$staff, $id);
$data['head_data'] = $data_hs->day_by_month;
$data['list_data'] = $data_hs->list_data;
$data['data_object'] = $data_hs->data_object;
}
$data['title'] = _l('edit_shift');
}
$data['shift_type'] = $new_list_shift;
$this->load->view('timekeeping/add_allocate_shiftwork', $data);
}
public function delete_shift_type($id){
if($id != ''){
$message = '';
$result = $this->timesheets_model->delete_shift_type($id);
if($result == true){
$message = _l('deleted');
}
else{
$message = _l('problem_deleting');
}
set_alert('success', $message);
redirect(admin_url('timesheets/manage_shift_type'));
}
}
/**
* get hanson shiftwork
* @return json
*/
function get_hanson_shiftwork(){
$month = date('m');
$month_year = date('Y');
$department = $this->input->post('department');
$role = $this->input->post('role');
$staff = $this->input->post('staff');
$from_date = $this->input->post('from_date');
$to_date = $this->input->post('to_date');
$type_shiftwork = $this->input->post('type_shiftwork');
if($type_shiftwork == 'repeat_periodically'){
$data_hs = $this->set_col_tk(1,8, $month, $month_year,false,$staff);
echo json_encode([
'head_data' => $data_hs->day_by_month,
'list_data' => $data_hs->list_data,
'data_object' => $data_hs->data_object
]);
}
if($type_shiftwork == 'by_absolute_time'){
$start_day = 1;
$end_day = 31;
if(!$this->timesheets_model->check_format_date_ymd($from_date)){
$from_date = to_sql_date($from_date);
}
if(!$this->timesheets_model->check_format_date_ymd($to_date)){
$to_date = to_sql_date($to_date);
}
if($from_date){
$temp = explode('-', $from_date);
$start_day = $temp[2];
$month = $temp[1];
$month_year = $temp[0];
}
if($to_date){
$temp = explode('-', $to_date);
$end_day = $temp[2];
}
$data_hs = $this->set_col_tk($start_day, $end_day, $month, $month_year,true,$staff);
echo json_encode([
'head_data' => $data_hs->day_by_month,
'list_data' => $data_hs->list_data,
'data_object' => $data_hs->data_object
]);
}
die;
}
function get_custom_type_shiftwork(){
$department = $this->input->post('department');
$role = $this->input->post('role');
$staff = $this->input->post('staff');
}
/**
* shift table
* @return json
*/
function shift_table(){
if ($this->input->is_ajax_request()) {
if($this->input->post()){
$this->load->model('departments_model');
$this->load->model('roles_model');
$query = '';
$select = [
'from_date',
'to_date',
'department',
'position',
'staff',
'date_create',
'add_from'
];
$where = [(($query!='')?' where '.rtrim($query,' and '):'')];
$aColumns = $select;
$sIndexColumn = 'id';
$sTable = db_prefix() . 'work_shift';
$join = [];
$result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [
'id',
'shift_code',
'shift_name',
'shift_type',
'department',
'position',
'staff',
'add_from',
'date_create',
'from_date',
'to_date',
]);
$output = $result['output'];
$rResult = $result['rResult'];
foreach ($rResult as $aRow) {
$row = [];
$row[] = _d($aRow['from_date']);
$row[] = _d($aRow['to_date']);
$department_name = '';
if($aRow['department']!=0 && $aRow['department']!=''){
$departmentid = explode(',', $aRow['department']);
foreach ($departmentid as $key => $value) {
$data_department = $this->departments_model->get($value);
if($data_department){
$department_name .= $data_department->name.', ';
}
}
}
if($department_name!=''){
$department_name = rtrim($department_name,', ');
}
$position_name = '';
if($aRow['position'] != 0 && $aRow['position']!=''){
$positionid = explode(',', $aRow['position']);
foreach ($positionid as $key => $value) {
$data_position = $this->roles_model->get($value);
if($data_position){
$position_name .= $data_position->name.', ';
}
}
}
if($position_name!=''){
$position_name = rtrim($position_name,', ');
}
$staff_name = '';
if($aRow['staff'] != 0 && $aRow['staff']!=''){
$staffid = explode(',', $aRow['staff']);
foreach ($staffid as $key => $value) {
$staff_name .= get_staff_full_name($value).', ';
}
}
if($staff_name!=''){
$staff_name = rtrim($staff_name,', ');
}
if($department_name != ''){
$row[] = $department_name;
}else{
$row[] = _l('all');
}
if($position_name != ''){
$row[] = $position_name;
}else{
$row[] = _l('all');
}
if($staff_name != ''){
$row[] = $staff_name;
}else{
$row[] = _l('all');
}
$row[] = _d($aRow['date_create']);
$option = '';
if (has_permission('table_shiftwork_management', '', 'view') || is_admin()){
$option .= '<a href="' . admin_url('timesheets/add_allocation_shiftwork/' . $aRow['id']) . '" class="btn btn-default btn-icon">';
$option .= '<i class="fa fa-pencil-square-o"></i>';
$option .= '</a>';
$option .= '<a href="' . admin_url('timesheets/delete_shift/' . $aRow['id']) . '" class="btn btn-danger btn-icon _delete">';
$option .= '<i class="fa fa-remove"></i>';
$option .= '</a>';
}
$row[] = $option;
$output['aaData'][] = $row;
}
echo json_encode($output);
die();
}
}
}
/**
* check in timesheet
*/
public function check_in_ts(){
if($this->input->post()){
$data = $this->input->post();
$type = $data['type_check'];
$re = $this->timesheets_model->check_in($data);
if(is_numeric($re)){
if($re == 2){
set_alert('warning',_l('your_current_location_is_not_allowed_to_take_attendance'));
}
if($re == 3){
set_alert('warning',_l('location_information_is_unknown'));
}
if($re == 4){
set_alert('warning',_l('route_point_is_unknown'));
}
}
else{
if($re == true){
if($type == 1){
set_alert('success',_l('check_in_successfull'));
}
else{
set_alert('success',_l('check_out_successfull'));
}
}
else{
if($type == 1){
set_alert('warning',_l('check_in_not_successfull'));
}
else{
set_alert('warning',_l('check_out_not_successfull'));
}
}
}
redirect(admin_url('timesheets/timekeeping?group=timesheets'));
}
}
/**
* get leave setting
* @return json
*/
public function get_leave_setting(){
$new_array_obj = [];
$data = $this->input->post();
$staffid = isset($data['staffid']) ? $data['staffid'] : '';
$departmentid = isset($data['departmentid']) ? $data['departmentid'] : '';
$roleid = isset($data['roleid']) ? $data['roleid'] : '';
$query = '';
if($staffid != ''){
$list = implode(',', $staffid);
$query .= ' staffid in ('.$list.') and';
}
if($departmentid != ''){
$list = implode(',', $departmentid);
$query .= ' staffid in (SELECT staffid FROM '.db_prefix().'staff_departments where departmentid in ('.$list.')) and';
}
if($roleid != ''){
$list = implode(',', $roleid);
$query .= ' role in ('.$list.') and';
}
$query = rtrim($query, ' and');
$data_staff = $this->timesheets_model->get_staff_query($query);
foreach ($data_staff as $key => $value) {
$department_name = '';
$data_department = $this->departments_model->get_staff_departments($value['staffid']);
if($data_department){
$department_name = $data_department[0]['name'];
}
$role_name = '';
if($value['role']!=''){
$data_role = $this->timesheets_model->get_role($value['role']);
if(isset($data_role)){
if($data_role){
if(isset($data_role->name)){
$role_name = $data_role->name;
}
}
}
}
$day = 0;
$data_leave = $this->timesheets_model->get_day_off($value['staffid']);
if($data_leave){
if($data_leave->total != ''){
$day = $data_leave->total;
}
}
array_push($new_array_obj, array('staffid' => $value['staffid'], 'staff'=> $value['firstname'].' '.$value['lastname'], 'department' => $department_name, 'role' => $role_name,'maximum_leave_of_the_year' => $day));
}
echo json_encode([
'data' => $new_array_obj
]);
}
/**
* requisition report
* @return
*/
public function requisition_report(){
if ($this->input->is_ajax_request()) {
if($this->input->post()){
$months_report = $this->input->post('months_filter');
$position_filter = $this->input->post('role_filter');
$department_filter = $this->input->post('department_filter');
$rel_type = $this->input->post('rel_type');
$staff_filter = $this->input->post('staff_filter');
if($months_report == 'this_month'){
$from_date = date('Y-m-01');
$to_date = date('Y-m-t');
}//thang nay
if($months_report == '1'){
$from_date = date('Y-m-01', strtotime('first day of last month'));
$to_date = date('Y-m-t', strtotime('last day of last month'));
}//Trang truoc
if($months_report == 'this_year'){
$from_date = date('Y-m-d', strtotime(date('Y-01-01')));
$to_date = date('Y-m-d', strtotime(date('Y-12-31')));
}//nam nay
if($months_report == 'last_year'){
$from_date = date('Y-m-d', strtotime(date(date('Y', strtotime('last year')) . '-01-01')));
$to_date = date('Y-m-d', strtotime(date(date('Y', strtotime('last year')) . '-12-31')));
}//năm truoc
if($months_report == '3'){
$months_report--;
$from_date = date('Y-m-01', strtotime("-$months_report MONTH"));
$to_date = date('Y-m-t');
}//3 thang qua
if($months_report == '6'){
$months_report--;
$from_date = date('Y-m-01', strtotime("-$months_report MONTH"));
$to_date = date('Y-m-t');
}//6 thang qua
if($months_report == '12'){
$months_report--;
$from_date = date('Y-m-01', strtotime("-$months_report MONTH"));
$to_date = date('Y-m-t');
}//12 thang qua
if($months_report == 'custom'){
$from_date = to_sql_date($this->input->post('report_from'));
$to_date = to_sql_date($this->input->post('report_to'));
}//12 thang qua
$select = [
'staff_id',
'subject',
'start_time',
'end_time',
'number_of_leaving_day',
'reason',
'rel_type',
];
$query = '';
if(has_permission('report_management', '', 'view') || is_admin()){
if(isset($staff_filter)){
$staffid_list = implode(',', $staff_filter);
$query .= ' staff_id in ('.$staffid_list.') and';
}
}
else{
$query .= ' staff_id = '.get_staff_user_id().' and';
}
if(isset($department_filter)){
$department_list = implode(',', $department_filter);
$query .= ' staff_id in (SELECT staffid FROM '.db_prefix().'staff_departments where departmentid in ('.$department_list.')) and';
}
if(isset($months_report)){
if($months_report != ''){
$query .= ' date_format(start_time, "%Y-%m-%d") >= "'.$from_date.'" AND date_format(end_time, "%Y-%m-%d") <= "'.$to_date.'" and';
}
}
if(isset($rel_type)){
$rel_type = implode(',', $rel_type);
$query .= ' rel_type in ('.$rel_type.') and';
}
$total_query = '';
if(($query)&&($query != '')){
$total_query = rtrim($query, ' and');
$total_query = ' where '.$total_query;
}
$where = [$total_query];
$aColumns = $select;
$sIndexColumn = 'id';
$sTable = db_prefix() . 'timesheets_requisition_leave';
$join = [];
/*get requisition approval*/
$where_status = ' AND status = "1"';
array_push($where, $where_status);
if(isset($position_filter)){
$position_list = implode(',', $position_filter);
$where[] = 'and '.db_prefix().'timesheets_requisition_leave.staff_id IN (SELECT staffid FROM '.db_prefix().'staff where role IN ('.$position_list.'))';
}
$result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [
'id',
'subject',
'start_time',
'end_time',
'reason',
'number_of_leaving_day',
'rel_type',
]);
$output = $result['output'];
$rResult = $result['rResult'];
foreach ($rResult as $aRow) {
$row = [];
$row[] = $aRow['staff_id'];
$row[] = '<a data-toggle="tooltip" data-title="' .get_staff_full_name($aRow['staff_id']) . '" href="' . admin_url('profile/' . $aRow['staff_id']) . '">' . staff_profile_image($aRow['staff_id'], [
'staff-profile-image-small',
]) . ' ' . get_staff_full_name($aRow['staff_id']) . '</a><span class="hide">' . get_staff_full_name($aRow['staff_id']) . '</span>';
$row[] = $aRow['subject'];
$row[] = _d($aRow['start_time']);
$row[] = _d($aRow['end_time']);
$row[] = $aRow['number_of_leaving_day'];
$row[] = $aRow['reason'];
if($aRow['rel_type'] == 1){
$row[] = '<p>'. _l('Leave') .'</p>';
}else if($aRow['rel_type'] == 2 ){
$row[] = '<p>'. _l('late') .'</p>';
}else if($aRow['rel_type'] == 3 ){
$row[] = '<p>'. _l('Go_out') .'</p>';
}else if($aRow['rel_type'] == 4 ){
$row[] = '<p>'. _l('Go_on_bussiness') .'</p>';
}else if($aRow['rel_type'] == 5 ){
$row[] = '<p>'. _l('quit_job') .'</p>';
}else{
$row[] = '<p>'. _l('early') .'</p>';
}
$output['aaData'][] = $row;
}
echo json_encode($output);
die();
}
}
}
/**
* import timesheets
* @return
*/
public function import_timesheets(){
if(!class_exists('XLSXReader_fin')){
require_once(module_dir_path(TIMESHEETS_MODULE_NAME).'/assets/plugins/XLSXReader/XLSXReader.php');
}
require_once(module_dir_path(TIMESHEETS_MODULE_NAME).'/assets/plugins/XLSXWriter/xlsxwriter.class.php');
$total_row_false = 0;
$total_rows = 0;
$dataerror = 0;
$total_row_success = 0;
if (isset($_FILES['file_timesheets']['name']) && $_FILES['file_timesheets']['name'] != '') {
// Get the temp file path
$tmpFilePath = $_FILES['file_timesheets']['tmp_name'];
// Make sure we have a filepath
if (!empty($tmpFilePath) && $tmpFilePath != '') {
$rows = [];
// Setup our new file path
$newFilePath = $tmpDir . $_FILES['file_timesheets']['name'];
if (move_uploaded_file($tmpFilePath, $newFilePath)) {
$xlsx = new XLSXReader_fin($newFilePath);
$sheetNames = $xlsx->getSheetNames();
$data = $xlsx->getSheetData($sheetNames[1]);
for ($row = 1; $row < count($data); $row++) {
$flag = 0;
$rd = [];
$rd['staffid'] = isset($data[$row][0]) ? $data[$row][0] : '' ;
$rd['time_in'] = isset($data[$row][1]) ? $data[$row][1] : '';
$rd['time_out'] = isset($data[$row][2]) ? $data[$row][2] : '';
if($rd['staffid'] == '' && $rd['time_in'] == '' && $rd['time_out'] == ''){
$flag = 1;
}
if($flag == 0){
$rows[] = $rd;
}
}
$this->timesheets_model->import_timesheets($rows);
set_alert('success',_l('import_timesheets'));
}
} else {
set_alert('warning', _l('import_upload_failed'));
}
}
redirect(admin_url('timesheets/timekeeping'));
}
/**
* Sets the leave.
*/
public function set_leave(){
if($this->input->post()){
$data = $this->input->post();
$success = $this->timesheets_model->set_leave($data);
if($success > 0){
$message = _l('updated_successfully', _l('setting'));
set_alert('success', $message);
}
redirect(admin_url('timesheets/setting?group=manage_leave'));
}
}
/**
* send notifi handover recipients
* @return
*/
public function send_notifi_handover_recipients()
{
if ($this->input->is_ajax_request()) {
$data = $this->input->post();
if((isset($data)) && $data != ''){
$this->timesheets_model->send_notifi_handover_recipients($data);
$success = 'success';
echo json_encode([
'success' => $success,
]);
}
}
}
/**
* send notification recipient
* @return [type] [description]
*/
public function send_notification_recipient()
{
if ($this->input->is_ajax_request()) {
$data = $this->input->post();
if((isset($data)) && $data != ''){
$this->timesheets_model->send_notification_recipient($data);
$success = 'success';
echo json_encode([
'success' => $success,
]);
}
}
}
/**
* delete timesheets attachment file
* @param int $attachment_id
* @return
*/
public function delete_timesheets_attachment_file($attachment_id)
{
$file = $this->misc_model->get_file($attachment_id);
echo json_encode([
'success' => $this->timesheets_model->delete_timesheets_attachment_file($attachment_id),
]);
}
/**
* reload shiftwork byfilter
* @return json
*/
public function reload_shiftwork_byfilter(){
$data = $this->input->post();
$query = "";
if(isset($data["staff"])){
if($data["staff"] != ''){
$list_id = implode(',', $data["staff"]);
$query .= 'FIND_IN_SET(staffid, "'.$list_id.'") and ';
}
}
if(isset($data["department"])){
if($data["department"] != ''){
$query .= 'staffid in (select '.db_prefix().'staff_departments.staffid from '.db_prefix().'staff_departments where departmentid = '.$data["department"].') and ';
}
}
if(isset($data["role"])){
if($data["role"] != ''){
$query .= 'role = "'.$data["role"].'" and ';
}
}
if($query != ''){
$query = rtrim($query, ' and ');
}
$date = $data['month'].'-01';
$month = date('m', strtotime($date));
$month_year = date('Y', strtotime($date));
$this->load->model('staff_model');
$list_staff_id = [];
if(is_admin()){
$data_staff_list = $this->timesheets_model->get_staff_list($query != '' ? $query = 'where '.$query : '');
foreach ($data_staff_list as $key => $value) {
$list_staff_id[] = $value['staffid'];
}
}
else{
$list_staff_id[] = get_staff_user_id();
}
$data_hs = $this->set_col_tk(1, 31, $month, $month_year, true, $list_staff_id);
$data['day_by_month'] = $data_hs->day_by_month;
$data['list_data'] = $data_hs->list_data;
$list_date = $this->timesheets_model->get_list_date($date, date('Y-m-t', strtotime($date)));
$data_object = [];
foreach ($list_staff_id as $key => $value) {
$row_data_staff = new stdClass();
$row_data_staff->staffid = $value;
$row_data_staff->staff = get_staff_full_name($value);
$row_data_color = new stdClass();
$row_data_color->staffid = '';
$row_data_color->staff = '';
foreach ($list_date as $kdbm => $day) {
$shift_s = '';
$color = '';
$list_shift = $this->timesheets_model->get_shift_work_staff_by_date($value, $day);
foreach ($list_shift as $ss) {
$data_shift_type = $this->timesheets_model->get_shift_type($ss);
if($data_shift_type){
if($color == ''){
$color = $data_shift_type->color;
}
$start_date = $data_shift_type->time_start_work;
$st_1 = explode(':',$start_date);
$st_time = $st_1[0].'h'.$st_1[1];
$end_date = $data_shift_type->time_end_work;
$e_2 = explode(':',$end_date);
$e_time = $e_2[0].'h'.$e_2[1];
$shift_s .= $data_shift_type->shift_type_name.' ('.$st_time.' - '.$e_time.')'."\n";
}
}
$day_s = date('D d',strtotime($day));
$row_data_staff->$day_s = $shift_s;
$row_data_color->$day_s = $color;
}
$data_object[] = $row_data_staff;
$data_color[] = $row_data_color;
}
$data['data_object'] = $data_object;
$data['data_color'] = $data_color;
echo json_encode([
'data_object' => $data_object,
'data_color' => $data_color,
'day_by_month' => $data['day_by_month'],
'list_data' => $data['list_data']
]);
die;
}
/**
* advance payment go on bussiness update
*/
public function advance_payment_update(){
if($this->input->post()){
$this->load->model('expenses_model');
$data = $this->input->post();
$id = $data['id'];
unset($data['id']);
$id_expense = '';
if (!has_permission('expenses', '', 'create')) {
set_alert('danger', _l('access_denied'));
redirect(admin_url('timesheets/requisition_detail/'.$id));
}
else{
if($data['amount_received'] != '' && $data['received_date'] != ''){
$data_payment['amount_received'] = $data['amount_received'];
$data_payment['received_date'] = $data['received_date'];
unset($data['amount_received']);
unset($data['received_date']);
$success = $this->timesheets_model->advance_payment_update($id, $data_payment);
$id_expense = $this->expenses_model->add($data);
}
}
if(is_numeric($id_expense)){
set_alert('success',_l('added_successfully'));
}
else{
set_alert('danger',_l('added_fail'));
}
echo json_encode([
'url' => admin_url('timesheets/requisition_detail/' .$id),
'expenseid' => $id_expense,
]);
die;
}
}
public function add_expense_category()
{
if (!is_admin() && get_option('staff_members_create_inline_expense_categories') == '0') {
access_denied('expenses');
}
if ($this->input->post()) {
$this->load->model('expenses_model');
$data = $this->input->post();
$id = $data['leave_id'];
unset($data['leave_id']);
$id_category = $this->expenses_model->add_category($data);
if ($id_category) {
set_alert('success',_l('added_successfully'));
}
redirect(admin_url('timesheets/requisition_detail/'.$id));
}
}
/**
* setting timekeeper
* @return redirect
*/
public function default_settings(){
$data = $this->input->post();
$success = $this->timesheets_model->default_settings($data);
if($success){
set_alert('success',_l('save_setting_success'));
}else{
set_alert('danger',_l('no_data_changes'));
}
redirect(admin_url('timesheets/setting?group=default_settings'));
}
/**
* get data attendance
* @return json
*/
public function get_data_attendance(){
if($this->input->post()){
$data = $this->input->post();
if($data['date'] == ''){
$data['date'] = date('Y-m-d H:i:s');
}
$allows_updating_check_in_time = 0;
$data_allows_updating = get_timesheets_option('allows_updating_check_in_time');
if($data_allows_updating){
$allows_updating_check_in_time = $data_allows_updating;
}
$data['date'] = $this->timesheets_model->format_date_time($data['date']);
$split_date = explode(' ', $data['date']);
$data_check_in_out = $this->timesheets_model->get_list_check_in_out($split_date[0], $data['staff_id']);
$html_list = '';
$type_check_in_out = '';
foreach ($data_check_in_out as $key => $value) {
$type_check_in_out = $value['type_check'];
$alert_type = 'alert-success';
$type_check = _l('checked_in_at');
if($value['type_check'] == 2){
$type_check = _l('checked_out_at');
$alert_type = 'alert-warning';
}
$html_list .= '<div class="row"><div class="col-md-12"><div class="alert '.$alert_type.'">'.$type_check.': '._dt($value['date']).'</div></div></div>';
}
echo json_encode([
'html_list' => $html_list,
'allows_updating_check_in_time' => $allows_updating_check_in_time,
'type_check_in_out' => $type_check_in_out
]);
die;
}
}
/**
* workplace management
* @return view
*/
public function workplace_mgt(){
if (!(has_permission('table_workplace_management', '', 'view_own') || has_permission('table_workplace_management', '', 'view') || is_admin())) {
access_denied('timekeeping');
}
$data_attendance_by_coordinates = get_timesheets_option('allow_attendance_by_coordinates');
if(!$data_attendance_by_coordinates){
access_denied();
}
$this->load->model('staff_model');
$data['group'] = $this->input->get('group');
$data['title'] = _l('workplace_mgt');
$data['tab'][] = 'workplace_assign';
$data['tab'][] = 'workplace';
if($data['group'] == ''){
$data['group'] = 'workplace_assign';
}
elseif ($data['group'] == 'workplace') {
$data['workplace'] = $this->timesheets_model->get_workplace();
}
$data['staffs'] = $this->staff_model->get('','active = 1');
$this->load->view('workplace_mgt/management', $data);
}
/**
* add workplace
**/
public function add_workplace(){
if($this->input->post()){
$data = $this->input->post();
if ($data['id'] == '') {
$add = $this->timesheets_model->add_workplace($data);
if($add > 0){
$message = _l('added_successfully');
set_alert('success',$message);
}
}else{
$success = $this->timesheets_model->update_workplace($data);
if($success == true){
$message = _l('updated_successfully');
set_alert('success', $message);
}
}
redirect(admin_url('timesheets/workplace_mgt?group=workplace'));
}
}
/**
* delete workplace
* @param integer $id
*/
public function delete_workplace($id){
if (!$id) {
redirect(admin_url('timesheets/workplace_mgt?group=workplace'));
}
$response = $this->timesheets_model->delete_workplace($id);
if ($response == true) {
set_alert('success', _l('deleted'));
} else {
set_alert('warning', _l('problem_deleting'));
}
redirect(admin_url('timesheets/workplace_mgt?group=workplace'));
}
/**
* add workplace assign
*/
public function add_workplace_assign(){
if($this->input->post()){
$data = $this->input->post();
$success = $this->timesheets_model->add_workplace_assign($data);
if($success == true){
$message = _l('added_successfully');
set_alert('success', $message);
}
else{
$message = _l('added_failed');
set_alert('warning', $message);
}
redirect(admin_url('timesheets/workplace_mgt?group=workplace_assign'));
}
}
/**
* delete workplace assign
* @param integer $id
*/
public function delete_workplace_assign($id){
if (!$id) {
redirect(admin_url('timesheets/workplace_mgt?group=workplace_assign'));
}
$response = $this->timesheets_model->delete_workplace_assign($id);
if ($response == true) {
set_alert('success', _l('deleted'));
} else {
set_alert('warning', _l('problem_deleting'));
}
redirect(admin_url('timesheets/workplace_mgt?group=workplace_assign'));
}
/**
* table registration leave
* @return
*/
public function table_workplace_assign()
{
$this->app->get_table_data(module_views_path('timesheets', 'workplace_mgt/includes/table_workplace_assign'));
}
/**
* @return view
*/
public function timekeeping_data(){
if (!(has_permission('attendance_management', '', 'view_own') || has_permission('attendance_management', '', 'view') || is_admin())) {
access_denied('timekeeping');
}
$this->load->model('staff_model');
$data['title'] = _l('timesheets');
$days_in_month = cal_days_in_month(CAL_GREGORIAN,date('m'),date('Y'));
$month = date('m');
$month_year = date('Y');
$data['check_latch_timesheet'] = $this->timesheets_model->check_latch_timesheet(date('m-Y'));
$data['departments'] = $this->departments_model->get();
$data['staffs_li'] = $this->staff_model->get();
$data['roles'] = $this->roles_model->get();
$data['positions'] = $this->roles_model->get();
$data['day_by_month_tk'] = [];
$data['day_by_month_tk'][] = _l('staff_id');
$data['day_by_month_tk'][] = _l('staff');
$data['set_col_tk'] = [];
$data['set_col_tk'][] = ['data' => _l('staff_id'), 'type' => 'text'];
$data['set_col_tk'][] = ['data' => _l('staff'), 'type' => 'text','readOnly' => true,'width' => 200];
for ($d = 1; $d <= $days_in_month; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
if (date('m', $time) == $month) {
array_push($data['day_by_month_tk'], date('D d', $time));
array_push($data['set_col_tk'],[ 'data' => date('D d', $time), 'type' => 'text']);
}
}
$data['day_by_month_tk'] = json_encode($data['day_by_month_tk']);
$data_map = [];
$data_timekeeping_form = get_timesheets_option('timekeeping_form');
$data_timekeeping_manually_role = get_timesheets_option('timekeeping_manually_role');
$data['data_timekeeping_form'] = $data_timekeeping_form;
$data['staff_row_tk'] = [];
$staffs = $this->timesheets_model->get_staff_timekeeping_applicable_object();
$data['staffs_setting'] = $this->staff_model->get();
$data['staffs'] = $staffs;
if($data_timekeeping_form == 'timekeeping_task' && $data['check_latch_timesheet'] == false){
foreach($staffs as $s){
$ts_date = '';
$ts_ts = '';
$result_tb = [];
$from_date = date('Y-m-01');
$to_date = date('Y-m-t');
$staffsTasksWhere = [];
if($from_date != '' && $to_date != ''){
$staffsTasksWhere = 'IF(duedate IS NOT NULL,((startdate <= "'.$from_date.'" and duedate >= "'.$from_date.'") or (startdate <= "'.$to_date.'" and duedate >= "'.$to_date.'") or (startdate > "'.$to_date.'" and duedate < "'.$from_date.'")), IF(datefinished IS NOT NULL,IF(status = 5 ,((startdate <= "'.$from_date.'" and date_format(datefinished, "%Y-%m-%d") >= "'.$from_date.'") or (startdate <= "'.$to_date.'" and date_format(datefinished, "%Y-%m-%d") >= "'.$to_date.'") or (startdate > "'.$to_date.'" and date_format(datefinished, "%Y-%m-%d") < "'.$from_date.'")), (startdate <= "'.$from_date.'" or (startdate > "'.$from_date.'" and startdate <= "'.$to_date.'"))),(startdate <= "'.$from_date.'" or (startdate > "'.$from_date.'" and startdate <= "'.$to_date.'"))))';
}
$staff_task = $this->tasks_model->get_tasks_by_staff_id($s['staffid'], $staffsTasksWhere);
$list_in_out = [];
foreach ($staff_task as $key_task => $task) {
$list_taskstimers = $this->timesheets_model->get_taskstimers($task['id'], $s['staffid']);
foreach ($list_taskstimers as $taskstimers) {
$list_date = $this->timesheets_model->get_list_date(date('Y-m-d',$taskstimers['start_time']), date('Y-m-d',$taskstimers['end_time']));
foreach ($list_date as $curent_date) {
$start_work_time = "";
$end_work_time = "";
$data_shift_list = $this->timesheets_model->get_shift_work_staff_by_date($s['staffid'], $curent_date);
foreach ($data_shift_list as $ss) {
$data_shift_type = $this->timesheets_model->get_shift_type($ss);
if($start_work_time == "" || strtotime($start_work_time) > strtotime($curent_date.' '.$data_shift_type->time_start_work.':00')){
$start_work_time = $curent_date.' '.$data_shift_type->time_start_work.':00';
}
if($end_work_time == "" || strtotime($end_work_time) < strtotime($curent_date.' '.$data_shift_type->time_end_work.':00')){
$end_work_time = $curent_date.' '.$data_shift_type->time_end_work.':00';
}
}
if(strtotime($start_work_time) < strtotime($curent_date.' '.date('H:i:s',$taskstimers['start_time']))){
$start_work_time = $curent_date.' '.date('H:i:s',$taskstimers['start_time']);
}
if(strtotime($end_work_time) > strtotime($curent_date.' '.date('H:i:s',$taskstimers['end_time'])) && strtotime(date('Y-m-d',$taskstimers['end_time'])) == strtotime($curent_date)){
$end_work_time = $curent_date.' '.date('H:i:s',$taskstimers['end_time']);
}
if(strtotime($from_date) <= strtotime(date('Y-m-d',strtotime($start_work_time))) && strtotime($to_date) >= strtotime(date('Y-m-d',strtotime($start_work_time)))){
if(isset($list_in_out[date('Y-m-d',strtotime($start_work_time))]['in'])){
if(strtotime($list_in_out[date('Y-m-d',strtotime($start_work_time))]['in']) > strtotime($start_work_time)){
$list_in_out[date('Y-m-d',strtotime($start_work_time))]['in'] = $start_work_time;
}
}else{
$list_in_out[date('Y-m-d',strtotime($start_work_time))]['in'] = $start_work_time;
}
if(isset($list_in_out[date('Y-m-d',strtotime($start_work_time))]['out'])){
if(strtotime($list_in_out[date('Y-m-d',strtotime($start_work_time))]['out']) < strtotime($start_work_time)){
$list_in_out[date('Y-m-d',strtotime($start_work_time))]['out'] = $start_work_time;
}
}else{
$list_in_out[date('Y-m-d',strtotime($start_work_time))]['out'] = $start_work_time;
}
}
if(strtotime($from_date) <= strtotime(date('Y-m-d',strtotime($end_work_time))) && strtotime($to_date) >= strtotime(date('Y-m-d',strtotime($end_work_time)))){
if(isset($list_in_out[date('Y-m-d',strtotime($end_work_time))]['in'])){
if(strtotime($list_in_out[date('Y-m-d',strtotime($end_work_time))]['in']) >strtotime($end_work_time)){
$list_in_out[date('Y-m-d',strtotime($end_work_time))]['in'] = $end_work_time;
}
}else{
$list_in_out[date('Y-m-d',strtotime($end_work_time))]['in'] = $end_work_time;
}
if(isset($list_in_out[date('Y-m-d',strtotime($end_work_time))]['out'])){
if(strtotime($list_in_out[date('Y-m-d',strtotime($end_work_time))]['out']) <strtotime($end_work_time)){
$list_in_out[date('Y-m-d',strtotime($end_work_time))]['out'] = $end_work_time;
}
}else{
$list_in_out[date('Y-m-d',strtotime($end_work_time))]['out'] = $end_work_time;
}
}
}
}
}
foreach ($list_in_out as $date_ => $in_out) {
$vl = $this->timesheets_model->get_data_insert_timesheets($s['staffid'], $in_out['in'], $in_out['out']);
if(!isset($data_map[$s['staffid']][$date_]['ts'])){
$data_map[$s['staffid']][$date_]['date'] = date('D d', strtotime($date_));
$data_map[$s['staffid']][$date_]['ts'] = '';
}
if($vl['late'] > 0){
$data_map[$s['staffid']][$date_]['ts'] .= 'L:'.$vl['late'].'; ';
}
if($vl['early'] > 0){
$data_map[$s['staffid']][$date_]['ts'] .= 'E:'.$vl['early'].'; ';
}
if($vl['work'] > 0){
$data_map[$s['staffid']][$date_]['ts'] .= 'W:'.$vl['work'].'; ';
}
$data_map[$s['staffid']][$date_]['ts'] = rtrim($data_map[$s['staffid']][$date_]['ts'], '; ');
}
if(isset($data_map[$s['staffid']])){
foreach ($data_map[$s['staffid']] as $key => $value) {
$ts_date = $data_map[$s['staffid']][$key]['date'];
$ts_ts = $data_map[$s['staffid']][$key]['ts'];
$result_tb[] = [$ts_date => $ts_ts];
}
}
$dt_ts = [];
$dt_ts = [_l('staff_id') => $s['staffid'],_l('staff') => $s['firstname'].' '.$s['lastname']];
$note = [];
$list_dtts = [];
foreach ($result_tb as $key => $rs) {
foreach ($rs as $day => $val) {
$list_dtts[$day] = $val;
}
}
$list_date = $this->timesheets_model->get_list_date(date('Y-m-01'), date('Y-m-t'));
foreach ($list_date as $key => $value) {
$date_s = date('D d', strtotime($value));
$max_hour = $this->timesheets_model->get_hour_shift_staff($s['staffid'],$value);
$check_holiday = $this->timesheets_model->check_holiday($s['staffid'], $value);
$result_lack = '';
if($max_hour > 0){
if(!$check_holiday){
$ts_lack = '';
if(isset($list_dtts[$date_s])){
$ts_lack = $list_dtts[$date_s].'; ';
}
$total_lack = $ts_lack;
if($total_lack){
$total_lack = rtrim($total_lack, '; ');
}
$result_lack = $this->timesheets_model->merge_ts($total_lack, $max_hour);
}
else{
if($check_holiday->off_type == 'holiday'){
$result_lack = "HO";
}
if($check_holiday->off_type == 'event_break'){
$result_lack = "EB";
}
if($check_holiday->off_type == 'unexpected_break'){
$result_lack = "UB";
}
}
}
else{
$result_lack = 'NS';
}
$dt_ts[$date_s] = $result_lack;
}
array_push($data['staff_row_tk'], $dt_ts);
}
}
elseif($data_timekeeping_form == 'timekeeping_manually' && $data['check_latch_timesheet'] == false){
$data_ts = $this->timesheets_model->get_timesheets_ts_by_month(date('m'), date('Y'));
foreach($data_ts as $ts){
$staff_info = array();
$staff_info['date'] = date('D d', strtotime($ts['date_work']));
$ts_type = $this->timesheets_model->get_ts_by_date_and_staff($ts['date_work'],$ts['staff_id']);
if(count($ts_type) <= 1){
if($ts['value'] > 0){
$staff_info['ts'] = $ts['type'].':'.$ts['value'];
}else{
$staff_info['ts'] = '';
}
}else{
$str = '';
foreach($ts_type as $tp){
if($tp['value'] > 0){
if($tp['type'] == 'HO' || $tp['type'] == 'M'){
if($str == ''){
$str .= $tp['type'];
}else{
$str .= "; ".$tp['type'];
}
}else{
if($str == ''){
$str .= $tp['type'].':'.round($tp['value'], 2);
}else{
$str .= "; ".$tp['type'].':'.round($tp['value'], 2);
}
}
}
}
$staff_info['ts'] = $str;
}
if(!isset($data_map[$ts['staff_id']])){
$data_map[$ts['staff_id']] = array();
}
$data_map[$ts['staff_id']][$staff_info['date']] = $staff_info;
}
foreach($staffs as $s){
$ts_date = '';
$ts_ts = '';
$result_tb = [];
if(isset($data_map[$s['staffid']])){
foreach ($data_map[$s['staffid']] as $key => $value) {
$ts_date = $data_map[$s['staffid']][$key]['date'];
$ts_ts = $data_map[$s['staffid']][$key]['ts'];
$result_tb[] = [$ts_date => $ts_ts];
}
}
$dt_ts = [];
$dt_ts = [_l('staff_id') => $s['staffid'],_l('staff') => $s['firstname'].' '.$s['lastname']];
$note = [];
$list_dtts = [];
foreach ($result_tb as $key => $rs) {
foreach ($rs as $day => $val) {
$list_dtts[$day] = $val;
}
}
$list_date = $this->timesheets_model->get_list_date(date('Y-m-01'), date('Y-m-t'));
foreach ($list_date as $key => $value) {
$date_s = date('D d', strtotime($value));
$max_hour = $this->timesheets_model->get_hour_shift_staff($s['staffid'],$value);
$check_holiday = $this->timesheets_model->check_holiday($s['staffid'], $value);
$result_lack = '';
if($max_hour > 0){
if(!$check_holiday){
$ts_lack = '';
if(isset($list_dtts[$date_s])){
$ts_lack = $list_dtts[$date_s].'; ';
}
$total_lack = $ts_lack;
if($total_lack){
$total_lack = rtrim($total_lack, '; ');
}
$result_lack = $this->timesheets_model->merge_ts($total_lack, $max_hour);
}
else{
if($check_holiday->off_type == 'holiday'){
$result_lack = "HO";
}
if($check_holiday->off_type == 'event_break'){
$result_lack = "EB";
}
if($check_holiday->off_type == 'unexpected_break'){
$result_lack = "UB";
}
}
}
else{
$result_lack = 'NS';
}
$dt_ts[$date_s] = $result_lack;
}
array_push($data['staff_row_tk'], $dt_ts);
}
}else{
$data_ts = $this->timesheets_model->get_timesheets_ts_by_month(date('m'), date('Y'));
foreach($data_ts as $ts){
$staff_info = array();
$staff_info['date'] = date('D d', strtotime($ts['date_work']));
$ts_type = $this->timesheets_model->get_ts_by_date_and_staff($ts['date_work'],$ts['staff_id']);
if(count($ts_type) <= 1){
if($ts['value'] > 0){
$staff_info['ts'] = $ts['type'].':'.$ts['value'];
}else{
$staff_info['ts'] = '';
}
}else{
$str = '';
foreach($ts_type as $tp){
if($tp['value'] > 0){
if($tp['type'] == 'HO' || $tp['type'] == 'M'){
if($str == ''){
$str .= $tp['type'];
}else{
$str .= "; ".$tp['type'];
}
}else{
if($str == ''){
$str .= $tp['type'].':'.round($tp['value'], 2);
}else{
$str .= "; ".$tp['type'].':'.round($tp['value'], 2);
}
}
}
}
$staff_info['ts'] = $str;
}
if(!isset($data_map[$ts['staff_id']])){
$data_map[$ts['staff_id']] = array();
}
$data_map[$ts['staff_id']][$staff_info['date']] = $staff_info;
}
foreach($staffs as $s){
$ts_date = '';
$ts_ts = '';
$result_tb = [];
if(isset($data_map[$s['staffid']])){
foreach ($data_map[$s['staffid']] as $key => $value) {
$ts_date = $data_map[$s['staffid']][$key]['date'];
$ts_ts = $data_map[$s['staffid']][$key]['ts'];
$result_tb[] = [$ts_date => $ts_ts];
}
}
$dt_ts = [];
$dt_ts = [_l('staff_id') => $s['staffid'],_l('staff') => $s['firstname'].' '.$s['lastname']];
$note = [];
$list_dtts = [];
foreach ($result_tb as $key => $rs) {
foreach ($rs as $day => $val) {
$list_dtts[$day] = $val;
}
}
$list_date = $this->timesheets_model->get_list_date(date('Y-m-01'), date('Y-m-t'));
foreach ($list_date as $key => $value) {
$date_s = date('D d', strtotime($value));
$max_hour = $this->timesheets_model->get_hour_shift_staff($s['staffid'],$value);
$check_holiday = $this->timesheets_model->check_holiday($s['staffid'], $value);
$result_lack = '';
if($max_hour > 0){
if(!$check_holiday){
$ts_lack = '';
if(isset($list_dtts[$date_s])){
$ts_lack = $list_dtts[$date_s].'; ';
}
$total_lack = $ts_lack;
if($total_lack){
$total_lack = rtrim($total_lack, '; ');
}
$result_lack = $this->timesheets_model->merge_ts($total_lack, $max_hour);
}
else{
if($check_holiday->off_type == 'holiday'){
$result_lack = "HO";
}
if($check_holiday->off_type == 'event_break'){
$result_lack = "EB";
}
if($check_holiday->off_type == 'unexpected_break'){
$result_lack = "UB";
}
}
}
else{
$result_lack = 'NS';
}
$dt_ts[$date_s] = $result_lack;
}
array_push($data['staff_row_tk'], $dt_ts);
}
}
$data_lack = [];
$data['data_lack'] = $data_lack;
$data['set_col_tk'] = json_encode($data['set_col_tk']);
return $data;
}
/**
* timesheets task by staff
* @param integer $list_in_out
* @param integer $staffid
* @return array
*/
public function timesheets_task_by_staff($list_in_out, $staffid){
$data_map = [];
foreach ($list_in_out as $date_ => $in_out) {
$vl = $this->timesheets_model->get_data_insert_timesheets($staffid, $in_out['in'], $in_out['out']);
if(!isset($data_map[$staffid][$date_]['ts'])){
$data_map[$staffid][$date_]['date'] = date('D d', strtotime($date_));
$data_map[$staffid][$date_]['ts'] = '';
}
if($vl['late'] > 0){
$data_map[$staffid][$date_]['ts'] .= 'L:'.$vl['late'].'; ';
}
if($vl['early'] > 0){
$data_map[$staffid][$date_]['ts'] .= 'E:'.$vl['early'].'; ';
}
if($vl['work'] > 0){
$data_map[$staffid][$date_]['ts'] .= 'W:'.$vl['work'].'; ';
}
$data_map[$staffid][$date_]['ts'] = rtrim($data_map[$staffid][$date_]['ts'], '; ');
}
return $data_map;
}
/**
* get layout timesheets
* @param string $from_date
* @param string $to_date
* @return array
*/
public function get_layout_timesheets($from_date, $to_date){
$data['day_by_month_tk'] = [];
$data['day_by_month_tk'][] = _l('staff_id');
$data['day_by_month_tk'][] = _l('staff');
$data['set_col_tk'] = [];
$data['set_col_tk'][] = ['data' => _l('staff_id'), 'type' => 'text'];
$data['set_col_tk'][] = ['data' => _l('staff'), 'type' => 'text','readOnly' => true,'width' => 200];
$list_date = $this->timesheets_model->get_list_date($from_date, $to_date);
foreach ($list_date as $k_date => $date) {
$time = strtotime($date);
array_push($data['day_by_month_tk'], date('D d', $time));
array_push($data['set_col_tk'],[ 'data' => date('D d', $time), 'type' => 'text']);
}
return $data;
}
function delete_mass_workplace_assign(){
if($this->input->post()){
$data = $this->input->post();
$success = $this->timesheets_model->delete_mass_workplace_assign($data);
if($success == true){
$message = _l('delete_successfully');
set_alert('success', $message);
}
else{
$message = _l('delete_failed');
set_alert('warning', $message);
}
redirect(admin_url('timesheets/workplace_mgt?group=workplace_assign'));
}
}
public function route_management(){
$allow_attendance_by_route = 0;
$data_by_route = get_timesheets_option('allow_attendance_by_route');
if($data_by_route){
$allow_attendance_by_route = $data_by_route;
}
if($allow_attendance_by_route != 1){
access_denied('timesheets');
}
if ((!is_admin() && !has_permission('route_management', '', 'view')) || (!is_admin() && !has_permission('route_management', '', 'view_own'))) {
access_denied('timesheets');
}
$data['title'] = _l('route_management');
$data['tab'] = 'route';
if($this->input->get('tab')){
$data['tab'] = $this->input->get('tab');
}
if($data['tab'] == 'route_point') {
$this->load->model('clients_model');
$data['route_point'] = $this->timesheets_model->get_route_point();
$data['client'] = $this->clients_model->get();
$data['workplace'] = $this->timesheets_model->get_workplace();
}
if ($data['tab'] == 'route') {
$this->load->model('staff_model');
$this->load->model('departments_model');
$data['department'] = $this->departments_model->get();
$header = [];
$data_object = [];
array_push($header, _l('staffid'));
array_push($header, _l('staff'));
$list_date = $this->timesheets_model->get_list_date(date('Y-m-01'), date('Y-m-t'));
foreach ($list_date as $key => $date) {
array_push($header, _d($date));
}
$data['header'] = $header;
$data['staff'] = $this->staff_model->get('','active = 1');
$list_end_week_index = '';
$has_data = false;
$old_value = 0;
foreach ($data['staff'] as $key => $staff) {
$row_data_staff = new stdClass();
$staffid_text = _l('staffid');
$staff_text = _l('staff');
$row_data_staff->$staffid_text = $staff['staffid'];
$row_data_staff->$staff_text = $staff['firstname'].' '.$staff['lastname'];
foreach ($list_date as $key => $date) {
$root_text_by_date = $this->timesheets_model->get_route_text($staff['staffid'], $date)->result;
$col = _d($date);
$row_data_staff->$col = $root_text_by_date;
if($old_value > $key){
$has_data = true;
}
if(($has_data == false) && (date('N', strtotime($date)) == 7)){
$list_end_week_index .= $key.',';
$old_value = $key;
}
}
$data_object[] = $row_data_staff;
}
$data['end_week_index'] = (($list_end_week_index != '') ? rtrim($list_end_week_index, ',') : '');
$data['route_point'] = $this->timesheets_model->get_route_point();
$data['data_object'] = $data_object;
}
if ($data['tab'] == 'map') {
$this->load->model('staff_model');
$data['staff'] = $this->staff_model->get('','active = 1');
$data['route_point'] = $this->timesheets_model->get_route_point();
$data['coordinates_list'][] = $this->get_route_map_data();
}
$this->load->view('route_management/manage', $data);
}
public function get_route_map_data($staffid = '', $current_date = ''){
if($staffid == ''){
$staffid = get_staff_user_id();
}
if($current_date == ''){
$current_date = date('Y-m-d');
}
$staff_route_list = $this->timesheets_model->get_route_by_fillter($staffid, $current_date);
$coordinates_list = [];
$end_weeek = [];
foreach ($staff_route_list as $key => $row) {
$add_staffid_name = '';
$count_checked = 0;
$staff_id_list = $this->timesheets_model->staff_at_same_route($staff_route_list, $staffid, $current_date);
if($staff_id_list){
foreach ($staff_id_list as $stk => $stid) {
$valid_head_name = '';
$valid_tail_name = '';
$valid_check_same_route = $this->timesheets_model->check_full_check_in_out_route_point($current_date, $stid, $row['route_point_id']);
if($valid_check_same_route == true){
$count_checked++;
$valid_head_name = '<span class="text-success">';
$valid_tail_name = '</span>';
}
$add_staffid_name .= ', '.$valid_head_name.get_staff_full_name($stid).$valid_tail_name;
}
array_push($staff_id_list, $staffid);
$staff_id_list = array_reverse($staff_id_list);
}
else{
array_push($staff_id_list, $staffid);
}
$data_route = $this->timesheets_model->get_route_point($row['route_point_id']);
if($data_route){
$head_name = '';
$tail_name = '';
$valid_check = $this->timesheets_model->check_full_check_in_out_route_point($current_date, $staffid, $row['route_point_id']);
if($valid_check == true){
$count_checked++;
$head_name = '<span class="text-success">';
$tail_name = '</span>';
}
$related_name = "";
if($data_route->related_to == 1){
$related_name = get_company_name($data_route->related_id);
}
if($data_route->related_to == 2){
$related_name = get_workplace_name($data_route->related_id);
}
$coordinates_list[] = [
'lat' => (float)$data_route->latitude,
'lng' => (float)$data_route->longitude,
'name' => $data_route->name,
'staff_name' => $head_name.get_staff_full_name($staffid).$tail_name.''.$add_staffid_name,
'route_point_address' => $data_route->route_point_address,
'take_attendance' => (count($staff_id_list) == $count_checked) ? true : false,
'staffid' => $staff_id_list,
'date_work' => (string)_d($current_date),
'related_to' => $data_route->related_to,
'related_name' => $related_name,
'route_point_id' => $row['route_point_id']
];
}
}
return $coordinates_list;
}
/**
* add route point
*/
public function add_route_point(){
if($this->input->post()){
$data = $this->input->post();
if (!$this->input->post('id')) {
$add = $this->timesheets_model->add_route_point($data);
if($add > 0){
$message = _l('added_successfully', _l('route_point'));
set_alert('success',$message);
}
else
{
$message = _l('added_failed', _l('route_point'));
set_alert('warning',$message);
}
redirect(admin_url('timesheets/route_management?tab=route_point'));
}else{
$success = $this->timesheets_model->update_route_point($data);
if($success == true){
$message = _l('updated_successfully', _l('route_point'));
set_alert('success', $message);
}
else
{
$message = _l('updated_failed', _l('route_point'));
set_alert('warning',$message);
}
redirect(admin_url('timesheets/route_management?tab=route_point'));
}
}
}
/**
* table route point
* @return view
*/
public function table_route_point(){
$this->app->get_table_data(module_views_path('timesheets', 'route_management/table_route_point'));
}
/**
* delete shift
* @param int $id
*/
public function delete_route_point($id){
$response = $this->timesheets_model->delete_route_point($id);
if($response == true) {
set_alert('success', _l('deleted').' '._l('route_point'));
} else {
set_alert('warning', _l('problem_deleting').' '. _l('route_point'));
}
redirect(admin_url('timesheets/route_management?tab=route_point'));
}
/**
* table route
* @return view
*/
public function table_route(){
$this->app->get_table_data(module_views_path('timesheets', 'route_management/table_route'));
}
/**
* add route
*/
public function add_route(){
if($this->input->post()){
$data = $this->input->post();
$add = $this->timesheets_model->add_route($data);
if($add == true){
$message = _l('saved_successfully', _l('route'));
set_alert('success',$message);
}
else
{
$message = _l('saved_failed', _l('route'));
set_alert('warning',$message);
}
redirect(admin_url('timesheets/route_management?tab=route'));
}
}
/**
* add new root
*/
public function add_new_root(){
$data['title'] = _l('route_management');
$this->load->model('staff_model');
$header = [];
$data_object = [];
array_push($header, _l('staffid'));
array_push($header, _l('staff'));
$list_date = $this->timesheets_model->get_list_date(date('Y-m-01'), date('Y-m-t'));
foreach ($list_date as $key => $date) {
array_push($header, _d($date));
}
$data['header'] = $header;
$data['staff'] = $this->staff_model->get();
foreach ($data['staff'] as $key => $staff) {
$row_data_staff = new stdClass();
$staffid_text = _l('staffid');
$staff_text = _l('staff');
$row_data_staff->$staffid_text = $staff['staffid'];
$row_data_staff->$staff_text = $staff['lastname'].' '.$staff['firstname'];
foreach ($list_date as $key => $date) {
$col = _d($date);
$row_data_staff->$col = "";
}
$data_object[] = $row_data_staff;
}
$data['route_point'] = $this->timesheets_model->get_route_point();
$data['data_object'] = $data_object;
$this->load->view('route_management/add_new_root', $data);
}
/**
* get ui create root
* @return json
*/
public function get_ui_create_root(){
$staff = $this->input->post('staff');
$date = $this->input->post('date');
$route_point = $this->input->post('route_point');
$department = $this->input->post('department');
$start_date = date('Y-m-01', strtotime($date));
$end_date = date('Y-m-t', strtotime($date));
$data_object = [];
$where = '';
$header = [];
$data_object = [];
$list_date = $this->timesheets_model->get_list_date($start_date, $end_date);
array_push($header, _l('staffid'));
array_push($header, _l('staff'));
foreach ($list_date as $key => $date) {
array_push($header, _d($date));
}
$where .= 'active = 1';
if($staff){
if(count($staff) > 0){
$where .= 'staffid in ('.implode(',', $staff).')';
}
}
//department
if($department){
if($where != ''){
$where .= ' AND ';
}
$where .= 'staffid in (select '.db_prefix().'staff_departments.staffid from '.db_prefix().'staff_departments where departmentid in ('.implode(',', $department).'))';
}
$data['staff'] = $this->staff_model->get('', ($where != '' ? $where : []));
foreach ($data['staff'] as $key => $staff) {
$row_data_staff = new stdClass();
$staffid_text = _l('staffid');
$staff_text = _l('staff');
$row_data_staff->$staffid_text = $staff['staffid'];
$row_data_staff->$staff_text = $staff['firstname'].' '.$staff['lastname'];
$route_fillter = false;
$valid = true;
if($route_point){
$valid = false;
}
foreach ($list_date as $key => $date) {
$route_data = $this->timesheets_model->get_route_text($staff['staffid'], $date);
if($route_point){
if(count(array_intersect($route_data->list_route_id, $route_point))>0)
{
$valid = true;
$col = _d($date);
$row_data_staff->$col = $route_data->result;
}
}
else{
$col = _d($date);
$row_data_staff->$col = $route_data->result;
}
}
if($valid == true){
$data_object[] = $row_data_staff;
}
}
echo json_encode([
'data_object' => $data_object,
'data_header' => $header
]);
die;
}
/**
* get cordinate
* @return json
*/
public function get_coordinate(){
$address = $this->input->post('address');
$coordinate = address2geo($address);
echo $coordinate;
die;
}
/**
* get data relate
* @return json
*/
public function get_data_relate(){
$data = $this->input->post();
$route_point_address = '';
$latitude = '';
$longitude = '';
$distance = '';
if($data['related_to'] == 1){
// Related to customer
$this->load->model('clients_model');
$data_customer = $this->clients_model->get($data['related_id']);
$route_point_address = $data_customer->address.
(($data_customer->city != '' || $data_customer->city != null) ? ', '.$data_customer->city : '').
(($data_customer->state != '' || $data_customer->state != null) ? ', '.$data_customer->state : '');
}
if($data['related_to'] == 2){
// Related to workplace
$data_workplace = $this->timesheets_model->get_workplace($data['related_id']);
$latitude = $data_workplace->latitude;
$longitude = $data_workplace->longitude;
$distance = $data_workplace->distance;
}
echo json_encode([
'route_point_address' => $route_point_address,
'latitude' => $latitude,
'longitude' => $longitude,
'distance' => $distance
]);
die;
}
/**
* get data map
* @return json
*/
public function get_data_map(){
$data = $this->input->post();
$route_point_list = (isset($data['route_point']) ? $data['route_point'] : []);
$flightPlanCoordinates = [];
$current_date = (($data['date'] != '') ? $this->timesheets_model->format_date($data['date']) : date('Y-m-d'));
if(isset($data['staff'])){
if($data['staff'] && $current_date){
foreach ($data['staff'] as $k_staff => $staffid) {
$staff_route_list = $this->timesheets_model->get_route_by_fillter($staffid, $current_date);
$coordinates_list = [];
$allow_add_array = false;
if(count($route_point_list) == 0){
$allow_add_array = true;
}
else{
$allow_add_array = false;
}
foreach ($staff_route_list as $key => $row) {
if($allow_add_array == false){
if(in_array($row['route_point_id'], $route_point_list)){
$allow_add_array = true;
}
}
$add_staffid_name = '';
$count_checked = 0;
$staff_id_list = $this->timesheets_model->staff_at_same_route($staff_route_list, $staffid, $current_date);
if($staff_id_list){
foreach ($staff_id_list as $stk => $stid) {
$valid_head_name = '';
$valid_tail_name = '';
$valid_check_same_route = $this->timesheets_model->check_full_check_in_out_route_point($current_date, $stid, $row['route_point_id']);
if($valid_check_same_route == true){
$count_checked++;
$valid_head_name = '<span class="text-success">';
$valid_tail_name = '</span>';
}
$add_staffid_name .= ', '.$valid_head_name.get_staff_full_name($stid).$valid_tail_name;
}
array_push($staff_id_list, $staffid);
$staff_id_list = array_reverse($staff_id_list);
}
else{
array_push($staff_id_list, $staffid);
}
$data_route = $this->timesheets_model->get_route_point($row['route_point_id']);
if($data_route){
$head_name = '';
$tail_name = '';
$valid_check = $this->timesheets_model->check_full_check_in_out_route_point($current_date, $staffid, $row['route_point_id']);
if($valid_check == true){
$count_checked++;
$head_name = '<span class="text-success">';
$tail_name = '</span>';
}
$related_name = "";
if($data_route->related_to == 1){
$related_name = get_company_name($data_route->related_id);
}
if($data_route->related_to == 2){
$related_name = get_workplace_name($data_route->related_id);
}
$coordinates_list[] = [
'lat' => (float)$data_route->latitude,
'lng' => (float)$data_route->longitude,
'name' => $data_route->name,
'staff_name' => $head_name.get_staff_full_name($staffid).$tail_name.''.$add_staffid_name,
'route_point_address' => $data_route->route_point_address,
'take_attendance' => (count($staff_id_list) == $count_checked) ? true : false,
'staffid' => $staff_id_list,
'date_work' => (string)_d($current_date),
'related_to' => $data_route->related_to,
'related_name' => $related_name,
'route_point_id' => $row['route_point_id']
];
}
}
if($allow_add_array == true){
if(count($coordinates_list) > 0){
$flightPlanCoordinates[] = $coordinates_list;
}
}
}
}
}
echo json_encode($flightPlanCoordinates);
die;
}
/**
* get route point combobox
* @return json
*/
public function get_route_point_combobox(){
$data = $this->input->post();
$latitude = $data['lat'];
$longitude = $data['lng'];
$staff = '';
$date = '';
if(!isset($data['staff']) || ($data['staff'] == '')){
$staff = get_staff_user_id();
}
else{
$staff = $data['staff'];
}
if(!isset($data['date']) || ($data['date'] == '')){
$date = date('Y-m-d');
}
else{
$date = date('Y-m-d',strtotime($this->timesheets_model->format_date_time($data['date'])));
}
$list_option = '';
$point_id = '';
$data_setting_rooute = get_timesheets_option('allow_attendance_by_route');
if($data_setting_rooute && $data_setting_rooute == 1){
if($staff != '' && $date != ''){
$obj = $this->timesheets_model->get_next_point($staff, $date, $latitude, $longitude);
$point_id = $obj->id;
$data_route = $this->timesheets_model->get_route_by_fillter($staff, $date);
foreach ($data_route as $key => $val) {
$route = $this->timesheets_model->get_route_point($val['route_point_id']);
if($route){
$route_point_id = $route->id;
$list_option .= '<option value="'.$route_point_id.'" '.(($point_id == $route_point_id) ? 'selected' : '').'>'.$route->name.'</option>';
if($obj->type == 'order'){
if($point_id == $route_point_id){
break;
}
}
}
}
}
}
echo json_encode([
'point_id' => $point_id,
'option' => $list_option
]);
die;
}
/**
* check route point name
* @return json
*/
public function check_route_point_name(){
$data = $this->input->post();
$exist = false;
$message = "";
if($data){
$name = $data['name'];
$id = $data['id'];
$exist = $this->timesheets_model->check_exist_route_point_name($name, $id);
if($exist == true){
$message = _l('the_name_of_the_route_point_was_duplicated');
}
}
echo json_encode([
'result' => $exist,
'message' => $message
]);
die;
}
/**
* get default lat long
* @return json
*/
public function get_default_lat_long(){
$latitude = 40.90011966771429;
$longitude = -74.10928986604924;
$data = $this->timesheets_model->get_route_point();
if($data){
$latitude = (float)$data[0]['latitude'];
$longitude = (float)$data[0]['longitude'];
}
echo json_encode([
'latitude' => $latitude,
'longitude' => $longitude
]);
die;
}
/**
* get check in out history
* @return json
*/
public function get_check_in_out_history(){
$data = $this->input->post();
$staffid = explode(',', $data['list_staffid']);
$content = '';
$list_option_staff = '';
foreach ($staffid as $key => $id) {
$selected = '';
if($key == 0){
$selected = 'selected';
}
$list_option_staff .= '<option value="'.$id.'" '.$selected.'>'.get_staff_full_name($id).'</option>';
}
$data_check_in_out = $this->timesheets_model->get_check_in_out_by_route_point($staffid[0], $this->timesheets_model->format_date($data['date']), $data['route_point_id']);
$content = '';
foreach ($data_check_in_out as $key => $value) {
$alert_type = 'alert-success';
$type_check_in_out = $value['type_check'];
$type_check = _l('checked_in_at');
if($value['type_check'] == 2){
$type_check = _l('checked_out_at');
$alert_type = 'alert-warning';
}
$content .= '<div class="col-md-12"><div class="alert '.$alert_type.'">'.$type_check.': '._dt($value['date']).'</div></div>';
}
echo json_encode([
'staff_option_list' => $list_option_staff,
'content' => $content
]);
}
/**
* export attendance excel
* @return json
*/
public function export_attendance_excel()
{
if(!class_exists('XLSXReader_fin')){
require_once(module_dir_path(TIMESHEETS_MODULE_NAME).'/assets/plugins/XLSXReader/XLSXReader.php');
}
require_once(module_dir_path(TIMESHEETS_MODULE_NAME).'/assets/plugins/XLSXWriter/xlsxwriter.class.php');
if($this->input->post()){
$month_filter = $this->input->post('month');
$department_filter = $this->input->post('department');
$role_filter = $this->input->post('role');
$staff_filter = $this->input->post('staff');
$list = $this->timesheets_model->get_data_attendance_export($month_filter, $department_filter, $role_filter, $staff_filter);
$month = date('m');
$month_year = date('Y');
$days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $month_year);
$set_col_tk = [];
$set_col_tk[_l('staff_id')] = 'string';
$set_col_tk[_l('staff')] = 'string';
$widthst = [];
$widthst[] = 10;
$widthst[] = 40;
for ($d = 1; $d <= $days_in_month; $d++) {
$time = mktime(12, 0, 0, $month, $d, $month_year);
if (date('m', $time) == $month) {
$set_col_tk[date('D d', $time)] = 'string';
$widthst[] = 10;
}
}
$writer_header = $set_col_tk;
$writer = new XLSXWriter();
$writer->writeSheetHeader('Sheet1', $writer_header, $col_options = ['widths'=> $widthst, 'fill' => '#C65911', 'font-style'=>'bold', 'color' => '#FFFFFF', 'border'=>'left,right,top,bottom', 'height'=>25, 'border-color' => '#FFFFFF', 'font-size' => 13 , 'font' => 'Calibri']);
$style1 = array('fill' => '#F8CBAD', 'height'=>25, 'border'=>'left,right,top,bottom', 'border-color' => '#FFFFFF', 'font-size' => 12, 'font' => 'Calibri', 'color' => '#000000');
$style2 = array('fill' => '#FCE4D6', 'height'=>25, 'border'=>'left,right,top,bottom', 'border-color' => '#FFFFFF', 'font-size' => 12, 'font' => 'Calibri', 'color' => '#000000');
foreach ($list as $k => $value) {
$list_add = [];
foreach ($value as $i => $item) {
$list_add[] = $item;
}
if(($k%2) == 0){
$writer->writeSheetRow('Sheet1', $list_add, $style1);
}else{
$writer->writeSheetRow('Sheet1', $list_add, $style2);
}
}
$files = glob(TIMESHEETS_PATH_EXPORT_FILE.'*');
foreach($files as $file){
if(is_file($file)) {
// delete file
unlink($file);
}
}
$filename = 'attendance_'.$month_filter.'.xlsx';
$writer->writeToFile(str_replace($filename, TIMESHEETS_PATH_EXPORT_FILE.$filename, $filename));
echo json_encode([
'site_url' => site_url(),
'filename' => TIMESHEETS_PATH_EXPORT_FILE.$filename,
]);
die;
}
}
/**
* history check in out report
* @return
*/
public function history_check_in_out_report(){
if ($this->input->is_ajax_request()) {
if($this->input->post()){
$months_report = $this->input->post('months_filter');
$staff_fillter = $this->input->post("staff_2_fillter");
$department_fillter = $this->input->post("department_2_fillter");
$roles_fillter = $this->input->post("roles_2_fillter");
$workplace_fillter = $this->input->post("workplace_2_fillter");
$route_point_fillter = $this->input->post("route_point_2_fillter");
$word_shift_fillter = $this->input->post("word_shift_2_fillter");
$type_fillter = $this->input->post("type_2_fillter");
if($months_report == 'this_month'){
$from_date = date('Y-m-01');
$to_date = date('Y-m-t');
}//thang nay
if($months_report == '1'){
$from_date = date('Y-m-01', strtotime('first day of last month'));
$to_date = date('Y-m-t', strtotime('last day of last month'));
}//Trang truoc
if($months_report == 'this_year'){
$from_date = date('Y-m-d', strtotime(date('Y-01-01')));
$to_date = date('Y-m-d', strtotime(date('Y-12-31')));
}//nam nay
if($months_report == 'last_year'){
$from_date = date('Y-m-d', strtotime(date(date('Y', strtotime('last year')) . '-01-01')));
$to_date = date('Y-m-d', strtotime(date(date('Y', strtotime('last year')) . '-12-31')));
}//năm truoc
if($months_report == '3'){
$months_report--;
$from_date = date('Y-m-01', strtotime("-$months_report MONTH"));
$to_date = date('Y-m-t');
}//3 thang qua
if($months_report == '6'){
$months_report--;
$from_date = date('Y-m-01', strtotime("-$months_report MONTH"));
$to_date = date('Y-m-t');
}//6 thang qua
if($months_report == '12'){
$months_report--;
$from_date = date('Y-m-01', strtotime("-$months_report MONTH"));
$to_date = date('Y-m-t');
}//12 thang qua
if($months_report == 'custom'){
$from_date = to_sql_date($this->input->post('report_from'));
$to_date = to_sql_date($this->input->post('report_to'));
}//12 thang qua
$select = [
'staff_id',
'date',
'type_check',
'id',
'workplace_id',
'route_point_id'
];
$query = '';
if(has_permission('report_management', '', 'view') || is_admin()){
if(isset($staff_fillter)){
$staffid_list = implode(',', $staff_fillter);
$query .= ' staff_id in ('.$staffid_list.') and';
}
}
else{
$query .= ' staff_id = '.get_staff_user_id().' and';
}
if(isset($department_fillter)){
$department_list = implode(',', $department_fillter);
$query .= ' staff_id in (SELECT staffid FROM '.db_prefix().'staff_departments where departmentid in ('.$department_list.')) and';
}
if(isset($workplace_fillter)){
$workplace_id_list = implode(',', $workplace_fillter);
$query .= ' workplace_id in ('.$workplace_id_list.') and';
}
if(isset($route_point_fillter)){
$route_point_id_list = implode(',', $route_point_fillter);
$query .= ' route_point_id in ('.$route_point_id_list.') and';
}
if(isset($type_fillter)){
if($type_fillter != 3){
$query .= ' type_check = '.$type_fillter.' and';
}
}
if(isset($months_report)){
if($months_report != ''){
$query .= ' date_format(date, "%Y-%m-%d") between "'.$from_date.'" AND "'.$to_date.'" and';
}
}
if(isset($roles_fillter)){
$roles_id_list = implode(',', $roles_fillter);
$query .= ' staff_id in (SELECT staffid FROM '.db_prefix().'staff where role IN ('.$roles_id_list.')) and';
}
/*get requisition approval*/
$total_query = '';
if(($query)&&($query != '')){
$total_query = rtrim($query, ' and');
$total_query = ' where '.$total_query;
}
$where = [$total_query];
$aColumns = $select;
$sIndexColumn = 'id';
$sTable = db_prefix() . 'check_in_out';
$join = [];
$result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [
'id',
'staff_id',
'date',
'type_check',
'workplace_id',
'route_point_id',
]);
$output = $result['output'];
$rResult = $result['rResult'];
foreach ($rResult as $aRow) {
$allow_add = true;
$row = [];
$row[] = get_staff_full_name($aRow['staff_id']);
$row[] = _dt($aRow['date']);
$type_check = '';
if($aRow['type_check'] == 1){
$type_check = '<p>'. _l('check_in') .'</p>';
}else if($aRow['type_check'] == 2 ){
$type_check = '<p>'. _l('check_out') .'</p>';
}
$row[] = $type_check;
$shift_name = '';
// Shift
$list_shift = $this->timesheets_model->get_shift_work_staff_by_date($aRow['staff_id'], date('Y-m-d', strtotime($aRow['date'])));
if(isset($word_shift_fillter) && $word_shift_fillter != ''){
if(count(array_intersect($list_shift, $word_shift_fillter))==0)
{
$allow_add = false;
}
}
$shift_s = '';
foreach ($list_shift as $ss) {
$data_shift_type = $this->timesheets_model->get_shift_type($ss);
if($data_shift_type){
$shift_s .= $data_shift_type->shift_type_name."\n";
}
}
// End shift
$row[] = $shift_s;
// Workplace
$workplace_name = '';
if($aRow['workplace_id'] && $aRow['workplace_id'] != '' && $aRow['workplace_id'] != 0){
$datawplace = $this->timesheets_model->get_workplace($aRow['workplace_id']);
if($datawplace){
$workplace_name = $datawplace->name;
}
}
// End workplace
$row[] = $workplace_name;
// Route
$route_name = '';
if($aRow['route_point_id'] && $aRow['route_point_id'] != '' && $aRow['route_point_id'] != 0){
$route_data = $this->timesheets_model->get_route_point($aRow['route_point_id']);
if($route_data){
$route_name = $route_data->name;
}
}
// End route
$row[] = $route_name;
if($allow_add == true){
$output['aaData'][] = $row;
}
}
echo json_encode($output);
die();
}
}
}
/**
* check in out progress according to the route report
* @return
*/
public function check_in_out_progress_according_to_the_route_report(){
if ($this->input->is_ajax_request()) {
if($this->input->post()){
$month = $this->input->post('months_2_report');
$year = $this->input->post('year_requisition');
$staff_fillter = $this->input->post("staff_2_fillter");
$department_fillter = $this->input->post("department_2_fillter");
$role_fillter = $this->input->post("roles_2_fillter");
$route_point_fillter = $this->input->post("route_point_2_fillter");
$select = [];
$columns = [];
$select[] = 'staffid';
$columns[] = 'staff';
$days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $year);
for ($d = 1; $d <= $days_in_month; $d++) {
$time = mktime(12, 0, 0, $month, $d, (int)$year);
if (date('m', $time) == $month) {
$select[] = 'staffid';
$columns[] = $year.'-'.$month.'-'.(strlen($d) == 1 ? '0'.$d : $d);
}
}
$query = '';
if(has_permission('report_management', '', 'view') || is_admin()){
if(isset($staff_fillter)){
$staffid_list = implode(',', $staff_fillter);
$query .= ' staffid in ('.$staffid_list.') and';
}
}
else{
$query .= ' staffid = '.get_staff_user_id().' and';
}
if(isset($department_fillter)){
$department_list = implode(',', $department_fillter);
$query .= ' staffid in (select staffid from '.db_prefix().'staff_departments where departmentid in ('.$department_list.')) and';
}
if(isset($role_fillter)){
$roles_id_list = implode(',', $role_fillter);
$query .= ' role in ('.$roles_id_list.') and';
}
$query.= ' staffid in (SELECT distinct(staffid) FROM '.db_prefix().'timesheets_route) and';
$total_query = '';
if(($query)&&($query != '')){
$total_query = rtrim($query, ' and');
$total_query = ' where '.$total_query;
}
$where = [$total_query];
$aColumns = $select;
$sIndexColumn = 'staffid';
$sTable = db_prefix() . 'staff';
$join = [];
$result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [
'staffid'
]);
$output = $result['output'];
$rResult = $result['rResult'];
foreach ($rResult as $aRow) {
$count_effect = 1;
if(isset($route_point_fillter) && $route_point_fillter != ''){
$count_effect = 0;
}
$row = [];
foreach ($columns as $key => $col) {
if($col == 'staff'){
$row[] = '<div class="min-width-200">'.get_staff_full_name($aRow['staffid']).'</div>';
}
else{
$progress = '0/0';
$ratio = ' (0%)';
$count_progress = 0;
$count_progress_complete = 0;
$staff_route_list = $this->timesheets_model->get_route_by_fillter($aRow['staffid'], $col);
foreach ($staff_route_list as $route_key => $route) {
if($count_effect == 0 && in_array($route['route_point_id'], $route_point_fillter)){
$count_effect = 1;
}
$count_progress++;
$valid_check = $this->timesheets_model->check_full_check_in_out_route_point($col, $aRow['staffid'], $route['route_point_id']);
if($valid_check == true){
$count_progress_complete++;
}
}
if($count_progress != 0){
$ratio = ' ('.number_format($count_progress_complete * 100 / $count_progress, 2).'%)';
}
$progress = $count_progress_complete.'/'.$count_progress;
$row[] = '<div class="min-width-100">'.$progress.$ratio.'</div>';
}
}
if($count_effect == 1){
$output['aaData'][] = $row;
}
}
echo json_encode($output);
die();
}
}
}
/**
* report by working hours
* @return json
*/
public function report_of_leave()
{
echo json_encode($this->timesheets_model->report_of_leave_by_month());
}
/**
* leave by department report
* @return json
*/
public function leave_by_department()
{
echo json_encode($this->timesheets_model->report_leave_by_department());
}
/**
* ratio check in out by workplace
* @return json
*/
public function ratio_check_in_out_by_workplace()
{
echo json_encode($this->timesheets_model->report_ratio_check_in_out_by_workplace());
}
/**
* get header report check in out
* @return json
*/
public function get_header_report_check_in_out($month, $year){
if(isset($month) && isset($year)){
if($month != '' && $year != ''){
$col_header = '';
$col_footer = '';
$list_fillter = [];
$col_header .= '<th>'._l('staff').'</th>';
$col_footer .= '<td></td>';
$month = $month;
$year = $year;
$days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $year);
$index = 0;
for ($d = 1; $d <= 31; $d++) {
$time = mktime(12, 0, 0, $month, $d, (int)$year);
if (date('m', $time) == $month) {
$col_header .= '<th>'.date('D d', $time).'</th>';
$col_footer .= '<td></td>';
$index++;
$list_fillter[] = $index;
}
}
echo json_encode([
'col_header' => $col_header,
'list_fillter' => $list_fillter,
'col_footer' => $col_footer
]);
}
}
}
}