<?php
namespace App\Services;
use App\Entity\Category;
use App\Entity\CompareProduct;
use App\Entity\Language;
use App\Entity\Order;
use App\Entity\OrderProduct;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use phpDocumentor\Reflection\Types\Self_;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
use FacebookAds\Object\ServerSide\ActionSource;
use FacebookAds\Object\ServerSide\Content;
use FacebookAds\Object\ServerSide\CustomData;
use FacebookAds\Object\ServerSide\DeliveryCategory;
use FacebookAds\Object\ServerSide\Event;
use FacebookAds\Object\ServerSide\EventRequest;
use FacebookAds\Object\ServerSide\UserData;
class FacebookApiConversion
{
//const PIXEL_ID = '1672124773108240';
const FB_PURCHASE_EVENT = 'Purchase';
/** @var Session Session */
protected $session;
protected $em;
protected $request;
protected $container;
/**
* CompareManager constructor.
* @param EntityManager $em
* @param RequestStack $requestStack
* @param Session $session
*/
public function __construct(EntityManagerInterface $em, RequestStack $requestStack, SessionInterface $session, ContainerInterface $container) {
$this->session = $session;
$this->em = $em;
$this->request = $requestStack->getMasterRequest();
$this->container = $container;
}
public function curPageURL() {
if (!isset($_SERVER["HTTPS"])) {
return;
}
if (!isset($_SERVER["REQUEST_URI"])) {
return;
}
if (!isset($_SERVER["HTTP_HOST"])) {
return;
}
if (!isset($_SERVER["SERVER_PORT"])) {
return;
}
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["HTTP_HOST"]."".$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
public function createFbEvent($eventName, Order $order = null) {
$language = 'pl';
if ($this->request->getLocale()) {
$language = strtolower($this->request->getLocale());
}
$languageEntity = $this->em->getRepository(Language::class)->findOneBy(['locale'=>$language, 'deletedBy'=>null]);
if (!$languageEntity) {
return;
}
$access_token = $languageEntity->getFbToken();
$pixel = $languageEntity->getFbPixel();
if (!$access_token) {
return;
}
if (!$pixel) {
return;
}
$url = $this->curPageURL();
$clickId = null;
if ($this->request->query->get('fbclid')) {
$clickId = $this->request->query->get('fbclid');
}
$cookies = $this->request->cookies->all();
if ($clickId === null) {
if ($cookies && isset($cookies['_fbc'])) {
$clickId = $cookies['_fbc'];
}
}
$fbp = null;
if ($cookies && isset($cookies['_fbp'])) {
$fbp = $cookies['_fbp'];
}
$api = Api::init(null, null, $access_token);
$api->setLogger(new CurlLogger());
$user_data = (new UserData())
// It is recommended to send Client IP and User Agent for Conversions API Events.
->setClientIpAddress($_SERVER['REMOTE_ADDR'])
->setClientUserAgent($_SERVER['HTTP_USER_AGENT']);
if ($clickId) {
$user_data->setFbc($clickId);
}
if ($fbp) {
$user_data->setFbp($fbp);
}
if ($this->request->getLocale() != 'pl') {
$custom_data = new CustomData();
if ($eventName == 'AddToCart' && $this->request->get('product_id')) {
$custom_data->setContentIds([$this->request->get('product_id')]);
$custom_data->setContentType('product');
}
if ($eventName == 'ViewContent' && $this->request->attributes->get('id')) {
$custom_data->setContentIds([$this->request->get('id')]);
$custom_data->setContentType('product');
}
}
if ($order) {
$user_data = (new UserData())
->setEmails(array($order->getEmail()))
->setPhones(array($order->getPhone()))
->setCountryCode(strtoupper($languageEntity->getLocale()))
->setClientIpAddress($_SERVER['REMOTE_ADDR'])
->setClientUserAgent($_SERVER['HTTP_USER_AGENT']);
if ($clickId) {
$user_data->setFbc($clickId);
}
if ($fbp) {
$user_data->setFbp($fbp);
}
$contents = [];
/** @var $orderProduct OrderProduct */
foreach ($order->getProducts() as $orderProduct) {
$productId = $orderProduct->getSubProduct() ? $orderProduct->getSubProduct()->getProduct()->getId() : $orderProduct->getProduct()->getId();
$contentElement = (new Content())
->setProductId($productId)
->setQuantity($orderProduct->getQuantity())
->setItemPrice($orderProduct->getGrossPrice())
->setDeliveryCategory(DeliveryCategory::HOME_DELIVERY);
$contents[] = $contentElement;
}
$custom_data = (new CustomData())
->setContents($contents)
->setCurrency($languageEntity->getCurrency()->getIsoCode())
->setOrderId($order->getId())
->setValue($order->getTotalCostBrutto());
}
$event = (new Event())
->setEventName($eventName)
->setEventTime(time())
->setEventSourceUrl($url)
->setUserData($user_data)
->setCustomData($custom_data)
->setActionSource(ActionSource::WEBSITE);
$events = array();
array_push($events, $event);
$request = (new EventRequest($pixel))
->setEvents($events);
try {
$response = $request->execute();
return $response;
} catch (\Exception $e) {
//
}
}
}