<?php
namespace App\Entity;
use App\Entity\Enum\TransactionStatus;
use App\Repository\DiscountRepository;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: DiscountRepository::class)]
class Discount
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private $id;
#[ORM\Column(type: 'string', length: 100, nullable: true)]
private $name;
#[ORM\Column(type: 'smallint', nullable: true)]
private $amount;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private $comment;
#[ORM\ManyToOne(targetEntity: DiscountModel::class, inversedBy: 'discounts')]
private $model;
#[ORM\OneToOne(mappedBy: 'discount', targetEntity: CartItemDiscount::class, cascade: ['persist', 'remove'])]
private $cartItemDiscount;
#[ORM\OneToOne(mappedBy: 'discount', targetEntity: TransactionDiscountDepositCheck::class, cascade: ['persist', 'remove'])]
private $transactionDepositCheck;
#[ORM\OneToOne(mappedBy: 'discount', targetEntity: TransactionDiscountReceipt::class, cascade: ['persist', 'remove'])]
private $transactionReceipt;
#[ORM\OneToOne(inversedBy: 'discount', targetEntity: Document::class, cascade: ['persist', 'remove'])]
private $document;
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name ?? $this->getModel()?->getName();
}
public function setName(?string $name): self
{
$this->name = $name;
return $this;
}
public function getAmount(): ?int
{
return $this->amount ?? $this->getModel()?->getAmount();
}
public function setAmount(?int $amount): self
{
$this->amount = $amount;
return $this;
}
public function getComment(): ?string
{
return $this->comment;
}
public function setComment(?string $comment): self
{
$this->comment = $comment;
return $this;
}
public function getModel(): ?DiscountModel
{
return $this->model;
}
public function setModel(?DiscountModel $model): self
{
$this->model = $model;
return $this;
}
public function getCartItemDiscount(): ?CartItemDiscount
{
return $this->cartItemDiscount;
}
public function setCartItemDiscount(?CartItemDiscount $cartItemDiscount): self
{
// unset the owning side of the relation if necessary
if ($cartItemDiscount === null && $this->cartItemDiscount !== null) {
$this->cartItemDiscount->setDiscount(null);
}
// set the owning side of the relation if necessary
if ($cartItemDiscount !== null && $cartItemDiscount->getDiscount() !== $this) {
$cartItemDiscount->setDiscount($this);
}
$this->cartItemDiscount = $cartItemDiscount;
return $this;
}
public function createCartItem(): CartItemDiscount
{
$cartItem = (new CartItemDiscount())
->setPrice($this->getAmount())
->setName($this->getName());
$this->setCartItemDiscount($cartItem);
return $cartItem;
}
public function getTransactionDepositCheck(TransactionStatus|array $statuses = null): ?TransactionDiscountDepositCheck
{
if (!is_array($statuses) && null !== $statuses) {
$statuses = [$statuses];
}
if ($statuses) {
if (in_array($this->transactionDepositCheck?->getStatus(), $statuses, true)) {
return $this->transactionDepositCheck;
}
return null;
}
return $this->transactionDepositCheck;
}
public function setTransactionDepositCheck(?TransactionDiscountDepositCheck $transactionDepositCheck): self
{
// unset the owning side of the relation if necessary
if ($transactionDepositCheck === null && $this->transactionDepositCheck !== null) {
$this->transactionDepositCheck->setDiscount(null);
}
// set the owning side of the relation if necessary
if ($transactionDepositCheck !== null && $transactionDepositCheck->getDiscount() !== $this) {
$transactionDepositCheck->setDiscount($this);
}
$this->transactionDepositCheck = $transactionDepositCheck;
return $this;
}
public function getTransactionReceipt(TransactionStatus|array $statuses = null): ?TransactionDiscountReceipt
{
if (!is_array($statuses)) {
$statuses = [$statuses];
}
if ($statuses) {
if (in_array($this->transactionReceipt?->getStatus(), $statuses, true)) {
return $this->transactionReceipt;
}
return null;
}
return $this->transactionReceipt;
}
public function setTransactionReceipt(?TransactionDiscountReceipt $transactionReceipt): self
{
// unset the owning side of the relation if necessary
if ($transactionReceipt === null && $this->transactionReceipt !== null) {
$this->transactionReceipt->setDiscount(null);
}
// set the owning side of the relation if necessary
if ($transactionReceipt !== null && $transactionReceipt->getDiscount() !== $this) {
$transactionReceipt->setDiscount($this);
}
$this->transactionReceipt = $transactionReceipt;
return $this;
}
public function getRemainingToPay(): float
{
$transaction = $this->getTransactionDepositCheck(statuses: TransactionStatus::Successful);
if ($transaction) {
return $this->getAmount() - $transaction->getAmountPayed();
}
return $this->getAmount();
}
public function getDocument(): ?Document
{
return $this->document;
}
public function setDocument(?Document $document): self
{
$this->document = $document;
return $this;
}
}