*/ class Task { const STATUS_PENDING = 'pending'; const STATUS_COMPLETED = 'completed'; const STATUS_DELETED = 'deleted'; const STATUS_WAITING = 'waiting'; const STATUS_RECURRING = 'recurring'; const PRIORITY_LOW = 'L'; const PRIORITY_MEDIUM = 'M'; const PRIORITY_HIGH = 'H'; /** * @var string * * @JMS\Type("string") */ private $uuid; /** * @var string * * @JMS\Type("string") */ private $description; /** * @var string * * @JMS\Type("string") */ private $priority; /** * @var string * * @JMS\Type("string") */ private $project; /** * @var Carbon * * @JMS\Type("Carbon") */ private $due; /** * @var Carbon * * @JMS\Type("Carbon") */ private $wait; /** * @var array * * @JMS\Type("array") */ private $tags; /** * @var float * * @JMS\Type("float") */ private $urgency; /** * @var Carbon * * @JMS\Type("Carbon") */ private $entry; /** * @var Carbon * * @JMS\Type("Carbon") */ private $start; /** * @var string * * @JMS\Type("Recurring") */ private $recur; /** * @var Carbon * * @JMS\Type("Carbon") */ private $until; /** * @var Carbon * * @JMS\Type("Carbon") */ private $modified; /** * @var Carbon * * @JMS\Type("Carbon") */ private $end; /** * @var string * * @JMS\Type("string") */ private $status; /** * @var Task[]|ArrayCollection * * @JMS\Type("Depends") */ private $depends; /** * */ public function __construct() { $this->urgency = 0; $this->entry = new Carbon('now'); $this->status = self::STATUS_PENDING; $this->depends = new ArrayCollection(); } /** * @return string */ public function getUuid() { return $this->uuid; } /** * @return string */ public function getDescription() { return $this->description; } /** * @param string $description */ public function setDescription($description) { $this->description = $description; } /** * @return string */ public function getPriority() { return $this->priority; } /** * @param string $priority */ public function setPriority($priority) { $this->priority = $priority; } /** * @return string */ public function getProject() { return $this->project; } /** * @param string $project */ public function setProject($project) { $this->project = $project; } /** * @return Carbon */ public function getDue() { return $this->due; } /** * @param \DateTime|string $due */ public function setDue($due = null) { $this->due = $this->parseDateTime($due); } /** * @return Carbon */ public function getWait() { return $this->wait; } /** * @param \DateTime|string $wait */ public function setWait($wait = null) { $this->wait = $this->parseDateTime($wait); } /** * @return array */ public function getTags() { return (array)$this->tags; } /** * @param array $tags */ public function setTags(array $tags = array()) { $this->tags = $tags; } /** * @param string $tag */ public function addTag($tag) { if (!$this->tags) { $this->tags = [$tag]; } if (!in_array($tag, $this->tags)) { $this->tags[] = $tag; } } /** * @param string $tag */ public function removeTag($tag) { if (!$this->tags) { return; } if (false !== $key = array_search($tag, $this->tags)) { unset($this->tags[$key]); } } /** * @return Task[]|ArrayCollection */ public function getDependencies() { return $this->depends; } /** * @param Task $task */ public function addDependency(Task $task) { $this->depends->add($task); } /** * @param Task $task */ public function removeDependency(Task $task) { $this->depends->removeElement($task); } /** * @param Task[] $tasks */ public function setDependencies(array $tasks = []) { $this->depends = new ArrayCollection(); foreach ($tasks as $task) { $this->addDependency($task); } } /** * @return Recurring */ public function getRecurring() { return $this->recur; } /** * @param string|Recurring $recur */ public function setRecurring($recur) { if ($recur instanceof Recurring) { $this->recur = $recur; } elseif ($recur) { $this->recur = new Recurring($recur); } else { $this->recur = null; } } /** * @return Carbon */ public function getUntil() { return $this->until; } /** * @param \DateTime|string $until */ public function setUntil($until = null) { $this->until = $this->parseDateTime($until); } /** * @return Carbon */ public function getEntry() { return $this->entry; } /** * @return Carbon */ public function getStart() { return $this->start; } /** * @return Carbon */ public function getModified() { return $this->modified; } /** * @return \DateTime */ public function getEnd() { return $this->end; } /** * @return float */ public function getUrgency() { return $this->urgency; } /** * @return string */ public function getStatus() { return $this->status; } /** * @return bool */ public function isPending() { return $this->status == self::STATUS_PENDING; } /** * @return bool */ public function isCompleted() { return $this->status == self::STATUS_COMPLETED; } /** * @return bool */ public function isWaiting() { return $this->status == self::STATUS_WAITING; } /** * @return bool */ public function isDeleted() { return $this->status == self::STATUS_DELETED; } /** * @return bool */ public function isRecurring() { return $this->status == self::STATUS_RECURRING; } /** * @param string|\DateTime|null $date * @return \DateTime|null * @throws DatetimeParseException */ private function parseDateTime($date) { if ($date instanceof \DateTime) { return new Carbon($date->format('Y-m-d H:i:s')); } if ($date instanceof Carbon) { return $date; } if (is_string($date)) { return new Carbon($date); } if ($date === null) { return null; } throw new DatetimeParseException($date); } /** * */ public function __clone() { $this->uuid = null; $this->entry = new Carbon('now'); $this->status = self::STATUS_PENDING; } }