Completed
Push — develop ( f5bc45...3ea57c )
by
unknown
49:10 queued 12:24
created

Job::getSnapshotDraft()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
/**
3
 * YAWIK
4
 *
5
 * @copyright (c) 2013 - 2016 Cross Solution (http://cross-solution.de)
6
 * @license   MIT
7
 */
8
9
namespace Jobs\Entity;
10
11
use Core\Entity\AbstractIdentifiableModificationDateAwareEntity as BaseEntity;
12
use Core\Entity\ClonePropertiesTrait;
13
use Core\Entity\AttachableEntityTrait;
14
use Core\Entity\EntityInterface;
15
use Core\Entity\MetaDataProviderTrait;
16
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
17
use Doctrine\Common\Collections\Collection;
18
use Auth\Entity\UserInterface;
19
use Core\Entity\Permissions;
20
use Core\Entity\PermissionsInterface;
21
use Organizations\Entity\OrganizationInterface;
22
use Core\Entity\DraftableEntityInterface;
23
use Core\Entity\Collection\ArrayCollection;
24
use Core\Entity\SnapshotGeneratorProviderInterface;
25
use Zend\I18n\Validator\DateTime;
26
27
/**
28
 * The job model
29
 *
30
 * @ODM\Document(collection="jobs", repositoryClass="Jobs\Repository\Job")
31
 * @ODM\Indexes({
32
 *     @ODM\Index(keys={"datePublishStart.date"="asc"})
33
 * })
34
 *
35
 * @author Mathias Gelhausen <[email protected]>
36
 * @author Mathias Weitz <[email protected]>
37
 * @author Carsten Bleek <[email protected]>
38
 * @since 0.29 add temporary isDeleted flag and corresponding delete() method.
39
 */
40
class Job extends BaseEntity implements JobInterface,
0 ignored issues
show
Coding Style introduced by
The first item in a multi-line implements list must be on the line following the implements keyword
Loading history...
41
                                        DraftableEntityInterface,
0 ignored issues
show
Coding Style introduced by
Expected 4 spaces before interface name; 40 found
Loading history...
42
                                        SnapshotGeneratorProviderInterface
0 ignored issues
show
Coding Style introduced by
Expected 4 spaces before interface name; 40 found
Loading history...
43
44
{
0 ignored issues
show
Coding Style introduced by
Opening brace of a class must be on the line following the class declaration; found 1 line(s)
Loading history...
45
    use AttachableEntityTrait, MetaDataProviderTrait, ClonePropertiesTrait;
46
47
48
    private $cloneProperties = [
0 ignored issues
show
Unused Code introduced by
The property $cloneProperties is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
49
        'classifications', 'atsMode',
50
    ];
51
52
    /**
53
     * unique ID of a job posting used by applications to reference
54
     * a job
55
     *
56
     * @var String
57
     * @ODM\Field(type="string") @ODM\Index
58
     **/
59
    protected $applyId;
60
    
61
    /**
62
     * title of a job posting
63
     *
64
     * @var String
65
     * @ODM\Field(type="string")
66
     */
67
    protected $title;
68
    
69
70
    /**
71
     * name of the publishing company
72
     *
73
     * @var String
74
     * @ODM\Field(type="string")
75
     */
76
    protected $company;
77
    
78
    /**
79
     * publishing company
80
     *
81
     * @var OrganizationInterface
82
     * @ODM\ReferenceOne (targetDocument="\Organizations\Entity\Organization", simple=true, inversedBy="jobs")
83
     * @ODM\Index
84
     */
85
    protected $organization;
86
    
87
    
88
    /**
89
     * Email Address, which is used to send notifications about e.g. new applications.
90
     *
91
     * @var String
92
     * @ODM\Field(type="string")
93
     **/
94
    protected $contactEmail;
95
    
96
    /**
97
     * the owner of a Job Posting
98
     *
99
     * @var UserInterface $user
100
     * @ODM\ReferenceOne(targetDocument="\Auth\Entity\User", simple=true)
101
     * @ODM\Index
102
     */
103
    protected $user;
104
    
105
    /**
106
     * all applications of a certain jobad
107
     *
108
     * @var Collection
109
     * @ODM\ReferenceMany(targetDocument="Applications\Entity\Application", simple=true, mappedBy="job",
110
     *                    repositoryMethod="loadApplicationsForJob")
111
     */
112
    protected $applications;
113
    
114
    /**
115
     * new applications
116
     *
117
     * @ODM\ReferenceMany(targetDocument="Applications\Entity\Application",
118
     *                    repositoryMethod="loadUnreadApplicationsForJob", mappedBy="job")
119
     * @var Int
120
     */
121
    protected $unreadApplications;
122
    
123
    /**
124
     * language of the job posting. Languages are ISO 639-1 coded
125
     *
126
     * @var String
127
     * @ODM\Field(type="string")
128
     */
129
    protected $language;
130
    
131
    /**
132
     * location of the job posting. This is a plain text, which describes the location in
133
     * search e.g. results.
134
     *
135
     * @var String
136
     * @ODM\Field(type="string")
137
     */
138
    protected $location;
139
140
    /**
141
     * locations of the job posting. This collection contains structured coordinates,
142
     * postal codes, city, region, and country names
143
     *
144
     * @var Collection
145
     * @ODM\EmbedMany(targetDocument="Location")
146
     */
147
    protected $locations;
148
    
149
    /**
150
     * Link which points to the job posting
151
     *
152
     * @var String
153
     * @ODM\Field(type="string")
154
     **/
155
    protected $link;
156
    
157
    /**
158
     * publishing date of a job posting
159
     *
160
     * @var String
161
     * @ODM\Field(type="tz_date")
162
     */
163
    protected $datePublishStart;
164
165
    /**
166
     * end date of a job posting
167
     *
168
     * @var String
169
     * @ODM\Field(type="tz_date")
170
     */
171
    protected $datePublishEnd;
172
    
173
    /**
174
     * Status of the job posting
175
     *
176
     * @var Status
177
     * @ODM\EmbedOne(targetDocument="Status")
178
     * @ODM\Index
179
     */
180
    protected $status;
181
182
    /**
183
     * History on an job posting
184
     *
185
     * @var Collection
186
     * @ODM\EmbedMany(targetDocument="History")
187
     */
188
    protected $history;
189
190
    /**
191
     * Flag, privacy policy is accepted or not.
192
     *
193
     * @var bool
194
     * @ODM\Boolean
195
     */
196
    protected $termsAccepted;
197
    
198
    /**
199
     * Reference of a job opening, on which an applicant can refer to.
200
     *
201
     * @var String
202
     * @ODM\Field(type="string")
203
     */
204
    protected $reference;
205
    
206
    /**
207
     * Unified Resource Locator to the company-Logo
208
     *
209
     * @var String
210
     * @ODM\Field(type="string")
211
     */
212
    protected $logoRef;
213
214
    /**
215
     * Template-Name
216
     *
217
     * @var String
218
     * @ODM\Field(type="string")
219
     */
220
    protected $template;
221
222
    /**
223
     * Application link.
224
     *
225
     * @var String
226
     * @ODM\Field(type="string")
227
     */
228
    protected $uriApply;
229
230
    /**
231
     * Unified Resource Locator the Yawik, which handled this job first - so
232
     * does know who is the one who has commited this job.
233
     *
234
     * @var String
235
     * @ODM\Field(type="string")
236
     */
237
    protected $uriPublisher;
238
239
    /**
240
     * @var
241
     * @ODM\EmbedMany(targetDocument="Publisher")
242
     */
243
    protected $publisher;
244
245
    /**
246
     * The ATS mode entity.
247
     *
248
     * @var AtsMode
249
     * @ODM\EmbedOne(targetDocument="AtsMode")
250
     */
251
    protected $atsMode;
252
253
    /**
254
     * this must be enabled to use applications forms etc. for this job or
255
     * to see number of applications in the list of applications
256
     *
257
     * @var Boolean
258
     *
259
     * @ODM\Boolean
260
     */
261
    protected $atsEnabled;
262
    
263
    /**
264
     * Permissions
265
     *
266
     * @var PermissionsInterface
267
     * @ODM\EmbedOne(targetDocument="\Core\Entity\Permissions")
268
     */
269
    protected $permissions;
270
271
    /**
272
     * The actual name of the organization.
273
     *
274
     * @var TemplateValues
275
     * @ODM\EmbedOne(targetDocument="\Jobs\Entity\TemplateValues")
276
     */
277
    protected $templateValues;
278
279
280
    /**
281
     * Can contain various Portals
282
     *
283
     * @var array
284
     * @ODM\Collection*/
285
    protected $portals = array();
286
287
    /**
288
     * Flag indicating draft state of this job.
289
     *
290
     * @var bool
291
     * @ODM\Boolean
292
     */
293
    protected $isDraft = false;
294
295
    /**
296
     * Classifications
297
     *
298
     * @ODM\EmbedOne(targetDocument="\Jobs\Entity\Classifications")
299
     * @var Classifications
300
     * @since 0.29
301
     */
302
    protected $classifications;
303
304
    /**
305
     * Delete flag.
306
     *
307
     * @internal
308
     *      This is meant as a temporary flag, until
309
     *      SoftDelete is implemented.
310
     *
311
     * @ODM\Field(type="boolean")
312
     * @var bool
313
     * @since 0.29
314
     */
315
    protected $isDeleted = false;
316
317
    /**
318
     *
319
     * @ODM\ReferenceMany(targetDocument="\Jobs\Entity\JobSnapshot", mappedBy="snapshotEntity", sort={"snapshotMeta.dateCreated"="desc"})
320
     * @var JobSnapshot
321
     */
322
    protected $snapshots;
323
324
    /**
325
     * @ODM\ReferenceOne(targetDocument="\Jobs\Entity\JobSnapshot", mappedBy="snapshotEntity", criteria={"snapshotMeta.isDraft":true}, sort={"snapshotMeta.dateCreated"="desc"})
326
     *
327
     * @var
328
     */
329
    protected $latestSnapshotDraft;
330
331
332
    public function getSnapshots()
333
    {
334
        return $this->snapshots;
335
    }
336
337
    public function getSnapshotDraft()
338
    {
339
        return $this->latestSnapshotDraft;
340
    }
341
342
    public function hasSnapshotDraft()
343
    {
344
        return (bool) $this->getSnapshotDraft();
345
    }
346
347
    /**
348
     * @return string
349
     */
350
    public function getResourceId()
351
    {
352
        return 'Entity/Jobs/Job';
353
    }
354
355
    /**
356
     * @see \Jobs\Entity\JobInterface::setApplyId()
357
     * @param String $applyId
358
     * @return \Jobs\Entity\JobInterface
359
     */
360
    public function setApplyId($applyId)
361
    {
362
        $this->applyId = (string) $applyId;
363
        return $this;
364
    }
365
    /**
366
     * @see \Jobs\Entity\JobInterface::getApplyId()
367
     * @return String
368
     */
369
    public function getApplyId()
370
    {
371
        if (!isset($this->applyId)) {
372
            // take the entity-id as a default
373
            $this->applyId = $this->id;
374
        }
375
        return $this->applyId;
376
    }
377
378
    /**
379
     * Gets the title of a job posting
380
     *
381
     * @return string
382
     */
383
    public function getTitle()
384
    {
385
        return $this->title;
386
    }
387
388
    /**
389
     * Sets the title of a job posting
390
     *
391
     * @see \Jobs\Entity\JobInterface::setTitle()
392
     * @param String $title
393
     * @return \Jobs\Entity\JobInterface
394
     */
395
    public function setTitle($title)
396
    {
397
        $this->title = (string) $title;
398
        return $this;
399
    }
400
    
401
    /**
402
     * Gets the name oof the company. If there is an organization assigned to the
403
     * job posting. Take the name of the organization.
404
     *
405
     * (non-PHPdoc)
406
     * @see \Jobs\Entity\JobInterface::getCompany()
407
     */
408
    public function getCompany()
409
    {
410
        if ($this->organization) {
411
            return $this->organization->getOrganizationName()->getName();
412
        }
413
        return $this->company;
414
    }
415
416
    /**
417
     * (non-PHPdoc)
418
     * @see \Jobs\Entity\JobInterface::setCompany()
419
     */
420
    public function setCompany($company)
421
    {
422
        $this->company = $company;
423
        return $this;
424
    }
425
    
426
     /**
427
     * (non-PHPdoc)
428
     * @see \Jobs\Entity\JobInterface::getOrganization()
429
     */
430
    public function getOrganization()
431
    {
432
        return $this->organization;
433
    }
434
    
435
    /**
436
     * @inheritdoc
437
     */
438
    public function setOrganization(OrganizationInterface $organization = null)
439
    {
440
        $permissions = $this->getPermissions();
441
442
        if ($this->organization) {
443
            $permissions->revoke($this->organization, null, false);
0 ignored issues
show
Unused Code introduced by
The call to PermissionsInterface::revoke() has too many arguments starting with false.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
444
        }
445
        $this->organization = $organization;
446
        $permissions->grant($organization);
0 ignored issues
show
Bug introduced by
It seems like $organization defined by parameter $organization on line 438 can be null; however, Core\Entity\PermissionsInterface::grant() does not accept null, maybe add an additional type check?

It seems like you allow that null is being passed for a parameter, however the function which is called does not seem to accept null.

We recommend to add an additional type check (or disallow null for the parameter):

function notNullable(stdClass $x) { }

// Unsafe
function withoutCheck(stdClass $x = null) {
    notNullable($x);
}

// Safe - Alternative 1: Adding Additional Type-Check
function withCheck(stdClass $x = null) {
    if ($x instanceof stdClass) {
        notNullable($x);
    }
}

// Safe - Alternative 2: Changing Parameter
function withNonNullableParam(stdClass $x) {
    notNullable($x);
}
Loading history...
447
448
        return $this;
449
    }
450
451
    /**
452
     * (non-PHPdoc)
453
     * @see \Jobs\Entity\JobInterface::getContactEmail()
454
     */
455
    public function getContactEmail()
456
    {
457
        if (false !== $this->contactEmail && !$this->contactEmail) {
458
            $user = $this->getUser();
459
            $email = false;
460
            if (isset($user)) {
461
                $email = $user->getInfo()->getEmail();
462
            }
463
            $this->setContactEmail($email);
0 ignored issues
show
Security Bug introduced by
It seems like $email defined by false on line 459 can also be of type false; however, Jobs\Entity\Job::setContactEmail() does only seem to accept string, did you maybe forget to handle an error condition?

This check looks for type mismatches where the missing type is false. This is usually indicative of an error condtion.

Consider the follow example

<?php

function getDate($date)
{
    if ($date !== null) {
        return new DateTime($date);
    }

    return false;
}

This function either returns a new DateTime object or false, if there was an error. This is a typical pattern in PHP programming to show that an error has occurred without raising an exception. The calling code should check for this returned false before passing on the value to another function or method that may not be able to handle a false.

Loading history...
464
        }
465
        return $this->contactEmail;
466
    }
467
468
    /**
469
     * (non-PHPdoc)
470
     * @see \Jobs\Entity\JobInterface::setContactEmail()
471
     */
472
    public function setContactEmail($email)
473
    {
474
        $this->contactEmail = (string) $email;
475
        return $this;
476
    }
477
478
    /**
479
     * (non-PHPdoc)
480
     * @see \Jobs\Entity\JobInterface::setLanguage()
481
     */
482
    public function setLanguage($language)
483
    {
484
        $this->language = $language;
485
        return $this;
486
    }
487
    /**
488
     * (non-PHPdoc)
489
     * @see \Jobs\Entity\JobInterface::getLanguage()
490
     */
491
    public function getLanguage()
492
    {
493
        return $this->language;
494
    }
495
    /**
496
     * (non-PHPdoc)
497
     * @see \Jobs\Entity\JobInterface::setLocation()
498
     */
499
    public function setLocation($location)
500
    {
501
        $this->location = $location;
502
        return $this;
503
    }
504
    /**
505
     * (non-PHPdoc)
506
     * @see \Jobs\Entity\JobInterface::getLocation()
507
     */
508
    public function getLocation()
509
    {
510
        if (null === $this->location) {
511
            $array=[];
512
            if(null != $this->locations){
513
                foreach ($this->locations as $location) { /* @var \Core\Entity\LocationInterface $location */
514
                    $array[]=$location->getCity();
515
                }
516
                return implode(', ', $array);
517
            }
518
        }
519
        return $this->location;
520
    }
521
    /**
522
     * (non-PHPdoc)
523
     * @see \Jobs\Entity\JobInterface::setLocations()
524
     */
525
    public function setLocations($locations)
526
    {
527
        $this->locations = $locations;
0 ignored issues
show
Documentation Bug introduced by
It seems like $locations of type string is incompatible with the declared type object<Doctrine\Common\Collections\Collection> of property $locations.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
528
        return $this;
529
    }
530
    /**
531
     * (non-PHPdoc)
532
     * @see \Jobs\Entity\JobInterface::getLocations()
533
     */
534
    public function getLocations()
535
    {
536
        if (!$this->locations) {
537
            $this->setLocations(new ArrayCollection());
538
        }
539
        return $this->locations;
540
    }
541
    /**
542
     * (non-PHPdoc)
543
     * @see \Jobs\Entity\JobInterface::setUser()
544
     */
545 View Code Duplication
    public function setUser(UserInterface $user)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in 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...
546
    {
547
        if ($this->user) {
548
            $this->getPermissions()->revoke($this->user, Permissions::PERMISSION_ALL, false);
0 ignored issues
show
Unused Code introduced by
The call to PermissionsInterface::revoke() has too many arguments starting with false.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
549
        }
550
        $this->user = $user;
551
        $this->getPermissions()->grant($user, Permissions::PERMISSION_ALL);
552
        return $this;
553
    }
554
    /**
555
     * (non-PHPdoc)
556
     * @see \Jobs\Entity\JobInterface::getUser()
557
     */
558
    public function getUser()
559
    {
560
        return $this->user;
561
    }
562
563
    public function unsetUser($removePermissions = true)
564
    {
565
        if ($this->user) {
566
            if ($removePermissions) {
567
                $this->getPermissions()->revoke($this->user, Permissions::PERMISSION_ALL);
568
            }
569
            $this->user=null;
570
        }
571
572
        return $this;
573
    }
574
575
    /**
576
     * (non-PHPdoc)
577
     * @see \Jobs\Entity\JobInterface::setApplications()
578
     */
579
    public function setApplications(Collection $applications)
580
    {
581
        $this->applications = $applications;
582
        return $this;
583
    }
584
585
    /**
586
     * (non-PHPdoc)
587
     * @see \Jobs\Entity\JobInterface::getApplications()
588
     */
589
    public function getApplications()
590
    {
591
        return $this->applications;
592
    }
593
594
    /**
595
     * Gets the number of unread applications
596
     * @return Collection
0 ignored issues
show
Documentation introduced by
Should the return type not be integer?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
597
     */
598
    public function getUnreadApplications()
599
    {
600
        return $this->unreadApplications;
601
    }
602
    /**
603
     * (non-PHPdoc)
604
     * @see \Jobs\Entity\JobInterface::getLink()
605
     */
606
    public function getLink()
607
    {
608
        return $this->link;
609
    }
610
    /**
611
     * (non-PHPdoc)
612
     * @see \Jobs\Entity\JobInterface::setLink()
613
     */
614
    public function setLink($link)
615
    {
616
        $this->link = $link;
617
        return $this;
618
    }
619
    /**
620
     * (non-PHPdoc)
621
     * @see \Jobs\Entity\JobInterface::getDatePublishStart()
622
     */
623
    public function getDatePublishStart()
624
    {
625
        return $this->datePublishStart;
626
    }
627
    /**
628
     * (non-PHPdoc)
629
     * @param string $datePublishStart
0 ignored issues
show
Documentation introduced by
Should the type for parameter $datePublishStart not be string|null?

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

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

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

Loading history...
630
     * @see \Jobs\Entity\JobInterface::setDatePublishStart()
631
     * @return $this
632
     */
633 View Code Duplication
    public function setDatePublishStart($datePublishStart = null)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in 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...
634
    {
635
        if (!isset($datePublishStart) || is_string($datePublishStart)) {
636
            $datePublishStart = new \DateTime($datePublishStart);
637
        } else if (!$datePublishStart instanceOf \DateTime) {
638
            throw new \InvalidArgumentException('Expected object of type \DateTime');
639
        }
640
641
        $this->datePublishStart = $datePublishStart;
0 ignored issues
show
Documentation Bug introduced by
It seems like $datePublishStart of type object<DateTime> is incompatible with the declared type string of property $datePublishStart.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
642
        return $this;
643
    }
644
645
    /**
646
     * (non-PHPdoc)
647
     * @see \Jobs\Entity\JobInterface::getDatePublishStart()
648
     */
649
    public function getDatePublishEnd()
650
    {
651
        return $this->datePublishEnd;
652
    }
653
    /**
654
     * (non-PHPdoc)
655
     * @param string $datePublishEnd
0 ignored issues
show
Documentation introduced by
Should the type for parameter $datePublishEnd not be string|null?

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

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

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

Loading history...
656
     * @see \Jobs\Entity\JobInterface::setDatePublishEnd()
657
     * @return $this
658
     */
659 View Code Duplication
    public function setDatePublishEnd($datePublishEnd = null)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in 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...
660
    {
661
        if (is_string($datePublishEnd)) {
662
            $datePublishEnd = new \DateTime($datePublishEnd);
663
        } else if (!$datePublishEnd instanceOf \DateTime) {
664
            throw new \InvalidArgumentException('Expected object of type \DateTime');
665
        }
666
667
        $this->datePublishEnd = $datePublishEnd;
0 ignored issues
show
Documentation Bug introduced by
It seems like $datePublishEnd of type object<DateTime> is incompatible with the declared type string of property $datePublishEnd.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
668
        return $this;
669
    }
670
671
    /**
672
     * Modifies the state of an application.
673
     *
674
     * Creates a history entry.
675
     *
676
     * @param StatusInterface|string $status
677
     * @param string $message
678
     * @return Job
679
     */
680 View Code Duplication
    public function changeStatus($status, $message = '[System]')
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in 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...
681
    {
682
        $this->setStatus($status);
0 ignored issues
show
Bug introduced by
It seems like $status defined by parameter $status on line 680 can also be of type object<Jobs\Entity\StatusInterface>; however, Jobs\Entity\Job::setStatus() does only seem to accept string, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
683
        $status = $this->getStatus(); // ensure StatusEntity
684
685
        $history = new History($status, $message);
686
687
        $this->getHistory()->add($history);
688
        return $this;
689
    }
690
691
    /**
692
     * (non-PHPdoc)
693
     * @see \Jobs\Entity\JobInterface::getStatus()
694
     */
695
    public function getStatus()
696
    {
697
        return $this->status;
698
    }
699
    /**
700
     * (non-PHPdoc)
701
     * @see \Jobs\Entity\JobInterface::setStatus()
702
     */
703
    public function setStatus($status)
704
    {
705
        if (!$status instanceof Status) {
706
            $status = new Status($status);
707
        }
708
        $this->status = $status;
709
    }
710
711
    /**
712
     * {@inheritDoc}
713
     * @see JobInterface::setHistory()
714
     * @return Job
715
     */
716
    public function setHistory(Collection $history)
717
    {
718
        $this->history = $history;
719
        return $this;
720
    }
721
722
    /**
723
     * {@inheritDoc}
724
     * @see JobInterface::getHistory()
725
     */
726
    public function getHistory()
727
    {
728
        if (null == $this->history) {
729
            $this->setHistory(new ArrayCollection());
730
        }
731
        return $this->history;
732
    }
733
734
    /**
735
     * {@inheritDoc}
736
     * @see JobInterface::setTermsAccepted()
737
     * @return self
738
     */
739
    public function setTermsAccepted($termsAccepted)
740
    {
741
        $this->termsAccepted = $termsAccepted;
742
        return $this;
743
    }
744
745
    /**
746
     * {qinheritDoc}
747
     * @see JobInterface::getTermsAccepted()
748
     */
749
    public function getTermsAccepted()
750
    {
751
        return $this->termsAccepted;
752
    }
753
754
    /**
755
     * (non-PHPdoc)
756
     * @see JobInterface::getReference()
757
     */
758
    public function getReference()
759
    {
760
        return $this->reference;
761
    }
762
    /**
763
     * (non-PHPdoc)
764
     * @see JobInterface::setReference()
765
     */
766
    public function setReference($reference)
767
    {
768
        $this->reference = $reference;
769
        return $this;
770
    }
771
772
    public function setAtsMode(AtsMode $mode)
773
    {
774
        $this->atsMode = $mode;
775
776
        return $this;
777
    }
778
779
    public function getAtsMode()
780
    {
781
        if (!$this->atsMode) {
782
            $this->setAtsMode(new AtsMode(AtsMode::MODE_INTERN));
783
        }
784
785
        return $this->atsMode;
786
    }
787
788
789
    /**
790
     * checks, weather a job is enabled for getting applications
791
     * @return boolean
792
     */
793
    public function getAtsEnabled()
794
    {
795
        return $this->atsEnabled;
796
    }
797
    /**
798
     * enables a job add to receive applications
799
     *
800
     * @param boolean $atsEnabled
801
     * @return \Jobs\Entity\Job
802
     */
803
    public function setAtsEnabled($atsEnabled)
804
    {
805
        $this->atsEnabled = $atsEnabled;
806
        return $this;
807
    }
808
    /**
809
     * returns an uri to the organization logo.
810
     *
811
     * @return string
812
     */
813
    public function getLogoRef()
814
    {
815
        /** @var $organization \Organizations\Entity\Organization */
816
        $organization = $this->organization;
817
        if (is_object($organization) && $organization->getImage()) {
0 ignored issues
show
Deprecated Code introduced by
The method Organizations\Entity\Organization::getImage() has been deprecated with message: since 0.29; use $this->getImages()->get()

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
818
            $organizationImage = $organization->getImage();
0 ignored issues
show
Deprecated Code introduced by
The method Organizations\Entity\Organization::getImage() has been deprecated with message: since 0.29; use $this->getImages()->get()

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
819
            return "/file/Organizations.OrganizationImage/" . $organizationImage->getId();
820
        }
821
        return $this->logoRef;
822
    }
823
    /**
824
     * Set the uri to the organisations logo
825
     *
826
     * @param string $logoRef
827
     * @return \Jobs\Entity\Job
828
     */
829
    public function setLogoRef($logoRef)
830
    {
831
        $this->logoRef = $logoRef;
832
        return $this;
833
    }
834
835
    /**
836
     *
837
     *
838
     * @return string
839
     */
840
    public function getTemplate()
841
    {
842
        $template = $this->template;
843
        if (empty($template)) {
844
            $template = 'default';
845
        }
846
        return $template;
847
    }
848
    /**
849
     *
850
     *
851
     * @param string $template name of the Template
852
     * @return \Jobs\Entity\Job
853
     */
854
    public function setTemplate($template)
855
    {
856
        $this->template = $template;
857
        return $this;
858
    }
859
860
861
862
    /**
863
     * Gets the uri of an application link
864
     *
865
     * @return String
866
     */
867
    public function getUriApply()
868
    {
869
        return $this->uriApply;
870
    }
871
872
    /**
873
     * Sets the uri of an application link
874
     *
875
     * @param String $uriApply
876
     * @return \Jobs\Entity\Job
877
     */
878
    public function setUriApply($uriApply)
879
    {
880
        $this->uriApply = $uriApply;
881
        return $this;
882
    }
883
884
    /**
885
     * Gets the uri of a publisher
886
     *
887
     * @return String
888
     */
889
    public function getUriPublisher()
890
    {
891
        return $this->uriPublisher;
892
    }
893
    /**
894
     *
895
     * @param String $uriPublisher
896
     * @return \Jobs\Entity\Job
897
     */
898
    public function setUriPublisher($uriPublisher)
899
    {
900
        $this->uriPublisher = $uriPublisher;
901
        return $this;
902
    }
903
904
    /**
905
     * @param $key
906
     * @return mixed
907
     */
908
    public function getPublisher($key)
909
    {
910
        $result = null;
911
        foreach ($this->publisher as $publisher) {
912
            if ($publisher->host == $key) {
913
                $result = $publisher;
914
            }
915
        }
916
        if (!isset($result)) {
917
            $result = new Publisher();
918
            $result->host = $key;
0 ignored issues
show
Documentation introduced by
The property $host is declared protected in Jobs\Entity\Publisher. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

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...
919
            $this->publisher[] = $result;
920
        }
921
        return $result;
922
    }
923
924
    public function setPublisherReference($key, $reference)
925
    {
926
        $publisher = $this->getPublisher($key);
927
        $publisher->reference;
928
        return $this;
929
    }
930
931
    
932
    /**
933
     * (non-PHPdoc)
934
     * @see \Core\Entity\PermissionsAwareInterface::getPermissions()
935
     */
936
    public function getPermissions()
937
    {
938
        if (!$this->permissions) {
939
            $permissions = new Permissions('Job/Permissions');
940
            if ($this->user) {
941
                $permissions->grant($this->user, Permissions::PERMISSION_ALL);
942
            }
943
            $this->setPermissions($permissions);
944
        }
945
946
        return $this->permissions;
947
    }
948
    
949
    /**
950
     * (non-PHPdoc)
951
     * @see \Core\Entity\PermissionsAwareInterface::setPermissions()
952
     */
953
    public function setPermissions(PermissionsInterface $permissions)
954
    {
955
        $this->permissions = $permissions;
956
        return $this;
957
    }
958
959
    /**
960
     * Gets the Values of a job template
961
     *
962
     * @return TemplateValues
963
     */
964
    public function getTemplateValues()
965
    {
966
        if (!$this->templateValues instanceof TemplateValues) {
967
            $this->templateValues = new TemplateValues();
968
        }
969
        return $this->templateValues;
970
    }
971
972
    /**
973
     * @param EntityInterface $templateValues
0 ignored issues
show
Documentation introduced by
Should the type for parameter $templateValues not be null|EntityInterface?

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

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

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

Loading history...
974
     *
975
     * @return $this
976
     */
977
    public function setTemplateValues(EntityInterface $templateValues = null)
978
    {
979
        if (!$templateValues instanceof TemplateValues) {
980
            $templateValues = new TemplateValues($templateValues);
0 ignored issues
show
Unused Code introduced by
The call to TemplateValues::__construct() has too many arguments starting with $templateValues.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
981
        }
982
        $this->templateValues = $templateValues;
983
        return $this;
984
    }
985
986
    /**
987
     * Sets the list of channels where a job opening should be published
988
     *
989
     * @param Array
990
     * {@inheritdoc}
991
     */
992
    public function setPortals(array $portals)
993
    {
994
        $this->portals = $portals;
995
        return $this;
996
    }
997
998
    /**
999
     * Gets the list of channels where the job opening should be published
1000
     *
1001
     * {@inheritdoc}
1002
     * @return array
1003
     */
1004
    public function getPortals()
1005
    {
1006
        return $this->portals;
1007
    }
1008
1009
    /**
1010
     * Gets the flag indicating the draft state.
1011
     *
1012
     * @return bool
1013
     */
1014
    public function isDraft()
1015
    {
1016
        return $this->isDraft;
1017
    }
1018
1019
    /**
1020
     * Sets the flag indicating the draft state.
1021
     *
1022
     * @param boolean $flag
1023
     * @return DraftableEntityInterface
1024
     */
1025
    public function setIsDraft($flag)
1026
    {
1027
        $this->isDraft = (bool) $flag;
1028
        return $this;
1029
    }
1030
1031
    /**
1032
     * Gets the status and checks it against 'active'
1033
     *
1034
     * @return bool
1035
     */
1036
    public function isActive()
1037
    {
1038
        return !$this->isDraft && is_object($this->status) && $this->status->getName() == 'active';
0 ignored issues
show
Deprecated Code introduced by
The method Jobs\Entity\Status::getName() has been deprecated with message: since 0,29, use __toString()

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
1039
    }
1040
1041
    /**
1042
     * @return Job
1043
     */
1044
    public function makeSnapshot()
1045
    {
1046
        $snapshot = new JobSnapshot($this);
1047
        return $snapshot;
1048
    }
1049
1050
    /**
1051
     * @return array|mixed
1052
     */
1053
    public function getSnapshotGenerator()
1054
    {
1055
        $generator = array(
1056
            'hydrator' => '',
1057
            'target' => 'Jobs\Entity\JobSnapshot',
1058
            'exclude' => array('permissions', 'history')
1059
        );
1060
        return $generator;
1061
    }
1062
1063
    /**
1064
     * @param \Jobs\Entity\Classifications $classifications
1065
     *
1066
     * @return self
1067
     */
1068
    public function setClassifications($classifications)
1069
    {
1070
        $this->classifications = $classifications;
1071
1072
        return $this;
1073
    }
1074
1075
    /**
1076
     * @return \Jobs\Entity\Classifications
1077
     */
1078
    public function getClassifications()
1079
    {
1080
        if (!$this->classifications) {
1081
            $this->setClassifications(new Classifications());
1082
        }
1083
1084
        return $this->classifications;
1085
    }
1086
1087
    /**
1088
     * Mark this job as deleted.
1089
     *
1090
     * @internal
1091
     *      This is meant as temporary solution, until
1092
     *      SoftDelete is implemented.
1093
     *
1094
     * @return self
1095
     * @since 0.29
1096
     */
1097
    public function delete()
1098
    {
1099
        $this->isDeleted = true;
1100
1101
        return $this;
1102
    }
1103
1104
    public function isDeleted()
1105
    {
1106
        return $this->isDeleted;
1107
    }
1108
1109
1110
}
1111