<?php
namespace App\Entity\Operation;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiProperty;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use App\Entity\Cart\OperationCart;
use App\Entity\Company\Company;
use App\Entity\Eligibility;
use App\Entity\Participation\Participation;
use App\Entity\Recipe\Ingredient;
use App\Entity\Segmentation\Department;
use App\Entity\State;
use App\Entity\User\User;
use App\Repository\Operation\OperationRepository;
use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Ramsey\Uuid\Doctrine\UuidGenerator;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\SerializedName;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass=OperationRepository::class)
*
* @ApiResource(
* attributes={
* "normalization_context"={"groups"={
* "Operation:output",
* "Operation:io",
* "ParticipationStep:io",
* "ParticipationOdr:io",
* "get_participation_odrs_by_user",
* }},
* "denormalization_context"={"groups"={
* "Operation:input",
* "Operation:io",
* "ParticipationStep:io",
* "ParticipationOdr:io",
* "get_participation_odrs_by_user",
* }}
* },
* collectionOperations={
* "post"={
* "method"="POST",
* "access_control"="is_granted('ROLE_ADMIN_SOGEC')",
* },
* },
* itemOperations={
* "get"={
* "method"="GET",
* "access_control"="is_granted('ROLE_USER')",
* },
* }
* )
*
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({
* "coupon" = "Coupon",
* "step" = "Step",
* "game" = "Game",
* "refund" = "Refund",
* "puntos" = "Puntos",
* "draw" = "Draw",
* "odr" = "Odr",
* "sponsorship" = "Sponsorship",
* "multi_offer" = "MultiOffer"
* })
*
*/
abstract class Operation
{
/**
* Hook timestampable behavior
* updates createdAt, updatedAt fields
*/
use TimestampableEntity;
public const ARRAY_OPERATION_TYPE = [
MultiOffer::class,
Coupon::class,
Odr::class,
Step::class,
Refund::class,
Game::class,
Draw::class,
Puntos::class,
Sponsorship::class,
];
public const ARRAY_OFFER_MULTICANAL = [
MultiOffer::class,
Coupon::class,
Odr::class,
];
/**
* @ORM\Id
* @ORM\Column(type="uuid", unique=true)
* @ORM\GeneratedValue(strategy="CUSTOM")
* @ORM\CustomIdGenerator(class=UuidGenerator::class)
* @SerializedName("id")
* @ApiProperty(identifier=true)
* @Assert\Uuid()
* @Groups({
* "Operation:output",
* "OperationCoupon:output",
* "OperationGame:output",
* "OperationRefund:output",
* "OperationDraw:output",
* "OperationOdr:output",
* "OperationMultiOffer:output",
* "ParticipationStep:io",
* "ParticipationMulti:io",
* "get_user_operation_carts",
* "DetailsStep:io",
* "get_all_public_steps",
* "get_all_public_puntos",
* "get_all_public_sponsorship",
* "get_participation_odrs_by_user",
* "Recipe:io",
* })
*/
private string $id;
/**
* This is the sogec code of the operation ( ex : AD34 or XX00 )
* @var string|null
*
* @ORM\Column(name="code", type="string", nullable=true)
* @SerializedName("code")
* @Groups({
* "Operation:io",
* "OperationStep:io",
* "OperationCoupon:io",
* "OperationGame:io",
* "OperationOdr:io",
* "OperationMultiOffer:io",
* "OperationRefund:io",
* "OperationPuntos:io",
* "OperationSponsorship:io",
* "OperationDraw:output",
* "get_all_public_coupons",
* "get_coupons_by_user_department",
* "get_user_operation_carts",
* "get_participation_odrs_by_user",
* "Recipe:io",
* })
*/
private ?string $code;
/**
* This a code to call api ( may the uuid of the offer )
* @var string|null
*
* @ORM\Column(name="operation_code", type="string", nullable=true)
* @SerializedName("operation_code")
* @Groups({
* "Operation:io",
* "OperationCoupon:io",
* "OperationStep:io",
* "OperationGame:io",
* "OperationOdr:io",
* "OperationMultiOffer:io",
* "OperationRefund:io",
* "OperationPuntos:io",
* "OperationSponsorship:io",
* "OperationDraw:output",
* "get_all_public_coupons",
* "get_coupons_by_user_department",
* "Recipe:io",
* })
*/
private ?string $operationCode;
/**
* @var string
*
* @ORM\Column(name="title", type="string", nullable=true)
* @SerializedName("title")
* @Assert\NotBlank(
* groups={
* "Coupon:input",
* }
* )
* @Groups({
* "Operation:io",
* "OperationCoupon:io",
* "OperationStep:io",
* "OperationGame:io",
* "OperationOdr:io",
* "OperationMultiOffer:io",
* "OperationRefund:io",
* "OperationPuntos:io",
* "OperationSponsorship:io",
* "OperationDraw:output",
* "get_all_public_coupons",
* "get_coupons_by_user_department",
* "OperationStep:io",
* "get_user_operation_carts",
* "get_participation_odrs_by_user",
* "get_participation_multi_odrs_by_user",
* "Recipe:io",
* })
*/
private string $title;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Segmentation\Department", inversedBy="coupons")
* @SerializedName("departments")
* @Groups({
* "OperationCoupon:output",
* "get_coupons_by_user_department",
* })
*/
public Collection $departments;
/**
* @ORM\ManyToOne(targetEntity=User::class, inversedBy="operations")
* @ORM\JoinColumn(nullable=false)
* @SerializedName("owner")
*/
private $owner;
/**
* @ORM\ManyToOne(targetEntity=State::class, inversedBy="operations")
* @ORM\JoinColumn(nullable=true)
* @SerializedName("state")
*
* @ApiFilter(SearchFilter::class, properties={"state.label": "partial"})
*/
private $state;
/**
* @ORM\ManyToMany(targetEntity=Participation::class, mappedBy="operations")
*/
private $participations;
/**
* @ORM\ManyToOne(targetEntity=Company::class, inversedBy="operations")
* @ORM\JoinColumn(nullable=false)
*/
private $company;
/**
* @ORM\OneToMany(targetEntity=OperationCart::class, mappedBy="operation")
*/
private Collection $carts;
/**
* @ORM\ManyToMany(targetEntity=Eligibility::class, mappedBy="operation")
* @SerializedName("eligibilities")
* @Groups({
* "Operation:io",
* "OperationCoupon:io",
* "get_all_public_coupons",
* "get_coupons_by_user_department",
* "Recipe:io",
* "OperationOdr:io",
* })
*/
private Collection $eligibilities;
/**
* @ORM\Column(type="float", nullable=true)
* @Groups({
* "OperationMultiOffer:io",
* "get_participation_multi_odrs_by_user",
* "OperationOdr:io",
* "get_participation_odrs_by_user",
* "Recipe:io",
* })
*/
private ?float $amount;
/**
* @ORM\ManyToMany(targetEntity=Ingredient::class, mappedBy="offers")
*/
private $ingredients;
/**
* @SerializedName("nb_participations")
* @Groups({
* "OperationMultiOffer:io",
* "OperationOdr:io",
* "OperationCoupon:io",
* })
*/
private int $nbParticipations = 0;
public function __construct()
{
$this->departments = new ArrayCollection();
$this->participations = new ArrayCollection();
$this->carts = new ArrayCollection();
$this->eligibilities = new ArrayCollection();
$this->ingredients = new ArrayCollection();
}
/**
* @param string $id
* @return Operation
*/
public function setId(string $id): Operation
{
$this->id = $id;
return $this;
}
/**
* @return string
*/
public function getId(): string
{
return $this->id;
}
/**
* @return string|null
*/
public function getOperationCode(): ?string
{
return $this->operationCode;
}
/**
* @param string|null $operationCode
* @return Operation
*/
public function setOperationCode(?string $operationCode): Operation
{
$this->operationCode = $operationCode;
return $this;
}
/**
* @return string|null
*/
public function getCode(): ?string
{
return $this->code;
}
/**
* @param string|null $code
*
* @return Operation
*/
public function setCode(?string $code): Operation
{
$this->code = $code;
return $this;
}
/**
* @return string|null
*/
public function getTitle(): ?string
{
return $this->title;
}
/**
* @param string $title
*
* @return Operation
*/
public function setTitle(string $title): Operation
{
$this->title = $title;
return $this;
}
/**
* @return Collection|null
*/
public function getDepartments(): ?Collection
{
return $this->departments;
}
/**
* @param Department $department
*
* @return $this
*/
public function addDepartment(Department $department): Operation
{
if ($department !== null && $this->departments->contains($department)) {
return $this;
}
$this->departments[] = $department;
return $this;
}
/**
* @param Department $department
*
* @return Coupon
*/
public function removeDepartment(Department $department): Operation
{
$this->departments->removeElement($department);
return $this;
}
/**
* @return Coupon
*/
public function removeAllDepartment(): Operation
{
$this->departments = new ArrayCollection();
return $this;
}
/**
* @return mixed
*/
public function getOwner()
{
return $this->owner;
}
/**
* @param mixed $owner
*
* @return Operation
*/
public function setOwner($owner)
{
$this->owner = $owner;
return $this;
}
/**
* @return mixed
*/
public function getState()
{
return $this->state;
}
/**
* @param mixed $state
*
* @return Operation
*/
public function setState($state)
{
$this->state = $state;
return $this;
}
/**
* @return Collection|Participation[]
*/
public function getParticipations(): Collection
{
return $this->participations;
}
/**
* @return Collection|OperationCart[]
*/
public function getCarts(): Collection
{
return $this->carts;
}
public function addCart(OperationCart $cart): self
{
if (!$this->carts->contains($cart)) {
$this->carts[] = $cart;
$cart->setOperation($this);
}
return $this;
}
public function removeCart(OperationCart $cart): self
{
if ($this->carts->removeElement($cart)) {
// set the owning side to null (unless already changed)
if ($cart->getOperation() === $this) {
$cart->setOperation(null);
}
}
return $this;
}
/**
* @return Collection|Eligibility[]
*/
public function getEligibilities(): Collection
{
return $this->eligibilities;
}
public function addEligibility(Eligibility $eligibility): self
{
if (!$this->eligibilities->contains($eligibility)) {
$this->eligibilities[] = $eligibility;
$eligibility->addOperation($this);
}
return $this;
}
public function removeEligibility(Eligibility $eligibility): self
{
if ($this->eligibilities->removeElement($eligibility)) {
$eligibility->removeOperation($this);
}
return $this;
}
public function addParticipation(Participation $participation): self
{
if (!$this->participations->contains($participation)) {
$this->participations[] = $participation;
$participation->addOperation($this);
}
return $this;
}
public function removeParticipation(Participation $participation): self
{
if ($this->participations->removeElement($participation)) {
$participation->removeOperation($this);
}
return $this;
}
public function getCompany(): ?Company
{
return $this->company;
}
public function setCompany(?Company $company): self
{
$this->company = $company;
return $this;
}
public function getAmount(): ?float
{
return $this->amount;
}
public function setAmount(float $amount): self
{
$this->amount = $amount;
return $this;
}
/**
* @return Collection<int, Ingredient>
*/
public function getIngredients(): Collection
{
return $this->ingredients;
}
public function addIngredient(Ingredient $ingredient): self
{
if (!$this->ingredients->contains($ingredient)) {
$this->ingredients[] = $ingredient;
$ingredient->addOffer($this);
}
return $this;
}
public function removeIngredient(Ingredient $ingredient): self
{
if ($this->ingredients->removeElement($ingredient)) {
$ingredient->removeOffer($this);
}
return $this;
}
public function clearIngredients(): self
{
foreach ($this->ingredients as $ingredient) {
$ingredient->removeOffer($this);
}
$this->ingredients = new ArrayCollection();
return $this;
}
public function getNbParticipations(): int
{
return $this->nbParticipations;
}
public function setNbParticipations(int $nbParticipations)
{
$this->nbParticipations = $nbParticipations;
}
}