diff --git a/Model/Order/CompleteOrder.php b/Model/Order/CompleteOrder.php new file mode 100644 index 00000000..3ac3f47b --- /dev/null +++ b/Model/Order/CompleteOrder.php @@ -0,0 +1,98 @@ +client = $client; + $this->orderExtensionDataFactory = $orderExtensionDataFactory; + $this->orderExtensionDataResource = $orderExtensionDataResource; + $this->logger = $logger; + } + + /** + * Mark the Order as created on the Bold side. + * + * @param OrderInterface $order + * @return void + * @throws LocalizedException + */ + public function execute(OrderInterface $order): void + { + $websiteId = (int)$order->getStore()->getWebsiteId(); + $publicOrderId = $this->getOrderPublicId($order); + $orderId = $order->getEntityId(); + $body = [ + 'platform_order_id' => $orderId, + ]; + $url = sprintf(self::COMPLETE_URL, $publicOrderId); + $response = $this->client->post($websiteId, $url, $body); + if ($response->getStatus() !== 200) { + $this->logger->error(__('Failed to complete order with id="%1"', $orderId)); + } + } + + /** + * Retrieve order public id. + * + * @param OrderInterface $order + * @return string + * @throws LocalizedException + */ + private function getOrderPublicId(OrderInterface $order): string + { + $orderExtensionData = $this->orderExtensionDataFactory->create(); + $this->orderExtensionDataResource->load($orderExtensionData, $order->getId(), OrderExtensionData::ORDER_ID); + if (!$orderExtensionData->getPublicId()) { + throw new LocalizedException(__('Order public id is not set.')); + } + + return $orderExtensionData->getPublicId(); + } +} diff --git a/Model/Order/PlaceOrder/CreateOrderFromPayload/CreateOrderFromQuote.php b/Model/Order/PlaceOrder/CreateOrderFromPayload/CreateOrderFromQuote.php index 5743c335..470bc012 100644 --- a/Model/Order/PlaceOrder/CreateOrderFromPayload/CreateOrderFromQuote.php +++ b/Model/Order/PlaceOrder/CreateOrderFromPayload/CreateOrderFromQuote.php @@ -141,6 +141,7 @@ public function create(CartInterface $quote, OrderDataInterface $orderPayload): [ 'order' => $order, 'quote' => $quote, + 'order_payload' => $orderPayload, ] ); diff --git a/Observer/Order/SaveOrderExtensionDataObserver.php b/Observer/Order/CheckoutSubmitAllAfterObserver.php similarity index 77% rename from Observer/Order/SaveOrderExtensionDataObserver.php rename to Observer/Order/CheckoutSubmitAllAfterObserver.php index c84bf4cf..37508392 100644 --- a/Observer/Order/SaveOrderExtensionDataObserver.php +++ b/Observer/Order/CheckoutSubmitAllAfterObserver.php @@ -3,6 +3,8 @@ namespace Bold\Checkout\Observer\Order; +use Bold\Checkout\Api\Data\PlaceOrder\Request\OrderDataInterface; +use Bold\Checkout\Model\Order\CompleteOrder; use Bold\Checkout\Model\Order\OrderExtensionDataFactory; use Bold\Checkout\Model\ResourceModel\Order\OrderExtensionData as OrderExtensionDataResource; use Exception; @@ -10,11 +12,12 @@ use Magento\Framework\Event\ManagerInterface as EventManagerInterface; use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; +use Magento\Framework\Exception\LocalizedException; /** - * Save order extension data. + * Perform after order submit actions. */ -class SaveOrderExtensionDataObserver implements ObserverInterface +class CheckoutSubmitAllAfterObserver implements ObserverInterface { /** * @var OrderExtensionDataFactory @@ -41,11 +44,17 @@ class SaveOrderExtensionDataObserver implements ObserverInterface */ private $boldPaymentMethods; + /** + * @var CompleteOrder + */ + private $completeOrder; + /** * @param OrderExtensionDataFactory $orderExtensionDataFactory * @param OrderExtensionDataResource $orderExtensionDataResource * @param Session $checkoutSession * @param EventManagerInterface $eventManager + * @param CompleteOrder $completeOrder * @param array $boldPaymentMethods */ public function __construct( @@ -53,6 +62,7 @@ public function __construct( OrderExtensionDataResource $orderExtensionDataResource, Session $checkoutSession, EventManagerInterface $eventManager, + CompleteOrder $completeOrder, array $boldPaymentMethods = [] ) { $this->orderExtensionDataFactory = $orderExtensionDataFactory; @@ -60,13 +70,15 @@ public function __construct( $this->checkoutSession = $checkoutSession; $this->eventManager = $eventManager; $this->boldPaymentMethods = $boldPaymentMethods; + $this->completeOrder = $completeOrder; } /** - * Save order extension data. + * Perform after order submit actions. * * @param Observer $observer * @return void + * @throws LocalizedException */ public function execute(Observer $observer) { @@ -80,6 +92,11 @@ public function execute(Observer $observer) $orderId = (int)$order->getEntityId(); $publicOrderId = $this->checkoutSession->getBoldCheckoutData()['data']['public_order_id'] ?? null; $this->checkoutSession->setBoldCheckoutData(null); + if (!$publicOrderId) { + /** @var OrderDataInterface $orderPayload */ + $orderPayload = $observer->getEvent()->getOrderPayload(); + $publicOrderId = $orderPayload ? $orderPayload->getPublicId() : null; + } if (!$publicOrderId) { return; } @@ -95,5 +112,6 @@ public function execute(Observer $observer) } catch (Exception $e) { return; } + $this->completeOrder->execute($order); } } diff --git a/etc/di.xml b/etc/di.xml index e262cd68..d6cd5acf 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -62,6 +62,11 @@ Bold\Checkout\Model\Http\BoldClient + + + Bold\Checkout\Model\Http\BoldClient + + Bold\Checkout\Model\Http\BoldClient @@ -146,7 +151,7 @@ - + bold diff --git a/etc/events.xml b/etc/events.xml index 079d32e9..03e95311 100644 --- a/etc/events.xml +++ b/etc/events.xml @@ -1,7 +1,7 @@ - +