Passed
Pull Request — master (#309)
by Jason
13:47
created

OptionItem::canEdit()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 1
1
<?php
2
3
namespace Dynamic\FoxyStripe\Model;
4
5
use Dynamic\FoxyStripe\Page\ProductPage;
6
use SilverStripe\Control\Session;
7
use SilverStripe\Forms\CheckboxField;
8
use SilverStripe\Forms\CurrencyField;
9
use SilverStripe\Forms\DropdownField;
10
use SilverStripe\Forms\FieldList;
11
use SilverStripe\Forms\HeaderField;
12
use SilverStripe\Forms\NumericField;
13
use SilverStripe\Forms\TextField;
14
use SilverStripe\ORM\DataObject;
15
use SilverStripe\ORM\ValidationResult;
16
use SilverStripe\Security\Permission;
17
18
/**
19
 * Class OptionItem
20
 */
21
class OptionItem extends DataObject
22
{
23
    /**
24
     * @var array
25
     */
26
    private static $db = array(
0 ignored issues
show
introduced by
The private property $db is not used, and could be removed.
Loading history...
27
        'Title' => 'Text',
28
        'WeightModifier' => 'Int',
29
        'CodeModifier' => 'Text',
30
        'PriceModifier' => 'Currency',
31
        'WeightModifierAction' => "Enum('Add,Subtract,Set','Add')",
32
        'CodeModifierAction' => "Enum('Add,Subtract,Set','Add')",
33
        'PriceModifierAction' => "Enum('Add,Subtract,Set','Add')",
34
        'Available' => 'Boolean',
35
        'SortOrder' => 'Int'
36
    );
37
38
    /**
39
     * @var array
40
     */
41
    private static $has_one = array(
0 ignored issues
show
introduced by
The private property $has_one is not used, and could be removed.
Loading history...
42
        'Product' => ProductPage::class,
43
        'ProductOptionGroup' => OptionGroup::class,
44
    );
45
46
    /**
47
     * @var array
48
     */
49
    private static $belongs_many_many = array(
0 ignored issues
show
introduced by
The private property $belongs_many_many is not used, and could be removed.
Loading history...
50
        'OrderDetails' => OrderDetail::class
51
    );
52
53
    /**
54
     * @var array
55
     */
56
    private static $defaults = array(
0 ignored issues
show
introduced by
The private property $defaults is not used, and could be removed.
Loading history...
57
        'Available' => true
58
    );
59
60
    /**
61
     * @var array
62
     */
63
    private static $summary_fields = array(
0 ignored issues
show
introduced by
The private property $summary_fields is not used, and could be removed.
Loading history...
64
        'Title' => 'Title',
65
        'ProductOptionGroup.Title' => 'Group',
66
        'IsAvailable' => 'Available'
67
    );
68
69
    /**
70
     * @var array
71
     */
72
    private static $searchable_fields = [
0 ignored issues
show
introduced by
The private property $searchable_fields is not used, and could be removed.
Loading history...
73
        'Title' => [
74
            'title' => 'Title',
75
        ],
76
        'ProductOptionGroup.Title' => [
77
            'title' => 'Group'
78
        ],
79
    ];
80
81
    /**
82
     * @var string
83
     */
84
    private static $default_sort = 'SortOrder';
0 ignored issues
show
introduced by
The private property $default_sort is not used, and could be removed.
Loading history...
85
86
    /**
87
     * @var string
88
     */
89
    private static $table_name = 'FS_OptionItem';
0 ignored issues
show
introduced by
The private property $table_name is not used, and could be removed.
Loading history...
90
91
    /**
92
     * @return FieldList
93
     */
94
    public function getCMSFields()
95
    {
96
        $fields = parent::getCMSFields();
97
98
        $fields->removeByName([
99
            'OrderDetails',
100
            'SortOrder',
101
            'ProductID',
102
        ]);
103
104
        // set variables from Product
105
        $productID = ($this->ProductID != 0) ? $this->ProductID : Session::get('CMSMain.currentPage');
0 ignored issues
show
Bug Best Practice introduced by
The property ProductID does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The method SilverStripe\Control\Session::get() is not static, but was called statically. ( Ignorable by Annotation )

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

105
        $productID = ($this->ProductID != 0) ? $this->ProductID : Session::/** @scrutinizer ignore-call */ get('CMSMain.currentPage');
Loading history...
Bug Best Practice introduced by
It seems like you are loosely comparing $this->ProductID of type null|mixed to 0; this is ambiguous as not only 0 == 0 is true, but null == 0 is true, too. Consider using a strict comparison ===.
Loading history...
106
        $product = ProductPage::get()->byID($productID);
107
108
        $parentPrice = $product->obj('Price')->Nice();
109
        $parentWeight = $product->Weight;
110
        $parentCode = $product->Code;
111
112
        // ProductOptionGroup Dropdown field w/ add new
113
        $groups = function () {
114
            return OptionGroup::get()->map()->toArray();
115
        };
116
        $groupFields = singleton(OptionGroup::class)->getCMSFields();
117
        $groupField = DropdownField::create('ProductOptionGroupID', _t("OptionItem.Group", "Group"), $groups())
0 ignored issues
show
Bug introduced by
'ProductOptionGroupID' of type string is incompatible with the type array expected by parameter $args of SilverStripe\View\ViewableData::create(). ( Ignorable by Annotation )

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

117
        $groupField = DropdownField::create(/** @scrutinizer ignore-type */ 'ProductOptionGroupID', _t("OptionItem.Group", "Group"), $groups())
Loading history...
118
            ->setEmptyString('')
119
            ->setDescription(_t('OptionItem.GroupDescription', 'Name of this group of options. Managed in <a href="admin/settings">Settings > FoxyStripe > Option Groups</a>'));
120
        if (class_exists('QuickAddNewExtension')) {
121
            $groupField->useAddNew('OptionGroup', $groups, $groupFields);
122
        }
123
124
        $fields->addFieldsToTab('Root.Main', array(
125
            TextField::create('Title')
126
                ->setTitle(_t("OptionItem.Title", "Product Option Name")),
127
            CheckboxField::create('Available')
128
                ->setTitle(_t("OptionItem.Available", "Available for purchase"))
129
                ->setDescription(_t('OptionItem.AvailableDescription', "If unchecked, will disable this option in the drop down menu")),
130
            $groupField
131
        ));
132
133
        $fields->addFieldsToTab('Root.Modifiers', array(
134
            HeaderField::create('ModifyHD', _t('OptionItem.ModifyHD', 'Product Option Modifiers'), 2),
0 ignored issues
show
Bug introduced by
2 of type integer is incompatible with the type array expected by parameter $args of SilverStripe\View\ViewableData::create(). ( Ignorable by Annotation )

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

134
            HeaderField::create('ModifyHD', _t('OptionItem.ModifyHD', 'Product Option Modifiers'), /** @scrutinizer ignore-type */ 2),
Loading history...
135
136
            // Weight Modifier Fields
137
            HeaderField::create('WeightHD', _t('OptionItem.WeightHD', 'Modify Weight'), 3),
138
            NumericField::create('WeightModifier')
139
                ->setTitle(_t('OptionItem.WeightModifier', 'Weight')),
140
            DropdownField::create('WeightModifierAction', _t('OptionItem.WeightModifierAction', 'Weight Modification'),
141
                array(
142
                    'Add' => _t(
143
                        'OptionItem.WeightAdd',
144
                        "Add to Base Weight ({weight})",
145
                        'Add to weight',
146
                        array('weight' => $parentWeight)
147
                    ),
148
                    'Subtract' => _t(
149
                        'OptionItem.WeightSubtract',
150
                        "Subtract from Base Weight ({weight})",
151
                        'Subtract from weight',
152
                        array('weight' => $parentWeight)
153
                    ),
154
                    'Set' => _t('OptionItem.WeightSet', 'Set as a new Weight')
155
                )
156
            )->setEmptyString('')
157
            ->setDescription(_t('OptionItem.WeightDescription', 'Does weight modify or replace base weight?')),
158
159
            // Price Modifier FIelds
160
            HeaderField::create('PriceHD', _t('OptionItem.PriceHD', 'Modify Price'), 3),
161
            CurrencyField::create('PriceModifier')
162
                ->setTitle(_t('OptionItem.PriceModifier', 'Price')),
163
            DropdownField::create('PriceModifierAction', _t('OptionItem.PriceModifierAction', 'Price Modification'),
164
                array(
165
                    'Add' => _t(
166
                        'OptionItem.PriceAdd',
167
                        "Add to Base Price ({price})",
168
                        'Add to price',
169
                        array('price' => $parentPrice)
170
                    ),
171
                    'Subtract' => _t(
172
                        'OptionItem.PriceSubtract',
173
                        "Subtract from Base Price ({price})",
174
                        'Subtract from price',
175
                        array('price' => $parentPrice)
176
                    ),
177
                    'Set' => _t('OptionItem.PriceSet', 'Set as a new Price')
178
                )
179
            )->setEmptyString('')
180
            ->setDescription(_t('OptionItem.PriceDescription', 'Does price modify or replace base price?')),
181
182
            // Code Modifier Fields
183
            HeaderField::create('CodeHD', _t('OptionItem.CodeHD', 'Modify Code'), 3),
184
            TextField::create('CodeModifier')
185
                ->setTitle(_t('OptionItem.CodeModifier', 'Code')),
186
            DropdownField::create('CodeModifierAction', _t('OptionItem.CodeModifierAction', 'Code Modification'),
187
                array(
188
                    'Add' => _t(
189
                        'OptionItem.CodeAdd',
190
                        "Add to Base Code ({code})",
191
                        'Add to code',
192
                        array('code' => $parentCode)
193
                    ),
194
                    'Subtract' => _t(
195
                        'OptionItem.CodeSubtract',
196
                        'Subtract from Base Code ({code})',
197
                        'Subtract from code',
198
                        array('code' => $parentCode)
199
                    ),
200
                    'Set' => _t('OptionItem.CodeSet', 'Set as a new Code')
201
                )
202
            )->setEmptyString('')
203
            ->setDescription(_t('OptionItem.CodeDescription', 'Does code modify or replace base code?'))
204
        ));
205
206
        /*
0 ignored issues
show
Unused Code Comprehensibility introduced by
44% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
207
        // Cateogry Dropdown field w/ add new
208
        // removed until relevance determined
209
        $categories = function(){
210
            return ProductCategory::get()->map()->toArray();
211
        };
212
213
        // to do - have OptionItem category override set ProductPage category if selected: issue #155
214
        $categoryField = DropdownField::create('CategoryID', 'Category', $categories())
215
            ->setEmptyString('')
216
            ->setDescription('Categories can be managed in <a href="admin/settings">Settings > FoxyStripe > Categories</a>');
217
        if (class_exists('QuickAddNewExtension')) $categoryField->useAddNew('ProductCategory', $categories);
218
219
        $fields->insertAfter($categoryField, 'ProductOptionGroupID');
220
        */
221
222
        return $fields;
223
    }
224
225
    /**
226
     * @return ValidationResult
227
     */
228
    public function validate()
229
    {
230
        $result = parent::validate();
231
232
        if ($this->ProductOptionGroupID == 0) {
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing $this->ProductOptionGroupID of type null|mixed to 0; this is ambiguous as not only 0 == 0 is true, but null == 0 is true, too. Consider using a strict comparison ===.
Loading history...
Bug Best Practice introduced by
The property ProductOptionGroupID does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
233
            $result->addError('Must set a Group prior to saving');
234
        }
235
236
        return $result;
237
    }
238
239
    /**
240
     * @param $oma
241
     * @param bool $returnWithOnlyPlusMinus
242
     * @return string
243
     */
244
    public static function getOptionModifierActionSymbol($oma, $returnWithOnlyPlusMinus=false)
245
    {
246
        switch ($oma) {
247
            case 'Subtract':
248
                $symbol = '-';
249
                break;
250
            case 'Set':
251
                $symbol = ($returnWithOnlyPlusMinus) ? '' : ':';
252
                break;
253
            default:
254
                $symbol = '+';
255
        }
256
        return $symbol;
257
    }
258
259
    /**
260
     * @return string
261
     */
262
    public function getWeightModifierWithSymbol()
263
    {
264
        return self::getOptionModifierActionSymbol($this->WeightModifierAction).$this->WeightModifier;
0 ignored issues
show
Bug Best Practice introduced by
The property WeightModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property WeightModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
265
    }
266
267
    /**
268
     * @return string
269
     */
270
    public function getPriceModifierWithSymbol()
271
    {
272
        return self::getOptionModifierActionSymbol($this->PriceModifierAction).$this->PriceModifier;
0 ignored issues
show
Bug Best Practice introduced by
The property PriceModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property PriceModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
273
    }
274
275
    /**
276
     * @return string
277
     */
278
    public function getCodeModifierWithSymbol()
279
    {
280
        return self::getOptionModifierActionSymbol($this->CodeModifierAction).$this->CodeModifier;
0 ignored issues
show
Bug Best Practice introduced by
The property CodeModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property CodeModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
281
    }
282
283
    /**
284
     * @return mixed
285
     */
286
    public function getProductOptionGroupTitle()
287
    {
288
        return $this->ProductOptionGroup()->Title;
0 ignored issues
show
Bug introduced by
The method ProductOptionGroup() does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

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

288
        return $this->/** @scrutinizer ignore-call */ ProductOptionGroup()->Title;
Loading history...
289
    }
290
291
    /**
292
     * @return string
293
     */
294
    public function getGeneratedValue()
295
    {
296
        $modPrice = ($this->PriceModifier) ? (string)$this->PriceModifier : '0';
0 ignored issues
show
Bug Best Practice introduced by
The property PriceModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
297
        $modPriceWithSymbol = OptionItem::getOptionModifierActionSymbol($this->PriceModifierAction).$modPrice;
0 ignored issues
show
Bug Best Practice introduced by
The property PriceModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
298
        $modWeight = ($this->WeightModifier) ? (string)$this->WeightModifier : '0';
0 ignored issues
show
Bug Best Practice introduced by
The property WeightModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
299
        $modWeight = OptionItem::getOptionModifierActionSymbol($this->WeightModifierAction).$modWeight;
0 ignored issues
show
Bug Best Practice introduced by
The property WeightModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
300
        $modCode = OptionItem::getOptionModifierActionSymbol($this->CodeModifierAction).$this->CodeModifier;
0 ignored issues
show
Bug Best Practice introduced by
The property CodeModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property CodeModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
301
        return $this->Title.'{p'.$modPriceWithSymbol.'|w'.$modWeight.'|c'.$modCode.'}';
0 ignored issues
show
Bug Best Practice introduced by
The property Title does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
302
    }
303
304
    /**
305
     * @return mixed|string
306
     */
307
    public function getGeneratedTitle()
308
    {
309
        $modPrice = ($this->PriceModifier) ? (string)$this->PriceModifier : '0';
0 ignored issues
show
Bug Best Practice introduced by
The property PriceModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
310
        $title = $this->Title;
0 ignored issues
show
Bug Best Practice introduced by
The property Title does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
311
        $title .= ($this->PriceModifier != 0) ? ': ('.OptionItem::getOptionModifierActionSymbol($this->PriceModifierAction, $returnWithOnlyPlusMinus=true).'$'.$modPrice.')' : '';
0 ignored issues
show
Bug Best Practice introduced by
The property PriceModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
It seems like you are loosely comparing $this->PriceModifier of type null|mixed to 0; this is ambiguous as not only 0 == 0 is true, but null == 0 is true, too. Consider using a strict comparison ===.
Loading history...
312
        return $title;
313
    }
314
315
    /**
316
     * @return bool
317
     */
318
    public function getAvailability()
319
    {
320
        $available = ($this->Available == 1) ? true : false ;
0 ignored issues
show
Bug Best Practice introduced by
The property Available does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
321
322
        $this->extend('updateOptionAvailability', $available);
323
324
        return $available;
325
    }
326
327
    /**
328
     * @return string
329
     */
330
    public function getIsAvailable()
331
    {
332
        if ($this->getAvailability()) {
333
            return "yes";
334
        }
335
        return "no";
336
    }
337
338
    /**
339
     * @param bool $member
340
     * @return bool
341
     */
342
    public function canView($member = false)
343
    {
344
        return true;
345
    }
346
347
    /**
348
     * @param null $member
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $member is correct as it would always require null to be passed?
Loading history...
349
     * @return bool|int
350
     */
351
    public function canEdit($member = null)
352
    {
353
        return Permission::check('Product_CANCRUD');
354
    }
355
356
    /**
357
     * @param null $member
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $member is correct as it would always require null to be passed?
Loading history...
358
     * @return bool|int
359
     */
360
    public function canDelete($member = null)
361
    {
362
        return Permission::check('Product_CANCRUD');
363
    }
364
365
    /**
366
     * @param null $member
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $member is correct as it would always require null to be passed?
Loading history...
367
     * @return bool|int
368
     */
369
    public function canCreate($member = null, $context = [])
370
    {
371
        return Permission::check('Product_CANCRUD');
372
    }
373
}
374