%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/tasks/models/scheduling/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/tasks/models/scheduling/TaskReminder.php |
<?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.base', 'Task'), 'remind_mode' => Yii::t('TasksModule.base', 'Remind Mode'), 'remind_sent' => Yii::t('TasksModule.base', 'Reminder sent'), ]; } public function getTask() { return $this->hasOne(Task::class, ['id' => 'task_id']); } public static function getRemindModeItems() { return [ self::REMIND_NONE => Yii::t('TasksModule.base', 'Do not remind'), self::REMIND_ONE_HOUR => Yii::t('TasksModule.base', 'At least 1 Hour before'), self::REMIND_TWO_HOURS => Yii::t('TasksModule.base', 'At least 2 Hours before'), self::REMIND_ONE_DAY => Yii::t('TasksModule.base', '1 Day before'), self::REMIND_TWO_DAYS => Yii::t('TasksModule.base', '2 Days before'), self::REMIND_ONE_WEEK => Yii::t('TasksModule.base', '1 Week before'), self::REMIND_TWO_WEEKS => Yii::t('TasksModule.base', '2 Weeks before'), self::REMIND_THREE_WEEKS => Yii::t('TasksModule.base', '3 Weeks before'), self::REMIND_ONE_MONTH => Yii::t('TasksModule.base', '1 Month before'), ]; } public function getRemindMode() { switch ($this->remind_mode){ case (self::REMIND_NONE): return Yii::t('TasksModule.base', 'Do not remind'); break; case (self::REMIND_ONE_HOUR): return Yii::t('TasksModule.base', 'At least 1 Hour before'); break; case (self::REMIND_TWO_HOURS): return Yii::t('TasksModule.base', 'At least 2 Hours before'); break; case (self::REMIND_ONE_DAY): return Yii::t('TasksModule.base', '1 Day before'); break; case (self::REMIND_TWO_DAYS): return Yii::t('TasksModule.base', '2 Days before'); break; case (self::REMIND_ONE_WEEK): return Yii::t('TasksModule.base', '1 Week before'); break; case (self::REMIND_TWO_WEEKS): return Yii::t('TasksModule.base', '2 Weeks before'); break; case (self::REMIND_THREE_WEEKS): return Yii::t('TasksModule.base', '3 Weeks before'); break; case (self::REMIND_ONE_MONTH): return Yii::t('TasksModule.base', '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; } }