4050 lines
169 KiB
PHP
4050 lines
169 KiB
PHP
<?php
|
|
|
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
|
|
|
class Member extends Admin_Controller {
|
|
|
|
/**
|
|
* Get All Data from this method.
|
|
*
|
|
* @return Response
|
|
*/
|
|
public function __construct() {
|
|
parent::__construct();
|
|
|
|
$this->load->helper('form');
|
|
$this->load->library('form_validation');
|
|
$this->load->library('session');
|
|
}
|
|
|
|
public function index() {
|
|
$this->load->helper('url');
|
|
$data = array();
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
|
|
$mysql = "SELECT id,username,firstname,lastname,'<button type=\"button\" class=\"btn btn-info\">View</button>' As action FROM members";
|
|
$query = $this->read_replica->query($mysql);
|
|
$this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'), 'USERNAME', 'FIRSTNAME', 'LASTNAME', array('data' => 'ACTION', 'style' => 'width:90px'));
|
|
$data['member_table'] = $this->table->generate($query);
|
|
$this->renderAdminPage('view_dash', $data);
|
|
// echo 'Ameye Olu';
|
|
}
|
|
|
|
public function locateMember() {
|
|
$this->load->helper('url');
|
|
$data = array();
|
|
|
|
$member_id = $this->input->get('member_id');
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
|
|
$mysql = "SELECT id,username,firstname,lastname,'<button type=\"button\" class=\"btn btn-info\">View</button>' As action FROM members";
|
|
$query = $this->read_replica->query($mysql);
|
|
$this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'), 'USERNAME', 'FIRSTNAME', 'LASTNAME', array('data' => 'ACTION', 'style' => 'width:90px'));
|
|
$data['member_table'] = $this->table->generate($query);
|
|
$this->renderMemberPage('view_member', $data);
|
|
|
|
// redirect('dash');
|
|
}
|
|
|
|
public function refreshMemberCard() {
|
|
|
|
$in['action'] = SAVVYEXT_BKO_REFRESHCARD;
|
|
$member_id = $this->input->get('member_id');
|
|
|
|
if ($member_id > 0) {
|
|
$in['member_id'] = $member_id;
|
|
$out = [];
|
|
$ret = $this->savvy_api($in, $out);
|
|
}
|
|
|
|
|
|
echo "Refresh Category Cards";
|
|
}
|
|
|
|
public function getValueOfFindMember() {
|
|
$this->load->model('member_model');
|
|
|
|
$params_request['search_text'] = trim($this->input->get('search_text'));
|
|
$params_request['find_select'] = trim(!empty($this->input->get('card_find_select')) ? $this->input->get('card_find_select') : $this->input->get('find_select'));
|
|
$params_request['decision_group'] = trim(!empty($this->input->get('card_decision_group')) ? $this->input->get('card_decision_group') : $this->input->get('decision_group'));
|
|
|
|
foreach (array_keys(member_model::DATE_FIND_MEMBER) as $val) {
|
|
$params_request[$val] = trim($this->input->get($val));
|
|
}
|
|
|
|
foreach (array_keys(member_model::STRING_FIND_MEMBER) as $val) {
|
|
$params_request[$val] = trim($this->input->get($val));
|
|
}
|
|
|
|
foreach (array_keys(member_model::NUMERIC_FIND_MEMBER) as $val) {
|
|
$params_request[$val] = trim($this->input->get($val));
|
|
}
|
|
|
|
foreach (array_keys(member_model::COMBO_FIND_MEMBER) as $val) {
|
|
$params_request[$val] = trim($this->input->get('card_' . $val) ?? $this->input->get($val));
|
|
}
|
|
|
|
return $params_request;
|
|
}
|
|
|
|
public function setComboForFindMember($params) {
|
|
$this->load->model('combo_model');
|
|
$this->load->model('member_model');
|
|
|
|
$combo['card_find_select'] = $this->combo_model->getfindMemberType(
|
|
'card_find_select', $params['find_select'] ?? '', member_model::FIND_SELECT
|
|
);
|
|
$combo['card_decision_group'] = $this->combo_model->getDescisionGroupCombo(
|
|
'card_decision_group', $params['decision_group'] ?? ''
|
|
);
|
|
$combo['card_status'] = $this->combo_model->getStatusComboWithAll(
|
|
'card_status', $params['status'] ?? -1
|
|
);
|
|
$combo['card_test'] = $this->combo_model->getYesNoComboWithAll(
|
|
'card_test', $params['test'] ?? -1
|
|
);
|
|
$combo['card_alert_notification'] = $this->combo_model->getYesNoComboWithAll(
|
|
'card_alert_notification', $params['alert_notification'] ?? -1
|
|
);
|
|
$combo['card_alert_email'] = $this->combo_model->getYesNoComboWithAll(
|
|
'card_alert_email', $params['alert_email'] ?? -1
|
|
);
|
|
$combo['card_country'] = $this->combo_model->getCountryComboWithoutFilter(
|
|
'card_country', $params['country'] ?? ''
|
|
);
|
|
|
|
return $combo;
|
|
}
|
|
|
|
public function validateValueForFindMember($params) {
|
|
$this->load->library('form_validation');
|
|
$this->form_validation->set_data($params);
|
|
$this->setFormRuleForFindMember();
|
|
|
|
$errors = [];
|
|
if ($this->form_validation->run() === FALSE) {
|
|
$errors = $this->form_validation->error_array();
|
|
}
|
|
return $errors;
|
|
}
|
|
|
|
public function validateValueForFindMemberBySearchText($params) {
|
|
$this->load->library('form_validation');
|
|
$this->form_validation->set_data($params);
|
|
$this->setFormRuleForFindMemberBySearchText();
|
|
|
|
$errors = [];
|
|
if ($this->form_validation->run() === FALSE) {
|
|
$errors = $this->form_validation->error_array();
|
|
}
|
|
return $errors;
|
|
}
|
|
|
|
public function setFormRuleForFindMemberBySearchText() {
|
|
$this->form_validation->set_rules(
|
|
'id', 'ID', 'integer'
|
|
);
|
|
}
|
|
|
|
public function setFormRuleForFindMember() {
|
|
$this->load->model('member_model');
|
|
|
|
foreach (array_keys(member_model::NUMERIC_FIND_MEMBER) as $val) {
|
|
$this->form_validation->set_rules(
|
|
$val, $val, 'integer'
|
|
);
|
|
}
|
|
|
|
$status_pattern = 'regex_match[/^(?:[0-9])$/]';
|
|
foreach (array_keys(member_model::COMBO_FIND_MEMBER) as $val) {
|
|
if (strpos($val, 'country') === false) {
|
|
$this->form_validation->set_rules(
|
|
$val, $val, $status_pattern
|
|
);
|
|
}
|
|
}
|
|
|
|
foreach (array_keys(member_model::DATE_FIND_MEMBER) as $val) {
|
|
$this->form_validation->set_rules(
|
|
$val, $val, 'regex_match[/\d{4}-\d{2}-\d{2}/]'
|
|
);
|
|
}
|
|
|
|
$this->form_validation->set_rules(
|
|
'select_value', 'Select Value', 'in_list[' . implode(',', array_keys(member_model::FIND_SELECT)) . ']'
|
|
);
|
|
}
|
|
|
|
public function load_pagination($total_record, $params, $action) {
|
|
// pagination
|
|
$this->load->library('pagination');
|
|
$config["total_rows"] = $total_record;
|
|
$config["base_url"] = base_url() . '/' . get_class($this) . '/' . $action;
|
|
$config["per_page"] = 10;
|
|
$config["uri_segment"] = 3;
|
|
$config["num_links"] = 5;
|
|
$config["suffix"] = '?'
|
|
. http_build_query($params);
|
|
$config["first_url"] = '/' . get_class($this) . "/{$action}/0?"
|
|
. http_build_query($params);
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
|
|
$this->pagination->initialize($config);
|
|
$page = ( $this->uri->segment(3) ) ? $this->uri->segment(3) : 0;
|
|
$offset = is_numeric($page) ? $page : 0;
|
|
|
|
return [
|
|
'link' => $this->pagination->create_links(),
|
|
'offset' => $offset,
|
|
'limit' => $config["per_page"]
|
|
];
|
|
}
|
|
|
|
public function getValueCombo($val) {
|
|
$status_value = range(0, 1);
|
|
return in_array($val, $status_value) ? $val : '';
|
|
}
|
|
|
|
public function findmember() {
|
|
|
|
// $data = array();
|
|
// $this->load->model('combo_model');
|
|
// $find_select_value = $decision_group_value = $extra_query = $search_text = "";
|
|
// if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|
// $search_text = trim($this->input->post('search_text'));
|
|
// $find_select_value = $this->input->post('find_select');
|
|
// $decision_group_value = $this->input->post('decision_group');
|
|
// if ($search_text != '' && $find_select_value != '') {
|
|
// $extra_query .= " AND lower($find_select_value) LIKE lower('$search_text%')";
|
|
// }
|
|
// if ($search_text != '' && $decision_group_value != '') {
|
|
// $extra_query .= " AND decision_group ='$decision_group_value' ";
|
|
// }
|
|
// }
|
|
// $find_select = $this->combo_model->getfindMemberType("find_select", $find_select_value);
|
|
// $decision_group = $this->combo_model->getDescisionGroupCombo("decision_group", $decision_group_value);
|
|
// $data["find_select"] = $find_select;
|
|
// $data["decision_group"] = $decision_group;
|
|
// $data["search_text"] = $search_text;
|
|
// $mysql = "SELECT '<a href=\"/member/viewLocateMember?member_id='||id||'\" >Select</a>' AS select, id,username,firstname,lastname, last_login,loc,"
|
|
// . " '<button style=\"padding:3px;\" type=\"button\" class=\"btn btn-info btn-xs\" onclick=\"viewMember('||id||');\" >View</button>' AS ACT "
|
|
// . " "
|
|
// . " FROM members WHERE id> 0 $extra_query ORDER BY id ASC LIMIT 100 ";
|
|
// $this->load->library('pagination');
|
|
// $config = array();
|
|
// $query = $this->db->query($mysql);
|
|
// $config["total_rows"] = $query->num_rows();
|
|
// $config["base_url"] = base_url() . "/member/findmember";
|
|
// $config["per_page"] = 10;
|
|
// $config["uri_segment"] = 3;
|
|
// $config["num_links"] = 5;
|
|
// $config['full_tag_open'] = "<ul class='pagination'>";
|
|
// $config['full_tag_close'] = "</ul>";
|
|
// $config['num_tag_open'] = '<li>';
|
|
// $config['num_tag_close'] = '</li>';
|
|
// $config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
// $config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
// $config['next_tag_open'] = "<li>";
|
|
// $config['next_tagl_close'] = "</li>";
|
|
// $config['prev_tag_open'] = "<li>";
|
|
// $config['prev_tagl_close'] = "</li>";
|
|
// $config['first_tag_open'] = "<li>";
|
|
// $config['first_tagl_close'] = "</li>";
|
|
// $config['last_tag_open'] = "<li>";
|
|
// $config['last_tagl_close'] = "</li>";
|
|
// $this->pagination->initialize($config);
|
|
// $page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
|
|
// $page = is_numeric($page) ? $page : 0;
|
|
// global $savvyext;
|
|
// $this->load->helper('url');
|
|
// $this->load->library('table');
|
|
// $this->template["table_open"] = "<table class='table table-striped table-hover table-bordered table-condensed' style='padding:0px; background-color:cyan;'>";
|
|
// $this->table->set_template($this->template);
|
|
// $mysql = "SELECT '<a class=\"btn btn-warning btn-sm\" href=\"/member/viewLocateMember?member_id='||id||'\" >Select</a>' AS select, id,username,firstname,lastname, last_login,loc,"
|
|
// . " '<button style=\"padding:3px;\" type=\"button\" class=\"btn btn-info btn-xs\" onclick=\"viewMember('||id||');\" >View</button>' AS ACT "
|
|
// . " "
|
|
// . " FROM members WHERE id> 0 $extra_query ORDER BY id ASC LIMIT " . $config["per_page"] . " OFFSET " . $page . " ";
|
|
// $query = $this->db->query($mysql);
|
|
// $this->table->set_heading(array('data' => 'Select', 'style' => 'width:40px'), array('data' => 'ID', 'style' => 'width:50px'), 'Email', 'Firstname', 'Lastname', 'Last Login', 'Location', array('data' => 'ACT', 'style' => 'width:40px'));
|
|
// $data['member_table'] = $this->table->generate($query);
|
|
// $data["links"] = $this->pagination->create_links();
|
|
// $data['google_api_key'] = $savvyext->cfgReadChar('google.api_key');
|
|
// $data["page_title"] = "Find Member";
|
|
// $data["page_link"] = $this->pagination->create_links();
|
|
// $this->renderMemberPage('view_findmember', $data);
|
|
global $savvyext;
|
|
$this->load->model('member_model');
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
|
|
$this->table->set_heading([
|
|
'Select',
|
|
'ID',
|
|
'Email',
|
|
'FirstName',
|
|
'LastName',
|
|
'Last Login',
|
|
'Register Date',
|
|
'IP Address',
|
|
'ACT'
|
|
]);
|
|
|
|
$params = $this->getValueOfFindMember();
|
|
|
|
$errors = $this->validateValueForFindMember($params);
|
|
$params = array_filter($params, function($ele) {
|
|
return $ele !== "";
|
|
});
|
|
$params = array_diff_key($params, $errors);
|
|
|
|
$data = $this->setComboForFindMember($params);
|
|
|
|
if ( isset($params['search_text']) ) {
|
|
// set ['email' => 'test@gmail.com']
|
|
$params[$params['find_select']] = $params['search_text'];
|
|
}
|
|
|
|
// validate by search text
|
|
$errors = $this->validateValueForFindMemberBySearchText($params);
|
|
$params = array_diff_key($params, $errors);
|
|
|
|
$data = array_merge(
|
|
$data, $params, $this->load_pagination(
|
|
count( $this->member_model->get_member_records($params) ), $params, 'findmember'
|
|
)
|
|
);
|
|
$data['member_table'] = $this->table->generate(
|
|
$this->member_model->get_member_records( $params, $data['limit'], $data['offset'] )
|
|
);
|
|
|
|
$data['google_api_key'] = $savvyext->cfgReadChar('google.api_key');
|
|
$data["page_title"] = "Find Member";
|
|
|
|
$this->renderMemberPage('view_findmember', $data);
|
|
}
|
|
|
|
var $template22 = array(
|
|
'table_open' => "<table style='background-color:aliceblue' class='table table-striped table-hover table-bordered table-condensed'>",
|
|
'thead_open' => '<thead class=\'bg-indigo\'>',
|
|
'thead_close' => '</thead>',
|
|
'heading_row_start' => '<tr>',
|
|
'heading_row_end' => '</tr>',
|
|
'heading_cell_start' => '<th>',
|
|
'heading_cell_end' => '</th>',
|
|
'tbody_open' => '<tbody>',
|
|
'tbody_close' => '</tbody>',
|
|
'row_start' => '<tr style=\'padding:3px;\'>',
|
|
'row_end' => '</tr>',
|
|
'cell_start' => '<td>',
|
|
'cell_end' => '</td>',
|
|
'row_alt_start' => '<tr style=\'padding:3px;\'>',
|
|
'row_alt_end' => '</tr>',
|
|
'cell_alt_start' => '<td>',
|
|
'cell_alt_end' => '</td>',
|
|
'table_close' => '</table>'
|
|
);
|
|
|
|
public function sendSampleMessage() {
|
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|
$member_id = $this->input->post('member_id');
|
|
$player_id = $this->input->post('player_id');
|
|
$message = $this->input->post('message');
|
|
if ($player_id != "" && $message != "") {
|
|
$result = $this->postOneSignal($player_id, $message);
|
|
var_dump($result);
|
|
} else {
|
|
echo "Invalid PLAYER_ID and/or MESSAGE!";
|
|
}
|
|
} else {
|
|
echo "Invalid request!";
|
|
}
|
|
}
|
|
|
|
private function postOneSignal($player_id, $message) {
|
|
global $savvyext;
|
|
$url = $savvyext->cfgReadChar('onesignal.url');
|
|
$app_id = $savvyext->cfgReadChar('onesignal.app_id');
|
|
|
|
$url = "https://onesignal.com/api/v1/notifications";
|
|
$app_id = "e9a7bb38-0a27-4250-9fb7-9bd7871d7b63";
|
|
|
|
$data = [
|
|
'app_id' => $app_id,
|
|
'contents' => ['en' => $message],
|
|
'headings' => ['en' => 'Float Msg'],
|
|
'subtitle' => ['en' => 'You\'ve got push from Float'],
|
|
'content_available' => true,
|
|
'mutable_content' => true,
|
|
'include_player_ids' => [$player_id],
|
|
'data' => ["foo" => "bar"]
|
|
];
|
|
$opts = array(
|
|
'http' => array(
|
|
'method' => "POST",
|
|
'header' =>
|
|
"Content-Type: application/json; charset=utf-8\r\n" .
|
|
"Accept: application/json\r\n",
|
|
'content' => json_encode($data)
|
|
)
|
|
);
|
|
$context = stream_context_create($opts);
|
|
$body = file_get_contents($url, false, $context);
|
|
error_log($body);
|
|
$result = json_decode($body, true);
|
|
return $result;
|
|
}
|
|
|
|
public function viewLocateMember() {
|
|
$this->load->helper('url');
|
|
$data = array();
|
|
|
|
$member_items = array(
|
|
['GEOLOCATION', 'Location Tracking', 'btn-primary'],
|
|
['GPSTRIPS', 'GPS Trips', 'btn-danger'],
|
|
['MERGED', 'Merged Receipts', 'btn-secondary'],
|
|
['EMAILRECIP', 'Email Receipts', 'btn-success'],
|
|
['EMAILFAIL', 'Email Fail', 'btn-danger'],
|
|
['EMAILOTHER', 'Email Other', 'btn-secondary'],
|
|
['ACCOUNTREC', 'Bank Receipts', 'btn-danger'],
|
|
['ACCOUNTOTHER', 'Bank Other', 'btn-primary'],
|
|
['MYBANKS', 'Banks', 'btn-info'],
|
|
['PARSEDDATA', 'Mobility Profile', 'btn-light'],
|
|
['MCARDS', 'Cards', 'btn-info'],
|
|
['MCARDATA', 'Cards Data', 'btn-danger'],
|
|
['POINTS', 'Points', 'btn-primary'],
|
|
['PROFILE', 'Profile/Settings', 'btn-warning'],
|
|
['CONTACTS', 'Contacts/Friends', 'btn-dark'],
|
|
['SUBSCRIPTION', 'Subscription', 'btn-success'],
|
|
['CARPOOL', 'Carpool', 'btn-light'],
|
|
['TRIPS', 'Saved Trips', 'btn-danger'],
|
|
['SURVEY', 'Survey', 'btn-info'],
|
|
['PAYMENTS', 'Payment', 'btn-primary'],
|
|
['OAUTH2', 'OAuth2', 'btn-success'],
|
|
['NOTIFICATION', 'Msg & Alerts', 'btn-info'],
|
|
['ACTIVITIES', 'Activities', 'btn-warning'],
|
|
['BOOKING', 'Bookings', 'btn-success']
|
|
);
|
|
|
|
$data['member_items'] = $member_items;
|
|
|
|
$member_id = $this->input->get('member_id');
|
|
|
|
if ($member_id != '' && $member_id > 0) {
|
|
$this->load->library('table');
|
|
// $this->template["table_open"] = "<table style='background-color:green' class='table table-striped table-hover table-bordered table-condensed'>";
|
|
$this->table->set_template($this->template);
|
|
$point_var = '\"POINTS\"';
|
|
$mysql = "SELECT m.id "
|
|
. ",m.decision_group||'<br>'||g.description||'<br>'||m.decision_updated,m.username,m.firstname,m.lastname,m.phone,m.added::date, m.last_login,'<a onclick=\"viewMemberAction({$point_var},{$member_id});\">'||m.points||'</a>' AS points,"
|
|
. " m.min_budget*0.01 AS minb, m.max_budget*0.01 AS maxb,m.country,m.city,m.state,"
|
|
. " (CASE WHEN m.alert_email=1 THEN 'Active' ELSE 'Inactive' END) emailAlert,"
|
|
. " (CASE WHEN m.alert_notification=1 THEN 'Active' ELSE 'Inactive' END) notificationAlert"
|
|
. " FROM members m LEFT JOIN decision_group g ON g.dkey=m.decision_group WHERE m.id = $member_id";
|
|
$query = $this->read_replica->query($mysql);
|
|
$this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'), 'Group/Name/Updated', 'USERNAME', 'FIRSTNAME', 'LASTNAME', array('data' => 'PHONE', 'style' => 'width:90px'), 'Created', 'last Login', 'Points', 'Min Budget', 'Max Budget'
|
|
, array('data' => 'Country', 'style' => 'width:10px'), array('data' => 'City', 'style' => 'width:10px'), array('data' => 'ST', 'style' => 'width:10px'), 'Emails', 'Notifications'
|
|
);
|
|
$data['member_table'] = $this->table->generate($query);
|
|
$_SESSION["member_id"] = $member_id;
|
|
$data["member_id"] = $member_id;
|
|
|
|
$mysql = "SELECT ma.*,m.min_budget from members_analysis ma LEFT JOIN members m ON m.id = ma.member_id WHERE ma.member_id={$member_id}";
|
|
$query = $this->read_replica->query($mysql);
|
|
// $this->table->set_heading(array('data' => 'Select', 'style' => 'width:40px'), array('data' => 'ID', 'style' => 'width:50px'), 'Email', 'Firstname', 'Lastname', 'Last Login', 'Location', array('data' => 'ACT', 'style' => 'width:40px'));
|
|
$data['member_analysis'] = $this->table->generate($query);
|
|
|
|
$data["page_title"] = "Member ID " . $member_id . " Selected";
|
|
$this->renderMemberPage('view_member', $data);
|
|
}
|
|
}
|
|
|
|
public function viewmedberdetail() {
|
|
global $savvyext;
|
|
$data = array();
|
|
|
|
if ($this->input->get()) {
|
|
$member_id = $this->input->get('member_id');
|
|
if ($member_id != '' && $member_id > 0) {
|
|
$this->load->model('combo_model');
|
|
|
|
$mysql = "SELECT a.*,a.id AS member_id, b.format AS picture_format ";
|
|
$mysql .= " FROM members a LEFT JOIN card_images b ON (b.id=a.profile_picture) WHERE a.id = $member_id";
|
|
$query = $this->read_replica->query($mysql);
|
|
$data = $query->row_array();
|
|
$data["devices"] = [];
|
|
$data['storage'] = $savvyext->cfgReadChar('system.storage_url');
|
|
$data['start_date'] = $this->input->get('start_date');
|
|
$data['end_date'] = $this->input->get('end_date');
|
|
$data['status'] = !is_null($this->input->get('card_status')) ? $this->input->get('card_status') : 1;
|
|
$data['card_status'] = $this->combo_model->getStatusCombo(
|
|
'card_status', $data['status']
|
|
);
|
|
|
|
$q = "SELECT * FROM members_devices WHERE member_id=${member_id}";
|
|
$q .= $this->query_condition_member_detail($data);
|
|
|
|
$r = $this->read_replica->query($q);
|
|
foreach ($r->result() as $row) {
|
|
$data["devices"][] = $row->player_id;
|
|
}
|
|
$this->load->view('member/extra/member_detail', $data);
|
|
} else {
|
|
echo "Not found - illegal call";
|
|
}
|
|
}
|
|
}
|
|
|
|
public function query_condition_member_detail($data) {
|
|
$query_condition = '';
|
|
if (isset($data['status'])) {
|
|
$query_condition .= " AND status = " . pg_escape_string($data['status']);
|
|
} else {
|
|
$query_condition .= " AND status = 1";
|
|
}
|
|
|
|
if (!empty($data['start_date'])) {
|
|
$query_condition .= " AND DATE(updated) >= '" . pg_escape_string($data['start_date']) . "'";
|
|
}
|
|
|
|
if (!empty($data['end_date'])) {
|
|
$query_condition .= " AND DATE(updated) <= '" . pg_escape_string($data['end_date']) . "'";
|
|
}
|
|
|
|
if (empty($data['start_date']) && empty($data['end_date'])) {
|
|
$query_condition .= " AND DATE(updated) >= DATE(CURRENT_DATE - INTERVAL '1' month)";
|
|
$query_condition .= " AND DATE(updated) <= DATE(CURRENT_DATE)";
|
|
}
|
|
|
|
return $query_condition;
|
|
}
|
|
|
|
public function viewmember() {
|
|
$data = array();
|
|
|
|
|
|
if ($this->input->get()) {
|
|
$member_id = $this->input->get('member_id');
|
|
if ($member_id != '' && $member_id > 0) {
|
|
|
|
$mysql = "SELECT * FROM members WHERE id = $member_id";
|
|
$query = $this->read_replica->query($mysql);
|
|
$data['selected_user'] = $query->row_array();
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
$data['page_title'] = "Recent Tracking Data";
|
|
|
|
$gps = $this->load->database('gps', TRUE);
|
|
$mysql = "SELECT '<button type=\"button\" class=\"btn btn-info btn-xs\" onclick=\"viewTracked('||traked_group||');\" >View</button>' AS view ,traked_group, count(id) FROM members_tracking WHERE member_id = $member_id AND traked_group IS NOT NULL GROUP BY traked_group";
|
|
$query = $gps->query($mysql);
|
|
// $this->table->set_heading(array('data' => 'ID',strtotime 'style' => 'width:10px'), 'USERNAME','FIRSTNAME','LASTNAME', array('data' => 'ACTION', 'style' => 'width:90px'));
|
|
$data['member_tracktable'] = $this->table->generate($query);
|
|
|
|
|
|
$mysql = "SELECT id,subject FROM trackedemail_item WHERE member_id=$member_id";
|
|
$query = $this->read_replica->query($mysql);
|
|
//$ this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'), 'Linked Email','Provider');
|
|
$data['member_tracked'] = $this->table->generate($query);
|
|
|
|
|
|
$mysql = " SELECT id, link_email , link_provider FROM members_trackemail WHERE active = 1 AND member_id=$member_id";
|
|
$query = $this->read_replica->query($mysql);
|
|
$this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'), 'Linked Email', 'Provider');
|
|
$data['member_trackemail'] = $this->table->generate($query);
|
|
|
|
$this->load->view('member/extra/member_activity', $data);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
$this->load->model('admindash_model');
|
|
$out = $this->admindash_model->getAdminDashData($data);
|
|
$data['recent_signup'] = $out['recent_signup'];
|
|
|
|
$this->load->model('service_model');
|
|
$outx = $this->service_model->getServiceRequestList(100);
|
|
$data['transport_request'] = $outx['service_request_list'];
|
|
|
|
$this->load->library('googlemaps');
|
|
$config['center'] = 'atalnta,GA,USA';
|
|
$config['zoom'] = 'auto';
|
|
$config['directions'] = TRUE;
|
|
$config['directionsStart'] = '4201 defoors farm trail, powder springs, GA 30127, USA';
|
|
$config['directionsEnd'] = '2324 stancrest ln, lawrenceville, 30044, GA, USA';
|
|
$config['directionsDivID'] = 'directionsDiv';
|
|
$this->googlemaps->initialize($config);
|
|
$data['map'] = $this->googlemaps->create_map();
|
|
*/
|
|
}
|
|
|
|
public function viewMemberAction() {
|
|
$this->load->helper('export_csv');
|
|
|
|
$data = array();
|
|
if ($this->input->get() || isset($this->input->post()['export'])) {
|
|
$member_id = $this->input->get('member_id') ?? $this->input->post('member_id');
|
|
$action_name = $this->input->get('action_name') ?? $this->input->post('action_name');
|
|
$start_date = $this->input->get('start_date') ?? $this->input->post('start_date');
|
|
$end_date = $this->input->get('end_date') ?? $this->input->post('end_date');
|
|
$active_tab = (null !== $this->input->get('active_tab')) ? $this->input->get('active_tab') : '#activity';
|
|
$offset = (int) $this->input->get('offset');
|
|
$limit = (int) ($this->input->get('limit'));
|
|
if ($limit < 1)
|
|
$limit = 15;
|
|
$pages = array();
|
|
|
|
if ($member_id != '' && $member_id > 0 && $action_name != '') {
|
|
|
|
$mysql = "SELECT * FROM members WHERE id = $member_id";
|
|
$query = $this->read_replica->query($mysql);
|
|
$data['selected_user'] = $query->row_array();
|
|
|
|
$decision_group = $data['selected_user']['decision_group'];
|
|
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
$data['page_title'] = "Recent Tracking Data";
|
|
|
|
$mysql = " SELECT id, link_email , link_provider FROM members_trackemail WHERE active = 1 AND member_id=$member_id";
|
|
$query = $this->read_replica->query($mysql);
|
|
$this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'), 'Linked Email', 'Provider');
|
|
$data['member_trackemail'] = $this->table->generate($query);
|
|
|
|
/* $mysql = " SELECT ('<button type=\"button\" class=\"btn btn-info btn-xs\" onclick=\"viewTrackedAdvice('||p.id||');\" >View</button>'";
|
|
$mysql.= " || '<br/><button type=\"button\" class=\"btn btn-info btn-xs\" onclick=\"return viewParse('||p.trackedemail_item_id||');\" id=\"parseButton'||p.id||'\">Parse</button>'";
|
|
$mysql.= " || '<br/><button type=\"button\" class=\"btn btn-info btn-xs\" onclick=\"return viewAdvice('||p.id||');\" id=\"adviceButton'||p.id||'\">Advice</button>'";
|
|
$mysql.= ") AS opt, ";
|
|
$mysql.= " p.* FROM parsedemail_item p LEFT JOIN trackedemail_item t ON t.id=p.trackedemail_item_id WHERE t.member_id = $member_id";
|
|
*/
|
|
|
|
$mysql = "SELECT * FROM members_bankimport WHERE member_id =" . $member_id . "ORDER BY time DESC LIMIT 200";
|
|
$query = $this->read_replica->query($mysql);
|
|
// $this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'),'Subject');
|
|
$data['member_banktrx'] = $this->table->generate($query);
|
|
|
|
$mysql = "SELECT parsedemail_item.*,parsedemail_item_advice_google.id AS gid,parsedemail_item_advice_google.routes,trackedemail_item.id as tid ";
|
|
$mysql .= " FROM trackedemail_item, parsedemail_item ";
|
|
$mysql .= " LEFT JOIN parsedemail_item_advice_google ON parsedemail_item.id=parsedemail_item_advice_google.parsedemail_item_id ";
|
|
$mysql .= " WHERE trackedemail_item.id=parsedemail_item.trackedemail_item_id AND trackedemail_item.member_id=${member_id}";
|
|
$mysql .= " AND parsedemail_item.dup_id IS NULL";
|
|
$mysql .= " ORDER BY parsedemail_item.travel_date DESC, parsedemail_item.travel_date_end DESC";
|
|
//e cho $q;
|
|
// $query = $this->db->query($mysql);
|
|
// $this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'),'Subject');
|
|
// $data['member_parsedetail'] = $this->table->generate($query);
|
|
//<span class="glyphicon glyphicon-circle-arrow-up"></span>
|
|
|
|
$this->load->model('member_model');
|
|
|
|
$member_items = array(
|
|
['GEOLOCATION', 'Location Tracking'],
|
|
['MERGED', 'Merged Receipts'],
|
|
['EMAILRECIP', 'Email Receipts'],
|
|
['ACCOUNTREC', 'Account Receipts'],
|
|
['PARSEDDATA', 'Mobility Profile'],
|
|
['MCARDS', 'Offers Cards<'],
|
|
['PROFILE', 'Profile/Settings'],
|
|
['CONTACTS', 'Contacts/Friends'],
|
|
['OAUTH2', 'OAuth2']
|
|
);
|
|
|
|
$data['member_items'] = $member_items;
|
|
$data['member_id'] = $member_id;
|
|
$data['limit'] = $limit;
|
|
$data['offset'] = $offset;
|
|
$data['action_name'] = $action_name;
|
|
$data['start_date'] = $start_date;
|
|
$data['end_date'] = $end_date;
|
|
$data['active_tab'] = $active_tab;
|
|
|
|
switch ($action_name) {
|
|
case "GEOLOCATION":
|
|
$this->load->view('member/extra/member_geolocation', $data);
|
|
break;
|
|
case "GPSTRIPS":
|
|
$this->setDataForTrackingTrips($data);
|
|
$this->validateForTrackingTrips($data);
|
|
|
|
$this->setDataForTracking($data);
|
|
$this->validateForTracking($data);
|
|
|
|
$data = $this->getMemberGPSData($member_id, $data);
|
|
$this->load->view('member/extra/member_tracking', $data);
|
|
break;
|
|
case "EMAILRECIP":
|
|
$this->setDataForEmailReceipts($data);
|
|
$this->validateForEmailReceipts($data);
|
|
|
|
// init paging param & save for view
|
|
$member_parsedemail_offset = (int) ($this->input->get('member_parsedemail_offset') ?? $offset);
|
|
$member_tracked_offset = (int) ($this->input->get('member_tracked_offset') ?? $offset);
|
|
|
|
|
|
$data = $this->viewReceipts($member_id, $data, $limit, $member_parsedemail_offset, $member_tracked_offset, $data['errors']);
|
|
if ($this->input->get()) {
|
|
$this->load->view('member/extra/member_emailscanned', $data);
|
|
}
|
|
break;
|
|
case 'EMAILFAIL':
|
|
$data = $this->viewEmailFail($member_id, $limit, $offset);
|
|
|
|
if ( $this->input->get() ) {
|
|
$this->load->view('member/extra/member_emailfails', $data);
|
|
}
|
|
|
|
break;
|
|
case "MERGED":
|
|
$this->setDataForMergedReceipts($data);
|
|
$this->validateForMergedReceipts($data);
|
|
|
|
$data = $this->viewMerged($member_id, $data, $limit, $offset);
|
|
$data["plot"] = $this->plotFacedata($member_id);
|
|
$this->load->view('member/extra/member_merged', $data);
|
|
break;
|
|
case "ACCOUNTREC":
|
|
$this->load->view('member/extra/member_accountread', $data);
|
|
break;
|
|
case "ACCOUNTOTHER":
|
|
|
|
$mysql = "SELECT * FROM members_transactions_import_raw WHERE member_id =" . $member_id . "ORDER BY time DESC LIMIT 200";
|
|
$query = $this->read_replica->query($mysql);
|
|
// $this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'),'Subject');
|
|
$data['member_bank_other'] = $this->table->generate($query);
|
|
$this->load->view('member/extra/member_accountother', $data);
|
|
break;
|
|
case "MYBANKS":
|
|
$data = $this->getMemberBankList($member_id, $data);
|
|
$this->load->view('member/extra/member_bank', $data);
|
|
break;
|
|
case "CONTACTS":
|
|
// echo "UNDER DEVELOPMENT";
|
|
//
|
|
$this->load->view('member/extra/member_contacts', $data);
|
|
break;
|
|
case "MCARDS":
|
|
$mode = $this->input->get('mode')??'ALL';
|
|
$data = $this->getSlideCards($member_id, $data, $mode);
|
|
$this->load->view('member/extra/member_cards', $data);
|
|
break;
|
|
case "MCARDATA":
|
|
$data = $this->getSlideCardsData($member_id, $decision_group, $data);
|
|
$this->load->view('member/extra/member_carddata', $data);
|
|
break;
|
|
case "PROFILE":
|
|
$data = $this->memberProfile($member_id);
|
|
|
|
$this->load->view('member/extra/member_profile', $data);
|
|
break;
|
|
case "POINTS":
|
|
$data = $this->memberPoints($member_id, $data);
|
|
$this->load->view('member/extra/member_points', $data);
|
|
break;
|
|
case "PARSEDDATA":
|
|
$data = $this->plotFacedata($member_id);
|
|
$this->load->view('member/extra/member_parseddetail', $data);
|
|
break;
|
|
case "SUBSCRIPTION":
|
|
$data = $this->memberSubscription($member_id, $data);
|
|
$this->load->view('member/extra/member_subscription', $data);
|
|
break;
|
|
case "SURVEY":
|
|
$data = $this->getMemberSurveyReport($member_id, $data);
|
|
$this->load->view('member/extra/member_survey', $data);
|
|
break;
|
|
case "PAYMENTS":
|
|
|
|
break;
|
|
case "OAUTH2":
|
|
$data['message'] = '';
|
|
$data = $this->memberOAuth2($member_id, $data);
|
|
$this->load->view('member/extra/member_oauth2', $data);
|
|
break;
|
|
case "OAUTH2_DELETE":
|
|
$data['message'] = 'Unexpected error';
|
|
$data = $this->memberOAuth2Delete($member_id, $data);
|
|
$this->load->view('member/extra/member_oauth2', $data);
|
|
break;
|
|
case "CARPOOL":
|
|
$data = $this->getMemberCarpoolReport($member_id, $data);
|
|
$this->load->view('member/extra/member_carpool', $data);
|
|
break;
|
|
case "TRIPS":
|
|
// $data = $this->getMemberTripsReport($member_id, $data)
|
|
$this->setDataForSavedTrip($data);
|
|
$this->load->view('member/extra/member_trips', $data);
|
|
break;
|
|
case 'NOTIFICATION':
|
|
$this->load->model('combo_model');
|
|
|
|
$data = $this->getMemberNotificationReport($member_id, $data);
|
|
$data['card_msg_status'] = $this->combo_model->getMsgStatusCombo('card_msg_status');
|
|
|
|
$this->load->view('member/extra/member_alerts', $data);
|
|
break;
|
|
case 'ACTIVITIES':
|
|
$this->appActivitiesData($member_id, $data);
|
|
$this->load->view('member/extra/member_appactivities', $data);
|
|
break;
|
|
case 'EMAILOTHER':
|
|
$this->setDataForEmailReceipts($data);
|
|
$this->validateForEmailReceipts($data);
|
|
|
|
// init paging param & save for view
|
|
$member_parsedemail_offset = (int) ($this->input->get('member_parsedemail_offset') ?? $offset);
|
|
$member_tracked_offset = (int) ($this->input->get('member_tracked_offset') ?? $offset);
|
|
|
|
$data = $this->viewOtherReceipts($member_id, $data, $limit, $member_parsedemail_offset, $member_tracked_offset, $data['errors']);
|
|
if ($this->input->get()) {
|
|
$this->load->view('member/extra/member_otherreceipts', $data);
|
|
}
|
|
break;
|
|
case 'BOOKING':
|
|
$data['member_id'] = $member_id;
|
|
$this->load->view('member/extra/member_booking', $data);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ACTIVITIES - Get trip report
|
|
* @param int $member_id the member id
|
|
* @param array|tring $data date params if $data is string
|
|
* @return array
|
|
*/
|
|
public function getTripreport($member_id, $data, $echo = 0, $country = '')
|
|
{
|
|
if ( is_array( $data ) ) {
|
|
$start_date = $data['start_date'];
|
|
$end_date = $data['end_date'];
|
|
} else {
|
|
list( $start_date, $end_date ) = explode( ':', $data );
|
|
}
|
|
|
|
$args = [
|
|
'type' => 'spendingByCategoryLastSevenDays',
|
|
'data' => [
|
|
'member_id' => $member_id,
|
|
'days' => 30,
|
|
'include_items' => true,
|
|
'start_date' => str_replace('-', '/', $start_date),
|
|
'end_date' => str_replace('-', '/', $end_date),
|
|
'country' => $country
|
|
]
|
|
];
|
|
|
|
$payload = json_encode( $args );
|
|
$data = array();
|
|
list( $payload, $decrypted, $result, $body ) = $this->main_api_post( '/trips/api/report', $payload );
|
|
|
|
if ( is_array( $payload ) ) {
|
|
$data['trip_report'] = $this->parse_trip_report_data( $payload );
|
|
}
|
|
|
|
if ( $echo ) {
|
|
ob_start();
|
|
$data['start_date'] = $start_date;
|
|
$data['end_date'] = $end_date;
|
|
$this->load->view( 'member/extra/activities/activity', $data );
|
|
$result = ob_get_clean();
|
|
echo $result;
|
|
} else {
|
|
return $data;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ACTIVITIES - Get time travel report
|
|
* @param int $member_id the member id
|
|
* @param array|tring $data date params if $data is string
|
|
* @return array
|
|
*/
|
|
public function getTimetravel($member_id, $data, $echo = 0, $country = '')
|
|
{
|
|
if ( is_array( $data ) ) {
|
|
$start_date = $data['start_date'];
|
|
$end_date = $data['end_date'];
|
|
} else {
|
|
list( $start_date, $end_date ) = explode( ':', $data );
|
|
}
|
|
$args = array(
|
|
'type' => 'travelTimeByDays',
|
|
'days' => 60,
|
|
'data' => array(
|
|
'member_id' => $member_id,
|
|
'days' => 60,
|
|
'start_date' => str_replace( '-', '/', $start_date ),
|
|
'end_date' => str_replace( '-', '/', $end_date ),
|
|
'country'=>$country
|
|
)
|
|
);
|
|
|
|
$payload = json_encode( $args );
|
|
$data = array();
|
|
list( $payload, $decrypted, $result, $body ) = $this->main_api_post( '/trips/api/report', $payload );
|
|
|
|
$data['timetravel_data'] = [];
|
|
if ( is_array( $payload ) ) {
|
|
$data['timetravel_data'] = $payload;
|
|
}
|
|
if ( $echo ) {
|
|
ob_start();
|
|
$this->load->view( 'member/extra/activities/timetravel', $data );
|
|
$result = ob_get_clean();
|
|
echo $result;
|
|
} else {
|
|
return $data;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ACTIVITIES - Get spent category report
|
|
* @param int $member_id the member id
|
|
* @param array|tring $data date params if $data is string
|
|
* @return array
|
|
*/
|
|
public function getSpentCategory($member_id, $data, $_days = 60, $echo = 0, $country = '')
|
|
{
|
|
if ( is_array( $data ) ) {
|
|
$start_date = $data['start_date'];
|
|
$end_date = $data['end_date'];
|
|
} else {
|
|
list( $start_date, $end_date ) = explode( ':', $data );
|
|
}
|
|
|
|
$args = array(
|
|
'type' => 'spendingByCategoryLastSevenDays',
|
|
'data' => array(
|
|
'member_id' => $member_id,
|
|
'days' => $_days,
|
|
'include_items' => true,
|
|
'start_date' => str_replace( '-', '/', $start_date ),
|
|
'end_date' => str_replace( '-', '/', $end_date ),
|
|
'country' => $country
|
|
)
|
|
);
|
|
|
|
$payload = json_encode( $args );
|
|
$data = array();
|
|
list( $payload, $decrypted, $result, $body ) = $this->main_api_post( '/trips/api/report', $payload );
|
|
|
|
if ( is_array( $payload ) ) {
|
|
$key = sprintf( 'speding_category%s', $_days != 60 ? ( $_days > 0 ) ? $_days : '_daysrange' : '' );
|
|
$data[$key] = $payload;
|
|
}
|
|
if ( $echo ) {
|
|
ob_start();
|
|
$data['start_date'] = $start_date;
|
|
$data['end_date'] = $end_date;
|
|
$this->load->view( 'member/extra/activities/spentcategory', $data );
|
|
$result = ob_get_clean();
|
|
echo $result;
|
|
} else {
|
|
return $data;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ACTIVITIES - Get emissions report
|
|
* @param int $member_id the member id
|
|
* @param array &$data
|
|
* @return array
|
|
*/
|
|
public function getEmissions($member_id, $data, $echo = false, $country = '')
|
|
{
|
|
if ( is_array( $data ) ) {
|
|
$start_date = $data['start_date'];
|
|
$end_date = $data['end_date'];
|
|
} else {
|
|
list( $start_date, $end_date ) = explode( ':', $data );
|
|
}
|
|
|
|
$args = array(
|
|
'type' => 'emissionsByDays',
|
|
'data' => array(
|
|
'member_id' => $member_id,
|
|
'days' => 60,
|
|
'start_date' => str_replace('-', '/', $start_date),
|
|
'end_date' => str_replace('-', '/', $end_date),
|
|
'country' => $country
|
|
)
|
|
);
|
|
$payload = json_encode( $args );
|
|
$data = array();
|
|
list( $payload, $decrypted, $result, $body ) = $this->main_api_post( '/trips/api/report', $payload );
|
|
|
|
$data['emission_data'] = [];
|
|
if ( is_array( $payload ) ) {
|
|
$data['emission_data'] = $payload;
|
|
}
|
|
|
|
if ( $echo ) {
|
|
ob_start();
|
|
$data['start_date'] = $start_date;
|
|
$data['end_date'] = $end_date;
|
|
$this->load->view( 'member/extra/activities/emissions', $data );
|
|
$result = ob_get_clean();
|
|
echo $result;
|
|
} else {
|
|
return $data;
|
|
}
|
|
}
|
|
|
|
public function getAllSpentCategory($member_id, $data, $echo = false, $country = '')
|
|
{
|
|
$results = array(
|
|
'speding_category' => $this->getSpentCategory($member_id, $data, $_days = 60, 0, $country)['speding_category'],
|
|
'speding_category30' => $this->getSpentCategory($member_id, $data, $_days = 30, 0, $country)['speding_category30'],
|
|
'speding_category7' => $this->getSpentCategory($member_id, $data, $_days = 7, 0, $country)['speding_category7']
|
|
);
|
|
|
|
if ( $echo ) {
|
|
ob_start();
|
|
$this->load->view( 'member/extra/activities/spentcategory', $results );
|
|
$result = ob_get_clean();
|
|
echo $result;
|
|
} else {
|
|
return $results;
|
|
}
|
|
}
|
|
|
|
private function appActivitiesData($member_id, &$data)
|
|
{
|
|
$qcountry = $this->read_replica->query('SELECT country FROM members WHERE id = ?', [$member_id])->row();
|
|
$country = !empty($qcountry) ? $qcountry->country : '';
|
|
|
|
// get trip report
|
|
$trip_report = $this->getTripreport( $member_id, $data, 0, $country);
|
|
$data['trip_report'] = isset( $trip_report['trip_report'] ) ? $trip_report['trip_report'] : array();
|
|
// get time travel
|
|
$data['timetravel_data'] = $this->getTimetravel( $member_id, $data, 0 , $country )['timetravel_data'];
|
|
// get spent category report
|
|
$spentCategories = $this->getAllSpentCategory( $member_id, $data, 0, $country );
|
|
if ( $spentCategories ) {
|
|
foreach ( $spentCategories as $key => $spent ) {
|
|
$data[$key] = $spent;
|
|
}
|
|
}
|
|
// get emission report
|
|
$data['emission_data'] = $this->getEmissions( $member_id, $data, 0, $country )['emission_data'];
|
|
|
|
$param = array(
|
|
"type" => "travelTimeBreakdownVsAverage",
|
|
"data" => array(
|
|
"member_id" => $member_id,
|
|
"days" => "60",
|
|
"start_date" => $data["start_date"],
|
|
"end_date" => $data["end_date"],
|
|
'country' => $country
|
|
)
|
|
);
|
|
|
|
$payload = json_encode($param);
|
|
list($payload, $decrypted, $result, $body) = $this->main_api_post('/trips/api/report', $payload);
|
|
if (is_array($payload)) {
|
|
$data["radar_data"] = $payload;
|
|
}
|
|
// Report details - Activities tab
|
|
// $report_params = [
|
|
// 'type' => 'spendingByCategoryLastSevenDays',
|
|
// 'data' => [
|
|
// 'member_id' => $member_id,
|
|
// 'days' => 30,
|
|
// 'include_items' => true,
|
|
// "start_date" => $data["start_date"],
|
|
// "end_date" => $data["end_date"]
|
|
// ]
|
|
// ];
|
|
|
|
// $payload = json_encode($report_params);
|
|
// list($payload, $decrypted, $result, $body) = $this->main_api_post('/trips/api/report', $payload);
|
|
// if (is_array($payload)) {
|
|
// $data["trip_report"] = $this->parse_trip_report_data($payload);
|
|
// }
|
|
// End report details - Activities tab
|
|
//
|
|
// print_r($payload);
|
|
// print_r($result);
|
|
// print_r($payload);
|
|
|
|
/*
|
|
$payload = "{
|
|
\"type\":\"weeklySpending\",
|
|
\"data\":\"" . $payload_data . "\"
|
|
}";
|
|
|
|
|
|
|
|
$payload = "{
|
|
\"type\":\"spendingByCategoryAllTime\",
|
|
\"data\":\"" . $payload_data . "\"
|
|
}";
|
|
|
|
|
|
|
|
$payload = "{
|
|
\"type\":\"spendingByCategoryLastSevenDays\",
|
|
\"data\":\"" . $payload_data . "\"
|
|
}";
|
|
|
|
$payload = "{
|
|
\"type\":\"travelTimeBreakdownVsAverage\",
|
|
\"data\":\"" . $payload_data . "\"
|
|
}";
|
|
|
|
|
|
$payload = "{
|
|
\"type\":\"travelTimeByDays\",
|
|
\"data\":\"" . $payload_data . "\"
|
|
}";
|
|
|
|
*/
|
|
}
|
|
|
|
public function getMemberBankList($member_id, &$data) {
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
|
|
$mysql = "SELECT * FROM members_bank_accounts WHERE member_id=" . $member_id;
|
|
|
|
$query = $this->read_replica->query($mysql);
|
|
$data['bank_table'] = $this->table->generate($query);
|
|
$data["page_title"] = "Account Banks";
|
|
return $data;
|
|
}
|
|
|
|
public function getMemberNotificationReport($member_id, &$data) {
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
|
|
$mysql = "SELECT n.added,n.expire,"
|
|
. "CASE WHEN m.alert_notification=1 THEN 'Yes' ELSE 'No' END AS sendAlert,"
|
|
. "( CASE WHEN m.alert_email=1 THEN 'Yes' ELSE 'No' END) emailAlert,n.trigger_key,"
|
|
. " n.notice_type,n.msg,"
|
|
. " ( CASE WHEN n.status=1 THEN 'Pending' WHEN n.status=5 THEN 'Completed' WHEN n.status=2 THEN 'Expired' WHEN n.status=3 THEN 'Cancelled' ELSE 'No' END) AS msg_status, "
|
|
. " n.added,n.mmode ,"
|
|
. "'<button type=\"button\" onclick=\"pushNotification('||n.id||','||m.id||');\" class=\"btn btn-danger\" id=\"acc'||n.id||'\">Send</button><div id=\"msgl'||n.id||'\"></div>' AS Send "
|
|
. " FROM members_notification n LEFT JOIN members m On m.id=n.member_id WHERE n.member_id ={$member_id} ORDER BY n.added DESC";
|
|
|
|
|
|
$query = $this->read_replica->query($mysql);
|
|
$data['alerts_recieved'] = $this->table->generate($query);
|
|
$data["Notifications"] = "Trips Report";
|
|
|
|
return $data;
|
|
}
|
|
|
|
public function getMemberTripsReport($member_id, &$data) {
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
|
|
$mysql = "SELECT * FROM members_trips WHERE member_id = " . $member_id;
|
|
|
|
$query = $this->read_replica->query($mysql);
|
|
$data['trips_table'] = $this->table->generate($query);
|
|
$data["page_title"] = "Trips Report";
|
|
|
|
return $data;
|
|
}
|
|
|
|
public function cancelCarpool() {
|
|
|
|
$carpool_id = (int) $this->input->get('carpool_id');
|
|
$member_id = (int) $this->input->get('member_id');
|
|
|
|
if ($carpool_id > 0 && $member_id > 0) {
|
|
$mysql = "SELECT * from members_carpool WHERE status =1 AND id = " . $carpool_id;
|
|
$query = $this->read_replica->query($mysql);
|
|
|
|
if ($query->num_rows() > 0) {
|
|
$cp = $query->row_array();
|
|
|
|
$card_id = $cp["card_id"];
|
|
|
|
$mysql_up = "UPDATE members_carpool SET status = 4 WHERE status =1 AND id = " . $carpool_id;
|
|
$this->db->query($mysql_up);
|
|
|
|
$mysql_up = "UPDATE members_carpool_friends SET status = 4 WHERE status NOT IN ( 4 ) AND carpool_id = " . $carpool_id;
|
|
$this->db->query($mysql_up);
|
|
|
|
/*
|
|
*
|
|
* members_carpool_friends members_carpool_friends_id_seq members_carpool_id_seq
|
|
savvy=> SELECT * FROM members_carpool_friends;
|
|
id | carpool_id | firstname | lastname | email | status | accept_status | pool_status | level_a | level_b | added | last_msg | updated | link
|
|
----+------------+-----------+------------+-----------------------------------------+--------+---------------+-------------+---------+---------+----------------------------+----------+----------------------------+-------------------------------------------------------------------
|
|
14 | 18 | Olu | Ameye | ameye@chiefsoft.com | 1 | 0 | 0 | A | A | 2019-11-12 12:41:36.46717 | | 2019-11-12 12:41:36.46717 | 40170ebd8a13f4d4189b49179bcc1da5@aab3238922bcc25a6f606eb525ffdc56
|
|
19 | 23 | cornel | float | cornel@float.sg | 1 | 0 | 0 | A | A | 2019-11-14 16:26:22.789631 | | 2019-11-14 16:26:22.789631 | 4d22822d17ee3875d00b1330a791af1d@1f0e3dad99908345f7439f8ffabdffc4
|
|
20 | 24 | cornel | float | cornel@float.sg | 1 | 0 | 0 | A | A | 2019-11-14 16:26:40.584426 | | 2019-11-14 16:26:40.584426 | aad64b3918c8f037fe4657ed5f6fbd5d@98f13708210194c475687be6106a3b84
|
|
21 | 25 | cornel | flat | cornel@float.sg | 1 | 0 | 0 | A | A | 2019-11-14 16:31:07.37425 | | 2019-11-14 16:31:07.37425 | b1862df558a73d3802cc051811a1dc5b@3c59dc048e8850243be8079a5c74d079
|
|
22 | 26 | cornel | float | cornel@float.sg | 1 | 0 | 0 | A | A | 2019-11-14 16:34:17.416433 | | 2019-11-14 16:34:17.416433 | 4d4b3d0cb01b4a0c35794d7f50459cf7@b6d767d2f8ed5d21a44b0e5886680cb9
|
|
23 | 27 | cornel | floart | cornel+test@float.sg | 4 | 0 | 0 | A | A | 2019-11-15 04:42:50.224035 | | 2019-11-15 04:42:50.224035 | c89c2f772bc8b069344f0af2469cb268@37693cfc748049e45d87b8c7d8b9aacd
|
|
|
|
*/
|
|
|
|
// $mysql_up = "UPDATE members_card_assign SET status = 0 WHERE status =1 AND member_id = $member_id AND card_id = $card_id";
|
|
// $this->db->query($mysql_up);
|
|
|
|
|
|
echo "Cancelled";
|
|
}
|
|
} else {
|
|
echo 'Invalid Call';
|
|
}
|
|
}
|
|
|
|
public function sendCarpoolMessage() {
|
|
|
|
$carpool_id = (int) $this->input->get('carpool_id');
|
|
if ($carpool_id > 0) {
|
|
$out = array();
|
|
$in = array();
|
|
$in['action'] = SAVVY_BKO_CARPOOL_FRIENDMESSAGE;
|
|
$in['carpool_friend_id'] = $carpool_id;
|
|
$ret = $this->savvy_api($in, $out);
|
|
print_r($out);
|
|
if ($ret == PHP_API_OK) {
|
|
$message = "Message Sent";
|
|
} else {
|
|
$message = 'Failed to Send';
|
|
}
|
|
echo $message;
|
|
} else {
|
|
echo 'Invalid Call';
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
public function viewCarpoolData() {
|
|
|
|
$carpool_id = (int) $this->input->get('carpool_id');
|
|
if ($carpool_id > 0) {
|
|
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
|
|
|
|
$mysql = "SELECT cp.id AS carpool_id,mc.title,mc.id AS card_id,cp.added,cp.updated,cp.status
|
|
FROM members_carpool cp
|
|
LEFT JOIN members m ON m.id = cp.member_id
|
|
LEFT JOIN main_cards mc ON mc.id=cp.card_id WHERE cp.id = " . $carpool_id;
|
|
$query = $this->read_replica->query($mysql);
|
|
$carpool_table = $this->table->generate($query);
|
|
|
|
$mysql = "SELECT
|
|
'<button id=\"sendmsg'||id||'\" type=\"button\" class=\"btn btn-danger btn-xs\" block onclick=\"sendCarpoolMessage('||id||');\">Send</button>' AS MSG,
|
|
* FROM members_carpool_friends WHERE carpool_id=" . $carpool_id;
|
|
$query = $this->read_replica->query($mysql);
|
|
$carpool_friend_table = $this->table->generate($query);
|
|
echo $carpool_table . "<br> <b>Friends</b><br>" . $carpool_friend_table;
|
|
} else {
|
|
echo 'Invalid Call';
|
|
}
|
|
}
|
|
|
|
public function getMemberCarpoolReport($member_id, &$data) {
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
|
|
$mysql = "SELECT '<button id=\"trip'||cp.id||'\" type=\"button\" class=\"btn btn-primary btn-xs\" block onclick=\"viewCarpool('||cp.id||');\">View</button>' AS view, "
|
|
. "cp.pool,mc.title,mc.id AS card_id,cp.added,cp.updated,cp.status,"
|
|
. "'<button id=\"cancel'||cp.id||'\" type=\"button\" class=\"btn btn-success btn-xs\" block onclick=\"cancelCarpool('||cp.id||',$member_id);\">Cancel</button>' AS cancel,"
|
|
. "'<button id=\"process'||cp.id||'\" type=\"button\" class=\"btn btn-secondary btn-xs\" block onclick=\"processCarpool('||cp.id||',$member_id);\">Process</button>' AS process "
|
|
. "FROM members_carpool cp "
|
|
. "LEFT JOIN members m ON m.id = cp.member_id "
|
|
. "LEFT JOIN main_cards mc ON mc.id=cp.card_id WHERE cp.member_id=" . $member_id;
|
|
|
|
$query = $this->read_replica->query($mysql);
|
|
$data['carpool_table'] = $this->table->generate($query);
|
|
$data["page_title"] = "Carpool Report";
|
|
|
|
return $data;
|
|
}
|
|
|
|
public function getMemberSurveyReport($member_id, &$data) {
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
|
|
$mysql = "SELECT ms.id,me.firstname,me.lastname,m.title,ms.answer,ms.status,me.added,m.button1_action "
|
|
. "FROM members_survey ms "
|
|
. "LEFT JOIN main_cards m ON m.id=ms.card_id "
|
|
. "LEFT JOIN members me ON me.id = ms.member_id WHERE ms.member_id=$member_id";
|
|
|
|
$query = $this->read_replica->query($mysql);
|
|
//id firstname lastname title subscribe status button1_action
|
|
$this->table->set_heading(array('data' => 'ID', 'style' => 'width:50px'), 'Firstname', 'Lastname', 'Description', 'Answer', 'Date Subscribed', 'Status', 'Action');
|
|
$data['survey_table'] = $this->table->generate($query);
|
|
|
|
|
|
$mysql = "SELECT os.answers, ms.answers_key,ms.answers AS user_answer
|
|
FROM members_onboarding_survey ms
|
|
LEFT JOIN onboarding_survey os ON os.answers_key=ms.answers_key
|
|
WHERE ms.member_id = $member_id";
|
|
|
|
$query = $this->read_replica->query($mysql);
|
|
//id firstname lastname title subscribe status button1_action
|
|
$this->table->set_heading('Question', array('data' => 'answers_key', 'style' => 'width:1050px'), array('data' => 'user_answer', 'style' => 'width:50px'));
|
|
$data['onboarding_survey_table'] = $this->table->generate($query);
|
|
|
|
|
|
|
|
$data["page_title"] = "Survey Report";
|
|
return $data;
|
|
}
|
|
|
|
public function getMemberGPSData($member_id, &$data) {
|
|
$per_page = 20;
|
|
|
|
$data["member_id"] = $member_id;
|
|
|
|
$tracking_trips_errors = $data['errors']['tracking_trips'] ?? null;
|
|
$tracking_trips_data = $data['tracking_trips'];
|
|
|
|
$tracking_errors = $data['errors']['tracking'] ?? null;
|
|
$tracking_data = $data['tracking'];
|
|
|
|
$tracking_data['cur_page'] = $tracking_data['cur_page'] ?? 0;
|
|
if ($tracking_data['cur_page'] != 0) {
|
|
$tracking_data['offset'] = ($tracking_data['cur_page'] - 1) * $per_page;
|
|
} else {
|
|
$tracking_data['offset'] = 0;
|
|
}
|
|
|
|
$tracking_trips_data['cur_page'] = $tracking_trips_data['cur_page'] ?? 0;
|
|
if ($tracking_trips_data['cur_page'] != 0) {
|
|
$tracking_trips_data['offset'] = ($tracking_trips_data['cur_page'] - 1) * $per_page;
|
|
} else {
|
|
$tracking_trips_data['offset'] = 0;
|
|
}
|
|
|
|
$gps = $this->load->database('gps', TRUE);
|
|
$this->load->library('pagination');
|
|
$this->load->helper('url');
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
|
|
$query_params = [
|
|
'proc' => 'PROCESS',
|
|
'action_name' => $data['action_name'],
|
|
'member_id' => $member_id
|
|
];
|
|
|
|
$config["base_url"] = base_url()
|
|
. "/member/viewMemberAction";
|
|
$config['first_url'] = '/member/viewMemberAction/0?'
|
|
. http_build_query($query_params);
|
|
$config['suffix'] = '?' . http_build_query($query_params);
|
|
$config["per_page"] = $per_page;
|
|
$config['attributes'] = [
|
|
'class' => 'tracking__pagination-anchor'
|
|
];
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'><span class='cur-page'>";
|
|
$config['cur_tag_close'] = "</span><span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
$config['cur_page'] = $tracking_data['cur_page'];
|
|
$config['use_page_numbers'] = TRUE;
|
|
|
|
$data["tracking_table"] = "";
|
|
$data["tracking_links"] = "";
|
|
$data["tracking_trips_table"] = "";
|
|
$data["tracking_trips_pagination_link"] = "";
|
|
|
|
if ($data["member_id"] > 0) {
|
|
// id member_id traked_group speed lat lng gps ttime loc created device_id previous_id distance duration
|
|
$q = "SELECT id,duration,distance,round(speed,2) as speed,date_trunc('second',ttime) as ttime,device_id,loc,traked_group FROM members_tracking WHERE member_id=" . $data["member_id"];
|
|
|
|
// date
|
|
if (!empty($tracking_data['start_date']) && !isset($tracking_errors['start_date'])) {
|
|
$q .= " AND DATE(ttime) >= '" . pg_escape_string($tracking_data['start_date']) . "'";
|
|
}
|
|
if (!empty($tracking_data['end_date']) && !isset($tracking_errors['end_date'])) {
|
|
$q .= " AND DATE(ttime) <= '" . pg_escape_string($tracking_data['end_date']) . "'";
|
|
}
|
|
if (empty($tracking_data['start_date']) && empty($tracking_data['end_date'])) {
|
|
$data['tracking']['start_date'] = date('Y-m-d', strtotime('-1 month'));
|
|
$data['tracking']['end_date'] = date('Y-m-d');
|
|
|
|
$q .= " AND DATE(ttime) >= '" . $data['tracking']['start_date'] . "'"
|
|
. " AND DATE(ttime) <= '" . $data['tracking']['end_date'] . "'";
|
|
}
|
|
|
|
// duration
|
|
if (isset($tracking_data['start_duration']) && !isset($tracking_errors['start_duration'])) {
|
|
$q .= " AND duration >= " . pg_escape_string($tracking_data['start_duration']) . "";
|
|
}
|
|
if (isset($tracking_data['end_duration']) && !isset($tracking_errors['end_duration'])) {
|
|
$q .= " AND duration <= " . pg_escape_string($tracking_data['end_duration']) . "";
|
|
}
|
|
|
|
// distance
|
|
if (isset($tracking_data['start_distance']) && !isset($tracking_errors['start_distance'])) {
|
|
$q .= " AND distance >= " . pg_escape_string($tracking_data['start_distance']) . "";
|
|
}
|
|
if (isset($tracking_data['end_distance']) && !isset($tracking_errors['end_distance'])) {
|
|
$q .= " AND distance <= " . pg_escape_string($tracking_data['end_distance']) . "";
|
|
}
|
|
|
|
$r = $gps->query($q);
|
|
|
|
$config["total_rows"] = $r->num_rows();
|
|
$this->pagination->initialize($config);
|
|
|
|
$q .= " ORDER BY ttime DESC LIMIT " . $per_page . " OFFSET " . $tracking_data['offset'];
|
|
$query = $gps->query($q);
|
|
|
|
// id duration distance speed ttime device_id loc traked_group
|
|
$this->table->set_heading(
|
|
array('data' => 'ID', 'style' => 'width:80px'), array('data' => 'Duration', 'style' => 'width:80px'), array('data' => 'Distance', 'style' => 'width:80px'), array('data' => 'Speed', 'style' => 'width:80px'), array('data' => 'Time', 'style' => 'width:160px'), array('data' => 'Device ID', 'style' => 'width:80px'), array('data' => 'IP Address', 'style' => 'width:80px'), array('data' => 'Tracked Group', 'style' => 'width:80px')
|
|
);
|
|
$data["tracking_table"] = $this->table->generate($query);
|
|
|
|
// if ($r->num_rows()) {
|
|
$data["tracking_links"] = $this->pagination->create_links();
|
|
// }
|
|
|
|
$q = "SELECT '<button id=\"trip'||id||'\" type=\"button\" class=\"btn btn-primary btn-xs\" block onclick=\"viewTrip('||id||');\">View</button>',";
|
|
$q .= "ROUND(a.duration,0) AS duration,ROUND(a.distance,2) AS distance,ROUND(a.speed,2) AS speed, ROUND(a.avg_speed,2) AS avg_speed ";
|
|
$q .= "FROM members_tracking_trips a WHERE a.member_id=" . $data["member_id"];
|
|
|
|
// duration
|
|
if (isset($tracking_trips_data['start_duration']) && !isset($tracking_trips_errors['start_duration'])) {
|
|
$q .= " AND a.duration >= " . pg_escape_string($tracking_trips_data['start_duration']) . "";
|
|
}
|
|
if (isset($tracking_trips_data['end_duration']) && !isset($tracking_trips_errors['end_duration'])) {
|
|
$q .= " AND a.duration <= " . pg_escape_string($tracking_trips_data['end_duration']) . "";
|
|
}
|
|
|
|
// distance
|
|
if (isset($tracking_trips_data['start_distance']) && !isset($tracking_trips_errors['start_distance'])) {
|
|
$q .= " AND a.distance >= " . pg_escape_string($tracking_trips_data['start_distance']) . "";
|
|
}
|
|
if (isset($tracking_trips_data['end_distance']) && !isset($tracking_trips_errors['end_distance'])) {
|
|
$q .= " AND a.distance <= " . pg_escape_string($tracking_trips_data['end_distance']) . "";
|
|
}
|
|
|
|
$r = $gps->query($q);
|
|
|
|
$config = [];
|
|
$config["base_url"] = base_url()
|
|
. "/member/viewMemberAction";
|
|
$config["suffix"] = '?' . http_build_query($query_params);
|
|
$config['first_url'] = '/member/viewMemberAction/0?'
|
|
. http_build_query($query_params);
|
|
$config["per_page"] = $per_page;
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'><span class='cur-page'>";
|
|
$config['cur_tag_close'] = "</span><span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
$config["total_rows"] = $r->num_rows();
|
|
$config['query_string_segment'] = 'tracking_trips_offset';
|
|
$config['attributes'] = [
|
|
'class' => 'tracking-trips__pagination-anchor'
|
|
];
|
|
$config['use_page_numbers'] = TRUE;
|
|
$config['cur_page'] = $tracking_trips_data['cur_page'];
|
|
$this->pagination->initialize($config);
|
|
|
|
$q .= " LIMIT " . $per_page . " OFFSET " . $tracking_trips_data['offset'];
|
|
$query = $gps->query($q);
|
|
|
|
$this->table->set_heading(
|
|
array('data' => 'ID', 'style' => 'width:30px'), array('data' => 'Duration', 'style' => 'width:40px'), array('data' => 'Distance', 'style' => 'width:40px'), array('data' => 'Speed', 'style' => 'width:40px'), array('data' => 'Avg.Speed', 'style' => 'width:40px')
|
|
);
|
|
|
|
$data["tracking_trips_table"] = $this->table->generate($query);
|
|
|
|
$data["tracking_trips_pagination_link"] = $this->pagination->create_links();
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
public function refreshCards() {
|
|
|
|
$member_id = (int) $this->input->get('member_id');
|
|
if ($member_id > 0) {
|
|
|
|
$in = array();
|
|
|
|
$in['action'] = SAVVYEXT_BKO_REFRESHCARD;
|
|
$in['member_id'] = $member_id;
|
|
|
|
|
|
$out = [];
|
|
$ret = $this->savvy_api($in, $out);
|
|
if ($ret == PHP_API_OK) {
|
|
$message = $out['status'];
|
|
} else {
|
|
$message = $out['status'];
|
|
}
|
|
echo $message;
|
|
} // if member id > 0
|
|
}
|
|
|
|
public function refreshPersonalty() {
|
|
|
|
$member_id = (int) $this->input->get('member_id');
|
|
if ($member_id > 0) {
|
|
|
|
$in = array();
|
|
|
|
$in['action'] = SAVVYEXT_BKO_REFRESHGROUP;
|
|
$in['member_id'] = $member_id;
|
|
|
|
|
|
$out = [];
|
|
$ret = $this->savvy_api($in, $out);
|
|
if ($ret == PHP_API_OK) {
|
|
$message = $out['status'];
|
|
} else {
|
|
$message = $out['status'];
|
|
}
|
|
echo $message;
|
|
} // if member id > 0
|
|
}
|
|
|
|
private function memberSubscription($member_id, $data) {
|
|
|
|
$data['member_subs'] = '';
|
|
|
|
$mysql = "SELECT m.id AS card_id, m.title,s.subscribe,s.status,s.reciept_count, s.completed FROM members_card_assign s
|
|
LEFT JOIN main_cards m ON m.id =s.card_id
|
|
WHERE s.subscribe IS NOT NULL AND m.button1_action IN ('GOOFFERS') AND s.member_id = " . $member_id . " ORDER BY subscribe DESC";
|
|
$query = $this->read_replica->query($mysql);
|
|
$data["member_subs"] = $this->table->generate($query);
|
|
|
|
|
|
return $data;
|
|
}
|
|
|
|
private function memberPoints($member_id, $data) {
|
|
|
|
$data['points'] = '100';
|
|
$data['points_recieved'] = '';
|
|
$data['points_redeemed'] = '';
|
|
|
|
$mysql = "SELECT s.point_key,s.name,p.points,p.added::date "
|
|
. " FROM members_points p "
|
|
. " LEFT JOIN points_settings s ON s.point_key=p.point_key "
|
|
. " WHERE p.member_id = " . $member_id . " ORDER BY p.added DESC";
|
|
$query = $this->read_replica->query($mysql);
|
|
$data["points_recieved"] = $this->table->generate($query);
|
|
|
|
$mysql = "SELECT a.description,r.points,r.added,r.status
|
|
FROM members_points_redeem r
|
|
LEFT JOIN points_redeem_avialable a ON a.key=r.redeem_key
|
|
WHERE r.member_id= " . $member_id . " ORDER BY r.added DESC";
|
|
$query = $this->read_replica->query($mysql);
|
|
$data["points_redeemed"] = $this->table->generate($query);
|
|
|
|
|
|
|
|
return $data;
|
|
}
|
|
|
|
private function memberOAuth2Delete($member_id, $data) {
|
|
global $savvyext;
|
|
if ($member_id < 1) {
|
|
$data["message"] = "Invalid member ID!";
|
|
return $data;
|
|
}
|
|
$httpAuthToken = $savvyext->cfgReadChar('system.oauth2_token');
|
|
$encryptionAlg = $savvyext->cfgReadChar('encryption.algorithm');
|
|
$encryptionKey = $savvyext->cfgReadChar('encryption.key');
|
|
$encryptionIV = $savvyext->cfgReadChar('encryption.iv');
|
|
$api_url = $savvyext->cfgReadChar('system.api_url');
|
|
|
|
$payload = "{
|
|
\"member_id\":$member_id
|
|
}";
|
|
|
|
$encrypted_payload = bin2hex(
|
|
openssl_encrypt(
|
|
$payload, $encryptionAlg, $encryptionKey, OPENSSL_RAW_DATA, $encryptionIV
|
|
));
|
|
|
|
$postdata = "{\"encrypted_payload\": \"${encrypted_payload}\"}";
|
|
|
|
$url = $api_url . "/oauth2/api/remove";
|
|
|
|
$ch = curl_init($url);
|
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($ch, CURLOPT_VERBOSE, false);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
|
|
'Content-Type: application/json',
|
|
'Content-Length: ' . strlen($postdata),
|
|
'Authorization: Server-Token ' . $httpAuthToken,
|
|
"client_id: BackOffice"
|
|
)
|
|
);
|
|
|
|
$body = curl_exec($ch);
|
|
|
|
$result = json_decode($body, true);
|
|
|
|
$payload = openssl_decrypt(
|
|
hex2bin(
|
|
$result['payload']
|
|
), $encryptionAlg, $encryptionKey, OPENSSL_RAW_DATA, $encryptionIV
|
|
);
|
|
|
|
$data = array_merge($data, json_decode($payload, true));
|
|
if ($data && isset($data['error'])) {
|
|
$data['message'] = $data['error'];
|
|
} else if ($data && !isset($data['message'])) {
|
|
$data['message'] = 'Unexpected error: ' . $payload;
|
|
}
|
|
return $this->memberOAuth2($member_id, $data);
|
|
}
|
|
|
|
private function memberOAuth2($member_id, $data) {
|
|
$data["links"] = "";
|
|
// $mysql = "SELECT a.email,a.name,b.name as provider, a.created,a.updated,a.expires_in,b.access_type ";
|
|
// $mysql .= " FROM oauth2_tokens a, oauth2_providers b WHERE a.member_id=${member_id} AND b.id=a.oauth2_provider_id ORDER BY a.created DESC LIMIT 20";
|
|
// $query = $this->db->query($mysql);
|
|
// $data["oauth2_tokens"] = $this->table->generate($query);
|
|
$data["token_provider"] = "";
|
|
|
|
// $mysql = "select a.created,a.started,a.completed from oauth2_pull_jobs a where a.member_id=${member_id} and a.started is not null order by a.started DESC LIMIT 10";
|
|
// $query = $this->db->query($mysql);
|
|
// $data["oauth2_pull_jobs"] = $this->table->generate($query);
|
|
// $mysql = "select a.created,a.started,a.completed,a.item_count,a.search_term,a.search_from,a.failed from oauth2_pull_job_threads a, oauth2_pull_jobs b where b.id=a.oauth2_pull_job_id and b.member_id=${member_id} order by a.id desc LIMIT 20";
|
|
// $query = $this->db->query($mysql);
|
|
// $data["oauth2_pull_job_threads"] = $this->table->generate($query);
|
|
|
|
return $data;
|
|
}
|
|
|
|
private function viewReceipts($member_id, $data, $limit, $member_parsedemail_offset, $member_tracked_offset, $error) {
|
|
$data['member_parsedemail_offset'] = $member_parsedemail_offset;
|
|
$data['member_tracked_offset'] = $member_tracked_offset;
|
|
$limit = 100;
|
|
|
|
$mysql = " SELECT ";
|
|
$mysql .= " p.id,p.trackedemail_item_id,tp.name,p.travel_date,p.duration,p.cost, p.distance, ";
|
|
$mysql .= " CASE WHEN e.id IS NULL THEN 'No' ELSE 'Yes' END AS surge_price, ";
|
|
$mysql .= " CASE WHEN (f.id IS NOT NULL AND f.cost>f.average) THEN ROUND(f.average/f.cost,2) ELSE 0 END AS cheaper_alternative, ";
|
|
//$mysql.= " '<button type=\"button\" class=\"btn btn-info btn-xs\" onclick=\"document.location=''/bkoreport/tripinsights?member_id=${member_id}&id='||p.trackedemail_item_id||''';return false;\">Insights</button>' AS Insights ";
|
|
$mysql .= " '<a href=\"/bkoreport/tripinsights?member_id=${member_id}&id='||p.trackedemail_item_id||'\">Insights</a>' AS Insights, ";
|
|
$mysql .= " p.updated ";
|
|
$mysql .= " FROM parsedemail_item p LEFT JOIN trackedemail_item t ON t.id=p.trackedemail_item_id ";
|
|
$mysql .= " LEFT JOIN transport_providers tp ON p.transport_provider_id=tp.id";
|
|
$mysql .= " LEFT JOIN trip_surge_price e ON (e.data_source_id=p.id AND e.data_source=1) ";
|
|
$mysql .= " LEFT JOIN trip_price_comparison f ON (f.data_source_id=p.id AND e.data_source=1) ";
|
|
$mysql .= " WHERE t.member_id = ${member_id} AND p.dup_id is NULL ";
|
|
|
|
// travel date
|
|
if (!empty($data['start_travel_date']) && !isset($error['start_travel_date'])) {
|
|
$mysql .= " AND DATE(p.travel_date) >= '" . pg_escape_string($data['start_travel_date']) . "'";
|
|
}
|
|
if (!empty($data['end_travel_date']) && !isset($error['end_travel_date'])) {
|
|
$mysql .= " AND DATE(p.travel_date) <= '" . pg_escape_string($data['end_travel_date']) . "'";
|
|
}
|
|
// duration
|
|
if (!empty($data['duration_start']) && !isset($error['duration_start'])) {
|
|
$mysql .= " AND p.duration >= " . pg_escape_string($data['duration_start']) . "";
|
|
}
|
|
if (!empty($data['duration_end']) && !isset($error['duration_end'])) {
|
|
$mysql .= " AND p.duration <= " . pg_escape_string($data['duration_end']) . "";
|
|
}
|
|
// cost
|
|
if (!empty($data['cost_start']) && !isset($error['cost_start'])) {
|
|
$mysql .= " AND p.cost >= " . pg_escape_string($data['cost_start']) . "";
|
|
}
|
|
if (!empty($data['cost_end']) && !isset($error['cost_end'])) {
|
|
$mysql .= " AND p.cost <= " . pg_escape_string($data['cost_end']) . "";
|
|
}
|
|
// distance
|
|
if (!empty($data['distance_start']) && !isset($error['distance_start'])) {
|
|
$mysql .= " AND p.distance >= " . pg_escape_string($data['distance_start']) . "";
|
|
}
|
|
if (!empty($data['distance_end']) && !isset($error['distance_end'])) {
|
|
$mysql .= " AND p.distance <= " . pg_escape_string($data['distance_end']) . "";
|
|
}
|
|
// surge
|
|
if ($data['surge'] == '1') {
|
|
$mysql .= " AND e.id IS NOT NULL";
|
|
} else {
|
|
if ($data['surge'] == '0') {
|
|
$mysql .= " AND e.id IS NULL";
|
|
}
|
|
}
|
|
|
|
$mysql .= " ORDER BY id DESC";
|
|
|
|
|
|
|
|
list($data['pages'], $data['page'], $data['total_pages']) = $this->paginateQuery($mysql, $limit, $member_parsedemail_offset);
|
|
|
|
$mysql = "SELECT (ROW_NUMBER () OVER (ORDER BY travel_date DESC)) as No,* FROM (${mysql}) AS foo ORDER BY travel_date DESC LIMIT ${limit} OFFSET ${member_parsedemail_offset}";
|
|
error_log($mysql);
|
|
|
|
$query = $this->read_replica->query($mysql);
|
|
// $this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'),'Subject');
|
|
$this->table->set_heading(
|
|
'No.', array('data' => 'ID', 'style' => 'width:10px'), 'Email ID', 'Merchant', 'Travel Date', 'Duration', 'Cost', 'Distance', 'Surge', 'Alternative', 'Insights', 'Last Data Parse'
|
|
);
|
|
$data['member_parsedemail'] = $this->table->generate($query);
|
|
$config = [];
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
$data['pagination_config'] = $config;
|
|
|
|
|
|
$select_query = 'SELECT
|
|
t.id,
|
|
t.created,
|
|
t.subject,
|
|
t.hash,
|
|
t.date_parsed,
|
|
t.message_date,
|
|
t.message_from,
|
|
t.parsed_status,
|
|
p.trackedemail_item_id,
|
|
p.dup_id,
|
|
t.message';
|
|
|
|
$count_query = "SELECT count(*) AS all_count";
|
|
|
|
$from_query = " FROM trackedemail_item t left join parsedemail_item p on t.id = p.trackedemail_item_id
|
|
WHERE t.member_id=$member_id";
|
|
|
|
$where_query = ' AND p.dup_id IS NULL';
|
|
// if (!empty($data['start_date'])) {
|
|
// $where_query .= " AND DATE(created) >= '" . pg_escape_string($data['start_date']) . "'";
|
|
// }
|
|
// if (!empty($data['end_date'])) {
|
|
// $where_query .= " AND DATE(created) <= '" . pg_escape_string($data['end_date']) . "'";
|
|
// }
|
|
// member_id
|
|
// if (!empty($data['member_id_filter']) && !isset($error['member_id_filter'])) {
|
|
// $from_query .= " AND member_id = ${data['member_id_filter']}";
|
|
// }
|
|
// subject
|
|
if (!empty($data['subject']) && !isset($error['subject'])) {
|
|
$from_query .= " AND lower(t.subject) like '%" . pg_escape_string(strtolower($data['subject'])) . "%'";
|
|
}
|
|
|
|
// sender
|
|
if (!empty($data['message_from']) && !isset($error['message_from'])) {
|
|
$from_query .= " AND lower(t.message_from) like '%" . pg_escape_string(strtolower($data['message_from'])) . "%'";
|
|
}
|
|
|
|
if (isset($data['export']) && $data['export'] === 'ZIP') {
|
|
$total_record = (int) $this->read_replica->query($count_query . $from_query . $where_query)->result_array()[0]['all_count'];
|
|
if (!$total_record) {
|
|
header('Content-Type: application/json');
|
|
http_response_code(404);
|
|
return;
|
|
}
|
|
|
|
$start = 0;
|
|
$limit_export = 1000;
|
|
|
|
$query = "${select_query} ${from_query} ${where_query} ORDER BY created LIMIT ${limit_export} OFFSET ${start}";
|
|
|
|
$filePath = $_SERVER['DOCUMENT_ROOT']
|
|
. DIRECTORY_SEPARATOR
|
|
. self::TEMP_DIRECTORY_DOWNLOAD;
|
|
$filename = 'download-' . date("Y-m-d-H-i-s") . ".zip";
|
|
|
|
do {
|
|
|
|
if (ob_get_level()) {
|
|
ob_end_clean();
|
|
}
|
|
|
|
$data = $this->read_replica->query($query);
|
|
$this->export($data, $filePath, $filename);
|
|
|
|
$start += $limit;
|
|
} while ($start + $limit <= $total_record);
|
|
|
|
$this->send_file($filePath, $filename);
|
|
|
|
return;
|
|
}
|
|
|
|
$mysql = $select_query . $from_query . $where_query;
|
|
list($data['tpages'], $data['tpage'], $data['ttotal_pages']) = $this->paginateQuery($mysql, $limit, $member_tracked_offset);
|
|
|
|
$mysql = "SELECT (ROW_NUMBER () OVER (ORDER BY created DESC)) as No, foo.id, foo.created, foo.message_date, foo.subject FROM (${mysql}) AS foo ORDER BY created DESC LIMIT ${limit} OFFSET ${member_tracked_offset}";
|
|
error_log($mysql);
|
|
$query = $this->read_replica->query($mysql);
|
|
$this->table->set_heading('No.', array('data' => 'ID', 'style' => 'width:10px'), 'Created', array('data' => 'Send Date', 'style' => 'width:150px'), 'Subject');
|
|
|
|
// Email receipt
|
|
$data['member_tracked'] = $this->table->generate($query);
|
|
|
|
// get email data last fetch info
|
|
$mysql = "SELECT oauth2.email AS email_account,
|
|
CASE WHEN members.status = 1 THEN 'Active' ELSE 'InActive' END AS account_status,
|
|
CASE WHEN members.email_connected = 1 THEN 'Connected' ELSE 'Disconnected' END AS email_status,
|
|
members.last_email AS last_data_fetch,
|
|
oauth2.expires_in
|
|
FROM members
|
|
LEFT JOIN (SELECT member_id, email, expires_in FROM oauth2_tokens WHERE member_id = ? ORDER BY expires_in DESC LIMIT 1) AS oauth2
|
|
ON oauth2.member_id = members.id
|
|
WHERE members.id = ?;";
|
|
$data['email_data_fetch_info'] = (array) $this->read_replica->query($mysql, [$member_id, $member_id])->row();
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* get all email parse fail
|
|
*
|
|
* @param int $member_id Member ID
|
|
* @return array
|
|
*/
|
|
private function viewEmailFail( $member_id, $limit, $offset ) {
|
|
try {
|
|
$sql = sprintf( "
|
|
SELECT id, subject, date_parsed, %s
|
|
from trackedemail_item
|
|
where member_id = %s and parsed_status = 0
|
|
order by id desc
|
|
", '\'<button style="padding:3px;" type="button" class="btn btn-info btn-xs manually-parse" data-id="\'||id||\'" >process</button>\' AS Action', $member_id );
|
|
|
|
// pagination
|
|
list( $data['pages'], $data['page'], $data['total_pages'] ) = $this->paginateQuery( $sql, $limit, $offset );
|
|
$config = [];
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
$data['pagination_config'] = $config;
|
|
|
|
// prepare table
|
|
$this->table->set_heading(
|
|
'No.', array('data' => 'ID', 'style' => 'width:10px'), 'Subject', 'Parsed', 'Action'
|
|
);
|
|
|
|
// excute query
|
|
$excute = sprintf( "
|
|
SELECT ( ROW_NUMBER() OVER (order by date_parsed desc) ) as No, *
|
|
from ( %s ) as foo
|
|
order by date_parsed desc
|
|
limit %d
|
|
offset %d
|
|
", $sql, $limit, $offset );
|
|
$results = $this->read_replica->query( $excute );
|
|
$data['member_parsedemailfail'] = $this->table->generate( $results );
|
|
|
|
// catch db errors
|
|
$errors = $this->read_replica->error();
|
|
if ( isset( $errors['message'] ) and !empty( $errors['message'] ) ) {
|
|
throw new Exception( $errors['message'] );
|
|
}
|
|
|
|
return $data;
|
|
|
|
} catch (Exception $e) {
|
|
echo $e->getMessage();
|
|
}
|
|
}
|
|
|
|
private function viewMerged($member_id, $data, $limit, $offset) {
|
|
$limit = 15;
|
|
$mysql = "SELECT * FROM (";
|
|
$mysql .= "SELECT 'ACC' AS acc_email,id,time AS travel_date,amount*0.01 AS cost, description FROM members_bankimport WHERE member_id =" . $member_id . " UNION ";
|
|
$mysql .= "SELECT 'EMAIL' AS acc_email,p.id,p.travel_date,p.cost,p.transport_provider_id::text AS description FROM parsedemail_item p LEFT JOIN trackedemail_item t ON t.id=p.trackedemail_item_id WHERE t.member_id =" . $member_id . " ";
|
|
$mysql .= ") AS FOO WHERE 1 = 1 AND p.dup_id IS NULL ";
|
|
|
|
$errors = isset($data['errors']) ? $data['errors'] : null;
|
|
// travel date
|
|
if (!empty($data['start_travel_date']) && !isset($errors['start_travel_date'])) {
|
|
$mysql .= " AND DATE(FOO.travel_date) >= '" . pg_escape_string($data['start_travel_date']) . "'";
|
|
}
|
|
if (!empty($data['end_travel_date']) && !isset($errors['end_travel_date'])) {
|
|
$mysql .= " AND DATE(FOO.travel_date) <= '" . pg_escape_string($data['end_travel_date']) . "'";
|
|
}
|
|
if (empty($data['start_travel_date']) && empty($data['end_travel_date'])) {
|
|
$data['start_travel_date'] = date('Y-m-d', strtotime('-1 month'));
|
|
$data['end_travel_date'] = date('Y-m-d');
|
|
|
|
$mysql .= " AND DATE(FOO.travel_date) >= '" . $data['start_travel_date'] . "'"
|
|
. " AND DATE(FOO.travel_date) <= '" . $data['end_travel_date'] . "'";
|
|
}
|
|
|
|
// cost
|
|
if (!empty($data['start_cost']) && !isset($errors['start_cost'])) {
|
|
$mysql .= " AND FOO.cost >= " . pg_escape_string($data['start_cost']) . "";
|
|
}
|
|
if (!empty($data['end_cost']) && !isset($errors['end_cost'])) {
|
|
$mysql .= " AND FOO.cost <= " . pg_escape_string($data['end_cost']) . "";
|
|
}
|
|
|
|
if (!empty($data['acc_email']) && $data['acc_email'] !== 'ALL') {
|
|
$mysql .= " AND FOO.acc_email = '" . pg_escape_string($data['acc_email']) . "'";
|
|
}
|
|
|
|
list($data['pages'], $data['page'], $data['total_pages']) = $this->paginateQuery($mysql, $limit, $offset);
|
|
$mysql .= " ORDER BY travel_date DESC LIMIT ${limit} OFFSET ${offset}";
|
|
error_log($mysql);
|
|
$query = $this->read_replica->query($mysql);
|
|
// $this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'),'Subject');
|
|
$data['member_merged'] = $this->table->generate($query);
|
|
$config = [];
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
$data['pagination_config'] = $config;
|
|
return $data;
|
|
}
|
|
|
|
private function paginateQuery($query, $limit, $offset) {
|
|
$delta = 5;
|
|
$pages = [];
|
|
$q = "SELECT count(*) AS total FROM (${query}) AS foo";
|
|
$r = $this->read_replica->query($q);
|
|
$p = $r->result_array()[0];
|
|
if (is_array($p) && isset($p["total"]) && $p["total"] > $limit) {
|
|
// Ok
|
|
} else {
|
|
return NULL;
|
|
}
|
|
$num = (int) ($p["total"] / $limit) + ($p["total"] % $limit == 0 ? 0 : 1);
|
|
$page = (int) ($offset / $limit);
|
|
if ($page > $delta && $page < $num) {
|
|
$pages['First'] = 0;
|
|
}
|
|
$sp = $page - $delta;
|
|
$lp = $page + $delta;
|
|
if ($sp < 0) {
|
|
$lp -= $sp;
|
|
$sp = 0;
|
|
}
|
|
if ($lp > $num) {
|
|
$sp -= ($lp - $num);
|
|
$lp = $num;
|
|
if ($sp < 0)
|
|
$sp = 0;
|
|
}
|
|
for ($i = $sp; $i < $lp; $i++) {
|
|
$pages[($i + 1)] = $i * $limit;
|
|
}
|
|
if ($page < ($num - $delta)) {
|
|
$pages['Last'] = $limit * ($num - 1);
|
|
}
|
|
return array($pages, 1 + $page, $num);
|
|
}
|
|
|
|
public function personalityUpdate() {
|
|
///member/personalityUpdate?proc=PROCESS&member_id=" + member_id + "&decision_group=" + decision_group_value
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
|
|
$member_id = (int) $this->input->get('member_id');
|
|
$decision_group = $this->input->get('decision_group');
|
|
|
|
if ($member_id > 0 && $decision_group != '') {
|
|
$q = "UPDATE members SET decision_group='$decision_group' WHERE id = $member_id AND decision_group<>'$decision_group'";
|
|
$this->db->query($q);
|
|
$this->refreshPersonalty();
|
|
echo " - Updated";
|
|
}
|
|
|
|
return;
|
|
} else {
|
|
echo 'ERROR!';
|
|
}
|
|
}
|
|
|
|
public function updateMemberProfile() {
|
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|
$member_id = (int) $this->input->post('member_id');
|
|
|
|
// echo "Ameye";
|
|
|
|
$data = $this->memberProfile($member_id);
|
|
$this->load->view('member/extra/member_profile', $data);
|
|
return;
|
|
} else {
|
|
echo 'ERROR!';
|
|
}
|
|
}
|
|
|
|
private function memberProfile($member_id) {
|
|
$this->load->model('combo_model');
|
|
|
|
$q = "SELECT p.*,m.* FROM members m LEFT JOIN members_profile p ON p.member_id = m.id WHERE m.id='${member_id}'";
|
|
$r = $this->read_replica->query($q);
|
|
$f = $r->result_array();
|
|
$p = (is_array($f) && count($f) > 0) ? $f[0] : [];
|
|
//v ar_dump($p);
|
|
$decision_group_combo = $this->combo_model->getDescisionGroupCombo("decision_group", $p['decision_group']);
|
|
$data = [
|
|
'member_id' => $member_id,
|
|
'street1' => isset($p['street1']) ? $p['street1'] : '',
|
|
'street2' => isset($p['street2']) ? $p['street2'] : '',
|
|
'city' => isset($p['city']) ? $p['city'] : '',
|
|
'zipcode' => isset($p['zipcode']) ? $p['zipcode'] : '',
|
|
'state' => isset($p['state']) ? $p['state'] : '',
|
|
'country' => isset($p['country']) ? $p['country'] : '',
|
|
'decision_group' => $decision_group_combo,
|
|
'dat_array' => $p
|
|
];
|
|
$data['message'] = "";
|
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|
$data['street1'] = $this->input->post('street1');
|
|
$data['street2'] = $this->input->post('street2');
|
|
$data['city'] = $this->input->post('city');
|
|
$data['zipcode'] = $this->input->post('zipcode');
|
|
$data['state'] = $this->input->post('state');
|
|
$data['country'] = $this->input->post('country');
|
|
if ($data['street1'] != '' && $data['city'] != '' && $data['zipcode'] != '' &&
|
|
$data['state'] != '' && $data['country'] != '') {
|
|
if (isset($p["id"]) && $p["id"] > 0) {
|
|
//* $q = "UPDATE members_profile SET ";
|
|
$q .= "street1='" . pg_escape_string($data['street1']) . "',";
|
|
$q .= "street2='" . pg_escape_string($data['street2']) . "',";
|
|
$q .= "city='" . pg_escape_string($data['city']) . "',";
|
|
$q .= "zipcode='" . pg_escape_string($data['zipcode']) . "',";
|
|
$q .= "state='" . pg_escape_string($data['state']) . "',";
|
|
$q .= "country='" . pg_escape_string($data['country']) . "'";
|
|
$q .= " WHERE id=" . ((int) $p["id"]) . " RETURNING id";
|
|
//* /
|
|
} else {
|
|
//* $q = "INSERT INTO members_profile (member_id,street1,street2,city,zipcode,state,country) VALUES(";
|
|
$q .= "'" . $member_id . "',";
|
|
$q .= "'" . pg_escape_string($data['street1']) . "',";
|
|
$q .= "'" . pg_escape_string($data['street2']) . "',";
|
|
$q .= "'" . pg_escape_string($data['city']) . "',";
|
|
$q .= "'" . pg_escape_string($data['zipcode']) . "',";
|
|
$q .= "'" . pg_escape_string($data['state']) . "',";
|
|
$q .= "'" . pg_escape_string($data['country']) . "'";
|
|
$q .= ") RETURNING id";
|
|
//* /
|
|
}
|
|
try {
|
|
error_log($q);
|
|
$r = $this->db->query($q);
|
|
$p = $r->result_array();
|
|
$data['message'] = "Profile saved!";
|
|
} catch (Exception $e) {
|
|
$data['message'] = $e->getMessage();
|
|
}
|
|
} else {
|
|
$data['message'] = "Invalid input!";
|
|
}
|
|
}
|
|
|
|
//Adding Personalty Refresh Table
|
|
$mysql = "SELECT m.id,m.decision_group,d.description,m.added
|
|
FROM members_personalty_log m
|
|
LEFT JOIN decision_group d ON d.dkey=m.decision_group
|
|
WHERE m.member_id = $member_id ORDER BY m.added DESC LIMIT 10";
|
|
|
|
$query = $this->read_replica->query($mysql);
|
|
$this->table->set_template($this->template);
|
|
$data["personalty_table"] = $this->table->generate($query);
|
|
|
|
return $data;
|
|
}
|
|
|
|
public function moveMemberCard() {
|
|
|
|
//#define SAVVYEXT_BKO_MOVECARD 100029
|
|
|
|
$direction = (int) $this->input->get('direction');
|
|
$card_id = (int) $this->input->get('card_id');
|
|
$member_id = (int) $this->input->get('member_id');
|
|
// if ($card_id > 0 && $member_id > 0 && $direction >= 0) {
|
|
$in = array();
|
|
echo 'aaaaa666';
|
|
|
|
$in['action'] = SAVVYEXT_BKO_MOVECARD;
|
|
$in['card_id'] = $card_id;
|
|
$in['direction'] = $direction;
|
|
$in['member_id'] = $member_id;
|
|
|
|
|
|
$out = [];
|
|
$ret = $this->savvy_api($in, $out);
|
|
if ($ret == PHP_API_OK) {
|
|
$message = 'moved';
|
|
} else {
|
|
$message = $out['status'];
|
|
}
|
|
|
|
|
|
// }
|
|
}
|
|
|
|
private function getSlideCardsData($member_id, $decision_group, $data) {
|
|
|
|
$data["member_id"] = $member_id;
|
|
|
|
$data["dynamic_cards"] = "";
|
|
|
|
$mysql = " SELECT '<img src='||c.background_picture||' style=\"width:130px;\" >' AS pic, c.id||' : '||c.title||'<br> [<b>'||c.button1_action||'</b>]<br><b>Card Status : </b>'||c.status||'<br><b>Card Order : </b>'||c.card_order As title,c.description,
|
|
c.card_behavior,c.card_country,c.card_time
|
|
FROM main_cards c WHERE c.status <> 0 AND c.deleted IS NULL AND c.id IN (SELECT dc.card_id FROM decision_group dg LEFT JOIN decision_cards dc ON dc.decision_id = dg.id WHERE dg.dkey='$decision_group' AND dc.status=1) ORDER by c.card_order ASC , c.id DESC";
|
|
$query = $this->read_replica->query($mysql);
|
|
$this->table->set_heading(array('data' => 'PIC', 'style' => 'width:100px')
|
|
, 'Info'
|
|
, 'Description'
|
|
, 'Behavior'
|
|
, 'Country'
|
|
, 'Time'
|
|
);
|
|
$data['available_cards'] = $this->table->generate($query);
|
|
|
|
|
|
$mysql = " SELECT '<img src='||c.background_picture||' style=\"width:130px;\" >' AS pic, ca.card_id||' : '||c.title||'<br> [<b>'||c.button1_action||'</b>]<br><b>Assign Status : </b>'||ca.status||'<br><b>Card Order : </b>'||c.card_order As title,c.description,
|
|
c.card_behavior,c.card_country,c.card_time
|
|
FROM members_card_assign ca LEFT JOIN main_cards c ON c.id=ca.card_id WHERE ca.status <> 0 AND c.status=1 AND c.deleted IS NULL AND ca.member_id =$member_id." . " ORDER by c.card_order ASC , ca.id DESC";
|
|
$query = $this->read_replica->query($mysql);
|
|
$this->table->set_heading(array('data' => 'PIC', 'style' => 'width:100px')
|
|
, 'Info'
|
|
, 'Description'
|
|
, 'Behavior'
|
|
, 'Country'
|
|
, 'Time'
|
|
);
|
|
$data['assigned_cards'] = $this->table->generate($query);
|
|
return $data;
|
|
}
|
|
|
|
/*** Todo: call API to get all App cards of member
|
|
* @param $member_id
|
|
* @return array
|
|
*/
|
|
private function getAppHomeFeedCards($member_id)
|
|
{
|
|
$out = [];
|
|
$inX["mode"] = '100';
|
|
$inX["member_id"] = $member_id;
|
|
$inX["action"] = SAVVYEXT_BKO_CARDASSIGNED;
|
|
$inX["card_type"] = '22000';
|
|
$inX["card_count"] = '100';
|
|
$inX["pid"] = 100;
|
|
$this->savvy_api_clearly($inX, $out);
|
|
$total = $out["total_record"];
|
|
$res["result_list"] = [];
|
|
for ($i = 0; $i < $total; $i++) {
|
|
$key = sprintf("%05d", $i);
|
|
$res["result_list"][] = array(
|
|
"assign_id" => $out["assign_id_${key}"],
|
|
"card_id" => $out["card_id_${key}"],
|
|
"can_save" => $out["can_save_${key}"],
|
|
"name" => $out["name_${key}"],
|
|
"short_title" => $out["short_title_${key}"],
|
|
"title" => $out["title_${key}"],
|
|
"description" => $out["description_${key}"],
|
|
"background_picture" => $out["background_picture_${key}"],
|
|
"button1" => $out["button1_${key}"],
|
|
"button1_text" => $out["button1_text_${key}"],
|
|
"short_title" => $out["short_title_${key}"],
|
|
"button1_action" => $out["button1_action_${key}"],
|
|
"expires" => $out["expires_${key}"],
|
|
"template" => $out["template_${key}"],
|
|
"card_canexpire" => $out["card_canexpire_${key}"],
|
|
"card_action_type" => $out["card_action_type_${key}"],
|
|
"card_action_data" => $out["card_action_data_${key}"],
|
|
"titleshow" => $out["titleshow_${key}"],
|
|
"multiple_answer" => $out["multiple_answer_${key}"],
|
|
"use_short_title" => $out["use_short_title_${key}"],
|
|
"target_key" => $out["target_key_${key}"],
|
|
"target_text" => $out["target_text_${key}"],
|
|
"subscribe" => $out["subscribe_${key}"],
|
|
"long_description" => $out["long_description_${key}"],
|
|
"card_behavior" => $out["card_behavior_${key}"],
|
|
"card_type" => $out["card_type_${key}"],
|
|
"card_time" => $out["card_time_${key}"],
|
|
"card_country" => $out["card_country_${key}"],
|
|
"card_location" => $out["card_location_${key}"],
|
|
"latitude" => $out["latitude_${key}"],
|
|
"longitude" => $out["longitude_${key}"],
|
|
"card_order" => $out["card_order_${key}"],
|
|
"background_color" => $out["background_color_${key}"],
|
|
"blog_id" => $out["blog_id_${key}"]
|
|
);
|
|
}
|
|
return $res["result_list"];
|
|
}
|
|
|
|
/*** Todo: get member card assign
|
|
* @param $member_id
|
|
* @param $data
|
|
* @param string $mode 'ALL' is default value to all member cards - 'APP': to get home feed app cards
|
|
* @return mixed
|
|
*/
|
|
private function getSlideCards($member_id, $data, $mode = 'ALL') {
|
|
$data['mode'] = $mode;
|
|
$table_open = $this->template['table_open'];
|
|
$this->template['table_open'] = "<table id='member_cards' style='background-color:aliceblue' class='table table-striped table-hover table-bordered table-condensed'>";
|
|
$this->table->set_template($this->template);
|
|
$this->template['table_open'] = $table_open;
|
|
|
|
$where = "ca.status = 1 AND c.status=1 AND c.deleted IS NULL AND ca.member_id =$member_id";
|
|
// *** only app filter ***
|
|
if($mode == 'APP'){
|
|
$data['app_card_result_list'] = $this->getAppHomeFeedCards($member_id);
|
|
}
|
|
$order_by = "ca.list_order ASC , ca.id DESC";
|
|
$mysql = " SELECT '<img src='||c.background_picture||' style=\"width:130px;\" >' AS pic, ca.card_id||' : '||c.title||'<br> [<b>'||CASE WHEN ca.cat IS NOT NULL THEN ca.cat ELSE c.button1_action END||'</b>]' As title,c.description ,
|
|
c.card_order as card_list_order,
|
|
ct.country as card_country,
|
|
'<div id=\"cardDeleteDiv'||ca.id||'\"><button type=\"button\" class=\"btn btn-danger btn-xs\" onclick=\"deleteMemberCard('||ca.id||',$member_id);\" >DEL</button></div>' AS Del,
|
|
'<div id=\"moveMemberCardDiv1'||ca.id||'\"><button type=\"button\" class=\"btn btn-info btn-xs\" onclick=\"moveMemberCard('||ca.id||',$member_id,1,this);\" > <span class=\"glyphicon glyphicon-triangle-top\"></span></button></div><br>"
|
|
. " <div id=\"moveMemberCardDiv2'||ca.id||'\"><button type=\"button\" class=\"btn btn-info btn-xs\" onclick=\"moveMemberCard('||ca.id||',$member_id,2,this);\" > <span class=\"glyphicon glyphicon-circle-arrow-up\"></span></button></div><br>"
|
|
. "<div id=\"moveMemberCardDiv0'||ca.id||'\"><button type=\"button\" class=\"btn btn-primary btn-xs\" onclick=\"moveMemberCard('||ca.id||',$member_id,0,this);\" > <span class=\"glyphicon glyphicon-circle-arrow-down\"></button></div>' AS Move
|
|
FROM members_card_assign ca
|
|
LEFT JOIN main_cards c ON c.id=ca.card_id
|
|
LEFT JOIN country as ct ON c.card_country=ct.code
|
|
WHERE $where ORDER by $order_by";
|
|
$query = $this->read_replica->query($mysql);
|
|
// $this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'),'Subject');
|
|
$data['member_cards'] = $this->table->generate($query);
|
|
|
|
|
|
// check current member card ids to check added
|
|
$member_card_ids = $this->read_replica->query("SELECT ca.card_id
|
|
FROM members_card_assign ca
|
|
LEFT JOIN main_cards c ON c.id=ca.card_id
|
|
WHERE ca.status = 1 AND c.status=1 AND c.deleted IS NULL AND ca.member_id = $member_id
|
|
ORDER by ca.list_order ASC , ca.id DESC")->result_array();
|
|
$data['member_card_ids'] = array_map('intval', array_column($member_card_ids,'card_id'));
|
|
|
|
|
|
$data["card_category_value"] = $this->input->get('card_category');
|
|
|
|
$this->load->library('pagination');
|
|
$config = array();
|
|
$q = "SELECT * FROM main_cards WHERE status = 1 AND title IS NOT NULL";
|
|
if ($data["card_category_value"] != '' && $data["card_category_value"] != '0') {
|
|
$q .= " AND button1_action='" . pg_escape_string($data["card_category_value"]) . "'";
|
|
}
|
|
$q .= " ORDER BY id DESC ";
|
|
$query = $this->read_replica->query($q);
|
|
$data["limit"] = 6;
|
|
|
|
$this->load->model('combo_model');
|
|
$data['card_category'] = $this->combo_model->getCardCategoryCombo('card_category', $data['card_category_value']);
|
|
|
|
$config["total_rows"] = $query->num_rows();
|
|
// /member/viewMemberAction?proc=PROCESS&action_name=MCARDS&member_id=3&limit=50&offset=0
|
|
$config["base_url"] = '#';
|
|
$config["per_page"] = $data["limit"];
|
|
$config["uri_segment"] = 3;
|
|
$config["num_links"] = 5;
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
$config['attributes'] = array('onclick' => 'return getSlideCards(this,' . $member_id . ',\'' . $data["card_category_value"] . '\')');
|
|
$this->pagination->initialize($config);
|
|
//$ page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
|
|
$page = $data["offset"];
|
|
$page = is_numeric($page) ? $page : 0;
|
|
$data["links"] = $this->pagination->create_links();
|
|
|
|
|
|
$q = "SELECT id,'<b>['||button1_action||']</b>-'||title||'<br><span style=\"color:red;\">'||name||'</span>','<div id=\"cardDiv'||id||'\"><button type=\"button\" class=\"btn btn-info btn-xs btn-add-card\" data-id=\"'||id||'\" onclick=\"return addMemberCard('||id||',$member_id);\" id=\"cardButton'||id||'\">Add</button></div>' AS action "
|
|
. "FROM main_cards "
|
|
. "WHERE status = 1 AND deleted IS NULL AND title IS NOT NULL ";
|
|
if ($data["card_category_value"] != '' && $data["card_category_value"] != '0') {
|
|
$q .= " AND button1_action='" . pg_escape_string($data["card_category_value"]) . "'";
|
|
}
|
|
$q .= " ORDER BY id DESC LIMIT " . $data["limit"] . " OFFSET " . $page;
|
|
$query = $this->read_replica->query($q);
|
|
$this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'), 'Description', array('data' => 'Action', 'style' => 'width:30px'));
|
|
$tmpl = array(
|
|
'table_open' => '<table id="available_cards" style="background-color:aliceblue" class="table table-striped table-hover table-bordered table-condensed">'
|
|
);
|
|
$this->table->set_template($this->template);
|
|
$data["available_cards"] = $this->table->generate($query);
|
|
return $data;
|
|
}
|
|
|
|
private function plotFacedata($member_id) {
|
|
$data = array();
|
|
$q = "SELECT parsedemail_item.*,parsedemail_item_advice_google.id AS gid,parsedemail_item_advice_google.routes,trackedemail_item.id as tid ";
|
|
$q .= " FROM trackedemail_item, parsedemail_item ";
|
|
$q .= " LEFT JOIN parsedemail_item_advice_google ON parsedemail_item.id=parsedemail_item_advice_google.parsedemail_item_id ";
|
|
$q .= " WHERE trackedemail_item.id=parsedemail_item.trackedemail_item_id AND trackedemail_item.member_id=${member_id}";
|
|
$q .= " AND parsedemail_item.dup_id IS NULL";
|
|
$q .= " ORDER BY parsedemail_item.travel_date DESC, parsedemail_item.travel_date_end DESC";
|
|
//e cho $q;
|
|
$query = $this->read_replica->query($q);
|
|
$data['member_parsedetail'] = $this->table->generate($query);
|
|
|
|
// grouping the transactions by trnasport type
|
|
$q = "
|
|
SELECT transport_providers.name,count(parsedemail_item.id)
|
|
FROM trackedemail_item, parsedemail_item
|
|
LEFT JOIN parsedemail_item_advice_google ON parsedemail_item.id=parsedemail_item_advice_google.parsedemail_item_id
|
|
LEFT JOIN transport_providers ON transport_providers.id = parsedemail_item.transport_provider_id
|
|
WHERE trackedemail_item.id=parsedemail_item.trackedemail_item_id
|
|
AND trackedemail_item.member_id= ${member_id}
|
|
AND parsedemail_item.dup_id IS NULL
|
|
GROUP BY transport_providers.name";
|
|
$query = $this->read_replica->query($q);
|
|
|
|
$data['plot_transpotercount'] = $query->result_array();
|
|
|
|
$q = "
|
|
SELECT count(parsedemail_item.id), EXTRACT(DOW FROM parsedemail_item.travel_date) AS dow
|
|
FROM trackedemail_item, parsedemail_item
|
|
LEFT JOIN parsedemail_item_advice_google ON parsedemail_item.id=parsedemail_item_advice_google.parsedemail_item_id
|
|
LEFT JOIN transport_providers ON transport_providers.id = parsedemail_item.transport_provider_id
|
|
WHERE trackedemail_item.id=parsedemail_item.trackedemail_item_id
|
|
AND trackedemail_item.member_id=${member_id}
|
|
AND parsedemail_item.dup_id IS NULL
|
|
GROUP BY dow ORDER BY dow";
|
|
$query = $this->read_replica->query($q);
|
|
|
|
$data['plot_dayofweekcount'] = $query->result_array();
|
|
|
|
$q = "
|
|
SELECT sum(parsedemail_item.cost), EXTRACT(DOW FROM parsedemail_item.travel_date) AS dow
|
|
FROM trackedemail_item, parsedemail_item
|
|
LEFT JOIN parsedemail_item_advice_google ON parsedemail_item.id=parsedemail_item_advice_google.parsedemail_item_id
|
|
LEFT JOIN transport_providers ON transport_providers.id = parsedemail_item.transport_provider_id
|
|
WHERE trackedemail_item.id=parsedemail_item.trackedemail_item_id
|
|
AND trackedemail_item.member_id=${member_id}
|
|
AND parsedemail_item.dup_id IS NULL
|
|
GROUP BY dow
|
|
ORDER BY dow";
|
|
$query = $this->read_replica->query($q);
|
|
$data['plot_dayofweekamount'] = $query->result_array();
|
|
|
|
$q = "
|
|
SELECT sum(parsedemail_item.distance), EXTRACT(DOW FROM parsedemail_item.travel_date) AS dow
|
|
FROM trackedemail_item, parsedemail_item
|
|
LEFT JOIN parsedemail_item_advice_google ON parsedemail_item.id=parsedemail_item_advice_google.parsedemail_item_id
|
|
LEFT JOIN transport_providers ON transport_providers.id = parsedemail_item.transport_provider_id
|
|
WHERE trackedemail_item.id=parsedemail_item.trackedemail_item_id
|
|
AND trackedemail_item.member_id=${member_id}
|
|
AND parsedemail_item.dup_id IS NULL
|
|
GROUP BY dow
|
|
ORDER BY dow";
|
|
|
|
$query = $this->read_replica->query($q);
|
|
$data['plot_dayofweekdistance'] = $query->result_array();
|
|
|
|
$q = "
|
|
SELECT count(parsedemail_item.id) AS trav_count, b.address AS location_start, c.address AS location_end
|
|
FROM trackedemail_item, parsedemail_item
|
|
LEFT JOIN parsedemail_item_advice_google ON parsedemail_item.id=parsedemail_item_advice_google.parsedemail_item_id
|
|
LEFT JOIN address b ON b.id=parsedemail_item.location_start_id
|
|
LEFT JOIN address c ON c.id=parsedemail_item.location_end_id
|
|
WHERE trackedemail_item.id=parsedemail_item.trackedemail_item_id AND trackedemail_item.member_id=${member_id}
|
|
AND parsedemail_item.dup_id IS NULL
|
|
GROUP BY b.address , c.address ORDER BY trav_count DESC LIMIT 10";
|
|
$query = $this->read_replica->query($q);
|
|
$this->table->set_heading(array('data' => 'Count', 'style' => 'width:10px'), 'Start Location', 'End Location');
|
|
$data['common_comute'] = $this->table->generate($query);
|
|
|
|
|
|
//p rint_r( $data['plot_transpotercount'] );
|
|
|
|
return $data;
|
|
}
|
|
|
|
public function deleteMemberCard() {
|
|
$id = (int) $this->input->get('card_id');
|
|
$member_id = (int) $this->input->get('member_id');
|
|
if ($id > 0 && $member_id > 0) {
|
|
$in = [];
|
|
$in['action'] = SAVVY_BKO_USERCARD_DELETE;
|
|
$in['id'] = $id;
|
|
$in['member_id'] = $member_id;
|
|
$out = [];
|
|
$ret = $this->savvy_api($in, $out);
|
|
if ($ret == PHP_API_OK) {
|
|
$message = '';
|
|
} else {
|
|
$message = $out['status'];
|
|
}
|
|
}
|
|
if ($message == '') {
|
|
echo "Deleted";
|
|
} else {
|
|
echo "Fail $id | $member_id";
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public function addMemberCard() {
|
|
$message = '';
|
|
$card_id = (int) $this->input->get('card_id');
|
|
$member_id = (int) $this->input->get('member_id');
|
|
if ($card_id > 0 && $member_id > 0) {
|
|
$in = [];
|
|
$in['action'] = SAVVY_BKO_USERCARD_ADD;
|
|
$in['card_id'] = $card_id;
|
|
$in['member_id'] = $member_id;
|
|
$out = [];
|
|
$ret = $this->savvy_api($in, $out);
|
|
if ($ret == PHP_API_OK) {
|
|
$message = '';
|
|
} else {
|
|
$message = $out['status'];
|
|
}
|
|
}
|
|
if ($message == '') {
|
|
echo "Added";
|
|
} else {
|
|
echo "Card already assigned";//"Fail $card_id | $member_id";
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public function viewtrackedgroup() {
|
|
|
|
$this->load->model('member_model');
|
|
$this->load->library('pagination');
|
|
|
|
$this->setFormRuleForMemberTracking();
|
|
$member_tracking_value = $this->getMemberTrackingValue();
|
|
|
|
$this->form_validation->set_data($member_tracking_value);
|
|
|
|
$errors = null;
|
|
if ($this->form_validation->run() === FALSE) {
|
|
$errors = $this->form_validation->error_array();
|
|
}
|
|
|
|
if ($this->isValidFromTo($member_tracking_value) === FALSE) {
|
|
$errors['from_to'] = 'Selected date range is invalid';
|
|
}
|
|
|
|
if ($this->isSearchByRadius($member_tracking_value) === FALSE) {
|
|
$errors['searchByRadius'] = 'Please input all required field for search by radius, latitude, longitude';
|
|
}
|
|
|
|
if ($errors !== NULL) {
|
|
echo json_encode($this->generate_error_message($errors));
|
|
return;
|
|
}
|
|
|
|
$row_no = $member_tracking_value['row_no'];
|
|
$filters = array_filter($member_tracking_value['filters'], function($ele) {
|
|
return $ele !== '';
|
|
});
|
|
|
|
// Row per page
|
|
$rowperpage = 13;
|
|
$cur_page = $row_no;
|
|
|
|
// Row position
|
|
if ($row_no != 0) {
|
|
$row_no = ($row_no - 1) * $rowperpage;
|
|
}
|
|
|
|
// All records count
|
|
$allcount = count($this->member_model->get_all_record_member_tracking_by_tracked_group($filters));
|
|
|
|
// Get records
|
|
$records = $this->member_model->get_all_record_member_tracking_by_tracked_group($filters, $rowperpage, $row_no);
|
|
|
|
// Pagination Configuration
|
|
$config['base_url'] = '/member/viewtrackedgroup';
|
|
$config['use_page_numbers'] = TRUE;
|
|
$config['total_rows'] = $allcount;
|
|
$config['per_page'] = $rowperpage;
|
|
$config['cur_page'] = $cur_page;
|
|
$config['suffix'] = '?traked_group=' . $filters['traked_group'];
|
|
$config['first_url'] = base_url() . '/member/viewtrackedgroup/0?traked_group=' . $filters['traked_group'];
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
|
|
// Initialize
|
|
$this->pagination->initialize($config);
|
|
|
|
// Initialize $data Array
|
|
$data['pagination'] = $this->pagination->create_links();
|
|
$data['result'] = $records;
|
|
$data['row'] = $row_no;
|
|
|
|
foreach ($data['result'] as $ele) {
|
|
$data['locations'][] = [
|
|
'lat' => (float) $ele['lat'],
|
|
'lng' => (float) $ele['lng']
|
|
];
|
|
}
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
function viewTrackedAdvice() {
|
|
|
|
$tracked_id = $this->input->get('tracked_id');
|
|
|
|
$this->load->library('table');
|
|
$this->table->set_template($this->template);
|
|
|
|
$mysql = "SELECT * FROM parsedemail_item_advice WHERE parsedemail_item_id= $tracked_id";
|
|
$query = $this->read_replica->query($mysql);
|
|
//$ this->table->set_heading(array('data' => 'ID', 'style' => 'width:10px'), 'Linked Email', 'Provider');
|
|
echo $data['parsedemail_option'] = $this->table->generate($query);
|
|
}
|
|
|
|
public function parse() {
|
|
global $savvyext;
|
|
$data = array();
|
|
if ($this->input->get()) {
|
|
$id = $this->input->get('id');
|
|
$url = $savvyext->cfgReadChar('system.oauth2_url') . "/parse/${id}";
|
|
$token = $savvyext->cfgReadChar('system.oauth2_token');
|
|
$result = $this->get_service_call($url, $token);
|
|
|
|
if ( $result ) {
|
|
$this->output->set_content_type('application/json')->set_output( json_encode( $result ) );
|
|
}
|
|
} else {
|
|
echo "Invalid request";
|
|
}
|
|
return;
|
|
}
|
|
|
|
public function advice() {
|
|
global $savvyext;
|
|
$data = array();
|
|
if ($this->input->get()) {
|
|
$id = $this->input->get('id');
|
|
$url = $savvyext->cfgReadChar('system.oauth2_url') . "advice/${id}";
|
|
$token = $savvyext->cfgReadChar('system.oauth2_token');
|
|
$this->get_service_call($url, $token);
|
|
} else {
|
|
echo "Invalid request";
|
|
}
|
|
return;
|
|
}
|
|
|
|
public function emailstatus($member_id) {
|
|
global $savvyext;
|
|
$url = $savvyext->cfgReadChar('system.oauth2_url') . "/mailstatus/${member_id}";
|
|
$token = $savvyext->cfgReadChar('system.oauth2_token');
|
|
$result = $this->get_service_call($url, $token);
|
|
|
|
if ( $result ) {
|
|
return $this->get_service_call($url, $token);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private function get_service_call($url, $token) {
|
|
$opts = array(
|
|
'http' => array(
|
|
'method' => "GET",
|
|
'header' =>
|
|
"Accept: application/json\r\n" .
|
|
"Authorization: Server-Token ${token}\r\n",
|
|
)
|
|
);
|
|
$context = stream_context_create($opts);
|
|
$data = file_get_contents($url, false, $context);
|
|
$res = json_decode($data, true);
|
|
if ($res != NULL && is_array($res)) {
|
|
if (isset($res["code"]) && $res["code"] == 0) {
|
|
foreach ($res["data"] as $key => $val)
|
|
if ($val == '' || $val == 'N/A')
|
|
unset($res["data"][$key]);
|
|
}
|
|
else if (isset($res["error"])) {
|
|
return;
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
return $res;
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
public function profileImageUpload() {
|
|
$data = array("message" => "Unexpected error");
|
|
$catid = (int) $this->input->post('catid');
|
|
$member_id = (int) $this->input->post('member_id');
|
|
if ($member_id > 0 && $catid == 5) { /* 5 is "member_profile_image" */
|
|
$this->load->library('uploadhelper');
|
|
|
|
ob_start();
|
|
$data = $this->uploadhelper->cardimagesPost($data, $this); // , $uniqueId);
|
|
$str = ob_get_clean();
|
|
|
|
if (substr($str, 0, 8) == 'Uploaded' && (!isset($data["card_image_id"]) || $data["card_image_id"] < 1)) {
|
|
if (preg_match('/^Uploaded ([a-zA-Z0-9]+) to gs:\/\/(.*)\/(.*)\.(.*)$/', $str, $arr) == 1 &&
|
|
count($arr) > 4 && $arr[2] == 'adminsavvy_card_image_category_country') {
|
|
$uniqueId = pg_escape_string($arr[3]);
|
|
$fmt = $arr[4];
|
|
$q = "SELECT id FROM card_images WHERE uniqueid='${uniqueId}'";
|
|
$r = $this->read_replica->query($q);
|
|
$f = $r->row_array();
|
|
if ($f != NULL && is_array($f) && $f["id"] > 0) {
|
|
$data["card_image_id"] = $f["id"];
|
|
}
|
|
$data["message"] = "Uploaded to ${uniqueId}.${fmt}";
|
|
$data["picture_format"] = $fmt;
|
|
} else {
|
|
$data["message"] = "Cannot get upload ID: " . $str;
|
|
}
|
|
}
|
|
if (isset($data["card_image_id"]) && $data["card_image_id"] > 0) {
|
|
$data["picture_format"] = $data["format"];
|
|
$data["message"] = "Uploaded new profile picture ID #" . $data["card_image_id"];
|
|
$q = "UPDATE members SET profile_picture='" . $data["card_image_id"] . "' where id=" . $member_id;
|
|
$this->db->query($q);
|
|
} else {
|
|
$data["message"] = "Upload failed: " . $str;
|
|
}
|
|
/* /Resize and Compress Image
|
|
$config['image_library']='gd2';
|
|
$config['source_image']='./assets/images/'.$data['file_name'];
|
|
$config['create_thumb']= FALSE;
|
|
$config['maintain_ratio']= FALSE;
|
|
$config['quality']= '60%';
|
|
$config['width']= 600;
|
|
$config['height']= 400;
|
|
$config['new_image']= './assets/images/'.$data['file_name'];
|
|
$this->load->library('image_lib', $config);
|
|
$this->image_lib->resize();
|
|
// */
|
|
} else {
|
|
$data["message"] = "Invalid ID";
|
|
}
|
|
error_log(json_encode($data));
|
|
echo json_encode($data);
|
|
}
|
|
|
|
// Tracked Group section
|
|
public function setFormRuleForTrackedGroup() {
|
|
$this->form_validation->set_rules('start_date', 'Start Date', 'callback_isValidDate');
|
|
$this->form_validation->set_rules('end_date', 'End Date', 'callback_isValidDate');
|
|
$this->form_validation->set_rules('member_id', 'Member ID', 'required|numeric');
|
|
$this->form_validation->set_rules('row_no', 'Page', 'numeric');
|
|
}
|
|
|
|
public function getTrackedGroupValue() {
|
|
return [
|
|
'row_no' => $this->input->post('row_no'),
|
|
'start_date' => $this->input->post('filters')['start_date'] ?? '',
|
|
'end_date' => $this->input->post('filters')['end_date'] ?? '',
|
|
'member_id' => $this->input->post('filters')['member_id'],
|
|
'filters' => $this->input->post('filters')
|
|
];
|
|
}
|
|
|
|
public function isValidDate($date) {
|
|
if (!$date) {
|
|
return true;
|
|
}
|
|
|
|
$matches = [];
|
|
$result = preg_match_all("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $date, $matches, PREG_SET_ORDER);
|
|
|
|
if ($result == 0 || $result == false) {
|
|
$this->form_validation->set_message('isValidDate', 'Date input is invalid');
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function isValidFromTo($date) {
|
|
if ($date['start_date'] === '' || $date['end_date'] === '')
|
|
return TRUE;
|
|
|
|
return (strtotime($date['start_date']) > strtotime($date['end_date'])) ? FALSE : TRUE;
|
|
}
|
|
|
|
public function loadTrackedGroupRecord() {
|
|
$this->load->model('member_model');
|
|
$this->load->library('pagination');
|
|
|
|
$this->setFormRuleForTrackedGroup();
|
|
$tracked_group_value = $this->getTrackedGroupValue();
|
|
|
|
$this->form_validation->set_data($tracked_group_value);
|
|
|
|
$errors = null;
|
|
if ($this->form_validation->run() === FALSE) {
|
|
$errors = $this->form_validation->error_array();
|
|
}
|
|
|
|
if ($this->isValidFromTo($tracked_group_value) === FALSE) {
|
|
$errors['from_to'] = 'Selected date range is invalid';
|
|
}
|
|
|
|
if ($errors !== NULL) {
|
|
echo json_encode($this->generate_error_message($errors));
|
|
return;
|
|
}
|
|
|
|
$row_no = $tracked_group_value['row_no'];
|
|
$filters = array_filter($tracked_group_value['filters'], function($ele) {
|
|
return $ele !== '';
|
|
});
|
|
|
|
// Row per page
|
|
$rowperpage = 13;
|
|
$cur_page = $row_no;
|
|
|
|
// Row position
|
|
if ($row_no != 0) {
|
|
$row_no = ($row_no - 1) * $rowperpage;
|
|
}
|
|
|
|
// All records count
|
|
$this->session->set_userdata('tracked_group_filters', $filters);
|
|
$allcount = count($this->member_model->get_all_record_member_tracking($filters));
|
|
|
|
// Get records
|
|
$records = $this->member_model->get_all_record_member_tracking($filters, $rowperpage, $row_no);
|
|
|
|
// Pagination Configuration
|
|
$config['base_url'] = '/member/loadTrackedGroupRecord';
|
|
$config['use_page_numbers'] = TRUE;
|
|
$config['total_rows'] = $allcount;
|
|
$config['per_page'] = $rowperpage;
|
|
$config['cur_page'] = $cur_page;
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
|
|
// Initialize
|
|
$this->pagination->initialize($config);
|
|
|
|
// Initialize $data Array
|
|
$data['pagination'] = $this->pagination->create_links();
|
|
$data['result'] = $records;
|
|
$data['row'] = $row_no;
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
public function setFormRuleForMemberTracking() {
|
|
$this->form_validation->set_rules('start_date', 'Start Date', 'callback_isValidDate');
|
|
$this->form_validation->set_rules('end_date', 'End Date', 'callback_isValidDate');
|
|
$this->form_validation->set_rules('row_no', 'Page', 'numeric');
|
|
$this->form_validation->set_rules('device_id', 'Device ID', 'numeric');
|
|
$this->form_validation->set_rules('radius', 'Radius', 'numeric');
|
|
$this->form_validation->set_rules('lat', 'Latitude', 'callback_isValidGeometry');
|
|
$this->form_validation->set_rules('lng', 'Longitude', 'callback_isValidGeometry');
|
|
$this->form_validation->set_rules('traked_group', 'Tracked Group', 'numeric');
|
|
}
|
|
|
|
public function getMemberTrackingValue() {
|
|
return [
|
|
'row_no' => $this->input->post('row_no'),
|
|
'start_date' => $this->input->post('filters')['start_date'] ?? '',
|
|
'end_date' => $this->input->post('filters')['end_date'] ?? '',
|
|
'device_id' => $this->input->post('filters')['device_id'] ?? '',
|
|
'radius' => $this->input->post('filters')['radius'] ?? '',
|
|
'lat' => $this->input->post('filters')['lat'] ?? '',
|
|
'lng' => $this->input->post('filters')['lng'] ?? '',
|
|
'traked_group' => $this->input->post('filters')['traked_group'] ?? '',
|
|
'filters' => $this->input->post('filters')
|
|
];
|
|
}
|
|
|
|
public function isValidGeometry($geo) {
|
|
if ($geo === NULL || $geo === '')
|
|
return TRUE;
|
|
|
|
if (preg_match('/^(\-?\d+(\.\d+)?)$/', $geo)) {
|
|
return TRUE;
|
|
} else {
|
|
$this->form_validation->set_message('isValidGeometry', 'Location is invalid');
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
public function isSearchByRadius($data) {
|
|
$count = 0;
|
|
|
|
if (isset($data['lat']))
|
|
$count++;
|
|
if (isset($data['lng']))
|
|
$count++;
|
|
if (isset($data['radius']))
|
|
$count++;
|
|
|
|
return $count === 3 || $count === 0;
|
|
}
|
|
|
|
public function generate_error_message($data) {
|
|
$errors['error'] = '';
|
|
|
|
foreach ($data as $ele) {
|
|
$errors['error'] .= "<p>${ele}</p>\n";
|
|
}
|
|
|
|
return $errors;
|
|
}
|
|
|
|
// Tracked Group section
|
|
// Members Account Receipt section
|
|
public function getMembersAccountReceiptsValue() {
|
|
return [
|
|
'row_no' => $this->input->post('row_no'),
|
|
'start_date' => $this->input->post('start_date') ?? '',
|
|
'end_date' => $this->input->post('end_date') ?? '',
|
|
'currency' => $this->input->post('currency') ?? '',
|
|
'category' => $this->input->post('category') ?? '',
|
|
'provider_category' => $this->input->post('provider_category') ?? '',
|
|
'merchant_name' => $this->input->post('merchant_name') ?? '',
|
|
'member_id' => $this->input->post('member_id') ?? ''
|
|
];
|
|
}
|
|
|
|
public function setFormRuleForMembersAccountReceipts() {
|
|
$this->form_validation->set_rules('row_no', 'Page', 'numeric');
|
|
$this->form_validation->set_rules(
|
|
'start_date', 'Start Date', 'regex_match[/\d{4}-\d{2}-\d{2}/]');
|
|
$this->form_validation->set_rules(
|
|
'end_date', 'End Date', 'regex_match[/\d{4}-\d{2}-\d{2}/]');
|
|
$this->form_validation->set_rules('currency', 'Currency', 'trim|strtolower');
|
|
}
|
|
|
|
public function loadMembersAccountReceipts() {
|
|
$this->load->model('member_model');
|
|
$this->load->library('pagination');
|
|
|
|
$this->setFormRuleForMembersAccountReceipts();
|
|
$members_account_receipts = $this->getMembersAccountReceiptsValue();
|
|
|
|
$this->form_validation->set_data($members_account_receipts);
|
|
|
|
$errors = null;
|
|
if ($this->form_validation->run() === FALSE) {
|
|
$errors = $this->form_validation->error_array();
|
|
}
|
|
|
|
if ($errors !== NULL) {
|
|
echo json_encode($this->generate_error_message($errors));
|
|
return;
|
|
}
|
|
|
|
$row_no = $members_account_receipts['row_no'];
|
|
unset($members_account_receipts['row_no']);
|
|
$filters = array_filter($members_account_receipts, function($ele) {
|
|
return $ele !== '';
|
|
});
|
|
|
|
// Row per page
|
|
$rowperpage = 13;
|
|
$cur_page = $row_no;
|
|
|
|
// Row position
|
|
if ($row_no != 0) {
|
|
$row_no = ($row_no - 1) * $rowperpage;
|
|
}
|
|
|
|
// All records count
|
|
$allcount = count($this->member_model->get_all_record_members_bankimport($filters));
|
|
|
|
// Get records
|
|
$records = $this->member_model->get_all_record_members_bankimport($filters, $rowperpage, $row_no);
|
|
|
|
// Pagination Configuration
|
|
$config['base_url'] = '/member/loadMembersAccountReceipts';
|
|
$config['suffix'] = '?' . http_build_query($filters);
|
|
$config['first_url'] = '/member/loadMembersAccountReceipts/0?' . http_build_query($filters);
|
|
$config['use_page_numbers'] = TRUE;
|
|
$config['total_rows'] = $allcount;
|
|
$config['per_page'] = $rowperpage;
|
|
$config['cur_page'] = $cur_page;
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
|
|
// Initialize
|
|
$this->pagination->initialize($config);
|
|
|
|
// Initialize $data Array
|
|
$data['pagination'] = $this->pagination->create_links();
|
|
$data['result'] = $records;
|
|
$data['row'] = $row_no;
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
// Members Account Receipt section
|
|
// Email receipts Section
|
|
public function setFormRuleForEmailReceipts() {
|
|
|
|
$date_pattern = 'regex_match[/\d{4}-\d{2}-\d{2}/]';
|
|
$this->form_validation->set_rules(
|
|
'start_travel_date', 'Start Date', $date_pattern
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'end_travel_date', 'End Date', $date_pattern);
|
|
$this->form_validation->set_rules(
|
|
'duration_start', 'Duration Start', 'is_natural');
|
|
$this->form_validation->set_rules(
|
|
'duration_end', 'Duration End', 'is_natural'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'cost_start', 'Cost Start', 'callback_numeric'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'cost_end', 'Cost End', 'callback_numeric'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'distance_start', 'Distance Start', 'callback_numeric'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'distance_end', 'Distance End', 'callback_numeric'
|
|
);
|
|
}
|
|
|
|
public function numeric($number) {
|
|
if (empty($number))
|
|
return TRUE;
|
|
|
|
return is_numeric($number);
|
|
}
|
|
|
|
public function setDataForEmailReceipts(&$data) {
|
|
if ($this->input->post()) {
|
|
|
|
parse_str($this->input->post('filters'), $filters);
|
|
$data['subject'] = trim($filters['subject']);
|
|
$data['message_from'] = trim($filters['message_from']);
|
|
$data['export'] = trim($this->input->post('export'));
|
|
} else {
|
|
|
|
$data['start_date'] = trim($this->input->get('start_date'));
|
|
$data['end_date'] = trim($this->input->get('end_date'));
|
|
$data['start_travel_date'] = trim($this->input->get('start_travel_date'));
|
|
$data['end_travel_date'] = trim($this->input->get('end_travel_date'));
|
|
$data['duration_start'] = trim($this->input->get('duration_start'));
|
|
$data['duration_end'] = trim($this->input->get('duration_end'));
|
|
$data['cost_start'] = trim($this->input->get('cost_start'));
|
|
$data['cost_end'] = trim($this->input->get('cost_end'));
|
|
$data['distance_start'] = trim($this->input->get('distance_start'));
|
|
$data['distance_end'] = trim($this->input->get('distance_end'));
|
|
$data['surge'] = trim($this->input->get('surge'));
|
|
$data['subject'] = trim($this->input->get('subject'));
|
|
$data['message_from'] = trim($this->input->get('message_from'));
|
|
}
|
|
}
|
|
|
|
public function validateForEmailReceipts(&$data) {
|
|
$this->form_validation->set_data($data);
|
|
$this->setFormRuleForEmailReceipts();
|
|
|
|
$errors = null;
|
|
if ($this->form_validation->run() === FALSE) {
|
|
$errors = $this->form_validation->error_array();
|
|
}
|
|
$data['errors'] = $errors;
|
|
}
|
|
|
|
// Email receipts Section
|
|
// Saved Trips Section
|
|
public function setDataForSavedTrip(&$data) {
|
|
$this->load->model('combo_model');
|
|
|
|
$data['start_date'] = $this->input->get('start_date');
|
|
$data['end_date'] = $this->input->get('end_date');
|
|
$data['start_address'] = $this->input->get('start_address');
|
|
$data['end_address'] = $this->input->get('end_address');
|
|
$data['country_card'] = $this
|
|
->combo_model
|
|
->getCountryCombo('country_card', $this->input->get('country'));
|
|
}
|
|
|
|
public function setFormRuleForSavedTrips() {
|
|
$date_pattern = 'regex_match[/\d{4}-\d{2}-\d{2}/]';
|
|
|
|
$this->form_validation->set_rules('start_date', 'Start Date', $date_pattern);
|
|
$this->form_validation->set_rules('end_date', 'End Date', $date_pattern);
|
|
$this->form_validation->set_rules(
|
|
'country', 'Member ID', 'exist[country,code,country_card]'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'start_address', 'Start Address', 'callback_isExistAddress'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'end_address', 'End Address', 'callback_isExistAddress'
|
|
);
|
|
}
|
|
|
|
public function getSavedTripsValue() {
|
|
return [
|
|
'row_no' => $this->input->get('row_no'),
|
|
'member_id' => $this->input->get('member_id'),
|
|
'start_date' => $this->input->get('start_date') ?? '',
|
|
'end_date' => $this->input->get('end_date') ?? '',
|
|
'country' => $this->input->get('country_card') ?? '',
|
|
'trip_from' => $this->input->get('start_address') ?? '',
|
|
'trip_to' => $this->input->get('end_address') ?? '',
|
|
];
|
|
}
|
|
|
|
public function loadSavedTripsRecord() {
|
|
$this->load->model('member_model');
|
|
$this->load->library('pagination');
|
|
|
|
$saved_trips_value = $this->getSavedTripsValue();
|
|
|
|
$this->form_validation->set_data($saved_trips_value);
|
|
$this->setFormRuleForSavedTrips();
|
|
|
|
if ($this->form_validation->run() === FALSE) {
|
|
echo json_encode(validation_errors());
|
|
return;
|
|
}
|
|
|
|
$row_no = $saved_trips_value['row_no'];
|
|
unset($saved_trips_value['row_no']);
|
|
$filters = array_filter($saved_trips_value, function($ele) {
|
|
return $ele !== '';
|
|
});
|
|
|
|
// Row per page
|
|
$rowperpage = 13;
|
|
$cur_page = $row_no;
|
|
|
|
// Row position
|
|
if ($row_no != 0) {
|
|
$row_no = ($row_no - 1) * $rowperpage;
|
|
}
|
|
|
|
// All records count
|
|
$allcount = count($this->member_model->get_all_record_saved_trips($filters));
|
|
|
|
// Get records
|
|
$records = $this->member_model->get_all_record_saved_trips(
|
|
$filters, $rowperpage, $row_no
|
|
);
|
|
|
|
// Pagination Configuration
|
|
$config['base_url'] = '/member/loadSavedTripsRecord';
|
|
$config['use_page_numbers'] = TRUE;
|
|
$config['suffix'] = '?' . http_build_query($filters);
|
|
$config['first_url'] = '/member/loadSavedTripsRecord?' . http_build_query($filters);
|
|
$config['total_rows'] = $allcount;
|
|
$config['per_page'] = $rowperpage;
|
|
$config['cur_page'] = $cur_page;
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
|
|
// Initialize
|
|
$this->pagination->initialize($config);
|
|
|
|
// Initialize $data Array
|
|
$data['pagination'] = $this->pagination->create_links();
|
|
$data['result'] = $records;
|
|
$data['row'] = $row_no;
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
public function isExistAddress($id) {
|
|
$this->load->model('address_model', 'address');
|
|
if (!$this->address->getAddresses(['id' => $id])) {
|
|
$this->form_validation->set_message(
|
|
'isExistsAddress', 'Please enter an existing address'
|
|
);
|
|
return FALSE;
|
|
} else {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
public function getLocationByAddress() {
|
|
$this->load->model('address_model', 'address');
|
|
$location = $this->address->getAddresses([
|
|
'address' => trim($this->input->get('name')),
|
|
'page' => $this->input->get('page')
|
|
]);
|
|
|
|
echo json_encode([
|
|
'data' => $location['list'],
|
|
'total' => $location['total']
|
|
]);
|
|
}
|
|
|
|
// Saved Trips Section
|
|
// Merged Receipts Section
|
|
public function setDataForMergedReceipts(&$data) {
|
|
$this->load->model('combo_model');
|
|
|
|
$data['acc_email_card'] = $this
|
|
->combo_model
|
|
->getAccAndEmailCombo(
|
|
'acc_email_card', $this->input->get('acc_email_card')
|
|
);
|
|
$data['acc_email'] = $this->input->get('acc_email_card');
|
|
$data['start_travel_date'] = $this->input->get('start_travel_date');
|
|
$data['end_travel_date'] = $this->input->get('end_travel_date');
|
|
$data['start_cost'] = $this->input->get('start_cost');
|
|
$data['end_cost'] = $this->input->get('end_cost');
|
|
}
|
|
|
|
public function setFormRuleForMergedReceipts() {
|
|
$date_pattern = 'regex_match[/\d{4}-\d{2}-\d{2}/]';
|
|
|
|
$this->form_validation->set_rules(
|
|
'start_travel_date', 'Start Travel Date', $date_pattern
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'end_travel_date', 'End Travel Date', $date_pattern
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'start_cost', 'Cost Start', 'callback_numeric'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'end_cost', 'Cost End', 'callback_numeric'
|
|
);
|
|
}
|
|
|
|
public function validateForMergedReceipts(&$data) {
|
|
$this->form_validation->set_data($_GET);
|
|
$this->setFormRuleForMergedReceipts();
|
|
|
|
$errors = null;
|
|
if ($this->form_validation->run() === FALSE) {
|
|
$errors = $this->form_validation->error_array();
|
|
}
|
|
$data['errors'] = $errors;
|
|
}
|
|
|
|
// Merged Receipts Section
|
|
// GPS Trips section
|
|
// Tracking Trips Table
|
|
public function setDataForTrackingTrips(&$data) {
|
|
$data['tracking_trips'] = json_decode(
|
|
$this->input->get('tracking_trips'), true
|
|
) ?? [];
|
|
|
|
$data['tracking_trips'] = array_filter($data['tracking_trips'], function($ele) {
|
|
return trim($ele) !== '';
|
|
}
|
|
);
|
|
}
|
|
|
|
public function setFormRuleForTrackingTrips() {
|
|
$this->form_validation->set_rules(
|
|
'start_duration', 'Start Duration', 'callback_numeric'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'end_duration', 'End Duration', 'callback_numeric'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'start_distance', 'Start Distance', 'callback_numeric'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'end_distance', 'End Distance', 'callback_numeric'
|
|
);
|
|
}
|
|
|
|
public function validateForTrackingTrips(&$data) {
|
|
$this->form_validation->set_data($data['tracking_trips']);
|
|
$this->setFormRuleForTrackingTrips();
|
|
|
|
$errors = null;
|
|
if ($this->form_validation->run() === FALSE) {
|
|
$errors = $this->form_validation->error_array();
|
|
}
|
|
$data['errors']['tracking_trips'] = $errors;
|
|
}
|
|
|
|
// Tracking table
|
|
public function setDataForTracking(&$data) {
|
|
$data['tracking'] = json_decode($this->input->get('tracking'), true) ?? [];
|
|
|
|
$data['tracking'] = array_filter($data['tracking'], function($ele) {
|
|
return trim($ele) !== '';
|
|
}
|
|
);
|
|
}
|
|
|
|
public function setFormRuleForTracking() {
|
|
$date_pattern = 'regex_match[/\d{4}-\d{2}-\d{2}/]';
|
|
|
|
$this->form_validation->set_rules(
|
|
'start_date', 'Start Date', $date_pattern
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'end_date', 'End Date', $date_pattern
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'start_duration', 'Start Duration', 'callback_numeric'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'end_duration', 'End Duration', 'callback_numeric'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'start_distance', 'Start Distance', 'callback_numeric'
|
|
);
|
|
$this->form_validation->set_rules(
|
|
'end_distance', 'End Distance', 'callback_numeric'
|
|
);
|
|
}
|
|
|
|
public function validateForTracking(&$data) {
|
|
$this->form_validation->set_data($data['tracking']);
|
|
$this->setFormRuleForTracking();
|
|
|
|
$errors = null;
|
|
if ($this->form_validation->run() === FALSE) {
|
|
$errors = $this->form_validation->error_array();
|
|
}
|
|
$data['errors']['tracking'] = $errors;
|
|
}
|
|
|
|
// GPS Trips section
|
|
// OAuth2 section
|
|
public function getOAuth2TokensRecord() {
|
|
return [
|
|
'email' => $this->input->get('email') ?? '',
|
|
'start_date' => $this->input->get('start_date') ?? '',
|
|
'end_date' => $this->input->get('end_date') ?? '',
|
|
'member_id' => $this->input->get('member_id')
|
|
];
|
|
}
|
|
|
|
public function loadOAuth2TokensRecord() {
|
|
$this->load->model('oauth2_model');
|
|
$this->load->library('pagination');
|
|
|
|
$filters = $this->getOAuth2TokensRecord();
|
|
$filters = array_filter($filters, function($ele) {
|
|
return $ele !== '';
|
|
});
|
|
|
|
// Row per page
|
|
$row_no = $this->input->get('row_no');
|
|
$rowperpage = 5;
|
|
$cur_page = $row_no;
|
|
|
|
// Row position
|
|
if ($row_no != 0) {
|
|
$row_no = ($row_no - 1) * $rowperpage;
|
|
}
|
|
|
|
// All records count
|
|
$allcount = count($this->oauth2_model->get_all_record_oauth2_tokens($filters));
|
|
|
|
// Get records
|
|
$records = $this->oauth2_model->get_all_record_oauth2_tokens($filters, $rowperpage, $row_no);
|
|
|
|
// Pagination Configuration
|
|
$config['base_url'] = '/member/loadOAuth2TokensRecord';
|
|
$config['suffix'] = '?' . http_build_query($filters);
|
|
$config['first_url'] = '/member/loadOAuth2TokensRecord/0?' . http_build_query($filters);
|
|
$config['use_page_numbers'] = TRUE;
|
|
$config['total_rows'] = $allcount;
|
|
$config['per_page'] = $rowperpage;
|
|
$config['cur_page'] = $cur_page;
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
|
|
// Initialize
|
|
$this->pagination->initialize($config);
|
|
|
|
// Initialize $data Array
|
|
$data['pagination'] = $this->pagination->create_links();
|
|
$data['result'] = $records;
|
|
$data['row'] = $row_no;
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
public function getOAuth2PullJobsRecord() {
|
|
return [
|
|
'start_date' => $this->input->get('start_date') ?? '',
|
|
'end_date' => $this->input->get('end_date') ?? '',
|
|
'member_id' => $this->input->get('member_id')
|
|
];
|
|
}
|
|
|
|
public function loadOAuth2PullJobsRecord() {
|
|
$this->load->model('oauth2_model');
|
|
$this->load->library('pagination');
|
|
|
|
$filters = $this->getOAuth2PullJobsRecord();
|
|
$filters = array_filter($filters, function($ele) {
|
|
return $ele !== '';
|
|
});
|
|
|
|
// Row per page
|
|
$row_no = $this->input->get('row_no');
|
|
$rowperpage = 5;
|
|
$cur_page = $row_no;
|
|
|
|
// Row position
|
|
if ($row_no != 0) {
|
|
$row_no = ($row_no - 1) * $rowperpage;
|
|
}
|
|
|
|
// All records count
|
|
$allcount = count($this->oauth2_model->get_all_record_oauth2_pull_jobs($filters));
|
|
|
|
// Get records
|
|
$records = $this->oauth2_model->get_all_record_oauth2_pull_jobs($filters, $rowperpage, $row_no);
|
|
|
|
// Pagination Configuration
|
|
$config['base_url'] = '/member/loadOAuth2PullJobsRecord';
|
|
$config['suffix'] = '?' . http_build_query($filters);
|
|
$config['first_url'] = '/member/loadOAuth2PullJobsRecord/0?' . http_build_query($filters);
|
|
$config['use_page_numbers'] = TRUE;
|
|
$config['total_rows'] = $allcount;
|
|
$config['per_page'] = $rowperpage;
|
|
$config['cur_page'] = $cur_page;
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
|
|
// Initialize
|
|
$this->pagination->initialize($config);
|
|
|
|
// Initialize $data Array
|
|
$data['pagination'] = $this->pagination->create_links();
|
|
$data['result'] = $records;
|
|
$data['row'] = $row_no;
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
public function getOAuth2PullThreadsRecord() {
|
|
return [
|
|
'search_term' => $this->input->get('search_term') ?? '',
|
|
'start_date' => $this->input->get('start_date') ?? '',
|
|
'end_date' => $this->input->get('end_date') ?? '',
|
|
'member_id' => $this->input->get('member_id')
|
|
];
|
|
}
|
|
|
|
public function loadOAuth2PullThreadsRecord() {
|
|
$this->load->model('oauth2_model');
|
|
$this->load->library('pagination');
|
|
|
|
$filters = $this->getOAuth2PullThreadsRecord();
|
|
$filters = array_filter($filters, function($ele) {
|
|
return $ele !== '';
|
|
});
|
|
|
|
// Row per page
|
|
$row_no = $this->input->get('row_no');
|
|
$rowperpage = 5;
|
|
$cur_page = $row_no;
|
|
|
|
// Row position
|
|
if ($row_no != 0) {
|
|
$row_no = ($row_no - 1) * $rowperpage;
|
|
}
|
|
|
|
// All records count
|
|
$allcount = count($this->oauth2_model->get_all_record_oauth2_pull_threads($filters));
|
|
|
|
// Get records
|
|
$records = $this->oauth2_model->get_all_record_oauth2_pull_threads($filters, $rowperpage, $row_no);
|
|
|
|
// Pagination Configuration
|
|
$config['base_url'] = '/member/loadOAuth2PullThreadsRecord';
|
|
$config['suffix'] = '?' . http_build_query($filters);
|
|
$config['first_url'] = '/member/loadOAuth2PullThreadsRecord/0?' . http_build_query($filters);
|
|
$config['use_page_numbers'] = TRUE;
|
|
$config['total_rows'] = $allcount;
|
|
$config['per_page'] = $rowperpage;
|
|
$config['cur_page'] = $cur_page;
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
|
|
// Initialize
|
|
$this->pagination->initialize($config);
|
|
|
|
// Initialize $data Array
|
|
$data['pagination'] = $this->pagination->create_links();
|
|
$data['result'] = $records;
|
|
$data['row'] = $row_no;
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
// OAuth2 section
|
|
// Msg-Alert section
|
|
public function getNotificationsValue() {
|
|
return [
|
|
'trigger_key' => $this->input->get('trigger_key') ?? '',
|
|
'msg_status' => $this->input->get('card_msg_status') ?? '',
|
|
'start_date' => $this->input->get('start_date') ?? '',
|
|
'end_date' => $this->input->get('end_date') ?? '',
|
|
'member_id' => $this->input->get('member_id')
|
|
];
|
|
}
|
|
|
|
public function loadNotificationsRecord() {
|
|
$this->load->model('notification_model');
|
|
$this->load->library('pagination');
|
|
|
|
$filters = $this->getNotificationsValue();
|
|
$filters = array_filter($filters, function($ele) {
|
|
return $ele !== '';
|
|
});
|
|
|
|
// Row per page
|
|
$row_no = $this->input->get('row_no');
|
|
$rowperpage = 5;
|
|
$cur_page = $row_no;
|
|
|
|
// Row position
|
|
if ($row_no != 0) {
|
|
$row_no = ($row_no - 1) * $rowperpage;
|
|
}
|
|
|
|
// All records count
|
|
$allcount = count($this->notification_model->get_all_record_notifications($filters));
|
|
|
|
// Get records
|
|
$records = $this->notification_model->get_all_record_notifications($filters, $rowperpage, $row_no);
|
|
|
|
// Pagination Configuration
|
|
$config['base_url'] = '/member/loadNotificationsRecord';
|
|
$config['suffix'] = '?' . http_build_query($filters);
|
|
$config['first_url'] = '/member/loadNotificationsRecord/0?' . http_build_query($filters);
|
|
$config['use_page_numbers'] = TRUE;
|
|
$config['total_rows'] = $allcount;
|
|
$config['per_page'] = $rowperpage;
|
|
$config['cur_page'] = $cur_page;
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
|
|
// Initialize
|
|
$this->pagination->initialize($config);
|
|
|
|
// Initialize $data Array
|
|
$data['pagination'] = $this->pagination->create_links();
|
|
$data['result'] = $records;
|
|
$data['row'] = $row_no;
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
// Msg-Alert section
|
|
public function export($r, $filePath, $filename) {
|
|
$this->load->helper('upload_file');
|
|
$this->load->helper('directory');
|
|
|
|
set_time_limit(0);
|
|
|
|
// THE UPLOAD DESITINATION - CHANGE THIS TO YOUR OWN
|
|
if (!file_exists($filePath)) {
|
|
if (!mkdir($filePath, 0777, true)) {
|
|
verbose(0, "Failed to create $filePath");
|
|
}
|
|
}
|
|
|
|
// create your zip file
|
|
$zipname = $filePath . DIRECTORY_SEPARATOR . $filename;
|
|
$zip = new ZipArchive;
|
|
|
|
if (file_exists($zipname)) {
|
|
$zip->open($zipname);
|
|
} else {
|
|
$zip->open($zipname, ZipArchive::CREATE);
|
|
}
|
|
|
|
while ($row = $r->unbuffered_row()) {
|
|
$f = (array) $row;
|
|
// create a temporary html file
|
|
$fd = fopen('php://temp/maxmemory:1048576', 'w');
|
|
if (false === $fd) {
|
|
die('Failed to create temporary file');
|
|
}
|
|
// write the data to csv
|
|
fwrite($fd, $f['message']);
|
|
// return to the start of the stream
|
|
rewind($fd);
|
|
// add the in-memory file to the archive, giving a name
|
|
$zip->addFromString($f['id'] . '.html', stream_get_contents($fd, -1));
|
|
//close the file
|
|
fclose($fd);
|
|
|
|
// create a temporary csv file
|
|
$fd = fopen('php://temp/maxmemory:1048576', 'w');
|
|
if (false === $fd) {
|
|
die('Failed to create temporary file');
|
|
}
|
|
// write the data to csv
|
|
unset($f['message']);
|
|
fputcsv($fd, array_keys($f), ",");
|
|
fputcsv($fd, array_values($f), ",");
|
|
// return to the start of the stream
|
|
rewind($fd);
|
|
// add the in-memory file to the archive, giving a name
|
|
$zip->addFromString($f['id'] . '.csv', stream_get_contents($fd, -1));
|
|
//close the file
|
|
fclose($fd);
|
|
}
|
|
// close the archive
|
|
$zip->close();
|
|
}
|
|
|
|
// Tracked Email Report
|
|
public function trackedemail() {
|
|
$this->load->library('table');
|
|
$this->table->set_heading([
|
|
'ID',
|
|
'Member ID',
|
|
'Subject',
|
|
'Created',
|
|
'Message From',
|
|
'Hash',
|
|
'Date Parsed',
|
|
'oauth2_pull_job_id',
|
|
'Message Date'
|
|
]);
|
|
|
|
$data['page_title'] = 'Tracked Email';
|
|
$this->table->set_template($this->template);
|
|
$data['tracked_email_table'] = $this->table->generate([[]]);
|
|
$this->renderMemberPage('view_trackedemail', $data);
|
|
}
|
|
|
|
function removeEmptyParamsRequest(&$params) {
|
|
|
|
$params['member_id_list'] = array_filter(explode(',', $params['member_id_filter']), function($val) {
|
|
return $val !== "";
|
|
});
|
|
|
|
if (count($params['member_id_list']) === 0) {
|
|
unset($params['member_id_list']);
|
|
}
|
|
|
|
$params = array_filter($params, function($val) {
|
|
return $val !== "";
|
|
});
|
|
}
|
|
|
|
public function trackedemail_search() {
|
|
$data['page_title'] = 'Tracked Email';
|
|
|
|
$this->load->model('member_model');
|
|
$this->load->library('table');
|
|
|
|
$this->table->set_template($this->template);
|
|
$this->table->set_heading([
|
|
'ID',
|
|
'Member ID',
|
|
'Subject',
|
|
'Created',
|
|
'Message From',
|
|
'Hash',
|
|
'Date Parsed',
|
|
'oauth2_pull_job_id',
|
|
'Message Date'
|
|
]);
|
|
|
|
$params = $this->getValueOfTrackedEmail();
|
|
|
|
$this->removeEmptyParamsRequest($params);
|
|
|
|
$errors = $this->validateValueForTrackedEmail($params);
|
|
$params = array_diff_key($params, $errors);
|
|
|
|
$data = array_merge(
|
|
$data, $params, $this->load_pagination(
|
|
$this->member_model
|
|
->get_tracked_email_record($params)
|
|
->result_array()[0]['all_count'], $params, 'trackedemail_search'
|
|
)
|
|
);
|
|
|
|
$records = $this->member_model->get_tracked_email_record(
|
|
$params, SELF::NONE_COUNT_RECORD, $data['limit'], $data['offset']
|
|
)->result_array();
|
|
|
|
foreach ($records as &$record) {
|
|
unset($record['message']);
|
|
}
|
|
|
|
$data['tracked_email_table'] = $this->table->generate($records);
|
|
|
|
$this->renderMemberPage('view_trackedemail', $data);
|
|
}
|
|
|
|
public function trackedemail_export_zip() {
|
|
$this->load->model('member_model');
|
|
|
|
$params = $this->getValueOfTrackedEmail();
|
|
|
|
$this->removeEmptyParamsRequest($params);
|
|
|
|
$errors = $this->validateValueForTrackedEmail($params);
|
|
$params = array_diff_key($params, $errors);
|
|
|
|
$total_record = (int) $this->member_model
|
|
->get_tracked_email_record($params)
|
|
->result_array()[0]['all_count'];
|
|
|
|
if (!$total_record) {
|
|
header('Content-Type: application/json');
|
|
http_response_code(404);
|
|
return;
|
|
}
|
|
|
|
$start = 0;
|
|
$limit = 1000;
|
|
|
|
$filePath = $_SERVER['DOCUMENT_ROOT']
|
|
. DIRECTORY_SEPARATOR
|
|
. self::TEMP_DIRECTORY_DOWNLOAD;
|
|
$filename = 'download-' . date("Y-m-d-H-i-s") . ".zip";
|
|
|
|
do {
|
|
|
|
if (ob_get_level()) {
|
|
ob_end_clean();
|
|
}
|
|
|
|
$data = $this->member_model->get_tracked_email_record(
|
|
$params, SELF::NONE_COUNT_RECORD, $limit, $start
|
|
);
|
|
$this->export($data, $filePath, $filename);
|
|
|
|
$start += $limit;
|
|
} while ($start + $limit <= $total_record);
|
|
|
|
$this->send_file($filePath, $filename);
|
|
}
|
|
|
|
public function send_file($filePath, $filename) {
|
|
if (file_exists($filePath . DIRECTORY_SEPARATOR . $filename)) {
|
|
header('Content-Type: application/zip');
|
|
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
|
|
header('Content-Length: ' . filesize($filePath . DIRECTORY_SEPARATOR . $filename));
|
|
|
|
readfile($filePath . DIRECTORY_SEPARATOR . $filename);
|
|
deleteDir($filePath);
|
|
}
|
|
}
|
|
|
|
public function validateValueForTrackedEmail($params) {
|
|
$this->load->library('form_validation');
|
|
$this->form_validation->set_data($params);
|
|
$this->setFormRuleForTrackedEmail();
|
|
|
|
$errors = [];
|
|
if ($this->form_validation->run() === FALSE) {
|
|
$errors = $this->form_validation->error_array();
|
|
}
|
|
return $errors;
|
|
}
|
|
|
|
public function setFormRuleForTrackedEmail() {
|
|
$date_pattern = 'regex_match[/\d{4}-\d{2}-\d{2}/]';
|
|
|
|
$this->form_validation->set_rules('start_created', 'Created date', $date_pattern);
|
|
$this->form_validation->set_rules('end_created', 'Created date', $date_pattern);
|
|
$this->form_validation->set_rules('start_message_date', 'Message date', $date_pattern);
|
|
$this->form_validation->set_rules('end_message_date', 'Message date', $date_pattern);
|
|
}
|
|
|
|
public function getValueOfTrackedEmail() {
|
|
$params = [];
|
|
|
|
if ($this->input->post()) {
|
|
|
|
parse_str($this->input->post('filters'), $filters);
|
|
$params['subject'] = trim($filters['subject']);
|
|
$params['message_from'] = trim($filters['message_from']);
|
|
$params['start_created'] = trim($filters['start_created']);
|
|
$params['end_created'] = trim($filters['end_created']);
|
|
$params['start_message_date'] = trim($filters['start_message_date']);
|
|
$params['end_message_date'] = trim($filters['end_message_date']);
|
|
$params['sql_raw'] = trim($filters['sql_raw']);
|
|
$params['member_id_filter'] = trim($filters['member_id_filter']);
|
|
} else {
|
|
|
|
$params['subject'] = trim($this->input->get('subject'));
|
|
$params['message_from'] = trim($this->input->get('message_from'));
|
|
$params['start_created'] = trim($this->input->get('start_created'));
|
|
$params['end_created'] = trim($this->input->get('end_created'));
|
|
$params['start_message_date'] = trim($this->input->get('start_message_date'));
|
|
$params['end_message_date'] = trim($this->input->get('end_message_date'));
|
|
$params['sql_raw'] = trim($this->input->get('sql_raw'));
|
|
$params['member_id_filter'] = trim($this->input->get('member_id_filter'));
|
|
}
|
|
|
|
return $params;
|
|
}
|
|
|
|
public function export_member_tracking() {
|
|
if (empty($this->session->tracked_group_filters)) {
|
|
die('something went wrong, try again later');
|
|
}
|
|
set_time_limit(0);
|
|
header('Content-Type: application/vnd.ms-excel');
|
|
header('Content-Disposition: attachment;filename=member-tracking-' . date("Y-m-d") . '.csv');
|
|
header('Cache-Control: max-age=0');
|
|
$this->load->model('member_model');
|
|
$rs = $this->member_model->get_all_record_member_tracking($this->session->tracked_group_filters, null, null, true);
|
|
if (ob_get_contents())
|
|
ob_end_clean();
|
|
$fp = fopen('php://output', 'w');
|
|
$i = 0;
|
|
while ($row = $rs->unbuffered_row()) {
|
|
// header
|
|
if ($i == 0) {
|
|
fputcsv($fp, array_keys((array) $row));
|
|
}
|
|
// records
|
|
fputcsv($fp, (array) $row);
|
|
$i++;
|
|
}
|
|
fclose($fp);
|
|
exit;
|
|
}
|
|
|
|
private function viewOtherReceipts($member_id, $data, $limit, $member_parsedemail_offset, $member_tracked_offset, $error) {
|
|
$data['member_parsedemail_offset'] = $member_parsedemail_offset;
|
|
$data['member_tracked_offset'] = $member_tracked_offset;
|
|
|
|
$limit = 100;
|
|
//PARSED
|
|
$offset = $member_parsedemail_offset;
|
|
|
|
$mysql = " SELECT ";
|
|
$mysql .= " p.id,p.trackedemail_item_id,tp.name, p.receipt_datetime, p.amount,p.created, COALESCE(p.updated,p.created)";
|
|
$mysql .= " FROM parsedemail_item_payment p LEFT JOIN trackedemail_item t ON t.id=p.trackedemail_item_id ";
|
|
$mysql .= " LEFT JOIN transport_providers tp ON p.transport_provider_id=tp.id";
|
|
$mysql .= " LEFT JOIN trip_surge_price e ON (e.data_source_id=p.id AND e.data_source=1) ";
|
|
$mysql .= " LEFT JOIN trip_price_comparison f ON (f.data_source_id=p.id AND e.data_source=1) ";
|
|
$mysql .= " WHERE t.member_id = ${member_id} ";
|
|
// travel date
|
|
if (!empty($data['start_travel_date']) && !isset($error['start_travel_date'])) {
|
|
$mysql .= " AND DATE(p.receipt_datetime) >= '" . pg_escape_string($data['start_travel_date']) . "'";
|
|
}
|
|
if (!empty($data['end_travel_date']) && !isset($error['end_travel_date'])) {
|
|
$mysql .= " AND DATE(p.receipt_datetime) <= '" . pg_escape_string($data['end_travel_date']) . "'";
|
|
}
|
|
|
|
if (!empty($data['cost_start']) && !isset($error['cost_start'])) {
|
|
$mysql .= " AND p.amount >= " . pg_escape_string($data['cost_start']) . "";
|
|
}
|
|
if (!empty($data['cost_end']) && !isset($error['cost_end'])) {
|
|
$mysql .= " AND p.amount <= " . pg_escape_string($data['cost_end']) . "";
|
|
}
|
|
|
|
$mysql .= " ORDER BY id DESC";
|
|
|
|
list($data['pages'], $data['page'], $data['total_pages']) = $this->paginateQuery($mysql, $limit, $offset);
|
|
|
|
$mysql = "SELECT (ROW_NUMBER () OVER (ORDER BY receipt_datetime DESC)) as No, * FROM (${mysql}) AS foo ORDER BY receipt_datetime DESC LIMIT ${limit} OFFSET ${offset}";
|
|
error_log($mysql);
|
|
|
|
$query = $this->read_replica->query($mysql);
|
|
$this->table->set_heading(
|
|
'No.', array('data' => 'ID', 'style' => 'width:10px'), 'Email ID', 'Merchant', 'Receipt Date', 'Amount', 'Created', "Last Data Parse"
|
|
);
|
|
$data['member_parsedemail'] = $this->table->generate($query);
|
|
$config = [];
|
|
$config['full_tag_open'] = "<ul class='pagination'>";
|
|
$config['full_tag_close'] = "</ul>";
|
|
$config['num_tag_open'] = '<li>';
|
|
$config['num_tag_close'] = '</li>';
|
|
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
|
|
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
|
|
$config['next_tag_open'] = "<li>";
|
|
$config['next_tagl_close'] = "</li>";
|
|
$config['prev_tag_open'] = "<li>";
|
|
$config['prev_tagl_close'] = "</li>";
|
|
$config['first_tag_open'] = "<li>";
|
|
$config['first_tagl_close'] = "</li>";
|
|
$config['last_tag_open'] = "<li>";
|
|
$config['last_tagl_close'] = "</li>";
|
|
$data['pagination_config'] = $config;
|
|
|
|
|
|
|
|
// TRACKED
|
|
$offset = $member_tracked_offset;
|
|
$select_query = 'SELECT
|
|
t.id,
|
|
t.created,
|
|
t.subject,
|
|
t.hash,
|
|
t.date_parsed,
|
|
t.message_date,
|
|
t.message_from,
|
|
t.message,
|
|
t.parsed_status,
|
|
p.trackedemail_item_id,
|
|
p.dup_id';
|
|
|
|
$count_query = "SELECT count(*) AS all_count";
|
|
|
|
$from_query = " FROM trackedemail_item t LEFT JOIN parsedemail_item p ON t.id = p.trackedemail_item_id
|
|
WHERE t.member_id=$member_id";
|
|
|
|
$where_query = ' AND p.dup_id IS NULL';
|
|
|
|
// subject
|
|
if (!empty($data['subject']) && !isset($error['subject'])) {
|
|
$from_query .= " AND lower(t.subject) like '%" . pg_escape_string(strtolower($data['subject'])) . "%'";
|
|
}
|
|
|
|
// sender
|
|
if (!empty($data['message_from']) && !isset($error['message_from'])) {
|
|
$from_query .= " AND lower(t.message_from) like '%" . pg_escape_string(strtolower($data['message_from'])) . "%'";
|
|
}
|
|
|
|
if (isset($data['export']) && $data['export'] === 'ZIP') {
|
|
$total_record = (int) $this->read_replica->query($count_query . $from_query . $where_query)->result_array()[0]['all_count'];
|
|
if (!$total_record) {
|
|
header('Content-Type: application/json');
|
|
http_response_code(404);
|
|
return;
|
|
}
|
|
|
|
$start = 0;
|
|
$limit_export = 1000;
|
|
|
|
$query = "${select_query} ${from_query} ${where_query} ORDER BY created LIMIT ${limit_export} OFFSET ${start}";
|
|
|
|
$filePath = $_SERVER['DOCUMENT_ROOT']
|
|
. DIRECTORY_SEPARATOR
|
|
. self::TEMP_DIRECTORY_DOWNLOAD;
|
|
$filename = 'download-' . date("Y-m-d-H-i-s") . ".zip";
|
|
|
|
do {
|
|
|
|
if (ob_get_level()) {
|
|
ob_end_clean();
|
|
}
|
|
|
|
$data = $this->read_replica->query($query);
|
|
$this->export($data, $filePath, $filename);
|
|
|
|
$start += $limit;
|
|
} while ($start + $limit <= $total_record);
|
|
|
|
$this->send_file($filePath, $filename);
|
|
|
|
return;
|
|
}
|
|
|
|
$mysql = $select_query . $from_query . $where_query;
|
|
list($data['tpages'], $data['tpage'], $data['ttotal_pages']) = $this->paginateQuery($mysql, $limit, $offset);
|
|
$mysql = "SELECT (ROW_NUMBER () OVER (ORDER BY created DESC)) as No, foo.id, foo.created, foo.message_date, foo.subject FROM (${mysql}) AS foo ORDER BY created DESC LIMIT ${limit} OFFSET ${offset}";
|
|
error_log($mysql);
|
|
$query = $this->read_replica->query($mysql);
|
|
$this->table->set_heading('No.', array('data' => 'ID', 'style' => 'width:10px'), 'Created', array('data' => 'Send Date', 'style' => 'width:150px'), 'Subject');
|
|
$data['member_tracked'] = $this->table->generate($query);
|
|
|
|
return $data;
|
|
}
|
|
|
|
protected function renderMemberPage($page_name, $data) {
|
|
$this->load->view('admin/view_admin_header', $data);
|
|
$this->load->view('member/' . $page_name, $data);
|
|
$this->load->view('admin/view_admin_footer', $data);
|
|
}
|
|
|
|
// Tracked Email Report
|
|
private function parse_trip_report_data($raw_data) {
|
|
$total_amount = 0;
|
|
if (!isset($raw_data['report']) || count($raw_data['report']) <= 0) {
|
|
return [];
|
|
}
|
|
|
|
foreach ($raw_data['report'] as $trip_category) {
|
|
$total_amount += floatval($trip_category['spent']) ?? 0;
|
|
}
|
|
|
|
$raw_data['total_amount'] = $total_amount;
|
|
return $raw_data;
|
|
}
|
|
|
|
}
|