Skip to content

Commit 6205673

Browse files
committed
Merge remote-tracking branch 'github-magento2ce/MAGETWO-69021' into EPAM-PR-14
2 parents 1f1b164 + c3ce4a0 commit 6205673

File tree

9 files changed

+305
-29
lines changed

9 files changed

+305
-29
lines changed

app/code/Magento/Sales/Model/OrderRepository.php

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Magento\Sales\Model\Order\ShippingAssignmentBuilder;
1818
use Magento\Sales\Model\ResourceModel\Metadata;
1919
use Magento\Framework\App\ObjectManager;
20+
use Magento\Tax\Api\OrderTaxManagementInterface;
2021

2122
/**
2223
* Repository class
@@ -55,30 +56,39 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface
5556
*/
5657
protected $registry = [];
5758

59+
/**
60+
* @var OrderTaxManagementInterface
61+
*/
62+
private $orderTaxManagement;
63+
5864
/**
5965
* Constructor
6066
*
6167
* @param Metadata $metadata
6268
* @param SearchResultFactory $searchResultFactory
6369
* @param CollectionProcessorInterface|null $collectionProcessor
6470
* @param \Magento\Sales\Api\Data\OrderExtensionFactory|null $orderExtensionFactory
71+
* @param OrderTaxManagementInterface|null $orderTaxManagement
6572
*/
6673
public function __construct(
6774
Metadata $metadata,
6875
SearchResultFactory $searchResultFactory,
6976
CollectionProcessorInterface $collectionProcessor = null,
70-
\Magento\Sales\Api\Data\OrderExtensionFactory $orderExtensionFactory = null
77+
\Magento\Sales\Api\Data\OrderExtensionFactory $orderExtensionFactory = null,
78+
OrderTaxManagementInterface $orderTaxManagement = null
7179
) {
7280
$this->metadata = $metadata;
7381
$this->searchResultFactory = $searchResultFactory;
7482
$this->collectionProcessor = $collectionProcessor ?: ObjectManager::getInstance()
7583
->get(\Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class);
7684
$this->orderExtensionFactory = $orderExtensionFactory ?: ObjectManager::getInstance()
7785
->get(\Magento\Sales\Api\Data\OrderExtensionFactory::class);
86+
$this->orderTaxManagement = $orderTaxManagement ?: ObjectManager::getInstance()
87+
->get(OrderTaxManagementInterface::class);
7888
}
7989

8090
/**
81-
* load entity
91+
* Load entity
8292
*
8393
* @param int $id
8494
* @return \Magento\Sales\Api\Data\OrderInterface
@@ -98,12 +108,36 @@ public function get($id)
98108
__("The entity that was requested doesn't exist. Verify the entity and try again.")
99109
);
100110
}
111+
$this->setOrderTaxDetails($entity);
101112
$this->setShippingAssignments($entity);
102113
$this->registry[$id] = $entity;
103114
}
104115
return $this->registry[$id];
105116
}
106117

118+
/**
119+
* Set order tax details to extension attributes.
120+
*
121+
* @param OrderInterface $order
122+
* @return void
123+
*/
124+
private function setOrderTaxDetails(OrderInterface $order)
125+
{
126+
$extensionAttributes = $order->getExtensionAttributes();
127+
$orderTaxDetails = $this->orderTaxManagement->getOrderTaxDetails($order->getEntityId());
128+
$appliedTaxes = $orderTaxDetails->getAppliedTaxes();
129+
130+
$extensionAttributes->setAppliedTaxes($appliedTaxes);
131+
if (!empty($appliedTaxes)) {
132+
$extensionAttributes->setConvertingFromQuote(true);
133+
}
134+
135+
$items = $orderTaxDetails->getItems();
136+
$extensionAttributes->setItemAppliedTaxes($items);
137+
138+
$order->setExtensionAttributes($extensionAttributes);
139+
}
140+
107141
/**
108142
* Find entities by criteria
109143
*
@@ -118,6 +152,7 @@ public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCr
118152
$searchResult->setSearchCriteria($searchCriteria);
119153
foreach ($searchResult->getItems() as $order) {
120154
$this->setShippingAssignments($order);
155+
$this->setOrderTaxDetails($order);
121156
}
122157
return $searchResult;
123158
}
@@ -171,6 +206,8 @@ public function save(\Magento\Sales\Api\Data\OrderInterface $entity)
171206
}
172207

173208
/**
209+
* Set shipping assignments to extension attributes.
210+
*
174211
* @param OrderInterface $order
175212
* @return void
176213
*/

app/code/Magento/Sales/Test/Unit/Model/OrderRepositoryTest.php

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Magento\Sales\Api\Data\OrderInterface;
1010
use Magento\Sales\Api\Data\OrderSearchResultInterfaceFactory as SearchResultFactory;
1111
use Magento\Sales\Model\ResourceModel\Metadata;
12+
use Magento\Tax\Api\OrderTaxManagementInterface;
1213

1314
/**
1415
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -40,8 +41,15 @@ class OrderRepositoryTest extends \PHPUnit\Framework\TestCase
4041
*/
4142
private $collectionProcessor;
4243

44+
/**
45+
* @var OrderTaxManagementInterface|\PHPUnit_Framework_MockObject_MockObject
46+
*/
47+
private $orderTaxManagementMock;
48+
4349
/**
4450
* Setup the test
51+
*
52+
* @return void
4553
*/
4654
protected function setUp()
4755
{
@@ -58,34 +66,53 @@ protected function setUp()
5866
$orderExtensionFactoryMock = $this->getMockBuilder(\Magento\Sales\Api\Data\OrderExtensionFactory::class)
5967
->disableOriginalConstructor()
6068
->getMock();
69+
$this->orderTaxManagementMock = $this->getMockBuilder(OrderTaxManagementInterface::class)
70+
->disableOriginalConstructor()
71+
->getMockForAbstractClass();
6172
$this->orderRepository = $this->objectManager->getObject(
6273
\Magento\Sales\Model\OrderRepository::class,
6374
[
6475
'metadata' => $this->metadata,
6576
'searchResultFactory' => $this->searchResultFactory,
6677
'collectionProcessor' => $this->collectionProcessor,
67-
'orderExtensionFactory' => $orderExtensionFactoryMock
78+
'orderExtensionFactory' => $orderExtensionFactoryMock,
79+
'orderTaxManagement' => $this->orderTaxManagementMock
6880
]
6981
);
7082
}
7183

84+
/**
85+
* Test for method getList.
86+
*
87+
* @return void
88+
*/
7289
public function testGetList()
7390
{
7491
$searchCriteriaMock = $this->createMock(\Magento\Framework\Api\SearchCriteria::class);
7592
$collectionMock = $this->createMock(\Magento\Sales\Model\ResourceModel\Order\Collection::class);
76-
$itemsMock = $this->getMockBuilder(OrderInterface::class)->disableOriginalConstructor()->getMock();
93+
$itemsMock = $this->getMockBuilder(OrderInterface::class)->disableOriginalConstructor()
94+
->getMockForAbstractClass();
95+
$orderTaxDetailsMock = $this->getMockBuilder(\Magento\Tax\Api\Data\OrderTaxDetailsInterface::class)
96+
->disableOriginalConstructor()
97+
->setMethods(['getAppliedTaxes', 'getItems'])->getMockForAbstractClass();
7798

7899
$extensionAttributes = $this->createPartialMock(
79100
\Magento\Sales\Api\Data\OrderExtension::class,
80-
['getShippingAssignments']
101+
[
102+
'getShippingAssignments', 'setShippingAssignments', 'setConvertingFromQuote',
103+
'setAppliedTaxes', 'setItemAppliedTaxes'
104+
]
81105
);
82106
$shippingAssignmentBuilder = $this->createMock(
83107
\Magento\Sales\Model\Order\ShippingAssignmentBuilder::class
84108
);
109+
$itemsMock->expects($this->atLeastOnce())->method('getEntityId')->willReturn(1);
85110
$this->collectionProcessor->expects($this->once())
86111
->method('process')
87112
->with($searchCriteriaMock, $collectionMock);
88-
$itemsMock->expects($this->once())->method('getExtensionAttributes')->willReturn($extensionAttributes);
113+
$itemsMock->expects($this->atLeastOnce())->method('getExtensionAttributes')->willReturn($extensionAttributes);
114+
$this->orderTaxManagementMock->expects($this->atLeastOnce())->method('getOrderTaxDetails')
115+
->willReturn($orderTaxDetailsMock);
89116
$extensionAttributes->expects($this->any())
90117
->method('getShippingAssignments')
91118
->willReturn($shippingAssignmentBuilder);
@@ -96,6 +123,11 @@ public function testGetList()
96123
$this->assertEquals($collectionMock, $this->orderRepository->getList($searchCriteriaMock));
97124
}
98125

126+
/**
127+
* Test for method save.
128+
*
129+
* @return void
130+
*/
99131
public function testSave()
100132
{
101133
$mapperMock = $this->getMockBuilder(\Magento\Sales\Model\ResourceModel\Order::class)

dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderGetTest.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,39 @@ public function testOrderGet()
115115
$this->assertNotNull($value);
116116
}
117117
}
118+
119+
/**
120+
* @magentoApiDataFixture Magento/Sales/_files/order_with_tax.php
121+
*/
122+
public function testOrderGetExtensionAttributes()
123+
{
124+
$expectedTax = [
125+
'code' => 'US-NY-*-Rate 1',
126+
'type' => 'shipping'
127+
];
128+
129+
/** @var \Magento\Sales\Model\Order $order */
130+
$order = $this->objectManager->create(\Magento\Sales\Model\Order::class);
131+
$order->loadByIncrementId(self::ORDER_INCREMENT_ID);
132+
133+
$serviceInfo = [
134+
'rest' => [
135+
'resourcePath' => self::RESOURCE_PATH . '/' . $order->getId(),
136+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
137+
],
138+
'soap' => [
139+
'service' => self::SERVICE_READ_NAME,
140+
'serviceVersion' => self::SERVICE_VERSION,
141+
'operation' => self::SERVICE_READ_NAME . 'get',
142+
],
143+
];
144+
$result = $this->_webApiCall($serviceInfo, ['id' => $order->getId()]);
145+
146+
$appliedTaxes = $result['extension_attributes']['applied_taxes'];
147+
$this->assertEquals($expectedTax['code'], $appliedTaxes[0]['code']);
148+
$appliedTaxes = $result['extension_attributes']['item_applied_taxes'];
149+
$this->assertEquals($expectedTax['type'], $appliedTaxes[0]['type']);
150+
$this->assertNotEmpty($appliedTaxes[0]['applied_taxes']);
151+
$this->assertEquals(true, $result['extension_attributes']['converting_from_quote']);
152+
}
118153
}

dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderListTest.php

Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,71 @@ protected function setUp()
3333
* @magentoApiDataFixture Magento/Sales/_files/order_list.php
3434
*/
3535
public function testOrderList()
36+
{
37+
$searchData = $this->getSearchData();
38+
39+
$requestData = ['searchCriteria' => $searchData];
40+
$serviceInfo = [
41+
'rest' => [
42+
'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($requestData),
43+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
44+
],
45+
'soap' => [
46+
'service' => self::SERVICE_READ_NAME,
47+
'serviceVersion' => self::SERVICE_VERSION,
48+
'operation' => self::SERVICE_READ_NAME . 'getList',
49+
],
50+
];
51+
52+
$result = $this->_webApiCall($serviceInfo, $requestData);
53+
$this->assertArrayHasKey('items', $result);
54+
$this->assertCount(2, $result['items']);
55+
$this->assertArrayHasKey('search_criteria', $result);
56+
$this->assertEquals($searchData, $result['search_criteria']);
57+
$this->assertEquals('100000002', $result['items'][0]['increment_id']);
58+
$this->assertEquals('100000001', $result['items'][1]['increment_id']);
59+
}
60+
61+
/**
62+
* @magentoApiDataFixture Magento/Sales/_files/order_list_with_tax.php
63+
*/
64+
public function testOrderListExtensionAttributes()
65+
{
66+
$searchData = $this->getSearchData();
67+
68+
$requestData = ['searchCriteria' => $searchData];
69+
$serviceInfo = [
70+
'rest' => [
71+
'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($requestData),
72+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
73+
],
74+
'soap' => [
75+
'service' => self::SERVICE_READ_NAME,
76+
'serviceVersion' => self::SERVICE_VERSION,
77+
'operation' => self::SERVICE_READ_NAME . 'getList',
78+
],
79+
];
80+
81+
$result = $this->_webApiCall($serviceInfo, $requestData);
82+
83+
$expectedTax = [
84+
'code' => 'US-NY-*-Rate 1',
85+
'type' => 'shipping'
86+
];
87+
$appliedTaxes = $result['items'][0]['extension_attributes']['applied_taxes'];
88+
$this->assertEquals($expectedTax['code'], $appliedTaxes[0]['code']);
89+
$appliedTaxes = $result['items'][0]['extension_attributes']['item_applied_taxes'];
90+
$this->assertEquals($expectedTax['type'], $appliedTaxes[0]['type']);
91+
$this->assertNotEmpty($appliedTaxes[0]['applied_taxes']);
92+
$this->assertEquals(true, $result['items'][0]['extension_attributes']['converting_from_quote']);
93+
}
94+
95+
/**
96+
* Get search data for request.
97+
*
98+
* @return array
99+
*/
100+
private function getSearchData() : array
36101
{
37102
/** @var \Magento\Framework\Api\SortOrderBuilder $sortOrderBuilder */
38103
$sortOrderBuilder = $this->objectManager->get(
@@ -70,25 +135,6 @@ public function testOrderList()
70135
$searchCriteriaBuilder->addSortOrder($sortOrder);
71136
$searchData = $searchCriteriaBuilder->create()->__toArray();
72137

73-
$requestData = ['searchCriteria' => $searchData];
74-
$serviceInfo = [
75-
'rest' => [
76-
'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($requestData),
77-
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
78-
],
79-
'soap' => [
80-
'service' => self::SERVICE_READ_NAME,
81-
'serviceVersion' => self::SERVICE_VERSION,
82-
'operation' => self::SERVICE_READ_NAME . 'getList',
83-
],
84-
];
85-
86-
$result = $this->_webApiCall($serviceInfo, $requestData);
87-
$this->assertArrayHasKey('items', $result);
88-
$this->assertCount(2, $result['items']);
89-
$this->assertArrayHasKey('search_criteria', $result);
90-
$this->assertEquals($searchData, $result['search_criteria']);
91-
$this->assertEquals('100000002', $result['items'][0]['increment_id']);
92-
$this->assertEquals('100000001', $result['items'][1]['increment_id']);
138+
return $searchData;
93139
}
94140
}

dev/tests/integration/testsuite/Magento/Sales/_files/order_list.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010

1111
require 'order.php';
1212
/** @var Order $order */
13-
/** @var Order\Payment $payment */
14-
/** @var Order\Item $orderItem */
15-
/** @var array $addressData Data for creating addresses for the orders. */
13+
/** @var Order\Payment $payment */
14+
/** @var Order\Item $orderItem */
15+
/** @var Order\Address $billingAddress */
16+
/** @var Order\Address $shippingAddress */
1617
$orders = [
1718
[
1819
'increment_id' => '100000002',
@@ -49,6 +50,7 @@
4950
],
5051
];
5152

53+
$orderList = [];
5254
/** @var OrderRepositoryInterface $orderRepository */
5355
$orderRepository = $objectManager->create(OrderRepositoryInterface::class);
5456
/** @var array $orderData */
@@ -75,4 +77,5 @@
7577
->setShippingAddress($shippingAddress);
7678

7779
$orderRepository->save($order);
80+
$orderList[] = $order;
7881
}

0 commit comments

Comments
 (0)