Skip to content

Commit

Permalink
Update order state
Browse files Browse the repository at this point in the history
  • Loading branch information
renatocason committed Oct 17, 2018
1 parent 6fb2462 commit f53f59e
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 2 deletions.
52 changes: 50 additions & 2 deletions Model/InvoiceProcess.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Magento\Sales\Model\Order;
use Magento\Sales\Model\Order\Invoice as OrderInvoice;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory as OrderCollectionFactory;
use Magento\Sales\Model\ResourceModel\Order\Status\CollectionFactory as OrderStatusCollectionFactory;
use Magento\Sales\Model\Service\InvoiceServiceFactory;

use Aune\AutoInvoice\Api\InvoiceProcessInterface;
Expand All @@ -28,6 +29,11 @@ class InvoiceProcess implements InvoiceProcessInterface
*/
private $orderCollectionFactory;

/**
* @var OrderStatusCollectionFactory
*/
private $orderStatusCollectionFactory;

/**
* @var InvoiceProcessItemInterfaceFactory
*/
Expand All @@ -43,22 +49,30 @@ class InvoiceProcess implements InvoiceProcessInterface
*/
private $invoiceServiceFactory;

/**
* @var array
*/
private $orderStatusToStateMap;

/**
* @param HelperData $helperData
* @param OrderCollectionFactory $orderCollectionFactory
* @param OrderStatusCollectionFactory $orderStatusCollectionFactory
* @param InvoiceProcessItemInterfaceFactory $invoiceProcessItemFactory
* @param Transaction $transaction
* @param InvoiceServiceFactory $invoiceServiceFactory
*/
public function __construct(
HelperData $helperData,
OrderCollectionFactory $orderCollectionFactory,
OrderStatusCollectionFactory $orderStatusCollectionFactory,
InvoiceProcessItemInterfaceFactory $invoiceProcessItemFactory,
Transaction $transaction,
InvoiceServiceFactory $invoiceServiceFactory
) {
$this->helperData = $helperData;
$this->orderCollectionFactory = $orderCollectionFactory;
$this->orderStatusCollectionFactory = $orderStatusCollectionFactory;
$this->invoiceProcessItemFactory = $invoiceProcessItemFactory;
$this->transaction = $transaction;
$this->invoiceServiceFactory = $invoiceServiceFactory;
Expand Down Expand Up @@ -105,14 +119,48 @@ private function getPaymentMethodCode(Order $order)
}
}

/**
* Returns the order status to state map
*/
private function getOrderStatusToStateMap()
{
if (!is_null($this->orderStatusToStateMap)) {
return $this->orderStatusToStateMap;
}

$collection = $this->orderStatusCollectionFactory->create()
->joinStates();

$this->orderStatusToStateMap = [];
foreach ($collection as $status) {
$this->orderStatusToStateMap[$status->getStatus()] = $status->getState();
}

return $this->orderStatusToStateMap;
}

/**
* Return the order state given a status
*/
private function getOrderStateByStatus(string $status)
{
$map = $this->getOrderStatusToStateMap();
return empty($map[$status]) ? false : $map[$status];
}

/**
* @inheritdoc
*/
public function invoice(InvoiceProcessItemInterface $item)
{
$order = $item->getOrder();

$order->setStatus($item->getDestinationStatus());
$status = $item->getDestinationStatus();
$order->setStatus($status);

if ($state = $this->getOrderStateByStatus($status)) {
$order->setState($state);
}

$invoice = $this->invoiceServiceFactory->create()
->prepareInvoice($order);
Expand All @@ -122,7 +170,7 @@ public function invoice(InvoiceProcessItemInterface $item)
$transactionSave = $this->transaction
->addObject($invoice)
->addObject($order);

$transactionSave->save();
}
}
63 changes: 63 additions & 0 deletions Test/Unit/Model/InvoiceProcessTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
use Magento\Sales\Model\Order\Invoice as OrderInvoice;
use Magento\Sales\Model\ResourceModel\Order\Collection as OrderCollection;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory as OrderCollectionFactory;
use Magento\Sales\Model\ResourceModel\Order\Status\Collection as OrderStatusCollection;
use Magento\Sales\Model\ResourceModel\Order\Status\CollectionFactory as OrderStatusCollectionFactory;
use Magento\Sales\Model\Service\InvoiceService;
use Magento\Sales\Model\Service\InvoiceServiceFactory;

Expand All @@ -31,6 +33,11 @@ class InvoiceProcessTest extends \PHPUnit\Framework\TestCase
*/
private $orderCollectionFactoryMock;

/**
* @var OrderStatusCollectionFactory|PHPUnit_Framework_MockObject_MockObject
*/
private $orderStatusCollectionFactoryMock;

/**
* @var InvoiceProcessItemInterfaceFactory|PHPUnit_Framework_MockObject_MockObject
*/
Expand Down Expand Up @@ -61,6 +68,11 @@ protected function setUp()
->disableOriginalConstructor()
->getMock();

$this->orderStatusCollectionFactoryMock = $this->getMockBuilder(OrderStatusCollectionFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();

$this->invoiceProcessItemFactoryMock = $this->getMockBuilder(InvoiceProcessItemInterfaceFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
Expand All @@ -78,6 +90,7 @@ protected function setUp()
$this->invoiceProcess = new InvoiceProcess(
$this->helperDataMock,
$this->orderCollectionFactoryMock,
$this->orderStatusCollectionFactoryMock,
$this->invoiceProcessItemFactoryMock,
$this->transactionMock,
$this->invoiceServiceFactoryMock
Expand Down Expand Up @@ -291,6 +304,30 @@ private function getOrderMock(int $orderId, string $paymentMethod)
public function testInvoice()
{
$status = 'complete';

$orderStatusCollectionMock = $this->getMockBuilder(OrderStatusCollection::class)
->disableOriginalConstructor()
->getMock();

$orderStatusCollectionMock->expects(self::once())
->method('joinStates')
->willReturn($orderStatusCollectionMock);

$this->orderStatusCollectionFactoryMock->expects(self::once())
->method('create')
->willReturn($orderStatusCollectionMock);

$statuses = [
$this->getOrderStatusMock('processing', 'processing'),
$this->getOrderStatusMock('pending', 'pending'),
$this->getOrderStatusMock('complete', 'complete'),
$this->getOrderStatusMock('closed', 'closed'),
];

$orderStatusCollectionMock->expects(self::once())
->method('getIterator')
->willReturn(new \ArrayIterator($statuses));

$orderMock = $this->getMockBuilder(Order::class)
->disableOriginalConstructor()
->getMock();
Expand All @@ -300,6 +337,11 @@ public function testInvoice()
->with($status)
->willReturn($orderMock);

$orderMock->expects(self::once())
->method('setState')
->with($status)
->willReturn($orderMock);

$itemMock = $this->getMockForAbstractClass(InvoiceProcessItemInterface::class);

$itemMock->expects(self::once())
Expand Down Expand Up @@ -344,4 +386,25 @@ public function testInvoice()

$this->invoiceProcess->invoice($itemMock);
}

/**
* Returns new mock status with given a status/state pair
*/
private function getOrderStatusMock(string $status, string $state)
{
$orderStatusMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Status::class)
->disableOriginalConstructor()
->setMethods(['getStatus', 'getState'])
->getMock();

$orderStatusMock->expects(self::once())
->method('getStatus')
->willReturn($status);

$orderStatusMock->expects(self::once())
->method('getState')
->willReturn($state);

return $orderStatusMock;
}
}

0 comments on commit f53f59e

Please sign in to comment.