/**
  * Push EcommerceView to tracker on category view page
  *
  * @param \Magento\Framework\Event\Observer $observer
  * @return \Henhed\Piwik\Observer\CategoryViewObserver
  */
 public function execute(\Magento\Framework\Event\Observer $observer)
 {
     if (!$this->_dataHelper->isTrackingEnabled()) {
         return $this;
     }
     $category = $observer->getEvent()->getCategory();
     /* @var $category \Magento\Catalog\Model\Category */
     $this->_piwikTracker->setEcommerceView(false, false, $category->getName());
     return $this;
 }
 /**
  * Push link tracking options to given tracker
  *
  * @param \Henhed\Piwik\Model\Tracker $tracker
  * @return \Henhed\Piwik\Observer\BeforeTrackPageViewObserver
  */
 protected function _pushLinkTracking(\Henhed\Piwik\Model\Tracker $tracker)
 {
     if ($this->_dataHelper->isLinkTrackingEnabled()) {
         $tracker->enableLinkTracking(true);
         $delay = $this->_dataHelper->getLinkTrackingDelay();
         if ($delay > 0) {
             $tracker->setLinkTrackingTimer($delay);
         }
     }
     return $this;
 }
 /**
  * Push EcommerceView to tracker on product view page
  *
  * @param \Magento\Framework\Event\Observer $observer
  * @return \Henhed\Piwik\Observer\ProductViewObserver
  */
 public function execute(\Magento\Framework\Event\Observer $observer)
 {
     if (!$this->_dataHelper->isTrackingEnabled()) {
         return $this;
     }
     $product = $observer->getEvent()->getProduct();
     /* @var $product \Magento\Catalog\Model\Product */
     $category = $product->getCategory();
     $this->_piwikTracker->setEcommerceView($product->getSku(), $product->getName(), $category ? $category->getName() : false, $product->getFinalPrice());
     return $this;
 }
 /**
  * Push trackEcommerceOrder to tracker on checkout success page
  *
  * @param \Magento\Framework\Event\Observer $observer
  * @return \Henhed\Piwik\Observer\CheckoutSuccessObserver
  */
 public function execute(\Magento\Framework\Event\Observer $observer)
 {
     $orderIds = $observer->getEvent()->getOrderIds();
     if (!$this->_dataHelper->isTrackingEnabled() || empty($orderIds) || !is_array($orderIds)) {
         return $this;
     }
     $collection = $this->_orderCollectionFactory->create();
     $collection->addFieldToFilter('entity_id', ['in' => $orderIds]);
     // Group order items by SKU since Piwik doesn't seem to handle multiple
     // `addEcommerceItem' with the same SKU.
     $piwikItems = [];
     // Aggregate all placed orders into one since Piwik seems to only
     // register one `trackEcommerceOrder' per request. (For multishipping)
     $piwikOrder = [];
     foreach ($collection as $order) {
         /* @var $order \Magento\Sales\Model\Order */
         foreach ($order->getAllVisibleItems() as $item) {
             /* @var $item \Magento\Sales\Model\Order\Item */
             $sku = $item->getSku();
             $name = $item->getName();
             $price = (double) $item->getBasePriceInclTax();
             $qty = (double) $item->getQtyOrdered();
             if (!isset($piwikItems[$sku])) {
                 $piwikItems[$sku] = [$sku, $name, $price * $qty, $qty];
             } else {
                 // Aggregate row total instead of unit price in case there
                 // are different prices for the same SKU.
                 $piwikItems[$sku][2] += $price * $qty;
                 $piwikItems[$sku][3] += $qty;
             }
         }
         $orderId = $order->getIncrementId();
         $grandTotal = (double) $order->getBaseGrandTotal();
         $subTotal = (double) $order->getBaseSubtotalInclTax();
         $tax = (double) $order->getBaseTaxAmount();
         $shipping = (double) $order->getBaseShippingInclTax();
         $discount = abs((double) $order->getBaseDiscountAmount());
         if (empty($piwikOrder)) {
             $piwikOrder = [$orderId, $grandTotal, $subTotal, $tax, $shipping, $discount];
         } else {
             $piwikOrder[0] .= ', ' . $orderId;
             $piwikOrder[1] += $grandTotal;
             $piwikOrder[2] += $subTotal;
             $piwikOrder[3] += $tax;
             $piwikOrder[4] += $shipping;
             $piwikOrder[5] += $discount;
         }
     }
     // Push `addEcommerceItem'
     foreach ($piwikItems as $piwikItem) {
         list($sku, $name, $rowTotal, $qty) = $piwikItem;
         $this->_piwikTracker->addEcommerceItem($sku, $name, false, $qty > 0 ? $rowTotal / $qty : 0, $qty);
     }
     // Push `trackEcommerceOrder'
     if (!empty($piwikOrder)) {
         list($orderId, $grandTotal, $subTotal, $tax, $shipping, $discount) = $piwikOrder;
         $this->_piwikTracker->trackEcommerceOrder($orderId, $grandTotal, $subTotal, $tax, $shipping, $discount > 0 ? $discount : false);
     }
     return $this;
 }
 /**
  * Push `trackSiteSearch' to tracker on search result page
  *
  * @param \Magento\Framework\Event\Observer $observer
  * @return \Henhed\Piwik\Observer\SearchResultObserver
  */
 public function execute(\Magento\Framework\Event\Observer $observer)
 {
     if (!$this->_dataHelper->isTrackingEnabled()) {
         return $this;
     }
     $query = $this->_queryFactory->get();
     $piwikBlock = $this->_view->getLayout()->getBlock('piwik.tracker');
     /* @var $query \Magento\Search\Model\Query */
     /* @var $piwikBlock \Henhed\Piwik\Block\Piwik */
     $keyword = $query->getQueryText();
     $resultsCount = $query->getNumResults();
     if (is_null($resultsCount)) {
         // If this is a new search query the result count hasn't been saved
         // yet so we have to fetch it from the search result block instead.
         $resultBock = $this->_view->getLayout()->getBlock('search.result');
         /* @var $resultBock \Magento\CatalogSearch\Block\Result */
         if ($resultBock) {
             $resultsCount = $resultBock->getResultCount();
         }
     }
     if (is_null($resultsCount)) {
         $this->_piwikTracker->trackSiteSearch($keyword);
     } else {
         $this->_piwikTracker->trackSiteSearch($keyword, false, (int) $resultsCount);
     }
     if ($piwikBlock) {
         // Don't push `trackPageView' when `trackSiteSearch' is set
         $piwikBlock->setSkipTrackPageView(true);
     }
     return $this;
 }
 /**
  * Test for \Henhed\Piwik\Observer\CheckoutSuccessObserver::execute where
  * tracking is disabled.
  *
  * @return void
  */
 public function testExecuteWithTrackingDisabled()
 {
     $this->_dataHelperMock->expects($this->once())->method('isTrackingEnabled')->willReturn(false);
     $this->_eventMock->expects($this->any())->method('getOrderIds')->willReturn([1]);
     $this->_orderCollectionMock->expects($this->never())->method('getIterator');
     $this->assertSame($this->_testSubject, $this->_testSubject->execute($this->_eventObserverMock));
     $this->assertEquals([], $this->_tracker->toArray());
 }
 /**
  * Test for \Henhed\Piwik\Helper\Tracker::addQuote
  *
  * Also covers `addQuoteItem' and `addQuoteTotal'
  *
  * @param array $items
  * @param float $total
  * @dataProvider addQuoteDataProvider
  */
 public function testAddQuote($items, $total)
 {
     // Build expected tracker result from $items and $total
     $expectedResult = [];
     foreach ($items as $item) {
         list($sku, $name, $price, $qty) = $item;
         $expectedResult[] = ['addEcommerceItem', $sku, $name, false, (double) $price, (double) $qty];
     }
     $expectedResult[] = ['trackEcommerceCartUpdate', (double) $total];
     // Test `addQuote' with mock quote created from $items and $total
     $this->_helper->addQuote($this->_getQuoteMock($items, $total), $this->_tracker);
     $this->assertSame($expectedResult, $this->_tracker->toArray());
 }
 /**
  * Test magic tracker action push
  *
  * Covers Tracker::__call and Tracker::toArray
  *
  * @param string $name
  * @param array $args
  * @dataProvider trackerActionDataProvider
  */
 public function testMagicPush($name, $args)
 {
     $this->_actionFactory->expects($this->once())->method('create')->with(['name' => $name, 'args' => $args])->will($this->returnValue(new Tracker\Action($name, $args)));
     call_user_func_array(array($this->_tracker, $name), $args);
     $this->assertEquals([array_merge([$name], $args)], $this->_tracker->toArray());
 }
 /**
  * Push `trackEcommerceCartUpdate' with quote data to given tracker
  *
  * @param \Magento\Quote\Model\Quote $quote
  * @param \Henhed\Piwik\Model\Tracker $tracker
  * @return \Henhed\Piwik\Helper\Tracker
  */
 public function addQuoteTotal(Quote $quote, TrackerModel $tracker)
 {
     $tracker->trackEcommerceCartUpdate((double) $quote->getBaseGrandTotal());
     return $this;
 }