%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/calendar/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/calendar/Events.php |
<?php
namespace humhub\modules\calendar;
use DateTime;
use humhub\modules\calendar\helpers\RecurrenceHelper;
use humhub\modules\calendar\models\CalendarEntry;
use humhub\modules\calendar\models\CalendarEntryParticipant;
use humhub\modules\calendar\models\MenuSettings;
use humhub\modules\space\models\Space;
use humhub\modules\user\models\User;
use humhub\modules\calendar\interfaces\event\EditableEventIF;
use humhub\modules\calendar\interfaces\event\CalendarItemTypesEvent;
use humhub\modules\calendar\interfaces\recurrence\RecurrentEventIF;
use humhub\modules\content\components\ContentActiveRecord;
use humhub\modules\calendar\helpers\CalendarUtils;
use humhub\modules\calendar\interfaces\event\CalendarEventIF;
use humhub\modules\calendar\integration\BirthdayCalendar;
use humhub\modules\calendar\interfaces\reminder\CalendarEventReminderIF;
use humhub\modules\calendar\models\reminder\ReminderService;
use humhub\modules\calendar\models\reminder\CalendarReminder;
use humhub\modules\calendar\models\reminder\CalendarReminderSent;
use humhub\modules\calendar\models\SnippetModuleSettings;
use humhub\modules\calendar\widgets\DownloadIcsLink;
use humhub\modules\calendar\interfaces\CalendarService;
use humhub\modules\calendar\widgets\ReminderLink;
use humhub\modules\calendar\widgets\UpcomingEvents;
use humhub\modules\content\models\Content;
use humhub\modules\calendar\helpers\Url;
use Yii;
use yii\db\StaleObjectException;
use yii\helpers\Console;
/**
* Description of CalendarEvents
*
* @author luke
*/
class Events
{
/**
* @inheritdoc
*/
public static function onBeforeRequest()
{
try {
static::registerAutoloader();
Yii::$app->getModule('calendar')->set(CalendarService::class, ['class' => CalendarService::class]);
} catch (\Throwable $e) {
Yii::error($e);
}
}
/**
* Register composer autoloader when Reader not found
*/
public static function registerAutoloader()
{
require Yii::getAlias('@calendar/vendor/autoload.php');
}
/**
* @param $event CalendarItemTypesEvent
* @return mixed
*/
public static function onGetCalendarItemTypes($event)
{
try {
BirthdayCalendar::addItemTypes($event);
} catch (\Throwable $e) {
Yii::error($e);
}
}
/**
* @param $event \humhub\modules\calendar\interfaces\event\CalendarItemsEvent;
* @throws \Throwable
*/
public static function onFindCalendarItems($event)
{
try {
BirthdayCalendar::addItems($event);
} catch (\Throwable $e) {
Yii::error($e);
}
}
public static function onTopMenuInit($event)
{
try {
if (SnippetModuleSettings::instance()->showGlobalCalendarItems() &&
MenuSettings::instance()->show) {
$event->sender->addItem([
'label' => Yii::t('CalendarModule.base', 'Calendar'),
'url' => Url::toGlobalCalendar(),
'icon' => '<i class="fa fa-calendar"></i>',
'isActive' => (Yii::$app->controller->module
&& Yii::$app->controller->module->id == 'calendar'
&& Yii::$app->controller->id == 'global'),
'sortOrder' => MenuSettings::instance()->sortOrder,
]);
}
} catch (\Throwable $e) {
Yii::error($e);
}
}
public static function onSpaceMenuInit($event)
{
try {
/* @var Space $space */
$space = $event->sender->space;
if ($space->moduleManager->isEnabled('calendar')) {
$event->sender->addItem([
'label' => Yii::t('CalendarModule.base', 'Calendar'),
'group' => 'modules',
'url' => Url::toCalendar($space),
'icon' => '<i class="fa fa-calendar"></i>',
'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'calendar'),
]);
}
} catch (\Throwable $e) {
Yii::error($e);
}
}
public static function onProfileMenuInit($event)
{
try {
/* @var User $user */
$user = $event->sender->user;
if ($user->moduleManager->isEnabled('calendar')) {
$event->sender->addItem([
'label' => Yii::t('CalendarModule.base', 'Calendar'),
'url' => Url::toCalendar($user),
'icon' => '<i class="fa fa-calendar"></i>',
'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'calendar'),
]);
}
} catch (\Throwable $e) {
Yii::error($e);
}
}
public static function onSpaceSidebarInit($event)
{
try {
/* @var Space $space */
$space = $event->sender->space;
$settings = SnippetModuleSettings::instantiate();
if ($space->moduleManager->isEnabled('calendar')) {
if ($settings->showUpcomingEventsSnippet()) {
$event->sender->addWidget(UpcomingEvents::class, ['contentContainer' => $space], ['sortOrder' => $settings->upcomingEventsSnippetSortOrder]);
}
}
} catch (\Throwable $e) {
Yii::error($e);
}
}
public static function onDashboardSidebarInit($event)
{
try {
$settings = SnippetModuleSettings::instantiate();
if ($settings->showUpcomingEventsSnippet()) {
$event->sender->addWidget(UpcomingEvents::class, [], ['sortOrder' => $settings->upcomingEventsSnippetSortOrder]);
}
} catch (\Throwable $e) {
Yii::error($e);
}
}
public static function onProfileSidebarInit($event)
{
try {
if (Yii::$app->user->isGuest) {
return;
}
$user = $event->sender->user;
if ($user != null) {
$settings = SnippetModuleSettings::instantiate();
if ($settings->showUpcomingEventsSnippet()) {
$event->sender->addWidget(UpcomingEvents::class, ['contentContainer' => $user], ['sortOrder' => $settings->upcomingEventsSnippetSortOrder]);
}
}
} catch (\Throwable $e) {
Yii::error($e);
}
}
public static function onWallEntryLinks($event)
{
try {
$eventModel = static::getCalendarEvent($event->sender->object);
if(!$eventModel) {
return;
}
if ($eventModel instanceof ContentActiveRecord && $eventModel instanceof CalendarEventIF) {
$event->sender->addWidget(DownloadIcsLink::class, ['calendarEntry' => $eventModel]);
}
/* @var $eventModel CalendarEventIF */
if($eventModel->getStartDateTime() <= new DateTime()) {
return;
}
if($eventModel instanceof CalendarEventReminderIF && !RecurrenceHelper::isRecurrentRoot($eventModel)) {
$event->sender->addWidget(ReminderLink::class, ['entry' => $eventModel]);
}
} catch (\Throwable $e) {
Yii::error($e);
}
}
/**
* @param $model
* @return CalendarEventIF|null
*/
private static function getCalendarEvent($model)
{
if($model instanceof CalendarEventIF) {
return $model;
}
if(method_exists($model, 'getCalendarEvent')) {
$event = $model->getCalendarEvent();
if($event instanceof CalendarEventIF) {
return $event;
}
}
return null;
}
public static function onRecordBeforeInsert($event)
{
try {
static::onRecordBeforeUpdate($event);
} catch (\Throwable $e) {
Yii::error($e);
}
}
public static function onRecordBeforeUpdate($event)
{
try {
$model = CalendarUtils::getCalendarEvent($event->sender);
if($model && ($model instanceof EditableEventIF)) {
/** @var $model EditableEventIF **/
if(empty($model->getUid())) {
$model->setUid(CalendarUtils::generateEventUid($model));
}
}
} catch (\Throwable $e) {
Yii::error($e);
}
}
/**
* @param $event
* @throws \Throwable
* @throws StaleObjectException
*/
public static function onRecordBeforeDelete($event)
{
try {
$model = CalendarUtils::getCalendarEvent($event->sender);
if(!$model || !($model instanceof CalendarEventReminderIF)) {
return;
}
foreach(CalendarReminder::getEntryLevelReminder($model) as $reminder) {
$reminder->delete();
}
if($model instanceof RecurrentEventIF) {
// When deleting duplicates we want to prevent automatic exdate settings.
if(!static::$duplicateIntegrityRun) {
$model->getRecurrenceQuery()->onDelete();
}
}
} catch (\Throwable $e) {
Yii::error($e);
}
}
public static $duplicateIntegrityRun = false;
/**
* @param $event
* @throws \Throwable
* @throws StaleObjectException
*/
public static function onIntegrityCheck($event)
{
$integrityController = $event->sender;
$integrityController->showTestHeadline("Calendar Module (" . CalendarReminder::find()->count() . " reminder entries)");
foreach (CalendarReminder::find()->all() as $reminder) {
if ($reminder->isEntryLevelReminder() && !Content::findOne(['id' => $reminder->content_id])) {
if ($integrityController->showFix("Delete calendar reminder " . $reminder->id . " without existing entry relation!")) {
$reminder->delete();
}
}
}
$integrityController->showTestHeadline("Calendar Module (" . CalendarReminderSent::find()->count() . " reminder sent entries)");
foreach (CalendarReminderSent::find()->all() as $reminderSent) {
if(!Content::findOne(['id' => $reminderSent->content_id])) {
if ($integrityController->showFix("Delete calendar reminder sent" . $reminderSent->id . " without existing entry relation!")) {
$reminderSent->delete();
}
}
}
static::$duplicateIntegrityRun = true;
$duplicatedRecurrences = CalendarEntry::find()
->select('id, parent_event_id, recurrence_id, COUNT(*)')
->where('recurrence_id IS NOT NULL')
->andWhere('parent_event_id IS NOT NULL')
->groupBy('parent_event_id, recurrence_id')
->having('COUNT(*) > 1')->asArray(true);
foreach ($duplicatedRecurrences->all() as $duplicatedRecurrenceArr) {
$duplicateQuery = CalendarEntry::find()
->where(['recurrence_id' => $duplicatedRecurrenceArr['recurrence_id']])
->andWhere(['parent_event_id' => $duplicatedRecurrenceArr['parent_event_id']])
->andWhere(['<>', 'id', $duplicatedRecurrenceArr['id']]);
foreach ($duplicateQuery->all() as $duplicate) {
if(RecurrenceHelper::isRecurrentInstance($duplicate) && $duplicate->id !== $duplicatedRecurrenceArr['id']) {
if ($integrityController->showFix('Delete duplicated recurrent event instance ' . $duplicate->id . '!')) {
$duplicate->delete();
}
}
}
}
static::$duplicateIntegrityRun = false;
}
/**
* Callback when a user is completely deleted.
*
* @param \yii\base\Event $event
*/
public static function onUserDelete($event)
{
$user = $event->sender;
foreach (CalendarEntryParticipant::findAll(['user_id' => $user->id]) as $participant) {
$participant->delete();
}
}
public static function onCronRun($event)
{
static::onBeforeRequest();
/* @var $module Module */
$module = Yii::$app->getModule('calendar');
$lastRunTS = $module->settings->get('lastReminderRunTS');
if(!$lastRunTS || ((time() - $lastRunTS) >= $module->getRemidnerProcessIntervalS())) {
try {
$controller = $event->sender;
$controller->stdout("Running reminder process... ");
(new ReminderService())->sendAllReminder();
$controller->stdout('done.' . PHP_EOL, Console::FG_GREEN);
} catch (\Throwable $e) {
Yii::error($e);
$controller->stdout('error.' . PHP_EOL, Console::FG_RED);
$controller->stderr("\n".$e->getTraceAsString()."\n", Console::BOLD);
}
$module->settings->set('lastReminderRunTS', time());
}
}
public static function onRestApiAddRules()
{
/* @var humhub\modules\rest\Module $restModule */
$restModule = Yii::$app->getModule('rest');
$restModule->addRules([
['pattern' => 'calendar/', 'route' => 'calendar/rest/calendar/find', 'verb' => ['GET', 'HEAD']],
['pattern' => 'calendar/container/<containerId:\d+>', 'route' => 'calendar/rest/calendar/find-by-container', 'verb' => ['GET', 'HEAD']],
['pattern' => 'calendar/container/<containerId:\d+>', 'route' => 'calendar/rest/calendar/delete-by-container', 'verb' => 'DELETE'],
//Calendar entry CRUD
['pattern' => 'calendar/container/<containerId:\d+>', 'route' => 'calendar/rest/calendar/create', 'verb' => 'POST'],
['pattern' => 'calendar/entry/<id:\d+>', 'route' => 'calendar/rest/calendar/view', 'verb' => ['GET', 'HEAD']],
['pattern' => 'calendar/entry/<id:\d+>', 'route' => 'calendar/rest/calendar/update', 'verb' => 'PUT'],
['pattern' => 'calendar/entry/<id:\d+>', 'route' => 'calendar/rest/calendar/delete', 'verb' => 'DELETE'],
//Calendar Entry Management
['pattern' => 'calendar/entry/<id:\d+>/upload-files', 'route' => 'calendar/rest/calendar/attach-files', 'verb' => 'POST'],
['pattern' => 'calendar/entry/<id:\d+>/remove-file/<fileId:\d+>', 'route' => 'calendar/rest/calendar/remove-file', 'verb' => 'DELETE'],
//Participate
['pattern' => 'calendar/entry/<id:\d+>/respond', 'route' => 'calendar/rest/calendar/respond', 'verb' => 'POST'],
], 'calendar');
}
}