Skip to content
Snippets Groups Projects
Commit 66b7ae04 authored by Lorenz Zahn's avatar Lorenz Zahn
Browse files

work

parent 3d78853a
No related branches found
No related tags found
No related merge requests found
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
......@@ -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
......
# 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
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment