You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

410 lines
19 KiB

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Event_email_schedule_model extends CI_Model {
var $column_order = array(null, 'es.start_date_time', 'ees.email_schedule_date', 'ees.email_schedule_status', 'email_schedule_author', null); //set column field database for datatable orderable
var $column_search = array('CONCAT(u.first_name, " ", u.last_name)','ees.email_schedule_date_added'); //set column field database for datatable searchable just firstname , lastname , address are searchable
var $order = array('ees.email_schedule_date' => '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;
}
}