*/ class Event extends Database implements Di\DateTimeAware, Di\ConfigAware { use Di\DateTimeSetter; use Di\ConfigSetter; protected $reminderSkippingStatusList = ['Held', 'Not Held']; protected $preserveDuration = true; protected function beforeSave(Entity $entity, array $options = []) { if ( $entity->isAttributeChanged('status') && in_array($entity->get('status'), $this->reminderSkippingStatusList) ) { $entity->set('reminders', []); } if ($entity->has('dateStartDate')) { $dateStartDate = $entity->get('dateStartDate'); if (!empty($dateStartDate)) { $dateStart = $dateStartDate . ' 00:00:00'; $dateStart = $this->convertDateTimeToDefaultTimezone($dateStart); $entity->set('dateStart', $dateStart); } else { $entity->set('dateStartDate', null); } } if ($entity->has('dateEndDate')) { $dateEndDate = $entity->get('dateEndDate'); if (!empty($dateEndDate)) { $dateEnd = $this->convertDateTimeToDefaultTimezone($dateEndDate . ' 00:00:00'); $dt = null; try { $dt = new DateTime($dateEnd); $dt->modify('+1 day'); $dateEnd = $dt->format('Y-m-d H:i:s'); } catch (Exception $e) {} $entity->set('dateEnd', $dateEnd); } else { $entity->set('dateEndDate', null); } } if ( !$entity->isNew() && $this->preserveDuration && $entity->isAttributeChanged('dateStart') && $entity->get('dateStart') && !$entity->isAttributeChanged('dateEnd') ) { $dateEndPrevious = $entity->getFetched('dateEnd'); $dateStartPrevious = $entity->getFetched('dateStart'); if ($dateStartPrevious && $dateEndPrevious) { $dtStart = new DateTime($dateStartPrevious); $dtEnd = new DateTime($dateEndPrevious); $dt = new DateTime($entity->get('dateStart')); $duration = ($dtEnd->getTimestamp() - $dtStart->getTimestamp()); $dt->modify('+' . $duration . ' seconds'); $dateEnd = $dt->format('Y-m-d H:i:s'); $entity->set('dateEnd', $dateEnd); } } parent::beforeSave($entity, $options); } protected function afterRemove(Entity $entity, array $options = []) { parent::afterRemove($entity, $options); $delete = $this->entityManager->getQueryBuilder() ->delete() ->from('Reminder') ->where([ 'entityId' => $entity->getId(), 'entityType' => $entity->getEntityType(), ]) ->build(); $this->entityManager->getQueryExecutor()->execute($delete); } protected function convertDateTimeToDefaultTimezone($string) { $timeZone = $this->config->get('timeZone') ?? 'UTC'; $tz = new DateTimeZone($timeZone); $dt = null; try { $dt = DateTime::createFromFormat( DateTimeUtil::SYSTEM_DATE_TIME_FORMAT, $string, $tz ); } catch (Exception $e) {} if (!$dt) { return null; } $utcTz = new DateTimeZone('UTC'); return $dt ->setTimezone($utcTz) ->format(DateTimeUtil::SYSTEM_DATE_TIME_FORMAT); } }