Compare commits

...

51 Commits

Author SHA1 Message Date
5152e4f4a9 fix: even more fixes, ugh 2023-03-31 10:43:52 +02:00
94cc181278 fix: add page numbers to direct quotes, oops 2023-03-31 10:28:17 +02:00
8d20bd105b feat: paragraph->textbf 2023-03-31 09:23:14 +02:00
117722250c fix: typo in fazit 2023-03-31 01:54:17 +02:00
fab6b215fc feat: spelling touchup interview protokoll 2023-03-31 01:49:20 +02:00
6652d99925 wrote stuff on anforderungstechnik 2023-03-31 01:45:15 +02:00
758a8ad419 feat: some stuff with anforderungen 2023-03-31 01:13:16 +02:00
731c03f447 feat: feedback mama nochmal 2023-03-31 00:41:21 +02:00
c40b18d8cf feat: feedback schwarzer erneut 2023-03-31 00:02:26 +02:00
4528ff1318 feat: feedback felix 2023-03-30 23:54:08 +02:00
faa1e09655 fix: image name 2023-03-30 20:13:17 +02:00
1f71dfb55f feat: umbrüche 2023-03-30 19:55:12 +02:00
6208a9c29c feat: schwarzer feedback 2023-03-30 19:50:45 +02:00
872c78079f feat: schwarzer feedback doctitle and highres images 2023-03-30 19:31:13 +02:00
4ee7b22db6 feat: probelesen 2023-03-30 18:59:27 +02:00
ce8b1ce5fa fix: main-branch bibliography links and page titles of typo3 docs refs 2023-03-30 14:08:43 +02:00
5b03fdbebc fix: block and pagebreaks 2023-03-30 08:57:33 +02:00
2a8951ccc1 --amend 2023-03-29 22:50:04 +02:00
f71dc2433b fix: page- and linebreaks 2023-03-29 22:49:46 +02:00
fc43ee2dae feat: feedback außer schlussteil 2023-03-29 21:59:19 +02:00
5aba8eb989 fix: digitizion 2023-03-29 21:22:17 +02:00
fc62425c6c feat: schlussteil anforderungsanalyse 2023-03-29 20:47:10 +02:00
eff6248883 feat: probelesen korrektur 2023-03-29 19:07:27 +02:00
c0d8984cf4 feat: jochen feedback 2023-03-29 14:22:01 +02:00
75d459193d feat: feedback schlussteil 2023-03-28 21:04:50 +02:00
92e34eec14 fix: bad page breaks 2023-03-28 17:51:50 +02:00
ee9e249154 feat: add signed-off selbststaendigkeitserklaerung 2023-03-28 16:08:58 +02:00
929f80d66b set datlastmod zi 30 march 2023-03-28 15:57:48 +02:00
0ad308b1db bump version 2023-03-28 15:57:22 +02:00
c5a544750e feat: feedback ergebnisse fazit 2023-03-28 15:57:11 +02:00
e92946cb2f feat: pflichtenheft as pdf 2023-03-27 22:10:18 +02:00
e38d48c264 fix: backslashes in bibliography 2023-03-27 20:51:37 +02:00
caa27488f6 feat: rename perf test filename 2023-03-27 19:39:37 +02:00
9abe58e56a feat: probelesen 2023-03-27 18:23:53 +02:00
df1d876e13 feat: remove braces at kostengünstig 2023-03-27 18:10:53 +02:00
e6d3794cc0 feat: graphes 2023-03-27 17:39:34 +02:00
ebc2a2d8b7 fix: retab 2023-03-27 17:09:34 +02:00
e9818c9607 fix: replace weinland mosel with ac-wm 2023-03-27 16:45:50 +02:00
6473a42146 feat: continuous table and image numbering 2023-03-27 16:40:08 +02:00
6416c4484c feat: add quantitative study 2023-03-27 15:03:20 +02:00
e2db47a588 feat: feeedback 2 2023-03-27 13:10:12 +02:00
00f5f28ed6 feat: modifikation pflichtenheft 2023-03-27 02:50:26 +02:00
8e3491491c feat: progress fazit 2023-03-27 02:48:01 +02:00
5425914ae1 feat: wrote ergebnisse integration 2023-03-27 02:10:21 +02:00
538a225a90 wording 2023-03-27 01:42:48 +02:00
671ade10eb feat: add legende schrift to ux flow diagrams 2023-03-27 01:39:10 +02:00
db7e0dd5ea feat: jap->jahresauswahlprobe 2023-03-27 01:38:58 +02:00
2819603046 feat: add empty fazit chapter 2023-03-27 01:28:29 +02:00
251d2d775e feat: wrote ausblick 2023-03-27 01:16:33 +02:00
b71f1ac274 feat: lotsa stuff and schlussteil 2023-03-27 00:16:07 +02:00
327b83a4a0 write for geschaeftsprozessdiagramme 2023-03-26 15:33:16 +02:00
41 changed files with 847 additions and 573 deletions

View File

@@ -9,4 +9,5 @@
\input{appendix/interview-protokoll}
\input{appendix/pflichtenheft}
\input{appendix/class-diagram}
\input{appendix/notizen-digitization}
\end{appendices}

View File

@@ -21,82 +21,72 @@
\paragraph*{Wie stellen Sie sich den Prozess des Einscannens der QR-Codes beim Entgegennehmen der Flaschen vor? Beschreiben Sie den Ablauf.}
- Paket kommt an
- Wird aufgemacht
- Ziehen qr code raus
- Haben entweder Handscanner oder handy und scannen den code ein
- system gibt an, welche \ac{ELN} aufgeklebt werden muss
- wein wird eingelagert
- Nehmen den QR-Code entgegen
- Haben entweder einen Handscanner oder ein Handy und scannen den Code ein
- System gibt an, welche \ac{ELN} aufgeklebt werden muss
- Wein wird eingelagert
Die \ac{ELN} muss im Verein mit der \ac{JAP} unique sein.
Die \ac{ELN} ist dann im Format {\ac{ELN}}-{Jahresauswahl\-probennummer}
z.b. 19-1 gesetzt. Das steht für \ac{ELN} 19, \ac{JAP} 1.
Auf Datenkbankebene unique.
Es wird bei 1 angefangen zu zählen.
Die \ac{ELN} muss unique sein.
Die \ac{ELN} könnte schlicht die von TYPO3 vergebene UID sein.
\paragraph*{Mit was soll dieser Code gescannt werden? Soll der Scanner in der Applikation eingebaut sein, oder soll das System auch mit Drittanbieter-Apps funktionieren?}
Smartphone ist am sinnvollsten, da feedback von Webseite
Backup-Funktion die \ac{ELN} händisch einzugeben. Das ginge dann auch mit einem Handscanner.
Smartphone ist am sinnvollsten, da Feedback von Webseite damit möglich ist.
Backup-Funktion, die \ac{ELN} händisch einzugeben. Das ginge dann auch mit einem Handscanner.
\paragraph*{Welche Fallbacks soll es geben, sollte ein Code nicht scanbar sein? Z.B.: Der Code- Inhalt in Text unter dem Code, der auch von Hand eintippbar sei.}
\ac{ELN} händisch im typo3 backend suchen und bearbeiten.\\
Die \ac{ELN} muss also auch unter dem qr code stehen, aber das ist für uns out-of-scope.
Das ist nicht der QR-Code, den wir generieren, sondern der, der beim Einlagern auf die Flasche geklebt wird. Diese lässt
Weinland Mosel im Voraus drucken.
\paragraph*{Welche Fallbacks soll es geben, sollte ein Code nicht scanbar sein? Z.B.: Den Code-Inhalt in Text unter dem Code, der auch von Hand eintippbar sei.}
Die \ac{ELN} muss auch unter dem QR-Code stehen.
\paragraph*{Gegen welche Missbrauchsszenarien sollte der QR-Code geschützt sein? Sollte ggf. ein Passwort nach dem Einscannen verlangt werden? ->Diskurs über versch. Authentifizierungsmethoden und Abwägung über Aufwand der daruch entsteht.}
Verwenden wir einen API-Key. Übermittlung via POST. Eingetragen in qr-code app.
Es gibt einen api key. Der soll im backend änderbar sein. Gehashed mit typo3 argoni2i.
Gespeichert in der Datenbank.
\paragraph*{Gegen welche Missbrauchsszenarien sollte der QR-Code geschützt sein? Sollte ggf. ein Passwort nach dem Einscannen verlangt werden? ->Diskurs über versch. Authentifizierungsmethoden und Abwägung über Aufwand der dadurch entsteht.}
Mitarbeiter authentifizieren sich mit einem Frontend-Nutzer. Dieser Nutzer ist Teil einer Mitarbeiter-Nutzergruppe.
\paragraph*{Gibt es im Lager Wlan?}
Out of scope
Out of scope.
\paragraph*{Wie wollen Sie Weinanmeldungen zwischen Jahresauswahlproben im Frontend trennen? Wichtig: Aktuelle Proben nach Anmeldeschluss sollten immer noch sichtbar sein und alte Proben ggf. gar nicht mehr angezeigt werden.}
Es gibt eine Liste mit \acp{JAP}.
Es gibt eine Liste mit Jahresauswahlproben.
Da werden verschiedene aufgelistet.
Backenduser können die Anmeldung (Weine an \acp{JAP} anmelden) an- und abschalten.
Backend-User können die Anmeldung (Weine an Jahresauswahlproben anmelden) an- und abschalten.
Vergangene Proben werden nicht angezeigt.
Die Probe gilt als vergangen, wenn die Proben probiert wurden.
Die Anmeldemöglichkeit und \enquote{Probe ist vorbei}-Feststellung im Anmeldetool ist ein Clone vom „active until“ im „access-„panel. Mit Dateselector.
\paragraph*{Was soll der Kunde beim Versand selbst machen?}
Wenn weinland-mosel-mitglied:
Ggf account erstellen mit Mitgliedsnummer <schon implememtiert> <muss händisch von WM freigeschalten werden>
In account einloggen
Wenn Weinland-Mosel-Mitglied:
Ggf Account erstellen mit Mitgliedsnummer <schon implememtiert> <muss händisch von WM freigeschalten werden>.
In Account einloggen.
Wenn Nichtmitglied:
Ggf account erstellen ohne Mitgliedsnummer <muss händisch freigeschalten werden>
Ggf. Account erstellen ohne Mitgliedsnummer <muss händisch freigeschalten werden>
Eine \ac{JAP} auswählen
Eine Jahresauswahlprobe auswählen.
Einen Wein anmelden, Webform zu Weindaten ausfüllen.
PDF downloaden, ausdrucken im Paket dem Wein beilegen.
Das PDF muss Daten zum Wein beinhalten, und den qr-code mit der \ac{ELN}. (zur Zuordnung)
Nummernschwund, falls Weine gelöscht werden, ist kein Problem. 196-1 darf auf 194-1 folgen.
Das PDF muss Daten zum Wein beinhalten und den QR-Code mit der \ac{ELN}. (zur Zuordnung)
Nummernschwund, falls Weine gelöscht werden, ist kein Problem.
Adressierung wird selbst gemacht.
Frankierung auch.
\paragraph*{In welcher Form sollten Mitarbeiter die ausstehenden und eingegangenen Weine sehen? Reicht eine einfache Liste, oder sind Export- und Filtermöglichkeiten erwünscht? Wenn ja: Welche Filter (auch Sortierungen)? Welche Exportformate?}
- CSV soll ausgebbar sein
- Filter nicht notwendig, aber probenspezifisch
- CSV soll ausgebbar sein.
- Filter nicht notwendig, aber probenspezifisch.
\paragraph*{Wenn nun ein Wein als “eingegangen” vermerkt ist, sollte ein Mitarbeiter das rückgängig machen können? Sollte ein Mitarbeiter Weine löschen können? Wenn eines der beiden ja: Einzeln, oder als Bulk-Action? (Bulk-Actions sind teuer/aufwändig umzusetzen)}
- Was TYPO3 by-default kann, nichts eigenes bauen
- Was TYPO3 by-default kann, nichts eigenes bauen.
\paragraph*{Welche Informationen soll der Kunde über seine Sendunge(n) sehen?}
- ob sie eingegangen ist, mit emailbenachrichtigung
- Ob sie eingegangen ist, mit Emailbenachrichtigung.
\paragraph*{Soll auch ein Kunde in der Lage sein, seine eigene Weinsendung(en) aus dem System zu löschen oder zu verändern? (Eventuell vertippt man sich) Wenn ja, bis wann? Bis zur Eingangsbestätigung?}
Nach Einreichung (nicht Eingang bei WM) nicht mehr veränderbar und auch nicht löschbar.
\paragraph*{Die \ac{ELN} ist eine inkrementell erhöhte Ganzzahl. Ist der tatsächliche Wert dieser wichtig, oder ist es lediglich wichtig, dass sie eindeutig ist? Der einfachste/günstigste Weg wäre es, sie in der Datenbank als “auto\_increment” zu deklarieren. Dann hätte man niemals, auch über x Auswahlproben hinweggehend, die selbe \ac{ELN} zwei mal. Das verkürzt und vereinfacht die Entwicklung, den entstehenden Code und die Nutzererfahrung auf Seiten von Weinland Mosel.}
- siehe oben
\paragraph*{Die \ac{ELN} ist eine inkrementell erhöhte Ganzzahl. Ist der tatsächliche Wert dieser wichtig, oder ist es lediglich wichtig, dass sie eindeutig ist? Der einfachste/günstigste Weg wäre es, sie in der Datenbank als “auto\_increment” zu deklarieren. Dann hätte man niemals, auch über x Auswahlproben hinweggehend, die selbe \ac{ELN} zwei mal. Das verkürzt und vereinfacht die Entwicklung, den entstehenden Code und die Nutzererfahrung auf Seiten von \ac{WM}.}
- Siehe oben.
\paragraph*{Weiteres}
Es soll einen Single-View für Weine geben, der anhand einer \ac{ELN} aufrufbar ist. Hier werden bekannte Details gezeigt.
\paragraph*{Zum Formular, das Winzer ausfüllen:}
Das Formular besteht zwei Schritten:
Schritt 1: Daten ausfüllen
Schritt 2: Zusammenfassung anzeigen entweder zurück, weiter bearbeiten, oder submit \enquote{wein verbindlich anmelden}
Schritt 1: Daten ausfüllen.
Schritt 2: Zusammenfassung anzeigen entweder zurück, weiter bearbeiten, oder submit \enquote{Wein verbindlich anmelden}.

View File

@@ -8,9 +8,6 @@ Mit was soll dieser Code gescannt werden? Soll der Scanner in der Applikation ei
Drittanbieter-Apps funktionieren?
\\
\\
Von welchem Endgerät wird gescannt?
\\
\\
Welche Fallbacks soll es geben, sollte ein Code nicht scanbar sein? Z.B.: Der Code-Inhalt in Text unter dem Code,
der auch von Hand eintippbar sei.
\\
@@ -50,5 +47,4 @@ Die \ac{ELN} ist eine inkrementell erhöhte Ganzzahl.
Ist der tatsächliche Wert dieser wichtig, oder ist es lediglich wichtig, dass sie
eindeutig ist? Der einfachste/günstigste Weg wäre es, sie in der Datenbank als \enquote{auto\_increment} zu deklarieren.
Dann hätte man niemals, auch über x Auswahlproben hinweggehend, die selbe \ac{ELN} zwei mal.
Das verkürzt und vereinfacht die Entwicklung, den entstehenden Code, und die Nutzererfahrung auf Seiten von Weinland Mosel.
Das verkürzt und vereinfacht die Entwicklung, den entstehenden Code, und die Nutzererfahrung auf Seiten von \ac{WM}.

View File

@@ -0,0 +1,3 @@
\chapter{Notizen: Digitization des Weinanmelde-Formulares}
\label{chap:anhang-notizen-digitization}
\includepdf[pages=-]{images/notizen-digitization.pdf}

View File

@@ -1,48 +1,47 @@
\chapter{Pflichtenheft}
\label{chap:anhang-pflichtenheft}
\begin{table}[htbp]
\centering
\begin{tabular}{|l|l|}
\hline
\textbf{Art der Anforderung} & \textbf{Beschreibung}\\
\hline
\hline
Constraint & Einbau in brown-field TYPO3\\\hdashline
Constraint & Kunden-UI im Frontend\\\hdashline
\ac{FA} & \makecell[l]{Mitglieder bei \ac{WM} können sich einen\\Nutzeraccount erstellen}\\\hdashline
\ac{FA} & \makecell[l]{Nicht-Mitglieder bei \ac{WM} können sich\\einen Nutzeraccount erstellen}\\\hdashline
\ac{FA} & \makecell[l]{Angemeldete Nutzer sehen eine Übersicht\\aller aktiven \acp{JAP}}\\\hdashline
\ac{FA} & \makecell[l]{Angemeldete Nutzer können mehrere Weine\\bei aktiven \acp{JAP} anmelden}\\\hdashline
\ac{FA} & \makecell[l]{Eine Weinanmeldung frägt Weindaten mit\\einem Webform ab}\\\hdashline
\ac{FA} & \makecell[l]{Vor Abschluss des Formulars wird eine\\Übersicht der Daten gezeigt}\\\hdashline
\ac{FA} & \makecell[l]{Das Formular lässt sich mit einem\\\enquote{Jetzt verbindlich anmelden}-Button abschicken}\\\hdashline
\ac{FA} & \makecell[l]{Angemeldete Nutzer sehen angemeldete\\Weine für \acp{JAP} inklusive Versandstatus}\\\hdashline
\ac{FA} & \makecell[l]{Für angemeldete Weine lassen sich\\PDF-Dateien herunterladen, die die \ac{ELN} als\\Barcode und eine Beschreibung des Weines\\enthalten}\\\hdashline
\ac{NFA} & \makecell[l]{Das Formular mit Weindaten und dem\\QR-Code lässt sich auch direkt nach\\ Anmeldung eines Weines herunterladen}\\\hdashline
\ac{FA} & \makecell[l]{Mitarbeiter von \ac{WM} können eingetragene\\Weine als TYPO3-Objekte manipulieren}\\\hdashline
\ac{FA} & \makecell[l]{Mitarbeiter von \ac{WM} können \acp{JAP}\\im Backend zeitgesteuert für Anmeldungen\\freigeben}\\\hdashline
\ac{FA} & \makecell[l]{Mitarbeiter von \ac{WM} können \acp{JAP}\\im Backend zeitgesteuert für die Einsicht\\freigeben}\\\hdashline
\ac{FA} & \makecell[l]{Mitarbeiter von \ac{WM} können einen\\gesicherten API-Link anhand einer \ac{ELN} aufrufen\\um einen Wein als \enquote{eingegangen} zu markieren}\\\hdashline
\ac{FA} & \makecell[l]{Wird ein Wein via dem QR-Code als \enquote{eingegangen}\\markiert, bekommt der Winzer eine Email}\\\hdashline
\ac{NFA} & \makecell[l]{Der API-Link ist mittels eines\\API-Keys gesichert}\\
\hline
\end{tabular}
\end{table}
\begin{table}[htbp]
\centering
\begin{tabular}{|l|l|}
\hline
\textbf{Art der Anforderung} & \textbf{Beschreibung}\\
\hline
\hline
\ac{NFA} & \makecell[l]{Der API-Key wird in POST-Daten übergeben}\\\hdashline
\ac{NFA} & \makecell[l]{Die \ac{ELN} wird url-kodiert übergeben}\\\hdashline
\ac{FA} & \makecell[l]{Mitarbeiter von \ac{WM} können\\den API-Key im Backend verändern}\\\hdashline
\ac{NFA} & \makecell[l]{Nach Aufruf eines API-Links wird\\gezeigt, weilcher Wein gescannt wurde}\\\hdashline
\ac{FA} & \makecell[l]{Es gibt einen Single-View für\\Weine, der über eine \ac{ELN} in der URL erreichbar ist}\\\hdashline
\ac{NFA} & \makecell[l]{Der Wein-Single-View zeigt bekannte Weindaten}\\\hdashline
\ac{FA} & \makecell[l]{Mitarbeiter von \ac{WM} können Weineintragungen\\je nach \ac{JAP} als CSV exportieren}\\
\hline
\end{tabular}
\end{table}
\includepdf[pages=-]{images/pflichtenheft.pdf}
%
%\begin{table}[htbp]
% \centering
% \begin{tabular}{|l|l|}
% \hline
% \textbf{Art der Anforderung} & \textbf{Beschreibung}\\
% \hline
% \hline
% Randbedingung & Einbau in brown-field TYPO3\\\hdashline
% Randbedingung & Kunden-UI im Frontend\\\hdashline
% \ac{FA} & \makecell[l]{Mitglieder bei \ac{WM} können sich einen\\Nutzeraccount erstellen}\\\hdashline
% \ac{FA} & \makecell[l]{Nichtmitglieder bei \ac{WM} können sich\\einen Nutzeraccount erstellen}\\\hdashline
% \ac{FA} & \makecell[l]{Angemeldete Nutzer sehen eine Übersicht\\aller aktiven Jahresauswahlproben}\\\hdashline
% \ac{FA} & \makecell[l]{Angemeldete Nutzer können mehrere Weine\\bei aktiven Jahresauswahlproben anmelden}\\\hdashline
% \ac{FA} & \makecell[l]{Eine Weinanmeldung frägt Weindaten mit\\einem Webform ab}\\\hdashline
% \ac{FA} & \makecell[l]{Vor Abschluss des Formulars wird eine\\Übersicht der Daten gezeigt}\\\hdashline
% \ac{FA} & \makecell[l]{Das Formular lässt sich mit einem\\\enquote{Jetzt verbindlich anmelden}-Button abschicken}\\\hdashline
% \ac{FA} & \makecell[l]{Angemeldete Nutzer sehen angemeldete\\Weine für Jahresauswahlproben inklusive Versandstatus}\\\hdashline
% \ac{FA} & \makecell[l]{Für angemeldete Weine lassen sich\\PDF-Dateien herunterladen, die die \ac{ELN} als\\Barcode und eine Beschreibung des Weines\\enthalten}\\\hdashline
% \ac{NFA} & \makecell[l]{Das Formular mit Weindaten und dem\\QR-Code lässt sich auch direkt nach\\ Anmeldung eines Weines herunterladen}\\\hdashline
% \ac{FA} & \makecell[l]{Mitarbeiter von \ac{WM} können eingetragene\\Weine als TYPO3-Objekte manipulieren}\\\hdashline
% \ac{FA} & \makecell[l]{Mitarbeiter von \ac{WM} können Jahresauswahlproben\\im Backend zeitgesteuert für Anmeldungen\\freigeben}\\\hdashline
% \ac{FA} & \makecell[l]{Mitarbeiter von \ac{WM} können Jahresauswahlproben\\im Backend zeitgesteuert für die Einsicht\\freigeben}\\\hdashline
% \ac{FA} & \makecell[l]{Mitarbeiter von \ac{WM} können einen\\gesicherten API-Link anhand einer \ac{ELN} aufrufen\\um einen Wein als \enquote{eingegangen} zu markieren}\\\hdashline
% \ac{FA} & \makecell[l]{Wird ein Wein via dem QR-Code als \enquote{eingegangen}\\markiert, bekommt das Weingut eine Email}\\\hdashline
% \ac{NFA} & \makecell[l]{Der API-Link ist mittels der TYPO3-Frontend-Nutzer\\Authentifizierung gesichert}\\
% \hline
% \end{tabular}
%\end{table}
%\begin{table}[htbp]
% \centering
% \begin{tabular}{|l|l|}
% \hline
% \textbf{Art der Anforderung} & \textbf{Beschreibung}\\
% \hline
% \hline
% \ac{NFA} & \makecell[l]{Die \ac{ELN} wird beim Einscannen\\von QR-Codes Url-kodiert übergeben}\\\hdashline
% \ac{NFA} & \makecell[l]{Nach Aufruf eines API-Links wird\\gezeigt, weilcher Wein gescannt wurde}\\\hdashline
% \ac{FA} & \makecell[l]{Es gibt einen Single-View für\\Weine, der über eine \ac{ELN} in der URL erreichbar ist}\\\hdashline
% \ac{NFA} & \makecell[l]{Der Wein-Single-View zeigt bekannte Weindaten}\\\hdashline
% \ac{FA} & \makecell[l]{Mitarbeiter von \ac{WM} können Weineintragungen\\je nach Jahresauswahlprobe als CSV exportieren}\\
% \hline
% \end{tabular}
%\end{table}

View File

@@ -8,4 +8,4 @@
\input{chapters/anforderungserfassung}
\input{chapters/konzeption-entwicklung}
\input{chapters/ergebnisse}
\input{chapters/ausblick}
\input{chapters/fazit}

View File

@@ -1,36 +1,37 @@
\chapter{Anforderungserfassung}
\label{chap:anforderungserfassung}
Obwohl bereits ein grober Anriss des Zielsystems bekannt ist, ist es unabdinglich eine Anforderungsanalyse durchzuführen,
dies um Details auszuarbeiten \cite{bib:christoph-ebert-vorwort-systematisches-re}.
um Details auszuarbeiten \cite{bib:christoph-ebert-systematisches-re}.
Hierbei ist es wichtig, kein exzessives Pflichtenheft aufzubauen, denn letztendlich zählt nur, was dem Kunden geliefert wird.
Nicht, wie viele gar nicht benötigte Anforderungen umgesetzt wurden.
\enquote{\textit{Zu viele oder falsche Anforderungen ruinieren Budgets, Termine und die Qualität.}}
\cite{bib:christoph-ebert-vorwort-systematisches-re}.
\quotecite{Zu viele oder falsche Anforderungen ruinieren Budgets, Termine und die Qualität.}
\cite[S. viii]{bib:christoph-ebert-systematisches-re}.
Die Anforderungen eines Produktes sind in drei Kategorien einzuteilen: \acp{FA}, \acp{NFA}
und Constraints \cite{bib:heinemann-vorlesung-re}.
Wie oben erwähnt, sind bereits die Constraints und einige funktionale und nichtfunktionale Anforderungen bekannt. Diese sind:
und Randbedingungen \cite{bib:heinemann-vorlesung-re}.
Wie oben erwähnt, sind bereits die Randbedingungen und einige funktionale und nichtfunktionale Anforderungen bekannt. Diese sind:
\begin{table}[htbp]
\centering
\begin{tabular}{|l|l|}
\hline
\textbf{Art der Anforderung} & \textbf{Beschreibung}\\
\textbf{Art der Anforderung} & \textbf{Anforderungsbeschreibung}\\
\hline
\hline
Constraint & Einbau in brown-field TYPO3\\
\ac{NFA} & \makecell[l]{Angaben zum Weingut des Weines\\sollen aus dem Accountdatensatz anstatt\\aus dem Web-Formular kommen.}\\
\hdashline
Constraint & Mitarbeiter-UI in TYPO3-Backend\\
\ac{NFA} & \makecell[l]{Aus dem Papierformular soll ein\\Web-Formular werden.}\\
\hdashline
Constraint & Nutzer-UI im Frontend\\
\ac{FA} & \makecell[l]{Beim Erstellen einer Weinteilnahme\\soll ein QR-Code als PDF generiert werden,\\der den Wein identifiziert.}\\
\hdashline
\ac{NFA} & \makecell[l]{Aus dem Papierformular soll ein\\Webformular werden}\\
\ac{FA} & \makecell[l]{Durch scannen des QR-Codes auf dem\\mit einer Weinteilnahme erstellten PDFs soll\\dem Wein der Status \enquote{eingegangen}\\ zugewiesen werden.}\\
\hdashline
\ac{NFA} & \makecell[l]{Angaben zum Weingut des Weines\\sollen aus dem Accountdatensatz anstatt\\aus dem Webform kommen}\\
Randbedingung & Einbau in Brown-Field TYPO3\\
\hdashline
\ac{NFA} & \makecell[l]{Registrierte Weinteilnahmen\\bestehen aus einem Wein und einem Zustand\\(Ausstehend,Eingegangen,Abgelehnt).}\\
Randbedingung & Mitarbeiter-UI in TYPO3-Backend\\
\hdashline
\ac{FA} & \makecell[l]{Beim Erstellen einer Weinteilnahme\\soll ein QR-Code als PDF generiert werden,\\der den Wein identifiziert}\\
Randbedingung & Nutzer-UI im Frontend\\
\hdashline
\ac{NFA} & \makecell[l]{Registrierte Weinteilnahmen\\bestehen aus einem Wein und einem Zustand\\(ausstehend,eingegangen,abgelehnt).}\\
\hdashline
\ac{FA} & \makecell[l]{Durch scannen des QR-Codes auf dem\\mit einer Weinteilnahme erstellten PDFs soll\\dem Wein der Status \enquote{Eingegangen}\\ zugewiesen werden}\\
\hline
\end{tabular}
\caption{Initial bekannte Anforderungen}
@@ -42,13 +43,13 @@ Um nähere Anforderungen zu ermitteln, werden die Befragungstechniken \enquote{I
\section{Interview mit Product Owner}
Zunächst wird ein Interview mit dem \ac{PO} geführt. Ziel dieses Interviews ist
es, konkrete Fragen zu Anforderungen zu beantworten und somit konkrete Anforderungen zu formulieren.
Aufgrund der individuellen Gesprächsführung wurde sich für ein \enquote{Teil-standardisiertes Interview}
entschieden. Bei einem Teil-standardisiertem Interview gibt es vordefinierte Fragen,
es, konkrete Fragen zu Anforderungen zu klären und somit klare Anforderungen zu formulieren.
Aufgrund der individuellen Gesprächsführung wurde sich für ein \enquote{teil-standardisiertes Interview}
entschieden. Bei einem teil-standardisiertem Interview gibt es vordefinierte Fragen,
aber auch Freiraum für Improvisation und Persönlichkeit.
Für ein gutes Interview ist gute Vorbereitung unabdinglich. Daher wurden bereits sämtliche wichtigen Fragen
Für ein gutes Interview ist Vorbereitung wichtig. Daher wurden bereits sämtliche wichtigen Fragen
in einem Fragebogen festgehalten. Dieser Interview-Fragebogen liegt in \fullref{chap:anhang-interview-fragebogen} anbei.
Ebenso ist Vorbereitung auf Seiten des Interviewteilnehmers wichtig, weshalb das Interview einen Tag zuvor angesprochen wurde.
Ebenso ist Vorbereitung auf Seiten des Interview-Teilnehmers wichtig, weshalb das Interview einen Tag zuvor angesprochen wurde.
Um möglichst objektive und unvorbeeinflusste Antworten zu gewährleisten wird darauf geachtet,
keine Suggestivfragen zu stellen
\cite{bib:kleine-re-fibel}.
@@ -56,69 +57,91 @@ keine Suggestivfragen zu stellen
\section{Online-Fragebögen für Stakeholder}
Um Fragebögen für Stakeholder formulieren zu können, muss zunächst bekannt sein, wer die Stakeholder sind.
\quotecite{Ein Stakeholder eines Systems ist eine Person oder Organisation, welche (direkt oder indirekt)
Einfluss auf die Anforderungen des betrachteten Systems hat.} \cite{bib:basiswissen-re}.
\break{}Einfluss auf die Anforderungen des betrachteten Systems hat.}
\break\cite[S. 9]{bib:kleine-re-fibel}.
Daraus ergeben sich die Stakeholdergruppen: \enquote{Mitarbeiter \ac{WM}} und \enquote{teilnehmende Weingüter}.
Jede dieser Stakeholdergruppen sieht das System aus einer anderen Perspektive \cite{bib:kleine-re-fibel}.
Jede dieser Stakeholdergruppen sieht das System aus einer anderen Perspektive
\break\cite{bib:kleine-re-fibel}.
Daher ist es wichtig, Einblicke und Bedürfnisse aller Stakeholdergruppen einzuholen
und die individuellen Perspektiven und Bedürfnisse dieser beim Entwurf der Fragebögen zu berücksichtigen.
Ebenso ist es wichtig, die wichtigsten Fragen am Anfang zu stellen, da Formulare nicht immer vollständig ausgefüllt werden
Ebenso ist es wichtig, die relevantesten Fragen am Anfang zu stellen, da Formulare nicht immer vollständig ausgefüllt werden
\cite{bib:kleine-re-fibel}. Somit sind auch bei einem nur teilweise ausgefüllten Fragebogen die wichtigsten
Fragen beantwortet.
Sämtliche Fragen an die Stakeholdergruppe \enquote{Mitarbeiter \ac{WM}} wurden bereits im Interview mit dem \ac{PO}
beantwortet und als Anforderungen festgehalten. Der \ac{PO} repräsentiert in diesem Falle
die Stakeholdergruppe \enquote{Mitarbeiter \ac{WM}} und steht seit geraumer Zeit mit \ac{WM} im
persönlichen, engen Austausch. Daher gibt es keine offenen Fragen, die diese Stakeholdergruppe
die Stakeholdergruppe \enquote{Mitarbeiter \ac{WM}} und steht seit geraumer Zeit mit \ac{WM} in
persönlichem, engen Austausch. Daher gibt es keine offenen Fragen, die diese Stakeholdergruppe
beantworten könnte. Somit fällt ein Onlinefragebogen für die Stakeholdergruppe \enquote{Mitarbeiter \ac{WM}} weg.
Der Fragebogen der Stakeholdergruppe \enquote{teilnehmende Weingüter} liegt im Anhang unter
\fullref{chap:anhang-fragebogen-extern} bei.
Um den Aufwand und somit die Hemmschwelle des Ausfüllens
eines solchen Online-Fragebogens zu minimieren, gibt es lediglich sechs Ankreuz-Fragen
zuzüglich einem optionalen Freitextfeld, um sonstige Wünsche zum Ausdruck zu bringen.
Eine Anmeldung über Google ist nicht erforderlich.
Der Link zu diesem Online-Fragebogen wurde \ac{WM} mit der Bitte um Weiterleitung an
eines solchen Online-Fragebogens zu minimieren, werden lediglich sechs quantitative Fragen
zuzüglich einem optionalen Freitextfeld, um sonstige Wünsche zum Ausdruck zu bringen, gestellt.
Eine Anmeldung über Google für Google-Forms ist nicht erforderlich.
Der Link zu diesem Online-Fragebogen wurde \ac{WM} mit der Bitte um Weitergabe an
die Probenteilnehmer übergeben.
\section{Ergebnisse}
\section{Erkenntnisse}
Aus dem Interview mit dem \ac{PO} ergibt sich ein Pflichtenheft.
Das Pflichtenheft und das Protokoll zum Interview sind im Anhang unter je
\fullref{chap:anhang-pflichtenheft} und \fullref{chap:anhang-interview-protokoll} zu finden.
Ergebnis dieses Interviews sind zahlreiche Anforderungen und Ideen. Eine der wichtigsten Ideen stellt das
Ergebnisse dieses Interviews sind zahlreiche Anforderungen und Ideen. Eine der wichtigen Erkenntnisse stellt das
projektbezogene, wöchentliche Statusmeeting dar: Jeden Donnerstag soll um 9:30 Uhr der aktuelle Stand
des Projektes vorgestellt, diskutiert und Rücksprache gehalten werden.
Die wichtigsten Erkenntnisse des Interviews sind:
des Projektes dem \ac{PO} vorgestellt und mit ihm diskutiert und Rücksprache gehalten werden. Ziel dessen ist unter anderem
die pragmatische Korrektheit laufend zu überprüfen und ggf. Anforderungen zu überarbeiten.
Diese Idee wurde unmittelbar nach Beendigung des Interviews vorgeschlagen und entzieht sich somit dem Transkript.
\clearpage
Weitere wichtige Erkenntnisse dieses Interviews sind:
\begin{description}
\item[Endgerät für Scanning und Scanneranwendung]\hfill\\
Gescannt wird von Mobiltelefonen mit einer QR-Code-App wie QRBot.
QRBot ermöglicht es Nutzern für jeden aufgerufenen QR-Code eine Vorlagen-URL aufzurufen,
um den gescannten Wert als Teil der Url, z.B. als Get-Parameter, zu übergeben \cite{bib:qrbot}.
um den gescannten Wert als Teil der URL zu übergeben \cite{bib:qrbot}.
Das ist prädestiniert für API-ähnliche Webseitenaufrufe, um Weine einzuchecken.
\item[Trennung von Weinen nach \acp{JAP} im Frontend]\hfill\\
Da es $n$ \acp{JAP} gibt und Weine immer genau einer \ac{JAP} zugeordnet sein müssen, macht es wenig
\item[Trennung von Weinen nach Jahresauswahlproben im Frontend]\hfill\\
Da es $n$ Jahresauswahlproben gibt und Weine immer genau einer Jahresauswahlprobe zugeordnet sein müssen, macht es wenig
Sinn alle Weine eines Nutzers auf einmal anzuzeigen. So ist es eine Anforderung, dass die
Weinansicht in zwei Ebenen unterteilt ist: Die erste Ebene soll eine Auflistung aller \ac{JAP} sein
und in der Einzelansicht der \acp{JAP} sollen alle Weine aufgelistet sein, die dieser \ac{JAP} angehören.
Weinansicht in zwei Ebenen unterteilt ist: Die erste Ebene soll eine Auflistung aller Jahresauswahlproben sein
und in der Einzelansicht der Jahresauswahlproben sollen alle Weine aufgelistet sein, die dieser Jahresauswahlprobe angehören.
Diese Weine sind ebenso anklickbar und führen zu einer Einzelansicht der Weine.
\item[Genaue Nutzerführung für Teilnehmer]\hfill\\
Die exakten Schritte, die ein Teilnehmer tätigen muss, um verschiedene Prozess zu durchlaufen.
Diese Prozesse sind detailliert in \fullref{chap:umsetzung} beschrieben.
\item[Nutzerführung für \ac{WM}-Angestellte]\hfill\\
Gescanne QR-Codes von Weinen sollen den Wein als eingegangen markieren und anschließend dem
Mitarbeiter zeigen, welcher Wein eingechecked wurde. Somit dient das Scannen eines Codes ebenso zur
Mitarbeiter zeigen, welcher Wein eingecheckt wurde. Somit dient das Scannen eines Codes ebenso zur
Einsicht der Details der gelagerten Flaschen.
Es soll ein Backendmodul \cite{bib:typo3-docs-modules} geben, das für den Export von CSV-Daten zuständig ist.
Sonstige Aktionen sind im TYPO3-Backend mit nativen Werkzeugen erreichbar.
\item[Verschiedene Web-Ansichten]\hfill\\
\item[Verschiedene Web-Ansichten]\hfill
\begin{itemize}
\item Jahreauswahlproben-ListView
\item Jahreauswahlproben-SingleView (Hier sind u.a. Weine gelistet)
\item Jahresauswahlproben-Listenansicht
\item Jahresauswahlproben-Detailansicht
\item Wein-Registrierungsformular
\item PDF-Url für Versandbriefe
\item PDF-URL für Versandbriefe
\item Registrierungsseite mit mehreren Schritten
\item Mitarbeiter-Seite für gescannte QR-Codes
\item Mitarbeiterseite für gescannte QR-Codes
\item Listen- und Detailansicht der Jahresauswahlproben im CSV-Exporter im Backend
\end{itemize}
\end{description}
Der Online-Fragebogen für teilnehmende Weingüter wurde über einen Monat hinweg nicht beantwortet, insofern
gibt es keine Ergebnisse zu präsentieren.
gibt es keine Bedürfnisse dieser Herkunft zu präsentieren.
\\
\\
Aus der Anforderugserfassung ergibt sich als Pendant zu \enpointy{\textit{\ref{fig:geschaeftsprozess-vorher} Geschäftsprozess Jahresauswahlprobe: vor der Digitalisierung}} % Der Name hat linebreaks drin, also geht fullref nicht gut...
der gewünschte Geschäftsprozess der Jahresauswahlprobe nach Fertigstellung dieses Projektes.
Hierbei ist es wichtig, die Schnittstelle zwischen den gleichbleibenden Arbeitsschritten und den zu digitalisierenden
Arbeitsschritten zu beachten. Diese Schnittstelle sollte unverändert bleiben,
um eine nahtlose Integration in den restlichen, bestehenden Workflow von \ac{WM} zu gewährleisten.
Diese Schnittstelle stellt eine Excel-Tabelle dar. Zuvor wurde diese Excel-Tabelle von Hand, aus den
Anmeldeformularen, erstellt. Nach Fertigstellung dieses Projektes soll diese Tabelle in Form
von CSV-Daten aus dem Redaktionssystem exportiert werden können. Diese können Mitarbeiter von \ac{WM} in Excel
importieren und in kommenden Planungsschritten der Jahresauswahlprobe ohne Umstellung weiter verwenden.
Das ist wichtig, da solche Umstellungen, ohne nennenswerte Verbesserungen des restlichen, von dieser
Ausarbeitung unberührten Workflows, Zeit kosten, ohne Vorteile zu erbringen.
Dieser Zeitverlust würde den durch die Digitalisierung erzielten Vorteil schmälern.
\begin{nicepic}
\includegraphics[width=1\textwidth]{images/geschäftsprozess-nachher.png}
\captionof{figure}{Geschäftsprozess Jahresauswahlprobe: nach der Digitalisierung, Quelle: Eigene Darstellung}
\label{fig:geschaeftsprozess-nachher}
\end{nicepic}

View File

@@ -1,2 +0,0 @@
\chapter{Ausblick}
\label{chap:ausblick}

View File

@@ -1,45 +1,49 @@
\chapter{Einleitung}
\label{chap:einleitung}
Der Regionalverband für Weine \ac{WM} lässt Weine in organisierten Weinproben, sog. \acp{JAP}, von Juroren bewerten.
Der Regionalverband für Weine \ac{WM} lässt Weine in organisierten Weinproben, sog. Jahresauswahlproben, von Juroren bewerten.
Teilnehmende Weingüter registrieren ihre Weine in verschiedenen Kategorien und schicken diese auf dem Postweg ein.
Dieser Prozess bildet sich in Form ausgedruckter Formulare, die von Hand ausgefüllt und von Hand in eine
Excel-Tabelle übertragen werden, ab.
Dieser Prozess bildet sich in Form ausgedruckter Formulare ab, die von Hand ausgefüllt und von Hand in eine
Excel-Tabelle übertragen werden.
\section{Problemstellung}
\label{chap:einleitung-problemstellung}
Die Teilnehmenden Weingüter schicken ihre Weine zusammen mit Formularen über den Postweg zu \ac{WM}.
Die teilnehmenden Weingüter schicken ihre Weine zusammen mit Formularen über den Postweg zu \ac{WM}.
Es ist der Normalfall, dass ein teilnehmendes Weingut \emph{mehrere} Weine zur Bewertung anbringt.
In diesem Fall ist für jeden anzumeldenden Wein ein solches Formular erneut auszufüllen.
Hierbei werden sämtliche auf das Weingut bezogene Daten redundant ausgefüllt. Diese Daten sind redudant, da sie keine
Eigenschaften der Weine, sondern die des Weingutes selbst sind.
Da sich das Weingut zwischen den Weinen nicht ändert,
ändern sich die darauf bezogenen Daten auch nicht. Sie müssen aber für jeden Wein erneut ausgefüllt werden.
Hierbei werden sämtliche auf das Weingut bezogene Daten redundant ausgefüllt.
Das ist so, weil diese Daten zwischen den Weinen gleich bleiben.
Abgesehen davon, dass solche Redundanzen auf Weinguts- und Verbandsseite die hedonische Qualität schädigen,
bietet so ein Workflow Freiraum für Fehler und Inkonsistenzen.
Dieser Workflow mit den zuvor genannten Nachteilen wird auf Verbandsseiten, nach Zustellung der Weine, weiter fortgeführt:
\ac{WM} erfährt erstmalig mit der Zustellung eines Weines von dessen Teilnahme. Das erschwert das Planen der Logistik,
da im Voraus keine konkrete Zahl der zu erwartenden Flaschen bekannt ist. Geht eine Flasche auf dem Postweg verloren,
bietet ein solcher Workflow Freiraum für Fehler und Inkonsistenzen.
Dieser Workflow, mit den zuvor genannten Nachteilen, wird auf Verbandsseite, nach Zustellung der Weine, weiter fortgeführt:
\ac{WM} erfährt erstmalig mit der Zustellung eines Weines von dessen Teilnahme. Das erschwert die Planung der Logistik,
da im Voraus keine konkrete Anzahl der zu erwartenden Flaschen bekannt ist. Geht eine Flasche auf dem Postweg verloren,
könnte das unbemerkt bleiben, da der Prozess für das Weingut mit dem Versand endet und der Prozess für \ac{WM}
erst mit dem Erhalt des der Flasche beiliegendem Formulares beginnt.
Der Postweg stellt somit eine Lücke zwischen diesen Prozessen dar.
Der Postweg stellt somit eine Diskontinuität zwischen diesen Prozessen dar.
Kommt ein teilnehmender Wein bei \ac{WM} an, wird das beiliegende Formular von Hand in eine Excel-Tabelle übertragen.
Diese Schnittstelle ist besonders resourcenaufwändig und fehleranfällig, da es oft vorkommt, dass die teils
dysgraphisch verfassten Formulare nur schwer, mehrdeutig, oder gar nicht dechiffriert werden können.
In diesem Prozess wird der Teilnahme des Weines eine inkrementell aufsteigende \ac{ELN} zugewiesen,
die anschließend in Form eines Aufklebers an der Flasche befestigt wird. Anschließend wird die Flasche im Lager verstaut.
die anschließend in Form eines Aufklebers auf der Flasche angebracht wird. Darauffolgend wird die Flasche im Lager verstaut.
\begin{nicepic}
\includegraphics[width=1\textwidth]{images/geschäftsprozess-vorher.png}
\captionof{figure}{Geschäftsprozess Jahresauswahlprobe:\\vor der Digitalisierung, Quelle: Eigene Darstellung}
\label{fig:geschaeftsprozess-vorher}
\end{nicepic}
\section{Zielsetzung}
\label{chap:einleitung-zielsetzung}
Ziel dieser Arbeit ist es, in Erfahrung zu bringen, wie der zuvor genannte Prozess bestmöglichst,
im Rahmen bestimmter Constraints und funktionalen- sowie nichtfunktionalen Anforderungen, digitalisiert werden kann.
Während die Constraints bereits bekannt sind, werden detaillierte Anforderungen
im Rahmen bestimmter Randbedingungen und funktionalen- sowie nichtfunktionalen Anforderungen, digitalisiert werden kann.
Während die Randbedingungen bereits bekannt sind, werden detaillierte Anforderungen
im Rahmen der Anforderungstechnik ausgearbeitet \cite{bib:heinemann-vorlesung-re}.
Die Constraints besagen, dass der Anmeldeprozess in die existierende Internetpräsenz des Weinverbandes integriert werden muss.
Die Randbedingungen besagen, dass der Anmeldeprozess in die existierende Internetpräsenz des Weinverbandes integriert werden muss.
Bei dieser Internetpräsenz handelt es sich um ein TYPO3-Redaktionssystem.
Sämtliche Interaktionen zwischen Akteuren, die nicht \ac{WM} oder dem System zugehörig sind,
müssen im Frontend der Webseite stattfinden. Oberflächen für Mitarbeiter von \ac{WM} dürfen
in der TYPO3-Backend-Oberfläche implementiert werden.
Sämtliche Interaktionen zwischen Akteuren, die nicht \ac{WM} oder dem Softwaresystem zugehörig sind,
müssen im Frontend der Webseite stattfinden, da das Backend den Redakteuren und Administratoren vorbehalten ist.
Oberflächen für Mitarbeiter von \ac{WM} dürfen in der TYPO3-Backend-Oberfläche implementiert werden.
\\
\\
Somit lautet die \textbf{Forschungsfrage}:\\
\textit{Wie kann die Anmeldung und Zustellung von Weinen für Weinproben des Regionalverbunds für Weine in der Weinregion Mosel effizient und profitabel durch eine TYPO3-Erweiterung realisiert werden?}
\enquote{\textit{Wie kann die Anmeldung und Zustellung von Weinen für Weinproben des Regionalverbunds für Weine in der Weinregion Mosel effizient und profitabel durch eine TYPO3-Erweiterung realisiert werden?}}

View File

@@ -1,2 +1,139 @@
\chapter{Ergebnisse}
\label{chap:ergebnisse}
\section{Praktische Ergebnisse}
Die TYPO3-Erweiterung ist umgesetzt und erfüllt die vereinbarten Anforderungen.
Mitglieder und Nichtmitgleder können Teilnehmernutzer anlegen und Weine zu Jahresauswahlproben anmelden.
Teilnehmer bekommen ein PDF-Dokument mit Weindaten und einem QR-Code zur späteren Zuordnung bereitgestellt.
\ac{WM}-Mitarbeiter können diesen QR-Code einscannen, um Weine als \enquote{angekommen} zu markieren.
Redakteure von \ac{WM} können Zugriffsrechte und Verhalten der Jahresauswahlproben auf verschiede Weisen einschränken.
Sie können den Sichtbarkeitszeitraum, den Anmeldezeitraum und den Probezeitraum festlegen, der definiert ab
wann teilnehmende Weine öffentlich sind.
Sie können Jahresauswahlproben und damit deren Anmeldeformulare auf festgelegte Probenkategorien beschränken.
Mitarbeiter können Weindatensätze, getrennt nach Jahresauswahlproben, als CSV-Dokumente exportieren und somit
den verbleibenden Geschäftsprozess wie gehabt fortsetzen.
Praktische Präsentationen gegenüber dem \ac{PO} bestätigen die Umsetzung der Anforderungen und stellen die Basis
für weitere Iterationen der Entwicklung dar.
\section{Forschungsergebnisse}
% Recap Forschungsfrage:
% Wie kann die Anmeldung und Zustellung von Weinen für Weinproben des
% Regionalverbunds für Weine in der Weinregion Mosel effizient und profitabel
% durch eine TYPO3-Erweiterung realisiert werden?
Im Zuge dieser Ausarbeitung wurden Teilfragen beantwortet.
Diese Antworten zeigen auf, wie die Anmeldung und Zustellung von Weinen für Weinproben des Regionalverbunds
für Weine in der Weinregion Mosel effizient und profitabel durch eine TYPO3-Erweiterung realisiert werden können.
\clearpage
\subsection*{Nach welcher Methodik sollten Digitalisierungsprojekte im Maßstab des behandelten Projektes entwickelt werden, um effizient und profitabel zu sein?}
In der Literaturrecherche zur Wahl von Methodiken in der Softwareentwicklung und Digitalisierung
im Kontext der effizienten
und profitablen Umsetzung des hier behandelten Projektes stellten sich komplexe und aufwändige Modelle als
ungeeignet heraus. Vielmehr beeindruckten simple, agile Modelle durch ihren geringen Mehraufwand,
der bei kleinen Projekten, wie der hier beleuchteten Aufgabenstellung, unabdinglich ist, um eine effiziente und profitable
Umsetzung gewährleisten zu können.
\subsection*{Welche Anforderungen sind an die TYPO3-Erweiterung gestellt?}
Um ein Pflichtenheft für die hier beleuchtete TYPO3-Erweiterung zu erarbeiten,
wurde eine Anforderungsanalyse in Form eines Interviews mit dem \ac{PO} durchgeführt.
Auch wurde eine quantitative Studie in Form eines Online-Fragebogens bezüglich der Bedürfnisse der Teilnehmer angestrengt, die ohne Ergebnisse verblieb.
Dieses Pflichtenheft zeigt unter anderem auf, dass Mitglieder sowie Nichtmitglieder Teilnehmer sein können,
wie die Nutzerführung aussieht, welche Werkzeuge \ac{WM}-Mitarbeitern zur Verfügung stehen und wie verschiedene Schnittstellen aussehen.
Auch ist eine wichtige Erkenntnis, dass regelmäßige Statusmeetings mit dem \ac{PO} durchgeführt werden sollten,
damit pragmatisch inkorrekte Anforderungen und Merkmale rechtzeitig erkannt und korrigiert werden können.
Das vollständige Pflichtenheft liegt im Anhang anbei, unter \fullref{chap:anhang-pflichtenheft}.
\subsection*{Welche QR-Code-Bibliothek ist für das behandelte Projekt gut geeignet?}
Um die Anmeldung und Zustellung von Weinen digital umsetzen zu können, ist lt. Anforderungen ein QR-Code-Generator notwendig.
Generell sollten erwägte Bibliotheken aktiv gepflegt, einen gewissen Grad
an Funktionalität aufweisen und für den angedachten Workflow geeignet sein. Das ist wichtig, damit sich dieser
effizient, schnell und somit kostengünstig integrieren lässt.
Vergleiche zwischen sechs QR-Code-Bibliotheken legen nahe, dass \textit{chillerlan/php-qrcode} die beste Eignung
der betrachteten QR-Code-Generatoren aufweist.
\subsection*{Wie wird sichergestellt, dass sich der digitalisierte Teilprozess der Weinanmeldung und -zustellung nahtlos mit dem verbleibenden Prozess integriert?}
Es ist essenziell, die Schnittstelle zwischen dem digitalisierten Teilprozess und dem verbleibenden analogen Teilprozess
zu schützen. Das wird sichergestellt, indem die Ausgabe des digitalisierten Teilprozesses der Ausgabe des vorherigen,
analogen Teilprozesses gleicht. Ist das gegeben, kann der neue, digitale Teilprozess effizient in den Geschäftsprozess
der Jahresauswahlproben integriert werden, dies weil die darauf aufbauenden Schritte mit der Ausgabe der digitalisierten Schritte
kompatibel sind.
%\subsection*{Wie können unangemessen hohe Entwicklungskosten vermieden werden?}
%Vermeidbarer Aufwand in der Entwicklung ohne ausreichende Vorteile (Kosten-Nutzen-Rechnung) fällt zulasten der Effizienz.
\section{Diskussion}
\subsection*{Nach welcher Methodik sollten Digitalisierungsprojekte im Maßstab des behandelten Projektes entwickelt werden, um effizient und profitabel zu sein?}
Um eine Entwicklungsmethodik für die Umsetzung einer wie in der Problemstellung beschriebenen TYPO3-Erweiterung auszuwählen,
wurde eine Literaturrecherche durchgeführt.
Diese Literaturrecherche lässt darauf schließen, dass sich simple, agile Methodiken, ohne nennenswerten Mehraufwand,
gut für die effiziente und profitable Umsetzung kleiner Digitalisierungsprojekte, wie dem hier behandelten, eignen.
Somit empfehlen sich solche Modelle für die Digitalisierung von Anmeldungen und Zustellungen der Weine für Jahresauswahlproben, da hiermit
die Umsetzung effizienter und profitabler wird.
Zu Beginn wurde davon ausgegangen, dass agile Entwicklungsmethodiken oder sogar
\enquote{extreme programming} insbesondere für kleine, zeitkritische Problemstellungen mit veränderlichen Anforderungen und somit
auch für die behandelte Problemstellung, effizient seien. M. Ayman Al Ahmar bestätigt diese Hyptothese.
Ahmar erklärt das durch die Agilität des \enquote{extreme programmings}, die die Entwicklungsgeschwindigkeit
fördert und kurzfristige Änderungen der Anforderungen effizient gestaltet \cite{bib:ayman-al-ahmar}.
Es muss jedoch berücksichtigt werden, dass sich diese Literaturrecherche explizit auf die in dieser Bachelorarbeit beleuchtete Problemstellung bezieht.
Bei Einbezug anderer Projekttypen und -beschaffenheiten weichen die geeigneten Entwicklungsmethodiken wahrscheinlich ab.
Eine Empfehlung für weitere Forschung ist es daher, ähnliche Literaturrecherchen bezüglich
angemessener Entwicklungsmethodiken für abweichende Projekttypen und -beschaffenheiten durchzuführen.
\subsection*{Welche Anforderungen sind an die TYPO3-Erweiterung gestellt?}
Um detaillierte Anforderungen an die TYPO3-Erweiterung in Erfahrung zu bringen, wurde eine Anforderungsanalyse durch verschiedene
Befragunstechniken durchgeführt. Die verwendeten Befragunstechniken sind \enquote{Interview} und \enquote{Online-Fragebogen}.
Auch ist es eine wichtige Erkenntnis des Interviews, regelmäßige Statusmeetings mit dem \ac{PO} zu führen.
Diese Statusmeetings erlauben das frühzeitige Erkennen und Beheben von pragmatisch inkorrekten Merkmalen und Anforderungen.
Es ist wichtig zu erwähnen, dass der Online-Fragebogen unbeantwortet blieb.
Das Ergebnis dieser Anforderungsanalyse ist ein detailliertes Pflichtenheft, das die Anforderdungen an die TYPO3-Erweiterung detailliert beschreibt.
Dieses zeigt unter anderem auf, dass Mitglieder und Nichtmitglieder Teilnehmer sein können,
wie detaillierte Konzepte der Nutzerführung und verschiedene Schnittstellen aussehen und welche Werkzeuge \ac{WM}-Mitarbeitern zur Verfügung stehen.
Einige Anforderungen waren bereits im Voraus bekannt. Das ermittelte Pflichtenheft ist eine Erweiterung dieser.
Da diese Anforderungsanalyse lediglich die Anmeldung und Zustellung von Weinen betrachtet, ist es empfehlenswert, in weiteren Ausbauten
des Jahresauswahlprobenwerkzeuges Forschungen bezüglich darauf aufbauender Anforderungen durchzuführen.
\subsection*{Welche QR-Code-Bibliothek ist für das behandelte Projekt gut geeignet?}
Im Interesse eine Bibliothek zur Generierung von QR-Codes für die Umsetzung dieses Softwareprojektes zu finden,
die sich effizient, schnell und somit kostengünstig integrieren lässt,
wurden sechs QR-Code-Biblio\-theken einander gegenübergestellt und in drei verschiedenen Bewertungskategorien verglichen.
Diese Bewertungskategorien sind \enquote{Funktionalität}, \enquote{Gepflegtheit} und \enquote{Workflow-Eignung}.
Jede dieser Kategorien wurde mit null bis zehn Punkten bewertet. Jede Bibliothek konnte maximal 30 Punkte erhalten.
Die Bewertung erfolgte nach subjektiver Einschätzung des Autors, basierend auf Faktoren wie dem Zustand der Github-Seite,
der Produktwebseite, den tätigen Entwicklern, der Lizenz, der Beschaffenheit des Projektes, der Dokumentation und dem dort ersichtlichen
Funktionsumfang. Dieser Vergleich deutet darauf hin, dass \enquote{chillerlan/php-qrcode} mit 30 Gesamtpunkten
die beste Eignung der verglichenen Bibliotheken aufweist. Es wurde davon ausgegangen, dass \enquote{chillerlan/php-qrcode} eine gute Wahl sei,
da diese Bibliothek bereits firmenintern nahegelegt wurde. Der abgehaltene Vergleich bestätigt
diese Empfehlung. Dieser Erfolg erklärt sich durch ein aktiv gepflegtes Softwareprodukt mit einer Vielzahl an Entwicklern,
Verwendungen, aktueller Versionsunterstützung, guter Dokumentation und projektspezifischer Eignung.
Es muss jedoch beachtet werden, dass dieser Vergleich das spezifische Projekt als wichtigen Faktor mit einbezieht.
Somit ist dieser Vergleich nur gültig, um eine QR-Code-Bibliothek für ein PHP-Projekt mit dem Composer-Paketmanager zu evaluieren.
Der Autor empfielt ähnliche Vergleiche für andere Arbeitsumgebungen durchzuführen, um zu bestimmen, welche QR-Code-Bibliotheken für andere
Projektkontexte angemessen sind. Ebenso nimmt dieser Vergleich nur sechs QR-Code-Bibliotheken in Betracht.
Eine weitere Forschungsempfehlung ist es daher, weitere Vergleiche mit mehr Bibliotheken durchzuführen.
\subsection*{Wie wird sichergestellt, dass sich der digitalisierte Teilprozess der Weinanmeldung und -zustellung nahtlos mit dem verbleibenden Prozess integriert?}
Im Zuge der praktischen Umsetzung der in dieser Forschungsfrage beschriebenen TYPO3-Erweiterung zeigte sich das Problem
der Integration der digitalisierten Weinanmeldung und -zustellung in den restlichen, von dieser Ausarbeitung unberührten
Geschäftsprozess der Jahresauswahlprobe.
Diese Umsetzung zeigt auf, dass es für eine nahtlose Integration in den existierenden Geschäftsprozess
unabdinglich ist, dass die Ausgabe des digitalisierten Teilprozesses der Ausgabe des ersetzten, manuellen Teilprozesses gleicht.
Dieser Aspekt wurde zuvor nicht bedacht. Das könnte daran liegen, dass diese Schnittstelle nicht der primäre und auch nicht
der sekundäre Fokus in der Umsetzung ist. Sie wird nicht benötigt, damit das umgesetzte Produkt intrinsisch funktioniert,
ist aber dennoch unverzichtlich für eine reibungslose, praktische Verwendung.
Hierbei muss jedoch berücksichtigt werden, dass es sich um ein einzelnes, konkretes Projekt handelt und sich aus diesem Grund
nicht unbedingt allgemeingültige Schlüsse ableiten lassen. Eine Forschungsempfehlung ist es daher, weitere Möglichkeiten
zur Integration verschiedener Teilprozesse zu recherchieren und zu evaluieren.
%\subsection*{Welche Endgeräte verwenden Weingüter und was sind ihre Bedürfnisse bezüglich der Jahresauswahlproben?}
%Um zu beleuchten, welche Endgeräte Weingüter im Kontext der Weinanmeldung verwenden und was ihre individuellen Bedürfnisse
%im Kontext der Jahresauswahlproben sind, wurde versucht eine quantitative Studie in Form eines Online-Formulares abzuhalten.
%Dieses Online-Formular wurde über den Zeitraum eines Monats angeboten und mit der Bitte um Weiterleitung an Weingüter an \ac{WM}
%übermittelt. Diese quantitative Studie erzielte keine Antworten. Ursprünglich wurde erwartet, dass zumindest einige Kandidaten
%an der Studie teilnehmen würden. Es wurde erwartet, dass ca 60\% der Weingüter hauptsächlich Desktopsysteme verwenden.
%Eine Möglichkeit, wieso die Studie unbeantwortet blieb, könnten Fehler in der Übermittlung des Fragebogens an die
%zugehörige Stakeholdergruppe sein, bzw. vielleicht kam die Einladung zur Teilnahme niemals bei der Stakeholdergruppe an.
%Es könnte auch sein, dass die Stakeholdergruppe schlicht kein Interesse an einer Teilnahme hatte.
%Daher wird die Forschungsempfehlung ausgesprochen, dieselbe Studie erneut in einer Art und Weise durchzuführen, die eine regere Teilnahme begünstigt.
%\subsection*{Wie können unangemessen hohe Entwicklungskosten vermieden werden?}

55
chapters/fazit.tex Normal file
View File

@@ -0,0 +1,55 @@
\chapter{Fazit}
\label{chap:fazit}
Die vorliegende Bachelorarbeit befasste sich mit der Frage: \enquote{Wie kann die Anmeldung und Zustellung von Weinen für Weinproben
des Regionalverbunds für Weine in der Weinregion Mosel effizient und profitabel durch eine TYPO3-Erweiterung realisiert werden?}
Für die Beantwortung wurde eine Literaturrecherche bezüglich Entwicklungsmethodiken, eine Gegenüberstellung existierender Technik
zur Erstellung von QR-Codes, verschiedene Befragungstechniken zur Anforderungserfassung sowie die praktische Umsetzung der
TYPO3-Erweiterung angestrengt.
\\
\\
Aus den Ergebnissen lässt sich schließen, dass sich insbesondere \enquote{extreme-programming}-Entwicklungsmethodiken eignen,
um das aus der Forschungsfrage hervorgehende Projekt zu realisieren.
Es wurde gezeigt, dass sich die Bibliothek \enquote{chillerlan/php-qrcode} aufgrund herausragender Projektpflege und Workflow-Eignung anbietet,
die mit dem Projekt verbundenen Anforderungen zu erfüllen, die die Erstellung von QR-Codes beschreiben. Die Umsetzung zeigte,
dass es unverzichtlich ist, die Schnittstelle zu den verbleibenden Teilprozessen zu schützen, um eine nahtlose Integration mit diesen zu ermöglichen.
Es wurde begründet, dass die Durchführung einer Anforderungsanalyse wichtig ist, um ein ausführliches Pflichtenheft auszuarbeiten
und es zeigte sich, dass regelmäßige Statusmeetings mit dem \ac{PO} von Vorteil sind, um die pragmatische Korrektheit laufend zu überprüfen.
\\
\\
Durch diese Forschung wurde somit erwiesen, dass die Anmeldung und Zustellung von Weinen für Weinproben des Regionalverbunds für
Weine in der Weinregion Mosel effizient und profitabel durch eine TYPO3-Erweiterung realisiert werden kann, indem für die technische
Umsetzung \enquote{extreme-programming}-Entwicklungsmethodiken herangezogen werden, durch eine Anforderungsanalyse ein Pflichtenheft ausgearbeitet wird,
der aktuelle Stand regelmäßig in Statusmeetings mit dem \ac{PO} besprochen wird, \enquote{chillerlan/php-qrcode} als QR-Code-Bibliothek verwendet wird
und die Schnittstelle zu den verbleibenden Teilprozessen geschützt wird.
\section{Ausblick}
\label{chap:ausblick}
Nach der Umsetzung der Anmeldung und Zustellung von Weinen für Jahresauswahlproben,
gilt es diese TYPO3-Erweiterung in ihrer Funktionalität zu erweitern, sodass der gesamte
Geschäftsprozess der Jahresauswahlprobe abgebildet ist.
\begin{nicepic}
\includegraphics[width=1\textwidth]{images/geschäftsprozess-ausblick.png}
\captionof{figure}{Geschäftsprozess Jahresauswahlprobe: Ausblick, Quelle: Eigene Darstellung}
\label{fig:geschaeftsprozess-ausblick}
\end{nicepic}
Der vom Kunden langfristig erwünschte Zustand ist, dass der gesamte Geschäftsprozess der Jahresauswahlprobe teilautomatisiert wird.
Das betrifft auch, aber nicht nur, das Aufteilen von Jahresauswahlproben in Tische und Flights, das sichere Sammeln und Auswerten
der Bewertungen und das Publizieren der daraus resultierenden Ergebnisse. Ein Flight ist eine weitere Unterteilung eines Tisches in der Zeit.
So werden pro Tisch immer sechs Weine auf einmal probiert und bewertet.
Die Bewertung eines Weines erfolgt derzeit über eine Bepunktung, die im Wertebereich $[0,100]$ auf Papier notiert wird.
Anschließend wird mithilfe eines Taschenrechners das arithmetische Mittel der für diesen Wein vergebenen Punkte ausgerechnet.
Das so zustandegekommene Ergebnis wird wiederum händisch in die Excel-Tabelle aus vorherigen Schritten übertragen.
Ein solch umständliches Verfahren lenkt nicht nur von der eigentlichen Aufgabe der Bewertung ab, sondern stellt eine beachtliche Fehlerquelle dar.
Auch ist es angedacht, die Weinanmeldung zu Jahresauswahlproben um komplexe Funktionalität zu erweitern, die sicherstellen soll, dass
nicht gegen Restriktionen der jeweiligen Probenkategorien verstoßen werden kann. Somit soll vermieden werden, dass Weinanmeldungen
aufgrund von Formfehlern abgelehnt werden.
Ein triviales Beispiel hierfür wäre ein Wein mit zu hohem Restzuckeranteil,
der in einer Jahresauswahlprobenkategorie für trockene Weine antreten soll.
Ziel ist es, dass das Weinanmeldeformular fehlerhafte
Anmeldeversuche als solche erkennt und verhindert.
Kompliziert wird diese Technik dadurch, dass Kategorien beliebig viele Restriktionen haben können
und diese von Redakteuren, im TYPO3-Backend, gepflegt werden sollen. Ein komplexeres, realistisches Beispiel wäre eine
Kategorie, die nur vegane Barriqueweine der Rebsorte Merlot zulässt, die einen Mindest- und Maximalrestzuckeranteil, einen Maximalalkoholanteil und
einen Maximalpreis erfüllen.

View File

@@ -1,76 +1,82 @@
\chapter{Umsetzung}
\chapter{Konzeption und Umsetzung}
\label{chap:umsetzung}
Infolge der Anforderungsanalyse befasst sich das Kapitel \enquote{Umsetzung} mit der Implementation der Anforderungen in dem
Brown-Field Projekt \cite{bib:schwarzer-vorlesung-swa} in Form einer TYPO3-Extension.
Infolge der Anforderungsanalyse befasst sich das Kapitel \enquote{Konzeption und Umsetzung}
mit der Implementation der Anforderungen in dem
Brown-Field Projekt \cite{bib:schwarzer-vorlesung-swa} in Form einer TYPO3-\break{}Erweiterung.
Es ist anzumerken, dass das aus \fullref{chap:anforderungserfassung} hervorgehende Pflichtenheft im Rahmen geplanter und
opportunistischer Gespräche mit dem \ac{PO} geringfügige Änderungen erfahren wird.
\section{Setup einer TYPO3-Extension}
TYPO3-Extensions werden via Composer installiert \cite{bib:typo3-docs-managing-extensions}.
Um eine TYPO3-Extension zu erstellen, muss also ein Composer-Paket erstellt werden.
\section{Setup der TYPO3-Erweiterung}
TYPO3-Erweiterungen werden via Composer installiert
\break\cite{bib:typo3-docs-managing-extensions}.
Um eine TYPO3-Erweiterung zu erstellen, muss also ein Composer-Paket erstellt werden.
Um vermeidbare Komplexität zu verhindern, wird das Composer-Paket, welches die hier betrachtete
TYPO3-Extension darstellt, lokal in den versionierten Ordner \enquote{packages} gelegt.
Dieses Verzeichnis wird als Quelle für Composer-Pakete in der
TYPO3-Erweiterung darstellt, lokal in den versionierten Ordner \enquote{packages} gelegt.
Dieses Verzeichnis wird als Quelle für
\break{}Composer-Pakete in der
Haupt-composer.json-Datei hinterlegt.
Somit wird ein Composer-Paket nur für dieses Projekt bereitgestellt,
ohne den Aufwand zu haben, der üblicherweise mit dem Bereitstellen eines Paketes einhergeht.
ohne den Aufwand zu betreiben, der üblicherweise mit dem Bereitstellen eines Paketes einhergeht.
\\
\\
Um das grundlegende Setup einer Extension effizient durchzuführen, wurde eine
existierende Extension mit vergleichbarem Funktionsumfang kopiert, umbenannt und eingefügt.
Spezifisch ist der \enquote{vergleichbare Funktionsumfang}, dass es Datenmodelle und hochpersonalisierte
Frontendlogik in Bezug auf die zuvor genannten Datenmodelle gibt.
Um das grundlegende Setup einer TYPO3-Erweiterung effizient durchzuführen, wird eine
existierende Erweiterung mit vergleichbarem Funktionsumfang kopiert, angepasst und eingefügt,
um eine valide Ordnerstruktur als Ausgangspunkt zu erhalten.
\section{Digitization}
Die Phase der Digitazion nach Verhoef et al. befasst sich mit der digitalen Abbildung von Objekten der realen Welt
in einer Art und Weise, sodass diese elektronisch weiterverarbeitet werden können \cite{bib:verhoef, bib:dougherty, bib:loebbecke}.
Die Phase der Digitization nach Verhoef et al. befasst sich mit der digitalen Abbildung von Objekten aus der realen Welt
in einer Art und Weise, die ermöglicht, dass diese elektronisch weiterverarbeitet werden können\break\cite{bib:dougherty, bib:loebbecke}.
Des Weiteren befasst sich diese Phase mit der Automatisierung und Befüllung dieser Daten,
wie zum Beispiel durch Web-Formulare \cite{bib:verhoef}.
Das bedeutet, dass in dieser Phase Datenobjekte definiert und implementiert werden.
Ebenfalls werden anhand der Papier-Formulare Web-Formulare gebaut, damit Nutzer diese Datenobjekte erstellen können.
Ein Datenobjekt besteht nach firmeninternen Konventionen aus zumindest
vier Komponenten:
\begin{description}
\item{Datenbanktabelle} \\
\item{\textbf{Datenbanktabelle}} \\
Die Datenbanktabelle persistiert Informationen.
\item{Domain Model} \\
\item{\textbf{Domain Model}} \\
Das Domain Model (auch Model genannt) ist eine PHP-Klasse,
die jeweils die Daten einer Zeile der Datenbanktabelle abbildet.
\item{Repository} \\
\item\textbf{{Repository}} \\
Ein Repository ist eine PHP-Klasse, die die Schnittstelle
zwischen der Datenbank und der Model-Klasse darstellt.
\item{\ac{TCA}} \\
\item{\textbf{\ac{TCA}}} \\
Der \ac{TCA} des Modells definiert, wie diese Objekte im TYPO3-Backend dargestellt werden
und bearbeitbar sind.
\end{description}
\cite{bib:typo3-docs-extbase-reference}.
Im Folgenden wurde ein semiformales Diagramm der Objekte und ihren Relationen
Im Folgenden wird ein semiformales Diagramm der Objekte und ihren Relationen
angefertigt und in Rücksprache mit dem \ac{PO} finalisiert.
\begin{nicepic}
\includegraphics[width=1\textwidth]{images/objektrelationen-weinlandmosel-einlieferungswerkzeug.png}
\captionof{figure}{Objektrelationen}
\caption*{Quelle: Eigene Darstellung}
\captionof{figure}{Objektrelationen: Weinland Mosel Jahresauswahlprobenwerkzeug, Quelle: Eigene Darstellung}
\label{fig:objektrelationen}
\end{nicepic}
Nachdem in Erfahrung gebracht wurde, welche konkreten Datenobjekte benötigt werden,
wurden Attribute dieser Objekte dem Pflichtenheft entnommen. Diese wurden in einem
Nachdem in Erfahrung gebracht wird, welche konkreten Datenobjekte benötigt werden,
werden Attribute dieser Objekte dem Pflichtenheft entnommen. Diese werden in einem
formalen Klassendiagramm festgehalten und in Rücksprache mit dem \ac{PO}
weiter bis zu festen Datentypen und Auswahlmöglichkeiten konkretisiert.
Beispielsweise, dass Wettbewerbskategorien durch TYPO3-Categories repräsentiert werden sollen.
Beispielsweise dass Probenkategorien durch TYPO3-Categories repräsentiert werden.
Das hat den Vorteil, dass TYPO3-Categories bereits native Bestandteile eines TYPO3-Redaktionssystemes sind
und alle relevanten Attribute anbieten. Diese sind ein Titel,
eine Parentkategorie und eine Beschreibung.
Das Parent-Attribut ist benötigt, da $n$ dieser Attribute einen Attributbaum bilden
und alle relevanten Attribute anbieten. Diese sind Titel,
Parentkategorie und Beschreibung.
Das Parent-Attribut ist nötig, da $n$ dieser Attribute einen Attributbaum bilden
\cite{bib:typo3-docs-sys-category}.
Somit ist es möglich, Unterkategorien zu erstellen. Beispiele hierfür sind die
Unterkategorien \enquote{Trockener Riesling} und \enquote{Halbtrockener Riesling} für die Überkategorie
\enquote{Riesling}.
Rebsorten, Geschmack, Weineigenschaften und Qualität sollen eigene Datentypen
Rebsorte, Geschmacksangabe, Weineigenschaften und Qualitätsstufe sollen eigene Datentypen,
anstatt einfacher Zeichenfolgen sein.
Ziel dessen ist, dass sich Nutzer für einen vorgefertigten, nominalen Eintrag in einem Dropdown-Menü
entscheiden müssen und diese Auswahlmöglichkeiten immer noch im TYPO3-Backend pflegbar sind.
Weinlagen sind im Brown-Field-Projekt bereits vorhanden, also sollen hierfür existierenden Daten
eingebunden werden.
Je Wein sollen beliebig viele Weineigenschaften auswählbar sein, Wettbewerbskategorien,
Geschmacksrichtung, etc, jeweils nur ein Element.
entscheiden müssen und dass diese Auswahlmöglichkeiten im TYPO3-Backend pflegbar sind.
Weinlagen sind im Brown-Field-Projekt bereits vorhanden, also sollen hierfür existierende Daten
wiederverwendet werden.
Je Wein sollen beliebig viele Weineigenschaften auswählbar sein. Probenkategorie,
Geschmacksangabe, etc, sind jeweils nur ein Element.
Weitere Notizen zu diesem Gespräch sind im Anhang unter \fullref{chap:anhang-notizen-digitization}
zu finden.
\\
@@ -88,57 +94,48 @@ da zu diesem Zeitpunkt keine erweiterte Auswahllogik für Datenbankanfragen ben
Wichtig ist hierbei, dass eine Repository-Klasse existiert. Alle unverzichtbaren
Schnittstellen werden über die Basisklasse \enquote{Repository} geerbt
\cite{bib:typo3-docs-extdev-tut-tea-repositories}.
Mit Abschluss der Phase der Digitization können alle Datenstrukturen im TYPO3-Backend händisch angelegt,
eingesehen, gelöscht und bearbeitet werden.
\section{Digitalization}
In der Phase \textit{Digitalization} werden bestehende Geschäftsprozesse so verändert,
dass mit digitalen Werkzeugen und Datenmodellen gearbeitet werden kann \cite{bib:fengli}.
Damit baut diese Phase auf der vorherigen Phase \enquote{Digitization} auf, um mit den dort
implementierten Datenmodellen zu arbeiten. Im Folgenden werden die Umsetzungen der
erforderlichen Geschäftsprozesse beschrieben.
\subsection{Teilnehmerregistrierung}
Ein essenzieller Teil des Jahresauswahlprobenwerkzeuges ist die Registrierung von Teilnehmern.
Dieses Modul repräsentiert den ersten Berührungspunkt der Winzer mit dem System.
Hiervon profitiert \ac{WM}, weil registrierte Benutzer der Webseite eine Grundvorausetzung
für die Onlineregistrierung von Weinen zu \acp{JAP} sind.
Dem Pflichtenheft ist zu entnehmen, dass es zwei Kategorien von Teilnehmerregistrierungen gibt:
\begin{enumerate}
\item Nutzer ist \ac{WM}-Mitglied
\item Nutzer ist kein \ac{WM}-Mitglied
\end{enumerate}
Der primäre Unterschied zwischen Mitgliedern und Nicht-Mitgliedern ist, dass Mitglieder bereits einen
Der primäre Unterschied zwischen Mitgliedern und Nichtmitgliedern ist, dass Mitglieder bereits einen
Stammdatensatz hinterlegt haben.
Dieser Stammdatensatz bildet die Angaben zum Weingut des zu digitalisierendem Anmeldeformulares ab.
Nicht-Mitglieder sind dem System noch gänzlich unbekannt und müssen im Zuge der Registrierung ihres Nutzers
Dieser Stammdatensatz bildet die Angaben zum Weingut des zu digitalisierenden Anmeldeformulares ab.
Nichtmitglieder sind dem System noch gänzlich unbekannt und müssen im Zuge der Registrierung ihres Nutzers
ihre Stammdaten angeben, während sich Mitglieder lediglich einloggen müssen und eine Schaltfläche
\enquote{Teilnehmer werden} betätigen.
Der mit dem \ac{PO} ausgearbeitete UX-Flow der Registrierung sieht vor, dass der Nutzer zunächst gefragt wird,
ob er Mitglied sei oder nicht. Hierzu gibt es je einen Button. Ist der Nutzer ein Mitglied,
wird er auf ein Loginform, mit der Option zur Registrierung weitergeleitet.
wird er auf ein Loginformular, mit der Option zur Registrierung weitergeleitet.
Nach erfolgreichem Login, wird ein Teilnehmerobjekt erstellt.
Wählt der Nutzer \enquote{Nein, ich bin kein Mitglied} aus, wird er auf ein Registrierungsformular
weitergeleitet, um einen Nicht-Mitgliederaccount anzulegen. Im Zuge dieser Registrierung werden
Wählt der Nutzer \enquote{Nein, ich bin kein Mitglied}, wird er auf ein Registrierungsformular
weitergeleitet, um einen Nichtmitgliederaccount anzulegen. Im Zuge dieser Registrierung werden
Stammdaten zum Weingut angefragt.
Dieser Schritt übersetzt unter anderem den \enquote{Einreicher}-Teil des ursprünglichen Anmeldeformulares,
anbei in \fullref{chap:anhang-anmeldeformular}.
\begin{nicepic}
\includegraphics[width=0.9\textwidth]{images/ux-flow-registrierung.png}
\captionof{figure}{UX-Flow: Registrierung}
\caption*{Quelle: Eigene Darstellung}
\includegraphics[width=0.6\textwidth]{images/ux-flow-registrierung.png}
\captionof{figure}{UX-Flow: Registrierung, Quelle: Eigene Darstellung}
\label{fig:uxflow-registrierung}
\end{nicepic}
Da das Brown-Field-Projekt bereits Accountlogins und -Registrierungen implementiert und nutzt,
werden auf diese Lösungen zurückgegriffen, um einen einheitlichen Workflow beizubehalten. Accountregistrierungen werden über den
\enquote{femanager} \cite{bib:typo3-docs-femanager} realisiert, während Logins via TYPO3's nativem
Frontend-Nutzer-Login gelöst werden. Das ist explizit von femanager so angedacht:
Da das Brown-Field-Projekt bereits Accountlogins und -registrierungen implementiert und nutzt,
wird auf diese Lösungen zurückgegriffen, um einen einheitlichen Workflow beizubehalten.
Accountregistrierungen werden über den
\enquote{femanager} \cite{bib:typo3-docs-femanager} realisiert, während Logins via TYPO3s nativem
Frontend-Nutzer-Login gelöst werden. Das ist explizit von \enquote{femanager} angedacht:
\quotecite{Note: Login and a I forgot my password function is part of the core and not part of femanager.}
\cite{bib:typo3-docs-femanager}.
Im Folgenden wird der Registrierungsprozess im Detail beschrieben:\\
Im Folgenden wird der Registrierungsprozess im Detail beschrieben:
\\
\\
Grundlegend gibt es drei relevante Nutzerzustände vor der Registrierung:
\begin{enumerate}
\item Kein Mitglied
@@ -151,7 +148,7 @@ Diese Prozesse sehen wie folgt aus:
Ist ein Nutzer kein Mitglied, so muss er zunächst einen Account erstellen.
Anfangs wählt dieser Nutzer \enquote{Ich bin kein Mitglied} auf der Registrierungsseite aus.
Daraufhin navigiert der Browser zu einem Registrierungs-Formular.
Hierfür muss eine Email-Adresse und ein Passwort vergeben und den Nutzungsbestimmungen zugestimmt werden.
Hierfür muss eine Email-Adresse, ein Passwort vergeben und den Nutzungsbestimmungen zugestimmt werden.
Im Anschluss erhält der Nutzer eine Bestätigungsemail mit einem Aktivierungslink.
Wird dieser Link geöffnet, wird der Account freigeschalten und ein Login-Feld erscheint.
Nach erfolgreichem Login wird der Nutzer mit einem
@@ -159,7 +156,8 @@ Stammdatenformular konfrontiert. Dabei handelt es sich um Angaben zum teilnehmen
Wird dieses Formular abgeschickt, ist die Teilnehmerregistrierung abgeschlossen.
\subsubsection*{Mitglied, mit Konto}
Ist ein Nutzer ein Weinland-Mosel-Mitglied und hat bereits ein Mitgliedskonto, muss dieser auf der Registrierungsseite
\label{chap:umsetzung-mitglied-mit-konto}
Ist ein Nutzer ein \ac{WM}-Mitglied und hat bereits ein Mitgliedskonto, muss dieser auf der Registrierungsseite
\enquote{Ich bin ein Mitglied} auswählen. An dieser Stelle navigiert der Browser zu einem Login-Formular.
Hier kann sich das Mitglied anmelden. Tut es dies erfolgreich, erstellt der Controller einen neuen
Teilnehmer-Eintrag für den Frontend-Nutzer und fügt den Frontend-Nutzer der Nutzergruppe \enquote{Teilnehmer} hinzu.
@@ -170,10 +168,13 @@ Ist ein Nutzer ein Mitglied, hat aber kein Mitgliedskonto, muss dieser auf der R
\enquote{Ich bin ein Mitglied} auswählen. An dieser Stelle navigiert der Browser zu einem Login-Formular.
Auf diesem Login-Formular existiert ein Button \enquote{Jetzt registrieren}, sowie ein Hinsweistext dazu.
Da der Nutzer noch keinen Account hat, muss dieser auf \enquote{Jetzt registrieren} klicken.
Daraufhin navigiert der Browser zu einem Registrierungsformular, das eine Email-Adresse, ein Passwort
Daraufhin navigiert der Browser zu einem Registrierungsformular, das eine Email-Adresse, eine Mitgliedsnummer, ein Passwort
und die Zustimmung zur Datenverarbeitung benötigt. Ist dieses Formular abgeschickt, erhält das Mitglied
eine Email mit einem Bestätigungslink. Wird dieser Bestätigungslink angeklickt, wird das Mitgliedskonto
freigegeben und es öffnet sich ein Login-Formular, beschrieben in \enpointy{Mitglied, mit Konto}.
eine Email mit einem Bestätigungslink. Wird dieser Bestätigungslink angeklickt,
öffnet sich ein Login-Formular, beschrieben in \enpointy{\textit{\nameref{chap:umsetzung-mitglied-mit-konto}}}.
Da es sich hierbei um einen Mitgliederzugang handelt, muss dieser zunächst von einem
\ac{WM}-Mitarbeiter freigegeben werden, bevor ein Login möglich ist.
\subsubsection*{Umsetzung}
Zunächst wurde ein simples Weichen-Content-Element erstellt.
@@ -182,62 +183,65 @@ Dieses Content-Element hat die Parameter \enquote{question}, \enquote{answ-1-lin
Der Zweck dieses Content-Elementes ist es, Nutzer basierend auf einer ausformulierten Frage auf eine
von zwei Seiten weiterzuleiten. Anschließend wurden Registrierungen über Femanager-Plugin-Content-Elemente
realisiert.
Anpassungen der versendeten Emails erfolgen durch Überschreiben der Email-Templates von Femanager.
Anpassungen der versendeten Emails erfolgen durch Überschreiben der Email-Templates von \enquote{femanager}.
Weiterleitungen zu bestimmten Seiten, nachdem ein Nutzer spezielle Events ausgelöst hat, können über TypoScript
konfiguriert werden \cite{bib:typo3-docs-femanager}. Logins werden über das TYPO3-Native Loginformular
gelöst. Im TYPO3-Loginformular können Weiterleitungen zu spezialisierten Seiten im Backend-UI festgelegt werden.
\cite{bib:typo3-docs-felogin}.
Für alle funktionalen Belange wird ein TYPO3-Plugin registriert. Dieses Plugin verfügt über einen
konfiguriert werden \cite{bib:typo3-docs-femanager}. Logins werden über das TYPO3-native Loginformular
gelöst. Im TYPO3-Loginformular können Weiterleitungen zu spezialisierten Seiten im Backend-UI festgelegt werden
\break\cite{bib:typo3-docs-felogin}.
Für alle funktionalen Belange wird ein TYPO3-Pluginobjekt registriert. Dieses Pluginobjekt verfügt über einen
ActionController, der Nutzeranfragen an PHP-Funktionen (\enquote{Actions})
bindet.
In diesen Actions werden Fehlerbehandlungen durchgeführt, Datenmodelle der Domäne erstellt und in der
Datenbank persistiert, sowie Daten für die Anzeige im Frontend aufbereitet \cite{bib:typo3-docs-extbase}.
Neue Datenobjekte werden in Repositories registriert \cite{bib:typo3-docs-extdev-tut-tea-repositories}. Diese Repositories sind Aggregate des Controllers,
Datenbank persistiert sowie Daten für die Anzeige im Frontend der Webseite aufbereitet
\break\cite{bib:typo3-docs-extbase}.
Neue Datenobjekte werden in Repository-Objekten registriert
\cite{bib:typo3-docs-extdev-tut-tea-repositories}. Diese Repositories sind Aggregate des Controllers,
werden jedoch nach dem \enquote{Inversion of Control}-Prinzip via Dependency Injection instanziiert und
der ActionController-Klasse über Methode übergeben \cite{bib:typo3-docs-di}.
\break{}ActionController-Objekten über öffentliche Methoden übergeben
\break\cite{bib:typo3-docs-di}.
Als problematisch erweisen sich hierbei bidirektionale Verbindungen zwischen Datenmodellen, wenn die Foreign Keys
über das SQL-Schlüsselwort \enquote{AUTO\_INCREMENT} in der Datenbank generiert werden.
Beispielsweise, muss ein MasterRecord, der Betriebsinformationen speichert, bidirektional an ein Teilnehmerobjekt
über das SQL-Schlüsselwort
\enquote{AUTO\_INCREMENT} in der Datenbank generiert werden.
Beispielsweise muss ein Masterrecord, der Betriebsinformationen speichert, bidirektional an ein Teilnehmerobjekt
gebunden werden. Hierzu wird jedem der Elemente jeweils der Foreign Key des anderen übergeben.
Als Foreign Keys werden hierfür die jeweiligen \acp{UID} herangezogen, da diese Werte durch
\enquote{AUTO\_INCREMENT} auf der Datenbankebene erzeugt werden und garantiert einzigartig je Datenbanktabelle sind
\cite{bib:w3schools-auto-increment}.
Es gilt also, dass ein MasterRecord $a$ die Teilnehmer\ac{UID} von einem Teilnehmer $b$ hält und dass
$b$ die MasterRecord\ac{UID} von $a$ hält.
Es gilt also, dass ein Masterrecord $a$ die Teilnehmer\ac{UID} von einem Teilnehmer $b$ hält und dass
$b$ die Masterrecord\ac{UID} von $a$ hält.
Die Problematik hierbei ist, dass diese \acp{UID} erst nach dem Persistieren in der Datenbank bekannt sind,
da diese Werte erst im Zuge der Persistierung erstellt werden \cite{bib:w3schools-auto-increment}.
Die Lösung hierfür ist, beide Elemente zu erstellen und zu persistieren, erst danach ihre \acp{UID} gegenseitig
bekannt machen um sie danach erneut zu persistieren.
Die Lösung hierfür ist, beide Elemente zu erstellen und zu persistieren und erst danach ihre \acp{UID} gegenseitig
bekannt zu machen um sie anschließend erneut zu persistieren.
\subsection{Weinregistrierung}
Ein Basismerkmal des Jahresauswahlprobenwerkzeuges ist die Möglichkeit, Weine zu Jahresauswahlproben
anzumelden. Dieser Schritt übersetzt unter anderem die verbleibenden Formfelder des
ursprünglichen Anmeldeformulares, anbei in \fullref{chap:anhang-anmeldeformular} in den digitalen Workflow.
ursprünglichen Anmeldeformulares, anbei in \fullref{chap:anhang-anmeldeformular}, in den digitalen Workflow.
Für die Weinanmeldung spielt die Mitgliedsschaft eines Teilnehmers keine Rolle. Es wird lediglich ein
Frontend-Nutzer der Nutzergruppe \enquote{Teilnehmer} benötigt. Dieser Nutzer hat, wenn angemeldet,
Frontend-Nutzer der Nutzergruppe \enquote{Teilnehmer} erfordert. Dieser Nutzer hat, wenn angemeldet,
Zugriff auf eine Auflistung aller zeitlich freigegebenen Jahresauswahlproben.
Soweit der Registrierungszeitraum dieser Jahresauswahlprobe den aktuellen Zeitpunkt miteinschließt,
wird eine \enquote{Jetzt Wein anmelden}-Schaltfläche angeboten.
Dadurch, dass Anmeldeformulare elektronisch und automatisiert verarbeitet werden, sinkt der Aufwand,
der seitens \ac{WM} für Anmeldungen gestemmt werden muss. Das ist so, da diese Formular nun nicht mehr von
Mitarbeitern bearbeitet werden müssen. Davon profitiert \ac{WM}, da diese Zeit nun anderweitig genutzt werden kann.
der seitens \ac{WM} für Anmeldungen geleistet werden muss. Das ist so, da diese Formulare nun nicht mehr von
Mitarbeitern bearbeitet werden müssen. Davon profitiert \ac{WM}, da diese Zeit nun für andere Aufgaben genutzt werden kann.
\begin{nicepic}
\includegraphics[width=0.9\textwidth]{images/ux-flow-teilnahme.png}
\captionof{figure}{UX-Flow: Weinanmeldung}
\caption*{Quelle: Eigene Darstellung}
\captionof{figure}{UX-Flow: Weinanmeldung, Quelle: Eigene Darstellung}
\label{fig:uxflow-weinanmeldung}
\end{nicepic}
\subsubsection*{IT-Sicherheit}
Es ist wichtig zu erwähnen, dass solche Überprüfungen,
wie das Aktivsein eines Registrierungszeitraumes einer \ac{JAP}, grundsätzlich im Backend, d.h. serverseitig
wie das Aktivsein eines Registrierungszeitraumes einer Jahresauswahlprobe, grundsätzlich im Backend, d.h. serverseitig
auf der betroffenen Webseite (in diesem Beispiel der Weinanmeldungsseite) durchgeführt werden.
Das Verstecken der zugehörigen
Schaltfläche im Frontend dient lediglich der User-Experience und stellt keine Sicherheitsvorkehrung dar.
Das ist essenziell, da eine URL, auch wenn für sie keine Schaltfläche existiert, dennoch aufgerufen werden kann.
Da Jahresauswahlprobennummern (\acp{UID}) fortlaufend sind, ist es trivial URLs für Weinanmeldungen
beliebiger Jahresauswahlproben herzuleiten. Insofern ist es von großer Wichtigkeit sicherzustellen,
Da Jahresauswahlprobennummern, also \acp{UID}, fortlaufend sind, ist es trivial URLs für Weinanmeldungen
beliebiger Jahresauswahlproben herzuleiten. Insofern ist es von großer Wichtigkeit, sicherzustellen,
dass der Server solche Anfragen grundsätzlich selbst prüft und gegebenenfalls verneint.
\subsubsection*{Das Formular}
@@ -246,142 +250,186 @@ werden Formulare und Formfelder mit den entsprechenden Fluid-Form-ViewHelpern au
Diese ViewHelper repräsentieren und erstellen gleichnamige HTML-Tags und fügen diesen spezielle
Attribute zur Identifizierung in Submit-Aufrufen hinzu \cite{bib:typo3-docs-fluid-form-viewhelpers}.
Grundsätzlich entstehen hierbei drei Kategorien von Werten, die es im Formular abzubilden gilt:
\paragraph*{Inputfelder} sind triviale Formfelder, die nicht durch andere Datensätze beschränkt werden.
\\
\\
\textbf{Inputfelder} sind triviale Formfelder, die nicht durch andere Datensätze beschränkt werden.
Beispiele für Inputfelder sind: Weinbeschreibung, Jahrgang und Alkoholgehalt.
Inputfelder wurden mit simplen Input-Tags umgesetzt und erhielten nach Bedarf \textit{required} und
Inputfelder werden mit simplen Input-Tags umgesetzt und erhalten nach Bedarf \textit{required} und
\textit{pattern}-Attribute. Diese Attribute beschreiben jeweils, ob ein Formfeld ein Pflichtfeld ist und
mit welcher Regular Expression der Formfeldinhalt abzugleichen ist \cite{bib:w3schools-input}.
Die Formfeldwerte können unverändert in der Datenbank persistiert werden.
\paragraph*{SelectSingle} sind Formfelder, die dem Nutzer eine Auswahl aus $n$ Elementen aus
\\
\\
\textbf{SelectSingle} sind Formfelder, die dem Nutzer eine Auswahl aus $n$ Elementen aus
anderen Datenbanktabellen geben. Der Nutzer muss sich für genau ein Element entscheiden.
Beispiele für SelectSingle-Formfelder sind: Weinlage, Qualitätsstufe, Rebsorte und Geschmacksangabe.
SelectSingle-Formfelder werden durch Select-HTML-Tags abgebildet. Der TYPO3-Form-ViewHelper für
\break{}SelectSingle-Formfelder werden durch Select-HTML-Tags abgebildet.
\break{}Der TYPO3-Form-ViewHelper für
\enquote{Select} akzeptiert eine Liste an Auswahlmöglichkeiten und erstellt selbstständig Option-HTML-Tags
für diese.
Die Formfeldwerte von SelectSingle-Formfeldern sind die
\acp{UID} des jeweils ausgewähltem Elementes \cite{bib:typo3-docs-fluid-form-viewhelpers}.
\\
\\
Aufgrund dessen, dass das Weinlagen-Drop-Down-Menü über 170 Einträge führt, wurde eine Suchmöglichkeit implementiert. Diese ist lediglich ein Textfeld, das bei jeder Eingabe allen Option-Tags der Weinlage,
deren Anzeigewert nicht der Suche entspricht, das Stilattribut \enquote{display: none;} auferlegt.
\acp{UID} des jeweils ausgewählten Elementes \cite{bib:typo3-docs-fluid-form-viewhelpers}.
\clearpage
Aufgrund dessen, dass das Weinlagen-Dropdown-Menü über 170 Einträge führt, wird eine Suchmöglichkeit implementiert.
Diese ist lediglich ein Textfeld, das bei jeder Eingabe allen Option-Tags der Weinlage,
deren Anzeigewert nicht dem Suchwert entspricht, das Stilattribut \enquote{display: none;} auferlegt.
Somit sind diese nicht mehr sichtbar.
\\
\\
Eine komplexe Ausnahme stellt das SelectSingle-Formfeld \enquote{Category} dar, da TYPO3-Kategorien
Baumstrukturen sind \cite{bib:typo3-docs-sys-category}.
Um die Eltern-Kind-Beziehung der Baumstruktur erstichtlich zu machen, werden die Option-HTML-Tags einzeln rekursiv gerendert. Zunächst werden sämtliche Kategorien, deren
als Baumstrukturen abgebildet werden
\break\cite{bib:typo3-docs-sys-category}.
Um die Eltern-Kind-Beziehungen der
\break{}Baumstruktur ersichtlich zu machen, werden die Option-HTML-Tags rekursiv gerendert. Zunächst werden sämtliche Kategorien, deren
\ac{PID} 0 ist, dargestellt. Diese Elemente sind direkte Kinder des unsichtbaren Wurzelelementes. Für jede dieser Kategorien $a$ wird nun ein
Fluid-Partial aufgerufen,
das alle Kategorien $b$ darstellt, für die gilt: $b.pid = a.uid$. Diese Darstellung erfolgt durch einen erneuten rekursiven Aufruf dieses Partials.
In jeder Darstellung wird der Kategoriename, geprefixt mit
$n$ Leerzeichen, dargestellt, mit $n = Rekursionstiefe$. Somit entsteht ein Drop-Down-Menü, das
alle Kategorien in einer eindimensionalen Liste darstellt. Diese Liste ist nach einer Preorder-Traversierung
$n$ Leerzeichen, dargestellt, mit $n = Rekursionstiefe$. Somit entsteht ein Dropdown-Menü, das
alle Kategorien in einer eindimensionalen Liste darstellt. Diese Liste ist nach einer preorder-Traversierung
des Kategoriebaumes sortiert und desto tiefer ein Element im Baum ist, desto weiter ist es eingerückt.
Damit sieht das Drop-Down-Menü aus wie eine Baumstruktur.
Damit sieht das Dropdown-Menü aus wie eine Baumstruktur.
\\
\\
Diese Herangehensweise erzeugt schlüssigen und lesbaren Programmcode und lässt sich unkompliziert umsetzen.
Das senkt Entwicklungskosten und erhöht den Profit des Endkunden, da hierdurch weniger Zeit aufgewandt wird.
Diese Herangehensweise erzeugt schlüssigen, lesbaren Programmcode und lässt sich unkompliziert umsetzen.
Das senkt Entwicklungskosten, wovon \ac{WM} profitiert.
Rekursiv aufgerufene For-Schleifen, die sich selbst erneut für alle Elemente aufrufen,
können zu einem Performanzproblem führen \cite{bib:schwarzer-vorlesung-alg}.
können zu Performanzproblemen führen \cite{bib:schwarzer-vorlesung-alg}.
Daher wird im Folgenden die Zeitkomplexität dieser Rekursionsfunktion betrachtet.
Grundlegend, kann für diese Funktion kein Master-Theorem angewandt werden,
da es sich hierbei nicht um einen Divide-and-Conquer-Algorithmus handelt.
Für diese Funktion kann kein Master-Theorem angewandt werden,
da es sich hierbei nicht um einen \enquote{Divide-and-Conquer-Algorithmus} handelt.
Das ist so, da das in der Rekursion weitergereichte Problem nicht kleiner wird,
sondern gleich groß bleibt.
sondern gleich groß bleibt. Demnach ist $b = 1$.
Das verletzt die Bedingung $b>1$ des Master-Theorems, definiert als $T(n) = a*T(\frac{n}{b})+f(n)$
\cite{bib:schwarzer-vorlesung-alg}.
Der Algortihmus besteht aus $m, m \in \mathbb{N}$ verschachtelten For-Schleifen
Der Algorithmus besteht aus $m \in \mathbb{N}$ verschachtelten For-Schleifen
gleicher Länge.
Somit ist die Zeitkomplexität $O(n^m)$. Normiert dargestellt beträgt die Zeitkomplexität $O(n^2)$. Das lässt sich experimentell bestätigen.
\begin{nicepic}
\includegraphics[width=0.70\textwidth]{images/timecomplexity-category.png}
\captionof{figure}{Stichprobenartige Laufzeitanalyse des\\Kategorie-Renderers, gegenüber einer\\ quadratischen Kurve}
\caption*{Quelle: Eigene Darstellung}
\captionof{figure}{Stichprobenartige Laufzeitanalyse des\\Kategorie-Renderers, gegenüber einer\\ quadratischen Kurve, Quelle: Eigene Darstellung}
\label{fig:timecomplexity-category}
\end{nicepic}
Auf Optgroup-HTML-Tags wurde bewusst verzichtetet.
Grund dafür ist, dass Optgroup-Elemente an sich nicht im Dropdown auswählbar sind.
Auf Optgroup-HTML-Tags wird bewusst verzichtetet.
Grund dafür ist, dass Optgroup-Elemente an sich nicht im Dropdown-Menü auswählbar sind.
Das stellt ein Problem dar, da beispielsweise die Kategorie \enquote{Riesling},
die die Unterkategorien \enquote{Trockener Riesling} und \enquote{Halbtrockener Riesling} beinhalten könnte,
auch direkt auswählbar sein sollte. Zudem besitzen Kategorie-Elemente kein Attribut das auf die Präsenz
von Unterkategorien hindeutet \cite{bib:typo3-docs-sys-category}, womit eine Unterscheidung zwischen
Baumblättern und -Zweigen nicht ohne weiteres möglich wäre. Diese Entscheidung wäre jedoch
Baumblättern und -zweigen nicht ohne weiteres möglich wäre. Diese Entscheidung wäre jedoch
benötigt, um zwischen einem Optgroup-Tag und einem Option-Tag abzuwägen.
\clearpage
\paragraph*{SelectMultiple} sind Formfelder, die dem Nutzer eine Auswahl aus $n$ Elementen aus einer anderen
Datenbanktabelle geben. Der Nutzer kann sich für eine beliebige Anzahl dieser, eingeschlossen null, entscheiden.
Ein Beispiel für SelectMultiple-Formfelder ist: Weineigenschaften.
TYPO3-Fluid implementiert hierfür keinen ViewHelper \cite{bib:typo3-docs-fluid-form-viewhelpers},
also wurde eine eigene Lösung entworfen: Der Nutzer soll aus einer Menge $A$ wählen.
\textbf{SelectMultiple} sind Formfelder, die dem Nutzer eine Auswahl aus $n$ verschiedenen Elementen aus einer anderen
Datenbanktabelle geben. Der Nutzer kann sich für eine beliebige Auswahl dieser, eingeschlossen keinen, entscheiden.
Ein Beispiel für SelectMultiple-Formfelder sind Weineigenschaften.
TYPO3-Fluid implementiert hierfür keinen ViewHelper
\cite{bib:typo3-docs-fluid-form-viewhelpers},
also wird eine eigene Lösung entworfen: Der Nutzer soll aus einer Menge $A$ wählen.
Für alle Elemente $a \in A$
wird ein Checkbox-Feld erstellt. Dieses Element trägt den Anzeigewert \enquote{<a.title>} und den
Wert \enquote{<formfeldname>-true}.
Ist also eine dieser Checkboxen angehakt, hat sie den zuvor genannten Wert. Falls nicht, trägt sie keinen Wert.
Weil alle angehakten Checkboxen dieses Formfeldes den selben Wert tragen, ist es PHP-Seitig trivial
eine Liste aller angehakten Checkbox-Ids dieses Formfeldes aus der Liste aller Formfeldparameter zu extrahieren.
wird ein Checkbox-Feld erstellt. Dieses Element trägt den Anzeigewert \enquote{<a.title>},
den ID- und Namenswert \enquote{<formfeldname>-<a.uid>} und den
Formularwert \enquote{<formfeldname>-true}.
Ist also eine dieser Checkboxen angehakt, hat sie den zuvor genannten Formularwert. Falls nicht, trägt sie keinen Formularwert.
Weil alle angehakten Checkboxen dieses Formfeldes den selben Namenswert tragen, ist es phpseitig trivial
eine Liste aller angehakten Checkbox-Namen dieses Formfeldes aus der Liste aller Formfeldparameter zu extrahieren.
Hierfür wird die eingebaute PHP-Funktion \enquote{array\_keys} verwendet. Diese Funktion gibt alle
Keys eines Arrays in Form eines numerisch indizierten Arrays zurück.
Der optionale Parameter \enquote{filter\_values} bestimmt, dass ausschließlich die Keys
der Key-Value-Pairs, die einen bestimmten
Wert tragen, extrahiert werden \cite{bib:php-array-keys}. D.h., der Funktionsaufruf filtert alle Keys und somit alle
Wert (der Formwert) tragen, extrahiert werden \cite{bib:php-array-keys}. D.h., der Funktionsaufruf filtert alle Keys und somit alle
Formfeld-IDs des Formfeldparameter-Arrays heraus, die den Wert \enquote{<formfeldname>-true} haben. Das ist eine Liste
aller Formfeld-IDs der Checkboxen des SelectMultiples, die angehakt wurden.
Mit der eingebauten PHP-Funktion \enquote{array\_map} wird nun eine Operation auf alle Schlüssel
der Liste angewandt, die \enquote{strlen('formfeldname-')} Zeichen, von links ausgehend, von der Formfeld-ID
entfernt. Somit wird beispielsweise die Formfeld-ID \enquote{winekind-18} zu \enquote{18} transformiert. Übrig bleiben die \acp{UID} aller angehakten Elemente $a$, in Form einer Zeichenkente.
aller Formfeld-Namen der Checkboxen des SelectMultiples, die angehakt wurden.
Mit der eingebauten PHP-Funktion \enquote{array\_map} wird nun eine Operation auf alle Werte
der Liste angewandt, die
\break\enquote{strlen('<formfeldname>-')} Zeichen, von links ausgehend, vom Formfeld-Name
entfernt. Somit wird beispielsweise der Formfeld-Name \enquote{winekind-18} zu \enquote{18} transformiert.
Übrig bleiben die extrahierten \acp{UID} aller angehakten Elemente $a$, in Form einer Zeichenkette.
Über die eingebaute PHP-Funktion \enquote{intval} ist es trivial diese zu Zahlen zu übersetzen,
wodurch die tatsächlichen Objekte aus der Datenbank angefragt werden können.
\\
\\
\subsection{PDF- und QR-Code-Generierung}
Das dynamische Erstellen und Ausgeben des Versandbeilageblattes als PDF ist ein essenzieller Bestandteil des
Das dynamische Erstellen und Ausgeben des Datenblattes als PDF ist ein essenzieller Bestandteil des
Jahresauswahlprobenwerkzeuges, da dieses PDF die Schnittstelle zwischen ankommenden Weinen und dem System darstellt.
Daher ist der Profit, der durch dieses Werkzeug generiert wird, ohne dieses PDF stark eingeschränkt, da
Daher ist der Gewinn, der durch dieses Werkzeug generiert wird, ohne dieses Dokument stark eingeschränkt, da
einkommende Weine händisch, von Mitarbeitern, zugeordnet werden müssten.
Wie im \fullref{chap:stand-der-forschung} erläutert, werden für die dynamische
Wie im \fullref{chap:stand-der-forschung} erläutert wird, werden für die dynamische
Generierung dieses PDFs die Bibliotheken \enquote{chillerlan/php-qrcode} und
\enquote{mpdf/mpdf} herangezogen und über Composer installiert.
\subsubsection{QR-Code-Generierung}
Der QR-Code beinhaltet lediglich die Wein-\ac{UID} anstatt einer vollständigen URL. Hintergrund dessen ist, dass
die URL, die benötigt ist, um einen Wein einzuscannen, bis auf die Wein-\ac{UID} immer identisch ist.
Somit wird redundanz vermieden.
Der QR-Code beinhaltet lediglich die Wein-\ac{UID} anstatt einer vollständigen URL. Hintergrund ist, dass
die benötigte URL, um einen Wein einzuscannen, bis auf die Wein-\ac{UID} immer identisch ist.
Somit wird Redundanz vermieden.
Es ist Aufgabe der QR-Code-App, die den Code einscannt, aus der Wein-\ac{UID} eine vollständige URL herzuleiten.
Um Resourcen zu sparen und somit den Profit zu erhöhen, wird der QR-Code zu einem Base64-kodiertem Bild gerendert.
Das ist der Standardrückgabewert des QR-Code-Generators
und erfordert somit keine nähere Konfiguration. Ebenfalls lässt sich ein Base64-kodiertes Bild als Quellurl eines
IMG-HTML-Tags angeben, womit das Bild eingebettet ist. Hier wird der Profit erhöht, indem Arbeitszeit gespart wird,
Um effizient zu arbeiten, wird der QR-Code zu einem base64-kodierten Bild gerendert.
Das ist der Standardrückgabewert des QR-Code-\break{}Generators
und erfordert somit keine nähere Konfiguration. Ebenfalls lässt sich ein base64-kodiertes Bild als Quell-URL eines
IMG-HTML-Tags angeben, womit das Bild eingebettet ist. Das spart Arbeitszeit,
die sonst in das anderweitige Einbetten eines Bildes in einem PDF mit \enquote{mpdf} fließen müsste.
Die QR-Codegenerierung funktioniert konkret, indem ein neues QRCode-Objekt der QRCode-Klasse erstellt wird.
Diese Klasse nimmt ein QROptions-Objekt im Konstruktor, das in diesem Falle einige Stilattribute mit sich trägt.
Das QRCode-Objekt bietet nun eine Methode \enquote{render} an, die, sofern nicht anders konfiguriert, den QR-Code als
Base64-kodiertes Bild zurückgibt \cite{bib:chillerlan-php-qrcode}.
Das QRCode-Objekt bietet nun eine Methode \enquote{render} an, die sofern nicht anders konfiguriert, den QR-Code als
base64-kodiertes Bild zurückgibt \cite{bib:chillerlan-php-qrcode}.
\subsubsection{PDF-Generierung}
Firmenintern ist es Standard das Aussehen sowie die Inhalte der PDF-Dokumente, die \enquote{mpdf} erzeugt, mit HTML zu definieren,
Firmenintern ist es Standard, das Aussehen sowie die Inhalte der PDF-Dokumente, die mit \enquote{mpdf} erzeugt werden,
mit HTML zu definieren,
das an \enquote{mpdf} gereicht wird. Um die Gestaltung und die Präsentation von Variablen in der HTML-Zeichenfolge technisch
kontinuierlich mit dem restlichen Projekt zu halten und um eine gute Wartbarkeit zu gewährleisten,
wird diese HTML-Zeichenfolge mit TYPO3-Fluid getemplated. Das heißt, dass eine HTML-Templatedatei bereitgestellt wird,
diese mit TYPO3-Fluid befüllt wird und in PHP gerendert wird, um eine HTML-Zeichenkette als Ergebnis zu erhalten.
Hierfür wird ein TYPO3-StandaloneView des instanziiert, mit einem Pfad zur Template-Datei ausgestattet, Variablen angegeben,
die in Fluid verfügbar sein sollen und anschließend über die \enquote{render}-Methode zu einem String gerendert
diese mit TYPO3-Fluid befüllt und in PHP gerendert wird, um eine HTML-Zeichenkette als Ergebnis zu erhalten.
Hierfür wird ein TYPO3-StandaloneView instanziiert, mit einem Pfad zur Template-Datei konfiguriert, Variablen angegeben,
die in Fluid verfügbar sein sollen und anschließend über die \enquote{render}-Methode zu einer Zeichenkette gerendert
\cite{bib:typo3-ref-standalone-view}.
Anschließend wird ein \enquote{mpdf}-Objekt erstellt und mit einer rudimentären Konfiguration in Form eines Arrays im Konstruktor
konfiguriert. Diese Konfiguration definiert in diesem Falle Seitenabstände, Papierformat, Zeichenkodierung und Schriftarten.
Abschließend wird dem \enquote{mpdf}-Objekt das zuvor generierte HTML übergeben und über die Methode \enquote{OutputBinaryData}
als Bytes zurückgegeben und in einer Variable gespeichert \cite{bib:mpdf-ref}.
Abschließend wird dem \enquote{mpdf}-Objekt das zuvor generierte HTML übergeben, über die Methode \enquote{OutputBinaryData}
in Form von Bytes zurückgegeben und in einer Variable gespeichert \cite{bib:mpdf-ref}.
Um dieses PDF-Dokument über die Verbindung an den Nutzer zu übertragen, wird ein TYPO3-Response-Objekt erstellt.
Über dieses Response-Objekt werden einige Header gesetzt und direkt übertragen. Dieser Header sind Content-Type und Content-Length.
Abschließend werden als Response-Body die Bytes des generierten PDFs abgeschickt. Damit ist die Verbindung beendet und das
Über dieses Response-Objekt werden einige Header gesetzt und direkt übertragen. Diese Header sind Content-Type und Content-Length.
Abschließend werden als Response-Body die Bytes des generierten PDFs übertragen. Damit ist die Verbindung beendet und das
PDF zum Nutzer übertragen.
\clearpage
\subsection{Jahresauswahlproben- und Wein-Detailansichten}
Weine und Jahresauswahlproben sollen unter bestimmten Gegebenheiten einsehbar sein.
Hierzu gibt es eine Auflistung aller Jahresauswahlproben. Diese sind anklickbar, um eine Detailansicht der ausgewählten
Jahresauswahlprobe zu öffnen. Hier wird neben Metadaten der Jahresauswahlprobe auch eine Liste aller zur Einsicht berechtigen Weine
angezeigt. Diese Weine sind anklickbar, um auf eine Detailansicht der Weine zu gelangen.
Die Detailansichten für Jahresauswahlproben und Weine benötigen spezielle Autorisierung.
Diese sind: Jahresauswahlproben sind nur einsichtig, wenn sich das aktuelle Datum innerhalb des
Sichtbarkeitszeitraumes der Jahresauswahlprobe befindet.
Detailansichten für Weine sind immer für den zugehörigen Teilnehmer einsichtig.
Nach Abschluss einer Jahresauswahlprobe sind alle ihr angehörigen Weine öffentlich einsichtig.
Das hat den Hintergrund, dass Jahresauswahlproben Blindverkostungen sind
und niemand die Möglichkeit haben sollte, im Voraus Informationen über die teilnehmenden Weine in Erfahrung zu bringen.
Die Ergebnisse der Jahresauswahlproben sind öffentlich, also sind es die Weine nach Abschluss einer Jahresauswahlprobe auch.
Mitarbeiter von \ac{WM}, wenn sie mit einem solchen Account angemeldet sind, haben immer Einsicht in Wein-Detailansichten.
Die Wein-Detailseite verfügt außerdem über einen \enquote{Datenblatt drucken}-Button, der auf das Datenblatt-PDF verlinkt.
Dieser Button ist nur für den zugehörigen Teilnehmer und Mitarbeiter verfügbar.
Diese Daten, Fakten und Restriktionen werden serverseitig kontrolliert, um Manipulationen des Nutzers auszuschließen.
Um das zu realisieren werden Daten mit Fluid-Templates konditionell dargestellt und über Fluid-ViewHelper Links
zu anderen Ansichten generiert. Diese ViewHelper übergeben Parameter. Die hierfür relevanten Parameter der verschiedenen
Ansichten sind beispielsweise Wein-\acp{UID} und Jahresauswahlproben-\acp{UID}. Um Informationen über den angemeldeten Nutzer,
wie beispielsweise seiner Teilnehmernummer oder seiner Nutzergruppenzugehörigkeit, zu erlangen, wird sich
der Extbase-nativen Domain-Model-FrontendUser-Klasse bedient \cite{bib:typo3-ref-extbase-model-feuser}.
Mit Abschluss der Phase der Digitization können alle Datenstrukturen im TYPO3-Backend händisch angelegt,
eingesehen, gelöscht, bearbeitet und im Frontend von Nutzern befüllt werden.
\section{Digitalization}
In der Phase \textit{Digitalization} werden bestehende Geschäftsprozesse so verändert,
dass mit digitalen Werkzeugen und Datenmodellen gearbeitet werden kann \cite{bib:fengli}.
Damit baut diese Phase auf der vorherigen Phase \enquote{Digitization} auf, um mit den dort
implementierten Datenmodellen zu arbeiten. Im Folgenden werden die Umsetzungen der
erforderlichen Geschäftsprozesse beschrieben.
\subsection{Schnittstelle QR-Code-Scanner}
Es ist angedacht, dass Mitarbeiter über die App \enquote{QRBot} den QR-Code auf dem Einlieferungsschein einscannen.
Es ist angedacht, dass Mitarbeiter über die App \enquote{QRBot} den QR-Code auf dem Datenblatt einscannen.
Diese App ermöglicht es Nutzern für jeden eingescannten Code eine URL zu öffnen und den Wert des QR-Codes anstelle eines Platzhalters
in der URL einzufügen.
Hierfür bietet das Jahresauswahlprobenwerkzeug eine Schnittstelle bzw. eine Seite an, die eine Wein-\ac{UID} als
@@ -392,40 +440,17 @@ Das Nutzerkonto wird von Redakteuren oder Administratoren im TYPO3-Backend erste
Nach einer Anmeldung bleibt diese Sitzung aktiv und verfällt erst nach längerer Inaktivität.
Wird ein Wein als \enquote{eingegangen} markiert, wird der betroffene Teilnehmer per Email informiert.
Hierzu wird die FluidEmail-Klasse des TYPO3-Cores herangezogen.
Sollte ein Wein bereits als \enquote{eingegangen} markiert sein, wird keine Email verschickt und dem Mitarbeiter wird kommuniziert,
Sollte ein Wein bereits als \enquote{eingegangen} markiert sein, wird keine Email verschickt und dem Mitarbeiter kommuniziert,
dass keine Änderungen vorgenommen wurden.
Abschließend werden im Frontend allgemeine Daten über den Wein angezeigt, damit Mitarbeiter sich sicher sein können,
Abschließend werden im Frontend allgemeine Daten zum Wein angezeigt, damit sich Mitarbeiter sicher sein können,
den richtigen Wein eingescanned zu haben.
\subsection{Jahresauswahlproben- und Wein-Detailansichten}
Weine und Jahresauswahlproben sollen unter bestimmten Gegebenheiten einsichtig sein.
Hierzu gibt es eine Auflistung aller Jahresauswahlproben. Diese sind anklickbar, um eine Detailansicht der ausgewählten
Jahresauswahlprobe zu öffnen. Hier wird neben Metadaten der Jahresauswahlprobe eine Liste aller zur Einsicht berechtiger Weine
angezeigt. Diese Weine sind anklickbar, um auf eine Detailansicht der Weine zu gelangen.
Die Detailansichten für Jahresauswahlproben und Weine benötigen spezieller Autorisierung.
Diese sind: Jahresauswahlproben sind nur einsichtig, wenn sich das aktuelle Datum innerhalb des
Sichtbarkeitszeitraumes der Jahresauswahlprobe befindet.
Detailansichten für Weine sind immer für den zugehörigen Teilnehmer einsichtig.
Nach Abschluss einer Jahresauswahlprobe sind alle ihr angehörigen Weine öffentlich einsichtig.
Das hat den Hintergrund, dass Jahresauswahlproben Blindverkostungen sind
und niemand die Möglichkeit haben sollte, im Voraus Informationen über die teilnehmenden Weine in Erfahrung zu bringen.
Die Ergebnisse der Jahresauswahlproben sind öffentlich, also sind es die Weine nach Abschluss einer \ac{JAP} auch.
Mitarbeiter von Weinland Mosel, wenn mit einem solchen Account angemeldet, haben immer Einsicht in Wein-Detailansichten.
Die Wein-Detailseite verfügt außerdem über einen \enquote{Versandetikett drucken}-Button, der auf das Versand-PDF verlinkt.
Dieser Button ist nur für den zugehörigen Teilnehmer und Mitarbeiter verfügbar.
Diese Daten, Fakten und Restriktionen werden serverseitig kontrolliert, um Manipulationen des Nutzers auszuschließen.
Um das zu realisieren werden Daten mit Fluid-Templates konditionell dargestellt und über Fluid-ViewHelper Links
zu anderen Ansichten generiert. Diese ViewHelper übergeben Parameter. Die hierfür relevanten Parameter der verschiedenen
Ansichten sind beispielsweise Wein-\acp{UID} und \ac{JAP}-\acp{UID}. Um Informationen über den angemeldeten Nutzer,
wie beispielsweise seiner Teilnehmernummer oder seiner Nutzergruppenzugehörigkeit, zu erlangen, wird sich
der Extbase-nativej Domain-Model-FrontendUser-Klasse bedient \cite{bib:typo3-ref-extbase-model-feuser}.
\subsection{CSV-Export}
Das letzte Glied des analogen Prozesses, den es zu digitalisieren gilt, ist der Datenexport der Weindaten je Jahresauswahlprobe.
TYPO3s ListView bietet einen nativen CSV-Exporter an \cite{bib:pixelant-typo3-data-export},
jedoch kommt dieser nicht den Anforderungen gerecht, da das CSV-Dokument Daten verschiedener Datenbanktabellen im Verein
beinhalten muss.
Um eine reibungslose Integration in die restlichen Prozesse von Weinland Mosel zu gewährleisten, muss das exportierte CSV
jedoch wird dieser nicht den Anforderungen gerecht, da das benötigte CSV-Dokument Daten verschiedener Datenbanktabellen im Verein
beinhalten muss. Der Native CSV-Exporter gibt jedoch lediglich Inhalte einer Datenbanktabelle aus \cite{bib:pixelant-typo3-data-export}.
Um eine reibungslose Integration in die restlichen Prozesse von \ac{WM} zu gewährleisten, muss das exportierte CSV
das selbe Format haben, wie bisher bestehende Excel-Dateien. Dieses Format ist durch genaue Spaltennamen,
Spalteneihenfolgen und den Arten von Daten, die angefragt werden, definiert.
Um einen benutzerdefinierten Exporter im Backend bereitzustellen, wird ein Backendmodul registriert, das immer im linken
@@ -441,20 +466,24 @@ Das CSV-Dokument wird über die PHP-native Funktion \enquote{fputcsv} generiert.
numerisch indizierten Array und schreibt eine darauf basierende CSV-Zeile in eine Datei \cite{bib:php-fputcsv}.
Um gut wartbaren PHP-Code zu erzeugen, werden alle CSV-Zeilen in einem zweidimensionalen Array,
der das gesamte CSV-Dokument darstellt,
durch alphanumerisch indizierte, innere Arrays abgebildet. Somit ist bei jeder Wertzuweisung der zugehörige Spaltenname ersichtlich.
durch alphanumerisch indizierte, innere Arrays abgebildet. Somit ist bei jeder Wertzuweisung der zugehörige Spaltenname als Array-Key ersichtlich.
Über die nativen PHP-Funktionen \enquote{array\_keys} und \enquote{array\_values} wird dieser zwar gut lesbare,
aber mit \enquote{fputcsv} inkompatibler
Array zu einer Reihe kompatibler Array konvertiert. Hierbei werden durch \enquote{array\_values} die Kopfzeile und durch
aber mit \enquote{fputcsv} inkompatible
Array zu einer Reihe kompatibler Array konvertiert. Hierbei werden durch \enquote{array\_keys} die Kopfzeile und durch
\enquote{array\_values} die Datenzeilen extrahiert. Diese Zeilen werden anschließend mit \enquote{fputcsv}
in die Zieldatei geschrieben. Als Zieldatei wird eine temporäre Datei im Arbeitsspeicher angegeben,
um das fertig erzeugte CSV-Dokument als Zeichenkette in PHP zu erhalten. Das spart vermeidbare Festplattenschreib- und Lesezugriffe.
Im Fluid-Template des Backendmoduls wird das generierte CSV-Dokument in einem nicht beschreibbaren Textarea-Feld präsentiert.
Um Weinland Mosel weitere Arbeitszeit zu sparen und somit den Profit zu fördern, wird eine Download-Funktion für CSV-Dateien
angeboten. Das erspart das manuelle Kopieren und Abspeichern von CSV-Code von IT-Fachfremden, reduziert damit die Anzahl
Um \ac{WM} weitere Arbeitszeit zu ersparen, wird eine Download-Funktion für CSV-Dateien
angeboten. Das erspart das manuelle Kopieren und Abspeichern von CSV-Zeichenketten durch IT-Fachfremde, reduziert damit die Anzahl
an benötigten Übergangsschritten in weitere Prozesse und reduziert somit die Komplexität der Umstellung.
Auch im Interesse, Arbeitszeit in der Umsetzung zu sparen,
wurde diese Downloadfunktion JavaScript-seitig umgesetzt. Dadurch ist der Download in derselben Action implementiert.
Somit muss weder abstrahiert werden, noch ein weiterer Exporter gebaut werden.
wird diese Downloadfunktion javascript-seitig umgesetzt.
Dadurch ist der Download in derselben Action, die CSV für das Textarea-Feld generiert, implementiert.
Somit muss weder abstrahiert werden, noch ein weiterer CSV-Exporter gebaut werden.
Hierfür wird ein EventHandler auf den Download-Button angewandt, der bei Betätigung ein vestecktes
\enquote{a}-Element erstellt, über das \enquote{download}-Attribut den Download-Dateinamen festlegt und als \enquote{href}-Attribut
eine Blob-Url zuweist. Diese Blob-Url wird über ein Blob-Objekt generiert \cite{bib:tutorialspoint-js-save-text}.
\enquote{a}-Element erstellt, über das HTML-Attribut \enquote{download} des \enquote{a}-Elementes den Download-Dateinamen
festlegt und als \enquote{href}-HTML-Attribut
eine Blob-URL zuweist. Diese Blob-URL wird über ein Blob-Objekt generiert.
Wird nun der Download-Button gedrückt, wird javascript-seitig eine Datei erzeugt und gespeichert
\cite{bib:tutorialspoint-js-save-text}.

View File

@@ -1,60 +1,61 @@
\chapter{Stand der Forschung}
\label{chap:stand-der-forschung}
Der Stand der Forschung beleuchtet verschiedene Erkenntnisse zur Digitalisierung und zur digitalen Transformation.
Der Stand der Forschung beleuchtet verschiedene Entwicklunsmethodiken zur Digitalisierung.
\section{Modell nach Parviainen et al.}
\quotecite{The importance of digitalization is becoming understood,
but the question now is how to do it in practice in order to best benefit from it.}
\cite{bib:Parviainen_Tihinen_Kaariainen_Teppola_2022}.
Parviainen et al. stellten sich diese Frage und entwickelten in ihrer Forschungsarbeit einen konzeptionellen Rahmen, um zu verstehen, wie die Digitalisierung in der Praxis umgesetzt werden kann und welche Vorteile sich daraus ergeben. Dieser Rahmen basiert auf dem \ac{PDCA} -Prinzip.
Parviainen et al. stellten sich die Frage, wie man in der Praxis von Digitalisierung profitieren kann und entwickelten in ihrer Forschungsarbeit
einen konzeptionellen Rahmen, um zu verstehen, wie die Digitalisierung in der Praxis umgesetzt werden kann und welche Vorteile sich daraus ergeben.
Dieser Rahmen basiert auf dem \ac{PDCA} -Prinzip.
\\
\\
Dieses Rahmenwerk sieht anhand des \ac{PDCA}-Prinzips vier Schritte vor:
\paragraph*{Im ersten Schritt} wird definiert, wie weit die Digitalisierung für das Unternehmen gehen kann und welche Position
\\
\\
\textbf{Im ersten Schritt} wird definiert, wie weit die Digitalisierung für das Unternehmen gehen kann und welche Position
das Unternehmen dabei anstrebt. Dieser Schritt kann in vier Teilschritte unterteilt werden: Ausmaße, Treiber, Szenarien und
Ziele. Für die Bestimmung der Ausmaße ist die Analyse aktueller Trends und deren Relevanz für die Domäne des Unternehmens
wichtig. Ebenfalls ist wichtig, wie weit diese Trends bereits im Fachgebiet verankert sind. Zur Einordnung eignen sich
\ac{SWOT} -Analysen. Diese Analysen sind die Grundlage, um ein Unternehmen in der Digitalisierung aufzustellen.
\\
\\
Aus den Ergebnissen der Trendanalysen sollten dann Treiber identifiziert werden. Diese Treiber sollten auf der Grundlage zukünftiger Ergebnisse skalierbar sein: Beispielsweise könnten drastische Maßnahmen erforderlich sein, um drastische Auswirkungen zu verhindern oder drastische Verbesserungen zu erreichen.
\\
\\
Für die relevantesten Treiber sollten Zukunftsszenarien untersucht werden. Dies ist wichtig, um zu wissen, welche Auswirkungen bestimmte Trends in welcher Ausprägung haben werden. Relevant sind hier die Vorteile der Umsetzung des Szenarios, die Kosten der Umsetzung, sowie die Risiken, das Szenario nicht umzusetzen oder doch umzusetzen. Auf dieser Basis kann das beste Szenario ausgewählt werden.
Aus den Ergebnissen der Trendanalysen sollten dann Treiber identifiziert werden. Diese Treiber sollten auf der Grundlage zukünftiger Ergebnisse skalierbar sein: Beispielsweise könnten drastische Maßnahmen erforderlich sein, um schlimme Auswirkungen zu verhindern oder große Verbesserungen zu erreichen.
\clearpage
Für die relevantesten Treiber sollten Zukunftsszenarien untersucht werden. Dies ist wichtig, um zu wissen,
welche Auswirkungen bestimmte Trends in welcher Ausprägung haben würden. Relevant sind hier die Vorteile der Umsetzung des Szenarios,
die Kosten der Umsetzung, sowie die Risiken. Auf dieser Basis kann das beste Szenario ausgewählt werden.
\\
\\
Aus diesem Szenario werden schließlich die Ziele der Digitalisierung abgeleitet. Diese Ziele müssen so formuliert sein, dass sie mit der Ausgangssituation verglichen werden können.
\begin{nicepic}
\includegraphics[width=1\textwidth]{images/model-digital-transformation.png}
\captionof{figure}{Model for tackling digital transformation}
\caption*{Quelle: \cite{bib:Parviainen_Tihinen_Kaariainen_Teppola_2022}}
\captionof{figure}{Modell um digitale Transformation in Angriff zunehmen, Quelle: \cite{bib:Parviainen_Tihinen_Kaariainen_Teppola_2022}}
\label{fig:model-digital-transformation}
\end{nicepic}
\begin{nicepic}
\includegraphics[width=0.5\textwidth]{images/plan-do-check-act.png}
\captionof{figure}{\acf*{PDCA}}
\caption*{Quelle: \cite{bib:abraham2005sustainability}}
\includegraphics[width=0.45\textwidth]{images/plan-do-check-act.png}
\captionof{figure}{Das Plan-Do-Check-Act-Modell, Quelle: \cite{bib:abraham2005sustainability}}
\label{fig:model-digital-transformation}
\end{nicepic}
\paragraph*{Im zweiten Schritt} wird der Ist-Zustand des Unternehmens ermittelt. Dazu wird die aktuelle
\textbf{Im zweiten Schritt} wird der Ist-Zustand des Unternehmens ermittelt. Dazu wird die aktuelle
Positionierung des Unternehmens im Hinblick auf den Zielzustand mit Fokus auf die Digitalisierungsziele betrachtet. Dazu wird
der Ist-Zustand im Kontext des Soll-Zustandes anhand definierter Fragen bewertet. Die Auswahl der Fragen unterscheidet sich je
nach Art der Ziele. Der gesamte Fragenkatalog kann im Detail der Ausarbeitung von Parviainen et al. entnommen werden.
\paragraph*{Der dritter Schritt} ist die Festlegung der konkreten Schritte, die für den Übergang vom
Ist-Zustand zum Soll-Zustand erforderlich sind. Dazu muss zunächst die Lücke zwischen dem Ist- und dem Soll-Zustand
\\
\\
\textbf{Im dritten Schritt} werden konkrete Schritte festgelegt, die für den Übergang vom
Ist-Zustand in den Soll-Zustand erforderlich sind. Dazu muss zunächst die Lücke zwischen dem Ist- und dem Soll-Zustand
identifiziert werden. Relevant ist dabei der aktuelle Stand der Technik und welche Veränderungen notwendig sind, um den
Zielzustand zu erreichen. Anschließend sollten die konkreten Schritte identifiziert werden, die erforderlich sind, um diese
Lücke zu schließen. Wenn zum Beispiel ein Treiber \enquote{interne Effizienz} ist, könnten die Schritte darin bestehen, neue digitale
Werkzeuge zu integrieren. Schließlich werden diese Schritte analysiert und priorisiert. Prädestiniert dafür sind
Kosten-Nutzen-Analysen, Analysen der Umsetzbarkeit, des Wartungsaufwands und der Mitarbeiterschulung.
\clearpage
\paragraph*{Der vierte Schritt} befasst sich mit der Umsetzung der in Schritt 3 geplanten Maßnahmen und
\textbf{Der vierte Schritt} befasst sich mit der Umsetzung der in Schritt drei geplanten Maßnahmen und
der Bewertung der erzielten Ergebnisse. Diese Bewertung der Ergebnisse sollte z.B. soziokulturelle Barrieren berücksichtigen,
die sich aus den Reaktionen bestimmter Stakeholder ergeben, die möglicherweise negativ auf Veränderungen reagieren
oder Schwierigkeiten bei der Einführung neuer Technologien haben. Wenn diese Analyse zeigt, dass die Ziele der Digitalisierung
@@ -65,27 +66,28 @@ werden \cite{bib:Parviainen_Tihinen_Kaariainen_Teppola_2022}.
Nach Verhoef et al. lässt sich der hier sogenannte \enquote{Prozess der Digitalisierung} in drei Phasen unterteilen.
Diese drei Phasen sind \textit{Digitization}, \textit{Digitalization} und \textit{Digital Transformation}
\cite{bib:verhoef}.
Die Phase \textit{Digitization} befasst sich mit der Umwandlung analoger Datenstrukturen und Modellen in digitale Datenmodelle,
sodass diese digital, in Form von Nullen und Einsen, gespeichert und elektronisch weiterverarbeitet werden können
\cite{bib:dougherty, bib:loebbecke}.
Die Phase \textit{Digitization} befasst sich mit der Umwandlung analoger Datenstrukturen und Modelle in digitale Datenmodelle,
sodass diese digital, in Form von Nullen und Einsen, gespeichert und elektronisch\break weiterverarbeitet werden können
\cite{bib:dougherty}\break\cite{bib:loebbecke}.
\quotecite{Examples concern the use of digital forms in ordering processes, the use of digital surveys, or the use digital applications for internal financial declarations.} \cite[S. 891]{bib:verhoef}.
\textit{Digitalization} beschreibt den Prozess der Veränderung bestehender Geschäftsprozesse, um mit digitalen Werkzeugen
und Datenmodellen zu arbeiten \cite{bib:fengli}.
und Datenmodellen zu arbeiten \cite{bib:fengli}. Beispielsweise der Verwendung von Robotern in der Produktion \cite{bib:verhoef}.
Die letzte Phase, die \textit{Digitale Transformation}, beschreibt eine firmenweite Veränderung, die beispielsweise
Ergründungen neuer Geschäftsmodelle mit sich bringen könnte \cite{bib:pagani}.
\section{Abwägung in Bezug auf die Problemstellung}
In Bezug auf die hier betrachteten Methoden ist es wichtig zu erwähnen, dass der betrachtete Kontext
lediglich die Digitalisierungs \textbf{eines} Geschäftsprozesses behandelt.
In Bezug auf die hier betrachteten Methodiken ist es wichtig zu erwähnen, dass der betrachtete Kontext
lediglich die Digitalisierung \textbf{eines} Geschäftsprozesses behandelt.
Diese Ausarbeitung befasst sich nicht
mit firmenweiten Veränderungen, wie sie von den nahegelegten Modellen abgedeckt ist.
Daher sind geringfügige Anpassungen der Methoden unabdinglich.
Des Weiteren ist Resourcenintensivität ein relevanter Gesichtspunkt einer Abwägung, da es ein
Projektbudget einzuhalten gilt.
Daher sind geringfügige Anpassungen der Methodiken unabdinglich.
Des Weiteren ist Ressourcenintensität ein relevanter Gesichtspunkt dieser Abwägung, da eine solche Digitalisierung
effizient und profitabel sein soll.
\subsection{Parviainen et al.}
Der Autor stellt fest, dass das Modell nach Parviainen et al. hauptsächlich methodisch ausgerichtet ist
Der Autor stellt fest, dass das Modell nach Parviainen et al. überwiegend methodisch ausgerichtet ist
und für den betrachteten Kontext der Problemstellung unverhältnismäßig ressourcenintensiv ist,
da der Umfang der Anforderungen geringfügig ist. Dieses Modell legt den Fokus auf firmenweite Veränderungen
da der Umfang der Projektes geringfügig ist. Dieses Modell legt den Fokus auf firmenweite Veränderungen
anstatt auf einzelne Prozesse und könnte daher in Bezug auf diese Problemstellung als \enquote{überdimensioniert} bezeichnet werden.
\subsection{Verhoef et al.}
@@ -96,17 +98,18 @@ Digitalisierung bestimmter
Geschäftsprozesse befassen. Phase drei befasst sich mit firmenweiten Veränderungen,
die über Geschäftsprozesse hinausgehen \cite{bib:verhoef}.
Firmenweite Veränderungen befinden sich außerhalb des Rahmens dieser Ausarbeitung.
Der Autor empfindet das Modell nach Verhoef et al. als agiler und unrestriktiver.
Der Autor empfindet das Modell nach Verhoef et al. als agiler, unrestriktiver, weniger overheadlastig und somit effizienter.
\subsection{Fazit}
Aufgrund des kleinen Umfangs der Problemstellung und des kleinen Projektbudgets fällt die Entscheidung auf das
kleiner gefasste Modell nach Verhoef et al.. Ziel dieser Entscheidung ist es, vermeidbare Kosten, die keine eminenten
Vorteile bringen, zu vermeiden.
Nachdem Phase drei des Verhoefer-Modells ausgeklammert wurde, sieht das zu verfolgende Modell aus wie folgt:
Aufgrund des kleinen Projektumfanges und der großen Wahrscheinlichkeit, dass sich Anforderungen ändern werden,
fällt die Entscheidung auf das
minimalistischere Modell nach Verhoef et al.. Grundlage dieser Entscheidung sind Forschungsarbeiten von M. Ayman Al Ahmar,
die nahelegen, dass Projekte dieser Art idealerweise nach \enquote{extreme programming}-Paradigmen behandelt werden
\cite{bib:ayman-al-ahmar}.
Nachdem Phase drei des Verhoef-Modells ausgeklammert wurde, sieht das zu verfolgende Modell aus wie folgt:
\begin{nicepic}
\includegraphics[width=0.7\textwidth]{images/umsetzungsdiagramm.png}
\captionof{figure}{Umsetzungsplanung}
\caption*{Quelle: Eigene Darstellung}
\includegraphics[width=0.45\textwidth]{images/umsetzungsdiagramm.png}
\captionof{figure}{Umsetzungsplanung, Quelle: Eigene Darstellung}
\label{fig:umsetzungsplanung}
\end{nicepic}

View File

@@ -1,137 +1,144 @@
\chapter{Stand der Technik}
\label{chap:stand-der-technik}
Der Stand der Technik bezieht sich auf bestehende, praktische Umsetzungen der erforderlichen Technologien.
Im Wesentlichen gibt es drei Arten von Technologien, die untersucht werden müssen: Die bestehende Website von \ac{WM},
Im Wesentlichen gibt es drei Arten von Technologien, die untersucht werden müssen: Die bestehende Webseite von \ac{WM},
Bibliotheken zur Erzeugung von QR-Codes und Bibliotheken zur Erzeugung von PDF-Dateien.
\section{Die bestehende Webseite}
Als Mitentwickler des Projektes ist dem Autor bekannt, dass die bestehende Webseite ein TYPO3-Redaktionssystem ist. Das Frontend der Webseite wird mit Webpack und Sass übersetzt.
Webpack ist ein Modulbundler \cite{bib:smashmagazine-webpack} und Sass ein CSS-Präprozessor \cite{bib:w3schools-sass}.
TYPO3 ist ein Redaktionssystem und PHP-Rahmenwerk, das Daten- und Inhaltspflege in einem geschützten Bereich
ermöglicht, Frontend- und Backend-Nutzer und Berechtigungen steuert \cite{bib:typo3-docs-getting-started}
und über die Systemerweiterung
\enquote{Extbase} eine mächtige Entwicklerschnittstelle bereitstellt,
um hochindividualisierte Funktionalitäten zu ermöglichen \cite{bib:typo3-docs-extbase-reference}.
Webpack ist ein Modulbundler \cite{bib:smashmagazine-webpack} und Sass ein CSS-Präprozessor
\break\cite{bib:w3schools-sass}.
TYPO3 ist ein Redaktionssystem und PHP-\break{}Rahmenwerk, das Daten- und Inhaltspflege in einem geschützten Bereich
ermöglicht.
Außerdem steuert TYPO3 Frontend-, Backend-Nutzer und deren Berechtigungen \cite{bib:typo3-docs-getting-started}.
Über die Systemerweiterung
\enquote{Extbase} wird eine mächtige Entwicklerschnittstelle bereitgestellt,
um hochindividualisierte Funktionalitäten zu ermöglichen.
\\\cite{bib:typo3-docs-extbase-reference}
\section{QR-Code-Bibliotheken}
Um mit QR-Codes zu arbeiten, ist es unabdinglich, QR-Codes zu erstellen, da dieselben sonst nicht vorhanden sind.
Um mit QR-Codes zu arbeiten, ist es unabdinglich, QR-Codes zu erstellen.
Im Folgenden werden einige Implementationen von QR-Code-Generator-Bibliotheken im Detail betrachtet. Es wird sich
auf bereits verwendete Programmiersprachen begrenzt.
auf bereits vom System verwendete Programmiersprachen begrenzt.
\subsection{Javascript-Implementationen}
\subsubsection*{Jquery-qrcode}
\textit{Jquery-qrcode} ist ein Plugin für JQuery um dynamisch QR-Codes auf Browserseite zu generieren.
\subsection{JavaScript-Implementationen}
\subsubsection*{jquery-qrcode.js}
\enquote{jquery-qrcode.js} ist ein Plugin für jQuery, um dynamisch QR-Codes auf Browserseite zu generieren.
Jedoch verweist diese Bibliothek selbst auf ihren desolaten Zustand und empfielt stattdessen \enquote{kjua} zu verwenden
\cite{bib:larsjung-jquery-qrcode}. Somit scheidet jquery-qrcode für nähere Evaluationen aus, da die Software nicht mehr
gepflegt wird. \textit{Jquery-qrcode} wurde bis Januar 2023 853 mal von Nutzern mit einem Stern
\cite{bib:larsjung-jquery-qrcode}. Somit scheidet \enquote{jquery-qrcode.js} für nähere Evaluationen aus, da die Software nicht mehr
gepflegt wird. \enquote{jquery-qrcode.js} wurde bis Januar 2023 853 mal von Nutzern mit einem Stern
markiert \cite{bib:larsjung-jquery-qrcode}.
Wenn ein Nutzer ein Github-Repository mit einem Stern markiert, zeigt sich der Nutzer interessiert genug,
um über Neuigkeiten auf dem Laufenden gehalten werden zu wollen \cite{bib:github-stars}. Jquery-qrcode ist MIT-lizensiert
um über Neuigkeiten auf dem Laufenden gehalten werden zu wollen \cite{bib:github-stars}. \enquote{jquery-qrcode.js} ist MIT-lizensiert
\cite{bib:larsjung-jquery-qrcode}.
\subsubsection*{Kjua}
\textit{Kjua} ist eine Javascript-Bibliothek, um dynamisch QR-Codes auf der Browserebene zu generieren.
Im Gegensatz zu \textit{jquery-qrcode} funktioniert Kjua auch ohne JQuery. Es werden diverse Stilattribute für gestaltete
QR-Codes unterstützt \cite{bib:larsjung-kjua}. Kjua kann QR-Codes über HTML-Canvas, Bilder und Vektorgrafiken umsetzen. Das ist bei näherer Betrachtung der Kjua Tech Demo \enpointy{https://larsjung.de/kjua/latest/demo} ersichtlich, jedoch
nicht explizit erwähnt. Nach dem aktuellen Stand (Januar 2023) wurde Kjua von 243 Nutzern mit einem Stern markiert.
Kjuas letzte Codeänderung liegt circa zwei Jahre zurück. Es gibt eine unbeantwortete, sieben Jahre alte Pull-Request und
Issues scheinen ignoriert zu werden. Kjua ist MIT-lizensiert \cite{bib:larsjung-kjua}.
\subsubsection*{kjua}
\enquote{kjua} ist eine JavaScript-Bibliothek, die dynamisch QR-Codes auf Browserebene generiert.
Im Gegensatz zu \enquote{jquery-qrcode.js} funktioniert \textit{kjua} auch ohne jQuery. Es werden diverse Stilattribute für gestaltete
QR-Codes unterstützt \cite{bib:larsjung-kjua}. \enquote{kjua} kann QR-Codes über HTML-Canvas, Bilder und Vektorgrafiken umsetzen.
Das ist bei näherer Betrachtung der Kjua-Tech-Demo \enpointy{https://larsjung.de/kjua/latest/demo} ersichtlich, jedoch
nicht explizit erwähnt. Nach dem aktuellen Stand (Januar 2023) wurde \enquote{kjua} von 243 Nutzern mit einem Stern markiert.
\enquote{Kjuas} letzte Codeänderung liegt circa zwei Jahre zurück. Es gibt eine unbeantwortete, sieben Jahre alte Pull-Request und
Issues scheinen ignoriert zu werden. \enquote{kjua} ist MIT-lizensiert \cite{bib:larsjung-kjua}.
\subsubsection*{Soldair/node-qrcode}
\textit{Soldair/node-qrcode} ist eine node.js-basierte Implementation eines QR-Code-Generators und bietet somit Funktionialität
serverseitig, als CLI, sowohl auch Browserseitig an. Die Readme-Datei zeugt von Länge, ist reich an Beispielen
\subsubsection*{soldair/node-qrcode}
\enquote{soldair/node-qrcode} ist eine Node.js-basierte Implementation eines QR-Code-Generators und bietet somit Funktionialität
serverseitig, als Kommandozeilenwerkzeug, sowohl auch browserseitig an. Die Readme-Datei ist umfangreich, reich an Beispielen
und detailreichen Erklärungen. Der letzte Commit ist zu diesem Zeitpunkt knapp älter als ein halbes Jahr. Somit macht das
Projekt einen moderat gepflegten Eindruck. Die Readme-Datei verweist auf Unit Tests bei Travis, jedoch lief die letzte Pipeline
vor circa zwei Jahren, Februar 2021, durch und schlug fehl. Einige Pull-Requests und Issues werden seit Jahren ignoriert
Projekt einen moderat gepflegten Eindruck. Die Readme-Datei verweist auf Unit-Tests bei Travis, jedoch lief die letzte Pipeline
Februar 2021 durch und schlug fehl. Einige Pull-Requests und Issues werden seit Jahren ignoriert
\cite{bib:soldair-node-qrcode}.
Die Bibliothek wurde 74 millionen mal heruntergeladen und mit 6308 Sternen markiert.
Soldair/node-qrcode ist MIT-lizensiert \cite{bib:npmjs-soldair-node-qrcode}.
Die Bibliothek wurde 74 Millionen mal heruntergeladen und mit 6.308 Sternen markiert.
\enquote{Soldair/node-qrcode} ist MIT-lizensiert \cite{bib:npmjs-soldair-node-qrcode}.
\subsection{PHP-Implementationen}
\subsubsection*{Chillerlan/php-qrcode}
Eine arrivierte Lösung für QR-Code-Generierung in PHP ist \textit{chillerlan/php-qrcode}, umgesetzt durch
Eugen Rochko et al.. \textit{Chillerlan/php-qrcode}s Etabliertheit zeigt sich durch den zu diesem
Zeitpunkt (Jahnuar 2023) auf 5 Millionen stehenden Downloadzähler,
mehreren Entwickler und den letzten Commit, der zu diesem Zeitpunk nicht älter als einen Monat ist.
\subsubsection*{chillerlan/php-qrcode}
Eine arrivierte Lösung für QR-Code-Generierung in PHP ist \break\enquote{chillerlan/php-qrcode}, umgesetzt durch
Eugen Rochko et al.. \break\enquote{chillerlan/php-qrcode}s Etabliertheit zeigt sich durch den zu diesem
Zeitpunkt (Januar 2023) auf 5 Millionen stehenden Downloadzähler,
mehreren Entwicklern und dem letzten Commit, der zu diesem Zeitpunk nicht älter als einen Monat ist.
Insgesamt erfolgten bis dato 808 Commits von 6 Entwicklern. Das Projekt verfügt über Unit-Tests,
die 90\% der Zeilen der Codebase abdecken. Rochko übernahm Teile der Codebase aus
dem Java-Projekt \enquote{ZXing} und übersetzte diese zu PHP.
Es gibt zu diesem Zeitpunkt keine unbeantworteten Issues oder Pull-Requests.
\textit{Chillerlan/php-qrcode} basiert auf einer angepassten Version von \textit{kazuhikoarase/qrcode-generator}.
Einzig auffällig sind die Commitnachrichten, die zuteils nur aus einem (1) Emoji bestehen.
\textit{Chillerlan/php-qrcode} wurde von 1212 Github-Nutzern mit einem Stern markiert. Die Bibliothek ist MIT-lizensiert
\enquote{chillerlan/php-qrcode} basiert auf einer angepassten Version von \enquote{kazuhikoarase/qrcode-generator}.
Einzig auffällig sind die Commitnachrichten, die zuteils nur aus einem Emoji bestehen.
\enquote{chillerlan/php-qrcode} wurde von 1.212 Github-Nutzern mit einem Stern markiert.
Die Bibliothek ist MIT-lizensiert
\cite{bib:chillerlan-php-qrcode}.
\subsubsection*{Kreativekorp/barcode}
\textit{kreativekorp/barcode} ist eine PHP-Bibliothek zur Generierung von QR-Codes, bereitgestellt von
\textit{Kreative Software}, R.G. Bettencourt.
Diese Implementation umfasst etablierte Barcode-Formaten und unterstützt eine Vielzahl an Anpassungsmöglichkeiten.
Das Projekt wurde bis zum heutigen Tage 189 mal mit einem Stern markiert \cite{bib:kreativkorp-barcode}.
\subsubsection*{kreativekorp/barcode}
\enquote{kreativekorp/barcode} ist eine PHP-Bibliothek zur Generierung von QR-Codes, bereitgestellt von
\enquote{Kreative Software}, R.G. Bettencourt.
Diese Implementation umfasst etablierte Barcode-Formate und unterstützt eine Vielzahl an Anpassungsmöglichkeiten.
Das Projekt wurde bis zum heutigen Tag 189 mal mit Sternen markiert \cite{bib:kreativkorp-barcode}.
Vier von den sechs vorhandenen Commits erfolgten innerhalb von zwei Tagen in 2016. Ein weiterer
Commit erfolte wenige Tage später. Der aktuellste Commit wurde knapp zwei Jahre später, 2018, veröffentlicht.
Das liegt zu diesem Zeitpunkt vier Jahre in der Vergangenheit.
Damit ist diese Bibliothek de-facto sechseinhalb Jahre alt und wurde seitdem einmal um Featuers erweitert.
Damit ist diese Bibliothek de facto sechseinhalb Jahre alt und wurde seitdem einmal um Featuers erweitert.
Issues und Pull-Requests werden weitestgehend ignoriert.
Die Bibliothek verwendet die MIT-Lizenz
\cite{bib:kreativkorp-barcode}.
Die Bibliothek verwendet die MIT-Lizenz.
\\\cite{bib:kreativkorp-barcode}.
\subsubsection*{Bacon/BaconQrCode}
\textit{Bacon/BaconQrCode} ist eine PHP-Bibliothek zur Generierung von QR-Codes, bereitgestellt von Ben Scholzen, hinter
der Github-Organisation \enquote{Bacon}, dessen einziges Mitglied Scholzen darstellt. Verlinkt ist eine Homepage,
die zu einer Nginx-\enquote{Hello World}-Seite führt. Begleitet wird \textit{BaconQrCode} von etlichen weiteren \enquote{Bacon-Projekten}
wie Beispielsweise \textit{BaconPdf}, \textit{BaconStringUtils} und \textit{BaconUser} um nur einige zu nennen.
\enquote{Bacon/BaconQrCode} ist eine PHP-Bibliothek zur Generierung von QR-Codes, bereitgestellt von Ben Scholzen, hinter
der Github-\break{}Organisation \enquote{Bacon}, dessen einziges Mitglied Scholzen darstellt. Verlinkt ist eine Homepage,
die zu einer Nginx-\enquote{Hello World}-Seite führt. Begleitet wird \enquote{BaconQrCode} von etlichen weiteren \enquote{Bacon-Projekten}
wie Beispielsweise \enquote{BaconPdf}, \enquote{BaconStringUtils} und \enquote{BaconUser} um nur einige zu nennen.
Insgesamt machen die stichprobenartig betrachteten Projekte einen desolaten Eindruck mit zuteils aktuellesten Commits
von vor zehn Jahren. BaconQrCode stellt das beliebteste und gepflegteste Projekt von Scholzen mit 1508 Sterne-Markierungen und
einem aktuellsten Commit von vor zwei Monaten dar. BaconQrCode fällt mit siebzehn Entwicklern auf, die jeweils zumindest
von vor zehn Jahren. \enquote{BaconQrCode} stellt das beliebteste und gepflegteste Projekt von Scholzen mit 1.508 Sterne-Markierungen und
einem aktuellsten Commit von vor zwei Monaten dar. \enquote{BaconQrCode} fällt mit siebzehn Entwicklern auf, die jeweils zumindest
einen Commit beigetragen haben. Zu diesem Zeitpunkt fanden 177 Commits statt. Githubs DependencyGraph verzeichnet
nahezu 80.000 Projekte, die BaconQrCode verwenden \cite{bib:bacon-baconqrcode} und Packagist meldet 50 Millionen Downloads
Wie \textit{chillerlan/php-qrcode} baut auch Scholzen auf existierende Technik von \enquote{ZXing} auf.
\cite{bib:packagist-baconqrcode}. Eine Dokumentation neben der Readme-Datei existiert nicht und
diese ist sehr minimalistisch. \textit{BaconQrCode} kann QR-Codes als Rasterbilder und Vektorgrafiken (SVG und EPS) generieren.
\cite{bib:packagist-baconqrcode}.
Wie \enquote{chillerlan/php-qrcode} baut auch Scholzen auf existierende Technik von \enquote{ZXing} auf.
Eine Dokumentation neben der Readme-Datei existiert nicht und
diese ist sehr minimalistisch. \enquote{BaconQrCode} kann QR-Codes als Rasterbilder und Vektorgrafiken (SVG und EPS) generieren.
Spezielle Styles sind nicht erwähnt. Ein Großteil der Issues und Pull-Requests wurden behandelt.
BaconQrCode unterliegt einer BSD-2-Clause-Lizenz
\enquote{BaconQrCode} unterliegt einer BSD-2-Clause-Lizenz
\cite{bib:bacon-baconqrcode}.
\subsection{Subjektiver Vergleich im Bezug auf die Problemstellung}
Im Folgenden werden subjektive Einschätzungen und Meinungen des Autors über die Eignung der beleuchteten
Bibliotheken vorgestellt.
Um eine Bibliothek als \enquote{am geeignetsten} für einen Anwendungsfall zu kurieren,
müssen die konkreten Anforderungen und Constraints für diesen Anwendungsfall beachtet werden.
Das ist so, da verschiedene Eigenschaften der Bibliotheken verschiedene Auswirkung in Gewichtung und Richtung
Um eine Bibliothek als \enquote{am geeignetsten} für einen Anwendungsfall unter den betrachtenen Bibliotheken zu kurieren,
müssen die konkreten Anforderungen für diesen Anwendungsfall beachtet werden.
Das ist so, da verschiedene Eigenschaften der Bibliotheken verschiedene Auswirkungen in Gewichtung und Richtung
je nach Anwendungsfall aufweisen.
Hierfür werden die zuvor vorgestellten Bibliotheken zur Erstellung von QR-Codes in den folgenden Attributen gegenübergestellt:
\begin{description}
\item [Funktionialität] \hfill \\
Der Umfang, der für diese Problemstellung relevanten Funktionen in Annahme dessen, dass die Bibliothek
syntaktisch und pragmatisch korrekt \cite{bib:heinemann-vorlesung-re} ist.
Der Umfang, der unterstützten Funktionen, in Annahme dessen, dass die Bibliothek
syntaktisch und semantisch korrekt ist.
\item [Gepflegtheit] \hfill \\
Das Ausmaß, in dem das Projekt aktiv gepflegt wird und ordnungsgemäß entwickelt zu sein scheint.
Hierzu zählen beispielsweise: Bearbeitung von Issues, Bearbeitung von Pull-Requests, Präsenz von Tests,
Präsenz einer angemessenen Dokumentation, häufige Commits, mehrere Entwickler, Anzahl der
Sterne auf Github (Ausmaß an tieferem, öffentlichem Interesse \cite{bib:github-stars}), sowie der Anzahl der
Sterne auf Github, sowie der Anzahl der
Downloads bzw. Installationen, falls verfügbar.
\item [Workflow-Eignung] \hfill \\
Die Eignung einer Bibliothek in existierende Workflows und Constraints übernommen zu werden. Maßgeblich,
ob und mit wie viel Aufwand eine Bibliothek in das Projekt übernommen werden kann. Ebenfalls ist relevant,
ob die Lizenz einer Bibliothek eine Verwendung gestattet, bzw. welche Bedingungen gelten.
Die Eignung einer Bibliothek in existierende Workflows und Randbedingungen übernommen zu werden. Maßgeblich ist,
ob und mit wie viel Aufwand eine Bibliothek in das Projekt übernommen werden kann.
Beispielsweise ist es deutlich aufwändiger eine JavaScript-Bibliothek in einem PHP-Projekt zu verwenden, als eine native PHP-Bibliothek.
Ebenfalls ist relevant, ob die Lizenz einer Bibliothek eine Verwendung gestattet, bzw. welche Bedingungen gelten.
\end{description}
Hierbei werden den verschiedenen Bibliotheken Punkte ($[0,10]$) in den drei zuvor genannten
Kategorien vergeben. Nicht ermittelte Werte werden in ihrer Kategorie durch $-$ repräsentiert, wodurch
Hierbei werden den verschiedenen Bibliotheken Punkte $[0,10]$ in den drei zuvor genannten
Kategorien vergeben. Nicht ermittelte Werte werden in ihrer Kategorie durch \enquote{$-$} repräsentiert, wodurch
eine weitere Verwendung ausgeschlossen wird.
Die Kumulativpunktzahl ($[0,30]$) einer Bibltiothek beschreibt deren Gesamteignung, nach subjektivem
Die Kumulativpunktzahl $[0,30]$ einer Bibltiothek beschreibt deren Gesamteignung, nach subjektivem
Empfinden des Autors.
\subsubsection*{Kjua}
Kjua ist funktional für dieses Projekt gut aufgestellt, da es optisch ansprechende QR-Codes mit Logo unterstützt. Das wird
\subsubsection*{kjua}
\enquote{kjua} ist funktional für dieses Projekt gut aufgestellt, da es optisch ansprechende QR-Codes mit Logo unterstützt. Das wird
mit acht Punkten in \enquote{Funktionalität} bemessen.
Kjua macht andererseits einen eher desolaten Eindruck und lässt somit begründete Zweifel an dessen Zukunftssicherheit zu.
\enquote{kjua} macht andererseits einen eher desolaten Eindruck und lässt somit begründete Zweifel an dessen Zukunftssicherheit zu.
Eine knappe Dokumentation ist verfügbar. Für die Dokumentation werden zwei Punkte in \enquote{Gepflegtheit} angerechnet.
Kjua ist als Javascript-Bibliothek nur schwer mit den Anforderungen vereinbar,
\enquote{kjua} ist als JavaScript-Bibliothek nur schwer mit den Anforderungen vereinbar,
da der QR-Code in einem PDF eingebunden werden soll. Hierfür ist ein serverseitiger PDF-Generator vorgesehen.
Kjuas Lizenz erlaubt Verwendung in kommerziellen, Closed-Source-Projekten \cite{bib:opensource-license-mit}.
\enquote{kjuas} Lizenz erlaubt Verwendung in kommerziellen, Closed-Source-Projekten \cite{bib:opensource-license-mit}.
Die Exklusivität für Nutzung in Webbrowsern schließt eine Einbindung in den Workflow aus.
\begin{table}[htbp]
\centering
@@ -142,18 +149,18 @@ Die Exklusivität für Nutzung in Webbrowsern schließt eine Einbindung in den W
8 & 2 & 0 & 10\\
\hline
\end{tabular}
\caption{Subjektive Evaluation: Kjua}
\caption{Subjektive Evaluation zur Eignung als QR-Code-Bibliothek: kjua}
\end{table}
\subsubsection*{Soldair/node-qrcode}
\subsubsection*{soldair/node-qrcode}
Soldairs Lösung sieht dokumentativ und funktional vielversprechend aus.
Hieraus bilden sich acht Punkte in \enquote{Funktionalität}.
Hierdurch bilden sich acht Punkte in \enquote{Funktionalität} ab.
Da diese Bibliothek eine Node.js-Bibliothek ist und Node.js ohne Browser, als Kommandozeilenapplikation, ausgeführt werden
kann \cite{bib:nodejs-api-cli}, bietet sich
Soldair/node-qrcode als serverseitige Anwendung an. Die Lizenz spricht nicht gegen eine Verwendung. Dennoch wäre es
ein vermeidbarer Mehraufwand generierte QR-Codes aus einer Node.JS-Applikation in eine PHP-Umgebung zu
kann \break\cite{bib:nodejs-api-cli}, bietet sich
\enquote{soldair/node-qrcode} als serverseitige Anwendung an. Die Lizenz spricht nicht gegen eine Verwendung. Dennoch wäre es
ein vermeidbarer Mehraufwand generierte QR-Codes aus einer Node.js-Applikation in eine PHP-Umgebung zu
übertragen. Das bildet sich mit vier Punkten in \enquote{Workflow-Eignung} ab.
Darüberhinaus macht Soldair/node-qrcode einen verbesserungswürdigen Eindruck der Projektpflege, wofür es lediglich
Darüberhinaus macht \enquote{soldair/node-qrcode} einen verbesserungswürdigen Eindruck der Projektpflege, wofür es lediglich
drei Punkte gibt.
\begin{table}[htbp]
\centering
@@ -164,21 +171,21 @@ drei Punkte gibt.
8 & 3 & 4 & 15\\
\hline
\end{tabular}
\caption{Subjektive Evaluation: Soldair/node-qrcode}
\caption{Subjektive Evaluation zur Eignung als QR-Code-Bibliothek: soldair/node-qrcode}
\end{table}
\subsubsection*{Chillerlan/php-qrcode}
\subsubsection*{chillerlan/php-qrcode}
Rochkos Lösung macht einen aktiv gepflegten Eindruck und wird von großen Downloadzahlen gestützt.
Rochko stellt eine ausführliche Dokumentation und Codebeispiele bereit.
Hierfür wird die volle Punktzahl in \enquote{Gepflegtheit} vergeben.
Der Funktionsumfang übersteigt weit die Anforderungen und gestattet so ausführlich gestaltete QR-Codes
Der Funktionsumfang übersteigt weit die Anforderungen und gestattet so ausführlich gestaltete QR-Codes zu generieren
\cite{bib:chillerlan-php-qrcode-demo},
die somit ebenso die hedonische Qualität fördern \cite{bib:koenig-vorlesung-ux}.
die somit die hedonische Qualität fördern \cite{bib:koenig-vorlesung-ux}.
Bewertet wird das mit einer vollen Punktzahl in \enquote{Funktionalität}.
Chillerlan/php-qrcode lässt sich nahtlos in das existierende Projekt eingliedern,
\enquote{chillerlan/php-qrcode} lässt sich nahtlos in das existierende Projekt eingliedern,
da es als PHP-Bibliothek über Composer eingebunden werden kann und eine eigene API bereitstellt \cite{bib:chillerlan-php-qrcode}.
Die von Rochko verwendete Lizenz gestattet eine unkomplizierte Verwendung. Chillerlan/php-qrcode funktioniert sowohl mit
PHP $7.x$ als auch $8.x$. Die Bibliothek benötigt zwei weitere Abhängigkeiten. Eine dieser Abhängigkeiten ist ebenfalls von Rochko
Die von Rochko verwendete Lizenz gestattet eine unkomplizierte Verwendung. \enquote{chillerlan/php-qrcode} funktioniert sowohl mit
PHP- $7.x$ als auch $8.x$. Die Bibliothek benötigt zwei weitere Abhängigkeiten. Eine dieser Abhängigkeiten ist ebenfalls von Rochko
bereitgestellt \cite{bib:chillerlan-php-qrcode-composerjson} und weist eine ähnlich gute Projektpflege auf
\cite{bib:chillerlan-php-settings-container}. Das wird mit der Maximalwertung in \enquote{Workflow-Eignung} berechnet.
\begin{table}[htbp]
@@ -190,17 +197,17 @@ bereitgestellt \cite{bib:chillerlan-php-qrcode-composerjson} und weist eine ähn
10 & 10 & 10 & 30\\
\hline
\end{tabular}
\caption{Subjektive Evaluation: Chillerlan/php-qrcode}
\caption{Subjektive Evaluation zur Eignung als QR-Code-Bibliothek: chillerlan/php-qrcode}
\end{table}
\subsubsection*{Kreativekorp/barcode}
Kreativekorp beeindruckt durch Nutzungsbeispiele und Dokumentation in der Readme-Datei,
\subsubsection*{kreativekorp/barcode}
Kreativekorp beeindruckt in der Readme-Datei durch Nutzungsbeispiele und Dokumentation,
sowie einer Vielzahl unterstützter Barcode-Formate, darunter auch QR-Codes und einiger improvisierter Tests.
In Anbetracht dessen, dass die Bibliothe de-facto sechseinhalb Jahre alt ist und seit vier Jahren nicht mehr
In Anbetracht dessen, dass die Bibliothek de facto sechseinhalb Jahre alt ist und seit vier Jahren nicht mehr
angepasst wurde, wird eine geringe Wertung von drei Punkten in \enquote{Gepflegtheit} vergeben.
Null Punkte in \enquote{Workflow-Eignung} rechtfertigen sich durch die Abwesenheit jeglicher
Unterstützung für Paketmanager, wodurch eine saubere Verwendung in dem Brown-Field-Projekt
Änderungen an der Bibliothek selbst erfordern würde.
Änderungen an der Bibliothek an sich erfordern würde.
Die Funktionalität wurde aufgrund der desaströsen Gepflegtheit und Eignung nicht näher untersucht,
da eine Verwendung selbst mit guter Funktionalität nicht infrage käme.
\begin{table}[htbp]
@@ -212,20 +219,21 @@ da eine Verwendung selbst mit guter Funktionalität nicht infrage käme.
- & 3 & 0 & -\\
\hline
\end{tabular}
\caption{Subjektive Evaluation: Kreativekorp/barcode}
\caption{Subjektive Evaluation zur Eignung als QR-Code-Bibliothek: Kreativekorp/barcode}
\end{table}
\subsubsection*{Bacon/BaconQrCode}
BaconQrCode nennt keine speziellen Optionen, um näheren Einfluss auf den generierten QR-Code auszuüben.
\enquote{BaconQrCode} nennt keine speziellen Optionen, um näheren Einfluss auf den generierten QR-Code auszuüben.
Es werden Rasterbilder und verschiedene Vektorformate als Renderziel unterstützt. Aufgrund der fehlenden Optionen,
die andere Bibliotheken bereitstellen, werden lediglich fünf von zehn Punkten für \enquote{Funktionalität} vergeben.
die andere Bibliotheken bereitstellen, werden lediglich fünf von zehn Punkten in \enquote{Funktionalität} vergeben.
Die Projektgepflegtheit ist inkonsistent. Manche Stellen, beispielsweise die Mitwirkenden, Alter des neuesten Commits, Tests
und Nutzerzahlen machen einen guten Eindruck, während Punkte wie die Dokumentation, die Organisationswebseite und andere
Projekte Sorgen begründen. Weil der Programmcode an sich gut gepflegt aussieht und große Downloadzahlen von
Projekte von Scholzen Sorgen begründen. Weil der Programmcode an sich gut gepflegt aussieht und große Downloadzahlen von
häufiger Verwendung sprechen, werden für die \enquote{Gepflegtheit} acht Punkte vergeben.
Da es sich hierbei um eine PHP-Bibliothek handelt, die über Composer in PHP- $7.x$ und $8.x$ Projekte geladen werden kann
und eine das Projekt API bereitstellt, ist die technische Workflow-Eignung gut. Die BSD-2-Clause-Lizenz verkompliziert eine Integration,
da somit eine Copyright-Notiz an Nutzer gezeigt werden muss \cite{bib:opensource-license-bsd-2}.
und das Projekt eine API bereitstellt, ist die technische Workflow-Eignung gut.
Die BSD-2-Clause-Lizenz verkompliziert eine Integration,
da somit eine Copyright-Notiz an Nutzer gezeigt werden müsste \cite{bib:opensource-license-bsd-2}.
Dadurch werden drei Punkte einer vollkommenen Workflow-Eignung abgezogen, wodurch sieben Punkte vergeben werden.
\begin{table}[htbp]
\centering
@@ -236,39 +244,40 @@ Dadurch werden drei Punkte einer vollkommenen Workflow-Eignung abgezogen, wodurc
5 & 8 & 7 & 20\\
\hline
\end{tabular}
\caption{Subjektive Evaluation: Bacon/BaconQrCode}
\caption{Subjektive Evaluation zur Eignung als QR-Code-Bibliothek: Bacon/BaconQrCode}
\end{table}
\subsection{Fazit}
Nach Evaluation der verschiedenen QR-Code-Bibliotheken im Kontext der vorliegenden Problemstellung erweist sich aus Sicht des Autors
\textit{chillerlan/php-qrcode} mit 30 Gesamtpunkten als die am besten geeignetste Bibliothek.
Somit wird \textit{chillerlan/php-qrcode} als QR-Code Technologie in der Lösung dieser Problemstellung verwendet.
\break\enquote{chillerlan/php-qrcode} mit 30 Gesamtpunkten als die am besten geeignetste Bibliothek unter den Betrachteten.
Somit wird \enquote{chillerlan/php-qrcode} als QR-Code Technologie in der Lösung dieser Problemstellung verwendet.
\begin{table}[htbp]
\centering
\begin{tabular}{|l||l|l||l|l|}
\begin{tabular}{|l|l|l|l|l|}
\hline
\textbf{Bibliothek} & \textbf{Funkt.} & \textbf{Gepflegtht.} & \textbf{WF.-Eignung} & \textbf{$\Sigma$}\\
\hline
\hline
chillerlan/php-qrcode & 10 & 10 & 10 & 30\\\hdashline
baconqrcode & 5 & 8 & 7 & 20\\\hdashline
Bacon/BaconQrCode & 5 & 8 & 7 & 20\\\hdashline
soldair/node-qrcode & 8 & 3 & 4 & 15\\\hdashline
kjua & 8 & 2 & 0 & 10\\\hdashline
kreativekorp/barcode & - & 3 & 0 & -\\
\hline
\end{tabular}
\caption{Gesamtübersicht: Subjektive Evaluation der QR-Code Bibliotheken}
\caption{Gesamtübersicht: Subjektive Evaluationen zur Eignung von QR-Code Bibliotheken}
\label{tbl:qrlib-compare-barchart}
\end{table}
\clearpage
\section{PDF-Generator}
Firmenintern ist der PDF-Generator \textit{mpdf/mpdf} \cite{bib:mpdf} etabliert und wird bereits
Firmenintern ist der PDF-Generator \enquote{mpdf/mpdf} etabliert und wird bereits
in zahlreichen Projekten verwendet.
Um die projektübergreifende Kontinuität der Technik zu wahren und um somit die
Wartbarkeit und Nachhaltigkeit des hier behandelten Softwareproduktes
zu fördern, wird sich für den PDF-Generator entschieden, der bereits firmeninterner Standard ist.
Unabhängig dessen ist \textit{mpdf} ein gut gepflegtes Projekt mit einem Alter von mehr als acht Jahren,
Unabhängig dessen ist \enquote{mpdf} ein gut gepflegtes Projekt mit einem Alter von mehr als acht Jahren,
Sponsoren, 72 Entwicklern, über 31 Millionen Downloads, über 3.900 Sterne-Markierungen, über 800 Commits
und regelmäßigen Updates. Dadurch, dass \textit{mpdf} ein Composer-Paket für verschiede PHP-Versionen ist,
ist eine herausragende Workflow-Eignung gegeben \cite{bib:mpdf}.
und regelmäßigen Updates. \enquote{Mpdf} ein Composer-Paket und für verschiede PHP-Versionen verfügbar.
Mpdf verwendet eine GPL-2.0 Lizenz \cite{bib:mpdf}.

View File

@@ -17,7 +17,7 @@ Studiengang \cfgUniversityDegreeCourse\\
\cfgDocSubTitle\\
\vspace{15mm}
\normalsize
Version \cfgDocVersion
%Version \cfgDocVersion
\end{center}
\vfill
@@ -26,11 +26,10 @@ Studiengang \cfgUniversityDegreeCourse\\
\cfgAuthorName, \cfgAuthorMatriculationNum\\
\cfgAuthorContact\\
mit Medienagenten Stange \& Ziegler oHG\\
Im \cfgSemesterName\\
\cfgDateLastModification\\
\cfgAuthorCity\\
\vspace{3mm} \ \\
bei \cfgUniversitySupervisorName\\
\cfgUniversitySupervisorContact\\
\cfgUniversityCity\\
Erstbetreuer: Prof. Dr. Volker Schwarzer\\
Zweitbetreuerin: Prof. Dr. Elisabeth Heinemann\\
\end{titlepage}

View File

@@ -3,17 +3,17 @@
%
% Document title
\newcommand{\cfgDocTitle}{Bachelorarbeit}
\newcommand{\cfgDocTitle}{Bachelor of Science}
\newcommand{\cfgDocSubTitle}{Wie kann die Anmeldung und Zustellung von Weinen für Weinproben des Regionalverbunds für Weine in der Weinregion Mosel effizient und profitabel durch eine TYPO3-Erweiterung realisiert werden?}
% Document classification
\newcommand{\cfgDocClassification}{Abschlussarbeit}
\newcommand{\cfgDocClassification}{Thesis zur Erlangung des akademischen Grades}
% Document version
\newcommand{\cfgDocVersion}{1.5}
\newcommand{\cfgDocVersion}{3}
% Last modification date
\newcommand{\cfgDateLastModification}{22. Dezember 2022}
\newcommand{\cfgDateLastModification}{31. März 2023}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -41,7 +41,7 @@
\newcommand{\cfgUniversityDepartment}{Fachbereich Informatik}
% University degree course
\newcommand{\cfgUniversityDegreeCourse}{Angewandte Informatik - dual (B.Sc)}
\newcommand{\cfgUniversityDegreeCourse}{Angewandte Informatik - dual (B.Sc.)}
% University supervisor name
\newcommand{\cfgUniversitySupervisorName}{Volker Schwarzer}

View File

@@ -13,8 +13,8 @@
\acro{PDCA}[PDCA]{Plan-Do-Check-Act}
\acro{SWOT}[SWOT]{Strength-Weakness-Opportunity-Threat}
\acro{FA}[FA]{Funktionale Anforderung}
\acroplural{FA}[FAs]{Funktionale Anforderungen}
\acro{FA}[FA]{funktionale Anforderung}
\acroplural{FA}[FAs]{funktionale Anforderungen}
\acro{NFA}[NFA]{nichtfunktionale Anforderung}
\acroplural{NFA}[NFAs]{nichtfunktionale Anforderungen}

View File

@@ -5,4 +5,4 @@
\nocite{*} % Show all references, even unused ones
\bibliography{dexes/literature}
\bibliographystyle{apalike}
\bibliographystyle{apalike-german}

View File

@@ -7,7 +7,9 @@
\begin{description}
\item [Frontend] \hfill \\
\quotecite{Das Frontend einer Webseite ist der Teil der Webseite, der Endnutzern präsentiert wird. Ein Frontend besteht aus HTML und Cascading Style Sheets} \cite{bib:udjaja}.
\quotecite{Front-end website is a combination of
hypertext markup language (HTML), cascading style sheets (CSS) and JavaScript that generates pages that can be
viewed and interacted directly with the user.} \cite[S. 294]{bib:udjaja}.
\item [TYPO3-Backend] \hfill \\
\quotecite{The backend's main role is to enable users to create and publish
@@ -30,4 +32,16 @@
An extension may provide several plugins, each with a dedicated function,
such as the list view.} \cite{bib:typo3-docs-content-elements-plugins-introduction}
\item [Weinland-Mosel-Mitglied] \hfill \\
Ein Weinland-Mosel-Mitglied ist ein Mitglied des Moselwein e.V.
Diese Mitglieder sind i.d.R. Weingüter und weinproduzierende Unternehmen.
Mitglieder profitieren von einer Reihe an
Vorteilen, wie beispielsweise einer Auflistung auf Weinland Mosels Internetauftritt.
Durch diesen Auftritt sind bereits Stammdatensätze vorhanden.
Nur durch eine Teilnahme an einer Jahresauswahlprobe ist ein Unternehmen kein Mitglied.
\item [Flight] \hfill \\
Pro Tisch einer Jahresauswahlprobe werden sechs Weine gleichzeitig eingeschenkt und bewertet.
Das ist ein Flight. Pro Tisch gibt es mehrere aufeinanderfolgende Flights.
\end{description}

View File

@@ -135,7 +135,7 @@
title = {EKSPANPIXEL BLADSY STRANICA: Performance Efficiency Improvement of Making Front-End Website Using Computer Aided Software Engineering Tool},
journal = {Procedia Computer Science},
volume = {135},
pages = {292-301},
pages = {{292-301}},
year = {2018},
note = {The 3rd International Conference on Computer Science and Computational Intelligence (ICCSCI 2018) : Empowering Smart Technology in Digital Era for a Better Life},
issn = {1877-0509},
@@ -146,6 +146,14 @@
abstract = {The purpose of this research is to create a front-end website engine to improve the efficiency of front-end website creation called Expanpixel Bladsy Stranica (EBS). The method of making front-end website engine adopts computer aided software engineering (CASE) tool model, then to make it easier to access anywhere, it is made online (website-based), and evaluated by way of manual creation of front-end website and using EBS. After that the data obtained were analyzed using statistical formula. Results of increasing efficiency of front-end website creation performance that occurred on average by 83.60% of the overall developer.}
}
@article{bib:ayman-al-ahmar,
title = {Rule based expert system for selecting software development methodology},
journal = {Journal of Theoretical and Applied Information Technology},
publisher = {Ajman University of Science and Technology, UAE},
year = {2005},
author = {M. Ayman Al Ahmar},
}
@misc{bib:smashmagazine-webpack,
author = {Zimmermann, Joseph},
howpublished = "\url{https://www.smashingmagazine.com/2017/02/a-detailed-introduction-to-webpack/}",
@@ -267,28 +275,12 @@
note = {Zugriff: Januar 2023}
}
@article{bib:christoph-ebert-vorwort-systematisches-re,
title = {Vorwort zu Systematisches RE},
@article{bib:christoph-ebert-systematisches-re,
title = {Systematisches Requirements Engineering: Anforderungen ermitteln},
year = {2019},
author = {Christoph Ebert},
publisher = {dpunkt Verlag}
}
@book{bib:basiswissen-re,
author={Pohl, Klaus and Rupp, Chris},
title={Basiswissen Requirements Engineering},
subtitle={Aus- und Weiterbildung nach IREB-Standard zum "Certified Professional for Requirements Engineering" : Foundation Level nach IREB-Standard},
edition={4., {\"u}berarbeitete Auflage},
publisher={dpunkt.verlag},
address={Heidelberg},
year={2015},
pages={1 Online-Ressource (xix, 171 Seiten)},
language={ger},
isbn={978-3-86491-673-1 and 978-3-86491-674-8 and 3-86491-674-7},
note={Description based upon print version of record},
keywords={CPRE},
url={https://ebookcentral.proquest.com/lib/ub-heidelberg/detail.action?docID=2029882},
library={UB},
publisher = {dpunkt Verlag},
volume = {6}
}
@article{bib:kleine-re-fibel,
@@ -328,6 +320,14 @@
note = {Zugriff: März 2023}
}
@misc{bib:mpdf-github,
author = {{Mpdf Contributors}},
howpublished = "\url{https://github.com/mpdf/mpdf}",
title = {{mpdf/mpdf PHP library generating PDF files from UTF-8 encoded HTML}},
year = {2023},
note = {Zugriff: März 2023}
}
@misc{bib:mpdf-ref,
author = {{Mpdf Contributors}},
howpublished = "\url{https://mpdf.github.io/reference/mpdf-functions/overview.html}",
@@ -339,7 +339,7 @@
@misc{bib:qrbot,
author = {{TeaCapps}},
howpublished = "\url{https://qrbot.net}",
title = {{QRBot | QRCode und Barcode Scanner}},
title = {{QRBot | QRCode und Barcode Scanner}},
year = {2023},
note = {Zugriff: März 2023}
}
@@ -386,8 +386,8 @@
@misc{bib:typo3-docs-managing-extensions,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/tutorial-getting-started/main/en-us/Extensions/Management.html}",
title = {{Managing Extensions}},
howpublished = "\url{https://docs.typo3.org/m/typo3/tutorial-getting-started/11.5/en-us/Extensions/Management.html}",
title = {{Managing Extensions - Getting Started 11.5 documentation}},
year = {2023},
note = {Zugriff: Februar 2023}
}
@@ -395,23 +395,31 @@
@misc{bib:typo3-docs-getting-started,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/tutorial-getting-started/11.5/en-us/Index.html}",
title = {{Getting started}},
title = {{TYPO3 - Getting Started Tutorial - Getting Started 11.5 documentation}},
year = {2023},
note = {Zugriff: Februar 2023}
}
@misc{bib:typo3-docs-modules,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/tutorial-getting-started/11.5/en-us/Concepts/Index.html}",
title = {{TYPO3 Concepts - Getting started 11.5 documentation}},
year = {2023},
note = {Zugriff: Februar 2023}
}
@misc{bib:typo3-docs-file-structure,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/FileStructure/Index.html}",
title = {{TYPO3 Extension Development File Structure}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/11.5/en-us/ExtensionArchitecture/FileStructure/Index.html}",
title = {{File structure - TYPO3 Explained 11.5 documentation}},
year = {2023},
note = {Zugriff: Februar 2023}
}
@misc{bib:typo3-docs-content-elements-plugins-introduction,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/ContentElements/Introduction.html}",
title = {{What are Content Elements?}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/11.5/en-us/ApiOverview/ContentElements/Introduction.html}",
title = {{Introduction - TYPO3 Explained 11.5 documentation}},
year = {2023},
note = {Zugriff: Februar 2023}
}
@@ -419,30 +427,30 @@
@misc{bib:typo3-docs-extbase-reference,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/11.5/en-us/ExtensionArchitecture/Extbase/Reference/Index.html}",
title = {{Extbase reference}},
title = {{Extbase reference - TYPO3 Explained 11.5 documentation}},
year = {2023},
note = {Zugriff: Februar 2023}
}
@misc{bib:typo3-docs-extdev-tut-tea-repositories,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/Tutorials/Tea/Repository.html}",
title = {{Extension development / Tutorials / Tea in a nutshell / Repository}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/11.5/en-us/ExtensionArchitecture/Tutorials/Tea/Repository.html}",
title = {{Repository — TYPO3 Explained 11.5 documentation}},
year = {2023},
note = {Zugriff: Februar 2023}
}
@misc{bib:typo3-docs-sys-category,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Categories/Index.html}",
title = {{System categories}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/11.5/en-us/ApiOverview/Categories/Index.html}",
title = {{System categories - TYPO3 Explained 11.5 documentation}},
year = {2023},
note = {Zugriff: März 2023}
}
@misc{bib:typo3-docs-femanager,
author = {{in2code}},
howpublished = "\url{https://docs.typo3.org/p/in2code/femanager/main/en-us/Introduction/Index.html}",
howpublished = "\url{https://docs.typo3.org/p/in2code/femanager/11.5/en-us/Introduction/Index.html}",
title = {{femanager}},
year = {2023},
note = {Zugriff: März 2023}
@@ -450,16 +458,16 @@
@misc{bib:typo3-docs-felogin,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/c/typo3/cms-felogin/main/en-us/Configuration/Index.html}",
title = {{cms-felogin}},
howpublished = "\url{https://docs.typo3.org/c/typo3/cms-felogin/11.5/en-us/Configuration/Index.html}",
title = {{Configuration - Frontend Login 11.5 documentation}},
year = {2023},
note = {Zugriff: März 2023}
}
@misc{bib:typo3-docs-extbase,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/Extbase/Index.html}",
title = {{Extension development / Extbase}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/11.5/en-us/ExtensionArchitecture/Extbase/Index.html}",
title = {{Repository - TYPO3 Explained 11.5 documentation}},
year = {2023},
note = {Zugriff: März 2023}
}
@@ -467,7 +475,7 @@
@misc{bib:typo3-docs-di,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/11.5/en-us/ApiOverview/DependencyInjection/Index.html}",
title = {{Dependency Injection}},
title = {{Dependency injection - TYPO3 Explained 11.5 documentation}},
year = {2023},
note = {Zugriff: März 2023}
}
@@ -475,7 +483,7 @@
@misc{bib:typo3-docs-fluid-form-viewhelpers,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/other/typo3/view-helper-reference/11.5/en-us/typo3/fluid/latest/Form/Index.html}",
title = {{form - Fluid ViewHelper Reference 11.5 Documentation}},
title = {{form - Fluid ViewHelper Reference 11.5 documentation}},
year = {2023},
note = {Zugriff: März 2023}
}
@@ -483,7 +491,7 @@
@misc{bib:typo3-docs-model-explained,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/11.5/en-us/ExtensionArchitecture/Extbase/Reference/Domain/Model.html}",
title = {{Model - Typo3 explained 11.5 documentaion}},
title = {{Model - TYPO3 Explained 11.5 documentation}},
year = {2023},
note = {Zugriff: März 2023}
}
@@ -491,7 +499,7 @@
@misc{bib:typo3-ref-standalone-view,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://api.typo3.org/10.4/class_t_y_p_o3_1_1_c_m_s_1_1_fluid_1_1_view_1_1_standalone_view.html}",
title = {{TYPO3\\CMS\\Fluid\\View\\StandaloneView Class Reference}},
title = {{TYPO3\textbackslash{}CMS\textbackslash{}Fluid\textbackslash{}View\textbackslash{}StandaloneView Class Reference}},
year = {2023},
note = {Zugriff: März 2023}
}
@@ -499,14 +507,14 @@
@misc{bib:typo3-ref-extbase-model-feuser,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://api.typo3.org/10.4/class_t_y_p_o3_1_1_c_m_s_1_1_extbase_1_1_domain_1_1_model_1_1_frontend_user.html}",
title = {{TYPO3\\CMS\\Extbase\\Domain\\Model\\FrontendUser Class Reference}},
title = {{TYPO3\textbackslash{}CMS\textbackslash{}Extbase\textbackslash{}Domain\textbackslash{}Model\textbackslash{}FrontendUser Class Reference}},
year = {2023},
note = {Zugriff: März 2023}
}
@misc{bib:pixelant-typo3-data-export,
author = {{Pixelant}},
howpublished = "\url{https://www.typo3manual.com/typo3-basics/tips-and-functions/exporting-data-through-list-view/}",
howpublished = "\url{https://www.typo3manual.com/typo3-basics/tips-and-functions/exporting-data-through-list-view}",
title = {{Tutorial on exporting Data from TYPO3}},
year = {2023},
note = {Zugriff: März 2023}

View File

@@ -3,21 +3,24 @@
%
\documentclass[
12pt, % 12pt font size
pdftex, % we are just using pdf
a4paper, % a4 paper format
12pt, % 12pt font size
pdftex, % we are just using pdf
a4paper, % a4 paper format
titlepage,% title has its own page
oneside, % single-page view
oneside, % single-page view
%twocolumn,% use two text columns
headsepline, % hr after headline
footsepline, % hr before footer,
bibliography=totoc, % Include literaturverzeichnis in inhaltsverzeichnis
listoftables=totoc,
ngerman, % it's a german document
%draft, % create debug build. remove for release build
ngerman, % it's a german document
%draft, % create debug build. remove for release build
hidelinks, % avoid weird ref highlighting
]{scrbook}
\counterwithout{figure}{chapter}
\counterwithout{table}{chapter}
% Load project configuration
\input{config}

View File

@@ -0,0 +1 @@
<mxfile host="Electron" modified="2023-03-27T15:37:34.363Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="_LMQP0qORuolSiuvVgbG" version="20.8.16" type="device"><diagram name="Seite-1" id="c5J236jw9uxX1O-q0mKY">7Vtbd6M2EP41Pqd9cI8BGzuPtuOk6Sbt7rpnL32TYQxaC+QKObbz6zsCEcD4trs4kJ48JEGjQZeZ+TQXkZY1Dja3giz9B+4Ca5kdd9Oyrlum2bMM/K0I24Rg2XZC8AR1E5KREab0CTSxo6kr6kJUYJScM0mXRaLDwxAcWaARIfi6yDbnrDjrknhQIkwdwsrUz9SVfkIdmP2M/jtQz09nNuyrpCcgKbPeSeQTl69zJGvSssaCc5k8BZsxMCW7VC7JezcHep8XJiCU57wwsu/Wf21H8mNgfXh38+Xu/joctlMxR3Kb7hhcFIBuciF97vGQsElGHQm+Cl1Qw3awlfHcc75EooHEbyDlVmuTrCRHki8DpntxxWL7Rb8fN76qxm+9tHm9yXdeb3VrzkOpBzWSXneodIztGePOIiHdUMb0C2UZabFFfCUcOCYYbWtEeCCP8JkJnxJabgKtgVvgAeAGkEEAI5I+Fq2KaOP0nvky/eGDVuH3qDMZ95GwlZ7pnVKVMkdgLm7E7HwGGuIfHjIaqg4SliygqN+1TyVMlyQW1xpBXtRlXifmMZE/gpCwOSqktNfSVqnPDLOr2+sMgUZK83PoszuXkqtREtIbTHLmfxImVqNgYpZgolFBIwURGrRMm+F2RjNRULr970qd1rGA21Es4SEyGOZyE0sx7ccnT/2dbiMJgTJSGkoQDJDaNLBZZuPA1q8XbBm+vhbgVTvYKgeRfvU9R/PMLMLsFC3C6u5oOkG7fitTNm6bbHNsS8UQHZ6nN9iZZzeAObWuIj8+JCvILO9ZJj9ujNaho2JNhZsALUL9QvOA3TOaBmyz++ZF9wqmf26w2axos1/Cxp1CxsO0Pdk4cRq4BuGCov1BfAERWUVr4rOl4LOY6sGSkRjiqGM1myL+TSPHx8jUJoECSfL7hin7jNQuVnMUElBWMeLmqMgxZ1zEY1kugcHcQXokBV9Arsd2BjCbX8b59l4Sow+LofzntsM+fBy5dMiZ8e293TZfbUJoXhajgzMxetUoiA5KEL2mKuub4C5mIY0iyKNU4e9o4DvjyCnaToKGYTyy+KXdztN/jcXcOTdGTmeMlioT/Ylg+xuEIHLHT/seo3lI4BiAWMh0JhRkMlm6gFd/jOwmzHbtrv7qhN2xRDeVZFk6EluuZow+URTa/0Cju46hfo2a5drSs/7OUl/3xAGg+H9qoFvAwKE1tlrD7lxGGGQ8QaQihjb+DFcRWodyCMO90UjubEjWUVwbkmcHzwtUqSyaUNE0Qh7Cjh1pEsGoJsSmA6o8gARlINQhbKg7Auq6sYfdZ7NFq86bbfcyRmj0ykZoGXuM0LpYdFJLHe4Fo4w0wj8ZZgyqDjMqSeHt70zh7ZdI4VOZlpzR4WOgGo9EZh74hEmouMRei0faLSfUn6q81eQPHJLlI2QvX7euTOXYqnMg/QQiIqq0RheoklZacqsEoY9cJRuqlMdIXHp44JGqWFQyOI7qYSxCwhAtrWllwd1cwaodx9Ybjo/h8ySO7UbhuFvCcelurfN8L0ZYXNJDuCx4EMQ1iCxbbxhwdqPh+oFzVS9wmnBPdgwQJ4HTbxRw7EPA0dFk7FUY8eICx0tX6ZL6fEDjDB1XElfaJvd/tvQNmF91jHuBiLV+wBr2a0VsdWnvMSSeRKzRrJi1fAGmIOuSOOPLyuqJlxtPP6mVb5aowuqrlBfAS7d+vHRKAh6BABpfBLrUo5IwGilhqnR+6viCSvVYlWCPGvX5gu3vVD323sR39gh298OL6gR7uJh7dhn2kKu4B099EBFzHSiqVl5AZTCXjSufltRultV+tUfrxsW0Xs6x1ffaIowxtAq9Vu5KvkoM1VKwKon/qnbU9ep1/z+e6V7Y/Rt7Ut1jX5w0xP0b5VwXnXx7bwxAd76MocFl4oBG3D9fsjaMzex/JpIrguwfT6zJfw==</diagram></mxfile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

View File

@@ -1 +1 @@
<mxfile host="Electron" modified="2023-03-25T17:26:30.360Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="XKElD7vJFe7AfntbcogP" version="20.8.16" type="device"><diagram name="Seite-1" id="c5J236jw9uxX1O-q0mKY">7Ztbd6M2EIB/jc9pH9zDxcbOo2MnabpJu7ves5e+yTAGJQJRIWI7v74SiHCzHRLj4HT7EqNBgJiZj7lAeubUX18xFHq31AHSMzRn3TNnPcPQNd0UP1KySSWjwVkqcBl21KRcMMePkB2ppDF2ICpN5JQSjsOy0KZBADYvyRBjdFWetqSkfNUQuVATzG1E6tJv2OFeKh0bo1z+O2DXy66sW+r+fJRNVncSecihq4LIvOiZU0YpT7f89RSIVF6ml/S4yx17nxbGIOBNDji3rld/bc75Z9/89OHy+/XNLJj0MzVHfJPdMThCAWpIGfeoSwNELnLpOaNx4IA8rSZG+ZwbSkMh1IXwDjjfKGuimFMh8rhP1F6xYrb5ro5PBj/k4LdhNpytiztnGzVa0oCrk+pyXFeB0kpEY2bDvvtWroSYC3zPPCOdJ3VSuIBS8BVQH8T6xAQGBHH8UHYapHzPfZqXm0dsKAu9xFrpeR8QidWVPkhLSG8D4ogbMbRvgAPxQwOCA7kDBTUDl8238jCHeYgSda0ExGVTLTEhU0ooS441HQTjpS3kEWf0Hgp7LHsMi2XFSMY+Iz0A47Deq9Zsr6ncVD1EjIEar3Ik9UzmFXC0tGNZQq+p9afgxmjIjXlS3Bg1bhQmOJLMYL9nWETczvmClWxq/RPLp3Oiv36UKHAiJuhGuE60mO0XW678nW8iDr70QRxwYASE9P3TZxonR9+oW/py4H6UeDs2fa1TpQ79SIW/5gY3tLLBzUHFkCn+6qjclhPG0KYwLZQTot3XGY4r16lmMM+tqzxfbKQryB3rSSev9zVz17NjhZmTchRBkATfd0/6UD810o3BzxlnR03z09NKUEc1WK4lKrfz/sXaTirDFTAHpOwP5DGIUBytkEdCRheJ1IWQoIR5YUJ5NSn8giPbE8mshXxJTfr3kkj3i+RdxEuhJMDkUASPHzqHbwnU7f2E/32lkU+fzx08oUS/+2j1jXdb8OUmqTj76wgbNyTsrEuexjWeZlhWdRdi0YsARxEUkZKw7M1jF1TMZH07jSaT5Mzsl36/KP81UbPWNOXNrhiFstI8IHe+gwBY4VnRvxHJOaS0+cDueXYlocj0YtkCToz5arFqdR5Ez57xIpJqupUSSGVFYbwg+BELpZ2cfarP5O7tY9T7Ok/WaGSMwTNwyvkHnegKRATuTc3eZLDkkYjWjxDJ0Bsg2/NAPUvqEb2AbLqE8rKEeLETY2FNXvaFcioc0AAqebMSIZEZBGJogyzChUD6BrYRmagdPnacJK5tc76yexb9b3Ac/9OHdf8z9S3+Zx4tJ+ikmXXE2J5lxc8G9/GBwb2Vstd6YdlrvUXZm6mwFjR2U95O5EALFzxEOBzauD5+edx9Nv8f6EK/FPjtT7A671vnDd4omd+3yAJRX4FFSPaO8L3QeC/rKbWC0wOV+bjsVYmCWoJ1SyNZgbdycnFWV6QEKAiEI51E36tG8RZHapyym52Dbf4Pdg5sA7CtLsEe1MCuvV7Snl4NIZL0rAQ/99T3k7o9r3DfPUnV5LZ7ks66JamNV0WtkGQ1JGnUJUnWLpJUcpjEHYLcpK/w1q2utCPt46SUFitJ2lUfIAiCWIDMeupdkHdw5noKIFdz3e5B1q33SvLrq9vdhDYgWe80262/CpIoOygp7PKedRoOp/OvUjvrUFiohabhKQI06B4grWaSGXYxRwRHUumyup/bHsNcbnZnAK0dA4wqbZOtL7O1LQaofu3QngF293kbd2h3BacbcOVXCMmsHU3X1husBJb8GO3Vds1u1M1+tsXq+tGsXq/7/8S2J839BXDytTSGKMkfJnGE2AIwj0WecyCCbwDUWedADbtNCV5fJrecEuhb6uTdH2h0lRLo9UJZBP7+1rzg2XfZTR+MhW9PsN9SfnH8DtQxW8timP/XQfq+IP/fDfPiXw==</diagram></mxfile>
<mxfile host="Electron" modified="2023-03-30T16:24:11.739Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="uJLDwojdT_EOwQ1EVR7a" version="20.8.16" type="device"><diagram name="Seite-1" id="c5J236jw9uxX1O-q0mKY">7VtZc6M4EP41rtp98BaHg51H59xsktmZ8dQc+yZDGxQL5BVybOfXbwtEuHzNxA5kKy8xaglJ9Nef+oB07PNweS3ILLjnHrCOZXjLjn3Rsaye3cO/SrBKBbZhpAJfUC8VmblgRJ9AC7Nhc+pBXBooOWeSzspCl0cRuLIkI0LwRXnYhLPyqjPiQ00wcgmrS79RTwapdGD1c/mfQP0gW9l0TtOekGSD9ZPEAfH4oiCyLzv2ueBcplfh8hyY0l2ml/S+qw29zxsTEMl9bjhzbhZ/r87k59D+dHv1/ebuIhp2MzXHcpU9MXioAN3kQgbc5xFhl7n0TPB55IGa1sBWPuaO8xkKTRQ+gJQrjSaZS46iQIZM9+KOxeq7vj9p/FCNP06y5sWy2Hmx0q0Jj6Se1Ex7vaHCGNtjxt1pKrqijOkb6jrSaov5XLiwTTHa1ojwQW4ZZ6XjlNIKC2gEroGHgA+AAwQwIulj2aqINk7/eVyOH15oCH8GznTeR8LmeqVbBZUyR2AePohlfAMa4Q+PGI1UB4lqFlDGdxFQCaMZSdS1QJKXsZygts854yK51/YIDCYuymMp+BQKPY47gPGkgqK1DaRHEBKWW9Wa9drajvUpY/V0e5Fz1sxkQYGvjnEsJMyaWt+JVSDMTmLZrSKWVSOW5hGNFalo2LEcho9zNhYl0J1/5+p8TxTcjRMND3GAac2WiRazfrzy1e9oFUsIlZHSSIJggNK3T0/bah09+83SM2fkjxIhG6fnwWmnb/3I0aBzi7CMskXYvQrS6fmg78rBxscmq8KwmRoQb17nZFBZpxok7dpXeTxepDvILe9ZJ79ujPamw2VBhZcSLUZ84f9wFJyYbTsKrN67p16rmP6+IXC7YuB+jU03ikv3o+7l0k2S0wUID5TsLxIIiMk8XpCAzQQfJ1IfZowkhwJirFZTwi80dgOMlx0SKlqlf6+Yss9YPcV8gkoCyl7K0eM735PXZNz9dCj/uTbYp89nHh1yZj58dLrWm006reMybrAn405bRbhBjXAXVGWWl/gU44jGMRQ5p9i0NVQecxwpum7qj4bJzOK3brco/z1Rs7FvVJ2tGM9UtvuC8PwBIhCFw6R7h/E/pHQMQUxlthIqMl0s20DLDoVqwuw07oZPd1gRSzV9kCxLx1Wz+ZjRJ4pKax0+1UO7eXysem3pGY29wOjtIKca/6KJrgFddOfc7gx7ExmjO3+CWPnmiLhBAPosqbv8AmXTLZS3heLxRhojmrJsC+VgOuIRVCJvLSIYOkTYdEHl+ShQtkFdwoa6I6Selzi+dcZXNs+i/fWOY3/mSd3+bHON/dlHCxoaKai9ovPPwuid3n9waO9/kMza+cnM2nmNzDrTac2rbD4GDuNayNiHgDAJL62uHz8Dbz4feC+Vbzjy6gfC2nG9ptKBbbsuUO4riJio+hWdIiSdrK51EL49chXRq3oZ5uyKefc8Vkn+QSbHWX0MKkgUoaW9/dpbNei3G2e+/c78bYzeyXynVczv1Zhfe0lmPL/gIiypmyHBpjwMk9JAnkS/eapV4+fmqXbaLNXa8MJrG4V2Uq3fKqo5m6im48/EczHiJ7WN1y63pWXzkCbpPO4kKZndQhRFc2S66Og3WsGLg+M2ML0aTjfPdNN5q1Q/XIa9jcI7qW62K6Cuv9BSXPdIklzmhfXUoZ6PvqqdL2cI4QEqm21kWK95hhk1SD4AXlk4neFRn0r1/SgGO24gqFRl6+ZA2EqZ/UHoV8o3a9/bG2tAqH7YcTgQNhek9y4lb/Jgd+CrDy6SURuqwwevBDOYyNbVgWuwW3XYT9egbh4N9Xp54QN1AwX3F6DJp+cU4iTIGM5jIsZA5TzyX8jAV+DTaeN8Omk2bPj1ZPzIYYO5Jhvf9uVJS8IGs56OY3DQXRs70MoXMjQ8UPxw/CLWMcvX2Mz/PyN9J5H/k4t9+R8=</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 165 KiB

View File

@@ -1 +1 @@
<mxfile host="Electron" modified="2023-03-25T17:25:58.170Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="xtv4h1xuAH9tg5bJ41gS" version="20.8.16" type="device"><diagram name="Seite-1" id="c5J236jw9uxX1O-q0mKY">5Vlbe+I4DP01PHY/klAKj9za6bbdG92vM/tmEpF46sRZ2ynQX79y7DQ3aDvTUpjZF7BlGds6OpJsOt4kXl8IkkY3PADWcbvBuuNNO67rOMMefmnJxkgGrhWEggZWqRTM6SNYYddKMxqArCkqzpmiaV3o8yQBX9VkRAi+qqstOauvmpIQWoK5T1hbekcDFRWnOCvln4CGUbGy0x+akZgUyvYkMiIBX1VE3qzjTQTnyrTi9QSYNl5hFzPvfMfo08YEJOo1E8b9y9Xvm7H6K/b+vDr/fHk9TUYnhZml2hQnhgANYLtcqIiHPCFsVkrHgmdJAPpnu9grda45T1HooPArKLWxaJJMcRRFKmZ2FHcsNp/t/LzzRXd+OS2603V1cLqxvfaRrRUkz4QPz53Tug4RIahn9Fyjp21QWcAa9AJ4DLgfVBDAiKIPdSch1tfCJ70SDmxYRL4FHfO7D4RldqUrbXl9YD+i/r3C1h3QBL8eM0niGHQzplqOYog7bp/hcccLga1Qt0gmQ1h2Jl5nPGFM5RPOuYgzRoSZ1XKIOtyriCqYpyQ39wpJX4d2SRmbcMZFPtcLCAyWPsqlEvweKiN9fwCL5XOgPoBQsH4WhmLUs25sg4zbs/1VSVmnkEUVuva7+0LOaZnxp+SV+0peeUfFK7fFqwoFVlQEepBranwiSdAmUc64m/nJbO3n6c7QaYH+KjAf/IgM8tyjY9DZYRlUkuZLjTPvzaB3Z4ad+geniSoBdrt1gL1eAzhDYTurxG4kBNlU1FKtIHevczporNOsSl7aV10fG2YHpSM92eT7fctr8d9mUct97IRo7hDp0yZ/piNCJcnqmHEFSZJkmH+FYZ2E6IcMA6fOsYWB4rrwsyfSs9cWqMdVoZ61mHTZyI0rEEFeZf5KIgES688ViVgq+CKXhpAykgcEw6uchrcU61ssc/sk1qwwn+dMu5vUp8iWaCSgTL2NYnuoPL3DE+YgefP7HX/wSscfHpXfD1p+P6X6XjbDUywSKiVUXV87dTONfAWTOgqqnFxTqcA4H+aR+8P7djMZHN63hy9YnRkTNk1ts3qaLRh9pHlSPzLT9rxDm9ZtvzU8GbKwYyFY8jxgl/br/5vxYuBE5jFihApOL12baXa8+KELwPiuL02j3lJJzAWPIGV+5xIRkiKf3E4XxfJ4PrOD+q5QXNlpA2DERdVRrNdRCU+gUXRZEcG0k2DXR7T13sYaZeoTNrIDMQ2CPIhuc5u6Y72D5zQvas5p23M8Z4vneHvznNP/R4VWVF4vZqrBUWWqYtutoLmbYK3ISRYhRMS8Fh44cjb9/0OT0iIaDu9vp9N0fXcjZ0tX0L/HWx5p/8mwH9CQYuyQmG/AvNnO/UhQpRPUx94LdbC0PHJKCrRMvgWYnSicdV9xT+xuQaH56vBuKLS9/JuzlbsjW11DmCOotXZkoHfPNgyW6m25pop6b0+ou23Uh1tAd/YFevsd5zfqRxrtW7wd5iQEmVfZo0wSsQCqMpqEbyTgB9BpuD86Ybf8z9E8qJX/3Hqz/wA=</diagram></mxfile>
<mxfile host="Electron" modified="2023-03-27T15:38:53.651Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="NPX1EUEImPl_yUjK8dhA" version="20.8.16" type="device"><diagram name="Seite-1" id="c5J236jw9uxX1O-q0mKY">7VlbV9s4EP41eWRPbIdcHnODsoXuBfbQ7ptiT2wV2fJKcpPw6zuyZHwLkAIh6em+gDQaWdJ8882MlI43jdfngqTRFQ+AddxusO54s47rOs6oh/+0ZGMkQ9cKQkEDq1QKruk9WGHXSjMagKwpKs6Zomld6PMkAV/VZEQIvqqrLTmrr5qSEFqCa5+wtvSWBioqTjEo5R+AhlGxstMfmZGYFMr2JDIiAV9VRN68400F58q04vUUmDZeYRcz7+yR0YeNCUjULhMm/YvVH5uJ+jv2/vp49vnicpaMTwozS7UpTgwBGsB2uVARD3lC2LyUTgTPkgD0Z7vYK3UuOU9R6KDwKyi1sWiSTHEURSpmdhR3LDaf7fy880V3fjsturN1dXC2eegFY40pdheM+3dGdEYZswptm1gzSZ4JH54yhPUtIkJQT+i5Rk8bqbKAtfg58Bhww6gggBFFv9W9iFhnDB/0SrywYSH7EfjMd78RltmVPmpo9IH9iPp3Clu3QBP8d59JEsegmzHVchRD3HH7DI87WQhshbpFMhnCsjP1OpMpYyqfcMZFnDEizKyWx9T9YRVRBdcpyc29wqhQx36JaE054yKf6wUEhksf5VIJfgeVkb4/hMXyKVC/gVCwfhKGYtSzfm6jkNuz/VXJaaeQRRU+97v7Qs5pmfHXJJ67I/G8oyKe2yJehSMrKgI9yDV3PpAkaLMsp+TV9cl87ecJ0/BtgQ4tMKP8jBTz3KOj2OAwFHuGKiUHS9p9qbFuOwdfTjFvR4oN3ppiduqfnCaq9BS3W/cUr9fwALNRO6t0AjQr2VTUUq0gH1/ndNhYp1kgPbevuj42zA5Kj3ywycud1GsFEpuvbRDBTojmDpGH7SiS6dBSSec6+MwvPxneSoh+ykBy6hxbICmuLL98rh7sWiQfV5U8aHHsopF+VyCCvNL9nUQCJNbAKxKxVPBFLg0hZSQPFYZxOUFvKNbYWGr3SaxpY/6eMe2PUp8iW6KRgDL1Og7uofr1Ds+o40zNL2fGcEdmjI6KGMMWMWZUXx7neIpFQqWEKje01zcz0FcwWafg0skllQqMd8Yg7g7v/M10cnjnHz1jdWZM2DS1LQjSbMHoPc3rgSMzbc87tGnd9oPIgyELOxaCJc8jemm//n8ZLwZOZB5Exqjg9NK1mWbHiw+dAyYAfXEb95ZKYrK4Bynze59mRJDzYkZDqggiioBlSWi+2E4yxZ7w0GZb9a2iuLL9BuoIlqpDWy/PEp5Ao5azItxXmGDXRxfA3XoTDT31CRvbgZgGQR56t/lS3dvewJ2aN0jntO1OnrPFnby9udPp/4VfraB7Nr8Njyq/FdtuhdrHGdiKt2QRQkTMQ+iB422TIO+ayhbRaHR3M5ul69srOV+6gv4z2fL+/G+mY18l6oF5j772I0GVzmvveyHV4dQyzXmjODXo7nBB7W6BofnO8WYwtN38h5Oc+0iSu4QwR1BrPZKj3jwfMViq12WjKuq9PaHutlEfbQHd2Rfo7ZejT9SPNNo3eOvMWQgyL0LGmSRiAVRlFEuQ1xHwHeg02h+dsFv+4Gqe8Mqfrb35dw==</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

View File

@@ -1 +1 @@
<mxfile host="Electron" modified="2023-03-21T15:14:06.078Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="3DaBP0dlD2vB6rGOEdhY" version="20.8.16" type="device"><diagram id="k7iwBMskrYiuqxr37yBD" name="Seite-1">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</diagram></mxfile>
<mxfile host="Electron" modified="2023-03-30T17:26:57.235Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="qHh66gKnss4mO05uyrej" version="20.8.16" type="device"><diagram id="k7iwBMskrYiuqxr37yBD" name="Seite-1">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</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 119 KiB

BIN
images/pflichtenheft.pdf Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
<mxfile host="Electron" modified="2023-03-21T11:59:08.914Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="Kqgo0UKfTNACEKGt90F_" version="20.8.16" type="device"><diagram name="Seite-1" id="4AvssoyQ3F2APBzfr0LI">7VpZk+I2EP41VCUPu+WDMfDIwEC2KslOMtnd7KPAja1BllyyOH/9Sli+MIdZMEcqT1jtliV3f193q03D7gXLIUeh/wdzgTQsw1027H7DskzbaskfJVnFko7pxAKPY1crZYI3vAYtNLR0hl2ICoqCMSJwWBSOGaUwFgUZ4pwtimoTRoqrhsiDkuBtjEhZ+g27wo+l7eS1lPw3wJ6frGw6nfhOgBJl/SaRj1y2yInsl4bd44yJ+CpY9oAo4yV2iecN9txNN8aBiioT/nof0k9f/kbv7bnd+eoOh/356IP1pDcnVskbgysNoIeMC595jCLykkmfOZtRF9RjDTnKdH5nLJRCUwrfQYiV9iaaCSZFvgiIvit3zFf/qvkfn5Lhd/24zaC/LIxWelR+ZW2FiM34GA69p4YO4h6IA3pmO1ZURsitoC06BBaA3JBU4ECQwPMiSpAGm5fqZf6QF9olp7gnfu4ckZle6dVHEUiRNGNX/vSxhwVey60wWvJktMABQVS5bOFjAW8h2hhpIaladMhew86BC1getIS+ayc4X22NFxltLEPL/BxlrJZRk/VM+8bgts5E9yFMHIW8XRXy1qUhv5na5Rytcgohw1REuSe/KkGGH6cIH3M7mp2kLi/i9TPwpC/y83iyy2yU9JpRr6FWH2zoiDyOggA27HSItPvziMsrT119Hr3DVMRmZBQkYXv7lCQ/gEZjH03EHr0/Z2INfNLo2Y3nns/jXcxVFDD6SE4KVComarLxyz+rkNkfntF4CtT9tUSKIuRPDhUHI1fl+LEVPprl6GE6O6KHadYWPZzHTo1nBY8kKByPHk93lTCTfec4OgBwRxL6Uvr6+SGwb7Yqgt+uDfvNW2C/JgxfOLGVUpHZ3HLf05ZbYhLpWZlnTs2QpXWcwynyiH49OTKJBzkCfgkiEOs4QeVT00Nw0dpRxl6Zi63HzkNVj2hPFTPOxVl9lnfKcO/SCeMuqIoskgUaiqIN9O/pbNapeDQzO3WBunMTTC+xyEFajr7n7mSAVoNVHt311WNJ++UYOZyK5GjdFTmcEjk+UQF8jmGhOmRYXK8mS3ha93mkvjRglOz0P2UOUaZVkTL31fFrlSgz4MiD0eac73ib87w+9HN5+SbQFHxGZL55CBrtyDzXpVG7ZN/XCcFjX5alPkzEQxjRvH0w2mFG3Zi2co1pRO6yNe3YFeufNOpf3oC3KYBqbk0nsDj+OcaoGJytes7w/8HmdGLSn+5O72oo7+g7D2Z0qigtuS2Ubrcpduqpe53eCPiIY+rF21Bfci1jCNHYj6dORBRytoYogugqoTcNXHXXge26Ikd6nn7QdsCZgcOqGjiad1XWJfu+aV/6bPDfvvCwbvJJty4UX70zbW35pa7OtH1iZ9q+RoJsliiY70x/Az5dw8y7Tlv6fCre/CRllbs7aRWQFAGpgaMwrUUoktm/VC58Be4zmChSKKAg8nFTVegmUZeGcR9VnX/jqXLP6TIll0mbiqJfIsHZFHqMMC4llG2OHhNMyJZIljUelcMxqE6VFCgP4TEiXX0jwK5L9p1bilApY+Hko0vqvlXRmzmv2+3LeF0Osz+jxaTL/tJnv/wA</diagram></mxfile>
<mxfile host="Electron" modified="2023-03-30T16:13:26.473Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="NBkm3Zraic1t1MOXaLR9" version="20.8.16" type="device"><diagram name="Seite-1" id="4AvssoyQ3F2APBzfr0LI">7VpZc9s2EP41mmkfnOGh81GWLDUzba3WTVI/QuSKhA0CGhA6f30AEbxEHVRk6sjkxSaWCwLc/b7dxVI1uxcshxxN/b+YC6RmGe6yZvdrlmUa7Yb8pySrSNKqdyKBx7GrlVLBC15DPFNLZ9iFMKcoGCMCT/NCh1EKjsjJEOdskVebMJJfdYo8KAheHESK0m/YFX4kbVutVP4HYM+PVzab+v0CFCvrNwl95LJFRmQ/1eweZ0xEV8GyB0QZL7ZLNG+w526yMQ5UlJnwz9uQfv7yL3prz+3OV3c47M/HD5Z2TyhW8RuDKw2gh4wLn3mMIvKUSh85m1EX1GMNOUp1/mRsKoWmFL6BECvtTTQTTIp8ERB9V+6Yr/5X8z814uGrftxm0F/mRis9Kr6ytkLIZtyBQ++poYO4B+KAntmOFJURMitoiw6BBSA3JBU4ECTwPI8SpMHmJXqpP+SFdskp7omeO0dkplca+SgEKZJm7Mp/fexhgddyK4wWPBkucEAQVS5b+FjAyxRtjLSQVM07ZK9h58AFLA9aQt+1Y5yvtsaLlDaWoWV+hjJWy6jIeqZ9ZXBbZ6L7ECaOQt4uC3nroyG/mdrlHK0yClOGqQgzTx4pQYqfZh4+5nY0O0ldXkTrp+BJXuTH8WQX2SjpNaNeTa0+2NAReRwFAWzY2STS7o9jLq88dfU8foN3EZmRUZCE7e1TkvwAGjo+mog9en/PxBr4pNaza489n0e7mKsoYPSRnBSoVEzUZOO3/15Hz/bDI3Legbq/y8d9g/HDgPFgRiTaCiTJU+Dk0HEwkpWOJ1vhpF6MJmZzRzQxzcqiSfO+U+VZwSQOEsejSeOmEmi87wxnBwDuWFJBSkfPd4F9s1US/HZl2K9fA/sVYfiDE10hNZn1Lfc1ttwSkUjPSj1zasYsrNM8nDKP6FeTM+N4kCHglyAEsY4SVjZVycyGAsWw6O995SdrR7l7YY627js/lT3KNUpmog9n+1neKdKgSyeMu6Aqt1AWcigMN5S4pTNcp+QRzuxUBerOVTC9xCIDaTl6zdxJAa0Gqyy6q6vT4jbNMXI0S5KjdVPkaBbI8ZkK4HMMC9VJw+JytVrM06rPKdWlAaNgp1+UOUSZVknK3FZnsFWgzIAjD8bM2xz5dV+Ay8sXgd7BZ0Smmrtg0I6kc1kGtQumHU0IdnxZqfowEXdhRPP6cWiHGXXv2sr0rhG5ye51c4f9dnev65UZ8Dq1T8Xd6xgWx7/YGCXjslXNsf4n7F/HJv3hBrZKKp3eGPiYY+pF89TXWcsYQuj46na3PhHhlLM1hCGEF4mVSaSpumZrV0X15Ox7p0f3M5lulWV6/aZKsHjfV+0tnw3+61cK1lU+01aF4ot3l60tv1TVXbZP7C7bl8ho9QIF46oyxMDjDMX3Zqg74ejVz0RWsUWTlAdxdZD09cNpUlVQJI1eqCO+AvcZTBRbFIIQ+bT5xK07PV06jZqh6iQbTZV7TpYpuEzaVOT9EgrO3qHHCONSQtnmEDHBhGyJJEw8KocOqHaTFCgPYQeRrr4RYNcl+04geagUsXDyISRx3yrvzYzX7fbHeF0O01+eRWxMf79nP30H</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 138 KiB

View File

@@ -1 +1 @@
<mxfile host="Electron" modified="2023-03-16T00:02:16.040Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="gIfJ7zOkVKn1Np3lvPmu" version="20.8.16" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile>
<mxfile host="Electron" modified="2023-03-29T16:39:31.942Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="UFZe3OcaIXhOXbdWZBG0" version="20.8.16" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 133 KiB

View File

@@ -1 +1 @@
<mxfile host="Electron" modified="2023-03-23T14:49:19.151Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="9qRytuOhA2HWE540xQnN" version="20.8.16" type="device"><diagram name="Seite-1" id="OQF_a6zVYjKttAf1AJ-S">5Vnbkto4EP0aHr0FNhh4HK5JFlLZIruT5WVL2MJWEJJXlrnM10ey5bu5BYiTylQxhVotu9V9+qhbNIzh9jBlwHPn1Ia4oTftQ8MYNXS912uL/1JwjAStbrcfSRyGbCVLBQv0BpWwqaQBsqGfU+SUYo68vNCihECL52SAMbrPq60pzr/VAw4sCRYWwGXpK7K5q/ald1P5O4gcN35zy1T724JYWe3Ed4FN9xmRMW4YQ0Ypj75tD0OIpfNiv0TrJidmE8MYJPyaBYsZ607n3ocFWAxhb/cneZ2ONcNQxvFjvGNoCweoIWXcpQ4lAI9T6YDRgNhQPrYpRqnOjFJPCFtC+BVyflTRBAGnQuTyLVazwmJ2/KLWh4N/5eCPTjwcHbKTo2Mysl9kTMVwham1iUQThLFSKPtEucmnAbPgGUfoCluAOZCfc5iKpvRS5g3K5VNIt1BYLBQYxICjXR5GQKHRSfTUUrEtcMwoeBQR7mee/EkKhIJKLL2n7IjzSu/kg3+bvvgSWRCPMltJRSGgbgCX8ukO4EC54TNEmEB3C5nMkMbQaAxMy+WwoZtYeH2wEnLTkd9eISLSH2QLsQ1JCaUpBiWg9i7icOGBMMR7wUR5vK0p4QqMLeHRgYOB7yvI+JzRTZLbUjtJVDm9FuAaUkxZ+FoDhn/JssyMYRp9wz6HwR1kHB7Ogiaebeaj1VfDfcpALVPJ3Az7dJunYZYJ9e2RbJci+TGMz53UkQlRBWFUEks2lK1rKEGMlH7vcrQxWEE8ANbGCQ2Nw0sogXfQ1klEXCSROFtVXG/jlJQEYhW6XvuC3c4SRScPveTd8TMihlSrCrB6AGeYJaQpJkA+L7MEIA4MCYL/3gTR+pEM8Y5M/+Pdzse+Nl/Z683m8zKYaq1SAH7iOiIb7hvqikK6fl+hERcQFyuN9r2FxV2MH5uZSUR5XPfN9Vpwod78AFwGfRD4e+Bij9EVJNpM5CgkgPhInOn3JeQDciQ5NWs4RN8PR/3BgQ7Acj7o2NPFYWb14hTJelQRmo12MaMlHJdznvl/QENpcjRpVsQsL/KtBHEEcLRaacbP+/uLNsEC2XpTEx/JpVFJFRAn8zaxn1XRAiGrsOuJpkrjMBD6c+qHXeRYjBFcQyaM9feQbd5g4JwzOT0YTm3iJCabVxwSGaZXFUGe5JXwAdgtQFdrlbGrV2HXfBa919smJoNfgN7719K7WSu990tkNAnbsSHGUBGFVk6rERAE7wP+Jm0K/No5vl1sa2uvg/Q6EqVOwLfjW7mLNyf9OgHfrjx91QmkWoyX5LIhntDmwN9U3E7sKKmsgSoOovCOQxZNd95hPCFbak+W/m+XLOaVyVLr4dAuN+ETyrYBBvLaDqx8y0XW5icAdLFO+qH0H/D5+OX4z3Jpf2pZ+OvyLzbrVNT4CxFr0QxNxsT2ArJ53EVF7xe4p2jrhQCV49OtCI/+rPCUb6RfNhzRx10v3xiUB7i4U7wKqtvFp9tc6afKXrHcC15cIic0P3S67Ct73qG6pxTJB8MfEoJ1pieMHntF85hXLB5WGCPPh5cBkk/EPFoeAYFiFfw0CIhh+oNldOWb/uxrjL8B</diagram></mxfile>
<mxfile host="Electron" modified="2023-03-30T16:34:31.425Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="TQ0JShpZqPYf8JSQ05lG" version="20.8.16" type="device"><diagram name="Seite-1" id="OQF_a6zVYjKttAf1AJ-S">5Vnbkto4EP0aHr2FbTD4kXs2C6lskc3M8JIStrAVhMTKMpf5+pVs+YYNAzUwkOxUUYNaLUvuc/q0JGpmb7UbMbD2J9SFuGbU3V3N7NcMQ9fthvgnLXtlsW0ztngMucqWGaboFSpjXVlD5MKg4MgpxRyti0aHEgIdXrABxui26LaguDjrGniwZJg6AJetT8jlfmxtG63M/gkiz09m1i077lmBxFm9SeADl25zJnNQM3uMUh5/W+16EMvoJXGJxw2P9KYLY5DwcwZMx6w1mqw/T8G0B9ubv8jTaKCZCo2A75M3hq4IgGpSxn3qUQLwILN2GQ2JC+Vj66KV+YwpXQujLow/Ied7hSYIORUmn6+w6hUrZvtnNT5qvMjGH82k2d/lO/v7tOV2JKaiOcfUWcamIcJYOZRjosIU0JA58EQgDMUtwDzITwVMoSmjlJtBhXwE6QqKFQsHBjHgaFOkEVBs9FI/NVS8FtjnHNYUER7knvxVGoSDyiyjrdaR5JXRLIJ/mb/4Eq8gaeVeJTNFhLqAXCqmG4BDFYZvEGEC/RVkMkNqPbPWtRyfw5phYRH17lzYLU9+e4KIyHiQFcQuJCWWZhyUhNr6iMPpGkQQb4UUFfm2oIQrMuoiol0PgyBQlAk4o8s0t6V3mqiyeyHI1aOYsmhaE0Z/6bBcj2mZtume4uAGMg53J0mT9NaLaNmquc0USLeUzc+pT6t+nGY5qC9HslFC8kuEzzulIwdRhWBUCkseSv0cSRAt5d9+G20M5hB3gbP0ooUm8BJK4Dtk6ygj3hSRJFsVrpdpSiYCiQtdLAKhbieFolmkXjp38oxYIdWoA1pdQTOsEtOUEqCAl1UCEA9GAsH/3wKhf6RCfCKjH7zV/GJrk7m7WC6/zcKRppcAeOB9RB7uG+8rkv3CmxuLxrmacLYIvEvxk3XnElGWa9taLIQWGvXPwGcwAGGwBT5eMzqHRBuLHIUEkACJmv6+hLxCjqRV8w5F9M9e3+7uaBfMJt2mO5ruxk47SZF8RJWguWiTKFqqcYXgWf+GNLKmpUlzYmXpyFkJ4gjgeLTyTJ73z7M2xILZRl0TH6ml8ZYqJF40OJ5NvM/8cAXCVrGuGy5VLg4D4T+hQXSMrODYFrLlKwy9UwvPysOxVznKzPoZpSKn92pfUJR6ZbwCgw8IrBllBptmBYOtW4n8fQ+LaePxRN4+V+StxxJ5uyRJw+hQ1sMYKrnQymnVB0LmA8Bf5ZrC4O5K3zg83N59N2TcI1E+kPDJZuXt6xL7oQjfqKzBqg6pg0YnvXJIOrQJCJYVdxQbSiqrVEUhim465NbpnTcZN8iWuyeL/bsni3VmsjxWcWiUj+JDylYhBvLyDswDx0fO8gEIfbhP+lD5D/lk0Nl/n83cr7qDf87+ZuNmxU5/KsAXR6LhgLjrkCyvd13R/gVuKxqHAJXxaVXAY9wKnvK9dGfJEb3eJfOFoFwhxM3W3UI8Jwtjt+9NX76zrWV3xqvnlx8VGTCGnhBUGB0DD8Is3pEXY1l5oqo4eQGMPCKajogcZLIki4ghB+CO6lgh140KRhV4xSJyWBFuQHytApbmdWARzeynxPgyNvtF1hz8Bw==</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 78 KiB

BIN
main.pdf

Binary file not shown.

View File

@@ -2,6 +2,8 @@
% Selbstständigkeitserklärung
%
%\includepdf[pages=-]{images/selbststaendigkeitserklaerung.pdf}
\chapter*{Selbstständigkeitserklärung}
Hiermit erkläre ich, dass ich die vorliegende Arbeit selbstständig und ohne Benutzung anderer als der angegebenen Hilfsmittel angefertigt habe.