src/Utils/MediaHelper.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\Utils;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Component\HttpFoundation\RequestStack;
  5. use App\Exception\ResourceNotFoundException;
  6. use App\Entity\Media;
  7. use App\Entity\MediaGroup;
  8. use App\Entity\MediaGroupItem;
  9. use App\Entity\AdAnalyticsDaily;
  10. class MediaHelper 
  11. {
  12.     
  13.     protected $entityManager;
  14.     
  15.     public function __construct (
  16.         EntityManagerInterface $entityManager,
  17.         RequestStack $requestStack
  18.     ) {
  19.         $this->entityManager $entityManager;
  20.         $this->requestStack $requestStack;
  21.     }
  22.     
  23.     //Should move this to a separate file like "SiteHelper"
  24.     public function getSiteCode() {
  25.         $site_code null;
  26.         $request $this->requestStack->getCurrentRequest();
  27.         if($request) {
  28.             $session $request->getSession();
  29.             if($session) {
  30.                 $site_code $session->get("site");
  31.             }
  32.         }
  33.         return $site_code;
  34.     }
  35.     
  36.     public function getMediaById ($id 0)
  37.     {
  38.         $id = (int) $id;
  39.         $media $this->entityManager
  40.             ->getRepository(Media::class)
  41.             ->findOneBy([
  42.                 "id" => $id
  43.             ]);
  44.             
  45.         if ($media) {
  46.             return $media;
  47.         }
  48.         
  49.         throw new ResourceNotFoundException ("Media with Id {$id} - Not Found");
  50.     }
  51.     
  52.     public function getMediaByOldId ($id 0)
  53.     {
  54.         
  55.         $id = (int) $id;
  56.         $media $this->entityManager
  57.             ->getRepository(Media::class)
  58.             ->findOneBy([
  59.                 "old_id" => $id
  60.             ]);
  61.             
  62.         if ($media) {
  63.             return $media;
  64.         }
  65.         
  66.         throw new ResourceNotFoundException ("Media with old_id {$id} - Not Found");
  67.     }
  68.     
  69.     public function getMediaByName ($name "")
  70.     {
  71.         $media $this->entityManager
  72.             ->getRepository(Media::class)
  73.             ->findOneBy([
  74.                 "name" => $name
  75.             ]);
  76.             
  77.         if ($media) {
  78.             return $media;
  79.         }
  80.         
  81.         throw new ResourceNotFoundException ("Media with name {$name} - Not Found");
  82.     }
  83.     
  84.     public function getMediaGroupItemById ($id 0)
  85.     {
  86.         $id = (int) $id;
  87.         $mediaItem $this->entityManager
  88.             ->getRepository(MediaGroupItem::class)
  89.             ->findOneBy([
  90.                 "id" => $id
  91.             ]);
  92.             
  93.         if ($mediaItem) {
  94.             return $mediaItem;
  95.         }
  96.         
  97.         throw new ResourceNotFoundException ("Media Group Item with Id {$id} - Not Found");
  98.     }
  99.     
  100.     public function getMediaGroupItemByIdOrNull ($id 0)
  101.     {
  102.         $id = (int) $id;
  103.         $mediaItem $this->entityManager
  104.             ->getRepository(MediaGroupItem::class)
  105.             ->findOneBy([
  106.                 "id" => $id
  107.             ]);
  108.             
  109.         if ($mediaItem) {
  110.             return $mediaItem;
  111.         }
  112.         
  113.         return null;
  114.     }
  115.     
  116.     public function getMediaGroupByPosition ($position "")
  117.     {
  118.         $mediaGroup $this->entityManager
  119.             ->getRepository(MediaGroup::class)
  120.             ->findOneBy([
  121.                 "position" => $position
  122.             ]);
  123.             
  124.         if ($mediaGroup) {
  125.             
  126.             //Causing issues, see the soryBy function for details
  127.             //$mediaGroup = $mediaGroup->sortBy("random");
  128.             
  129.             return $mediaGroup;
  130.         }
  131.         
  132.         throw new ResourceNotFoundException ("Media group position: {$position} - Not Found");
  133.     }
  134.     
  135.     //Get X random active media group items (used for ads)
  136.     public function getRandomMediaGroupItems($mediaGroup$limit$site_code) {
  137.         
  138.         /*
  139.         $qb = $this->entityManager->createQueryBuilder();
  140.         
  141.         $qb->select('items')
  142.             ->from("App\Entity\MediaGroupItem", "items")
  143.             ->join("items.mediaGroup", "mg", "WITH", "mg.id = :mgId");
  144.         if($site_code) {
  145.             $qb->join("items.site", "s", "WITH", "s.id = :site")
  146.                 ->setParameter("site", $site_code);
  147.         }
  148.         $qb->setParameter("mgId", $mediaGroup->getId());
  149.         $qb->addSelect('RAND() as HIDDEN rand')->orderBy('rand()');
  150.         if($limit) {
  151.             $qb->setMaxResults($limit);
  152.         }
  153.         $results = $qb->getQuery()->getResult();
  154.         
  155.         return $results;
  156.         */
  157.         
  158.         $query implode(" ", array (
  159.                 "SELECT items",
  160.                 "FROM",
  161.                     "App\Entity\MediaGroupItem items",
  162.                 "JOIN",
  163.                     "items.mediaGroup mg",
  164.                 "JOIN",
  165.                     "items.site site",
  166.                 "WHERE",
  167.                     "mg.id = :mgId",
  168.                     "AND site.id = :site_code",
  169.                     "AND items.status = 1",
  170.                 //"Select RAND() as HIDDEN rand",
  171.                 "ORDER BY rand()",
  172.                 //"ORDER BY items.published_at DESC",
  173.             ));
  174.         
  175.         $query $this->entityManager
  176.             ->createQuery($query)
  177.             ->setParameter("mgId"$mediaGroup->getId())
  178.             ->setParameter("site_code"$site_code);
  179.             
  180.         if($limit) {
  181.             $query $query->setMaxResults($limit);
  182.         }
  183.         
  184.         $results $query->getResult();
  185.         
  186.         return $results;    
  187.     }
  188.     public function getRandomUnpriorityAds($mediaGroup$limit$site_code) {
  189.         $query implode(" ", array (
  190.                 "SELECT items",
  191.                 "FROM",
  192.                     "App\Entity\MediaGroupItem items",
  193.                 "JOIN",
  194.                     "items.mediaGroup mg",
  195.                 "JOIN",
  196.                     "items.site site",
  197.                 "WHERE",
  198.                     "mg.id = :mgId",
  199.                     "AND site.id = :site_code",
  200.                     "AND items.status = 1",
  201.                     "AND items.id NOT IN (SELECT item.id FROM App\Entity\MediaGroupItem item JOIN items.priorities priority WHERE priority.ad_type = :mgId AND priority.site_id = :site_code)",
  202.                 "ORDER BY rand()",
  203.             ));
  204.         
  205.         $query $this->entityManager
  206.             ->createQuery($query)
  207.             ->setParameter("mgId"$mediaGroup->getId())
  208.             ->setParameter("site_code"$site_code);
  209.             
  210.         if($limit) {
  211.             $query $query->setMaxResults($limit);
  212.         }
  213.         
  214.         $results $query->getResult();
  215.         
  216.         return $results;    
  217.     }
  218.     
  219.     public function getRandomPriorityAds($mediaGroup$limit$site_code) {
  220.         $query implode(" ", array (
  221.                 "SELECT items",
  222.                 "FROM",
  223.                     "App\Entity\MediaGroupItem items",
  224.                 "JOIN",
  225.                     "items.mediaGroup mg",
  226.                 "JOIN",
  227.                     "items.site site",
  228.                 "JOIN",
  229.                     "items.priorities priority",
  230.                 "WHERE",
  231.                     "mg.id = :mgId",
  232.                     "AND site.id = :site_code",
  233.                     "AND items.status = 1",
  234.                     "AND priority.ad_type = :mgId",
  235.                     "AND priority.site_id = :site_code",
  236.                 "ORDER BY rand()",
  237.             ));
  238.         
  239.         $query $this->entityManager
  240.             ->createQuery($query)
  241.             ->setParameter("mgId"$mediaGroup->getId())
  242.             ->setParameter("site_code"$site_code);
  243.             
  244.         if($limit) {
  245.             $query $query->setMaxResults($limit);
  246.         }
  247.         
  248.         $results $query->getResult();
  249.         
  250.         return $results;
  251.     }
  252.     
  253.     public function getFirstItemByPosition($position "")
  254.     {
  255.         if(!$position) {
  256.             return null;
  257.         }
  258.         
  259.         try {
  260.             $mediaGroup $this->getMediaGroupByPosition($position);
  261.         } catch (\Exception $e) {
  262.             return null;
  263.         }
  264.         
  265.         return $mediaGroup->getFirstPublishedActiveMediaGroupItem($this->getSiteCode());
  266.         
  267.     }
  268.     public function getPopoutAdByCustomer($customer) {
  269.         
  270.         if(!$customer) {
  271.             return "";
  272.         }
  273.         $site_code $this->getSiteCode();
  274.         
  275.         $qb $this->entityManager->createQueryBuilder();
  276.         
  277.         $result $qb->select('item')
  278.             ->from("App\Entity\MediaGroupItem""item")
  279.             ->join("item.mediaGroup""mg""WITH""mg.position = 'ad-popout'")
  280.             ->join("item.customers""cu");
  281.         if($site_code) {
  282.             $qb->join("item.site""s""WITH""s.id = :site")
  283.                 ->setParameter("site"$site_code);
  284.         }
  285.         $result $qb->where("item.status = 1")
  286.             ->andWhere("cu.id = :cuid")
  287.             ->setMaxResults(1)
  288.             ->addOrderBy("item.published_at""DESC")
  289.             ->getQuery()
  290.             ->setParameter("cuid"$customer->getId())
  291.             ->getResult();
  292.             
  293.         if($result) {
  294.             return $result[0];
  295.         }
  296.         else {
  297.             return "";
  298.         }
  299.     }
  300.     public function getDefaultPopoutAd() {
  301.         
  302.         $site_code $this->getSiteCode();
  303.         if(!$site_code) {
  304.             return "";
  305.         }
  306.         
  307.         $qb $this->entityManager->createQueryBuilder();
  308.         
  309.         $result $qb->select('item')
  310.             ->from("App\Entity\MediaGroupItem""item")
  311.             ->join("item.mediaGroup""mg""WITH""mg.position = 'ad-popout'")
  312.             ->join("item.site""s""WITH""s.id = :site")
  313.             ->setParameter("site"$site_code)
  314.             ->where("item.status = 1")
  315.             ->andWhere("item.site_default = :site_default")
  316.             ->setParameter("site_default"$site_code)
  317.             ->setMaxResults(1)
  318.             ->addOrderBy("item.published_at""DESC")
  319.             ->getQuery()
  320.             ->getResult();
  321.             
  322.         if($result) {
  323.             return $result[0];
  324.         }
  325.         else {
  326.             return "";
  327.         }
  328.     }
  329.     //Exceptions for mega menu pinned ads
  330.     public function uriForPinned($uri$current_route) {
  331.         $site_code $this->getSiteCode();
  332.         $uri rtrim($uri,"/");
  333.         if(in_array($current_route, ['forum''forums''forum_topic''forum_topic_edit'])) {
  334.             $uri "/forum";
  335.         }
  336.         else if(in_array($current_route, ['gallery_master'])) {
  337.             $uri "/roofing-galleries";
  338.         }
  339.         else if(in_array($current_route, ['events_master''event_master''events_month_master''events_day_master'])) {
  340.             $uri "/events";
  341.         }
  342.         else if(in_array($current_route, ['contests_master'])) {
  343.             $uri "/contests-and-games";
  344.         }
  345.         else if(in_array($current_route, ['promos_master'])) {
  346.             $uri "/promos-rebates";
  347.         }
  348.         else if(in_array($current_route, ['ebooks''ebooks_master''ebook''ebook_master'])) {
  349.             $uri "/ebooks";
  350.         }
  351.         else if(in_array($current_route, ['customerEbooks_master'])) {
  352.             $uri "/partner-ebooks";
  353.         }
  354.         else if(in_array($current_route, ['rlw-posts_master'])) {
  355.             if($site_code == 1) {
  356.                 $uri "/read-listen-watch-rcs";
  357.             }
  358.             else {
  359.                 $uri "/read-listen-watch";
  360.             }
  361.         }
  362.         else if(in_array($current_route, ['video_master'])) {
  363.             $uri "/videos";
  364.         }
  365.         else if(in_array($current_route, ['webinar_master'])) {
  366.             $uri "/partner-webinars";
  367.         }
  368.         else if(in_array($current_route, ['podcast_master']) || strpos($uri"/podcasts/") !== false) {
  369.             $uri "/podcasts";
  370.         }
  371.         
  372.         // || strpos($uri, "/events/") !== false
  373.         return $uri;
  374.     }
  375.     public function getPinnedAdByPosition($base_url$uri$current_route$ad_position) {
  376.         $site_code $this->getSiteCode();
  377.         
  378.         if(!$site_code) {
  379.             return "";
  380.         }
  381.         $uri $this->uriForPinned($uri$current_route);
  382.         
  383.         $qb $this->entityManager->createQueryBuilder();
  384.         
  385.         //TODO: look into how efficient this is and if it can be optimized
  386.         $result $qb->select('item')
  387.             ->from("App\Entity\MediaGroupItem""item")
  388.             ->join("item.mediaGroup""mg""WITH""mg.position = '{$ad_position}'")
  389.             ->join("item.site""s""WITH""s.id = :site")
  390.             ->setParameter("site"$site_code)
  391.             ->join("item.pins""p""WITH""p.site_id = :site")
  392.             ->setParameter("site"$site_code)
  393.             ->join("App\Entity\MegaMenu""mm""WITH""mm.uuid = p.mega_menu_uuid AND mm.status = 1")
  394.             ->leftJoin("App\Entity\MegaMenu""mm2""WITH""mm2.parent = mm.uuid and mm2.status = 1")
  395.             ->leftJoin("App\Entity\MegaMenu""mm3""WITH""mm3.parent = mm2.uuid and mm3.status = 1")
  396.             ->where("item.status = 1")
  397.             //->andWhere("mm.link = :link OR mm2.link = :link OR mm3.link = :link")
  398.             ->andWhere("mm.link = :link OR mm2.link = :link OR mm3.link = :link    OR mm.link = :link2 OR mm2.link = :link2 OR mm3.link = :link2")
  399.             ->setParameter("link"$base_url $uri)
  400.             ->setParameter("link2"$base_url $uri "/"//Some have trailing slashes. Should clean this up on save.
  401.             //->andWhere("item.site_default = :site_default")
  402.             ->setMaxResults(1)
  403.             ->addOrderBy("mm.position""ASC")
  404.             ->addOrderBy("mm2.position""ASC")
  405.             ->addOrderBy("mm3.position""ASC")
  406.             ->addOrderBy("item.published_at""DESC")
  407.             ->getQuery()
  408.             ->getResult();
  409.             
  410.         if($result) {
  411.             return $result[0];
  412.         }
  413.         else {
  414.             return "";
  415.         }
  416.     }
  417.     public function getContentByType ($type "") {
  418.         $site_code $this->getSiteCode();
  419.         $qb $this->entityManager->createQueryBuilder();
  420.         
  421.         $qb->select('c')
  422.             ->from("App\Entity\Content""c")
  423.             ->where("c.type = :type")
  424.             ->andWhere("c.status = 1 ");
  425.         if($site_code) {
  426.             $qb->join("c.site""s""WITH""s.id = :site")
  427.                 ->setParameter("site"$site_code);
  428.         }
  429.         $content $qb
  430.             ->setParameter("type"$type)
  431.             ->getQuery()->getResult();
  432.         
  433.         if($content) {
  434.             return $content;
  435.         }
  436.         return [];
  437.     }
  438.     
  439.     public function getAdsForAnalyticsAggregated($customer$startDate$endDate)
  440.     {
  441.         $query implode(" ", array (
  442.                 "SELECT DISTINCT item",
  443.                 "FROM",
  444.                     "App\Entity\MediaGroupItem item",
  445.                 "JOIN",
  446.                     "item.customers customer",
  447.                 "LEFT JOIN",
  448.                     "customer.prnt prnt",
  449.                 "JOIN",
  450.                     "item.ad_analytics_daily ad_analytics_daily",
  451.                 "WHERE",
  452.                     "(customer.id = :id OR prnt.id = :id)",
  453.                     "AND ad_analytics_daily.day BETWEEN :start AND :end",
  454.             ));
  455.         
  456.         $results $this->entityManager
  457.             ->createQuery($query)
  458.             ->setParameter("id"$customer->getId())
  459.             ->setParameter("start"$startDate)
  460.             ->setParameter("end"$endDate)
  461.         ->getResult();
  462.         
  463.         return $results;
  464.     }
  465.     
  466.     public function countAdImpressions($item$startDate$endDate$site_id="")
  467.     {
  468.         $query implode(" ", array (
  469.                 "SELECT COUNT(impression.traffic_data)",
  470.                 "FROM",
  471.                     "App\Entity\AdImpression impression",
  472.                 "WHERE",
  473.                     "impression.media_group_item = :mg",
  474.                     "AND (impression.requested_at BETWEEN :start AND :end)",
  475.                     
  476.                     ($site_id implode(" ", array (
  477.                         "AND impression.site_id = {$site_id}",
  478.                     )) : ""),
  479.                     
  480.             ));
  481.         
  482.         $count $this->entityManager
  483.             ->createQuery($query)
  484.             ->setParameter("mg"$item)
  485.             ->setParameter("start"$startDate)
  486.             ->setParameter("end"$endDate)
  487.         ->getResult();
  488.         
  489.         if (!empty($count)) {
  490.             return (int) $count[0][1];
  491.         }
  492.         
  493.         return 0;
  494.     }
  495.     
  496.     public function countAdImpressionsGroupedBySite($item$startDate$endDate)
  497.     {
  498.         $query implode(" ", array (
  499.                 "SELECT impression.site_id, COUNT(impression.traffic_data) as impressions",
  500.                 "FROM",
  501.                     "App\Entity\AdImpression impression",
  502.                 "JOIN",
  503.                     "impression.media_group_item item",
  504.                 "WHERE",
  505.                     "item.id = :id",
  506.                     "AND (impression.requested_at BETWEEN :start AND :end)",
  507.                 "GROUP BY impression.site_id",
  508.             ));
  509.         
  510.         $results $this->entityManager
  511.             ->createQuery($query)
  512.             ->setParameter("id"$item->getId())
  513.             ->setParameter("start"$startDate)
  514.             ->setParameter("end"$endDate)
  515.         ->getResult();
  516.         
  517.         return $results;
  518.     }
  519.     
  520.     public function countAdImpressionsAggregated($item$startDate$endDate$site_id="")
  521.     {
  522.         $query implode(" ", array (
  523.                 "SELECT SUM(ad_analytics_daily.impressions)",
  524.                 "FROM",
  525.                     "App\Entity\AdAnalyticsDaily ad_analytics_daily",
  526.                 "JOIN",
  527.                     "ad_analytics_daily.media_group_item item",
  528.                 "WHERE",
  529.                     "item.id = :id",
  530.                     "AND ad_analytics_daily.day BETWEEN :start AND :end",
  531.                     ($site_id implode(" ", [
  532.                         "AND ad_analytics_daily.site_id = {$site_id}",
  533.                     ]) : ""),
  534.             ));
  535.         
  536.         $count $this->entityManager
  537.             ->createQuery($query)
  538.             ->setParameter("id"$item)
  539.             ->setParameter("start"$startDate)
  540.             ->setParameter("end"$endDate)
  541.         ->getResult();
  542.         
  543.         if (!empty($count)) {
  544.             return (int) $count[0][1];
  545.         }
  546.         
  547.         return 0;
  548.     }
  549.     
  550.     public function countAdClicks($item$startDate$endDate$site_id="")
  551.     {
  552.         $query implode(" ", array (
  553.                 "SELECT COUNT(click.traffic_data)",
  554.                 "FROM",
  555.                     "App\Entity\AdClick click",
  556.                 "JOIN",
  557.                     "click.media_group_item item",
  558.                 "WHERE",
  559.                     "item.id = :id",
  560.                     "AND (click.requested_at BETWEEN :start AND :end)",
  561.                     
  562.                     ($site_id implode(" ", array (
  563.                         "AND click.site_id = {$site_id}",
  564.                     )) : ""),
  565.                     
  566.             ));
  567.         
  568.         $count $this->entityManager
  569.             ->createQuery($query)
  570.             ->setParameter("id"$item->getId())
  571.             ->setParameter("start"$startDate)
  572.             ->setParameter("end"$endDate)
  573.         ->getResult();
  574.         
  575.         if (!empty($count)) {
  576.             return (int) $count[0][1];
  577.         }
  578.         
  579.         return 0;
  580.     }
  581.     
  582.     public function countAdClicksGroupedBySite($item$startDate$endDate)
  583.     {
  584.         $query implode(" ", array (
  585.                 "SELECT click.site_id, COUNT(click.traffic_data) as views",
  586.                 "FROM",
  587.                     "App\Entity\AdClick click",
  588.                 "JOIN",
  589.                     "click.media_group_item item",
  590.                 "WHERE",
  591.                     "item.id = :id",
  592.                     "AND (click.requested_at BETWEEN :start AND :end)",
  593.                 "GROUP BY click.site_id",
  594.             ));
  595.         
  596.         $results $this->entityManager
  597.             ->createQuery($query)
  598.             ->setParameter("id"$item->getId())
  599.             ->setParameter("start"$startDate)
  600.             ->setParameter("end"$endDate)
  601.         ->getResult();
  602.         
  603.         return $results;
  604.     }
  605.     
  606.     public function countAdClicksAggregated($item$startDate$endDate$site_id="")
  607.     {
  608.         $query implode(" ", array (
  609.                 "SELECT SUM(ad_analytics_daily.views)",
  610.                 "FROM",
  611.                     "App\Entity\AdAnalyticsDaily ad_analytics_daily",
  612.                 "JOIN",
  613.                     "ad_analytics_daily.media_group_item media_group_item",
  614.                 "WHERE",
  615.                     "media_group_item.id = :id",
  616.                     "AND ad_analytics_daily.day BETWEEN :start AND :end",
  617.                     ($site_id implode(" ", [
  618.                         "AND ad_analytics_daily.site_id = {$site_id}",
  619.                     ]) : ""),
  620.             ));
  621.         
  622.         $sum $this->entityManager
  623.             ->createQuery($query)
  624.             ->setParameter("id"$item->getId())
  625.             ->setParameter("start"$startDate)
  626.             ->setParameter("end"$endDate)
  627.         ->getResult();
  628.         
  629.         if (!empty($sum)) {
  630.             return (int) $sum[0][1];
  631.         }
  632.         
  633.         return 0;
  634.     }
  635.     
  636.     public function countTotalAdImpressions($customer$startDate$endDate)
  637.     {
  638.         $query implode(" ", array (
  639.                 "SELECT COUNT(impression.traffic_data)",
  640.                 "FROM",
  641.                     "App\Entity\AdImpression impression",
  642.                 "JOIN",
  643.                     "impression.media_group_item item",
  644.                 "JOIN",
  645.                     "item.customers customer",
  646.                 "WHERE",
  647.                     "customer.id = :id",
  648.                     "AND (impression.requested_at BETWEEN :start AND :end)",
  649.             ));
  650.         
  651.         $count $this->entityManager
  652.             ->createQuery($query)
  653.             ->setParameter("id"$customer->getId())
  654.             ->setParameter("start"$startDate)
  655.             ->setParameter("end"$endDate)
  656.         ->getResult();
  657.         
  658.         if (!empty($count)) {
  659.             return (int) $count[0][1];
  660.         }
  661.         
  662.         return 0;
  663.     }
  664.     
  665.     public function countTotalAdImpressionsAggregated($customer$startDate$endDate)
  666.     {
  667.         $query implode(" ", array (
  668.                 "SELECT SUM(ad_analytics_daily.impressions)",
  669.                 "FROM",
  670.                     "App\Entity\AdAnalyticsDaily ad_analytics_daily",
  671.                 "JOIN",
  672.                     "ad_analytics_daily.media_group_item item",
  673.                 "JOIN",
  674.                     "item.customers customer",
  675.                 "WHERE",
  676.                     "customer.id = :id",
  677.                     "AND (ad_analytics_daily.day BETWEEN :start AND :end)",
  678.             ));
  679.         
  680.         $count $this->entityManager
  681.             ->createQuery($query)
  682.             ->setParameter("id"$customer->getId())
  683.             ->setParameter("start"$startDate)
  684.             ->setParameter("end"$endDate)
  685.         ->getResult();
  686.         
  687.         if (!empty($count)) {
  688.             return (int) $count[0][1];
  689.         }
  690.         
  691.         return 0;
  692.     }
  693.     
  694.     public function countTotalAdClicks($customer$startDate$endDate)
  695.     {
  696.         $query implode(" ", array (
  697.                 "SELECT COUNT(click.traffic_data)",
  698.                 "FROM",
  699.                     "App\Entity\AdClick click",
  700.                 "JOIN",
  701.                     "click.media_group_item item",
  702.                 "JOIN",
  703.                     "item.customers customer",
  704.                 "WHERE",
  705.                     "customer.id = :id",
  706.                     "AND (click.requested_at BETWEEN :start AND :end)",
  707.             ));
  708.         
  709.         $count $this->entityManager
  710.             ->createQuery($query)
  711.             ->setParameter("id"$customer->getId())
  712.             ->setParameter("start"$startDate)
  713.             ->setParameter("end"$endDate)
  714.         ->getResult();
  715.         
  716.         if (!empty($count)) {
  717.             return (int) $count[0][1];
  718.         }
  719.         
  720.         return 0;
  721.     }
  722.     
  723.     public function countTotalAdClicksAggregated($customer$startDate$endDate)
  724.     {
  725.         $query implode(" ", array (
  726.                 "SELECT SUM(ad_analytics_daily.views)",
  727.                 "FROM",
  728.                     "App\Entity\AdAnalyticsDaily ad_analytics_daily",
  729.                 "JOIN",
  730.                     "ad_analytics_daily.media_group_item item",
  731.                 "JOIN",
  732.                     "item.customers customer",
  733.                 "WHERE",
  734.                     "customer.id = :id",
  735.                     "AND (ad_analytics_daily.day BETWEEN :start AND :end)",
  736.             ));
  737.         
  738.         $count $this->entityManager
  739.             ->createQuery($query)
  740.             ->setParameter("id"$customer->getId())
  741.             ->setParameter("start"$startDate)
  742.             ->setParameter("end"$endDate)
  743.         ->getResult();
  744.         
  745.         if (!empty($count)) {
  746.             return (int) $count[0][1];
  747.         }
  748.         
  749.         return 0;
  750.     }
  751. }