b374k
m1n1 1.01
Apache/2.4.41 (Ubuntu)
Linux vmi616275.contaboserver.net 5.4.0-84-generic #94-Ubuntu SMP Thu Aug 26 20:27:37 UTC 2021 x86_64
uid=33(www-data) gid=33(www-data) groups=33(www-data)
server ip : 62.171.164.128 | your ip : 127.0.0.1
safemode OFF
 >  / home / a / home / dev2.destoffenstraat.com / app / code / Mirasvit / Report / Console / Command /
Filename/home/a/home/dev2.destoffenstraat.com/app/code/Mirasvit/Report/Console/Command/ExportCommand.php
Size11.63 kb
Permissionrwxrwxrwx
Ownerroot : root
Create time21-Aug-2025 12:26
Last modified15-Oct-2024 20:30
Last accessed23-Aug-2025 06:18
Actionsedit | rename | delete | download (gzip)
Viewtext | code | image
<?php
/**
* Mirasvit
*
* This source file is subject to the Mirasvit Software License, which is available at https://mirasvit.com/license/.
* Do not edit or add to this file if you wish to upgrade the to newer versions in the future.
* If you wish to customize this module for your needs.
* Please refer to http://www.magentocommerce.com for more information.
*
* @category Mirasvit
* @package mirasvit/module-report
* @version 1.4.38
* @copyright Copyright (C) 2024 Mirasvit (https://mirasvit.com/)
*/




namespace Mirasvit\Report\Console\Command;

use Magento\Directory\Helper\Data as DirectoryHelper;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\App\StateFactory;
use Magento\Framework\Filesystem;
use Magento\Framework\Stdlib\DateTime\DateTime;
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
use Mirasvit\Core\Service\CompatibilityService;
use Mirasvit\Report\Api\Data\ReportInterface;
use Mirasvit\Report\Api\Service\DateServiceInterface;
use Mirasvit\Report\Api\Service\IntervalInterface;
use Mirasvit\Report\Model\Export\ConvertToCsv;
use Mirasvit\Report\Model\Export\ConvertToXml;
use Mirasvit\Report\Repository\ReportRepository;
use Mirasvit\ReportApi\Api\RequestBuilderInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class ExportCommand extends Command
{
private $appStateFactory;

private $repository;

private $requestBuilder;

private $convertToXml;

private $convertToCsv;

private $filesystem;

private $localeDate;

private $scopeConfig;

public function __construct(
StateFactory $appStateFactory,
ReportRepository $repository,
RequestBuilderInterface $requestBuilder,
Filesystem $filesystem,
ConvertToCsv $convertToCsv,
ConvertToXml $convertToXml,
ScopeConfigInterface $scopeConfig
) {
$this->appStateFactory = $appStateFactory;
$this->repository = $repository;
$this->requestBuilder = $requestBuilder;
$this->filesystem = $filesystem;
$this->convertToCsv = $convertToCsv;
$this->convertToXml = $convertToXml;
$this->scopeConfig = $scopeConfig;

parent::__construct();
}

/**
* {@inheritdoc}
*/
protected function configure()
{
$this->setName('mirasvit:report:export')
->setDescription('Export report');

$this->addOption('type', null, InputOption::VALUE_REQUIRED, 'Export type (csv, xml)');
$this->addOption(
'identifier',
null,
InputOption::VALUE_REQUIRED,
'Report identifier (To see the list with all available reports run <comment>mirasvit:report:export --report-list</comment> command)'
);
$this->addOption(
'interval',
null,
InputOption::VALUE_REQUIRED,
'Specify report date interval (run <comment>mirasvit:report:export --interval-list</comment> to see all available intrvals). Avoid this option for lifetime reports'
);
$this->addOption(
'--from',
null,
InputOption::VALUE_REQUIRED,
'Specify report start date in format <comment>YYYY-MM-dd</comment>. If not specified the report will use the earliest date'
);
$this->addOption(
'--to',
null,
InputOption::VALUE_REQUIRED,
'Specify report end date in format <comment>YYYY-MM-dd</comment>. If not specified the current date will be used'
);

$this->addOption('report-list', null, InputOption::VALUE_NONE, 'Display all reports identifiers');
$this->addOption('interval-list', null, InputOption::VALUE_NONE, 'Display all available date intervals');

parent::configure();
}

/**
* @SuppressWarnings(PHPMD)
*
* {@inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
try {
$this->appStateFactory->create()->setAreaCode('frontend');
} catch (\Exception $e) {
}

/** @var DateServiceInterface $dateService */
$dateService = CompatibilityService::getObjectManager()->get(DateServiceInterface::class);

$this->localeDate = CompatibilityService::getObjectManager()->get(TimezoneInterface::class);

if ($input->getOption('report-list')) {
$reports = $this->repository->getList();

$output->writeln("<info>Available Reports:</info>");
foreach ($reports as $report) {
$name = (string)$report->getName();
$identifier = (string)$report->getIdentifier();
$tab = str_repeat(" ", strlen($identifier) >= 30 ? 0 : 30 - strlen($identifier));

$output->writeln("<comment>{$identifier}</comment> {$tab}- {$name}");
}

return 0;
}

if ($input->getOption('interval-list')) {
$intervals = $dateService->getIntervals();

$intervals['custom'] = "Custom interval. "
. "Add additional options <comment>--from</comment> and <comment>--to</comment> "
. "with dates in format <comment>YYYY-MM-dd.</comment> "
. "If both options omited the lifetime report will be generated";

$output->writeln("<info>Available Intervals:</info>");
foreach ($intervals as $code => $label) {
$tab = str_repeat(" ", 12 - strlen($code));

$output->writeln("<comment>{$code}</comment>{$tab} - $label");
}

return 0;
}

$type = $input->getOption('type');

if (!$type || ($type !== 'csv' && $type !== 'xml')) {
$output->writeln("<error>Correct export type should be specified</error>");
$output->writeln("<info>Allowed types: csv, xml</info>");

return 0;
}

$identifier = $input->getOption('identifier');

if (!$identifier) {
$output->writeln("<error>Report identifier should be specified.</error>");
$output->writeln("<info>To see the list with all available reports run <comment>mirasvit:report:export --report-list</comment> command</info>");

return 0;
}

$interval = $input->getOption('interval') ?: 'lifetime';

$intervalCodes = array_keys($dateService->getIntervals());

$intervalCodes[] = 'custom';

if (!in_array($interval, $intervalCodes)) {
$output->writeln("<error>'{$interval}' is not in the list of available date intervals</error>");
$output->writeln("<info>To see the list with all available date intervals run <comment>mirasvit:report:export --interval-list</comment> command</info>");
$output->writeln("Avoid this option for lifetime reports");

return 0;
}

$intervalModel = null;

if ($interval == 'custom') {
$from = $this->resolveDate('from', $input->getOption('from'));

if (!$from) {
$output->writeln("<error>Incorrect --from date</error>");

return 0;
}

$from->setTime('00:00:00');

$to = $this->resolveDate('to', $input->getOption('to'));

if (!$to) {
$output->writeln("<error>Incorrect --to date</error>");

return 0;
}

$to->setTime('23:59:59');

$intervalModel = $dateService->toInterval($from, $to);

} else {
$intervalModel = $dateService->getInterval($interval);
}

$report = $this->repository->get($identifier);

if (!$report) {
$output->writeln("<error>Report with identifier {$identifier} does not exists.</error>");
$output->writeln("<info>To see the list with all available reports run <comment>mirasvit:report:export --report-list</comment> command</info>");

return 0;
}

$output->writeln("Building report...");

$response = $this->buildReport($report, $intervalModel);

$content = $type === 'xml'
? $this->convertToXml->getXmlFile($response)
: $this->convertToCsv->getCsvFile($response);

$path = $content['value'];

$copied = false;

$varDir = $this->filesystem->getDirectoryWrite(DirectoryList::VAR_DIR);

if ($varDir->isExist($content['value'])) {
$copyPath = 'export/report_' . $identifier . '_' . $interval . '_' . date('j-m-Y_h-i-s') . '.' . $type;

$copied = $varDir->copyFile($path, $copyPath);
$varDir->delete($path);
}

if ($copied) {
$rootPath = $varDir->getAbsolutePath() . $copyPath;
$output->writeln("Report saved in the file <comment>{$rootPath}</comment>");
}

return 0;
}

/**
* @SuppressWarnings(PHPMD)
*
* @param ReportInterface $report
* @param IntervalInterface $interval
*
* @return \Mirasvit\ReportApi\Api\RequestInterface
*/
private function buildReport($report, $interval)
{
$request = $this->requestBuilder->create();

$request->setTable($report->getTable())->setDimensions($report->getDimensions());

$hasDateDimension = false;

foreach ($report->getDimensions() as $c) {
$request->addColumn($c);

if (!$hasDateDimension && strpos($c, "_at") !== false) {
$hasDateDimension = true;
}
}

foreach ($report->getColumns() as $c) {
$request->addColumn($c);
}

foreach ($report->getInternalFilters() as $filter) {
if ($filter['conditionType'] == 'like') {
$filter['value'] = '%' . $filter['value'] . '%';
}

if(!$hasDateDimension && strpos($filter['column'], "_at") !== false) {
$hasDateDimension = true;
}

$request->addFilter($filter['column'], $filter['value'], $filter['conditionType']);
}

foreach($report->getPrimaryFilters() as $filter) {
if(!$hasDateDimension && strpos($filter, "_at") !== false) {
$hasDateDimension = true;
$dimensionFilter = $filter;
}
}

$filterColumn = isset($dimensionFilter) ? $dimensionFilter : $report->getTable() . '|created_at';

if ($hasDateDimension) {
$request->addFilter($filterColumn, $interval->getFrom()->toString('Y-MM-dd HH:mm:ss'), 'gteq', 'A')
->addFilter($filterColumn, $interval->getTo()->toString('Y-MM-dd HH:mm:ss'), 'lteq', 'A');
}

return $request;
}

/**
* @param string $dateType
* @param string $date
*
* @return bool|\IntlDateFormatter
*/
private function resolveDate($dateType, $date = null)
{
$locale = $this->scopeConfig->getValue(DirectoryHelper::XML_PATH_DEFAULT_LOCALE);

if (!$date) {
$timestamp = strtotime($this->localeDate->date()->format('Y-m-d H:i:s'));

$date = new \IntlDateFormatter(
$timestamp,
null,
$locale
);

if ($dateType == 'from') {
$date->subYear(10);
} else {
$date->addYear(10);
}

return $date;
}

try {
return new \IntlDateFormatter($date, null, $locale);
} catch (\Exception $e) {
return false;
}
}
}