123 lines
3.8 KiB
PHP
123 lines
3.8 KiB
PHP
<?php
|
|
|
|
|
|
namespace Empik\Marketplace\OrderFulfiller;
|
|
|
|
use Empik\Marketplace\Provider\Order\AddressProvider;
|
|
use Empik\Marketplace\Provider\Order\CarrierProvider;
|
|
use Empik\Marketplace\Provider\Order\CustomerProvider;
|
|
use Empik\Marketplace\Provider\Order\HistoryProvider;
|
|
use Empik\Marketplace\Provider\Order\CartProvider;
|
|
use Empik\Marketplace\Provider\Order\OrderLinesProvider;
|
|
use Empik\Marketplace\Exception\OrderProcessException;
|
|
|
|
class OrderFulfiller
|
|
{
|
|
/** @var AddressProvider */
|
|
protected $addressProvider;
|
|
|
|
/** @var CustomerProvider */
|
|
protected $customerProvider;
|
|
|
|
/** @var OrderLinesProvider */
|
|
protected $orderLinesProvider;
|
|
|
|
/** @var CarrierProvider */
|
|
protected $carrierProvider;
|
|
|
|
/** @var HistoryProvider */
|
|
protected $historyProvider;
|
|
|
|
/** @var CartProvider */
|
|
protected $cartProvider;
|
|
|
|
public function __construct(
|
|
AddressProvider $addressProvider,
|
|
CustomerProvider $customerProvider,
|
|
OrderLinesProvider $orderLinesProvider,
|
|
CarrierProvider $carrierProvider,
|
|
HistoryProvider $historyProvider,
|
|
CartProvider $cartProvider
|
|
) {
|
|
$this->addressProvider = $addressProvider;
|
|
$this->customerProvider = $customerProvider;
|
|
$this->orderLinesProvider = $orderLinesProvider;
|
|
$this->carrierProvider = $carrierProvider;
|
|
$this->historyProvider = $historyProvider;
|
|
$this->cartProvider = $cartProvider;
|
|
}
|
|
|
|
/**
|
|
* @param EmpikOrderWrapper $order
|
|
* @throws OrderProcessException
|
|
* @throws \PrestaShopDatabaseException
|
|
* @throws \PrestaShopException
|
|
*/
|
|
public function fulfill(EmpikOrderWrapper $order)
|
|
{
|
|
$data = $order->getData();
|
|
|
|
$this->validate($data);
|
|
|
|
// add customer
|
|
$prestaShopCustomer = $this->customerProvider->provide($data);
|
|
$order->setCustomer($prestaShopCustomer);
|
|
|
|
// add addresses
|
|
$billingAddress = isset($data['customer']['billing_address']) ? $data['customer']['billing_address'] : null;
|
|
$shippingAddress = isset($data['customer']['shipping_address']) ? $data['customer']['shipping_address'] : null;
|
|
$additionalFields = isset($data['order_additional_fields']) ? $data['order_additional_fields'] : [];
|
|
|
|
$prestaShopShippingAddress = $this->addressProvider->provide(
|
|
$shippingAddress,
|
|
$order->getCustomer()
|
|
);
|
|
$order->setShippingAddress($prestaShopShippingAddress);
|
|
|
|
$prestaShopBillingAddress = $this->addressProvider->provide(
|
|
$billingAddress,
|
|
$order->getCustomer(),
|
|
$additionalFields
|
|
);
|
|
$order->setBillingAddress($prestaShopBillingAddress);
|
|
|
|
// add cart
|
|
$cart = $this->cartProvider->provide($data);
|
|
$order->setCart($cart);
|
|
|
|
// add order lines
|
|
$orderLines = $this->orderLinesProvider->provide($data);
|
|
$order->setOrderDetails($orderLines);
|
|
|
|
// add carrier
|
|
$carrier = $this->carrierProvider->provide($data);
|
|
$order->setCarrier($carrier);
|
|
|
|
// add order status
|
|
$history = $this->historyProvider->provide($data);
|
|
$order->setOrderHistory($history);
|
|
|
|
$order->add();
|
|
}
|
|
|
|
/**
|
|
* @param array $data
|
|
* @throws OrderProcessException
|
|
*/
|
|
protected function validate($data)
|
|
{
|
|
if (
|
|
(
|
|
empty($data['customer']['shipping_address']) &&
|
|
empty($data['customer']['billing_address'])
|
|
) ||
|
|
empty($data['order_id']) ||
|
|
empty($data['order_lines']) ||
|
|
empty($data['order_state']) ||
|
|
empty($data['total_price'])
|
|
) {
|
|
throw new OrderProcessException(sprintf('Invalid order data for order: %s', $data['order_id']));
|
|
}
|
|
}
|
|
}
|