Passed
Push — 1.0 ( 748b47...49e249 )
by Morven
08:23
created

ContactLocation::getAddressArray()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 20
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 10
c 1
b 0
f 0
dl 0
loc 20
rs 9.9332
cc 3
nc 4
nop 0
1
<?php
2
3
namespace SilverCommerce\ContactAdmin\Model;
4
5
use SilverStripe\ORM\DataObject;
6
use SilverStripe\Security\Member;
7
use SilverStripe\Security\Permission;
8
use SilverStripe\Versioned\Versioned;
9
use SilverStripe\Forms\RequiredFields;
10
use SilverStripe\Security\PermissionProvider;
11
use SilverCommerce\VersionHistoryField\Forms\VersionHistoryField;
12
use SilverStripe\Security\Security;
13
14
/**
15
 * Details on a particular contact
16
 *
17
 * @property string Title
18
 * @property string Address
19
 * @property string Address1
20
 * @property string Address2
21
 * @property string City
22
 * @property string Country
23
 * @property string County
24
 * @property string PostCode
25
 * @property bool   Default
26
 *
27
 * @method Contact Contact
28
 * 
29
 * @author  ilateral
30
 * @package Contacts
31
 */
32
class ContactLocation extends DataObject
33
{
34
    private static $table_name = 'ContactLocation';
0 ignored issues
show
introduced by
The private property $table_name is not used, and could be removed.
Loading history...
35
36
    private static $db = [
0 ignored issues
show
introduced by
The private property $db is not used, and could be removed.
Loading history...
37
        "Address1" => "Varchar(255)",
38
        "Address2" => "Varchar(255)",
39
        "City" => "Varchar(255)",
40
        "Country" => "Varchar(255)",
41
        "County" => "Varchar(255)",
42
        "PostCode" => "Varchar(10)",
43
        "Default" => "Boolean"
44
    ];
45
    
46
    private static $has_one = [
0 ignored issues
show
introduced by
The private property $has_one is not used, and could be removed.
Loading history...
47
        "Contact" => Contact::class
48
    ];
49
    
50
    private static $casting = [
0 ignored issues
show
introduced by
The private property $casting is not used, and could be removed.
Loading history...
51
        "Title" => "Varchar",
52
        "Address" => "Text"
53
    ];
54
55
    private static $frontend_fields = [
0 ignored issues
show
introduced by
The private property $frontend_fields is not used, and could be removed.
Loading history...
56
        "Address1",
57
        "Address2",
58
        "City",
59
        "Country",
60
        "County",
61
        "PostCode",
62
        "Default"
63
    ];
64
65
    private static $summary_fields = [
0 ignored issues
show
introduced by
The private property $summary_fields is not used, and could be removed.
Loading history...
66
        "Address1",
67
        "Address2",
68
        "City",
69
        "County",
70
        "Country",
71
        "PostCode",
72
        "Default"
73
    ];
74
75
    private static $export_fields = [
0 ignored issues
show
introduced by
The private property $export_fields is not used, and could be removed.
Loading history...
76
        "Address1",
77
        "Address2",
78
        "City",
79
        "County",
80
        "Country",
81
        "PostCode",
82
        "Default"
83
    ];
84
85
    /**
86
     * Add extension classes
87
     *
88
     * @var    array
89
     * @config
90
     */
91
    private static $extensions = [
0 ignored issues
show
introduced by
The private property $extensions is not used, and could be removed.
Loading history...
92
        Versioned::class . '.versioned',
93
    ];
94
95
    /**
96
     * Declare version history
97
     *
98
     * @var    array
99
     * @config
100
     */
101
    private static $versioning = [
0 ignored issues
show
introduced by
The private property $versioning is not used, and could be removed.
Loading history...
102
        "History"
103
    ];
104
105
    /**
106
     * Generate a title for this location
107
     *
108
     * @return string
109
     */
110
    public function getTitle()
111
    {
112
        $title = $this->Address1 . " (" . $this->PostCode . ")";
113
114
        $this->extend("updateTitle", $title);
115
116
        return $title;
117
    }
118
119
    /**
120
     * Get a list of address fields as an array
121
     *
122
     * @return array
123
     */
124
    protected function getAddressArray()
125
    {
126
        $array = [$this->Address1];
127
        
128
        if (!empty($this->Address2)) {
129
            $array[] = $this->Address2;
130
        }
131
        
132
        $array[] = $this->City;
133
134
        if (!empty($this->County)) {
135
            $array[] = $this->County;
136
        }
137
138
        $array[] = $this->Country;
139
        $array[] = $this->PostCode;
140
141
        $this->extend("updateAddressArray", $array);
142
143
        return $array;
144
    }
145
146
    /**
147
     * Get the address from this location as a string
148
     *
149
     * @return string
150
     */
151
    public function getAddress()
152
    {
153
        $return = $this->getAddressArray();
154
155
        $this->extend("updateAddress", $return);
156
    
157
        return implode(",\n", $return);
158
    }
159
160
    public function getCMSFields()
161
    {
162
        $self = $this;
163
        $this->beforeUpdateCMSFields(
164
            function ($fields) use ($self) {
165
                if ($self->exists()) {
166
                    $fields->addFieldToTab(
167
                        "Root.History",
168
                        VersionHistoryField::create(
169
                            "History",
170
                            _t("SilverCommerce\VersionHistoryField.History", "History"),
171
                            $this
172
                        )->addExtraClass("stacked")
173
                    );
174
                }
175
            }
176
        );
177
178
        return parent::getCMSFields();
179
    }
180
181
    public function getCMSValidator()
182
    {
183
        $validator = new RequiredFields(
184
            [
185
            "Address1",
186
            "City",
187
            "Country",
188
            "PostCode"
189
            ]
190
        );
191
192
        $this->extend('updateCMSValidator', $validator);
193
194
        return $validator;
195
    }
196
197
    /**
198
     * Get the default export fields for this object
199
     *
200
     * @return array
201
     */
202
    public function getExportFields()
203
    {
204
        $raw_fields = $this->config()->get('export_fields');
205
206
        // Merge associative / numeric keys
207
        $fields = [];
208
        foreach ($raw_fields as $key => $value) {
209
            if (is_int($key)) {
210
                $key = $value;
211
            }
212
            $fields[$key] = $value;
213
        }
214
215
        $this->extend("updateExportFields", $fields);
216
217
        // Final fail-over, just list ID field
218
        if (!$fields) {
219
            $fields['ID'] = 'ID';
220
        }
221
222
        return $fields;
223
    }
224
225
    public function canView($member = null)
226
    {
227
        $extended = $this->extendedCan(__FUNCTION__, $member);
228
229
        if ($extended !== null) {
230
            return $extended;
231
        }
232
233
        return $this->Contact()->canView($member);
234
    }
235
236
    public function canCreate($member = null, $context = [])
237
    {
238
        $extended = $this->extendedCan(__FUNCTION__, $member, $context);
239
240
        if ($extended !== null) {
241
            return $extended;
242
        }
243
244
        if (!$member) {
245
            $member = Security::getCurrentUser();
246
        }
247
248
        if ($member && Permission::checkMember($member->ID, "CONTACTS_MANAGE")) {
249
            return true;
250
        }
251
252
        return false;
253
    }
254
255
    public function canEdit($member = null)
256
    {
257
        $extended = $this->extendedCan(__FUNCTION__, $member);
258
259
        if ($extended !== null) {
260
            return $extended;
261
        }
262
263
        return $this->Contact()->canEdit($member);
264
    }
265
266
    public function canDelete($member = null, $context = [])
0 ignored issues
show
Unused Code introduced by
The parameter $context is not used and could be removed. ( Ignorable by Annotation )

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

266
    public function canDelete($member = null, /** @scrutinizer ignore-unused */ $context = [])

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
267
    {
268
        $extended = $this->extendedCan(__FUNCTION__, $member);
269
270
        if ($extended !== null) {
271
            return $extended;
272
        }
273
274
        return $this->Contact()->canDelete($member);
275
    }
276
277
    /**
278
     * If we have assigned this as a default location, loop through
279
     * other locations and disable default.
280
     *
281
     * @return void
282
     */
283
    public function onAfterWrite()
284
    {
285
        parent::onAfterWrite();
286
287
        if ($this->Default) {
288
            foreach ($this->Contact()->Locations() as $location) {
289
                if ($location->ID != $this->ID && $location->Default) {
290
                    $location->Default = false;
291
                    $location->write();
292
                }
293
            }
294
        }
295
    }
296
}
297