src/Entity/Sales/Asset.php line 75
<?php
namespace App\Entity\Sales;
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Metadata\ApiFilter;
use ApiPlatform\Metadata\ApiProperty;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Delete;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Link;
use ApiPlatform\Metadata\Patch;
use ApiPlatform\Metadata\Post;
use ApiPlatform\Metadata\Put;
use App\Doctrine\Type\Sales\AssetStatus;
use App\Dto\Common\LogoInput;
use App\Dto\Sales\AssetExtendedInput;
use App\Dto\Sales\AssetInput;
use App\Dto\Sales\AssetStatusInput;
use App\Entity\Common;
use App\Entity\Common\Company;
use App\Entity\File\Upload;
use App\Entity\Places\Address;
use App\Processor\Common\LogoInputProcessor;
use App\Processor\Sales\AssetInputProcessor;
use App\Processor\Sales\AssetStatusInputProcessor;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Table(name: 'company_asset')]
#[ORM\Index(columns: ['client_id'], name: 'company_asset_client_id_idx')]
#[ORM\Index(columns: ['place_id'], name: 'company_asset_place_id_idx')]
#[ORM\Index(columns: ['logo_id'], name: 'company_asset_logo_id_idx')]
#[ORM\Index(columns: ['created_by'], name: 'company_asset_created_by_idx')]
#[ORM\Index(columns: ['updated_by'], name: 'company_asset_updated_by_idx')]
#[ORM\UniqueConstraint(name: 'company_asset_slug_key', columns: ['slug'])]
#[ORM\UniqueConstraint(name: 'company_asset_code_key', columns: ['code'])]
#[ORM\Entity]
#[UniqueEntity('code')]
#[ApiResource(
operations: [
new Get(),
new Delete(),
new GetCollection(),
new Post(uriTemplate: '/assets/{slug}/logo', inputFormats: ['multipart' => ['multipart/form-data']], input: LogoInput::class, processor: LogoInputProcessor::class),
new Post(uriTemplate: '/assets/{slug}/status', inputFormats: ['json' => ['application/json']], input: AssetStatusInput::class, processor: AssetStatusInputProcessor::class),
new Post(inputFormats: ['json' => ['application/json'], 'multipart' => ['multipart/form-data']], input: AssetExtendedInput::class),
new Patch(inputFormats: ['json' => ['application/merge-patch+json'], 'multipart' => ['multipart/form-data']]),
new Put(inputFormats: ['json' => ['application/json'], 'multipart' => ['multipart/form-data']]),
],
routePrefix: '/sales',
input: AssetInput::class,
processor: AssetInputProcessor::class,
)]
#[ApiResource(
uriTemplate: '/sales/contracts/{contract}/assets',
operations: [
new GetCollection(),
],
uriVariables: [
'contract' => new Link(toProperty: 'contracts', fromClass: Contract::class),
],
)]
#[ApiFilter(SearchFilter::class, properties: [
'client.code' => 'exact',
'name' => 'ipartial',
'code' => 'ipartial',
])]
class Asset
{
use Common\Blameable;
use Common\Trackable;
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'IDENTITY')]
#[ORM\SequenceGenerator(sequenceName: 'company_asset_id_seq')]
#[ORM\Column(type: Types::INTEGER)]
#[ApiProperty(identifier: false)]
private ?int $id = null;
#[Gedmo\Slug(fields: ['name'])]
#[ORM\Column(type: Types::STRING)]
#[ApiProperty(identifier: true)]
private string $slug;
#[Assert\NotNull]
#[ORM\ManyToOne(targetEntity: Company::class)]
#[ORM\JoinColumn(name: 'client_id', nullable: false)]
#[ApiProperty(readableLink: true)]
private ?Company $client = null;
/** @var Collection<int, Contract> */
#[ORM\ManyToMany(targetEntity: Contract::class, mappedBy: 'assets')]
protected Collection $contracts;
#[Assert\NotBlank]
#[ORM\Column(type: Types::STRING)]
private ?string $name = null;
#[Assert\NotBlank]
#[ORM\Column(type: Types::STRING)]
private ?string $code = null;
#[Assert\NotNull]
#[ORM\Column(type: Types::STRING, enumType: AssetStatus::class, options: ['default' => 'ACTIVE'])]
private ?AssetStatus $status = AssetStatus::ACTIVE;
#[ORM\ManyToOne(targetEntity: Address::class, cascade: ['persist', 'remove'])]
#[ORM\JoinColumn(name: 'place_id')]
#[ApiProperty(readableLink: true)]
private ?Address $address = null;
#[ORM\ManyToOne(targetEntity: Upload::class, cascade: ['persist', 'remove'])]
#[ORM\JoinColumn(name: 'logo_id')]
#[ApiProperty(readableLink: true)]
private ?Upload $logo = null;
public function __construct()
{
$this->contracts = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getSlug(): ?string
{
return $this->slug;
}
public function setSlug(string $slug): self
{
$this->slug = $slug;
return $this;
}
public function getClient(): ?Company
{
return $this->client;
}
public function setClient(?Company $client): self
{
$this->client = $client;
return $this;
}
/**
* @return Collection<int, Contract>
*/
public function getContracts(): Collection
{
return $this->contracts;
}
public function addContract(Contract $contract): self
{
if (!$this->contracts->contains($contract)) {
$this->contracts->add($contract);
$contract->addAsset($this);
}
return $this;
}
public function removeContract(Contract $contract): self
{
if ($this->contracts->removeElement($contract)) {
$contract->removeAsset($this);
}
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getCode(): ?string
{
return $this->code;
}
public function setCode(string $code): self
{
$this->code = $code;
return $this;
}
public function getStatus(): ?AssetStatus
{
return $this->status;
}
public function setStatus(AssetStatus $status): self
{
$this->status = $status;
return $this;
}
public function getAddress(): ?Address
{
return $this->address;
}
public function setAddress(?Address $address): self
{
$this->address = $address;
return $this;
}
public function getLogo(): ?Upload
{
return $this->logo;
}
public function setLogo(?Upload $logo): self
{
$this->logo = $logo;
return $this;
}
}