UserReport::sourceRecords()   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 18
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 3.0032

Importance

Changes 0
Metric Value
cc 3
eloc 13
nc 4
nop 1
dl 0
loc 18
ccs 13
cts 14
cp 0.9286
crap 3.0032
rs 9.8333
c 0
b 0
f 0
1
<?php
2
namespace UserManagement\Reports;
3
4
use SilverStripe\Forms\DateField;
5
use SilverStripe\Forms\FieldList;
6
use SilverStripe\Reports\Report;
7
use SilverStripe\Security\Member;
8
use SilverStripe\Security\Security;
9
use SilverStripe\Forms\TextField;
10
use SilverStripe\SiteConfig\SiteConfig;
11
12
/**
13
 *
14
 * Base class for creating reports that can be filtered to a specific range.
15
 * Record grouping is also supported.
16
 *
17
 * @package user-management
18
 *
19
 */
20
class UserReport extends Report
21
{
22
    protected $periodfield = '"Member"."Created"';
23
24
    /**
25
     * It returns Tile of the report
26
     * @return string
27
     */
28 1
    public function title()
29
    {
30 1
        return 'Customer List';
31
    }
32
33
    /**
34
     * @param array $params
35
     * @return \SilverStripe\ORM\DataList
36
     */
37 1
    public function sourceRecords($params)
38
    {
39
        
40 1
        $fields = $this->parameterFields();
41 1
        $fields->setValues($params);
42 1
        $start = $fields->fieldByName('StartPeriod')->dataValue();
43 1
        $end = $fields->fieldByName('EndPeriod')->dataValue();
44 1
        $firstName = $fields->fieldByName('FirstName')->dataValue();
45 1
        if ($end) {
46 1
            $end = date('Y-m-d', strtotime($end) + 86400);
47
        }
48 1
        $config = SiteConfig::current_site_config();
49 1
        $member = Member::get()->filter('Groups.Title', $config->CustomerGroup()->Title);
50 1
        $filter = $this->FilterByDate($start, $end);
51 1
        if ($this->FilterByName($filter, $firstName)) {
0 ignored issues
show
Bug introduced by
It seems like $filter can also be of type false; however, parameter $filter of UserManagement\Reports\UserReport::FilterByName() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

51
        if ($this->FilterByName(/** @scrutinizer ignore-type */ $filter, $firstName)) {
Loading history...
52 1
            return $member->where($filter);
0 ignored issues
show
Bug introduced by
It seems like $filter can also be of type false; however, parameter $filter of SilverStripe\ORM\DataList::where() does only seem to accept SilverStripe\ORM\Queries...itionGroup|array|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

52
            return $member->where(/** @scrutinizer ignore-type */ $filter);
Loading history...
53
        }
54
        return $member;
55
    }
56
57
    /**
58
     * Returns columns names of the reports
59
     * @return array
60
     */
61 1
    public function columns()
62
    {
63
        $fields = [
64 1
            'FirstName' => 'FirstName',
65
            'Surname' => 'Surname',
66
            'Email' => 'Email'
67
        ];
68 1
        $config = SiteConfig::current_site_config();
69 1
        if ($config->getField("ExportFields")) {
70
            $ExportFields = json_decode($config->getField("ExportFields"), true);
71
            $ExtraFields = array_combine($ExportFields, $ExportFields);
72
            $fields = array_merge($fields, $ExtraFields);
73
        }
74
75
76 1
        return $fields;
77
    }
78
    
79
    /**
80
     * Return a FieldList of the fields that can be used to filter
81
     * @return array
82
     */
83 2
    public function parameterFields()
84
    {
85 2
        $member = Security::getCurrentUser() ? Security::getCurrentUser() : Member::create();
86 2
        $dateformat = $member->getDateFormat();
0 ignored issues
show
Unused Code introduced by
The assignment to $dateformat is dead and can be removed.
Loading history...
87 2
        $fields = FieldList::create(
88 2
            $firstName = TextField::create('FirstName', 'FirstName'),
89 2
            $start = DateField::create('StartPeriod', 'Start Date'),
90 2
            $end = DateField::create('EndPeriod', 'End Date')
91
        );
92
        
93 2
        return $fields;
94
    }
95
    
96
    /**
97
     * @param string $start
98
     * @param string $end
99
     * @param string $firstName
100
     * @return string | false
101
     */
102 1
    public function FilterByDate($start, $end)
103
    {
104 1
        $filter = false;
105 1
        if ($start && $end) {
106 1
            $filter = "Member.Created BETWEEN '$start' AND '$end'";
107
        } elseif ($start) {
108
            $filter = "Member.Created > '$start'";
109
        } elseif ($end) {
110
            $filter = "Member.Created <= '$end'";
111
        }
112 1
        return $filter;
113
    }
114
115
    /**
116
     * @param string $firstName
117
     * @param string $filter
118
     * @return string | false
119
     */
120 1
    public function FilterByName($filter, $firstName)
121
    {
122 1
        if ($firstName) {
123 1
            $filter = ($filter) ? $filter . " AND FirstName Like '%$firstName%'" : "FirstName Like '%$firstName%'";
124
        }
125 1
        return $filter;
126
    }
127
}
128