Created
September 19, 2023 16:28
-
-
Save hrehman200/8bd588b802929e558abcc3abbf11cffa to your computer and use it in GitHub Desktop.
Dashboard controller for a CodeIgniter Google Ads related project
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
defined('BASEPATH') or exit('No direct script access allowed'); | |
class Dashboard extends CI_Controller | |
{ | |
public function __construct() | |
{ | |
parent::__construct(); | |
} | |
static function date_compare($a, $b) | |
{ | |
$t1 = strtotime($a['date']); | |
$t2 = strtotime($b['date']); | |
return $t1 - $t2; | |
} | |
public function index() | |
{ | |
if ($this->User_model->verifyUser()) { | |
if (@$_POST['date_range']) { | |
if (strpos($_POST['date_range'], ' to ') !== false) { | |
$start_date = explode(' to ', $_POST['date_range'])[0]; | |
$end_date = explode(' to ', $_POST['date_range'])[1]; | |
} else { | |
$start_date = $end_date = $_POST['date_range']; | |
} | |
$start_date = DateTime::createFromFormat('m-d-Y', $start_date)->format('Y-m-d'); | |
$end_date = DateTime::createFromFormat('m-d-Y', $end_date)->format('Y-m-d'); | |
} else { | |
$start_date = date('Y-m-d', strtotime('-7 days')); | |
$end_date = date('Y-m-d', strtotime('-1 days')); | |
$_POST['by_adunit_date'] = 'Date'; | |
} | |
if($start_date < '2023-06-27') { | |
$admanager_by_date1 = $this->AdManager_model->get($_SESSION['user_id'], $start_date, '2023-06-26', 'Date'); | |
$admanager_by_date2 = $this->AdManager_model->get($_SESSION['user_id'], '2023-06-27', $end_date, 'Date'); | |
$admanager_by_date = array_merge($admanager_by_date1, $admanager_by_date2); | |
} else { | |
$admanager_by_date = $this->AdManager_model->get($_SESSION['user_id'], $start_date, $end_date, 'Date'); | |
} | |
$primis_by_date = $this->Primis_model->get($_SESSION['user_id'], $start_date, $end_date, 'Date'); | |
// append primis records to admanager records | |
$records = $admanager_by_date; | |
foreach ($primis_by_date as $p) { | |
$index = array_search($p['date'], array_column($records, 'date')); | |
if ($index !== false) { | |
$records[$index]['impressions'] += $p['impressions']; | |
$records[$index]['revenue'] += $p['revenue']; | |
$records[$index]['ecpm'] = round($records[$index]['revenue'] / $records[$index]['impressions'] * 1000, 2); | |
} else { | |
$records[] = $p; | |
} | |
} | |
usort($records, 'self::date_compare'); | |
$data['records']['date'] = $records; | |
$admanager_by_adunit = $this->AdManager_model->get($_SESSION['user_id'], $start_date, $end_date, 'Ad Units'); | |
$primis_by_adunit = $this->Primis_model->get($_SESSION['user_id'], $start_date, $end_date, 'Ad Units'); | |
$data['records']['ad_unit'] = array_merge($admanager_by_adunit, $primis_by_adunit); | |
// ad-level | |
$admanager_adlevel = $this->AdManager_model->get($_SESSION['user_id'], $start_date, $end_date, 'Ad Units', true); | |
$primis_adlevel = $this->Primis_model->get($_SESSION['user_id'], $start_date, $end_date, 'Ad Units', true); | |
$data['records_adlevel'] = array_merge($admanager_adlevel, $primis_adlevel); | |
// last 30 days record | |
$start_date = date('Y-m-d', strtotime('-30 days')); | |
$end_date = date('Y-m-d', strtotime('now')); | |
// TODO: remove this temporary fix | |
if($start_date < '2023-06-27') { | |
$admanager_last_30_partial1 = $this->AdManager_model->get($_SESSION['user_id'], $start_date, '2023-06-26', 'Date', false, true); | |
$admanager_last_30_partial2 = $this->AdManager_model->get($_SESSION['user_id'], '2023-06-27', $end_date, 'Date', false, true); | |
$admanager_last_30 = array_merge($admanager_last_30_partial1, $admanager_last_30_partial2); | |
} | |
else{ | |
$admanager_last_30 = $this->AdManager_model->get($_SESSION['user_id'], $start_date, $end_date, 'Date', false, true); | |
} | |
$primis_last_30 = $this->Primis_model->get($_SESSION['user_id'], $start_date, $end_date, 'Date'); | |
$records_last_30 = $admanager_last_30; | |
foreach ($primis_last_30 as $p) { | |
$index = array_search($p['date'], array_column($records_last_30, 'date')); | |
if ($index !== false) { | |
$records_last_30[$index]['impressions'] += $p['impressions']; | |
$records_last_30[$index]['revenue'] += $p['revenue']; | |
$records_last_30[$index]['ecpm'] += $p['ecpm']; | |
} else { | |
$records_last_30[] = $p; | |
} | |
} | |
usort($records_last_30, 'self::date_compare'); | |
$data['records_last_30'] = $records_last_30; | |
$domains = $this->Domain_model->getDomains($_SESSION['user_id']); | |
$domains = array_map(function ($item) { | |
return $item['domain']; | |
}, $domains); | |
$data['domains'] = implode(", ", $domains); | |
$data['content'] = $this->load->view('adstats', $data, true); | |
$this->load->view('layout', $data); | |
} | |
} | |
public function dailymail($username, $download = false) | |
{ | |
$start_date = date('Y-m-d', strtotime('-30 days')); | |
//$start_date = date('Y-m-d', strtotime('2019-01-01')); | |
$end_date = date('Y-m-d', strtotime('now')); | |
// 51 for empower | |
switch ($username) { | |
case 'empower': | |
$user_id = 51; | |
break; | |
case 'hellenic': | |
$user_id = 71; | |
break; | |
} | |
$admanager = $this->AdManager_model->get($user_id, $start_date, $end_date, 'Date'); | |
$primis = $this->Primis_model->get($user_id, $start_date, $end_date, 'Date'); | |
$records = $admanager; | |
foreach ($primis as $p) { | |
$index = array_search($p['date'], array_column($records, 'date')); | |
if ($index !== false) { | |
$records[$index]['impressions'] += $p['impressions']; | |
$records[$index]['revenue'] += $p['revenue']; | |
$records[$index]['ecpm'] = round($records[$index]['revenue'] / $records[$index]['impressions'] * 1000, 2); | |
} else { | |
$records[] = $p; | |
} | |
} | |
$data['records_date'] = $records; | |
foreach ($data['records_date'] as $i => &$row) { | |
$admanager = $this->AdManager_model->get($user_id, $row['date'], $row['date'], 'Ad Unit'); | |
$primis = $this->Primis_model->get($user_id, $row['date'], $row['date'], 'Ad Unit'); | |
$row['adunits'] = array_merge($admanager, $primis); | |
} | |
$data['username'] = ucfirst($username); | |
$content = $this->load->view('daily_email', $data, true); | |
//echo $content; | |
if ($download) { | |
header('Content-Type: application/csv'); | |
header('Content-Disposition: attachment; filename="' . $username . '.csv' . '";'); | |
$attachment = $this->_createCsvString($data); | |
echo $attachment; | |
} else { | |
echo $this->sendCsvEmail($data, $content, $username); | |
} | |
} | |
private function _createCsvString($data) | |
{ | |
// Open temp file pointer | |
if (!$fp = fopen('php://temp', 'w+')) return FALSE; | |
// Loop data and write to file pointer | |
fputcsv($fp, ['Ad ID', 'Ad Name', 'Impressions', 'Clicks', 'CTR', 'Viewability', 'CPM', 'Revenue']); | |
foreach ($data['records_date'] as $row) { | |
fputcsv($fp, [$row['date'], '', $row['impressions'], '', '', '', $row['ecpm'], $row['revenue']]); | |
foreach ($row['adunits'] as $adunit_row) { | |
$ctr = number_format($adunit_row['clicks'] / $adunit_row['impressions'] * 100, 2) . '%'; | |
$adunit_row['num_viewability'] = $adunit_row['num_viewability'] == 0 ? 1 : $adunit_row['num_viewability']; | |
$viewability = number_format($adunit_row['total_av_viewable_impressions'] / $adunit_row['num_viewability'], 2) . '%'; | |
fputcsv($fp, [$adunit_row['adunit_id'], $adunit_row['adunit_name'], $adunit_row['impressions'], $adunit_row['clicks'], $ctr, $viewability, $adunit_row['ecpm'], $adunit_row['revenue']]); | |
} | |
} | |
fputcsv($fp, [ | |
'', | |
'Total:', | |
array_sum(array_column($data['records_date'], 'impressions')), | |
'', | |
'', | |
'', | |
'', | |
array_sum(array_column($data['records_date'], 'revenue')), | |
]); | |
// Place stream pointer at beginning | |
rewind($fp); | |
// Return the data | |
return stream_get_contents($fp); | |
} | |
function sendCsvEmail($csvData, $body, $username, $to = '[email protected]', $from = 'theEngine <[email protected]>') | |
{ | |
// This will provide plenty adequate entropy | |
$multipartSep = '-----' . md5(time()) . '-----'; | |
// Arrays are much more readable | |
$headers = array( | |
"From: $from", | |
"Content-Type: multipart/mixed; boundary=\"$multipartSep\"" | |
); | |
// Make the attachment | |
$attachment = chunk_split(base64_encode($this->_createCsvString($csvData))); | |
$subject = 'Last 30 dayAd Stats for ' . ucfirst($username); | |
// Make the body of the message | |
$body = "--$multipartSep\r\n" | |
. "Content-Type: text/html;\r\n" | |
. "\r\n" | |
. "$body\r\n" | |
. "--$multipartSep\r\n" | |
. "Content-Type: text/csv\r\n" | |
. "Content-Transfer-Encoding: base64\r\n" | |
. "Content-Disposition: attachment; filename=\"empower.csv\"\r\n" | |
. "\r\n" | |
. "$attachment\r\n" | |
. "--$multipartSep--"; | |
// Send the email, return the result | |
return @mail($to, $subject, $body, implode("\r\n", $headers)); | |
} | |
public function test() | |
{ | |
//var_dump(preg_match('/instream$/', 'lovefraud_instream_1')); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment