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,'' 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,'' 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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; $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 'Select' AS select, id,username,firstname,lastname, last_login,loc," // . " '' 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'] = ""; // $config['num_tag_open'] = '
  • '; // $config['num_tag_close'] = '
  • '; // $config['cur_tag_open'] = "
  • "; // $config['cur_tag_close'] = "
  • "; // $config['next_tag_open'] = "
  • "; // $config['next_tagl_close'] = "
  • "; // $config['prev_tag_open'] = "
  • "; // $config['prev_tagl_close'] = "
  • "; // $config['first_tag_open'] = "
  • "; // $config['first_tagl_close'] = "
  • "; // $config['last_tag_open'] = "
  • "; // $config['last_tagl_close'] = "
  • "; // $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"] = ""; // $this->table->set_template($this->template); // $mysql = "SELECT 'Select' AS select, id,username,firstname,lastname, last_login,loc," // . " '' 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' => "
    ", 'thead_open' => '', 'thead_close' => '', 'heading_row_start' => '', 'heading_row_end' => '', 'heading_cell_start' => '', 'tbody_open' => '', 'tbody_close' => '', 'row_start' => '', 'row_end' => '', 'cell_start' => '', 'row_alt_start' => '', 'row_alt_end' => '', 'cell_alt_start' => '', 'table_close' => '
    ', 'heading_cell_end' => '
    ', 'cell_end' => '
    ', 'cell_alt_end' => '
    ' ); 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"] = ""; $this->table->set_template($this->template); $point_var = '\"POINTS\"'; $mysql = "SELECT m.id " . ",m.decision_group||'
    '||g.description||'
    '||m.decision_updated,m.username,m.firstname,m.lastname,m.phone,m.added::date, m.last_login,''||m.points||'' 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 '' 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 (''"; $mysql.= " || '
    '"; $mysql.= " || '
    '"; $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); // $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 ," . "'
    ' 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 '' 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 . "
    Friends
    " . $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 '' AS view, " . "cp.pool,mc.title,mc.id AS card_id,cp.added,cp.updated,cp.status," . "'' AS cancel," . "'' 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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; $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 '',"; $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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; $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.= " '' AS Insights "; $mysql .= " 'Insights' 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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; $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 ", '\'\' AS Action', $member_id ); // pagination list( $data['pages'], $data['page'], $data['total_pages'] ) = $this->paginateQuery( $sql, $limit, $offset ); $config = []; $config['full_tag_open'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; $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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; $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 '' AS pic, c.id||' : '||c.title||'
    ['||c.button1_action||']
    Card Status : '||c.status||'
    Card Order : '||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 '' AS pic, ca.card_id||' : '||c.title||'
    ['||c.button1_action||']
    Assign Status : '||ca.status||'
    Card Order : '||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'] = "
    "; $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 '' AS pic, ca.card_id||' : '||c.title||'
    ['||CASE WHEN ca.cat IS NOT NULL THEN ca.cat ELSE c.button1_action END||']' As title,c.description , c.card_order as card_list_order, ct.country as card_country, '
    ' AS Del, '

    " . "

    " . "
    ' 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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; $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,'['||button1_action||']-'||title||'
    '||name||'','
    ' 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' => '
    ' ); $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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; // 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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; // 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'] .= "

    ${ele}

    \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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; // 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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; // 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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; // 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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; // 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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; // 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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; // 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'] = ""; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $config['cur_tag_open'] = "
  • "; $config['cur_tag_close'] = "
  • "; $config['next_tag_open'] = "
  • "; $config['next_tagl_close'] = "
  • "; $config['prev_tag_open'] = "
  • "; $config['prev_tagl_close'] = "
  • "; $config['first_tag_open'] = "
  • "; $config['first_tagl_close'] = "
  • "; $config['last_tag_open'] = "
  • "; $config['last_tagl_close'] = "
  • "; $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; } }