Completed
Push — develop ( 6deca1...bf40a6 )
by Adolfo
01:08
created

Plan::features()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
4
namespace Sagitarius29\LaravelSubscriptions;
5
6
7
use Illuminate\Database\Eloquent\Model;
8
use Sagitarius29\LaravelSubscriptions\Contracts\GroupContract;
9
use Sagitarius29\LaravelSubscriptions\Contracts\PlanContract;
10
11
abstract class Plan extends Model implements PlanContract
12
{
13
    protected $table = 'plans';
14
15
    protected $fillable = [
16
        'name', 'description', 'free_days', 'sort_order', 'is_active', 'is_default'
17
    ];
18
19
    public function features()
20
    {
21
        return $this->hasMany(config('subscriptions.entities.plan_feature'));
22
    }
23
24
    public function prices()
25
    {
26
        return $this->hasMany(config('subscriptions.entities.plan_price'), 'plan_id')->orderBy('amount');
27
    }
28
29
    public function subscriptions()
30
    {
31
        return $this->hasMany(config('subscriptions.entities.subscription'));
32
    }
33
34
    public function isDefault(): bool
35
    {
36
        return $this->is_default;
37
    }
38
39
    public function isActive(): bool
40
    {
41
        return $this->is_active;
42
    }
43
44
    public function isFree(): bool
45
    {
46
        return $this->prices()->count() == 0 || $this->prices()->first()->amount == 0;
47
    }
48
49
    public static function create(
50
        string $name, string $description, int $free_days, int $sort_order, bool $is_active = false, bool $is_default = false
51
    ): Model
52
    {
53
        $attributes = [
54
            'name'          => $name,
55
            'description'   => $description,
56
            'free_days'     => $free_days,
57
            'sort_order'    => $sort_order,
58
            'is_active'     => $is_active,
59
            'is_default'    => $is_default
60
        ];
61
62
        $calledClass = get_called_class();
63
64
        $plan = new $calledClass($attributes);
65
        $plan->save();
66
        return $plan;
67
    }
68
69
    public function setFree()
70
    {
71
        $this->prices()->delete();
72
    }
73
74
    public function myGroup(): ?GroupContract
75
    {
76
        return empty($this->group) ? null : new $this->group;
77
    }
78
79
    public function toGroup(GroupContract $group): void
80
    {
81
        // TODO: Implement toGroup() method.
82
    }
83
}
84