Pickups.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. /**
  3. * Refer to LICENSE.txt distributed with the Temando Shipping module for notice of license
  4. */
  5. namespace Temando\Shipping\Block\Adminhtml\Sales\Order\Tab;
  6. use Magento\Backend\Block\Template\Context;
  7. use Magento\Backend\Block\Widget\Button;
  8. use Magento\Backend\Block\Widget\Tab\TabInterface;
  9. use Magento\Framework\Exception\LocalizedException;
  10. use Magento\Framework\Registry;
  11. use Magento\Framework\View\Element\Text\ListText;
  12. use Temando\Shipping\Model\Pickup\PickupLoader;
  13. use Temando\Shipping\Model\Pickup\PickupManagementFactory;
  14. use Temando\Shipping\Model\PickupInterface;
  15. use Temando\Shipping\ViewModel\DataProvider\PickupUrl;
  16. use Temando\Shipping\ViewModel\Order\OrderDetails;
  17. /**
  18. * Sales Order Pickup Tab
  19. *
  20. * @api
  21. * @package Temando\Shipping\Block
  22. * @author Sebastian Ertner <sebastian.ertner@netresearch.de>
  23. * @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  24. * @link https://www.temando.com/
  25. *
  26. */
  27. class Pickups extends ListText implements TabInterface
  28. {
  29. /**
  30. * @var Registry
  31. */
  32. private $registry;
  33. /**
  34. * @var OrderDetails
  35. */
  36. private $orderDetails;
  37. /**
  38. * @var PickupUrl
  39. */
  40. private $pickupUrl;
  41. /**
  42. * @var PickupLoader
  43. */
  44. private $pickupLoader;
  45. /**
  46. * @var PickupManagementFactory
  47. */
  48. private $pickupManagementFactory;
  49. /**
  50. * Pickup constructor.
  51. * @param Context $context
  52. * @param Registry $registry
  53. * @param OrderDetails $orderDetails
  54. * @param PickupUrl $pickupUrl
  55. * @param PickupLoader $pickupLoader
  56. * @param PickupManagementFactory $pickupManagementFactory
  57. * @param mixed[] $data
  58. */
  59. public function __construct(
  60. Context $context,
  61. Registry $registry,
  62. OrderDetails $orderDetails,
  63. PickupUrl $pickupUrl,
  64. PickupLoader $pickupLoader,
  65. PickupManagementFactory $pickupManagementFactory,
  66. array $data = []
  67. ) {
  68. $this->registry = $registry;
  69. $this->orderDetails = $orderDetails;
  70. $this->pickupUrl = $pickupUrl;
  71. $this->pickupLoader = $pickupLoader;
  72. $this->pickupManagementFactory = $pickupManagementFactory;
  73. parent::__construct($context, $data);
  74. }
  75. /**
  76. * @return \Magento\Sales\Model\Order
  77. */
  78. private function getOrder()
  79. {
  80. return $this->registry->registry('current_order');
  81. }
  82. /**
  83. * Get Header Text for Order Selection
  84. *
  85. * @return \Magento\Framework\Phrase
  86. */
  87. public function getHeaderText()
  88. {
  89. return __('Pickups');
  90. }
  91. /**
  92. * Prepare label for tab
  93. *
  94. * @return \Magento\Framework\Phrase
  95. */
  96. public function getTabLabel()
  97. {
  98. return __('Pickups');
  99. }
  100. /**
  101. * Prepare tab title
  102. *
  103. * @return string
  104. */
  105. public function getTabTitle()
  106. {
  107. return $this->getTabLabel();
  108. }
  109. /**
  110. * Can show tab in tabs
  111. *
  112. * @return true
  113. */
  114. public function canShowTab()
  115. {
  116. $order = $this->getOrder();
  117. return $this->orderDetails->isPickupOrder($order);
  118. }
  119. /**
  120. * Returns status flag about this tab hidden or not
  121. *
  122. * @return true
  123. */
  124. public function isHidden()
  125. {
  126. return !$this->canShowTab();
  127. }
  128. /**
  129. * @return ListText
  130. * @throws LocalizedException
  131. */
  132. public function _prepareLayout()
  133. {
  134. $order = $this->getOrder();
  135. if (!$order->canShip() || !$this->orderDetails->isPickupOrder($order)) {
  136. // do not add "Prepare for Pickup" button if all items were shipped.
  137. return parent::_prepareLayout();
  138. }
  139. // load all pickups associated to the current order
  140. $pickups = $this->pickupLoader->load((int)$order->getId());
  141. $pickupManagement = $this->pickupManagementFactory->create([
  142. 'pickups' => $pickups,
  143. ]);
  144. $requestedPickups = $pickupManagement->getPickupsByState(PickupInterface::STATE_REQUESTED);
  145. if (empty($requestedPickups)) {
  146. // do not add "Prepare for Pickup" button if no pending pickup fulfillments exist.
  147. return parent::_prepareLayout();
  148. }
  149. /** @var PickupInterface $requestedPickup */
  150. $requestedPickup = current($requestedPickups);
  151. $prepareForPickupUrl = $this->pickupUrl->getEditActionUrl([
  152. 'sales_order_id' => $order->getId(),
  153. 'pickup_id' => $requestedPickup->getPickupId()
  154. ]);
  155. /** @var \Magento\Framework\View\Element\Template $toolbar */
  156. $toolbar = $this->getLayout()->getBlock('page.actions.toolbar');
  157. $toolbar->addChild('pickup_prepare', Button::class, [
  158. 'label' => __('Prepare for Pickup'),
  159. 'onclick' => sprintf("setLocation('%s')", $prepareForPickupUrl),
  160. ]);
  161. return parent::_prepareLayout();
  162. }
  163. }