<?php
namespace App\Containers\CrmSection\PenaltyContainer\Entities;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\ApiFilter;
use ApiPlatform\Doctrine\Orm\Filter\BooleanFilter;
use ApiPlatform\Doctrine\Orm\Filter\DateFilter;
use ApiPlatform\Doctrine\Orm\Filter\NumericFilter;
use ApiPlatform\Doctrine\Orm\Filter\OrderFilter;
use ApiPlatform\Doctrine\Orm\Filter\RangeFilter;
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
use App\Containers\CrmSection\ClientContainer\Entities\ClientEntity;
use App\Containers\CrmSection\ContractContainer\Entities\ContractEntity;
use App\Containers\CrmSection\PenaltyContainer\Data\Repositories\PenaltyRepository;
use App\Ship\ApiPlatform\Filter\SimpleSearchFilter;
use DateTimeImmutable;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\DBAL\Types\Types;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Serializer\Annotation\Context;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\MaxDepth;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
/**
* Штрафи
*/
#[ApiResource(
routePrefix: '/crm',
normalizationContext: [
'groups' => 'read',
'enable_max_depth' => true
],
operations: [
new Get(
uriTemplate: '/penalties/{id}',
requirements: ['id' => '\d+'],
security: "is_granted('ROLE_ADMIN') or is_granted('ROLE_USER_CLIENT')"
),
new GetCollection(
uriTemplate: '/penalties',
security: "is_granted('ROLE_ADMIN') or is_granted('ROLE_USER_CLIENT')"
),
],
shortName: 'CRM_Penalties'
)]
#[ApiFilter(SearchFilter::class, properties: [
'id' => 'exact',
'client' => 'exact',
'contract' => 'exact',
'amount' => 'exact',
'protocolSeries' => 'exact',
'protocolNumber' => 'exact',
'documentId' => 'exact',
'datePerpetration' => 'exact',
'description' => 'partial',
])]
#[ApiFilter(NumericFilter::class, properties: ['id'])]
#[ApiFilter(RangeFilter::class, properties: ['id'])]
#[ApiFilter(BooleanFilter::class, properties: ['isPaid', 'isPaidInternal'])]
#[ApiFilter(filterClass: SimpleSearchFilter::class, properties: [
'protocolSeries', 'protocolNumber', 'description',
])]
#[ApiFilter(DateFilter::class, properties: ['datePerpetration'])]
#[ApiFilter(OrderFilter::class)]
#[ORM\Entity(repositoryClass: PenaltyRepository::class)]
#[ORM\Table(name: '`crm_penalties`')]
class PenaltyEntity
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: Types::INTEGER)]
#[Groups(['read'])]
private ?int $id = null;
#[ORM\ManyToOne(targetEntity: ClientEntity::class)]
#[ORM\JoinColumn(name: 'client_id', referencedColumnName: 'id')]
#[Groups(['read'])]
#[MaxDepth(2)]
private ClientEntity $client;
#[ORM\ManyToOne(targetEntity: ContractEntity::class)]
#[ORM\JoinColumn(name: 'contract_id', referencedColumnName: 'id')]
#[Groups(['read'])]
#[MaxDepth(2)]
private ContractEntity $contract;
#[ORM\Column(type: Types::BOOLEAN)]
#[Groups(['read'])]
private ?bool $isPaid = false;
#[ORM\Column(type: Types::BOOLEAN)]
#[Groups(['read'])]
private ?bool $isPaidInternal = false;
#[ORM\Column(type: Types::INTEGER)]
#[Groups(['read'])]
private int $amount;
#[ORM\Column(type: Types::STRING, length: 50)]
#[Groups(['read'])]
private string $protocolSeries;
#[ORM\Column(type: Types::STRING, length: 50)]
#[Groups(['read'])]
private string $protocolNumber;
#[ORM\Column(type: Types::STRING, length: 50)]
#[Groups(['read'])]
private string $documentId;
#[ORM\Column(type: Types::DATETIME_IMMUTABLE)]
#[Context(
normalizationContext: [DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'],
denormalizationContext: [DateTimeNormalizer::FORMAT_KEY => 'Y-m-d']
)]
#[Groups(['read'])]
private DateTimeImmutable $datePerpetration;
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
#[Groups(['read'])]
private ?string $description;
#[Gedmo\Timestampable(on: 'create')]
#[ORM\Column(type: Types::DATETIME_IMMUTABLE)]
#[Groups(['read'])]
protected $createdAt;
#[Gedmo\Timestampable(on: 'update')]
#[ORM\Column(type: Types::DATETIME_IMMUTABLE)]
#[Groups(['read'])]
protected $updatedAt;
public function getId(): ?int
{
return $this->id;
}
public function getClient()
{
return $this->client;
}
public function setClient(ClientEntity $client)
{
$this->client = $client;
return $this;
}
public function getContract()
{
return $this->contract;
}
public function setContract(ContractEntity $contract)
{
$this->contract = $contract;
return $this;
}
public function getIsPaid()
{
return $this->isPaid;
}
public function setIsPaid(?bool $isPaid)
{
$this->isPaid = $isPaid;
return $this;
}
public function getIsPaidInternal()
{
return $this->isPaidInternal;
}
public function setIsPaidInternal(?bool $isPaidInternal)
{
$this->isPaidInternal = $isPaidInternal;
return $this;
}
public function getAmount()
{
return $this->amount;
}
public function setAmount(int $amount)
{
$this->amount = $amount;
return $this;
}
public function getProtocolSeries()
{
return $this->protocolSeries;
}
public function setProtocolSeries(string $protocolSeries)
{
$this->protocolSeries = $protocolSeries;
return $this;
}
public function getProtocolNumber()
{
return $this->protocolNumber;
}
public function setProtocolNumber(string $protocolNumber)
{
$this->protocolNumber = $protocolNumber;
return $this;
}
public function getDocumentId()
{
return $this->documentId;
}
public function setDocumentId(string $documentId)
{
$this->documentId = $documentId;
return $this;
}
public function getDatePerpetration()
{
return $this->datePerpetration;
}
public function setDatePerpetration(DateTimeImmutable $datePerpetration)
{
$this->datePerpetration = $datePerpetration;
return $this;
}
public function getDescription()
{
return $this->description;
}
public function setDescription(string $description)
{
$this->description = $description;
return $this;
}
public function getCreatedAt()
{
return $this->createdAt;
}
public function getUpdatedAt()
{
return $this->updatedAt;
}
}