HEX
Server: Apache/2.4.41 (Amazon) OpenSSL/1.0.2k-fips PHP/5.6.40
System: Linux ip-172-31-40-18 4.14.146-93.123.amzn1.x86_64 #1 SMP Tue Sep 24 00:45:23 UTC 2019 x86_64
User: apache (48)
PHP: 5.6.40
Disabled: NONE
Upload Files
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);
    }
}