Skip to content

Instantly share code, notes, and snippets.

@Tapha
Created June 18, 2014 15:12
Show Gist options
  • Select an option

  • Save Tapha/0035c87b1af1a6defcdf to your computer and use it in GitHub Desktop.

Select an option

Save Tapha/0035c87b1af1a6defcdf to your computer and use it in GitHub Desktop.
A model that i implemented to manage scheduling in my app (podigniter.com)
<?php
class Scheduler extends CI_Model {
//var $title = '';
//var $content = '';
//var $date = '';
function __construct()
{
// Call the Model constructor
parent::__construct();
$this->load->library('ion_auth');
$this->load->library('mailman');
$this->load->library('twilio');
}
public function startsWith($haystack, $needle)
{
return $needle === "" || strpos($haystack, $needle) === 0;
}
public function gmt_offset($time, $is_guest = NULL)
{
if(strpos($time,'-') !== false)
{
$time = str_replace('-', '', $time);
$time = str_replace(':00', '', $time);
//if first char = 0 then remove.
if ($this->startsWith($time, '0'))
{
$time = substr($time, 1);
}
$time = (int)$time * 3600;
$time = (string)('-'.$time);
return $time;
}
elseif(strpos($time,'+') !== false)
{
$time = str_replace('+', '', $time);
$time = str_replace(':00', '', $time);
//if first char = 0 then remove.
if ($this->startsWith($time, '0'))
{
$time = substr($time, 1);
}
$time = (int)$time * 3600;
$time = (string)('+'.$time);
return $time;
}
}
public function add_sub_gmt_offset($string, $offset)
{
if(strpos($offset,'-') !== false)
{
$offset = str_replace('-', '', $offset);
$offset = (int)$offset;
$dtime = DateTime::createFromFormat('H:i', $string);
$timestamp = $dtime->getTimestamp();
$new_time = $timestamp - $offset;
$new_time = date('H:i', $new_time);
return $new_time;
}
elseif(strpos($offset,'+') !== false)
{
$$offset = str_replace('-', '', $offset);
$offset = (int)$offset;
$dtime = DateTime::createFromFormat('H:i', $string);
$timestamp = $dtime->getTimestamp();
$new_time = $timestamp + $offset;
$new_time = date('H:i', $new_time);
return $new_time;
}
}
public function _get_gmt_offset($user_id, $is_guest = NULL)
{
if ($is_guest == 'guest')
{
$q = $this->db->get_where('tbl_requesters_info', array('id' => $user_id));
return $q->result()[0]->gmt_timezone;
}
else
{
$q = $this->db->get_where('tbl_user_info', array('FK_user_id' => $user_id));
return $q->result()[0]->gmt_timezone;
}
}
public function _get_set_time($time_id)
{
$q = $this->db->get_where('tbl_user_available_times', array('id' => $time_id));
return $q->result()[0]->time; //apply gmt offset function to this.
}
public function get_custom_timestamp()
{
$user = $this->ion_auth->user()->row();
$gmt_offset_string = $this->_get_gmt_offset($user->id);
$gmt = $this->gmt_offset($gmt_offset_string);
return $gmt;
}
public function _get_set_date($time_id)
{
$q = $this->db->get_where('tbl_user_available_times', array('id' => $time_id));
$d = $q->result()[0]->FK_date_id;
$qq = $this->db->get_where('lut_dates', array('id' => $d));
$qqma = $qq->result()[0]->date;
$myDateTime = DateTime::createFromFormat('Y-m-d', $qqma);
$newDateString = $myDateTime->format('F jS Y');
return $newDateString;
}
public function _get_guest_data($guest_id)
{
$q = $this->db->get_where('tbl_requesters_info', array('id' => $guest_id));
return $q->result()[0];
}
public function _get_episode_name($ep_id)
{
$q = $this->db->get_where('episodes', array('id' => $ep_id));
return $q->result()[0]->name;
}
public function _get_user_id_from_ep($ep_id)
{
$q = $this->db->get_where('episodes', array('id' => $ep_id));
return $q->result()[0]->user_id;
}
public function _get_user_data($user_id)
{
$q = $this->db->get_where('users', array('id' => $user_id));
return $q->result()[0];
}
public function setting_you($str_input = 0, $user_id)
{
if ($str_input != 0)
{
$this->db->select($str_input);
$this->db->where('user_id', $user_id);
$q = $this->db->get('reminders_settings');
if ($q->num_rows > 0)
{
$res = (int)$q->result()[0]->$str_input;
//print_r($res);
return $res;
}
else
{
return 0;
}
}
}
public function setting_guest($str_input = 0, $user_id)
{
if ($str_input != 0)
{
$this->db->select($str_input);
$this->db->where('user_id', $user_id);
$q = $this->db->get('reminders_settings');
if ($q->num_rows > 0)
{
$res = (int)$q->result()[0]->$str_input;
//print_r($res);
return $res;
}
else
{
return 0;
}
}
}
public function get_curr_accurate_time($timestring)
{
$user = $this->ion_auth->user()->row();
$gmt_offset_string = $this->_get_gmt_offset($user->id);
$gmt = $this->gmt_offset($gmt_offset_string);
$curr_accurate_time = $this->add_sub_gmt_offset($timestring, $gmt);
return $curr_accurate_time;
}
public function you_reminder_email($req_id, $time_left)
{
$query = $this->db->get_where('tbl_requested_meetings', array('FK_requested_time_id' => $req_id, 'approved' => 1));
$r = $query->result()[0];
//Send emails - format to user/interviewees times + gmt.
$guest = $this->_get_guest_data($r->FK_requester_info_id);
$user_data = $this->_get_user_data($this->_get_user_id_from_ep($r->FK_episode_id));
$episode = $this->_get_episode_name($r->FK_episode_id);
$gmt_offset = $this->_get_gmt_offset($user_data->id);
$set_time = $this->_get_set_time($r->FK_requested_time_id);
$temp_gmt = $this->gmt_offset($gmt_offset);
$set_time = $this->add_sub_gmt_offset($set_time, $temp_gmt);
$set_date = $this->_get_set_date($r->FK_requested_time_id);
$r = $this->mailman->setTransport(Mailman::MAILMAN_TRANSPORT_MANDRILL)->sendmail(array(
'from' => 'reminders@podigniter.com',
'to' => $user_data->email,
'subject' => 'This is a reminder for your interview with '.$guest->name.', in '.$time_left,
'template_html' => 'emails/you_reminder',
'template_alt' => 'emails/you_reminder',
'template_data' => array(
'guest_name' => $guest->name,
'time_left' => $time_left,
'user_name' => $user_data->first_name,
'episode' => $episode,
'set_time' => $set_time,
'gmt' => $gmt_offset,
'date' => $set_date
)
)
);
print_r($r);
}
public function you_reminder_text($req_id)
{
//for sms check if the user has credits, if they do, and the user has unchecked send sms reminder then send them the reminder,
//then minus 1 from their credits. else if interviewee has checked send sms reminder, send it and minus 2. else dont send.
//Disable ability to check it on interviewees end if user runs out of credits. just don't show it as an option.
$query = $this->db->get_where('tbl_requested_meetings', array('FK_requested_time_id' => $req_id, 'approved' => 1));
$r = $query->result()[0];
//Send emails - format to user/interviewees times + gmt.
$guest = $this->_get_guest_data($r->FK_requester_info_id);
$user_data = $this->_get_user_data();
//check credits. if no, send email. with upgrade link.
$from = '15005550006';
$to = '+15005550006';
$message = 'This is a test...';
$response = $this->twilio->sms($from, $to, $message);
if($response->IsError)
{
echo 'Error: ' . $response->ErrorMessage;
}
else
{
echo 'Sent message to ' . $to;
}
}
public function guest_reminder_email($req_id, $time_left)
{
//Send emails - format to user/interviewees times + gmt.
$query = $this->db->get_where('tbl_requested_meetings', array('FK_requested_time_id' => $req_id, 'approved' => 1));
$r = $query->result()[0];
//Send emails - format to user/interviewees times + gmt.
$guest = $this->_get_guest_data($r->FK_requester_info_id);
$user_data = $this->_get_user_data($this->_get_user_id_from_ep($r->FK_episode_id));
$episode = $this->_get_episode_name($r->FK_episode_id);
$gmt_offset = $this->_get_gmt_offset($guest->id, 'guest');
$set_time = $this->_get_set_time($r->FK_requested_time_id);
$temp_gmt = $this->gmt_offset($gmt_offset);
$set_time = $this->add_sub_gmt_offset($set_time, $temp_gmt);
$set_date = $this->_get_set_date($r->FK_requested_time_id);
$r = $this->mailman->setTransport(Mailman::MAILMAN_TRANSPORT_MANDRILL)->sendmail(array(
'from' => 'reminders@podigniter.com',
'to' => $guest->email,
'subject' => 'This is a reminder for your interview with '.$user_data->first_name.', in '.$time_left,
'template_html' => 'emails/guest_reminder',
'template_alt' => 'emails/guest_reminder',
'template_data' => array(
'guest_name' => $guest->name,
'time_left' => $time_left,
'user_name' => $user_data->first_name,
'episode' => $episode,
'set_time' => $set_time,
'gmt' => $gmt_offset,
'date' => $set_date
)
)
);
print_r($guest->email);
}
public function guest_reminder_text($req_id)
{
//for sms check if the user has credits, if they do, and the user has unchecked send sms reminder then send them the reminder,
//then minus 1 from their credits. else if interviewee has checked send sms reminder, send it and minus 2. else dont send.
//Disable ability to check it on interviewees end if user runs out of credits. just don't show it as an option.
$from = '15005550006';
$to = '+15005550006';
$message = 'This is a test...';
$response = $this->twilio->sms($from, $to, $message);
if($response->IsError)
{
echo 'Error: ' . $response->ErrorMessage;
}
else
{
echo 'Sent message to ' . $to;
}
}
public function create_reminder_settings($user_id)
{
$data = array(
'user_id' => $user_id
);
$this->db->insert('reminders_settings', $data);
}
public function set_state($col, $state, $user_id)
{
$state = (int)$state;
$data = array(
$col => $state
);
$this->db->where('user_id', $user_id);
$this->db->update('reminders_settings', $data);
}
public function get_setting($col, $user)
{
$col = (string)$col;
$this->db->select($col);
$this->db->where('user_id', $user->id);
$query = $this->db->get('reminders_settings');
return $query->result()[0]->$col;
}
public function get_approved_time($time_id)
{
$query = $this->db->get_where('tbl_user_available_times', array('id' => $time_id));
return $query->result()[0]->time;
}
public function get_req_time_id($req_id)
{
$query = $this->db->get_where('tbl_requested_meetings', array('id' => $req_id));
return $query->result()[0]->FK_requested_time_id;
}
public function is_suggested($time_id)
{
$query = $this->db->get_where('tbl_user_available_times', array('id' => $time_id));
if ($query->result()[0]->suggested == 1)
{
return TRUE;
}
else
{
return FALSE;
}
}
public function new_select($req_id, $req_time_id, $req_info_id)
{
$data = array(
'approved' => 1
);
$this->db->where('id', $req_id);
$this->db->update('tbl_requested_meetings', $data);
if ($this->db->affected_rows() > 0)
{
$data1 = array(
'reserved' => 1
);
$this->db->where('id', $req_time_id);
$this->db->update('tbl_user_available_times', $data1);
$user_id = $this->ion_auth->user()->row()->id;
$q = $this->db->get_where('tbl_user_available_times', array('reserved' => 1, 'FK_user_id' => $user_id));
foreach ($q->result() as $r)
{
if ($r->id != $req_time_id)
{
$data0 = array(
'reserved' => 0
);
$this->db->where('id', $r->id);
$this->db->update('tbl_user_available_times', $data0);
}
}
$query = $this->db->get_where('tbl_requested_meetings', array('FK_requester_info_id' => $req_info_id));
foreach ($query->result() as $row)
{
if ($row->id != $req_id)
{
$data_2 = array(
'approved' => 0
);
$this->db->where('id', $row->id);
$this->db->update('tbl_requested_meetings', $data_2);
}
}
return TRUE;
}
else
{
return FALSE;
}
}
public function get_completed_time($time, $episode_id)
{
$query = $this->db->get_where('episodes', array('id' => $episode_id));
$duration = (int)$query->result()[0]->meeting_duration;
$duration = $duration * 60;
$time = strtotime($time);
$nw_time = date("H:i", ($time += ($duration)));
return $nw_time;
}
public function get_requester_info($requester_info_id)
{
$query = $this->db->get_where('tbl_requesters_info', array('id' => $requester_info_id));
return $query->result()[0];
}
public function get_upcoming()
{
$user = $this->ion_auth->user()->row();
$this->db->select('*');
$this->db->from('tbl_requested_meetings');
$this->db->join('tbl_user_available_times', 'tbl_user_available_times.id= tbl_requested_meetings.FK_requested_time_id');
$this->db->where('tbl_user_available_times.FK_user_id', $user->id);
$this->db->where('tbl_requested_meetings.approved', 1);
$this->db->order_by("tbl_requested_meetings.id", "desc");
$q = $this->db->get();
return $q;
}
public function get_pending()
{
$user = $this->ion_auth->user()->row();
$this->db->select('*');
$this->db->from('tbl_requested_meetings');
$this->db->join('tbl_user_available_times', 'tbl_user_available_times.id= tbl_requested_meetings.FK_requested_time_id');
$this->db->where('tbl_user_available_times.FK_user_id', $user->id);
$this->db->where('tbl_requested_meetings.approved', 0);
$this->db->order_by("tbl_requested_meetings.id", "desc");
$q = $this->db->get();
return $q;
}
public function get_completed()
{
$user = $this->ion_auth->user()->row();
$this->db->select('*');
$this->db->from('tbl_requested_meetings');
$this->db->join('tbl_user_available_times', 'tbl_user_available_times.id= tbl_requested_meetings.FK_requested_time_id');
$this->db->where('tbl_user_available_times.FK_user_id', $user->id);
$this->db->where('tbl_requested_meetings.approved', 2);
$this->db->order_by("tbl_requested_meetings.id", "desc");
$q = $this->db->get();
return $q;
}
public function get_all_approved_times()
{
$query = $this->db->get_where('tbl_requested_meetings', array('approved' => 1));
return $query;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment