Skip to content

Instantly share code, notes, and snippets.

@hrehman200
Created September 19, 2023 16:28
Show Gist options
  • Select an option

  • Save hrehman200/8bd588b802929e558abcc3abbf11cffa to your computer and use it in GitHub Desktop.

Select an option

Save hrehman200/8bd588b802929e558abcc3abbf11cffa to your computer and use it in GitHub Desktop.

Revisions

  1. hrehman200 created this gist Sep 19, 2023.
    243 changes: 243 additions & 0 deletions Dashboard.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,243 @@
    <?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'));
    }
    }