Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 22 |
CRAP | |
3.36% |
4 / 119 |
| TaskScheduling | |
0.00% |
0 / 1 |
|
0.00% |
0 / 22 |
4118.37 | |
3.36% |
4 / 119 |
| isAllDay | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 3 |
|||
| isOverdue | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 3 |
|||
| getStartDateTime | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| getEndDateTime | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| beforeSave | |
0.00% |
0 / 1 |
6.97 | |
57.14% |
4 / 7 |
|||
| afterSave | |
0.00% |
0 / 1 |
56 | |
0.00% |
0 / 8 |
|||
| addTaskReminder | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 8 |
|||
| isTaskReminder | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 4 |
|||
| hasTaskReminder | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| getFormattedEndDateTime | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 8 |
|||
| getFormattedStartDateTime | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 8 |
|||
| getFormattedDateTime | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 11 |
|||
| sendExtensionRequest | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 4 |
|||
| canRequestExtension | |
0.00% |
0 / 1 |
72 | |
0.00% |
0 / 7 |
|||
| hasRequestedExtension | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| notifyDateTimeChanged | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 8 |
|||
| getDurationDays | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 6 |
|||
| getDaysRemaining | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 6 |
|||
| isDeadlineToday | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getCalModeItems | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getCalMode | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 6 |
|||
| getFullCalendarArray | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 14 |
|||
| <?php | |
| /** | |
| * @link https://www.humhub.org/ | |
| * @copyright Copyright (c) 2018 HumHub GmbH & Co. KG | |
| * @license https://www.humhub.com/licences | |
| * | |
| */ | |
| namespace humhub\modules\tasks\models\scheduling; | |
| use DateTime; | |
| use DateTimeZone; | |
| use humhub\modules\tasks\CalendarUtils; | |
| use humhub\modules\tasks\helpers\TaskUrl; | |
| use humhub\modules\tasks\integration\calendar\TaskCalendar; | |
| use humhub\modules\tasks\models\Task; | |
| use humhub\modules\tasks\notifications\ChangedDateTimeNotification; | |
| use humhub\modules\tasks\notifications\ExtensionRequestNotification; | |
| use Yii; | |
| use yii\base\Component; | |
| use yii\helpers\Html; | |
| /** | |
| * Class TaskScheduling | |
| * | |
| * @todo change base class back to BaseObject after v1.3 stable | |
| * @package humhub\modules\tasks\models\scheduling | |
| */ | |
| class TaskScheduling extends Component | |
| { | |
| /** | |
| * Cal Modes | |
| */ | |
| const CAL_MODE_NONE = 0; | |
| const CAL_MODE_SPACE = 1; | |
| /** | |
| * @var array all given cal modes as array | |
| */ | |
| public static $calModes = [ | |
| self::CAL_MODE_NONE, | |
| self::CAL_MODE_SPACE | |
| ]; | |
| /** | |
| * @var Task | |
| */ | |
| public $task; | |
| /** | |
| * @return boolean weather or not this item spans exactly over a whole day | |
| */ | |
| public function isAllDay() | |
| { | |
| if ($this->task->all_day === null) { | |
| return true; | |
| } | |
| return (boolean) $this->task->all_day; | |
| } | |
| public function isOverdue() | |
| { | |
| if (!$this->task->scheduling) { | |
| return false; | |
| } | |
| return !$this->task->isCompleted() && (strtotime($this->task->end_datetime) < time()); | |
| } | |
| public function getStartDateTime() | |
| { | |
| return new DateTime($this->task->start_datetime, new DateTimeZone(Yii::$app->timeZone)); | |
| } | |
| public function getEndDateTime() | |
| { | |
| return new DateTime($this->task->end_datetime, new DateTimeZone(Yii::$app->timeZone)); | |
| } | |
| public function beforeSave() | |
| { | |
| if($this->task->scenario === Task::SCENARIO_EDIT) { | |
| if (!$this->task->scheduling) { | |
| $this->task->start_datetime = null; | |
| $this->task->end_datetime = null; | |
| }/* else if (CalendarUtils::isFullDaySpan(new DateTime($this->task->start_datetime), new DateTime($this->task->end_datetime))) { | |
| $this->task->all_day = 1; | |
| }*/ | |
| } | |
| // Reset deadline extension requests | |
| if ($this->task->isAttributeChanged('start_datetime', true) || $this->task->isAttributeChanged('end_datetime', true)) { | |
| $this->task->request_sent = 0; | |
| } | |
| } | |
| public function afterSave($insert, $changedAttributes) | |
| { | |
| if($this->task->scenario === Task::SCENARIO_EDIT) { | |
| TaskReminder::deleteAll(['task_id' => $this->task->id]); | |
| if (!empty($this->task->selectedReminders)) { | |
| foreach ($this->task->selectedReminders as $remind_mode) { | |
| $this->addTaskReminder($remind_mode); | |
| } | |
| } | |
| } | |
| if (!$insert && (array_key_exists('start_datetime', $changedAttributes) || array_key_exists('end_datetime', $changedAttributes))) { | |
| self::notifyDateTimeChanged(); | |
| } | |
| } | |
| public function addTaskReminder($remind_mode) | |
| { | |
| if (!$remind_mode) { | |
| return false; | |
| } | |
| if (!$this->isTaskReminder($remind_mode)) { | |
| $taskReminder = new TaskReminder([ | |
| 'task_id' => $this->task->id, | |
| 'remind_mode' => $remind_mode, | |
| ]); | |
| return $taskReminder->save(); | |
| } | |
| return false; | |
| } | |
| public function isTaskReminder($remind_mode) | |
| { | |
| if (!$remind_mode) { | |
| return false; | |
| } | |
| $taskReminder = $this->task->getTaskReminder()->where(['remind_mode' => $remind_mode])->one(); | |
| return !empty($taskReminder); | |
| } | |
| public function hasTaskReminder() | |
| { | |
| return !empty($this->task->taskReminder); | |
| } | |
| public function getFormattedEndDateTime($timeZone = null, $format = 'short') | |
| { | |
| if ($timeZone) { | |
| Yii::$app->formatter->timeZone = $timeZone; | |
| } | |
| if ($this->task->all_day) { | |
| $result = Yii::$app->formatter->asDate($this->getEndDateTime(), $format); | |
| } else { | |
| $result = Yii::$app->formatter->asDatetime($this->getEndDateTime(), $format); | |
| } | |
| if ($timeZone) { | |
| Yii::$app->i18n->autosetLocale(); | |
| } | |
| return $result; | |
| } | |
| public function getFormattedStartDateTime($timeZone = null, $format = 'short') | |
| { | |
| if ($timeZone) { | |
| Yii::$app->formatter->timeZone = $timeZone; | |
| } | |
| if ($this->task->all_day) { | |
| $result = Yii::$app->formatter->asDate($this->getStartDateTime(), $format); | |
| } else { | |
| $result = Yii::$app->formatter->asDatetime($this->getStartDateTime(), $format); | |
| } | |
| if ($timeZone) { | |
| Yii::$app->i18n->autosetLocale(); | |
| } | |
| return $result; | |
| } | |
| public function getFormattedDateTime($timeZone = null, $format = 'short') | |
| { | |
| if ($timeZone) { | |
| Yii::$app->formatter->timeZone = $timeZone; | |
| } | |
| if (!$this->task->scheduling) | |
| $result = Yii::t('TasksModule.views_index_index', 'No Scheduling set for this Task'); | |
| else { | |
| $result = Yii::t('TasksModule.views_index_index', 'Deadline at'); | |
| if ($this->task->all_day) { | |
| $result .= ' ' . Yii::$app->formatter->asDate($this->getEndDateTime(), $format); | |
| } | |
| else { | |
| $result .= ' ' . Yii::$app->formatter->asDatetime($this->getEndDateTime(), $format); | |
| } | |
| } | |
| if ($timeZone) { | |
| Yii::$app->i18n->autosetLocale(); | |
| } | |
| return $result; | |
| } | |
| /** | |
| * Request deadline extension | |
| * @throws \yii\base\InvalidConfigException | |
| * @throws \Throwable | |
| */ | |
| public function sendExtensionRequest() | |
| { | |
| if ($this->task->hasTaskResponsible()) { | |
| $this->task->deleteOldNotifications(ExtensionRequestNotification::className()); | |
| ExtensionRequestNotification::instance()->from(Yii::$app->user->getIdentity())->about($this->task)->sendBulk($this->task->taskResponsibleUsers); | |
| } | |
| } | |
| /** | |
| * handle task specific permissions | |
| * @return bool | |
| */ | |
| public function canRequestExtension() | |
| { | |
| if (!$this->task->scheduling || $this->task->isTaskResponsible() || !$this->task->hasTaskResponsible()) { | |
| return false; | |
| } | |
| if($this->task->isCompleted() || $this->task->isPendingReview()) { | |
| return false; | |
| } | |
| if($this->hasRequestedExtension()) { | |
| return false; | |
| } | |
| return $this->task->isTaskAssigned() || $this->task->canProcess(); | |
| } | |
| public function hasRequestedExtension() | |
| { | |
| return (boolean)($this->task->request_sent); | |
| } | |
| /** | |
| * Notify users about status change | |
| * @throws \yii\base\InvalidConfigException | |
| */ | |
| public function notifyDateTimeChanged() | |
| { | |
| if ($this->task->isCompleted()) | |
| return; | |
| // remove old notifications | |
| $this->task->deleteOldNotifications(ChangedDateTimeNotification::className()); | |
| if (!empty($this->taskAssignedUsers)) { | |
| ChangedDateTimeNotification::instance()->from(Yii::$app->user->getIdentity())->about($this->task)->sendBulk($this->task->filterResponsibleAssigned()); | |
| } | |
| if (!empty($this->taskResponsibleUsers)) { | |
| ChangedDateTimeNotification::instance()->from(Yii::$app->user->getIdentity())->about($this->task)->sendBulk($this->taskResponsibleUsers); | |
| } | |
| } | |
| public function getDurationDays() | |
| { | |
| $end = $this->getEndDateTime(); | |
| if ($this->isAllDay()) { | |
| if ($end === $this->getEndDateTime()->setTime('00', '00', '00')) | |
| $end->modify('-1 day'); // revert modifications for all-day events integrated via interface | |
| } | |
| $interval = $this->getStartDateTime()->diff($end, true); | |
| return $interval->days + 1; | |
| } | |
| public function getDaysRemaining() | |
| { | |
| $end = $this->getEndDateTime(); | |
| if ($this->isAllDay()) { | |
| if ($end === $this->getEndDateTime()->setTime('00', '00', '00')) | |
| $end->modify('-1 day'); // revert modifications for all-day events integrated via interface | |
| } | |
| $interval = (new DateTime())->diff($end, true); | |
| return $interval->days + 1; | |
| } | |
| public function isDeadlineToday() | |
| { | |
| $today = new DateTime("now", new DateTimeZone(Yii::$app->formatter->timeZone)); | |
| return Yii::$app->formatter->asDate($this->getEndDateTime(), "php:dmY") == $today->format('dmY'); | |
| } | |
| /** | |
| * Returns an array of calendarModes. | |
| * | |
| * @return array | |
| */ | |
| public static function getCalModeItems() | |
| { | |
| return [ | |
| self::CAL_MODE_NONE => Yii::t('TasksModule.models_task', 'Don\'t add to calendar'), | |
| self::CAL_MODE_SPACE => Yii::t('TasksModule.models_task', 'Add Deadline to space calendar'), | |
| ]; | |
| } | |
| public function getCalMode() | |
| { | |
| switch ($this->cal_mode) { | |
| case (self::CAL_MODE_NONE): | |
| return Yii::t('TasksModule.models_task', 'Don\'t add to calendar'); | |
| break; | |
| case (self::CAL_MODE_SPACE): | |
| return Yii::t('TasksModule.models_task', 'Add to space calendar'); | |
| break; | |
| default: | |
| return; | |
| } | |
| } | |
| /** | |
| * @inheritdoc | |
| */ | |
| public function getFullCalendarArray() | |
| { | |
| $end = $this->getEndDateTime(); | |
| if(!Yii::$app->user->isGuest) { | |
| Yii::$app->formatter->timeZone = Yii::$app->user->getIdentity()->time_zone; | |
| } | |
| $title = Yii::t('TasksModule.models_task', 'Deadline: ') . Html::encode($this->task->title); | |
| $result = [ | |
| // 'id' => $this->id, | |
| 'title' => $title, | |
| // 'editable' => ($this->content->canEdit() || self::isTaskResponsible()), | |
| 'editable' => false, | |
| //'color' => $color ? $color : TaskCalendar::DEFAULT_COLOR, | |
| 'allDay' => $this->task->all_day, | |
| //'updateUrl' => $this->task->content->container->createUrl('/tasks/task/edit-ajax', ['id' => $this->task->id]), | |
| 'viewUrl' => TaskUrl::viewTaskModal($this->task, 1), | |
| 'openUrl' => TaskUrl::viewTask($this->task), | |
| 'start' => $end, | |
| 'end' => $end, | |
| ]; | |
| $color = Html::encode($this->task->getColor()); | |
| if($color) { | |
| $result['color'] = $color; | |
| } | |
| return $result; | |
| } | |
| } |