<?php
namespace Evo\Infrastructure\MappingORM;
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\SearchFilter;
use ApiPlatform\Serializer\Filter\PropertyFilter;
use App\Repository\SubscriptionModelRepository;
use App\Validator\Constraints\ServiceConstraint;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ApiResource(attributes={
* "normalization_context"={"groups"={"read_subscription_model"}},
* "denormalization_context"={"groups"={"write_subscription_model"}}
* }, itemOperations={
* "get",
* "put",
* "delete"={"security"="is_granted('ROLE_ADMIN')"}
* })
* @ApiFilter(SearchFilter::class, properties={"name": "partial"})
* @ApiFilter(BooleanFilter::class, properties={"isActive"})
* @ApiFilter(PropertyFilter::class, arguments={"parameterName": "properties", "overrideDefaultProperties": false})
* @ORM\Entity(repositoryClass=SubscriptionModelRepository::class)
*
* @ServiceConstraint
*/
class SubscriptionModel
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"read_subscription_model", "write_subscription_model", "admin_subscription_model", "read_pack", "read_discount", "write_discount", "read_discount_for_select"})
*/
private ?int $id = null;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"read_subscription_model", "write_subscription_model", "admin_subscription_model", "read_pack", "read_discount"})
*/
private ?string $name = null;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"read_subscription_model", "write_subscription_model", "admin_subscription_model", "read_pack", "read_discount"})
*/
private ?string $uniqueKey = null;
/**
* @ORM\Column(type="float")
* @Groups({"read_subscription_model", "write_subscription_model", "admin_subscription_model"})
*/
private ?float $securityDeposit = null;
/**
* @ORM\ManyToMany(targetEntity=DiscountCode::class, mappedBy="subscriptionModel")
*/
private ?Collection $discountCodes;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Groups({"read_subscription_model", "write_subscription_model", "admin_subscription_model"})
*/
private $isActive;
/**
* @ORM\Column(type="array", nullable=true)
* @Groups({"read_subscription_model", "write_subscription_model", "admin_subscription_model"})
*/
private $authorizedFrequency = [];
/**
* @ORM\Column(type="datetime", nullable=true)
* @Groups({"read_subscription_model", "write_subscription_model", "admin_subscription_model"})
*/
private $createdAt;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Groups({"read_subscription_model", "write_subscription_model", "admin_subscription_model"})
*/
private ?\DateTimeInterface $updateAt = null;
/**
* @ORM\Column(type="float", nullable=true)
* @Groups({"read_subscription_model", "write_subscription_model", "admin_subscription_model"})
*/
private ?float $priceWithoutTax = null;
/**
* @ORM\OneToMany(targetEntity=Item::class, mappedBy="subscriptionModel", cascade={"persist", "remove"})
*/
private ?Collection $includedProducts;
/**
* @ORM\OneToMany(targetEntity=Service::class, mappedBy="subscriptionModel", cascade={"persist", "remove"})
* @Groups({"read_subscription_model", "write_subscription_model", "admin_subscription_model"})
*/
private ?Collection $includedServices;
/**
* @ORM\ManyToOne(targetEntity=Product::class)
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
* @Groups({"read_subscription_model", "write_subscription_model", "admin_subscription_model"})
*/
private ?Product $productForInvoicing = null;
/**
* @ORM\OneToMany(targetEntity=BAL::class, mappedBy="subscriptionModel", orphanRemoval=true)
*/
private Collection $bal;
public function __construct()
{
$this->includedServices = new ArrayCollection();
$this->includedProducts = new ArrayCollection();
$this->discountCodes = new ArrayCollection();
$this->createdAt = new \DateTime();
$this->bal = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getUniqueKey(): ?string
{
return $this->uniqueKey;
}
public function setUniqueKey(string $uniqueKey): self
{
$this->uniqueKey = $uniqueKey;
return $this;
}
public function getSecurityDeposit(): ?float
{
return $this->securityDeposit;
}
public function setSecurityDeposit(float $securityDeposit): self
{
$this->securityDeposit = $securityDeposit;
return $this;
}
public function getIsActive(): ?bool
{
return $this->isActive;
}
public function setIsActive(?bool $isActive): self
{
$this->isActive = $isActive;
return $this;
}
public function getAuthorizedFrequency(): ?array
{
return $this->authorizedFrequency;
}
public function setAuthorizedFrequency(?array $authorizedFrequency): self
{
$this->authorizedFrequency = $authorizedFrequency;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(?\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getUpdateAt(): ?\DateTimeInterface
{
return $this->updateAt;
}
public function setUpdateAt(?\DateTimeInterface $updateAt): self
{
$this->updateAt = $updateAt;
return $this;
}
public function getPriceWithoutTax(): ?float
{
return $this->priceWithoutTax;
}
public function setPriceWithoutTax(?float $priceWithoutTax): self
{
$this->priceWithoutTax = $priceWithoutTax;
return $this;
}
/**
* @return Collection<int, Service>
*/
public function getIncludedServices(): Collection
{
return $this->includedServices;
}
public function addIncludedService(Service $includedService): self
{
if (!$this->includedServices->contains($includedService)) {
$this->includedServices[] = $includedService;
$includedService->setSubscriptionModel($this);
}
return $this;
}
public function removeIncludedService(Service $includedService): self
{
// set the owning side to null (unless already changed)
if ($this->includedServices->removeElement($includedService) && $includedService->getSubscriptionModel() === $this) {
$includedService->setSubscriptionModel(null);
}
return $this;
}
/**
* @return Collection<int, Item>
*/
public function getIncludedProducts(): Collection
{
return $this->includedProducts;
}
public function addIncludedProduct(Item $includedProduct): self
{
if (!$this->includedProducts->contains($includedProduct)) {
$this->includedProducts[] = $includedProduct;
$includedProduct->setSubscriptionModel($this);
}
return $this;
}
public function removeIncludedProduct(Item $includedProduct): self
{
// set the owning side to null (unless already changed)
if ($this->includedProducts->removeElement($includedProduct) && $includedProduct->getSubscriptionModel() === $this) {
$includedProduct->setSubscriptionModel(null);
}
return $this;
}
public function getDiscountCodes(): Collection
{
return $this->discountCodes;
}
public function addDiscountCode(DiscountCode $discountCode): self
{
if (!$this->discountCodes->contains($discountCode)) {
$this->discountCodes[] = $discountCode;
$discountCode->addSubscriptionModel($this);
}
return $this;
}
public function removeDiscountCode(DiscountCode $discountCode): self
{
if ($this->discountCodes->removeElement($discountCode)) {
$discountCode->removeSubscriptionModel($this);
}
return $this;
}
public function getProductForInvoicing(): ?Product
{
return $this->productForInvoicing;
}
public function setProductForInvoicing(?Product $productForInvoicing): self
{
$this->productForInvoicing = $productForInvoicing;
return $this;
}
public static function createFixture(array $data): self
{
$self = new self();
$self->name = $data['name'];
$self->uniqueKey = $data['uniqueKey'];
$self->securityDeposit = $data['securityDeposit'];
$self->isActive = $data['isActive'] ?? true;
$self->authorizedFrequency = $data['authorizedFrequency'];
$self->createdAt = $data['createdAt'] ?? new \DateTime();
$self->updateAt = $data['updateAt'] ?? new \DateTime();
$self->priceWithoutTax = $data['priceWithoutTax'];
$self->productForInvoicing = $data['productForInvoicing'];
// includedServices
foreach ($data['includedServices'] ?? [] as $service) {
$self->addIncludedService($service);
}
return $self;
}
public function getBal(): Collection
{
return $this->bal;
}
public function addBal(BAL $bal): self
{
if (!$this->bal->contains($bal)) {
$this->bal[] = $bal;
$bal->setSubscriptionModel($this);
}
return $this;
}
public function removeBal(BAL $bal): self
{
if ($this->bal->removeElement($bal)) {
// set the owning side to null (unless already changed)
if ($bal->getSubscriptionModel() === $this) {
$bal->setSubscriptionModel(null);
}
}
return $this;
}
/**
* TEMPORARY.
*/
public function setId($id): self
{
$this->id = $id;
return $this;
}
}