%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/calendar/helpers/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/calendar/helpers/CalendarUtils.php |
<?php
namespace humhub\modules\calendar\helpers;
use DateTime;
use DateTimeInterface;
use DateTimeZone;
use humhub\libs\DateHelper;
use humhub\modules\calendar\interfaces\event\CalendarEventIF;
use humhub\modules\calendar\interfaces\event\EditableEventIF;
use humhub\modules\calendar\Module;
use humhub\modules\content\models\Content;
use Sabre\VObject\UUIDUtil;
use Yii;
/**
* Description of CalendarUtils
*
* @author luke
*/
class CalendarUtils
{
/**
* Database Field - Validators
*/
const REGEX_DBFORMAT_DATE = '/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/';
const REGEX_DBFORMAT_DATETIME = '/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/';
private static $userTimezone;
private static $userTimezoneString;
const DATE_FORMAT_ATOM = 'Y-m-d\TH:i:sP';
const DB_DATE_FORMAT = 'Y-m-d H:i:s';
const DATE_FORMAT_SHORT = 'Y-m-d';
const DATE_FORMAT_SHORT_NO_TIME = '!Y-m-d';
const TIME_FORMAT_SHORT_PHP = 'H:i';
const TIME_FORMAT_SHORT = 'php:'.self::TIME_FORMAT_SHORT_PHP;
const TIME_FORMAT_SHORT_MERIDIEM_PHP = 'h:i A';
const TIME_FORMAT_SHORT_MERIDIEM = 'php:'.self::TIME_FORMAT_SHORT_MERIDIEM_PHP;
const ICAL_TIME_FORMAT = 'Ymd\THis';
const DOW_SUNDAY = 1;
const DOW_MONDAY = 2;
const DOW_TUESDAY = 3;
const DOW_WEDNESDAY = 4;
const DOW_THURSDAY = 5;
const DOW_FRIDAY = 6;
const DOW_SATURDAY = 7;
/**
* @param $value
* @param null $timeValue
* @param null $timeFormat
* @param string $timeZone
* @return bool|DateTime
* @throws \Exception
*/
public static function parseDateTimeString($value, $timeValue = null, $timeFormat = null, $timeZone = 'UTC')
{
if(static::isInDbFormat($value)) {
$date = DateTime::createFromFormat(static::DATE_FORMAT_SHORT_NO_TIME, $value, static::getDateTimeZone('UTC'));
$ts = $date->getTimestamp();
} else {
$ts = DateHelper::parseDateTimeToTimestamp($value);
}
if(!$ts) {
return false;
}
if($timeValue) {
$ts += static::parseTime($timeValue, $timeFormat);
}
$date = new DateTime('now', new DateTimeZone('UTC'));
$date->setTimestamp($ts);
$result = DateTime::createFromFormat(static::DB_DATE_FORMAT, static::toDBDateFormat($date), static::getDateTimeZone($timeZone));
/**
* We check for year 1980 regarding a Bug in HumHub 1.3 which returned unix epoch date for invalid date formats with time
* This was fixed in HumHub 1.4
*/
if($result < new \DateTime('1980-01-01')) {
$result = false;
}
return $result;
}
public static function getTimeFormat($php = false)
{
$withmeridiam = $php ? static::TIME_FORMAT_SHORT_MERIDIEM_PHP : static::TIME_FORMAT_SHORT_MERIDIEM;
$noMeridiam = $php ? static::TIME_FORMAT_SHORT_PHP : static::TIME_FORMAT_SHORT;
return Yii::$app->formatter->isShowMeridiem() ? $withmeridiam : $noMeridiam;
}
/**
* Checks whether the given value is a db date format or not.
*
* @param string $value the date value
* @return boolean
*/
protected static function isInDbFormat($value)
{
return (preg_match(self::REGEX_DBFORMAT_DATE, $value) || preg_match(self::REGEX_DBFORMAT_DATETIME, $value));
}
/**
* @param $value
* @param $format
* @return bool|false|int
*/
public static function parseTime($value, $format)
{
$result = false;
if($format) {
try {
$dt = DateTime::createFromFormat(static::parseFormat($format), $value);
if($dt === false) {
return false;
}
// Use 1st January for time seconds extracting because today date has an issue
// with dates like 27th March when hour is shifted to summer/winter time
$dt->setDate($dt->format('Y'), 1, 1);
$result = $dt->getTimestamp() - strtotime($dt->format('Y') . '-01-01');
} catch (\Exception $e) {
return false;
}
}
if(!$format && !$result) {
$result = static::parseTime($value, static::TIME_FORMAT_SHORT);
}
if(!$format && !$result) {
$result = static::parseTime($value, static::TIME_FORMAT_SHORT_MERIDIEM);
}
return $result;
}
/**
* Checks if the date spans over a whole day if $end is after $start and $start time is 00:00 and $end time is:
*
* - 00:00 or 23:59 if $endDateMomentAfter is null (non strict)
* - 00:00 if $endDateMomentAfter is true
* - 23:59 if $endDateMomentAfter is false
*
* @param $start
* @param $end
* @param null $endDateMomentAfter
* @return bool
* @throws \Exception
*/
public static function isAllDay($start, $end, $endDateMomentAfter = null)
{
$start = static::getDateTime($start);
$end = static::getDateTime($end);
if($start >= $end) {
return false;
}
$startCondition = static::getTimeString($start) === '00:00';
if(!$startCondition) {
return false;
}
$endTime = static::getTimeString($end);
if($endDateMomentAfter === null) {
return $endTime === '00:00' || $endTime === '23:59';
}
if($endDateMomentAfter) {
return $endTime === '00:00';
}
return $endTime === '23:59';
}
public static function ensureAllDay(DateTime $startDt, DateTime $endDt)
{
if($startDt->format('Y-m-d') === $endDt->format('Y-m-d')) {
$endDt->modify('+1 day');
}
$startDt->setTime(0,0,0);
$endDt->setTime(0,0,0);
}
/**
* @param $date
* @param string $format
* @return string
* @throws \Exception
*/
public static function getTimeString($date, $format = self::TIME_FORMAT_SHORT)
{
return static::getDateTime($date)->format(static::parseFormat($format));
}
public static function getDateString($date, $format = self::DATE_FORMAT_SHORT)
{
return static::getDateTime($date)->format(static::parseFormat($format));
}
/**
* @param $date
* @return DateTime|DateTimeInterface
* @throws \Exception
*/
public static function getDateTime($date)
{
if($date instanceof \DateTimeImmutable) {
return DateTime::createFromFormat(
static::DATE_FORMAT_ATOM,
$date->format(static::DATE_FORMAT_ATOM)
);
}
return $date instanceof DateTime ? clone $date : new DateTime($date);
}
/**
* @param $tz
* @return DateTimeZone
*/
public static function getDateTimeZone($tz = null)
{
if(!$tz) {
return null;
}
return $tz instanceof DateTimeZone ? $tz : new DateTimeZone($tz);
}
public static function getStartTimeZone(CalendarEventIF $event, $asString = false)
{
return $asString ? $event->getTimezone() : static::getDateTimeZone($event->getTimezone());
}
public static function getEndTimeZone(CalendarEventIF $event, $asString = false)
{
$result = $event->getEndTimezone();
if(!$result) {
$result = $event->getTimezone();
}
return $asString ? $result : static::getDateTimeZone($result);
}
public static function cleanRecurrentId($recurrentId, $targetTZ = null)
{
$date = ($recurrentId instanceof \DateTimeInterface) ? $recurrentId : new DateTime($recurrentId, new DateTimeZone('UTC'));
if($targetTZ) {
$date->setTimezone(new DateTimeZone($targetTZ));
}
return $date->format(static::ICAL_TIME_FORMAT);
}
public static function flush()
{
static::$userTimezoneString = null;
static::$userTimezone = null;
}
/**
* @return DateTimeZone
*/
public static function getUserTimeZone($asString = false)
{
if(!static::$userTimezone) {
$tz = Yii::$app->user->isGuest
? Yii::$app->timeZone
: Yii::$app->user->getTimeZone();
if(!$tz) {
$tz = Yii::$app->timeZone;
}
if($tz) {
static::$userTimezoneString = $tz;
static::$userTimezone = new DateTimeZone($tz);
}
}
return $asString ? static::$userTimezoneString : static::$userTimezone;
}
public static function getSystemTimeZone($asString = false)
{
return $asString ? Yii::$app->timeZone : new DateTimeZone(Yii::$app->timeZone);
}
public static function toDBDateFormat($date, $fixedTZ = true)
{
$date = static::getDateTime($date);
if(!$fixedTZ) {
$date->setTimezone(new DateTimeZone(Yii::$app->timeZone));
}
return $date->format(static::DB_DATE_FORMAT);
}
public static function getFirstDayOfWeek()
{
if (extension_loaded('intl')) {
$cal = \IntlCalendar::createInstance(null, Yii::$app->formatter->locale);
return $cal->getFirstDayOfWeek();
}
return static::DOW_MONDAY;
}
public static function getDaysOfWeek()
{
$days = [
static::DOW_SUNDAY => Yii::t('CalendarModule.base', 'Sunday'),
static::DOW_MONDAY => Yii::t('CalendarModule.base', 'Monday'),
static::DOW_TUESDAY => Yii::t('CalendarModule.base', 'Tuesday'),
static::DOW_WEDNESDAY => Yii::t('CalendarModule.base', 'Wednesday'),
static::DOW_THURSDAY => Yii::t('CalendarModule.base', 'Thursday'),
static::DOW_FRIDAY => Yii::t('CalendarModule.base', 'Friday'),
static::DOW_SATURDAY => Yii::t('CalendarModule.base', 'Saturday'),
];
return $days;
}
public static function getDayOfWeek($dow)
{
$dows = static::getDaysOfWeek();
if(isset($dow, $dows)) {
return $dows[$dow];
}
}
public static function translateToUserTimezone($date, $fromTZ = null, $format = self::DB_DATE_FORMAT)
{
if(!$fromTZ) {
$fromTZ = static::getSystemTimeZone();
}
return static::translateTimezone($date, $fromTZ, static::getUserTimeZone(), $format);
}
public static function translateToSystemTimezone($date, $fromTZ = null, $format = self::DB_DATE_FORMAT)
{
if(!$fromTZ) {
$fromTZ = static::getUserTimeZone();
}
return static::translateTimezone($date, $fromTZ, static::getSystemTimeZone(), $format);
}
/**
* @param DateTimeInterface|string $date
* @param DateTimeZone| string $fromTZ
* @param DateTimeZone| string $toTZ
* @param string $format
* @return DateTime|string
* @throws \Exception
*/
public static function translateTimezone($date, $fromTZ, $toTZ, $format = self::DB_DATE_FORMAT)
{
$date = static::getDateTime($date);
$fromTZ = static::getDateTimeZone($fromTZ);
$toTZ = static::getDateTimeZone($toTZ);
// Get rid of any old timezone information and set new from timezone, then translate to to timezone
$date = static::clearTimezone($date, $fromTZ);
$date->setTimezone($toTZ);
return $format === false ? $date : $date->format(static::parseFormat($format));
}
private static function clearTimezone($date, $newTZ = null)
{
if($newTZ) {
$newTZ = static::getDateTimeZone($newTZ);
}
$date = static::getDateTime($date);
return new DateTime($date->format(self::DB_DATE_FORMAT), $newTZ);
}
private static function parseFormat($format = null)
{
if (!$format) {
return null;
}
if (strncmp($format, 'php:', 4) === 0) {
return substr($format, 4);
}
return $format;
}
public static function generateEventUid(CalendarEventIF $event, $type = 'event') {
return static::generateUUid($event->getEventType()->getKey());
}
public static function generateUUid($type = 'event') {
Module::registerAutoloader();
return 'humhub-'.$type.'-' . UUIDUtil::getUUID();
}
/**
* @param $model
* @return CalendarEventIF|null
*/
public static function getCalendarEvent($model)
{
if($model instanceof Content) {
$model = $model->getModel();
}
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 incrementSequence(CalendarEventIF $entry)
{
if($entry instanceof EditableEventIF) {
$sequence = $entry->getSequence();
$entry->setSequence( ($sequence === null) ? 0 : ++$sequence);
}
}
}