<?php
namespace App\Controller;
use App\Config;
use App\Entity\AffiliateTags;
use App\Entity\AppInfo;
use App\Entity\ChartsCache;
use App\Entity\Tune\OfferInfo;
use App\Entity\SourceTags;
use App\Entity\Tag;
use App\Services\AffiliateHasofferAPI;
use App\Services\Alerts;
use App\Services\Aws\ElasticCache;
use App\Services\Aws\S3;
use App\Services\BrandHasofferAPI;
use App\Services\ChartComponents;
use App\Services\Common;
use App\Services\FinancialToolsComponents;
use App\Services\ImpressionsApis;
use App\Services\Metrics24APICalls;
use App\Services\MmpComponents;
use App\Services\MysqlQueries;
use App\Services\OkrComponents;
use App\Services\UsersComponents;
use Doctrine\Persistence\ManagerRegistry;
use Mmoreram\GearmanBundle\Service\GearmanClientInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
*
* Charts related routes with endpoint /api/chart/{route}
*
* @Route("/api/chart", name="api_charts", host="%main_subdomain%")
*/
class ChartController extends AbstractController
{
private $commonCalls;
private $doctrine;
private $mysqlQueries;
private $financialToolsComponents;
private $alerts;
private $brandHasofferApi;
private $mmpComponents;
private $affiliateHasofferAPI;
private $usersComponents;
private $elasticCache;
private $projectDir;
private $s3;
private $impressionsApis;
private $metrics24APICalls;
private $gearmanClientInterface;
private $okrComponents;
public function __construct(
Common $commonCalls,
ManagerRegistry $doctrine,
MysqlQueries $mysqlQueries,
FinancialToolsComponents $financialToolsComponents,
Alerts $alerts,
BrandHasofferApi $brandHasofferApi,
MmpComponents $mmpComponents,
AffiliateHasofferAPI $affiliateHasofferAPI,
UsersComponents $usersComponents,
ElasticCache $elasticCache,
S3 $s3,
ImpressionsApis $impressionsApis,
Metrics24APICalls $metrics24APICalls,
GearmanClientInterface $gearmanClientInterface,
OkrComponents $okrComponents,
string $projectDir
) {
$this->commonCalls = $commonCalls;
$this->doctrine = $doctrine;
$this->mysqlQueries = $mysqlQueries;
$this->financialToolsComponents = $financialToolsComponents;
$this->alerts = $alerts;
$this->brandHasofferApi = $brandHasofferApi;
$this->mmpComponents = $mmpComponents;
$this->affiliateHasofferAPI = $affiliateHasofferAPI;
$this->usersComponents = $usersComponents;
$this->elasticCache = $elasticCache;
$this->s3 = $s3;
$this->impressionsApis = $impressionsApis;
$this->metrics24APICalls = $metrics24APICalls;
$this->gearmanClientInterface = $gearmanClientInterface;
$this->okrComponents = $okrComponents;
$this->projectDir = $projectDir;
}
/**
* @Route("/offer-cr-profit/{offerId}", name="offer_cr_profit_get", methods={"GET"})
*/
public function getOfferCrProfitAction(Request $request, $offerId, Common $commonCalls, BrandHasofferApi $brandHasofferApi)
{
$dateStart = date('Y-m-d', strtotime($request->query->get('dateStart')));
$dateEnd = date('Y-m-d', strtotime($request->query->get('dateEnd')));
$tuneAccount = $request->query->get('tuneAccount') ?? Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE;
$affiliateList = $commonCalls->getAffiliateListByStatusWithKeys($tuneAccount);
$hoData = $brandHasofferApi->getOfferCrProfit($offerId, $dateStart, $dateEnd, $tuneAccount)['response']['data']['data'];
$crProfitData = [['id', 'Conversions', 'Clicks', 'Affiliate', 'Profit']];
if (!empty($hoData)) {
foreach ($hoData as $key => $value) {
$affiliate = array_key_exists($value['Stat']['affiliate_id'], $affiliateList) ? $affiliateList[$value['Stat']['affiliate_id']]['id'] . ' ' . $affiliateList[$value['Stat']['affiliate_id']]['name'] : $value['Stat']['affiliate_id'];
$crProfitData[] = [
$value['Stat']['affiliate_id'],
(int)$value['Stat']['conversions'],
(int)$value['Stat']['clicks'],
$affiliate,
(int)$value['Stat']['profit']
];
}
} else {
$crProfitData[] = [];
}
return new JsonResponse($crProfitData);
}
/**
* @Route("/offer-profit-payout-revenue/{offerId}", name="offer_profit_payout_revenue_get", methods={"GET"})
*/
public function getOfferProfitPayoutRevenueAction(Request $request, $offerId, BrandHasofferApi $brandHasofferApi)
{
$dateStart = date('Y-m-d', strtotime($request->query->get('dateStart')));
$dateEnd = date('Y-m-d', strtotime($request->query->get('dateEnd')));
$tuneAccount = $request->query->get('tuneAccount') ?? Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE;
$hoData = $brandHasofferApi->getOfferProfitPayoutRevenue($offerId, $dateStart, $dateEnd, $tuneAccount)['response']['data']['data'];
$finalData = [['Datetime', 'Profit', 'Payout', 'Revenue']];
if (!empty($hoData)) {
foreach ($hoData as $key => $value) {
$finalData[] = [
$value['Stat']['date'] . ' ' . $value['Stat']['hour'] . ":00",
(int)$value['Stat']['profit'],
(int)$value['Stat']['payout'],
(int)$value['Stat']['revenue']
];
}
} else {
$finalData[] = [];
}
return new JsonResponse($finalData);
}
/**
* @Route("/correlation-stats", name="correlation_stats", methods={"GET"})
*/
public function getCorrelationStatsAction(Request $request, ChartComponents $chartComponents)
{
$sortBy = $request->query->get('sortBy');
$limit = $request->query->get('limit');
$type = $request->query->get('type');
$category = $request->query->get('category');
$dateStart = date('Y-m-d', strtotime($request->query->get('dateStart')));
$dateEnd = date('Y-m-d', strtotime($request->query->get('dateEnd')));
$pullFromCache = $request->query->get('pullFromCache');
$sortType = Config::DASHBOARD_PAGINATION_DEFAULT_SORT_TYPE;
$eventTimestampFrom = strtotime($dateStart);
$eventTimeStampTo = strtotime($dateEnd);
try {
$data = $chartComponents->getCorrelationMmpChartData(
$eventTimestampFrom,
$eventTimeStampTo,
$sortBy,
$sortType,
$limit,
$type,
$category,
(bool) $pullFromCache
);
return new JsonResponse([
'data' => $data,
], Config::HTTP_STATUS_CODE_OK);
} catch (\Exception $e) {
return new JsonResponse([
'success' => false,
'message' => 'Error retrieving dashboard data: ' . $e->getMessage()
], 500);
}
}
/**
* @Route("/os-share", name="os_share", methods={"GET"})
*/
public function getOsShareAction(Request $request, ChartComponents $chartComponents)
{
$dateStart = date('Y-m-d', strtotime($request->query->get('dateStart')));
$dateEnd = date('Y-m-d', strtotime($request->query->get('dateEnd')));
$minClicks = 100;
$pullFromCache = $request->query->get('pullFromCache');
$finalArr = $chartComponents->getOsShareChart($dateStart, $dateEnd, $minClicks, $pullFromCache);
return new JsonResponse($finalArr);
}
/**
* @Route("/geo-chart", name="get_geo_chart", methods={"GET"})
*/
public function geoChartAction(Request $request, ChartComponents $chartComponents)
{
$dateStart = date('Y-m-d', strtotime($request->query->get('dateStart')));
$dateEnd = date('Y-m-d', strtotime($request->query->get('dateEnd')));
$selectType = $request->query->get('selectType');
$pullFromCache = $request->query->get('pullFromCache');
$finalArr = $chartComponents->getGeoChart($dateStart, $dateEnd, $selectType, $pullFromCache);
return new JsonResponse($finalArr);
}
/**
* @Route("/geo-chart-offers", name="get_geo_chart_offers", methods={"GET"})
*/
public function geoChartOffersAction(Request $request, ChartComponents $chartComponents)
{
$dateStart = date('Y-m-d', strtotime($request->query->get('dateStart')));
$dateEnd = date('Y-m-d', strtotime("+1 day", strtotime($request->query->get('dateEnd'))));
$selectType = $request->query->get('selectType');
$geo = $request->query->get('geo');
$pullFromCache = $request->query->get('pullFromCache');
$sortType = Config::DASHBOARD_PAGINATION_DEFAULT_SORT_TYPE;
$eventTimestampFrom = strtotime($dateStart);
$eventTimeStampTo = strtotime($dateEnd);
$filters['geos'] = [$geo];
$data = $chartComponents->getTopTwoOffersData(
$eventTimestampFrom,
$eventTimeStampTo,
$selectType,
$sortType,
(bool) $pullFromCache,
null,
$filters,
);
return new JsonResponse($data);
}
/**
* @Route("/column-chart", name="get_column_chart_by_advertiser", methods={"GET"})
*/
public function getColumnChartAdvertiserAction(Request $request, ChartComponents $chartComponents)
{
$dateStart = date('Y-m-d', strtotime($request->query->get('dateStart')));
$dateEnd = date('Y-m-d', strtotime("+1 day", strtotime($request->query->get('dateEnd'))));
$limit = 5;
$chartBy = $request->query->get('chartBy');
$statType = $request->query->get('statType');
$pullFromCache = $request->query->get('pullFromCache');
$finalArr = $chartComponents->getColumnChartForDashboard($dateStart, $dateEnd, $limit, $chartBy, $statType, $pullFromCache);
return new JsonResponse($finalArr);
}
/**
* @Route("/dashboard-chart-data", name="dashboard-chart-data", methods={"GET"})
*/
public function getAllDashboardChartData(Request $request, ChartComponents $chartComponents): JsonResponse
{
$dateStart = date('Y-m-d', strtotime($request->query->get('dateStart')));
$dateEnd = date('Y-m-d', strtotime($request->query->get('dateEnd')));
$sortBy = $request->query->get('sortBy');
$pullFromCache = $request->query->get('pullFromCache');
$sortType = Config::DASHBOARD_PAGINATION_DEFAULT_SORT_TYPE;
$eventTimestampFrom = strtotime($dateStart);
$eventTimeStampTo = strtotime($dateEnd);
try {
$data = $chartComponents->getDashboardData(
$eventTimestampFrom,
$eventTimeStampTo,
$sortBy,
$sortType,
(bool) $pullFromCache
);
return new JsonResponse([
'response' => [
'success' => true,
'httpStatus' => Config::HTTP_STATUS_CODE_OK,
'data' => $data,
'error' => null
]
], Config::HTTP_STATUS_CODE_OK);
} catch (\Exception $e) {
return new JsonResponse([
'success' => false,
'message' => 'Error retrieving dashboard data: ' . $e->getMessage()
], 500);
}
}
/**
* @Route("/okr", methods={"GET"})
*/
public function getOkrChartsAction(Request $request, OkrComponents $okrComponents): JsonResponse
{
$dateStart = date('Y-m-d', strtotime($request->query->get('dateStart')));
$dateEnd = date('Y-m-d', strtotime($request->query->get('dateEnd')));
$usersWorkingUnderMe = $this->okrComponents->applicableAccountManagerEmailIdsToUser($this->getUser());
if (in_array($this->getUser()->getEmail(), $usersWorkingUnderMe) && sizeof($usersWorkingUnderMe) === 1) {
$usersWorkingUnderMe = [];
}
$isAccountManager = $isTeamLead = $isAdmin = false;
if (in_array(Config::ROLE_ADMIN, $this->getUser()->getRoles())) {
$isAdmin = true;
} else if (sizeof($usersWorkingUnderMe) > 0) {
$isTeamLead = true;
} else if (in_array(Config::ROLE_ACCOUNT_MANAGER, $this->getUser()->getRoles())) {
$isAccountManager = true;
}
$reportData = [];
$reportData2 = [];
$data2 = [];
$title = $title2 = "";
if ($isAdmin) {
$data = $this->okrComponents->getReportData($dateStart, $dateEnd, [], [], [
'mobuppsTeam' => 1,
'revenue' => 1,
'globalReportRevenue' => 1,
], $this->getUser());
foreach ($data as $key => $value) {
$value['identifer'] = $value['mobuppsTeam'];
$reportData[] = $value;
}
$title = "Team Level OKR";
} else if ($isTeamLead) {
$data = $this->okrComponents->getReportData($dateStart, $dateEnd, [], [], [
'advertiserManagerName' => 1,
'revenue' => 1,
'globalReportRevenue' => 1,
], $this->getUser());
foreach ($data as $key => $value) {
$value['identifer'] = $value['advertiserManagerName'];
$reportData[] = $value;
}
$title = "Advertiser Manager Level OKR";
$data2 = $this->okrComponents->getReportData($dateStart, $dateEnd, [], [], [
'advertiserName' => 1,
'advertiserId' => 1,
'revenue' => 1,
'globalReportRevenue' => 1,
], $this->getUser());
foreach ($data2 as $key => $value) {
$value['identifer'] = $value['advertiserId'] . ' - ' . $value['advertiserName'];
$reportData2[] = $value;
}
$title2 = "Advertiser Level OKR";
} else if ($isAccountManager) {
$data = $this->okrComponents->getReportData($dateStart, $dateEnd, [], [], [
'advertiserName' => 1,
'revenue' => 1,
'globalReportRevenue' => 1,
], $this->getUser());
foreach ($data as $key => $value) {
$value['identifer'] = $value['advertiserName'];
$reportData[] = $value;
}
$title2 = "Advertiser Level OKR";
}
$xAxisIdentifiers = [];
$finalRevenue = [];
$plannedRevenue = [];
$finalRevenueSum = 0;
$plannedRevenueSum = 0;
array_multisort(array_column($reportData, 'revenue'), 3, $reportData);
foreach ($reportData as $key => $value) {
$xAxisIdentifiers[] = $value['identifer'];
$finalRevenue[] = $value['finalRevenue'] ?? 0;
$plannedRevenue[] = $value['revenue'];
$finalRevenueSum += $value['finalRevenue'] ?? 0;
$plannedRevenueSum += $value['revenue'];
}
$showBarChart2 = false;
$xAxis2Identifiers = [];
$finalRevenue2 = [];
$plannedRevenue2 = [];
array_multisort(array_column($reportData2, 'revenue'), 3, $reportData2);
foreach ($reportData2 as $key => $value) {
$xAxis2Identifiers[] = $value['identifer'];
$finalRevenue2[] = $value['finalRevenue'] ?? 0;
$plannedRevenue2[] = $value['revenue'];
$showBarChart2 = true;
}
$percentage = $plannedRevenueSum > 0 ? $finalRevenueSum / $plannedRevenueSum : 0;
$finalArr = [];
if (
in_array(Config::ROLE_ADMIN, $this->getUser()->getRoles()) ||
$finalRevenueSum > 0 ||
$plannedRevenueSum > 0
) {
$finalArr = [
'barChart1Options' => [
'xAxisIdentifiers' => $xAxisIdentifiers,
'finalRevenue' => $finalRevenue,
'plannedRevenue' => $plannedRevenue,
'title' => $title,
],
'progressChartOptions' => [
'percentage' => round($percentage, precision: 2),
'finalRevenue' => $finalRevenueSum,
],
];
if ($showBarChart2) {
$finalArr['barChart2Options'] = [
'xAxisIdentifiers' => $xAxis2Identifiers,
'finalRevenue' => $finalRevenue2,
'plannedRevenue' => $plannedRevenue2,
'title' => $title2,
];
}
}
return new JsonResponse($finalArr);
}
}