From 60df0a70339f88af01158387732d4e56b621c58a Mon Sep 17 00:00:00 2001
From: David Siegfried <david.siegfried@uni-vechta.de>
Date: Mon, 11 Jul 2022 14:31:48 +0000
Subject: [PATCH] move sem-week calculation to php, closes #1147

Closes #1147

Merge request studip/studip!762
---
 app/routes/Semester.php                       | 38 ++++++++++
 .../resources/room_planning/booking_plan.php  | 11 ++-
 .../resources/room_planning/semester_plan.php |  8 +--
 app/views/resources/room_request/planning.php | 14 ++--
 app/views/room_management/planning/index.php  | 18 ++---
 .../planning/semester_plan.php                | 14 ++--
 .../5.2.16_activate_semester_routes.php       | 14 ++++
 .../assets/javascripts/lib/fullcalendar.js    | 44 +++++-------
 resources/assets/javascripts/lib/resources.js | 70 -------------------
 .../stylesheets/less/resources-print.less     |  2 +-
 10 files changed, 101 insertions(+), 132 deletions(-)
 create mode 100644 db/migrations/5.2.16_activate_semester_routes.php

diff --git a/app/routes/Semester.php b/app/routes/Semester.php
index 13639534137..52de1e76c66 100644
--- a/app/routes/Semester.php
+++ b/app/routes/Semester.php
@@ -42,6 +42,44 @@ class Semester extends \RESTAPI\RouteMap
         return $this->paginated($json, $total);
     }
 
+    /**
+     * Returns the semester week as string for a given string
+     *
+     * @get /semester/:timestamp/week
+     */
+    public function getSemesterWeek(int $timestamp)
+    {
+        $semester = \Semester::findByTimestamp($timestamp);
+        if (!$semester) {
+            return null;
+        }
+        $timestamp = strtotime('today', $timestamp);
+        $week_begin_timestamp = strtotime('monday this week', $semester->vorles_beginn);
+        $end_date = $semester->vorles_ende;
+
+        $i = 0;
+        $result = [
+            'semester_name' => (string)$semester->name,
+            'week_number' => sprintf(_('KW %u'), date('W', $timestamp)),
+            'current_day' => strftime('%x', $timestamp)
+        ];
+        while ($week_begin_timestamp < $end_date) {
+            $next_week_timestamp = strtotime('+1 week', $week_begin_timestamp);
+            if ($week_begin_timestamp <= $timestamp && $timestamp < $next_week_timestamp) {
+                $result['sem_week'] = sprintf(
+                    _('%u. Vorlesungswoche (ab %s)'),
+                    $i + 1,
+                    strftime('%x', $week_begin_timestamp));
+                break;
+            }
+            $i += 1;
+
+            $week_begin_timestamp = $next_week_timestamp;
+        }
+
+        return $result;
+    }
+
     /**
      * Returns a single semester.
      *
diff --git a/app/views/resources/room_planning/booking_plan.php b/app/views/resources/room_planning/booking_plan.php
index 0c2944ada7d..d314218c0c5 100644
--- a/app/views/resources/room_planning/booking_plan.php
+++ b/app/views/resources/room_planning/booking_plan.php
@@ -19,13 +19,10 @@
                     <?= htmlReady($resource->name) ?>
                 <? endif ?>
                 <span id="booking-plan-header-semrow">
-                    <strong>
-                        <span id="booking-plan-header-semname"></span>
-                        <span id="booking-plan-header-semweek-part">
-                            <?= _('Vorlesungswoche') ?>
-                            <span id="booking-plan-header-semweek"></span>
-                        </span>
-                    </strong>
+                    <strong><span id="booking-plan-header-semname"></span> </strong>
+                    <span id="booking-plan-header-semweek-part">
+                        <span id="booking-plan-header-semweek"></span>
+                    </span>
                 </span>
             </span>
             <? if ($resource->getProperty('room_administrator')): ?>
diff --git a/app/views/resources/room_planning/semester_plan.php b/app/views/resources/room_planning/semester_plan.php
index 34e8f9d5d91..55d7056a239 100644
--- a/app/views/resources/room_planning/semester_plan.php
+++ b/app/views/resources/room_planning/semester_plan.php
@@ -50,9 +50,10 @@
                     <?= htmlReady($resource->name) ?>
                 <? endif ?>
                 <span id="booking-plan-header-semrow">
-                    <strong>
-                        <?= _('Semester') ?>
-                        <span id="booking-plan-header-semname"><?= htmlReady($semester->name) ?></span>
+                        <strong>
+                            <?= _('Semester') ?>
+                            <span id="booking-plan-header-semname"><?= htmlReady($semester->name) ?></span>
+                        </strong>
                         <span id="booking-plan-header-semspan">
                             <? if (Request::get("semester_timerange") == 'fullsem') : ?>
                                 <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->beginn), date('d.m.Y', $semester->ende)); ?>
@@ -60,7 +61,6 @@
                                 <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->vorles_beginn), date('d.m.Y', $semester->vorles_ende)); ?>
                             <? endif ?>
                         </span>
-                    </strong>
                 </span>
             </div>
             <? if ($resource->getProperty('room_administrator')): ?>
diff --git a/app/views/resources/room_request/planning.php b/app/views/resources/room_request/planning.php
index 9b645a64b67..20e9efb33a2 100644
--- a/app/views/resources/room_request/planning.php
+++ b/app/views/resources/room_request/planning.php
@@ -32,14 +32,14 @@
                     <strong>
                         <?= _('Semester') ?>
                         <span id="booking-plan-header-semname"><?= htmlReady($semester->name) ?></span>
-                        <span id="booking-plan-header-semspan">
-                            <? if (Request::get("semester_timerange") == 'fullsem') : ?>
-                                <?= sprintf('(%1$s - %2$s)', date('d.m.Y', $semester->beginn), date('d.m.Y', $semester->ende)); ?>
-                            <? else : ?>
-                                <?= sprintf('(%1$s - %2$s)', date('d.m.Y', $semester->vorles_beginn), date('d.m.Y', $semester->vorles_ende)); ?>
-                            <? endif ?>
-                        </span>
                     </strong>
+                    <span id="booking-plan-header-semspan">
+                        <? if (Request::get("semester_timerange") == 'fullsem') : ?>
+                            <?= sprintf('(%1$s - %2$s)', date('d.m.Y', $semester->beginn), date('d.m.Y', $semester->ende)); ?>
+                        <? else : ?>
+                            <?= sprintf('(%1$s - %2$s)', date('d.m.Y', $semester->vorles_beginn), date('d.m.Y', $semester->vorles_ende)); ?>
+                        <? endif ?>
+                    </span>
                 </span>
             </div>
             <? if ($resource->getProperty('room_administrator')): ?>
diff --git a/app/views/room_management/planning/index.php b/app/views/room_management/planning/index.php
index f42f8a00775..c5d7d5fa250 100644
--- a/app/views/room_management/planning/index.php
+++ b/app/views/room_management/planning/index.php
@@ -18,18 +18,14 @@
         <div>
             <?= _('Raumgruppe') ?>
             <span id="booking-plan-header-roomgroup"><?= htmlReady($clipboard->name) ?></span>
-            <strong>
-                <?= _('KW') ?>
-                <span id="booking-plan-header-calweek"></span>
-                (<span id="booking-plan-header-calbegin"></span>)
-                <span id="booking-plan-header-semrow">
-                    <span id="booking-plan-header-semname"></span>
-                    <span id="booking-plan-header-semweek-part">
-                        <?= _('Vorlesungswoche') ?>
-                        <span id="booking-plan-header-semweek"></span>
-                    </span>
+            <span id="booking-plan-header-calweek"></span>
+            <span id="booking-plan-header-calbegin"></span>
+            <span id="booking-plan-header-semrow">
+                <strong><span id="booking-plan-header-semname"></span></strong>
+                <span id="booking-plan-header-semweek-part">
+                    <span id="booking-plan-header-semweek"></span>
                 </span>
-            </strong>
+            </span>
         </div>
     </section>
 
diff --git a/app/views/room_management/planning/semester_plan.php b/app/views/room_management/planning/semester_plan.php
index 85d69248dee..f5b9c94eb74 100644
--- a/app/views/room_management/planning/semester_plan.php
+++ b/app/views/room_management/planning/semester_plan.php
@@ -24,14 +24,14 @@
                 <strong>
                     <?= _('Semester')?>
                     <span id="booking-plan-header-semname"><?= htmlReady($semester->name) ?></span>
-                    <span id="booking-plan-header-semspan">
-                        <? if (Request::get("semester_timerange") == 'fullsem') : ?>
-                            <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->beginn), date('d.m.Y', $semester->ende)); ?>
-                        <? else : ?>
-                            <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->vorles_beginn), date('d.m.Y', $semester->vorles_ende)); ?>
-                        <? endif ?>
-                    </span>
                 </strong>
+                <span id="booking-plan-header-semspan">
+                    <? if (Request::get("semester_timerange") == 'fullsem') : ?>
+                        <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->beginn), date('d.m.Y', $semester->ende)); ?>
+                    <? else : ?>
+                        <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->vorles_beginn), date('d.m.Y', $semester->vorles_ende)); ?>
+                    <? endif ?>
+                </span>
             </span>
         </div>
     </section>
diff --git a/db/migrations/5.2.16_activate_semester_routes.php b/db/migrations/5.2.16_activate_semester_routes.php
new file mode 100644
index 00000000000..082a5db829a
--- /dev/null
+++ b/db/migrations/5.2.16_activate_semester_routes.php
@@ -0,0 +1,14 @@
+<?php
+class ActivateSemesterRoutes extends Migration
+{
+    public function description()
+    {
+        return "Activates all semester routes";
+    }
+
+    public function up()
+    {
+        require_once 'app/routes/Semester.php';
+        RESTAPI\ConsumerPermissions::get()->activateRouteMap(new RESTAPI\Routes\Semester());
+    }
+}
diff --git a/resources/assets/javascripts/lib/fullcalendar.js b/resources/assets/javascripts/lib/fullcalendar.js
index 2268305a3d8..1a1945a0ecd 100644
--- a/resources/assets/javascripts/lib/fullcalendar.js
+++ b/resources/assets/javascripts/lib/fullcalendar.js
@@ -535,37 +535,31 @@ class Fullcalendar
                 }
             },
             datesRender (info) {
-                var activeRange = info.view.props.dateProfile.activeRange;
-                var start = activeRange.start;
-                var end = activeRange.end;
-
+                let activeRange = info.view.props.dateProfile.activeRange;
+                let timestamp = activeRange.start.getTime() / 1000;
                 if ($(info.el).hasClass('institute-plan')) {
                     $('.fc-slats tr:odd .fc-widget-content:not(.fc-axis)').remove();
                 }
 
-                if ($('.booking-plan-header').length) {
-                    end.setDate(end.getDate());
-                    let semester = $('.booking-plan-header').data('semester');
-                    let sem_start = null;
-                    let sem_end = null;
-                    if (semester) {
-                        sem_start = semester.seminars_begin;
-                        sem_end = semester.seminars_end;
-                    }
+                STUDIP.api.GET(`semester/${timestamp}/week`).done((data) => {
 
-                    if (sem_start && (start.getTime() / 1000 < sem_start || start.getTime() / 1000 > sem_end)) {
-                        sem_start = null;
-                        sem_end = null;
-                    } else if (sem_start) {
-                        STUDIP.Resources.updateBookingPlanDateInfos(activeRange.start, activeRange.end, semester);
-                    }
-                    $('#booking-plan-header-calweek').text(start.getWeekNumber());
-                    $('#booking-plan-header-calbegin').text(start.toLocaleDateString('de-DE', {weekday: 'short'}) + ' ' + start.toLocaleDateString('de-DE'));
-                    $('#booking-plan-header-calend').text(end.toLocaleDateString('de-DE', {weekday: 'short'}) + ' ' + end.toLocaleDateString('de-DE'));
-                    if (!sem_start || !sem_end) {
-                        STUDIP.Resources.updateBookingPlanSemesterByView(activeRange);
+                    if (data) {
+                        $('#booking-plan-header-semname').text(data.semester_name);
+                        if (data.sem_week) {
+                            $('#booking-plan-header-semweek').text(data.sem_week);
+                            $('#booking-plan-header-semweek-part').show();
+                        } else {
+                            $('#booking-plan-header-semweek').text('');
+                            $('#booking-plan-header-semweek-part').hide();
+                        }
+                        $('#booking-plan-header-semrow').show();
+                        $('#booking-plan-header-calweek').text(data.week_number);
+                        $('#booking-plan-header-calbegin').text('(' + data.current_day + ')');
+                    } else {
+                        $('#booking-plan-header-semrow').hide();
+                        $('#booking-plan-header-semweek-part').hide();
                     }
-                }
+            })
             },
             resourceRender (renderInfo) {
                 if ($(renderInfo.view.context.calendar.el).hasClass('room-group-booking-plan')) {
diff --git a/resources/assets/javascripts/lib/resources.js b/resources/assets/javascripts/lib/resources.js
index a3192fcb223..57965cea906 100644
--- a/resources/assets/javascripts/lib/resources.js
+++ b/resources/assets/javascripts/lib/resources.js
@@ -705,76 +705,6 @@ class Resources
         STUDIP.Resources.updateEventUrlsInCalendar(info.event);
     }
 
-
-    static updateBookingPlanSemesterByView(activeRange, api_url = 'api.php/semesters') {
-        let semester = null;
-        jQuery.ajax(
-            STUDIP.URLHelper.getURL(api_url),
-            {
-                method: 'get',
-                dataType: 'json',
-                success: function (data) {
-                    if (data) {
-                        Object.values(data.collection).forEach(item => {
-                            if (activeRange.start.getTime() / 1000 >= item.begin && activeRange.start.getTime() / 1000 < item.end) {
-                                semester = item;
-                            }
-                        });
-                        if (!semester) {
-                            if (data.pagination && data.pagination.links && data.pagination.links.next != api_url) {
-                                semester = STUDIP.Resources.updateBookingPlanSemesterByView(activeRange, data.pagination.links.next);
-                            }
-                        }
-                    }
-                    STUDIP.Resources.updateBookingPlanDateInfos(activeRange.start, activeRange.end, semester);
-                }
-            }
-        );
-    }
-
-    static updateBookingPlanDateInfos(plan_begin, plan_end, semester = null)
-    {
-        if (semester) {
-            let show_lecture_week = false;
-            let fake_plan_end = new Date(plan_end.getTime() - 1000);
-            if (plan_begin.getUTCDay() == fake_plan_end.getUTCDay()) {
-                show_lecture_week = (plan_begin.getTime() / 1000 + 43200) >= semester.seminars_begin && (plan_begin.getTime() / 1000) < semester.seminars_end;
-            } else {
-                show_lecture_week = (plan_end.getTime() / 1000 + 43200) >= semester.seminars_begin && (plan_end.getTime() / 1000) < semester.seminars_end;
-            }
-            $(".booking-plan-header").data('semester', semester);
-            $("#booking-plan-header-semname").text(semester.title);
-            if (show_lecture_week) {
-                let lecture_week_start = new Date((semester.seminars_begin  + 43200) * 1000);
-                let lecture_week_start_day = lecture_week_start.getDay();
-                if (lecture_week_start_day == 0) {
-                    //Sunday is 7, not 0!
-                    lecture_week_start_day = 7;
-                }
-                lecture_week_start_day--;
-                let normal_sem_week_begin = semester.seminars_begin - (lecture_week_start_day * 86400);
-                let sem_week = Math.floor((plan_end.getTime() / 1000 - 10800 - normal_sem_week_begin) / 604800) + 1;
-                if (sem_week > 0) {
-                    $("#booking-plan-header-semweek").text(sem_week);
-                    $("#booking-plan-header-semweek-part").show();
-                } else {
-                    $("#booking-plan-header-semweek-part").hide();
-                }
-            } else {
-                $("#booking-plan-header-semweek-part").hide();
-            }
-            $("#booking-plan-header-semrow").show();
-        } else {
-            $(".booking-plan-header").data('semester', null);
-            $('#booking-plan-header-semrow').hide();
-        }
-
-        $('#booking-plan-header-calweek').text(plan_begin.getWeekNumber());
-        $('#booking-plan-header-calbegin').text(plan_begin.toLocaleDateString('de-DE', {weekday: 'short'}) + ' ' + plan_begin.toLocaleDateString('de-DE'));
-        $('#booking-plan-header-calend').text(plan_end.toLocaleDateString('de-DE', {weekday: 'short'}) + ' ' + plan_end.toLocaleDateString('de-DE'));
-    }
-
-
     static toggleRequestMarked(source_node)
     {
         if (!source_node) {
diff --git a/resources/assets/stylesheets/less/resources-print.less b/resources/assets/stylesheets/less/resources-print.less
index 889f1d4ab01..a2c8d1f79f6 100644
--- a/resources/assets/stylesheets/less/resources-print.less
+++ b/resources/assets/stylesheets/less/resources-print.less
@@ -1,5 +1,5 @@
 @media print {
-    #booking-plan-header-semrow-line #booking-plan-header-semweek-part,
+    #booking-plan-header-semweek-part,
     #booking-plan-header-resource-name-line,
     #booking-plan-header-seats-line,
     #booking-plan-header-administration_url-line {
-- 
GitLab