Spaces:
No application file
No application file
namespace Mautic\ReportBundle\Entity; | |
use Doctrine\DBAL\Types\Types; | |
use Doctrine\ORM\Mapping as ORM; | |
use Mautic\ApiBundle\Serializer\Driver\ApiMetadataDriver; | |
use Mautic\CoreBundle\Doctrine\Mapping\ClassMetadataBuilder; | |
use Mautic\CoreBundle\Entity\FormEntity; | |
use Mautic\EmailBundle\Validator as EmailAssert; | |
use Mautic\ReportBundle\Scheduler\Enum\SchedulerEnum; | |
use Mautic\ReportBundle\Scheduler\Exception\ScheduleNotValidException; | |
use Mautic\ReportBundle\Scheduler\SchedulerInterface; | |
use Mautic\ReportBundle\Scheduler\Validator as ReportAssert; | |
use Symfony\Component\Validator\Constraints\NotBlank; | |
use Symfony\Component\Validator\Mapping\ClassMetadata; | |
class Report extends FormEntity implements SchedulerInterface | |
{ | |
/** | |
* @var int | |
*/ | |
private $id; | |
/** | |
* @var string | |
*/ | |
private $name; | |
/** | |
* @var string|null | |
*/ | |
private $description; | |
/** | |
* @var bool | |
*/ | |
private $system = false; | |
/** | |
* @var string | |
*/ | |
private $source; | |
/** | |
* @var array | |
*/ | |
private $columns = []; | |
/** | |
* @var array | |
*/ | |
private $filters = []; | |
/** | |
* @var array | |
*/ | |
private $tableOrder = []; | |
/** | |
* @var array | |
*/ | |
private $graphs = []; | |
/** | |
* @var array | |
*/ | |
private $groupBy = []; | |
/** | |
* @var array | |
*/ | |
private $aggregators = []; | |
/** | |
* @var array|null | |
*/ | |
private $settings = []; | |
/** | |
* @var bool | |
*/ | |
private $isScheduled = false; | |
/** | |
* @var string|null | |
*/ | |
private $toAddress; | |
/** | |
* @var string|null | |
*/ | |
private $scheduleUnit; | |
/** | |
* @var string|null | |
*/ | |
private $scheduleDay; | |
/** | |
* @var string|null | |
*/ | |
private $scheduleMonthFrequency; | |
private bool $hasScheduleChanged = false; | |
public function __clone() | |
{ | |
$this->id = null; | |
parent::__clone(); | |
} | |
public static function loadMetadata(ORM\ClassMetadata $metadata): void | |
{ | |
$builder = new ClassMetadataBuilder($metadata); | |
$builder->setTable('reports') | |
->setCustomRepositoryClass(ReportRepository::class); | |
$builder->addIdColumns(); | |
$builder->addField('system', Types::BOOLEAN, ['columnName'=>'`system`']); | |
$builder->addField('source', Types::STRING); | |
$builder->createField('columns', Types::ARRAY) | |
->nullable() | |
->build(); | |
$builder->createField('filters', Types::ARRAY) | |
->nullable() | |
->build(); | |
$builder->createField('tableOrder', Types::ARRAY) | |
->columnName('table_order') | |
->nullable() | |
->build(); | |
$builder->createField('graphs', Types::ARRAY) | |
->nullable() | |
->build(); | |
$builder->createField('groupBy', Types::ARRAY) | |
->columnName('group_by') | |
->nullable() | |
->build(); | |
$builder->createField('aggregators', Types::ARRAY) | |
->columnName('aggregators') | |
->nullable() | |
->build(); | |
$builder->createField('settings', Types::JSON) | |
->columnName('settings') | |
->nullable() | |
->build(); | |
$builder->createField('isScheduled', Types::BOOLEAN) | |
->columnName('is_scheduled') | |
->build(); | |
$builder->addNullableField('scheduleUnit', Types::STRING, 'schedule_unit'); | |
$builder->addNullableField('toAddress', Types::STRING, 'to_address'); | |
$builder->addNullableField('scheduleDay', Types::STRING, 'schedule_day'); | |
$builder->addNullableField('scheduleMonthFrequency', Types::STRING, 'schedule_month_frequency'); | |
} | |
public static function loadValidatorMetadata(ClassMetadata $metadata): void | |
{ | |
$metadata->addPropertyConstraint('name', new NotBlank([ | |
'message' => 'mautic.core.name.required', | |
])); | |
$metadata->addPropertyConstraint('toAddress', new EmailAssert\MultipleEmailsValid()); | |
$metadata->addConstraint(new ReportAssert\ScheduleIsValid()); | |
} | |
/** | |
* Prepares the metadata for API usage. | |
*/ | |
public static function loadApiMetadata(ApiMetadataDriver $metadata): void | |
{ | |
$metadata->setGroupPrefix('report') | |
->addListProperties( | |
[ | |
'id', | |
'name', | |
'description', | |
'system', | |
'isScheduled', | |
] | |
) | |
->addProperties( | |
[ | |
'source', | |
'columns', | |
'filters', | |
'tableOrder', | |
'graphs', | |
'groupBy', | |
'settings', | |
'aggregators', | |
'scheduleUnit', | |
'toAddress', | |
'scheduleDay', | |
'scheduleMonthFrequency', | |
] | |
) | |
->build(); | |
} | |
/** | |
* @return int | |
*/ | |
public function getId() | |
{ | |
return $this->id; | |
} | |
public function setId(?int $id): void | |
{ | |
$this->id = $id; | |
} | |
/** | |
* @param string $name | |
* | |
* @return Report | |
*/ | |
public function setName($name) | |
{ | |
$this->isChanged('name', $name); | |
$this->name = $name; | |
return $this; | |
} | |
/** | |
* Get name. | |
* | |
* @return string | |
*/ | |
public function getName() | |
{ | |
return $this->name; | |
} | |
/** | |
* @param string $system | |
* | |
* @return Report | |
*/ | |
public function setSystem($system) | |
{ | |
$this->isChanged('system', $system); | |
$this->system = $system; | |
return $this; | |
} | |
/** | |
* @return int | |
*/ | |
public function getSystem() | |
{ | |
return $this->system; | |
} | |
/** | |
* Set source. | |
* | |
* @param string $source | |
* | |
* @return Report | |
*/ | |
public function setSource($source) | |
{ | |
$this->isChanged('source', $source); | |
$this->source = $source; | |
return $this; | |
} | |
/** | |
* @return string | |
*/ | |
public function getSource() | |
{ | |
return $this->source; | |
} | |
/** | |
* @param mixed[] $columns | |
* | |
* @return Report | |
*/ | |
public function setColumns($columns) | |
{ | |
$this->isChanged('columns', $columns); | |
$this->columns = $columns; | |
return $this; | |
} | |
/** | |
* @return array | |
*/ | |
public function getColumns() | |
{ | |
return $this->columns; | |
} | |
/** | |
* @param mixed[] $filters | |
* | |
* @return Report | |
*/ | |
public function setFilters($filters) | |
{ | |
$this->isChanged('filters', $filters); | |
$this->filters = $filters; | |
return $this; | |
} | |
/** | |
* @return array | |
*/ | |
public function getFilters() | |
{ | |
return $this->filters; | |
} | |
/** | |
* Get filter value from a specific filter. | |
* | |
* @param string $column | |
* | |
* @return mixed | |
* | |
* @throws \UnexpectedValueException | |
*/ | |
public function getFilterValue($column) | |
{ | |
foreach ($this->getFilters() as $field) { | |
if ($column === $field['column']) { | |
return $field['value']; | |
} | |
} | |
throw new \UnexpectedValueException("Column {$column} doesn't have any filter."); | |
} | |
/** | |
* Get filter values from a specific filter. | |
* | |
* @param string $column | |
* | |
* @throws \UnexpectedValueException | |
*/ | |
public function getFilterValues($column): array | |
{ | |
$values = []; | |
foreach ($this->getFilters() as $field) { | |
if ($column === $field['column']) { | |
$values[] = $field['value']; | |
} | |
} | |
if (empty($values)) { | |
throw new \UnexpectedValueException("Column {$column} doesn't have any filter."); | |
} | |
return $values; | |
} | |
/** | |
* @return mixed | |
*/ | |
public function getDescription() | |
{ | |
return $this->description; | |
} | |
/** | |
* @param mixed $description | |
*/ | |
public function setDescription($description): void | |
{ | |
$this->description = $description; | |
} | |
/** | |
* @return mixed | |
*/ | |
public function getTableOrder() | |
{ | |
return $this->tableOrder; | |
} | |
public function setTableOrder(array $tableOrder): void | |
{ | |
$this->isChanged('tableOrder', $tableOrder); | |
$this->tableOrder = $tableOrder; | |
} | |
/** | |
* @return mixed | |
*/ | |
public function getGraphs() | |
{ | |
return $this->graphs; | |
} | |
public function setGraphs(array $graphs): void | |
{ | |
$this->isChanged('graphs', $graphs); | |
$this->graphs = $graphs; | |
} | |
/** | |
* @return mixed | |
*/ | |
public function getGroupBy() | |
{ | |
return $this->groupBy; | |
} | |
public function setGroupBy(array $groupBy): void | |
{ | |
$this->isChanged('groupBy', $groupBy); | |
$this->groupBy = $groupBy; | |
} | |
/** | |
* @return mixed | |
*/ | |
public function getAggregators() | |
{ | |
return $this->aggregators; | |
} | |
public function getAggregatorColumns(): array | |
{ | |
return array_map(fn ($aggregator) => $aggregator['column'], $this->getAggregators()); | |
} | |
public function getOrderColumns(): array | |
{ | |
return array_map(fn ($order) => $order['column'], $this->getTableOrder()); | |
} | |
public function getSelectAndAggregatorAndOrderAndGroupByColumns(): array | |
{ | |
return array_merge($this->getSelectAndAggregatorColumns(), $this->getOrderColumns(), $this->getGroupBy()); | |
} | |
public function getSelectAndAggregatorColumns(): array | |
{ | |
return array_merge($this->getColumns(), $this->getAggregatorColumns()); | |
} | |
public function setAggregators(array $aggregators): void | |
{ | |
$this->isChanged('aggregators', $aggregators); | |
$this->aggregators = $aggregators; | |
} | |
public function setSettings(array $settings): void | |
{ | |
$this->isChanged('settings', $settings); | |
$this->settings = $settings; | |
} | |
/** | |
* @return array | |
*/ | |
public function getSettings() | |
{ | |
return $this->settings; | |
} | |
/** | |
* @return bool | |
*/ | |
public function isScheduled() | |
{ | |
return $this->isScheduled; | |
} | |
/** | |
* @param bool $isScheduled | |
*/ | |
public function setIsScheduled($isScheduled): void | |
{ | |
$this->isChanged('isScheduled', $isScheduled); | |
$this->isScheduled = $isScheduled; | |
} | |
/** | |
* @return string|null | |
*/ | |
public function getToAddress() | |
{ | |
return $this->toAddress; | |
} | |
/** | |
* @param string|null $toAddress | |
*/ | |
public function setToAddress($toAddress): void | |
{ | |
$this->isChanged('toAddress', $toAddress); | |
$this->toAddress = $toAddress; | |
} | |
/** | |
* @return string|null | |
*/ | |
public function getScheduleUnit() | |
{ | |
return $this->scheduleUnit; | |
} | |
/** | |
* @param string|null $scheduleUnit | |
*/ | |
public function setScheduleUnit($scheduleUnit): void | |
{ | |
$this->isChanged('scheduleUnit', $scheduleUnit); | |
$this->scheduleUnit = $scheduleUnit; | |
} | |
/** | |
* @return string|null | |
*/ | |
public function getScheduleDay() | |
{ | |
return $this->scheduleDay; | |
} | |
/** | |
* @param string|null $scheduleDay | |
*/ | |
public function setScheduleDay($scheduleDay): void | |
{ | |
$this->isChanged('scheduleDay', $scheduleDay); | |
$this->scheduleDay = $scheduleDay; | |
} | |
/** | |
* @return string|null | |
*/ | |
public function getScheduleMonthFrequency() | |
{ | |
return $this->scheduleMonthFrequency; | |
} | |
/** | |
* @param string|null $scheduleMonthFrequency | |
*/ | |
public function setScheduleMonthFrequency($scheduleMonthFrequency): void | |
{ | |
$this->scheduleMonthFrequency = $scheduleMonthFrequency; | |
} | |
public function setAsNotScheduled(): void | |
{ | |
$this->setIsScheduled(false); | |
$this->setToAddress(null); | |
$this->setScheduleUnit(null); | |
$this->setScheduleDay(null); | |
$this->setScheduleMonthFrequency(null); | |
} | |
public function setAsScheduledNow(string $email): void | |
{ | |
$this->setIsScheduled(true); | |
$this->setToAddress($email); | |
$this->setScheduleUnit(SchedulerEnum::UNIT_NOW); | |
} | |
public function ensureIsDailyScheduled(): void | |
{ | |
$this->setIsScheduled(true); | |
$this->setScheduleUnit(SchedulerEnum::UNIT_DAILY); | |
$this->setScheduleDay(null); | |
$this->setScheduleMonthFrequency(null); | |
} | |
/** | |
* @throws ScheduleNotValidException | |
*/ | |
public function ensureIsMonthlyScheduled(): void | |
{ | |
if ( | |
!in_array($this->getScheduleMonthFrequency(), SchedulerEnum::getMonthFrequencyForSelect()) | |
|| !in_array($this->getScheduleDay(), SchedulerEnum::getDayEnumForSelect()) | |
) { | |
throw new ScheduleNotValidException(); | |
} | |
$this->setIsScheduled(true); | |
$this->setScheduleUnit(SchedulerEnum::UNIT_MONTHLY); | |
} | |
/** | |
* @throws ScheduleNotValidException | |
*/ | |
public function ensureIsWeeklyScheduled(): void | |
{ | |
if (!in_array($this->getScheduleDay(), SchedulerEnum::getDayEnumForSelect())) { | |
throw new ScheduleNotValidException(); | |
} | |
$this->setIsScheduled(true); | |
$this->setScheduleUnit(SchedulerEnum::UNIT_WEEKLY); | |
$this->setScheduleMonthFrequency(null); | |
} | |
public function isScheduledNow(): bool | |
{ | |
return SchedulerEnum::UNIT_NOW === $this->getScheduleUnit(); | |
} | |
public function isScheduledDaily(): bool | |
{ | |
return SchedulerEnum::UNIT_DAILY === $this->getScheduleUnit(); | |
} | |
public function isScheduledWeekly(): bool | |
{ | |
return SchedulerEnum::UNIT_WEEKLY === $this->getScheduleUnit(); | |
} | |
public function isScheduledMonthly(): bool | |
{ | |
return SchedulerEnum::UNIT_MONTHLY === $this->getScheduleUnit(); | |
} | |
public function isScheduledWeekDays(): bool | |
{ | |
return SchedulerEnum::DAY_WEEK_DAYS === $this->getScheduleDay(); | |
} | |
public function getHasScheduleChanged(): bool | |
{ | |
return $this->hasScheduleChanged; | |
} | |
public function setHasScheduleChanged(bool $hasScheduleChanged): void | |
{ | |
$this->hasScheduleChanged = $hasScheduleChanged; | |
} | |
/** | |
* @return array<string> | |
*/ | |
public function getSchedule(): array | |
{ | |
$schedule = []; | |
$schedule['schedule_unit'] = $this->getScheduleUnit(); | |
$schedule['schedule_day'] = $this->getScheduleDay(); | |
$schedule['schedule_month_frequency'] = $this->getScheduleMonthFrequency(); | |
return $schedule; | |
} | |
} | |