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.
 
 
 
 
 
 

1064 lines
50 KiB

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
use app\core\utils\Response;
use app\controllers\events\Event_workshop_informer;
use app\core\event\Event as WorkshopEvent;
class Event extends MY_Controller {
public function __construct()
{
//parent::__construct();
$this->my_parent_controller();
Response::handleSessionTimeout("bo", /*whitelisted route*/['workshop/register']);
//load language files
$this->load_language_backoffice();
$this->lang->load('backoffice/events', 'fr');
//origin folders
$this->hstroke_origin = origin_folders('hstroke');
$this->banner_origin = origin_folders('banner');
//banner and heartstroke folder
$this->banner_folder = banner_bundle();
$this->hstroke_folder = hstroke_bundle();
//load model
$this->load->model("event_model");
$this->load->model("event_file_attachment_model");
$this->load->model("user_activity_log_model");
$this->load->helper('htmlpurifier');
$this->workshop_event = new WorkshopEvent();
}
public function event_duplicate(){
if($this->input->post()) {
if($this->event_model->check_event_title($this->input->post('title'), "")){
output_to_json($this, array(
"mtype" => "error",
"message" => $this->lang->line("event_title_exist"),
"field" => "title"
));
}else{
output_to_json($this, array(
"mtype" => "success"
));
}
}
}
public function is_seats_available($event_schedule_id, $subs_type = 1){
$seats_available = $this->event_model->is_seats_available($event_schedule_id, $subs_type);
if($seats_available){
output_to_json($this, array(
"available" => 1
));
} else{
output_to_json($this, array(
"available" => 0
));
}
}
public function add_event(){
if($this->input->post()) {
if(!empty($this->input->post()["p_discount_apply"])){
$this->input->post()["discount_apply"] = $this->input->post()["p_discount_apply"];
unset($this->input->post()["p_discount_apply"]);
}
if(!empty($this->input->post()["p_discounted_price"])){
$this->input->post()["discounted_price"] = $this->input->post()["p_discounted_price"];
unset($this->input->post()["p_discounted_price"]);
}
if(!empty($this->input->post()["p_total_available_seat"])){
$this->input->post()["total_available_seat"] = $this->input->post()["p_total_available_seat"];
unset($this->input->post()["p_total_available_seat"]);
}
if(!empty($this->input->post()["p_rate"])){
$this->input->post()["rate"] = $this->input->post()["p_rate"];
unset($this->input->post()["p_rate"]);
}
if(!empty($this->input->post()["d_discount_apply"])){
$this->input->post()["discount_apply"] = $this->input->post()["d_discount_apply"];
unset($this->input->post()["d_discount_apply"]);
}
if(!empty($this->input->post()["d_discounted_price"])){
$this->input->post()["discounted_price"] = $this->input->post()["d_discounted_price"];
unset($this->input->post()["d_discounted_price"]);
}
if(!empty($this->input->post()["d_total_available_seat"])){
$this->input->post()["total_available_seat"] = $this->input->post()["d_total_available_seat"];
unset($this->input->post()["d_total_available_seat"]);
}
if(!empty($this->input->post()["d_rate"])){
$this->input->post()["rate"] = $this->input->post()["d_rate"];
unset($this->input->post()["d_rate"]);
}
/*if($this->event_model->check_event_title($this->input->post('title'), "")){
output_to_json($this, array(
"mtype" => "success",
"message" => $this->lang->line("event_title_exist"),
"mdetail" => array(array("field" => "title", "message" => $this->lang->line("event_title_exist")))
));
} else {*/
$new_event_data = array();
$new_event_data = $this->input->post();
if(isset($new_event_data['session_dates']))
$new_event_data['session_dates'] = json_decode($this->input->post('session_dates'));
if(isset($new_event_data['workshop_banner']) && !empty($new_event_data['workshop_banner'])) {
$new_event_data['workshop_banner'] = $this->add_event_banner($new_event_data['workshop_banner'], 1, 'banner');
}
$new_event = $this->check_boxes_is_checked($new_event_data);
//$new_event['workshop_banner'] = $this->add_event_banner();
// This is to solve the problem when saving href with target attribute. XSS removes the target=_blank.
if(isset($new_event_data['description']))
$new_event_data['description'] = html_purify($this->input->post('description', FALSE), 'comment');
if(isset($new_event_data['domain']))
$new_event_data['domain'] = $this->event_model->get_university_by_domain($new_event_data['domain']);
if(isset($new_event_data['workshop_author_description']))
$new_event_data['workshop_author_description'] = html_purify($this->input->post('workshop_author_description'), false, 'comment');
/* total_combined_seat and remaining_combined_seat values must be the same upon event creation */
// if(isset($new_event_data['seat_feature']) && !empty($new_event_data['seat_feature'])){
// if($new_event_data['seat_feature'] == 2){
// //update event dates with combined features
// $new_event_data["remaining_combined_seat"] = (isset($new_event_data['total_combined_seat']) && !empty($new_event_data['total_combined_seat']))?$new_event_data['total_combined_seat']:0;
// }
// }
UNSET($new_event_data["event_sponsor_files"], $new_event_data["event_attachment_files"], $new_event_data["event_attachment"], $new_event_data["speaker"], $new_event_data["event_speaker"], $new_event_data["event_sponsor"], $new_event_data["event_schedule"], $new_event_data["event-file-attachment"]);
//try to insert new event in event table
$event_id = $this->event_model->add_event($this->data["logged_in"]["user_id"], $new_event);
if($event_id) {
$act_log = $this->user_activity_log_model->add_activity_log(array(
"description" => $this->lang->line("added_new_event")." - ".$new_event_data['title'],
"user_id" => $this->data["logged_in"]["user_id"],
"action" => "ADD",
"table_origin" => "event",
"reference_id" => $event_id
));
//try to insert event schedules by bulk
$catch = $this->add_event_schedule_by_bulk($event_id, $new_event_data);
// //try to insert event speakers by bulk
$catch = $this->add_event_speaker_by_bulk($event_id);
// try to uplaod/insert event attachments
$catch = $this->add_event_sponsor_by_bulk($event_id);
$catch = $this->add_author_works($event_id);
$catch = $this->add_event_venue_photos($event_id);
//try to upload/insert event sponsors
$catch = $this->add_event_attachment_by_bulk($event_id);
$catch = $this->add_event_videos($event_id);
// if($new_event_data['use_different_address_per_date'] == 0){
// //reset address per date
// $this->load->model("event_schedule_model");
// $this->event_schedule_model->reset_address_per_date($event_id);
// }
if($act_log){
output_to_json($this, array(
"mtype" => "success",
"message" => $this->lang->line("added_new_event")
));
} else {
output_to_json($this, array(
"mtype" => "warning",
"message" => $this->lang->line("unknown_error"),
"error_log" => $act_log
));
}
} else {
output_to_json($this, array(
"mtype" => "error",
"message" => $this->lang->line("unknown_error_on_saving")
));
}
//} //end of event title name duplicate checker
//output_to_json($this, $new_event_data);
} else {
show_404();
}
}
//edit event information
public function update_event($event_id=0){
if($this->input->post() && $event_id) {
if($this->event_model->check_event_title($this->input->post('title'), $event_id)){
output_to_json($this, array(
"mtype" => "error",
"message" => $this->lang->line("event_title_exist"),
"mdetail" => array(array("field" => "title", "message" => $this->lang->line("event_title_exist")))
));
} else {
$new_event_data = array();
$is_combined_seat = false;
$new_event_data = $this->check_boxes_is_checked($this->input->post());
$this->load->model('event_registration_model');
$reservedSeats = $this->event_registration_model->count_total_reserved_seats($event_id);
$new_event_data['remaining_combined_seat'] = (int)$new_event_data['total_available_seat'] - $reservedSeats;
$event = $this->event_model->event_details_reserved($event_id);
// This is to solve the problem when saving href with target attribute. XSS removes the target=_blank.
$new_event_data['description'] = html_purify($this->input->post('description', FALSE), 'comment');
//update remaining seat when total_combined_seat is edited
if(isset($new_event_data['seat_feature']) && !empty($new_event_data['seat_feature'])){
if($new_event_data['seat_feature'] == 2){
$is_combined_seat = true;
$new_event_data = $this->recalculate_combined_seats($event_id, $new_event_data['total_combined_seat'], $new_event_data);
if((int) $new_event_data["total_combined_seat"] >= 1 && (int) $new_event_data["rem_com_seats"] == 0) {
$this->load->model('event_wait_list_model');
/**
* If the seat feature is combined, make sure to update the affected records in the WL
* reset the moderation of the subscribers in the WL so that once the event
* becomes available again the subscriber who are already
* in the WL can now reserve in the event regardless of the moderation
*/
$this->event_wait_list_model->resetModeratedReservationsFronWaitingListByEvent($event_id);
}
}
}
UNSET($new_event_data["event_sponsor_files"], $new_event_data["event_attachment_files"], $new_event_data["event_attachment"], $new_event_data["speaker"], $new_event_data["event_speaker"], $new_event_data["event_sponsor"], $new_event_data["event_schedule"], $new_event_data["event-file-attachment"], $new_event_data['avl_com_seats'], $new_event_data['rem_com_seats']);
$update_event = $this->event_model->update_event($this->data["logged_in"]["user_id"], $new_event_data, $event_id);
//update attachments
// $this->event_file_attachment_model->attachment_type_action($event_id);
if($update_event) {
/* when switching from per date to combined seats and/or editing combined seats value,
all event dates depending on it must change its status too from locked || full to open or from open to locked || full
Here, total_comined_seat could also mean as remaining_combined_seat.
*/
if($is_combined_seat){
//update event dates with combined features
$this->load->model("event_schedule_model");
$this->event_schedule_model->update_combined_feature_event_dates($event_id, $new_event_data['remaining_combined_seat']);
}
if($new_event_data['use_different_address_per_date'] == 0){
//reset address per date
$this->load->model("event_schedule_model");
$this->event_schedule_model->reset_address_per_date($event_id);
}
$act_log = $this->user_activity_log_model->add_activity_log(array(
"description" => $this->lang->line("updated_event")." - ".$this->input->post('title'),
"user_id" => $this->data["logged_in"]["user_id"],
"action" => "EDIT",
"table_origin" => "event",
"reference_id" => $event_id
));
// Update event schedule/sessions
$new_event_data['session_dates'] = json_decode($this->input->post('session_dates'));
$this->update_event_schedule_by_bulk($event_id, $new_event_data);
$this->update_author_works($event_id);
$this->update_venue_photos($event_id);
$this->update_event_comments($event_id);
$this->update_event_videos($event_id);
if($act_log){
if($new_event_data['event_status'] == 'CANCEL' && $event->event_status != 'CANCEL') {
$this->workshop_event->sendEventUpdate($event, 4);
} else if($this->input->post('sendUpdateEmail')) {
if($this->input->post('editedDate')) {
$edited_date = json_decode($this->input->post('editedDate'));
$event->start_date_time = $edited_date->date;
}
$this->workshop_event->sendEventUpdate($event, 6);
// } else if($new_event_data['event_status'] == 'AVAILABLE' && $event->event_status == 'SOON') {
// $this->workshop_event->sendEventUpdate($event, 3);
}
output_to_json($this, array(
"mtype" => "success",
"message" => $this->lang->line("updated_event")
));
} else {
output_to_json($this, array(
"mtype" => "warning",
"message" => $this->lang->line("unknown_error")
));
}
} else {
output_to_json($this, array(
"mtype" => "error",
"message" => $this->lang->line("unknown_error_on_saving")
));
}
}
} else {
show_404();
}
}
private function recalculate_combined_seats($event_id, $input_seats, $new_event_data){
$this->load->model('event_schedule_model');
$seats_info = $this->event_schedule_model->get_event_sched_combined_seats_info($event_id);
$add_to_total_combined_seat = $input_seats - $seats_info["rem_com_seats"];
$new_event_data['total_combined_seat'] = $seats_info["avl_com_seats"] + (($add_to_total_combined_seat<=0)?0:$add_to_total_combined_seat);
$new_event_data['remaining_combined_seat'] = $input_seats;
return $new_event_data;
}
//delete event information
public function delete_event($event_id=0){
if($this->input->post() && $event_id) {
$delete_event = $this->event_model->delete_event($event_id);
if($delete_event) {
$act_log = $this->user_activity_log_model->add_activity_log(array(
"description" => $this->lang->line("event_deleted")." - ".$event_id,
"user_id" => $this->data["logged_in"]["user_id"],
"action" => "DELETE",
"table_origin" => "event",
"reference_id" => $event_id
));
if ($act_log) {
output_to_json($this, array(
"mtype" => "success",
"message" => $this->lang->line("event_deleted")
));
} else {
output_to_json($this, array(
"mtype" => "warning",
"message" => $this->lang->line("unknown_error")
));
}
}
} else {
show_404();
}
}
private function check_boxes_is_checked($new_event_data){
/***
Need to check if these fields are checked or not
****/
$new_event['title'] = !empty($new_event_data['title'])? $new_event_data['title']: NULL;
$new_event['city_location'] = !empty($new_event_data['city_location'])? $new_event_data['city_location']: NULL;
$new_event['address'] = !empty($new_event_data['address'])? $new_event_data['address']: NULL;
$new_event['event_type_id'] = !empty($new_event_data['event_type_id'])? $new_event_data['event_type_id']: NULL;
$new_event['event_category'] = !empty($new_event_data['event_category'])? $new_event_data['event_category']: NULL;
$new_event['rate'] = !empty($new_event_data['rate'])? $new_event_data['rate']: 0;
$new_event['number_of_sessions'] = !empty($new_event_data['number_of_sessions'])? $new_event_data['number_of_sessions']: 0;
$new_event['hours_per_session'] = !empty($new_event_data['hours_per_session'])? $new_event_data['hours_per_session']: 0;
$new_event['total_available_seat'] = !empty($new_event_data['total_available_seat'])? $new_event_data['total_available_seat']: 0;
$new_event['remaining_combined_seat'] = !empty($new_event_data['total_available_seat'])? $new_event_data['total_available_seat']: 0;
if($new_event_data['workshop_session'] == 'ENLIGNE') {
$new_event['start_date_time'] = date("Y-m-d H:i:s");
$new_event['end_date_time'] = date("Y-m-d H:i:s", strtotime('+5 years'));
$new_event['reservation_start_date'] = date("Y-m-d H:i:s");
$new_event['reservation_end_date'] = date("Y-m-d H:i:s");
} else {
$new_event['start_date_time'] = !empty($new_event_data['start_date_time']) ? $new_event_data['start_date_time'] : NULL;
$new_event['end_date_time'] = !empty($new_event_data['end_date_time']) ? $new_event_data['end_date_time'] : NULL;
$new_event['reservation_start_date'] = !empty($new_event_data['reservation_start_date']) ? $new_event_data['reservation_start_date'] : NULL;
$new_event['reservation_end_date'] = !empty($new_event_data['reservation_end_date']) ? $new_event_data['reservation_end_date'] : NULL;
}
$new_event['tag'] = $new_event_data['tag'];
$new_event['night_class_prices'] = !empty($new_event_data['night_class_prices']) ? $new_event_data['night_class_prices']: NULL;
$new_event['event_status'] = !empty($new_event_data['event_status']) ? $new_event_data['event_status'] : NULL;
$new_event['back_office_status'] = !empty($new_event_data['back_office_status']) ? $new_event_data['back_office_status'] : 0;
$new_event['location'] = $new_event_data['location'];
$new_event['description'] = (isset($new_event_data['description']) && !empty($new_event_data['description']))? html_purify($new_event_data['description'], false): "";
$new_event['workshop_author'] = (isset($new_event_data['workshop_author']) && !empty($new_event_data['workshop_author']))?$new_event_data['workshop_author']:NULL;
$new_event['author_label'] = (isset($new_event_data['author_label']) && !empty($new_event_data['author_label']))?$new_event_data['author_label']:NULL;
$new_event['workshop_event_type'] = (isset($new_event_data['workshop_event_type']) && !empty($new_event_data['workshop_event_type']))?$new_event_data['workshop_event_type']:NULL;
$new_event['workshop_author_description'] = (isset($new_event_data['workshop_author_description']) && !empty($new_event_data['workshop_author_description']))? html_purify($new_event_data['workshop_author_description'], false): "";
$new_event['is_favorite'] = (isset($new_event_data['is_favorite']) && !empty($new_event_data['is_favorite']))?1:0;
$new_event['workshop_banner'] = (isset($new_event_data['workshop_banner']) && !empty($new_event_data['workshop_banner']))?$new_event_data['workshop_banner']:NULL;
$new_event['is_multiple_reservation'] = (isset($new_event_data['is_multiple_reservation']) && !empty($new_event_data['is_multiple_reservation']))?1:0;
$new_event['is_multiple_waitlist_reservation'] = (isset($new_event_data['is_multiple_waitlist_reservation']) && !empty($new_event_data['is_multiple_waitlist_reservation']))?1:0;
$new_event['use_different_address_per_date'] = (isset($new_event_data['use_different_address_per_date']) && !empty($new_event_data['use_different_address_per_date']))?1:0;
$new_event['workshop_author_awards'] = $new_event_data['workshop_author_awards'];
$new_event['workshop_session'] = $new_event_data['workshop_session'];
$new_event['learning_outcome'] = $new_event_data['learning_outcome'];
$new_event['trailer'] = $new_event_data['trailer'];
$new_event['similar_events'] = $new_event_data['similar_events'];
$new_event['discount_apply'] = !empty($new_event_data['discount_apply']) ? $new_event_data['discount_apply'] : 0;
$new_event['discounted_price'] = !empty($new_event_data['discounted_price']) ? $new_event_data['discounted_price'] : 0;
return $new_event;
}
private function add_workshop_event_schedule($event_id=0, $new_event_data){
$this->load->model("event_schedule_model");
$this->event_schedule_model->add_workshop_event_schedule($this->data["logged_in"]["user_id"], $event_id, $new_event_data);
}
//add event schedule
private function add_event_schedule_by_bulk($event_id=0, $new_event_data){
$this->load->model("event_schedule_model");
if($new_event_data['workshop_session'] == 'ENLIGNE') {
$event_schedule[] = array(
"start_date_time" => date('Y-m-d'),
"end_date_time" => date('Y-m-d')
);
$result = $this->event_schedule_model->add_event_schedule($this->data["logged_in"]["user_id"], $event_id, $event_schedule, $new_event_data);
} else {
if($new_event_data['session_dates']){
$event_schedule = $new_event_data['session_dates'];
if(countVal($event_schedule) > 0){
$result = $this->event_schedule_model->add_event_schedule($this->data["logged_in"]["user_id"], $event_id, $event_schedule, $new_event_data);
} else {
return false;
}
}
}
}
private function update_event_schedule_by_bulk($event_id, $event_data) {
if(!isset($event_data['session_dates']) || !$event_id) return false;
$this->load->model("event_schedule_model");
// Delete existing sessions for the event
$this->event_schedule_model->delete_event_schedules_by_event_id($event_id);
// And add the new updated sessions
if(countVal($event_data['session_dates']) > 0){
$this->event_schedule_model->update_event_schedule($this->data["logged_in"]["user_id"], $event_id, $event_data['session_dates'], $event_data);
} else {
return false;
}
}
//add event speaker
private function add_event_speaker_by_bulk($event_id){
if($this->input->post("event_speaker")){
$event_speaker = json_decode($this->input->post("event_speaker"), true);
if(countVal($event_speaker) > 0){
$errors = [];
$this->load->model("event_speaker_model");
$this->load->model("event_speaker_assignee_model");
foreach ($event_speaker as $key=>$speaker) {
$speaker["added_by"] = $this->data["logged_in"]["user_id"];
$speaker["speaker_id"] = $this->event_speaker_model->add_event_speaker($speaker, $event_id);
$speaker["event_id"] = $event_id;
$check = $this->event_speaker_assignee_model->add_new_speaker_assignee($speaker);
if(!$check){
array_push($errors, $speaker);
}
} //end of for each
return count($errors);
} else {
return false;
}
}
}
//add event sponsors
private function add_event_sponsor_by_bulk($event_id=0){
if( $event_id && isset($this->data["logged_in"]["user_id"])) {
if(!empty($_FILES['event_sponsor_files']) && $this->input->post("event_sponsor")) {
//load models
$this->load->model("event_sponsor_model");
$this->load->model("event_sponsor_assignee_model");
//files with errors
$errors = array();
foreach ($this->input->post("event_sponsor") as $key=>$value) {
$data = json_decode($value, true);
$uploaded = upload_event_files($this, "sponsors", $_FILES['event_sponsor_files'], $key);
if( sizeof($uploaded) > 0 ) {
$sponsor_id = $this->event_sponsor_model->add_event_sponsor(array(
"file" => $uploaded["file_name"],
"sponsor_name" => $data["file_setup"]["file_name"],
"file_size" => $uploaded["file_size"],
"added_by" => $this->data["logged_in"]["user_id"]
));
if( !$sponsor_id ) {
array_push($errors, array(
"file" => $data["file_setup"]["file_name"]
));
} else {
//assign sponsor to event
$sponsor_assignee_id = $this->event_sponsor_assignee_model->add_event_sponsor_assignee(
array(
"sponsor_id" => $sponsor_id,
"event_id" => $event_id,
"added_by" => $this->data["logged_in"]["user_id"]
)
);
if(!$sponsor_assignee_id){
array_push($errors, array(
"file" => $data["file_setup"]["file_name"]
));
}
}
}
} //end of loop
if( sizeof($errors) <=0 ) {
return true;
}
return false; //when errors encountered
}
// return false;
} else {
show_404();
}
}
//add workshop banner
private function add_event_banner($image, $count, $dir){
list($type, $data) = explode(';', $image);
list(, $data) = explode(',', $data);
$data = base64_decode($data);
$imageName = $count.time().'.png';
$origin = origin_folders($dir);
if( (is_dir($origin) && is_writable($origin)) ){
file_put_contents($origin.$imageName, $data);
}
return $imageName;
}
private function uploadConfig(string $fileName) {
return array(
'upload_path'=> FCPATH . "resources/images/frontoffice/banner/",
'allowed_types' => 'jpeg|jpg|png',
'file_name' => strtotime("now").'_'.$fileName
);
}
private function add_author_works($event_id) {
$this->load->model("event_author_works_model");
if($this->input->post("author_works") && !empty($this->input->post("author_works"))) {
$works = json_decode($this->input->post("author_works"));
$count=1;
foreach($works as $row) {
if(!empty($row->image)) {
if(substr($row->image, 0, 10) === "data:image") {
$row->image = $this->add_event_banner($row->image, $count, 'banner');
$count++;
} else {
$row->image = '';
}
}
$this->event_author_works_model->save_work(array_merge((array)$row, ['event_id' => $event_id]));
}
}
}
private function add_event_videos($event_id) {
$this->load->model("event_video_model");
try {
if($this->input->post("event_videos") && !empty($this->input->post("event_videos"))) {
$videos = json_decode($this->input->post("event_videos"));
foreach($videos as $row) {
$this->event_video_model->save_video(array_merge((array)$row, ['event_id' => $event_id]));
}
}
return true;
} catch(Exception $e) {
return $e;
}
}
private function delete_old_videos($newVideos, $oldVideos) {
$this->load->model("event_video_model");
foreach((array)$oldVideos as $oldRow) {
$isExists = false;
foreach($newVideos as $newRow) {
if($newRow == $oldRow->id) {
$isExists = true;
break;
}
}
if(!$isExists) {
$this->event_video_model->delete_video($oldRow->id);
}
}
}
private function update_event_videos($event_id) {
$this->load->model("event_video_model");
if($this->input->post("event_videos") && !empty($this->input->post("event_videos"))) {
$videos = json_decode($this->input->post("event_videos"));
$updatedIds = array();
$oldVideos = $this->event_video_model->get_videos_by_event_id($event_id);
foreach($videos as $row) {
//update if id exists
if($row->id > 0) {
array_push($updatedIds, $row->id);
$this->event_video_model->update_video($row->id, (array)$row);
} else {
$this->event_video_model->save_video(array_merge((array)$row, ['event_id' => $event_id]));
}
}
$this->delete_old_videos($updatedIds, $oldVideos);
}
}
private function add_event_venue_photos($event_id) {
$this->load->model("event_venue_photos_model");
if($this->input->post("venue_photos") && !empty($this->input->post("venue_photos"))) {
$photos = json_decode($this->input->post("venue_photos"));
$count=1;
foreach($photos as $row) {
if(!empty($row->photo)) {
if(substr($row->photo, 0, 10) === "data:image") {
$row->photo = $this->add_event_banner($row->photo, $count, 'events');
$count++;
} else {
$row->photo = '';
}
}
$this->event_venue_photos_model->save_photo(array_merge((array)$row, ['event_id' => $event_id]));
}
}
}
private function delete_old_works($newWorks, $oldWorks) {
$this->load->model("event_author_works_model");
foreach((array)$oldWorks as $oldRow) {
$isExists = false;
foreach($newWorks as $newRow) {
if($newRow == $oldRow->id) {
$isExists = true;
break;
}
}
if(!$isExists) {
$this->event_author_works_model->delete_work($oldRow->id);
}
}
}
private function update_author_works($event_id) {
$this->load->model("event_author_works_model");
if($this->input->post("author_works") && !empty($this->input->post("author_works"))) {
$works = json_decode($this->input->post("author_works"));
$updatedIds = array();
$oldWorks = $this->event_author_works_model->get_works_by_event_id($event_id);
$count=1;
foreach($works as $row) {
if(!empty($row->image)) {
if(substr($row->image, 0, 10) === "data:image") {
$row->image = $this->add_event_banner($row->image, $count, 'banner');
$count++;
} else if(substr($row->image, 0, 4) === "http") {
$exploded = explode("/", $row->image);
$filename = array_pop($exploded);
$row->image = $filename;
} else {
$row->image = NULL;
}
}
//update if id exists
if($row->id > 0) {
array_push($updatedIds, $row->id);
$this->event_author_works_model->update_work($row->id, (array)$row);
} else {
$this->event_author_works_model->save_work(array_merge((array)$row, ['event_id' => $event_id]));
}
}
$this->delete_old_works($updatedIds, $oldWorks);
}
}
private function delete_old_venue_photos($newPhotos, $oldPhotos) {
$this->load->model("event_venue_photos_model");
foreach((array)$oldPhotos as $oldRow) {
$isExists = false;
foreach($newPhotos as $newRow) {
if($newRow == $oldRow->id) {
$isExists = true;
break;
}
}
if(!$isExists) {
$this->event_venue_photos_model->delete_venue_photo($oldRow->id);
}
}
}
private function delete_event_comments($newComments, $oldComments) {
$this->load->model("event_comment_model");
foreach((array)$oldComments as $oldRow) {
$isExists = false;
foreach($newComments as $newRow) {
if($newRow == $oldRow->id) {
$isExists = true;
break;
}
}
if(!$isExists) {
$this->event_comment_model->delete_comment($oldRow->id);
}
}
}
private function update_venue_photos($event_id) {
$this->load->model("event_venue_photos_model");
if($this->input->post("venue_photos") && !empty($this->input->post("venue_photos"))) {
$photos = json_decode($this->input->post("venue_photos"));
$updatedIds = array();
$oldPhotos = $this->event_venue_photos_model->get_venue_photos_by_event_id($event_id);
$count=1;
foreach($photos as $row) {
if(!empty($row->photo)) {
if(substr($row->photo, 0, 10) === "data:image") {
$row->photo = $this->add_event_banner($row->photo, $count, 'events');
$count++;
} else if(substr($row->photo, 0, 4) === "http") {
$exploded = explode("/", $row->photo);
$filename = array_pop($exploded);
$row->photo = $filename;
} else {
$row->photo = NULL;
}
}
//update if id exists
if($row->id > 0) {
array_push($updatedIds, $row->id);
$this->event_venue_photos_model->update_venue_photo($row->id, (array)$row);
} else {
$this->event_venue_photos_model->save_photo(array_merge((array)$row, ['event_id' => $event_id]));
}
}
$this->delete_old_venue_photos($updatedIds, $oldPhotos);
}
}
private function update_event_comments($event_id=0) {
if($this->input->post("comments") && !empty($this->input->post("comments"))) {
$this->load->model("event_comment_model");
$comments = json_decode($this->input->post("comments"));
$oldComments = $this->event_comment_model->get_comments_by_event_id($event_id);
$updatedIds = array();
foreach($comments as $row) {
//add comment if id is null
if($row->id == null) {
$this->event_comment_model->save_comment(array_merge((array)$row, ['event_id' => $event_id]));
} else {
//update comment
array_push($updatedIds, (int)$row->id);
$this->event_comment_model->update_comment($row->id, (array)$row);
}
}
$this->delete_event_comments($updatedIds, $oldComments);
}
}
//add event attachments
private function add_event_attachment_by_bulk($event_id=0){
if($event_id && isset($this->data["logged_in"]["user_id"])){
if(!empty($_FILES['event_attachment_files']) && $this->input->post("event_attachment")) {
//load models
$this->load->model("event_sponsor_model");
$this->load->model("event_sponsor_assignee_model");
$this->load->model("event_file_attachment_model");
//files with errors
$errors = array();
foreach ($this->input->post("event_attachment") as $key=>$value) {
$data = json_decode($value, true);
$uploaded = upload_event_files($this, "events",$_FILES['event_attachment_files'], $key);
if( sizeof($uploaded) > 0 ) {
$audio_video = array();
//check for autoplay settings : catch if there is one
if( isset($data["file_setup"]["autoplay_vaudio"]) ){
$audio_video = array(
"autoplay_vaudio" => $data["file_setup"]["autoplay_vaudio"],
"preview_default_image" => (isset($data["file_setup"]["preview_default_image"]))?$data["file_setup"]["preview_default_image"]:0
);
}
$add_status = $this->event_file_attachment_model->add_event_attachment(array(
"file_name" => $uploaded["file_name"],
"event_id" => $event_id,
"mime_type" => $data["file_setup"]["mime_type"],
"description" => $data["file_setup"]["file_name"],
"display" => $data["display"] == 'home'? 0:1,
"attachment_type" => $data["attachment_type"],
"file_size" => $uploaded["file_size"],
"added_by" => $this->data["logged_in"]["user_id"]
), $audio_video);
if( !$add_status ) {
array_push($errors, array(
"file" => $data["file_setup"]["file_name"]
));
}
}
} //end of loop
if( sizeof($errors) <=0 ) {
return true;
}
return false; //if errors found
}
return false;
} else {
show_404();
}
}
public function event_information($event_id){
if($this->input->post() && $event_id) {
$this->load->model("event_schedule_model");
$this->load->model("event_author_works_model");
$this->load->model("event_venue_photos_model");
$this->load->model("event_comment_model");
$this->load->model("event_video_model");
$result = $this->event_model->event_information($event_id);
$result->similar_events = json_decode($result->similar_events);
$schedule = $this->event_schedule_model->get_all_event_schedule($event_id);
$works = $this->event_author_works_model->get_works_by_event_id($event_id);
$venuePhotos = $this->event_venue_photos_model->get_venue_photos_by_event_id($event_id);
$videos = $this->event_video_model->get_videos_by_event_id($event_id);
$comments = $this->event_comment_model->get_comments_by_event_id($event_id);
if($result->workshop_session == 'DISTANCE-PRESENTIEL') {
$ncp = json_decode($result->night_class_prices);
$prices = [
"p_rate" => $ncp->presentiel->rate,
"p_total_available_seat" => $ncp->presentiel->total_available_seat,
"p_discounted_price" => $ncp->presentiel->discounted_price,
"p_discount_apply" => $ncp->presentiel->discount_apply,
"p_remaining_combined_seat" => $ncp->presentiel->total_available_seat - $this->event_model->count_total_reserved_seats($event_id, 'soir-presentiel'),
"d_rate" => $ncp->distance->rate,
"d_total_available_seat" => $ncp->distance->total_available_seat,
"d_discounted_price" => $ncp->distance->discounted_price,
"d_discount_apply" => $ncp->distance->discount_apply,
"d_remaining_combined_seat" => $ncp->distance->total_available_seat - $this->event_model->count_total_reserved_seats($event_id, 'soir-distance')
];
$result = array_merge((array)$result, $prices);
}
$result = array_merge((array)$result, ["schedules" => (array)$schedule], ["works" =>(array)$works], ["venue_photos" =>(array)$venuePhotos], ["comments"=>(array)$comments], ["event_videos" =>(array)$videos]);
output_to_json($this, array(
"mtype" => "success",
"message" => $this->lang->line("event_info_retvd"),
"mdata" => $result
));
} else {
show_404();
}
}
public function event_info($event_id){
if(is_numeric($event_id)) {
$result = $this->event_model->event_information($event_id);
output_to_json($this, array(
"mtype" => "success",
"message" => $this->lang->line("event_info_retvd"),
"mdata" => $result
));
} else {
show_404();
}
}
public function preview_event($event_id=0) {
$this->load->model("user_model");
$this->load->model("event_schedule_model");
$this->load->model("event_speaker_assignee_model");
$this->load->model("event_sponsor_assignee_model");
$this->load->model("event_author_works_model");
$this->load->model("event_schedule_model");
$this->load->model("event_video_model");
if($this->input->post() && $event_id) {
$result = $this->event_model->event_details($event_id);
//$sched = $this->event_schedule_model->preview_get_all_event_schedule($event_id);
$sched = $this->event_schedule_model->list_event_schedule($event_id, 1, FALSE);
$speakers = $this->event_speaker_assignee_model->event_details_preview($event_id);
$sponsor = $this->event_sponsor_assignee_model->event_details_preview($event_id);
$author_works = $this->event_author_works_model->get_works_by_event_id($event_id);
$videos = $this->event_video_model->get_videos_by_event_id($event_id);
//$result->remaining_combined_seat = (int)$result->total_available_seat - (int) $registration;
$result->workshop_author_awards = json_decode($result->workshop_author_awards);
output_to_json($this, array(
"mtype" => "success",
"message" => $this->lang->line("event_info_retvd"),
"mdata" => $result,
"sched" => $sched,
"speakers" => $speakers,
"sponsor" => $sponsor,
"author_works" => $author_works,
"event_videos" => $videos
));
} else {
show_404();
}
}
public function list_event($export=0){
if($this->input->post() && isset($this->data["logged_in"]["user_id"])){
$list = $this->event_model->get_datatables($this->input->post(), $export, 0);
$data = array();
$row = array();
$x = $this->input->post("start");
foreach ($list as $event) {
$row["event_order"] = ++$x;
$row["event_title"] = $event->event_title;
$row["event_type"] = $event->event_type;
$row["city"] = $event->city;
$row["author"] = $event->author;
$row["date_created"] = $event->date_created;
$row["bostatus"] = $event->bostatus;
$row["event_category"] = $event->event_category;
$row["use_different_address_per_date"] = $event->use_different_address_per_date;
$row["action"] = array(
"event_id" => $event->event_id,
"event_schedule" => json_decode("[".$event->event_schedule."]",true),
"workshop_session" =>$event->workshop_session
);
// $row["bo_status"] = $event->bo_status;
array_push($data, $row);
}
$output = array(
"draw" => $_POST['draw'],
"recordsTotal" => $this->event_model->count_all($this->input->post(), $export, 0),
"recordsFiltered" => $this->event_model->count_filtered($this->input->post(), $export,0),
"data" => $data,
);
//output to json format
output_to_json($this, $output);
} else {
show_404();
}
}
public function typeahead_event(){
if($this->input->post("search")) {
output_to_json($this, $this->event_model->list_events_for_typeahead($this->input->post("search")));
}
}
private function unique_code_collection($event_schedules) {
$this->load->model("event_schedule_model");
foreach ($event_schedules as $index => $event_sched) {
if (!isset($event_sched['item_code']) || empty($event_sched['item_code'])) {
output_to_json($this, array(
"mtype" => "error",
"message" => "Code collection is required for PAID EVENT."
));
break;
}
$result = $this->event_schedule_model->validate_code_collection($event_sched['item_code']);
if ($result) {
output_to_json($this, array(
"mtype" => "error",
"message" => "Code collection already used by another event"
));
break;
}
}
}
public function workshop_register_email() {
Event_workshop_informer::register($this);
}
public function similar_events() {
$category = $this->input->get('category');
$event_id = $this->input->get('event_id');
$events = $this->event_model->similar_events(isset($category)?$category: 0, isset($event_id)?$event_id: null);
if($events) {
output_to_json($this, array(
"mtype" => "success",
"message" => "Similar events",
"mdata" => $events
));
}
output_to_json($this, array(
"mtype" => "error",
"message" => "Similar events not found"
));
}
public function past_events() {
$events = $this->event_model->get_past_events();
if($events) {
output_to_json($this, array(
"mtype" => "success",
"message" => "Past events",
"mdata" => $events
));
}
output_to_json($this, array(
"mtype" => "error",
"message" => "Past events not found"
));
}
public function selected_past_events() {
$events = $this->event_model->get_selected_past_events();
if($events) {
output_to_json($this, array(
"mtype" => "success",
"message" => "Past events",
"mdata" => $events
));
}
output_to_json($this, array(
"mtype" => "error",
"message" => "Past events not found"
));
}
public function add_selected_past_events() {
$events = $this->event_model->add_selected_past_events(['events' => $this->input->post('events')]);
if($events) {
output_to_json($this, array(
"mtype" => "success",
"message" => "Past events",
"mdata" => $events
));
}
output_to_json($this, array(
"mtype" => "error",
"message" => "Past events not found"
));
}
}