Skip to content

Commit 876d96e

Browse files
committed
ACP2E-1620: [QUANS] Scheduled import successfully runs despite errors in system.log file
- Added the service to render the error message.
1 parent 647b34e commit 876d96e

File tree

2 files changed

+209
-76
lines changed

2 files changed

+209
-76
lines changed

app/code/Magento/ImportExport/Controller/Adminhtml/ImportResult.php

Lines changed: 36 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -5,108 +5,81 @@
55
*/
66
namespace Magento\ImportExport\Controller\Adminhtml;
77

8-
use Magento\Backend\App\Action;
9-
use Magento\ImportExport\Model\Import\Entity\AbstractEntity;
8+
use Magento\Backend\App\Action\Context;
9+
use Magento\Framework\View\Element\AbstractBlock;
10+
use Magento\ImportExport\Helper\Report;
11+
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingError;
1012
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface;
1113
use Magento\ImportExport\Model\History as ModelHistory;
12-
use Magento\Framework\Escaper;
1314
use Magento\Framework\App\ObjectManager;
15+
use Magento\ImportExport\Model\Import\RenderErrorMessages;
16+
use Magento\ImportExport\Model\Report\ReportProcessorInterface;
1417

1518
/**
1619
* Import controller
1720
*/
1821
abstract class ImportResult extends Import
1922
{
20-
const IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE = '*/history/download';
21-
22-
/**
23-
* Limit view errors
24-
*/
25-
const LIMIT_ERRORS_MESSAGE = 100;
26-
2723
/**
28-
* @var \Magento\ImportExport\Model\Report\ReportProcessorInterface
24+
* @var ReportProcessorInterface
2925
*/
30-
protected $reportProcessor;
26+
protected ReportProcessorInterface $reportProcessor;
3127

3228
/**
33-
* @var \Magento\ImportExport\Model\History
29+
* @var ModelHistory
3430
*/
35-
protected $historyModel;
31+
protected ModelHistory $historyModel;
3632

3733
/**
38-
* @var \Magento\ImportExport\Helper\Report
34+
* @var Report
3935
*/
40-
protected $reportHelper;
36+
protected Report $reportHelper;
4137

4238
/**
43-
* @var Escaper|null
39+
* @var RenderErrorMessages
4440
*/
45-
protected $escaper;
41+
private RenderErrorMessages $renderErrorMessages;
4642

4743
/**
48-
* @param \Magento\Backend\App\Action\Context $context
49-
* @param \Magento\ImportExport\Model\Report\ReportProcessorInterface $reportProcessor
50-
* @param \Magento\ImportExport\Model\History $historyModel
51-
* @param \Magento\ImportExport\Helper\Report $reportHelper
52-
* @param Escaper|null $escaper
44+
* @param Context $context
45+
* @param ReportProcessorInterface $reportProcessor
46+
* @param ModelHistory $historyModel
47+
* @param Report $reportHelper
48+
* @param RenderErrorMessages|null $renderErrorMessages
5349
*/
5450
public function __construct(
55-
\Magento\Backend\App\Action\Context $context,
56-
\Magento\ImportExport\Model\Report\ReportProcessorInterface $reportProcessor,
57-
\Magento\ImportExport\Model\History $historyModel,
58-
\Magento\ImportExport\Helper\Report $reportHelper,
59-
Escaper $escaper = null
51+
Context $context,
52+
ReportProcessorInterface $reportProcessor,
53+
ModelHistory $historyModel,
54+
Report $reportHelper,
55+
?RenderErrorMessages $renderErrorMessages = null
6056
) {
6157
parent::__construct($context);
6258
$this->reportProcessor = $reportProcessor;
6359
$this->historyModel = $historyModel;
6460
$this->reportHelper = $reportHelper;
65-
$this->escaper = $escaper
66-
?? ObjectManager::getInstance()->get(Escaper::class);
61+
$this->renderErrorMessages = $renderErrorMessages ??
62+
ObjectManager::getInstance()->get(RenderErrorMessages::class);
6763
}
6864

6965
/**
7066
* Add Error Messages for Import
7167
*
72-
* @param \Magento\Framework\View\Element\AbstractBlock $resultBlock
68+
* @param AbstractBlock $resultBlock
7369
* @param ProcessingErrorAggregatorInterface $errorAggregator
7470
* @return $this
7571
*/
7672
protected function addErrorMessages(
77-
\Magento\Framework\View\Element\AbstractBlock $resultBlock,
73+
AbstractBlock $resultBlock,
7874
ProcessingErrorAggregatorInterface $errorAggregator
7975
) {
8076
if ($errorAggregator->getErrorsCount()) {
81-
$message = '';
82-
$counter = 0;
83-
$escapedMessages = [];
84-
foreach ($this->getErrorMessages($errorAggregator) as $error) {
85-
$escapedMessages[] = (++$counter) . '. ' . $this->escaper->escapeHtml($error);
86-
if ($counter >= self::LIMIT_ERRORS_MESSAGE) {
87-
break;
88-
}
89-
}
90-
if ($errorAggregator->hasFatalExceptions()) {
91-
foreach ($this->getSystemExceptions($errorAggregator) as $error) {
92-
$escapedMessages[] = $this->escaper->escapeHtml($error->getErrorMessage())
93-
. ' <a href="#" onclick="$(this).next().show();$(this).hide();return false;">'
94-
. __('Show more') . '</a><div style="display:none;">' . __('Additional data') . ': '
95-
. $this->escaper->escapeHtml($error->getErrorDescription()) . '</div>';
96-
}
97-
}
9877
try {
99-
$message .= implode('<br>', $escapedMessages);
10078
$resultBlock->addNotice(
101-
'<strong>' . __('Following Error(s) has been occurred during importing process:') . '</strong><br>'
102-
. '<div class="import-error-wrapper">' . __('Only the first 100 errors are shown. ')
103-
. '<a href="'
104-
. $this->createDownloadUrlImportHistoryFile($this->createErrorReport($errorAggregator))
105-
. '">' . __('Download full report') . '</a><br>'
106-
. '<div class="import-error-list">' . $message . '</div></div>'
79+
$this->renderErrorMessages->renderMessages($errorAggregator)
10780
);
10881
} catch (\Exception $e) {
109-
foreach ($this->getErrorMessages($errorAggregator) as $errorMessage) {
82+
foreach ($this->renderErrorMessages->getErrorMessages($errorAggregator) as $errorMessage) {
11083
$resultBlock->addError($errorMessage);
11184
}
11285
}
@@ -118,28 +91,23 @@ protected function addErrorMessages(
11891
/**
11992
* Get all Error Messages from Import Results
12093
*
121-
* @param \Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface $errorAggregator
94+
* @param ProcessingErrorAggregatorInterface $errorAggregator
12295
* @return array
12396
*/
12497
protected function getErrorMessages(ProcessingErrorAggregatorInterface $errorAggregator)
12598
{
126-
$messages = [];
127-
$rowMessages = $errorAggregator->getRowsGroupedByErrorCode([], [AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]);
128-
foreach ($rowMessages as $errorCode => $rows) {
129-
$messages[] = $errorCode . ' ' . __('in row(s):') . ' ' . implode(', ', $rows);
130-
}
131-
return $messages;
99+
return $this->renderErrorMessages->getErrorMessages($errorAggregator);
132100
}
133101

134102
/**
135103
* Get System Generated Exception
136104
*
137105
* @param ProcessingErrorAggregatorInterface $errorAggregator
138-
* @return \Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingError[]
106+
* @return ProcessingError[]
139107
*/
140108
protected function getSystemExceptions(ProcessingErrorAggregatorInterface $errorAggregator)
141109
{
142-
return $errorAggregator->getErrorsByCode([AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]);
110+
return $this->renderErrorMessages->getSystemExceptions($errorAggregator);
143111
}
144112

145113
/**
@@ -150,15 +118,7 @@ protected function getSystemExceptions(ProcessingErrorAggregatorInterface $error
150118
*/
151119
protected function createErrorReport(ProcessingErrorAggregatorInterface $errorAggregator)
152120
{
153-
$this->historyModel->loadLastInsertItem();
154-
$sourceFile = $this->reportHelper->getReportAbsolutePath($this->historyModel->getImportedFile());
155-
$writeOnlyErrorItems = true;
156-
if ($this->historyModel->getData('execution_time') == ModelHistory::IMPORT_VALIDATION) {
157-
$writeOnlyErrorItems = false;
158-
}
159-
$fileName = $this->reportProcessor->createReport($sourceFile, $errorAggregator, $writeOnlyErrorItems);
160-
$this->historyModel->addErrorReportFile($fileName);
161-
return $fileName;
121+
return $this->renderErrorMessages->createErrorReport($errorAggregator);
162122
}
163123

164124
/**
@@ -169,6 +129,6 @@ protected function createErrorReport(ProcessingErrorAggregatorInterface $errorAg
169129
*/
170130
protected function createDownloadUrlImportHistoryFile($fileName)
171131
{
172-
return $this->getUrl(self::IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE, ['filename' => $fileName]);
132+
return $this->renderErrorMessages->createDownloadUrlImportHistoryFile($fileName);
173133
}
174134
}
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
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\ImportExport\Model\Import;
9+
10+
use Magento\Backend\Model\UrlInterface;
11+
use Magento\Framework\App\ObjectManager;
12+
use Magento\Framework\Escaper;
13+
use Magento\ImportExport\Helper\Report;
14+
use Magento\ImportExport\Model\History as ModelHistory;
15+
use Magento\ImportExport\Model\Import\Entity\AbstractEntity;
16+
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingError;
17+
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface;
18+
use Magento\ImportExport\Model\Report\ReportProcessorInterface;
19+
20+
/**
21+
* Import Render Error Messages Service model.
22+
*/
23+
class RenderErrorMessages
24+
{
25+
public const IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE = '*/history/download';
26+
27+
/**
28+
* Limit view errors
29+
*/
30+
public const LIMIT_ERRORS_MESSAGE = 100;
31+
32+
/**
33+
* @var ReportProcessorInterface
34+
*/
35+
private ReportProcessorInterface $reportProcessor;
36+
37+
/**
38+
* @var ModelHistory
39+
*/
40+
private ModelHistory $historyModel;
41+
42+
/**
43+
* @var Report
44+
*/
45+
private Report $reportHelper;
46+
47+
/**
48+
* @var Escaper|mixed
49+
*/
50+
private mixed $escaper;
51+
52+
/**
53+
* @var UrlInterface
54+
*/
55+
private mixed $backendUrl;
56+
57+
/**
58+
* @param ReportProcessorInterface $reportProcessor
59+
* @param ModelHistory $historyModel
60+
* @param Report $reportHelper
61+
* @param Escaper|null $escaper
62+
* @param UrlInterface|null $backendUrl
63+
*/
64+
public function __construct(
65+
ReportProcessorInterface $reportProcessor,
66+
ModelHistory $historyModel,
67+
Report $reportHelper,
68+
?Escaper $escaper = null,
69+
?UrlInterface $backendUrl = null
70+
) {
71+
$this->reportProcessor = $reportProcessor;
72+
$this->historyModel = $historyModel;
73+
$this->reportHelper = $reportHelper;
74+
$this->escaper = $escaper
75+
?? ObjectManager::getInstance()->get(Escaper::class);
76+
$this->backendUrl = $backendUrl
77+
?? ObjectManager::getInstance()->get(UrlInterface::class);
78+
}
79+
80+
/**
81+
* Add Error Messages for Import
82+
*
83+
* @param ProcessingErrorAggregatorInterface $errorAggregator
84+
* @return string|void
85+
*/
86+
public function renderMessages(
87+
ProcessingErrorAggregatorInterface $errorAggregator
88+
) {
89+
if ($errorAggregator->getErrorsCount()) {
90+
$message = '';
91+
$counter = 0;
92+
$escapedMessages = [];
93+
foreach ($this->getErrorMessages($errorAggregator) as $error) {
94+
$escapedMessages[] = (++$counter) . '. ' . $this->escaper->escapeHtml($error);
95+
if ($counter >= self::LIMIT_ERRORS_MESSAGE) {
96+
break;
97+
}
98+
}
99+
if ($errorAggregator->hasFatalExceptions()) {
100+
foreach ($this->getSystemExceptions($errorAggregator) as $error) {
101+
$escapedMessages[] = $this->escaper->escapeHtml($error->getErrorMessage())
102+
. ' <a href="#" onclick="$(this).next().show();$(this).hide();return false;">'
103+
. __('Show more') . '</a><div style="display:none;">' . __('Additional data') . ': '
104+
. $this->escaper->escapeHtml($error->getErrorDescription()) . '</div>';
105+
}
106+
}
107+
$message .= implode('<br>', $escapedMessages);
108+
return '<strong>' . __('Following Error(s) has been occurred during importing process:') . '</strong><br>'
109+
. '<div class="import-error-wrapper">' . __('Only the first 100 errors are shown. ')
110+
. '<a href="'
111+
. $this->createDownloadUrlImportHistoryFile($this->createErrorReport($errorAggregator))
112+
. '">' . __('Download full report') . '</a><br>'
113+
. '<div class="import-error-list">' . $message . '</div></div>';
114+
}
115+
}
116+
117+
/**
118+
* Get all Error Messages from Import Results
119+
*
120+
* @param ProcessingErrorAggregatorInterface $errorAggregator
121+
* @return array
122+
*/
123+
public function getErrorMessages(ProcessingErrorAggregatorInterface $errorAggregator)
124+
{
125+
$messages = [];
126+
$rowMessages = $errorAggregator->getRowsGroupedByErrorCode([], [AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]);
127+
foreach ($rowMessages as $errorCode => $rows) {
128+
$messages[] = $errorCode . ' ' . __('in row(s):') . ' ' . implode(', ', $rows);
129+
}
130+
return $messages;
131+
}
132+
133+
/**
134+
* Get System Generated Exception
135+
*
136+
* @param ProcessingErrorAggregatorInterface $errorAggregator
137+
* @return ProcessingError[]
138+
*/
139+
public function getSystemExceptions(ProcessingErrorAggregatorInterface $errorAggregator)
140+
{
141+
return $errorAggregator->getErrorsByCode([AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]);
142+
}
143+
144+
/**
145+
* Generate Error Report File
146+
*
147+
* @param ProcessingErrorAggregatorInterface $errorAggregator
148+
* @return string
149+
*/
150+
public function createErrorReport(ProcessingErrorAggregatorInterface $errorAggregator)
151+
{
152+
$this->historyModel->loadLastInsertItem();
153+
$sourceFile = $this->reportHelper->getReportAbsolutePath($this->historyModel->getImportedFile());
154+
$writeOnlyErrorItems = true;
155+
if ($this->historyModel->getData('execution_time') == ModelHistory::IMPORT_VALIDATION) {
156+
$writeOnlyErrorItems = false;
157+
}
158+
$fileName = $this->reportProcessor->createReport($sourceFile, $errorAggregator, $writeOnlyErrorItems);
159+
$this->historyModel->addErrorReportFile($fileName);
160+
return $fileName;
161+
}
162+
163+
/**
164+
* Get Import History Url
165+
*
166+
* @param string $fileName
167+
* @return string
168+
*/
169+
public function createDownloadUrlImportHistoryFile($fileName)
170+
{
171+
return $this->backendUrl->getUrl(self::IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE, ['filename' => $fileName]);
172+
}
173+
}

0 commit comments

Comments
 (0)