<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
/**
* @ORM\Entity(repositoryClass="App\Repository\WorkExperienceRepository")
* @ORM\HasLifecycleCallbacks()
*/
#[ApiResource(
attributes: ['security' => "is_granted('ROLE_USER')"],
normalizationContext: ['groups' => ['workExperience:read']],
denormalizationContext: ['groups' => ['workExperience:write']],
collectionOperations: ['get', 'post' => ['security' => "is_granted('ROLE_ADMIN')"]],
itemOperations: ['get', 'put' => ['security' => "is_granted('ROLE_ADMIN') or object.owner == user"]],
)]
#[ApiFilter(SearchFilter::class, properties: ['id', 'title' => 'partial', 'companyName' => 'partial'])]
#[ApiFilter(PropertyFilter::class)]
#[ApiFilter(OrderFilter::class, properties: ['id', 'title', 'companyName'], arguments: ['orderParameterName' => 'order'])]
class WorkExperience
{
use TimestampableEntity;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=128, nullable=true)
* @Assert\Length(max=128)
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $title;
/**
* @ORM\Column(type="string", name="company_name", length=128, nullable=true)
* @Assert\NotBlank(groups={"Edition-Step2"})
* @Assert\Length(max=128)
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $companyName = null;
/**
* @ORM\Column(type="string", length=128, nullable=true)
* @Assert\Length(max=128)
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $companyLocation;
/**
* @ORM\Column(type="date", nullable=false)
* @Assert\NotNull(groups={"Edition-Step2"})
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $dateFrom;
/**
* @ORM\Column(type="date", nullable=true)
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $dateTo;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $rehireDate;
/**
* @ORM\Column(type="date", nullable=true)
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $latestHireDate;
private $workOnGoing;
/**
* @ORM\Column(type="string", length=64, nullable=true)
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $phoneCompany;
/**
* @ORM\Column(type="string", length=50, nullable=true)
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $employeeStatus;
/**
* @ORM\Column(type="string", length=20, nullable=true)
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $salary;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\VirtualOffice")
* @ORM\JoinColumn(nullable=true)
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $virtualOffice;
/**
* @ORM\Column(type="string", length=256, nullable=true)
* @Groups({"workExperience:read", "workExperience:write"})
*/
private $virtualOfficeOther;
/**
* @ORM\Column(type="integer", length=50, nullable=true)
*/
private $deploymentId = 0;
/**
* @ORM\ManyToOne(targetEntity=SalaryRange::class, inversedBy="workExperiences")
* @ORM\JoinColumn(nullable=true, name="salary_range_id", referencedColumnName="id", onDelete="SET NULL")
*/
private $salaryRange;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="workExperiences")
* @ORM\JoinColumn(nullable=true, onDelete="CASCADE")
* @Assert\NotNull()
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Company")
* @ORM\JoinColumn(nullable=true, onDelete="CASCADE")
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $company;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Department")
* @ORM\JoinColumn(nullable=true, onDelete="CASCADE")
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $department;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Division")
* @ORM\JoinColumn(nullable=true, onDelete="CASCADE")
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $division;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Position")
* @ORM\JoinColumn(nullable=true, onDelete="CASCADE")
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $position;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\DivisionHead")
* @ORM\JoinColumn(nullable=true, onDelete="CASCADE")
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $divisionHead;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\PyramidHead")
* @ORM\JoinColumn(nullable=true, onDelete="CASCADE")
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $pyramidHead;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Region")
* @ORM\JoinColumn(nullable=true, onDelete="CASCADE")
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $region;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\City")
* @ORM\JoinColumn(nullable=true, onDelete="CASCADE")
* @Groups({"workExperience:read", "workExperience:write","user:item","user:list","user:write"})
*/
private $city;
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(?string $title): self
{
$this->title = $title;
return $this;
}
public function getCompanyName(): ?string
{
return $this->companyName;
}
public function setCompanyName(?string $companyName): self
{
$this->companyName = $companyName;
return $this;
}
public function getCompanyLocation(): ?string
{
return $this->companyLocation;
}
public function setCompanyLocation(?string $companyLocation): self
{
$this->companyLocation = $companyLocation;
return $this;
}
public function getDateFrom(): ?\DateTime
{
return $this->dateFrom;
}
public function setDateFrom(?\DateTime $dateFrom): self
{
$this->dateFrom = $dateFrom;
return $this;
}
public function getDateTo(): ?\DateTime
{
return $this->dateTo;
}
public function setDateTo(?\DateTime $dateTo): self
{
$this->dateTo = $dateTo;
return $this;
}
public function getRehireDate(): ?\DateTime
{
return $this->rehireDate;
}
public function setRehireDate(?\DateTime $rehireDate): self
{
$this->rehireDate = $rehireDate;
return $this;
}
public function getLatestHireDate(): ?\DateTime
{
return $this->latestHireDate;
}
public function setLatestHireDate(?\DateTime $latestHireDate): self
{
$this->latestHireDate = $latestHireDate;
return $this;
}
public function getPhoneCompany(): ?string
{
return $this->phoneCompany;
}
public function setPhoneCompany(?string $phoneCompany): self
{
$this->phoneCompany = $phoneCompany;
return $this;
}
public function getEmployeeStatus(): ?string
{
return $this->employeeStatus;
}
public function setEmployeeStatus(?string $employeeStatus): self
{
$this->employeeStatus = $employeeStatus;
return $this;
}
public function getSalary(): ?string
{
return $this->salary;
}
public function setSalary(?string $salary): self
{
$this->salary = $salary;
return $this;
}
public function getDeploymentId(): ?int
{
return $this->deploymentId;
}
public function setDeploymentId(?int $deploymentId): self
{
$this->deploymentId = $deploymentId;
return $this;
}
public function getRegion(): ?Region
{
return $this->region;
}
public function setRegion(?Region $region): self
{
$this->region = $region;
return $this;
}
public function getVirtualOffice(): ?VirtualOffice
{
return $this->virtualOffice;
}
public function setVirtualOffice(?VirtualOffice $virtualOffice): self
{
$this->virtualOffice = $virtualOffice;
return $this;
}
public function getVirtualOfficeOther(): ?string
{
return $this->virtualOfficeOther;
}
public function setVirtualOfficeOther(?string $virtualOfficeOther): self
{
$this->virtualOfficeOther = $virtualOfficeOther;
return $this;
}
public function getSalaryRange(): ?SalaryRange
{
return $this->salaryRange;
}
public function setSalaryRange(?SalaryRange $salaryRange): self
{
$this->salaryRange = $salaryRange;
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
public function __toString()
{
return $this->title . (($this->companyName) ? ' @ ' . $this->companyName : '');
}
public function getWorkOnGoing(): ?bool
{
return $this->workOnGoing;
}
public function setWorkOnGoing(bool $workOnGoing): self
{
$this->workOnGoing = $workOnGoing;
// field not mapped, to trigger Doctrine Listener
$this->updatedAt = new \DateTime();
return $this;
}
public function getCompany(): ?Company
{
return $this->company;
}
public function setCompany(?Company $company): self
{
$this->company = $company;
return $this;
}
public function getDepartment(): ?Department
{
return $this->department;
}
public function setDepartment(?Department $department): self
{
$this->department = $department;
return $this;
}
public function getPosition(): ?Position
{
return $this->position;
}
public function setPosition(?Position $position): self
{
$this->position = $position;
return $this;
}
public function getDivision(): ?Division
{
return $this->division;
}
public function setDivision(?Division $division): self
{
$this->division = $division;
return $this;
}
public function getDivisionHead(): ?DivisionHead
{
return $this->divisionHead;
}
public function setDivisionHead(?DivisionHead $divisionHead): self
{
$this->divisionHead = $divisionHead;
return $this;
}
public function getPyramidHead(): ?PyramidHead
{
return $this->pyramidHead;
}
public function setPyramidHead(?PyramidHead $pyramidHead): self
{
$this->pyramidHead = $pyramidHead;
return $this;
}
public function getCity(): ?City
{
return $this->city;
}
public function setCity(?City $city): self
{
$this->city = $city;
return $this;
}
/**
* @Assert\Callback(groups={"Edition-Step2"})
*/
public function validateDatesBound(ExecutionContextInterface $context, $payload)
{
if (null !== $this->dateFrom && !$this->getWorkOnGoing() && $this->dateFrom > $this->dateTo) {
$context->buildViolation('The start date can not be greater than the end date')
->atPath('dateFrom')
->addViolation();
}
}
}