Пример #1
0
 public function getCampaignWithChildren(Campaign $campaign)
 {
     $data['type'] = 'campaign';
     $data['campaignchain_id'] = (string) $campaign->getId();
     $data['text'] = $campaign->getName();
     $data['route_edit_api'] = $campaign->getCampaignModule()->getRoutes()['edit_api'];
     $data['route_plan_detail'] = $campaign->getCampaignModule()->getRoutes()['plan_detail'];
     $campaignService = $this->container->get('campaignchain.core.campaign');
     $data['tpl_teaser'] = $campaignService->tplTeaser($campaign->getCampaignModule(), array('only_icon' => true, 'size' => 24));
     // Define the trigger hook's identifier.
     if (!$campaign->getInterval() && $campaign->getTriggerHook()) {
         $data['id'] = (string) $campaign->getId() . '_campaign';
         $hookService = $this->container->get($campaign->getTriggerHook()->getServices()['entity']);
         $hook = $hookService->getHook($campaign);
         $data['start_date'] = $hook->getStartDate()->format(self::FORMAT_TIMELINE_DATE);
         if ($hook->getEndDate()) {
             $data['end_date'] = $hook->getEndDate()->format(self::FORMAT_TIMELINE_DATE);
         } else {
             $data['end_date'] = $data['start_date'];
         }
         $ganttCampaignData[] = $data;
     } elseif ($campaign->getInterval()) {
         // Handle repeating campaigns.
         if (!$campaign->getIntervalEndOccurrence()) {
             $occurrences = 1;
         } else {
             $occurrences = $campaign->getIntervalEndOccurrence();
         }
         /** @var \DateTime $startDate */
         $startDate = $campaign->getIntervalStartDate();
         /** @var \DateInterval $duration */
         $duration = $campaign->getStartDate()->diff($campaign->getEndDate());
         $now = new \DateTime('now');
         $maxTimelineDate = clone $now;
         $maxTimelineDate->modify($this->container->getParameter('campaignchain.max_date_interval'));
         $firstInstanceId = null;
         $repeatingCount = 0;
         // If an actual instance exists as a child campaign, then add it.
         /** @var Campaign $childCampaign */
         $childCampaign = $this->em->getRepository('CampaignChain\\CoreBundle\\Entity\\Campaign')->findOneByParent($campaign);
         if ($childCampaign) {
             $firstInstanceId = $data['id'] = (string) $campaign->getId() . '_campaign';
             $data['start_date'] = $childCampaign->getStartDate()->format(self::FORMAT_TIMELINE_DATE);
             $data['end_date'] = $childCampaign->getEndDate()->format(self::FORMAT_TIMELINE_DATE);
             $ganttCampaignData[] = $data;
         }
         /*
          * Let's iterate through all the future instances of a repeating
          * campaign.
          */
         for ($i = 0; $i < $occurrences; $i++) {
             /*
              * Take the interval's start/end date for the first instance,
              * otherwise calculate the start/end date by adding the
              * campaign's interval to the start/end date of the
              * previous instance.
              */
             $startDate->modify($campaign->getInterval());
             $endDate = clone $startDate;
             $endDate->add($duration);
             $hasEnded = $campaign->getIntervalEndDate() != NULL && $endDate > $campaign->getIntervalEndDate();
             /*
              * If the instance is in the past, skip it,
              * because we only want ongoing or upcoming ones.
              */
             if (!$hasEnded && $startDate >= $campaign->getIntervalNextRun() && ($startDate > $now || $endDate > $now)) {
                 /*
                  * Is this the first repeating campaign instance?
                  */
                 if (!$firstInstanceId) {
                     /*
                      * This is the first instance, so we define it as
                      * the parent of the other repeating campaign
                      * instances.
                      */
                     $firstInstanceId = $data['id'] = (string) $campaign->getId() . '_campaign';
                 } else {
                     /*
                      * This is not the first instance of a repeating
                      * campaign in the timeline, so let's add the first instance
                      * as the parent campaign.
                      */
                     $data['id'] = (string) $campaign->getId() . '_' . $repeatingCount . '_campaign';
                     $data['parent'] = $firstInstanceId;
                     $repeatingCount++;
                 }
                 $data['start_date'] = $startDate->format(self::FORMAT_TIMELINE_DATE);
                 $data['interval'] = $campaign->getIntervalHumanReadable();
                 $data['end_date'] = $endDate->format(self::FORMAT_TIMELINE_DATE);
                 $ganttCampaignData[] = $data;
             }
             if ($campaign->getIntervalEndOccurrence() == NULL && (!$hasEnded && $startDate < $maxTimelineDate)) {
                 $occurrences++;
             }
         }
     } else {
         throw new \Exception('Unknown campaign type.');
     }
     return $ganttCampaignData;
 }
 /**
  * Get facts data per dimension.
  *
  * @param Campaign $campaign
  * @param Activity $activity
  * @param boolean  $percent
  *
  * @return array
  */
 public function getFacts(Campaign $campaign, Activity $activity, $percent = false)
 {
     $qb = $this->em->createQueryBuilder();
     $qb->select('r.time, r.value, IDENTITY(r.metric) as metric')->from('CampaignChain\\CoreBundle\\Entity\\ReportAnalyticsActivityFact', 'r')->where('r.activity = :activityId')->andWhere('r.campaign = :campaignId')->orderBy('r.time', 'ASC')->setParameter('activityId', $activity->getId())->setParameter('campaignId', $campaign->getId());
     $query = $qb->getQuery();
     $facts = $query->getArrayResult();
     $factsData = [];
     $tmp = [];
     foreach ($facts as $fact) {
         $tmp[$fact['metric']][] = [$fact['time']->getTimestamp() * 1000, $fact['value']];
     }
     foreach (array_keys($tmp) as $k) {
         $factsData[$k]['data'] = $this->serializer->serialize($tmp[$k], 'json');
         $factsData[$k]['id'] = $k;
         if ($percent) {
             $factsData[$k]['percent'] = $this->getDimensionPercent($campaign, $activity, $k);
         }
     }
     return $factsData;
 }