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; | |
| } | |
| } | |