From 9155a30a2a027af28ff2ae9b4571a19f66aa92fe Mon Sep 17 00:00:00 2001
From: Lorenz Zahn <lorenz.zahn@student.uni-halle.de>
Date: Mon, 26 Jun 2023 12:31:43 +0200
Subject: [PATCH] added page for projects without department

---
 .../workhours/accounting/period/details.html  |   2 +-
 app/vkk/workhours/accounting/periods/urls.py  |   7 +-
 app/vkk/workhours/accounting/periods/views.py | 155 ++++++++++++++++++
 3 files changed, 162 insertions(+), 2 deletions(-)

diff --git a/app/vkk/templates/vkk/workhours/accounting/period/details.html b/app/vkk/templates/vkk/workhours/accounting/period/details.html
index c1ac501e..7c35048f 100644
--- a/app/vkk/templates/vkk/workhours/accounting/period/details.html
+++ b/app/vkk/templates/vkk/workhours/accounting/period/details.html
@@ -13,7 +13,7 @@
     {% for department in departments %}
         <tr>
             {% if not department.id %}
-            <td><a href=""></a>Ohne Zuweisung</td>
+            <td><a href="{% url 'vkk:workhours:accounting:periods:projects_open_no_department' view.kwargs.pk %}">{% translate "No Department" %}</a></td>
             {% else %}
             <td><a href="{% url 'vkk:workhours:accounting:periods:projects_open' view.kwargs.pk department.id %}">{{ department.name }}</a></td>
             {% endif %}
diff --git a/app/vkk/workhours/accounting/periods/urls.py b/app/vkk/workhours/accounting/periods/urls.py
index c1c3bc55..184cff00 100644
--- a/app/vkk/workhours/accounting/periods/urls.py
+++ b/app/vkk/workhours/accounting/periods/urls.py
@@ -2,7 +2,7 @@ from django.urls import path
 from django.utils.translation import gettext_lazy as _
 from django.forms import modelform_factory
 from ..views import *
-from .views import AccountingPeriodDetailView, AccountingPeriodDetailDepartmentView
+from .views import AccountingPeriodDetailView, AccountingPeriodDetailDepartmentView, AccountingPeriodDetailNoDepartmentView
 from vkk.workhours.models import Period
 from vkk.generic.forms import CustomDateInput, CustomDateTimeInput
 
@@ -36,6 +36,11 @@ urlpatterns = [
         AccountingPeriodDetailDepartmentView.as_view(),
         name='projects_open'
     ),
+    path(
+        _('<int:pk>/details/projects_open_by_department/'),
+        AccountingPeriodDetailNoDepartmentView.as_view(),
+        name='projects_open_no_department'
+    ),
     path(
         _('create/'),
         AccountingCreateView.as_view(**model, **form_class),
diff --git a/app/vkk/workhours/accounting/periods/views.py b/app/vkk/workhours/accounting/periods/views.py
index 02d66837..6bc25289 100644
--- a/app/vkk/workhours/accounting/periods/views.py
+++ b/app/vkk/workhours/accounting/periods/views.py
@@ -235,3 +235,158 @@ class AccountingPeriodDetailDepartmentView(AccountingDetailView):
         context["projects_open"] = projects_open
         context["projects_closed"] = projects_closed
         return context
+
+class AccountingPeriodDetailNoDepartmentView(AccountingDetailView):
+    model = Period
+    fields = ['start', 'end', 'dead_line', 'dead_line_final']
+    template_name = "vkk/workhours/accounting/period/projects.html"
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        projects_open = Project.objects.raw(" \
+            WITH selected_period AS ( \
+                SELECT \
+                    vkk_period.id AS period_id, \
+                    vkk_period.start AS period_start, \
+                    vkk_period.end AS period_end \
+                FROM vkk_period \
+                WHERE vkk_period.id = %s \
+            ), \
+            filtered_projects AS ( \
+                SELECT \
+                    selected_period.period_id, \
+                    vkk_project.id, \
+                    vkk_project.invoice_number, \
+                    vkk_project.name, \
+                    vkk_project.contractor, \
+                    vkk_project.start, \
+                    vkk_project.end, \
+                    vkk_project.department_id \
+                FROM vkk_project, selected_period \
+                WHERE  \
+                    selected_period.period_end >= vkk_project.start  \
+                    AND selected_period.period_start <= vkk_project.end \
+                    AND vkk_project.department_id IS NULL \
+            ), \
+            closures AS ( \
+                SELECT \
+                    vkk_periodclosure.project_assignment_id, \
+                    vkk_periodclosure.is_closed_manager \
+                FROM  \
+                    vkk_periodclosure JOIN selected_period \
+                    ON vkk_periodclosure.period_id = selected_period.period_id \
+            ), \
+            not_closed_assignments AS ( \
+                SELECT \
+                    vkk_projectassignment.id AS assignment_id, \
+                    vkk_projectassignment.project_id \
+                FROM \
+                    vkk_projectassignment LEFT JOIN closures \
+                    ON vkk_projectassignment.id = closures.project_assignment_id \
+                WHERE \
+                    closures.is_closed_manager IS NULL \
+                    OR closures.is_closed_manager = FALSE \
+            ) \
+            SELECT \
+                p.id, \
+                p.invoice_number, \
+                p.name, \
+                p.contractor, \
+                p.start, \
+                p.end, \
+                p.department_id \
+            FROM \
+                filtered_projects p \
+            WHERE  \
+                EXISTS ( \
+                    SELECT assignment_id \
+                    FROM not_closed_assignments c \
+                    WHERE  \
+                        c.project_id = p.id \
+                ) \
+            ORDER BY p.invoice_number;",
+            [self.kwargs['pk']]
+        )
+
+        projects_closed = Project.objects.raw(" \
+            WITH selected_period AS ( \
+                SELECT \
+                    vkk_period.id AS period_id, \
+                    vkk_period.start AS period_start, \
+                    vkk_period.end AS period_end \
+                FROM vkk_period \
+                WHERE vkk_period.id = %s \
+            ), \
+            filtered_projects AS ( \
+                SELECT \
+                    selected_period.period_id, \
+                    vkk_project.id, \
+                    vkk_project.invoice_number, \
+                    vkk_project.name, \
+                    vkk_project.contractor, \
+                    vkk_project.start, \
+                    vkk_project.end, \
+                    vkk_project.department_id, \
+                    selected_period.period_start, \
+                    selected_period.period_end \
+                FROM vkk_project, selected_period \
+                WHERE  \
+                    selected_period.period_end >= vkk_project.start  \
+                    AND selected_period.period_start <= vkk_project.end \
+                    AND vkk_project.department_id IS NULL \
+            ), \
+            closures AS ( \
+                SELECT \
+                    vkk_periodclosure.project_assignment_id, \
+                    vkk_periodclosure.is_closed_manager \
+                FROM  \
+                    vkk_periodclosure JOIN selected_period \
+                    ON vkk_periodclosure.period_id = selected_period.period_id \
+            ), \
+            not_closed_assignments AS ( \
+                SELECT \
+                    vkk_projectassignment.id AS assignment_id, \
+                    vkk_projectassignment.project_id \
+                FROM \
+                    vkk_projectassignment LEFT JOIN closures \
+                    ON vkk_projectassignment.id = closures.project_assignment_id \
+                WHERE \
+                    closures.is_closed_manager IS NULL \
+                    OR closures.is_closed_manager = FALSE \
+            ) \
+            SELECT \
+                p.id, \
+                p.invoice_number, \
+                p.name, \
+                p.contractor, \
+                p.start, \
+                p.end, \
+                p.department_id, \
+                CASE  \
+                    WHEN EXISTS ( \
+                        SELECT 1 \
+                            FROM vkk_receipt \
+                            WHERE \
+                                p.id = vkk_receipt.project_id \
+                                AND p.period_start = vkk_receipt.start \
+                                AND p.period_end = vkk_receipt.end \
+                    ) THEN TRUE \
+                    ELSE FALSE \
+                END AS exists_receipt \
+            FROM \
+                filtered_projects p \
+            WHERE  \
+                NOT EXISTS ( \
+                    SELECT assignment_id \
+                    FROM not_closed_assignments c \
+                    WHERE  \
+                        c.project_id = p.id \
+                ) \
+            ORDER BY p.invoice_number;",
+            [self.kwargs['pk']]
+        )
+
+        context["department"] = None
+        context["projects_open"] = projects_open
+        context["projects_closed"] = projects_closed
+        return context
\ No newline at end of file
-- 
GitLab