1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Analytics\Model;
use Magento\Analytics\ReportXml\DB\ReportValidator;
use Magento\Framework\Filesystem\Directory\WriteInterface;
/**
* Writes reports in files in csv format
* @inheritdoc
*/
class ReportWriter implements ReportWriterInterface
{
/**
* File name for error reporting file in archive
*
* @var string
*/
private $errorsFileName = 'errors.csv';
/**
* @var Config
*/
private $config;
/**
* @var ProviderFactory
*/
private $providerFactory;
/**
* @var ReportValidator
*/
private $reportValidator;
/**
* ReportWriter constructor.
*
* @param ConfigInterface $config
* @param ReportValidator $reportValidator
* @param ProviderFactory $providerFactory
*/
public function __construct(
ConfigInterface $config,
ReportValidator $reportValidator,
ProviderFactory $providerFactory
) {
$this->config = $config;
$this->reportValidator = $reportValidator;
$this->providerFactory = $providerFactory;
}
/**
* {@inheritdoc}
*/
public function write(WriteInterface $directory, $path)
{
$errorsList = [];
foreach ($this->config->get() as $file) {
$provider = reset($file['providers']);
if (isset($provider['parameters']['name'])) {
$error = $this->reportValidator->validate($provider['parameters']['name']);
if ($error) {
$errorsList[] = $error;
continue;
}
}
/** @var $providerObject */
$providerObject = $this->providerFactory->create($provider['class']);
$fileName = $provider['parameters'] ? $provider['parameters']['name'] : $provider['name'];
$fileFullPath = $path . $fileName . '.csv';
$fileData = $providerObject->getReport(...array_values($provider['parameters']));
$stream = $directory->openFile($fileFullPath, 'w+');
$stream->lock();
$headers = [];
foreach ($fileData as $row) {
if (!$headers) {
$headers = array_keys($row);
$stream->writeCsv($headers);
}
$stream->writeCsv($row);
}
$stream->unlock();
$stream->close();
}
if ($errorsList) {
$errorStream = $directory->openFile($path . $this->errorsFileName, 'w+');
foreach ($errorsList as $error) {
$errorStream->lock();
$errorStream->writeCsv($error);
$errorStream->unlock();
}
$errorStream->close();
}
return true;
}
}