- <?php
- /**
-  * Pimcore
-  *
-  * This source file is available under two different licenses:
-  * - GNU General Public License version 3 (GPLv3)
-  * - Pimcore Enterprise License (PEL)
-  * Full copyright and license information is available in
-  * LICENSE.md which is distributed with this source code.
-  *
-  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
-  *  @license    http://www.pimcore.org/license     GPLv3 and PEL
-  */
- namespace App\EventListener;
- use App\Model\CustomerManagementFramework\Activity\OrderActivity;
- use CustomerManagementFrameworkBundle\ActivityManager\ActivityManagerInterface;
- use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
- use Pimcore\Event\Model\Ecommerce\CommitOrderProcessorEvent;
- use Pimcore\Event\Model\Ecommerce\OrderManagerEvent;
- use Pimcore\Event\Model\Ecommerce\SendConfirmationMailEvent;
- use Pimcore\Localization\LocaleServiceInterface;
- use Pimcore\Mail;
- use Pimcore\Model\DataObject\OnlineShopOrder;
- use Pimcore\Model\Document\Email;
- class CheckoutEventListener
- {
-     /**
-      * @var Factory
-      */
-     protected $ecommerceFactory;
-     /**
-      * @var ActivityManagerInterface
-      */
-     protected $activityManager;
-     /**
-      * @var LocaleServiceInterface
-      */
-     protected $localeService;
-     /**
-      * CheckoutEventListener constructor.
-      *
-      * @param Factory $ecommerceFactory
-      * @param ActivityManagerInterface $activityManager
-      */
-     public function __construct(Factory $ecommerceFactory, ActivityManagerInterface $activityManager, LocaleServiceInterface $localeService)
-     {
-         $this->ecommerceFactory = $ecommerceFactory;
-         $this->activityManager = $activityManager;
-         $this->localeService = $localeService;
-     }
-     /**
-      * @param OrderManagerEvent $event
-      *
-      * @throws \Exception
-      */
-     public function onUpdateOrder(OrderManagerEvent $event)
-     {
-         $cart = $event->getCart();
-         /**
-          * @var $order OnlineShopOrder
-          */
-         $order = $event->getOrder();
-         $checkout = $this->ecommerceFactory->getCheckoutManager($cart);
-         $deliveryAddress = $checkout->getCheckoutStep('deliveryaddress') ? $checkout->getCheckoutStep('deliveryaddress')->getData() : null;
-         $billingAddress = $checkout->getCheckoutStep('billingaddress') ? $checkout->getCheckoutStep('billingaddress')->getData() : null;
-         $collectInfo = $checkout->getCheckoutStep('collectInfo') ? $checkout->getCheckoutStep('collectInfo')->getData() : null;
-         if ($collectInfo) {
-             $data = $collectInfo;
-             //inserting customer info from checkout step delivery
-             $order->setCustomerFirstname(property_exists($data, 'firstname') ? $data->firstname : '');
-             $order->setCustomerLastname(property_exists($data, 'lastname') ? $data->lastname : '');
-             $order->setCustomerCompany(property_exists($data, 'company') ? $data->company : '');
-             $order->setCustomerEmail($data->email);
-             $order->setCustomerOrderedBy(property_exists($data, 'orderedBy') ? $data->orderedBy : '');
-             $order->setCustomerGdcNumber(property_exists($data, 'gdcNumber') && $data->gdcNumber ? $data->gdcNumber : '');
-         }
-         if ($deliveryAddress) {
-             $data = $deliveryAddress;
-             //inserting delivery and billing address from checkout step delivery
-             $order->setDeliveryFirstname(property_exists($data, 'firstname') ? $data->firstname : '');
-             $order->setDeliveryLastname(property_exists($data, 'lastname') ? $data->lastname : '');
-             $order->setDeliveryCompany($data->company);
-             $order->setDeliveryLine1($data->line1);
-             $order->setDeliveryLine2($data->line2);
-             $order->setDeliveryComment($data->comment);
-             $order->setDeliveryPhone($data->phone);
-             $order->setDeliveryZip($data->zip);
-             $order->setDeliveryCity($data->city);
-             $order->setDeliveryCounty($data->county);
-             $order->setDeliveryCountry($data->countryCode);
-         }
-         if ($billingAddress) {
-             $data = $billingAddress;
-             //inserting delivery and billing address from checkout step delivery
-             $order->setBillingFirstname(property_exists($data, 'firstname') ? $data->firstname : '');
-             $order->setBillingLastname(property_exists($data, 'lastname') ? $data->lastname : '');
-             $order->setBillingCompany($data->company);
-             $order->setBillingLine1($data->line1);
-             $order->setBillingLine2($data->line2);
-             $order->setBillingZip($data->zip);
-             $order->setBillingCity($data->city);
-             $order->setBillingCounty($data->county);
-             $order->setBillingCountry($data->countryCode);
-         }
-         //save sign-up or rejoin data to order
-         $order->setHiddenData(json_encode($collectInfo));
-         $order->save();
-         //attach order to customer
-         $customer = $order->getCustomer();
-         if ($customer) {
-             $customer->setGeneralOrders(array_merge($customer->getGeneralOrders(), [$order]));
-             $customer->save();
-         }
-     }
-     /**
-      * @param SendConfirmationMailEvent $event
-      */
-     public function sendConfirmationMail(SendConfirmationMailEvent $event)
-     {
-         $order = $event->getOrder();
-         $mail = new Mail();
-         $mail->setDocument(Email::getByPath('/' . $this->localeService->getLocale() . '/mails/confirmation-mail'));
-         $mail->setParams([
-             'ordernumber' => $order->getOrdernumber(),
-             'order' => $order
-         ]);
-         $mail->addTo($order->getCustomerEMail());
-         $mail->send();
-         $event->setSkipDefaultBehaviour(false);
-     }
-     /**
-      * @param CommitOrderProcessorEvent $event
-      *
-      * @throws \Pimcore\Bundle\EcommerceFrameworkBundle\Exception\UnsupportedException
-      */
-     public function postCommitOrder(CommitOrderProcessorEvent $event)
-     {
-         $order = $event->getOrder();
-         if ($this->activityManager && $order->getCustomer()) {
-             $this->activityManager->trackActivity(new OrderActivity($order->getCustomer(), $order));
-         }
-     }
- }
-