src/Controller/ReportsController.php line 2183

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Config;
  4. use App\Entity\Tune\AdvertiserAccountManager;
  5. use App\Entity\Tune\AffiliateAccountManager;
  6. use App\Entity\AppInfo;
  7. use App\Entity\Tune\AdvertiserInfo;
  8. use App\Entity\AppRetentionReport;
  9. use App\Entity\DeductionControl;
  10. use App\Entity\HyperAffiliateData;
  11. use App\Entity\MmpMobileApps;
  12. use App\Entity\MmpOffers;
  13. use App\Entity\MmpPartnerRules;
  14. use App\Entity\MmpReports;
  15. use App\Entity\Tune\OfferInfo;
  16. use App\Entity\NewsletterBuilder;
  17. use App\Entity\OfferGeoRelationship;
  18. use App\Entity\RevenueControl;
  19. use App\Entity\RevenueTotal;
  20. use App\Entity\SkadNetworkManualPostbackMapping;
  21. use App\Entity\SkadNetworkPostbackLogs;
  22. use App\Entity\Tag;
  23. use App\Services\AffiliateHasofferAPI;
  24. use App\Services\Alerts;
  25. use App\Services\Aws\ElasticCache;
  26. use App\Services\Aws\S3;
  27. use App\Services\BrandHasofferAPI;
  28. use App\Services\Common;
  29. use App\Services\FinancialToolsComponents;
  30. use App\Services\ImpressionsApis;
  31. use App\Services\Metrics24APICalls;
  32. use App\Services\MmpComponents;
  33. use App\Services\MysqlQueries;
  34. use App\Services\MafoFinancialToolsComponents;
  35. use App\Services\UsersComponents;
  36. use Doctrine\ORM\EntityManagerInterface;
  37. use Doctrine\Persistence\ManagerRegistry;
  38. use Mmoreram\GearmanBundle\Service\GearmanClientInterface;
  39. use PhpOffice\PhpSpreadsheet\IOFactory;
  40. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  41. use Symfony\Component\Routing\Annotation\Route;
  42. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  43. use Symfony\Component\HttpFoundation\JsonResponse;
  44. use Symfony\Component\HttpFoundation\Request;
  45. use Symfony\Component\HttpFoundation\Response;
  46. use function GuzzleHttp\json_encode;
  47. use Psr\Log\LoggerInterface;
  48. /**
  49.  *
  50.  * Reports related routes with endpoint /api/reports/{route}
  51.  *
  52.  * @Route("/api/reports", name="reports_", host="%main_subdomain%")
  53.  */
  54. class ReportsController extends AbstractController
  55. {
  56.     private $commonCalls;
  57.     private $doctrine;
  58.     private $mysqlQueries;
  59.     private $financialToolsComponents;
  60.     private $alerts;
  61.     private $brandHasofferApi;
  62.     private $mmpComponents;
  63.     private $affiliateHasofferAPI;
  64.     private $usersComponents;
  65.     private $elasticCache;
  66.     private $projectDir;
  67.     private $s3;
  68.     private $impressionsApis;
  69.     private $metrics24APICalls;
  70.     private $gearmanClientInterface;
  71.     private $entityManager;
  72.     private $mafoFinancialToolsComponents;
  73.     public function __construct(
  74.         Common                   $commonCalls,
  75.         ManagerRegistry          $doctrine,
  76.         MysqlQueries             $mysqlQueries,
  77.         FinancialToolsComponents $financialToolsComponents,
  78.         Alerts                   $alerts,
  79.         BrandHasofferApi         $brandHasofferApi,
  80.         MmpComponents            $mmpComponents,
  81.         AffiliateHasofferAPI     $affiliateHasofferAPI,
  82.         UsersComponents          $usersComponents,
  83.         ElasticCache             $elasticCache,
  84.         S3                       $s3,
  85.         ImpressionsApis          $impressionsApis,
  86.         Metrics24APICalls        $metrics24APICalls,
  87.         GearmanClientInterface   $gearmanClientInterface,
  88.         string                   $projectDir,
  89.         EntityManagerInterface   $entityManager,
  90.         MafoFinancialToolsComponents $mafoFinancialToolsComponents
  91.     ) {
  92.         $this->commonCalls $commonCalls;
  93.         $this->doctrine $doctrine;
  94.         $this->mysqlQueries $mysqlQueries;
  95.         $this->financialToolsComponents $financialToolsComponents;
  96.         $this->alerts $alerts;
  97.         $this->brandHasofferApi $brandHasofferApi;
  98.         $this->mmpComponents $mmpComponents;
  99.         $this->affiliateHasofferAPI $affiliateHasofferAPI;
  100.         $this->usersComponents $usersComponents;
  101.         $this->elasticCache $elasticCache;
  102.         $this->s3 $s3;
  103.         $this->impressionsApis $impressionsApis;
  104.         $this->metrics24APICalls $metrics24APICalls;
  105.         $this->gearmanClientInterface $gearmanClientInterface;
  106.         $this->projectDir $projectDir;
  107.         $this->entityManager $entityManager;
  108.         $this->mafoFinancialToolsComponents $mafoFinancialToolsComponents;
  109.     }
  110.     /**
  111.      * @Route("/advertiser-roi-report", name="get_advertiser_roi_report", methods={"GET"})
  112.      */
  113.     public function getAdvertiserRoiReportAction(Request $request)
  114.     {
  115.         $filtersSelected $request->query->get('filters');
  116.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters');
  117.         $filters = [];
  118.         $excludedFiltersFlags = [];
  119.         if (isset($filtersSelected)) {
  120.             foreach ($filtersSelected as $key => $value) {
  121.                 $key === 'MULTISELECT_TUNE_OFFERS' $filters['offerId'] = $value false;
  122.                 $key === 'MULTISELECT_TUNE_ACCOUNTS' $filters['tuneAccount'] = $value false;
  123.                 $key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS $filters['advertiserId'] = $value false;
  124.                 $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES $filters['affiliateId'] = $value false;
  125.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $filters['affiliateCategory'] = $value false;
  126.                 $key === Config::MULTISELECT_AFFILIATE_SOURCE $filters['source'] = $value false;
  127.             }
  128.         }
  129.         if (isset($excludedFlagForFilters)) {
  130.             foreach ($excludedFlagForFilters as $key => $value) {
  131.                 $value = (int)$value;
  132.                 $key === 'MULTISELECT_TUNE_OFFERS' $excludedFiltersFlags['offerId'] = $value false;
  133.                 $key === 'MULTISELECT_TUNE_ACCOUNTS' $excludedFiltersFlags['tuneAccount'] = $value false;
  134.                 $key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS $excludedFiltersFlags['advertiserId'] = $value false;
  135.                 $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES $excludedFiltersFlags['affiliateId'] = $value false;
  136.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $excludedFiltersFlags['affiliateCategory'] = $value false;
  137.                 $key === Config::MULTISELECT_AFFILIATE_SOURCE $excludedFiltersFlags['source'] = $value false;
  138.             }
  139.         }
  140.         $dateStart date('Y-m-d'strtotime($request->query->get('startDate')));
  141.         $dateEnd date('Y-m-d'strtotime($request->query->get('endDate')));
  142.         $downloadDataAsCSV $request->query->get('downloadCSV') == true false;
  143.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_MMP_REPORT_DEFAULT_SORT_BY;
  144.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  145.         $page $request->query->get('currentPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  146.         $limit $request->query->get('perPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  147.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  148.         $data = [];
  149.         $apiPage 1;
  150.         $apiLimit 100000;
  151.         $report = [];
  152.         foreach (Config::MAFO_SYSTEM_IDENTIFIER_TUNE_ACCOUNTS as $tuneAccount) {
  153.             if (isset($filters['tuneAccount']) && !in_array($tuneAccount$filters['tuneAccount'])) {
  154.                 continue;
  155.             }
  156.             $data = [];
  157.             $hoApiResponse $this->brandHasofferApi->getStatsForAdvertiserRoiReport([], [], [], [], $dateStart$dateEnd$apiLimit$apiPage$tuneAccount);
  158.             while ($hoApiResponse['response']['data']['data']) {
  159.                 $data array_values(array_merge($data$hoApiResponse['response']['data']['data']));
  160.                 $apiPage += 1;
  161.                 $hoApiResponse $this->brandHasofferApi->getStatsForAdvertiserRoiReport([], [], [], [], $dateStart$dateEnd$apiLimit$apiPage$tuneAccount);
  162.             }
  163.             $affiliateCategoriesByAffiliateId $this->commonCalls->getAffiliateCategoryByAffiliateId($tuneAccount);
  164.             $distinctOfferIds = [];
  165.             foreach ($data as $key => $value) {
  166.                 $index md5($value['Stat']['affiliate_id'] . '#' $value['Stat']['offer_id'] . '#' $value['Stat']['source'] . '#' $value['ConversionsMobile']['adv_sub4'] . '#' $tuneAccount);
  167.                 if (!array_key_exists($index$report)) {
  168.                     $report[$index] = [
  169.                         'affiliateId' => $value['Stat']['affiliate_id'],
  170.                         'affiliateName' => '',
  171.                         'affiliateCategory' => array_key_Exists($value['Stat']['affiliate_id'], $affiliateCategoriesByAffiliateId) ? $affiliateCategoriesByAffiliateId[$value['Stat']['affiliate_id']]['category'] : Config::HASOFFER_AFFILIATE_CATEGORY_UNCATEGORISED_TAG_NAME,
  172.                         'offerId' => $value['Stat']['offer_id'],
  173.                         'offerName' => '',
  174.                         'source' => $value['Stat']['source'],
  175.                         'advertiserId' => $value['Stat']['advertiser_id'],
  176.                         'advertiserName' => '',
  177.                         'goalConversions' => 0,
  178.                         'advertiserRevenue' => 0,
  179.                         'mobuppsRevenue' => 0,
  180.                         'advertiserRevenueCurrency' => $value['ConversionsMobile']['adv_sub4'],
  181.                         'roiPercentage' => 0,
  182.                     ];
  183.                     !in_array($value['Stat']['offer_id'], $distinctOfferIds) ? array_push($distinctOfferIds$value['Stat']['offer_id']) : false;
  184.                 }
  185.                 foreach ($filters as $k => $v) {
  186.                     if (
  187.                         array_key_exists($k$report[$index]) &&
  188.                         (
  189.                             (
  190.                                 in_array($report[$index][$k], $v) &&
  191.                                 $excludedFiltersFlags[$k]
  192.                             ) ||
  193.                             (
  194.                                 !in_array($report[$index][$k], $v) &&
  195.                                 !$excludedFiltersFlags[$k]
  196.                             )
  197.                         )
  198.                     ) {
  199.                         unset($report[$index]);
  200.                         continue 2;
  201.                     }
  202.                 }
  203.                 $report[$index]['advertiserRevenue'] += $value['ConversionsMobile']['adv_sub5'];
  204.                 $report[$index]['goalConversions'] += 1;
  205.                 $report[$index]['tuneAccount'] = $tuneAccount;
  206.             }
  207.             $offerInfo = [];
  208.             $distinctOfferIds $offerInfo $this->commonCalls->getOfferInfoByKey($distinctOfferIds$tuneAccount) : false;
  209.             $advertiserList $this->commonCalls->getAdvertisersListByStatusWithKeys([
  210.                 'tuneAccount' => $tuneAccount
  211.             ]);
  212.             $affiliateList $this->commonCalls->getAffiliateListByStatusWithKeys($tuneAccount);
  213.             foreach ($report as $key => $value) {
  214.                 array_key_exists($value['advertiserId'], $advertiserList) ? $report[$key]['advertiserName'] = $advertiserList[$value['advertiserId']]['name'] : false;
  215.                 array_key_exists($value['affiliateId'], $affiliateList) ? $report[$key]['affiliateName'] = $affiliateList[$value['affiliateId']]['name'] : false;
  216.                 if (array_key_exists($value['offerId'], $offerInfo)) {
  217.                     $report[$key]['offerName'] = $offerInfo[$value['offerId']]['name'];
  218.                     $mobuppsRevenue $offerInfo[$value['offerId']]['maxPayout'] * $value['goalConversions'];
  219.                     if ($mobuppsRevenue 0) {
  220.                         $report[$key]['roiPercentage'] = round(((($value['advertiserRevenue'] - $mobuppsRevenue) / $mobuppsRevenue) * 100), 2);
  221.                         $report[$key]['mobuppsRevenue'] = $mobuppsRevenue;
  222.                     }
  223.                 }
  224.                 $report[$key]['advertiserRevenue'] = round($value['advertiserRevenue'], 2);
  225.             }
  226.         }
  227.         $tableColumns $this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::ADVERTISER_ROI_REPORT]);
  228.         $finalArr $this->commonCalls->getReportsRowWiseDataByAggregation($tableColumns$selectedColumns$report);
  229.         if ($downloadDataAsCSV) {
  230.             $this->commonCalls->downloadCSV($tableColumns$finalArr'Advertiser ROI Report ' $dateStart '_' $dateEnd);
  231.         } else {
  232.             return new JsonResponse($this->commonCalls->getPaginatedResponseForReports($finalArr$tableColumns$selectedColumns$sortBy$sortType$limit$page));
  233.         }
  234.     }
  235.    /**
  236.      * @Route("/retention-report", name="get_retention_report", methods={"GET"})
  237.      */
  238.     public function getRetentionReportAction(Request $request)
  239.     {
  240.         $filtersSelected $request->query->get('filters');
  241.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters');
  242.         $filters = [];
  243.         $excludedFiltersFlags = [];
  244.         $finalArr = [];
  245.         if ($filtersSelected) {
  246.             foreach ($filtersSelected as $key => $value) {
  247.                 $key === Config::MULTISELECT_MMP_STATISTICS_APP $filters['appIds'] = $value false;
  248.                 $key === Config::MULTISELECT_MAFO_ADVERTISERS $filters['advertiserId'] = $value false;
  249.                 $key === Config::MULTISELECT_MAFO_AFFILIATES $filters['publisher'] = $value false;
  250.                 $key === Config::MULTISELECT_COHORT_TYPE $filters['cohort_type'] = $value false;
  251.                 $key === Config::MULTISELECT_GEO $filters['geo'] = $value false;
  252.             }
  253.         }
  254.         if ($excludedFlagForFilters) {
  255.             foreach ($excludedFlagForFilters as $key => $value) {
  256.                 $value = (int) $value;
  257.                 $key === Config::MULTISELECT_MAFO_ADVERTISERS $excludedFiltersFlags['advertiserId'] = $value false;
  258.                 $key === Config::MULTISELECT_MAFO_AFFILIATES $excludedFiltersFlags['publisher'] = $value false;
  259.                 $key === Config::MULTISELECT_COHORT_TYPE $excludedFiltersFlags['cohort_type'] = $value false;
  260.                 $key === Config::MULTISELECT_GEO $excludedFiltersFlags['geo'] = $value false;
  261.                 $key === Config::MULTISELECT_MMP_STATISTICS_APP $excludedFiltersFlags['appIds'] = $value false;
  262.             }
  263.         }
  264.         $dateStart date('Y-m-d'strtotime($request->query->get('startDate')));
  265.         // For retention reports, endDate should be startDate + 29 days (to cover D1-D30 retention)
  266.         // This ensures we capture the full 30-day retention window for conversions in the selected range
  267.         $dateEnd date('Y-m-d'strtotime($dateStart ' +29 days'));
  268.         $downloadDataAsCSV $request->query->get('downloadCSV') == 1;
  269.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_MMP_REPORT_DEFAULT_SORT_BY;
  270.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  271.         $page $request->query->get('currentPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  272.         $limit $request->query->get('perPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  273.         $selectedColumns $request->query->get('data') ?: [];
  274.         $filterFields = ['publisherID''publisher''advertiserId''advertiserName''appId''appName''mmpOfferId''mmpOffer''appsflyerAccount''cohortType''geo''eventsName''clicks''installs''events''sevents'];
  275.         $fieldsData = [];
  276.         $fieldsName = [];
  277.         foreach ($filterFields as $field) {
  278.             if (!empty($selectedColumns[$field])) {
  279.                 $fieldsData[$field] = $selectedColumns[$field];
  280.                 $fieldsName[] = $field;
  281.             }
  282.         }
  283.         $selectedColumnsData $fieldsData;
  284.         $fieldsNameData $fieldsName;
  285.         $tableColumns $this->commonCalls->getDataFromJsonFile(
  286.             Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::RETENTION_REPORT_HEADER]
  287.         );
  288.         $columnConfig $this->commonCalls->getDataFromJsonFile(
  289.             Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::RETENTION_REPORT]
  290.         );
  291.         $newTopRow = [];
  292.         foreach ($selectedColumnsData as $key => $val) {
  293.             if (array_key_exists($key$columnConfig)) {
  294.                 $newTopRow[$key] = $columnConfig[$key];
  295.             }
  296.         }
  297.         $tableColumnsData =  $newTopRow $tableColumns;
  298.         $data = [];
  299.         $transactionIds = [];
  300.         $retentionReportRepository $this->doctrine->getRepository(AppRetentionReport::class);
  301.         ini_set('memory_limit''-1');
  302.         $retentionReportData $retentionReportRepository->getRevenueGroupedByMediaSourceForLast30Days($selectedColumnsData$filtersSelected$dateStart$dateEnd);
  303.         $retentionReportData $retentionReportData ?? [];
  304.         $groupedData = [];
  305.         foreach ($retentionReportData as $value) {
  306.             $conversionDay $value['conversion_day'] ?? null;
  307.             $mediaSource $value['media_source'] ?? '';
  308.             $dayNumber = isset($value['day_number']) ? (int)$value['day_number'] : null;
  309.             $dayLabel $value['day_label'] ?? '';
  310.             $eventCount = isset($value['event_count']) ? (int)$value['event_count'] : 0;
  311.             $uniqueUsers = isset($value['unique_users']) ? (int)$value['unique_users'] : 0;
  312.             // conversion_day may be a comma-separated string from GROUP_CONCAT, or a single date
  313.             $conversionDayString null;
  314.             if ($conversionDay) {
  315.                 if (is_string($conversionDay) && strpos($conversionDay',') !== false) {
  316.                     // Multiple conversion dates - split and process each
  317.                     $conversionDays explode(','$conversionDay);
  318.                     $conversionDayString = !empty($conversionDays) ? trim($conversionDays[0]) : null;
  319.                 } else {
  320.                     $conversionDayString $conversionDay instanceof \DateTime $conversionDay->format('Y-m-d') : (string)$conversionDay;
  321.                 }
  322.             }
  323.             // Group ONLY by media_source - selected columns are for display only, not for grouping
  324.             // This ensures each media_source appears only once in the final report
  325.             $groupKeyParts = [$mediaSource];
  326.             
  327.             // DO NOT add any selected columns to groupKey - they are display-only fields
  328.             // All rows with the same media_source should be aggregated together regardless of other field values
  329.             
  330.             $groupKey md5(implode('|'$groupKeyParts));
  331.             if (!isset($groupedData[$groupKey])) {
  332.                 $groupedData[$groupKey] = [
  333.                     'media_source' => $mediaSource,
  334.                     'total_events' => 0,
  335.                     'total_unique_users' => 0,
  336.                     'total_attributions' => 0,
  337.                     'total_installs' => 0,
  338.                     'total_clicks' => 0,
  339.                     'day_data' => [],
  340.                     'base_data' => $value,
  341.                     'conversion_dates' => []
  342.                 ];
  343.             }
  344.             if ($dayNumber === null || $dayNumber || $dayNumber 30) {
  345.                 continue;
  346.             }
  347.             // Handle conversion_day which may be comma-separated from GROUP_CONCAT
  348.             if ($conversionDay) {
  349.                 $conversionDaysToAdd = [];
  350.                 if (is_string($conversionDay) && strpos($conversionDay',') !== false) {
  351.                     // Split comma-separated dates
  352.                     $conversionDaysToAdd array_map('trim'explode(','$conversionDay));
  353.                 } else {
  354.                     $conversionDayStr $conversionDay instanceof \DateTime $conversionDay->format('Y-m-d') : (string)$conversionDay;
  355.                     if ($conversionDayStr) {
  356.                         $conversionDaysToAdd = [$conversionDayStr];
  357.                     }
  358.                 }
  359.                 
  360.                 // Add unique conversion dates to the array
  361.                 foreach ($conversionDaysToAdd as $cd) {
  362.                     if ($cd && is_array($groupedData[$groupKey]['conversion_dates']) && !in_array($cd$groupedData[$groupKey]['conversion_dates'])) {
  363.                         $groupedData[$groupKey]['conversion_dates'][] = $cd;
  364.                     }
  365.                 }
  366.             }
  367.             
  368.             $groupedData[$groupKey]['total_events'] += $eventCount;
  369.             $groupedData[$groupKey]['total_unique_users'] += $uniqueUsers;
  370.             
  371.             if (isset($value['clicks_count'])) {
  372.                 $groupedData[$groupKey]['total_clicks'] += (int)$value['clicks_count'];
  373.             } elseif (isset($value['attributedTouchType']) && strtolower($value['attributedTouchType']) === 'click') {
  374.                 $groupedData[$groupKey]['total_clicks'] += 1;
  375.             }
  376.             
  377.             if (isset($value['installs_count'])) {
  378.                 $groupedData[$groupKey]['total_installs'] += (int)$value['installs_count'];
  379.             } elseif (isset($value['conversionType']) && $value['conversionType'] === 'install') {
  380.                 $groupedData[$groupKey]['total_installs'] += 1;
  381.             }
  382.             if (!isset($groupedData[$groupKey]['day_data'][$dayNumber])) {
  383.                 $groupedData[$groupKey]['day_data'][$dayNumber] = [
  384.                     'users' => 0,
  385.                     'events' => 0
  386.                 ];
  387.             }
  388.             $groupedData[$groupKey]['day_data'][$dayNumber]['users'] += $uniqueUsers;
  389.             $groupedData[$groupKey]['day_data'][$dayNumber]['events'] += $eventCount;
  390.             $groupedData[$groupKey]['base_data'] = array_merge($groupedData[$groupKey]['base_data'], $value);
  391.         }
  392.         foreach ($groupedData as $key => $value) {
  393.             $index md5($key);
  394.             $totalEvents $value['total_events'];
  395.             $dayValues = [];
  396.             for ($i 1$i <= 30$i++) {
  397.                 $userCount = isset($value['day_data'][$i]) ? $value['day_data'][$i]['users'] : 0;
  398.                 $dayValues["D" $i] = "{$userCount}";
  399.                 
  400.             }
  401.             $baseData = [];
  402.             $baseValue $value['base_data'];
  403.             $conversionDates $value['conversion_dates'] ?? [];
  404.             $conversionDates is_array($conversionDates) ? $conversionDates : [];
  405.             $dateRange '';
  406.             if (!empty($conversionDates) && is_array($conversionDates)) {
  407.                 $dateCount count($conversionDates);
  408.                 $dateRange $dateCount ?
  409.                     min($conversionDates) . ' to ' max($conversionDates) :
  410.                     (string)$conversionDates[0];
  411.             } else {
  412.                 $dateRange $dateStart ' to ' $dateEnd;
  413.             }
  414.             if (!empty($selectedColumns['publisherID'])) {
  415.                 $baseData['publisherID'] = $baseValue['mmpPartnerSource'] ?? '';
  416.             }
  417.             if (!empty($selectedColumns['publisher'])) {
  418.                 $baseData['publisher'] = $baseValue['publisherName'] ?? '';
  419.             }
  420.             if (!empty($selectedColumns['advertiserId'])) {
  421.                 $baseData['advertiserId'] = $baseValue['advertiserId'] ?? '';
  422.             }
  423.             if (!empty($selectedColumns['advertiserName'])) {
  424.                 $baseData['advertiserName'] = $baseValue['advertiserName'] ?? '';
  425.             }
  426.             if (!empty($selectedColumns['appId'])) {
  427.                 $baseData['appId'] = $baseValue['appId'] ?? '';
  428.             }
  429.             if (!empty($selectedColumns['appName'])) {
  430.                 $baseData['appName'] = $baseValue['author'] ?? '';
  431.             }
  432.             if (!empty($selectedColumns['mmpOfferId'])) {
  433.                 $baseData['mmpOfferId'] = $baseValue['mmpOfferId'] ?? '';
  434.             }
  435.             if (!empty($selectedColumns['mmpOffer'])) {
  436.                 $baseData['mmpOffer'] = $baseValue['mmpOffer'] ?? '';
  437.             }
  438.             if (!empty($selectedColumns['appsflyerAccount'])) {
  439.                 $baseData['appsflyerAccount'] = $baseValue['appsflyerAccount'] ?? '';
  440.             }
  441.             if (!empty($selectedColumns['cohortType'])) {
  442.                 $baseData['cohortType'] = $baseValue['report_name'] ?? '';
  443.             }
  444.             if (!empty($selectedColumns['geo'])) {
  445.                 $baseData['geo'] = $baseValue['geo'] ?? '';
  446.             }
  447.             if (!empty($selectedColumns['eventsName'])) {
  448.                 $baseData['eventsName'] = $baseValue['event_name'] ?? '';
  449.             }
  450.             if (!empty($selectedColumns['clicks'])) {
  451.                 $baseData['clicks'] = $value['total_clicks'] ?? 0;
  452.             }
  453.             if (!empty($selectedColumns['installs'])) {
  454.                 $baseData['installs'] = $value['total_installs'] ?? 0;
  455.             }
  456.             if (!empty($selectedColumns['events'])) {
  457.                 $baseData['events'] = $value['total_events'];
  458.             }
  459.             
  460.            
  461.             $baseData['mediaSource'] = $value['media_source'] ?? '';
  462.             $baseData['conversionDate'] = $dateRange;
  463.             $baseData['attributions'] = $value['total_attributions'];
  464.             $baseData['cost'] = 'N/A';
  465.             $baseData['AverageeCPI'] = 'N/A';
  466.             $finalArr[$index] = array_merge($baseData$dayValues);
  467.         }
  468.         if ($downloadDataAsCSV) {
  469.             $this->commonCalls->downloadCSV($tableColumns$finalArr'Retention Report ' $dateStart '_' $dateEnd);
  470.         } else {
  471.             $data $this->getPaginatedResponseForRetentionReports(
  472.                 $finalArr,
  473.                 $tableColumnsData,
  474.                 $selectedColumnsData,
  475.                 $sortBy,
  476.                 $sortType,
  477.                 $limit,
  478.                 $page
  479.             );
  480.             
  481.             return new JsonResponse($data);
  482.         }
  483.     }
  484.     public function getPaginatedResponseForRetentionReports($reportData$tableColumns$selectedColumns$sortBy$sortType$limit$page)
  485.     {
  486.         $reportData array_values($reportData);
  487.         if (sizeof($reportData)) {
  488.             $entity $reportData[0];
  489.             if (array_key_exists($sortBy$entity)) {
  490.                 $sortFlag 3;
  491.                 if ($sortType == Config::SORT_TYPE_ASC) {
  492.                     $sortFlag 4;
  493.                 }
  494.                 array_multisort(array_column($reportData$sortBy), $sortFlag$reportData);
  495.             }
  496.         }
  497.         $offset $limit * ($page 1);
  498.         $totalRecordCount sizeof($reportData);
  499.         $noOfPages ceil($totalRecordCount $limit);
  500.         foreach ($tableColumns as $key => $value) {
  501.             if (isset($value['aggregate'])) {
  502.                 if ($value['aggregate'] == 'sum') {
  503.                     $tableColumns[$key]['Footer'] = number_format(round(array_sum(array_column($reportData$value['accessor'])), 2));
  504.                 }
  505.                 if ($value['aggregate'] == 'average' && count($reportData) > 0) {
  506.                     $tableColumns[$key]['Footer'] = number_format(round(array_sum(array_column($reportData$value['accessor'])) / count($reportData), 2));
  507.                 }
  508.             }
  509.         }
  510.         return [
  511.             'response' => [
  512.                 'success' => true,
  513.                 'httpStatus' => Config::HTTP_STATUS_CODE_OK,
  514.                 'data' => [
  515.                     'tableColumns' => array_values($tableColumns),
  516.                     'data' => array_slice($reportData$offset$limit),
  517.                     'metaData' => [
  518.                         'total' => $totalRecordCount,
  519.                         'limit' => (int)$limit,
  520.                         'page' => (int)$page,
  521.                         'pages' => (int)$noOfPages,
  522.                     ]
  523.                 ],
  524.                 'error' => null
  525.             ]
  526.         ];
  527.     }
  528.     /**
  529.      * @Route("/retention-report-old", name="get_retention_report_old", methods={"GET"})
  530.      */
  531.     public function getRetentionReportOldAction(Request $request)
  532.     {
  533.         $filtersSelected $request->query->get('filters');
  534.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters');
  535.         $filters = [];
  536.         $excludedFiltersFlags = [];
  537.         if (isset($filtersSelected)) {
  538.             foreach ($filtersSelected as $key => $value) {
  539.                 $key === 'MULTISELECT_TUNE_OFFERS' $filters['offerId'] = $value false;
  540.                 $key === 'MULTISELECT_TUNE_ACCOUNTS' $filters['tuneAccount'] = $value false;
  541.                 $key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS $filters['advertiserId'] = $value false;
  542.                 $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES $filters['affiliateId'] = $value false;
  543.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $filters['affiliateCategory'] = $value false;
  544.                 $key === Config::MULTISELECT_AFFILIATE_SOURCE $filters['source'] = $value false;
  545.             }
  546.         }
  547.         if (isset($excludedFlagForFilters)) {
  548.             foreach ($excludedFlagForFilters as $key => $value) {
  549.                 $value = (int)$value;
  550.                 $key === 'MULTISELECT_TUNE_OFFERS' $excludedFiltersFlags['offerId'] = $value false;
  551.                 $key === 'MULTISELECT_TUNE_ACCOUNTS' $excludedFiltersFlags['tuneAccount'] = $value false;
  552.                 $key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS $excludedFiltersFlags['advertiserId'] = $value false;
  553.                 $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES $excludedFiltersFlags['affiliateId'] = $value false;
  554.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $excludedFiltersFlags['affiliateCategory'] = $value false;
  555.                 $key === Config::MULTISELECT_AFFILIATE_SOURCE $excludedFiltersFlags['source'] = $value false;
  556.             }
  557.         }
  558.         $dateStart date('Y-m-d'strtotime($request->query->get('startDate')));
  559.         $dateEnd date('Y-m-d'strtotime($request->query->get('endDate')));
  560.         $downloadDataAsCSV $request->query->get('downloadCSV') == true false;
  561.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_MMP_REPORT_DEFAULT_SORT_BY;
  562.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  563.         $page $request->query->get('currentPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  564.         $limit $request->query->get('perPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  565.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  566.         $data = [];
  567.         $transactionIds = [];
  568.         if (!isset($filters['offerId'])) {
  569.             return new JsonResponse([]);
  570.         }
  571.         $apiPage 1;
  572.         $apiLimit 100000;
  573.         foreach (Config::MAFO_SYSTEM_IDENTIFIER_TUNE_ACCOUNTS as $tuneAccount) {
  574.             if (isset($filters['tuneAccount']) && !in_array($tuneAccount$filters['tuneAccount'])) {
  575.                 continue;
  576.             }
  577.             $data = [];
  578.             $hoApiResponse $this->brandHasofferApi->getStatsForRetentionReport([], [], $filters['offerId'], [], [], true$dateStart$dateEnd$apiPage$apiLimit$filters['tuneAccount']);
  579.             while ($hoApiResponse['response']['data']['data']) {
  580.                 $data array_values(array_merge($data$hoApiResponse['response']['data']['data']));
  581.                 $apiPage += 1;
  582.                 $hoApiResponse $this->brandHasofferApi->getStatsForRetentionReport([], [], $filters['offerId'], [], [], true$dateStart$dateEnd$apiPage$apiLimit$filters['tuneAccount']);
  583.             }
  584.             $distinctOfferIds = [];
  585.             $affiliateCategoriesByAffiliateId $this->commonCalls->getAffiliateCategoryByAffiliateId();
  586.             $retentionReportData = [];
  587.             $finalArr = [];
  588.             foreach ($data as $key => $value) {
  589.                 if (
  590.                     $value['Stat']['goal_id'] == Config::INSTALL_GOAL_ID
  591.                 ) {
  592.                     $index md5($value['Stat']['affiliate_id'] . '#' $value['Stat']['offer_id'] . '#' $value['Stat']['source'] . '#' $value['Stat']['ad_id']);
  593.                     if (!array_key_exists($index$retentionReportData)) {
  594.                         $retentionReportData[$index] = [
  595.                             'affiliateId' => $value['Stat']['affiliate_id'],
  596.                             'affiliateName' => '',
  597.                             'offerId' => $value['Stat']['offer_id'],
  598.                             'offerName' => '',
  599.                             'source' => $value['Stat']['source'],
  600.                             'advertiserId' => $value['Stat']['advertiser_id'],
  601.                             'advertiserName' => '',
  602.                             'transactionId' => $value['Stat']['ad_id'],
  603.                             'installConversions' => 0,
  604.                             'goalConversions' => 0,
  605.                             'retentionPercentage' => 0,
  606.                             'goalInfo' => []
  607.                         ];
  608.                     }
  609.                     !in_array($value['Stat']['ad_id'], $transactionIds) ? array_push($transactionIds$value['Stat']['ad_id']) : false;
  610.                     $retentionReportData[$index]['installConversions'] += 1;
  611.                     !in_array($value['Stat']['offer_id'], $distinctOfferIds) ? array_push($distinctOfferIds$value['Stat']['offer_id']) : false;
  612.                 }
  613.             }
  614.             foreach ($data as $key => $value) {
  615.                 $index md5($value['Stat']['affiliate_id'] . '#' $value['Stat']['offer_id'] . '#' $value['Stat']['source'] . '#' $value['Stat']['ad_id'] . '#' $tuneAccount);
  616.                 if (array_key_exists($index$retentionReportData) && $value['Stat']['goal_id'] != Config::INSTALL_GOAL_ID) {
  617.                     $retentionReportData[$index]['goalInfo'][] = [
  618.                         'transactionId' => $value['Stat']['ad_id'],
  619.                         'goalId' => $value['Stat']['goal_id'],
  620.                         'goalName' => $value['Goal']['name'] ?? '',
  621.                     ];
  622.                     $retentionReportData[$index]['goalConversions'] += 1;
  623.                 }
  624.             }
  625.             foreach ($retentionReportData as $key => $value) {
  626.                 $index md5($value['affiliateId'] . '#' $value['offerId'] . '#' $value['advertiserId'] . '#' $tuneAccount);
  627.                 if (!array_key_exists($index$finalArr)) {
  628.                     $finalArr[$index] = [
  629.                         'affiliateId' => $value['affiliateId'],
  630.                         'affiliateName' => '',
  631.                         'affiliateCategory' => array_key_Exists($value['affiliateId'], $affiliateCategoriesByAffiliateId) ? $affiliateCategoriesByAffiliateId[$value['affiliateId']]['category'] : Config::HASOFFER_AFFILIATE_CATEGORY_UNCATEGORISED_TAG_NAME,
  632.                         'offerId' => $value['offerId'],
  633.                         'offerName' => '',
  634.                         'source' => $value['source'],
  635.                         'advertiserId' => $value['advertiserId'],
  636.                         'advertiserName' => '',
  637.                         'installConversions' => 0,
  638.                         'goalConversions' => 0,
  639.                         'retentionPercentage' => 0,
  640.                         'goalInfo' => []
  641.                     ];
  642.                     foreach ($filters as $k => $v) {
  643.                         if (
  644.                             array_key_exists($k$finalArr[$index]) &&
  645.                             (
  646.                                 (
  647.                                     in_array($finalArr[$index][$k], $v) &&
  648.                                     $excludedFiltersFlags[$k]
  649.                                 ) ||
  650.                                 (
  651.                                     !in_array($finalArr[$index][$k], $v) &&
  652.                                     !$excludedFiltersFlags[$k]
  653.                                 )
  654.                             )
  655.                         ) {
  656.                             unset($finalArr[$index]);
  657.                             continue 2;
  658.                         }
  659.                     }
  660.                 }
  661.                 $finalArr[$index]['installConversions'] += $value['installConversions'];
  662.                 $finalArr[$index]['goalConversions'] += $value['goalConversions'];
  663.                 $finalArr[$index]['tuneAccount'] = $value['tuneAccount'];
  664.                 //            foreach ($value['goalInfo'] as $k => $v) {
  665.                 //
  666.                 //                if (!array_key_exists($v['goalId'], $finalArr[$index]['goalInfo'])) {
  667.                 //                    $finalArr[$index]['goalInfo'][$v['goalId']] = [
  668.                 //                        'goalId' => $v['goalId'],
  669.                 //                        'goalName' => $v['goalName'],
  670.                 //                        'conversions' => 0,
  671.                 //                    ];
  672.                 //                }
  673.                 //
  674.                 //                $finalArr[$index]['goalInfo'][$v['goalId']]['conversions'] += 1;
  675.                 //            }
  676.             }
  677.             $offerInfo = [];
  678.             $distinctOfferIds $offerInfo $this->commonCalls->getOfferInfoByKey($distinctOfferIds) : false;
  679.             $advertiserList $this->commonCalls->getAdvertisersListByStatusWithKeys([
  680.                 'tuneAccount' => $tuneAccount
  681.             ]);
  682.             $affiliateList $this->commonCalls->getAffiliateListByStatusWithKeys($tuneAccount);
  683.             foreach ($finalArr as $key => $value) {
  684.                 array_key_exists($value['offerId'], $offerInfo) ? $finalArr[$key]['offerName'] = $offerInfo[$value['offerId']]['name'] : false;
  685.                 array_key_exists($value['advertiserId'], $advertiserList) ? $finalArr[$key]['advertiserName'] = $advertiserList[$value['advertiserId']]['name'] : false;
  686.                 array_key_exists($value['affiliateId'], $affiliateList) ? $finalArr[$key]['affiliateName'] = $affiliateList[$value['affiliateId']]['name'] : false;
  687.                 $finalArr[$key]['goalInfo'] = array_values($value['goalInfo']);
  688.                 $value['goalConversions'] > && $value['installConversions'] > $finalArr[$key]['retentionPercentage'] = round((($value['goalConversions'] / $value['installConversions']) * 100), 2) : false;
  689.             }
  690.         }
  691.         //        echo json_encode($finalArr);die;
  692.         $tableColumns $this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::RETENTION_REPORT]);
  693.         $finalArr $this->commonCalls->getReportsRowWiseDataByAggregation($tableColumns$selectedColumns$finalArr);
  694.         if ($downloadDataAsCSV) {
  695.             $this->commonCalls->downloadCSV($tableColumns$finalArr'Retention Report ' $dateStart '_' $dateEnd);
  696.         } else {
  697.             return new JsonResponse($this->commonCalls->getPaginatedResponseForReports($finalArr$tableColumns$selectedColumns$sortBy$sortType$limit$page));
  698.         }
  699.     }
  700.     /**
  701.      * @Route("/am-side-fraud-report", name="get_fraud_report_am_side", methods={"GET"})
  702.      */
  703.     public function getFraudReportAmSideAction(Request $request)
  704.     {
  705.         $filtersSelected $request->query->get('filters');
  706.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters');
  707.         $filters = [];
  708.         $excludedFiltersFlags = [];
  709.         if (isset($filtersSelected)) {
  710.             foreach ($filtersSelected as $key => $value) {
  711.                 $key === Config::MULTISELECT_MMP_TUNE_OFFERS $filters['offerId'] = $value false;
  712.                 $key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS $filters['advertiserId'] = $value false;
  713.                 $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES $filters['affiliateId'] = $value false;
  714.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $filters['affiliateCategory'] = $value false;
  715.             }
  716.         }
  717.         if (isset($excludedFlagForFilters)) {
  718.             foreach ($excludedFlagForFilters as $key => $value) {
  719.                 $value = (int)$value;
  720.                 $key === Config::MULTISELECT_MMP_TUNE_OFFERS $excludedFiltersFlags['offerId'] = $value false;
  721.                 $key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS $excludedFiltersFlags['advertiserId'] = $value false;
  722.                 $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES $excludedFiltersFlags['affiliateId'] = $value false;
  723.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $excludedFiltersFlags['affiliateCategory'] = $value false;
  724.             }
  725.         }
  726.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  727.         $groupedColumns $request->query->get('groups') != '' $request->query->get('groups') : [];
  728.         $dateStart date('Y-m-d'strtotime($request->query->get('startDate')));
  729.         $dateEnd date('Y-m-d'strtotime($request->query->get('endDate')));
  730.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_MMP_REPORT_DEFAULT_SORT_BY;
  731.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  732.         $page $request->query->get('currentPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  733.         $limit $request->query->get('perPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  734.         $downloadDataAsCSV $request->query->get('downloadCSV') == true false;
  735.         $affiliateCategoriesByAffiliateId $this->commonCalls->getAffiliateCategoryByAffiliateId();
  736.         $groups = ['partner''affiliate''product'];
  737.         $data $this->metrics24APICalls->getFraudReport($groups, [], [], [], [], [], $dateStart$dateEnd);
  738.         $distinctOfferIds = [];
  739.         $hoConversionData = [];
  740.         $fraudData = [];
  741.         foreach ($data as $key => $value) {
  742.             $index $value['product'] . '#' $value['affiliate'];
  743.             if (!array_key_exists($index$fraudData)) {
  744.                 $fraudData[$index] = [
  745.                     'offerId' => $value['product'],
  746.                     'offerName' => $value['product_label'],
  747.                     'affiliateId' => $value['affiliate'],
  748.                     'affiliateName' => $value['affiliate_label'],
  749.                     'affiliateCategory' => array_key_Exists($value['affiliate'], $affiliateCategoriesByAffiliateId) ? $affiliateCategoriesByAffiliateId[$value['affiliate']]['category'] : Config::HASOFFER_AFFILIATE_CATEGORY_UNCATEGORISED_TAG_NAME,
  750.                     'advertiserId' => $value['partner'],
  751.                     'advertiserName' => $value['partner_label'],
  752.                     'totalConversions' => 0,
  753.                     'approvedConversions' => 0,
  754.                     'rejectedConversions' => 0,
  755.                     'rejectionRate' => 0,
  756.                     'approvalRate' => 0,
  757.                     'tuneTotalConversions' => 0,
  758.                     'nonEmptyAdvSub1' => 0
  759.                 ];
  760.             }
  761.             foreach ($filters as $k => $v) {
  762.                 if (
  763.                     array_key_exists($k$fraudData[$index]) &&
  764.                     (
  765.                         (
  766.                             in_array($fraudData[$index][$k], $v) &&
  767.                             $excludedFiltersFlags[$k]
  768.                         ) ||
  769.                         (
  770.                             !in_array($fraudData[$index][$k], $v) &&
  771.                             !$excludedFiltersFlags[$k]
  772.                         )
  773.                     )
  774.                 ) {
  775.                     unset($fraudData[$index]);
  776.                     continue 2;
  777.                 }
  778.             }
  779.             $fraudData[$index]['totalConversions'] += $value['conversion'];
  780.             $fraudData[$index]['approvedConversions'] += $value['approved'];
  781.             $fraudData[$index]['rejectedConversions'] += $value['rejected'];
  782.             !in_array($value['product'], $distinctOfferIds) ? array_push($distinctOfferIds$value['product']) : false;
  783.         }
  784.         if ($distinctOfferIds) {
  785.             $apiPage 1;
  786.             $apiLimit 100000;
  787.             $hoApiResponse $this->brandHasofferApi->getStatsForFraudReport([], $distinctOfferIds$dateStart$dateEnd$apiPage$apiLimit);
  788.             while ($hoApiResponse['response']['data']['data']) {
  789.                 foreach ($hoApiResponse['response']['data']['data'] as $key => $value) {
  790.                     $index $value['Stat']['offer_id'] . '#' $value['Stat']['affiliate_id'];
  791.                     if (array_key_exists($index$fraudData)) {
  792.                         $fraudData[$index]['tuneTotalConversions'] += 1;
  793.                         if ($value['Stat']['advertiser_info'] != '') {
  794.                             $fraudData[$index]['nonEmptyAdvSub1'] += 1;
  795.                         }
  796.                     }
  797.                 }
  798.                 $apiPage += 1;
  799.                 $hoApiResponse $this->brandHasofferApi->getStatsForFraudReport([], $distinctOfferIds$dateStart$dateEnd$apiPage$apiLimit);
  800.             }
  801.         }
  802.         $tableColumns $this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::AM_SIDE_FRAUD_REPORT]);
  803.         $finalArr $this->commonCalls->getReportsRowWiseDataByAggregation($tableColumns$selectedColumns$fraudData);
  804.         foreach ($finalArr as $key => $value) {
  805.             if ($value['totalConversions'] > 0) {
  806.                 $finalArr[$key]['rejectionPercentage'] = round((($value['rejectedConversions'] / $value['totalConversions']) * 100), 2);
  807.                 $finalArr[$key]['approvalPercentage'] = round((($value['approvedConversions'] / $value['totalConversions']) * 100), 2);
  808.             }
  809.         }
  810.         if ($downloadDataAsCSV) {
  811.             $this->commonCalls->downloadCSV($tableColumns$finalArr'AM Side Fraud Report ' $dateStart '_' $dateEnd);
  812.         } else {
  813.             return new JsonResponse($this->commonCalls->getPaginatedResponseForReports($finalArr$tableColumns$selectedColumns$sortBy$sortType$limit$page));
  814.         }
  815.     }
  816.     /**
  817.      * @Route("/pm-side-fraud-report", name="get_fraud_report_pm_side", methods={"GET"})
  818.      */
  819.     public function getFraudReportPmSideAction(Request $request)
  820.     {
  821.         $filtersSelected $request->query->get('filters');
  822.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters');
  823.         $filters = [];
  824.         $excludedFiltersFlags = [];
  825.         if (isset($filtersSelected)) {
  826.             foreach ($filtersSelected as $key => $value) {
  827.                 $key === Config::MULTISELECT_MMP_OFFERS $filters['offerId'] = $value false;
  828.                 $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES $filters['affiliateId'] = $value false;
  829.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $filters['affiliateCategory'] = $value false;
  830.             }
  831.         }
  832.         if (isset($excludedFlagForFilters)) {
  833.             foreach ($excludedFlagForFilters as $key => $value) {
  834.                 $value = (int)$value;
  835.                 $key === Config::MULTISELECT_MMP_OFFERS $excludedFiltersFlags['offerId'] = $value false;
  836.                 $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES $excludedFiltersFlags['affiliateId'] = $value false;
  837.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $excludedFiltersFlags['affiliateCategory'] = $value false;
  838.             }
  839.         }
  840.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  841.         $groupedColumns $request->query->get('groups') != '' $request->query->get('groups') : [];
  842.         $dateStart date('Y-m-d'strtotime($request->query->get('startDate')));
  843.         $dateEnd date('Y-m-d'strtotime($request->query->get('endDate')));
  844.         $eventTimestampFrom strtotime($dateStart);
  845.         $eventTimeStampTo strtotime($dateEnd);
  846.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_MMP_REPORT_DEFAULT_SORT_BY;
  847.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  848.         $page $request->query->get('currentPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  849.         $limit $request->query->get('perPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  850.         $subIds $request->query->get('subIds') != '' $request->query->get('subIds') : [];
  851.         $offerIds $request->query->get('offerIds') != '' $request->query->get('offerIds') : [];
  852.         $affiliateIds $request->query->get('affiliateIds') != '' $request->query->get('affiliateIds') : [];
  853.         $downloadDataAsCSV $request->query->get('downloadCSV') == true false;
  854.         $groups = ['sub_id''affiliate''product'];
  855.         $data $this->metrics24APICalls->getFraudReport($groups$affiliateIds$subIds, [], $offerIds, [], $dateStart$dateEnd);
  856.         $affiliateCategoriesByAffiliateId $this->commonCalls->getAffiliateCategoryByAffiliateId();
  857.         $fraudData = [];
  858.         $distinctOfferIds = [];
  859.         $hoConversionData = [];
  860.         foreach ($data as $key => $value) {
  861.             $index $value['product'] . '#' $value['affiliate'] . '#' $value['sub_id'];
  862.             if (!array_key_exists($index$fraudData)) {
  863.                 $fraudData[$index] = [
  864.                     'offerId' => $value['product'],
  865.                     'offerName' => $value['product_label'],
  866.                     'affiliateId' => $value['affiliate'],
  867.                     'affiliateName' => $value['affiliate_label'],
  868.                     'affiliateCategory' => array_key_Exists($value['affiliate'], $affiliateCategoriesByAffiliateId) ? $affiliateCategoriesByAffiliateId[$value['affiliate']]['category'] : Config::HASOFFER_AFFILIATE_CATEGORY_UNCATEGORISED_TAG_NAME,
  869.                     'source' => $value['sub_id'],
  870.                     'totalConversions' => 0,
  871.                     'approvedConversions' => 0,
  872.                     'rejectedConversions' => 0,
  873.                     'rejectionPercentage' => 0,
  874.                     'approvalPercentage' => 0,
  875.                     'tuneTotalConversions' => 0,
  876.                     'nonEmptyAdvSub1' => 0,
  877.                 ];
  878.             }
  879.             foreach ($filters as $k => $v) {
  880.                 if (
  881.                     array_key_exists($k$fraudData[$index]) &&
  882.                     (
  883.                         (
  884.                             in_array($fraudData[$index][$k], $v) &&
  885.                             $excludedFlagForFilters[$k]
  886.                         ) ||
  887.                         (
  888.                             !in_array($fraudData[$index][$k], $v) &&
  889.                             !$excludedFlagForFilters[$k]
  890.                         )
  891.                     )
  892.                 ) {
  893.                     unset($fraudData[$index]);
  894.                     continue 2;
  895.                 }
  896.             }
  897.             $fraudData[$index]['totalConversions'] += $value['conversion'];
  898.             $fraudData[$index]['approvedConversions'] += $value['approved'];
  899.             $fraudData[$index]['rejectedConversions'] += $value['rejected'];
  900.             !in_array($value['product'], $distinctOfferIds) ? array_push($distinctOfferIds$value['product']) : false;
  901.         }
  902.         if ($distinctOfferIds) {
  903.             $apiPage 1;
  904.             $apiLimit 100000;
  905.             $hoApiResponse $this->brandHasofferApi->getStatsForFraudReport([], $distinctOfferIds$dateStart$dateEnd$apiPage$apiLimit);
  906.             while ($hoApiResponse['response']['data']['data']) {
  907.                 foreach ($hoApiResponse['response']['data']['data'] as $key => $value) {
  908.                     $index $value['Stat']['offer_id'] . '#' $value['Stat']['affiliate_id'] . '#' $value['Stat']['source'];
  909.                     if (array_key_exists($index$fraudData)) {
  910.                         $fraudData[$index]['tuneTotalConversions'] += 1;
  911.                         if ($value['Stat']['advertiser_info'] != '') {
  912.                             $fraudData[$index]['nonEmptyAdvSub1'] += 1;
  913.                         }
  914.                     }
  915.                 }
  916.                 $apiPage += 1;
  917.                 $hoApiResponse $this->brandHasofferApi->getStatsForFraudReport([], $distinctOfferIds$dateStart$dateEnd$apiPage$apiLimit);
  918.             }
  919.         }
  920.         $tableColumns $this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::PM_SIDE_FRAUD_REPORT]);
  921.         $finalArr $this->commonCalls->getReportsRowWiseDataByAggregation($tableColumns$selectedColumns$fraudData);
  922.         foreach ($fraudData as $key => $value) {
  923.             if ($value['totalConversions'] > 0) {
  924.                 $fraudData[$key]['rejectionPercentage'] = round((($value['rejectedConversions'] / $value['totalConversions']) * 100), 2);
  925.                 $fraudData[$key]['approvalPercentage'] = round((($value['approvedConversions'] / $value['totalConversions']) * 100), 2);
  926.             }
  927.         }
  928.         if ($downloadDataAsCSV) {
  929.             $this->commonCalls->downloadCSV($tableColumns$finalArr'PM Side Fraud Report ' $dateStart '_' $dateEnd);
  930.         } else {
  931.             return new JsonResponse($this->commonCalls->getPaginatedResponseForReports($finalArr$tableColumns$selectedColumns$sortBy$sortType$limit$page));
  932.         }
  933.     }
  934.     /**
  935.      * @Route("/skad-conversions", name="get_skad_conversions", methods={"GET"})
  936.      */
  937.     public function getSkadConversionsAction(Request $request)
  938.     {
  939.         $dateStart date('Y-m-d'strtotime($request->query->get('dateStart')));
  940.         $dateEnd date('Y-m-d'strtotime($request->query->get('dateEnd')));
  941.         $advertiserIds $request->query->get('advertiserIds') != '' $request->query->get('advertiserIds') : [];
  942.         $offerIds $request->query->get('offerIds') != '' $request->query->get('offerIds') : [];
  943.         $affiliateIds $request->query->get('affiliateIds') != '' $request->query->get('affiliateIds') : [];
  944.         $subIds $request->query->get('subIds') != '' $request->query->get('subIds') : [];
  945.         $downloadDataAsCSV $request->query->get('downloadCSV') == true false;
  946.         $data = [];
  947.         $page 1;
  948.         $limit 100000;
  949.         $hoApiResponse $this->brandHasofferApi->getStatsForSkadConversions($affiliateIds$advertiserIds$offerIds$subIds$dateStart$dateEnd$limit$page);
  950.         while ($hoApiResponse['response']['data']['data']) {
  951.             $data array_values(array_merge($data$hoApiResponse['response']['data']['data']));
  952.             $page += 1;
  953.             $hoApiResponse $this->brandHasofferApi->getStatsForSkadConversions($affiliateIds$advertiserIds$offerIds$subIds$dateStart$dateEnd$limit$page);
  954.         }
  955.         $skadAppIds = [];
  956.         $skadNetworkPostbackData $this->doctrine->getRepository('App\Entity\SkadNetworkPostbackLogs')->getSkadNetworkPostbackData();
  957.         foreach ($skadNetworkPostbackData as $key => $value) {
  958.             if (!in_array($value['appId'], $skadAppIds)) {
  959.                 array_push($skadAppIds$value['appId']);
  960.             }
  961.         }
  962.         $distinctOfferIds $report = [];
  963.         foreach ($data as $key => $value) {
  964.             if ($value['Stat']['affiliate_info5'] !== '' && in_array($skadAppIds$value['Stat']['affiliate_info5'])) {
  965.                 $index md5($value['Stat']['affiliate_id'] . '#' $value['Stat']['offer_id'] . '#' $value['Stat']['source']);
  966.                 if (!array_key_exists($index$report)) {
  967.                     $report[$index] = [
  968.                         'affiliateId' => $value['Stat']['affiliate_id'],
  969.                         'affiliateName' => '',
  970.                         'offerId' => $value['Stat']['offer_id'],
  971.                         'offerName' => '',
  972.                         'source' => $value['Stat']['source'],
  973.                         'advertiserId' => $value['Stat']['advertiser_id'],
  974.                         'advertiserName' => '',
  975.                         'conversions' => 0,
  976.                         'clicks' => 0,
  977.                     ];
  978.                     !in_array($value['Stat']['offer_id'], $distinctOfferIds) ? array_push($distinctOfferIds$value['Stat']['offer_id']) : false;
  979.                 }
  980.                 $report[$index]['conversions'] += $value['Stat']['conversions'];
  981.                 $report[$index]['clicks'] += $value['Stat']['clicks'];
  982.             }
  983.         }
  984.         $offerInfo = [];
  985.         $distinctOfferIds $offerInfo $this->commonCalls->getOfferInfoByKey($distinctOfferIds) : false;
  986.         $advertiserList $this->commonCalls->getAdvertisersListByStatusWithKeys();
  987.         $affiliateList $this->commonCalls->getAffiliateListByStatusWithKeys();
  988.         foreach ($report as $key => $value) {
  989.             array_key_exists($value['advertiserId'], $advertiserList) ? $report[$key]['advertiserName'] = $advertiserList[$value['advertiserId']]['name'] : false;
  990.             array_key_exists($value['affiliateId'], $affiliateList) ? $report[$key]['affiliateName'] = $affiliateList[$value['affiliateId']]['name'] : false;
  991.             if (array_key_exists($value['offerId'], $offerInfo)) {
  992.                 $report[$key]['offerName'] = $offerInfo[$value['offerId']]['name'];
  993.             }
  994.         }
  995.         $report array_values($report);
  996.         array_multisort(array_column($report'conversions'), SORT_DESC$report);
  997.         if ($downloadDataAsCSV) {
  998.             $header = [
  999.                 'Offer Id',
  1000.                 'Offer Name',
  1001.                 'Advertiser Id',
  1002.                 'Advertiser Name',
  1003.                 'Affiliate Id',
  1004.                 'Affiliate Name',
  1005.                 'Source',
  1006.                 'Conversions',
  1007.                 'Clicks',
  1008.             ];
  1009.             $rows = [$header];
  1010.             foreach ($report as $key => $value) {
  1011.                 $rows[] = [
  1012.                     $value['offerId'],
  1013.                     $value['offerName'],
  1014.                     $value['advertiserId'],
  1015.                     $value['advertiserName'],
  1016.                     $value['affiliateId'],
  1017.                     $value['affiliateName'],
  1018.                     $value['source'],
  1019.                     $value['conversions'],
  1020.                     $value['clicks'],
  1021.                 ];
  1022.             }
  1023.             $spreadsheet = new Spreadsheet();
  1024.             $spreadsheet->getProperties()->setCreator('MAFO')
  1025.                 ->setLastModifiedBy('MAFO')
  1026.                 ->setTitle('SKAD Conversions Report')
  1027.                 ->setSubject('SKAD Conversions Report')
  1028.                 ->setDescription('SKAD Conversions Report');
  1029.             $spreadsheet->getActiveSheet()
  1030.                 ->fromArray(
  1031.                     $rows,
  1032.                     NULL,
  1033.                     'A1'
  1034.                 );
  1035.             header('Content-Type: application/vnd.ms-excel');
  1036.             header('Content-Disposition: attachment;filename="skad-conversions-report' $dateStart '_' $dateEnd '.xls"');
  1037.             header('Cache-Control: max-age=0');
  1038.             $writer IOFactory::createWriter($spreadsheet'Xls');
  1039.             $writer->save('php://output');
  1040.             exit;
  1041.         } else {
  1042.             return new JsonResponse($report);
  1043.         }
  1044.     }
  1045.     /**
  1046.      * @Route("/mmp-report", name="get_mmp_report", methods={"GET"})
  1047.      */
  1048.     public function getMmpReportAction(Request $request)
  1049.     {
  1050.         //        ini_set('max_execution_time', '300');
  1051.         //        ini_set('max_input_time', '300');
  1052.         //        ini_set('default_socket_timeout', '300');
  1053.         $filtersSelected $request->query->get('filters');
  1054.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters');
  1055.         $filters = [];
  1056.         $excludedFiltersFlags = [];
  1057.         if (isset($filtersSelected)) {
  1058.             foreach ($filtersSelected as $key => $value) {
  1059.                 $key === Config::MULTISELECT_MMP_STATISTICS_APP $filters['appIds'] = $value false;
  1060.                 $key === Config::MULTISELECT_MMP_OFFERS $filters['offers'] = $value false;
  1061.                 $key === Config::MULTISELECT_MMP_SOURCE_GLOBAL_NETWORK_REPORT $filters['mmpSource'] = $value false;
  1062.                 $key === Config::MULTISELECT_MMP_PARTNERS $filters['affiliates'] = $value false;
  1063.                 $key === Config::MULTISELECT_MMP_MAKER_OF_OFFER_RULE_IN_MMP_OFFERS $filters['users'] = $value false;
  1064.                 $key === Config::MULTISELECT_GEO $filters['geos'] = $value false;
  1065.                 $key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS $filters['advertiserIds'] = $value false;
  1066.                 $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES $filters['hoAffiliateIds'] = $value false;
  1067.                 $key === Config::MULTISELECT_MMP_EVENTS $filters['events'] = $value false;
  1068.                 $key === Config::MULTISELECT_MMP_TUNE_OFFERS $filters['hoOfferIds'] = $value false;
  1069.                 $key === Config::MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS $filters['advertiserManagerEmailIds'] = $value false;
  1070.                 $key === Config::MULTISELECT_AFFILIATE_MANAGER_FROM_MAFO_USERS $filters['affiliateManagerEmailIds'] = $value false;
  1071.                 $key === Config::MULTISELECT_ADVERTISER_MOBUPPS_TEAM $filters['advertiserMobuppsTeam'] = $value false;
  1072.                 $key === Config::MULTISELECT_AFFILIATE_MOBUPPS_TEAM $filters['affiliateMobuppsTeam'] = $value false;
  1073.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $filters['affiliateCategories'] = $value false;
  1074.             }
  1075.         }
  1076.         if (isset($excludedFlagForFilters)) {
  1077.             foreach ($excludedFlagForFilters as $key => $value) {
  1078.                 $value = (int)$value;
  1079.                 $key === Config::MULTISELECT_MMP_STATISTICS_APP $excludedFiltersFlags['appIds'] = $value false;
  1080.                 $key === Config::MULTISELECT_MMP_OFFERS $excludedFiltersFlags['offers'] = $value false;
  1081.                 $key === Config::MULTISELECT_MMP_SOURCE_GLOBAL_NETWORK_REPORT $excludedFiltersFlags['mmpSource'] = $value false;
  1082.                 $key === Config::MULTISELECT_MMP_PARTNERS_FOR_MMP_REPORT $excludedFiltersFlags['affiliates'] = $value false;
  1083.                 $key === Config::MULTISELECT_MMP_MAKER_OF_OFFER_RULE_IN_MMP_OFFERS $excludedFiltersFlags['users'] = $value false;
  1084.                 $key === Config::MULTISELECT_GEO $excludedFiltersFlags['geos'] = $value false;
  1085.                 $key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS $excludedFiltersFlags['advertiserIds'] = $value false;
  1086.                 $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES $excludedFiltersFlags['hoAffiliateIds'] = $value false;
  1087.                 $key === Config::MULTISELECT_MMP_EVENTS $excludedFiltersFlags['events'] = $value false;
  1088.                 $key === Config::MULTISELECT_MMP_TUNE_OFFERS $excludedFiltersFlags['hoOfferIds'] = $value false;
  1089.                 $key === Config::MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS $excludedFiltersFlags['advertiserManagerEmailIds'] = $value false;
  1090.                 $key === Config::MULTISELECT_AFFILIATE_MANAGER_FROM_MAFO_USERS $excludedFiltersFlags['affiliateManagerEmailIds'] = $value false;
  1091.                 $key === Config::MULTISELECT_ADVERTISER_MOBUPPS_TEAM $excludedFiltersFlags['advertiserMobuppsTeam'] = $value false;
  1092.                 $key === Config::MULTISELECT_AFFILIATE_MOBUPPS_TEAM $excludedFiltersFlags['affiliateMobuppsTeam'] = $value false;
  1093.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $excludedFiltersFlags['affiliateCategories'] = $value false;
  1094.             }
  1095.         }
  1096.         if ($request->query->get('reportName') && $request->query->get('reportName') === Config::MMP_REPORT) {
  1097.             if (!isset($filters['mmpSource'])) {
  1098.                 $filters['mmpSource'] = [...Config::ACTIVE_APPSFLYER_ACCOUNTSConfig::MMP_TRACKING_SYSTEM_ADJUST];
  1099.             }
  1100.             if (isset($excludedFiltersFlags['mmpSource']) && $excludedFiltersFlags['mmpSource']) {
  1101.                 $filters['mmpSource'][] = Config::MMP_TRACKING_SYSTEM_TUNE;
  1102.             }
  1103.         }
  1104.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  1105.         $groupedColumns $request->query->get('groups') != '' $request->query->get('groups') : [];
  1106.         $dateStart $request->query->get('startDate');
  1107.         $dateEnd $request->query->get('endDate');
  1108.         $eventTimestampFrom strtotime($dateStart);
  1109.         $eventTimeStampTo strtotime($dateEnd);
  1110.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_MMP_REPORT_DEFAULT_SORT_BY;
  1111.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  1112.         $page $request->query->get('currentPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1113.         $limit $request->query->get('perPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  1114.         $downloadDataAsCSV $request->query->get('downloadCSV') == 1;
  1115.         $finalReportData = [];
  1116.         if ($eventTimeStampTo $eventTimestampFrom 45 24 60 60) {
  1117.             $finalReportData $this->mmpComponents->getMmpCumulativeData($filters$excludedFiltersFlags$eventTimestampFrom$eventTimeStampTo$selectedColumns$groupedColumns);
  1118.         }
  1119.         $totalPayout 0;
  1120.         $totalRevenue 0;
  1121.         $totalProfit 0;
  1122.         foreach ($finalReportData as $key => $value) {
  1123.             isset($value['totalPayout']) ? $totalPayout += $value['totalPayout'] : false;
  1124.             isset($value['profit']) ? $totalProfit += $value['profit'] : false;
  1125.         }
  1126.         $totalPayout round($totalPayout2);
  1127.         $totalRevenue round($totalRevenue2);
  1128.         $totalProfit round($totalProfit2);
  1129.         $footerArr = [
  1130.             'totalPayout' => $totalPayout,
  1131.             'profit' => $totalProfit,
  1132.         ];
  1133.         $showFraudData sizeof(
  1134.             array_intersect(
  1135.                 array_values(
  1136.                     array_diff(
  1137.                         array_column($this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::MMP_FRAUD_REPORT]), 'accessor'),
  1138.                         array_column(array_values(Config::REPORT_COLUMN_MAPPING[Config::REPORT_MMP_MACRO]), 'accessor')
  1139.                     )
  1140.                 ),
  1141.                 array_keys($selectedColumns)
  1142.             )
  1143.         );
  1144.         $tableColumns Config::REPORT_MMP_STATISTICS_COLUMNS;
  1145.         if ($showFraudData) {
  1146.             $tableColumns $this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::MMP_FRAUD_REPORT]);
  1147.         }
  1148.         foreach ($tableColumns as $key => $value) {
  1149.             $tableColumns[$key]['show'] = false;
  1150.             foreach ($selectedColumns as $k => $v) {
  1151.                 if ($value['accessor'] === $k && $v !== 'undefined') {
  1152.                     $tableColumns[$key]['show'] = $v == '0' false true;
  1153.                     break;
  1154.                 }
  1155.             }
  1156.             foreach ($groupedColumns as $k => $v) {
  1157.                 if ($value['accessor'] === $k && $v !== 'undefined') {
  1158.                     $tableColumns[$key]['groupBy'] = !($v == '0');
  1159.                     !($v == '0') ? $tableColumns[$key]['show'] = true null;
  1160.                     break;
  1161.                 }
  1162.             }
  1163.             if (in_array($value['accessor'], array_keys($footerArr))) {
  1164.                 $tableColumns[$key]['Footer'] = $footerArr[$value['accessor']];
  1165.             }
  1166.         }
  1167.         if ($downloadDataAsCSV) {
  1168.             $header = [];
  1169.             foreach ($tableColumns as $key => $value) {
  1170.                 if ($value['show'] == 1) {
  1171.                     array_push($header$value['header']);
  1172.                 }
  1173.             }
  1174.             $rows = [$header];
  1175.             foreach ($finalReportData as $key => $value) {
  1176.                 $row = [];
  1177.                 foreach ($tableColumns as $k => $v) {
  1178.                     if ($v['show'] == 1) {
  1179.                         array_push($row$value[$v['accessor']]);
  1180.                     }
  1181.                 }
  1182.                 $rows[] = $row;
  1183.             }
  1184.             $spreadsheet = new Spreadsheet();
  1185.             $spreadsheet->getProperties()->setCreator('MAFO')->setLastModifiedBy('MAFO')->setTitle('Mmp Statistics Report')->setSubject('Mmp Statistics')->setDescription('Mmp Statistics');
  1186.             $spreadsheet->getActiveSheet()->fromArray($rowsnull'A1');
  1187.             header('Content-Type: application/vnd.ms-excel');
  1188.             header('Content-Disposition: attachment;filename="mmp statistics ' $dateStart '_' $dateEnd '.xls"');
  1189.             header('Cache-Control: max-age=0');
  1190.             $writer IOFactory::createWriter($spreadsheet'Xls');
  1191.             $writer->save('php://output');
  1192.             exit;
  1193.         } else {
  1194.             $finalReportData array_values($finalReportData);
  1195.             if (sizeof($finalReportData)) {
  1196.                 $entity $finalReportData[0];
  1197.                 if (array_key_exists($sortBy$entity)) {
  1198.                     $sortFlag 3;
  1199.                     if ($sortType == Config::SORT_TYPE_ASC) {
  1200.                         $sortFlag 4;
  1201.                     }
  1202.                     array_multisort(array_column($finalReportData$sortBy), $sortFlag$finalReportData);
  1203.                 }
  1204.             }
  1205.             $offset $limit * ($page 1);
  1206.             $totalRecordCount sizeof($finalReportData);
  1207.             $noOfPages ceil($totalRecordCount $limit);
  1208.             return new JsonResponse([
  1209.                 'response' => [
  1210.                     'success' => true,
  1211.                     'httpStatus' => Config::HTTP_STATUS_CODE_OK,
  1212.                     'data' => [
  1213.                         'tableColumns' => $tableColumns,
  1214.                         'data' => array_slice($finalReportData$offset$limit),
  1215.                         'metaData' => [
  1216.                             'total' => $totalRecordCount,
  1217.                             'limit' => (int)$limit,
  1218.                             'page' => (int)$page,
  1219.                             'pages' => (int)$noOfPages,
  1220.                         ]
  1221.                     ],
  1222.                     'error' => null
  1223.                 ]
  1224.             ], Config::HTTP_STATUS_CODE_OK);
  1225.         }
  1226.     }
  1227.     /**
  1228.      * @Route("/advertiser-report", name="get_advertiser_report", methods={"GET"})
  1229.      */
  1230.     public function getAdvertiserReportAction(Request $request)
  1231.     {
  1232.         $fields $filters = [];
  1233.         $sortBy $request->query->get('sortBy') ?? 'Stat##clicks';
  1234.         $sortType $request->query->get('sortType') ?? Config::DATABASE_OFFERS_DEFAULT_SORT_TYPE;
  1235.         $page $request->query->get('currentPage') ?? Config::DATABASE_OFFERS_DEFAULT_PAGE_NUMBER;
  1236.         $limit $request->query->get('perPage') ?? Config::DATABASE_OFFERS_DEFAULT_PAGE_SIZE;
  1237.         $fieldsRaw $request->query->get('data') ?? [];
  1238.         $filtersRaw $request->query->get('filters') ?? [];
  1239.         $hourOffset $this->commonCalls->getHourOffsetFromTimezoneString($request->query->get('timezone'));
  1240.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters') ?? [];
  1241.         $startDate date('Y-m-d'strtotime($request->query->get('startDate')));
  1242.         $endDate date('Y-m-d'strtotime($request->query->get('endDate')));
  1243.         $downloadDataAsCSV $request->query->get('downloadCSV') == true false;
  1244.         foreach ($fieldsRaw as $key => $value) {
  1245.             if ($value == 1) {
  1246.                 array_push($fieldsstr_replace(Config::REPORT_ADVERTISER_ACCESSOR_SEPARATOR'.'$key));
  1247.             }
  1248.         }
  1249.         foreach ($filtersRaw as $key => $value) {
  1250.             $filters[$key] = [
  1251.                 'conditional' => array_key_exists($key$excludedFlagForFilters) ? $excludedFlagForFilters[$key] == 'NOT_EQUAL_TO' 'EQUAL_TO' 'EQUAL_TO',
  1252.                 'values' => str_replace(Config::REPORT_ADVERTISER_ACCESSOR_SEPARATOR'.'$value),
  1253.             ];
  1254.         }
  1255.         $filters['Stat.date'] = [
  1256.             'conditional' => 'BETWEEN',
  1257.             'values' => [$startDate$endDate]
  1258.         ];
  1259.         $sort = [str_replace(Config::REPORT_ADVERTISER_ACCESSOR_SEPARATOR'.'$sortBy) => $sortType];
  1260.         $hoStatsData $this->brandHasofferApi->getStatsForAdvertiserReport($fields$filters$startDate$endDate$limit$page$sort$hourOffset);
  1261.         $error null;
  1262.         $statsData $metaData $col = [];
  1263.         $savedCols Config::REPORT_ADVERTISER_COLUMNS;
  1264.         foreach ($savedCols as $key => $value) {
  1265.             $value['accessor'] = str_replace("."'##'$value['accessor']);
  1266.             $col[] = $value;
  1267.         }
  1268.         if ($hoStatsData['response']['status'] === 1) {
  1269.             $metaData = [
  1270.                 'total' => $hoStatsData['response']['data']['count'],
  1271.                 'limit' => $hoStatsData['response']['data']['current'],
  1272.                 'page' => $hoStatsData['response']['data']['page'],
  1273.                 'pages' => $hoStatsData['response']['data']['pageCount'],
  1274.             ];
  1275.             $hoStatsData $hoStatsData['response']['data']['data'];
  1276.             foreach ($hoStatsData as $key => $value) {
  1277.                 $temp = [];
  1278.                 foreach ($value as $kk => $vv) {
  1279.                     foreach ($vv as $k => $v) {
  1280.                         if ($this->commonCalls->checkForString($k'@')) {
  1281.                             $k explode('@'$k)[0];
  1282.                         }
  1283.                         if (array_key_exists('decimal'$savedCols[$kk '.' $k])) {
  1284.                             $v round($v$savedCols[$kk '.' $k]['decimal']);
  1285.                         }
  1286.                         $temp[$kk '##' $k] = $v;
  1287.                     }
  1288.                 }
  1289.                 if ($temp) {
  1290.                     $statsData[] = $temp;
  1291.                 }
  1292.             }
  1293.         } else {
  1294.             $error $hoStatsData['response']['errorMessage'];
  1295.         }
  1296.         foreach ($col as $key => $value) {
  1297.             $col[$key]['show'] = false;
  1298.             foreach ($fieldsRaw as $k => $v) {
  1299.                 if ($value['accessor'] === $k && $v !== 'undefined') {
  1300.                     $col[$key]['show'] = $v == '0' false true;
  1301.                     break;
  1302.                 }
  1303.             }
  1304.         }
  1305.         if ($downloadDataAsCSV) {
  1306.             $header = [];
  1307.             foreach ($col as $key => $value) {
  1308.                 if ($value['show'] === true) {
  1309.                     $header[$value['accessor']] = $value['Header'];
  1310.                     //                    array_push($header, $value['Header']);
  1311.                 }
  1312.             }
  1313.             $rows = [array_values($header)];
  1314.             foreach ($statsData as $key => $value) {
  1315.                 $temp = [];
  1316.                 foreach ($header as $k => $v) {
  1317.                     $temp[$k] = $value[$k];
  1318.                 }
  1319.                 $rows[] = array_values($temp);
  1320.             }
  1321.             $spreadsheet = new Spreadsheet();
  1322.             $spreadsheet->getProperties()->setCreator('MAFO')
  1323.                 ->setLastModifiedBy('MAFO')->setTitle('Advertiser Report')->setSubject('Advertiser Report')->setDescription('Advertiser Report');
  1324.             $spreadsheet->getActiveSheet()->fromArray($rowsnull'A1');
  1325.             header('Content-Type: application/vnd.ms-excel');
  1326.             header('Content-Disposition: attachment;filename="advertiser-report ' $startDate '_' $endDate '.xls"');
  1327.             header('Cache-Control: max-age=0');
  1328.             $writer IOFactory::createWriter($spreadsheet'Xls');
  1329.             $writer->save('php://output');
  1330.             exit;
  1331.         } else {
  1332.             return new JsonResponse([
  1333.                 'response' => [
  1334.                     'success' => true,
  1335.                     'httpStatus' => Config::HTTP_STATUS_CODE_OK,
  1336.                     'data' => [
  1337.                         'tableColumns' => $col,
  1338.                         'data' => $statsData,
  1339.                         'metaData' => $metaData
  1340.                     ],
  1341.                     'error' => $error
  1342.                 ]
  1343.             ], Config::HTTP_STATUS_CODE_OK);
  1344.         }
  1345.     }
  1346.     /**
  1347.      * @Route("/deduction-insights", name="get_deduction_insights", methods={"GET"})
  1348.      */
  1349.     public function getDeductionInsightsAction(Request $request)
  1350.     {
  1351.         $filters $request->query->get('filters') ?? [];
  1352.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters') ?? [];
  1353.         $startDate date('Y-m-1'strtotime('-0 month'strtotime($request->query->get('startDate'))));
  1354.         $endDate date('Y-m-1'strtotime('+0 month 'strtotime($request->query->get('endDate'))));
  1355.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  1356.         $groupedColumns $request->query->get('groups') != '' $request->query->get('groups') : [];
  1357.         $downloadDataAsCSV $request->query->get('downloadCSV') == 1;
  1358.         $affiliateIds $affiliateManagerIds $activitySources $statuses $affiliateCategories = [];
  1359.         if (isset($filters)) {
  1360.             foreach ($filters as $key => $value) {
  1361.                 $key === Config::MULTISELECT_AFFILIATES $affiliateIds $value false;
  1362.                 $key === Config::MULTISELECT_AFFILIATE_MANAGERS $affiliateManagerIds $value false;
  1363.                 $key === Config::MULTISELECT_DEDUCTION_CONTROL_ACTIVITY_SOURCE $activitySources $value false;
  1364.                 $key === Config::MULTISELECT_DEDUCTION_CONTROL_STATUSES $statuses $value false;
  1365.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $affiliateCategories $value false;
  1366.             }
  1367.         }
  1368.         $affiliateIdsExcluded $affiliateManagerIdsExcluded $activitySourcesExcluded $statusesExcluded $affiliateCategoriesExcluded false;
  1369.         if (isset($excludedFlagForFilters)) {
  1370.             foreach ($excludedFlagForFilters as $key => $value) {
  1371.                 $key === Config::MULTISELECT_AFFILIATES $affiliateIdsExcluded $value false;
  1372.                 $key === Config::MULTISELECT_AFFILIATE_MANAGERS $affiliateManagerIdsExcluded $value false;
  1373.                 $key === Config::MULTISELECT_DEDUCTION_CONTROL_ACTIVITY_SOURCE $activitySourcesExcluded $value false;
  1374.                 $key === Config::MULTISELECT_DEDUCTION_CONTROL_STATUSES $statusesExcluded $value false;
  1375.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $affiliateCategoriesExcluded $value false;
  1376.             }
  1377.         }
  1378.         $tempAffiliateIds = [];
  1379.         if ($affiliateManagerIds) {
  1380.             $accountManagerData $this->doctrine->getRepository(AffiliateAccountManager::class)->getAccountManagerDataByIdsWithExcludedCondition($affiliateManagerIds$affiliateManagerIdsExcluded);
  1381.             foreach ($accountManagerData as $key => $value) {
  1382.                 $tempAffiliateIds[] = $value['affiliateId'];
  1383.             }
  1384.         }
  1385.         if ($tempAffiliateIds && $affiliateIds) {
  1386.             $tempAffiliateIds array_values(array_unique($tempAffiliateIds));
  1387.             $affiliateIds array_values(array_intersect($affiliateIds$tempAffiliateIds));
  1388.         } elseif ($tempAffiliateIds && !$affiliateIds) {
  1389.             $affiliateIds $tempAffiliateIds;
  1390.         }
  1391.         $affiliateList $this->commonCalls->getAffiliateListByStatusWithKeys();
  1392.         $hyperAffiliateDataRaw $this->doctrine->getRepository(HyperAffiliateData::class)->getHyperAffiliateData($affiliateIds$affiliateIdsExcluded$statuses$statusesExcluded$affiliateCategories$affiliateCategoriesExcluded$startDate$endDate);
  1393.         $distinctAffiliateIds $hyperAffiliateData = [];
  1394.         foreach ($hyperAffiliateDataRaw as $key => $value) {
  1395.             !in_array($value['affiliateId'], $distinctAffiliateIds) ? array_push($distinctAffiliateIds$value['affiliateId']) : false;
  1396.             $md5 md5($value['affiliateId'] . '#' $value['month']->format('Y-m-d'));
  1397.             $hyperAffiliateData[$md5] = $value;
  1398.         }
  1399.         $deductionControlDataRaw $deductionControlData $accountManagersByAffiliateId = [];
  1400.         if ($distinctAffiliateIds) {
  1401.             $accountManagersByAffiliateId $this->commonCalls->getAccountManagerInfoByAffiliateIdArrWithKeys($distinctAffiliateIds);
  1402.             $deductionControlDataRaw $this->doctrine->getRepository(DeductionControl::class)->getDeductionsByAffiliateGrouping($distinctAffiliateIds$affiliateIdsExcluded$activitySources$activitySourcesExcluded$startDate$endDate0);
  1403.         }
  1404.         foreach ($deductionControlDataRaw as $key => $value) {
  1405.             $md5 md5($value['affiliateId'] . '#' $value['deductionPeriod']->format('Y-m-d'));
  1406.             $deductionControlData[$md5][$value['activitySource']] = $value;
  1407.         }
  1408.         $data = [];
  1409.         foreach ($hyperAffiliateData as $key => $value) {
  1410.             $deductedPercentage $deductionValue $activitySource null;
  1411.             if (array_key_exists($key$deductionControlData)) {
  1412.                 foreach ($deductionControlData[$key] as $k => $v) {
  1413.                     $activitySource $deductionControlData[$key][$k]['activitySource'];
  1414.                     $deductionValue $deductionControlData[$key][$k]['deductionValue'];
  1415.                     $value['newCost'] > $deductedPercentage round(($deductionValue $value['newCost'] * 100), 2) : false;
  1416.                 }
  1417.             }
  1418.             $value['affiliate'] = array_key_exists($value['affiliateId'], $affiliateList) ? $affiliateList[$value['affiliateId']]['name'] : '';
  1419.             $value['affiliateManager'] = array_key_exists($value['affiliateId'], $accountManagersByAffiliateId) ? $accountManagersByAffiliateId[$value['affiliateId']]['name'] : '';
  1420.             $value['deductedPercentage'] = $deductedPercentage;
  1421.             $value['deductionValue'] = round($deductionValue2);
  1422.             $value['activitySource'] = $activitySource;
  1423.             $value['monthlyReportCost'] = $value['newCost'];
  1424.             $value['year'] = $value['month']->format('Y');
  1425.             $value['date'] = $value['month']->format('Y-m-d');
  1426.             $value['week'] = $value['month']->format('Y') . $value['month']->format('W');
  1427.             $value['month'] = $value['month']->format('m');
  1428.             $data[] = $value;
  1429.         }
  1430.         $tableColumns $this->commonCalls->changeColumnVisibilityForTable(Config::REPORT_DEDUCTION_INSIGHTS_COLUMNS$selectedColumns$groupedColumns);
  1431.         if ($downloadDataAsCSV) {
  1432.             $this->commonCalls->downloadCSV($tableColumns$data'DEDUCTION INSIGHTS  ' $startDate '_' $endDate);
  1433.         } else {
  1434.             return new JsonResponse([
  1435.                 'response' => [
  1436.                     'success' => true,
  1437.                     'httpStatus' => Config::HTTP_STATUS_CODE_OK,
  1438.                     'data' => [
  1439.                         'tableColumns' => $tableColumns,
  1440.                         'data' => $data,
  1441.                         'metaData' => []
  1442.                     ],
  1443.                     'error' => null
  1444.                 ]
  1445.             ], Config::HTTP_STATUS_CODE_OK);
  1446.         }
  1447.     }
  1448.     /**
  1449.      * @Route("/skad-postbacks", name="get_skad_postbacks", methods={"GET"})
  1450.      */
  1451.     public function getSkadPostbacksAction(Request $request)
  1452.     {
  1453.         $fields $filters = [];
  1454.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY;
  1455.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  1456.         $page $request->query->get('currentPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1457.         $limit $request->query->get('perPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  1458.         $filters $request->query->get('filters') ?? [];
  1459.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters') ?? [];
  1460.         $appIds $campaignIds $endpoints 0;
  1461.         if (isset($filters)) {
  1462.             foreach ($filters as $key => $value) {
  1463.                 $key === Config::MULTISELECT_SKAD_POSTBACKS_APP_IDS $appIds $value false;
  1464.                 $key === Config::MULTISELECT_SKAD_POSTBACKS_CAMPAIGN_IDS $campaignIds $value false;
  1465.                 $key === Config::MULTISELECT_SKAD_POSTBACKS_ENDPOINTS $endpoints $value false;
  1466.             }
  1467.         }
  1468.         $excludedFlagForAppIds $excludedFlagForCampaignIds $excludedFlagForEndpoints false;
  1469.         if (isset($filters)) {
  1470.             foreach ($excludedFlagForFilters as $key => $value) {
  1471.                 $key === Config::MULTISELECT_SKAD_POSTBACKS_APP_IDS $excludedFlagForAppIds $value false;
  1472.                 $key === Config::MULTISELECT_SKAD_POSTBACKS_CAMPAIGN_IDS $excludedFlagForCampaignIds $value false;
  1473.                 $key === Config::MULTISELECT_SKAD_POSTBACKS_ENDPOINTS $excludedFlagForEndpoints $value false;
  1474.             }
  1475.         }
  1476.         $startDate date('Y-m-d'strtotime($request->query->get('startDate')));
  1477.         $endDate date('Y-m-d', (strtotime($request->query->get('endDate')) + 24 60 60));
  1478.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  1479.         $groupedColumns $request->query->get('groups') != '' $request->query->get('groups') : [];
  1480.         $downloadDataAsCSV $request->query->get('downloadCSV') == 1;
  1481.         $checkValuesFromArr['appId'] = ['excluded' => $excludedFlagForAppIds'ids' => $appIds,];
  1482.         $checkValuesFromArr['campaignId'] = ['excluded' => $excludedFlagForCampaignIds'ids' => $campaignIds];
  1483.         $checkValuesFromArr['endpoint'] = ['excluded' => $excludedFlagForEndpoints'ids' => $endpoints];
  1484.         $postbackLogsData $this->doctrine->getRepository(SkadNetworkPostbackLogs::class)->getSkadPostbackDataForReport($startDate$endDate$checkValuesFromArr$limit$pagein_array($sortBy, ['hoOfferId''hoAffiliateId']) ? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY $sortBy$sortType);
  1485.         $finalArr = [];
  1486.         $distinctAppIds = [];
  1487.         $distinctEndpoints = [];
  1488.         $distinctCampaignIds = [];
  1489.         foreach ($postbackLogsData as $key => $value) {
  1490.             $isPostbackAcknowledgedFromMmp $value['isPostbackAcknowledgedFromAppsflyer'] || $value['branchPostbackId'] !== null;
  1491.             if (array_key_exists($value['transactionId'], $finalArr) && $finalArr[$value['transactionId']]['isPostbackAcknowledgedFromMmp'] == 'YES') {
  1492.                 continue;
  1493.             }
  1494.             !in_array($value['appId'], $distinctAppIds) ? $distinctAppIds[] = $value['appId'] : false;
  1495.             !in_array($value['campaignId'], $distinctCampaignIds) ? $distinctCampaignIds[] = $value['campaignId'] : false;
  1496.             !in_array($value['endpoint'], $distinctEndpoints) ? $distinctEndpoints[] = $value['endpoint'] : false;
  1497.             $temp = [
  1498.                 'mappingIndex' => md5($value['appId'] . '#' $value['campaignId'] . '#' $value['endpoint']),
  1499.                 'appId' => 'id' $value['appId'],
  1500.                 'campaignId' => $value['campaignId'],
  1501.                 'redownload' => $value['redownload'] ? 'YES' 'NO',
  1502.                 'hoOfferName' => null,
  1503.                 'hoOfferId' => null,
  1504.                 'mmpSource' => null,
  1505.                 'hoAffiliateId' => null,
  1506.                 'hoAffiliateName' => null,
  1507.                 'transactionId' => $value['transactionId'],
  1508.                 'endpoint' => $value['endpoint'],
  1509.                 'isPostbackScheduledForMmp' => $value['isPostbackScheduledForMmp'] ? 'NO' 'YES',
  1510.                 'isPostbackAcknowledgedFromMmp' => $isPostbackAcknowledgedFromMmp 'YES' 'NO',
  1511.                 'dateInserted' => $value['dateInserted']->format('Y-m-d H:i:s'),
  1512.                 'date' => $value['dateInserted']->format('Y-m-d'),
  1513.                 'week' => $value['dateInserted']->format('Y') . $value['dateInserted']->format('W'),
  1514.                 'month' => $value['dateInserted']->format('m'),
  1515.                 'year' => $value['dateInserted']->format('Y'),
  1516.                 'hour' => $value['dateInserted']->format('h'),
  1517.             ];
  1518.             $finalArr[$value['transactionId']] = $temp;
  1519.         }
  1520.         $finalArr array_values($finalArr);
  1521.         $skadNetworkManualPostbackMapping $this->doctrine->getRepository(SkadNetworkManualPostbackMapping::class)->getDataForSkadPostbacksReport([
  1522.             'appId' => $distinctAppIds,
  1523.             'campaignId' => $distinctAppIds,
  1524.             'endpoint' => $distinctEndpoints,
  1525.         ]);
  1526.         $mappedData = [];
  1527.         foreach ($skadNetworkManualPostbackMapping as $key => $value) {
  1528.             $mappedData[md5($value['appId'] . '#' $value['campaignId'] . '#' $value['endpoint'])] = [
  1529.                 'offerId' => $value['offerId'],
  1530.                 'affiliateId' => $value['affiliateId']
  1531.             ];
  1532.         }
  1533.         $affiliateList $this->commonCalls->getAffiliateListByStatusWithKeys();
  1534.         $offerDetailsByOfferId = [];
  1535.         foreach ($finalArr as $key => $value) {
  1536.             if (array_key_exists($value['mappingIndex'], $mappedData)) {
  1537.                 if (!array_key_exists($mappedData[$value['mappingIndex']]['offerId'], $offerDetailsByOfferId)) {
  1538.                     $offerInfo $this->doctrine->getRepository(OfferInfo::class)->findOneBy(['offerId' => $mappedData[$value['mappingIndex']]['offerId']]);
  1539.                     if ($offerInfo) {
  1540.                         $offerDetailsByOfferId[$mappedData[$value['mappingIndex']]['offerId']] = [
  1541.                             'mmpSource' => strtoupper($offerInfo->getSkadNetworkMmp()),
  1542.                             'offerName' => $offerInfo->getName()
  1543.                         ];
  1544.                     }
  1545.                 }
  1546.                 $finalArr[$key]['hoOfferName'] = array_key_exists($mappedData[$value['mappingIndex']]['offerId'], $offerDetailsByOfferId) ? $offerDetailsByOfferId[$mappedData[$value['mappingIndex']]['offerId']]['offerName'] : '';
  1547.                 $finalArr[$key]['mmpSource'] = array_key_exists($mappedData[$value['mappingIndex']]['offerId'], $offerDetailsByOfferId) ? $offerDetailsByOfferId[$mappedData[$value['mappingIndex']]['offerId']]['mmpSource'] : '';
  1548.                 $finalArr[$key]['hoOfferId'] = $mappedData[$value['mappingIndex']]['offerId'];
  1549.                 $finalArr[$key]['hoAffiliateId'] = $mappedData[$value['mappingIndex']]['affiliateId'];
  1550.                 $finalArr[$key]['hoAffiliateName'] = array_key_exists($mappedData[$value['mappingIndex']]['affiliateId'], $affiliateList) ? $affiliateList[$mappedData[$value['mappingIndex']]['affiliateId']]['name'] : '';
  1551.             }
  1552.             unset($finalArr[$key]['mappingIndex']);
  1553.         }
  1554.         $tableColumns $this->commonCalls->changeColumnVisibilityForTable(Config::REPORT_SKAD_POSTBACKS_COLUMNS$selectedColumns$groupedColumns);
  1555.         if ($downloadDataAsCSV) {
  1556.             $this->commonCalls->downloadCSV($tableColumns$finalArr'SKAD POSTBACKS ' $startDate '_' $endDate);
  1557.         } else {
  1558.             $totalRecordCount $this->doctrine->getRepository(SkadNetworkPostbackLogs::class)->getSkadPostbackRecordsForReport($startDate$endDate, []);
  1559.             $noOfPages ceil($totalRecordCount $limit);
  1560.             return new JsonResponse([
  1561.                 'response' => [
  1562.                     'success' => true,
  1563.                     'httpStatus' => Config::HTTP_STATUS_CODE_OK,
  1564.                     'data' => [
  1565.                         'tableColumns' => $tableColumns,
  1566.                         'data' => $finalArr,
  1567.                         'metaData' => [
  1568.                             'total' => (int)$totalRecordCount,
  1569.                             'limit' => (int)$limit,
  1570.                             'page' => (int)$page,
  1571.                             'pages' => (int)$noOfPages,
  1572.                         ]
  1573.                     ],
  1574.                     'error' => null
  1575.                 ]
  1576.             ], Config::HTTP_STATUS_CODE_OK);
  1577.         }
  1578.     }
  1579.     public function downloadCSV($tableColumns$data$reportNamePretty)
  1580.     {
  1581.         $reportName str_replace(" ""-"strtolower($reportNamePretty));
  1582.         $header = [];
  1583.         foreach ($tableColumns as $key => $value) {
  1584.             if ($value['show'] == 1) {
  1585.                 array_push($header$value['Header']);
  1586.             }
  1587.         }
  1588.         $rows = [$header];
  1589.         foreach ($data as $key => $value) {
  1590.             $row = [];
  1591.             foreach ($tableColumns as $k => $v) {
  1592.                 if ($v['show'] == 1) {
  1593.                     array_push($row$value[$v['accessor']]);
  1594.                 }
  1595.             }
  1596.             $rows[] = $row;
  1597.         }
  1598.         $spreadsheet = new Spreadsheet();
  1599.         $spreadsheet->getProperties()->setCreator('MAFO')->setLastModifiedBy('MAFO')->setTitle($reportNamePretty ' Report')->setSubject($reportNamePretty)->setDescription($reportNamePretty);
  1600.         $spreadsheet->getActiveSheet()->fromArray($rowsnull'A1');
  1601.         header('Content-Type: application/vnd.ms-excel');
  1602.         header('Content-Disposition: attachment;filename="' $reportName '.xls"');
  1603.         header('Cache-Control: max-age=0');
  1604.         $writer IOFactory::createWriter($spreadsheet'Xls');
  1605.         $writer->save('php://output');
  1606.         exit;
  1607.     }
  1608.     /**
  1609.      * @Route("/revenue-report", name="get_revenue_report", methods={"GET"})
  1610.      */
  1611.     public function getRevenueReportAction(Request $request)
  1612.     {
  1613.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  1614.         $filters $request->query->get('filters') ?? [];
  1615.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters') ?? [];
  1616.         $limit $request->query->get('limit') ? $request->query->get('limit') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  1617.         $page $request->query->get('page') ? $request->query->get('page') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1618.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY;
  1619.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  1620.         $filtersToProcess = [];
  1621.         if (isset($filters)) {
  1622.             foreach ($filters as $key => $value) {
  1623.                 $key === 'MULTISELECT_TUNE_ADVERTISERS' $filtersToProcess['advertiserIds'] = $value false;
  1624.                 $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' $filtersToProcess['advertiserManagerEmailIds'] = $value false;
  1625.                 $key === 'MULTISELECT_FINANCIAL_TOOLS_HYPER_STATUS' $filtersToProcess['hyperStatuses'] = $value false;
  1626.                 $key === 'MULTISELECT_MOBUPPS_TEAMS' $filtersToProcess['mobuppsTeamIds'] = $value false;
  1627.                 $key === 'MULTISELECT_TUNE_ACCOUNTS' $filtersToProcess['advertiserTuneAccounts'] = $value false;
  1628.             }
  1629.         }
  1630.         $excludedFlagsToProcess = [];
  1631.         if (isset($excludedFlagForFilters)) {
  1632.             foreach ($excludedFlagForFilters as $key => $value) {
  1633.                 $key === 'MULTISELECT_TUNE_ADVERTISERS' $excludedFlagsToProcess['excludeAdvertiserIds'] = $value false;
  1634.                 $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' $excludedFlagsToProcess['excludeAdvertiserManagerEmailIds'] = $value false;
  1635.                 $key === 'MULTISELECT_FINANCIAL_TOOLS_HYPER_STATUS' $excludedFlagsToProcess['excludeHyperStatus'] = $value false;
  1636.                 $key === 'MULTISELECT_MOBUPPS_TEAMS' $excludedFlagsToProcess['excludeMobuppsTeamIds'] = $value false;
  1637.                 $key === 'MULTISELECT_TUNE_ACCOUNTS' $excludedFlagsToProcess['advertiserTuneAccountsExcluded'] = $value false;
  1638.             }
  1639.         }
  1640.         $dateStart date('Y-m-1'strtotime('-0 month'strtotime($request->query->get('startDate'))));
  1641.         $dateEnd date('Y-m-1'strtotime('+0 month 'strtotime($request->query->get('endDate'))));
  1642.         if ($request->query->get('downloadCSV') == 1) {
  1643.             $limit Config::REPORTS_PAGINATION_DEFAULT_CSV_PAGE_SIZE;
  1644.             $page Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1645.         }
  1646.         $finalArr $this->financialToolsComponents->getRevenueTotalAggregatedData($dateStart$dateEnd$filtersToProcess$excludedFlagsToProcess$selectedColumns$this->getUser()->getEmail());
  1647.         $tableColumns $this->commonCalls->changeColumnVisibilityForTable(array_values($this->commonCalls->getDataFromJsonFile(Config::JSON_FILE_REPORTS_REVENUE_REPORT)), $selectedColumns, []);
  1648.         if ($request->query->get('downloadCSV') == 1) {
  1649.             $this->commonCalls->downloadCSV($tableColumns$finalArr'Revenue Report ' $dateStart '_' $dateEnd);
  1650.         }
  1651.         return new JsonResponse($this->commonCalls->getReportResponse($finalArr$tableColumns$limit$page$sortBy$sortType));
  1652.     }
  1653.     /**
  1654.      * @Route("/mafo-revenue-report", name="get_mafo_revenue_report", methods={"GET"})
  1655.      */
  1656.     public function getMafoRevenueReportAction(Request $request)
  1657.     {
  1658.         ini_set('memory_limit''1024M');
  1659.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  1660.         $filters $request->query->get('filters') ?? [];
  1661.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters') ?? [];
  1662.         $limit $request->query->get('limit') ? $request->query->get('limit') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  1663.         $page $request->query->get('page') ? $request->query->get('page') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1664.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY;
  1665.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  1666.         $filtersToProcess = [];
  1667.         if (isset($filters)) {
  1668.             foreach ($filters as $key => $value) {
  1669.                 $key === 'MULTISELECT_MAFO_ADVERTISERS' $filtersToProcess['advertiserIds'] = $value false;
  1670.                 $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' $filtersToProcess['advertiserManagerEmailIds'] = $value false;
  1671.                 $key === 'MULTISELECT_FINANCIAL_TOOLS_HYPER_STATUS' $filtersToProcess['hyperStatuses'] = $value false;
  1672.                 $key === 'MULTISELECT_MOBUPPS_TEAMS' $filtersToProcess['advertiserManagerTeamIds'] = $value false;
  1673.                 $key === 'MULTISELECT_TUNE_ACCOUNTS' $filtersToProcess['advertiserTuneAccounts'] = $value false;
  1674.             }
  1675.         }
  1676.         $excludedFlagsToProcess = [];
  1677.         if (isset($excludedFlagForFilters)) {
  1678.             foreach ($excludedFlagForFilters as $key => $value) {
  1679.                 $key === 'MULTISELECT_MAFO_ADVERTISERS' $excludedFlagsToProcess['excludeAdvertiserIds'] = $value false;
  1680.                 $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' $excludedFlagsToProcess['excludeAdvertiserManagerEmailIds'] = $value false;
  1681.                 $key === 'MULTISELECT_FINANCIAL_TOOLS_HYPER_STATUS' $excludedFlagsToProcess['excludeHyperStatus'] = $value false;
  1682.                 $key === 'MULTISELECT_MOBUPPS_TEAMS' $excludedFlagsToProcess['excludeAdvertiserManagerTeamIds'] = $value false;
  1683.                 $key === 'MULTISELECT_TUNE_ACCOUNTS' $excludedFlagsToProcess['advertiserTuneAccountsExcluded'] = $value false;
  1684.             }
  1685.         }
  1686.         $dateStart date('Y-m-1'strtotime('-0 month'strtotime($request->query->get('startDate'))));
  1687.         $dateEnd date('Y-m-1'strtotime('+0 month 'strtotime($request->query->get('endDate'))));
  1688.         if ($request->query->get('downloadCSV') == 1) {
  1689.             $limit Config::REPORTS_PAGINATION_DEFAULT_CSV_PAGE_SIZE;
  1690.             $page Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1691.         }
  1692.         $finalArr $this->mafoFinancialToolsComponents->getRevenueTotalAggregatedData($dateStart$dateEnd$filtersToProcess$excludedFlagsToProcess$selectedColumns$this->getUser()->getEmail());
  1693.         $tableColumns $this->commonCalls->changeColumnVisibilityForTable(array_values($this->commonCalls->getDataFromJsonFile(Config::JSON_FILE_REPORTS_MAFO_REVENUE_REPORT)), $selectedColumns, []);
  1694.         if ($request->query->get('downloadCSV') == 1) {
  1695.             $this->commonCalls->downloadCSV($tableColumns$finalArr'Revenue Report ' $dateStart '_' $dateEnd);
  1696.         }
  1697.         return new JsonResponse($this->commonCalls->getReportResponse($finalArr$tableColumns$limit$page$sortBy$sortType));
  1698.     }
  1699.     /**
  1700.      * @Route("/payout-report", name="get_payout_report", methods={"GET"})
  1701.      */
  1702.     public function getPayoutReportAction(Request $request)
  1703.     {
  1704.         ini_set('memory_limit''1024M');
  1705.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  1706.         $filters $request->query->get('filters') ?? [];
  1707.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters') ?? [];
  1708.         $limit $request->query->get('perPage') ? $request->query->get('perPage') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  1709.         $page $request->query->get('currentPage') ? $request->query->get('currentPage') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1710.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY;
  1711.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  1712.         $filtersToProcess = [];
  1713.         if (isset($filters)) {
  1714.             foreach ($filters as $key => $value) {
  1715.                 $key === 'MULTISELECT_AFFILIATES' $filtersToProcess['affiliateIds'] = $value false;
  1716.                 $key === 'MULTISELECT_AFFILIATE_MANAGER_FROM_MAFO_USERS' $filtersToProcess['affiliateManagerEmailArr'] = $value false;
  1717.                 $key === 'MULTISELECT_FINANCIAL_TOOLS_HYPER_STATUS' $filtersToProcess['hyperStatuses'] = $value false;
  1718.                 $key === 'MULTISELECT_ADDED_BY_FROM_MAFO_USERS' $filtersToProcess['addedByEmailIds'] = $value false;
  1719.                 $key === 'MULTISELECT_MOBUPPS_TEAMS' $filtersToProcess['mobuppsTeamIds'] = $value false;
  1720.                 $key === 'MULTISELECT_AFFILIATE_TUNE_ACCOUNTS' $filtersToProcess['affiliateTuneAccounts'] = $value false;
  1721.             }
  1722.         }
  1723.         $excludedFlagsToProcess = [];
  1724.         if (isset($excludedFlagForFilters)) {
  1725.             foreach ($excludedFlagForFilters as $key => $value) {
  1726.                 $key === 'MULTISELECT_AFFILIATES' $excludedFlagsToProcess['excludeAffiliateIds'] = $value false;
  1727.                 $key === 'MULTISELECT_AFFILIATE_MANAGER_FROM_MAFO_USERS' $excludedFlagsToProcess['excludeAffiliateManagerEmailArr'] = $value false;
  1728.                 $key === 'MULTISELECT_FINANCIAL_TOOLS_HYPER_STATUS' $excludedFlagsToProcess['excludeHyperStatus'] = $value false;
  1729.                 $key === 'MULTISELECT_ADDED_BY_FROM_MAFO_USERS' $excludedFlagsToProcess['excludeAddedByEmailIds'] = $value false;
  1730.                 $key === 'MULTISELECT_MOBUPPS_TEAMS' $excludedFlagsToProcess['excludeMobuppsTeamIds'] = $value false;
  1731.                 $key === 'MULTISELECT_AFFILIATE_TUNE_ACCOUNTS' $excludedFlagsToProcess['affiliateTuneAccountsExcluded'] = $value false;
  1732.             }
  1733.         }
  1734.         $dateStart date('Y-m-1'strtotime('-0 month'strtotime($request->query->get('startDate'))));
  1735.         $dateEnd date('Y-m-1'strtotime('+0 month 'strtotime($request->query->get('endDate'))));
  1736.         if ($request->query->get('downloadCSV') == 1) {
  1737.             $limit Config::REPORTS_PAGINATION_DEFAULT_CSV_PAGE_SIZE;
  1738.             $page Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1739.         }
  1740.         $finalArr $this->financialToolsComponents->getPayoutTotalAggregatedData($dateStart$dateEnd$filtersToProcess$excludedFlagsToProcess$selectedColumns$this->getUser()->getEmail());
  1741.         $tableColumns $this->commonCalls->changeColumnVisibilityForTable(array_values($this->commonCalls->getDataFromJsonFile(Config::JSON_FILE_REPORTS_PAYOUT_REPORT)), $selectedColumns, []);
  1742.         if ($request->query->get('downloadCSV') == 1) {
  1743.             $this->commonCalls->downloadCSV($tableColumns$finalArr'Payout Report ' $dateStart '_' $dateEnd);
  1744.         }
  1745.         return new JsonResponse($this->commonCalls->getReportResponse($finalArr$tableColumns$limit$page$sortBy$sortType));
  1746.     }
  1747.     /**
  1748.      * @Route("/mafo-payout-report", name="get_mafo_payout_report", methods={"GET"})
  1749.      */
  1750.     public function getMafoPayoutReportAction(Request $request)
  1751.     {
  1752.         ini_set('memory_limit''1024M');
  1753.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  1754.         $filters $request->query->get('filters') ?? [];
  1755.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters') ?? [];
  1756.         $limit $request->query->get('perPage') ? $request->query->get('perPage') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  1757.         $page $request->query->get('currentPage') ? $request->query->get('currentPage') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1758.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY;
  1759.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  1760.         $filtersToProcess = [];
  1761.         if (isset($filters)) {
  1762.             foreach ($filters as $key => $value) {
  1763.                 $key === 'MULTISELECT_MAFO_AFFILIATES' $filtersToProcess['affiliateIds'] = $value false;
  1764.                 $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' $filtersToProcess['affiliateManagerEmailArr'] = $value false;
  1765.                 $key === 'MULTISELECT_FINANCIAL_TOOLS_HYPER_STATUS' $filtersToProcess['hyperStatuses'] = $value false;
  1766.                 $key === 'MULTISELECT_MOBUPPS_TEAMS' $filtersToProcess['mobuppsTeamIds'] = $value false;
  1767.             }
  1768.         }
  1769.         $excludedFlagsToProcess = [];
  1770.         if (isset($excludedFlagForFilters)) {
  1771.             foreach ($excludedFlagForFilters as $key => $value) {
  1772.                 $key === 'MULTISELECT_AFFILIATES' $excludedFlagsToProcess['excludeAffiliateIds'] = $value false;
  1773.                 $key === 'MULTISELECT_AFFILIATE_MANAGER_FROM_MAFO_USERS' $excludedFlagsToProcess['excludeAffiliateManagerEmailArr'] = $value false;
  1774.                 $key === 'MULTISELECT_FINANCIAL_TOOLS_HYPER_STATUS' $excludedFlagsToProcess['excludeHyperStatus'] = $value false;
  1775.                 $key === 'MULTISELECT_ADDED_BY_FROM_MAFO_USERS' $excludedFlagsToProcess['excludeAddedByEmailIds'] = $value false;
  1776.                 $key === 'MULTISELECT_MOBUPPS_TEAMS' $excludedFlagsToProcess['excludeMobuppsTeamIds'] = $value false;
  1777.                 $key === 'MULTISELECT_AFFILIATE_TUNE_ACCOUNTS' $excludedFlagsToProcess['affiliateTuneAccountsExcluded'] = $value false;
  1778.             }
  1779.         }
  1780.         $dateStart date('Y-m-1'strtotime('-0 month'strtotime($request->query->get('startDate'))));
  1781.         $dateEnd date('Y-m-1'strtotime('+0 month 'strtotime($request->query->get('endDate'))));
  1782.         if ($request->query->get('downloadCSV') == 1) {
  1783.             $limit Config::REPORTS_PAGINATION_DEFAULT_CSV_PAGE_SIZE;
  1784.             $page Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1785.         }
  1786.         $finalArr $this->mafoFinancialToolsComponents->getPayoutTotalAggregatedData($dateStart$dateEnd$filtersToProcess$excludedFlagsToProcess$selectedColumns$this->getUser()->getEmail());
  1787.         $tableColumns $this->commonCalls->changeColumnVisibilityForTable(array_values($this->commonCalls->getDataFromJsonFile(Config::JSON_FILE_REPORTS_MAFO_PAYOUT_REPORT)), $selectedColumns, []);
  1788.         if ($request->query->get('downloadCSV') == 1) {
  1789.             $this->commonCalls->downloadCSV($tableColumns$finalArr'Payout Report ' $dateStart '_' $dateEnd);
  1790.         }
  1791.         return new JsonResponse($this->commonCalls->getReportResponse($finalArr$tableColumns$limit$page$sortBy$sortType));
  1792.     }
  1793.     /**
  1794.      * @Route("/global-network-report", methods={"GET"})
  1795.      */
  1796.     public function getGlobalNetworkReport(Request $request)
  1797.     {
  1798.         ini_set('memory_limit''512M');
  1799.         $filtersSelected $request->query->get('filters');
  1800.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters');
  1801.         $filters = [];
  1802.         $excludedFiltersFlags = [];
  1803.         if (isset($filtersSelected)) {
  1804.             foreach ($filtersSelected as $key => $value) {
  1805.                 $key === Config::MULTISELECT_MMP_STATISTICS_APP $filters['appIds'] = $value false;
  1806.                 $key === Config::MULTISELECT_MMP_OFFERS $filters['offers'] = $value false;
  1807.                 $key === Config::MULTISELECT_MMP_SOURCE_GLOBAL_NETWORK_REPORT $filters['mmpSource'] = $value false;
  1808.                 $key === Config::MULTISELECT_MMP_PARTNERS $filters['affiliates'] = $value false;
  1809.                 $key === Config::MULTISELECT_MMP_MAKER_OF_OFFER_RULE_IN_MMP_OFFERS $filters['users'] = $value false;
  1810.                 $key === Config::MULTISELECT_GEO $filters['geos'] = $value false;
  1811.                 // $key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS ? $filters['advertiserIds'] = $value : false;
  1812.                 $key === Config::MULTISELECT_MAFO_ADVERTISERS $filters['mafoAdvertiserIds'] = $value false;
  1813.                 // $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES ? $filters['hoAffiliateIds'] = $value : false;
  1814.                 $key === Config::MULTISELECT_MAFO_AFFILIATES $filters['mafoAffiliateIds'] = $value false;
  1815.                 $key === Config::MULTISELECT_MMP_EVENTS $filters['events'] = $value false;
  1816.                 $key === Config::MULTISELECT_MMP_TUNE_OFFERS $filters['hoOfferIds'] = $value false;
  1817.                 $key === Config::MULTISELECT_MAFO_OFFERS $filters['mafoOfferIds'] = $value false;
  1818.                 $key === Config::MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS $filters['advertiserManagerEmailIds'] = $value false;
  1819.                 $key === Config::MULTISELECT_AFFILIATE_MANAGER_FROM_MAFO_USERS $filters['affiliateManagerEmailIds'] = $value false;
  1820.                 $key === Config::MULTISELECT_ADVERTISER_MOBUPPS_TEAM $filters['advertiserMobuppsTeam'] = $value false;
  1821.                 $key === Config::MULTISELECT_AFFILIATE_MOBUPPS_TEAM $filters['affiliateMobuppsTeam'] = $value false;
  1822.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $filters['affiliateCategories'] = $value false;
  1823.                 $key === Config::MULTISELECT_TUNE_PIDS $filters['tunePids'] = $value false;
  1824.                 $key === Config::MULTISELECT_GLOBAL_REPORT_EXCLUDE_ZERO_VALUES $filters['excludeResultsWithZeroValues'] = $value false;
  1825.                 $key === Config::MULTISELECT_MMP_IS_RETARGETED $filters['isRetargeted'] = $value false;
  1826.                 $key === Config::MULTISELECT_SCRAPER_SITE_ID $filters['siteIds'] = $value false;
  1827.                 $key === Config::MULTISELECT_OFFER_TYPE $filters['offerType'] = $value false;
  1828.             }
  1829.         }
  1830.         if (isset($excludedFlagForFilters)) {
  1831.             foreach ($excludedFlagForFilters as $key => $value) {
  1832.                 $value = (int)$value;
  1833.                 $key === Config::MULTISELECT_MMP_STATISTICS_APP $excludedFiltersFlags['appIds'] = $value false;
  1834.                 $key === Config::MULTISELECT_MMP_OFFERS $excludedFiltersFlags['offers'] = $value false;
  1835.                 $key === Config::MULTISELECT_MMP_SOURCE_GLOBAL_NETWORK_REPORT $excludedFiltersFlags['mmpSource'] = $value false;
  1836.                 $key === Config::MULTISELECT_MMP_PARTNERS $excludedFiltersFlags['affiliates'] = $value false;
  1837.                 $key === Config::MULTISELECT_MMP_MAKER_OF_OFFER_RULE_IN_MMP_OFFERS $excludedFiltersFlags['users'] = $value false;
  1838.                 $key === Config::MULTISELECT_GEO $excludedFiltersFlags['geos'] = $value false;
  1839.                 // $key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS ? $excludedFiltersFlags['advertiserIds'] = $value : false;
  1840.                 $key === Config::MULTISELECT_MAFO_ADVERTISERS $excludedFiltersFlags['mafoAdvertiserIds'] = $value false;
  1841.                 // $key === Config::MULTISELECT_MMP_TUNE_AFFILIATES ? $excludedFiltersFlags['hoAffiliateIds'] = $value : false;
  1842.                 $key === Config::MULTISELECT_MAFO_AFFILIATES $excludedFiltersFlags['mafoAffiliateIds'] = $value false;
  1843.                 $key === Config::MULTISELECT_MMP_EVENTS $excludedFiltersFlags['events'] = $value false;
  1844.                 $key === Config::MULTISELECT_MMP_TUNE_OFFERS $excludedFiltersFlags['hoOfferIds'] = $value false;
  1845.                 $key === Config::MULTISELECT_MAFO_OFFERS $excludedFiltersFlags['mafoOfferIds'] = $value false;
  1846.                 $key === Config::MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS $excludedFiltersFlags['advertiserManagerEmailIds'] = $value false;
  1847.                 $key === Config::MULTISELECT_AFFILIATE_MANAGER_FROM_MAFO_USERS $excludedFiltersFlags['affiliateManagerEmailIds'] = $value false;
  1848.                 $key === Config::MULTISELECT_ADVERTISER_MOBUPPS_TEAM $excludedFiltersFlags['advertiserMobuppsTeam'] = $value false;
  1849.                 $key === Config::MULTISELECT_AFFILIATE_MOBUPPS_TEAM $excludedFiltersFlags['affiliateMobuppsTeam'] = $value false;
  1850.                 $key === Config::MULTISELECT_AFFILIATE_CATEGORIES $excludedFiltersFlags['affiliateCategories'] = $value false;
  1851.                 $key === Config::MULTISELECT_TUNE_PIDS $excludedFiltersFlags['tunePids'] = $value false;
  1852.                 $key === Config::MULTISELECT_GLOBAL_REPORT_EXCLUDE_ZERO_VALUES $excludedFiltersFlags['excludeResultsWithZeroValues'] = $value false;
  1853.                 $key === Config::MULTISELECT_SCRAPER_SITE_ID $excludedFiltersFlags['siteIds'] = $value false;
  1854.                 $key === Config::MULTISELECT_OFFER_TYPE $excludedFiltersFlags['offerType'] = $value false;
  1855.             }
  1856.         }
  1857.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  1858.         $groupedColumns $request->query->get('groups') != '' $request->query->get('groups') : [];
  1859.         $dateStart date('Y-m-d'strtotime($request->query->get('startDate')));
  1860.         $dateEnd date('Y-m-d'strtotime($request->query->get('endDate')));
  1861.         $eventTimestampFrom strtotime($dateStart);
  1862.         $eventTimeStampTo strtotime($dateEnd);
  1863.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_MMP_REPORT_DEFAULT_SORT_BY;
  1864.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  1865.         $page $request->query->get('currentPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1866.         $limit $request->query->get('perPage') ?? Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  1867.         $downloadDataAsCSV $request->query->get('downloadCSV') == 1;
  1868.         $ajaxRequestTimeout $request->query->get('ajaxRequestTimeout') == 1;
  1869.         $tableColumns $this->commonCalls->changeColumnVisibilityForTable(
  1870.             array_values($this->commonCalls->getDataFromJsonFile(Config::JSON_FILE_GLOBAL_NETWORK_REPORT)),
  1871.             $selectedColumns,
  1872.             []
  1873.         );
  1874.         $finalReportData = [];
  1875.         if ($ajaxRequestTimeout) {
  1876.             $this->gearmanClientInterface->doBackgroundJob('AppWorkersMmpReportsWorker~generateGlobalReportAndSendMail'json_encode([
  1877.                 'reportParams' => [
  1878.                     $filters,
  1879.                     $excludedFiltersFlags,
  1880.                     $eventTimestampFrom,
  1881.                     $eventTimeStampTo,
  1882.                     $selectedColumns,
  1883.                     $groupedColumns
  1884.                 ],
  1885.                 'tableColumns' => $tableColumns,
  1886.                 'sendMailTo' => $this->getUser()->getEmail(),
  1887.                 'dateStart' => $dateStart,
  1888.                 'dateEnd' => $dateEnd,
  1889.                 'requestedAt' => date('Y-m-d H:i:s'strtotime('now'))
  1890.             ]));
  1891.             return new JsonResponse([
  1892.                 'response' => [
  1893.                     'success' => true,
  1894.                     'httpStatus' => Config::HTTP_STATUS_CODE_OK,
  1895.                     'data' => [
  1896.                         'tableColumns' => $tableColumns,
  1897.                         'data' => [],
  1898.                         'metaData' => [
  1899.                             'total' => 0,
  1900.                             'limit' => (int)$limit,
  1901.                             'page' => (int)$page,
  1902.                             'pages' => 1,
  1903.                         ]
  1904.                     ],
  1905.                     'error' => null
  1906.                 ]
  1907.             ], Config::HTTP_STATUS_CODE_OK);
  1908.         } elseif (
  1909.             strtotime(date('m'strtotime($request->query->get('startDate'))))
  1910.             >= strtotime(date(
  1911.                 'm',
  1912.                 strtotime("-" Config::MMP_REPORTS_TABLE_DATA_MONTH_LIMIT " months")
  1913.             ))
  1914.         ) {
  1915.             ini_set('mysqlnd.net_read_timeout''1');
  1916.             $finalReportData $this->mmpComponents->getMmpCumulativeData(
  1917.                 $filters,
  1918.                 $excludedFiltersFlags,
  1919.                 $eventTimestampFrom,
  1920.                 $eventTimeStampTo,
  1921.                 $selectedColumns,
  1922.                 $groupedColumns
  1923.             );
  1924.         }
  1925.         foreach ($tableColumns as $key => $value) {
  1926.             if (isset($value['aggregate']) && $value['aggregate'] == 'sum') {
  1927.                 $num round(array_sum(array_column($finalReportData$value['accessor'])), 2);
  1928.                 if ($value['category'] == 'statistics') {
  1929.                     $tableColumns[$key]['Footer'] = number_format($num);
  1930.                 } else {
  1931.                     $tableColumns[$key]['Footer'] = number_format($num2);
  1932.                 }
  1933.             }
  1934.         }
  1935.         if ($downloadDataAsCSV) {
  1936.             $this->commonCalls->downloadCSV($tableColumns$finalReportData'Global Network Report ' $dateStart '_' $dateEnd);
  1937.         } else {
  1938.             $finalReportData array_values($finalReportData);
  1939.             if (sizeof($finalReportData)) {
  1940.                 $entity $finalReportData[0];
  1941.                 if (array_key_exists($sortBy$entity)) {
  1942.                     $sortFlag 3;
  1943.                     if ($sortType == Config::SORT_TYPE_ASC) {
  1944.                         $sortFlag 4;
  1945.                     }
  1946.                     array_multisort(array_column($finalReportData$sortBy), $sortFlag$finalReportData);
  1947.                 }
  1948.             }
  1949.             $offset $limit * ($page 1);
  1950.             $totalRecordCount sizeof($finalReportData);
  1951.             $noOfPages ceil($totalRecordCount $limit);
  1952.             return new JsonResponse([
  1953.                 'response' => [
  1954.                     'success' => true,
  1955.                     'httpStatus' => Config::HTTP_STATUS_CODE_OK,
  1956.                     'data' => [
  1957.                         'tableColumns' => $tableColumns,
  1958.                         'data' => array_slice($finalReportData$offset$limit),
  1959.                         'metaData' => [
  1960.                             'total' => $totalRecordCount,
  1961.                             'limit' => (int)$limit,
  1962.                             'page' => (int)$page,
  1963.                             'pages' => (int)$noOfPages,
  1964.                         ]
  1965.                     ],
  1966.                     'error' => null
  1967.                 ]
  1968.             ], Config::HTTP_STATUS_CODE_OK);
  1969.         }
  1970.     }
  1971.     /**
  1972.      * @Route("/sales-report", name="get_sales_report", methods={"GET"})
  1973.      */
  1974.     public function getSalesReportAction(Request $requestLoggerInterface $logger)
  1975.     {
  1976.         $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  1977.         $groupedColumns $request->query->get('groups') != '' $request->query->get('groups') : [];
  1978.         $filtersSelected $request->query->get('filters') ?? [];
  1979.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters') ?? [];
  1980.         $limit $request->query->get('perPage') ? $request->query->get('perPage') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  1981.         $page $request->query->get('currentPage') ? $request->query->get('currentPage') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  1982.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY;
  1983.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  1984.         $filtersToProcess = [];
  1985.         if (isset($filtersSelected)) {
  1986.             foreach ($filtersSelected as $key => $value) {
  1987.                 $key === Config::MULTISELECT_MMP_TUNE_OFFERS $filtersToProcess['offers'] = $value false;
  1988.                 if ($key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS) continue;
  1989.                 $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' $filtersToProcess['advertiserManagerEmailIds'] = $value false;
  1990.                 $key === 'MULTISELECT_MOBUPPS_TEAMS' $filtersToProcess['advertiserMobuppsTeam'] = $value false;
  1991.                 $key === Config::MULTISELECT_MMP_STATISTICS_APP $filtersToProcess['appIds'] = $value false;
  1992.             }
  1993.         }
  1994.         $adFilter $filtersSelected[Config::MULTISELECT_MMP_TUNE_ADVERTISERS] ?? [];
  1995.         $exFilter $excludedFlagForFilters[Config::MULTISELECT_MMP_TUNE_ADVERTISERS] ?? false;
  1996.         $filtersToProcess['advertiserIds'] = $this->getAdvertiserTagIds(
  1997.             $adFilter,
  1998.             $exFilter
  1999.         );
  2000.         $excludedFlagsToProcess = [];
  2001.         if (isset($excludedFlagForFilters)) {
  2002.             foreach ($excludedFlagForFilters as $key => $value) {
  2003.                 $key === Config::MULTISELECT_MMP_TUNE_OFFERS $excludedFlagsToProcess['offers'] = $value false;
  2004.                 if ($key === Config::MULTISELECT_MMP_TUNE_ADVERTISERS) continue;
  2005.                 $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' $excludedFlagsToProcess['advertiserManagerEmailIds'] = $value false;
  2006.                 $key === 'MULTISELECT_MOBUPPS_TEAMS' $excludedFlagsToProcess['advertiserMobuppsTeam'] = $value false;
  2007.                 $key === Config::MULTISELECT_MMP_STATISTICS_APP $excludedFlagsToProcess['appIds'] = $value false;
  2008.             }
  2009.         }
  2010.         $dateStart date('Y-m-d'strtotime($request->query->get('startDate')));
  2011.         $dateEnd date('Y-m-d'strtotime($request->query->get('endDate')));
  2012.         if ($request->query->get('downloadCSV') == 1) {
  2013.             $limit Config::REPORTS_PAGINATION_DEFAULT_CSV_PAGE_SIZE;
  2014.             $page Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  2015.         }
  2016.         $eventTimestampFrom strtotime($dateStart);
  2017.         $eventTimeStampTo strtotime($dateEnd);
  2018.         ini_set('mysqlnd.net_read_timeout''1');
  2019.         $finalArr $this->mmpComponents->getMmpCumulativeData(
  2020.             $filtersToProcess,
  2021.             $excludedFlagsToProcess,
  2022.             $eventTimestampFrom,
  2023.             $eventTimeStampTo,
  2024.             $selectedColumns,
  2025.             $groupedColumns
  2026.         );
  2027.         $tableColumns $this->commonCalls->changeColumnVisibilityForTable(
  2028.             array_values($this->commonCalls->getDataFromJsonFile(Config::JSON_FILE_REPORTS_SALES_REPORT)),
  2029.             $selectedColumns,
  2030.             []
  2031.         );
  2032.         foreach ($tableColumns as $key => $value) {
  2033.             if (isset($value['aggregate']) && $value['aggregate'] == 'sum') {
  2034.                 $num round(array_sum(array_column($finalArr$value['accessor'])), 2);
  2035.                 if ($value['category'] == 'statistics') {
  2036.                     $tableColumns[$key]['Footer'] = number_format($num);
  2037.                 } else {
  2038.                     $tableColumns[$key]['Footer'] = number_format($num2);
  2039.                 }
  2040.             }
  2041.         }
  2042.         if ($request->query->get('downloadCSV') == 1) {
  2043.             $this->commonCalls->downloadCSV(
  2044.                 $tableColumns,
  2045.                 $finalArr,
  2046.                 'Sales Report ' $dateStart '_' $dateEnd
  2047.             );
  2048.         }
  2049.         return new JsonResponse($this->commonCalls->getReportResponse($finalArr$tableColumns$limit$page$sortBy$sortType));
  2050.     }
  2051.     public function getAdvertiserTagIds($filterIds$flag)
  2052.     {
  2053.         $tagId $this->doctrine
  2054.             ->getRepository(Tag::class)
  2055.             ->getTagIdByTagName(Config::SALES_REPORT_ADVERTISER_TAG);
  2056.         $advTagRepo $this->doctrine->getRepository(AdvertiserTagRelationship::class);
  2057.         $advArr $advTagRepo->getAdvertiserTagRelationshipByTagId($tagId);
  2058.         $advIds = [];
  2059.         foreach ($advArr as $advId) {
  2060.             $advIds[] = $advId['advertiserId'];
  2061.         }
  2062.         if (is_array($filterIds)) {
  2063.             $newAdvIds = [];
  2064.             foreach ($filterIds as $key => $val) {
  2065.                 if (in_array($val$advIds)) {
  2066.                     if ($flag) {
  2067.                         unset($advIds[array_search($val$advIds)]);
  2068.                     } else {
  2069.                         $newAdvIds[] = $val;
  2070.                     }
  2071.                 }
  2072.             }
  2073.             if (count($newAdvIds) > 0) {
  2074.                 $advIds $newAdvIds;
  2075.             }
  2076.         }
  2077.         return $advIds;
  2078.     }
  2079.     /**
  2080.      * @Route("/offers-report", name="get_offers_report", methods={"GET"})
  2081.      */
  2082.     public function getOffersReportAction(Request $requestLoggerInterface $logger)
  2083.     {
  2084.         $columnsForGlobalReport $selectedColumns $request->query->get('data') != '' $request->query->get('data') : [];
  2085.         $groupedColumns $request->query->get('groups') != '' $request->query->get('groups') : [];
  2086.         $filtersSelected $request->query->get('filters') ?? [];
  2087.         $excludedFlagForFilters $request->query->get('excludedFlagForFilters') ?? [];
  2088.         $limit $request->query->get('perPage') ? $request->query->get('perPage') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  2089.         $page $request->query->get('currentPage') ? $request->query->get('currentPage') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  2090.         $sortBy $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY;
  2091.         $sortType $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  2092.         $dateStart date('Y-m-d'strtotime($request->query->get('startDate')));
  2093.         $dateEnd date('Y-m-d'strtotime($request->query->get('endDate')));
  2094.         $downloadDataAsCSV $request->query->get('downloadCSV') == true false;
  2095.         $filtersToProcess = [];
  2096.         if (isset($filtersSelected)) {
  2097.             foreach ($filtersSelected as $key => $value) {
  2098.                 $key === 'MULTISELECT_MAFO_OFFERS' $filtersToProcess['mafoOfferIds'] = $value false;
  2099.                 $key === 'MULTISELECT_MAFO_ADVERTISERS' $filtersToProcess['mafoAdvertiserIds'] = $value false;
  2100.                 $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' $filtersToProcess['advertiserManagerEmailIds'] = $value false;
  2101.                 $key === 'MULTISELECT_MMP_SOURCE_GLOBAL_NETWORK_REPORT' $filtersToProcess['mmpSources'] = $value false;
  2102.                 $key === 'MULTISELECT_GEO' $filtersToProcess['geos'] = $value false;
  2103.                 $key === 'MULTISELECT_MMP_STATISTICS_APP' $filtersToProcess['appIds'] = $value false;
  2104.                 $key === 'MULTISELECT_MMP_SYSTEM_OFFER_ID' $filtersToProcess['mmpSystemOfferIds'] = $value false;
  2105.                 $key === 'MULTISELECT_MMP_SYSTEM_ADVERTISER_ID' $filtersToProcess['mmpSystemAdvertiserIds'] = $value false;
  2106.             }
  2107.         }
  2108.         $excludedFlagsToProcess = [];
  2109.         if (isset($excludedFlagForFilters)) {
  2110.             foreach ($excludedFlagForFilters as $key => $value) {
  2111.                 $key === 'MULTISELECT_MAFO_OFFERS' $excludedFlagsToProcess['mafoOfferIds'] = $value false;
  2112.                 $key === 'MULTISELECT_MAFO_ADVERTISERS' $excludedFlagsToProcess['mafoAdvertiserIds'] = $value false;
  2113.                 $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' $excludedFlagsToProcess['advertiserManagerEmailIds'] = $value false;
  2114.                 $key === 'MULTISELECT_MMP_SOURCE_GLOBAL_NETWORK_REPORT' $excludedFlagsToProcess['mmpSources'] = $value false;
  2115.                 $key === 'MULTISELECT_GEO' $excludedFlagsToProcess['geos'] = $value false;
  2116.                 $key === 'MULTISELECT_MMP_STATISTICS_APP' $excludedFlagsToProcess['appIds'] = $value false;
  2117.                 $key === 'MULTISELECT_MMP_SYSTEM_OFFER_ID' $excludedFlagsToProcess['mmpSystemOfferIds'] = $value false;
  2118.                 $key === 'MULTISELECT_MMP_SYSTEM_ADVERTISER_ID' $excludedFlagsToProcess['mmpSystemAdvertiserIds'] = $value false;
  2119.             }
  2120.         }
  2121.         if ($request->query->get('downloadCSV') == 1) {
  2122.             $limit Config::REPORTS_PAGINATION_DEFAULT_CSV_PAGE_SIZE;
  2123.             $page Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  2124.         }
  2125.         $eventTimestampFrom strtotime($dateStart);
  2126.         $eventTimeStampTo strtotime($dateEnd);
  2127.         // if (isset($selectedColumns["offersReportEvent"])) {
  2128.         //     $columnsForGlobalReport["defaultRevenueModel"] = "1";
  2129.         //     $columnsForGlobalReport["defaultRevenue"] = "1";
  2130.         //     $columnsForGlobalReport["defaultRevenueEvent"] = "1";
  2131.         // }
  2132.         // if (isset($selectedColumns["appId"]) || isset($selectedColumns["appName"])) {
  2133.         //     $columnsForGlobalReport["appUrl"] = "1";
  2134.         // }
  2135.         // if (isset($columnsForGlobalReport["offersReportEvent"])) {
  2136.         //     $columnsForGlobalReport["event"] = $columnsForGlobalReport["offersReportEvent"];
  2137.         //     unset($columnsForGlobalReport["offersReportEvent"]);
  2138.         // }
  2139.         $finalArr $this->mmpComponents->getOffersReportCumulativeData(
  2140.             $filtersToProcess,
  2141.             $excludedFlagsToProcess,
  2142.             $eventTimestampFrom,
  2143.             $eventTimeStampTo,
  2144.             $columnsForGlobalReport
  2145.         );
  2146.         $tableColumns $this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::REPORTS_OFFERS_REPORT]);
  2147.         if ($downloadDataAsCSV) {
  2148.             $this->commonCalls->downloadCSV($tableColumns$finalArr'Offers Report ' $dateStart '_' $dateEnd);
  2149.         } else {
  2150.             return new JsonResponse($this->commonCalls->getPaginatedResponseForReports($finalArr$tableColumns$selectedColumns$sortBy$sortType$limit$page));
  2151.         }
  2152.     }
  2153. }