Backup #1472
| ID | 1472 |
| Dateipfad | /var/www/dev.campus.systemische-tools.de/src/Domain/Entity/Task.php |
| Version | 18 |
| Typ |
modified |
| Größe | 8.7 KB |
| Hash | 65da7f64ec8319797cafc824788fad7b2cdb5f9b6589a8ebe60ed7684f47c16a |
| Datum | 2025-12-25 17:02:34 |
| 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;
/** @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;
}
public function getCreatedAt(): \DateTimeImmutable
{
return $this->createdAt;
}
public function getUpdatedAt(): \DateTimeImmutable
{
return $this->updatedAt;
}
public function getCompletedAt(): ?\DateTimeImmutable
{
return $this->completedAt;
}
/** @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 setDueDateTo(\DateTimeImmutable $dueDate): self
{
$this->dueDate = $dueDate;
$this->touch();
return $this;
}
public function clearDueDate(): self
{
$this->dueDate = null;
$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();
}
}
private function touch(): void
{
$this->updatedAt = 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;
}
private function toDateTime(\DateTimeImmutable|string $value): \DateTimeImmutable
{
return $value instanceof \DateTimeImmutable ? $value : new \DateTimeImmutable($value);
}
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,
];
}
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