/**
* 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;
}