<?php
namespace App\Entity;
use App\Entity\Traits\Address;
use App\Repository\SpecialistRepository;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\SerializedName;
use Symfony\Component\Validator\Constraints as Assert;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity(repositoryClass=SpecialistRepository::class)
* @Vich\Uploadable
* @ORM\HasLifecycleCallbacks()
*/
class Specialist
{
const STATUS_WAITING_MAIL_CONFIRMATION = 'waiting_mail_confirmation'; // specialist has been created but must confirm by clicking on link in email
const STATUS_WAITING_ULTEAM_CONFIRMATION = 'waiting_ulteam_confirmation'; // specialist has validated mail but is waiting for ULTEAM to confirm registration
const STATUS_REFUSED = 'refused'; // specialist registration has been refused by ULTEAM
const STATUS_GRANTED = 'granted'; // specialist has been granted full access to his back office by ULTEAM
/**
* Available statuses for the specialist
*/
const STATUSES = [
self::STATUS_WAITING_MAIL_CONFIRMATION,
self::STATUS_WAITING_ULTEAM_CONFIRMATION,
self::STATUS_REFUSED,
self::STATUS_GRANTED,
];
/**
* Available types for the specialist
*/
const TYPES = [
100 => 'Indépendant',
200 => 'Affilié',
300 => '100% Affilié'
];
use Address;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"search"})
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
*/
private $firstName;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
*/
private $lastName;
/**
* @ORM\Column(type="datetime")
* @var DateTime
*/
private $createdAt;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $image;
/**
* @Vich\UploadableField(mapping="specialists_images", fileNameProperty="image")
* @Assert\File(
* mimeTypes={"image/jpeg", "image/gif", "image/png"},
* maxSize="700Ki",
* )
* @var File|null
*/
private $imageFile;
/**
* @ORM\OneToOne(targetEntity=User::class, inversedBy="specialist", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=false)
* @Assert\Valid
*/
private $user;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $updatedAt;
/**
* @ORM\OneToMany(targetEntity=SpecialistTag::class, mappedBy="specialist", cascade={"all"})
*/
private $specialistTags;
/**
* @ORM\OneToMany(targetEntity=Event::class, mappedBy="specialist")
*/
private $events;
/**
* @ORM\OneToMany(targetEntity=SpecialistEventApplication::class, mappedBy="specialist", orphanRemoval=true)
*/
private $applications;
/**
* Search radius in meters
* @ORM\Column(type="float")
*/
private $radius = 5;
/**
* @ORM\OneToMany(targetEntity=Workshop::class, mappedBy="specialist")
*/
private $workshops;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $description;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Assert\Length(max="12", maxMessage="Numéro de téléphone invalide",
* min="10", minMessage="Numéro de téléphone invalide")
*/
private $tel;
/**
* @ORM\OneToMany(targetEntity=InvoiceApplication::class, mappedBy="specialist")
*/
private $invoiceApplications;
/**
* @ORM\Column(type="boolean", options={"default": 1})
*/
private $isTva = true;
/**
* @ORM\OneToMany(targetEntity=VisioEvent::class, mappedBy="specialist", orphanRemoval=true)
*/
private $visioEvents;
/**
* @ORM\ManyToMany(targetEntity=VisioEventPromotion::class, mappedBy="specialists")
*/
private $visioEventPromotions;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $status;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Gedmo\Timestampable(on="update", field={"status"})
*/
private $statusDate;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $statusMessage;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $identityCard;
/**
* @Vich\UploadableField(mapping="specialists_documents", fileNameProperty="identityCard")
* @Assert\File(
* mimeTypes={"application/pdf"},
* maxSize="2M",
* )
* @var File|null
*/
private $identityCardFile;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $insurance;
/**
* @Vich\UploadableField(mapping="specialists_documents", fileNameProperty="insurance")
* @Assert\File(
* mimeTypes={"application/pdf"},
* maxSize="2M",
* )
* @var File|null
*/
private $insuranceFile;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $degree;
/**
* @Vich\UploadableField(mapping="specialists_documents", fileNameProperty="degree")
* @Assert\File(
* mimeTypes={"application/pdf"},
* maxSize="2M",
* )
* @var File|null
*/
private $degreeFile;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $rib;
/**
* @Vich\UploadableField(mapping="specialists_documents", fileNameProperty="rib")
* @Assert\File(
* mimeTypes={"application/pdf"},
* maxSize="2M",
* )
* @var File|null
*/
private $ribFile;
/**
* @ORM\Column(type="boolean", options={"default": 1})
*/
private $isVirtualEvent = true;
/**
* @ORM\Column(type="uuid", nullable=true)
*/
private $uuid;
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private $isAffiliated;
/**
* @ORM\ManyToOne(targetEntity=Company::class, inversedBy="affiliatedSpecialists")
*/
private $affiliatedCompany;
/**
* @ORM\ManyToMany(targetEntity=Company::class, inversedBy="specialists")
*/
private $companies;
private $specialistType;
/**
* @ORM\OneToMany(targetEntity=AffiliatedEventApplication::class, mappedBy="specialist", orphanRemoval=true)
*/
private $affiliatedEventApplications;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $siret;
public function __construct()
{
$this->createdAt = new DateTime();
$this->specialistTags = new ArrayCollection();
$this->events = new ArrayCollection();
$this->applications = new ArrayCollection();
$this->user = new User();
$this->workshops = new ArrayCollection();
$this->invoiceApplications = new ArrayCollection();
$this->visioEvents = new ArrayCollection();
$this->visioEventPromotions = new ArrayCollection();
$this->cancelEventApplications = new ArrayCollection();
$this->companies = new ArrayCollection();
$this->affiliatedEventApplications = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getFirstName(): ?string
{
return $this->firstName;
}
public function setFirstName(string $firstName): self
{
$this->firstName = $firstName;
$this->updateUsername();
return $this;
}
public function getLastName(): ?string
{
return $this->lastName;
}
public function setLastName(string $lastName): self
{
$this->lastName = $lastName;
$this->updateUsername();
return $this;
}
public function updateUsername()
{
if ($this->user instanceof User) {
$this->user->setName($this->getFirstName() . ' ' . $this->getLastName());
}
}
public function getCreatedAt(): ?DateTime
{
return $this->createdAt;
}
public function setCreatedAt(DateTime $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getImage(): ?string
{
return $this->image;
}
public function setImage(?string $image): self
{
$this->image = $image;
return $this;
}
public function getUser(): ?user
{
return $this->user;
}
public function setUser(User $user): self
{
$this->user = $user;
$user->setSpecialist($this);
$this->user->updateName();
return $this;
}
/**
* @return File|null
*/
public function getImageFile(): ?File
{
return $this->imageFile;
}
/**
* @param File|null $imageFile
* @return Specialist
*/
public function setImageFile(?File $imageFile = null): Specialist
{
$this->imageFile = $imageFile;
if ($imageFile) {
// if 'updatedAt' is not defined in your entity, use another property
$this->updatedAt = new DateTime('now');
}
return $this;
}
public function getUpdatedAt(): ?DateTime
{
return $this->updatedAt;
}
public function setUpdatedAt(?DateTime $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
/**
* @return Collection|SpecialistTag[]
*/
public function getSpecialistTags(): Collection
{
return $this->specialistTags;
}
public function setSpecialistTags(array $specialistTags): self
{
$this->specialistTags = new ArrayCollection();
if (is_array($specialistTags)) {
// foreach ($this->specialistTags as $key => $specialistTag) {
// $this->removeSpecialistTag($specialistTag);
// }
// foreach ($specialistTags as $key => $specialistTag) {
// $this->addSpecialistTag($specialistTag);
// $specialistTags[$key]->setSpecialist($this);
// }
$this->specialistTags = new ArrayCollection($specialistTags);
}
return $this;
}
public function addSpecialistTag(SpecialistTag $specialistTag): self
{
if (!$this->specialistTags->contains($specialistTag)) {
$this->specialistTags[] = $specialistTag;
$specialistTag->setSpecialist($this);
}
return $this;
}
public function removeSpecialistTag(SpecialistTag $specialistTag): self
{
if ($this->specialistTags->removeElement($specialistTag)) {
// set the owning side to null (unless already changed)
if ($specialistTag->getSpecialist() === $this) {
$specialistTag->setSpecialist(null);
}
}
return $this;
}
/**
* Transforms the specialist tags to a tags option
* @return SpecialistTag[]
*/
public function getTags(): array
{
$res = [];
if (!empty($this->specialistTags)) {
$res = array_map(function ($element) {
if ($element instanceof SpecialistTag) {
return $element->getTag();
}
}, $this->specialistTags->toArray());
}
return $res;
}
/**
* @return Collection|Event[]
*/
public function getEvents(): Collection
{
return $this->events;
}
public function addEvent(Event $event): self
{
if (!$this->events->contains($event)) {
$this->events[] = $event;
$event->setSpecialist($this);
}
return $this;
}
public function removeEvent(Event $event): self
{
if ($this->events->removeElement($event)) {
// set the owning side to null (unless already changed)
if ($event->getSpecialist() === $this) {
$event->setSpecialist(null);
}
}
return $this;
}
public function __toString()
{
return $this->firstName . ' ' . $this->lastName;
}
/**
* @ORM\PrePersist()
*/
public function prePersist()
{
$this->user->setCategory(User::GROUP_SPECIALIST);
$this->user->addRole(User::ROLE_SPECIALIST);
}
/**
* @return Collection|SpecialistEventApplication[]
*/
public function getApplications(): Collection
{
return $this->applications;
}
public function addApplication(SpecialistEventApplication $application): self
{
if (!$this->applications->contains($application)) {
$this->applications[] = $application;
$application->setSpecialist($this);
}
return $this;
}
public function removeApplication(SpecialistEventApplication $application): self
{
if ($this->applications->removeElement($application)) {
// set the owning side to null (unless already changed)
if ($application->getSpecialist() === $this) {
$application->setSpecialist(null);
}
}
return $this;
}
public function getRadius(): ?float
{
return $this->radius;
}
public function setRadius(float $radius): self
{
$this->radius = $radius;
return $this;
}
/**
* @return Collection|Workshop[]
*/
public function getWorkshops(): Collection
{
return $this->workshops;
}
public function addWorkshop(Workshop $workshop): self
{
if (!$this->workshops->contains($workshop)) {
$this->workshops[] = $workshop;
$workshop->setSpecialist($this);
}
return $this;
}
public function removeWorkshop(Workshop $workshop): self
{
if ($this->workshops->removeElement($workshop)) {
// set the owning side to null (unless already changed)
if ($workshop->getSpecialist() === $this) {
$workshop->setSpecialist(null);
}
}
return $this;
}
public function getInComingEvents()
{
$inComingEvents = [];
if (!empty($this->getEvents()->toArray())) {
$today = new \DateTime("now");
foreach ($this->getEvents()->toArray() as $key => $event) {
if ($event instanceof Event) {
if (in_array($event->getStatus(), [Event::STATUS_VALID]) && $event->getStart() >= $today) {
$inComingEvents[] = $event;
}
}
}
}
return $inComingEvents;
}
public function getPastEvents()
{
$pastEvents = [];
if (!empty($this->getEvents()->toArray())) {
$today = new \DateTime("now");
foreach ($this->getEvents()->toArray() as $key => $event) {
if ($event instanceof Event) {
if ($event->getEnd() <= $today) {
$pastEvents[] = $event;
}
}
}
}
return $pastEvents;
}
public function getCanceledEvents()
{
$canceledEvents = [];
if (!empty($this->getEvents()->toArray())) {
foreach ($this->getEvents()->toArray() as $key => $event) {
if ($event instanceof Event) {
if (in_array($event->getStatus(), [Event::STATUS_CANCELED, Event::STATUS_CANCELED_MAIL])) {
$canceledEvents[] = $event;
}
}
}
}
return $canceledEvents;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getTel(): ?string
{
return $this->tel;
}
public function setTel(string $tel): self
{
$this->tel = $tel;
return $this;
}
/**
* @return Collection<int, InvoiceApplication>
*/
public function getInvoiceApplications(): Collection
{
return $this->invoiceApplications;
}
public function addInvoiceApplication(InvoiceApplication $invoiceApplication): self
{
if (!$this->invoiceApplications->contains($invoiceApplication)) {
$this->invoiceApplications[] = $invoiceApplication;
$invoiceApplication->setSpecialist($this);
}
return $this;
}
public function removeInvoiceApplication(InvoiceApplication $invoiceApplication): self
{
if ($this->invoiceApplications->removeElement($invoiceApplication)) {
// set the owning side to null (unless already changed)
if ($invoiceApplication->getSpecialist() === $this) {
$invoiceApplication->setSpecialist(null);
}
}
return $this;
}
public function getPriceByEvent(Event $event)
{
$price = null;
foreach ($this->specialistTags as $key => $specialistTag) {
if ($specialistTag->getTag() == $event->getWorkshop()->getTag()) {
$price = $specialistTag->getPrice();
break;
}
}
return $price;
}
public function getIsTva(): ?bool
{
return $this->isTva;
}
public function setIsTva(bool $isTva): self
{
$this->isTva = $isTva;
return $this;
}
/**
* @return Collection<int, CancelEventApplication>
*/
public function getCancelEventApplications(): Collection
{
return $this->cancelEventApplications;
}
public function addCancelEventApplication(CancelEventApplication $cancelEventApplication): self
{
if (!$this->cancelEventApplications->contains($cancelEventApplication)) {
$this->cancelEventApplications[] = $cancelEventApplication;
$cancelEventApplication->setSpecialist($this);
}
return $this;
}
public function removeCancelEventApplication(CancelEventApplication $cancelEventApplication): self
{
if ($this->cancelEventApplications->removeElement($cancelEventApplication)) {
// set the owning side to null (unless already changed)
if ($cancelEventApplication->getSpecialist() === $this) {
$cancelEventApplication->setSpecialist(null);
}
}
return $this;
}
public function getIsVirtualEvent(): ?bool
{
return $this->isVirtualEvent;
}
public function setIsVirtualEvent(bool $isVirtualEvent): self
{
$this->isVirtualEvent = $isVirtualEvent;
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function setStatus(?string $status): self
{
$this->status = $status;
return $this;
}
public function getStatusDate(): ?\DateTimeInterface
{
return $this->statusDate;
}
public function setStatusDate(?\DateTimeInterface $statusDate): self
{
$this->statusDate = $statusDate;
return $this;
}
public function getIdentityCard(): ?string
{
return $this->identityCard;
}
/**
* @return File|null
*/
public function getIdentityCardFile(): ?File
{
return $this->identityCardFile;
}
public function setIdentityCard(?string $identityCard): self
{
$this->identityCard = $identityCard;
return $this;
}
/**
* @param File|null $identityCardFile
* @return Specialist
*/
public function setIdentityCardFile(?File $identityCardFile = null): Specialist
{
$this->identityCardFile = $identityCardFile;
if ($identityCardFile) {
// if 'updatedAt' is not defined in your entity, use another property
$this->updatedAt = new DateTime('now');
}
return $this;
}
public function getInsurance(): ?string
{
return $this->insurance;
}
/**
* @return File|null
*/
public function getInsuranceFile(): ?File
{
return $this->insuranceFile;
}
public function setInsurance(?string $insurance): self
{
$this->insurance = $insurance;
return $this;
}
/**
* @param File|null $insuranceFile
* @return Specialist
*/
public function setInsuranceFile(?File $insuranceFile = null): Specialist
{
$this->insuranceFile = $insuranceFile;
if ($insuranceFile) {
// if 'updatedAt' is not defined in your entity, use another property
$this->updatedAt = new DateTime('now');
}
return $this;
}
public function getDegree(): ?string
{
return $this->degree;
}
/**
* @return File|null
*/
public function getDegreeFile(): ?File
{
return $this->degreeFile;
}
public function setDegree(?string $degree): self
{
$this->degree = $degree;
return $this;
}
/**
* @param File|null $degreeFile
* @return Specialist
*/
public function setDegreeFile(?File $degreeFile = null): Specialist
{
$this->degreeFile = $degreeFile;
if ($degreeFile) {
// if 'updatedAt' is not defined in your entity, use another property
$this->updatedAt = new DateTime('now');
}
return $this;
}
public function getRib(): ?string
{
return $this->rib;
}
/**
* @return File|null
*/
public function getRibFile(): ?File
{
return $this->ribFile;
}
public function setRib(?string $rib): self
{
$this->rib = $rib;
return $this;
}
/**
* @param File|null $ribFile
* @return Specialist
*/
public function setRibFile(?File $ribFile = null): Specialist
{
$this->ribFile = $ribFile;
if ($ribFile) {
// if 'updatedAt' is not defined in your entity, use another property
$this->updatedAt = new DateTime('now');
}
return $this;
}
/**
* @return Collection<int, VisioEvent>
*/
public function getVisioEvents(): Collection
{
return $this->visioEvents;
}
public function addVisioEvent(VisioEvent $visioEvent): self
{
if (!$this->visioEvents->contains($visioEvent)) {
$this->visioEvents[] = $visioEvent;
$visioEvent->setSpecialist($this);
}
return $this;
}
public function removeVisioEvent(VisioEvent $visioEvent): self
{
if ($this->visioEvents->removeElement($visioEvent)) {
// set the owning side to null (unless already changed)
if ($visioEvent->getSpecialist() === $this) {
$visioEvent->setSpecialist(null);
}
}
return $this;
}
public function getStatusMessage(): ?string
{
return $this->statusMessage;
}
public function setStatusMessage(?string $statusMessage): self
{
$this->statusMessage = $statusMessage;
return $this;
}
/**
* @return VisioEvent[]
*/
public function dayVisios(?DateTime $dateTime = null, int $max = 5): array
{
$result = [];
if ($dateTime instanceof DateTime) {
$today = $dateTime->format('Y-m-d');
} else {
$today = (new DateTime())->format('Y-m-d');
}
foreach ($this->getVisioEvents() as $visioEvent) {
if ($visioEvent->getStart()->format('Y-m-d') == $today &&
count($result) < $max && $visioEvent->getStart() > new DateTime()) {
$result[] = $visioEvent;
}
}
return $result;
}
/**
* @return VisioEvent[]
*/
public function dayVisiosFiltered(?DateTime $dateTime = null, int $max = 5, bool $valid = false): array
{
$result = [];
if ($dateTime instanceof DateTime) {
$today = $dateTime->format('Y-m-d');
} else {
$today = (new DateTime())->format('Y-m-d');
}
foreach ($this->getVisioEvents() as $visioEvent) {
if ($visioEvent->getStart()->format('Y-m-d') == $today &&
count($result) < $max && (!$valid || $visioEvent->isOpen())) {
$result[] = $visioEvent;
}
}
return $result;
}
/**
* @param DateTime|null $dateTime
* @param int $max
* @param bool $valid
* @param int $rank
* @return VisioEvent[]
*/
public function dayVisiosNextDay(?DateTime $dateTime = null, int $max = 5, bool $valid = false, int $rank = 0): array
{
if ($dateTime == null){
$dateTime = new DateTime();
}
$result = $this->dayVisiosFiltered($dateTime, $max, $valid);
if (empty($result) && $rank < 10){
$dateTime->modify('+1 day');
$result = $this->dayVisiosNextDay($dateTime, $max, $valid, ++$rank);
}
return $result;
}
/**
* @return Collection<int, VisioEventPromotion>
*/
public function getVisioEventPromotions(): Collection
{
return $this->visioEventPromotions;
}
public function addVisioEventPromotion(VisioEventPromotion $visioEventPromotion): self
{
if (!$this->visioEventPromotions->contains($visioEventPromotion)) {
$this->visioEventPromotions[] = $visioEventPromotion;
$visioEventPromotion->addSpecialist($this);
}
return $this;
}
public function removeVisioEventPromotion(VisioEventPromotion $visioEventPromotion): self
{
if ($this->visioEventPromotions->removeElement($visioEventPromotion)) {
$visioEventPromotion->removeSpecialist($this);
}
return $this;
}
/**
* @Groups({"search"})
* @SerializedName("text")
* @return string
*/
public function getText(): string
{
return (string)$this;
}
public function getUuid()
{
return $this->uuid;
}
public function setUuid($uuid): self
{
$this->uuid = $uuid;
return $this;
}
/**
* @return bool
* @var Datetime $start
* @var Datetime $end
* Permet de savoir si il est disponible en fonction d'une date de début et de fin
*/
public function isAvailable(\DateTime $start, \DateTime $end): bool
{
$isAvailable = true;
foreach($this->getEvents()->toArray() as $event)
{
if($event->isInComing()) {
if($event->getStart() >= $start && $event->getStart() <= $end
&& $event->getEnd() >= $start && $event->getEnd() <= $end) {
$isAvailable = false;
}
}
}
return $isAvailable;
}
public function getIsAffiliated(): ?bool
{
return $this->isAffiliated;
}
public function setIsAffiliated(?bool $isAffiliated): self
{
$this->isAffiliated = $isAffiliated;
return $this;
}
public function getAffiliatedCompany(): ?Company
{
return $this->affiliatedCompany;
}
public function setAffiliatedCompany(?Company $affiliatedCompany): self
{
$this->affiliatedCompany = $affiliatedCompany;
return $this;
}
/**
* @return Collection<int, Company>
*/
public function getCompanies(): Collection
{
return $this->companies;
}
public function setCompanies(Collection $companies): self
{
$this->companies = $companies;
return $this;
}
public function addCompany(Company $company): self
{
if (!$this->companies->contains($company)) {
$this->companies[] = $company;
}
return $this;
}
public function removeCompany(Company $company): self
{
$this->companies->removeElement($company);
return $this;
}
public function getspecialistType(): ?string
{
return $this->specialistType;
}
public function setspecialistType(?string $specialistType): self
{
$this->specialistType = $specialistType;
return $this;
}
/**
* @return Collection<int, AffiliatedEventApplication>
*/
public function getAffiliatedEventApplications(): Collection
{
return $this->affiliatedEventApplications;
}
public function addAffiliatedEventApplication(AffiliatedEventApplication $affiliatedEventApplication): self
{
if (!$this->affiliatedEventApplications->contains($affiliatedEventApplication)) {
$this->affiliatedEventApplications[] = $affiliatedEventApplication;
$affiliatedEventApplication->setSpecialist($this);
}
return $this;
}
public function removeAffiliatedEventApplication(AffiliatedEventApplication $affiliatedEventApplication): self
{
if ($this->affiliatedEventApplications->removeElement($affiliatedEventApplication)) {
// set the owning side to null (unless already changed)
if ($affiliatedEventApplication->getSpecialist() === $this) {
$affiliatedEventApplication->setSpecialist(null);
}
}
return $this;
}
public function getSiret(): ?string
{
return $this->siret;
}
public function setSiret(?string $siret): self
{
$this->siret = $siret;
return $this;
}
}