<?php
namespace App\Entity\Operation;
use App\Entity\PeriodicityOperationMultiOffer;
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\Multi\GetAllMultiOfferCoupon;
use App\Controller\Api\Operation\Multi\GetAllMultiOfferOdr;
use App\Controller\Api\Operation\Multi\GetMultiCouponByUser;
use App\Controller\Api\Operation\Multi\GetMultiOfferOdrByUserDepartment;
use App\Controller\Api\Operation\Multi\GetOneMultiOfferByUserDepartment;
use App\Controller\Api\Operation\Multi\GetOnePublicMultiOdr;
use App\Entity\Details\Operation\DetailsMultiOffer;
use App\Repository\Operation\MultiOfferRepository;
use App\Service\DateUtils;
use DateTime;
use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation;
use Doctrine\ORM\Mapping as ORM;
use Exception;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\SerializedName;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass=MultiOfferRepository::class)
* @ApiResource(
* attributes={
* "force_eager"=false,
* "normalization_context"={
* "groups"={
* "OperationMultiOffer:output",
* "OperationMultiOffer:io",
* "get_one_public_multi_offer_odr",
* "get_all_multi_offer_odr_user",
* },
* "enable_max_depth"=true
* },
* "denormalization_context"={
* "groups"={
* "OperationMultiOffer:input",
* "OperationMultiOffer:io",
* "get_one_public_multi_offer_odr",
* },
* "enable_max_depth"=true
* },
* "order"={"startDate": "ASC"}
* },
* collectionOperations={
* "post"={
* "method"="POST",
* "access_control"="is_granted('ROLE_ADMIN_SOGEC')",
* },
* "public-get-odr"={
* "path"="/public/multi-offer-odr",
* "method"="GET",
* "access_control"="is_granted('ROLE_PUBLIC')",
* "controller"=GetAllMultiOfferOdr::class,
* "defaults"={"_api_receive"=false},
* },
* "get-public-odr"={
* "method"="GET",
* "path"="/public/offer-multi-odr",
* },
* "get-multi-offers-by-user-department"={
* "method"="GET",
* "path"="/multi-offers",
* "access_control"="is_granted('ROLE_USER')",
* "controller"=GetMultiOfferOdrByUserDepartment::class,
* "defaults"={"_api_receive"=false},
* },
* "public-get-coupon"={
* "path"="/public/multi-offer-coupon",
* "method"="GET",
* "access_control"="is_granted('ROLE_PUBLIC')",
* "controller"=GetAllMultiOfferCoupon::class,
* "defaults"={"_api_receive"=false},
* },
* "get-by-user"={
* "method"="GET",
* "path"="/multi-offer-coupon",
* "access_control"="is_granted('ROLE_USER')",
* "validation_groups"={"OperationMultiOffer:io"},
* "controller"=GetMultiCouponByUser::class,
* "defaults"={"_api_receive"=false},
* }
* },
* itemOperations={
* "get",
* "put"={
* "method"="PUT",
* "access_control"="is_granted('ROLE_ADMIN_SOGEC')",
* },
* "public-get-odr"={
* "method"="GET",
* "path"="/public/offer-multi-odr/{id}",
* "access_control"="is_granted('ROLE_PUBLIC')",
* "controller"=GetOnePublicMultiOdr::class,
* "defaults"={"_api_receive"=false},
* },
* "get-public-odr"={
* "method"="GET",
* "path"="/public/multi-offer-odr/{id}",
* },
* "get-multi-offer"={
* "method"="GET",
* "path"="/multi-offer/{id}",
* "controller"=GetOneMultiOfferByUserDepartment::class,
* },
* }
* )
*/
class MultiOffer extends Operation
{
/**
* @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"})
* @Assert\NotBlank()
* @Groups({
* "OperationMultiOffer:io",
* })
* @ApiFilter(DateFilter::class, strategy=DateFilter::EXCLUDE_NULL)
*/
private DateTime $billyStartDate;
/**
* @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"})
* @Assert\NotBlank()
* @Groups({
* "OperationMultiOffer:io",
* })
* @ApiFilter(DateFilter::class, strategy=DateFilter::EXCLUDE_NULL)
*/
private DateTime $billyEndDate;
/**
* @ORM\OneToOne(targetEntity=DetailsMultiOffer::class, cascade={"persist", "remove"}, fetch="EAGER")
* @Groups({
* "OperationMultiOffer:io",
* "ParticipationMulti:io",
* })
*/
private ?DetailsMultiOffer $details;
/**
* @ORM\Column(type="boolean", options={"default": 0})
* @Groups({
* "OperationMultiOffer:io",
* })
* @ApiFilter(BooleanFilter::class)
*/
private bool $online = false;
/**
* @ORM\Column(type="integer", options={"default" : 0})
* @Groups({
* "OperationMultiOffer:io",
* })
*/
private $stock;
/**
* @ORM\Column(type="integer", options={"default" : 0})
* @Groups({
* "OperationMultiOffer:io",
* })
*/
private int $currentStock = 0;
/**
* @SerializedName("max_part_by_user")
* @ORM\Column(type="integer")
* @Groups({
* "OperationMultiOffer:io",
* })
*/
private int $maxPartByUser;
/**
* @SerializedName("max_participation_per_month")
* @ORM\Column(type="integer")
* @Groups({
* "OperationMultiOffer:io",
* })
*/
private $maxParticipationPerMonth;
/**
* @ORM\Column(type="string", length=255)
* @Groups({
* "OperationMultiOffer:io",
* })
*/
private $periodicity;
/**
* @Groups({
* "OperationCoupon:o",
* "get_all_public_coupons",
* "get_coupons_by_user_department",
* "OperationMultiOffer:io",
* })
*/
private bool $printed = false;
/**
* @return DateTime
*/
public function getBillyStartDate(): DateTime
{
return $this->billyStartDate;
}
/**
* @param DateTime $billyStartDate
* @return MultiOffer
*/
public function setBillyStartDate(DateTime $billyStartDate): MultiOffer
{
$this->billyStartDate = $billyStartDate;
return $this;
}
/**
* @return DateTime
*/
public function getBillyEndDate(): DateTime
{
return $this->billyEndDate;
}
/**
* @param DateTime $billyEndDate
* @return MultiOffer
*/
public function setBillyEndDate(DateTime $billyEndDate): MultiOffer
{
$this->billyEndDate = $billyEndDate;
return $this;
}
/**
* @return DetailsMultiOffer|null
*/
public function getDetails(): ?DetailsMultiOffer
{
return $this->details;
}
/**
* @param DetailsMultiOffer|null $details
* @return MultiOffer
*/
public function setDetails(?DetailsMultiOffer $details): MultiOffer
{
$this->details = $details;
return $this;
}
/**
* @return bool
*/
public function isOnline(): bool
{
return $this->online;
}
/**
* @param bool $online
* @return MultiOffer
*/
public function setOnline(bool $online): MultiOffer
{
$this->online = $online;
return $this;
}
public function getStock(): ?int
{
return $this->stock;
}
public function setStock(int $stock): self
{
$this->stock = $stock;
return $this;
}
public function hasStock(): bool
{
return (bool)$this->stock;
}
public function getCurrentStock(): int
{
return $this->currentStock;
}
public function setCurrentStock(int $currentStock): self
{
$this->currentStock = $currentStock;
return $this;
}
public function getMaxPartByUser(): int
{
return $this->maxPartByUser;
}
public function setMaxPartByUser(int $maxPartByUser): self
{
$this->maxPartByUser = $maxPartByUser;
return $this;
}
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 decreaseStock()
{
$this->currentStock--;
}
public function isPrinted(): bool
{
return $this->printed;
}
public function setPrinted(bool $printed): self
{
$this->printed = $printed;
return $this;
}
}