<?php
namespace App\Entity;
use App\Repository\ProjectOrderTaskFulfillmentMessageRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* Task execution İÇ-MESAJLAŞMA — owner (ERP) ⟷ executor (servis) arası, task-bazlı chat
* (karar 59, Chat-K1/Chat-K2). Rol model: ProjectOrderTaskFulfillmentDateRevision (aynı desen —
* execution'a bağlı, created_at ile sıralı zincir, tarihsel kayıtlar asla mutasyona uğramaz).
*
* ⚠️ Chat-K1 (güvenlik kilidi): mesaj İÇERİĞİ NS'ten GEÇMEZ — NS auth'suz, oda anahtarını
* (scope+contactPersonId) bilen herkes girebilir. NS yalnız SİNYAL taşır (`task_execution_message`
* → `{executionId, unreadCount?}`); gövde bu tablodan kimlik-doğrulamalı uçlarla çekilir
* (owner = session, executor = X-Internal-Token). Bu entity NS emit'i YAPMAZ, FE emit eder.
*
* @ORM\Entity(repositoryClass=ProjectOrderTaskFulfillmentMessageRepository::class)
* @ORM\Table(name="project_order_task_fulfillment_messages")
*/
class ProjectOrderTaskFulfillmentMessage
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({
* "project_order_task_fulfillment_message@core"
* })
*/
private $id;
/**
* ⚠️ Bilerek Groups anotasyonu YOK — bu FK asla serialize edilmez (back-ref recursion + Chat-K1:
* mesaj execution payload'ına enjekte edilmez, execution de mesaja gömülmez, ayrı uçlar).
*
* @ORM\ManyToOne(targetEntity=ProjectOrderTaskFulfillment::class, inversedBy="messages")
* @ORM\JoinColumn(name="execution_id", nullable=false, onDelete="CASCADE")
*/
private $execution;
/**
* Kim gönderdi — owner (ERP) mi executor (servis) mi. Değerlerin TEK kaynağı
* App\Enum\TaskExecutionSenderSideEnum; DB kolonu App\Doctrine\Type\TaskExecutionSenderSide
* ile gerçek ENUM.
* @ORM\Column(type="task_execution_sender_side", nullable=false)
* @Groups({
* "project_order_task_fulfillment_message@core"
* })
*/
private $sender_side;
/**
* Gönderenin görünen adı — SNAPSHOT (gönderim anındaki ad denormalize edilir). owner:
* WorkerActivities→Worker::getFullName() · executor(internal): aynı yol · executor(external):
* VendorContactPersons name+surname. Gönderen sonradan adını değiştirse/hesabı silinse bile
* geçmiş mesaj kimin gönderdiğini göstermeye devam eder (canlı FK ile arama YAPILMAZ).
* @ORM\Column(type="string", length=191, nullable=false)
* @Groups({
* "project_order_task_fulfillment_message@core"
* })
*/
private $sender_name;
/**
* @ORM\Column(type="text", nullable=false)
* @Groups({
* "project_order_task_fulfillment_message@core"
* })
*/
private $body;
/**
* @ORM\Column(type="datetime_immutable")
* @Groups({
* "project_order_task_fulfillment_message@core"
* })
*/
private $created_at;
public function getId(): ?int
{
return $this->id;
}
public function getExecution(): ?ProjectOrderTaskFulfillment
{
return $this->execution;
}
public function setExecution(?ProjectOrderTaskFulfillment $execution): self
{
$this->execution = $execution;
return $this;
}
public function getSenderSide(): ?string
{
return $this->sender_side;
}
public function setSenderSide(string $sender_side): self
{
$this->sender_side = $sender_side;
return $this;
}
public function getSenderName(): ?string
{
return $this->sender_name;
}
public function setSenderName(string $sender_name): self
{
$this->sender_name = $sender_name;
return $this;
}
public function getBody(): ?string
{
return $this->body;
}
public function setBody(string $body): self
{
$this->body = $body;
return $this;
}
public function getCreatedAt(): ?\DateTimeImmutable
{
return $this->created_at;
}
public function setCreatedAt(\DateTimeImmutable $created_at): self
{
$this->created_at = $created_at;
return $this;
}
}