HasBookings::newBooking()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.9
c 0
b 0
f 0
cc 1
nc 1
nop 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Rinvex\Bookings\Traits;
6
7
use Illuminate\Database\Eloquent\Model;
8
use Rinvex\Bookings\Models\BookableBooking;
9
use Illuminate\Database\Eloquent\Relations\MorphMany;
10
11
trait HasBookings
12
{
13
    use BookingScopes;
14
15
    /**
16
     * Define a polymorphic one-to-many relationship.
17
     *
18
     * @param string $related
19
     * @param string $name
20
     * @param string $type
0 ignored issues
show
Documentation introduced by
Should the type for parameter $type not be string|null?

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...
21
     * @param string $id
0 ignored issues
show
Documentation introduced by
Should the type for parameter $id not be string|null?

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...
22
     * @param string $localKey
0 ignored issues
show
Documentation introduced by
Should the type for parameter $localKey not be string|null?

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...
23
     *
24
     * @return \Illuminate\Database\Eloquent\Relations\MorphMany
25
     */
26
    abstract public function morphMany($related, $name, $type = null, $id = null, $localKey = null);
27
28
    /**
29
     * Get the booking model name.
30
     *
31
     * @return string
32
     */
33
    abstract public static function getBookingModel(): string;
34
35
    /**
36
     * Boot the HasBookings trait for the model.
37
     *
38
     * @return void
39
     */
40
    public static function bootHasBookings()
41
    {
42
        static::deleted(function (self $model) {
43
            $model->bookings()->delete();
44
        });
45
    }
46
47
    /**
48
     * The customer may have many bookings.
49
     *
50
     * @return \Illuminate\Database\Eloquent\Relations\MorphMany
51
     */
52
    public function bookings(): MorphMany
53
    {
54
        return $this->morphMany(static::getBookingModel(), 'customer');
55
    }
56
57
    /**
58
     * Get bookings of the given resource.
59
     *
60
     * @param \Illuminate\Database\Eloquent\Model $bookable
61
     *
62
     * @return \Illuminate\Database\Eloquent\Relations\MorphMany
63
     */
64
    public function bookingsOf(Model $bookable): MorphMany
65
    {
66
        return $this->bookings()->where('bookable_type', $bookable->getMorphClass())->where('bookable_id', $bookable->getKey());
67
    }
68
69
    /**
70
     * Check if the person booked the given model.
71
     *
72
     * @param \Illuminate\Database\Eloquent\Model $bookable
73
     *
74
     * @return bool
75
     */
76
    public function isBooked(Model $bookable): bool
77
    {
78
        return $this->bookings()->where('bookable_id', $bookable->getKey())->exists();
79
    }
80
81
    /**
82
     * Book the given model at the given dates with the given price.
83
     *
84
     * @param \Illuminate\Database\Eloquent\Model $bookable
85
     * @param string                              $startsAt
86
     * @param string                              $endsAt
87
     *
88
     * @return \Rinvex\Bookings\Models\BookableBooking
89
     */
90
    public function newBooking(Model $bookable, string $startsAt, string $endsAt): BookableBooking
91
    {
92
        return $this->bookings()->create([
93
            'bookable_id' => $bookable->getKey(),
94
            'bookable_type' => $bookable->getMorphClass(),
95
            '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...
96
            '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...
97
            'starts_at' => $startsAt,
98
            'ends_at' => $endsAt,
99
        ]);
100
    }
101
}
102