<?php
declare(strict_types=1);
namespace App\Point\Doctrine\Entity;
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\Point\Doctrine\Repository\WalletRepository;
use DateTimeImmutable;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\JoinColumn;
use Doctrine\ORM\Mapping\ManyToOne;
use Doctrine\ORM\Mapping\OneToMany;
use Doctrine\ORM\Mapping\Table;
use Symfony\Component\Serializer\Annotation\Groups;
#[ApiResource(
collectionOperations: ['get'],
itemOperations: ['get' => ['security' => 'is_granted("item", object)']],
normalizationContext: ['groups' => ['read']]
)]
#[ApiFilter(SearchFilter::class, properties: ['account' => 'exact'])]
#[Entity(repositoryClass: WalletRepository::class)]
#[Table(name: '`point_wallet`')]
class Wallet
{
#[Id]
#[Column(type: 'integer')]
#[GeneratedValue]
#[Groups('read')]
private ?int $id = null;
#[ManyToOne(targetEntity: Account::class, inversedBy: 'wallets')]
#[JoinColumn(nullable: false, onDelete: 'CASCADE')]
#[Groups('read')]
#[ApiProperty(readableLink: false, writableLink: false)]
private Account $account;
#[ManyToOne(targetEntity: Purchase::class)]
#[JoinColumn(nullable: false, onDelete: 'CASCADE')]
#[Groups('read')]
#[ApiProperty(readableLink: false, writableLink: false)]
private Purchase $purchase;
#[Column(type: 'integer')]
#[Groups('read')]
private int $balance = 0;
#[Column(type: 'datetime_immutable')]
#[Groups('read')]
private DateTimeImmutable $createdAt;
#[Column(type: 'datetime_immutable', nullable: true)]
#[Groups('read')]
private ?DateTimeImmutable $expiredAt;
/**
* @var Collection<int, Transaction>
*/
#[OneToMany(mappedBy: 'wallet', targetEntity: Transaction::class)]
private Collection $transactions;
public function __construct()
{
$this->createdAt = new DateTimeImmutable();
$this->transactions = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getAccount(): Account
{
return $this->account;
}
public function setAccount(Account $account): void
{
$this->account = $account;
}
public function getPurchase(): Purchase
{
return $this->purchase;
}
public function setPurchase(Purchase $purchase): void
{
$this->purchase = $purchase;
}
public function getBalance(): int
{
return $this->balance;
}
public function setBalance(int $balance): void
{
$this->balance = $balance;
}
public function getCreatedAt(): DateTimeImmutable
{
return $this->createdAt;
}
public function setCreatedAt(DateTimeImmutable $createdAt): void
{
$this->createdAt = $createdAt;
}
public function getExpiredAt(): ?DateTimeImmutable
{
return $this->expiredAt;
}
public function setExpiredAt(?DateTimeImmutable $expiredAt): void
{
$this->expiredAt = $expiredAt;
}
/**
* @return Collection<int, Transaction>
*/
public function getTransactions(): Collection
{
return $this->transactions;
}
public function isExpired(): bool
{
return null !== $this->expiredAt && $this->expiredAt < new DateTimeImmutable();
}
}