Skip to content

Commit d91befb

Browse files
committed
Merge branch 'MC-34787' of https://github.com/magento-mpi/magento2ce into PR-03-07-2020
2 parents 041c736 + 8b3cb24 commit d91befb

File tree

4 files changed

+125
-37
lines changed

4 files changed

+125
-37
lines changed

app/code/Magento/Sales/Block/Order/Email/Items/DefaultItems.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
*/
66
namespace Magento\Sales\Block\Order\Email\Items;
77

8+
use Magento\Framework\Exception\LocalizedException;
9+
use Magento\Framework\View\Element\Template;
810
use Magento\Sales\Model\Order\Creditmemo\Item as CreditmemoItem;
911
use Magento\Sales\Model\Order\Invoice\Item as InvoiceItem;
1012
use Magento\Sales\Model\Order\Item as OrderItem;
@@ -16,7 +18,7 @@
1618
* @author Magento Core Team <core@magentocommerce.com>
1719
* @since 100.0.2
1820
*/
19-
class DefaultItems extends \Magento\Framework\View\Element\Template
21+
class DefaultItems extends Template
2022
{
2123
/**
2224
* Retrieve current order model instance
@@ -29,6 +31,8 @@ public function getOrder()
2931
}
3032

3133
/**
34+
* Get available item options
35+
*
3236
* @return array
3337
*/
3438
public function getItemOptions()
@@ -50,6 +54,8 @@ public function getItemOptions()
5054
}
5155

5256
/**
57+
* Get item html from the $value
58+
*
5359
* @param string|array $value
5460
* @return string
5561
*/
@@ -70,6 +76,8 @@ public function getValueHtml($value)
7076
}
7177

7278
/**
79+
* Get product Sku for the $item
80+
*
7381
* @param mixed $item
7482
* @return mixed
7583
*/
@@ -86,6 +94,7 @@ public function getSku($item)
8694
* Return product additional information block
8795
*
8896
* @return \Magento\Framework\View\Element\AbstractBlock
97+
* @throws LocalizedException
8998
*/
9099
public function getProductAdditionalInformationBlock()
91100
{
@@ -97,10 +106,13 @@ public function getProductAdditionalInformationBlock()
97106
*
98107
* @param OrderItem|InvoiceItem|CreditmemoItem $item
99108
* @return string
109+
* @throws LocalizedException
100110
*/
101111
public function getItemPrice($item)
102112
{
103113
$block = $this->getLayout()->getBlock('item_price');
114+
$item->setRowTotal((float) $item->getPrice() * (float) $this->getItem()->getQty());
115+
$item->setBaseRowTotal((float) $item->getBasePrice() * (float) $this->getItem()->getQty());
104116
$block->setItem($item);
105117
return $block->toHtml();
106118
}

app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
*/
66
namespace Magento\Sales\Model\Order\Email\Sender;
77

8+
use Magento\Framework\DataObject;
9+
use Magento\Framework\Event\ManagerInterface;
810
use Magento\Payment\Helper\Data as PaymentHelper;
911
use Magento\Sales\Model\Order;
12+
use Magento\Sales\Model\Order\Address\Renderer;
1013
use Magento\Sales\Model\Order\Email\Container\InvoiceIdentity;
1114
use Magento\Sales\Model\Order\Email\Container\Template;
1215
use Magento\Sales\Model\Order\Email\Sender;
1316
use Magento\Sales\Model\Order\Invoice;
1417
use Magento\Sales\Model\ResourceModel\Order\Invoice as InvoiceResource;
15-
use Magento\Sales\Model\Order\Address\Renderer;
16-
use Magento\Framework\Event\ManagerInterface;
17-
use Magento\Framework\DataObject;
1818

1919
/**
2020
* Sends order invoice email to the customer.
@@ -106,6 +106,12 @@ public function send(Invoice $invoice, $forceSyncMode = false)
106106
$order = $invoice->getOrder();
107107
$this->identityContainer->setStore($order->getStore());
108108

109+
if ($this->checkIfPartialInvoice($order, $invoice)) {
110+
$order->setBaseSubtotal((float) $invoice->getBaseSubtotal());
111+
$order->setBaseTaxAmount((float) $invoice->getBaseTaxAmount());
112+
$order->setBaseShippingAmount((float) $invoice->getBaseShippingAmount());
113+
}
114+
109115
$transport = [
110116
'order' => $order,
111117
'order_id' => $order->getId(),
@@ -165,4 +171,18 @@ protected function getPaymentHtml(Order $order)
165171
$this->identityContainer->getStore()->getStoreId()
166172
);
167173
}
174+
175+
/**
176+
* Check if the order contains partial invoice
177+
*
178+
* @param Order $order
179+
* @param Invoice $invoice
180+
* @return bool
181+
*/
182+
private function checkIfPartialInvoice(Order $order, Invoice $invoice): bool
183+
{
184+
$totalQtyOrdered = (float) $order->getTotalQtyOrdered();
185+
$totalQtyInvoiced = (float) $invoice->getTotalQty();
186+
return $totalQtyOrdered !== $totalQtyInvoiced;
187+
}
168188
}

app/code/Magento/Sales/Test/Unit/Block/Order/Email/Items/DefaultItemsTest.php

Lines changed: 67 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,72 +6,105 @@
66

77
namespace Magento\Sales\Test\Unit\Block\Order\Email\Items;
88

9-
class DefaultItemsTest extends \PHPUnit\Framework\TestCase
9+
use Magento\Backend\Block\Template;
10+
use Magento\Backend\Block\Template\Context;
11+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
12+
use Magento\Framework\View\Layout;
13+
use Magento\Quote\Model\Quote\Item as QuoteItem;
14+
use Magento\Sales\Block\Order\Email\Items\DefaultItems;
15+
use Magento\Sales\Model\Order\Item;
16+
use PHPUnit\Framework\TestCase;
17+
18+
class DefaultItemsTest extends TestCase
1019
{
1120
/**
1221
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Sales\Block\Order\Email\Items\DefaultItem
1322
*/
1423
protected $block;
1524

1625
/**
17-
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Backend\Block\Template
26+
* @var \PHPUnit_Framework_MockObject_MockObject|Template
1827
*/
1928
protected $priceRenderBlock;
2029

2130
/**
22-
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\View\Layout
31+
* @var \PHPUnit_Framework_MockObject_MockObject|Layout
2332
*/
2433
protected $layoutMock;
2534

2635
/**
27-
* @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
36+
* @var ObjectManager
2837
*/
2938
protected $objectManager;
3039

31-
/** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Quote\Model\Quote\Item */
40+
/** @var \PHPUnit_Framework_MockObject_MockObject|Item */
3241
protected $itemMock;
3342

43+
/** @var \PHPUnit_Framework_MockObject_MockObject|QuoteItem */
44+
protected $quoteItemMock;
45+
3446
/**
3547
* Initialize required data
3648
*/
3749
protected function setUp()
3850
{
39-
$this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
51+
$this->objectManager = new ObjectManager($this);
4052

41-
$this->layoutMock = $this->getMockBuilder(\Magento\Framework\View\Layout::class)
53+
$this->layoutMock = $this->getMockBuilder(Layout::class)
4254
->disableOriginalConstructor()
4355
->setMethods(['getBlock'])
4456
->getMock();
4557

46-
$this->block = $this->objectManager->getObject(
47-
\Magento\Sales\Block\Order\Email\Items\DefaultItems::class,
48-
[
49-
'context' => $this->objectManager->getObject(
50-
\Magento\Backend\Block\Template\Context::class,
51-
['layout' => $this->layoutMock]
52-
)
53-
]
54-
);
58+
$this->priceRenderBlock = $this->getMockBuilder(Template::class)
59+
->disableOriginalConstructor()
60+
->setMethods(['setItem','toHtml'])
61+
->getMock();
5562

56-
$this->priceRenderBlock = $this->getMockBuilder(\Magento\Backend\Block\Template::class)
63+
$this->itemMock = $this->getMockBuilder(Item::class)
5764
->disableOriginalConstructor()
58-
->setMethods(['setItem', 'toHtml'])
65+
->setMethods(['__wakeup','setRowTotal', 'setBaseRowTotal', 'getPrice', 'getBasePrice'])
5966
->getMock();
6067

61-
$this->itemMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Item::class)
68+
$this->quoteItemMock = $this->getMockBuilder(QuoteItem::class)
6269
->disableOriginalConstructor()
63-
->setMethods(['__wakeup'])
70+
->setMethods(['getQty'])
6471
->getMock();
72+
73+
$this->block = $this->objectManager->getObject(
74+
DefaultItems::class,
75+
[
76+
'context' => $this->objectManager->getObject(
77+
Context::class,
78+
['layout' => $this->layoutMock]
79+
),
80+
'data' => [
81+
'item' => $this->quoteItemMock
82+
]
83+
]
84+
);
6585
}
6686

67-
public function testGetItemPrice()
87+
/**
88+
* @param float $price
89+
* @param string $html
90+
* @param float $quantity
91+
* @dataProvider getItemPriceDataProvider
92+
* */
93+
public function testGetItemPrice($price, $html, $quantity)
6894
{
69-
$html = '$34.28';
70-
7195
$this->layoutMock->expects($this->once())
7296
->method('getBlock')
7397
->with('item_price')
7498
->will($this->returnValue($this->priceRenderBlock));
99+
$this->quoteItemMock->expects($this->any())
100+
->method('getQty')
101+
->will($this->returnValue($quantity));
102+
$this->itemMock->expects($this->any())
103+
->method('setRowTotal')
104+
->will($this->returnValue($price * $quantity));
105+
$this->itemMock->expects($this->any())
106+
->method('setBaseRowTotal')
107+
->will($this->returnValue($price * $quantity));
75108

76109
$this->priceRenderBlock->expects($this->once())
77110
->method('setItem')
@@ -83,4 +116,15 @@ public function testGetItemPrice()
83116

84117
$this->assertEquals($html, $this->block->getItemPrice($this->itemMock));
85118
}
119+
120+
/**
121+
* @return array
122+
*/
123+
public function getItemPriceDataProvider()
124+
{
125+
return [
126+
'get default item price' => [34.28,'$34.28',1.0],
127+
'get item price with quantity 2.0' => [12.00,'$24.00',2.0]
128+
];
129+
}
86130
}

dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/InvoiceSenderTest.php

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,45 @@
55
*/
66
namespace Magento\Sales\Model\Order\Email\Sender;
77

8-
class InvoiceSenderTest extends \PHPUnit\Framework\TestCase
8+
use Magento\Framework\App\Area;
9+
use Magento\Sales\Model\Order;
10+
use Magento\Sales\Model\Order\Invoice;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
use PHPUnit\Framework\TestCase;
13+
14+
class InvoiceSenderTest extends TestCase
915
{
1016
/**
1117
* @magentoDataFixture Magento/Sales/_files/order.php
1218
*/
1319
public function testSend()
1420
{
15-
\Magento\TestFramework\Helper\Bootstrap::getInstance()
16-
->loadArea(\Magento\Framework\App\Area::AREA_FRONTEND);
17-
$order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
18-
->create(\Magento\Sales\Model\Order::class);
21+
Bootstrap::getInstance()
22+
->loadArea(Area::AREA_FRONTEND);
23+
$order = Bootstrap::getObjectManager()
24+
->create(Order::class);
1925
$order->loadByIncrementId('100000001');
2026
$order->setCustomerEmail('customer@example.com');
2127

22-
$invoice = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
23-
\Magento\Sales\Model\Order\Invoice::class
28+
$invoice = Bootstrap::getObjectManager()->create(
29+
Invoice::class
2430
);
2531
$invoice->setOrder($order);
26-
32+
$invoice->setTotalQty(1);
33+
$invoice->setBaseSubtotal(50);
34+
$invoice->setBaseTaxAmount(10);
35+
$invoice->setBaseShippingAmount(5);
2736
/** @var InvoiceSender $invoiceSender */
28-
$invoiceSender = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
29-
->create(\Magento\Sales\Model\Order\Email\Sender\InvoiceSender::class);
37+
$invoiceSender = Bootstrap::getObjectManager()
38+
->create(InvoiceSender::class);
3039

3140
$this->assertEmpty($invoice->getEmailSent());
3241
$result = $invoiceSender->send($invoice, true);
3342

3443
$this->assertTrue($result);
3544
$this->assertNotEmpty($invoice->getEmailSent());
45+
$this->assertEquals($invoice->getBaseSubtotal(), $order->getBaseSubtotal());
46+
$this->assertEquals($invoice->getBaseTaxAmount(), $order->getBaseTaxAmount());
47+
$this->assertEquals($invoice->getBaseShippingAmount(), $order->getBaseShippingAmount());
3648
}
3749
}

0 commit comments

Comments
 (0)