First of all I am new with CodeIgniter and still in the process of learning.
I have created an app on React Native that selects date and time to create an appointment. I am using CodeIgniter as my back-end. The appointment has a date, start time, and end time.
The conditions for creating appointment are:
If an appointment is already created, such as:
date = 15-01-2020,start time = 7:00pm,end time = 8:00pm.Then user CANNOT create another appointment such as:
date = 15-01-2020,start time = 7:00pm,end time = 8:00pm(similar date and time since 7pm to 8pm already booked)
date = 15-01-2020,start time = 7:20pm,end time = 7:40pm(overlapping inside already booked appointment)
date = 15-01-2020,start time = 7:45pm,end time = 8:45pm(start time overlapping with already booked appointment)
date = 15-01-2020,start time = 6:45pm,end time = 7:45pm(end time overlapping with already booked appointment)
date = 15-01-2020,start time = 6:00pm,end time = 9:00pm(overlapping with already booked appointment)Also, user should not be able to create appointment with time such as:
start time = 8:00pm,end time = 7:00pm(wherestart time > end time)
From the above conditions, I have been able to achieve only condition no.1. However, there’s another problem I faced, where If start time = 7:00pm to end time = 8:00pm is booked, I CANNOT create from start time = 8:00pm to end time = 9:00pm. Code snippet provided below:
This is the function I have created (with the help of a friend) on the back-end MODEL:
public function check_datetime_range($where)
{
$this->db->where('freelancer_id', $where['freelancer_id']);
$this->db->where("DATE_FORMAT(app_date_start, '%Y-%m-%d') = ", date('Y-m-d', strtotime($where['app_date_start'])));
$this->db->group_start();
$this->db->group_start();
$this->db->where('app_date_start >=', $where['app_date_start']);
$this->db->where('app_date_end <=', $where['app_date_end']);
$this->db->group_end();
$this->db->or_group_start();
$this->db->where('app_date_start >=', date('Y-m-d H:i:s', strtotime($where['app_date_start'])-3600));
$this->db->group_start();
$this->db->where('app_date_end <=', $where['app_date_start']);
$this->db->or_where('app_date_end <=', $where['app_date_end']);
$this->db->group_end();
$this->db->group_end();
$this->db->group_end();
return $this->db->get($this->_table_name)->num_rows();
}
//the code below are from the CONTROLLER.
//Information for: app_date_start and app_date_end (it contains both date and time).
/*$start = new DateTime($this->post('app_date') . ' ' . $this->post('start_time'));
$end = new DateTime($this->post('app_date') . ' ' . $this->post('end_time'));
$save['app_date_start'] = $start->format('Y-m-d H:i:s');
$save['app_date_end'] = $end->format('Y-m-d H:i:s');*/
Any help would be appreciated since these are all a bit overwhelming at the moment.
Advertisement
Answer
Solved:
public function check_datetime_range($where)
{
$this->db->where('freelancer_id', $where['freelancer_id']);
$this->db->where("DATE_FORMAT(app_date_start, '%Y-%m-%d') = ", date('Y-m-d', strtotime($where['app_date_start'])));
$this->db->group_start();
// Example:
// start time = 7:00pm, end time = 8:00pm, date = 15-01-2020 (Existing Appointment)
//1. Prevents overlapping time with an existing appointment
// start time = 7:00pm, end time = 8:00pm, date = 15-01-2020
// OR
// start time = 6:00pm, end time = 9:00pm, date = 15-01-2020
$this->db->group_start();
$this->db->where('app_date_start >=', $where['app_date_start']);
$this->db->where('app_date_end <=', $where['app_date_end']);
$this->db->group_end();
//2. Prevents overlapping time from within an existing appointment
// start time = 7:15pm, end time = 7:45pm, date = 15-01-2020
$this->db->or_group_start();
$this->db->where('app_date_start <=', $where['app_date_start']);
$this->db->where('app_date_end >=', $where['app_date_end']);
$this->db->group_end();
//3. Prevents overlapping end time inside an existing appointment
// start time = 6:45pm, end time = 7:45pm, date = 15-01-2020
$this->db->or_group_start();
$this->db->where('app_date_start >', $where['app_date_start']);
$this->db->where('app_date_start <', $where['app_date_end']);
$this->db->where('app_date_end >', $where['app_date_end']);
$this->db->group_end();
//4. Prevents overlapping start time inside an existing appointment
// start time = 7:45pm, end time = 8:45pm, date = 15-01-2020
$this->db->or_group_start();
$this->db->where('app_date_start <', $where['app_date_start']);
$this->db->where('app_date_start <', $where['app_date_end']);
$this->db->where('app_date_end >', $where['app_date_start']);
$this->db->where('app_date_end <', $where['app_date_end']);
$this->db->group_end();
//5. Prevents start time > end time
// start time = 7:00pm, end time = 6:00pm
$this->db->or_group_start();
$this->db->where('app_date_start >', $where['app_date_end']);
$this->db->group_end();
$this->db->group_end();
return $this->db->get($this->_table_name)->num_rows();
}