Files
drmaterac.pl/modules/empikmarketplace/src/OrderFulfiller/OrderFulfiller.php
2025-03-21 20:24:43 +01:00

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']));
}
}
}