/** * 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 `addEcommerceItem' with quote item data to given tracker * * @param \Magento\Quote\Model\Quote\Item $item * @param \Henhed\Piwik\Model\Tracker $tracker * @return \Henhed\Piwik\Helper\Tracker */ public function addQuoteItem(Quote\Item $item, TrackerModel $tracker) { $tracker->addEcommerceItem($item->getSku(), $item->getName(), false, $item->hasCustomPrice() ? (double) $item->getCustomPrice() : (double) $item->getPriceInclTax(), (double) $item->getQty()); return $this; }