Completed
Push — develop ( 28bf94...773f3b )
by Francisco
03:17
created

Enrollment   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 147
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 147
rs 10
c 1
b 0
f 0
wmc 12

10 Methods

Rating   Name   Duplication   Size   Complexity  
A scopeOrderByStudent() 0 5 1
A exchange() 0 10 1
A course() 0 3 1
A exchangesAsSource() 0 3 1
A scopeOwnedBy() 0 3 1
A scopeSimilarEnrollments() 0 5 1
A student() 0 3 1
A shift() 0 3 1
A availableForExchange() 0 7 3
A scopeOrderByCourse() 0 7 1
1
<?php
2
3
namespace App\Judite\Models;
4
5
use Illuminate\Database\Eloquent\Model;
6
use Laracasts\Presenter\PresentableTrait;
7
use App\Judite\Presenters\EnrollmentPresenter;
8
9
class Enrollment extends Model
10
{
11
    use PresentableTrait;
12
13
    /**
14
     * The relations to eager load on every query.
15
     *
16
     * @var array
17
     */
18
    protected $with = ['student', 'shift', 'course'];
19
20
    /**
21
     * The presenter for this entity.
22
     *
23
     * @var string
24
     */
25
    protected $presenter = EnrollmentPresenter::class;
26
27
    /**
28
     * Scope a query to filter enrollments by owner.
29
     *
30
     * @param \Illuminate\Database\Eloquent\Builder $query
31
     * @param \App\Judite\Models\Student            $student
32
     *
33
     * @return \Illuminate\Database\Eloquent\Builder
34
     */
35
    public function scopeOwnedBy($query, Student $student)
36
    {
37
        return $query->whereStudentId($student->id);
38
    }
39
40
    /**
41
     * Scope a query to order enrollments by course.
42
     *
43
     * @param \Illuminate\Database\Eloquent\Builder $query
44
     *
45
     * @return \Illuminate\Database\Eloquent\Builder
46
     */
47
    public function scopeOrderByCourse($query)
48
    {
49
        return $query->select('enrollments.*')
50
            ->join('courses', 'enrollments.course_id', '=', 'courses.id')
51
            ->orderBy('courses.year', 'asc')
52
            ->orderBy('courses.semester', 'asc')
53
            ->orderBy('courses.name', 'asc');
54
    }
55
56
    /**
57
     * Scope a query to filter similar enrollments.
58
     *
59
     * @param \Illuminate\Database\Eloquent\Builder $query
60
     * @param \App\Judite\Models\Enrollment         $enrollment
61
     *
62
     * @return \Illuminate\Database\Eloquent\Builder
63
     */
64
    public function scopeSimilarEnrollments($query, Enrollment $enrollment)
65
    {
66
        return $query->where('enrollments.id', '!=', $enrollment->id)
67
            ->where('course_id', $enrollment->course->id)
68
            ->where('shift_id', '!=', $enrollment->shift->id);
69
    }
70
71
    /**
72
     * Scope a query to order enrollments by students.
73
     *
74
     * @param \Illuminate\Database\Eloquent\Builder $query
75
     *
76
     * @return \Illuminate\Database\Eloquent\Builder
77
     */
78
    public function scopeOrderByStudent($query)
79
    {
80
        return $query->select('enrollments.*')
81
            ->join('students', 'enrollments.student_id', '=', 'students.id')
82
            ->orderBy('students.student_number', 'asc');
83
    }
84
85
    /**
86
     * Exchange shifts with the given enrollment.
87
     *
88
     * @param \App\Judite\Models\Enrollment $enrollment
89
     *
90
     * @return $this
91
     */
92
    public function exchange(Enrollment $enrollment): Enrollment
93
    {
94
        $fromShiftId = $this->shift_id;
95
        $this->shift()->associate($enrollment->shift_id);
96
        $enrollment->shift()->associate($fromShiftId);
97
98
        $this->save();
99
        $enrollment->save();
100
101
        return $this;
102
    }
103
104
    /**
105
     * Get exchanges of this enrollment as source.
106
     *
107
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
108
     */
109
    public function exchangesAsSource()
110
    {
111
        return $this->hasMany(Exchange::class, 'from_enrollment_id');
112
    }
113
114
    /**
115
     * Get student of this enrollment.
116
     *
117
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
118
     */
119
    public function student()
120
    {
121
        return $this->belongsTo(Student::class);
122
    }
123
124
    /**
125
     * Get course of this enrollment.
126
     *
127
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
128
     */
129
    public function course()
130
    {
131
        return $this->belongsTo(Course::class);
132
    }
133
134
    /**
135
     * Get shift of this enrollment.
136
     *
137
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
138
     */
139
    public function shift()
140
    {
141
        return $this->belongsTo(Shift::class);
142
    }
143
144
    /**
145
     * Check whether this enrollment is available for exchange.
146
     *
147
     * @return bool
148
     */
149
    public function availableForExchange()
150
    {
151
        $isBeingExchanged = is_null($this->exchanges_as_source_count)
0 ignored issues
show
Bug introduced by
The property exchanges_as_source_count does not seem to exist on App\Judite\Models\Enrollment. Are you sure there is no database migration missing?

Checks if undeclared accessed properties appear in database migrations and if the creating migration is correct.

Loading history...
152
            ? $this->exchangesAsSource()->exists()
153
            : $this->exchanges_as_source_count > 0;
154
155
        return ! $isBeingExchanged && ! is_null($this->shift_id);
156
    }
157
}
158