-
Notifications
You must be signed in to change notification settings - Fork 0
/
UserCampaignReport.class.php
80 lines (61 loc) · 2.03 KB
/
UserCampaignReport.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php
class UserCampaignReport {
/**
* @return array of arrays with keys: user, numberCampaigns, numberAds, profit. Data is sorted by profit in descending order.
*/
public function generate(array $users, array $campaignsData, array $adLaunchEvents) {
$userCampaigns = $this->getCampaignsDataByUserId($campaignsData);
$adCounts = $this->getAdCountsByCampaignId($adLaunchEvents);
$report = [];
foreach($users as $userId => $userName) {
$campaigns = isset($userCampaigns[$userId]) ? $userCampaigns[$userId] : [];
$numberAds = 0;
$profit = 0;
foreach($campaigns as $row) {
$campaignId = $row['campaignId'];
$numberCampaignAds = isset($adCounts[$campaignId]) ? $adCounts[$campaignId] : 0;
$numberAds += $numberCampaignAds;
$profit += $row['profit'];
}
$report[] = [
"user" => $userName,
"numberCampaigns" => count($campaigns),
"numberAds" => $numberAds,
"profit" => $profit
];
}
usort($report, function($row1, $row2) {
return $row2['profit'] - $row1['profit'];
});
return $report;
}
private function getCampaignsDataByUserId(array $campaignsData) {
$grouped = [];
foreach($campaignsData as $row) {
list($id, $name, $cost, $revenue, $userId) = $row;
if(!isset($grouped[$userId])) {
$grouped[$userId] = [];
}
$grouped[$userId][] = [
'campaignId' => $id,
'campaignName' => $name,
'cost' => $cost,
'revenue' => $revenue,
'profit' => ($revenue - $cost),
'userId' => $userId
];
}
return $grouped;
}
private function getAdCountsByCampaignId(array $adLaunchEvents) {
$adCounts = [];
foreach($adLaunchEvents as $row) {
list($eventId, $campaignId, $name, $date) = $row;
if(!isset($adCounts[$campaignId])) {
$adCounts[$campaignId] = 0;
}
$adCounts[$campaignId]++;
}
return $adCounts;
}
}