<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use App\Controller\ControllerGetFactureAcademicien;
use App\Dto\PayementInput;
use App\Dto\PayementOuput;
use App\Repository\AbonnementRepository;
use DateTimeImmutable;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
#[ORM\Entity(repositoryClass: AbonnementRepository::class)]
#[ApiResource(
normalizationContext:[
'groups'=>['abonnement:read']
],
denormalizationContext:[
'groups'=>['abonnement:write']
],
collectionOperations: [
"get" ,
"post",
"payement" => [
"method" => "POST",
'path' => '/abonnements/payements',
"input" => PayementInput::class,
"output" => PayementOuput::class
],
],
itemOperations: [
"get",
'return_facture_get' => [
'method' => 'GET',
'path' => "abonnements/facture/{idacademicien}",
'controller' => ControllerGetFactureAcademicien::class,
'read' => false,
'deserialize' => false
],
]
)]
#[ApiFilter(SearchFilter::class, properties: [
'year'=>'exact',
'academicien'=>'exact',
])]
class Abonnement
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
#[Groups(['abonnement:read','abonnement:write','user:read','payement:read'])]
private $id;
#[ORM\Column(type: 'integer', nullable: true)]
#[Groups(['abonnement:read','abonnement:write','user:read'])]
private $month;
#[ORM\Column(type: 'integer', nullable: true)]
#[Groups(['abonnement:read','abonnement:write','user:read'])]
private $year;
#[ORM\OneToMany(mappedBy: 'abonnement', targetEntity: Payment::class, cascade:['persist','remove'])]
#[Groups(['payement:read','abonnement:read','abonnement:write','user:read'])]
private $payements;
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'abonnements')]
#[Groups(['payement:read','abonnement:read','abonnement:write'])]
#[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
private $academicien;
#[ORM\Column(type: 'datetime')]
private $dateCreated;
public function __construct()
{
$this->payements = new ArrayCollection();
$this->dateCreated = new DateTimeImmutable();
}
public function getId(): ?int
{
return $this->id;
}
public function getMonth(): ?int
{
return $this->month;
}
public function setMonth(int $month): self
{
$this->month = $month;
return $this;
}
public function getYear(): ?int
{
return $this->year;
}
public function setYear(int $year): self
{
$this->year = $year;
return $this;
}
/**
* @return Collection<int, Payment>
*/
public function getPayements(): Collection
{
return $this->payements;
}
public function addPayement(Payment $payement): self
{
if (!$this->payements->contains($payement)) {
$this->payements[] = $payement;
$payement->setAbonnement($this);
}
return $this;
}
public function removePayement(Payment $payement): self
{
if ($this->payements->removeElement($payement)) {
// set the owning side to null (unless already changed)
if ($payement->getAbonnement() === $this) {
$payement->setAbonnement(null);
}
}
return $this;
}
public function getAcademicien(): ?User
{
return $this->academicien;
}
public function setAcademicien(?User $academicien): self
{
$this->academicien = $academicien;
return $this;
}
public function getDateCreated(): ?\DateTimeImmutable
{
return $this->dateCreated;
}
public function setDateCreated(\DateTimeImmutable $dateCreated): self
{
$this->dateCreated = $dateCreated;
return $this;
}
}