/** * @before _secure */ public function campaigns() { $this->seo(array("title" => "Campaigns")); $view = $this->getActionView(); $start = RM::get("start", strftime("%Y-%m-%d", strtotime('-7 day'))); $end = RM::get("end", strftime("%Y-%m-%d", strtotime('now'))); $limit = RM::get("limit", 20); $page = RM::get("page", 1); $query = ["user_id" => $this->user->id]; $ads = \Ad::all($query, ['title', 'image', 'category', '_id', 'live', 'created'], 'created', 'desc', $limit, $page); $count = \Ad::count($query); $in = Db::convertType(array_keys($ads)); $query["created"] = Db::dateQuery($start, $end); $records = Db::query('Click', ['adid' => ['$in' => $in], 'is_bot' => false, 'created' => $query["created"]], ['adid']); $view->set("ads", $ads); $view->set("start", $start); $view->set("end", $end); $view->set(['count' => $count, 'page' => $page, 'limit' => $limit, 'dateQuery' => $query['created'], 'clicks' => Click::classify($records, 'adid')]); }
public static function livePerf($user, $s = null, $e = null) { $start = $end = date('Y-m-d'); $type = $user->type ?? ''; if ($s) { $start = $s; } if ($e) { $end = $e; } $perf = new \Performance(); $match = ['is_bot' => false, 'created' => Db::dateQuery($start, $end)]; switch ($user->type) { case 'publisher': $match['pid'] = Db::convertType($user->_id); break; case 'advertiser': $ads = \Ad::all(['user_id' => $user->_id], ['_id']); $keys = array_keys($ads); $match['adid'] = ['$in' => Db::convertType($keys)]; break; default: return $perf; } $results = $commissions = []; $records = self::_livePerfQuery($match); foreach ($records as $r) { $obj = Utils::toArray($r); $adid = Utils::getMongoID($obj['_id']); $results[$adid] = $obj; } $comms = Db::query('Commission', ['ad_id' => ['$in' => array_keys($results)]], ['ad_id', 'rate', 'revenue', 'model', 'coverage']); $comms = \Click::classify($comms, 'ad_id'); foreach ($comms as $adid => $value) { $value = array_map(function ($v) { $v["ad_id"] = Utils::getMongoID($v["ad_id"]); unset($v["_id"]); return (object) $v; }, Utils::toArray($value)); $commissions[$adid] = \Commission::filter($value); } foreach ($results as $adid => $obj) { $comms = $commissions[$adid]; foreach ($obj['countries'] as $value) { $country = $value['country']; $clicks = $value['count']; $commission = \Commission::campaignRate($adid, $comms, $country, ['type' => $type, "{$type}" => $user, 'start' => $start, 'end' => $end, 'commFetched' => true]); $updateData = []; $earning = \Ad::earning($commission, $clicks); AM::copy($earning, $updateData); $perf->update($updateData); } } return $perf; }
protected function perf($clicks, $arr, $dq = []) { $perf = new Performance(); $commissions = []; $classify = \Click::classify($clicks, 'adid'); foreach ($classify as $key => $value) { $countryWise = \Click::classify($value, 'country'); foreach ($countryWise as $country => $records) { $adClicks = count($records); $updateData = []; $extra = array_merge($arr, $dq); $info = \Commission::campaignRate($key, $commissions, $country, $extra); $earning = \Ad::earning($info, $adClicks); \Framework\ArrayMethods::copy($earning, $updateData); $perf->update($updateData); } } return $perf; }
private function _reportspub($query, $start, $end, $limit, $page) { $view = $this->getActionView(); $dateQuery = Utils::dateQuery(['start' => $start, 'end' => $end]); $links = \Link::all($query, [], 'created', 'desc', $limit, $page); $count = \Link::count($query); $query["created"] = Db::dateQuery($start, $end); $performances = \Performance::all($query, ['created', 'clicks', 'revenue'], 'created', 'desc'); $in = []; foreach ($links as $l) { // only find clicks for the ads whose links are created $in[] = Utils::mongoObjectId($l->ad_id); } // find clicks $clickCol = Registry::get("MongoDB")->clicks; $records = Db::query('Click', ['adid' => ['$in' => $in], 'is_bot' => false, 'pid' => $query['user_id'], 'created' => $query['created']], ['adid', 'country']); $view->set(['limit' => $limit, 'page' => $page, 'count' => $count, 'start' => $start, 'end' => $end, 'links' => $links, 'performances' => $performances, 'clicks' => Click::classify($records, 'adid'), 'commission' => $this->user->commission(), 'dq' => $query['created']]); }
protected function _performance($date = null) { if (!$date) { $date = date('Y-m-d', strtotime('-1 day')); } $date = date('Y-m-d', strtotime('-1 day')); // find the publishers $publishers = \User::all(['type = ?' => 'publisher', 'live = ?' => true], ['_id', 'email', 'meta', 'org_id']); $dq = ['start' => $date, 'end' => $date]; $dateQuery = Utils::dateQuery($dq); $start = $dateQuery['start']; $end = $dateQuery['end']; // store AD commission info $commInfo = []; $orgs = []; $advPerfs = []; $advertisers = []; $adsInfo = []; foreach ($publishers as $p) { $org = \Organization::find($orgs, $p->org_id); // find the clicks for the publisher $clicks = Db::query('Click', ['pid' => $p->_id, 'is_bot' => false, 'created' => Db::dateQuery($date, $date)], ['adid', 'country', 'device', 'os', 'referer']); $perf = Performance::exists($p, $date); // classify the clicks according to AD ID $classify = \Click::classify($clicks, 'adid'); $countryWise = $deviceWise = $osWise = $refWise = []; foreach ($classify as $key => $value) { $ad = \Ad::find($adsInfo, $key, ['user_id', 'url']); $advert = Usr::find($advertisers, $ad->user_id, ['_id', 'meta', 'email', 'org_id']); $advertPerf = Usr::findPerf($advPerfs, $advert, $date); $countries = \Click::classify($value, 'country'); foreach ($countries as $country => $records) { $updateData = []; $adClicks = count($records); ArrayMethods::counter($countryWise, $country, $adClicks); $pComm = \Commission::campaignRate($key, $commInfo, $country, array_merge(['type' => 'both', 'publisher' => $p], $dq)); $earning = \Ad::earning($pComm, $adClicks); ArrayMethods::copy($earning, $updateData); $updateData['profit'] = $updateData['revenue'] - $updateData['payout']; $updateData['revenue'] = $updateData['payout']; $perf->update($updateData); $aComm = \Commission::campaignRate($key, $commInfo, $country, array_merge(['type' => 'advertiser'], $dq)); $updateData = []; $earning = \Ad::earning($aComm, $adClicks); ArrayMethods::copy($earning, $updateData); $advertPerf->update($updateData); } $deviceWise = Click::classifyInfo(['clicks' => $value, 'type' => 'device', 'arr' => $deviceWise]); $osWise = Click::classifyInfo(['clicks' => $value, 'type' => 'os', 'arr' => $osWise]); $refWise = Click::classifyInfo(['clicks' => $value, 'type' => 'referer', 'arr' => $refWise]); } $msg = 'Performance saved for user: '******' with clicks: ' . $perf->clicks . ' impressions: ' . $perf->impressions; $this->log($msg); $splitCountry = ArrayMethods::topValues($countryWise); $splitCountry['rest'] = array_sum($countryWise) - array_sum($splitCountry); $meta = ['country' => $splitCountry, 'device' => ArrayMethods::topValues($deviceWise, count($deviceWise)), 'os' => ArrayMethods::topValues($osWise, count($osWise)), 'referer' => ArrayMethods::topValues($refWise, count($refWise))]; $perf->meta = $meta; $perf->save(); } foreach ($advPerfs as $key => $perf) { $msg = 'Saving performance for advertiser: ' . $key . ' with clicks: ' . $perf->clicks . ' earning: ' . $perf->revenue . ' impressions: ' . $perf->impressions; $this->log($msg); $perf->save(); } }