. */ declare(strict_types=1); namespace FireflyIII\Generator\Report; use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; /** * Class ReportGeneratorFactory. * * @codeCoverageIgnore */ class ReportGeneratorFactory { /** * Static report generator class. * * @param string $type * @param Carbon $start * @param Carbon $end * * @throws FireflyException * @return ReportGeneratorInterface * */ public static function reportGenerator(string $type, Carbon $start, Carbon $end): ReportGeneratorInterface { $period = 'Month'; // more than two months date difference means year report. if ($start->diffInMonths($end) > 1) { $period = 'Year'; } // more than one year date difference means multi year report. if ($start->diffInMonths($end) > 12) { $period = 'MultiYear'; } $class = sprintf('FireflyIII\Generator\Report\%s\%sReportGenerator', $type, $period); if (class_exists($class)) { /** @var ReportGeneratorInterface $obj */ $obj = app($class); $obj->setStartDate($start); $obj->setEndDate($end); return $obj; } throw new FireflyException(sprintf('Cannot generate report. There is no "%s"-report for period "%s".', $type, $period)); } }