Skip to content

Commit 4da3c36

Browse files
ENGCOM-8153: Resolve Can not export Coupon Code to CSV,XML issue29277 #29278
- Merge Pull Request #29278 from edenduong/magento2:2.4-bugfix/can_not_export_csv - Merged commits: 1. ca09097 2. c82e68f 3. e04514e 4. af02e48 5. c379cea
2 parents 20b7e0d + c379cea commit 4da3c36

File tree

4 files changed

+220
-2
lines changed

4 files changed

+220
-2
lines changed

app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ExportCouponsCsv.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515
use Magento\Framework\View\Result\Layout;
1616
use Magento\Framework\App\ResponseInterface;
1717
use Magento\Framework\App\Action\HttpGetActionInterface;
18+
use Magento\Framework\App\Action\HttpPostActionInterface;
1819

1920
/**
2021
* Export Coupons to csv file
2122
*
2223
* Class \Magento\SalesRule\Controller\Adminhtml\Promo\Quote\ExportCouponsCsv
2324
*/
24-
class ExportCouponsCsv extends Quote implements HttpGetActionInterface
25+
class ExportCouponsCsv extends Quote implements HttpGetActionInterface, HttpPostActionInterface
2526
{
2627
/**
2728
* Export coupon codes as CSV file

app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ExportCouponsXml.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515
use Magento\Framework\View\Result\Layout;
1616
use Magento\Framework\App\ResponseInterface;
1717
use Magento\Framework\App\Action\HttpGetActionInterface;
18+
use Magento\Framework\App\Action\HttpPostActionInterface;
1819

1920
/**
2021
* Export coupons to xml file
2122
*
2223
* Class \Magento\SalesRule\Controller\Adminhtml\Promo\Quote\ExportCouponsXml
2324
*/
24-
class ExportCouponsXml extends Quote implements HttpGetActionInterface
25+
class ExportCouponsXml extends Quote implements HttpGetActionInterface, HttpPostActionInterface
2526
{
2627
/**
2728
* Export coupon codes as excel xml file
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
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\SalesRule\Controller\Adminhtml\Promo\Quote\ExportCoupons;
9+
10+
use Magento\Framework\App\ResourceConnection;
11+
use Magento\SalesRule\Model\ResourceModel\Rule\Collection as RuleCollection;
12+
use Magento\SalesRule\Model\Rule;
13+
use Magento\TestFramework\TestCase\AbstractBackendController;
14+
use Magento\TestFramework\Helper\Bootstrap;
15+
16+
/**
17+
* Test export coupon csv
18+
*
19+
* Verify export csv
20+
* @magentoAppArea adminhtml
21+
* @magentoDataFixture Magento/SalesRule/_files/cart_rule_with_coupon_list.php
22+
*/
23+
class ExportCouponsCsvTest extends AbstractBackendController
24+
{
25+
/**
26+
* @var string
27+
*/
28+
protected $uri = 'backend/sales_rule/promo_quote/exportCouponsCsv';
29+
30+
/**
31+
* @var string
32+
*/
33+
protected $resource = 'Magento_SalesRule::quote';
34+
35+
/**
36+
* @var Rule
37+
*/
38+
private $salesRule;
39+
40+
/**
41+
* @var ResourceConnection
42+
*/
43+
private $resourceConnection;
44+
45+
/**
46+
* @inheritdoc
47+
*/
48+
protected function setUp(): void
49+
{
50+
parent::setUp();
51+
$this->resourceConnection = Bootstrap::getObjectManager()->get(ResourceConnection::class);
52+
$this->initSalesRule();
53+
}
54+
55+
/**
56+
* Prepare request
57+
*
58+
* @return void
59+
*/
60+
private function prepareRequest(): void
61+
{
62+
$couponList = $this->getCouponsIdList();
63+
if (count($couponList)) {
64+
$this->getRequest()->setParams(['internal_ids' => $couponList[0]])->setMethod('POST');
65+
}
66+
}
67+
68+
/**
69+
* Init current sales rule
70+
*
71+
* @return void
72+
*/
73+
private function initSalesRule(): void
74+
{
75+
/** @var RuleCollection $collection */
76+
$collection = Bootstrap::getObjectManager()->create(RuleCollection::class);
77+
$collection->addFieldToFilter('name', 'Rule with coupon list');
78+
$this->salesRule = $collection->getFirstItem();
79+
}
80+
81+
/**
82+
* Retrieve id list of coupons
83+
*
84+
* @return array
85+
*/
86+
private function getCouponsIdList(): array
87+
{
88+
$select = $this->resourceConnection->getConnection()
89+
->select()
90+
->from($this->resourceConnection->getTableName('salesrule_coupon'))
91+
->columns(['coupon_id'])
92+
->where('rule_id=?', $this->salesRule->getId());
93+
94+
return $this->resourceConnection->getConnection()->fetchCol($select);
95+
}
96+
97+
/**
98+
* Test export csv
99+
*
100+
* @return void
101+
*/
102+
public function testExportCsv(): void
103+
{
104+
$this->prepareRequest();
105+
$this->dispatch($this->uri);
106+
$this->assertStringNotContainsString('404 Error', $this->getResponse()->getBody());
107+
}
108+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
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\SalesRule\Controller\Adminhtml\Promo\Quote\ExportCoupons;
9+
10+
use Magento\Framework\App\ResourceConnection;
11+
use Magento\SalesRule\Model\ResourceModel\Rule\Collection as RuleCollection;
12+
use Magento\SalesRule\Model\Rule;
13+
use Magento\TestFramework\TestCase\AbstractBackendController;
14+
use Magento\TestFramework\Helper\Bootstrap;
15+
16+
/**
17+
* Test export coupon xml
18+
*
19+
* Verify export xml
20+
* @magentoAppArea adminhtml
21+
* @magentoDataFixture Magento/SalesRule/_files/cart_rule_with_coupon_list.php
22+
*/
23+
class ExportCouponsXmlTest extends AbstractBackendController
24+
{
25+
/**
26+
* @var string
27+
*/
28+
protected $uri = 'backend/sales_rule/promo_quote/exportCouponsXml';
29+
30+
/**
31+
* @var string
32+
*/
33+
protected $resource = 'Magento_SalesRule::quote';
34+
35+
/**
36+
* @var Rule
37+
*/
38+
private $salesRule;
39+
40+
/**
41+
* @var ResourceConnection
42+
*/
43+
private $resourceConnection;
44+
45+
/**
46+
* @inheritdoc
47+
*/
48+
protected function setUp(): void
49+
{
50+
parent::setUp();
51+
$this->resourceConnection = Bootstrap::getObjectManager()->get(ResourceConnection::class);
52+
$this->initSalesRule();
53+
}
54+
55+
/**
56+
* Prepare request
57+
*
58+
* @return void
59+
*/
60+
private function prepareRequest(): void
61+
{
62+
$couponList = $this->getCouponsIdList();
63+
if (count($couponList)) {
64+
$this->getRequest()->setParams(['internal_ids' => $couponList[0]])->setMethod('POST');
65+
}
66+
}
67+
68+
/**
69+
* Init current sales rule
70+
*
71+
* @return void
72+
*/
73+
private function initSalesRule(): void
74+
{
75+
/** @var RuleCollection $collection */
76+
$collection = Bootstrap::getObjectManager()->create(RuleCollection::class);
77+
$collection->addFieldToFilter('name', 'Rule with coupon list');
78+
$this->salesRule = $collection->getFirstItem();
79+
}
80+
81+
/**
82+
* Retrieve id list of coupons
83+
*
84+
* @return array
85+
*/
86+
private function getCouponsIdList(): array
87+
{
88+
$select = $this->resourceConnection->getConnection()
89+
->select()
90+
->from($this->resourceConnection->getTableName('salesrule_coupon'))
91+
->columns(['coupon_id'])
92+
->where('rule_id=?', $this->salesRule->getId());
93+
94+
return $this->resourceConnection->getConnection()->fetchCol($select);
95+
}
96+
97+
/**
98+
* Test export xml
99+
*
100+
* @return void
101+
*/
102+
public function testExportCsv(): void
103+
{
104+
$this->prepareRequest();
105+
$this->dispatch($this->uri);
106+
$this->assertStringNotContainsString('404 Error', $this->getResponse()->getBody());
107+
}
108+
}

0 commit comments

Comments
 (0)