Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 169
TaskReminder
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 11
1722
0.00% covered (danger)
0.00%
0 / 169
 tableName
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 3
 rules
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 7
 attributeLabels
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 8
 getTask
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 3
 getRemindModeItems
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 13
 getRemindMode
0.00% covered (danger)
0.00%
0 / 1
110
0.00% covered (danger)
0.00%
0 / 33
 canSendRemind
0.00% covered (danger)
0.00%
0 / 1
210
0.00% covered (danger)
0.00%
0 / 62
 remindUserOfStart
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 4
 remindUserOfEnd
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 4
 deleteOldReminder
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 10
 handleRemind
0.00% covered (danger)
0.00%
0 / 1
56
0.00% covered (danger)
0.00%
0 / 22
<?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 Yii;
use DateTime;
use humhub\components\ActiveRecord;
use humhub\modules\notification\models\Notification;
use humhub\modules\tasks\models\Task;
use humhub\modules\tasks\notifications\RemindEnd;
use humhub\modules\tasks\notifications\RemindStart;
/**
 * This is the model class for table "task_reminder".
 *
 * The followings are the available columns in table 'task_reminder':
 * @property integer $id
 * @property integer $task_id
 * @property integer $remind_mode
 * @property integer $start_reminder_sent
 * @property integer $end_reminder_sent
 * @property Task $task
 */
class TaskReminder extends ActiveRecord
{
    /**
     * @inheritdocs
     */
    protected $streamChannel = null;
    /**
     * Remind Mode
     */
    const REMIND_NONE = 0;
    const REMIND_ONE_HOUR = 1;
    const REMIND_TWO_HOURS = 2;
    const REMIND_ONE_DAY = 3;
    const REMIND_TWO_DAYS = 4;
    const REMIND_ONE_WEEK = 5;
    const REMIND_TWO_WEEKS = 6;
    const REMIND_THREE_WEEKS = 7;
    const REMIND_ONE_MONTH = 8;
    /**
     * @var array all given remind modes as array
     */
    public static $remindModes = [
        self::REMIND_NONE,
        self::REMIND_ONE_HOUR,
        self::REMIND_TWO_HOURS,
        self::REMIND_ONE_DAY,
        self::REMIND_TWO_DAYS,
        self::REMIND_TWO_WEEKS,
        self::REMIND_THREE_WEEKS,
        self::REMIND_ONE_MONTH
    ];
    /**
     * @return string the associated database table name
     */
    public static function tableName()
    {
        return 'task_reminder';
    }
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['task_id', 'remind_mode'], 'required'],
            [['task_id', 'start_reminder_sent', 'end_reminder_sent'], 'integer'],
            [['remind_mode'], 'in', 'range' => self::$remindModes],
        ];
    }
    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'task_id' => Yii::t('TasksModule.models_taskReminder', 'Task'),
            'remind_mode' => Yii::t('TasksModule.models_taskReminder', 'Remind Mode'),
            'remind_sent' => Yii::t('TasksModule.models_task', 'Reminder sent'),
        ];
    }
    public function getTask()
    {
        return $this->hasOne(Task::class, ['id' => 'task_id']);
    }
    public static function getRemindModeItems()
    {
        return [
            self::REMIND_NONE => Yii::t('TasksModule.models_taskReminder', 'Do not remind'),
            self::REMIND_ONE_HOUR => Yii::t('TasksModule.models_taskReminder', 'At least 1 Hour before'),
            self::REMIND_TWO_HOURS => Yii::t('TasksModule.models_taskReminder', 'At least 2 Hours before'),
            self::REMIND_ONE_DAY => Yii::t('TasksModule.models_taskReminder', '1 Day before'),
            self::REMIND_TWO_DAYS => Yii::t('TasksModule.models_taskReminder', '2 Days before'),
            self::REMIND_ONE_WEEK => Yii::t('TasksModule.models_taskReminder', '1 Week before'),
            self::REMIND_TWO_WEEKS => Yii::t('TasksModule.models_taskReminder', '2 Weeks before'),
            self::REMIND_THREE_WEEKS => Yii::t('TasksModule.models_taskReminder', '3 Weeks before'),
            self::REMIND_ONE_MONTH => Yii::t('TasksModule.models_taskReminder', '1 Month before'),
        ];
    }
    public function getRemindMode()
    {
        switch ($this->remind_mode){
            case (self::REMIND_NONE):
                return Yii::t('TasksModule.models_taskReminder', 'Do not remind');
                break;
            case (self::REMIND_ONE_HOUR):
                return Yii::t('TasksModule.models_taskReminder', 'At least 1 Hour before');
                break;
            case (self::REMIND_TWO_HOURS):
                return Yii::t('TasksModule.models_taskReminder', 'At least 2 Hours before');
                break;
            case (self::REMIND_ONE_DAY):
                return Yii::t('TasksModule.models_taskReminder', '1 Day before');
                break;
            case (self::REMIND_TWO_DAYS):
                return Yii::t('TasksModule.models_taskReminder', '2 Days before');
                break;
            case (self::REMIND_ONE_WEEK):
                return Yii::t('TasksModule.models_taskReminder', '1 Week before');
                break;
            case (self::REMIND_TWO_WEEKS):
                return Yii::t('TasksModule.models_taskReminder', '2 Weeks before');
                break;
            case (self::REMIND_THREE_WEEKS):
                return Yii::t('TasksModule.models_taskReminder', '3 Weeks before');
                break;
            case (self::REMIND_ONE_MONTH):
                return Yii::t('TasksModule.models_taskReminder', '1 Month before');
                break;
            default:
                return;
        }
    }
    public function canSendRemind(DateTime $now, DateTime $dateTime)
    {
        if ($now === '' || $dateTime === '')
            return false;
        $modifiedStart = clone $dateTime;
        $modifiedEnd = clone $dateTime;
        switch ($this->remind_mode) {
            case self::REMIND_NONE :
                return false;
                break;
            case self::REMIND_ONE_HOUR :
                $modifiedStart = $modifiedStart->modify('-2 hours');
                $modifiedEnd = $modifiedEnd->modify('-1 hour');
                break;
            case self::REMIND_TWO_HOURS :
                $modifiedStart = $modifiedStart->modify('-3 hours');
                $modifiedEnd = $modifiedEnd->modify('-2 hours');
                break;
            case self::REMIND_ONE_DAY :
                $modifiedStart = $modifiedStart->modify('-1 day');
                $modifiedStart = $modifiedStart->setTime('00', '00', '00');
                $modifiedEnd = $modifiedEnd->modify('-1 day');
                $modifiedEnd = $modifiedEnd->setTime('23', '59', '59');
                break;
            case self::REMIND_TWO_DAYS :
                $modifiedStart = $modifiedStart->modify('-2 days');
                $modifiedStart = $modifiedStart->setTime('00', '00', '00');
                $modifiedEnd = $modifiedEnd->modify('-2 days');
                $modifiedEnd = $modifiedEnd->setTime('23', '59', '59');
                break;
            case self::REMIND_ONE_WEEK :
                $modifiedStart = $modifiedStart->modify('-1 week');
                $modifiedStart = $modifiedStart->setTime('00', '00', '00');
                $modifiedEnd = $modifiedEnd->modify('-1 week');
                $modifiedEnd = $modifiedEnd->setTime('23', '59', '59');
                break;
            case self::REMIND_TWO_WEEKS :
                $modifiedStart = $modifiedStart->modify('-2 weeks');
                $modifiedStart = $modifiedStart->setTime('00', '00', '00');
                $modifiedEnd = $modifiedEnd->modify('-2 weeks');
                $modifiedEnd = $modifiedEnd->setTime('23', '59', '59');
                break;
            case self::REMIND_THREE_WEEKS :
                $modifiedStart = $modifiedStart->modify('-3 weeks');
                $modifiedStart = $modifiedStart->setTime('00', '00', '00');
                $modifiedEnd = $modifiedEnd->modify('-3 weeks');
                $modifiedEnd = $modifiedEnd->setTime('23', '59', '59');
                break;
            case self::REMIND_ONE_MONTH :
                $modifiedStart = $modifiedStart->modify('-1 month');
                $modifiedStart = $modifiedStart->setTime('00', '00', '00');
                $modifiedEnd = $modifiedEnd->modify('-1 month');
                $modifiedEnd = $modifiedEnd->setTime('23', '59', '59');
                break;
            default:
                return false;
                break;
        }
        if ($modifiedEnd > $now && $modifiedStart <= $now)
            return true;
        else
            return false;
    }
    /**
     * Remind users
     */
    public function remindUserOfStart()
    {
        $this->deleteOldReminder();
        RemindStart::instance()->from($this->task->content->createdBy)->about($this->task)->sendBulk($this->task->users);
    }
    /**
     * Remind users
     */
    public function remindUserOfEnd()
    {
        $this->deleteOldReminder();
        RemindEnd::instance()->from($this->task->content->createdBy)->about($this->task)->sendBulk($this->task->users);
    }
    public function deleteOldReminder()
    {
        // delete old reminder
        $startNotifications = Notification::find()->where(['class' => RemindStart::class, 'source_class' => Task::class, 'source_pk' => $this->task->id, 'space_id' => $this->task->content->container->id])->all();
        foreach ($startNotifications as $notification) {
            $notification->delete();
        }
        $endNotifications = Notification::find()->where(['class' => RemindEnd::class, 'source_class' => Task::class, 'source_pk' => $this->task->id, 'space_id' => $this->task->content->container->id])->all();
        foreach ($endNotifications as $notification) {
            $notification->delete();
        }
    }
    public function handleRemind(DateTime $now)
    {
        $task = $this->task;
        if (!$this->start_reminder_sent) {
            if (self::canSendRemind($now, $task->schedule->getStartDateTime())) {
                $this->remindUserOfStart();
                $this->updateAttributes(['start_reminder_sent' => 1]);
                return true;
            }
        }
        if ($task->schedule->getStartDateTime() < $now) {
            //$this->updateAttributes(['start_reminder_sent' => 1]);
        }
        if (!$this->end_reminder_sent) {
            if (self::canSendRemind($now, $task->schedule->getEndDateTime())) {
                $this->remindUserOfEnd();
                $this->updateAttributes(['end_reminder_sent' => 1]);
                return true;
            }
        }
        if ($task->schedule->getEndDateTime() < $now) {
            //$this->updateAttributes(['end_reminder_sent' => 1]);
        }
        return false;
    }
}