Skip to content

Commit a1c40dc

Browse files
committed
MAGETWO-73598: CLONE - Quans: Orders API without key/value on ADDITIONAL_INFORMATION (only values)
1 parent 8fdae10 commit a1c40dc

File tree

9 files changed

+190
-4
lines changed

9 files changed

+190
-4
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Payment\Api\Data;
9+
10+
use Magento\Framework\DataObject\KeyValueObjectInterface;
11+
12+
/**
13+
* Payment additional info interface.
14+
*/
15+
interface PaymentAdditionalInfoInterface extends KeyValueObjectInterface
16+
{
17+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Payment\Model;
9+
10+
use Magento\Payment\Api\Data\PaymentAdditionalInfoInterface;
11+
12+
/**
13+
* Payment additional info class.
14+
*/
15+
class PaymentAdditionalInfo implements PaymentAdditionalInfoInterface
16+
{
17+
/**
18+
* @var string
19+
*/
20+
private $key;
21+
22+
/**
23+
* @var string
24+
*/
25+
private $value;
26+
27+
/**
28+
* @inheritdoc
29+
*/
30+
public function getKey()
31+
{
32+
return $this->key;
33+
}
34+
35+
/**
36+
* @inheritdoc
37+
*/
38+
public function getValue()
39+
{
40+
return $this->value;
41+
}
42+
43+
/**
44+
* @inheritdoc
45+
*/
46+
public function setKey($key)
47+
{
48+
$this->key = $key;
49+
return $key;
50+
}
51+
52+
/**
53+
* @inheritdoc
54+
*/
55+
public function setValue($value)
56+
{
57+
$this->value = $value;
58+
return $value;
59+
}
60+
}

app/code/Magento/Payment/etc/di.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
99
<preference for="Magento\Payment\Api\Data\PaymentMethodInterface" type="Magento\Payment\Model\PaymentMethod"/>
10+
<preference for="Magento\Payment\Api\Data\PaymentAdditionalInfoInterface" type="Magento\Payment\Model\PaymentAdditionalInfo"/>
1011
<preference for="Magento\Payment\Api\PaymentMethodListInterface" type="Magento\Payment\Model\PaymentMethodList"/>
1112
<preference for="Magento\Payment\Gateway\Validator\ResultInterface" type="Magento\Payment\Gateway\Validator\Result"/>
1213
<preference for="Magento\Payment\Gateway\ConfigFactoryInterface" type="Magento\Payment\Gateway\Config\ConfigFactory" />

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

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
use Magento\Sales\Model\Order\ShippingAssignmentBuilder;
1919
use Magento\Sales\Model\ResourceModel\Metadata;
2020
use Magento\Tax\Api\OrderTaxManagementInterface;
21+
use Magento\Payment\Api\Data\PaymentAdditionalInfoInterface;
22+
use Magento\Payment\Api\Data\PaymentAdditionalInfoInterfaceFactory;
23+
use Magento\Framework\Serialize\Serializer\Json as JsonSerializer;
2124

2225
/**
2326
* Repository class
@@ -66,6 +69,16 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface
6669
*/
6770
private $orderTaxManagement;
6871

72+
/**
73+
* @var PaymentAdditionalInfoFactory
74+
*/
75+
private $paymentAdditionalInfoFactory;
76+
77+
/**
78+
* @var JsonSerializer
79+
*/
80+
private $serializer;
81+
6982
/**
7083
* Constructor
7184
*
@@ -75,14 +88,18 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface
7588
* @param \Magento\Sales\Api\Data\OrderExtensionFactory|null $orderExtensionFactory
7689
* @param JoinProcessorInterface $extensionAttributesJoinProcessor
7790
* @param OrderTaxManagementInterface|null $orderTaxManagement
91+
* @param PaymentAdditionalInfoInterfaceFactory|null $paymentAdditionalInfoFactory
92+
* @param JsonSerializer|null $serializer
7893
*/
7994
public function __construct(
8095
Metadata $metadata,
8196
SearchResultFactory $searchResultFactory,
8297
CollectionProcessorInterface $collectionProcessor = null,
8398
\Magento\Sales\Api\Data\OrderExtensionFactory $orderExtensionFactory = null,
8499
JoinProcessorInterface $extensionAttributesJoinProcessor = null,
85-
OrderTaxManagementInterface $orderTaxManagement = null
100+
OrderTaxManagementInterface $orderTaxManagement = null,
101+
PaymentAdditionalInfoInterfaceFactory $paymentAdditionalInfoFactory = null,
102+
JsonSerializer $serializer = null
86103
) {
87104
$this->metadata = $metadata;
88105
$this->searchResultFactory = $searchResultFactory;
@@ -94,6 +111,10 @@ public function __construct(
94111
?: ObjectManager::getInstance()->get(JoinProcessorInterface::class);
95112
$this->orderTaxManagement = $orderTaxManagement ?: ObjectManager::getInstance()
96113
->get(OrderTaxManagementInterface::class);
114+
$this->paymentAdditionalInfoFactory = $paymentAdditionalInfoFactory ?: ObjectManager::getInstance()
115+
->get(PaymentAdditionalInfoInterfaceFactory::class);
116+
$this->serializer = $serializer ?: ObjectManager::getInstance()
117+
->get(JsonSerializer::class);
97118
}
98119

99120
/**
@@ -117,6 +138,7 @@ public function get($id)
117138
}
118139
$this->setOrderTaxDetails($entity);
119140
$this->setShippingAssignments($entity);
141+
$this->setPaymentAdditionalInfo($entity);
120142
$this->registry[$id] = $entity;
121143
}
122144
return $this->registry[$id];
@@ -145,6 +167,34 @@ private function setOrderTaxDetails(OrderInterface $order)
145167
$order->setExtensionAttributes($extensionAttributes);
146168
}
147169

170+
/**
171+
* Set payment additional info to the order.
172+
*
173+
* @param OrderInterface $order
174+
* @return void
175+
*/
176+
private function setPaymentAdditionalInfo(OrderInterface $order)
177+
{
178+
$extensionAttributes = $order->getExtensionAttributes();
179+
$paymentAdditionalInformation = $order->getPayment()->getAdditionalInformation();
180+
181+
$objects = [];
182+
foreach ($paymentAdditionalInformation as $key => $value) {
183+
/** @var PaymentAdditionalInfoInterface $additionalInformationObject */
184+
$additionalInformationObject = $this->paymentAdditionalInfoFactory->create();
185+
$additionalInformationObject->setKey($key);
186+
187+
if (!is_string($value)) {
188+
$value = $this->serializer->serialize($value);
189+
}
190+
191+
$additionalInformationObject->setValue($value);
192+
$objects[] = $additionalInformationObject;
193+
}
194+
$extensionAttributes->setPaymentAdditionalInfo($objects);
195+
$order->setExtensionAttributes($extensionAttributes);
196+
}
197+
148198
/**
149199
* Find entities by criteria
150200
*
@@ -161,6 +211,7 @@ public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCr
161211
foreach ($searchResult->getItems() as $order) {
162212
$this->setShippingAssignments($order);
163213
$this->setOrderTaxDetails($order);
214+
$this->setPaymentAdditionalInfo($order);
164215
}
165216
return $searchResult;
166217
}

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Magento\Sales\Api\Data\OrderSearchResultInterfaceFactory as SearchResultFactory;
1111
use Magento\Sales\Model\ResourceModel\Metadata;
1212
use Magento\Tax\Api\OrderTaxManagementInterface;
13+
use Magento\Payment\Api\Data\PaymentAdditionalInfoInterfaceFactory;
1314

1415
/**
1516
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -46,6 +47,11 @@ class OrderRepositoryTest extends \PHPUnit\Framework\TestCase
4647
*/
4748
private $orderTaxManagementMock;
4849

50+
/**
51+
* @var PaymentAdditionalInfoInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject
52+
*/
53+
private $paymentAdditionalInfoFactory;
54+
4955
/**
5056
* @inheritdoc
5157
*/
@@ -67,6 +73,8 @@ protected function setUp()
6773
$this->orderTaxManagementMock = $this->getMockBuilder(OrderTaxManagementInterface::class)
6874
->disableOriginalConstructor()
6975
->getMockForAbstractClass();
76+
$this->paymentAdditionalInfoFactory = $this->getMockBuilder(PaymentAdditionalInfoInterfaceFactory::class)
77+
->disableOriginalConstructor()->setMethods(['create'])->getMockForAbstractClass();
7078
$this->orderRepository = $this->objectManager->getObject(
7179
\Magento\Sales\Model\OrderRepository::class,
7280
[
@@ -75,6 +83,7 @@ protected function setUp()
7583
'collectionProcessor' => $this->collectionProcessor,
7684
'orderExtensionFactory' => $orderExtensionFactoryMock,
7785
'orderTaxManagement' => $this->orderTaxManagementMock,
86+
'paymentAdditionalInfoFactory' => $this->paymentAdditionalInfoFactory,
7887
]
7988
);
8089
}
@@ -93,12 +102,16 @@ public function testGetList()
93102
$orderTaxDetailsMock = $this->getMockBuilder(\Magento\Tax\Api\Data\OrderTaxDetailsInterface::class)
94103
->disableOriginalConstructor()
95104
->setMethods(['getAppliedTaxes', 'getItems'])->getMockForAbstractClass();
105+
$paymentMock = $this->getMockBuilder(\Magento\Sales\Api\Data\OrderPaymentInterface::class)
106+
->disableOriginalConstructor()->getMockForAbstractClass();
107+
$paymentAdditionalInfo = $this->getMockBuilder(\Magento\Payment\Api\Data\PaymentAdditionalInfoInterface::class)
108+
->disableOriginalConstructor()->setMethods(['setKey', 'setValue'])->getMockForAbstractClass();
96109

97110
$extensionAttributes = $this->createPartialMock(
98111
\Magento\Sales\Api\Data\OrderExtension::class,
99112
[
100113
'getShippingAssignments', 'setShippingAssignments', 'setConvertingFromQuote',
101-
'setAppliedTaxes', 'setItemAppliedTaxes',
114+
'setAppliedTaxes', 'setItemAppliedTaxes', 'setPaymentAdditionalInfo',
102115
]
103116
);
104117
$shippingAssignmentBuilder = $this->createMock(
@@ -109,6 +122,13 @@ public function testGetList()
109122
->method('process')
110123
->with($searchCriteriaMock, $collectionMock);
111124
$itemsMock->expects($this->atLeastOnce())->method('getExtensionAttributes')->willReturn($extensionAttributes);
125+
$itemsMock->expects($this->atleastOnce())->method('getPayment')->willReturn($paymentMock);
126+
$paymentMock->expects($this->atLeastOnce())->method('getAdditionalInformation')
127+
->willReturn(['method' => 'checkmo']);
128+
$this->paymentAdditionalInfoFactory->expects($this->atLeastOnce())->method('create')
129+
->willReturn($paymentAdditionalInfo);
130+
$paymentAdditionalInfo->expects($this->atLeastOnce())->method('setKey')->willReturnSelf();
131+
$paymentAdditionalInfo->expects($this->atLeastOnce())->method('setValue')->willReturnSelf();
112132
$this->orderTaxManagementMock->expects($this->atLeastOnce())->method('getOrderTaxDetails')
113133
->willReturn($orderTaxDetailsMock);
114134
$extensionAttributes->expects($this->any())

app/code/Magento/Sales/etc/extension_attributes.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@
1010
<extension_attributes for="Magento\Sales\Api\Data\OrderInterface">
1111
<attribute code="shipping_assignments" type="Magento\Sales\Api\Data\ShippingAssignmentInterface[]" />
1212
</extension_attributes>
13+
<extension_attributes for="Magento\Sales\Api\Data\OrderInterface">
14+
<attribute code="payment_additional_info" type="Magento\Payment\Api\Data\PaymentAdditionalInfoInterface[]" />
15+
</extension_attributes>
1316
</config>

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,5 +232,7 @@ public function testOrderGetExtensionAttributes()
232232
$this->assertEquals($expectedTax['type'], $appliedTaxes[0]['type']);
233233
$this->assertNotEmpty($appliedTaxes[0]['applied_taxes']);
234234
$this->assertEquals(true, $result['extension_attributes']['converting_from_quote']);
235+
$this->assertArrayHasKey('payment_additional_info', $result['extension_attributes']);
236+
$this->assertNotEmpty($result['extension_attributes']['payment_additional_info']);
235237
}
236238
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ public function testOrderListExtensionAttributes()
9292
$this->assertEquals($expectedTax['type'], $appliedTaxes[0]['type']);
9393
$this->assertNotEmpty($appliedTaxes[0]['applied_taxes']);
9494
$this->assertEquals(true, $result['items'][0]['extension_attributes']['converting_from_quote']);
95+
$this->assertArrayHasKey('payment_additional_info', $result['items'][0]['extension_attributes']);
96+
$this->assertNotEmpty($result['items'][0]['extension_attributes']['payment_additional_info']);
9597
}
9698

9799
/**

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

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
*/
66

77
use Magento\Sales\Model\Order;
8+
use Magento\Sales\Api\OrderRepositoryInterface;
9+
use Magento\Sales\Model\Order\Address as OrderAddress;
10+
use Magento\Sales\Model\Order\Payment;
811

912
require 'order.php';
1013
/** @var Order $order */
@@ -49,17 +52,44 @@
4952
];
5053

5154
$orderList = [];
55+
/** @var OrderRepositoryInterface $orderRepository */
56+
$orderRepository = $objectManager->create(OrderRepositoryInterface::class);
5257
/** @var array $orderData */
5358
foreach ($orders as $orderData) {
5459
/** @var $order \Magento\Sales\Model\Order */
5560
$order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
5661
\Magento\Sales\Model\Order::class
5762
);
63+
64+
// Reset addresses
65+
/** @var Order\Address $billingAddress */
66+
$billingAddress = $objectManager->create(OrderAddress::class, ['data' => $addressData]);
67+
$billingAddress->setAddressType('billing');
68+
69+
$shippingAddress = clone $billingAddress;
70+
$shippingAddress->setId(null)->setAddressType('shipping');
71+
72+
/** @var Payment $payment */
73+
$payment = $objectManager->create(Payment::class);
74+
$payment->setMethod('checkmo')
75+
->setAdditionalInformation('last_trans_id', '11122')
76+
->setAdditionalInformation(
77+
'metadata',
78+
[
79+
'type' => 'free',
80+
'fraudulent' => false,
81+
]
82+
);
83+
5884
$order
5985
->setData($orderData)
6086
->addItem($orderItem)
87+
->setCustomerIsGuest(true)
88+
->setCustomerEmail('customer@null.com')
6189
->setBillingAddress($billingAddress)
62-
->setBillingAddress($shippingAddress)
63-
->save();
90+
->setShippingAddress($shippingAddress)
91+
->setPayment($payment);
92+
93+
$orderRepository->save($order);
6494
$orderList[] = $order;
6595
}

0 commit comments

Comments
 (0)