Backup #1390
| ID | 1390 |
| Dateipfad | /var/www/dev.campus.systemische-tools.de/src/Domain/Entity/Task.php |
| Version | 5 |
| Typ |
modified |
| Größe | 10.7 KB |
| Hash | dce00a444091eb2a5f54f5e23097641ceac295af032c208ac78f2af532ff56d7 |
| Datum | 2025-12-25 16:57:36 |
| Geändert von | claude-code-hook |
| Grund | Claude Code Pre-Hook Backup vor Edit-Operation |
| Datei existiert |
Ja
|
Dateiinhalt
<?php
declare(strict_types=1);
namespace Domain\Entity;
// @responsibility: Task-Entität - Rich Domain Model mit Business-Logik
use Domain\ValueObject\TaskStatus;
use Domain\ValueObject\TaskType;
class Task
{
private ?int $id = null;
private string $uuid;
private string $title;
private ?string $description = null;
private TaskType $type;
private TaskStatus $status;
private string $createdBy;
private string $createdByType = 'human';
private ?int $parentTaskId = null;
private ?\DateTimeImmutable $dueDate = null;
private \DateTimeImmutable $createdAt;
private \DateTimeImmutable $updatedAt;
private ?\DateTimeImmutable $completedAt = null;
private array $metadata = [];
private function __construct()
{
$this->uuid = $this->generateUuid();
$this->status = TaskStatus::PENDING;
$this->type = TaskType::HUMAN_TASK;
$this->createdAt = new \DateTimeImmutable();
$this->updatedAt = new \DateTimeImmutable();
}
public static function create(
string $title,
string $createdBy,
?string $description = null,
?TaskType $type = null,
?int $parentTaskId = null,
?\DateTimeImmutable $dueDate = null
): self {
$task = new self();
$task->title = $title;
$task->createdBy = $createdBy;
$task->description = $description;
if ($type !== null) {
$task->type = $type;
}
if ($parentTaskId !== null) {
$task->parentTaskId = $parentTaskId;
}
if ($dueDate !== null) {
$task->dueDate = $dueDate;
}
return $task;
}
private function generateUuid(): string
{
return sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff)
);
}
// Getters
public function getId(): ?int
{
return $this->id;
}
public function getUuid(): string
{
return $this->uuid;
}
public function getTitle(): string
{
return $this->title;
}
public function getDescription(): ?string
{
return $this->description;
}
public function getType(): TaskType
{
return $this->type;
}
public function getStatus(): TaskStatus
{
return $this->status;
}
public function getCreatedBy(): string
{
return $this->createdBy;
}
public function getCreatedByType(): string
{
return $this->createdByType;
}
public function getParentTaskId(): ?int
{
return $this->parentTaskId;
}
public function getDueDate(): ?\DateTimeImmutable
{
return $this->dueDate;
}
public function getCreatedAt(): \DateTimeImmutable
{
return $this->createdAt;
}
public function getUpdatedAt(): \DateTimeImmutable
{
return $this->updatedAt;
}
public function getCompletedAt(): ?\DateTimeImmutable
{
return $this->completedAt;
}
public function getMetadata(): array
{
return $this->metadata;
}
// Business Methods
public function updateDetails(string $title, ?string $description = null): self
{
$this->title = $title;
$this->description = $description;
$this->touch();
return $this;
}
public function changeType(TaskType $type): self
{
$this->type = $type;
$this->touch();
return $this;
}
public function assignParent(int $parentTaskId): self
{
$this->parentTaskId = $parentTaskId;
$this->touch();
return $this;
}
public function setDueDateTo(\DateTimeImmutable $dueDate): self
{
$this->dueDate = $dueDate;
$this->touch();
return $this;
}
public function clearDueDate(): self
{
$this->dueDate = null;
$this->touch();
return $this;
}
public function updateMetadata(array $metadata): self
{
$this->metadata = $metadata;
$this->touch();
return $this;
}
public function isOverdue(): bool
{
if ($this->dueDate === null || $this->status->isTerminal()) {
return false;
}
return $this->dueDate < new \DateTimeImmutable();
}
public function isSubtask(): bool
{
return $this->parentTaskId !== null;
}
// Status Transitions
public function start(): self
{
$this->transitionTo(TaskStatus::IN_PROGRESS);
return $this;
}
public function complete(): self
{
$this->transitionTo(TaskStatus::COMPLETED);
return $this;
}
public function fail(): self
{
$this->transitionTo(TaskStatus::FAILED);
return $this;
}
public function cancel(): self
{
$this->transitionTo(TaskStatus::CANCELLED);
return $this;
}
public function retry(): self
{
if ($this->status !== TaskStatus::FAILED) {
throw new \DomainException('Can only retry failed tasks');
}
$this->transitionTo(TaskStatus::PENDING);
$this->completedAt = null;
return $this;
}
private function transitionTo(TaskStatus $newStatus): void
{
if (!$this->status->canTransitionTo($newStatus)) {
throw new \DomainException(
sprintf('Cannot transition from %s to %s', $this->status->value, $newStatus->value)
);
}
$this->status = $newStatus;
$this->touch();
if ($newStatus->isTerminal()) {
$this->completedAt = new \DateTimeImmutable();
}
}
private function touch(): void
{
$this->updatedAt = new \DateTimeImmutable();
}
// Internal Setters for Hydration
public function setId(int $id): self
{
$this->id = $id;
return $this;
}
public function hydrate(array $data): self
{
if (isset($data['uuid'])) {
$this->uuid = $data['uuid'];
}
if (isset($data['title'])) {
$this->title = $data['title'];
}
if (isset($data['description'])) {
$this->description = $data['description'];
}
if (isset($data['type'])) {
$this->type = is_string($data['type']) ? TaskType::from($data['type']) : $data['type'];
}
if (isset($data['status'])) {
$this->status = is_string($data['status']) ? TaskStatus::from($data['status']) : $data['status'];
}
if (isset($data['created_by'])) {
$this->createdBy = $data['created_by'];
}
if (isset($data['created_by_type'])) {
$this->createdByType = $data['created_by_type'];
}
if (isset($data['parent_task_id'])) {
$this->parentTaskId = (int) $data['parent_task_id'];
}
if (isset($data['due_date'])) {
$this->dueDate = $data['due_date'] instanceof \DateTimeImmutable
? $data['due_date']
: new \DateTimeImmutable($data['due_date']);
}
if (isset($data['created_at'])) {
$this->createdAt = $data['created_at'] instanceof \DateTimeImmutable
? $data['created_at']
: new \DateTimeImmutable($data['created_at']);
}
if (isset($data['updated_at'])) {
$this->updatedAt = $data['updated_at'] instanceof \DateTimeImmutable
? $data['updated_at']
: new \DateTimeImmutable($data['updated_at']);
}
if (isset($data['completed_at'])) {
$this->completedAt = $data['completed_at'] instanceof \DateTimeImmutable
? $data['completed_at']
: new \DateTimeImmutable($data['completed_at']);
}
if (isset($data['metadata'])) {
$this->metadata = is_string($data['metadata']) ? json_decode($data['metadata'], true) : $data['metadata'];
}
return $this;
}
public function toArray(): array
{
return [
'id' => $this->id,
'uuid' => $this->uuid,
'title' => $this->title,
'description' => $this->description,
'type' => $this->type,
'status' => $this->status->value,
'created_by' => $this->createdBy,
'created_by_type' => $this->createdByType,
'parent_task_id' => $this->parentTaskId,
'due_date' => $this->dueDate?->format('Y-m-d H:i:s'),
'created_at' => $this->createdAt->format('Y-m-d H:i:s.u'),
'updated_at' => $this->updatedAt->format('Y-m-d H:i:s.u'),
'completed_at' => $this->completedAt?->format('Y-m-d H:i:s.u'),
'metadata' => $this->metadata,
];
}
public static function fromArray(array $data): self
{
$task = new self();
if (isset($data['id'])) {
$task->setId((int) $data['id']);
}
if (isset($data['uuid'])) {
$task->setUuid($data['uuid']);
}
if (isset($data['title'])) {
$task->setTitle($data['title']);
}
if (isset($data['description'])) {
$task->setDescription($data['description']);
}
if (isset($data['type'])) {
$task->setType($data['type']);
}
if (isset($data['status'])) {
$task->status = TaskStatus::from($data['status']);
}
if (isset($data['created_by'])) {
$task->setCreatedBy($data['created_by']);
}
if (isset($data['created_by_type'])) {
$task->setCreatedByType($data['created_by_type']);
}
if (isset($data['parent_task_id'])) {
$task->setParentTaskId((int) $data['parent_task_id']);
}
if (isset($data['due_date'])) {
$task->setDueDate(new \DateTimeImmutable($data['due_date']));
}
if (isset($data['created_at'])) {
$task->setCreatedAt(new \DateTimeImmutable($data['created_at']));
}
if (isset($data['updated_at'])) {
$task->setUpdatedAt(new \DateTimeImmutable($data['updated_at']));
}
if (isset($data['completed_at'])) {
$task->setCompletedAt(new \DateTimeImmutable($data['completed_at']));
}
if (isset($data['metadata'])) {
$metadata = is_string($data['metadata']) ? json_decode($data['metadata'], true) : $data['metadata'];
$task->setMetadata($metadata ?? []);
}
return $task;
}
}
Vollständig herunterladen
Aktionen
Andere Versionen dieser Datei
| ID |
Version |
Typ |
Größe |
Datum |
| 2012 |
28 |
modified |
7.4 KB |
2025-12-28 14:21 |
| 2010 |
27 |
modified |
7.5 KB |
2025-12-28 14:20 |
| 2009 |
26 |
modified |
7.7 KB |
2025-12-28 14:19 |
| 2008 |
25 |
modified |
7.8 KB |
2025-12-28 14:19 |
| 2007 |
24 |
modified |
8.1 KB |
2025-12-28 14:18 |
| 2005 |
23 |
modified |
8.2 KB |
2025-12-28 14:18 |
| 2004 |
22 |
modified |
8.1 KB |
2025-12-28 14:18 |
| 1951 |
21 |
modified |
8.5 KB |
2025-12-28 02:25 |
| 1950 |
20 |
modified |
8.8 KB |
2025-12-28 02:24 |
| 1473 |
19 |
modified |
8.7 KB |
2025-12-25 17:02 |
| 1472 |
18 |
modified |
8.7 KB |
2025-12-25 17:02 |
| 1471 |
17 |
modified |
8.6 KB |
2025-12-25 17:02 |
| 1470 |
16 |
modified |
8.6 KB |
2025-12-25 17:02 |
| 1468 |
15 |
modified |
8.5 KB |
2025-12-25 17:02 |
| 1467 |
14 |
modified |
8.5 KB |
2025-12-25 17:02 |
| 1440 |
13 |
modified |
8.1 KB |
2025-12-25 17:00 |
| 1433 |
12 |
modified |
8.2 KB |
2025-12-25 16:59 |
| 1427 |
11 |
modified |
8.4 KB |
2025-12-25 16:59 |
| 1420 |
10 |
modified |
8.5 KB |
2025-12-25 16:59 |
| 1413 |
9 |
modified |
8.5 KB |
2025-12-25 16:58 |
| 1412 |
8 |
modified |
8.6 KB |
2025-12-25 16:58 |
| 1405 |
7 |
modified |
8.9 KB |
2025-12-25 16:58 |
| 1396 |
6 |
modified |
9.2 KB |
2025-12-25 16:58 |
| 1390 |
5 |
modified |
10.7 KB |
2025-12-25 16:57 |
| 1384 |
4 |
modified |
8.2 KB |
2025-12-25 16:57 |
| 1380 |
3 |
modified |
8.2 KB |
2025-12-25 16:56 |
| 1378 |
2 |
modified |
7.5 KB |
2025-12-25 16:56 |
| 807 |
1 |
modified |
7.4 KB |
2025-12-23 08:07 |
← Zurück zur Übersicht