Skip to content
This repository was archived by the owner on Dec 19, 2019. It is now read-only.

Commit 25fb501

Browse files
authored
Merge pull request #3525 from magento-epam/EPAM-PR-24
Fixed issues: MAGETWO-95809 Item row total display incorrect value in API response MAGETWO-95830 Cannot create credit memo if the used in the order cart rule is deleted MAGETWO-70379 UI components Date filter field has non-localized date format MAGETWO-91735 Customer's store credit is not given back after Authorize.net failed payment
2 parents d75f39d + f3b977a commit 25fb501

File tree

11 files changed

+246
-5
lines changed

11 files changed

+246
-5
lines changed

app/code/Magento/Authorizenet/Model/Directpost.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,7 @@ protected function processOrder(\Magento\Sales\Model\Order $order)
707707
//decline the order (in case of wrong response code) but don't return money to customer.
708708
$message = $e->getMessage();
709709
$this->declineOrder($order, $message, false);
710+
710711
throw $e;
711712
}
712713

@@ -777,7 +778,7 @@ protected function processPaymentFraudStatus(\Magento\Sales\Model\Order\Payment
777778
}
778779

779780
/**
780-
* Add status comment
781+
* Add status comment to history
781782
*
782783
* @param \Magento\Sales\Model\Order\Payment $payment
783784
* @return $this
@@ -832,6 +833,7 @@ protected function declineOrder(\Magento\Sales\Model\Order $order, $message = ''
832833
->void($response);
833834
}
834835
$order->registerCancellation($message)->save();
836+
$this->_eventManager->dispatch('order_cancel_after', ['order' => $order ]);
835837
} catch (\Exception $e) {
836838
//quiet decline
837839
$this->getPsrLogger()->critical($e);
@@ -866,7 +868,7 @@ public function getConfigInterface()
866868
* Getter for specified value according to set payment method code
867869
*
868870
* @param mixed $key
869-
* @param int|string|null|\Magento\Store\Model\Store $storeId
871+
* @param mixed $storeId
870872
* @return mixed
871873
*/
872874
public function getValue($key, $storeId = null)
@@ -930,7 +932,7 @@ public function fetchTransactionInfo(\Magento\Payment\Model\InfoInterface $payme
930932
}
931933

932934
/**
933-
* Add statuc comment on update.
935+
* Add status comment on update
934936
*
935937
* @param \Magento\Sales\Model\Order\Payment $payment
936938
* @param \Magento\Framework\DataObject $response
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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\Sales\Model\Order\Webapi;
9+
10+
use Magento\Sales\Api\Data\OrderItemInterface;
11+
use Magento\Sales\Block\Adminhtml\Items\Column\DefaultColumn;
12+
13+
/**
14+
* Class for changing row total in response.
15+
*/
16+
class ChangeOutputArray
17+
{
18+
/**
19+
* @var DefaultColumn
20+
*/
21+
private $priceRenderer;
22+
23+
/**
24+
* @param DefaultColumn $priceRenderer
25+
*/
26+
public function __construct(
27+
DefaultColumn $priceRenderer
28+
) {
29+
$this->priceRenderer = $priceRenderer;
30+
}
31+
32+
/**
33+
* Changing row total for webapi order item response.
34+
*
35+
* @param OrderItemInterface $dataObject
36+
* @param array $result
37+
* @return array
38+
*/
39+
public function execute(
40+
OrderItemInterface $dataObject,
41+
array $result
42+
): array {
43+
$result[OrderItemInterface::ROW_TOTAL] = $this->priceRenderer->getTotalAmount($dataObject);
44+
$result[OrderItemInterface::BASE_ROW_TOTAL] = $this->priceRenderer->getBaseTotalAmount($dataObject);
45+
46+
return $result;
47+
}
48+
}

app/code/Magento/Sales/etc/webapi_rest/di.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,11 @@
1515
<type name="Magento\Sales\Api\ShipmentRepositoryInterface">
1616
<plugin name="convert_blob_to_string" type="Magento\Sales\Plugin\ShippingLabelConverter" />
1717
</type>
18+
<type name="Magento\Framework\Reflection\DataObjectProcessor">
19+
<arguments>
20+
<argument name="processors" xsi:type="array">
21+
<item name="\Magento\Sales\Model\Order\Item" xsi:type="object">Magento\Sales\Model\Order\Webapi\ChangeOutputArray\Proxy</item>
22+
</argument>
23+
</arguments>
24+
</type>
1825
</config>

app/code/Magento/Sales/etc/webapi_soap/di.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,11 @@
1515
<type name="Magento\Sales\Api\ShipmentRepositoryInterface">
1616
<plugin name="convert_blob_to_string" type="Magento\Sales\Plugin\ShippingLabelConverter" />
1717
</type>
18+
<type name="Magento\Framework\Reflection\DataObjectProcessor">
19+
<arguments>
20+
<argument name="processors" xsi:type="array">
21+
<item name="\Magento\Sales\Model\Order\Item" xsi:type="object">Magento\Sales\Model\Order\Webapi\ChangeOutputArray\Proxy</item>
22+
</argument>
23+
</arguments>
24+
</type>
1825
</config>

app/code/Magento/SalesRule/Test/Mftf/ActionGroup/AdminCreateCartPriceRuleActionGroup.xml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
-->
88
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9-
xsi:noNamespaceSchemaLocation="../../../../../../../dev/tests/acceptance/vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/actionGroupSchema.xsd">
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
1010
<actionGroup name="AdminCreateCartPriceRuleActionGroup">
1111
<arguments>
1212
<argument name="ruleName"/>
@@ -24,6 +24,20 @@
2424
<see selector="{{AdminCartPriceRulesFormSection.successMessage}}" userInput="You saved the rule." stepKey="seeSuccessMessage"/>
2525
</actionGroup>
2626

27+
<actionGroup name="AdminCreateCartPriceRuleWithCouponCode" extends="AdminCreateCartPriceRuleActionGroup">
28+
<arguments>
29+
<argument name="couponCode" defaultValue="_defaultCoupon.code"/>
30+
</arguments>
31+
<remove keyForRemoval="selectActionType"/>
32+
<remove keyForRemoval="fillDiscountAmount"/>
33+
<selectOption selector="{{AdminCartPriceRulesFormSection.coupon}}" userInput="Specific Coupon" stepKey="selectCouponType" after="fillRuleName"/>
34+
<waitForElementVisible selector="{{AdminCartPriceRulesFormSection.couponCode}}" stepKey="waitForElementVisible" after="selectCouponType"/>
35+
<fillField selector="{{AdminCartPriceRulesFormSection.couponCode}}" userInput="{{couponCode}}" stepKey="fillCouponCode" after="waitForElementVisible"/>
36+
<fillField selector="{{AdminCartPriceRulesFormSection.userPerCoupon}}" userInput="99" stepKey="fillUserPerCoupon" after="fillCouponCode"/>
37+
<selectOption selector="{{AdminCartPriceRulesFormSection.apply}}" userInput="Fixed amount discount for whole cart" stepKey="selectActionTypeToFixed" after="clickToExpandActions"/>
38+
<fillField selector="{{AdminCartPriceRulesFormSection.discountAmount}}" userInput="1" stepKey="fillDiscountAmount" after="selectActionTypeToFixed"/>
39+
</actionGroup>
40+
2741
<!--Delete Cart price Rule for Retailer customer-->
2842
<actionGroup name="AdminDeleteCartPriceRuleForRetailerActionGroup">
2943
<click selector="{{AdminMenuSection.marketing}}" stepKey="clickOnMarketing" />

app/code/Magento/Ui/Component/Listing/Columns/Date.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
1212

1313
/**
14+
* Date format column
15+
*
1416
* @api
1517
* @since 100.0.2
1618
*/
@@ -47,6 +49,27 @@ public function __construct(
4749
parent::__construct($context, $uiComponentFactory, $components, $data);
4850
}
4951

52+
/**
53+
* @inheritdoc
54+
*/
55+
public function prepare()
56+
{
57+
$config = $this->getData('config');
58+
$config['filter'] = [
59+
'filterType' => 'dateRange',
60+
'templates' => [
61+
'date' => [
62+
'options' => [
63+
'dateFormat' => $this->timezone->getDateFormatWithLongYear()
64+
]
65+
]
66+
]
67+
];
68+
$this->setData('config', $config);
69+
70+
parent::prepare();
71+
}
72+
5073
/**
5174
* @inheritdoc
5275
*/

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,34 @@ protected function assertOrderItem(\Magento\Sales\Model\Order\Item $orderItem, a
7777
$this->assertEquals($orderItem->getBasePrice(), $response['base_price']);
7878
$this->assertEquals($orderItem->getRowTotal(), $response['row_total']);
7979
}
80+
81+
/**
82+
* @magentoApiDataFixture Magento/Sales/_files/order_with_discount.php
83+
*/
84+
public function testGetOrderWithDiscount()
85+
{
86+
/** @var \Magento\Sales\Model\Order $order */
87+
$order = $this->objectManager->create(\Magento\Sales\Model\Order::class);
88+
$order->loadByIncrementId(self::ORDER_INCREMENT_ID);
89+
/** @var \Magento\Sales\Model\Order\Item $orderItem */
90+
$orderItem = current($order->getItems());
91+
92+
$serviceInfo = [
93+
'rest' => [
94+
'resourcePath' => self::RESOURCE_PATH . '/' . $orderItem->getId(),
95+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
96+
],
97+
'soap' => [
98+
'service' => self::SERVICE_NAME,
99+
'serviceVersion' => self::SERVICE_VERSION,
100+
'operation' => self::SERVICE_NAME . 'get',
101+
],
102+
];
103+
104+
$response = $this->_webApiCall($serviceInfo, ['id' => $orderItem->getId()]);
105+
106+
$this->assertTrue(is_array($response));
107+
$this->assertEquals(8.00, $response['row_total']);
108+
$this->assertEquals(8.00, $response['base_row_total']);
109+
}
80110
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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+
use Magento\Sales\Api\OrderRepositoryInterface;
9+
use Magento\Sales\Model\Order;
10+
use Magento\Sales\Model\Order\Address as OrderAddress;
11+
use Magento\Sales\Model\Order\Item as OrderItem;
12+
use Magento\Sales\Model\Order\Payment;
13+
use Magento\Store\Model\StoreManagerInterface;
14+
15+
require __DIR__ . '/../../../Magento/Catalog/_files/product_simple.php';
16+
/** @var \Magento\Catalog\Model\Product $product */
17+
18+
$addressData = include __DIR__ . '/address_data.php';
19+
20+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
21+
22+
$billingAddress = $objectManager->create(OrderAddress::class, ['data' => $addressData]);
23+
$billingAddress->setAddressType('billing');
24+
25+
$shippingAddress = clone $billingAddress;
26+
$shippingAddress->setId(null)->setAddressType('shipping');
27+
28+
/** @var Payment $payment */
29+
$payment = $objectManager->create(Payment::class);
30+
$payment->setMethod('checkmo')
31+
->setAdditionalInformation('last_trans_id', '11122')
32+
->setAdditionalInformation(
33+
'metadata',
34+
[
35+
'type' => 'free',
36+
'fraudulent' => false,
37+
]
38+
);
39+
40+
/** @var OrderItem $orderItem */
41+
$orderItem = $objectManager->create(OrderItem::class);
42+
$orderItem->setProductId($product->getId())
43+
->setQtyOrdered(2)
44+
->setBasePrice($product->getPrice())
45+
->setPrice($product->getPrice())
46+
->setRowTotal($product->getPrice())
47+
->setProductType('simple')
48+
->setDiscountAmount(2)
49+
->setBaseRowTotal($product->getPrice())
50+
->setBaseDiscountAmount(2);
51+
52+
/** @var Order $order */
53+
$order = $objectManager->create(Order::class);
54+
$order->setIncrementId('100000001')
55+
->setState(Order::STATE_PROCESSING)
56+
->setStatus($order->getConfig()->getStateDefaultStatus(Order::STATE_PROCESSING))
57+
->setSubtotal(100)
58+
->setGrandTotal(100)
59+
->setBaseSubtotal(100)
60+
->setBaseGrandTotal(100)
61+
->setCustomerIsGuest(true)
62+
->setCustomerEmail('[email protected]')
63+
->setBillingAddress($billingAddress)
64+
->setShippingAddress($shippingAddress)
65+
->setStoreId($objectManager->get(StoreManagerInterface::class)->getStore()->getId())
66+
->addItem($orderItem)
67+
->setPayment($payment);
68+
69+
/** @var OrderRepositoryInterface $orderRepository */
70+
$orderRepository = $objectManager->create(OrderRepositoryInterface::class);
71+
$orderRepository->save($order);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
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+
require 'default_rollback.php';

dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,5 @@ Test/_files
205205
Magento/InventoryCatalogAdminUi/Controller/Adminhtml
206206
Magento/InventoryConfigurableProductIndexer/Indexer
207207
Magento/InventoryGroupedProductIndexer/Indexer
208+
Magento/Customer/Model/FileUploaderDataResolver.php
209+
Magento/Customer/Model/Customer/DataProvider.php

lib/internal/Magento/Framework/Reflection/DataObjectProcessor.php

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,25 +40,33 @@ class DataObjectProcessor
4040
*/
4141
private $customAttributesProcessor;
4242

43+
/**
44+
* @var array
45+
*/
46+
private $processors;
47+
4348
/**
4449
* @param MethodsMap $methodsMapProcessor
4550
* @param TypeCaster $typeCaster
4651
* @param FieldNamer $fieldNamer
4752
* @param CustomAttributesProcessor $customAttributesProcessor
4853
* @param ExtensionAttributesProcessor $extensionAttributesProcessor
54+
* @param array $processors
4955
*/
5056
public function __construct(
5157
MethodsMap $methodsMapProcessor,
5258
TypeCaster $typeCaster,
5359
FieldNamer $fieldNamer,
5460
CustomAttributesProcessor $customAttributesProcessor,
55-
ExtensionAttributesProcessor $extensionAttributesProcessor
61+
ExtensionAttributesProcessor $extensionAttributesProcessor,
62+
array $processors = []
5663
) {
5764
$this->methodsMapProcessor = $methodsMapProcessor;
5865
$this->typeCaster = $typeCaster;
5966
$this->fieldNamer = $fieldNamer;
6067
$this->extensionAttributesProcessor = $extensionAttributesProcessor;
6168
$this->customAttributesProcessor = $customAttributesProcessor;
69+
$this->processors = $processors;
6270
}
6371

6472
/**
@@ -121,6 +129,27 @@ public function buildOutputDataArray($dataObject, $dataObjectType)
121129

122130
$outputData[$key] = $value;
123131
}
132+
133+
$outputData = $this->changeOutputArray($dataObject, $outputData);
134+
135+
return $outputData;
136+
}
137+
138+
/**
139+
* Change output array if needed.
140+
*
141+
* @param mixed $dataObject
142+
* @param array $outputData
143+
* @return array
144+
*/
145+
private function changeOutputArray($dataObject, array $outputData): array
146+
{
147+
foreach ($this->processors as $dataObjectClassName => $processor) {
148+
if ($dataObject instanceof $dataObjectClassName) {
149+
$outputData = $processor->execute($dataObject, $outputData);
150+
}
151+
}
152+
124153
return $outputData;
125154
}
126155
}

0 commit comments

Comments
 (0)