StateResolver.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Model\Order;
  7. use Magento\Sales\Api\Data\OrderInterface;
  8. use Magento\Sales\Model\Order;
  9. /**
  10. * Class OrderStateResolver
  11. */
  12. class StateResolver implements OrderStateResolverInterface
  13. {
  14. /**
  15. * Check if order should be in complete state
  16. *
  17. * @param OrderInterface $order
  18. * @return bool
  19. */
  20. private function isOrderComplete(OrderInterface $order)
  21. {
  22. /** @var $order Order|OrderInterface */
  23. if (0 == $order->getBaseGrandTotal() || $order->canCreditmemo()) {
  24. return true;
  25. }
  26. return false;
  27. }
  28. /**
  29. * Check if order should be in closed state
  30. *
  31. * @param OrderInterface $order
  32. * @param array $arguments
  33. * @return bool
  34. */
  35. private function isOrderClosed(OrderInterface $order, $arguments)
  36. {
  37. /** @var $order Order|OrderInterface */
  38. $forceCreditmemo = in_array(self::FORCED_CREDITMEMO, $arguments);
  39. if ((float)$order->getTotalRefunded() || !$order->getTotalRefunded() && $forceCreditmemo) {
  40. return true;
  41. }
  42. return false;
  43. }
  44. /**
  45. * Check if order is processing
  46. *
  47. * @param OrderInterface $order
  48. * @param array $arguments
  49. * @return bool
  50. */
  51. private function isOrderProcessing(OrderInterface $order, $arguments)
  52. {
  53. /** @var $order Order|OrderInterface */
  54. if ($order->getState() == Order::STATE_NEW && in_array(self::IN_PROGRESS, $arguments)) {
  55. return true;
  56. }
  57. return false;
  58. }
  59. /**
  60. * Returns initial state for order
  61. *
  62. * @param OrderInterface $order
  63. * @return string
  64. */
  65. private function getInitialOrderState(OrderInterface $order)
  66. {
  67. return $order->getState() === Order::STATE_PROCESSING ? Order::STATE_PROCESSING : Order::STATE_NEW;
  68. }
  69. /**
  70. * @param OrderInterface $order
  71. * @param array $arguments
  72. * @return string
  73. */
  74. public function getStateForOrder(OrderInterface $order, array $arguments = [])
  75. {
  76. /** @var $order Order|OrderInterface */
  77. $orderState = $this->getInitialOrderState($order);
  78. if (!$order->isCanceled() && !$order->canUnhold() && !$order->canInvoice() && !$order->canShip()) {
  79. if ($this->isOrderComplete($order)) {
  80. $orderState = Order::STATE_COMPLETE;
  81. } elseif ($this->isOrderClosed($order, $arguments)) {
  82. $orderState = Order::STATE_CLOSED;
  83. }
  84. }
  85. if ($this->isOrderProcessing($order, $arguments)) {
  86. $orderState = Order::STATE_PROCESSING;
  87. }
  88. return $orderState;
  89. }
  90. }