Backup #2012
| ID | 2012 |
| Dateipfad | /var/www/dev.campus.systemische-tools.de/src/Domain/Entity/Task.php |
| Version | 28 |
| Typ |
modified |
| Größe | 7.4 KB |
| Hash | 69693b9fbd76aeb74132499a6838bb2d8ba12d127c881bdacb929f21fe4dc16d |
| Datum | 2025-12-28 14:21:19 |
| 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\Traits\TimestampsTrait;
use Domain\ValueObject\TaskStatus;
use Domain\ValueObject\TaskType;
class Task
{
use TimestampsTrait;
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;
/** @var array<string, mixed> */
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)
);
}
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; }
/** @return array<string, mixed> */
public function getMetadata(): array { return $this->metadata; }
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 setDueDate(?\DateTimeImmutable $dueDate): self { $this->dueDate = $dueDate; $this->touch(); return $this; }
/** @param array<string, mixed> $metadata */
public function updateMetadata(array $metadata): self { $this->metadata = $metadata; $this->touch(); return $this; }
public function isOverdue(): bool
{
return $this->dueDate !== null && !$this->status->isTerminal() && $this->dueDate < new \DateTimeImmutable();
}
public function isSubtask(): bool { return $this->parentTaskId !== null; }
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();
}
}
public function setId(int $id): self { $this->id = $id; return $this; }
/** @param array<string, mixed> $data */
public function hydrate(array $data): self
{
$this->uuid = $data['uuid'] ?? $this->uuid;
$this->title = $data['title'] ?? $this->title;
$this->description = $data['description'] ?? null;
$this->createdBy = $data['created_by'] ?? $this->createdBy;
$this->createdByType = $data['created_by_type'] ?? 'human';
$this->parentTaskId = isset($data['parent_task_id']) ? (int) $data['parent_task_id'] : null;
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['due_date'])) {
$this->dueDate = $this->toDateTime($data['due_date']);
}
if (isset($data['created_at'])) {
$this->createdAt = $this->toDateTime($data['created_at']);
}
if (isset($data['updated_at'])) {
$this->updatedAt = $this->toDateTime($data['updated_at']);
}
if (isset($data['completed_at'])) {
$this->completedAt = $this->toDateTime($data['completed_at']);
}
if (isset($data['metadata'])) {
$this->metadata = is_string($data['metadata']) ? json_decode($data['metadata'], true) ?? [] : $data['metadata'];
}
return $this;
}
/** @return array<string, mixed> */
public function toArray(): array
{
return [
'id' => $this->id, 'uuid' => $this->uuid, 'title' => $this->title,
'description' => $this->description, 'type' => $this->type->value,
'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,
];
}
/** @param array<string, mixed> $data */
public static function fromArray(array $data): self
{
$task = new self();
if (isset($data['id'])) {
$task->setId((int) $data['id']);
}
return $task->hydrate($data);
}
}
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