Passed
Pull Request — master (#309)
by Jason
06:15 queued 01:51
created

OptionItem::validate()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2.032

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 9
ccs 4
cts 5
cp 0.8
rs 9.6666
cc 2
eloc 4
nc 2
nop 0
crap 2.032
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 4
    public function validate()
229
    {
230 4
        $result = parent::validate();
231
232 4
        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 4
        return $result;
237
    }
238
239
    /**
240
     * @param $oma
241
     * @param bool $returnWithOnlyPlusMinus
242
     *
243
     * @return string
244
     */
245
    public static function getOptionModifierActionSymbol($oma, $returnWithOnlyPlusMinus = false)
246
    {
247
        switch ($oma) {
248
            case 'Subtract':
249
                $symbol = '-';
250
                break;
251
            case 'Set':
252
                $symbol = ($returnWithOnlyPlusMinus) ? '' : ':';
253
                break;
254
            default:
255
                $symbol = '+';
256
        }
257
258
        return $symbol;
259
    }
260
261
    /**
262
     * @return string
263
     */
264
    public function getWeightModifierWithSymbol()
265
    {
266
        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...
267
    }
268
269
    /**
270
     * @return string
271
     */
272
    public function getPriceModifierWithSymbol()
273
    {
274
        return self::getOptionModifierActionSymbol($this->PriceModifierAction).$this->PriceModifier;
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
The property PriceModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
275
    }
276
277
    /**
278
     * @return string
279
     */
280
    public function getCodeModifierWithSymbol()
281
    {
282
        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...
283
    }
284
285
    /**
286
     * @return mixed
287
     */
288
    public function getProductOptionGroupTitle()
289
    {
290
        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

290
        return $this->/** @scrutinizer ignore-call */ ProductOptionGroup()->Title;
Loading history...
291
    }
292
293
    /**
294
     * @return string
295
     */
296
    public function getGeneratedValue()
297
    {
298
        $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...
299
        $modPriceWithSymbol = self::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...
300
        $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...
301
        $modWeight = self::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...
302
        $modCode = 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...
303
304
        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...
305
    }
306
307
    /**
308
     * @return mixed|string
309
     */
310
    public function getGeneratedTitle()
311
    {
312
        $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...
313
        $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...
314
        $title .= ($this->PriceModifier != 0) ? ': ('.self::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...
315
316
        return $title;
317
    }
318
319
    /**
320
     * @return bool
321
     */
322
    public function getAvailability()
323
    {
324
        $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...
325
326
        $this->extend('updateOptionAvailability', $available);
327
328
        return $available;
329
    }
330
331
    /**
332
     * @return string
333
     */
334
    public function getIsAvailable()
335
    {
336
        if ($this->getAvailability()) {
337
            return 'yes';
338
        }
339
340
        return 'no';
341
    }
342
343
    /**
344
     * @param bool $member
345
     *
346
     * @return bool
347
     */
348 49
    public function canView($member = false)
349
    {
350 49
        return true;
351
    }
352
353
    /**
354
     * @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...
355
     *
356
     * @return bool|int
357
     */
358
    public function canEdit($member = null)
359
    {
360
        return Permission::check('Product_CANCRUD');
361
    }
362
363
    /**
364
     * @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...
365
     *
366
     * @return bool|int
367
     */
368 1
    public function canDelete($member = null)
369
    {
370 1
        return Permission::check('Product_CANCRUD');
371
    }
372
373
    /**
374
     * @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...
375
     *
376
     * @return bool|int
377
     */
378
    public function canCreate($member = null, $context = [])
379
    {
380
        return Permission::check('Product_CANCRUD');
381
    }
382
}
383