Merge branch 'content' of gitlab.uniworx.de:uniworx/uniworx.de into content

This commit is contained in:
Sarah Vaupel 2023-12-01 15:54:41 +01:00
commit 8090828327
40 changed files with 2790 additions and 1243 deletions

View File

@ -22,7 +22,7 @@ stages:
pages:
stage: deploy
script: &build-script
script:
- nix develop -c gup public
artifacts:
paths:
@ -32,7 +32,9 @@ pages:
review:start:
stage: review
script: *build-script
script:
- rm -fv static/_redirects
- nix develop -c gup public
artifacts:
paths:
- public

2
Gupfile Normal file
View File

@ -0,0 +1,2 @@
checksum.gup:
**/.*.chksum

14
checksum.gup Normal file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env zsh
gup --always
base=${2:t}
base=${base#"."}
base=${base%".chksum"}
base=${2:h}/${base}
while IFS= read -d $'\0' file; do
if [[ -f "${file}" ]]; then
b2sum "${file}"
else
echo "${file}"
fi
done > >(gup --contents) < <(find "${base}" -print0)

View File

@ -1,5 +1,12 @@
---
title: Seite befindet sich im Aufbau
tags:
- index
sort: -9001
---
```{=html}
<div class="px-4 py-5 my-5 text-center">
<h1 class="display-5 fw-bold text-body-emphasis">UniWorX Systems</h1>
<h1 class="display-5 fw-bold text-body-emphasis">UniWorX Systems GmbH</h1>
<div class="col-lg-6 mx-auto">
<p class="lead">
Diese Seite befindet sich aktuell noch im Aufbau.
@ -7,3 +14,4 @@
</p>
</div>
</div>
```

7
content-old/markdown.md Normal file
View File

@ -0,0 +1,7 @@
---
title: Seite unterstützt Markdown
tags: meta
sort: 0
---
Text kann auch in allen Pandoc-unterstützten Formaten angegeben werden, statt nur in HTML.
Hier: Markdown

8
content-old/tags.md Normal file
View File

@ -0,0 +1,8 @@
---
title: Tags sind echte Tags
tags:
- meta
- example
sort: 100
---
Beliebig viele Tags pro Item.

12
content/about.md Normal file
View File

@ -0,0 +1,12 @@
---
title: Über uns
tags: about
sort: 0
---
# Über uns
Die UniWorX Systems GmbH ist eine in München ansässige Firma mit Fokus auf Entwurf, Entwicklung und Wartung von Kommunikations- und Verwaltungssoftware.
Wir verfolgen das Ziel, die Digitalisierung der Verwaltung im öffentlichen, universitären aber auch im firmeninternen Bereich voranzutreiben.
Typische und erprobte Anwendungsbereiche sind Universitätsverwaltung, Lehrverwaltung sowie Fahrschulverwaltung.

21
content/clients.md Normal file
View File

@ -0,0 +1,21 @@
---
title: Unsere Partner
tags:
- index
- about
sort: 9999
show: "False"
---
# Unsere Partner
```{=html}
<div class="text-center">
<a href="https://www.lmu.de/" target="_blank" rel="noreferrer noopener">
<img src="../images/LMU_Muenchen_Logo.svg" width="200" alt="LMU München Logo"/>
</a>
<a href="https://www.fraport.com/" target="_blank" rel="noreferrer noopener">
<img src="../images/Fraport_Logo.svg" width="200" alt="Fraport AG Logo" id="fraport-logo"/>
</a>
</div>
```

23
content/contact.md Normal file
View File

@ -0,0 +1,23 @@
---
title: Kontakt
tags: contact
sort: 9999
---
# Kontakt
## UniWorX Systems GmbH
> UniWorX Systems GmbH
> Savitsstraße 43
> D-81929 München
> Bavaria, Germany
### Geschäftsführung
> Sarah Vaupel
> Savitsstraße 43
> D-81929 München
> Bavaria, Germany
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
> Telefon: [+49 179 4130707](tel:+491794130707)

9
content/fradrive.md Normal file
View File

@ -0,0 +1,9 @@
---
title: FraDrive
tags:
- projects
---
# FraDrive
Vorfeld- und Rollfeld-Fahrschulverwaltung in Kooperation mit der Fraport AG
...

15
content/index.md Normal file
View File

@ -0,0 +1,15 @@
---
title: Seite befindet sich im Aufbau
tags: index
sort: -9001
---
```{=html}
<div class="px-4 py-5 my-5 text-center">
<h1 class="display-5 fw-bold text-body-emphasis">UniWorX Systems GmbH</h1>
<div class="col-lg-6 mx-auto">
<p class="lead">
Diese Seite befindet sich aktuell noch im Aufbau.
</p>
</div>
</div>
```

13
content/open-source.md Normal file
View File

@ -0,0 +1,13 @@
---
title: Open Source
tags:
- about
sort: 100
---
# Open Source
TODO Warum quelloffene Software
TODO Wie wir quelloffene Software bereitstellen
TODO Wie wir die open source community unterstützen

18
content/services.md Normal file
View File

@ -0,0 +1,18 @@
---
title: Dienstleistungen
tags:
- services
---
# Dienstleistungen
## Unterstützung in der Digitalisierung und Optimierung von Geschäftsprozessen
Wir analysieren und begleiten Ihre Geschäftsprozesse im laufenden Betrieb.
Darauf aufbauend erstellen wir eine Digitalisierungsstrategie für den Prozess mit unserem bewährten UniWorX-Workflow-System.
Weiter begleiten wir den kontinuierlichen Übergang des Geschäftsprozesses in das neue System, um alle am Prozess beteiligten Personen mitzunehmen und zu entlasten.
Der so erreichte neue Prozess behält die Flexibilität des alten Prozesses so weit wie gewünscht und setzt gleichzeitig die erforderlichen Grenzen um;
seien es notwendige Grenzen aufgrund von Funktionsanforderungen, rechtlichen Vorgaben, oder ...
Bei geänderten Anforderungen kann der Prozess jederzeit dynamisch weiterentwickelt werden.

12
content/uni2work.md Normal file
View File

@ -0,0 +1,12 @@
---
title: Uni2work
tags:
- projects
---
# Uni2work
Campus-Management-Software in Kooperation mit der Ludwig-Maximilians-Universität München
Uni2work ist eine Campus-Management-Software zur Verwaltung von Hochschullehre und Prüfungsamt.
Das Projekt wurde am Institut für Informatik der Ludwig-Maximilians-Universität (LMU) München begonnen und später als quelloffene Software veröffentlicht.
...

12
content/workflows.md Normal file
View File

@ -0,0 +1,12 @@
---
title: Workflows
tags:
- projects
---
# Workflows
Das Workflow-System als Bestandteil von Uni2work wurde als Kommunikations-Framework zur digitalen Abwicklung von Lehr- und Universitätsverwaltungs-bezogenen Kommunikationsprozessen entwickelt.
Im universitären Umfeld werden Workflows bereits zur digitalen Verwaltung von Abschlussarbeiten, Leistungsanerkennungen und vielem mehr eingesetzt.
...

View File

@ -71,6 +71,8 @@
})
yarn
gup
zsh
coreutils
];
shellHook = ''
${config.pre-commit.installationScript}

View File

@ -1,6 +1,6 @@
#!/usr/bin/env sh
gup --always
gup -u node_modules
gup -u node_modules webpack.config.js postcss.config.js
gup -u .src.chksum
rm -rf dist
yarn run build

View File

@ -1,5 +1,5 @@
#!/usr/bin/env sh
gup --always
gup -u package.json yarn.lock
yarn install --frozen-lockfile --check-files --non-interactive
touch node_modules

View File

@ -1,11 +1,13 @@
{
"name": "my-webpack-project",
"name": "uniworx.de",
"version": "1.0.0",
"main": "index.js",
"private": true,
"dependencies": {
"@fortawesome/fontawesome-free": "^6.4.2",
"@popperjs/core": "^2.11.7",
"bootstrap": "^5.2.3"
"bootstrap": "^5.2.3",
"typeface-source-sans-pro": "^1.1.13"
},
"scripts": {
"build": "webpack"

View File

@ -1,3 +1,3 @@
import 'bootstrap/scss/bootstrap.scss'
import * as bootstrap from 'bootstrap'
import {} from 'bootstrap'
import {} from './main.sass'

67
frontend/src/main.sass Normal file
View File

@ -0,0 +1,67 @@
@use "sass:string"
@use "~@fortawesome/fontawesome-free/scss/fontawesome" as * with ( $fa-font-path: "~@fortawesome/fontawesome-pro/webfonts" )
@forward "~@fortawesome/fontawesome-free/scss/fontawesome"
@use "~@fortawesome/fontawesome-free/scss/solid"
@use "~typeface-source-sans-pro" as source-sans-pro
@use "~bootstrap/scss/bootstrap" with ( $primary: hsl(268, 20%, 34%), $navbar-toggler-padding-y: 0.5rem, $navbar-padding-x: 1rem, $font-family-sans-serif: string.unquote("\"Source Sans Pro\", system-ui, sans-serif") )
.custom-navbar-toggler-icon
@include fa-icon-solid($fa-var-times)
.collapsed &
@include fa-icon-solid($fa-var-bars)
body
display: flex
flex-direction: column
min-height: 100vh
main
flex: 1
margin: 1rem
.multi-col
columns: 3 500px
column-gap: 3em
column-rule: 1px solid #ddd
.small-headlines
h1
font-size: 2rem
h2
font-size: 1.5rem
h3
font-size: 1.25rem
font-weight: 500
h4,h5,h6
font-size: 1.0rem
font-weight: 600
footer > nav > ul
width: 100%
background-color: hsl(268, 20%, 34%)
margin: 1rem 0 0 0
padding: 1rem 0
display: flex
justify-content: center
gap: 1rem
a,a:visited,a:hover,a:active
text-decoration: none
color: white
opacity: 0.55
transition: 0.15s
&:hover,:active
opacity: 0.75
& > li
display: block
#fraport-logo
filter: brightness(0) saturate(100%) invert(18%) sepia(37%) saturate(3738%) hue-rotate(216deg) brightness(98%) contrast(88%)

View File

@ -24,7 +24,8 @@ const config = {
chunkFilename: '[chunkhash].js',
filename: '[chunkhash].js',
path: path.resolve(__dirname, 'dist', `wp-${webpackVersion}`),
publicPath: `/wp-${webpackVersion}/`,
// publicPath: `/wp-${webpackVersion}/`,
publicPath: `./`,
hashFunction: 'shake256',
hashDigestLength: 36
},

File diff suppressed because it is too large Load Diff

3
images/Fraport_Logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="760px" height="398px" viewBox="0 0 760 398" enable-background="new 0 0 760 398" xml:space="preserve">
<rect x="35.525" y="35.568" fill="#2F854C" width="326.715" height="326.875"/>
<rect x="397.752" y="35.568" fill="#2F854C" width="326.715" height="326.875"/>
<path fill="#FFFFFF" d="M233.115,294.498v-69.621h38.574v73.449c0,5.211,1.191,8.922,3.578,11.133
c2.398,2.215,5.602,3.32,9.605,3.32c4.012,0,7.242-1.105,9.688-3.32c2.445-2.211,3.684-5.922,3.684-11.133v-73.449h38.391v69.621
c0,8.309-1.25,15.367-3.754,21.188c-2.496,5.82-6.012,10.547-10.512,14.211c-4.512,3.664-9.969,6.32-16.367,7.969
c-6.402,1.672-13.449,2.5-21.129,2.5c-7.566,0-14.527-0.828-20.871-2.5c-6.34-1.648-11.801-4.305-16.359-7.969
c-4.57-3.664-8.137-8.391-10.688-14.211C234.389,309.865,233.115,302.807,233.115,294.498z M164.986,311.947
c0,0.77,0.379,1.16,1.164,1.16c0.547,0,0.832-0.391,0.832-1.16c1-7.316,2.281-15.312,3.84-24.012
c1.566-8.695,3.109-17.172,4.676-25.43c1.559-8.242,3.062-15.754,4.504-22.5c1.449-6.77,2.562-11.797,3.348-15.129h36.066v112.5
h-21.703v-94.715c0-0.559-0.398-0.832-1.172-0.832c-0.441,0-0.668,0.273-0.668,0.832c-0.887,4.422-1.84,9.383-2.836,14.871
c-1.012,5.48-2.23,11.902-3.684,19.27c-1.445,7.371-3.195,15.984-5.25,25.836c-2.059,9.867-4.484,21.438-7.266,34.738h-22.551
c-2.777-13.074-5.145-24.375-7.094-33.906c-1.957-9.52-3.652-17.879-5.098-25.09c-1.441-7.195-2.727-13.621-3.84-19.273
c-1.105-5.648-2.223-11.133-3.34-16.445c0-0.559-0.391-0.832-1.172-0.832c-0.438,0-0.664,0.273-0.664,0.832v94.715h-19.867v-112.5
h36.23c0.559,2.434,1.234,5.586,2.008,9.473c0.77,3.887,1.645,8.223,2.582,13.047c0.953,4.805,1.918,9.969,2.93,15.438
c0.996,5.5,2,11.086,3.004,16.797c1.004,5.703,1.918,11.301,2.758,16.789C163.557,301.896,164.311,307.076,164.986,311.947z
M58.775,224.877h11.02v104.191h32.059v8.309H58.775V224.877z"/>
<polygon fill="#FFFFFF" points="421.791,205.6 421.791,181.709 426.244,181.709 426.244,202.057 438.119,202.057 438.119,205.6 "/>
<path fill="#FFFFFF" d="M454.377,206.088c-5.141,0-9.988-1.848-9.988-10.043v-14.336h4.469v14.746c0,3.789,1.816,6.348,5.52,6.348
c3.641,0,5.418-2.391,5.418-6.348v-14.746h4.465v14.336C464.26,203.658,459.314,206.088,454.377,206.088z"/>
<path fill="#FFFFFF" d="M480.354,185.088h-2.535v17.102h2.535c5.078,0,7.855-2.25,7.855-8.703
C488.209,187.889,485.525,185.088,480.354,185.088z M480.557,205.6h-7.203v-23.891h7.203c8.508,0,12.312,4.914,12.312,11.777
C492.869,201.338,488.275,205.6,480.557,205.6z"/>
<polygon fill="#FFFFFF" points="523.779,205.6 519.037,205.6 514.408,188.838 509.779,205.6 505.045,205.6 497.775,181.709
502.744,181.709 507.619,200.412 512.217,183.654 516.943,183.654 521.518,200.412 526.354,181.709 531.021,181.709 "/>
<rect x="537.775" y="181.709" fill="#FFFFFF" width="4.461" height="23.891"/>
<path fill="#FFFFFF" d="M562.135,206.088c-7.273,0-11.625-4.992-11.625-12.637c0-8.266,6.066-12.223,11.625-12.223
c3.914,0,6.449,1.23,8.066,2.664l-1.824,3.344c-1.301-1.469-3.078-2.801-6.242-2.801c-4.016,0-7,3.59-7,9.016
c0,5.562,2.984,9.422,7.203,9.422c2.438,0,3.848-0.617,4.426-1.156v-6.082h-5.352v-3.277h9.648v11.473
C568.994,205.092,566.217,206.088,562.135,206.088z"/>
<rect x="577.197" y="193.416" fill="#FFFFFF" width="9.367" height="2.973"/>
<polygon fill="#FFFFFF" points="443.443,249.506 442.623,231.342 436.541,246.225 432.49,246.225 426.283,231.342 425.561,249.506
421.205,249.506 422.611,225.6 428.174,225.6 434.721,241.439 440.939,225.6 446.494,225.6 447.896,249.506 "/>
<path fill="#FFFFFF" d="M465.463,230.045l-3.738,10.445h7.547L465.463,230.045z M472.529,249.506l-2.094-5.812h-9.805l-2.125,5.812
h-4.707l9.539-23.906h4.672l9.465,23.906H472.529z"/>
<polygon fill="#FFFFFF" points="499.393,249.506 492.908,239.865 486.295,249.506 480.939,249.506 490.135,237.115 481.658,225.6
487.252,225.6 493.154,234.475 498.916,225.6 504.271,225.6 495.826,237.115 504.986,249.506 "/>
<rect x="511.541" y="225.6" fill="#FFFFFF" width="4.465" height="23.906"/>
<polygon fill="#FFFFFF" points="547.229,249.506 546.396,231.342 540.326,246.225 536.275,246.225 530.068,231.342 529.346,249.506
524.99,249.506 526.4,225.6 531.959,225.6 538.506,241.439 544.721,225.6 550.283,225.6 551.682,249.506 "/>
<rect x="560.674" y="225.6" fill="#FFFFFF" width="4.453" height="23.906"/>
<polygon fill="#FFFFFF" points="591.033,249.506 591.033,245.951 579.166,245.951 579.166,225.6 574.701,225.6 574.701,249.506 "/>
<rect x="598.623" y="225.6" fill="#FFFFFF" width="4.453" height="23.906"/>
<path fill="#FFFFFF" d="M621.369,230.045l-3.742,10.445h7.547L621.369,230.045z M628.432,249.506l-2.094-5.812h-9.812l-2.125,5.812
h-4.699l9.531-23.906h4.668l9.477,23.906H628.432z"/>
<polygon fill="#FFFFFF" points="654.264,249.506 644.252,231.686 644.252,249.506 639.854,249.506 639.854,225.6 645.689,225.6
655.713,243.42 655.713,225.6 660.096,225.6 660.096,249.506 "/>
<path fill="#FFFFFF" d="M685.521,242.873c0-3.609-2.191-5.32-4.902-6.484l-4.734-2.008c-1.48-0.617-3.023-1.438-3.023-3.148
c0-1.367,1.203-2.898,3.844-2.898c2.988,0,4.668,1.328,6.039,3.008l1.891-2.969c-1.727-2.051-4.738-3.25-7.93-3.25
c-3.844,0-8.41,2.254-8.41,6.863c0,2.941,1.988,4.883,4.566,5.977l4.734,2.012c1.852,0.789,3.258,1.672,3.258,3.555
c0,1.531-1.406,3.242-4.422,3.242c-3.055,0-5.039-1.367-6.766-3.312l-1.879,3c1.129,1.336,3.84,3.516,8.574,3.516
C683.564,249.975,685.521,245.334,685.521,242.873z"/>
<rect x="691.252" y="237.311" fill="#FFFFFF" width="9.363" height="2.977"/>
<path fill="#FFFFFF" d="M431.436,293.881c-5.152,0-9.984-1.855-9.984-10.039v-14.344h4.453v14.742c0,3.789,1.82,6.359,5.531,6.359
c3.629,0,5.418-2.391,5.418-6.359v-14.742h4.453v14.344C441.307,291.451,436.377,293.881,431.436,293.881z"/>
<polygon fill="#FFFFFF" points="464.818,293.393 454.795,275.568 454.795,293.393 450.4,293.393 450.4,269.498 456.236,269.498
466.256,287.318 466.256,269.498 470.639,269.498 470.639,293.393 "/>
<rect x="480.213" y="269.498" fill="#FFFFFF" width="4.465" height="23.895"/>
<polygon fill="#FFFFFF" points="504.877,293.393 500.15,293.393 490.604,269.498 495.65,269.498 502.619,288.889 509.584,269.498
514.42,269.498 "/>
<polygon fill="#FFFFFF" points="521.033,293.393 521.033,269.498 537.127,269.498 537.127,272.982 525.498,272.982 525.498,279.264
536.205,279.264 536.205,282.678 525.498,282.678 525.498,289.85 537.58,289.85 537.58,293.393 "/>
<path fill="#FFFFFF" d="M553.529,272.873h-3.848v6.938h3.848c3.438,0,4.289-1.672,4.289-3.656
C557.818,274.35,556.408,272.873,553.529,272.873z M559.053,293.393l-4.832-7.199c-1.238-1.844-2.305-3.113-3.43-3.113h-1.109
v10.312h-4.453v-23.895h9.16c4.219,0,8.027,2.215,8.027,6.656c0,4.504-4.051,6.184-6.109,6.418c0.691,0.441,1.578,1.602,1.891,2.051
l6.18,8.77H559.053z"/>
<path fill="#FFFFFF" d="M577.686,293.881c-4.738,0-7.445-2.195-8.582-3.516l1.887-3.008c1.723,1.945,3.711,3.312,6.762,3.312
c3.02,0,4.426-1.711,4.426-3.242c0-1.887-1.406-2.773-3.258-3.555l-4.734-2.016c-2.578-1.094-4.566-3.035-4.566-5.977
c0-4.609,4.566-6.863,8.406-6.863c3.195,0,6.207,1.191,7.93,3.242l-1.887,2.969c-1.371-1.668-3.051-2.996-6.043-2.996
c-2.641,0-3.84,1.531-3.84,2.898c0,1.711,1.543,2.531,3.02,3.145l4.727,2.012c2.711,1.164,4.914,2.871,4.914,6.484
C586.846,289.232,584.889,293.881,577.686,293.881z"/>
<rect x="594.873" y="269.498" fill="#FFFFFF" width="4.465" height="23.895"/>
<polygon fill="#FFFFFF" points="618.51,273.053 618.51,293.393 614.057,293.393 614.057,273.053 605.99,273.053 605.99,269.498
626.572,269.498 626.572,273.053 "/>
<path fill="#FFFFFF" d="M645.17,267.318c-1.273,0-2.328-1.094-2.328-2.297c0-1.188,1.027-2.281,2.328-2.281s2.332,1.094,2.332,2.281
C647.502,266.225,646.447,267.318,645.17,267.318z M641.803,273.939l-3.738,10.441h7.547L641.803,273.939z M638.545,267.318
c-1.266,0-2.328-1.094-2.328-2.297c0-1.188,1.023-2.281,2.328-2.281c1.309,0,2.34,1.094,2.34,2.281
C640.885,266.225,639.814,267.318,638.545,267.318z M648.881,293.393l-2.094-5.801h-9.82l-2.121,5.801h-4.699l9.531-23.895h4.672
l9.465,23.895H648.881z"/>
<polygon fill="#FFFFFF" points="669.9,273.053 669.9,293.393 665.447,293.393 665.447,273.053 657.389,273.053 657.389,269.498
677.971,269.498 677.971,273.053 "/>
<polygon fill="#FFFFFF" points="443.443,337.287 442.623,319.135 436.541,334.018 432.49,334.018 426.283,319.135 425.561,337.287
421.205,337.287 422.611,313.393 428.174,313.393 434.721,329.232 440.939,313.393 446.494,313.393 447.896,337.287 "/>
<path fill="#FFFFFF" d="M469.381,311.205c-1.277,0-2.34-1.094-2.34-2.285s1.035-2.285,2.34-2.285c1.297,0,2.367,1.094,2.367,2.285
S470.639,311.205,469.381,311.205z M462.752,311.205c-1.262,0-2.328-1.094-2.328-2.285s1.027-2.285,2.328-2.285
s2.371,1.094,2.371,2.285S464.025,311.205,462.752,311.205z M466.396,337.768c-5.152,0-9.984-1.836-9.984-10.039v-14.336h4.453
v14.754c0,3.789,1.82,6.352,5.531,6.352c3.629,0,5.418-2.395,5.418-6.352v-14.754h4.453v14.336
C476.268,335.346,471.338,337.768,466.396,337.768z"/>
<polygon fill="#FFFFFF" points="499.779,337.287 489.756,319.475 489.756,337.287 485.361,337.287 485.361,313.393 491.197,313.393
501.217,331.217 501.217,313.393 505.6,313.393 505.6,337.287 "/>
<path fill="#FFFFFF" d="M525.127,337.768c-7.75,0-11.391-6.004-11.391-12.598c0-6.453,4.422-12.258,11.391-12.258
c3.438,0,6.109,1.133,7.93,3.039l-1.754,3.32c-1.34-1.504-2.668-3.078-6.105-3.078c-4.055,0-6.793,3.93-6.793,8.977
c0,4.953,2.949,9.328,6.832,9.328c2.852,0,4.727-0.961,6.75-3.117l1.715,3.418C530.924,336.92,528.908,337.768,525.127,337.768z"/>
<polygon fill="#FFFFFF" points="555.83,337.287 555.83,326.467 545.131,326.467 545.131,337.287 540.67,337.287 540.67,313.393
545.131,313.393 545.131,323.197 555.83,323.197 555.83,313.393 560.291,313.393 560.291,337.287 "/>
<polygon fill="#FFFFFF" points="569.732,337.287 569.732,313.393 585.822,313.393 585.822,316.881 574.193,316.881 574.193,323.158
584.896,323.158 584.896,326.576 574.193,326.576 574.193,333.744 586.268,333.744 586.268,337.287 "/>
<polygon fill="#FFFFFF" points="608.33,337.287 598.311,319.475 598.311,337.287 593.916,337.287 593.916,313.393 599.744,313.393
609.771,331.217 609.771,313.393 614.166,313.393 614.166,337.287 "/>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -6,9 +6,8 @@ default-extensions:
- NoImplicitPrelude
- ViewPatterns
- DerivingStrategies
- DeriveGeneric
- GeneralizedNewtypeDeriving
- TypeApplications
- MultiWayIf
language: GHC2021
executables:
site:
@ -33,3 +32,8 @@ executables:
- yaml
- containers
- Glob
- transformers
- mtl
- megaparsec
- text
- network-uri

239
special/data-protection.md Normal file
View File

@ -0,0 +1,239 @@
---
title: Datenschutzerklärung
---
<div markdown="1" class="multi-col small-headlines">
# Datenschutzerklärung
*Stand: 27.10.2023*
Wir informieren Sie nachfolgend gemäß den gesetzlichen Vorgaben des Datenschutzrechts (insb. gemäß BDSG n.F. und der europäischen Datenschutz-Grundverordnung „DSGVO“) über die Art, den Umfang und Zweck der Verarbeitung personenbezogener Daten durch unser Unternehmen. Diese Datenschutzerklärung gilt auch für unsere Webseiten und Social-Media-Profile. Bezüglich der Definition von Begriffen wie etwa „personenbezogene Daten“ oder „Verarbeitung“ verweisen wir auf Art. 4 DSGVO.
## Verantwortliche Personen
### Verantwortliche Person für den Inhalt
Unsere verantwortliche Person (nachfolgend „Verantwortlicher“) i.S.d. Art. 4 Zif. 7 DSGVO ist:
> UniWorX Systems GmbH
> Savitsstraße 43
> D-81929 München
> Bavaria, Germany
>
> Geschäftsführerin: Sarah Vaupel
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
> Telefon: +49 179 4130707
### Datenschutzbeauftragte Person
> Sarah Vaupel
> Savitsstraße 43
> D-81929 München
> Bavaria, Germany
>
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
> Telefon: +49 179 4130707
## Datenarten, Zwecke der Verarbeitung und Kategorien betroffener Personen
Nachfolgend informieren wir Sie über Art, Umfang und Zweck der Erhebung, Verarbeitung und Nutzung personenbezogener Daten.
1. **Arten der Daten, die wir verarbeiten**
Kommunikationsdaten (IP-Adresse etc.),
2. **Zwecke der Verarbeitung nach Art. 13 Abs. 1 c) DSGVO**
- Erfüllung gesetzlicher Aufbewahrungspflichten,
- Vermeidung von SPAM und Missbrauch,
- Maßnahmen der Sicherheit,
- Unterbrechungsfreier, sicherer Betrieb unserer Webseite,
3. **Kategorien der betroffenen Personen nach Art. 13 Abs. 1 e) DSGVO**
Besucher/Nutzer der Webseite.
Die betroffenen Personen werden zusammenfassend als „Nutzer“ bezeichnet.
## Rechtsgrundlagen der Verarbeitung personenbezogener Daten
Nachfolgend Informieren wir Sie über die Rechtsgrundlagen der Verarbeitung personenbezogener Daten.
1. Wenn wir Ihre Einwilligung für die Verarbeitung personenbezogenen Daten eingeholt haben, ist Art. 6 Abs. 1 S. 1 lit. a) DSGVO Rechtsgrundlage.
2. Ist die Verarbeitung zur Erfüllung eines Vertrags oder zur Durchführung vorvertraglicher Maßnahmen erforderlich, die auf Ihre Anfrage hin erfolgen, so ist Art. 6 Abs. 1 S. 1 lit. b) DSGVO Rechtsgrundlage.
3. Ist die Verarbeitung zur Erfüllung einer rechtlichen Verpflichtung erforderlich, der wir unterliegen (z.B. gesetzliche Aufbewahrungspflichten), so ist Art. 6 Abs. 1 S. 1 lit. c) DSGVO Rechtsgrundlage.
4. Ist die Verarbeitung erforderlich, um lebenswichtige Interessen der betroffenen Person oder einer anderen natürlichen Person zu schützen, so ist Art. 6 Abs. 1 S. 1 lit. d) DSGVO Rechtsgrundlage.
5. Ist die Verarbeitung zur Wahrung unserer oder der berechtigten Interessen eines Dritten erforderlich und überwiegen diesbezüglich Ihre Interessen oder Grundrechte und Grundfreiheiten nicht, so ist Art. 6 Abs. 1 S. 1 lit. f) DSGVO Rechtsgrundlage.
## Weitergabe personenbezogener Daten an Dritte und Auftragsverarbeiter
Ohne Ihre Einwilligung geben wir grundsätzlich keine Daten an Dritte weiter. Sollte dies doch der Fall sein, dann erfolgt die Weitergabe auf der Grundlage der zuvor genannten Rechtsgrundlagen z.B. bei der Weitergabe von Daten an Online-Paymentanbieter zur Vertragserfüllung oder aufgrund gerichtlicher Anordnung oder wegen einer gesetzlichen Verpflichtung zur Herausgabe der Daten zum Zwecke der Strafverfolgung, zur Gefahrenabwehr oder zur Durchsetzung der Rechte am geistigen Eigentum.
Wir setzen zudem Auftragsverarbeiter (externe Dienstleister z.B. zum Webhosting unserer Webseiten und Datenbanken) zur Verarbeitung Ihrer Daten ein. Wenn im Rahmen einer Vereinbarung zur Auftragsverarbeitung an die Auftragsverarbeiter Daten weitergegeben werden, erfolgt dies immer nach Art. 28 DSGVO. Wir wählen dabei unsere Auftragsverarbeiter sorgfältig aus, kontrollieren diese regelmäßig und haben uns ein Weisungsrecht hinsichtlich der Daten einräumen lassen. Zudem müssen die Auftragsverarbeiter geeignete technische und organisatorische Maßnahmen getroffen haben und die Datenschutzvorschriften gem. BDSG n.F. und DSGVO einhalten.
## Datenübermittlung in Drittstaaten
Durch die Verabschiedung der europäischen Datenschutz-Grundverordnung (DSGVO) wurde eine einheitliche Grundlage für den Datenschutz in Europa geschaffen. Ihre Daten werden daher vorwiegend durch Unternehmen verarbeitet, für die die DSGVO Anwendung findet. Sollte doch die Verarbeitung durch Dienste Dritter außerhalb der Europäischen Union oder des Europäischen Wirtschaftsraums stattfinden, so müssen diese die besonderen Voraussetzungen der Art. 44 ff. DSGVO erfüllen. Das bedeutet, die Verarbeitung erfolgt aufgrund besonderer Garantien, wie etwa die von der EU-Kommission offiziell anerkannte Feststellung eines der EU entsprechenden Datenschutzniveaus oder der Beachtung offiziell anerkannter spezieller vertraglicher Verpflichtungen, der so genannten „Standardvertragsklauseln“.
Soweit wir aufgrund der Unwirksamkeit des sog. „Privacy Shields“, nach Art. 49 Abs. 1 S. 1 lit. a) DSGVO die ausdrückliche Einwilligung in die Datenübermittlung in die USA von Ihnen einholen, weisen wir diesbezüglich auf das Risiko eines geheimen Zugriffs durch US-Behörden und die Nutzung der Daten zu Überwachungszwecken, ggf. ohne Rechtsbehelfsmöglichkeiten für EU-Bürger, hin.
## Löschung von Daten und Speicherdauer
Sofern nicht in dieser Datenschutzerklärung ausdrücklich angegeben, werden Ihre personenbezogen Daten gelöscht oder gesperrt, sobald die zur Verarbeitung erteilte Einwilligung von Ihnen widerrufen wird oder der Zweck für die Speicherung entfällt bzw. die Daten für den Zweck nicht mehr erforderlich sind, es sei denn deren weitere Aufbewahrung ist zu Beweiszwecken erforderlich oder dem stehen gesetzliche Aufbewahrungspflichten entgegenstehen. Darunter fallen etwa handelsrechtliche Aufbewahrungspflichten von Geschäftsbriefen nach § 257 Abs. 1 HGB (6 Jahre) sowie steuerrechtliche Aufbewahrungspflichten nach § 147 Abs. 1 AO von Belegen (10 Jahre). Wenn die vorgeschriebene Aufbewahrungsfrist abläuft, erfolgt eine Sperrung oder Löschung Ihrer Daten, es sei denn die Speicherung ist weiterhin für einen Vertragsabschluss oder zur Vertragserfüllung erforderlich.
## Bestehen einer automatisierten Entscheidungsfindung
Wir setzen keine automatische Entscheidungsfindung und kein Profiling ein.
## Bereitstellung unserer Webseite und Erstellung von Logfiles
1. Wenn Sie unsere Webseite lediglich informatorisch nutzen (also keine Registrierung und auch keine anderweitige Übermittlung von Informationen), erheben wir nur die personenbezogenen Daten, die Ihr Browser an unseren Server übermittelt. Wenn Sie unsere Webseite betrachten möchten, erheben wir die folgenden Daten:
- IP-Adresse;
- Internet-Service-Provider des Nutzers;
- Datum und Uhrzeit des Abrufs;
- Browsertyp;
- Sprache und Browser-Version;
- Inhalt des Abrufs;
- Zeitzone;
- Zugriffsstatus/HTTP-Statuscode;
- Datenmenge;
- Webseiten, von denen die Anforderung kommt;
- Betriebssystem.
Eine Speicherung dieser Daten zusammen mit anderen personenbezogenen Daten von Ihnen findet nicht statt.
2. Diese Daten dienen dem Zweck der nutzerfreundlichen, funktionsfähigen und sicheren Auslieferung unserer Webseite an Sie mit Funktionen und Inhalten sowie deren Optimierung und statistischen Auswertung.
3. Rechtsgrundlage hierfür ist unser in den obigen Zwecken auch liegendes berechtigtes Interesse an der Datenverarbeitung nach Art. 6 Abs. 1 S.1 lit. f) DSGVO.
4. Wir speichern aus Sicherheitsgründen diese Daten in Server-Logfiles für die Speicherdauer von 30 Tagen. Nach Ablauf dieser Frist werden diese automatisch gelöscht, es sei denn wir benötigen deren Aufbewahrung zu Beweiszwecken bei Angriffen auf die Serverinfrastruktur oder anderen Rechtsverletzungen.
## Präsenz in sozialen Medien
1. Wir unterhalten in sozialen Medien Profile bzw. Fanpages. Bei der Nutzung und dem Aufruf unseres Profils im jeweiligen Netzwerk durch Sie gelten die jeweiligen Datenschutzhinweise und Nutzungsbedingungen des jeweiligen Netzwerks.
2. **Datenkategorien und Beschreibung der Datenverarbeitung:**
- Nutzungsdaten,
- Kontaktdaten,
- Inhaltsdaten,
- Bestandsdaten.
Ferner werden die Daten der Nutzer innerhalb sozialer Netzwerke im Regelfall für Marktforschungs- und Werbezwecke verarbeitet. So können z.B. anhand des Nutzungsverhaltens und sich daraus ergebender Interessen der Nutzer Nutzungsprofile erstellt werden. Die Nutzungsprofile können wiederum verwendet werden, um z.B. Werbeanzeigen innerhalb und außerhalb der Netzwerke zu schalten, die mutmaßlich den Interessen der Nutzer entsprechen. Zu diesen Zwecken werden im Regelfall Cookies auf den Rechnern der Nutzer gespeichert, in denen das Nutzungsverhalten und die Interessen der Nutzer gespeichert werden. Ferner können in den Nutzungsprofilen auch Daten unabhängig der von den Nutzern verwendeten Geräte gespeichert werden (insbesondere, wenn die Nutzer Mitglieder der jeweiligen Plattformen sind und bei diesen eingeloggt sind). Für eine detaillierte Darstellung der jeweiligen Verarbeitungsformen und der Widerspruchsmöglichkeiten (Opt-Out) verweisen wir auf die Datenschutzerklärungen und Angaben der Betreiber der jeweiligen Netzwerke. Auch im Fall von Auskunftsanfragen und der Geltendmachung von Betroffenenrechten weisen wir darauf hin, dass diese am effektivsten bei den Anbietern geltend gemacht werden können. Nur die Anbieter haben jeweils Zugriff auf die Daten der Nutzer und können direkt entsprechende Maßnahmen ergreifen und Auskünfte geben. Sollten Sie dennoch Hilfe benötigen, dann können Sie sich an uns wenden.
3. **Zweck der Verarbeitung:**
- Kommunikation mit den auf den sozialen Netzwerken angeschlossenen und registrierten Nutzern;
- Information und Werbung für unsere Produkte, Angebote und Dienstleistungen;
- Außerdarstellung und Imagepflege;
- Auswertung und Analyse der Nutzer und Inhalte unserer Präsenzen in den sozialen Medien.
4. **Rechtsgrundlagen:**
Die Rechtsgrundlage für die Verarbeitung der personenbezogenen Daten ist unser in den obigen Zwecken liegendes berechtigtes Interesse gemäß Art. 6 Abs. 1 S. 1 lit. f) DSGVO. Soweit Sie uns bzw. dem Verantwortlichen des sozialen Netzwerks eine Einwilligung in die Verarbeitung Ihrer personenbezogenen Daten erteilt haben, ist Rechtsgrundlage Art. 6 Abs. 1 S. 1 lit. a) i.V.m. Art. 7 DSGVO.
5. **Datenübermittlung/Empfängerkategorie:**
Soziales Netzwerk.
6. **Datenschutzhinweise, Auskunftsmöglichkeiten und Widerspruchmöglichkeiten (Opt-Out) der jeweiligen Netzwerke/Diensteanbieter:**
- **XING** Diensteanbieter: XING AG, Dammtorstra&szlig;e 29-32, 20354 Hamburg, Deutschland) - Datenschutzerkl&auml;rung/ Opt-Out:&nbsp;<a href="https://privacy.xing.com/de/datenschutzerklaerung" target="_blank" rel="nofollow">https://privacy.xing.com/de/datenschutzerklaerung</a>
- **LinkedIn** Diensteanbieter: LinkedIn Ireland Unlimited Company, Wilton Place, Dublin 2, Irland) &ndash; Datenschutzerkl&auml;rung:&nbsp;<a href="https://www.linkedin.com/legal/privacy-policy" target="_blank" rel="nofollow">https://www.linkedin.com/legal/privacy-policy</a>, Cookie-Richtlinie und Opt-Out:&nbsp;<a href="https://www.linkedin.com/legal/cookie-policy" target="_blank" rel="nofollow">https://www.linkedin.com/legal/cookie-policy</a>
## Social-Media-Plug-ins
1. Wir setzen auf unserer Webseite Social-Media-Plug-ins von sozialen Netzwerken ein. Dabei nutzen wir die sog.&nbsp;&bdquo;Zwei-Klick-L&ouml;sung&ldquo;-Shariff&nbsp;von c&rsquo;t bzw. heise.de: <a href="https://www.heise.de/ct/artikel/Shariff-Social-Media-Buttons-mit-Datenschutz-2467514.html" rel="nofollow" target="_blank">https://www.heise.de/ct/artikel/Shariff-Social-Media-Buttons-mit-Datenschutz-2467514.html</a>; Dienstanbieter: Heise Medien GmbH &amp; Co. KG, Karl-Wiechert-Allee 10, 30625 Hannover, Deutschland; Datenschutzerkl&auml;rung: <a href="https://www.heise.de/Datenschutzerklaerung-der-Heise-Medien-GmbH-Co-KG-4860.html" rel="nofollow" target="_blank">https://www.heise.de/Datenschutzerklaerung-der-Heise-Medien-GmbH-Co-KG-4860.html</a>.
2. **Datenkategorie und Beschreibung der Datenverarbeitung:**
- Nutzungsdaten,
- Inhaltsdaten,
- Bestandsdaten.
Beim Abruf unserer Webseite werden durch &bdquo;Shariff&ldquo;&nbsp;<strong>keine personenbezogenen</strong> Daten&nbsp;an die Drittanbieter der Social-Plug-ins &uuml;bermittelt. Neben dem Logo bzw. der Marke des sozialen Netzwerks finden Sie einen Regler, mit dem Sie das Plug-in per Klick aktivieren k&ouml;nnen. Diese Aktivierung stellt Ihre <strong>Einwilligung</strong> in der Form dar, dass der jeweilige Anbieter des sozialen Netzwerks die Information erh&auml;lt, dass Sie unsere Webseite aufgerufen haben und Ihre personenbezogenen Daten an den Anbieter des Plug-ins &uuml;bermittelt und dort gespeichert werden. Hierbei handelt es sich um sog. Thirdparty Cookies. Bei einigen Anbietern wie Facebook und XING wird nach deren Angaben Ihre IP nach der Erhebung sofort anonymisiert. Die &uuml;ber den Nutzer erhobenen Daten speichert der Plug-in-Anbieter als Nutzungsprofile.
*Sie können Ihre Einwilligung jederzeit durch die Deaktivierung des Reglers widerrufen.*
3. **Zweck der Datenverarbeitung:**
- Verbesserung und Optimierung unserer Webseite;
- Steigerung unserer Bekanntheit mittels sozialer Netzwerke;
- Möglichkeit der Interaktion mit Ihnen und der Nutzer untereinander über soziale Netzwerke;
- Werbung, Analyse und/oder bedarfsgerechten Gestaltung der Webseite.
4. **Rechtsgrundlagen:**
Die Rechtsgrundlage für die Verarbeitung der personenbezogenen Daten ist unser in den obigen Zwecken liegendes berechtigtes Interesse gemäß Art. 6 Abs. 1 S. 1 lit. f) DSGVO. Soweit Sie uns bzw. dem Verantwortlichen des sozialen Netzwerks eine Einwilligung in die Verarbeitung Ihrer personenbezogenen Daten erteilt haben, ist Rechtsgrundlage Art. 6 Abs. 1 S. 1 lit. a) i.V.m. Art. 7 DSGVO. Bei vorvertraglichen Anfragen oder bei der Nutzung Ihrer personenbezogenen Daten zur Vertragserfüllung, ist Art. 6 Abs. 1 S. 1 lit. b) DSGVO Rechtsgrundlage.
5. **Datenübermittlung/Empfängerkategorie:**
Soziales Netzwerk.
6. **Genutzte soziale Netzwerke und Widerspruch:**
Wir verweisen hinsichtlich des Zwecks und Umfangs der Datenerhebung und Verarbeitung auf die jeweiligen Datenschutzerklärungen der sozialen Netzwerke. Zudem finden Sie dort auch Hinweise zu Ihren Rechten und Einstellungsmöglichkeiten zum Schutz Ihrer personenbezogenen Daten. Ihnen steht ein Widerspruchsrecht gegen die Bildung dieser Nutzerprofile zu, wobei Sie sich zur Ausübung dieser Rechte direkt an den jeweiligen Plug-in-Anbieter wenden können.
## XING
1. Wir haben auf unserer Webseite Plug-ins vom sozialen Netzwerk XING (XING AG, Dammtorstraße 29-32, 20354 Hamburg, Deutschland) im Rahmen der sog. „Zwei-Klick-Lösung“ von Shariff integriert. Diese erkennen Sie am Share-Button mit weißem Logo von XING und dem „X“ Symbol auf grünem Hintergrund.
2. Wenn Sie auf unserer Webseite den Share-Button von XING willentlich aktivieren, führt dies beim Aufruf der jeweiligen Internetseite dazu, dass Ihr Browser eine Verbindung mit dem Server von XING aufbaut. Dabei werden laut XING keine Daten über den Aufruf gespeichert, aus denen XING einen unmittelbaren Personenbezug herleiten könnte. XING speichert insbesondere keine IP-Adressen von Ihnen und verwendet auch keine Cookies. Beim Klick auf den Share-Button werden Sie zur Startseite von XING umgeleitet, auf der Sie dann - falls Sie eingeloggt sind unsere Seite empfehlen können, was dem Zweck der Steigerung unserer Bekanntheit und Reichweite dient. Hinsichtlich dieser Aktivitäten auf der XING Plattform gilt die unten genannte Datenschutzerklärung von XING.
3. Wenn Sie sich bei XING vor dem Besuch unserer Webseite ausloggen und Ihre Cookies löschen, werden bei der Aktivierung des Plug-ins keine Daten über den Besuch unserer Webseite Ihrem Profil auf XING zugeordnet.
4. Zweck und Umfang der Datenerhebung sowie ihre weitere Verarbeitung und Nutzung der Daten durch XING sowie Ihre diesbez&uuml;glichen Rechte und Einstellungsm&ouml;glichkeiten zum Schutz Ihrer Privatsph&auml;re, k&ouml;nnen Sie den Datenschutzhinweisen von XING zum Share-Button entnehmen unter&nbsp;<a href="https://www.xing.com/app/share%3Fop%3Ddata_protection" target="_blank" rel="nofollow">https://www.xing.com/app/share%3Fop%3Ddata_protection</a>&nbsp;sowie der allgemeinen Datenschutzerkl&auml;rung von XING unter <a href="https://privacy.xing.com/de/datenschutzerklaerung" target="_blank" rel="nofollow">https://privacy.xing.com/de/datenschutzerklaerung</a>.<br /><br /></li>
## Rechte der betroffenen Person
1. **Widerspruch oder Widerruf gegen die Verarbeitung Ihrer Daten**
Soweit die Verarbeitung auf Ihrer Einwilligung gemäß Art. 6 Abs. 1 S. 1 lit. a), Art. 7 DSGVO beruht, haben Sie das Recht, die Einwilligung jederzeit zu widerrufen. Die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung wird dadurch nicht berührt.
Soweit wir die Verarbeitung Ihrer personenbezogenen Daten auf die Interessenabwägung gemäß Art. 6 Abs. 1 S. 1 lit. f) DSGVO stützen, können Sie Widerspruch gegen die Verarbeitung einlegen. Dies ist der Fall, wenn die Verarbeitung insbesondere nicht zur Erfüllung eines Vertrags mit Ihnen erforderlich ist, was von uns jeweils bei der nachfolgenden Beschreibung der Funktionen dargestellt wird. Bei Ausübung eines solchen Widerspruchs bitten wir um Darlegung der Gründe, weshalb wir Ihre personenbezogenen Daten nicht wie von uns durchgeführt verarbeiten sollten. Im Falle Ihres begründeten Widerspruchs prüfen wir die Sachlage und werden entweder die Datenverarbeitung einstellen bzw. anpassen oder Ihnen unsere zwingenden schutzwürdigen Gründe aufzeigen, aufgrund derer wir die Verarbeitung fortführen.
Sie können der Verarbeitung Ihrer personenbezogenen Daten für Zwecke der Werbung und Datenanalyse jederzeit widersprechen. Das Widerspruchsrecht können Sie kostenfrei ausüben. Über Ihren Werbewiderspruch können Sie uns unter folgenden Kontaktdaten informieren:
> UniWorX Systems GmbH
> Savitsstraße 43
> D-81929 München
> Bavaria, Germany
>
> Geschäftsführerin: Sarah Vaupel
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
2. **Recht auf Auskunft**
Sie haben das Recht, von uns eine Bestätigung darüber zu verlangen, ob Sie betreffende personenbezogene Daten verarbeitet werden. Sofern dies der Fall ist, haben Sie ein Recht auf Auskunft über Ihre bei uns gespeicherten persönlichen Daten nach Art. 15 DSGVO. Dies beinhaltet insbesondere die Auskunft über die Verarbeitungszwecke, die Kategorie der personenbezogenen Daten, die Kategorien von Empfängern, gegenüber denen Ihre Daten offengelegt wurden oder werden, die geplante Speicherdauer, die Herkunft ihrer Daten, sofern diese nicht direkt bei Ihnen erhoben wurden.
3. **Recht auf Berichtigung**
Sie haben ein Recht auf Berichtigung unrichtiger oder auf Vervollständigung richtiger Daten nach Art. 16 DSGVO.
4. **Recht auf Löschung**
Sie haben ein Recht auf Löschung Ihrer bei uns gespeicherten Daten nach Art. 17 DSGVO, es sei denn gesetzliche oder vertraglichen Aufbewahrungsfristen oder andere gesetzliche Pflichten bzw. Rechte zur weiteren Speicherung stehen dieser entgegen.
5. **Recht auf Einschränkung**
Sie haben das Recht, eine Einschränkung bei der Verarbeitung Ihrer personenbezogenen Daten zu verlangen, wenn eine der Voraussetzungen in Art. 18 Abs. 1 lit. a) bis d) DSGVO erfüllt ist:
- Wenn Sie die Richtigkeit der Sie betreffenden personenbezogenen für eine Dauer bestreiten, die es dem Verantwortlichen ermöglicht, die Richtigkeit der personenbezogenen Daten zu überprüfen;
- die Verarbeitung unrechtmäßig ist und Sie die Löschung der personenbezogenen Daten ablehnen und stattdessen die Einschränkung der Nutzung der personenbezogenen Daten verlangen;
- der Verantwortliche die personenbezogenen Daten für die Zwecke der Verarbeitung nicht länger benötigt, Sie diese jedoch zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen benötigen, oder
- wenn Sie Widerspruch gegen die Verarbeitung gemäß Art. 21 Abs. 1 DSGVO eingelegt haben und noch nicht feststeht, ob die berechtigten Gründe des Verantwortlichen gegenüber Ihren Gründen überwiegen.
6. **Recht auf Datenübertragbarkeit**
Sie haben ein Recht auf Datenübertragbarkeit nach Art. 20 DSGVO, was bedeutet, dass Sie die bei uns über Sie gespeicherten personenbezogenen Daten in einem strukturierten, gängigen und maschinenlesbaren Format erhalten können oder die Übermittlung an einen anderen Verantwortlichen verlangen können.
7. **Recht auf Beschwerde**
Sie haben ein Recht auf Beschwerde bei einer Aufsichtsbehörde. In der Regel können Sie sich hierfür an die Aufsichtsbehörde insbesondere in dem Mitgliedstaat ihres Aufenthaltsorts, ihres Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes wenden.
## Datensicherheit
Um alle personenbezogen Daten, die an uns übermittelt werden, zu schützen und um sicherzustellen, dass die Datenschutzvorschriften von uns, aber auch unseren externen Dienstleistern eingehalten werden, haben wir geeignete technische und organisatorische Sicherheitsmaßnahmen getroffen. Deshalb werden unter anderem alle Daten zwischen Ihrem Browser und unserem Server über eine sichere SSL-Verbindung verschlüsselt übertragen.
</div>

48
special/imprint.md Normal file
View File

@ -0,0 +1,48 @@
---
title: Impressum
---
<div markdown="1" class="multi-col small-headlines">
# Impressum
## Angaben gemäß § 5 TMG
> UniWorX Systems GmbH
> Savitsstraße 43
> D-81929 München
> Bavaria, Germany
>
> Geschäftsführerin: Sarah Vaupel
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
> Telefon: +49 179 4130707
## Verantwortlich für den Inhalt gemäß § 55 Abs. 2 RStV
> UniWorX Systems GmbH
> Savitsstraße 43
> D-81929 München
> Bavaria, Germany
>
> Geschäftsführerin: Sarah Vaupel
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
> Telefon: +49 179 4130707
## Disclaimer Rechtliche Hinweise
### § 1 Warnhinweis zu Inhalten
Die kostenlosen und frei zugänglichen Inhalte dieser Webseite wurden mit größtmöglicher Sorgfalt erstellt. Der Anbieter dieser Webseite übernimmt jedoch keine Gewähr für die Richtigkeit und Aktualität der bereitgestellten kostenlosen und frei zugänglichen journalistischen Ratgeber und Nachrichten. Namentlich gekennzeichnete Beiträge geben die Meinung des jeweiligen Autors und nicht immer die Meinung des Anbieters wieder. Allein durch den Aufruf der kostenlosen und frei zugänglichen Inhalte kommt keinerlei Vertragsverhältnis zwischen dem Nutzer und dem Anbieter zustande, insoweit fehlt es am Rechtsbindungswillen des Anbieters.
### § 2 Externe Links
Diese Website enthält Verknüpfungen zu Websites Dritter („externe Links“). Diese Webseiten unterliegen der Haftung der jeweiligen Betreiber. Der Anbieter hat bei der erstmaligen Verknüpfung der externen Links die fremden Inhalte daraufhin überprüft, ob etwaige Rechtsverstöße bestehen. Zu dem Zeitpunkt waren keine Rechtsverstöße ersichtlich. Der Anbieter hat keinerlei Einfluss auf die aktuelle und zukünftige Gestaltung und auf die Inhalte der verknüpften Seiten. Das Setzen von externen Links bedeutet nicht, dass sich der Anbieter die hinter dem Verweis oder Link liegenden Inhalte zu Eigen macht. Eine ständige Kontrolle der externen Links ist für den Anbieter ohne konkrete Hinweise auf Rechtsverstöße nicht zumutbar. Bei Kenntnis von Rechtsverstößen werden jedoch derartige externe Links unverzüglich gelöscht.
### § 3 Urheber- und Leistungsschutzrechte
Die auf dieser Website veröffentlichten Inhalte unterliegen dem deutschen Urheber- und Leistungsschutzrecht. Jede vom deutschen Urheber- und Leistungsschutzrecht nicht zugelassene Verwertung bedarf der vorherigen schriftlichen Zustimmung des Anbieters oder jeweiligen Rechteinhabers. Dies gilt insbesondere für Vervielfältigung, Bearbeitung, Übersetzung, Einspeicherung, Verarbeitung bzw. Wiedergabe von Inhalten in Datenbanken oder anderen elektronischen Medien und Systemen. Inhalte und Rechte Dritter sind dabei als solche gekennzeichnet. Die unerlaubte Vervielfältigung oder Weitergabe einzelner Inhalte oder kompletter Seiten ist nicht gestattet und strafbar. Lediglich die Herstellung von Kopien und Downloads für den persönlichen, privaten und nicht kommerziellen Gebrauch ist erlaubt.
Die Darstellung dieser Website in fremden Frames ist nur mit schriftlicher Erlaubnis zulässig.
### § 4 Besondere Nutzungsbedingungen
Soweit besondere Bedingungen für einzelne Nutzungen dieser Website von den oben genannten Paragraphen abweichen, wird an entsprechender Stelle ausdrücklich darauf hingewiesen. In diesem Falle gelten im jeweiligen Einzelfall die besonderen Nutzungsbedingungen.
</div>

View File

@ -4,70 +4,262 @@ import Prelude
import Hakyll
import qualified Data.List as List
import Data.Bool
import Data.List qualified as List
import Data.Maybe
import System.FilePath
import qualified System.FilePath.Glob as Glob
import qualified Data.Yaml as Yaml
import System.FilePath
import System.FilePath.Glob qualified as Glob
import Data.Yaml qualified as Yaml
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Map qualified as Map
import Control.Monad
import Control.Monad.Reader.Class
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Reader (Reader, runReader)
import Control.Applicative
import Data.Text.Lazy qualified as Lazy (Text)
import Data.Text.Lazy.IO qualified as LT
import Text.Megaparsec (Parsec, ParsecT)
import Text.Megaparsec qualified as MP
import Text.Megaparsec.Char qualified as MP
import Data.Text (Text)
import Data.Text qualified as T
import Control.Exception
import System.IO.Error
import Data.Void
import Network.URI
import System.Environment (lookupEnv)
config :: Configuration
config =
defaultConfiguration
{ destinationDirectory = "public"
, previewPort = 8008
}
stripPathPrefix :: FilePath -> Routes
routeAsFilePath :: (FilePath -> FilePath) -> Routes
routeAsFilePath f = customRoute $ f . toFilePath
stripPathPrefix :: FilePath -> (FilePath -> FilePath)
stripPathPrefix (splitDirectories -> prefix) =
customRoute $
joinPath . (\x -> fromMaybe x $ List.stripPrefix prefix x) . splitDirectories . toFilePath
joinPath . (\x -> fromMaybe x $ List.stripPrefix prefix x) . splitDirectories
handleIf :: Exception e => (e -> Bool) -> (e -> IO a) -> IO a -> IO a
handleIf predicate handler = handle $ \exc -> bool throwIO handler (predicate exc) exc
metadataShow :: [Item w] -> Compiler [Item w]
metadataShow = filterM $ \Item{itemIdentifier} -> maybe (True :: Bool) read <$> getMetadataField itemIdentifier "show"
metadataSort :: [Item w] -> Compiler [Item w]
metadataSort = sortOnM $ \Item{itemIdentifier} -> maybe (0 :: Integer) read <$> getMetadataField itemIdentifier "sort"
where
sortOnM :: forall m a b. (Monad m, Ord b) => (a -> m b) -> [a] -> m [a]
sortOnM f = fmap (map snd . List.sortOn fst) . mapM (\x -> (,x) <$> f x)
metadata :: [Item w] -> Compiler [Item w]
metadata = metadataShow >=> metadataSort
unwrapped :: Snapshot
unwrapped = "unwrapped"
main :: IO ()
main = hakyllWith config $ do
frontendManifest <-
preprocess $
Yaml.decodeFileThrow @_ @(Map String [FilePath]) "frontend/dist/.manifest.yaml"
main =
lookupEnv "LOCALHOST" >>= \((Nothing /=) -> localhost) -> hakyllWith config $ do
frontendManifest <-
preprocess $
Yaml.decodeFileThrow @_ @(Map String [FilePath]) "frontend/dist/.manifest.yaml"
let
frontendContext = jsContext <> cssContext
where
cssContext = listField "css" innerContext genCSSItems
where
innerContext = urlField "url"
genCSSItems = genManifestItems $ Glob.compile "**/*.css"
jsContext = listField "js" innerContext genCSSItems
where
innerContext = urlField "url"
genCSSItems = genManifestItems $ Glob.compile "**/*.js"
match "content/index.html" $ do
route $ stripPathPrefix "content"
genManifestItems :: Glob.Pattern -> Compiler [Item CopyFile]
genManifestItems p = do
let entryPoint = "main"
resources = filter (Glob.match p) $ frontendManifest Map.! entryPoint
forM resources $ load . fromFilePath . ("frontend/dist" </>) . dropDrive
let context =
defaultContext
<> jsContext
<> cssContext
netlifyRedirects <-
if localhost
then return []
else
preprocess . handleIf isDoesNotExistError (const $ return []) $
let pNetlify :: ParsecT Void Lazy.Text m [(FilePath, FilePath)]
pNetlify = catMaybes <$> MP.sepBy (MP.space *> pLine <* MP.hspace) pEOL <* MP.eof
where
pEOL :: ParsecT Void Lazy.Text m ()
pEOL = void . MP.label "linebreak" $ MP.eol
pLine :: ParsecT Void Lazy.Text m (Maybe (FilePath, FilePath))
pLine = MP.label "line" $ (mempty <$ pComment) <|> pRedirect <|> pure Nothing
pComment :: ParsecT Void Lazy.Text m ()
pComment = void $ MP.char '#' *> MP.label "comment" (MP.manyTill MP.anySingle $ MP.lookAhead MP.eol)
pRedirect :: ParsecT Void Lazy.Text m (Maybe (FilePath, FilePath))
pRedirect = do
fromRoute <- MP.label "fromRoute" $ MP.manyTill MP.anySingle MP.separatorChar
MP.hspace
toRoute <- MP.label "toRoute" $ MP.manyTill MP.anySingle MP.separatorChar
MP.hspace
redirectMode <- MP.label "mode" $ asum [MP.string "200", MP.string "301", MP.string "302"]
return $
if
| redirectMode == "200" -> Just (fromRoute, toRoute)
| otherwise -> Nothing
in either throwIO return =<< MP.runParserT pNetlify "static/_redirects" =<< LT.readFile "static/_redirects"
let
renderRoute r
| fromRoute : _ <- mapMaybe (matchNetlifyRedirect r) netlifyRedirects =
fromRoute
| otherwise =
r
where
matchNetlifyRedirect :: FilePath -> (FilePath, FilePath) -> Maybe FilePath
matchNetlifyRedirect r' (fromRoute, toRoute) = do
tokens <- MP.parseMaybe pToSpec toRoute
Right subst <- return $ runReader (MP.runParserT (pRoute tokens <* MP.eof) "" r') Map.empty
return . T.unpack $ Map.foldrWithKey doSubst (T.pack fromRoute) subst
where
pToSpec :: Parsec Void FilePath [Either FilePath String]
pToSpec =
MP.some $
Left <$> MP.someTill (MP.anySingleBut ':') (MP.lookAhead $ MP.eof <|> void (MP.single ':'))
<|> Right <$> (MP.char ':' *> MP.some MP.letterChar)
pRoute :: [Either FilePath String] -> ParsecT Void FilePath (Reader (Map String String)) (Map String String)
pRoute [] = MP.eof *> ask
pRoute (t : ts) = case t of
Left str -> MP.string str *> pRoute ts
Right p -> do
pVal <- asks $ Map.lookup p
case pVal of
Nothing -> do
mLength <- length <$> MP.getInput
asum . flip map [0 .. mLength] $ \l -> MP.try $ do
val <- MP.takeP (Just $ ':' : p) l
newSubst <- asks $ Map.insert p val
newSubst <$ local (const newSubst) (pRoute ts)
Just pVal' -> MP.string pVal' *> ask
cssContext = listField "css" innerContext genCSSItems
where
innerContext = urlField "url"
genCSSItems = genManifestItems $ Glob.compile "**/*.css"
jsContext = listField "js" innerContext genCSSItems
where
innerContext = urlField "url"
genCSSItems = genManifestItems $ Glob.compile "**/*.js"
doSubst :: String -> String -> Text -> Text
doSubst k s = T.intercalate (T.pack s) . T.splitOn (T.pack $ ':' : k)
normalizeUrls :: Item String -> Compiler (Item String)
normalizeUrls item = do
itemRoute <- getRoute $ itemIdentifier item
let relativizeUrls' x = case itemRoute of
Just r
| "/" `List.isPrefixOf` x && not ("//" `List.isPrefixOf` x) ->
toSiteRoot r ++ x
_other -> x
overPath f str = case parseURIReference str of
Nothing -> f str
Just uri@URI{uriPath} -> uriToString id uri{uriPath = f uriPath} mempty
return $ withUrls (relativizeUrls' . overPath renderRoute) <$> item
genManifestItems :: Glob.Pattern -> Compiler [Item CopyFile]
genManifestItems p = do
let entryPoint = "main"
resources = filter (Glob.match p) $ frontendManifest Map.! entryPoint
forM resources $ load . fromFilePath . ("frontend/dist" </>) . dropDrive
tags <- buildTags "content/**" $ fromCapture "tags/*.html"
compile $ do
getResourceBody
>>= loadAndApplyTemplate "templates/site-layout.html" context
>>= relativizeUrls
let
applySiteLayout = loadAndApplyTemplate "templates/site-layout.html" . (<> ctx')
where
ctx' =
mconcat
[ listField "tags-nav" defaultContext (metadata <=< mapM (uncurry renderTagNav) $ tagsMap tags)
, listField "special-nav" defaultContext $ metadata =<< mapM (flip loadSnapshot unwrapped) =<< getMatches (fromGlob "special/**")
, frontendContext
, defaultContext
]
renderTagNav tag' ids = do
tagItems' <- getMatches . fromGlob $ toFilePath (tagsMakeId tags tag') -<.> "*"
let
tagItem' = return $ Item (fromMaybe (tagsMakeId tags tag') $ listToMaybe tagItems') (mempty :: String)
match "frontend/dist/wp-*/**" $ do
route $ stripPathPrefix "frontend/dist"
navRoute = "/" <> tag' <> ".html"
compile copyFileCompiler
tagNavCtx =
mconcat
[ constField "tag" tag'
, field "title" . const $
fmap (fromMaybe tag') . runMaybeT . asum $
map (\itemId -> MaybeT $ getMetadataField itemId "title") tagItems'
, constField "route" navRoute
, listField "posts" (constField "tag" tag' <> constField "route" navRoute <> postContext) (metadata =<< mapM load ids)
]
match "templates/*" $ compile templateBodyCompiler
tagNavTemplate
| length ids > 1 = "templates/tag-nav.html"
| otherwise = "templates/tag-nav-singleton.html"
tagItem'
>>= loadAndApplyTemplate tagNavTemplate tagNavCtx
>>= normalizeUrls
postContext =
mconcat
[ field "identifier" (return . takeBaseName . toFilePath . itemIdentifier)
, defaultContext
]
specialContext = defaultContext
match "static/**" $ do
route $ stripPathPrefix "static"
compile copyFileCompiler
match "images/*" $ do
route idRoute
compile copyFileCompiler
match "content/**" $ do
compile $
pandocCompiler
>>= normalizeUrls
match "special/**" $ do
route . routeAsFilePath $ (-<.> "html") . stripPathPrefix "special"
compile $
pandocCompiler
>>= saveSnapshot unwrapped
>>= applySiteLayout specialContext
>>= normalizeUrls
forM_ (tagsMap tags) $ \(tag, fromList -> posts) ->
rulesExtraDependencies [tagsDependency tags] $ do
tagItems <- getMatches . fromGlob $ toFilePath (tagsMakeId tags tag) -<.> "*"
let tagItem = pandocCompiler <|> makeItem mempty
rule
| [] <- tagItems = create [tagsMakeId tags tag]
| otherwise = match (fromList tagItems)
rule $ do
route . routeAsFilePath $ (-<.> "html") . stripPathPrefix "tags"
compile $ do
let
ctx =
mconcat
[ listField "posts" postContext (metadataSort =<< loadAll posts)
, defaultContext
]
tagItem
>>= loadAndApplyTemplate "templates/tag.html" ctx
>>= applySiteLayout ctx
>>= normalizeUrls
match "frontend/dist/wp-*/**" $ do
route . routeAsFilePath $ stripPathPrefix "frontend/dist"
compile copyFileCompiler
match "templates/*" $ compile templateBodyCompiler
match "static/**" $ do
route . routeAsFilePath $ stripPathPrefix "static"
compile copyFileCompiler

View File

@ -1 +1,3 @@
/ /index.html 200
/:tag /:tag.html 200

3
tags/about.md Normal file
View File

@ -0,0 +1,3 @@
---
title: Über uns
---

4
tags/contact.md Normal file
View File

@ -0,0 +1,4 @@
---
title: Kontakt
sort: 9999
---

5
tags/index.md Normal file
View File

@ -0,0 +1,5 @@
---
title: Index
sort: -9999
show: "False"
---

3
tags/open-source.md Normal file
View File

@ -0,0 +1,3 @@
---
title: Open Source
---

3
tags/projects.md Normal file
View File

@ -0,0 +1,3 @@
---
title: Projekte
---

3
tags/services.md Normal file
View File

@ -0,0 +1,3 @@
---
title: Dienstleistungen
---

View File

@ -7,13 +7,41 @@
$for(css)$
<link rel="stylesheet" href="$url$">
$endfor$
<title>UniWorX Systems</title>
<title>UniWorX Systems$if(title)$ - $title$$endif$</title>
</head>
<body>
<header>
<nav class="navbar navbar-expand-md navbar-dark bg-primary">
<button class="navbar-toggler collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain">
<span class="custom-navbar-toggler-icon"></span>
</button>
<a class="navbar-brand" href="/">
UniWorX Systems
</a>
<div class="collapse navbar-collapse" id="navbarMain">
<ul class="navbar-nav">
$for(tags-nav)$
$body$
$endfor$
</ul>
</div>
</nav>
</header>
<main>
$body$
</main>
<footer class="text-center">
<nav>
<ul>
$for(special-nav)$
<li>
<a href="$url$$if(localhost)$.html$endif$">$title$</a>
</li>
$endfor$
</ul>
</nav>
</footer>
$for(js)$
<script src="$url$"></script>
$endfor$

View File

@ -0,0 +1,5 @@
<li class="nav-link">
<a class="nav-link" href="$route$">
$title$
</a>
</li>

13
templates/tag-nav.html Normal file
View File

@ -0,0 +1,13 @@
<li class="nav-link dropdown">
<a class="nav-link dropdown-toggle" href="$route$" data-bs-toggle="dropdown";>
$title$
</a>
<ul class="dropdown-menu dropdown-menu-dark bg-primary">
$for(posts)$
<li class="dropdown-item">
<a class="nav-link" href="$route$#$identifier$">$title$</a>
</li>
$endfor$
</ul>
</li>

5
templates/tag.html Normal file
View File

@ -0,0 +1,5 @@
$for(posts)$
<article id="$identifier$">
$body$
</article>
$endfor$