|
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 / Mirasvit / Report / Service / |
Filename | /home/Mirasvit/Report/Service/EmailService.php |
Size | 10.54 kb |
Permission | rw-r--r-- |
Owner | root : root |
Create time | 01-Jul-2024 20:52 |
Last modified | 06-Apr-2021 18:06 |
Last accessed | 21-Aug-2025 20:16 |
Actions | edit | rename | delete | download (gzip) |
View | text | 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.3.101
* @copyright Copyright (C) 2020 Mirasvit (https://mirasvit.com/)
*/
namespace Mirasvit\Report\Service;
use Magento\Backend\App\Area\FrontNameResolver;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\File\Csv;
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
use Mirasvit\Report\Api\Data\EmailInterface;
use Mirasvit\Report\Api\Repository\Email\BlockRepositoryInterface;
use Mirasvit\Report\Api\Repository\EmailRepositoryInterface;
use Mirasvit\Report\Api\Repository\ReportRepositoryInterface;
use Mirasvit\Report\Api\Service\DateServiceInterface;
use Mirasvit\Report\Api\Service\EmailServiceInterface;
use Mirasvit\Report\Model\Mail\Template\TransportBuilder;
use Mirasvit\ReportApi\Api\Processor\ResponseItemInterface;
use Mirasvit\ReportApi\Api\RequestBuilderInterface;
class EmailService implements EmailServiceInterface
{
const TYPE_OCTETSTREAM = 'application/octet-stream';
const DISPOSITION_ATTACHMENT = 'attachment';
const ENCODING_BASE64 = 'base64';
/**
* @var Csv
*/
protected $csvProcessor;
/**
* @var ReportRepositoryInterface
*/
protected $reportRepository;
/**
* @var DateServiceInterface
*/
protected $dateService;
/**
* @var TransportBuilder
*/
private $transportBuilder;
/**
* @var EmailRepositoryInterface
*/
private $emailRepository;
/**
* @var ScopeConfigInterface
*/
private $scopeConfig;
/**
* @var TimezoneInterface
*/
private $timezone;
/**
* @var RequestBuilderInterface
*/
private $requestBuilder;
/**
* @var DirectoryList
*/
private $directoryList;
public function __construct(
TransportBuilder $transportBuilder,
EmailRepositoryInterface $emailRepository,
ScopeConfigInterface $scopeConfig,
TimezoneInterface $timezone,
Csv $csvProcessor,
DirectoryList $directoryList,
RequestBuilderInterface $requestBuilder,
ReportRepositoryInterface $reportRepository,
DateServiceInterface $dateService
) {
$this->transportBuilder = $transportBuilder;
$this->emailRepository = $emailRepository;
$this->scopeConfig = $scopeConfig;
$this->timezone = $timezone;
$this->csvProcessor = $csvProcessor;
$this->directoryList = $directoryList;
$this->requestBuilder = $requestBuilder;
$this->reportRepository = $reportRepository;
$this->dateService = $dateService;
}
/**
* {@inheritdoc}
*/
public function send(EmailInterface $email)
{
$vars = [
'subject' => $email->getSubject() . ' [' . $this->timezone->date()->format("M d, Y H:i") . ']',
'blocks' => "",
];
$definedReports = $this->emailRepository->getReports();
$blocks = $email->getBlocks();
if (null === $blocks) {
$blocks = [];
}
foreach ($blocks as $data) {
if (isset($data['identifier'])) {
$identifier = $data['identifier'];
foreach ($definedReports as $report) {
if ($report['value'] == $identifier) {
/** @var BlockRepositoryInterface $repo */
$repo = $report['repository'];
if (!isset($data['timeRange'])) {
$data['timeRange'] = 'today';
}
$content = $repo->getContent($identifier, $data);
if ($email->getIsAttachEnabled() && (strpos($content, 'table') !== false) && $this->reportRepository->get($identifier) !== null) {
$preparedReport = $this->prepareCsvReport($data);
$pathToCsvReports[] = $this->saveReportAsCsv($preparedReport, $identifier);
}
if ($content) {
$vars['blocks'] .= '<div class="block-wrapper">' . $content . '</div>';
}
}
}
}
}
$emails = explode(',', $email->getRecipient());
$i = 1;
foreach ($emails as $mail) {
if (!trim($mail)) {
continue;
}
$lastMailIdx = count($emails);
/** @var TransportBuilder $transport */
$transport = $this->transportBuilder
->setTemplateIdentifier('report_email')
->setTemplateOptions([
'area' => FrontNameResolver::AREA_CODE,
'store' => 0,
])
->setTemplateVars($vars)
->setFrom([
'name' => $this->scopeConfig->getValue('trans_email/ident_general/name'),
'email' => $this->scopeConfig->getValue('trans_email/ident_general/email'),
])
->addTo($mail);
if (!empty($pathToCsvReports)) {
foreach ($pathToCsvReports as $pathToCsvReport) {
$filename = explode('.', basename($pathToCsvReport));
$filename[0] .= '_' . $i;
$filename = implode('.', $filename);
$transport->addAttachment(
file_get_contents($pathToCsvReport),
$mimeType = self::TYPE_OCTETSTREAM,
$disposition = self::DISPOSITION_ATTACHMENT,
$encoding = self::ENCODING_BASE64,
$filename
);
}
}
$transport->getTransport()->sendMessage();
if ($i == $lastMailIdx) {
if (!empty($pathToCsvReports)) {
foreach ($pathToCsvReports as $pathToCsvReport) {
if (file_exists($pathToCsvReport)) {
unlink($pathToCsvReport);
}
}
}
}
$i++;
}
}
/**
* @param array $reportData
*
* @return array
*/
public function prepareCsvReport($reportData)
{
$response = $this->buildReportResponse($reportData);
$rows = [];
foreach ($response->getColumns() as $column) {
$rows['header'][] = $column->getLabel()->getText();
}
foreach ($response->getItems() as $item) {
$this->addRow($rows, $item, $response->getColumns());
}
return $rows;
}
/**
* @param array $rows
* @param ResponseItemInterface $item
* @param array $columns
*/
private function addRow(&$rows, ResponseItemInterface $item, array $columns)
{
$formattedData = $item->getFormattedData();
$data = [];
/** @var \Mirasvit\ReportApi\Api\Processor\ResponseColumnInterface $column */
foreach ($columns as $column) {
$name = $column->getName();
if (isset($formattedData[$name])) {
$data[] = $formattedData[$name];
} else {
$data[] = '';
}
}
$rows[] = $data;
foreach ($item->getItems() as $subItem) {
$this->addRow($rows, $subItem, $columns);
}
}
/**
* @param mixed $preparedReport
* @param string $identifier
*
* @return string
*/
public function saveReportAsCsv($preparedReport, $identifier)
{
$fileName = date('j_m_Y') . '_report_' . $identifier . '.csv';
$filePath = $this->directoryList->getPath(\Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR)
. "/" . $fileName;
$this->csvProcessor
->setDelimiter(',')
->setEnclosure('"')
->saveData($filePath, $preparedReport);
return $filePath;
}
/**
* @param array $reportData
*
* @return \Mirasvit\ReportApi\Api\ResponseInterface
*/
public function buildReportResponse($reportData)
{
$reportIdentifier = $reportData['identifier'];
$report = $this->reportRepository->get($reportIdentifier);
$tableName = $report->getTable() == 'sales_shipment' ? 'sales_shipment' : 'sales_order';
$interval = $this->dateService->getInterval($reportData['timeRange']);
$request = $this->requestBuilder->create()
->setTable($report->getTable())
->setDimensions($report->getDimensions())
->setPageSize((isset($reportData['limit']) && $reportData['limit']) ? $reportData['limit'] : 100000);
$hasDateDimension = false;
foreach ($report->getDimensions() as $column) {
$request->addColumn($column);
if (!$hasDateDimension && strpos($column, "_at") !== false) {
$hasDateDimension = true;
}
}
foreach ($report->getColumns() as $column) {
$request->addColumn($column);
}
foreach ($report->getInternalFilters() as $filter) {
if (strpos($filter['conditionType'], 'like') !== false) {
$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;
}
}
//report can return not all data if original report doesn't have date dimension
if ($hasDateDimension) {
$request->addFilter($tableName . '|created_at', $interval->getFrom()->toString('Y-MM-dd HH:mm:ss'), 'gteq', 'A')
->addFilter($tableName . '|created_at', $interval->getTo()->toString('Y-MM-dd HH:mm:ss'), 'lteq', 'A');
}
return $request->process();
}
}
/**
* 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.3.101
* @copyright Copyright (C) 2020 Mirasvit (https://mirasvit.com/)
*/
namespace Mirasvit\Report\Service;
use Magento\Backend\App\Area\FrontNameResolver;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\File\Csv;
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
use Mirasvit\Report\Api\Data\EmailInterface;
use Mirasvit\Report\Api\Repository\Email\BlockRepositoryInterface;
use Mirasvit\Report\Api\Repository\EmailRepositoryInterface;
use Mirasvit\Report\Api\Repository\ReportRepositoryInterface;
use Mirasvit\Report\Api\Service\DateServiceInterface;
use Mirasvit\Report\Api\Service\EmailServiceInterface;
use Mirasvit\Report\Model\Mail\Template\TransportBuilder;
use Mirasvit\ReportApi\Api\Processor\ResponseItemInterface;
use Mirasvit\ReportApi\Api\RequestBuilderInterface;
class EmailService implements EmailServiceInterface
{
const TYPE_OCTETSTREAM = 'application/octet-stream';
const DISPOSITION_ATTACHMENT = 'attachment';
const ENCODING_BASE64 = 'base64';
/**
* @var Csv
*/
protected $csvProcessor;
/**
* @var ReportRepositoryInterface
*/
protected $reportRepository;
/**
* @var DateServiceInterface
*/
protected $dateService;
/**
* @var TransportBuilder
*/
private $transportBuilder;
/**
* @var EmailRepositoryInterface
*/
private $emailRepository;
/**
* @var ScopeConfigInterface
*/
private $scopeConfig;
/**
* @var TimezoneInterface
*/
private $timezone;
/**
* @var RequestBuilderInterface
*/
private $requestBuilder;
/**
* @var DirectoryList
*/
private $directoryList;
public function __construct(
TransportBuilder $transportBuilder,
EmailRepositoryInterface $emailRepository,
ScopeConfigInterface $scopeConfig,
TimezoneInterface $timezone,
Csv $csvProcessor,
DirectoryList $directoryList,
RequestBuilderInterface $requestBuilder,
ReportRepositoryInterface $reportRepository,
DateServiceInterface $dateService
) {
$this->transportBuilder = $transportBuilder;
$this->emailRepository = $emailRepository;
$this->scopeConfig = $scopeConfig;
$this->timezone = $timezone;
$this->csvProcessor = $csvProcessor;
$this->directoryList = $directoryList;
$this->requestBuilder = $requestBuilder;
$this->reportRepository = $reportRepository;
$this->dateService = $dateService;
}
/**
* {@inheritdoc}
*/
public function send(EmailInterface $email)
{
$vars = [
'subject' => $email->getSubject() . ' [' . $this->timezone->date()->format("M d, Y H:i") . ']',
'blocks' => "",
];
$definedReports = $this->emailRepository->getReports();
$blocks = $email->getBlocks();
if (null === $blocks) {
$blocks = [];
}
foreach ($blocks as $data) {
if (isset($data['identifier'])) {
$identifier = $data['identifier'];
foreach ($definedReports as $report) {
if ($report['value'] == $identifier) {
/** @var BlockRepositoryInterface $repo */
$repo = $report['repository'];
if (!isset($data['timeRange'])) {
$data['timeRange'] = 'today';
}
$content = $repo->getContent($identifier, $data);
if ($email->getIsAttachEnabled() && (strpos($content, 'table') !== false) && $this->reportRepository->get($identifier) !== null) {
$preparedReport = $this->prepareCsvReport($data);
$pathToCsvReports[] = $this->saveReportAsCsv($preparedReport, $identifier);
}
if ($content) {
$vars['blocks'] .= '<div class="block-wrapper">' . $content . '</div>';
}
}
}
}
}
$emails = explode(',', $email->getRecipient());
$i = 1;
foreach ($emails as $mail) {
if (!trim($mail)) {
continue;
}
$lastMailIdx = count($emails);
/** @var TransportBuilder $transport */
$transport = $this->transportBuilder
->setTemplateIdentifier('report_email')
->setTemplateOptions([
'area' => FrontNameResolver::AREA_CODE,
'store' => 0,
])
->setTemplateVars($vars)
->setFrom([
'name' => $this->scopeConfig->getValue('trans_email/ident_general/name'),
'email' => $this->scopeConfig->getValue('trans_email/ident_general/email'),
])
->addTo($mail);
if (!empty($pathToCsvReports)) {
foreach ($pathToCsvReports as $pathToCsvReport) {
$filename = explode('.', basename($pathToCsvReport));
$filename[0] .= '_' . $i;
$filename = implode('.', $filename);
$transport->addAttachment(
file_get_contents($pathToCsvReport),
$mimeType = self::TYPE_OCTETSTREAM,
$disposition = self::DISPOSITION_ATTACHMENT,
$encoding = self::ENCODING_BASE64,
$filename
);
}
}
$transport->getTransport()->sendMessage();
if ($i == $lastMailIdx) {
if (!empty($pathToCsvReports)) {
foreach ($pathToCsvReports as $pathToCsvReport) {
if (file_exists($pathToCsvReport)) {
unlink($pathToCsvReport);
}
}
}
}
$i++;
}
}
/**
* @param array $reportData
*
* @return array
*/
public function prepareCsvReport($reportData)
{
$response = $this->buildReportResponse($reportData);
$rows = [];
foreach ($response->getColumns() as $column) {
$rows['header'][] = $column->getLabel()->getText();
}
foreach ($response->getItems() as $item) {
$this->addRow($rows, $item, $response->getColumns());
}
return $rows;
}
/**
* @param array $rows
* @param ResponseItemInterface $item
* @param array $columns
*/
private function addRow(&$rows, ResponseItemInterface $item, array $columns)
{
$formattedData = $item->getFormattedData();
$data = [];
/** @var \Mirasvit\ReportApi\Api\Processor\ResponseColumnInterface $column */
foreach ($columns as $column) {
$name = $column->getName();
if (isset($formattedData[$name])) {
$data[] = $formattedData[$name];
} else {
$data[] = '';
}
}
$rows[] = $data;
foreach ($item->getItems() as $subItem) {
$this->addRow($rows, $subItem, $columns);
}
}
/**
* @param mixed $preparedReport
* @param string $identifier
*
* @return string
*/
public function saveReportAsCsv($preparedReport, $identifier)
{
$fileName = date('j_m_Y') . '_report_' . $identifier . '.csv';
$filePath = $this->directoryList->getPath(\Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR)
. "/" . $fileName;
$this->csvProcessor
->setDelimiter(',')
->setEnclosure('"')
->saveData($filePath, $preparedReport);
return $filePath;
}
/**
* @param array $reportData
*
* @return \Mirasvit\ReportApi\Api\ResponseInterface
*/
public function buildReportResponse($reportData)
{
$reportIdentifier = $reportData['identifier'];
$report = $this->reportRepository->get($reportIdentifier);
$tableName = $report->getTable() == 'sales_shipment' ? 'sales_shipment' : 'sales_order';
$interval = $this->dateService->getInterval($reportData['timeRange']);
$request = $this->requestBuilder->create()
->setTable($report->getTable())
->setDimensions($report->getDimensions())
->setPageSize((isset($reportData['limit']) && $reportData['limit']) ? $reportData['limit'] : 100000);
$hasDateDimension = false;
foreach ($report->getDimensions() as $column) {
$request->addColumn($column);
if (!$hasDateDimension && strpos($column, "_at") !== false) {
$hasDateDimension = true;
}
}
foreach ($report->getColumns() as $column) {
$request->addColumn($column);
}
foreach ($report->getInternalFilters() as $filter) {
if (strpos($filter['conditionType'], 'like') !== false) {
$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;
}
}
//report can return not all data if original report doesn't have date dimension
if ($hasDateDimension) {
$request->addFilter($tableName . '|created_at', $interval->getFrom()->toString('Y-MM-dd HH:mm:ss'), 'gteq', 'A')
->addFilter($tableName . '|created_at', $interval->getTo()->toString('Y-MM-dd HH:mm:ss'), 'lteq', 'A');
}
return $request->process();
}
}