<?php
declare(strict_types=1);
namespace Croisiland\CommonBundle\Entity\Offer;
use Crea\ToolsBundle\Entity\CreaIconIdentifiedInterface;
use Crea\ToolsBundle\Entity\CreaIconTrait;
use Crea\MediaBundle\Entity\MediaTagOwnerInterface;
use Crea\ParameterBundle\Entity\Parameter;
use Crea\ToolsBundle\Entity\LifecycleUserIdentifierTrait;
use Croisiland\CommonBundle\Annotation\Offer\OfferFormValidator;
use Croisiland\CommonBundle\Entity\Company\Company;
use Croisiland\CommonBundle\Entity\Partner\Partner;
use Croisiland\CommonBundle\Entity\Price\Price;
use Croisiland\CommonBundle\Entity\Traits\IsActiveTrait;
use Croisiland\CommonBundle\Entity\Traits\ListOrderTrait;
use Croisiland\CommonBundle\Repository\Offer\OfferRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Util\ClassUtils;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity(repositoryClass=OfferRepository::class)
*
* @OfferFormValidator(groups={"offer_form_validator"})
*/
class Offer implements MediaTagOwnerInterface, CreaIconIdentifiedInterface
{
use LifecycleUserIdentifierTrait;
use IsActiveTrait;
use ListOrderTrait;
/**
* @ORM\Id
*
* @ORM\GeneratedValue
*
* @ORM\Column(type="integer")
*/
private ?int $id = null;
/**
* @var Collection<int, Company>
*
* @ORM\ManyToMany(targetEntity=Company::class, inversedBy="offers")
*/
private Collection $companies;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private ?string $shortConditions = null;
/**
* @ORM\Column(type="text", nullable=true)
*/
private ?string $conditions = null;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private ?string $shortDescription = null;
/**
* @ORM\Column(type="text", nullable=true)
*/
private ?string $description = null;
/**
* @ORM\Column(type="text", nullable=true)
*/
private ?string $headerDescription = null;
/**
* @ORM\Column(type="string", length=255)
*/
private ?string $displayedName = null;
/**
* @ORM\Column(type="text", nullable=true)
*/
private ?string $metaDescription = null;
/**
* @ORM\Column(type="string", length=255)
*/
private ?string $name = null;
/**
* @ORM\ManyToOne(targetEntity=OfferCategory::class, inversedBy="offers")
*/
private ?OfferCategory $offerCategory = null;
/**
* @var Collection<int, OfferCruise>
*
* @ORM\OneToMany(targetEntity=OfferCruise::class, mappedBy="offer", orphanRemoval=true)
*/
private Collection $offerCruises;
/**
* @ORM\ManyToOne(targetEntity=Parameter::class)
*
* @ORM\JoinColumn(nullable=false)
*/
private ?Parameter $offerType = null;
/**
* @var Collection<int, Partner>
*
* @ORM\ManyToMany(targetEntity=Partner::class, inversedBy="offers")
*/
private Collection $partners;
/**
* @ORM\Column(type="boolean")
*/
private bool $permanent = false;
/**
* @var Collection<int, Price>
*
* @ORM\OneToMany(targetEntity=Price::class, mappedBy="offer", orphanRemoval=false)
*/
private Collection $prices;
/**
* @ORM\Column(type="text", nullable=true)
*/
private ?string $summary = null;
/**
* @ORM\Column(type="string", length=100, unique=true)
*
* @Gedmo\Slug(fields={"name"}, updatable=false, unique=true)
*/
private ?string $slug = null;
/**
* @ORM\Column(type="date", nullable=true)
*/
private ?\DateTimeInterface $validityEndsAt = null;
/**
* @ORM\Column(type="date", nullable=true)
*/
private ?\DateTimeInterface $validityStartsAt = null;
/**
* @var Collection<int, Parameter>
*
* @ORM\ManyToMany(targetEntity=Parameter::class)
*/
private Collection $visibilities;
/**
* @ORM\Column(type="boolean")
*/
private bool $webReservation = true;
public function __construct()
{
$this->companies = new ArrayCollection();
$this->offerCruises = new ArrayCollection();
$this->partners = new ArrayCollection();
$this->prices = new ArrayCollection();
$this->visibilities = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function addCompany(Company $company): self
{
if (!$this->companies->contains($company)) {
$this->companies[] = $company;
}
return $this;
}
/**
* @return Collection<int, Company>
*/
public function getCompanies(): Collection
{
return $this->companies;
}
public function removeCompany(Company $company): self
{
$this->companies->removeElement($company);
return $this;
}
public function getShortConditions(): ?string
{
return $this->shortConditions;
}
public function setShortConditions(?string $shortConditions): self
{
$this->shortConditions = $shortConditions;
return $this;
}
public function getConditions(): ?string
{
return $this->conditions;
}
public function setConditions(?string $conditions): self
{
$this->conditions = $conditions;
return $this;
}
public function getShortDescription(): ?string
{
return $this->shortDescription;
}
public function setShortDescription(?string $shortDescription): self
{
$this->shortDescription = $shortDescription;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getHeaderDescription(): ?string
{
return $this->headerDescription;
}
public function setHeaderDescription(?string $headerDescription): self
{
$this->headerDescription = $headerDescription;
return $this;
}
public function getDisplayedName(): ?string
{
return $this->displayedName;
}
public function setDisplayedName(?string $displayedName): self
{
$this->displayedName = $displayedName;
return $this;
}
/**
* Method liée au Média Bundle
*/
public function getMediaTagOwnerLabel(): ?string
{
return $this->getName();
}
public function getMetaDescription(): ?string
{
return $this->metaDescription;
}
public function setMetaDescription(?string $metaDescription): self
{
$this->metaDescription = $metaDescription;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(?string $name): self
{
$this->name = $name;
return $this;
}
public function getOfferCategory(): ?OfferCategory
{
return $this->offerCategory;
}
public function setOfferCategory(?OfferCategory $offerCategory): self
{
$this->offerCategory = $offerCategory;
return $this;
}
public function addOfferCruise(OfferCruise $offerCruise): self
{
if (!$this->offerCruises->contains($offerCruise)) {
$this->offerCruises[] = $offerCruise;
$offerCruise->setOffer($this);
}
return $this;
}
/**
* @return Collection<int, OfferCruise>
*/
public function getOfferCruises(): Collection
{
return $this->offerCruises;
}
public function removeOfferCruise(OfferCruise $offerCruise): self
{
if ($this->offerCruises->removeElement($offerCruise)) {
if ($offerCruise->getOffer() === $this) {
$offerCruise->setOffer(null);
}
}
return $this;
}
public function getOfferType(): ?Parameter
{
return $this->offerType;
}
public function setOfferType(?Parameter $offerType): self
{
$this->offerType = $offerType;
return $this;
}
public function addPartner(Partner $partner): self
{
if (!$this->partners->contains($partner)) {
$this->partners[] = $partner;
}
return $this;
}
/**
* @return Collection<int, Partner>
*/
public function getPartners(): Collection
{
return $this->partners;
}
public function removePartner(Partner $partner): self
{
$this->partners->removeElement($partner);
return $this;
}
public function isPermanent(): ?bool
{
return $this->permanent;
}
public function setPermanent(bool $permanent): self
{
$this->permanent = $permanent;
return $this;
}
public function addPrice(Price $price): self
{
if (!$this->prices->contains($price)) {
$this->prices[] = $price;
$price->setOffer($this);
}
return $this;
}
/**
* @return Collection<int, Price>
*/
public function getPrices(): Collection
{
return $this->prices;
}
public function removePrice(Price $price): self
{
if ($this->prices->removeElement($price)) {
if ($price->getOffer() === $this) {
$price->setOffer(null);
}
}
return $this;
}
public function getSummary(): ?string
{
return $this->summary;
}
public function setSummary(?string $summary): self
{
$this->summary = $summary;
return $this;
}
public function getSlug(): ?string
{
return $this->slug;
}
public function setSlug(?string $slug): self
{
$this->slug = $slug;
return $this;
}
public function getValidityEndsAt(): ?\DateTimeInterface
{
return $this->validityEndsAt;
}
public function setValidityEndsAt(?\DateTimeInterface $validityEndsAt): self
{
$this->validityEndsAt = $validityEndsAt;
return $this;
}
public function getValidityStartsAt(): ?\DateTimeInterface
{
return $this->validityStartsAt;
}
public function setValidityStartsAt(?\DateTimeInterface $validityStartsAt): self
{
$this->validityStartsAt = $validityStartsAt;
return $this;
}
public function addVisibility(Parameter $visibility): self
{
if (!$this->visibilities->contains($visibility)) {
$this->visibilities[] = $visibility;
}
return $this;
}
/**
* @return Collection<int, Parameter>
*/
public function getVisibilities(): Collection
{
return $this->visibilities;
}
public function removeVisibility(Parameter $visibility): self
{
$this->visibilities->removeElement($visibility);
return $this;
}
public function isWebReservation(): ?bool
{
return $this->webReservation;
}
public function setWebReservation(bool $webReservation): self
{
$this->webReservation = $webReservation;
return $this;
}
/**
* Method liée au Média Bundle
* @return class-string
*/
public function getFqcn(): string
{
return ClassUtils::getClass($this);
}
public function setIcon(?string $icon): static
{
return $this->offerCategory->setIcon($icon);
}
public function getIcon(): ?string
{
return $this->offerCategory->getIcon();
}
public function getIconLabel(): ?string
{
return $this->getName();
}
/**
* @return array<string,int|string>
*/
public function getIconOptions(): array
{
$options = [
'fill' => $this->offerCategory->getIconColorFill(),
'stroke' => $this->offerCategory->getIconColorStroke(),
'stroke-width' => $this->offerCategory->getIconStrokeWidth(),
'stroke-linecap' => $this->offerCategory->getIconStrokeLinecap(),
'stroke-linejoin' => $this->offerCategory->getIconStrokeLinejoin(),
];
return array_filter($options);
}
}