/** * transform a basket into order. * * @throws \RuntimeException * * @param null|\Sonata\Component\Basket\BasketInterface $basket * * @return null|\Sonata\Component\Order\OrderInterface */ public function transformIntoOrder(BasketInterface $basket) { $event = new BasketTransformEvent($basket); $this->eventDispatcher->dispatch(TransformerEvents::PRE_BASKET_TO_ORDER_TRANSFORM, $event); // Customer $customer = $basket->getCustomer(); if (!$customer instanceof CustomerInterface) { if ($this->getLogger()) { $this->getLogger()->emergency('[Sonata\\Component\\Payment\\Transform\\Basket::transform] the customer is not valid'); } throw new \RuntimeException('Invalid customer'); } // Billing $billingAddress = $basket->getBillingAddress(); if (!$billingAddress instanceof AddressInterface) { if ($this->getLogger()) { $this->getLogger()->emergency('[Sonata\\Component\\Payment\\Transform\\Basket::transform] the billing address is not valid'); } throw new \RuntimeException('Invalid billing address'); } $paymentMethod = $basket->getPaymentMethod(); if (!$paymentMethod instanceof PaymentInterface) { if ($this->getLogger()) { $this->getLogger()->emergency('[Sonata\\Component\\Payment\\PaymentInterface::transform] the payment method is not valid'); } throw new \RuntimeException('Invalid payment method'); } // Shipping $deliveryMethod = $basket->getDeliveryMethod(); if (!$deliveryMethod instanceof ServiceDeliveryInterface) { if ($this->getLogger()) { $this->getLogger()->emergency('[Sonata\\Component\\Delivery\\ServiceDeliveryInterface::transform] the delivery method is not valid'); } throw new \RuntimeException('Invalid delivery method'); } $deliveryAddress = $basket->getDeliveryAddress(); if ($deliveryMethod->isAddressRequired() && !$deliveryAddress instanceof AddressInterface) { if ($this->getLogger()) { $this->getLogger()->emergency('[Sonata\\Component\\Delivery\\ServiceDeliveryInterface::transform] the shipping address is not valid'); } throw new \RuntimeException('Invalid delivery address'); } // add a custom class_instance for testing purpose. $order = $this->orderManager->create(); $order->setCustomer($customer); $order->setUsername($customer->getFullname()); $order->setLocale($customer->getLocale()); if ($deliveryMethod->isAddressRequired()) { $order->setShippingAddress1($deliveryAddress->getAddress1()); $order->setShippingAddress2($deliveryAddress->getAddress2()); $order->setShippingAddress3($deliveryAddress->getAddress3()); $order->setShippingPostcode($deliveryAddress->getPostcode()); $order->setShippingCity($deliveryAddress->getCity()); $order->setShippingCountryCode($deliveryAddress->getCountryCode()); $order->setShippingName($deliveryAddress->getFirstname() . ' ' . $deliveryAddress->getLastname()); $order->setShippingPhone($deliveryAddress->getPhone()); } $order->setBillingAddress1($billingAddress->getAddress1()); $order->setBillingAddress2($billingAddress->getAddress2()); $order->setBillingAddress3($billingAddress->getAddress3()); $order->setBillingPostcode($billingAddress->getPostcode()); $order->setBillingCity($billingAddress->getCity()); $order->setBillingCountryCode($billingAddress->getCountryCode()); $order->setBillingName($billingAddress->getFirstname() . ' ' . $billingAddress->getLastname()); $order->setBillingPhone($billingAddress->getPhone()); $order->setTotalExcl($basket->getTotal()); $order->setTotalInc($basket->getTotal(true)); $order->setDeliveryVat($basket->getDeliveryVat()); $order->setDeliveryCost($basket->getDeliveryPrice(true)); $order->setDeliveryMethod($basket->getDeliveryMethod()->getCode()); $order->setDeliveryStatus(ServiceDeliveryInterface::STATUS_OPEN); $order->setCreatedAt(new \DateTime()); $order->setCurrency($basket->getCurrency()); $order->setStatus(OrderInterface::STATUS_OPEN); $order->setPaymentStatus(TransactionInterface::STATUS_OPEN); $order->setPaymentMethod($basket->getPaymentMethod()->getCode()); foreach ($basket->getBasketElements() as $basketElement) { $orderElement = $basketElement->getProductProvider()->createOrderElement($basketElement); if (!$orderElement instanceof OrderElementInterface) { continue; } $order->addOrderElement($orderElement); } $event = new OrderTransformEvent($order); $this->eventDispatcher->dispatch(TransformerEvents::POST_BASKET_TO_ORDER_TRANSFORM, $event); return $order; }