Skip to content

Instantly share code, notes, and snippets.

@hrehman200
Created September 19, 2023 16:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hrehman200/8bd588b802929e558abcc3abbf11cffa to your computer and use it in GitHub Desktop.
Save hrehman200/8bd588b802929e558abcc3abbf11cffa to your computer and use it in GitHub Desktop.
Dashboard controller for a CodeIgniter Google Ads related project
<?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 = 'george@blabla.com', $from = 'theEngine <support@blabla.com>')
{
// 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