Files
2025-08-02 16:30:27 +02:00

165 lines
6.1 KiB
PHP

<?php
namespace KupShop\GTMOldBundle\Ecommerce;
use KupShop\GTMOldBundle\Utils\PriceComputer;
use KupShop\KupShopBundle\Context\CurrencyContext;
use KupShop\OrderingBundle\Util\Order\DeliveryInfo;
use KupShop\OrderingBundle\Util\Order\OrderInfo;
class Purchase extends AbstractEcommerce
{
protected $currencyContext;
/**
* @var DeliveryInfo
*/
private $deliveryInfo;
/**
* @var OrderInfo
*/
private $orderInfo;
/**
* @var PriceComputer
*/
protected $priceComputer;
public function __construct(CurrencyContext $currencyContext, DeliveryInfo $deliveryInfo, OrderInfo $orderInfo, PriceComputer $priceComputer)
{
$this->currencyContext = $currencyContext;
$this->deliveryInfo = $deliveryInfo;
$this->orderInfo = $orderInfo;
$this->priceComputer = $priceComputer;
}
/**
* Specific PageData.
*
* @throws \Exception
*/
public function getData(&$dataContainer)
{
$dbcfg = \Settings::getDefault();
$ec = new \stdClass();
$order = $this->pageData['body']['order'];
if (!empty($order) && $order instanceof \Order && !$order->getData('conversion_sent')) {
$shipping = $this->deliveryInfo->getDeliveryPrice($order);
$shipping = $this->priceComputer->processPrice($shipping);
$orderPrice = $this->priceComputer->getOrderPrice($order->total_price_array);
$orderVAT = $this->priceComputer->processPrice($order->total_price_array['value_vat']);
$deliveryType = $order->getDeliveryType();
$delivery = $deliveryType->getDelivery()->getName();
$payment = $deliveryType->getPayment()->class;
$affiliation = join(' - ', [$delivery, $payment]);
$discounts = [];
foreach ($order->getPurchaseState(true)->getDiscounts() as $discount) {
$discounts[] = [
'name' => $discount->getName(),
];
}
$coupons = join('|', array_map(function ($item) {
return $item['name'];
}, $discounts));
$ec->purchase = [
'actionField' => [
'id' => $order->order_no,
'affiliation' => $affiliation,
'revenue' => $orderPrice,
'tax' => $orderVAT,
'shipping' => $shipping,
'coupon' => $coupons,
],
'products' => [],
];
$currency = $this->currencyContext->getActive();
$deliveryItemId = $this->deliveryInfo->getDeliveryItem($order);
$orderPriceWithoutVat = $order->total_price_array['value_without_vat'];
if ($deliveryItemId) {
$orderPriceWithoutVat = $orderPriceWithoutVat->sub($order->fetchItems()[$deliveryItemId]['total_price']['value_without_vat']);
}
$orderPriceWithoutVat = $this->priceComputer->processPrice($orderPriceWithoutVat);
$dataContainer->transactionPriceWithoutVatAndDelivery = $orderPriceWithoutVat;
$dataContainer->discounts = $discounts;
$dataContainer->transactionId = $order->order_no;
$dataContainer->transactionAffiliation = $dbcfg->shop_title;
$dataContainer->transactionCurrency = $currency->getId();
$dataContainer->transactionTotal = $orderPrice;
$dataContainer->transactionTax = $orderVAT;
$dataContainer->transactionShipping = $shipping;
$dataContainer->transactionFlags = array_filter(array_keys($order->getFlags()));
$products = [];
foreach ($order->fetchItems() as $item) {
if ($item['id_product']) {
$id = !empty($item['id_variation']) ? ($item['id_product'].'_'.$item['id_variation']) : $item['id_product'];
$ec_product = [
'name' => $item['product']['title'],
'id' => $id,
'price' => $this->priceComputer->getPrice($item['piece_price']),
'brand' => $item['producer'],
'category' => $item['section_name'],
'variant' => $item['product']['variationTitle'] ?? '',
'quantity' => $item['pieces'],
'id_variation' => $item['id_variation'] ?? '',
'id_product' => $item['id_product'],
'ean' => $item['ean'] ?? '',
// 'coupon': '' // Optional fields may be omitted or set to empty string.
];
$this->modifyProductData($ec_product, $item);
$ec->purchase['products'][] = $ec_product;
$this->addProductField($products, $item);
}
}
$this->addAdditionalFields($dataContainer, $order);
$dataContainer->transactionProducts = $products;
$dataContainer->event = 'order_success';
$dataContainer->ecommerce = $ec;
if (!empty($order->invoice_name)) {
$dataContainer->user = $dataContainer->user ?? new \stdClass();
$dataContainer->user->name = $order->invoice_name;
$dataContainer->user->surname = $order->invoice_surname;
$dataContainer->user->email = $order->invoice_email;
}
}
}
// Na upravu dat ktere jdou do transactionProducts
protected function addProductField(&$products, $item)
{
$products[] = [
'name' => $item['product']['title'],
'sku' => !empty($item['id_variation']) ? ($item['id_product'].'_'.$item['id_variation']) : $item['id_product'],
'category' => $item['section_name'],
'categoryid' => $item['section_id'],
'price' => $this->priceComputer->getPrice($item['piece_price']),
'quantity' => $item['pieces'],
];
}
// Na upravu dat ktere jdou do ecommerce->products
protected function modifyProductData(&$ec_product, $order_item)
{
}
}