Issues (3627)

app/bundles/ReportBundle/Entity/Report.php (3 issues)

1
<?php
2
3
/*
4
 * @copyright   2014 Mautic Contributors. All rights reserved
5
 * @author      Mautic
6
 *
7
 * @link        http://mautic.org
8
 *
9
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
10
 */
11
12
namespace Mautic\ReportBundle\Entity;
13
14
use Doctrine\DBAL\Types\Type;
15
use Doctrine\ORM\Mapping as ORM;
16
use Mautic\ApiBundle\Serializer\Driver\ApiMetadataDriver;
17
use Mautic\CoreBundle\Doctrine\Mapping\ClassMetadataBuilder;
18
use Mautic\CoreBundle\Entity\FormEntity;
19
use Mautic\EmailBundle\Validator as EmailAssert;
20
use Mautic\ReportBundle\Scheduler\Enum\SchedulerEnum;
21
use Mautic\ReportBundle\Scheduler\Exception\ScheduleNotValidException;
22
use Mautic\ReportBundle\Scheduler\SchedulerInterface;
23
use Mautic\ReportBundle\Scheduler\Validator as ReportAssert;
24
use Symfony\Component\Validator\Constraints\NotBlank;
25
use Symfony\Component\Validator\Mapping\ClassMetadata;
26
27
class Report extends FormEntity implements SchedulerInterface
28
{
29
    /**
30
     * @var int
31
     */
32
    private $id;
33
34
    /**
35
     * @var string
36
     */
37
    private $name;
38
39
    /**
40
     * @var string
41
     */
42
    private $description;
43
44
    /**
45
     * @var bool
46
     */
47
    private $system = false;
48
49
    /**
50
     * @var string
51
     */
52
    private $source;
53
54
    /**
55
     * @var array
56
     */
57
    private $columns = [];
58
59
    /**
60
     * @var array
61
     */
62
    private $filters = [];
63
64
    /**
65
     * @var array
66
     */
67
    private $tableOrder = [];
68
69
    /**
70
     * @var array
71
     */
72
    private $graphs = [];
73
74
    /**
75
     * @var array
76
     */
77
    private $groupBy = [];
78
79
    /**
80
     * @var array
81
     */
82
    private $aggregators = [];
83
84
    /**
85
     * @var array
86
     */
87
    private $settings = [];
88
89
    /**
90
     * @var bool
91
     */
92
    private $isScheduled = false;
93
94
    /**
95
     * @var string|null
96
     */
97
    private $toAddress;
98
99
    /**
100
     * @var string|null
101
     */
102
    private $scheduleUnit;
103
104
    /**
105
     * @var string|null
106
     */
107
    private $scheduleDay;
108
109
    /**
110
     * @var string|null
111
     */
112
    private $scheduleMonthFrequency;
113
114
    public function __clone()
115
    {
116
        $this->id = null;
117
118
        parent::__clone();
119
    }
120
121
    public static function loadMetadata(ORM\ClassMetadata $metadata)
122
    {
123
        $builder = new ClassMetadataBuilder($metadata);
124
125
        $builder->setTable('reports')
126
            ->setCustomRepositoryClass(ReportRepository::class);
127
128
        $builder->addIdColumns();
129
130
        $builder->addField('system', Type::BOOLEAN, ['columnName'=>'`system`']);
131
132
        $builder->addField('source', Type::STRING);
133
134
        $builder->createField('columns', Type::TARRAY)
135
            ->nullable()
136
            ->build();
137
138
        $builder->createField('filters', Type::TARRAY)
139
            ->nullable()
140
            ->build();
141
142
        $builder->createField('tableOrder', Type::TARRAY)
143
            ->columnName('table_order')
144
            ->nullable()
145
            ->build();
146
147
        $builder->createField('graphs', Type::TARRAY)
148
            ->nullable()
149
            ->build();
150
151
        $builder->createField('groupBy', Type::TARRAY)
152
            ->columnName('group_by')
153
            ->nullable()
154
            ->build();
155
156
        $builder->createField('aggregators', Type::TARRAY)
157
            ->columnName('aggregators')
158
            ->nullable()
159
            ->build();
160
161
        $builder->createField('settings', Type::JSON_ARRAY)
162
            ->columnName('settings')
163
            ->nullable()
164
            ->build();
165
166
        $builder->createField('isScheduled', Type::BOOLEAN)
167
            ->columnName('is_scheduled')
168
            ->build();
169
170
        $builder->addNullableField('scheduleUnit', Type::STRING, 'schedule_unit');
171
        $builder->addNullableField('toAddress', Type::STRING, 'to_address');
172
        $builder->addNullableField('scheduleDay', Type::STRING, 'schedule_day');
173
        $builder->addNullableField('scheduleMonthFrequency', Type::STRING, 'schedule_month_frequency');
174
    }
175
176
    public static function loadValidatorMetadata(ClassMetadata $metadata)
177
    {
178
        $metadata->addPropertyConstraint('name', new NotBlank([
179
            'message' => 'mautic.core.name.required',
180
        ]));
181
182
        $metadata->addPropertyConstraint('toAddress', new EmailAssert\MultipleEmailsValid());
183
184
        $metadata->addConstraint(new ReportAssert\ScheduleIsValid());
185
    }
186
187
    /**
188
     * Prepares the metadata for API usage.
189
     *
190
     * @param $metadata
191
     */
192
    public static function loadApiMetadata(ApiMetadataDriver $metadata)
193
    {
194
        $metadata->setGroupPrefix('report')
195
            ->addListProperties(
196
                [
197
                    'id',
198
                    'name',
199
                    'description',
200
                    'system',
201
                    'isScheduled',
202
                ]
203
            )
204
            ->addProperties(
205
                [
206
                    'source',
207
                    'columns',
208
                    'filters',
209
                    'tableOrder',
210
                    'graphs',
211
                    'groupBy',
212
                    'settings',
213
                    'aggregators',
214
                    'scheduleUnit',
215
                    'toAddress',
216
                    'scheduleDay',
217
                    'scheduleMonthFrequency',
218
                ]
219
            )
220
            ->build();
221
    }
222
223
    /**
224
     * Get id.
225
     *
226
     * @return int
227
     */
228
    public function getId()
229
    {
230
        return $this->id;
231
    }
232
233
    public function setId(?int $id): void
234
    {
235
        $this->id = $id;
236
    }
237
238
    /**
239
     * Set name.
240
     *
241
     * @param string $name
242
     *
243
     * @return Report
244
     */
245
    public function setName($name)
246
    {
247
        $this->isChanged('name', $name);
248
        $this->name = $name;
249
250
        return $this;
251
    }
252
253
    /**
254
     * Get name.
255
     *
256
     * @return string
257
     */
258
    public function getName()
259
    {
260
        return $this->name;
261
    }
262
263
    /**
264
     * Set system.
265
     *
266
     * @param string $system
267
     *
268
     * @return Report
269
     */
270
    public function setSystem($system)
271
    {
272
        $this->isChanged('system', $system);
273
        $this->system = $system;
0 ignored issues
show
Documentation Bug introduced by
The property $system was declared of type boolean, but $system is of type string. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
274
275
        return $this;
276
    }
277
278
    /**
279
     * Get system.
280
     *
281
     * @return int
282
     */
283
    public function getSystem()
284
    {
285
        return $this->system;
286
    }
287
288
    /**
289
     * Set source.
290
     *
291
     * @param string $source
292
     *
293
     * @return Report
294
     */
295
    public function setSource($source)
296
    {
297
        $this->isChanged('source', $source);
298
        $this->source = $source;
299
300
        return $this;
301
    }
302
303
    /**
304
     * Get source.
305
     *
306
     * @return string
307
     */
308
    public function getSource()
309
    {
310
        return $this->source;
311
    }
312
313
    /**
314
     * Set columns.
315
     *
316
     * @param string $columns
317
     *
318
     * @return Report
319
     */
320
    public function setColumns($columns)
321
    {
322
        $this->isChanged('columns', $columns);
323
        $this->columns = $columns;
0 ignored issues
show
Documentation Bug introduced by
It seems like $columns of type string is incompatible with the declared type array of property $columns.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
324
325
        return $this;
326
    }
327
328
    /**
329
     * Get columns.
330
     *
331
     * @return array
332
     */
333
    public function getColumns()
334
    {
335
        return $this->columns;
336
    }
337
338
    /**
339
     * Set filters.
340
     *
341
     * @param string $filters
342
     *
343
     * @return Report
344
     */
345
    public function setFilters($filters)
346
    {
347
        $this->isChanged('filters', $filters);
348
        $this->filters = $filters;
0 ignored issues
show
Documentation Bug introduced by
It seems like $filters of type string is incompatible with the declared type array of property $filters.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
349
350
        return $this;
351
    }
352
353
    /**
354
     * Get filters.
355
     *
356
     * @return array
357
     */
358
    public function getFilters()
359
    {
360
        return $this->filters;
361
    }
362
363
    /**
364
     * Get filter value from a specific filter.
365
     *
366
     * @param string $column
367
     *
368
     * @return mixed
369
     *
370
     * @throws \UnexpectedValueException
371
     */
372
    public function getFilterValue($column)
373
    {
374
        foreach ($this->getFilters() as $field) {
375
            if ($column === $field['column']) {
376
                return $field['value'];
377
            }
378
        }
379
380
        throw new \UnexpectedValueException("Column {$column} doesn't have any filter.");
381
    }
382
383
    /**
384
     * Get filter values from a specific filter.
385
     *
386
     * @param string $column
387
     *
388
     * @return array
389
     *
390
     * @throws \UnexpectedValueException
391
     */
392
    public function getFilterValues($column)
393
    {
394
        $values = [];
395
        foreach ($this->getFilters() as $field) {
396
            if ($column === $field['column']) {
397
                $values[] = $field['value'];
398
            }
399
        }
400
401
        if (empty($values)) {
402
            throw new \UnexpectedValueException("Column {$column} doesn't have any filter.");
403
        }
404
405
        return $values;
406
    }
407
408
    /**
409
     * @return mixed
410
     */
411
    public function getDescription()
412
    {
413
        return $this->description;
414
    }
415
416
    /**
417
     * @param mixed $description
418
     */
419
    public function setDescription($description)
420
    {
421
        $this->description = $description;
422
    }
423
424
    /**
425
     * @return mixed
426
     */
427
    public function getTableOrder()
428
    {
429
        return $this->tableOrder;
430
    }
431
432
    public function setTableOrder(array $tableOrder)
433
    {
434
        $this->isChanged('tableOrder', $tableOrder);
435
436
        $this->tableOrder = $tableOrder;
437
    }
438
439
    /**
440
     * @return mixed
441
     */
442
    public function getGraphs()
443
    {
444
        return $this->graphs;
445
    }
446
447
    public function setGraphs(array $graphs)
448
    {
449
        $this->isChanged('graphs', $graphs);
450
451
        $this->graphs = $graphs;
452
    }
453
454
    /**
455
     * @return mixed
456
     */
457
    public function getGroupBy()
458
    {
459
        return $this->groupBy;
460
    }
461
462
    public function setGroupBy(array $groupBy)
463
    {
464
        $this->isChanged('groupBy', $groupBy);
465
466
        $this->groupBy = $groupBy;
467
    }
468
469
    /**
470
     * @return mixed
471
     */
472
    public function getAggregators()
473
    {
474
        return $this->aggregators;
475
    }
476
477
    /**
478
     * @return array
479
     */
480
    public function getAggregatorColumns()
481
    {
482
        return array_map(function ($aggregator) {
483
            return $aggregator['column'];
484
        }, $this->getAggregators());
485
    }
486
487
    /**
488
     * @return array
489
     */
490
    public function getOrderColumns()
491
    {
492
        return array_map(function ($order) {
493
            return $order['column'];
494
        }, $this->getTableOrder());
495
    }
496
497
    /**
498
     * @return array
499
     */
500
    public function getSelectAndAggregatorAndOrderAndGroupByColumns()
501
    {
502
        return array_merge($this->getSelectAndAggregatorColumns(), $this->getOrderColumns(), $this->getGroupBy());
503
    }
504
505
    /**
506
     * @return array
507
     */
508
    public function getSelectAndAggregatorColumns()
509
    {
510
        return array_merge($this->getColumns(), $this->getAggregatorColumns());
511
    }
512
513
    public function setAggregators(array $aggregators)
514
    {
515
        $this->isChanged('aggregators', $aggregators);
516
517
        $this->aggregators = $aggregators;
518
    }
519
520
    public function setSettings(array $settings)
521
    {
522
        $this->isChanged('settings', $settings);
523
524
        $this->settings = $settings;
525
    }
526
527
    /**
528
     * @return array
529
     */
530
    public function getSettings()
531
    {
532
        return $this->settings;
533
    }
534
535
    /**
536
     * @return bool
537
     */
538
    public function isScheduled()
539
    {
540
        return $this->isScheduled;
541
    }
542
543
    /**
544
     * @param bool $isScheduled
545
     */
546
    public function setIsScheduled($isScheduled)
547
    {
548
        $this->isChanged('isScheduled', $isScheduled);
549
550
        $this->isScheduled = $isScheduled;
551
    }
552
553
    /**
554
     * @return string|null
555
     */
556
    public function getToAddress()
557
    {
558
        return $this->toAddress;
559
    }
560
561
    /**
562
     * @param string|null $toAddress
563
     */
564
    public function setToAddress($toAddress)
565
    {
566
        $this->isChanged('toAddress', $toAddress);
567
568
        $this->toAddress = $toAddress;
569
    }
570
571
    /**
572
     * @return string|null
573
     */
574
    public function getScheduleUnit()
575
    {
576
        return $this->scheduleUnit;
577
    }
578
579
    /**
580
     * @param string|null $scheduleUnit
581
     */
582
    public function setScheduleUnit($scheduleUnit)
583
    {
584
        $this->isChanged('scheduleUnit', $scheduleUnit);
585
586
        $this->scheduleUnit = $scheduleUnit;
587
    }
588
589
    /**
590
     * @return string|null
591
     */
592
    public function getScheduleDay()
593
    {
594
        return $this->scheduleDay;
595
    }
596
597
    /**
598
     * @param string|null $scheduleDay
599
     */
600
    public function setScheduleDay($scheduleDay)
601
    {
602
        $this->isChanged('scheduleDay', $scheduleDay);
603
604
        $this->scheduleDay = $scheduleDay;
605
    }
606
607
    /**
608
     * @return string|null
609
     */
610
    public function getScheduleMonthFrequency()
611
    {
612
        return $this->scheduleMonthFrequency;
613
    }
614
615
    /**
616
     * @param string|null $scheduleMonthFrequency
617
     */
618
    public function setScheduleMonthFrequency($scheduleMonthFrequency)
619
    {
620
        $this->scheduleMonthFrequency = $scheduleMonthFrequency;
621
    }
622
623
    public function setAsNotScheduled()
624
    {
625
        $this->setIsScheduled(false);
626
        $this->setToAddress(null);
627
        $this->setScheduleUnit(null);
628
        $this->setScheduleDay(null);
629
        $this->setScheduleMonthFrequency(null);
630
    }
631
632
    public function setAsScheduledNow(string $email): void
633
    {
634
        $this->setIsScheduled(true);
635
        $this->setToAddress($email);
636
        $this->setScheduleUnit(SchedulerEnum::UNIT_NOW);
637
    }
638
639
    public function ensureIsDailyScheduled()
640
    {
641
        $this->setIsScheduled(true);
642
        $this->setScheduleUnit(SchedulerEnum::UNIT_DAILY);
643
        $this->setScheduleDay(null);
644
        $this->setScheduleMonthFrequency(null);
645
    }
646
647
    /**
648
     * @throws ScheduleNotValidException
649
     */
650
    public function ensureIsMonthlyScheduled()
651
    {
652
        if (
653
            !in_array($this->getScheduleMonthFrequency(), SchedulerEnum::getMonthFrequencyForSelect()) ||
654
            !in_array($this->getScheduleDay(), SchedulerEnum::getDayEnumForSelect())
655
        ) {
656
            throw new ScheduleNotValidException();
657
        }
658
        $this->setIsScheduled(true);
659
        $this->setScheduleUnit(SchedulerEnum::UNIT_MONTHLY);
660
    }
661
662
    /**
663
     * @throws ScheduleNotValidException
664
     */
665
    public function ensureIsWeeklyScheduled()
666
    {
667
        if (!in_array($this->getScheduleDay(), SchedulerEnum::getDayEnumForSelect())) {
668
            throw new ScheduleNotValidException();
669
        }
670
        $this->setIsScheduled(true);
671
        $this->setScheduleUnit(SchedulerEnum::UNIT_WEEKLY);
672
        $this->setScheduleMonthFrequency(null);
673
    }
674
675
    public function isScheduledNow(): bool
676
    {
677
        return SchedulerEnum::UNIT_NOW === $this->getScheduleUnit();
678
    }
679
680
    /**
681
     * @return bool
682
     */
683
    public function isScheduledDaily()
684
    {
685
        return SchedulerEnum::UNIT_DAILY === $this->getScheduleUnit();
686
    }
687
688
    /**
689
     * @return bool
690
     */
691
    public function isScheduledWeekly()
692
    {
693
        return SchedulerEnum::UNIT_WEEKLY === $this->getScheduleUnit();
694
    }
695
696
    /**
697
     * @return bool
698
     */
699
    public function isScheduledMonthly()
700
    {
701
        return SchedulerEnum::UNIT_MONTHLY === $this->getScheduleUnit();
702
    }
703
704
    /**
705
     * @return bool
706
     */
707
    public function isScheduledWeekDays()
708
    {
709
        return SchedulerEnum::DAY_WEEK_DAYS === $this->getScheduleDay();
710
    }
711
}
712