Completed
Push — feature/display-last-full-day ( dc3e73 )
by Xander
15s queued 10s
created

JobPoster::setPublishedAttribute()   A

Complexity

Conditions 5
Paths 3

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 5

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 8
rs 9.6111
c 0
b 0
f 0
ccs 6
cts 6
cp 1
cc 5
nc 3
nop 1
crap 5
1
<?php
2
3
/**
4
 * Created by Reliese Model.
5
 * Date: Thu, 12 Jul 2018 22:39:27 +0000.
6
 */
0 ignored issues
show
Coding Style introduced by
Missing @link tag in file comment
Loading history...
Coding Style introduced by
Missing @category tag in file comment
Loading history...
Coding Style introduced by
Missing @author tag in file comment
Loading history...
Coding Style introduced by
PHP version not specified
Loading history...
Coding Style introduced by
Missing @package tag in file comment
Loading history...
Coding Style introduced by
Missing @license tag in file comment
Loading history...
7
8
namespace App\Models;
9
10
use App\Events\JobSaved;
11
use App\Models\JobApplication;
12
use Illuminate\Notifications\Notifiable;
13
use Illuminate\Support\Facades\App;
14
use Illuminate\Support\Facades\Lang;
15
use Jenssegers\Date\Date;
16
use \Backpack\CRUD\CrudTrait;
17
18
/**
19
 * Class JobPoster
20
 *
21
 * @property int $id
22
 * @property int $job_term_id
23
 * @property int $term_qty
24
 * @property \Jenssegers\Date\Date $open_date_time
25
 * @property \Jenssegers\Date\Date $close_date_time
26
 * @property \Jenssegers\Date\Date $start_date_time
27
 * @property \Jenssegers\Date\Date $review_requested_at
28
 * @property \Jessengers\Date\Date $published_at
29
 * @property int $department_id
30
 * @property int $province_id
31
 * @property int $salary_min
32
 * @property int $salary_max
33
 * @property int $noc
34
 * @property string $classification
35
 * @property int $security_clearance_id
36
 * @property int $language_requirement_id
37
 * @property boolean $remote_work_allowed
38
 * @property int $manager_id
39
 * @property boolean $published
40
 * @property \Jenssegers\Date\Date $created_at
41
 * @property \Jenssegers\Date\Date $updated_at
42
 *
43
 * @property int $submitted_applications_count
44
 *
45
 * @property \App\Models\Lookup\Department $department
46
 * @property \App\Models\Lookup\JobTerm $job_term
47
 * @property \App\Models\Lookup\LanguageRequirement $language_requirement
48
 * @property \App\Models\Manager $manager
49
 * @property \App\Models\Lookup\Province $province
50
 * @property \App\Models\Lookup\SecurityClearance $security_clearance
51
 * @property \Illuminate\Database\Eloquent\Collection $criteria
52
 * @property \Illuminate\Database\Eloquent\Collection $job_applications
53
 * @property \Illuminate\Database\Eloquent\Collection $job_poster_key_tasks
54
 * @property \Illuminate\Database\Eloquent\Collection $job_poster_questions
55
 * @property \Illuminate\Database\Eloquent\Collection $job_poster_translations
56
 * @property \Illuminate\Database\Eloquent\Collection $submitted_applications
57
 * @property \Illuminate\Database\Eloquent\Collection[ScreeningPlan] $screening_plans
58
 *
59
 * Localized Properties:
60
 * @property string $city
61
 * @property string $title
62
 * @property string $impact
63
 * @property string $branch
64
 * @property string $division
65
 * @property string $education
66
 *
67
 * Methods
68
 * @method boolean isOpen()
0 ignored issues
show
Coding Style introduced by
Tag value indented incorrectly; expected 3 spaces but found 1
Loading history...
69
 * @method string timeRemaining()
0 ignored issues
show
Coding Style introduced by
Tag value indented incorrectly; expected 3 spaces but found 1
Loading history...
70
 */
0 ignored issues
show
Documentation Bug introduced by
The doc comment \Illuminate\Database\Elo...llection[ScreeningPlan] at position 1 could not be parsed: Expected ']' at position 1, but found '['.
Loading history...
Coding Style introduced by
Missing @category tag in class comment
Loading history...
Coding Style introduced by
Missing @package tag in class comment
Loading history...
Coding Style introduced by
Missing @author tag in class comment
Loading history...
Coding Style introduced by
Missing @license tag in class comment
Loading history...
Coding Style introduced by
Missing @link tag in class comment
Loading history...
71
class JobPoster extends BaseModel
72
{
73
    use CrudTrait;
0 ignored issues
show
introduced by
The trait Backpack\CRUD\CrudTrait requires some properties which are not provided by App\Models\JobPoster: $Type, $fakeColumns
Loading history...
74
    use \Dimsav\Translatable\Translatable;
0 ignored issues
show
introduced by
The trait Dimsav\Translatable\Translatable requires some properties which are not provided by App\Models\JobPoster: $translations, $useTranslationFallback, $translationModel, $localeKey, $translationForeignKey
Loading history...
75
    use Notifiable;
0 ignored issues
show
introduced by
The trait Illuminate\Notifications\Notifiable requires some properties which are not provided by App\Models\JobPoster: $email, $phone_number
Loading history...
76
77
    const DATE_FORMAT = [
78
        'en' => 'M jS, Y',
79
        'fr' => 'd M Y',
80
    ];
81
    const TIME_FORMAT = [
82
        'en' => 'h:i A T',
83
        'fr' => 'H \h i T',
84
    ];
85
    const TIMEZONE = 'America/Toronto';
86
87
    /**
0 ignored issues
show
Coding Style introduced by
Missing short description in doc comment
Loading history...
88
     * @var string[] $translatedAttributes
89
     */
90
    public $translatedAttributes = [
91
        'city',
92
        'title',
93
        'impact',
94
        'branch',
95
        'division',
96
        'education'
97
    ];
98
99
    /**
0 ignored issues
show
Coding Style introduced by
Missing short description in doc comment
Loading history...
100
     * @var string[] $casts
101
     */
102
    protected $casts = [
103
        'job_term_id' => 'int',
104
        'department_id' => 'int',
105
        'province_id' => 'int',
106
        'salary_min' => 'int',
107
        'salary_max' => 'int',
108
        'noc' => 'int',
109
        'security_clearance_id' => 'int',
110
        'language_requirement_id' => 'int',
111
        'remote_work_allowed' => 'boolean',
112
        'manager_id' => 'int',
113
        'published' => 'boolean'
114
    ];
115
116
    /**
0 ignored issues
show
Coding Style introduced by
Missing short description in doc comment
Loading history...
117
     * @var string[] $dates
118
     */
119
    protected $dates = [
120
        'open_date_time',
121
        'close_date_time',
122
        'start_date_time',
123
        'review_requested_at',
124
        'published_at'
125
    ];
126
127
    /**
0 ignored issues
show
Coding Style introduced by
Missing short description in doc comment
Loading history...
128
     * @var string[] $fillable
129
     */
130
    protected $fillable = [
131
        'job_term_id',
132
        'term_qty',
133
        'open_date_time',
134
        'close_date_time',
135
        'start_date_time',
136
        'department_id',
137
        'province_id',
138
        'salary_min',
139
        'salary_max',
140
        'noc',
141
        'classification',
142
        'security_clearance_id',
143
        'language_requirement_id',
144
        'remote_work_allowed',
145
        'published'
146
    ];
147
    // protected $withCount = ['submitted_applications'];
148
149
    /**
0 ignored issues
show
Coding Style introduced by
Missing short description in doc comment
Loading history...
150
     * @var mixed[] $dispatchesEvents
151
     */
152
    protected $dispatchesEvents = [
153
        'saved' => JobSaved::class,
154
    ];
155
156
    // @codeCoverageIgnoreStart
157
158
    public function department() // phpcs:ignore
159
    {
160
        return $this->belongsTo(\App\Models\Lookup\Department::class);
161
    }
162
163
    public function job_term() // phpcs:ignore
164
    {
165
        return $this->belongsTo(\App\Models\Lookup\JobTerm::class);
166
    }
167
168
    public function language_requirement() // phpcs:ignore
169
    {
170
        return $this->belongsTo(\App\Models\Lookup\LanguageRequirement::class);
171
    }
172
173
    public function manager() // phpcs:ignore
174
    {
175
        return $this->belongsTo(\App\Models\Manager::class);
176
    }
177
178
    public function province() // phpcs:ignore
179
    {
180
        return $this->belongsTo(\App\Models\Lookup\Province::class);
181
    }
182
183
    public function security_clearance() // phpcs:ignore
184
    {
185
        return $this->belongsTo(\App\Models\Lookup\SecurityClearance::class);
186
    }
187
188
    public function criteria() // phpcs:ignore
189
    {
190
        return $this->hasMany(\App\Models\Criteria::class);
191
    }
192
193
    public function job_applications() // phpcs:ignore
194
    {
195
        return $this->hasMany(\App\Models\JobApplication::class);
196
    }
197
198
    public function job_poster_key_tasks() // phpcs:ignore
199
    {
200
        return $this->hasMany(\App\Models\JobPosterKeyTask::class);
201
    }
202
203
    public function job_poster_questions() // phpcs:ignore
204
    {
205
        return $this->hasMany(\App\Models\JobPosterQuestion::class);
206
    }
207
208
    public function job_poster_translations() // phpcs:ignore
209
    {
210
        return $this->hasMany(\App\Models\JobPosterTranslation::class);
211
    }
212
213
    public function screening_plans() // phpcs:ignore
214
    {
215
        return $this->hasMany(\App\Models\ScreeningPlan::class);
216
    }
217
218
    // Artificial Relations
219
220
    public function submitted_applications()
0 ignored issues
show
Coding Style introduced by
Public method name "JobPoster::submitted_applications" is not in camel caps format
Loading history...
Coding Style introduced by
You must use "/**" style comments for a function comment
Loading history...
221
    {
222
        return $this->job_applications()->whereDoesntHave('application_status', function ($query) : void {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
223
            $query->where('name', 'draft');
224
        });
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
225
    }
226
227
    // @codeCoverageIgnoreEnd
228
229
    // Accessors
230
231
    // Mutators
232
233
    /**
234
     * Intercept setting the "published" attribute, and set the
235
     * "published_at" timestamp if true.
236
     *
237
     * @param mixed $value Incoming value for the 'published' attribute.
238
     *
239
     * @return void
240
     */
241 40
    public function setPublishedAttribute($value) : void
242
    {
243 40
        if ($value && $this->open_date_time->isPast()) {
244 30
            $this->attributes['published_at'] = new Date();
245 34
        } elseif ($value && $this->open_date_time->isFuture()) {
246 2
            $this->attributes['published_at'] = $this->open_date_time;
247
        }
248 40
        $this->attributes['published'] = $value;
249 40
    }
250
251
    // Methods
252
253 10
    public function submitted_applications_count()
0 ignored issues
show
Coding Style introduced by
Public method name "JobPoster::submitted_applications_count" is not in camel caps format
Loading history...
Coding Style introduced by
You must use "/**" style comments for a function comment
Loading history...
254
    {
255 10
        return $this->submitted_applications()->count();
256
    }
257
258
    /**
259
     * Formatted and localized date and time the Job Poster closes.
260
     *
261
     * @return string[]
262
     */
263 6
    public function applyBy() : array
264
    {
265 6
        $localCloseDate = new Date($this->close_date_time); // This initializes the date object in UTC time
266 6
        $localCloseDate->setTimezone(new \DateTimeZone(self::TIMEZONE)); // Then set the time zone for display
267
        $displayDate = [
268 6
            'date' => $localCloseDate->format(self::DATE_FORMAT[App::getLocale()]),
269 6
            'time' => $localCloseDate->format(self::TIME_FORMAT[App::getLocale()])
270
        ];
271
272 6
        if (App::isLocale('fr')) {
273
            $displayDate['time'] = str_replace(['EST', 'EDT'], ['HNE', 'HAE'], $displayDate['time']);
274
        }
275
276 6
        return $displayDate;
277
    }
278
279
    /**
280
     * Return whether the Job is Open or Closed.
281
     * Used by the Admin Portal JobPosterCrudController.
282
     *
283
     * @return string
284
     */
285
    public function displayStatus() : string
286
    {
287
        return $this->isOpen() ? 'Open' : 'Closed';
288
    }
289
290
    /**
291
     * Check if a Job Poster is open for applications.
292
     *
293
     * @return boolean
294
     */
295 12
    public function isOpen() : bool
296
    {
297 12
        return $this->published
298 12
            && $this->open_date_time->isPast()
299 12
            && $this->close_date_time->isFuture();
300
    }
301
302
    /**
303
     * Check if a Job Poster is closed for applications.
304
     *
305
     * @return boolean
306
     */
307 8
    public function isClosed() : bool
308
    {
309 8
        return $this->published
310 8
            && $this->open_date_time->isPast()
311 8
            && $this->close_date_time->isPast();
312
    }
313
314
    /**
315
     * Calculate the remaining time a Job Poster is open.
316
     *
317
     * @return string
318
     */
319 2
    public function timeRemaining() : string
320
    {
321 2
        $interval = $this->close_date_time->diff(Date::now());
322
323 2
        $d = $interval->d;
324 2
        $h = $interval->h;
325 2
        $m = $interval->i;
326 2
        $s = $interval->s;
327
328 2
        if ($d > 0) {
329 2
            $unit = 'day';
330 2
            $count = $d;
331 2
        } elseif ($h > 0) {
332 2
            $unit = 'hour';
333 2
            $count = $h;
334 2
        } elseif ($m > 0) {
335 2
            $unit = 'minute';
336 2
            $count = $m;
337
        } else {
338 2
            $unit = 'second';
339 2
            $count = $s;
340
        }
341
342 2
        $key = "common/time.$unit";
343
344 2
        return Lang::choice($key, $count);
345
    }
346
347
    /**
348
     * Return the current status for the Job Poster.
349
     * Possible values are "draft", "submitted", "published" and "closed".
350
     *
351
     * @return string
352
     */
353 6
    public function status() : string
354
    {
355 6
        $status = 'draft';
356 6
        if ($this->isOpen()) {
357 2
            $status = 'published';
358 6
        } elseif ($this->isClosed()) {
359 2
            $status = 'closed';
360 6
        } elseif ($this->review_requested_at !== null) {
361 4
            $status = 'submitted';
362
        } else {
363 4
            $status = 'draft';
364
        }
365
366 6
        return $status;
367
    }
368
}
369