<?php
namespace App\Entity\Participation;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Controller\Api\Participation\Multi\ConfirmationParticipationMultiOdrByUser;
use App\Controller\Api\Participation\Multi\CreateParticipationMultiOdrByUser;
use App\Controller\Api\Participation\Multi\GetNbParticipationByOperationId;
use App\Controller\Api\Participation\Multi\GetParticipationMultiOdrById;
use App\Controller\Api\Participation\Multi\GetParticipationMultiOdrByUser;
use App\Controller\Api\Participation\Multi\GetParticipationMultiOdrByUserByOperation;
use App\Controller\Api\Participation\Multi\GetReParticipationMultiOdrById;
use App\Controller\Api\Participation\Multi\UpdateBankInformationParticipationMultiOdrById;
use App\Dto\ParticipationStatus;
use App\Entity\Details\Participation\DetailsParticipationMultiOdr;
use App\Entity\Ean\Participation\EanOdr;
use App\Entity\Ean\Participation\EanParticipation;
use App\Repository\Participation\MultiRepository;
use DateTime;
use DateTimeInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\ExclusionPolicy;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\SerializedName;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass=MultiRepository::class)
* @ExclusionPolicy("all")
* @ApiResource(
* messenger=true,
* shortName="participation-multi",
* attributes={
* "force_eager"=false,
* "normalization_context"={
* "groups"={
* "ParticipationMulti:output",
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* },
* "enable_max_depth"=true
* },
* "denormalization_context"={
* "groups"={
* "ParticipationMulti:input",
* "ParticipationMulti:io",
* },
* "enable_max_depth"=true
* }
* },
* collectionOperations={
* "get",
* "post"={
* "method"="POST",
* "access_control"="is_granted('ROLE_USER')"
* },
* "get-by-user"={
* "method"="GET",
* "path"="/participation-multi-odr/user",
* "access_control"="is_granted('ROLE_USER')",
* "validation_groups"={"get_participation_multi_odrs_by_user"},
* "controller"=GetParticipationMultiOdrByUser::class,
* "defaults"={"_api_receive"=false},
* },
* "check-participation-multi-odr-by-user-operation"={
* "method"="GET",
* "path"="/participation-multi-odr/user/operation/{operationId}",
* "access_control"="is_granted('ROLE_USER')",
* "validation_groups"={"get_participation_multi_odr_by_user"},
* "controller"=GetParticipationMultiOdrByUserByOperation::class,
* "defaults"={"_api_receive"=false},
* },
* "create-participation-multi-odr-post"={
* "method"="POST",
* "path"="/participation-multi-odr/create-participation",
* "access_control"="is_granted('ROLE_USER')",
* "controller"=CreateParticipationMultiOdrByUser::class,
* "defaults"={"_api_receive"=false},
* },
* "confirmation-participation-multi-odr-post"={
* "method"="POST",
* "path"="/participation-multi-odr/smp/{participationId}/{userId}",
* "access_control"="is_granted('ROLE_USER')",
* "controller"=ConfirmationParticipationMultiOdrByUser::class,
* "defaults"={"_api_receive"=false},
* },
* },
* itemOperations={
* "get",
* "get-participation-multi-odr-by-id"={
* "method"="GET",
* "path"="/participation-multi-odr/{id}",
* "access_control"="is_granted('ROLE_USER')",
* "validation_groups"={"get_participation_multi_odr_by_id"},
* "controller"=GetParticipationMultiOdrById::class,
* "defaults"={"_api_receive"=false},
* },
* "get-reparticipation"={
* "method"="GET",
* "path"="/participation-multi-odr/reparticipation/{id}",
* "access_control"="is_granted('ROLE_USER')",
* "controller"=GetReParticipationMultiOdrById::class,
* "defaults"={"_api_receive"=false},
* },
* "put"={
* "validation_groups"={"Default", "Edit"}
* },
* "put-participation"={
* "method"="PUT",
* "path"="/participation-multi-odr/update-participation/{participationId}",
* "access_control"="is_granted('ROLE_USER')",
* "controller"=UpdateBankInformationParticipationMultiOdrById::class,
* "defaults"={"_api_receive"=false},
* },
* "burn-multi"={
* "method"="PUT",
* "input"=ParticipationStatus::class,
* "path"="/participation-multi/burn/{id}",
* },
* "public-get-nbr-participation-multi"={
* "method"="GET",
* "access_control"="is_granted('ROLE_PUBLIC')",
* "path"="/public/get-nb-participation-multi/{id}",
* "controller"=GetNbParticipationByOperationId::class,
* "defaults"={"_api_receive"=false},
* }
* },
* )
*/
class Multi extends Participation
{
const CHANNEL_EMAIL = "email";
const CHANNEL_PRINT = "print";
const CHANNELS = [
self::CHANNEL_EMAIL,
self::CHANNEL_PRINT
];
//status
const STATUS_NEW = "new";
const STATUS_SENT_BY_EMAIL = "sentByEmail";
const STATUS_WAIT_FOR_PRINT = "waitForPrint";
const STATUS_PRINTED = "printed";
const STATUS_UNLOCK_PRINT = "unlockPrinted";
// all status list
const STATUS = [
self::STATUS_NEW,
self::STATUS_PRINTED,
self::STATUS_SENT_BY_EMAIL,
self::STATUS_WAIT_FOR_PRINT,
self::STATUS_UNLOCK_PRINT,
];
//status that mark multi coupon as printed
const PRINTED_STATUS = [
self::STATUS_SENT_BY_EMAIL,
self::STATUS_WAIT_FOR_PRINT,
self::STATUS_PRINTED,
];
const CHANNEL_CASH_BACK = "cash-back";
const PAYMENT_TYPE_IBAN = "transfer";
const PAYMENT_TYPE_PAYPAL = "paypal";
/**
* @ORM\Column(name="code", type="string", nullable=true)
* @SerializedName("code")
* @Groups({
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* })
*/
private ?string $code = null;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({"ParticipationMulti:io"})
*/
private ?string $printUrl = null;
/**
* @ORM\Column(type="string", length=10)
* @Groups({"ParticipationMulti:io"})
*/
private ?string $emitterCode = null;
/**
* @ORM\Column(type="string", length=10)
* @Groups({"ParticipationMulti:io"})
* @Assert\Choice(choices=self::CHANNELS, message="Choose a valid channel.")
*/
private ?string $channel = null;
/**
* @ORM\Column(type="string", length=15)
* @Groups({"ParticipationMulti:io"})
*/
private ?string $status = null;
public function getPrintUrl(): ?string
{
return $this->printUrl;
}
public function setPrintUrl($printUrl)
{
$this->printUrl = $printUrl;
return $this;
}
public function getEmitterCode(): ?string
{
return $this->emitterCode;
}
public function setEmitterCode(string $emitterCode): self
{
$this->emitterCode = $emitterCode;
return $this;
}
public function getChannel(): ?string
{
return $this->channel;
}
public function setChannel(?string $channel): self
{
$this->channel = $channel;
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function setStatus(?string $status): self
{
$this->status = $status;
return $this;
}
/**
* @var Collection<EanParticipation>|EanParticipation[]
* @ORM\OneToMany(targetEntity=EanOdr::class, mappedBy="participation")
* @SerializedName("ean_odrs")
* @Groups({
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* })
*/
private $eanParticipations;
/**
* @ORM\Column(name="amount", type="float")
* @SerializedName("amount")
* @Groups({
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* })
*/
private ?float $amount = null;
/**
* @ORM\OneToOne(targetEntity=DetailsParticipationMultiOdr::class, mappedBy="participation", cascade={"persist", "remove"})
* @SerializedName("details_participation_odr")
* @Groups({
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* })
*/
private ?DetailsParticipationMultiOdr $details = null;
/**
* @var string|null
* @ORM\Column(type="string", nullable=true)
* @SerializedName("iban")
* @Groups({
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* })
*/
private ?string $iban = null;
/**
* @var string|null
* @ORM\Column(type="string", nullable=true)
* @SerializedName("bic")
* @Groups({
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* })
* @Assert\Bic()
*/
private ?string $bic = null;
/**
* @ORM\Column(type="string", length=180, nullable=true)
* @SerializedName("paypal")
* @Groups({
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* })
*/
private ?string $paypal = null;
/**
* @var string|null
* @ORM\Column(type="string", nullable=true)
* @SerializedName("id_billy")
* @Groups({
* "ParticipationMulti:io",
* "get_participation_multi_odrs_by_user",
* "get_participation_multi_odrs_by_id",
* "get_reparticipation_multi_odrs_by_id",
* })
*/
private ?string $idBilly = null;
/**
* @ORM\Column(type="boolean", options={"default": 0})
*/
private bool $mailSuccess = false;
public function __construct()
{
parent::__construct();
$this->eanParticipations = new ArrayCollection();
}
/**
* @return string|null
*/
public function getPaypal(): ?string
{
return $this->paypal;
}
/**
* @param string|null $paypal
* @return Multi
*/
public function setPaypal(?string $paypal): Multi
{
$this->paypal = $paypal;
return $this;
}
public function getCode(): ?string
{
return $this->code;
}
public function setCode(?string $code)
{
$this->code = $code;
return $this;
}
/**
* @param array $filter
* @return int
*/
public function getEanParticipationsQuantityByStatus(array $filter = []): int
{
$eanParts = $this->eanParticipations ?? [];
if(!$eanParts instanceof Collection) {
$eanParts = new ArrayCollection($eanParts);
}
if( !empty($filter) ) {
$eanParts = $eanParts->filter(function(EanParticipation $eanParticipation) use ($filter) {
return in_array($eanParticipation->getBarcodeStatus(), $filter);
});
}
$quantity = 0;
foreach ($eanParts as $eanParticipation) {
$quantity += ((int)$eanParticipation->getQuantity() * (int)$eanParticipation->getEan()->getQuantity());
}
return $quantity;
}
/**
* @return Collection|EanOdr[]
*/
public function getEanParticipations(): ?Collection
{
return $this->eanParticipations;
}
public function addEanParticipations(EanOdr $eanOdr): self
{
if (!$this->eanParticipations->contains($eanOdr)) {
$this->eanParticipations[] = $eanOdr;
$eanOdr->setParticipation($this);
}
return $this;
}
public function removeEanParticipations(EanOdr $eanOdr): self
{
if ($this->eanParticipations->removeElement($eanOdr)) {
// set the owning side to null (unless already changed)
if ($eanOdr->getParticipation() === $this) {
$eanOdr->setParticipation(null);
}
}
return $this;
}
public function getDetails(): ?DetailsParticipationMultiOdr
{
return $this->details;
}
public function setDetails(?DetailsParticipationMultiOdr $details): self
{
$this->details = $details;
return $this;
}
/**
* @return float|null
*/
public function getAmount() : ?float
{
return $this->amount;
}
/**
* @param float|null $amount
*
* @return Multi
*/
public function setAmount(?float $amount) : Multi
{
$this->amount = $amount;
return $this;
}
/**
* @return string
*/
public function getIban(): ?string
{
return $this->iban;
}
/**
* @param string|null $iban
* @return Multi
*/
public function setIban(?string $iban): Multi
{
$this->iban = $iban;
return $this;
}
/**
* @return string
*/
public function getBic(): ?string
{
return $this->bic;
}
/**
* @param string|null $bic
* @return Multi
*/
public function setBic(?string $bic): Multi
{
$this->bic = $bic;
return $this;
}
/**
* @return string
*/
public function getIdBilly(): ?string
{
return $this->idBilly;
}
/**
* @param string|null $idBilly
* @return Multi
*/
public function setIdBilly(?string $idBilly): Multi
{
$this->idBilly = $idBilly;
return $this;
}
public function getApiCode(): ?string
{
return $this->getValidationExport() instanceof ValidationExport ? $this->getValidationExport()->getAPIParticpationId() : null;
}
public function getMailSuccess(): bool
{
return (bool) $this->mailSuccess;
}
public function setMailSuccess(bool $mailSuccess): self
{
$this->mailSuccess = $mailSuccess;
return $this;
}
}