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