Purchase   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 122
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
eloc 39
c 3
b 0
f 0
dl 0
loc 122
rs 10
wmc 15

10 Methods

Rating   Name   Duplication   Size   Complexity  
A generateSecrets() 0 5 1
A setStateToPaid() 0 10 2
A events() 0 7 1
A customer() 0 3 1
A ticketList() 0 11 2
A total() 0 5 1
A getRouteKeyName() 0 3 1
A tickets() 0 3 1
A vendor() 0 3 1
A deleteWithAllData() 0 17 4
1
<?php
2
3
namespace App;
4
5
use Illuminate\Database\Eloquent\Model;
6
use App\Exceptions\PaymentProviderException;
7
use Illuminate\Support\Facades\Log;
8
use Illuminate\Support\Str;
9
10
class Purchase extends Model
11
{
12
    //
13
    protected $fillable = ['state', 'state_updated'];
14
15
    /**
16
     * The model's default values for attributes.
17
     *
18
     * @var array
19
     */
20
    protected $attributes = [
21
        'state' => 'in_payment'
22
    ];
23
24
    /**
25
     * Get the route key for the model.
26
     *
27
     * @return string
28
     */
29
    public function getRouteKeyName()
30
    {
31
        return 'random_id';
32
    }
33
34
    /**
35
     * Sets random_id and payment_secret
36
     */
37
    public function generateSecrets()
38
    {
39
        $this->state_updated = new \DateTime();
40
        $this->random_id = Str::random(32);
41
        $this->payment_secret = Str::random(32);
42
    }
43
44
    /**
45
     * Sum of all ticket prices included in the purchase
46
     */
47
    public function total()
48
    {
49
        $tickets = $this->tickets;
50
        return $tickets->sum(function ($ticket) {
51
            return $ticket->price();
52
        });
53
    }
54
55
    public function events()
56
    {
57
        $events = [];
58
        $this->tickets->each(function ($ticket) use (&$events) {
59
            $events[$ticket->event->id] = $ticket->event;
60
        });
61
        return collect($events);
62
    }
63
64
    /**
65
     * Prepare all tickets grouped by their priceCategory
66
     * for displaying in a view
67
     */
68
    public function ticketList()
69
    {
70
        $list = [];
71
        $this->tickets->each(function ($ticket) use (&$list) {
72
            if (array_key_exists($ticket->priceCategory->name, $list)) {
73
                $list[$ticket->priceCategory->name]['count']++;
74
            } else {
75
                $list[$ticket->priceCategory->name] = ['count' => 1, 'category' => $ticket->priceCategory];
76
            }
77
        });
78
        return collect($list);
79
    }
80
81
    /**
82
     * Deletes all associated data of the purchase and sets it to state=deleted
83
     * 
84
     * If the customer's user has other purchases connected,
85
     * the user will not be deleted.
86
     */
87
    public function deleteWithAllData()
88
    {
89
        $this->tickets->each(function ($ticket) {
90
            $ticket->delete();
91
        });
92
93
        $user = $this->customer;
94
95
        $this->state = "deleted";
96
        $this->state_updated = new \DateTime();
97
        $this->save();
98
99
        // If this purchase is the only purchase of the user,
100
        // and the user's password is empty, delete the user.
101
        if ($user && $user->purchases->count() === 1 && $user->password == '') {
102
            Log::info('Deleting customer "' . $user->name . '" (= #' . $user->id . ') of purchase #' . $this->id);
103
            $user->deleteWithRoles();
104
        }
105
    }
106
107
    public function setStateToPaid(string $secret)
108
    {
109
        // Validate if the sent secret matches the purchase-secret
110
        if ($this->payment_secret != $secret) {
111
            throw new PaymentProviderException('Error - Secret does not match purchase!');
112
        }
113
114
        $this->state = 'paid';
115
        $this->state_updated = new \DateTime();
116
        $this->save();
117
    }
118
119
    public function tickets()
120
    {
121
        return $this->hasMany('App\Ticket');
122
    }
123
124
    public function customer()
125
    {
126
        return $this->belongsTo('App\User', 'customer_id', 'id');
127
    }
128
129
    public function vendor()
130
    {
131
        return $this->belongsTo('App\User', 'vendor_id', 'id');
132
    }
133
}
134