Spaces:
No application file
No application file
namespace Mautic\ReportBundle\Model; | |
use Mautic\ReportBundle\Adapter\ReportDataAdapter; | |
use Mautic\ReportBundle\Entity\Scheduler; | |
use Mautic\ReportBundle\Event\ReportScheduleSendEvent; | |
use Mautic\ReportBundle\Exception\FileIOException; | |
use Mautic\ReportBundle\ReportEvents; | |
use Mautic\ReportBundle\Scheduler\Enum\SchedulerEnum; | |
use Mautic\ReportBundle\Scheduler\Option\ExportOption; | |
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
class ReportExporter | |
{ | |
public function __construct( | |
private ScheduleModel $schedulerModel, | |
private ReportDataAdapter $reportDataAdapter, | |
private ReportExportOptions $reportExportOptions, | |
private ReportFileWriter $reportFileWriter, | |
private EventDispatcherInterface $eventDispatcher | |
) { | |
} | |
/** | |
* @throws FileIOException | |
*/ | |
public function processExport(ExportOption $exportOption): void | |
{ | |
$schedulers = $this->schedulerModel->getScheduledReportsForExport($exportOption); | |
foreach ($schedulers as $scheduler) { | |
$this->processReport($scheduler); | |
} | |
} | |
/** | |
* @throws FileIOException | |
*/ | |
private function processReport(Scheduler $scheduler): void | |
{ | |
$report = $scheduler->getReport(); | |
$dateTo = clone $scheduler->getScheduleDate(); | |
$dateTo->setTime(0, 0, 0); | |
$dateFrom = clone $dateTo; | |
switch ($report->getScheduleUnit()) { | |
case SchedulerEnum::UNIT_NOW: | |
$dateFrom->sub(new \DateInterval('P10Y')); | |
$this->schedulerModel->turnOffScheduler($report); | |
break; | |
case SchedulerEnum::UNIT_DAILY: | |
$dateFrom->sub(new \DateInterval('P1D')); | |
break; | |
case SchedulerEnum::UNIT_WEEKLY: | |
$dateFrom->sub(new \DateInterval('P7D')); | |
break; | |
case SchedulerEnum::UNIT_MONTHLY: | |
$dateFrom->sub(new \DateInterval('P1M')); | |
break; | |
} | |
$this->reportExportOptions->setDateFrom($dateFrom); | |
$this->reportExportOptions->setDateTo($dateTo->sub(new \DateInterval('PT1S'))); | |
// just published reports, but schedule continue | |
if ($report->isPublished()) { | |
$this->reportExportOptions->beginExport(); | |
while (true) { | |
$data = $this->reportDataAdapter->getReportData($report, $this->reportExportOptions); | |
$this->reportFileWriter->writeReportData($scheduler, $data, $this->reportExportOptions); | |
$totalResults = $data->getTotalResults(); | |
unset($data); | |
if ($this->reportExportOptions->getNumberOfProcessedResults() >= $totalResults) { | |
break; | |
} | |
$this->reportExportOptions->nextBatch(); | |
} | |
$file = $this->reportFileWriter->getFilePath($scheduler); | |
$event = new ReportScheduleSendEvent($scheduler, $file); | |
$this->eventDispatcher->dispatch($event, ReportEvents::REPORT_SCHEDULE_SEND); | |
} | |
$this->schedulerModel->reportWasScheduled($report); | |
} | |
} | |