Completed
Push — develop ( bb8d62...714b37 )
by Abdelrahman
08:38
created

BookingCustomer::bookingsOfBookable()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Rinvex\Bookings\Traits;
6
7
use Rinvex\Bookings\Models\Booking;
8
use Illuminate\Database\Eloquent\Model;
9
use Illuminate\Database\Eloquent\Relations\MorphMany;
10
11
trait BookingCustomer
12
{
13
    use BookingScopes;
14
15
    /**
16
     * The customer may have many bookings.
17
     *
18
     * @return \Illuminate\Database\Eloquent\Relations\MorphMany
19
     */
20
    public function bookings(): MorphMany
21
    {
22
        return $this->morphMany(config('rinvex.bookings.models.booking'), 'customer');
0 ignored issues
show
Bug introduced by
It seems like morphMany() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
23
    }
24
25
    /**
26
     * Get bookings of the given bookable.
27
     *
28
     * @param \Illuminate\Database\Eloquent\Model $bookable
0 ignored issues
show
Documentation introduced by
Should the type for parameter $bookable not be string|Model?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
29
     *
30
     * @return \Illuminate\Database\Eloquent\Relations\MorphMany
31
     */
32
    public function bookingsOfBookable(string $bookable): MorphMany
33
    {
34
        return $this->bookings()->where('bookable_type', $bookable->getMorphClass())->where('bookable_id', $bookable->getKey());
0 ignored issues
show
Bug introduced by
It seems like $bookable is not always an object, but can also be of type string. Maybe add an additional type check?

If a variable is not always an object, we recommend to add an additional type check to ensure your method call is safe:

function someFunction(A $objectMaybe = null)
{
    if ($objectMaybe instanceof A) {
        $objectMaybe->doSomething();
    }
}
Loading history...
Coding Style introduced by
This line exceeds maximum limit of 120 characters; contains 128 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
35
    }
36
37
    /**
38
     * Check if the person booked the given model.
39
     *
40
     * @param \Illuminate\Database\Eloquent\Model $model
41
     *
42
     * @return bool
43
     */
44
    public function isBooked(Model $model): bool
45
    {
46
        return $this->bookings()->where('bookable_id', $model->getKey())->where('bookable_type', get_class($model))->exists();
0 ignored issues
show
Coding Style introduced by
This line exceeds maximum limit of 120 characters; contains 126 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
47
    }
48
49
    /**
50
     * Book the given model at the given dates with the given price.
51
     *
52
     * @param \Illuminate\Database\Eloquent\Model $bookable
53
     * @param string                              $starts
54
     * @param string                              $ends
55
     * @param float                               $price
56
     *
57
     * @return \Rinvex\Bookings\Models\Booking
58
     */
59
    public function newBooking(Model $bookable, string $starts, string $ends, float $price): Booking
60
    {
61
        return $this->bookings()->create([
62
            'bookable_id' => $bookable->getKey(),
63
            'bookable_type' => $bookable->getMorphClass(),
64
            'customer_id' => $this->getKey(),
0 ignored issues
show
Bug introduced by
It seems like getKey() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
65
            'customer_type' => $this->getMorphClass(),
0 ignored issues
show
Bug introduced by
It seems like getMorphClass() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
66
            'starts_at' => $starts,
67
            'ends_at' => $ends,
68
            'price' => $price,
69
        ]);
70
    }
71
}
72