feat: probelesen korrektur

This commit is contained in:
Leon Etienne 2023-03-29 19:07:27 +02:00
parent c0d8984cf4
commit eff6248883
Signed by: leonetienne
SSH Key Fingerprint: SHA256:hs2AZKjRTbd2kYg44u89rM19UT2LyBOpSbIShsdkkfg
13 changed files with 203 additions and 189 deletions

View File

@ -16,21 +16,22 @@ Wie oben erwähnt, sind bereits die Constraints und einige funktionale und nicht
\textbf{Art der Anforderung} & \textbf{Anforderungsbeschreibung}\\ \textbf{Art der Anforderung} & \textbf{Anforderungsbeschreibung}\\
\hline \hline
\hline \hline
\ac{NFA} & \makecell[l]{Angaben zum Weingut des Weines\\sollen aus dem Accountdatensatz anstatt\\aus dem Webform kommen.}\\
\hdashline
\ac{NFA} & \makecell[l]{Aus dem Papierformular soll ein\\Webformular werden.}\\
\hdashline
\ac{FA} & \makecell[l]{Beim Erstellen einer Weinteilnahme\\soll ein QR-Code als PDF generiert werden,\\der den Wein identifiziert.}\\
\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.}\\
\hdashline
Constraint & Einbau in brown-field TYPO3\\ Constraint & Einbau in brown-field TYPO3\\
\hdashline \hdashline
Constraint & Mitarbeiter-UI in TYPO3-Backend\\ Constraint & Mitarbeiter-UI in TYPO3-Backend\\
\hdashline \hdashline
Constraint & Nutzer-UI im Frontend\\ Constraint & Nutzer-UI im Frontend\\
\hdashline \hdashline
\ac{NFA} & \makecell[l]{Aus dem Papierformular soll ein\\Webformular werden.}\\
\hdashline
\ac{NFA} & \makecell[l]{Angaben zum Weingut des Weines\\sollen aus dem Accountdatensatz anstatt\\aus dem Webform kommen.}\\
\hdashline
\ac{NFA} & \makecell[l]{Registrierte Weinteilnahmen\\bestehen aus einem Wein und einem Zustand\\(ausstehend,eingegangen,abgelehnt).}\\ \ac{NFA} & \makecell[l]{Registrierte Weinteilnahmen\\bestehen aus einem Wein und einem Zustand\\(ausstehend,eingegangen,abgelehnt).}\\
\hdashline \hdashline
\ac{FA} & \makecell[l]{Beim Erstellen einer Weinteilnahme\\soll ein QR-Code als PDF generiert werden,\\der den Wein identifiziert.}\\
\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 \hline
\end{tabular} \end{tabular}
\caption{Initial bekannte Anforderungen} \caption{Initial bekannte Anforderungen}
@ -43,12 +44,12 @@ Um nähere Anforderungen zu ermitteln, werden die Befragungstechniken \enquote{I
\section{Interview mit Product Owner} \section{Interview mit Product Owner}
Zunächst wird ein Interview mit dem \ac{PO} geführt. Ziel dieses Interviews ist Zunächst wird ein Interview mit dem \ac{PO} geführt. Ziel dieses Interviews ist
es, konkrete Fragen zu Anforderungen zu klären und somit konkrete Anforderungen zu formulieren. es, konkrete Fragen zu Anforderungen zu klären und somit konkrete Anforderungen zu formulieren.
Aufgrund der individuellen Gesprächsführung wurde sich für ein \enquote{Teil-standardisiertes Interview} 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, entschieden. Bei einem teil-standardisiertem Interview gibt es vordefinierte Fragen,
aber auch Freiraum für Improvisation und Persönlichkeit. 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. 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, Um möglichst objektive und unvorbeeinflusste Antworten zu gewährleisten wird darauf geachtet,
keine Suggestivfragen zu stellen keine Suggestivfragen zu stellen
\cite{bib:kleine-re-fibel}. \cite{bib:kleine-re-fibel}.
@ -63,20 +64,20 @@ Jede dieser Stakeholdergruppen sieht das System aus einer anderen Perspektive
\break\cite{bib:kleine-re-fibel}. \break\cite{bib:kleine-re-fibel}.
Daher ist es wichtig, Einblicke und Bedürfnisse aller Stakeholdergruppen einzuholen 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. 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 \cite{bib:kleine-re-fibel}. Somit sind auch bei einem nur teilweise ausgefüllten Fragebogen die wichtigsten
Fragen beantwortet. Fragen beantwortet.
Sämtliche Fragen an die Stakeholdergruppe \enquote{Mitarbeiter \ac{WM}} wurden bereits im Interview mit dem \ac{PO} 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 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 die Stakeholdergruppe \enquote{Mitarbeiter \ac{WM}} und steht seit geraumer Zeit mit \ac{WM} in
persönlichen, engen Austausch. Daher gibt es keine offenen Fragen, die diese Stakeholdergruppe 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. 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 Der Fragebogen der Stakeholdergruppe \enquote{teilnehmende Weingüter} liegt im Anhang unter
\fullref{chap:anhang-fragebogen-extern} bei. \fullref{chap:anhang-fragebogen-extern} bei.
Um den Aufwand und somit die Hemmschwelle des Ausfüllens Um den Aufwand und somit die Hemmschwelle des Ausfüllens
eines solchen Online-Fragebogens zu minimieren, gibt es lediglich sechs quantitative Fragen eines solchen Online-Fragebogens zu minimieren, gibt es lediglich sechs quantitative Fragen
zuzüglich einem optionalen Freitextfeld, um sonstige Wünsche zum Ausdruck zu bringen. zuzüglich einem optionalen Freitextfeld, um sonstige Wünsche zum Ausdruck zu bringen.
Eine Anmeldung über Google ist nicht erforderlich. 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 Der Link zu diesem Online-Fragebogen wurde \ac{WM} mit der Bitte um Weitergabe an
die Probenteilnehmer übergeben. die Probenteilnehmer übergeben.
@ -87,7 +88,7 @@ Das Pflichtenheft und das Protokoll zum Interview sind im Anhang unter je
Ergebnisse dieses Interviews sind zahlreiche Anforderungen und Ideen. Eine der wichtigsten Ideen stellt das Ergebnisse dieses Interviews sind zahlreiche Anforderungen und Ideen. Eine der wichtigsten Ideen stellt das
projektbezogene, wöchentliche Statusmeeting dar: Jeden Donnerstag soll um 9:30 Uhr der aktuelle Stand projektbezogene, wöchentliche Statusmeeting dar: Jeden Donnerstag soll um 9:30 Uhr der aktuelle Stand
des Projektes vorgestellt, diskutiert und Rücksprache gehalten werden. des Projektes vorgestellt, diskutiert und Rücksprache gehalten werden.
Die wichtigsten Erkenntnisse des Interviews sind: Weitere wichtigste Erkenntnisse des Interviews sind:
\begin{description} \begin{description}
\item[Endgerät für Scanning und Scanneranwendung]\hfill\\ \item[Endgerät für Scanning und Scanneranwendung]\hfill\\
Gescannt wird von Mobiltelefonen mit einer QR-Code-App wie QRBot. Gescannt wird von Mobiltelefonen mit einer QR-Code-App wie QRBot.
@ -100,23 +101,20 @@ Die wichtigsten Erkenntnisse des Interviews sind:
Weinansicht in zwei Ebenen unterteilt ist: Die erste Ebene soll eine Auflistung aller Jahresauswahlproben sein 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. 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. 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 Prozesse zu durchlaufen.
Diese Prozesse sind in \fullref{chap:umsetzung} detailliert beschrieben.
\item[Nutzerführung für \ac{WM}-Angestellte]\hfill\\ \item[Nutzerführung für \ac{WM}-Angestellte]\hfill\\
Gescanne QR-Codes von Weinen sollen den Wein als eingegangen markieren und anschließend dem 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 eingechecked wurde. Somit dient das Scannen eines Codes ebenso zur
Einsicht der Details der gelagerten Flaschen. Einsicht der Details der gelagerten Flaschen.
Es soll ein Backendmodul geben, das für den Export von CSV-Daten zuständig ist. 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. Sonstige Aktionen sind im TYPO3-Backend mit nativen Werkzeugen erreichbar.
\item[Verschiedene Web-Ansichten]\hfill \item[Verschiedene Web-Ansichten]\hfill
\begin{itemize} \begin{itemize}
\item Jahreauswahlproben-Listenansicht \item Jahresauswahlproben-Listenansicht
\item Jahreauswahlproben-Detailansicht \item Jahresauswahlproben-Detailansicht
\item Wein-Registrierungsformular \item Wein-Registrierungsformular
\item PDF-Url für Versandbriefe \item PDF-Url für Versandbriefe
\item Registrierungsseite mit mehreren Schritten \item Registrierungsseite mit mehreren Schritten
\item Mitarbeiter-Seite für gescannte QR-Codes \item Mitarbeiterseite für gescannte QR-Codes
\item Listenansicht der Jahresauswahlproben im CSV-Exporter im Backend \item Listenansicht der Jahresauswahlproben im CSV-Exporter im Backend
\item Detailansicht der Jahresauswahlprobe im CSV-Exporter im Backend \item Detailansicht der Jahresauswahlprobe im CSV-Exporter im Backend
\end{itemize} \end{itemize}
@ -127,7 +125,7 @@ Der Online-Fragebogen für teilnehmende Weingüter wurde über einen Monat hinwe
gibt es keine Bedürfnisse dieser Herkunft zu präsentieren. gibt es keine Bedürfnisse dieser Herkunft zu präsentieren.
\\ \\
\\ \\
Aus der Anforderugserfassung ergibt sich als Pendant zu \fullref{fig:geschaeftsprozess-vorher} 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. 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 Hierbei ist es wichtig, die Schnittstelle zwischen den gleichbleibenden Arbeitsschritten und den zu digitalisierenden
Arbeitsschritten zu beachten. Diese Schnittstelle sollte unverändert bleiben, Arbeitsschritten zu beachten. Diese Schnittstelle sollte unverändert bleiben,

View File

@ -26,7 +26,7 @@ Kommt ein teilnehmender Wein bei \ac{WM} an, wird das beiliegende Formular von H
Diese Schnittstelle ist besonders resourcenaufwändig und fehleranfällig, da es oft vorkommt, dass die teils 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. 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, 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 an der Flasche befestigt wird. Darauffolgend wird die Flasche im Lager verstaut.
\begin{nicepic} \begin{nicepic}
\includegraphics[width=1\textwidth]{images/geschäftsprozess-vorher.png} \includegraphics[width=1\textwidth]{images/geschäftsprozess-vorher.png}
@ -49,4 +49,4 @@ Oberflächen für Mitarbeiter von \ac{WM} dürfen in der TYPO3-Backend-Oberfläc
\\ \\
\\ \\
Somit lautet die \textbf{Forschungsfrage}:\\ 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

@ -42,7 +42,7 @@ 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 Vergleiche zwischen sechs QR-Code-Bibliotheken legen nahe, dass \textit{chillerlan/php-qrcode} die beste Eignung
der betrachteten QR-Code-Generatoren aufweist. der betrachteten QR-Code-Generatoren aufweist.
\paragraph*{Wie wird sichergestellt, dass der digitalisierte Teilprozess der Weinanmeldung und -zustellung nahtlos mit dem verbleibenden Prozess integriert?} \paragraph*{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 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, 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 analogen Teilprozesses gleicht. Ist das gegeben, kann der neue, digitale Teilprozess effizient in den Geschäftsprozess
@ -53,7 +53,7 @@ kompatibel sind.
%Vermeidbarer Aufwand in der Entwicklung ohne ausreichende Vorteile (Kosten-Nutzen-Rechnung) fällt zulasten der Effizienz. %Vermeidbarer Aufwand in der Entwicklung ohne ausreichende Vorteile (Kosten-Nutzen-Rechnung) fällt zulasten der Effizienz.
\section{Diskussion} \section{Diskussion}
\paragraph*{Nach welcher Methodik sollten Digitalisierungsprojekte im Maßstab des behandelten Projektes entwickelt werden, um effizient und profitabel zu sein?} \paragraph*{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-Extension auszuwählen, Um eine Entwicklungsmethodik für die Umsetzung einer wie in der Problemstellung beschriebenen TYPO3-Erweiterung auszuwählen,
wurde eine Literaturrecherche durchgeführt. wurde eine Literaturrecherche durchgeführt.
Diese Literaturrecherche lässt darauf schließen, dass sich simple, agile Methodiken, ohne nennenswerten Mehraufwand, 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. gut für die effiziente und profitable Umsetzung kleiner Digitalisierungsprojekte, wie dem hier behandelten, eignen.
@ -88,8 +88,8 @@ Der Autor empfielt ähnliche Vergleiche für andere Arbeitsumgebungen durchzufü
Projektkontexte angemessen sind. Ebenso nimmt dieser Vergleich nur sechs QR-Code-Bibliotheken in Betracht. 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. Eine weitere Forschungsempfehlung ist es daher, weitere Vergleiche mit mehr Bibliotheken durchzuführen.
\paragraph*{Wie wird sichergestellt, dass der digitalisierte Teilprozess der Weinanmeldung und -zustellung nahtlos mit dem verbleibenden Prozess integriert?} \paragraph*{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-Extension zeigte sich das Problem 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 der Integration der digitalisierten Weinanmeldung und -zustellung in den restlichen, von dieser Ausarbeitung unberührten
Geschäftsprozess der Jahresauswahlprobe. Geschäftsprozess der Jahresauswahlprobe.
Diese Umsetzung zeigt auf, dass es für eine nahtlose Integration in den existierenden Geschäftsprozess Diese Umsetzung zeigt auf, dass es für eine nahtlose Integration in den existierenden Geschäftsprozess

View File

@ -4,7 +4,7 @@ Die vorliegende Bachelorarbeit befasste sich mit der Frage: \enquote{Wie kann di
des Regionalverbunds für Weine in der Weinregion Mosel effizient und profitabel durch eine TYPO3-Erweiterung realisiert werden?} 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 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 der praktischen Umsetzung der zur Erstellung von QR-Codes, verschiedene Befragungstechniken zur Anforderungserfassung, sowie der praktischen Umsetzung der
TYPO3-Extension angestrengt. TYPO3-Erweiterung angestrengt.
\\ \\
\\ \\
Aus den Ergebnissen lässt sich schließen, dass sich insbesondere \enquote{extreme-programming}-Entwicklungsmethodiken eignen, Aus den Ergebnissen lässt sich schließen, dass sich insbesondere \enquote{extreme-programming}-Entwicklungsmethodiken eignen,
@ -49,7 +49,7 @@ Ein triviales Beispiel hierfür wäre ein Wein mit zu hohem Restzuckeranteil,
der in einer Jahresauswahlprobenkategorie für trockene Weine antreten soll. der in einer Jahresauswahlprobenkategorie für trockene Weine antreten soll.
Ziel ist es, dass das Weinanmeldeformular fehlerhafte Ziel ist es, dass das Weinanmeldeformular fehlerhafte
Anmeldeversuche als solche erkennt und verhindert. Anmeldeversuche als solche erkennt und verhindert.
Kompliziert wird diese Technik dadurch, dass Kategorien beliebig viele Restriktionen haben soll, Kompliziert wird diese Technik dadurch, dass Kategorien beliebig viele Restriktionen haben sollen,
und diese von Redakteuren, im TYPO3-Backend, gepflegt können werden können. Ein komplexeres, realistischeres Beispiel wäre eine und diese von Redakteuren, im TYPO3-Backend, gepflegt können werden können. Ein komplexeres, realistischeres Beispiel wäre eine
Kategorie, die nur vegane Barriqueweine der Rebsorte Merlot zulässt, die einen Mindest- und Maximalrestzuckeranteil, einen Maximalalkoholanteil, Kategorie, die nur vegane Barriqueweine der Rebsorte Merlot zulässt, die einen Mindest- und Maximalrestzuckeranteil, einen Maximalalkoholanteil,
einen Maximalpreis erfüllen. einen Maximalpreis erfüllen.

View File

@ -2,31 +2,31 @@
\label{chap:umsetzung} \label{chap:umsetzung}
Infolge der Anforderungsanalyse befasst sich das Kapitel \enquote{Konzeption und Umsetzung} Infolge der Anforderungsanalyse befasst sich das Kapitel \enquote{Konzeption und Umsetzung}
mit der Implementation der Anforderungen in dem mit der Implementation der Anforderungen in dem
Brown-Field Projekt \cite{bib:schwarzer-vorlesung-swa} in Form einer TYPO3-Extension. Brown-Field Projekt \cite{bib:schwarzer-vorlesung-swa} in Form einer TYPO3-Erweiterung.
Es ist anzumerken, dass das aus \fullref{chap:anforderungserfassung} hervorgehende Pflichtenheft im Rahmen geplanter und 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 hat. opportunistischer Gespräche mit dem \ac{PO} geringfügige Änderungen erfahren wird.
\section{Setup einer TYPO3-Extension} \section{Setup einer TYPO3-Erweiterung}
TYPO3-Extensions werden via Composer installiert \break\cite{bib:typo3-docs-managing-extensions}. TYPO3-Erweiterungs werden via Composer installiert \break\cite{bib:typo3-docs-managing-extensions}.
Um eine TYPO3-Extension zu erstellen, muss also ein Composer-Paket erstellt werden. 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 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. TYPO3-Erweiterung darstellt, lokal in den versionierten Ordner \enquote{packages} gelegt.
Dieses Verzeichnis wird als Quelle für Composer-Pakete in der Dieses Verzeichnis wird als Quelle für Composer-Pakete in der
Haupt-composer.json-Datei hinterlegt. Haupt-composer.json-Datei hinterlegt.
Somit wird ein Composer-Paket nur für dieses Projekt bereitgestellt, Somit wird ein Composer-Paket nur für dieses Projekt bereitgestellt,
ohne den Aufwand zu betreiben, 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 Um das grundlegende Setup einer TYPO3-Erweiterung effizient durchzuführen, wurde eine
existierende Extension mit vergleichbarem Funktionsumfang kopiert, umbenannt und eingefügt. existierende Erweiterung mit vergleichbarem Funktionsumfang kopiert, umbenannt und eingefügt.
Spezifisch ist der \enquote{vergleichbare Funktionsumfang}, dass es Datenmodelle und hochpersonalisierte Spezifisch ist dieser \enquote{vergleichbare Funktionsumfang}, dass es ebenfalls Datenmodelle und hochpersonalisierte
Frontendlogik in Bezug auf die zuvor genannten Datenmodelle gibt. Frontendlogik in Bezug auf die zuvor genannten Datenmodelle gibt.
\section{Digitization} \section{Digitization}
Die Phase der Digitizion nach Verhoef et al. befasst sich mit der digitalen Abbildung von Objekten aus der realen Welt Die Phase der Digitizion 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}. 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, Des Weiteren befasst sich diese Phase mit der Automatisierung und Befüllung dieser Daten,
wie zum Beispiel Web-Formularen \cite{bib:verhoef}. wie zum Beispiel durch Web-Formulare \cite{bib:verhoef}.
Das bedeutet, dass in dieser Phase Datenobjekte definiert und implementiert werden. Das bedeutet, dass in dieser Phase Datenobjekte definiert und implementiert werden.
Ein Datenobjekt besteht nach firmeninternen Konventionen aus zumindest Ein Datenobjekt besteht nach firmeninternen Konventionen aus zumindest
vier Komponenten: vier Komponenten:
@ -51,7 +51,7 @@ angefertigt und in Rücksprache mit dem \ac{PO} finalisiert.
\begin{nicepic} \begin{nicepic}
\includegraphics[width=1\textwidth]{images/objektrelationen-weinlandmosel-einlieferungswerkzeug.png} \includegraphics[width=1\textwidth]{images/objektrelationen-weinlandmosel-einlieferungswerkzeug.png}
\captionof{figure}{Objektrelationen} \captionof{figure}{Objektrelationen}
\caption*{Quelle: Eigene Darstellung} \caption*{Quelle: Eigene Darstellung: Weinland Mosel Einlieferungswerkzeug}
\label{fig:objektrelationen} \label{fig:objektrelationen}
\end{nicepic} \end{nicepic}
@ -59,21 +59,21 @@ Nachdem in Erfahrung gebracht wurde, welche konkreten Datenobjekte benötigt wer
wurden Attribute dieser Objekte dem Pflichtenheft entnommen. Diese wurden in einem wurden Attribute dieser Objekte dem Pflichtenheft entnommen. Diese wurden in einem
formalen Klassendiagramm festgehalten und in Rücksprache mit dem \ac{PO} formalen Klassendiagramm festgehalten und in Rücksprache mit dem \ac{PO}
weiter bis zu festen Datentypen und Auswahlmöglichkeiten konkretisiert. weiter bis zu festen Datentypen und Auswahlmöglichkeiten konkretisiert.
Beispielsweise, dass Wettbewerbskategorien durch TYPO3-Categories repräsentiert werden sollen. Beispielsweise, dass Wettbewerbskategorien durch TYPO3-Categories repräsentiert werden.
Das hat den Vorteil, dass TYPO3-Categories bereits native Bestandteile eines TYPO3-Redaktionssystemes sind Das hat den Vorteil, dass TYPO3-Categories bereits native Bestandteile eines TYPO3-Redaktionssystemes sind
und alle relevanten Attribute anbieten. Diese sind ein Titel, und alle relevanten Attribute anbieten. Diese sind Titel,
eine Parentkategorie und eine Beschreibung. Parentkategorie und Beschreibung.
Das Parent-Attribut ist benötigt, da $n$ dieser Attribute einen Attributbaum bilden Das Parent-Attribut ist benötigt, da $n$ dieser Attribute einen Attributbaum bilden
\cite{bib:typo3-docs-sys-category}. \cite{bib:typo3-docs-sys-category}.
Somit ist es möglich, Unterkategorien zu erstellen. Beispiele hierfür sind die 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 Unterkategorien \enquote{Trockener Riesling} und \enquote{Halbtrockener Riesling} für die Überkategorie
\enquote{Riesling}. \enquote{Riesling}.
Rebsorten, Geschmack, Weineigenschaften und Qualität sollen eigene Datentypen Rebsorten, Geschmack, Weineigenschaften und Qualität sollen eigene Datentypen,
anstatt einfacher Zeichenfolgen sein. anstatt einfacher Zeichenfolgen sein.
Ziel dessen ist, dass sich Nutzer für einen vorgefertigten, nominalen Eintrag in einem Dropdown-Menü 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. entscheiden müssen und diese Auswahlmöglichkeiten im TYPO3-Backend pflegbar sind.
Weinlagen sind im Brown-Field-Projekt bereits vorhanden, also sollen hierfür existierende Daten Weinlagen sind im Brown-Field-Projekt bereits vorhanden, also sollen hierfür existierende Daten
eingebunden werden. wiederverwendet werden.
Je Wein sollen beliebig viele Weineigenschaften auswählbar sein. Wettbewerbskategorien, Je Wein sollen beliebig viele Weineigenschaften auswählbar sein. Wettbewerbskategorien,
Geschmacksrichtung, etc, sind jeweils nur ein Element. Geschmacksrichtung, etc, sind jeweils nur ein Element.
Weitere Notizen zu diesem Gespräch sind im Anhang unter \fullref{chap:anhang-notizen-digitization} Weitere Notizen zu diesem Gespräch sind im Anhang unter \fullref{chap:anhang-notizen-digitization}
@ -93,15 +93,11 @@ da zu diesem Zeitpunkt keine erweiterte Auswahllogik für Datenbankanfragen ben
Wichtig ist hierbei, dass eine Repository-Klasse existiert. Alle unverzichtbaren Wichtig ist hierbei, dass eine Repository-Klasse existiert. Alle unverzichtbaren
Schnittstellen werden über die Basisklasse \enquote{Repository} geerbt Schnittstellen werden über die Basisklasse \enquote{Repository} geerbt
\cite{bib:typo3-docs-extdev-tut-tea-repositories}. \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.
\subsection{Teilnehmerregistrierung} \subsection{Teilnehmerregistrierung}
Ein essenzieller Teil des Jahresauswahlprobenwerkzeuges ist die Registrierung von Teilnehmern. Ein essenzieller Teil des Jahresauswahlprobenwerkzeuges ist die Registrierung von Teilnehmern.
Dieses Modul repräsentiert den ersten Berührungspunkt der Winzer mit dem System. 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 Jahresauswahlproben sind.
Dem Pflichtenheft ist zu entnehmen, dass es zwei Kategorien von Teilnehmerregistrierungen gibt: Dem Pflichtenheft ist zu entnehmen, dass es zwei Kategorien von Teilnehmerregistrierungen gibt:
\begin{enumerate} \begin{enumerate}
\item Nutzer ist \ac{WM}-Mitglied \item Nutzer ist \ac{WM}-Mitglied
@ -109,29 +105,29 @@ Dem Pflichtenheft ist zu entnehmen, dass es zwei Kategorien von Teilnehmerregist
\end{enumerate} \end{enumerate}
Der primäre Unterschied zwischen Mitgliedern und Nicht-Mitgliedern ist, dass Mitglieder bereits einen Der primäre Unterschied zwischen Mitgliedern und Nicht-Mitgliedern ist, dass Mitglieder bereits einen
Stammdatensatz hinterlegt haben. Stammdatensatz hinterlegt haben.
Dieser Stammdatensatz bildet die Angaben zum Weingut des zu digitalisierendem Anmeldeformulares ab. Dieser Stammdatensatz bildet die Angaben zum Weingut des zu digitalisierenden Anmeldeformulares ab.
Nicht-Mitglieder sind dem System noch gänzlich unbekannt und müssen im Zuge der Registrierung ihres Nutzers Nicht-Mitglieder 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 ihre Stammdaten angeben, während sich Mitglieder lediglich einloggen müssen und eine Schaltfläche
\enquote{Teilnehmer werden} betätigen. \enquote{Teilnehmer werden} betätigen.
Der mit dem \ac{PO} ausgearbeitete UX-Flow der Registrierung sieht vor, dass der Nutzer zunächst gefragt wird, 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, 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. Nach erfolgreichem Login, wird ein Teilnehmerobjekt erstellt.
Wählt der Nutzer \enquote{Nein, ich bin kein Mitglied} aus, wird er auf ein Registrierungsformular Wählt der Nutzer \enquote{Nein, ich bin kein Mitglied}, wird er auf ein Registrierungsformular
weitergeleitet, um einen Nicht-Mitgliederaccount anzulegen. Im Zuge dieser Registrierung werden weitergeleitet, um einen Nicht-Mitgliederaccount anzulegen. Im Zuge dieser Registrierung werden
Stammdaten zum Weingut angefragt. Stammdaten zum Weingut angefragt.
Dieser Schritt übersetzt unter anderem den \enquote{Einreicher}-Teil des ursprünglichen Anmeldeformulares, Dieser Schritt übersetzt unter anderem den \enquote{Einreicher}-Teil des ursprünglichen Anmeldeformulares,
anbei in \fullref{chap:anhang-anmeldeformular}. anbei in \fullref{chap:anhang-anmeldeformular}.
\begin{nicepic} \begin{nicepic}
\includegraphics[width=0.9\textwidth]{images/ux-flow-registrierung.png} \includegraphics[width=0.6\textwidth]{images/ux-flow-registrierung.png}
\captionof{figure}{UX-Flow: Registrierung} \captionof{figure}{UX-Flow: Registrierung}
\caption*{Quelle: Eigene Darstellung} \caption*{Quelle: Eigene Darstellung}
\label{fig:uxflow-registrierung} \label{fig:uxflow-registrierung}
\end{nicepic} \end{nicepic}
Da das Brown-Field-Projekt bereits Accountlogins und -registrierungen implementiert und nutzt, Da das Brown-Field-Projekt bereits Accountlogins und -registrierungen implementiert und nutzt,
werden auf diese Lösungen zurückgegriffen, um einen einheitlichen Workflow beizubehalten. wird auf diese Lösungen zurückgegriffen, um einen einheitlichen Workflow beizubehalten.
Accountregistrierungen werden über den Accountregistrierungen werden über den
\enquote{femanager} \cite{bib:typo3-docs-femanager} realisiert, während Logins via TYPO3s nativem \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} so angedacht: Frontend-Nutzer-Login gelöst werden. Das ist explizit von \enquote{femanager} so angedacht:
@ -152,7 +148,7 @@ Diese Prozesse sehen wie folgt aus:
Ist ein Nutzer kein Mitglied, so muss er zunächst einen Account erstellen. 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. Anfangs wählt dieser Nutzer \enquote{Ich bin kein Mitglied} auf der Registrierungsseite aus.
Daraufhin navigiert der Browser zu einem Registrierungs-Formular. 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. 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. Wird dieser Link geöffnet, wird der Account freigeschalten und ein Login-Feld erscheint.
Nach erfolgreichem Login wird der Nutzer mit einem Nach erfolgreichem Login wird der Nutzer mit einem
@ -160,6 +156,7 @@ Stammdatenformular konfrontiert. Dabei handelt es sich um Angaben zum teilnehmen
Wird dieses Formular abgeschickt, ist die Teilnehmerregistrierung abgeschlossen. Wird dieses Formular abgeschickt, ist die Teilnehmerregistrierung abgeschlossen.
\subsubsection*{Mitglied, mit Konto} \subsubsection*{Mitglied, mit Konto}
\label{chap:umsetzung-mitglied-mit-konto}
Ist ein Nutzer ein \ac{WM}-Mitglied und hat bereits ein Mitgliedskonto, muss dieser auf der Registrierungsseite 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. \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 Hier kann sich das Mitglied anmelden. Tut es dies erfolgreich, erstellt der Controller einen neuen
@ -171,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. \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. 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. 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 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 eine Email mit einem Bestätigungslink. Wird dieser Bestätigungslink angeklickt,
freigegeben und es öffnet sich ein Login-Formular, beschrieben in \enpointy{Mitglied, mit Konto}. ö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} \subsubsection*{Umsetzung}
Zunächst wurde ein simples Weichen-Content-Element erstellt. Zunächst wurde ein simples Weichen-Content-Element erstellt.
@ -183,29 +183,29 @@ 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 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 von zwei Seiten weiterzuleiten. Anschließend wurden Registrierungen über Femanager-Plugin-Content-Elemente
realisiert. 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 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 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 gelöst. Im TYPO3-Loginformular können Weiterleitungen zu spezialisierten Seiten im Backend-UI festgelegt werden
\break\cite{bib:typo3-docs-felogin}. \break\cite{bib:typo3-docs-felogin}.
Für alle funktionalen Belange wird ein TYPO3-Plugin registriert. Dieses Plugin verfügt über einen Für alle funktionalen Belange wird ein TYPO3-Plugin registriert. Dieses Plugin verfügt über einen
ActionController, der Nutzeranfragen an PHP-Funktionen (\enquote{Actions}) ActionController, der Nutzeranfragen an PHP-Funktionen (\enquote{Actions})
bindet. bindet.
In diesen Actions werden Fehlerbehandlungen durchgeführt, Datenmodelle der Domäne erstellt und in der 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}. Datenbank persistiert sowie Daten für die Anzeige im Frontend aufbereitet \cite{bib:typo3-docs-extbase}.
Neue Datenobjekte werden in Repository-Objekten registriert Neue Datenobjekte werden in Repository-Objekten registriert
\break\cite{bib:typo3-docs-extdev-tut-tea-repositories}. Diese Repositories sind Aggregate des Controllers, \break\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 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}. der ActionController-Klasse über eine Methode übergeben \cite{bib:typo3-docs-di}.
Als problematisch erweisen sich hierbei bidirektionale Verbindungen zwischen Datenmodellen, wenn die Foreign Keys 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. über das SQL-Schlüsselwort \enquote{AUTO\_INCREMENT} in der Datenbank generiert werden.
Beispielsweise, muss ein MasterRecord, der Betriebsinformationen speichert, bidirektional an ein Teilnehmerobjekt 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. 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 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 \enquote{AUTO\_INCREMENT} auf der Datenbankebene erzeugt werden und garantiert einzigartig je Datenbanktabelle sind
\cite{bib:w3schools-auto-increment}. \cite{bib:w3schools-auto-increment}.
Es gilt also, dass ein MasterRecord $a$ die Teilnehmer\ac{UID} von einem Teilnehmer $b$ hält und dass 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. $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, 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}. 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 und erst danach ihre \acp{UID} gegenseitig Die Lösung hierfür ist, beide Elemente zu erstellen und zu persistieren und erst danach ihre \acp{UID} gegenseitig
@ -214,14 +214,14 @@ bekannt zu machen um sie anschließend erneut zu persistieren.
\subsection{Weinregistrierung} \subsection{Weinregistrierung}
Ein Basismerkmal des Jahresauswahlprobenwerkzeuges ist die Möglichkeit, Weine zu Jahresauswahlproben Ein Basismerkmal des Jahresauswahlprobenwerkzeuges ist die Möglichkeit, Weine zu Jahresauswahlproben
anzumelden. Dieser Schritt übersetzt unter anderem die verbleibenden Formfelder des 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 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} benötigt. Dieser Nutzer hat, wenn angemeldet,
Zugriff auf eine Auflistung aller zeitlich freigegebenen Jahresauswahlproben. Zugriff auf eine Auflistung aller zeitlich freigegebenen Jahresauswahlproben.
Soweit der Registrierungszeitraum dieser Jahresauswahlprobe den aktuellen Zeitpunkt miteinschließt, Soweit der Registrierungszeitraum dieser Jahresauswahlprobe den aktuellen Zeitpunkt miteinschließt,
wird eine \enquote{Jetzt Wein anmelden}-Schaltfläche angeboten. wird eine \enquote{Jetzt Wein anmelden}-Schaltfläche angeboten.
Dadurch, dass Anmeldeformulare elektronisch und automatisiert verarbeitet werden, sinkt der Aufwand, Dadurch, dass Anmeldeformulare elektronisch und automatisiert verarbeitet werden, sinkt der Aufwand,
der seitens \ac{WM} für Anmeldungen geleistet werden muss. Das ist so, da diese Formular nun nicht mehr von 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. Mitarbeitern bearbeitet werden müssen. Davon profitiert \ac{WM}, da diese Zeit nun für andere Aufgaben genutzt werden kann.
\begin{nicepic} \begin{nicepic}
@ -238,8 +238,8 @@ auf der betroffenen Webseite (in diesem Beispiel der Weinanmeldungsseite) durchg
Das Verstecken der zugehörigen Das Verstecken der zugehörigen
Schaltfläche im Frontend dient lediglich der User-Experience und stellt keine Sicherheitsvorkehrung dar. 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. 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 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, beliebiger Jahresauswahlproben herzuleiten. Insofern ist es von großer Wichtigkeit, sicherzustellen,
dass der Server solche Anfragen grundsätzlich selbst prüft und gegebenenfalls verneint. dass der Server solche Anfragen grundsätzlich selbst prüft und gegebenenfalls verneint.
\subsubsection*{Das Formular} \subsubsection*{Das Formular}
@ -251,7 +251,7 @@ Grundsätzlich entstehen hierbei drei Kategorien von Werten, die es im Formular
\paragraph*{Inputfelder} sind triviale Formfelder, die nicht durch andere Datensätze beschränkt werden. \paragraph*{Inputfelder} sind triviale Formfelder, die nicht durch andere Datensätze beschränkt werden.
Beispiele für Inputfelder sind: Weinbeschreibung, Jahrgang und Alkoholgehalt. 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 \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}. mit welcher Regular Expression der Formfeldinhalt abzugleichen ist \cite{bib:w3schools-input}.
Die Formfeldwerte können unverändert in der Datenbank persistiert werden. Die Formfeldwerte können unverändert in der Datenbank persistiert werden.
@ -263,40 +263,42 @@ Beispiele für SelectSingle-Formfelder sind: Weinlage, Qualitätsstufe, Rebsorte
\enquote{Select} akzeptiert eine Liste an Auswahlmöglichkeiten und erstellt selbstständig Option-HTML-Tags \enquote{Select} akzeptiert eine Liste an Auswahlmöglichkeiten und erstellt selbstständig Option-HTML-Tags
für diese. für diese.
Die Formfeldwerte von SelectSingle-Formfeldern sind die Die Formfeldwerte von SelectSingle-Formfeldern sind die
\acp{UID} des jeweils ausgewähltem Elementes \cite{bib:typo3-docs-fluid-form-viewhelpers}. \acp{UID} des jeweils ausgewählten 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, Aufgrund dessen, dass das Weinlagen-Dropdown-Menü über 170 Einträge führt, wird eine Suchmöglichkeit implementiert.
deren Anzeigewert nicht der Suche entspricht, das Stilattribut \enquote{display: none;} auferlegt. 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. Somit sind diese nicht mehr sichtbar.
\\ \\
\\ \\
Eine komplexe Ausnahme stellt das SelectSingle-Formfeld \enquote{Category} dar, da TYPO3-Kategorien Eine komplexe Ausnahme stellt das SelectSingle-Formfeld \enquote{Category} dar, da TYPO3-Kategorien
als Baumstrukturen abgebildet werden als Baumstrukturen abgebildet werden
\break\cite{bib:typo3-docs-sys-category}. \break\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 Um die Eltern-Kind-Beziehungen der
\break{}Baumstruktur erstichtlich 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 \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, 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. 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 In jeder Darstellung wird der Kategoriename, geprefixt mit
$n$ Leerzeichen, dargestellt, mit $n = Rekursionstiefe$. Somit entsteht ein Drop-Down-Menü, das $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 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. 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. Diese Herangehensweise erzeugt schlüssigen, lesbaren Programmcode und lässt sich unkompliziert umsetzen.
Das senkt Entwicklungskosten und erhöht den Profit des Endkunden, da hierdurch weniger Zeit aufgewandt wird. Das senkt Entwicklungskosten, wovon \ac{WM} profitiert.
Rekursiv aufgerufene For-Schleifen, die sich selbst erneut für alle Elemente aufrufen, 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. Daher wird im Folgenden die Zeitkomplexität dieser Rekursionsfunktion betrachtet.
Für diese Funktion kann kein Master-Theorem angewandt werden, Für diese Funktion kann kein Master-Theorem angewandt werden,
da es sich hierbei nicht um einen Divide-and-Conquer-Algorithmus handelt. 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, Das ist so, da das in der Rekursion weitergereichte Problem nicht kleiner wird,
sondern gleich groß bleibt. sondern gleich groß bleibt.
Das verletzt die Bedingung $b>1$ des Master-Theorems, definiert als $T(n) = a*T(\frac{n}{b})+f(n)$ 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}. \cite{bib:schwarzer-vorlesung-alg}.
Der Algorithmus besteht aus $m, m \in \mathbb{N}$ verschachtelten For-Schleifen Der Algorithmus besteht aus $m \in \mathbb{N}$ verschachtelten For-Schleifen
gleicher Länge. 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. 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.
@ -306,19 +308,18 @@ Somit ist die Zeitkomplexität $O(n^m)$. Normiert dargestellt beträgt die Zeitk
\caption*{Quelle: Eigene Darstellung} \caption*{Quelle: Eigene Darstellung}
\label{fig:timecomplexity-category} \label{fig:timecomplexity-category}
\end{nicepic} \end{nicepic}
\clearpage
Auf Optgroup-HTML-Tags wurde bewusst verzichtetet. Auf Optgroup-HTML-Tags wurde bewusst verzichtetet.
Grund dafür ist, dass Optgroup-Elemente an sich nicht im Dropdown auswählbar sind. 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}, Das stellt ein Problem dar, da beispielsweise die Kategorie \enquote{Riesling},
die die Unterkategorien \enquote{Trockener Riesling} und \enquote{Halbtrockener Riesling} beinhalten könnte, 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 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 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. benötigt, um zwischen einem Optgroup-Tag und einem Option-Tag abzuwägen.
\paragraph*{SelectMultiple} sind Formfelder, die dem Nutzer eine Auswahl aus $n$ verschiedenen Elementen aus einer anderen \paragraph*{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 keine, entscheiden. Datenbanktabelle geben. Der Nutzer kann sich für eine beliebige Auswahl dieser, eingeschlossen keinen, entscheiden.
Ein Beispiel für SelectMultiple-Formfelder sind Weineigenschaften. Ein Beispiel für SelectMultiple-Formfelder sind Weineigenschaften.
TYPO3-Fluid implementiert hierfür keinen ViewHelper TYPO3-Fluid implementiert hierfür keinen ViewHelper
\break\cite{bib:typo3-docs-fluid-form-viewhelpers}, \break\cite{bib:typo3-docs-fluid-form-viewhelpers},
@ -327,7 +328,7 @@ Für alle Elemente $a \in A$
wird ein Checkbox-Feld erstellt. Dieses Element trägt den Anzeigewert \enquote{<a.title>} und den wird ein Checkbox-Feld erstellt. Dieses Element trägt den Anzeigewert \enquote{<a.title>} und den
Wert \enquote{<formfeldname>-true}. Wert \enquote{<formfeldname>-true}.
Ist also eine dieser Checkboxen angehakt, hat sie den zuvor genannten Wert. Falls nicht, trägt sie keinen Wert. 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 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. eine Liste aller angehakten Checkbox-Ids dieses Formfeldes aus der Liste aller Formfeldparameter zu extrahieren.
Hierfür wird die eingebaute PHP-Funktion \enquote{array\_keys} verwendet. Diese Funktion gibt alle 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. Keys eines Arrays in Form eines numerisch indizierten Arrays zurück.
@ -356,15 +357,15 @@ Der QR-Code beinhaltet lediglich die Wein-\ac{UID} anstatt einer vollständigen
die benötigte URL, um einen Wein einzuscannen, bis auf die Wein-\ac{UID} immer identisch ist. die benötigte URL, um einen Wein einzuscannen, bis auf die Wein-\ac{UID} immer identisch ist.
Somit wird redundanz vermieden. 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. 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 Gewinn zu erhöhen, wird der QR-Code zu einem Base64-kodiertem Bild gerendert. Um effizient zu arbeiten, wird der QR-Code zu einem base64-kodiertem Bild gerendert.
Das ist der Standardrückgabewert des QR-Code-Generators 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 Quell-URL eines 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, 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 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. 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. 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 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}. base64-kodiertes Bild zurückgibt \cite{bib:chillerlan-php-qrcode}.
\subsubsection{PDF-Generierung} \subsubsection{PDF-Generierung}
Firmenintern ist es Standard, das Aussehen sowie die Inhalte der PDF-Dokumente, die mit \enquote{mpdf} erzeugt werden, Firmenintern ist es Standard, das Aussehen sowie die Inhalte der PDF-Dokumente, die mit \enquote{mpdf} erzeugt werden,
@ -372,14 +373,14 @@ mit HTML zu definieren,
das an \enquote{mpdf} gereicht wird. Um die Gestaltung und die Präsentation von Variablen in der HTML-Zeichenfolge technisch 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, 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, 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. 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, 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 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}. \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 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. 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} Abschließend wird dem \enquote{mpdf}-Objekt das zuvor generierte HTML übergeben, über die Methode \enquote{OutputBinaryData}
als Bytes zurückgegeben und in einer Variable gespeichert \cite{bib:mpdf-ref}. 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. 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. Diese Header sind Content-Type und Content-Length. Ü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 Abschließend werden als Response-Body die Bytes des generierten PDFs übertragen. Damit ist die Verbindung beendet und das
@ -388,13 +389,13 @@ PDF zum Nutzer übertragen.
\subsection{Jahresauswahlproben- und Wein-Detailansichten} \subsection{Jahresauswahlproben- und Wein-Detailansichten}
Weine und Jahresauswahlproben sollen unter bestimmten Gegebenheiten einsehbar sein. 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 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 berechtiger Weine 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. angezeigt. Diese Weine sind anklickbar, um auf eine Detailansicht der Weine zu gelangen.
Die Detailansichten für Jahresauswahlproben und Weine benötigen spezielle Autorisierung. Die Detailansichten für Jahresauswahlproben und Weine benötigen spezielle Autorisierung.
Diese sind: Jahresauswahlproben sind nur einsichtig, wenn sich das aktuelle Datum innerhalb des Diese sind: Jahresauswahlproben sind nur einsichtig, wenn sich das aktuelle Datum innerhalb des
Sichtbarkeitszeitraumes der Jahresauswahlprobe befindet. Sichtbarkeitszeitraumes der Jahresauswahlprobe befindet.
Detailansichten für Weine sind immer für den zugehörigen Teilnehmer einsichtig. 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. Nach Abschluss ihrer Jahresauswahlprobe sind alle ihr angehörigen Weine öffentlich einsichtig.
Das hat den Hintergrund, dass Jahresauswahlproben Blindverkostungen sind 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. 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. Die Ergebnisse der Jahresauswahlproben sind öffentlich, also sind es die Weine nach Abschluss einer Jahresauswahlprobe auch.
@ -407,6 +408,10 @@ zu anderen Ansichten generiert. Diese ViewHelper übergeben Parameter. Die hierf
Ansichten sind beispielsweise Wein-\acp{UID} und Jahresauswahlproben-\acp{UID}. Um Informationen über den angemeldeten Nutzer, 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 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}. 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 und bearbeitet werden.
\section{Digitalization} \section{Digitalization}
@ -417,7 +422,7 @@ implementierten Datenmodellen zu arbeiten. Im Folgenden werden die Umsetzungen d
erforderlichen Geschäftsprozesse beschrieben. erforderlichen Geschäftsprozesse beschrieben.
\subsection{Schnittstelle QR-Code-Scanner} \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 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. in der URL einzufügen.
Hierfür bietet das Jahresauswahlprobenwerkzeug eine Schnittstelle bzw. eine Seite an, die eine Wein-\ac{UID} als Hierfür bietet das Jahresauswahlprobenwerkzeug eine Schnittstelle bzw. eine Seite an, die eine Wein-\ac{UID} als
@ -428,9 +433,9 @@ 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. 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. Wird ein Wein als \enquote{eingegangen} markiert, wird der betroffene Teilnehmer per Email informiert.
Hierzu wird die FluidEmail-Klasse des TYPO3-Cores herangezogen. 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. 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 über den Wein angezeigt, damit sich Mitarbeiter sicher sein können,
den richtigen Wein eingescanned zu haben. den richtigen Wein eingescanned zu haben.
\subsection{CSV-Export} \subsection{CSV-Export}
@ -464,7 +469,7 @@ um das fertig erzeugte CSV-Dokument als Zeichenkette in PHP zu erhalten. Das spa
Im Fluid-Template des Backendmoduls wird das generierte CSV-Dokument in einem nicht beschreibbaren Textarea-Feld präsentiert. Im Fluid-Template des Backendmoduls wird das generierte CSV-Dokument in einem nicht beschreibbaren Textarea-Feld präsentiert.
Um \ac{WM} weitere Arbeitszeit zu ersparen wird eine Download-Funktion für CSV-Dateien 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 angeboten. Das erspart das manuelle Kopieren und Abspeichern von CSV-Zeichenketten durch IT-Fachfremde, reduziert damit die Anzahl
an benötigten Übergangsschritte in weitere Prozesse und reduziert somit die Komplexität der Umstellung. an benötigten Übergangsschritten in weitere Prozesse und reduziert somit die Komplexität der Umstellung.
Auch im Interesse, Arbeitszeit in der Umsetzung zu sparen, Auch im Interesse, Arbeitszeit in der Umsetzung zu sparen,
wurde diese Downloadfunktion JavaScript-seitig umgesetzt. wurde diese Downloadfunktion JavaScript-seitig umgesetzt.
Dadurch ist der Download in derselben Action, die CSV für das Textarea-Feld generiert, implementiert. Dadurch ist der Download in derselben Action, die CSV für das Textarea-Feld generiert, implementiert.

View File

@ -1,6 +1,6 @@
\chapter{Stand der Forschung} \chapter{Stand der Forschung}
\label{chap: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 und zur digitalen Transformation.
\section{Modell nach Parviainen et al.} \section{Modell nach Parviainen et al.}
\quotecite{The importance of digitalization is becoming understood, \quotecite{The importance of digitalization is becoming understood,
@ -19,10 +19,11 @@ wichtig. Ebenfalls ist wichtig, wie weit diese Trends bereits im Fachgebiet vera
\ac{SWOT} -Analysen. Diese Analysen sind die Grundlage, um ein Unternehmen in der Digitalisierung aufzustellen. \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. 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.
\\ \\
\\ \\
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. 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, das Szenario nicht umzusetzen oder doch umzusetzen. 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. 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.
@ -47,14 +48,14 @@ der Ist-Zustand im Kontext des Soll-Zustandes anhand definierter Fragen bewertet
nach Art der Ziele. Der gesamte Fragenkatalog kann im Detail der Ausarbeitung von Parviainen et al. entnommen werden. nach Art der Ziele. Der gesamte Fragenkatalog kann im Detail der Ausarbeitung von Parviainen et al. entnommen werden.
\paragraph*{Im dritten Schritt} werden konkrete Schritte festgelegt, die für den Übergang vom \paragraph*{Im dritten Schritt} werden konkrete Schritte festgelegt, 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 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 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 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 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 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. Kosten-Nutzen-Analysen, Analysen der Umsetzbarkeit, des Wartungsaufwands und der Mitarbeiterschulung.
\paragraph*{Der vierte Schritt} befasst sich mit der Umsetzung der in Schritt 3 geplanten Maßnahmen und \paragraph*{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, 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 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 oder Schwierigkeiten bei der Einführung neuer Technologien haben. Wenn diese Analyse zeigt, dass die Ziele der Digitalisierung
@ -68,17 +69,18 @@ Diese drei Phasen sind \textit{Digitization}, \textit{Digitalization} und \texti
Die Phase \textit{Digitization} befasst sich mit der Umwandlung analoger Datenstrukturen und Modellen in digitale Datenmodelle, 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\break weiterverarbeitet werden können sodass diese digital, in Form von Nullen und Einsen, gespeichert und elektronisch\break weiterverarbeitet werden können
\cite{bib:dougherty}\break\cite{bib:loebbecke}. \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{bib:verhoef}.
\textit{Digitalization} beschreibt den Prozess der Veränderung bestehender Geschäftsprozesse, um mit digitalen Werkzeugen \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 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}. Ergründungen neuer Geschäftsmodelle mit sich bringen könnte \cite{bib:pagani}.
\section{Abwägung in Bezug auf die Problemstellung} \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 In Bezug auf die hier betrachteten Methodiken ist es wichtig zu erwähnen, dass der betrachtete Kontext
lediglich die Digitalisierungs \textbf{eines} Geschäftsprozesses behandelt. lediglich die Digitalisierungs \textbf{eines} Geschäftsprozesses behandelt.
Diese Ausarbeitung befasst sich nicht Diese Ausarbeitung befasst sich nicht
mit firmenweiten Veränderungen, wie sie von den nahegelegten Modellen abgedeckt ist. mit firmenweiten Veränderungen, wie sie von den nahegelegten Modellen abgedeckt ist.
Daher sind geringfügige Anpassungen der Methoden unabdinglich. Daher sind geringfügige Anpassungen der Methodiken unabdinglich.
Des Weiteren ist Resourcenintensivität ein relevanter Gesichtspunkt dieser Abwägung, da eine solche Digitalisierung Des Weiteren ist Resourcenintensivität ein relevanter Gesichtspunkt dieser Abwägung, da eine solche Digitalisierung
effizient und profitabel sein soll. effizient und profitabel sein soll.
@ -96,13 +98,13 @@ Digitalisierung bestimmter
Geschäftsprozesse befassen. Phase drei befasst sich mit firmenweiten Veränderungen, Geschäftsprozesse befassen. Phase drei befasst sich mit firmenweiten Veränderungen,
die über Geschäftsprozesse hinausgehen \cite{bib:verhoef}. die über Geschäftsprozesse hinausgehen \cite{bib:verhoef}.
Firmenweite Veränderungen befinden sich außerhalb des Rahmens dieser Ausarbeitung. 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 als effizienter.
\subsection{Fazit} \subsection{Fazit}
Aufgrund des kleinen Projektumfanges und der großen Wahrscheinlichkeit, dass sich Anforderungen ändern werden, Aufgrund des kleinen Projektumfanges und der großen Wahrscheinlichkeit, dass sich Anforderungen ändern werden,
fällt die Entscheidung auf das fällt die Entscheidung auf das
minimalistischere Modell nach Verhoef et al.. Grundlage dieser Entscheidung sind Forschungsarbeiten von M. Ayman Al Ahmar, minimalistischere Modell nach Verhoef et al.. Grundlage dieser Entscheidung sind Forschungsarbeiten von M. Ayman Al Ahmar,
die nahelegen, dass Projekte dieser Art idealerweise nach dem \enquote{extreme programming}-Paradigma behandelt werden die nahelegen, dass Projekte dieser Art idealerweise nach \enquote{extreme programming}-Paradigmen behandelt werden
\cite{bib:ayman-al-ahmar}. \cite{bib:ayman-al-ahmar}.
Nachdem Phase drei des Verhoef-Modells ausgeklammert wurde, sieht das zu verfolgende Modell aus wie folgt: Nachdem Phase drei des Verhoef-Modells ausgeklammert wurde, sieht das zu verfolgende Modell aus wie folgt:

View File

@ -6,11 +6,11 @@ Bibliotheken zur Erzeugung von QR-Codes und Bibliotheken zur Erzeugung von PDF-D
\section{Die bestehende Webseite} \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. 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. Webpack ist ein Modulbundler \cite{bib:smashmagazine-webpack} und Sass ein CSS-Präprozessor
\break\cite{bib:w3schools-sass}. \break\cite{bib:w3schools-sass}.
TYPO3 ist ein Redaktionssystem und PHP-Rahmen\-werk, das Daten- und Inhaltspflege in einem geschützten Bereich TYPO3 ist ein Redaktionssystem und PHP-Rahmen\-werk, das Daten- und Inhaltspflege in einem geschützten Bereich
ermöglicht. ermöglicht.
Außerdem werden Frontend-, Backend-Nutzer und Berechtigungen gesteuert \cite{bib:typo3-docs-getting-started}. Außerdem steuert TYPO3 Frontend-, Backend-Nutzer und deren Berechtigungen \cite{bib:typo3-docs-getting-started}.
Über die Systemerweiterung Über die Systemerweiterung
\enquote{Extbase} wird eine mächtige Entwicklerschnittstelle bereitstellt, \enquote{Extbase} wird eine mächtige Entwicklerschnittstelle bereitstellt,
um hochindividualisierte Funktionalitäten zu ermöglichen. um hochindividualisierte Funktionalitäten zu ermöglichen.
@ -23,102 +23,103 @@ auf bereits vom System verwendete Programmiersprachen begrenzt.
\subsection{Javascript-Implementationen} \subsection{Javascript-Implementationen}
\subsubsection*{Jquery-qrcode} \subsubsection*{Jquery-qrcode}
\textit{Jquery-qrcode} ist ein Plugin für JQuery um dynamisch QR-Codes auf Browserseite zu generieren. \enquote{Jquery-qrcode} 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 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 \cite{bib:larsjung-jquery-qrcode}. Somit scheidet \enquote{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 gepflegt wird. \enquote{Jquery-qrcode} wurde bis Januar 2023 853 mal von Nutzern mit einem Stern
markiert \cite{bib:larsjung-jquery-qrcode}. markiert \cite{bib:larsjung-jquery-qrcode}.
Wenn ein Nutzer ein Github-Repository mit einem Stern markiert, zeigt sich der Nutzer interessiert genug, 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} ist MIT-lizensiert
\cite{bib:larsjung-jquery-qrcode}. \cite{bib:larsjung-jquery-qrcode}.
\subsubsection*{Kjua} \subsubsection*{Kjua}
\textit{Kjua} ist eine Javascript-Bibliothek, um dynamisch QR-Codes auf der Browserebene zu generieren. \enquote{Kjua} ist eine Javascript-Bibliothek, die dynamisch QR-Codes auf Browserebene generiert.
Im Gegensatz zu \textit{jquery-qrcode} funktioniert Kjua auch ohne JQuery. Es werden diverse Stilattribute für gestaltete Im Gegensatz zu \enquote{jquery-qrcode} funktioniert \textit{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 QR-Codes unterstützt \cite{bib:larsjung-kjua}. \enquote{Kjua} kann QR-Codes über HTML-Canvas, Bilder und Vektorgrafiken umsetzen.
nicht explizit erwähnt. Nach dem aktuellen Stand (Januar 2023) wurde Kjua von 243 Nutzern mit einem Stern markiert. Das ist bei näherer Betrachtung der Kjua Tech Demo \enpointy{https://larsjung.de/kjua/latest/demo} ersichtlich, jedoch
Kjuas letzte Codeänderung liegt circa zwei Jahre zurück. Es gibt eine unbeantwortete, sieben Jahre alte Pull-Request und nicht explizit erwähnt. Nach dem aktuellen Stand (Januar 2023) wurde \enquote{kjua} von 243 Nutzern mit einem Stern markiert.
Issues scheinen ignoriert zu werden. Kjua ist MIT-lizensiert \cite{bib:larsjung-kjua}. \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} \subsubsection*{Soldair/node-qrcode}
\textit{Soldair/node-qrcode} ist eine node.js-basierte Implementation eines QR-Code-Generators und bietet somit Funktionialität \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 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 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 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 vor etwa zwei Jahren, Februar 2021, durch und schlug fehl. Einige Pull-Requests und Issues werden seit Jahren ignoriert
\cite{bib:soldair-node-qrcode}. \cite{bib:soldair-node-qrcode}.
Die Bibliothek wurde 74 millionen mal heruntergeladen und mit 6308 Sternen markiert. Die Bibliothek wurde 74 Millionen mal heruntergeladen und mit 6.308 Sternen markiert.
Soldair/node-qrcode ist MIT-lizensiert \cite{bib:npmjs-soldair-node-qrcode}. \enquote{Soldair/node-qrcode} ist MIT-lizensiert \cite{bib:npmjs-soldair-node-qrcode}.
\subsection{PHP-Implementationen} \subsection{PHP-Implementationen}
\subsubsection*{Chillerlan/php-qrcode} \subsubsection*{Chillerlan/php-qrcode}
Eine arrivierte Lösung für QR-Code-Generierung in PHP ist \textit{chillerlan/php-qrcode}, umgesetzt durch Eine arrivierte Lösung für QR-Code-Generierung in PHP ist \enquote{chillerlan/php-qrcode}, umgesetzt durch
Eugen Rochko et al.. \textit{Chillerlan/php-qrcode}s Etabliertheit zeigt sich durch den zu diesem Eugen Rochko et al.. \enquote{Chillerlan/php-qrcode}s Etabliertheit zeigt sich durch den zu diesem
Zeitpunkt (Jahnuar 2023) auf 5 Millionen stehenden Downloadzähler, Zeitpunkt (Januar 2023) auf 5 Millionen stehenden Downloadzähler,
mehreren Entwickler und den letzten Commit, der zu diesem Zeitpunk nicht älter als einen Monat ist. 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, 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 die 90\% der Zeilen der Codebase abdecken. Rochko übernahm Teile der Codebase aus
dem Java-Projekt \enquote{ZXing} und übersetzte diese zu PHP. dem Java-Projekt \enquote{ZXing} und übersetzte diese zu PHP.
Es gibt zu diesem Zeitpunkt keine unbeantworteten Issues oder Pull-Requests. 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}. \enquote{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. Einzig auffällig sind die Commitnachrichten, die zuteils nur aus einem Emoji bestehen.
\textit{Chillerlan/php-qrcode} wurde von 1212 Github-Nutzern mit einem Stern markiert. \enquote{Chillerlan/php-qrcode} wurde von 1.212 Github-Nutzern mit einem Stern markiert.
Die Bibliothek ist MIT-\break{}lizensiert Die Bibliothek ist MIT-\break{}lizensiert
\cite{bib:chillerlan-php-qrcode}. \cite{bib:chillerlan-php-qrcode}.
\subsubsection*{Kreativekorp/barcode} \subsubsection*{Kreativekorp/barcode}
\textit{kreativekorp/barcode} ist eine PHP-Bibliothek zur Generierung von QR-Codes, bereitgestellt von \enquote{kreativekorp/barcode} ist eine PHP-Bibliothek zur Generierung von QR-Codes, bereitgestellt von
\textit{Kreative Software}, R.G. Bettencourt. \enquote{Kreative Software}, R.G. Bettencourt.
Diese Implementation umfasst etablierte Barcode-Formaten und unterstützt eine Vielzahl an Anpassungsmöglichkeiten. Diese Implementation umfasst etablierte Barcode-Formate 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}. 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 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. 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. 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. Issues und Pull-Requests werden weitestgehend ignoriert.
Die Bibliothek verwendet die MIT-Lizenz Die Bibliothek verwendet die MIT-Lizenz.
\cite{bib:kreativkorp-barcode}. \\\cite{bib:kreativkorp-barcode}.
\subsubsection*{Bacon/BaconQrCode} \subsubsection*{Bacon/BaconQrCode}
\textit{Bacon/BaconQrCode} ist eine PHP-Bibliothek zur Generierung von QR-Codes, bereitgestellt von Ben Scholzen, hinter \enquote{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, 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} die zu einer Nginx-\enquote{Hello World}-Seite führt. Begleitet wird \enquote{BaconQrCode} von etlichen weiteren \enquote{Bacon-Projekten}
wie Beispielsweise \textit{BaconPdf}, \textit{BaconStringUtils} und \textit{BaconUser} um nur einige zu nennen. wie Beispielsweise \enquote{BaconPdf}, \textit{BaconStringUtils} und \textit{BaconUser} um nur einige zu nennen.
Insgesamt machen die stichprobenartig betrachteten Projekte einen desolaten Eindruck mit zuteils aktuellesten Commits 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 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. BaconQrCode fällt mit siebzehn Entwicklern auf, die jeweils zumindest 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 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 nahezu 80.000 Projekte, die BaconQrCode verwenden \cite{bib:bacon-baconqrcode} und Packagist meldet 50 Millionen Downloads
\cite{bib:packagist-baconqrcode}. \cite{bib:packagist-baconqrcode}.
Wie \textit{chillerlan/php-qrcode} baut auch Scholzen auf existierende Technik von \enquote{ZXing} auf. Wie \enquote{chillerlan/php-qrcode} baut auch Scholzen auf existierende Technik von \enquote{ZXing} auf.
Eine Dokumentation neben der Readme-Datei existiert nicht und 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. 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. 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}. \cite{bib:bacon-baconqrcode}.
\subsection{Subjektiver Vergleich im Bezug auf die Problemstellung} \subsection{Subjektiver Vergleich im Bezug auf die Problemstellung}
Im Folgenden werden subjektive Einschätzungen und Meinungen des Autors über die Eignung der beleuchteten Im Folgenden werden subjektive Einschätzungen und Meinungen des Autors über die Eignung der beleuchteten
Bibliotheken vorgestellt. Bibliotheken vorgestellt.
Um eine Bibliothek als \enquote{am geeignetsten} für einen Anwendungsfall zu kurieren, Um eine Bibliothek als \enquote{am geeignetsten} für einen Anwendungsfall unter den betrachtenen Bibliotheken zu kurieren,
müssen die konkreten Anforderungen und Constraints für diesen Anwendungsfall beachtet werden. müssen die konkreten Anforderungen für diesen Anwendungsfall beachtet werden.
Das ist so, da verschiedene Eigenschaften der Bibliotheken verschiedene Auswirkung in Gewichtung und Richtung Das ist so, da verschiedene Eigenschaften der Bibliotheken verschiedene Auswirkung in Gewichtung und Richtung
je nach Anwendungsfall aufweisen. je nach Anwendungsfall aufweisen.
Hierfür werden die zuvor vorgestellten Bibliotheken zur Erstellung von QR-Codes in den folgenden Attributen gegenübergestellt: Hierfür werden die zuvor vorgestellten Bibliotheken zur Erstellung von QR-Codes in den folgenden Attributen gegenübergestellt:
\begin{description} \begin{description}
\item [Funktionialität] \hfill \\ \item [Funktionialität] \hfill \\
Der Umfang, der für diese Problemstellung relevanten Funktionen in Annahme dessen, dass die Bibliothek Der Umfang, der unterstützten Funktionen, in Annahme dessen, dass die Bibliothek
syntaktisch und pragmatisch korrekt \cite{bib:heinemann-vorlesung-re} ist. syntaktisch und pragmatisch korrekt \cite{bib:heinemann-vorlesung-re} ist.
\item [Gepflegtheit] \hfill \\ \item [Gepflegtheit] \hfill \\
Das Ausmaß, in dem das Projekt aktiv gepflegt wird und ordnungsgemäß entwickelt zu sein scheint. 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, 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 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. Downloads bzw. Installationen, falls verfügbar.
\item [Workflow-Eignung] \hfill \\ \item [Workflow-Eignung] \hfill \\
Die Eignung einer Bibliothek in existierende Workflows und Constraints übernommen zu werden. Maßgeblich, Die Eignung einer Bibliothek in existierende Workflows und Constraints übernommen zu werden. Maßgeblich ist,
ob und mit wie viel Aufwand eine Bibliothek in das Projekt übernommen werden kann. ob und mit wie viel Aufwand eine Bibliothek in das Projekt übernommen werden kann.
Beispielsweise ist es deutlich aufwänder eine JavaScript-Bibliothek in einem PHP-Projekt zu verwenden, als eine native PHP-Bibliothek. Beispielsweise ist es deutlich aufwänder 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. Ebenfalls ist relevant, ob die Lizenz einer Bibliothek eine Verwendung gestattet, bzw. welche Bedingungen gelten.
@ -127,17 +128,17 @@ Hierfür werden die zuvor vorgestellten Bibliotheken zur Erstellung von QR-Codes
Hierbei werden den verschiedenen Bibliotheken Punkte ($[0,10]$) in den drei zuvor genannten 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 Kategorien vergeben. Nicht ermittelte Werte werden in ihrer Kategorie durch \enquote{$-$} repräsentiert, wodurch
eine weitere Verwendung ausgeschlossen wird. 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. Empfinden des Autors.
\subsubsection*{Kjua} \subsubsection*{Kjua}
Kjua ist funktional für dieses Projekt gut aufgestellt, da es optisch ansprechende QR-Codes mit Logo unterstützt. Das wird \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. 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. 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. 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. Die Exklusivität für Nutzung in Webbrowsern schließt eine Einbindung in den Workflow aus.
\begin{table}[htbp] \begin{table}[htbp]
\centering \centering
@ -153,13 +154,13 @@ Die Exklusivität für Nutzung in Webbrowsern schließt eine Einbindung in den W
\subsubsection*{Soldair/node-qrcode} \subsubsection*{Soldair/node-qrcode}
Soldairs Lösung sieht dokumentativ und funktional vielversprechend aus. 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 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 kann \break\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 \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 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. ü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. drei Punkte gibt.
\begin{table}[htbp] \begin{table}[htbp]
\centering \centering
@ -177,14 +178,14 @@ drei Punkte gibt.
Rochkos Lösung macht einen aktiv gepflegten Eindruck und wird von großen Downloadzahlen gestützt. 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. Rochko stellt eine ausführliche Dokumentation und Codebeispiele bereit.
Hierfür wird die volle Punktzahl in \enquote{Gepflegtheit} vergeben. 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}, \cite{bib:chillerlan-php-qrcode-demo},
die somit 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}. Bewertet wird das mit einer vollen Punktzahl in \enquote{Funktionalität}.
\break 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}. 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 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 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 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. \cite{bib:chillerlan-php-settings-container}. Das wird mit der Maximalwertung in \enquote{Workflow-Eignung} berechnet.
\begin{table}[htbp] \begin{table}[htbp]
@ -200,13 +201,13 @@ bereitgestellt \cite{bib:chillerlan-php-qrcode-composerjson} und weist eine ähn
\end{table} \end{table}
\subsubsection*{Kreativekorp/barcode} \subsubsection*{Kreativekorp/barcode}
Kreativekorp beeindruckt durch Nutzungsbeispiele und Dokumentation in der Readme-Datei, 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. sowie einer Vielzahl unterstützter Barcode-Formate, darunter auch QR-Codes und einiger improvisierter Tests.
In Anbetracht dessen, dass die Bibliothek 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. 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 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 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, 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. da eine Verwendung selbst mit guter Funktionalität nicht infrage käme.
\begin{table}[htbp] \begin{table}[htbp]
@ -222,16 +223,16 @@ da eine Verwendung selbst mit guter Funktionalität nicht infrage käme.
\end{table} \end{table}
\subsubsection*{Bacon/BaconQrCode} \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, 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 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 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 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. 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 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, 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 muss \cite{bib:opensource-license-bsd-2}. 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. Dadurch werden drei Punkte einer vollkommenen Workflow-Eignung abgezogen, wodurch sieben Punkte vergeben werden.
\begin{table}[htbp] \begin{table}[htbp]
\centering \centering
@ -247,8 +248,8 @@ Dadurch werden drei Punkte einer vollkommenen Workflow-Eignung abgezogen, wodurc
\subsection{Fazit} \subsection{Fazit}
Nach Evaluation der verschiedenen QR-Code-Bibliotheken im Kontext der vorliegenden Problemstellung erweist sich aus Sicht des Autors Nach Evaluation der verschiedenen QR-Code-Bibliotheken im Kontext der vorliegenden Problemstellung erweist sich aus Sicht des Autors
\break\textit{chillerlan/php-qrcode} mit 30 Gesamtpunkten als die am besten geeignetste Bibliothek. \break\enquote{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. Somit wird \enquote{chillerlan/php-qrcode} als QR-Code Technologie in der Lösung dieser Problemstellung verwendet.
\begin{table}[htbp] \begin{table}[htbp]
\centering \centering
@ -269,12 +270,12 @@ Somit wird \textit{chillerlan/php-qrcode} als QR-Code Technologie in der Lösung
\end{table} \end{table}
\section{PDF-Generator} \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} \cite{bib:mpdf} etabliert und wird bereits
in zahlreichen Projekten verwendet. in zahlreichen Projekten verwendet.
Um die projektübergreifende Kontinuität der Technik zu wahren und um somit die Um die projektübergreifende Kontinuität der Technik zu wahren und um somit die
Wartbarkeit und Nachhaltigkeit des hier behandelten Softwareproduktes Wartbarkeit und Nachhaltigkeit des hier behandelten Softwareproduktes
zu fördern, wird sich für den PDF-Generator entschieden, der bereits firmeninterner Standard ist. 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 Sponsoren, 72 Entwicklern, über 31 Millionen Downloads, über 3.900 Sterne-Markierungen, über 800 Commits
und regelmäßigen Updates \cite{bib:mpdf-github}. Dadurch, dass \textit{mpdf} ein Composer-Paket für verschiede PHP-Versionen ist, und regelmäßigen Updates \cite{bib:mpdf-github}. \enquote{Mpdf} ein Composer-Paket und für verschiede PHP-Versionen verfügbar.
ist eine herausragende Workflow-Eignung gegeben \cite{bib:mpdf}. Mpdf verwendet eine GPL-2.0 Lizenz \cite{bib:mpdf}.

View File

@ -10,7 +10,7 @@
\newcommand{\cfgDocClassification}{Abschlussarbeit} \newcommand{\cfgDocClassification}{Abschlussarbeit}
% Document version % Document version
\newcommand{\cfgDocVersion}{2.2} \newcommand{\cfgDocVersion}{2.3}
% Last modification date % Last modification date
\newcommand{\cfgDateLastModification}{30. März 2023} \newcommand{\cfgDateLastModification}{30. März 2023}
@ -41,7 +41,7 @@
\newcommand{\cfgUniversityDepartment}{Fachbereich Informatik} \newcommand{\cfgUniversityDepartment}{Fachbereich Informatik}
% University degree course % University degree course
\newcommand{\cfgUniversityDegreeCourse}{Angewandte Informatik - dual (B.Sc)} \newcommand{\cfgUniversityDegreeCourse}{Angewandte Informatik - dual (B.Sc.)}
% University supervisor name % University supervisor name
\newcommand{\cfgUniversitySupervisorName}{Volker Schwarzer} \newcommand{\cfgUniversitySupervisorName}{Volker Schwarzer}

View File

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

View File

@ -416,6 +416,14 @@
note = {Zugriff: Februar 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#concepts}",
title = {{Getting started}},
year = {2023},
note = {Zugriff: Februar 2023}
}
@misc{bib:typo3-docs-file-structure, @misc{bib:typo3-docs-file-structure,
author = {{TYPO3 Contributors}}, author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/FileStructure/Index.html}", howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/FileStructure/Index.html}",

View File

@ -1 +1 @@
<mxfile host="Electron" modified="2023-03-27T14:42:12.401Z" 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="AXlo0JrZP7bO5dHndmgy" 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">7VtZd9o4FP41PJLjBWx4DCFJs5BmbZJ5E7awVYRFbBECv34kLONFYo1NmTnlnKZIvlp8l+8uEjXzbPR1GYKx3yMuxDVDc79qZrdmGLpu2uw/3jOLe+xWM+7wQuQKorTjCc2h6NRE7wS5MMoRUkIwReN8p0OCADo01wfCkEzzZAOC86uOgQeljicHYLn3FbnUj3tbhp32/4DI85OVdasdPxmBhFi8SeQDl0wzXeZ5zTwLCaHxt9HXGcSceQlfXq9mr/h2aF1eP0Qf4KVz83z3qx5PdrHLkOUrhDCge0993rv+ef3744f3Mm4O7fv69A7N68mr0VnCL+gy9okmCalPPBIAfJ72dkIyCVzIZ9VYK6W5JWTMOnXW+RtSOhO6ACaUsC6fjrB4CgP3lEuWNfuYOMO46wJhLOaMN8V3UpDhBgYIuohMQgeuoTOFHoLQg2K+CYj6w27kDBoP2vtc15ybLyueT3DzEpIRpOGMjQshBhR95jcHhJ56S7pUFuyLEMcOUheb/AR4Ila6m9A5DLlq1s7MWsdyfAprhoXZK3T6rN/y+LcIOT43lAXNGSe/Bn4IIzCJpsDH45D0YSAPC6GHIhoiGPKnBaVIRc7lN/URhU9jsODxlMFGXrwDElAhe52xr+NhEEVCsmwFMlwaIqdeWhV/PGA6cEYwCRfLmnDxWQ7LPDEts226S1XZVjM+YUjhV0ZusnCTp6YwDQF7uiFgb5qCiN4WNH4GQGytIn1gvCwqxFVEF+qYSI7+FRzzO3nB2Ql8ZwVnVyQ4NYo0ZUuGSDay40HefYB2NYBKSL5SdnXtRGefvOEJsWwNumL2e4ICmiEhg0EEad5DJjRiedPOq05DK6hE7DDEqHQixlIwy5CNOUGk2MuKdUyBLbvuK1XKeAepii5Zu5XW/vN0/uv6oXergcf+xLmJuoPrl8T9HFo/2abf+PiTZtJ8F9MtGt2vXGuWtL4QzQxjrfdkRvY9HcQbs0pVPRtTKPlqbGkS++q70Bkj8VeJjrW1Ey3z0b+p2TlELEHdGhJGXgOlBt6CPstQcloDMPIC9t1hkmTxkdnh3gKxFOBUPBgh140VFEZoDvqL+bgOiPdhkzc7tWZXqRXrrENyS8s8RixSy6YKqyDPbrarwrg9xLNOuzPikSPIOBp5Za4Ng8Ct90gEcV0m6yHqYcRR4kIOV3wy6k+izaFKZdFDMw+1RksRPTQV0UO7qujBPOYUrTT0bB8GFXV7RXBYsocvrmO1C7n5bvTf9vDreJ6x6WeIcAD9EQzTnGISeFww4YBgj++Y+AHk9gCZfYb8WxdQGDCj9xgwywa9S/5RlVG3CszVFDZtKmzaKsGme5HxAS9b78/z2Qt7EX3+/tg66qpLeQFR4zA2XYyOm3q7EptetU6lNqrLcVFqpMBxmFLwLY4Q/3s+AojPyBSF/b1nyfuUhIv4IMDQ+25ZpyrrNLUVWVfWPBsVmaeyKPqnU5+GZeSSnxMerm9IgHjrHoaIcYCHwKLzcHVWpfYaVk1Kila7ou8iw85OulEwaHuDk15PXw0AJCzMAMAt8RTVo0NV+qqCAV0vcFdRt1OV7RoloIAyxUug98i8dFrqMDU7U+zQTtrtpPihLnjwRhEi9jd4ZWCzbb2vWsM27XwJ0bbWG7ZRzAqsNYa99ehN8cceCKHk+R/yVpvUNHVnpmZm3Vmd+TPd3sefleydzIbsnQ6o1ZsDzFY1yam0zga/t4G+Gr9nyoFvEt72YUT54eZpg6LjjWqNze5seVRVtj9TcrQh1/CemEYxQV+cB+54EgxLPD7U/qvHh2Y7Lzflua9KbsVKUnlyky8CnA4pIiWGgDtK62C8b25pM9XxXkahDnRR4C2qYvsWr/Oqz+RwAUYI85f+AfEn5EcXCgFJpxwKKbEl2eZYy0pbzwuXXm8cUnD2lkZjliC4G/z0Bj6N++CncWpr77027uOkwqY4r3DRZ3ISsTybyMnR+piQRS9wht7CpOpODECnfNUAUQRwPFpQJvO9vNUvMBOsodXZv8dcCZUPjldj79Mv7oD1KfZV4VbzpzS8dsTaCA4Wm42mMBzO4cRbt+X0QGfVS6xEJ20LdMo4hIAEsi8QnVVpdPEWiQKJlvWng9SkdImfxxDlKwPj/UJ0ZQ6+4uz0u6dAVkG4FVWMjeZugbZRVLpd6bX19NJ7H+IeiYzEj4WzpeWB8P+tpGVskQO0KkoBlLKwjxhESsMMQwlK5V+wKRp3VSBSuMjTaG0AhcK+dqUv+1hLKaOWBAorb0Qex30fe4Xt73Pfx2gmKd13VTA/oJTbP+pSuCHJa8XtrL9YsoUgv3tQ1TB3qU9Lx1Zb3nkpS3lk3ekwq6RzmnH9Uf1UnGUf5aWwQty0THc3XSApFnBLu0CiLOWNRi6/ihMBOpeTNB9xrDzmawAFNVXe0lHVEMpIubp3P+t4+Pg26DWumq3hlda/e1BErrecfS5cpNcFHrK3pIUqjypfVeS123szlWTykFqsGVUmrGLBR2tJwlLdkkx+CrGDrFgz/YldjEnpDxXN838B</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 52 KiB

BIN
main.pdf

Binary file not shown.