Skip to content

Commit fbd96ec

Browse files
Merge remote-tracking branch 'origin/MC-34803' into 2.4-develop-pr34
2 parents 1d1fde9 + cd18428 commit fbd96ec

File tree

4 files changed

+107
-29
lines changed

4 files changed

+107
-29
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\Sales\Block\Order\Email\Items;
79

10+
use Magento\Framework\Exception\LocalizedException;
11+
use Magento\Framework\View\Element\Template;
812
use Magento\Sales\Model\Order\Creditmemo\Item as CreditmemoItem;
913
use Magento\Sales\Model\Order\Invoice\Item as InvoiceItem;
1014
use Magento\Sales\Model\Order\Item as OrderItem;
@@ -16,7 +20,7 @@
1620
* @author Magento Core Team <core@magentocommerce.com>
1721
* @since 100.0.2
1822
*/
19-
class DefaultItems extends \Magento\Framework\View\Element\Template
23+
class DefaultItems extends Template
2024
{
2125
/**
2226
* Retrieve current order model instance
@@ -92,6 +96,7 @@ public function getSku($item)
9296
* Return product additional information block
9397
*
9498
* @return \Magento\Framework\View\Element\AbstractBlock
99+
* @throws LocalizedException
95100
*/
96101
public function getProductAdditionalInformationBlock()
97102
{
@@ -103,10 +108,13 @@ public function getProductAdditionalInformationBlock()
103108
*
104109
* @param OrderItem|InvoiceItem|CreditmemoItem $item
105110
* @return string
111+
* @throws LocalizedException
106112
*/
107113
public function getItemPrice($item)
108114
{
109115
$block = $this->getLayout()->getBlock('item_price');
116+
$item->setRowTotal((float) $item->getPrice() * (float) $this->getItem()->getQty());
117+
$item->setBaseRowTotal((float) $item->getBasePrice() * (float) $this->getItem()->getQty());
110118
$block->setItem($item);
111119
return $block->toHtml();
112120
}

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

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\Sales\Model\Order\Email\Sender;
79

10+
use Magento\Framework\DataObject;
11+
use Magento\Framework\Event\ManagerInterface;
812
use Magento\Payment\Helper\Data as PaymentHelper;
913
use Magento\Sales\Model\Order;
14+
use Magento\Sales\Model\Order\Address\Renderer;
1015
use Magento\Sales\Model\Order\Email\Container\InvoiceIdentity;
1116
use Magento\Sales\Model\Order\Email\Container\Template;
1217
use Magento\Sales\Model\Order\Email\Sender;
1318
use Magento\Sales\Model\Order\Invoice;
1419
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;
1820

1921
/**
2022
* Sends order invoice email to the customer.
@@ -106,6 +108,12 @@ public function send(Invoice $invoice, $forceSyncMode = false)
106108
$order = $invoice->getOrder();
107109
$this->identityContainer->setStore($order->getStore());
108110

111+
if ($this->checkIfPartialInvoice($order, $invoice)) {
112+
$order->setBaseSubtotal((float) $invoice->getBaseSubtotal());
113+
$order->setBaseTaxAmount((float) $invoice->getBaseTaxAmount());
114+
$order->setBaseShippingAmount((float) $invoice->getBaseShippingAmount());
115+
}
116+
109117
$transport = [
110118
'order' => $order,
111119
'order_id' => $order->getId(),
@@ -165,4 +173,18 @@ protected function getPaymentHtml(Order $order)
165173
$this->identityContainer->getStore()->getStoreId()
166174
);
167175
}
176+
177+
/**
178+
* Check if the order contains partial invoice
179+
*
180+
* @param Order $order
181+
* @param Invoice $invoice
182+
* @return bool
183+
*/
184+
private function checkIfPartialInvoice(Order $order, Invoice $invoice): bool
185+
{
186+
$totalQtyOrdered = (float) $order->getTotalQtyOrdered();
187+
$totalQtyInvoiced = (float) $invoice->getTotalQty();
188+
return $totalQtyOrdered !== $totalQtyInvoiced;
189+
}
168190
}

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

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use Magento\Backend\Block\Template\Context;
1212
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
1313
use Magento\Framework\View\Layout;
14-
use Magento\Quote\Model\Quote\Item;
14+
use Magento\Quote\Model\Quote\Item as QuoteItem;
1515
use Magento\Sales\Block\Order\Email\Items\DefaultItems;
1616
use Magento\Sales\Model\Order\Item as OrderItem;
1717
use PHPUnit\Framework\MockObject\MockObject;
@@ -20,7 +20,7 @@
2020
class DefaultItemsTest extends TestCase
2121
{
2222
/**
23-
* @var MockObject|\Magento\Sales\Block\Order\Email\Items\DefaultItem
23+
* @var MockObject|DefaultItems
2424
*/
2525
protected $block;
2626

@@ -39,9 +39,16 @@ class DefaultItemsTest extends TestCase
3939
*/
4040
protected $objectManager;
4141

42-
/** @var MockObject|Item */
42+
/**
43+
* @var MockObject|OrderItem
44+
*/
4345
protected $itemMock;
4446

47+
/**
48+
* @var MockObject|QuoteItem
49+
*/
50+
protected $quoteItemMock;
51+
4552
/**
4653
* Initialize required data
4754
*/
@@ -54,16 +61,6 @@ protected function setUp(): void
5461
->setMethods(['getBlock'])
5562
->getMock();
5663

57-
$this->block = $this->objectManager->getObject(
58-
DefaultItems::class,
59-
[
60-
'context' => $this->objectManager->getObject(
61-
Context::class,
62-
['layout' => $this->layoutMock]
63-
)
64-
]
65-
);
66-
6764
$this->priceRenderBlock = $this->getMockBuilder(Template::class)
6865
->disableOriginalConstructor()
6966
->setMethods(['setItem', 'toHtml'])
@@ -72,16 +69,47 @@ protected function setUp(): void
7269
$this->itemMock = $this->getMockBuilder(OrderItem::class)
7370
->disableOriginalConstructor()
7471
->getMock();
72+
73+
$this->quoteItemMock = $this->getMockBuilder(QuoteItem::class)
74+
->disableOriginalConstructor()
75+
->setMethods(['getQty'])
76+
->getMock();
77+
78+
$this->block = $this->objectManager->getObject(
79+
DefaultItems::class,
80+
[
81+
'context' => $this->objectManager->getObject(
82+
Context::class,
83+
['layout' => $this->layoutMock]
84+
),
85+
'data' => [
86+
'item' => $this->quoteItemMock
87+
]
88+
]
89+
);
7590
}
7691

77-
public function testGetItemPrice()
92+
/**
93+
* @param float $price
94+
* @param string $html
95+
* @param float $quantity
96+
* @dataProvider getItemPriceDataProvider
97+
* */
98+
public function testGetItemPrice($price, $html, $quantity)
7899
{
79-
$html = '$34.28';
80-
81100
$this->layoutMock->expects($this->once())
82101
->method('getBlock')
83102
->with('item_price')
84103
->willReturn($this->priceRenderBlock);
104+
$this->quoteItemMock->expects($this->any())
105+
->method('getQty')
106+
->willReturn($quantity);
107+
$this->itemMock->expects($this->any())
108+
->method('setRowTotal')
109+
->willReturn($price * $quantity);
110+
$this->itemMock->expects($this->any())
111+
->method('setBaseRowTotal')
112+
->willReturn($price * $quantity);
85113

86114
$this->priceRenderBlock->expects($this->once())
87115
->method('setItem')
@@ -93,4 +121,15 @@ public function testGetItemPrice()
93121

94122
$this->assertEquals($html, $this->block->getItemPrice($this->itemMock));
95123
}
124+
125+
/**
126+
* @return array
127+
*/
128+
public function getItemPriceDataProvider()
129+
{
130+
return [
131+
'get default item price' => [34.28,'$34.28',1.0],
132+
'get item price with quantity 2.0' => [12.00,'$24.00',2.0]
133+
];
134+
}
96135
}

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

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\Sales\Model\Order\Email\Sender;
79

810
use Magento\Customer\Api\CustomerRepositoryInterface;
@@ -11,6 +13,7 @@
1113
use Magento\Sales\Model\Order\Email\Container\InvoiceIdentity;
1214
use Magento\Sales\Model\Order\Invoice;
1315
use Magento\TestFramework\Helper\Bootstrap;
16+
use Magento\Framework\App\Area;
1417
use PHPUnit\Framework\TestCase;
1518

1619
class InvoiceSenderTest extends TestCase
@@ -39,27 +42,33 @@ protected function setUp(): void
3942
*/
4043
public function testSend()
4144
{
42-
\Magento\TestFramework\Helper\Bootstrap::getInstance()
43-
->loadArea(\Magento\Framework\App\Area::AREA_FRONTEND);
44-
$order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
45-
->create(\Magento\Sales\Model\Order::class);
45+
Bootstrap::getInstance()
46+
->loadArea(Area::AREA_FRONTEND);
47+
$order = Bootstrap::getObjectManager()
48+
->create(Order::class);
4649
$order->loadByIncrementId('100000001');
4750
$order->setCustomerEmail('customer@example.com');
4851

49-
$invoice = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
50-
\Magento\Sales\Model\Order\Invoice::class
52+
$invoice = Bootstrap::getObjectManager()->create(
53+
Invoice::class
5154
);
5255
$invoice->setOrder($order);
53-
56+
$invoice->setTotalQty(1);
57+
$invoice->setBaseSubtotal(50);
58+
$invoice->setBaseTaxAmount(10);
59+
$invoice->setBaseShippingAmount(5);
5460
/** @var InvoiceSender $invoiceSender */
55-
$invoiceSender = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
56-
->create(\Magento\Sales\Model\Order\Email\Sender\InvoiceSender::class);
61+
$invoiceSender = Bootstrap::getObjectManager()
62+
->create(InvoiceSender::class);
5763

5864
$this->assertEmpty($invoice->getEmailSent());
5965
$result = $invoiceSender->send($invoice, true);
6066

6167
$this->assertTrue($result);
6268
$this->assertNotEmpty($invoice->getEmailSent());
69+
$this->assertEquals($invoice->getBaseSubtotal(), $order->getBaseSubtotal());
70+
$this->assertEquals($invoice->getBaseTaxAmount(), $order->getBaseTaxAmount());
71+
$this->assertEquals($invoice->getBaseShippingAmount(), $order->getBaseShippingAmount());
6372
}
6473

6574
/**

0 commit comments

Comments
 (0)