'asc'); // default order public function __construct() { parent::__construct(); } private function _get_datatables_query($data_source){ $this->db->select(" ees.email_schedule_id, es.event_schedule_id, es.event_id, es.back_office_status as event_status, ees.email_schedule_status as email_schedule_status_ ") ->select("(CASE WHEN ees.email_schedule_status = 1 THEN 'Active' ELSE 'Passed' END) AS email_schedule_status", FALSE) ->select("(CASE WHEN ees.email_sched_overwrite_default = 1 THEN 'OUI' WHEN ees.email_sched_overwrite_default = 2 THEN 'NON' ELSE 'NO' END) AS email_sched_overwrite_default", FALSE) ->select("DATE_FORMAT(ees.email_schedule_date, '%d/%m/%Y %Hh%i') AS email_schedule_date", FALSE) ->select("DATE_FORMAT(es.reservation_start_date, '%d/%m/%Y %H:%i:%s') AS reservation_start_date", FALSE) ->select("DATE_FORMAT(es.start_date_time, '%d/%m/%Y %Hh%i') AS start_date_time", FALSE) ->select("DATE_FORMAT(es.start_date_time, '%d/%m/%Y %H:%i:%s') AS start_date_time_", FALSE) ->select("CONCAT(u.first_name, ' ', u.last_name) as email_schedule_author", FALSE) ->select("DATE_FORMAT(ees.email_schedule_date_added, '%d/%m/%Y %Hh%i') AS email_schedule_date_added", FALSE) ->select("DATE_FORMAT(ees.email_schedule_date, '%Y-%m-%d %H:%i:%s') AS email_schedule_date_", FALSE) ->from("event_email_schedule ees") ->join('event_schedule es', 'es.event_schedule_id = ees.event_schedule_id', 'left') ->join('event_email_default_setting eeds', 'eeds.email_tpl_setting_id = ees.reference', 'left') ->join('user u', 'u.user_id = ees.email_schedule_author', 'left') ->where("eeds.email_type_id", 1) ->where("ees.event_schedule_id", $data_source["event_schedule_id"]) ->where_in("ees.email_schedule_status", array(1, 2)); $i = 0; foreach ($this->column_search as $item) {// loop column if ($data_source['search']['value']) { // if datatable send POST for search if ($i === 0) { // first loop $this->db->like($item, $data_source['search']['value']); } else { $this->db->or_like($item, $data_source['search']['value']); } } $i++; } $this->db->order_by('email_schedule_status', 'asc'); if(isset($data_source['order'])) { // here order processing if(isset($data_source['order']['0']['dir'])) { $this->db->order_by($this->column_order[$data_source['order']['0']['column']], $data_source['order']['0']['dir']); } } else if(isset($this->order)) { $order = $this->order; $this->db->order_by(key($order), $order[key($order)]); } } public function get_events_list_export($data_source){ $this->_get_datatables_query($data_source); $query = $this->db->get(); return $query->result(); } public function get_datatables($data_source){ $this->_get_datatables_query($data_source); if($data_source['length'] != -1) $this->db->limit($data_source['length'], $data_source['start']); return $this->db->get()->result(); } public function count_filtered($data_source){ $this->_get_datatables_query($data_source); return $this->db->get()->num_rows(); } public function count_all($data_source){ $this->_get_datatables_query($data_source); return $this->db->count_all_results(); } public function add_email_reminder($data){ if($data) { //defer all default settings using the default email sending $this->db->query("UPDATE event_email_recipient eer LEFT JOIN event_email_recipient_other_detail eerod ON eerod.email_recipient_id = eer.email_recipient_id SET eer.email_status = 5, eer.email_date_time = (CASE WHEN eer.email_status IN(0, 2, 3) THEN NOW() ELSE eer.email_date_time END) WHERE eerod.email_sched_reference = 2 AND eer.email_type_id = 1 AND eer.email_status IN(1, 0, 2, 3) AND eerod.email_sched_reference_id IN(SELECT eeds.email_tpl_setting_id FROM event_email_default_setting eeds WHERE eeds.email_type_id = 1 AND eeds.email_tpl_setting_status = 1 AND eeds.is_default = 0 )"); //defer all default settings using the custom $this->db->query("UPDATE event_email_recipient eer LEFT JOIN event_email_recipient_other_detail eerod ON eerod.email_recipient_id = eer.email_recipient_id SET eer.email_status = 5, eer.email_date_time = (CASE WHEN eer.email_status IN(0, 2, 3) THEN NOW() ELSE eer.email_date_time END) WHERE eerod.email_sched_reference = 1 AND eer.email_type_id = 1 AND eer.email_status IN(1, 0, 2, 3) AND eerod.email_sched_reference_id = '".$this->db->escape_str($data["reference"])."'"); //replace all schedule, make it past $this->db->where('event_schedule_id', $data['event_schedule_id']); $this->db->where('email_schedule_status', 1); $this->db->update('event_email_schedule', array('email_schedule_status' => 2)); $this->db->insert("event_email_schedule", $data); if ($this->db->affected_rows()) { return $this->db->insert_id(); } } return false; } public function update_email_reminder($data){ if($data) { $email_schedule_id = $data["email_schedule_id"]; unset($data["email_schedule_id"]); //if event is changed then defer sending emails to subscribers under the previously selected event for this record. if($this->check_changed_of_event($email_schedule_id, $data["event_schedule_id"])) { //defer all default settings using the default email sending $this->db->query("UPDATE event_email_recipient eer LEFT JOIN event_email_recipient_other_detail eerod ON eerod.email_recipient_id = eer.email_recipient_id SET eer.email_status = 5, eer.email_date_time = (CASE WHEN eer.email_status IN(0, 2, 3) THEN NOW() ELSE eer.email_date_time END) WHERE eerod.email_sched_reference = 1 AND eer.email_type_id = 1 AND eer.email_status IN(1, 0, 2, 3) AND eerod.email_sched_reference_id = '".$this->db->escape_str($email_schedule_id)."'"); } $this->db->where("email_schedule_id", $email_schedule_id); $update = $this->db->update("event_email_schedule", $data); if ($update) { return true; } } return false; } private function check_changed_of_event($email_schedule_id, $event_schedule_id){ return $this->db->query( "SELECT eer.email_recipient_id FROM event_email_recipient eer LEFT JOIN event_email_recipient_other_detail eerod ON eerod.email_recipient_id = eer.email_recipient_id WHERE eerod.email_sched_reference_id = ? AND eer.event_schedule_id != ? AND eerod.email_sched_reference = 1 AND eer.email_type_id = 1 AND eer.email_status IN(0,2,3) LIMIT 1 ", array($email_schedule_id, $event_schedule_id))->num_rows(); } public function delete_email_reminder($email_schedule_id){ //when an schedule is deleted, the on queue reminder email must be deferred/deleted also to stop from sending emails to subscribers. $this->db->query("UPDATE event_email_recipient eer LEFT JOIN event_email_recipient_other_detail eerod ON eerod.email_recipient_id = eer.email_recipient_id SET eer.email_status = 5, eer.email_date_time = NOW() WHERE eerod.email_sched_reference = 1 AND eer.email_type_id = 1 AND eer.email_status IN(0, 2, 3) AND eerod.email_sched_reference_id = '".$this->db->escape_str($email_schedule_id)."'"); $this->db->where("email_schedule_id", $email_schedule_id); $this->db->update("event_email_schedule", array("email_schedule_status" => 0)); return $this->db->affected_rows(); } public function get_email_sending_schedule($event){ //new schedule $parameters = $this->get_default_email_schedule($event->event_id, 3); if(countVal($parameters) <= 0) { return array(); } return $this->db->query(" SELECT eeds.email_tpl_setting_id as email_schedule_id, (CASE WHEN eeds.email_tpl_setting_sched_by = 'HOURS' THEN DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL eeds.email_tpl_setting_sched+5 HOUR) WHEN eeds.email_tpl_setting_sched_by = 'DAYS' THEN DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL eeds.email_tpl_setting_sched+1 DAY) ELSE DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL eeds.email_tpl_setting_sched+120 MINUTE) END) AS email_schedule, 2 as email_sched_reference FROM event_email_default_setting eeds WHERE eeds.email_type_id = 3 AND eeds.email_tpl_setting_status = 1 AND eeds.email_tpl_setting_id NOT IN( SELECT `ees`.`reference` FROM event_email_schedule ees LEFT JOIN event e ON e.event_id = ees.event_id WHERE `ees`.`event_id` = '".$this->db->escape_str($event->event_id)."' AND ees.reference = eeds.email_tpl_setting_id AND ees.email_schedule_status IN (1,2) AND e.back_office_status IN(2,3) GROUP BY ees.reference ) AND eeds.email_tpl_setting_id IN(".((isset($parameters->email_tpl_setting_id) && !empty($parameters->email_tpl_setting_id))?$this->db->escape($parameters->email_tpl_setting_id):"").") AND ( SELECT CASE WHEN CONCAT(eeds.reference_id,'_',eeds.email_type_id,'_',eeds.is_default,'_1') = ? THEN (SELECT CASE WHEN eeds.email_tpl_setting_sched_by = 'HOURS' THEN DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL (eeds.email_tpl_setting_sched+5) HOUR) WHEN eeds.email_tpl_setting_sched_by = 'DAYS' THEN DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL (eeds.email_tpl_setting_sched+2) DAY) ELSE DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL (eeds.email_tpl_setting_sched +60) MINUTE) END) WHEN CONCAT(eeds.reference_id,'_',eeds.email_type_id,'_',eeds.is_default,'_1') = ? THEN (SELECT CASE WHEN eeds.email_tpl_setting_sched_by = 'HOURS' THEN DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL (eeds.email_tpl_setting_sched+5) HOUR) WHEN eeds.email_tpl_setting_sched_by = 'DAYS' THEN DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL (eeds.email_tpl_setting_sched+2) DAY) ELSE DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL (eeds.email_tpl_setting_sched +60) MINUTE) END) WHEN CONCAT('_',eeds.email_type_id,'_',eeds.is_default,'_1') = ? THEN (SELECT CASE WHEN eeds.email_tpl_setting_sched_by = 'HOURS' THEN DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL (eeds.email_tpl_setting_sched+5) HOUR) WHEN eeds.email_tpl_setting_sched_by = 'DAYS' THEN DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL (eeds.email_tpl_setting_sched+2) DAY) ELSE DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL (eeds.email_tpl_setting_sched +60) MINUTE) END) ELSE DATE_SUB('".$this->db->escape_str($event->start_date_time)."', INTERVAL (eeds.email_tpl_setting_sched +60) MINUTE) END ) <= NOW() UNION SELECT `ees`.`email_schedule_id`, ees.email_schedule_date as email_schedule, 1 as email_sched_reference FROM `event` e LEFT JOIN `event_email_schedule` ees ON `ees`.`event_id` = `e`.`event_id` LEFT JOIN `event_email_default_setting` eeds ON `eeds`.`email_tpl_setting_id` = `ees`.`reference` WHERE `e`.`event_id` = '".$this->db->escape_str($event->event_id)."' AND e.start_date_time >= NOW() AND ees.email_schedule_status = 1 AND eeds.email_type_id = 3 AND e.back_office_status IN(2,3) AND DATE_SUB(ees.email_schedule_date, INTERVAL 2 DAY) <= NOW() ORDER BY email_schedule, email_schedule_id ASC LIMIT 1", array(($event->event_id."_3_1_1"), ($event->event_id."_3_1_1"), "_3_0_1"))->result(); } public function check_email_active_processes($email_schedule_id){ $this->db->where("email_sched_reference_id", $email_schedule_id); $this->db->where("email_sched_reference", 1); $this->db->where("email_type_id", 1); $this->db->where_in("email_status", array(0,2,3)); $this->db->limit(5); return $this->db->get("event_email_recipient")->num_rows(); } public function add_email_schedule_for_waitlist($event_id, $event_schedule_id){ $parameters =$this->get_default_email_schedule($event_id, $event_schedule_id, 2); //update previous email schedule before adding new one $this->db->query(" UPDATE event_email_schedule ees LEFT JOIN event_email_default_setting eeds on eeds.email_tpl_setting_id = ees.reference set ees.email_schedule_status = 2 WHERE eeds.email_type_id = 2 AND ees.email_schedule_status = 1 AND ees.event_schedule_id = ".$this->db->escape($event_schedule_id).""); if(countVal($parameters) > 0){ //then insert a new one $reset_sched_date = date_modify(new DateTime(), "+".$parameters->email_tpl_setting_sched.strtolower($parameters->email_tpl_setting_sched_by)); $data = array( "event_schedule_id" => $event_schedule_id, "reference" => $parameters->email_tpl_setting_id, // parameters "email_schedule_date" => $reset_sched_date->format("Y-m-d H:i:s"), //reset hr "email_schedule_status" => 1 ); $this->db->insert("event_email_schedule", $data); return array( "success" => true, "schedule"=> $parameters, "email_schedule_id" => $this->db->insert_id() ); } return array("success" => false); } private function get_default_email_schedule($event_id, $email_type){ $where_data = array( //'if' get the specific schedule per event_schedule_id // $event_schedule_id."_2", //'else if' get the specific schedule per event_id $event_id."_1", //'else if' get the default sched if any "_0" //'else' return false ); $result = array(); foreach ($where_data as $value){ $result = $this->db->query(" SELECT eeds.email_tpl_setting_id, eeds.email_tpl_setting_sched, eeds.email_tpl_setting_sched_by, eeds.email_tpl_number_of_recipients FROM event_email_default_setting eeds WHERE eeds.email_type_id = ".$this->db->escape($email_type)." AND eeds.email_tpl_setting_status = 1 AND " .(($value != "_0") ? "CONCAT(eeds.reference_id,'_',eeds.is_default)" : "CONCAT('_',eeds.is_default)")." = '".$this->db->escape_str($value)."'"." ")->row(); if(countVal($result) > 0){ break; } } return $result; } public function set_reminder_sched_to_pass() { $this->db->query("UPDATE event_email_recipient eer LEFT JOIN event_email_recipient_other_detail eerod ON eerod.email_recipient_id = eer.email_recipient_id LEFT JOIN event_email_schedule ees ON ees.email_schedule_id = eerod.email_sched_reference_id SET eer.email_status = 5, eer.email_date_time = (CASE WHEN eer.email_status IN(2, 3) THEN NOW() ELSE eer.email_date_time END) WHERE eerod.email_sched_reference = 1 AND eer.email_type_id = 1 AND eer.email_status IN(1, 2, 3) AND ees.email_schedule_status IN(2,0) "); //replace all schedule, make it past $this->db->query("UPDATE event_email_schedule ees LEFT JOIN event_email_default_setting eeds ON eeds.email_tpl_setting_id = ees.reference SET ees.email_schedule_status = 2, ees.email_schedule_date_added = NOW() WHERE ees.email_schedule_status = 1 AND eeds.is_default = 0 AND eeds.email_type_id = 1 AND eeds.email_tpl_setting_status = 1 AND ees.email_schedule_date < NOW() "); $updated_rows = $this->db->affected_rows(); if($updated_rows > 0){ return $updated_rows; } return false; } }