Completed
Push — master ( 6ea7ff...8c9744 )
by Ariel
11:07
created

Appointment::scopeAffectingHumanresource()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2.0625

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 8
ccs 3
cts 4
cp 0.75
rs 9.4285
cc 2
eloc 4
nc 2
nop 2
crap 2.0625
1
<?php
2
3
namespace Timegridio\Concierge\Models;
4
5
use Carbon\Carbon;
6
use Illuminate\Database\Eloquent\Model as EloquentModel;
7
use McCool\LaravelAutoPresenter\HasPresenter;
8
use Timegridio\Concierge\Presenters\AppointmentPresenter;
9
10
/**
11
 * An Appointment can be understood as a reservation of a given Service,
12
 * provided by a given Business, targeted to a Contact, which will take place
13
 * on a determined Date and Time, and might have a duration and or comments.
14
 *
15
 * The Appointment can be issued by the Contact's User or by the Business owner.
16
 */
17
class Appointment extends EloquentModel implements HasPresenter
18
{
19
    /**
20
     * The attributes that are mass assignable.
21
     *
22
     * @var array
23
     */
24
    protected $fillable = [
25
        'issuer_id',
26
        'contact_id',
27
        'business_id',
28
        'service_id',
29
        'resource_id',
30
        'start_at',
31
        'finish_at',
32
        'duration',
33
        'comments',
34
    ];
35
36
    /**
37
     * The attributes that aren't mass assignable.
38
     *
39
     * @var array
40
     */
41
    protected $guarded = ['id', 'hash', 'status', 'vacancy_id'];
42
43
    /**
44
     * The attributes that should be mutated to dates.
45
     *
46
     * @var array
47
     */
48
    protected $dates = ['start_at', 'finish_at'];
49
50
    /**
51
     * Appointment Hard Status Constants.
52
     */
53
    const STATUS_RESERVED = 'R';
54
    const STATUS_CONFIRMED = 'C';
55
    const STATUS_ANNULATED = 'A';
56
    const STATUS_SERVED = 'S';
57
58
    ///////////////
59
    // PRESENTER //
60
    ///////////////
61
62
    /**
63
     * Get Presenter Class.
64
     *
65
     * @return App\Presenters\AppointmentPresenter
66
     */
67 1
    public function getPresenterClass()
68
    {
69 1
        return AppointmentPresenter::class;
70
    }
71
72
    /**
73
     * Generate hash and save the model to the database.
74
     *
75
     * @param array $options
76
     *
77
     * @return bool
78
     */
79 29
    public function save(array $options = [])
80
    {
81 29
        $this->doHash();
82
83 29
        return parent::save($options);
84
    }
85
86
    ///////////////////
87
    // Relationships //
88
    ///////////////////
89
90
    /**
91
     * Get the issuer (the User that generated the Appointment).
92
     *
93
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
94
     */
95 4
    public function issuer()
96
    {
97 4
        return $this->belongsTo(config('auth.providers.users.model'));
98
    }
99
100
    /**
101
     * Get the target Contact (for whom is reserved the Appointment).
102
     *
103
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
104
     */
105 4
    public function contact()
106
    {
107 4
        return $this->belongsTo(Contact::class);
108
    }
109
110
    /**
111
     * Get the holding Business (that has taken the reservation).
112
     *
113
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
114
     */
115 10
    public function business()
116
    {
117 10
        return $this->belongsTo(Business::class);
118
    }
119
120
    /**
121
     * Get the reserved Service.
122
     *
123
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
124
     */
125 8
    public function service()
126
    {
127 8
        return $this->belongsTo(Service::class);
128
    }
129
130
    /**
131
     * Humanresource.
132
     *
133
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
134
     */
135 4
    public function humanresource()
136
    {
137 4
        return $this->belongsTo(Humanresource::class);
138
    }
139
140
    /**
141
     * Get the Vacancy (that justifies the availability of resources for the
142
     * Appointment generation).
143
     *
144
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
145
     */
146 6
    public function vacancy()
147
    {
148 6
        return $this->belongsTo(Vacancy::class);
149
    }
150
151
    ///////////
152
    // Other //
153
    ///////////
154
155
    /**
156
     * Get the User through Contact.
157
     *
158
     * @return User
159
     */
160 2
    public function user()
161
    {
162 2
        return $this->contact->user;
0 ignored issues
show
Documentation introduced by
The property contact does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
163
    }
164
165
    /**
166
     * Determine if the new Appointment will hash-crash with another existing
167
     * Appointment.
168
     *
169
     * @return bool
170
     */
171 5
    public function duplicates()
172
    {
173 5
        return !self::where('hash', $this->hash)->get()->isEmpty();
0 ignored issues
show
Documentation introduced by
The property hash does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
174
    }
175
176 2
    public function duration()
177
    {
178 2
        return $this->start_at->diffInMinutes($this->finish_at);
0 ignored issues
show
Documentation introduced by
The property start_at does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
Documentation introduced by
The property finish_at does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
179
    }
180
181
    ///////////////
182
    // Accessors //
183
    ///////////////
184
185
    /**
186
     * Get Hash.
187
     *
188
     * @return string
189
     */
190 8
    public function getHashAttribute()
191
    {
192 8
        return isset($this->attributes['hash'])
193 8
            ? $this->attributes['hash']
194 8
            : $this->doHash();
195
    }
196
197
    /**
198
     * Get Finish At:
199
     * Calculates the start_at time plus duration in minutes.
200
     *
201
     * @return Carbon
202
     */
203 3
    public function getFinishAtAttribute()
204
    {
205 3
        if (array_get($this->attributes, 'finish_at') !== null) {
206
            return Carbon::parse($this->attributes['finish_at']);
207
        }
208
209 3
        if (is_numeric($this->duration)) {
0 ignored issues
show
Documentation introduced by
The property duration does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
210 3
            return $this->start_at->addMinutes($this->duration);
0 ignored issues
show
Documentation introduced by
The property start_at does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
Documentation introduced by
The property duration does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
211
        }
212
213
        return $this->start_at;
0 ignored issues
show
Documentation introduced by
The property start_at does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
214
    }
215
216
    /**
217
     * Get annulation deadline (target date).
218
     *
219
     * @return Carbon\Carbon
220
     */
221
    public function getAnnulationDeadlineAttribute()
222
    {
223
        $hours = $this->business->pref('appointment_annulation_pre_hs');
0 ignored issues
show
Documentation introduced by
The property business does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
224
225
        return $this->start_at
0 ignored issues
show
Documentation introduced by
The property start_at does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
226
                    ->subHours($hours)
227
                    ->timezone($this->business->timezone);
0 ignored issues
show
Documentation introduced by
The property business does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
228
    }
229
230
    /**
231
     * Get the human readable status name.
232
     *
233
     * @return string
234
     */
235
    public function getStatusLabelAttribute()
236
    {
237
        $labels = [
238
            Self::STATUS_RESERVED  => 'reserved',
239
            Self::STATUS_CONFIRMED => 'confirmed',
240
            Self::STATUS_ANNULATED => 'annulated',
241
            Self::STATUS_SERVED    => 'served',
242
            ];
243
244
        return array_key_exists($this->status, $labels)
0 ignored issues
show
Documentation introduced by
The property status does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
245
            ? $labels[$this->status]
0 ignored issues
show
Documentation introduced by
The property status does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
246
            : '';
247
    }
248
249
    /**
250
     * Get the date of the Appointment.
251
     *
252
     * @return string
253
     */
254 3
    public function getDateAttribute()
255
    {
256 3
        return $this->start_at
0 ignored issues
show
Documentation introduced by
The property start_at does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
257 3
                    ->timezone($this->business->timezone)
0 ignored issues
show
Documentation introduced by
The property business does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
258 3
                    ->toDateString();
259
    }
260
261
    /**
262
     * Get user-friendly unique identification code.
263
     *
264
     * @return string
265
     */
266 2
    public function getCodeAttribute()
267
    {
268 2
        $length = $this->business->pref('appointment_code_length');
0 ignored issues
show
Documentation introduced by
The property business does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
269
270 2
        return strtoupper(substr($this->hash, 0, $length));
0 ignored issues
show
Documentation introduced by
The property hash does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
271
    }
272
273
    //////////////
274
    // Mutators //
275
    //////////////
276
277
    /**
278
     * Generate Appointment hash.
279
     *
280
     * @return string
281
     */
282 29
    public function doHash()
283
    {
284 29
        return $this->attributes['hash'] = md5(
285 29
            $this->start_at.'/'.
0 ignored issues
show
Documentation introduced by
The property start_at does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
286 29
            $this->contact_id.'/'.
0 ignored issues
show
Documentation introduced by
The property contact_id does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
287 29
            $this->business_id.'/'.
0 ignored issues
show
Documentation introduced by
The property business_id does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
288 29
            $this->service_id
0 ignored issues
show
Documentation introduced by
The property service_id does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
289 29
        );
290
    }
291
292
    /**
293
     * Set start at.
294
     *
295
     * @param Carbon $datetime
296
     */
297 29
    public function setStartAtAttribute(Carbon $datetime)
298
    {
299 29
        $this->attributes['start_at'] = $datetime;
300 29
    }
301
302
    /**
303
     * Set finish_at attribute.
304
     *
305
     * @param Carbon $datetime
306
     */
307 10
    public function setFinishAtAttribute(Carbon $datetime)
308
    {
309 10
        $this->attributes['finish_at'] = $datetime;
310 10
    }
311
312
    /**
313
     * Set Comments.
314
     *
315
     * @param string $comments
316
     */
317 29
    public function setCommentsAttribute($comments)
318
    {
319 29
        $this->attributes['comments'] = trim($comments) ?: null;
320 29
    }
321
322
    /////////////////
323
    // HARD STATUS //
324
    /////////////////
325
326
    /**
327
     * Determine if is Reserved.
328
     *
329
     * @return bool
330
     */
331 1
    public function isReserved()
332
    {
333 1
        return $this->status == Self::STATUS_RESERVED;
0 ignored issues
show
Documentation introduced by
The property status does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
334
    }
335
336
    ///////////////////////////
337
    // Calculated attributes //
338
    ///////////////////////////
339
340
    /**
341
     * Appointment Status Workflow.
342
     *
343
     * Hard Status: Those concrete values stored in DB
344
     * Soft Status: Those values calculated from stored values in DB
345
     *
346
     * Suggested transitions (Binding is not mandatory)
347
     *     Reserved -> Confirmed -> Served
348
     *     Reserved -> Served
349
     *     Reserved -> Annulated
350
     *     Reserved -> Confirmed -> Annulated
351
     *
352
     * Soft Status
353
     *     (Active)   [ Reserved  | Confirmed ]
354
     *     (InActive) [ Annulated | Served    ]
355
     */
356
357
    /**
358
     * Determine if is Active.
359
     *
360
     * @return bool
361
     */
362 5
    public function isActive()
363
    {
364
        return
365 5
            $this->status == Self::STATUS_CONFIRMED ||
0 ignored issues
show
Documentation introduced by
The property status does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
366 5
            $this->status == Self::STATUS_RESERVED;
0 ignored issues
show
Documentation introduced by
The property status does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
367
    }
368
369
    /**
370
     * Determine if is Pending.
371
     *
372
     * @return bool
373
     */
374 3
    public function isPending()
375
    {
376 3
        return $this->isActive() && $this->isFuture();
377
    }
378
379
    /**
380
     * Determine if is Future.
381
     *
382
     * @return bool
383
     */
384 4
    public function isFuture()
385
    {
386 4
        return !$this->isDue();
387
    }
388
389
    /**
390
     * Determine if is due.
391
     *
392
     * @return bool
393
     */
394 5
    public function isDue()
395
    {
396 5
        return $this->start_at->isPast();
0 ignored issues
show
Documentation introduced by
The property start_at does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
397
    }
398
399
    ////////////
400
    // Scopes //
401
    ////////////
402
403
    /**
404
     * Scope to Business.
405
     *
406
     * @param Illuminate\Database\Query $query
407
     *
408
     * @return Illuminate\Database\Query
409
     */
410 1
    public function scopeOfBusiness($query, $businessId)
411
    {
412 1
        return $query->where('business_id', $businessId);
413
    }
414
415
    /////////////////////////
416
    // Hard Status Scoping //
417
    /////////////////////////
418
419
    /**
420
     * Scope to Contacts Collection.
421
     *
422
     * @param Illuminate\Database\Query $query
423
     *
424
     * @return Illuminate\Database\Query
425
     */
426
    public function scopeForContacts($query, $contacts)
427
    {
428
        return $query->whereIn('contact_id', $contacts->pluck('id'));
429
    }
430
431
    /**
432
     * Scope to Unarchived Appointments.
433
     *
434
     * @param Illuminate\Database\Query $query
435
     *
436
     * @return Illuminate\Database\Query
437
     */
438
    public function scopeUnarchived($query)
439
    {
440
        return $query
441
            ->where(function ($query) {
442
                $query->whereIn('status', [Self::STATUS_RESERVED, Self::STATUS_CONFIRMED])
443
                    ->where('start_at', '<=', Carbon::parse('today midnight')->timezone('UTC'))
444
                    ->orWhere(function ($query) {
445
                        $query->where('start_at', '>=', Carbon::parse('today midnight')->timezone('UTC'));
446
                    });
447
            });
448
    }
449
450
    /**
451
     * Scope to Served Appointments.
452
     *
453
     * @param Illuminate\Database\Query $query
454
     *
455
     * @return Illuminate\Database\Query
456
     */
457
    public function scopeServed($query)
458
    {
459
        return $query->where('status', '=', Self::STATUS_SERVED);
460
    }
461
462
    /**
463
     * Scope to Annulated Appointments.
464
     *
465
     * @param Illuminate\Database\Query $query
466
     *
467
     * @return Illuminate\Database\Query
468
     */
469
    public function scopeAnnulated($query)
470
    {
471
        return $query->where('status', '=', Self::STATUS_ANNULATED);
472
    }
473
474
    /////////////////////////
475
    // Soft Status Scoping //
476
    /////////////////////////
477
478
    /**
479
     * Scope to not Served Appointments.
480
     *
481
     * @param Illuminate\Database\Query $query
482
     *
483
     * @return Illuminate\Database\Query
484
     */
485
    public function scopeUnServed($query)
486
    {
487
        return $query->where('status', '<>', Self::STATUS_SERVED);
488
    }
489
490
    /**
491
     * Scope to Active Appointments.
492
     *
493
     * @param Illuminate\Database\Query $query
494
     *
495
     * @return Illuminate\Database\Query
496
     */
497 18
    public function scopeActive($query)
498
    {
499 18
        return $query->whereIn('status', [Self::STATUS_RESERVED, Self::STATUS_CONFIRMED]);
500
    }
501
502
    /**
503
     * Scope of date.
504
     *
505
     * @param Illuminate\Database\Query $query
506
     * @param Carbon                    $date
507
     *
508
     * @return Illuminate\Database\Query
509
     */
510
    public function scopeOfDate($query, Carbon $date)
511
    {
512
        return $query->whereRaw('date(`start_at`) = ?', [$date->timezone('UTC')->toDateString()]);
513
    }
514
515
    /**
516
     * Between Dates.
517
     *
518
     * @param Illuminate\Database\Query $query
519
     * @param Carbon                    $startAt
520
     * @param Carbon                    $finishAt
521
     *
522
     * @return Illuminate\Database\Query
523
     */
524 12
    public function scopeAffectingInterval($query, Carbon $startAt, Carbon $finishAt)
525
    {
526
        return $query
527
            ->where(function ($query) use ($startAt, $finishAt) {
528
529 View Code Duplication
                $query->where(function ($query) use ($startAt, $finishAt) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
530 12
                    $query->where('finish_at', '>=', $finishAt->timezone('UTC'))
531 12
                            ->where('start_at', '<=', $startAt->timezone('UTC'));
532 12
                })
533 View Code Duplication
                ->orWhere(function ($query) use ($startAt, $finishAt) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
534 12
                    $query->where('finish_at', '<', $finishAt->timezone('UTC'))
535 12
                            ->where('finish_at', '>', $startAt->timezone('UTC'));
536 12
                })
537 View Code Duplication
                ->orWhere(function ($query) use ($startAt, $finishAt) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
538 12
                    $query->where('start_at', '>', $startAt->timezone('UTC'))
539 12
                            ->where('start_at', '<', $finishAt->timezone('UTC'));
540 12
                })
541 12 View Code Duplication
                ->orWhere(function ($query) use ($startAt, $finishAt) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
542 12
                    $query->where('start_at', '>', $startAt->timezone('UTC'))
543 12
                            ->where('finish_at', '<', $finishAt->timezone('UTC'));
544 12
                });
545
546 12
            });
547
    }
548
549
    /**
550
     * Scope Affecting Humanresource.
551
     *
552
     * @param Illuminate\Database\Query $query
553
     *
554
     * @return Illuminate\Database\Query
555
     */
556 12
    public function scopeAffectingHumanresource($query, $humanresourceId)
557
    {
558 12
        if (is_null($humanresourceId)) {
559 12
            return $query;
560
        }
561
562
        return $query->where('humanresource_id', $humanresourceId);
563
    }
564
565
    //////////////////////////
566
    // Soft Status Checkers //
567
    //////////////////////////
568
569
    /**
570
     * User is target contact of the appointment.
571
     *
572
     * @param int $userId
573
     *
574
     * @return bool
575
     */
576
    public function isTarget($userId)
577
    {
578
        return $this->contact->isProfileOf($userId);
0 ignored issues
show
Documentation introduced by
The property contact does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
579
    }
580
581
    /**
582
     * User is issuer of the appointment.
583
     *
584
     * @param int $userId
585
     *
586
     * @return bool
587
     */
588
    public function isIssuer($userId)
589
    {
590
        return $this->issuer->id == $userId;
0 ignored issues
show
Documentation introduced by
The property issuer does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
591
    }
592
593
    /**
594
     * User is owner of business.
595
     *
596
     * @param int $userId
597
     *
598
     * @return bool
599
     */
600
    public function isOwner($userId)
601
    {
602
        return $this->business->owners->contains($userId);
0 ignored issues
show
Documentation introduced by
The property business does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
603
    }
604
605
    /**
606
     * can be annulated by user.
607
     *
608
     * @param int $userId
609
     *
610
     * @return bool
611
     */
612
    public function canAnnulate($userId)
613
    {
614
        return $this->isOwner($userId) ||
615
            ($this->isIssuer($userId) && $this->isOnTimeToAnnulate()) ||
616
            ($this->isTarget($userId) && $this->isOnTimeToAnnulate());
617
    }
618
619
    /**
620
     * Determine if it is still possible to annulate according business policy.
621
     *
622
     * @return bool
623
     */
624
    public function isOnTimeToAnnulate()
625
    {
626
        $graceHours = $this->business->pref('appointment_annulation_pre_hs');
0 ignored issues
show
Documentation introduced by
The property business does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
627
628
        $diff = $this->start_at->diffInHours(Carbon::now());
0 ignored issues
show
Documentation introduced by
The property start_at does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
629
630
        return intval($diff) >= intval($graceHours);
631
    }
632
633
    /**
634
     * can Serve.
635
     *
636
     * @param int $userId
637
     *
638
     * @return bool
639
     */
640
    public function canServe($userId)
641
    {
642
        return $this->isOwner($userId);
643
    }
644
645
    /**
646
     * can confirm.
647
     *
648
     * @param int $userId
649
     *
650
     * @return bool
651
     */
652
    public function canConfirm($userId)
653
    {
654
        return $this->isIssuer($userId) || $this->isOwner($userId);
655
    }
656
657
    /**
658
     * is Serveable by user.
659
     *
660
     * @param int $userId
661
     *
662
     * @return bool
663
     */
664
    public function isServeableBy($userId)
665
    {
666
        return $this->isServeable() && $this->canServe($userId);
667
    }
668
669
    /**
670
     * is Confirmable By user.
671
     *
672
     * @param int $userId
673
     *
674
     * @return bool
675
     */
676
    public function isConfirmableBy($userId)
677
    {
678
        return
679
            $this->isConfirmable() &&
680
            $this->shouldConfirmBy($userId) &&
681
            $this->canConfirm($userId);
682
    }
683
684
    /**
685
     * is Annulable By user.
686
     *
687
     * @param int $userId
688
     *
689
     * @return bool
690
     */
691
    public function isAnnulableBy($userId)
692
    {
693
        return $this->isAnnulable() && $this->canAnnulate($userId);
694
    }
695
696
    /**
697
     * Determine if the queried userId may confirm the appointment or not.
698
     *
699
     * @param int $userId
700
     *
701
     * @return bool
702
     */
703
    public function shouldConfirmBy($userId)
704
    {
705
        return ($this->isSelfIssued() && $this->isOwner($userId)) ||
706
               ($this->isOwner($this->issuer->id) && $this->isIssuer($userId));
0 ignored issues
show
Documentation introduced by
The property issuer does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
707
    }
708
709
    /**
710
     * Determine if the target Contact's User is the same of the Appointment
711
     * issuer User.
712
     *
713
     * @return bool
714
     */
715
    public function isSelfIssued()
716
    {
717
        if (!$this->issuer) {
0 ignored issues
show
Documentation introduced by
The property issuer does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
718
            return false;
719
        }
720
        if (!$this->contact) {
0 ignored issues
show
Documentation introduced by
The property contact does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
721
            return false;
722
        }
723
        if (!$this->contact->user) {
0 ignored issues
show
Documentation introduced by
The property contact does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
724
            return false;
725
        }
726
727
        return $this->issuer->id == $this->contact->user->id;
0 ignored issues
show
Documentation introduced by
The property issuer does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
Documentation introduced by
The property contact does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
728
    }
729
730
    /**
731
     * Determine if the Serve action can be performed.
732
     *
733
     * @return bool
734
     */
735 1
    public function isServeable()
736
    {
737 1
        return $this->isActive() && $this->isDue();
738
    }
739
740
    /**
741
     * Determine if the Confirm action can be performed.
742
     *
743
     * @return bool
744
     */
745 1
    public function isConfirmable()
746
    {
747 1
        return $this->status == self::STATUS_RESERVED && $this->isFuture();
0 ignored issues
show
Documentation introduced by
The property status does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
748
    }
749
750
    /**
751
     * Determine if the Annulate action can be performed.
752
     *
753
     * @return bool
754
     */
755 1
    public function isAnnulable()
756
    {
757 1
        return $this->isActive();
758
    }
759
760
    /////////////////////////
761
    // Hard Status Actions //
762
    /////////////////////////
763
764
    /**
765
     * Check and perform Confirm action.
766
     *
767
     * @return $this
768
     */
769 5
    public function doReserve()
770
    {
771 5
        if ($this->status === null) {
0 ignored issues
show
Documentation introduced by
The property status does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
772 5
            $this->status = self::STATUS_RESERVED;
0 ignored issues
show
Documentation introduced by
The property status does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
773 5
        }
774
775 5
        return $this;
776
    }
777
778
    /**
779
     * Check and perform Confirm action.
780
     *
781
     * @return $this
782
     */
783 2
    public function doConfirm()
784
    {
785 2
        if ($this->isConfirmable()) {
786 2
            $this->status = self::STATUS_CONFIRMED;
0 ignored issues
show
Documentation introduced by
The property status does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
787
788 2
            $this->save();
789 2
        }
790
791 2
        return $this;
792
    }
793
794
    /**
795
     * Check and perform Annulate action.
796
     *
797
     * @return $this
798
     */
799 2
    public function doAnnulate()
800
    {
801 2
        if ($this->isAnnulable()) {
802 1
            $this->status = self::STATUS_ANNULATED;
0 ignored issues
show
Documentation introduced by
The property status does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
803
804 1
            $this->save();
805 1
        }
806
807 2
        return $this;
808
    }
809
810
    /**
811
     * Check and perform Serve action.
812
     *
813
     * @return $this
814
     */
815 3
    public function doServe()
816
    {
817 3
        if ($this->isServeable()) {
818 1
            $this->status = self::STATUS_SERVED;
0 ignored issues
show
Documentation introduced by
The property status does not exist on object<Timegridio\Concierge\Models\Appointment>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
819
820 1
            $this->save();
821 1
        }
822
823 3
        return $this;
824
    }
825
}
826