File: //var/www/html/pmw24/app/application/controllers/admin/Jobreport.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');
class Jobreport extends MY_Controller
{
public function __construct()
{
parent::__construct();
$this->redirect_guest();
$this->admin = $this->session->userdata('admin');
$this->load->model('admin/mtyreservicereport');
$this->load->model('admin/mbookingreport');
}
public function index()
{
$this->_load_list_view();
}
/**
* AJAX endpoint to fetch calendar events dynamically
* Called by FullCalendar when view changes
*/
public function get_events()
{
// Get date range from FullCalendar request
$start_date = $this->input->get('start');
$end_date = $this->input->get('end');
// Convert ISO dates (format: 2024-01-01T00:00:00) to MySQL format (Y-m-d)
$start_date_formatted = null;
$end_date_formatted = null;
if ($start_date) {
// Remove time portion if present
$start_date_formatted = substr($start_date, 0, 10);
$start_date_formatted = date('Y-m-d', strtotime($start_date_formatted));
}
if ($end_date) {
// Remove time portion if present
$end_date_formatted = substr($end_date, 0, 10);
$end_date_formatted = date('Y-m-d', strtotime($end_date_formatted));
}
// Fetch calendar data for the requested date range ONLY
$calendarData = $this->mbookingreport->getCalendarData(array(), $start_date_formatted, $end_date_formatted);
// Format data for FullCalendar
$events = array();
if (!empty($calendarData)) {
foreach ($calendarData as $job) {
if (empty($job['service_date'])) {
continue; // Skip jobs without service date
}
// Format job status
$job_status_val = isset($job['job_status']) ? $job['job_status'] : null;
if ($job_status_val == 0) {
$job_status = "Not Started";
} else if ($job_status_val == 1) {
$job_status = "In Progress";
} else if ($job_status_val == 2) {
$job_status = "Completed";
if (!empty($job['service_end_date'])) {
$job_status = $job_status . ' On ' . date("d/m/Y", strtotime($job['service_end_date']));
}
} else {
$job_status = "Unknown";
}
// Format assign status
$assign_status_val = isset($job['assign_status']) ? $job['assign_status'] : null;
if ($assign_status_val == 0) {
$assign_status = "Rejected";
} else if ($assign_status_val == 1) {
$assign_status = "Accepted";
} else {
$assign_status = 'Pending';
}
$job_type = (isset($job['created_by']) && isset($job['mechanic_id']) && $job['created_by'] == $job['mechanic_id']) ? 2 : 1;
$events[] = array(
'id' => $job['job_id'], // Add id for FullCalendar
'title' => '#JOB' . str_pad($job['job_id'], 6, '0', STR_PAD_LEFT),
'start' => $job['service_date'], // FullCalendar accepts Y-m-d format
'extendedProps' => array(
'job_id' => $job['job_id'],
'service_date' => !empty($job['service_date']) ? date("d/m/Y", strtotime($job['service_date'])) : '',
'car_no' => isset($job['car_no']) ? $job['car_no'] : '',
'mechanic_name' => isset($job['mechanic_name']) ? $job['mechanic_name'] : '',
'job_status' => $job_status,
'assign_status' => $assign_status,
'assigned_by' => isset($job['assigned_by_name']) ? $job['assigned_by_name'] : '',
'job_type' => $job_type,
'paid_or_unpaid' => isset($job['paid_or_unpaid']) ? $job['paid_or_unpaid'] : '',
'description' => 'Car: ' . (isset($job['car_no']) ? $job['car_no'] : '') . ' Mechanic: ' . (isset($job['mechanic_name']) ? $job['mechanic_name'] : '')
)
);
}
}
// Return JSON response with proper headers
$this->output
->set_content_type('application/json')
->set_output(json_encode($events));
}
private function _load_list_view()
{
// No need to load calendar data here - it will be loaded via AJAX dynamically
// Only load menu permissions for the view
// Get menu permissions
$CI = &get_instance();
$CI->db->select('*');
$CI->db->from('role_menu');
$CI->db->join('menu', 'menu.menu_id = role_menu.menu_id', 'left');
$CI->db->where('role_id', $this->admin['role_id']);
$CI->db->where('parent_id', 39);
$query = $CI->db->get();
$menus = $query->result_array();
function searcharray($value, $key, $array)
{
foreach ($array as $k => $val) {
if (isset($val[$key]) && $val[$key] == $value) {
return $val;
}
}
return null;
}
$edit_result = searcharray('Edit', 'menu_name', $menus);
$data['calendar_data'] = array(); // Empty - loaded via AJAX
$data['edit_result'] = $edit_result;
$data['content'] = 'admin/jobreport/list';
$this->load->view('admin/layouts/index', $data);
}
}