<?php
namespace App\Entity;
use App\Repository\VisioEventRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass=VisioEventRepository::class)
* @ORM\HasLifecycleCallbacks()
*/
class VisioEvent
{
const STATUS_VALID = 'valid'; //event is valid but no one is registered
const STATUS_REGISTERED = 'registered'; //event is valid and registered
const STATUS_CANCELLED = 'cancelled'; //event has been cancelled no more applications
const STATUSES = [
self::STATUS_VALID,
self::STATUS_REGISTERED,
self::STATUS_CANCELLED,
];
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
*/
private $name;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @var string|null
*/
private $link;
/**
* @var string|null
* @ORM\Column(type="string", length=255)
*/
private $status = self::STATUS_VALID;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $description;
/**
* @ORM\Column(type="integer")
* @Assert\NotBlank
* @Assert\GreaterThan(value="0")
*/
private $duration;
/**
* @ORM\Column(type="float")
*/
private $clientPrice = 0;
/**
* @ORM\Column(type="datetime")
* @Assert\NotBlank
* @Assert\LessThan(propertyPath="end")
*/
private $start;
/**
* @ORM\Column(type="datetime")
* @Assert\NotBlank
* @Assert\GreaterThan(propertyPath="start")
*/
private $end;
/**
* Cancellation limit for the client in hours
* @ORM\Column(type="integer", nullable=true)
* @var integer|null
*/
private $cancellationLimit = 0;
/**
* Price with commission accounted for
* @ORM\Column(type="float")
*/
private $sellingPrice = 0;
/**
* @var float|null
* @ORM\Column(type="float")
*/
private $visioCommissionPercent = 0;
/**
* @var float|null
* @ORM\Column(type="float")
*/
private $visioCommissionPrice = 0;
/**
* Price being paid to the specialist
* @ORM\Column(type="float")
*/
private $purchasePrice = 0;
/**
* @ORM\Column(type="float", nullable=true)
*/
private $tva = 0;
/**
* @ORM\Column(type="datetime")
* @Gedmo\Timestampable(on="create")
*/
private $createdAt;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Gedmo\Timestampable(on="update")
*/
private $updatedAt;
/**
* @ORM\ManyToOne(targetEntity=Specialist::class, inversedBy="visioEvents")
* @ORM\JoinColumn(nullable=false)
*/
private $specialist;
/**
* @ORM\ManyToOne(targetEntity=Tag::class, inversedBy="visioEvents")
* @ORM\JoinColumn(nullable=false)
*/
private $tag;
/**
* @ORM\Column(type="boolean", options={"default": 0})
*/
private $tvaApplicable = false;
/**
* @ORM\OneToMany(targetEntity=Registration::class, mappedBy="visioEvent")
*/
private $registrations;
/**
* @ORM\OneToMany(targetEntity=Document::class, mappedBy="visioEvent", cascade={"persist"})
*/
private $documents;
public function __construct()
{
$this->createdAt = new \DateTime();
$this->registrations = new ArrayCollection();
$this->documents = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getDuration(): ?int
{
return $this->duration;
}
public function setDuration(int $duration): self
{
$this->duration = $duration;
return $this;
}
public function getClientPrice(): ?float
{
return $this->clientPrice;
}
public function setClientPrice(float $clientPrice): self
{
$this->clientPrice = $clientPrice;
return $this;
}
public function getStart(): ?\DateTimeInterface
{
return $this->start;
}
public function setStart(\DateTimeInterface $start): self
{
$this->start = $start;
return $this;
}
public function getEnd(): ?\DateTimeInterface
{
return $this->end;
}
public function setEnd(\DateTimeInterface $end): self
{
$this->end = $end;
return $this;
}
public function getSellingPrice(): ?float
{
return $this->sellingPrice;
}
public function setSellingPrice(float $sellingPrice): self
{
$this->sellingPrice = $sellingPrice;
return $this;
}
public function getPurchasePrice(): ?float
{
return $this->purchasePrice;
}
public function setPurchasePrice(float $purchasePrice): self
{
$this->purchasePrice = $purchasePrice;
return $this;
}
public function getTva(): ?float
{
return $this->tva;
}
public function setTva(?float $tva): self
{
$this->tva = $tva;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updatedAt;
}
public function setUpdatedAt(?\DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
public function getSpecialist(): ?Specialist
{
return $this->specialist;
}
public function setSpecialist(?Specialist $specialist): self
{
$this->specialist = $specialist;
return $this;
}
public function getTag(): ?Tag
{
return $this->tag;
}
public function setTag(?Tag $tag): self
{
$this->tag = $tag;
return $this;
}
public function isOpen(): bool
{
return empty($this->getRegistration());
}
public function getTvaApplicable(): ?bool
{
return $this->tvaApplicable;
}
public function setTvaApplicable(bool $tvaApplicable): self
{
$this->tvaApplicable = $tvaApplicable;
return $this;
}
/**
* Retrieves the current active and valid registration
* @return Registration|null
*/
public function getRegistration(): ?Registration
{
foreach ($this->registrations as $registration) {
if ($registration->isVisioValid()){
return $registration;
}
}
return null;
}
/**
* @return Collection<int, Registration>
*/
public function getRegistrations(): Collection
{
return $this->registrations;
}
public function addRegistration(Registration $registration): self
{
if (!$this->registrations->contains($registration)) {
$this->registrations[] = $registration;
$registration->setVisioEvent($this);
}
return $this;
}
public function removeRegistration(Registration $registration): self
{
if ($this->registrations->removeElement($registration)) {
// set the owning side to null (unless already changed)
if ($registration->getVisioEvent() === $this) {
$registration->setVisioEvent(null);
}
}
return $this;
}
/**
* @return Collection<int, Document>
*/
public function getDocuments(): Collection
{
return $this->documents;
}
/**
* @return Collection<int, Document>
*/
public function getDocumentsOrdered(): Collection
{
$criteria = Criteria::create()
->orderBy(array("created_at" => Criteria::DESC));
return $this->documents->matching($criteria);
}
public function addDocument(Document $document): self
{
if (!$this->documents->contains($document)) {
$this->documents[] = $document;
$document->setVisioEvent($this);
}
return $this;
}
public function removeDocument(Document $document): self
{
if ($this->documents->removeElement($document)) {
// set the owning side to null (unless already changed)
if ($document->getVisioEvent() === $this) {
$document->setVisioEvent(null);
}
}
return $this;
}
/**
* @param string|null $status
* @return VisioEvent
*/
public function setStatus(?string $status): VisioEvent
{
$this->status = $status;
return $this;
}
/**
* @return string|null
*/
public function getStatus(): ?string
{
return $this->status;
}
/**
* @return bool
*/
public function isCancelled(): bool
{
return ($this->status == self::STATUS_CANCELLED);
}
/**
* @param int|null $cancellationLimit
* @return VisioEvent
*/
public function setCancellationLimit(?int $cancellationLimit): VisioEvent
{
$this->cancellationLimit = $cancellationLimit;
return $this;
}
/**
* @return int|null
*/
public function getCancellationLimit(): ?int
{
return $this->cancellationLimit;
}
/**
* @param string|null $link
* @return VisioEvent
*/
public function setLink(?string $link): VisioEvent
{
$this->link = $link;
return $this;
}
/**
* @return string|null
*/
public function getLink(): ?string
{
return $this->link;
}
/**
* @param float|null $visioCommissionPercent
* @return VisioEvent
*/
public function setVisioCommissionPercent(?float $visioCommissionPercent): VisioEvent
{
$this->visioCommissionPercent = $visioCommissionPercent;
return $this;
}
/**
* @param float|null $visioCommissionPrice
* @return VisioEvent
*/
public function setVisioCommissionPrice(?float $visioCommissionPrice): VisioEvent
{
$this->visioCommissionPrice = $visioCommissionPrice;
return $this;
}
/**
* @return float|null
*/
public function getVisioCommissionPercent()
{
return $this->visioCommissionPercent;
}
/**
* @return float|null
*/
public function getVisioCommissionPrice()
{
return $this->visioCommissionPrice;
}
/**
* Récupère la dernière Registration
* @return Registration|null
*/
public function getCurrentRegistration(): ?Registration
{
$currentRegistration = null;
if(!empty($this->getRegistrations()->toArray())) {
foreach ($this->getRegistrations()->toArray() as $key => $registration) {
if($currentRegistration instanceof Registration && $registration->getId() > $currentRegistration->getId()) {
$currentRegistration = $registration;
} else $currentRegistration = $registration;
}
}
return $currentRegistration;
}
/**
* Récupère une inscription valid
* @return Registration|null
*/
public function getRegistered(): ?Registration
{
foreach ($this->getRegistrations()->toArray() as $key => $registration) {
if($registration->getStatus() === Registration::STATUS_REGISTER) {
return $registration;
}
}
return null;
}
}