diff --git a/app/vkk/templates/vkk/workhours/accounting/department/evaluation.csv b/app/vkk/templates/vkk/workhours/accounting/department/evaluation.csv index a968ac787b314d1cdf85996b42959b2b7b34cafb..b1fe04969f25d6478f541c290dbff474b9044315 100644 --- a/app/vkk/templates/vkk/workhours/accounting/department/evaluation.csv +++ b/app/vkk/templates/vkk/workhours/accounting/department/evaluation.csv @@ -1,3 +1,3 @@ Projekt; abgeführte PGK; abgeführte SGK; Summe PGK+SGK; abgeführte VGK; Summe -{% for project in projects %}{% for column in project %}{{ column }};{% endfor %} +{% for project in projects %}{% for column in project %}{{ column|floatformat:2 }};{% endfor %} {% endfor %} \ No newline at end of file diff --git a/app/vkk/workhours/accounting/departments/views.py b/app/vkk/workhours/accounting/departments/views.py index f2625cc90ffdf753bae5de5a513dd43200169077..638fc4a92fa0bd604dc8a9c2893d8b8d925f5944 100644 --- a/app/vkk/workhours/accounting/departments/views.py +++ b/app/vkk/workhours/accounting/departments/views.py @@ -23,11 +23,27 @@ class EvaluationView(AccountantRequiredMixin, FormView): Returns the result of an SQL query calculating the evaluation. """ with connection.cursor() as cursor: - cursor.execute("WITH assignments AS ( \ - SELECT \periodsdepartment_id = %s \ + cursor.execute("WITH projects AS ( \ + SELECT \ + vkk_project.id, \ + vkk_project.start, \ + vkk_project.end, \ + vkk_project.invoice_number \ + FROM vkk_project \ + WHERE vkk_project.department_id = %s \ + ), \ + assignments AS ( \ + SELECT \ + projects.id AS project_id, \ + projects.start AS project_start, \ + projects.end AS project_end, \ + vkk_projectassignment.id AS assignment_id, \ + salary_level_id \ + FROM projects JOIN vkk_projectassignment \ + ON projects.id = vkk_projectassignment.project_id \ ), \ workhours AS ( \ - SELECT \ + SELECT \ project_id, \ project_start, \ project_end, \ @@ -38,7 +54,7 @@ class EvaluationView(AccountantRequiredMixin, FormView): FROM assignments JOIN vkk_workhours \ ON assignments.assignment_id = vkk_workhours.project_assignment_id \ UNION \ - SELECT \ + SELECT \ project_id, \ project_start, \ project_end, \ @@ -50,7 +66,7 @@ class EvaluationView(AccountantRequiredMixin, FormView): ON assignments.assignment_id = vkk_workhourscorrection.project_assignment_id \ ), \ periods AS ( \ - SELECT \ + SELECT \ vkk_period.id, \ vkk_period.start, \ vkk_period.end \ @@ -71,11 +87,11 @@ class EvaluationView(AccountantRequiredMixin, FormView): FROM workhours JOIN periods \ ON workhours.period_id = periods.id \ WHERE \ - periods.end >= workhours.project_start \ + periods.end > workhours.project_start \ AND periods.start <= workhours.project_end \ ), \ workhours_summed AS ( \ - SELECT \ + SELECT \ project_id, \ salary_level_id, \ period_id, \ @@ -172,13 +188,15 @@ class EvaluationView(AccountantRequiredMixin, FormView): ON project_funded_staff_date.id = vkk_projectfundedstaff.start_id \ ), \ workhours_together AS ( \ - SELECT \ + SELECT \ project_id, \ salary_level_id, \ period_id, \ hours \ FROM workhours_summed \ + \ UNION \ + \ SELECT \ project_id, \ period_id, \ @@ -186,30 +204,21 @@ class EvaluationView(AccountantRequiredMixin, FormView): hours \ FROM project_funded_staff \ ), \ - workhours_together_summed_salary AS ( \ - SELECT \ - project_id, \ - salary_level_id, \ - period_id, \ - SUM(hours) AS hours \ - FROM workhours_together \ - GROUP BY project_id, salary_level_id, period_id \ - ), \ salary_costs_by_project AS ( \ SELECT \ - workhours_together_summed_salary.project_id, \ - SUM(workhours_together_summed_salary.hours * salary_level_costs.brutto_per_hour) AS salary_costs \ - FROM workhours_together_summed_salary, salary_level_costs \ - WHERE workhours_together_summed_salary.salary_level_id = salary_level_costs.salary_level_id \ - AND workhours_together_summed_salary.period_id = salary_level_costs.period_id \ - GROUP BY workhours_together_summed_salary.project_id \ + workhours_summed.project_id, \ + SUM(workhours_summed.hours * salary_level_costs.brutto_per_hour) AS salary_costs \ + FROM workhours_summed, salary_level_costs \ + WHERE workhours_summed.salary_level_id = salary_level_costs.salary_level_id \ + AND workhours_summed.period_id = salary_level_costs.period_id \ + GROUP BY workhours_summed.project_id \ ), \ workhours_together_summed AS ( \ SELECT \ project_id, \ period_id, \ SUM(hours) AS hours \ - FROM workhours_together_summed_salary \ + FROM workhours_together \ GROUP BY project_id, period_id \ ), \ general_costs_by_project AS ( \ @@ -229,22 +238,22 @@ class EvaluationView(AccountantRequiredMixin, FormView): GROUP BY project_id \ ) \ SELECT \ - vkk_project.invoice_number AS projekt, \ + projects.invoice_number AS projekt, \ salary_costs_by_project.salary_costs AS pgk, \ - general_costs_by_project.general_costs AS sgk, \ - salary_costs_by_project.salary_costs + general_costs_by_project.general_costs AS sum_pgk_sgk, \ - department_costs_by_project.department_costs AS vgk, \ + department_costs_by_project.department_costs AS sgk, \ + salary_costs_by_project.salary_costs + department_costs_by_project.department_costs AS sum_pgk_sgk, \ + general_costs_by_project.general_costs AS vgk, \ salary_costs_by_project.salary_costs + general_costs_by_project.general_costs + department_costs_by_project.department_costs AS sum_all \ FROM \ - vkk_project, \ + projects, \ salary_costs_by_project, \ general_costs_by_project, \ department_costs_by_project \ WHERE \ - vkk_project.id = salary_costs_by_project.project_id \ + projects.id = salary_costs_by_project.project_id \ AND salary_costs_by_project.project_id = general_costs_by_project.project_id \ AND general_costs_by_project.project_id = department_costs_by_project.project_id \ - ORDER BY vkk_project.invoice_number;", + ORDER BY projects.invoice_number;", [self.kwargs['pk'], periods, self.kwargs['pk']], ) queryset = cursor.fetchall() @@ -258,10 +267,13 @@ class EvaluationView(AccountantRequiredMixin, FormView): periods = tuple(n[0] for n in form.cleaned_data['periods'].values_list('id')) context = self.get_context_data() context["projects"] = self.get_queryset(periods) + print(context["projects"][0]) + periods_string = "".join(str(p) for p in periods) + department_string = self.kwargs['pk'] response = HttpResponse( content_type='text/csv', headers={ - 'Content-Disposition': 'attachment; filename="12345.csv"'}, + 'Content-Disposition': f'attachment; filename="{department_string}-{periods_string}.csv"'}, ) response.write( loader diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000000000000000000000000000000000000..09dbc63f0da2a922735191d33fa2a53ef38a6ede --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,133 @@ +# Installation + +Diese Installationsanleitung berücksichtigt zwei zwei Varianten: +- Eine für die lokale Entwicklung (Manchmal auch kurz als "Dev" bezeichnet.) +- Eine für den Bertieb (Manchmal auch kurz als "Prod" bezeichnet.) + +## Vorbereitung + +Als Basis wird eine Installation von Ubuntu Linux 22.10 oder neuer vorrausgesetzt. Darüberhinaus werden `docker`, `docker-compose` und `git` benötigt: +``` +sudo apt install docker docker-compose git +sudo systemctl enable docker +sudo systemctl start docker +``` + +Im nächsten Schritt wird die Git-Ablage des Projects kopiert: +``` +git clone https://gitlab.informatik.uni-halle.de/acqgu/projektmedizin.git +cd projektmedizin/ +``` + +Für die Entwicklung und Betrieb werden eine Reihe von Dateien mit Umgebungsvariablen benötigt. Diese müssen als nächstes erstellt werden. (Felder mit `****` müssen entsprechend ausgefüllt werden.) + +`.env.dev` : +``` +DEBUG=1 +SECRET_KEY='****' +DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] +SQL_ENGINE=django.db.backends.postgresql +SQL_DATABASE=**** +SQL_USER=**** +SQL_PASSWORD=**** +SQL_HOST=db +SQL_PORT=5432 +DATABASE=postgres +``` + +`.env.prod` : +``` +DEBUG=0 +SECRET_KEY=**** +DJANGO_ALLOWED_HOSTS=vkk.medizin.uni-halle.de +SQL_ENGINE=django.db.backends.postgresql +SQL_HOST=db +SQL_PORT=5432 +DATABASE=postgres +``` + +`.env.prod.db` : +``` +POSTGRES_USER=**** +POSTGRES_PASSWORD=**** +POSTGRES_DB=vkk_medizin +``` + +`.env.prod.dbuser` : +``` +SQL_DATABASE=vkk_medizin +SQL_USER=**** +SQL_PASSWORD=**** +``` + +`.env.prod.mail` : +``` +EMAIL_HOST=**** +EMAIL_PORT=**** +DEFAULT_FROM_EMAIL=**** +EMAIL_HOST_USER=**** +EMAIL_HOST_PASSWORD=**** +``` + +Als Sicherheitsmaßnahme verläuft jede Kommunikation zwischen Container über TLS. Hierfür werden eine Reihe von selbstsignierten Zertifikate generiert. (Diese haben eine gültigkeit von 10 Jahre.) Die Passphrase sollte ausreichend lang sein. +``` +export PASSPHRASE=**** +bash ./generatelocalcerts.sh +``` + +Für den Betrieb müssen die Zertifikate für die Verschlüsselung der Webseite bereitgestellt werden: (Alternativ können auch Hardlinks erstellt werden.) +``` +sudo cp /etc/certs/vkk.medizin.uni-halle.de.key ./nginx/ssl/vkk.medizin.uni-halle.de.key +sudo cp /etc/certs/vkk.medizin.uni-halle.de.pem ./nginx/ssl/vkk.medizin.uni-halle.de.crt +sudo cp /etc/certs/fullchain.pem ./nginx/ssl/fullchain.pem +``` + +## Erstellen der Container +Im nächsten Schritt werden die Docker-Container erstellt. + +Für die Entwicklung: +``` +sudo docker-compose build --pull +``` + +Für den Betrieb: +``` +sudo docker-compose -f docker-compose.prod.yml build --pull +``` + +## Einrichtung + +Anschließend erfolgen ein paar Konfigurationsschritte. + +### Frische Installation + +Im Falle einer Installation, bei der keine Wiederherstellung der Datenbank erforderlicht ist, muss zunächst diese eingerichtet und ein Konto für die Verwaltung erstellt werden. + +``` +sudo docker-compose up -d +sudo docker-compose exec web /bin/ash +python manage.py migrate +// setup super user +exit +``` + +``` +sudo docker-compose -f docker-compose.prod.yml up -d +sudo docker-compose exec web /bin/ash +python manage.py migrate +// setup super user +exit +``` + +### Wiederherstellung aus einem Backup + +Sollte ein Backup der Datenbank vorliegen, kann dies zur Wiederherstellung genutzt werden. + +``` +sudo docker-compose -f docker-compose.prod.yml up -d +// wiederherstellen +exit +``` + + +### Erstellen eines Systemd Service diff --git a/postgres/init/config.sh b/postgres/init/config.sh index 9598bbf6f84b593b4c06984031eea1ab09f9f390..bb9d2fdc83ba5e5260c4a8db2f547c12aff1e0a4 100755 --- a/postgres/init/config.sh +++ b/postgres/init/config.sh @@ -7,6 +7,7 @@ sed "/^[[:alnum:]]/s/^/# /" < /var/lib/postgresql/data/pg_hba.conf.old > /var/li echo " # TYPE DATABASE USER ADDRESS METHOD local all $POSTGRES_USER scram-sha-256 +local $SQL_DATABASE $SQL_USER scram-sha-256 hostssl $SQL_DATABASE $SQL_USER all scram-sha-256 " >> /var/lib/postgresql/data/pg_hba.conf