<?php
namespace App\Entity\Participation;
use ApiPlatform\Core\Annotation\ApiProperty;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Entity\Company\Company;
use App\Entity\MediaObject\MediaParticipation;
use App\Entity\Operation\Operation;
use App\Entity\State;
use App\Entity\User\User;
use App\Repository\Participation\ParticipationRepository;
use DateTime;
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=ParticipationRepository::class)
*
* @ApiResource(
* attributes={
* "normalization_context"={"groups"={
* "Participation:output",
* "Participation:io",
* }},
* "denormalization_context"={"groups"={
* "Participation:input",
* "Participation:io",
* }}
* },
* collectionOperations={},
* itemOperations={
* "get",
* "put"
* },
* )
*
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({
* "coupon" = "Coupon",
* "step" = "Step",
* "refund" = "Refund",
* "puntos" = "Puntos",
* "draw" = "Draw",
* "odr" = "Odr",
* "multi" = "Multi",
* })
*/
abstract class Participation
{
public const PARTICIPATION_TYPE = ['coupon', 'step', 'puntos', 'odr', 'multi'];
/**
* Hook timestampable behavior
* updates createdAt, updatedAt fields
*/
use TimestampableEntity;
/**
* @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({
* "Participation:output",
* "ParticipationStep:output",
* "ParticipationOdr:output",
* "ParticipationMulti:output",
* "ParticipationCoupon:output",
* "ParticipationRefund:output",
* "ParticipationPuntos:io",
* "ParticipationDraw:io",
* })
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity=State::class, inversedBy="participations", cascade={"persist"})
* @ORM\JoinColumn(nullable=false)
* @SerializedName("state")
* @Groups({
* "Participation:io",
* "ParticipationStep:io",
* "ParticipationCoupon:output",
* "confirm_participation",
* "ParticipationPuntos:io",
* "ParticipationDraw:io",
* "ParticipationOdr:io",
* "ParticipationMulti:io",
* })
*/
protected $state;
/**
* @ORM\Column(type="string", length=255, nullable=true, name="edited_id")
* @Groups({
* "Participation:io",
* "confirm_participation",
* "ParticipationOdr:io",
* "ParticipationMulti:io",
* })
*/
protected ?string $editedId;
/**
* @ORM\Column(type="string", length=255, nullable=true, name="token")
* @Groups({
* "Participation:io",
* "confirm_participation",
* "ParticipationOdr:io",
* "ParticipationMulti:io",
* })
*/
protected ?string $token = null;
/**
* @ORM\OneToMany(targetEntity=MediaParticipation::class, mappedBy="participation")
* @SerializedName("invoices")
* @Groups({
* "Participation:io",
* "ParticipationStep:io",
* "ParticipationCoupon:io",
* "ParticipationPuntos:io",
* "ParticipationOdr:io",
* "ParticipationMulti:io",
* "get_participation_odrs_by_id",
* })
*/
protected Collection $invoices;
/**
* @ORM\ManyToOne(targetEntity=User::class, inversedBy="participations")
* @Groups({
* "Participation:io",
* "ParticipationStep:io",
* "ParticipationOdr:io",
* "ParticipationMulti:io",
* "ParticipationCoupon:io",
* "ParticipationRefund:io",
* "ParticipationPuntos:io",
* "ParticipationDraw:io",
* })
* @Assert\NotBlank()
*/
protected $user;
/**
* @ORM\ManyToMany(targetEntity=Operation::class, inversedBy="participations")
* @Groups({
* "Participation:io",
* "ParticipationStep:io",
* "ParticipationOdr:io",
* "ParticipationMulti:io",
* "ParticipationCoupon:io",
* "ParticipationRefund:io",
* "ParticipationPuntos:io",
* "ParticipationDraw:io",
* "get_participation_multi_odr_by_user",
* "get_participation_odrs_by_user",
* "get_participation_odrs_by_id",
* })
* @Assert\NotBlank()
* @Assert\Count(
* min="1",
* max="12"
* )
* @Assert\Unique()
*/
protected Collection $operations;
/**
* @ORM\ManyToOne(targetEntity=Company::class, inversedBy="participations")
* @ORM\JoinColumn(nullable=false)
*/
private $company;
/**
* @ORM\OneToOne(targetEntity=ValidationExport::class, cascade={"persist", "remove"})
*
* @SerializedName("validation_export")
* @Groups({
* "ParticipationMulti:io",
* "ParticipationOdr:io",
* "ParticipationStep:io",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* "get_participation_odrs_by_id",
* "get_reparticipation_odrs_by_id",
* "get_participation-steps_by_user",
* })
*/
private ?ValidationExport $validationExport;
/**
* @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"}, nullable=true)
* @Groups({
* "ParticipationMulti:io",
* "ParticipationOdr:io",
* })
*/
private ?\DateTimeInterface $updateConformityAt;
/**
* @ORM\Column(type="boolean", options={"default": 0})
*/
private bool $restatementParticipation = false;
/**
* @var string|null
* @ORM\Column(type="string", nullable=true)
* @SerializedName("financial_status")
* @Groups({
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* "ParticipationOdr:io",
* "get_odrs_by_user_department",
* "get_participation_odrs_by_user",
* "get_participation_odrs_by_id",
* "get_reparticipation_odrs_by_id",
* })
*/
private ?string $financialStatus = null;
/**
* @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"}, nullable=true)
* @SerializedName("financial_date")
* @Groups({
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* "ParticipationOdr:io",
* "get_odrs_by_user_department",
* "get_participation_odrs_by_user",
* "get_participation_odrs_by_id",
* "get_reparticipation_odrs_by_id",
* })
*/
private ?\DateTimeInterface $financialDate;
/**
* @ORM\Column(name="financial_amount", type="float", nullable=true)
* @SerializedName("financial_amount")
* @Groups({
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* "ParticipationOdr:io",
* "get_odrs_by_user_department",
* "get_participation_odrs_by_user",
* "get_participation_odrs_by_id",
* "get_reparticipation_odrs_by_id",
* })
*/
private ?float $financialAmount = null;
public function __construct()
{
$this->invoices = new ArrayCollection();
$this->operations = new ArrayCollection();
}
public function getId(): ?string
{
return $this->id;
}
/**
* @return DateTime
* @Groups({
* "ParticipationStep:io",
* "ParticipationOdr:io",
* "ParticipationMulti:io",
* "get_participation_odrs_by_user",
* })
* @SerializedName("created_at")
*/
public function getCreatedAt()
{
return $this->createdAt;
}
/**
* @return DateTime
* @SerializedName("updated_at")
*/
public function getUpdatedAt()
{
return $this->updatedAt;
}
/**
* @return mixed
*/
public function getState(): ?State
{
return $this->state;
}
/**
* @param State $state
*
* @return Participation
*/
public function setState(State $state)
{
$this->state = $state;
return $this;
}
public function getToken(): ?string
{
return $this->token;
}
/**
* @param $token
* @return Participation
*/
public function setToken($token): Participation
{
$this->token = $token;
return $this;
}
public function getEditedId(): ?string
{
return $this->editedId;
}
/**
* @param $editedId
* @return Participation
*/
public function setEditedId($editedId): Participation
{
$this->editedId = $editedId;
return $this;
}
/**
* @return Collection|MediaParticipation[]
*/
public function getInvoices(): Collection
{
return $this->invoices;
}
public function addInvoice(MediaParticipation $invoice): self
{
if (!$this->invoices->contains($invoice)) {
$this->invoices[] = $invoice;
}
return $this;
}
public function removeInvoice(MediaParticipation $invoice): self
{
$this->invoices->removeElement($invoice);
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
/**
* @return Collection|Operation[]
*/
public function getOperations(): Collection
{
return $this->operations;
}
public function addOperation(Operation $operation): self
{
if (!$this->operations->contains($operation)) {
$this->operations[] = $operation;
}
return $this;
}
public function removeOperation(Operation $operation): self
{
$this->operations->removeElement($operation);
return $this;
}
public function getCompany(): ?Company
{
return $this->company;
}
public function setCompany(?Company $company): self
{
$this->company = $company;
return $this;
}
/**
* Returns createdAt.
* @SerializedName("created_at")
* @Groups({
* "Participation:output",
* "ParticipationStep:output",
* "ParticipationOdr:output",
* "ParticipationMulti:output",
* "ParticipationCoupon:output",
* "ParticipationRefund:output",
* "ParticipationPuntos:io",
* })
*
* @return \DateTime
*/
public function getSerializedCreatedAt()
{
return $this->getCreatedAt();
}
public function getStateLabel(): ?string
{
return $this->getState()->getLabel();
}
public function getValidationExport(): ?ValidationExport
{
return $this->validationExport;
}
public function setValidationExport(?ValidationExport $validationExport): self
{
$this->validationExport = $validationExport;
return $this;
}
public function getUpdateConformityAt(): ?\DateTimeInterface
{
return $this->updateConformityAt;
}
public function setUpdateConformityAt(?\DateTimeInterface $updateConformityAt): Participation
{
$this->updateConformityAt = $updateConformityAt;
return $this;
}
public function getRestatementParticipation(): bool
{
return (bool) $this->restatementParticipation;
}
public function setRestatementParticipation(bool $restatementParticipation): self
{
$this->restatementParticipation = $restatementParticipation;
return $this;
}
public function getFinancialStatus(): ?string
{
return $this->financialStatus;
}
public function setFinancialStatus(?string $financialStatus): Participation
{
$this->financialStatus = $financialStatus;
return $this;
}
public function getFinancialDate(): ?\DateTimeInterface
{
return $this->financialDate;
}
public function setFinancialDate(?\DateTimeInterface $financialDate): Participation
{
$this->financialDate = $financialDate;
return $this;
}
public function getFinancialAmount() : ?float
{
return $this->financialAmount;
}
public function setFinancialAmount(?float $financialAmount): Participation
{
$this->financialAmount = $financialAmount;
return $this;
}
}