I'm working on a project and one of my controllers is getting quite large and hard to maintain or add to. I'm having trouble deciding what belongs in the controller and what I can move to the model. What can I change to improve this?
class Job_update extends MY_Controller
{
function __construct()
{
parent::__construct();
$this->load->helper('form');
$this->load->library('email');
$this->load->helper('html');
$this->load->model('jobs_model');
}
/**
* Reassigns a tradie to the work order sending appropriate emails out
* @param int $job_id
*/
public function reassign_tradie($job_id)
{
$this->load->model('send_emails_model');
$this->load->model('tradie_model');
$this->load->model('notes_model');
//get tradie ids via get or post
if ($this->input->get("tradie")) {
$tradie_id = $this->input->get("tradie");
$prev_tradie = $this->input->get("prev_tradie");
} else {
$tradie_id = $this->input->post("tradie");
$prev_tradie = $this->input->post("prev_tradie");
}
if ($tradie_id == $prev_tradie) {
$this->session->set_flashdata('error', "That tradesman is already assigned to this job");
redirect('job_update/job_id/'.$job_id);
return;
}
//retrieve data for both tradies
$data = $this->tradie_model->get($tradie_id); //new tradie
$prev_tradie_data = $this->tradie_model->get($prev_tradie);//prev tradie
//update the status to pending and set the new tradie
$this->jobs_model->update($job_id, array(
"status" => "Pending",
"tradie" => $tradie_id,
"job_tradie_response" => 0
));
//add a note to the job documenting the change
$job_note_message = "Tradesman has been changed from " . $prev_tradie_data->tradie_firstname .
" to ". $data->tradie_firstname . " Reason: " . $this->input->post("reason");
$this->notes_model->insert($job_id, $job_note_message);
//select the new job data
$job_data = $this->jobs_model->with_site_location()->with_tradie()->get($job_id);
//send the tradie an email of the work order
$tradie_email = $this->jobs_model->build_tradie_email($job_id, $job_data);
$this->send_emails_model->insert($tradie_email);
//if the prev tradie didn't decline the job we need to send a cancellation email
if ($job_data->status != "Declined") {
$this->load->model('tradie_model');
$tradie_data = $this->tradie_model->get($prev_tradie);
$cancelled_email = $this->jobs_model->build_job_cancelled_email($job_id, $tradie_data);
$this->send_emails_model->insert($cancelled_email);
}
//redirect
$this->session->set_flashdata('msg', "Tradesman has been successfully changed");
redirect('job_update/job_id/'.$job_id);
}
/**
* Resends the work order to the assigned plumber also updates the status to pending
* @param int $job_id
*/
public function resend_work_order($job_id)
{
$this->load->model('notes_model');
$this->load->model('send_emails_model');
//updates status of job
$job_update = array("status" => "Pending", "job_tradie_response" => 0);
$this->jobs_model->update($job_update, $job_id);
//Sends email to tradesman
$job_data = $this->jobs_model->with_site_location()->with_tradie()->get($job_id);
$result = $this->jobs_model->build_tradie_email($job_id, $job_data);
$this->send_emails_model->insert($result);
//addes note to system talking about change
$data = array(
'note' => "Job has been resent to the plumber. Status changed to Pending",
'notes_job_id' => $job_id,
'datestamp' => date("Y-m-d H:i:s"),
'user_id' => $this->session->userdata('username')
);
$this->notes_model->insert($data);
$this->session->set_flashdata('msg', 'Resent Work Order to '. $job_data->tradie->tradie_firstname);
redirect('job_update/job_id/'.$job_id);
}
/**
* Inserts a new note from post data
* @param int $job_id
*/
public function job_add_note($job_id)
{
$this->_add_note($job_id, $this->input->post('job_notes'));
$this->session->set_flashdata('msg', 'Job Note Added Successfully');
redirect('job_update/job_id/'.$job_id);
}
/**
* Loads the photos page for a certain job
* @param int $job_id
*/
public function photos($job_id)
{
$data = array('job_id' => $job_id);
$this->load->view('job_photos_view', $data);
}
public function set_flash_for_bookin($job_id)
{
$this->session->set_flashdata('msg', 'Date/Time has been successfully set');
redirect('job_update/job_id/'.$job_id);
}
/**
* Saves the work order details (checkboxes, job_description)
* @param int $job_id
*/
public function submit_work_order($job_id)
{
$data = $this->update_checkboxes($job_id); //get all checkbox data
$this->jobs_model->update($data, $job_id); //save to db
$this->session->set_flashdata('msg', 'Work Order Updated Successfully');
redirect('job_update/job_id/'.$job_id);
}
/**
* Resends the customer confirmation email
* @param string (email) $c_email
* @param int $job_id
*/
public function resend_confirmation_email($c_email, $job_id)
{
$this->load->model('send_emails_model');
$this->job_update_model->update_send_email(array("email_sent" => 0), urldecode($c_email));
$this->session->set_flashdata('msg', 'Email Successfully Sent');
redirect('job_update/job_id/'.$job_id);
}
/**
* Sets the date for a checkbox
* @param string $post_data
* @param date $current_date_in_db
* @param bool (0,1) $is_checked
* @return date string format YYYY-MM-DD
*/
private function checkbox_helper($post_data, $current_date_in_db, $is_checked) {
if($post_data == false)
return "0000-00-00";
else if($post_data != false && $is_checked === "0")
return date("Y-m-d");
else
return $current_date_in_db;
}
/**
* returns an array with checkbox data
* @param int $job_id
* @return array
*/
public function update_checkboxes($job_id) {
$job_data = $this->jobs_model->get($job_id);
$current_date = date('Y-m-d');
$current_time = date('H:i:s');
//if 1 box is checked if 0 box is not checked
$data = array(
'box_customer_called' => ($this->input->post('checkbox1') == false ? '0' : '1'),
'box_customer_called_date' => $this->checkbox_helper($this->input->post('checkbox1'), $job_data->box_customer_called_date, $job_data->box_customer_called),
'box_photos_reviewed' => ($this->input->post('checkbox2') == false ? '0' : '1'),
'box_photos_received_date' => $this->checkbox_helper($this->input->post('checkbox2'), $job_data->box_photos_received_date, $job_data->box_photos_reviewed),
'box_photos_received' => ($this->input->post('checkbox6') == false ? '0' : '1'),
'box_photos_received_date' => $this->checkbox_helper($this->input->post('checkbox6'), $job_data->box_photos_received_date, $job_data->box_photos_received),
'box_completed' => ($this->input->post('checkbox7') == false ? '0' : '1'),
'box_completed_date' => $this->checkbox_helper($this->input->post('checkbox7'), $job_data->box_completed_date, $job_data->box_completed),
'box_completion_certificate' => ($this->input->post('checkbox3') == false ? '0' : '1'),
'box_completion_certificate_date' => $this->checkbox_helper($this->input->post('checkbox3'), $job_data->box_completion_certificate_date, $job_data->box_completion_certificate),
'box_invoiced' => ($this->input->post('checkbox4') == false ? '0' : '1'),
'box_invoiced_date' => $this->checkbox_helper($this->input->post('checkbox4'), $job_data->box_invoiced_date, $job_data->box_invoiced),
'box_warranty' => ($this->input->post('checkbox5') == false ? '0' : '1'),
'box_warranty_date' => $this->checkbox_helper($this->input->post('checkbox5'), $job_data->box_warranty_date, $job_data->box_warranty),
'job_description' => $this->input->post('job_description_new'),
);
//if the job was completed and is now unticked change the status
if($job_data->box_completed == 0 && $this->input->post('checkbox7') == "Completed")
$data['status'] = "Completed";
if($job_data->box_completed == 1 && $this->input->post('checkbox7') != "Completed")
$data['status'] = "Accepted";
return $data;
}
/**
* Inserts an email into the send que
* @param string $message
* @param string $email
* @param string $name
* @param string $email_subject
*/
public function email($message, $email, $name, $email_subject)
{
$this->load->model('send_emails_model');
$data = array('message' => $message,
'email' => $email,
'name' => $name,
'email_subject' => $email_subject);
$this->send_emails_model->insert($data);
}
/**
* Uploads a photo to the job directotry
* @param int $job_id
*/
public function upload_images($job_id)
{
$name_array = array();
if (!is_dir('assets/job_photos/'.add_prefix($job_id))) {//create directory is it doesn't exist
mkdir('./assets/job_photos/'.add_prefix($job_id), 0777, true);
$dir_exist = false; // dir not exist
}
$count = count($_FILES['userfile']['size']);
foreach ($_FILES as $key => $value) {
for ($s=0; $s<=$count-1; $s++) {
$_FILES['userfile']['name']=$value['name'][$s];
$_FILES['userfile']['type'] = $value['type'][$s];
$_FILES['userfile']['tmp_name'] = $value['tmp_name'][$s];
$_FILES['userfile']['error'] = $value['error'][$s];
$_FILES['userfile']['size'] = $value['size'][$s];
$config['upload_path'] = './assets/job_photos/'.add_prefix($job_id).'/';
$config['allowed_types'] = 'gif|jpg|png|jpeg|pdf|PNG|JPG|JPEG';
$this->load->library('upload', $config);
if (! $this->upload->do_upload()) {
$this->session->set_flashdata('error', $this->upload->display_errors());
} else {
$this->session->set_flashdata('msg', 'Successully Uploaded');
}
}
}
redirect(site_url('job_update/job_id/'.$job_id));
}
public function job_id($job_id)
{
$this->load->model('user_model');
$this->load->model('tradie_model');
$this->load->model('send_emails_model');
$this->load->model('notes_model');
//gather all data required for display
$job_data = $this->jobs_model->with_site_location()->with_tradie()->with_job_notes()->get($job_id);
$all_users['users'] = $this->user_model->select_all_users();
$tradies['tradies'] = $this->tradie_model->get_all();
$email = $this->send_emails_model->where('email', $job_data->site_location->tenant_email)->get();
//if job isn't found job data will be empty so we load a blank page and return
if (empty($job_data)) {
$this->headerlib->load_header();
return;
}
//change all 1's to checked for view
foreach ($job_data as $key => &$value) {
//filter thourgh all table coloumns to find the boxes coloumns
if(strpos($key, 'box') !== false && strpos($key, 'date') === false) {
if($value == 1)
$value = "checked";
}
}
$data = array_merge((array)$job_data, (array)$all_users, (array)$job_emails, (array)$tradies);
$this->headerlib->load_header();
$this->footerlib->load_footer();
$this->load->view('job_update_view', $data);
}
/**
* Deletes a job
* @param int $job_id job_id you wish to delete
*/
public function delete_job($job_id)
{
$this->load->model('send_emails_model');
$this->load->model('tradie_model');
if($this->session->userdata('user_team_id') != 40)
{
$this->session->set_flashdata('error', 'You do not have permission to delete this job');
redirect($_SERVER['HTTP_REFERER']);
return;
}
$data = $this->jobs_model->with_tradie()->get($job_id);
$tradie_data = $this->tradie_model->get($data->tradie->tradie_id);
$cancelled_email = $this->jobs_model->build_job_cancelled_email($job_id, $tradie_data);
$this->send_emails_model->insert($cancelled_email);
if ($this->jobs_model->delete($job_id)) {
$this->session->set_flashdata('msg', 'Job has been successfully deleted');
} else {
$this->session->set_flashdata('error', 'Something went wrong, contact an administrator');
}
redirect($_SERVER['HTTP_REFERER']);
}
}
Thanks for the help!