From bca463638c5b919a34ec90f3909c2eb44d2d1f77 Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms Date: Thu, 4 Nov 2021 13:28:13 +0000 Subject: fixes #132 --- app/controllers/consultation/admin.php | 91 +++++++--- .../consultation/consultation_controller.php | 6 + .../consultation/admin/block-responsibilities.php | 50 ++++++ app/views/consultation/admin/create.php | 25 ++- app/views/consultation/admin/edit.php | 34 ++++ app/views/consultation/admin/edit_room.php | 21 --- app/views/consultation/admin/index.php | 9 +- app/views/consultation/block-description.php | 20 ++- .../1.269_fix_missing_consultation_events.php | 7 +- ....7_consultation_multiple_responsible_ranges.php | 99 +++++++++++ lib/classes/ConsultationMailer.php | 14 +- lib/models/CalendarEvent.class.php | 22 +-- lib/models/ConsultationBlock.php | 94 +++++++--- lib/models/ConsultationBooking.php | 29 ++-- lib/models/ConsultationEvent.php | 34 ++++ lib/models/ConsultationResponsibility.php | 126 ++++++++++++++ lib/models/ConsultationSlot.php | 121 +++++++------ lib/models/Course.class.php | 2 +- lib/models/Institute.class.php | 191 ++++++++++----------- lib/models/StatusgruppeUser.php | 4 +- lib/models/Statusgruppen.php | 17 +- lib/visual.inc.php | 4 +- resources/assets/stylesheets/less/lists.less | 6 + 23 files changed, 721 insertions(+), 305 deletions(-) create mode 100644 app/views/consultation/admin/block-responsibilities.php create mode 100644 app/views/consultation/admin/edit.php create mode 100644 db/migrations/5.1.7_consultation_multiple_responsible_ranges.php create mode 100644 lib/models/ConsultationEvent.php create mode 100644 lib/models/ConsultationResponsibility.php diff --git a/app/controllers/consultation/admin.php b/app/controllers/consultation/admin.php index 12c77a7..0ca50b3 100644 --- a/app/controllers/consultation/admin.php +++ b/app/controllers/consultation/admin.php @@ -140,11 +140,11 @@ class Consultation_AdminController extends ConsultationController $block = new ConsultationBlock(); $block->range = $this->range; - $this->responsible = $block->responsible_persons; + $this->responsible = $block->getPossibleResponsibilites(); } elseif ($this->range instanceof Institute) { $block = new ConsultationBlock(); $block->range = $this->range; - $this->responsible = $block->responsible_persons; + $this->responsible = $block->getPossibleResponsibilites(); } } @@ -182,10 +182,20 @@ class Consultation_AdminController extends ConsultationController $block->confirmation_text = trim(Request::get('confirmation-text')) ?: null; $block->note = Request::get('note'); $block->size = Request::int('size', 1); - $block->teacher_id = Request::option('teacher_id') ?: null; $block->createSlots(Request::int('duration')); $stored += $block->store(); + + // Store block responsibilites + foreach (Request::getArray('responsibilities') as $type => $ids) { + foreach ($ids as $id) { + ConsultationResponsibility::create([ + 'block_id' => $block->id, + 'range_id' => $id, + 'range_type' => $type, + ]); + } + } } } catch (OverlapException $e) { $this->keepRequest(); @@ -211,13 +221,9 @@ class Consultation_AdminController extends ConsultationController $this->relocate('consultation/admin'); } - public function note_action($block_id, $slot_id = null, $page = 0) + public function note_action($block_id, $slot_id, $page = 0) { - if ($slot_id) { - PageLayout::setTitle(_('Anmerkung zu diesem Termin bearbeiten')); - } else { - PageLayout::setTitle(_('Anmerkung zu diesem Block bearbeiten')); - } + PageLayout::setTitle(_('Anmerkung zu diesem Termin bearbeiten')); $this->block = $this->loadBlock($block_id); $this->slot_id = $slot_id; @@ -228,20 +234,10 @@ class Consultation_AdminController extends ConsultationController $note = trim(Request::get('note')); - $changed = false; - if ($slot_id) { - $slot = $this->block->slots->find($slot_id); - $slot->note = $note; - $changed = $slot->store(); - } else { - $this->block->note = $note; - foreach ($this->block->slots as $slot) { - $slot->note = ''; - } - $changed = $this->block->store(); - } - if ($changed) { - PageLayout::postSuccess(_('Der Block wurde bearbeitet')); + $slot = $this->block->slots->find($slot_id); + $slot->note = $note; + if ($slot->store()) { + PageLayout::postSuccess(_('Die Anmerkung wurde bearbeitet')); } if ($this->block->is_expired) { @@ -344,20 +340,60 @@ class Consultation_AdminController extends ConsultationController } } - public function edit_room_action($block_id, $page = 0) + public function edit_action($block_id, $page = 0) { - PageLayout::setTitle(_('Ort des Blocks bearbeiten')); + PageLayout::setTitle(_('Block bearbeiten')); $this->block = $this->loadBlock($block_id); $this->page = $page; + + $this->responsible = false; + if ($this->block->range instanceof Course || $this->block->range instanceof Institute) { + $this->responsible = $this->block->getPossibleResponsibilites(); + } } - public function store_room_action($block_id, $page = 0) + public function store_edited_action($block_id, $page = 0) { CSRFProtection::verifyUnsafeRequest(); $this->block = $this->loadBlock($block_id); - $this->block->room = Request::get('room'); + $this->block->room = trim(Request::get('room')); + $this->block->note = trim(Request::get('note')); + + foreach ($this->block->slots as $slot) { + $slot->note = ''; + } + + // Store block responsibilites + $responsibilities = array_merge( + ['user' => [], 'statusgroup' => [], 'institute' => []], + Request::getArray('responsibilities') + ); + foreach ($responsibilities as $type => $ids) { + $of_type = $this->block->responsibilities->filter(function ($responsibility) use ($type) { + return $responsibility->range_type === $type; + }); + + // Delete removed responsibilites + $of_type->each(function ($responsibility) use ($ids) { + if (!in_array($responsibility->range_id, $ids)) { + $responsibility->delete(); + } + }); + // Add new responsibilities + foreach ($ids as $id) { + if (!$of_type->findOneBy('range_id', $id)) { + ConsultationResponsibility::create([ + 'block_id' => $this->block->id, + 'range_id' => $id, + 'range_type' => $type, + ]); + } + } + } + + $this->block->store(); PageLayout::postSuccess(_('Der Block wurde gespeichert.')); @@ -577,7 +613,6 @@ class Consultation_AdminController extends ConsultationController function ($slot) use (&$deleted) { $index = $slot->is_expired ? 'expired' : 'current'; - $slot->removeEvent(); $deleted[$index] += $slot->delete(); }, "JOIN consultation_blocks USING (block_id) WHERE range_id = ? AND range_type = ?", diff --git a/app/controllers/consultation/consultation_controller.php b/app/controllers/consultation/consultation_controller.php index c69ab16..eba81ff 100644 --- a/app/controllers/consultation/consultation_controller.php +++ b/app/controllers/consultation/consultation_controller.php @@ -77,6 +77,12 @@ abstract class ConsultationController extends AuthenticatedController $this->flash['request'] = Request::getInstance()->getIterator()->getArrayCopy(); } + /** + * @param $block_id + * + * @return ConsultationBlock|ConsultationBlock[] + * @throws AccessDeniedException + */ protected function loadBlock($block_id) { if (is_array($block_id)) { diff --git a/app/views/consultation/admin/block-responsibilities.php b/app/views/consultation/admin/block-responsibilities.php new file mode 100644 index 0000000..ea3531a --- /dev/null +++ b/app/views/consultation/admin/block-responsibilities.php @@ -0,0 +1,50 @@ +responsibilities->filter(function ($responsibility) use ($type, $id) { + return $responsibility->range_type === $type && $responsibility->range_id === $id; + }); + return count($matched) > 0 ? 'selected' : ''; +} +?> + + + + + + + + + + + diff --git a/app/views/consultation/admin/create.php b/app/views/consultation/admin/create.php index 4630cee..d8727ef 100644 --- a/app/views/consultation/admin/create.php +++ b/app/views/consultation/admin/create.php @@ -36,7 +36,7 @@ $intervals = [
- + +
- -