Passed
Push — 1.0 ( aa9352...5cef1b )
by Morven
02:44
created

LineItem::checkStockLevel()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 6
nc 2
nop 1
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace SilverCommerce\OrdersAdmin\Model;
4
5
use SilverStripe\ORM\DataObject;
6
use SilverStripe\ORM\FieldType\DBHTMLText as HTMLText;
7
use SilverStripe\ORM\ArrayList;
8
use SilverStripe\Forms\FieldList;
9
use SilverStripe\Forms\ReadonlyField;
10
use SilverStripe\Forms\HTMLEditor\HTMLEditorField;
11
use SilverStripe\Forms\GridField\GridField;
12
use SilverStripe\Forms\GridField\GridFieldConfig;
13
use SilverStripe\Forms\GridField\GridFieldConfig_Base;
14
use SilverStripe\Forms\GridField\GridFieldButtonRow;
15
use Symbiote\GridFieldExtensions\GridFieldEditableColumns;
16
use Symbiote\GridFieldExtensions\GridFieldAddNewInlineButton;
17
use SilverStripe\Forms\GridField\GridFieldEditButton;
18
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
19
use SilverStripe\Forms\GridField\GridFieldDataColumns;
20
use SilverStripe\Forms\GridField\GridFieldAddNewButton;
21
use SilverStripe\Forms\GridField\GridFieldAddExistingAutocompleter;
22
use SilverStripe\SiteConfig\SiteConfig;
23
use SilverCommerce\TaxAdmin\Model\TaxRate;
24
use SilverStripe\Forms\DropdownField;
25
26
/**
27
 * A LineItem is a single line item on an order, extimate or even in
28
 * the shopping cart.
29
 *
30
 * An item has a number of fields that describes a product:
31
 *
32
 * - Key: ID used to detect this item
33
 * - Title: Title of the item
34
 * - Content: Description of this object
35
 * - Quantity: Number or items in this order
36
 * - Weight: Weight of this item (unit of measurment is defined globally)
37
 * - TaxRate: Rate of tax for this item (e.g. 20.00 for 20%)
38
 * - ProductClass: ClassName of product that this item is matched against
39
 * - StockID: Unique identifier of this item (used with ProductClass
40
 *            match to a product)
41
 * - Locked: Is this a locked item? Locked items cannot be changed in the
42
 *           shopping cart
43
 * - Deliverable: Is this a product that can be delivered? This can effect
44
 *                delivery options
45
 *
46
 * @author Mo <[email protected]>
47
 */
48
class LineItem extends DataObject
49
{
50
    private static $table_name = 'LineItem';
51
52
    /**
53
     * The name of the param used on a related product to
54
     * track Stock Levels.
55
     *
56
     * Defaults to StockLevel
57
     *
58
     * @var string
59
     * @config
60
     */
61
    private static $stock_param = "StockLevel";
62
63
    /**
64
     * Standard database columns
65
     *
66
     * @var array
67
     * @config
68
     */
69
    private static $db = [
70
        "Key"           => "Varchar(255)",
71
        "Title"         => "Varchar",
72
        "Content"       => "HTMLText",
73
        "Quantity"      => "Int",
74
        "Price"         => "Currency",
75
        "Weight"        => "Decimal",
76
        "StockID"       => "Varchar(100)",
77
        "ProductClass"  => "Varchar",
78
        "Locked"        => "Boolean",
79
        "Stocked"       => "Boolean",
80
        "Deliverable"   => "Boolean",
81
        "Customisation" => "Text",
82
    ];
83
84
    /**
85
     * Foreign key associations in DB
86
     *
87
     * @var array
88
     * @config
89
     */
90
    private static $has_one = [
91
        "Parent"      => Estimate::class,
92
        "Tax"         => TaxRate::class,
93
    ];
94
    
95
    /**
96
     * One to many associations
97
     *
98
     * @var array
99
     * @config
100
     */
101
    private static $has_many = [
102
        "Customisations" => LineItemCustomisation::class
103
    ];
104
105
    /**
106
     * Specify default values of a field
107
     *
108
     * @var array
109
     * @config
110
     */
111
    private static $defaults = [
112
        "Quantity"      => 1,
113
        "ProductClass"  => "Product",
114
        "Locked"        => false,
115
        "Stocked"       => false,
116
        "Deliverable"   => true
117
    ];
118
119
    /**
120
     * Function to DB Object conversions
121
     *
122
     * @var array
123
     * @config
124
     */
125
    private static $casting = [
126
        "UnitPrice" => "Currency",
127
        "UnitTax" => "Currency",
128
        "UnitTotal" => "Currency",
129
        "SubTotal" => "Currency",
130
        "TaxRate" => "Decimal",
131
        "TaxTotal" => "Currency",
132
        "Total" => "Currency",
133
        "CustomisationList" => "Text",
134
        "CustomisationAndPriceList" => "Text",
135
    ];
136
137
    /**
138
     * Fields to display in list tables
139
     *
140
     * @var array
141
     * @config
142
     */
143
    private static $summary_fields = [
144
        "Quantity"  => "Quantity",
145
        "Title"     => "Title",
146
        "StockID"   => "Stock ID",
147
        "Price"     => "Item Price",
148
        "TaxID"    => "Tax",
149
        "CustomisationAndPriceList" => "Customisations"
150
    ];
151
152
    /**
153
     * Modify default field scaffolding in admin
154
     *
155
     * @return FieldList
156
     */
157
    public function getCMSFields()
158
    {
159
        
160
        $this->beforeUpdateCMSFields(function ($fields) {
161
            $config = SiteConfig::current_site_config();
162
163
            $fields->removeByName("Customisation");
164
165
            $fields->addFieldToTab(
166
                "Root.Main",
167
                ReadonlyField::create("Key"),
0 ignored issues
show
Bug introduced by
'Key' 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

167
                ReadonlyField::create(/** @scrutinizer ignore-type */ "Key"),
Loading history...
168
                "Title"
169
            );
170
171
            $fields->addFieldToTab(
172
                "Root.Main",
173
                DropdownField::create(
174
                    "TaxID",
175
                    $this->fieldLabel("TaxID"),
176
                    $config->TaxRates()->map()
177
                ),
178
                "Weight"
179
            );
180
181
            $fields->addFieldsToTab(
182
                "Root.Description",
183
                [
184
                    HTMLEditorField::create("Content")
185
                        ->addExtraClass("stacked")
186
                ]
187
            );
188
189
            // Change unlink button to remove on customisation
190
            $custom_field = $fields->dataFieldByName("Customisations");
191
192
            if ($custom_field) {
193
                $config = $custom_field->getConfig();
194
                $config
195
                    ->removeComponentsByType(GridFieldDeleteAction::class)
196
                    ->removeComponentsByType(GridFieldDataColumns::class)
197
                    ->removeComponentsByType(GridFieldEditButton::class)
198
                    ->removeComponentsByType(GridFieldAddNewButton::class)
199
                    ->removeComponentsByType(GridFieldAddExistingAutocompleter::class)
200
                    ->addComponents(
201
                        new GridFieldEditableColumns(),
202
                        new GridFieldAddNewInlineButton(),
203
                        new GridFieldEditButton(),
204
                        new GridFieldDeleteAction()
205
                    );
206
                
207
                    $custom_field->setConfig($config);
208
            }
209
        });
210
211
        return parent::getCMSFields();
212
    }
213
214
    /**
215
     * Get the rate of tax for this item
216
     *
217
     * @return float
218
     */
219
    public function getTaxRate()
220
    {
221
        $rate = ($this->Tax()->exists()) ? $this->Tax()->Rate : 0;
0 ignored issues
show
Bug introduced by
The method Tax() does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. 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

221
        $rate = ($this->/** @scrutinizer ignore-call */ Tax()->exists()) ? $this->Tax()->Rate : 0;
Loading history...
222
223
        $this->extend("updateTaxRate", $rate);
224
225
        return $rate;
226
    }
227
    
228
    /**
229
     * Get the price for a single line item (unit), minus any
230
     * tax
231
     *
232
     * @return float
233
     */
234
    public function getUnitPrice()
235
    {
236
        $total = $this->Price;
0 ignored issues
show
Bug Best Practice introduced by
The property Price does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
237
238
        foreach ($this->Customisations() as $customisation) {
0 ignored issues
show
Bug introduced by
The method Customisations() does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. 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

238
        foreach ($this->/** @scrutinizer ignore-call */ Customisations() as $customisation) {
Loading history...
239
            $total += $customisation->Price;
240
        }
241
242
        $this->extend("updateUnitPrice", $total);
243
244
        return $total;
245
    }
246
247
    /**
248
     * Get the amount of tax for a single unit of this item
249
     *
250
     * @return float
251
     */
252
    public function getUnitTax()
253
    {
254
        $total = ($this->UnitPrice / 100) * $this->TaxRate;
0 ignored issues
show
Bug Best Practice introduced by
The property UnitPrice does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property TaxRate does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
255
256
        $this->extend("updateUnitTax", $total);
257
258
        return $total;
259
    }
260
261
    /**
262
     * Get the total price and tax for a single unit
263
     *
264
     * @return float
265
     */
266
    public function getUnitTotal()
267
    {
268
        $total = $this->UnitPrice + $this->UnitTax;
0 ignored issues
show
Bug Best Practice introduced by
The property UnitPrice does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property UnitTax does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
269
270
        $this->extend("updateUnitTotal", $total);
271
272
        return $total;
273
    }
274
275
    /**
276
     * Get the value of this item, minus any tax
277
     *
278
     * @return float
279
     */
280
    public function getSubTotal()
281
    {
282
        $total = $this->UnitPrice * $this->Quantity;
0 ignored issues
show
Bug Best Practice introduced by
The property Quantity does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property UnitPrice does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
283
284
        $this->extend("updateSubTotal", $total);
285
286
        return $total;
287
    }
288
289
    /**
290
     * Get the total amount of tax for a single unit of this item
291
     *
292
     * @return float
293
     */
294
    public function getTaxTotal()
295
    {
296
        $total = $this->UnitTax * $this->Quantity;
0 ignored issues
show
Bug Best Practice introduced by
The property Quantity does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property UnitTax does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
297
298
        $this->extend("updateTaxTotal", $total);
299
300
        return $total;
301
    }
302
303
    /**
304
     * Get the value of this item, minus any tax
305
     *
306
     * @return float
307
     */
308
    public function getTotal()
309
    {
310
        $total = $this->SubTotal + $this->TaxTotal;
0 ignored issues
show
Bug Best Practice introduced by
The property TaxTotal does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property SubTotal does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
311
312
        $this->extend("updateTotal", $total);
313
314
        return $total;
315
    }
316
317
    /**
318
     * Get an image object associated with this line item.
319
     * By default this is retrieved from the base product.
320
     *
321
     * @return Image | null
0 ignored issues
show
Bug introduced by
The type SilverCommerce\OrdersAdmin\Model\Image was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
322
     */
323
    public function Image()
324
    {
325
        $product = $this->FindStockItem();
326
327
        if ($product && method_exists($product, "SortedImages")) {
328
            return  $product->SortedImages()->first();
329
        } elseif ($product && method_exists($product, "Images")) {
330
            return $product->Images()->first();
331
        } elseif ($product && method_exists($product, "Image") && $product->Image()->exists()) {
332
            return $product->Image();
333
        }
334
    }
335
    
336
    /**
337
     * Provide a string of customisations seperated by a comma but not
338
     * including a price
339
     *
340
     * @return string
341
     */
342
    public function getCustomisationList()
343
    {
344
        $return = [];
345
        $items = $this->Customisations();
346
347
        if ($items && $items->exists()) {
348
            foreach ($items as $item) {
349
                $return[] = $item->Title . ': ' . $item->Value;
350
            }
351
        }
352
353
        $this->extend("updateCustomisationList", $return);
354
355
        return implode(", ", $return);
356
    }
357
358
    /**
359
     * Provide a string of customisations seperated by a comma and
360
     * including a price
361
     *
362
     * @return string
363
     */
364
    public function getCustomisationAndPriceList()
365
    {
366
        $return = [];
367
        $items = $this->Customisations();
368
369
        if ($items && $items->exists()) {
370
            foreach ($items as $item) {
371
                $return[] = $item->Title . ': ' . $item->Value . ' (' . $item->dbObject("Price")->Nice() . ')';
372
            }
373
        }
374
375
        $this->extend("updateCustomisationAndPriceList", $return);
376
377
        return implode(", ", $return);
378
    }
379
    
380
    /**
381
     * Get list of customisations rendering into a basic
382
     * HTML string
383
     *
384
     * @return HTMLText
385
     */
386
    public function CustomisationHTML()
387
    {
388
        $return = HTMLText::create();
389
        $items = $this->Customisations();
390
        $html = "";
391
        
392
        if ($items && $items->exists()) {
393
            foreach ($items as $item) {
394
                $html .= $item->Title . ': ' . $item->Value . ";<br/>";
395
            }
396
        }
397
398
        $return->setValue($html);
399
400
        $this->extend("updateCustomisationHTML", $return);
401
402
        return $return;
403
    }
404
        
405
    /**
406
     * Match this item to another object in the Database, by the
407
     * provided details.
408
     *
409
     * @param $relation_name = The class name of the related dataobject
0 ignored issues
show
Documentation Bug introduced by
The doc comment = at position 0 could not be parsed: Unknown type name '=' at position 0 in =.
Loading history...
410
     * @param $relation_col = The column name of the related object
411
     * @param $match_col = The column we use to match the two objects
412
     * @return DataObject
413
     */
414
    public function Match($relation_name = null, $relation_col = "StockID", $match_col = "StockID")
415
    {
416
        // Try to determine relation name
417
        if (!$relation_name && !$this->ProductClass) {
0 ignored issues
show
Bug Best Practice introduced by
The property ProductClass does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
418
            $relation_name = "Product";
419
        } elseif (!$relation_name && $this->ProductClass) {
420
            $relation_name = $this->ProductClass;
421
        }
422
        
423
        return $relation_name::get()
424
            ->filter($relation_col, $this->$match_col)
425
            ->first();
426
    }
427
428
    /**
429
     * Find our original stock item (useful for adding links back to the
430
     * original product).
431
     *
432
     * This function is a synonym for @Link Match (as a result of) merging
433
     * LineItem
434
     *
435
     * @return DataObject
436
     */
437
    public function FindStockItem()
438
    {
439
        return $this->Match();
440
    }
441
442
    /**
443
     * Check stock levels for this item, will return the actual number
444
     * of remaining stock after removing the current quantity
445
     *
446
     * @param $qty The quantity we want to check against
0 ignored issues
show
Bug introduced by
The type SilverCommerce\OrdersAdmin\Model\The was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
447
     * @return Int
448
     */
449
    public function checkStockLevel($qty)
450
    {
451
        $stock_param = $this->config()->get("stock_param");
452
        $item = $this->Match();
453
        $stock = ($item->$stock_param) ? $item->$stock_param : 0;
454
        $return = $stock - $qty;
455
456
        $this->extend("updateCheckStockLevel", $return);
457
        
458
        return $return;
459
    }
460
461
    /**
462
     * Only order creators or users with VIEW admin rights can view
463
     *
464
     * @return Boolean
465
     */
466
    public function canView($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

466
    public function canView($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...
467
    {
468
        $extended = $this->extend('canView', $member);
469
        if ($extended && $extended !== null) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $extended of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
470
            return $extended;
471
        }
472
473
        return $this->Parent()->canView($member);
0 ignored issues
show
Bug introduced by
The method Parent() does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. 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

473
        return $this->/** @scrutinizer ignore-call */ Parent()->canView($member);
Loading history...
474
    }
475
476
    /**
477
     * Anyone can create an order item
478
     *
479
     * @return Boolean
480
     */
481
    public function canCreate($member = null, $context = [])
482
    {
483
        $extended = $this->extend('canCreate', $member);
484
        if ($extended && $extended !== null) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $extended of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
485
            return $extended;
486
        }
487
488
        return true;
489
    }
490
491
    /**
492
     * No one can edit items once they are created
493
     *
494
     * @return Boolean
495
     */
496
    public function canEdit($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

496
    public function canEdit($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...
497
    {
498
        $extended = $this->extend('canEdit', $member);
499
        if ($extended && $extended !== null) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $extended of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
500
            return $extended;
501
        }
502
503
        return $this->Parent()->canEdit($member);
504
    }
505
506
    /**
507
     * No one can delete items once they are created
508
     *
509
     * @return Boolean
510
     */
511
    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

511
    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...
512
    {
513
        $extended = $this->extend('canDelete', $member);
514
        if ($extended && $extended !== null) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $extended of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
515
            return $extended;
516
        }
517
518
        return $this->Parent()->canEdit($member);
519
    }
520
521
    /**
522
     * Overwrite default duplicate function
523
     *
524
     * @param boolean $doWrite (write the cloned object to DB)
525
     * @return DataObject $clone The duplicated object
526
     */
527
    public function duplicate($doWrite = true, $manyMany = "many_many")
528
    {
529
        $clone = parent::duplicate($doWrite);
530
531
        // Ensure we clone any customisations
532
        if ($doWrite) {
533
            foreach ($this->Customisations() as $customisation) {
534
                $new_item = $customisation->duplicate(false);
535
                $new_item->ParentID = $clone->ID;
536
                $new_item->write();
537
            }
538
        }
539
540
        return $clone;
541
    }
542
543
    /**
544
     * Pre-write tasks
545
     *
546
     * @return void
547
     */
548
    public function onBeforeWrite()
549
    {
550
        parent::onBeforeWrite();
551
552
        // Generate a unique item key based on
553
        $this->Key = $this->StockID . ':' . base64_encode(json_encode($this->Customisations()->toArray()));
0 ignored issues
show
Bug Best Practice introduced by
The property StockID does not exist on SilverCommerce\OrdersAdmin\Model\LineItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property Key does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
554
    }
555
556
    /**
557
     * Perform post-DB write functions
558
     *
559
     * @return void
560
     */
561
    public function onAfterWrite()
562
    {
563
        parent::onAfterWrite();
564
565
        if ($this->Customisation) {
566
            $data = unserialize($this->Customisation);
567
568
            if ($data instanceof ArrayList) {
569
                foreach ($data as $data_item) {
570
                    $data_item->ParentID = $this->ID;
571
                    $data_item->write();
572
                }
573
574
                $this->Customisation = null;
0 ignored issues
show
Bug Best Practice introduced by
The property Customisation does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
575
                $this->write();
576
            }
577
        }
578
    }
579
580
    /**
581
     * Clean up DB on deletion
582
     *
583
     * @return void
584
     */
585
    public function onBeforeDelete()
586
    {
587
        parent::onBeforeDelete();
588
589
        foreach ($this->Customisations() as $customisation) {
590
            $customisation->delete();
591
        }
592
    }
593
}
594