<?php
namespace App\Entity;
use App\Repository\ServicesRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* SERVIS — ERP ile birlikte yasayan, kendi giris yuzeyi olan uygulama.
*
* MODUL DEGILDIR: modul (Expense, WorksPlan, TodoBoard...) ERP'nin ICINDE bir parcadir
* ve yetkisi ModulesAccessMap uzerinden yonetilir. SERVIS ise ERP'nin YANINDA duran
* ayri bir uygulamadir (ornegin execution.romon-erp.com) — ayni kimlik/veri dunyasini
* paylasir ama kendi kapisi vardir.
*
* ERISIM KURALI (tek cumle): erisim = kullanicinin bu servis icin kaydi VARSA o kaydin
* granted degeri, kaydi YOKSA servisin is_default degeri. Yani:
* - is_default=1 (ERP) + kayit yok -> ERISIR (default acik)
* - is_default=1 (ERP) + granted=false -> ERISEMEZ (acikca yasaklanmis)
* - is_default=0 (TE) + kayit yok -> ERISEMEZ (default kapali)
* - is_default=0 (TE) + granted=true -> ERISIR
* Bkz. UserServiceAccess.
*
* is_system=1 olan kayit (ERP/'self') SILINEMEZ ve service_key'i DEGISTIRILEMEZ —
* BE guard'i bunu zorlar, FE de sil/duzenle butonunu kapatir.
*
* @ORM\Entity(repositoryClass=ServicesRepository::class)
* @ORM\Table(name="services")
* @ORM\HasLifecycleCallbacks
* @UniqueEntity(
* fields={"service_key"},
* message="Service key already exists|Service with key (%s) already exists"
* )
*/
class Services
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({
* "service@ref",
* "service@base",
* "service@core"
* })
*/
private $id;
/**
* Kodun tanidigi benzersiz anahtar ('self', 'task_execution'...).
* VARCHAR — gercek ENUM DEGIL, cunku servisler ileride panelden eklenebilecek.
* Bilinen degerler: App\Enum\ServiceKeyEnum.
*
* @ORM\Column(type="string", length=64, unique=true, nullable=false)
* @Groups({
* "service@base",
* "service@core"
* })
*/
private $service_key;
/**
* Kullaniciya gosterilen ad ("ERP", "Task Execution").
* @ORM\Column(type="string", length=128, nullable=false)
* @Groups({
* "service@base",
* "service@core"
* })
*/
private $name;
/**
* Servisin ne oldugunu anlatan kisa metin — yonetim panelinde gosterilir.
* @ORM\Column(type="text", nullable=true)
* @Groups({
* "service@core"
* })
*/
private $description;
/**
* Servisin acilis adresi (ERP icin null, ayri servisler icin subdomain).
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({
* "service@core"
* })
*/
private $url;
/**
* TRUE ise: bu servis icin KAYDI OLMAYAN kullanici otomatik erisir (ERP boyle).
* FALSE ise: erisim icin acik kayit (granted=true) sart (Task Execution boyle).
* Default'un TEK kaynagi property default'udur.
*
* @ORM\Column(type="boolean", nullable=false, options={"default": false})
* @Groups({
* "service@base",
* "service@core"
* })
*/
private $is_default = false;
/**
* Sistem servisi — silinemez, service_key'i degistirilemez. Yalniz ERP ('self') 1'dir.
* @ORM\Column(type="boolean", nullable=false, options={"default": false})
* @Groups({
* "service@base",
* "service@core"
* })
*/
private $is_system = false;
/**
* Pasif servis kimseye acilmaz (is_default olsa bile) — servisi topluca kapatma anahtari.
* @ORM\Column(type="boolean", nullable=false, options={"default": true})
* @Groups({
* "service@base",
* "service@core"
* })
*/
private $is_active = true;
/**
* Listeleme sirasi — ERP her zaman 0.
* @ORM\Column(type="integer", nullable=false, options={"default": 0})
* @Groups({
* "service@core"
* })
*/
private $sort_order = 0;
/**
* @ORM\Column(type="datetime_immutable", nullable=true)
* @Groups({
* "service@core"
* })
*/
private $created_at;
/**
* @ORM\OneToMany(targetEntity=UserServiceAccess::class, mappedBy="service", orphanRemoval=true)
*/
private $user_accesses;
public function __construct()
{
$this->user_accesses = new ArrayCollection();
}
/**
* @ORM\PrePersist
*/
public function onPrePersist(): void
{
if ($this->created_at === null) {
$this->created_at = new \DateTimeImmutable();
}
}
public function getId(): ?int
{
return $this->id;
}
public function getServiceKey(): ?string
{
return $this->service_key;
}
public function setServiceKey(string $service_key): self
{
$this->service_key = $service_key;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getUrl(): ?string
{
return $this->url;
}
public function setUrl(?string $url): self
{
$this->url = $url;
return $this;
}
public function getIsDefault(): ?bool
{
return $this->is_default;
}
public function setIsDefault(bool $is_default): self
{
$this->is_default = $is_default;
return $this;
}
public function getIsSystem(): ?bool
{
return $this->is_system;
}
public function setIsSystem(bool $is_system): self
{
$this->is_system = $is_system;
return $this;
}
public function getIsActive(): ?bool
{
return $this->is_active;
}
public function setIsActive(bool $is_active): self
{
$this->is_active = $is_active;
return $this;
}
public function getSortOrder(): ?int
{
return $this->sort_order;
}
public function setSortOrder(int $sort_order): self
{
$this->sort_order = $sort_order;
return $this;
}
public function getCreatedAt(): ?\DateTimeImmutable
{
return $this->created_at;
}
public function setCreatedAt(?\DateTimeImmutable $created_at): self
{
$this->created_at = $created_at;
return $this;
}
/**
* @return Collection<int, UserServiceAccess>
*/
public function getUserAccesses(): Collection
{
return $this->user_accesses;
}
public function addUserAccess(UserServiceAccess $userAccess): self
{
if (!$this->user_accesses->contains($userAccess)) {
$this->user_accesses[] = $userAccess;
$userAccess->setService($this);
}
return $this;
}
public function removeUserAccess(UserServiceAccess $userAccess): self
{
if ($this->user_accesses->removeElement($userAccess)) {
if ($userAccess->getService() === $this) {
$userAccess->setService(null);
}
}
return $this;
}
}