<?php
namespace App\Entity;
use App\Repository\WorkerActivityLeaveEntitlementRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* WorkerActivityLeaveEntitlement — bir SÖZLEŞMENİN (worker_activity) bir YIL için izin hakkı.
*
* Kullanıcı kararı 2026-09-19: izin hakkı sözleşme bazlıdır ("her activity'de farklı olabilir"),
* yıl bazında tutulur; önceki yıldan DEVİR (carry-over) ve devrin SON KULLANMA tarihi burada.
*
* ⚠️ İZİN GÜNLERİ BURADA DEĞİL. Hangi günlerin izin olduğu Timesheet'in gün-JSON'unda (`H`)
* yaşar — tek doğruluk kaynağı (module-timesheetv2 kararı, 2026-09-17). Bu tablo yalnız
* HAK + DEVİR girdisidir; bakiye = hak + kullanılabilir devir − Timesheet'teki H günleri
* (LeaveEntitlementService::balances). Timesheet'e ASLA yazmaz.
*
* Satır yoksa hak = sözleşmenin bilinen son hakkı, o da yoksa
* TimesheetLeaveService::ANNUAL_LEAVE_ENTITLEMENT_DAYS (30, K1 fallback).
*
* @ORM\Entity(repositoryClass=WorkerActivityLeaveEntitlementRepository::class)
* @ORM\Table(
* name="worker_activity_leave_entitlements",
* uniqueConstraints={@ORM\UniqueConstraint(name="uniq_activity_leave_year", columns={"worker_activity_id", "year"})},
* options={"comment": "Sozlesme + yil bazinda izin hakki ve onceki yildan devir. Gunler Timesheet'te (H)."}
* )
*/
class WorkerActivityLeaveEntitlement
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({
* "worker_activity_leave_entitlement@ref",
* "worker_activity_leave_entitlement@base",
* "worker_activity_leave_entitlement@core"
* })
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=WorkerActivities::class, inversedBy="leave_entitlements")
* @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
* @Groups({"worker_activity_leave_entitlement@worker_activity"})
*/
private $worker_activity;
/**
* Hakkın geçerli olduğu takvim yılı.
*
* @ORM\Column(type="smallint")
* @Groups({
* "worker_activity_leave_entitlement@base",
* "worker_activity_leave_entitlement@core"
* })
*/
private $year;
/**
* O yıl için yıllık izin hakkı (gün). Ondalık: yarım gün hakları tanımlanabilir olsun diye
* (tüketim bugün tam gün — Timesheet gün bazlı).
*
* @ORM\Column(type="decimal", precision=4, scale=1)
* @Groups({"worker_activity_leave_entitlement@core"})
*/
private $entitlement_days = '0.0';
/**
* Önceki yıldan devreden gün. Elle girilir (kaydedilmiş anlık görüntü — geçmiş yılın
* Timesheet'i sonradan düzenlenebildiği için canlı hesap sessizce oynardı).
*
* @ORM\Column(type="decimal", precision=4, scale=1)
* @Groups({"worker_activity_leave_entitlement@core"})
*/
private $carry_over_days = '0.0';
/**
* Devrin son kullanma tarihi (BUrlG §7/3 varsayılanı 31 Mart). NULL = yıl sonu.
* Bu tarihten sonraki H günleri devirden düşmez; kalan devir "verfallen" sayılır.
*
* @ORM\Column(type="date_immutable", nullable=true)
* @Groups({"worker_activity_leave_entitlement@core"})
*/
private $carry_over_expires_at;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({"worker_activity_leave_entitlement@core"})
*/
private $note;
/**
* @ORM\Column(type="datetime_immutable")
* @Groups({"worker_activity_leave_entitlement@core"})
*/
private $created_at;
/**
* @ORM\Column(type="datetime_immutable", nullable=true)
* @Groups({"worker_activity_leave_entitlement@core"})
*/
private $updated_at;
public function __construct()
{
$this->created_at = new \DateTimeImmutable('now');
}
public function getId(): ?int
{
return $this->id;
}
public function getWorkerActivity(): ?WorkerActivities
{
return $this->worker_activity;
}
public function setWorkerActivity(?WorkerActivities $worker_activity): self
{
$this->worker_activity = $worker_activity;
return $this;
}
public function getYear(): ?int
{
return $this->year;
}
public function setYear(int $year): self
{
$this->year = $year;
return $this;
}
public function getEntitlementDays(): ?string
{
return $this->entitlement_days;
}
public function setEntitlementDays($entitlement_days): self
{
$this->entitlement_days = (string) $entitlement_days;
return $this;
}
public function getCarryOverDays(): ?string
{
return $this->carry_over_days;
}
public function setCarryOverDays($carry_over_days): self
{
$this->carry_over_days = (string) ($carry_over_days === null || $carry_over_days === '' ? '0.0' : $carry_over_days);
return $this;
}
public function getCarryOverExpiresAt(): ?\DateTimeImmutable
{
return $this->carry_over_expires_at;
}
public function setCarryOverExpiresAt(?\DateTimeImmutable $carry_over_expires_at): self
{
$this->carry_over_expires_at = $carry_over_expires_at;
return $this;
}
public function getNote(): ?string
{
return $this->note;
}
public function setNote(?string $note): self
{
$this->note = $note;
return $this;
}
public function getCreatedAt(): ?\DateTimeImmutable
{
return $this->created_at;
}
public function setCreatedAt(\DateTimeImmutable $created_at): self
{
$this->created_at = $created_at;
return $this;
}
public function getUpdatedAt(): ?\DateTimeImmutable
{
return $this->updated_at;
}
public function setUpdatedAt(?\DateTimeImmutable $updated_at): self
{
$this->updated_at = $updated_at;
return $this;
}
}