<?php
namespace App\EventSubscriber;
use App\Entity\Delivery;
use App\Repository\DeliveryMethodRepository;
use App\Repository\DeliveryRepository;
use App\Service\ShopifyAPI;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use Google\Client;
use Google\Service\Calendar;
use Google_Service_Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
class DeliverySubscriber extends AbstractController implements EventSubscriberInterface
{
private $api;
private $em;
private $methodRepository;
private $deliveryRepository;
private $mailer;
public function __construct(ShopifyAPI $shopifyAPI, EntityManagerInterface $entityManager, DeliveryMethodRepository $deliveryMethodRepository, DeliveryRepository $deliveryRepository, MailerInterface $mailer)
{
$this->api = $shopifyAPI;
$this->em = $entityManager;
$this->methodRepository = $deliveryMethodRepository;
$this->deliveryRepository = $deliveryRepository;
$this->mailer = $mailer;
}
/**
* @throws TransportExceptionInterface
* @throws \Google\Exception
*/
public function onKernelRequest(RequestEvent $event)
{
if($event->getRequest()->getPathInfo() === '/admin/delivery'){
$orders = $this->api->shopifyRequest('orders.json', [
'financial_status' => 'paid',
]);
foreach ($orders as $order){
foreach ($order as $item){
$delivery = $this->deliveryRepository->findOneBy(['shopify_id' => $item->id]);
if (((!empty($item->shipping_lines) || $item->line_items[0]->title === 'Essayage virtuel') && $delivery === null)){
$delivery = new Delivery();
$delivery->setFullName($item->shipping_address->name ?? $item->billing_address->name);
$delivery->setFirstName($item->shipping_address->first_name ?? $item->billing_address->first_name);
$delivery->setLastName($item->shipping_address->last_name ?? $item->billing_address->last_name);
$delivery->setEmail($item->customer->email);
$delivery->setTel($item->shipping_address->phone ?? $item->billing_address->phone);
$delivery->setLastUpdate(new \DateTime());
$delivery->setCreationDate(new \DateTime());
$delivery->setSent(!($item->fulfillment_status === null));
$delivery->setShopifyId($item->id);
foreach ($item->line_items as $product){
if($delivery->getProduct() === null || $delivery->getProduct() === ''){
$delivery->setProduct(ucfirst($product->name));
}else{
$delivery->setProduct($delivery->getProduct().' + '.ucfirst($product->name));
}
}
$this->em->persist($delivery);
$delivery->setAddress(isset($item->shipping_address->address1) ? $item->shipping_address->address1.', '.$item->shipping_address->city.', '.$item->shipping_address->zip : $item->billing_address->address1.', '.$item->billing_address->city.', '.$item->billing_address->zip);
$delivery->setDeliveryMethod($this->methodRepository->findOneBy(['name' => $item->shipping_lines[0]->code ?? 'Chronopost']));
// if($delivery->isSent() === false){
// $deliveryConfirmation = (new Email())
// ->from(new Address('contact@lamusee.com', 'LAMUSEE'))
// ->subject('L\'Amusee - Nouvelle commande Shopify - '.$delivery->getFullName())
// ->to('contact@lamusee.com')
// ->html($this->render('admin/delivery/email/new_delivery_shopify.html.twig', ['delivery' => $delivery, 'number' => $item->name, 'ADMIN_URL_PREFIX' => $this->getParameter('url_prefix')])->getContent());
// $this->mailer->send($deliveryConfirmation);
// }
}
//Ajouter commentaire sur le elseif pour désynchroniser le traitement des commandes Shopify
elseif($delivery){
$previous = $delivery->isSent();
$delivery->setSent(!($item->fulfillment_status === null));
$delivery->setLastUpdate(new \DateTime());
if($previous !== !($item->fulfillment_status === null)){
$client = new Client();
$client->setAuthConfig('../config/googleConfig.json');
$id = str_replace('-', '', $delivery->getId()->jsonSerialize());
$client->addScope(Calendar::CALENDAR_EVENTS);
$calendarService = new Calendar($client);
$calendarId = 'o01cfgbnobksvm0kdnvo06jfs0@group.calendar.google.com';
try {
$event = $calendarService->events->get($calendarId, $id);
if($event){
$event->setColorId($delivery->isSent() ? '4' : null);
$calendarService->events->update($calendarId, $event->getId(), $event);
}
} catch (Google_Service_Exception $e){
}
}
}
try {
$this->em->persist($delivery);
$this->em->flush();
} catch (Exception $exception) {
dd($exception->getMessage());
}
}
}
}
}
public static function getSubscribedEvents()
{
return [
// On doit définir une priorité élevée
KernelEvents::REQUEST => [['onKernelRequest', 20]],
];
}
}