<?php
namespace App\Entity\Operation;
use App\Entity\MediaObject\MediaCodeOdr;
use App\Entity\PeriodicityOperationMultiOffer;
use App\Manager\Operation\OperationManager;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\BooleanFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
use App\Controller\Api\Operation\Odr\GetAllPublicOdrs;
use App\Controller\Api\Operation\Odr\GetOdrParticipationByUser;
use App\Controller\Api\Operation\Odr\GetOneOdr;
use App\Controller\Api\Operation\Odr\GetOneOperationOdr;
use App\Entity\Details\Operation\DetailsOdr;
use App\Entity\MediaObject\MediaDesktopOdr;
use App\Entity\MediaObject\MediaMobileOdr;
use App\Entity\MediaObject\MediaPdfOdr;
use App\Entity\MediaObject\MediaThumbnailOdr;
use App\Repository\Operation\OdrRepository;
use App\Service\DateUtils;
use Exception;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\SerializedName;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass=OdrRepository::class)
* @ApiResource(
* attributes={
* "force_eager"=false,
* "normalization_context"={
* "groups"={
* "OperationOdr:output",
* "OperationOdr:io",
* "get_one_public_odr",
* "get_all_odr_user",
* },
* "enable_max_depth"=true
* },
* "denormalization_context"={
* "groups"={
* "OperationOdr:input",
* "OperationOdr:io",
* "get_one_public_odr",
* },
* "enable_max_depth"=true
* },
* "order"={"startDate": "ASC"}
* },
* collectionOperations={
* "post"={
* "method"="POST",
* "access_control"="is_granted('ROLE_ADMIN_SOGEC')",
* },
* "public-get"={
* "path"="/public/odrs",
* "method"="GET",
* "controller"=GetAllPublicOdrs::class,
* "access_control"="is_granted('ROLE_PUBLIC')",
* },
* "get-all-odr-user"={
* "method"="GET",
* "path"="/odrs",
* "access_control"="is_granted('ROLE_USER')",
* "validation_groups"={"get_all_odr_user"},
* "controller"=GetOdrParticipationByUser::class,
* "defaults"={"_api_receive"=false},
* },
* },
* itemOperations={
* "put"={
* "method"="PUT",
* "access_control"="is_granted('ROLE_ADMIN_SOGEC')",
* },
* "public-get"={
* "method"="GET",
* "path"="/public/offer-odr/{id}",
* "access_control"="is_granted('ROLE_PUBLIC')",
* "validation_groups"={"get_one_public_odr"},
* "controller"=GetOneOdr::class,
* "defaults"={"_api_receive"=false},
* },
* "public-get-operation-odr"={
* "method"="GET",
* "path"="/public/operation-odr/{id}",
* "access_control"="is_granted('ROLE_PUBLIC')",
* "validation_groups"={"get_one_public_odr"},
* "controller"=GetOneOperationOdr::class,
* "defaults"={"_api_receive"=false},
* },
* "get-public"={
* "method"="GET",
* "path"="/public/odr/{id}",
* "controller"=GetOneOdr::class,
* },
* "get-odr-by-user"={
* "method"="GET",
* "controller"=GetOneOdr::class,
* "path"="/odr/{id}",
* },
* }
* )
*/
class Odr extends Operation
{
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @SerializedName("subtitle")
* @Groups({
* "OperationOdr:output",
* "ParticipationOdr:io",
* "OperationOdr:io",
* "get_all_odr_user",
* })
*/
private ?string $subtitle;
/**
* @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"})
* @Assert\GreaterThan(propertyPath="billyStartDate")
* @Assert\NotBlank()
* @Groups({
* "OperationOdr:io",
* "get_participation_odrs_by_user",
* "get_all_odr_user",
* })
* @ApiFilter(DateFilter::class, strategy=DateFilter::EXCLUDE_NULL)
*/
private $startDate;
/**
* @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"})
* @Assert\LessThanOrEqual(propertyPath="billyEndDate")
* @Assert\NotBlank()
* @Groups({
* "OperationOdr:io",
* "get_participation_odrs_by_user",
* "get_all_odr_user",
* })
* @ApiFilter(DateFilter::class, strategy=DateFilter::EXCLUDE_NULL)
*/
private $endDate;
/**
* @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"}, nullable=true)
* @Assert\NotBlank()
* @Groups({
* "OperationOdr:io",
* "get_all_odr_user",
* })
* @ApiFilter(DateFilter::class, strategy=DateFilter::EXCLUDE_NULL)
*/
private ?\DateTimeInterface $billyStartDate;
/**
* @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"})
* @Assert\NotBlank()
* @Groups({
* "OperationOdr:io",
* "get_all_odr_user",
* })
* @ApiFilter(DateFilter::class, strategy=DateFilter::EXCLUDE_NULL)
*/
private ?\DateTimeInterface $billyEndDate;
/**
* @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"})
* @Assert\NotBlank()
* @Groups({
* "OperationOdr:io",
* "get_all_odr_user",
* })
* @ApiFilter(DateFilter::class, strategy=DateFilter::EXCLUDE_NULL)
*/
private ?\DateTimeInterface $subscriptionEndDate;
/**
* @var MediaThumbnailOdr
* @Assert\Valid()
* @Assert\NotBlank()
* @ORM\OneToMany(targetEntity=MediaThumbnailOdr::class, mappedBy="odr", cascade={"persist"})
* @SerializedName("thumbnail_odrs")
* @Groups({
* "OperationOdr:output",
* "MediaThumbnailOdr:io",
* "get_all_odr_user",
* })
*/
private $thumbnailOdrs;
/**
* @var MediaDesktopOdr
* @Assert\Valid()
* @Assert\NotBlank()
* @ORM\OneToMany(targetEntity=MediaDesktopOdr::class, mappedBy="odr", cascade={"persist"})
* @SerializedName("desktop_odrs")
* @Groups({
* "OperationOdr:output",
* "MediaDesktopOdr:io",
* "get_all_odr_user",
* })
*/
private $desktopOdrs;
/**
* @var MediaMobileOdr
* @Assert\Valid()
* @Assert\NotBlank()
* @ORM\OneToMany(targetEntity=MediaMobileOdr::class, mappedBy="odr", cascade={"persist"})
* @SerializedName("mobile_odrs")
* @Groups({
* "OperationOdr:output",
* "MediaMobileOdr:io",
* "get_all_odr_user",
* })
*/
private $mobileOdrs;
/**
* @var MediaPdfOdr
* @Assert\NotBlank()
* @Assert\Valid()
* @ORM\OneToMany(targetEntity=MediaPdfOdr::class, mappedBy="odr", cascade={"persist"})
* @SerializedName("pdf_odrs")
* @Groups({
* "OperationOdr:output",
* "MediaPdfOdr:io",
* "get_all_odr_user",
* })
*/
private $pdfOdrs;
/**
* @var MediaCodeOdr|null
* @ORM\OneToMany(targetEntity=MediaCodeOdr::class, mappedBy="odr", cascade={"persist"})
* @SerializedName("media_code_odrs")
* @Groups({
* "MediaCodeOdr:io"
* })
*/
private $mediaCodeOdrs;
/**
* @ORM\Column(type="boolean", options={"default": 0})
* @Groups({
* "OperationOdr:io",
* "get_all_odr_user",
* })
* @ApiFilter(BooleanFilter::class)
*/
private bool $online = false;
/**
* @ORM\Column(type="boolean", options={"default": 0})
* @Groups({
* "OperationOdr:io",
* "get_all_odr_user",
* })
* @ApiFilter(BooleanFilter::class)
*/
private bool $receipt = false;
/**
* @ORM\Column(type="boolean", options={"default": 0})
* @Groups({
* "OperationOdr:io",
* "get_all_odr_user",
* })
* @ApiFilter(BooleanFilter::class)
*/
private bool $barCode = false;
/**
* @SerializedName("max_part_by_user")
* @ORM\Column(type="integer")
* @Groups({
* "OperationOdr:io",
* })
*/
private $maxPartByUser;
/**
* @SerializedName("max_participation_per_month")
* @ORM\Column(type="integer")
* @Groups({
* "OperationOdr:io",
* })
*/
private $maxParticipationPerMonth;
/**
* @ORM\Column(type="string", length=255)
* @Groups({
* "OperationOdr:io",
* })
*/
private $periodicity;
/**
* @ORM\Column(type="text", columnDefinition="LONGTEXT", nullable=true)
* @SerializedName("first_step")
* @Groups({
* "OperationOdr:output",
* })
*/
private ?string $firstStep;
/**
* @ORM\Column(type="text", columnDefinition="LONGTEXT", nullable=true)
* @SerializedName("second_step")
* @Groups({
* "OperationOdr:output",
* })
*/
private ?string $secondStep;
/**
* @ORM\Column(type="text", columnDefinition="LONGTEXT", nullable=true)
* @SerializedName("third_step")
* @Groups({
* "OperationOdr:output",
* })
*/
private ?string $thirdStep;
/**
* @ORM\Column(type="text", columnDefinition="LONGTEXT", nullable=true)
* @SerializedName("fourth_step")
* @Groups({
* "OperationOdr:output",
* })
*/
private ?string $fourthStep;
/**
* @ORM\Column(type="text", columnDefinition="LONGTEXT", nullable=true)
* @SerializedName("fifth_step")
* @Groups({
* "OperationOdr:output",
* })
*/
private ?string $fifthStep;
/**
* @ORM\Column(type="integer", options={"default" : 0})
* @Groups({
* "OperationOdr:io",
* })
*/
private $stock = 0;
/**
* @ORM\Column(type="integer", options={"default" : 0})
* @SerializedName("current_stock")
* @Groups({
* "OperationOdr:io",
* })
*/
private int $currentStock = 0;
/**
* @ORM\Column(type="float", options={"default" : 0})
* @Groups({
* "OperationOdr:io",
* })
*/
private $percentage = 0;
/**
* @ORM\OneToOne(targetEntity=DetailsOdr::class, mappedBy="operation", cascade={"persist", "remove"})
* @SerializedName("details_odr")
* @Groups({
* "OperationOdr:io",
* "get_all_public_odrs",
* })
*/
private ?DetailsOdr $details;
/**
* @Groups({
* "get_all_odr_user",
* })
*/
private bool $participated = false;
public function __construct()
{
parent::__construct();
$this->thumbnailOdrs = new ArrayCollection();
$this->desktopOdrs = new ArrayCollection();
$this->mobileOdrs = new ArrayCollection();
$this->pdfOdrs = new ArrayCollection();
}
public function getSubtitle(): ?string
{
return $this->subtitle;
}
public function setSubtitle(?string $subtitle): Odr
{
$this->subtitle = $subtitle;
return $this;
}
public function getStartDate(): ?\DateTimeInterface
{
return $this->startDate;
}
public function setStartDate(\DateTimeInterface $startDate): self
{
$this->startDate = $startDate;
return $this;
}
public function getEndDate(): ?\DateTimeInterface
{
return $this->endDate;
}
public function setEndDate(\DateTimeInterface $endDate): self
{
$this->endDate = $endDate;
return $this;
}
public function getBillyStartDate(): ?\DateTimeInterface
{
return $this->billyStartDate;
}
public function setBillyStartDate(?\DateTimeInterface $billyStartDate): self
{
$this->billyStartDate = $billyStartDate;
return $this;
}
public function getBillyEndDate(): ?\DateTimeInterface
{
return $this->billyEndDate;
}
public function setBillyEndDate(?\DateTimeInterface $billyEndDate): self
{
$this->billyEndDate = $billyEndDate;
return $this;
}
public function getSubscriptionEndDate(): ?\DateTimeInterface
{
return $this->subscriptionEndDate;
}
public function setSubscriptionEndDate(?\DateTimeInterface $subscriptionEndDate): self
{
$this->subscriptionEndDate = $subscriptionEndDate;
return $this;
}
public function isOnline(): bool
{
return (bool) $this->online;
}
public function getOnline(): bool
{
return (bool) $this->online;
}
public function setOnline(bool $online): self
{
$this->online = $online;
return $this;
}
public function isReceipt(): bool
{
return (bool) $this->receipt;
}
public function getReceipt(): bool
{
return (bool) $this->receipt;
}
public function setReceipt(bool $receipt): self
{
$this->receipt = $receipt;
return $this;
}
public function isBarCode(): bool
{
return (bool) $this->barCode;
}
public function getBarCode(): bool
{
return (bool) $this->barCode;
}
public function setBarCode(bool $barCode): self
{
$this->barCode = $barCode;
return $this;
}
public function getMaxPartByUser(): ?int
{
return $this->maxPartByUser;
}
public function setMaxPartByUser(?int $maxPartByUser): self
{
$this->maxPartByUser = $maxPartByUser;
return $this;
}
public function getThumbnailOdrs()
{
return $this->thumbnailOdrs;
}
public function setThumbnailOdr(MediaThumbnailOdr $thumbnailOdrs): Odr
{
$this->thumbnailOdrs = $thumbnailOdrs;
return $this;
}
public function addThumbnailOdr(MediaThumbnailOdr $thumbnailOdr)
{
if ($this->thumbnailOdrs->contains($thumbnailOdr)) {
return;
}
$this->thumbnailOdrs[] = $thumbnailOdr;
$thumbnailOdr->setOdr($this);
}
public function getDesktopOdrs()
{
return $this->desktopOdrs;
}
public function setDesktopOdr(MediaDesktopOdr $desktopOdrs): Odr
{
$this->desktopOdrs = $desktopOdrs;
return $this;
}
public function addDesktopOdr(MediaDesktopOdr $desktopOdr)
{
if ($this->desktopOdrs->contains($desktopOdr)) {
return;
}
$this->desktopOdrs[] = $desktopOdr;
$desktopOdr->setOdr($this);
}
public function getMobileOdrs()
{
return $this->mobileOdrs;
}
public function setMobileOdr(MediaMobileOdr $mobileOdrs): Odr
{
$this->mobileOdrs = $mobileOdrs;
return $this;
}
public function addMobileOdr(MediaMobileOdr $mobileOdr)
{
if ($this->mobileOdrs->contains($mobileOdr)) {
return;
}
$this->mobileOdrs[] = $mobileOdr;
$mobileOdr->setOdr($this);
}
public function getPdfOdrs()
{
return $this->pdfOdrs;
}
public function setPdfOdr(MediaPdfOdr $pdfOdrs): Odr
{
$this->pdfOdrs = $pdfOdrs;
return $this;
}
public function addPdfOdr(MediaPdfOdr $pdfOdr)
{
if ($this->pdfOdrs->contains($pdfOdr)) {
return;
}
$this->pdfOdrs[] = $pdfOdr;
$pdfOdr->SetOdr($this);
}
/**
* @return string
*/
public function getFirstStep(): ?string
{
return $this->firstStep;
}
public function setFirstStep(?string $firstStep): self
{
$this->firstStep = $firstStep;
return $this;
}
/**
* @return string
*/
public function getSecondStep(): ?string
{
return $this->secondStep;
}
public function setSecondStep(?string $secondStep): self
{
$this->secondStep = $secondStep;
return $this;
}
/**
* @return string
*/
public function getThirdStep(): ?string
{
return $this->thirdStep;
}
public function setThirdStep(?string $thirdStep): self
{
$this->thirdStep = $thirdStep;
return $this;
}
/**
* @return string
*/
public function getFourthStep(): ?string
{
return $this->fourthStep;
}
public function setFourthStep(?string $fourthStep): self
{
$this->fourthStep = $fourthStep;
return $this;
}
/**
* @return string
*/
public function getFifthStep(): ?string
{
return $this->fifthStep;
}
public function setFifthStep(?string $fifthStep): self
{
$this->fifthStep = $fifthStep;
return $this;
}
public function getStock(): int
{
return $this->stock;
}
public function hasStock(): bool
{
return (bool)$this->stock;
}
public function setStock(int $stock): self
{
$this->stock = $stock;
return $this;
}
public function getPercentage(): float
{
return $this->percentage;
}
public function setPercentage(string $percentage): self
{
$this->percentage = $percentage;
return $this;
}
public function getDetails(): ?DetailsOdr
{
return $this->details;
}
public function setDetails(?DetailsOdr $details): self
{
$this->details = $details;
return $this;
}
/**
* @return bool
*/
public function isParticipated(): bool
{
return $this->participated;
}
/**
* @param bool $participated
* @return Odr
*/
public function setParticipated(bool $participated): Odr
{
$this->participated = $participated;
return $this;
}
public function decreaseStock()
{
$this->currentStock--;
}
public function getMaxParticipationPerMonth(): ?int
{
return $this->maxParticipationPerMonth;
}
public function setMaxParticipationPerMonth(int $maxParticipationPerMonth): self
{
$this->maxParticipationPerMonth = PeriodicityOperationMultiOffer::getOperationMaxParticipationPerMonth($maxParticipationPerMonth, $this->periodicity,
$this->stock, $this->billyStartDate, $this->billyEndDate);
return $this;
}
public function getPeriodicity(): ?string
{
return $this->periodicity;
}
/**
* @throws Exception
*/
public function setPeriodicity(string $periodicity): self
{
if (PeriodicityOperationMultiOffer::BILLY_PERIODICITY[$periodicity] ?? 0) {
$this->periodicity = $periodicity;
} else {
throw new Exception(sprintf("Periodicity not found : %s", $periodicity));
}
return $this;
}
public function getCurrentStock(): int
{
return $this->currentStock;
}
public function setCurrentStock(int $currentStock): self
{
$this->currentStock = $currentStock;
return $this;
}
}