diff --git a/app/controllers/course/timesrooms.php b/app/controllers/course/timesrooms.php index 6249d4790f9a4d60c19dcdc8a3b7f2afa488b0cf..9e189ca175a95244160cc6b8c7b4471836f9445c 100644 --- a/app/controllers/course/timesrooms.php +++ b/app/controllers/course/timesrooms.php @@ -584,7 +584,7 @@ class Course_TimesroomsController extends AuthenticatedController } else { PageLayout::postError( studip_interpolate( - _('Der Raum %{room_name} wird an dem Termin %{date} bereits durch eine andere Veranstaltung belegt.'), + _('Der Raum %{room_name} wird an dem Termin %{date} bereits anderweitig belegt.'), [ 'room_name' => $room->name, 'date' => $termin->getFullName() @@ -1123,6 +1123,7 @@ class Course_TimesroomsController extends AuthenticatedController } if (in_array(Request::get('action'), ['room', 'freetext', 'noroom']) || Request::get('course_type')) { + $success_cases = 0; $errors = []; foreach ($singledates as $singledate) { if ($singledate instanceof CourseExDate) { @@ -1147,12 +1148,32 @@ class Course_TimesroomsController extends AuthenticatedController $failure = false; try { $failure = !$singledate->bookRoom($room, intval($preparation_time)); - } catch (ResourceBookingException|ResourceBookingOverlapException $e) { + } catch (ResourceBookingException $e) { $errors[] = sprintf( _('Der angegebene Raum konnte für den Termin %1$s nicht gebucht werden: %2$s'), '<strong>' . htmlReady($singledate->getFullName()) . '</strong>', $e->getMessage() ); + } catch (ResourceBookingOverlapException $e) { + $course = $e->getRange(); + if ($course instanceof Course) { + $errors[] = studip_interpolate( + _('Der Raum %{room_name} wird an dem Termin %{date} bereits durch die Veranstaltung %{course_name} belegt.'), + [ + 'room_name' => $room->name, + 'date' => $singledate->getFullName(), + 'course_name' => $course->name + ] + ); + } else { + $errors[] = studip_interpolate( + _('Der Raum %{room_name} wird an dem Termin %{date} bereits anderweitig belegt.'), + [ + 'room_name' => $room->name, + 'date' => $singledate->getFullName() + ] + ); + } } if ($failure) { $errors[] = sprintf( @@ -1160,10 +1181,7 @@ class Course_TimesroomsController extends AuthenticatedController '<strong>' . htmlReady($singledate->getFullName()) . '</strong>' ); } else { - PageLayout::postSuccess(sprintf( - _('Die Änderungen am Termin %s wurden gespeichert.'), - $singledate->getFullName() - )); + $success_cases++; } } } else if (Request::get('room_id_parameter')) { @@ -1202,6 +1220,15 @@ class Course_TimesroomsController extends AuthenticatedController )); } } + if ($success_cases > 0) { + if (!$errors) { + //Everything went well. + PageLayout::postSuccess(_('Die Änderungen wurden gespeichert.')); + } else { + //Not everything went well. + PageLayout::postWarning(_('Es konnten nicht alle Termine geändert werden.')); + } + } if ($errors) { PageLayout::postError( _('Die folgenden Fehler traten auf:'), diff --git a/lib/exceptions/Exception.php b/lib/exceptions/Exception.php index 606c03c30f7ba658caad93dff1bdc4bdf191771a..714998ec8b4580e23fa6cc6cc58e7a3ca839faee 100644 --- a/lib/exceptions/Exception.php +++ b/lib/exceptions/Exception.php @@ -55,4 +55,12 @@ class Exception extends \Exception $this->range ); } + + /** + * @return \Range|null The range of the exception. + */ + public function getRange() : ?\Range + { + return $this->range; + } } diff --git a/lib/exceptions/resources/ResourceBookingException.php b/lib/exceptions/resources/ResourceBookingException.php index 3dcf4834b8a01c8a6ca3213ad9efd77920d0255c..a39da502c141d9e3fce9284c759242555830d5d8 100644 --- a/lib/exceptions/resources/ResourceBookingException.php +++ b/lib/exceptions/resources/ResourceBookingException.php @@ -18,7 +18,7 @@ * This exception is thrown when a general error occurs when dealing with * ResourceBooking objects. */ -class ResourceBookingException extends InvalidArgumentException +class ResourceBookingException extends \Studip\Exception { } diff --git a/lib/exceptions/resources/ResourceBookingOverlapException.php b/lib/exceptions/resources/ResourceBookingOverlapException.php index 697cfc5746c974db6a00f4883893ac2e4ed20dba..39497e7a73162f90b5f1b03327cc5a344ee914f3 100644 --- a/lib/exceptions/resources/ResourceBookingOverlapException.php +++ b/lib/exceptions/resources/ResourceBookingOverlapException.php @@ -18,7 +18,7 @@ * This exception is thrown when a resource booking overlaps with * other resource bookings or with a resource lock. */ -class ResourceBookingOverlapException extends InvalidArgumentException +class ResourceBookingOverlapException extends \Studip\Exception { } diff --git a/lib/models/resources/Resource.php b/lib/models/resources/Resource.php index 4dae189b3f9bb3f7c48fe0c280395c2aa6afd395..661e8f42b6312006c22f23752d3a2957605bf6eb 100644 --- a/lib/models/resources/Resource.php +++ b/lib/models/resources/Resource.php @@ -872,7 +872,9 @@ class Resource extends SimpleORMap implements StudipItem $begin->format('d.m.Y H:i'), $end->format('H:i'), $e->getMessage() - ) + ), + $e->getCode(), + $e->getRange() ); } else { throw new ResourceBookingOverlapException( @@ -882,7 +884,9 @@ class Resource extends SimpleORMap implements StudipItem $begin->format('d.m.Y H:i'), $end->format('d.m.Y H:i'), $e->getMessage() - ) + ), + $e->getCode(), + $e->getRange() ); } } catch (Exception $e) { diff --git a/lib/models/resources/ResourceBooking.php b/lib/models/resources/ResourceBooking.php index 3c84cb84651703895c2ae6dd690f12bfd705ffc1..49de3815bbff1ab4d5352970b9c06256a5d939c5 100644 --- a/lib/models/resources/ResourceBooking.php +++ b/lib/models/resources/ResourceBooking.php @@ -521,6 +521,9 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen } ); } + + $course = null; + foreach ($time_intervals as $time_interval) { foreach ($existing_deleted_intervals as $deleted_interval) { if ( @@ -563,7 +566,6 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen [self::TYPE_NORMAL, self::TYPE_LOCK], [$this->id] ); - $course = null; if ( count($other_booking) >= 1 && !empty($other_booking[0]->assigned_course_date->course) @@ -606,7 +608,9 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen } if ($time_interval_overlaps) { throw new ResourceBookingOverlapException( - implode(', ', $time_interval_overlaps) + implode(', ', $time_interval_overlaps), + 0, + $course ); }