Skip to content

Commit 1bc2445

Browse files
authored
ENGCOM-6768: #26245: Magento does not send an email about a refunded grouped product #26246
2 parents 1027e02 + cdcdfd6 commit 1bc2445

File tree

7 files changed

+228
-1
lines changed

7 files changed

+228
-1
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
/**
3+
* Order Email items grouped renderer
4+
*
5+
* Copyright © Magento, Inc. All rights reserved.
6+
* See COPYING.txt for license details.
7+
*/
8+
namespace Magento\GroupedProduct\Block\Order\Email\Items\CreditMemo;
9+
10+
use Magento\Sales\Block\Order\Email\Items\DefaultItems;
11+
12+
/**
13+
* Class renders grouped product(s) in the CreditMemo email
14+
*
15+
* @api
16+
*/
17+
class Grouped extends DefaultItems
18+
{
19+
/**
20+
* Prepare item html
21+
*
22+
* This method uses renderer for real product type
23+
*
24+
* @return string
25+
*/
26+
protected function _toHtml()
27+
{
28+
if ($this->getItem()->getOrderItem()) {
29+
$item = $this->getItem()->getOrderItem();
30+
} else {
31+
$item = $this->getItem();
32+
}
33+
if ($productType = $item->getRealProductType()) {
34+
$renderer = $this->getRenderedBlock()->getItemRenderer($productType);
35+
$renderer->setItem($this->getItem());
36+
return $renderer->toHtml();
37+
}
38+
return parent::_toHtml();
39+
}
40+
}

app/code/Magento/GroupedProduct/view/frontend/layout/sales_email_order_creditmemo_renderers.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" label="Email Creditmemo Items List" design_abstraction="custom">
99
<body>
1010
<referenceBlock name="sales.email.order.creditmemo.renderers">
11-
<block class="Magento\GroupedProduct\Block\Order\Email\Items\Order\Grouped" name="sales.email.order.creditmemo.renderers.grouped" as="grouped" template="Magento_Sales::email/items/creditmemo/default.phtml"/>
11+
<block class="Magento\GroupedProduct\Block\Order\Email\Items\CreditMemo\Grouped" name="sales.email.order.creditmemo.renderers.grouped" as="grouped" template="Magento_Sales::email/items/creditmemo/default.phtml"/>
1212
</referenceBlock>
1313
</body>
1414
</page>
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\GroupedProduct\Block\Order\Email\Items\CreditMemo;
9+
10+
use Magento\Sales\Block\Order\Email\Items\DefaultItems;
11+
use Magento\Sales\Model\Order\Creditmemo;
12+
use Magento\TestFramework\Helper\Bootstrap;
13+
use PHPUnit\Framework\TestCase;
14+
15+
/**
16+
* Verify grouped product block will output correct data.
17+
*
18+
* @magentoAppArea frontend
19+
*/
20+
class GroupedTest extends TestCase
21+
{
22+
/**
23+
* Test subject.
24+
*
25+
* @var Grouped
26+
*/
27+
private $block;
28+
29+
/**
30+
* @var CreditMemo
31+
*/
32+
private $creditMemo;
33+
34+
/**
35+
* @inheritDoc
36+
*/
37+
protected function setUp()
38+
{
39+
$this->block = Bootstrap::getObjectManager()->get(Grouped::class);
40+
$this->creditMemo = Bootstrap::getObjectManager()->get(CreditMemo::class);
41+
}
42+
43+
/**
44+
* Verify, grouped block will output correct product sku and name.
45+
*
46+
* @magentoDataFixture Magento/Sales/_files/creditmemo_with_grouped_product.php
47+
*/
48+
public function testToHtml()
49+
{
50+
$creditMemo = $this->creditMemo->load('100000002', 'increment_id');
51+
$creditMemoItem = $creditMemo->getItemsCollection()->getFirstItem();
52+
$priceBlock = Bootstrap::getObjectManager()->create(DefaultItems::class);
53+
$this->block->setTemplate('Magento_Sales::email/items/creditmemo/default.phtml');
54+
$this->block->setItem($creditMemoItem);
55+
$this->block->getLayout()->setBlock('item_price', $priceBlock);
56+
$output = $this->block->toHtml();
57+
self::assertContains('SKU: simple_11', $output);
58+
self::assertContains('"product-name">Simple 11', $output);
59+
}
60+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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\Model\Order\Creditmemo;
9+
use Magento\Sales\Model\Order\Creditmemo\Item;
10+
use Magento\Sales\Model\Order\CreditmemoFactory;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
13+
require __DIR__ . '/order_with_grouped_product.php';
14+
15+
$objectManager = Bootstrap::getObjectManager();
16+
17+
$creditmemoFactory = $objectManager->get(CreditmemoFactory::class);
18+
$creditmemo = $creditmemoFactory->createByOrder($order, $order->getData());
19+
$creditmemo->setOrder($order);
20+
$creditmemo->setState(Creditmemo::STATE_OPEN);
21+
$creditmemo->setIncrementId('100000002');
22+
$creditmemo->save();
23+
24+
$orderItem = current($order->getAllItems());
25+
$orderItem->setName('Test item')
26+
->setQtyRefunded(1)
27+
->setQtyInvoiced(10)
28+
->setOriginalPrice(20);
29+
30+
$creditItem = $objectManager->get(Item::class);
31+
$creditItem->setCreditmemo($creditmemo)
32+
->setName('Creditmemo item')
33+
->setOrderItemId($orderItem->getId())
34+
->setQty(1)
35+
->setPrice(20)
36+
->save();
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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\Model\Order\Creditmemo;
9+
use Magento\Sales\Model\ResourceModel\Order\Creditmemo\Collection;
10+
use Magento\TestFramework\Helper\Bootstrap;
11+
12+
require 'default_rollback.php';
13+
14+
/** @var $creditmemo Creditmemo */
15+
$creditmemoCollection = Bootstrap::getObjectManager()->create(Collection::class);
16+
foreach ($creditmemoCollection as $creditmemo) {
17+
$creditmemo->delete();
18+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
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\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\Sales\Api\OrderRepositoryInterface;
10+
use Magento\Sales\Model\Order;
11+
use Magento\Sales\Model\Order\Address as OrderAddress;
12+
use Magento\Sales\Model\Order\Item as OrderItem;
13+
use Magento\Sales\Model\Order\Payment;
14+
use Magento\Store\Model\StoreManagerInterface;
15+
use Magento\TestFramework\Helper\Bootstrap;
16+
17+
require 'default_rollback.php';
18+
require __DIR__ . '/../../../Magento/GroupedProduct/_files/product_grouped_with_simple.php';
19+
$addressData = include __DIR__ . '/address_data.php';
20+
21+
$objectManager = Bootstrap::getObjectManager();
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+
$payment = $objectManager->create(Payment::class);
29+
$payment->setMethod('checkmo')
30+
->setAdditionalInformation('last_trans_id', '11122')
31+
->setAdditionalInformation(
32+
'metadata',
33+
[
34+
'type' => 'free',
35+
'fraudulent' => false,
36+
]
37+
);
38+
$product = $objectManager->get(ProductRepositoryInterface::class)->get('simple_11');
39+
$orderItem = $objectManager->create(OrderItem::class);
40+
$orderItem->setProductId($product->getId())
41+
->setQtyOrdered(2)
42+
->setBasePrice($product->getPrice())
43+
->setPrice($product->getPrice())
44+
->setRowTotal($product->getPrice())
45+
->setProductType('grouped')
46+
->setName($product->getName())
47+
->setSku($product->getSku());
48+
49+
$order = $objectManager->create(Order::class);
50+
$order->setIncrementId('100000002')
51+
->setState(Order::STATE_PROCESSING)
52+
->setStatus($order->getConfig()->getStateDefaultStatus(Order::STATE_PROCESSING))
53+
->setSubtotal(100)
54+
->setGrandTotal(100)
55+
->setBaseSubtotal(100)
56+
->setBaseGrandTotal(100)
57+
->setCustomerIsGuest(true)
58+
->setCustomerEmail('customer@null.com')
59+
->setBillingAddress($billingAddress)
60+
->setShippingAddress($shippingAddress)
61+
->setStoreId($objectManager->get(StoreManagerInterface::class)->getStore()->getId())
62+
->addItem($orderItem)
63+
->setPayment($payment);
64+
$orderRepository = $objectManager->create(OrderRepositoryInterface::class);
65+
$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';

0 commit comments

Comments
 (0)