diff --git a/lib/models/resources/ResourceBooking.class.php b/lib/models/resources/ResourceBooking.class.php index 7f1fe03b8bc63cb3eb1b3c7100f3b005e6c6e898..a16d5e7f04fe2a3e12c38141490937e19d6c1aa6 100644 --- a/lib/models/resources/ResourceBooking.class.php +++ b/lib/models/resources/ResourceBooking.class.php @@ -30,17 +30,18 @@ * @property string booking_user_id database column * The user who created the booking (booking). * @property string description database column - * @property string begin database column - * @property string end database column - * @property string booking_type database column: The booking type. + * @property int begin database column + * @property int end database column + * @property int $preparation_time database column + * @property int booking_type database column: The booking type. * The following types are defined: * 0 = normal booking * 1 = reservation * 2 = lock * 3 = planned booking (reservation from external tools) * - * @property string repeat_end database column - * @property string repeat_quantity database column + * @property int repeat_end database column + * @property int repeat_quantity database column * @property string repetition_interval database column * The repetition_interval column contains a date interval string in a * format that is accepted by the DateInterval class constructor. @@ -51,11 +52,14 @@ * https://secure.php.net/manual/en/class.dateinterval.php * * @property string internal_comment database column - * @property string mkdate database column - * @property string chdate database column + * @property int mkdate database column + * @property int chdate database column * @property Resource resource belongs_to Resource * @property User assigned_user belongs_to User * @property CourseDate assigned_course_date belongs_to CourseDate + * + * @property-read int $real_begin + * @property-read DateTime $real_begin_dt */ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calendar\EventSource { @@ -92,6 +96,19 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen $config['additional_fields']['course_id'] = ['assigned_course_date', 'range_id']; $config['additional_fields']['room_name'] = ['resource', 'name']; + $config['additional_fields']['real_begin'] = [ + 'get' => function (ResourceBooking $booking) { + return $booking->begin - $booking->preparation_time; + } + ]; + $config['additional_fields']['real_begin_dt'] = [ + 'get' => function (ResourceBooking $booking) { + $real_begin = new DateTime(); + $real_begin->setTimestamp($booking->real_begin); + return $real_begin; + } + ]; + $config['registered_callbacks']['after_store'][] = 'updateIntervals'; $config['registered_callbacks']['after_store'][] = 'createStoreLogEntry'; $config['registered_callbacks']['after_delete'][] = 'sendDeleteNotification'; @@ -457,7 +474,7 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen _('Es wurde ein Wiederholungsintervall ohne Begrenzung angegeben!') ); } - if ((!$this->repeat_quantity) && ($real_begin > $this->repeat_end)) { + if ((!$this->repeat_quantity) && ($this->real_begin > $this->repeat_end)) { throw new InvalidArgumentException( _('Der Startzeitpunkt darf nicht hinter dem Ende der Wiederholungen liegen!') ); @@ -691,8 +708,6 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen */ public function deleteOverlappingBookings() { - $real_begin = new DateTime(); - $real_begin->setTimestamp($this->begin - $this->preparation_time); $end = new DateTime(); $end->setTimestamp($this->end); $repetition_end = new DateTime(); @@ -707,14 +722,14 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen _('Es wurde ein Wiederholungsintervall ohne Begrenzung angegeben!') ); } - if ((!$this->repeat_quantity) && ($real_begin > $this->repeat_end)) { + if ((!$this->repeat_quantity) && ($this->real_begin > $this->repeat_end)) { throw new InvalidArgumentException( _('Der Startzeitpunkt darf nicht hinter dem Ende der Wiederholungen liegen!') ); } //Look in each repetition for overlapping bookings and delete them. - $current_date = clone $real_begin; + $current_date = $this->real_begin_dt; while ($current_date <= $repetition_end) { $current_begin = clone $current_date; $current_end = clone $current_date; @@ -758,10 +773,10 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen } } else { $derived_resource = $this->resource->getDerivedClassInstance(); - if ($derived_resource->userHasPermission($this->booking_user, 'autor', [$real_begin, $end])) { + if ($derived_resource->userHasPermission($this->booking_user, 'autor', [$this->real_begin_dt, $end])) { $delete_sql = 'begin < :end AND end > :begin AND resource_id = :resource_id '; $sql_params = [ - 'begin' => $real_begin->getTimestamp(), + 'begin' => $this->real_begin, 'end' => $end->getTimestamp(), 'resource_id' => $this->resource->id ]; @@ -804,11 +819,6 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen $booking_resource = Resource::find($this->resource_id); $booking_user = User::find($this->booking_user_id); - $real_begin = new DateTime(); - $real_begin->setTimestamp($this->begin - $this->preparation_time); - $end = new DateTime(); - $end->setTimestamp($this->end); - $deleted_c = 0; $template_factory = new Flexi_TemplateFactory( @@ -819,8 +829,8 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen $booking_resource, [ [ - 'begin' => $real_begin->getTimestamp(), - 'end' => $end->getTimestamp(), + 'begin' => $this->real_begin, + 'end' => $this->end, ] ], [1, 3],