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}\\
\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\\
\hdashline
Constraint & Mitarbeiter-UI in TYPO3-Backend\\
\hdashline
Constraint & Nutzer-UI im Frontend\\
\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).}\\
\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
\end{tabular}
\caption{Initial bekannte Anforderungen}
@ -43,12 +44,12 @@ Um nähere Anforderungen zu ermitteln, werden die Befragungstechniken \enquote{I
\section{Interview mit Product Owner}
Zunächst wird ein Interview mit dem \ac{PO} geführt. Ziel dieses Interviews ist
es, konkrete Fragen zu Anforderungen zu klären und somit konkrete Anforderungen zu formulieren.
Aufgrund der individuellen Gesprächsführung wurde sich für ein \enquote{Teil-standardisiertes Interview}
entschieden. Bei einem Teil-standardisiertem Interview gibt es vordefinierte Fragen,
Aufgrund der individuellen Gesprächsführung wurde sich für ein \enquote{teil-standardisiertes Interview}
entschieden. Bei einem teil-standardisiertem Interview gibt es vordefinierte Fragen,
aber auch Freiraum für Improvisation und Persönlichkeit.
Für ein gutes Interview ist gute Vorbereitung unabdinglich. Daher wurden bereits sämtliche wichtigen Fragen
Für ein gutes Interview ist Vorbereitung wichtig. Daher wurden bereits sämtliche wichtigen Fragen
in einem Fragebogen festgehalten. Dieser Interview-Fragebogen liegt in \fullref{chap:anhang-interview-fragebogen} anbei.
Ebenso ist Vorbereitung auf Seiten des Interviewteilnehmers wichtig, weshalb das Interview einen Tag zuvor angesprochen wurde.
Ebenso ist Vorbereitung auf Seiten des Interview-Teilnehmers wichtig, weshalb das Interview einen Tag zuvor angesprochen wurde.
Um möglichst objektive und unvorbeeinflusste Antworten zu gewährleisten wird darauf geachtet,
keine Suggestivfragen zu stellen
\cite{bib:kleine-re-fibel}.
@ -63,20 +64,20 @@ Jede dieser Stakeholdergruppen sieht das System aus einer anderen Perspektive
\break\cite{bib:kleine-re-fibel}.
Daher ist es wichtig, Einblicke und Bedürfnisse aller Stakeholdergruppen einzuholen
und die individuellen Perspektiven und Bedürfnisse dieser beim Entwurf der Fragebögen zu berücksichtigen.
Ebenso ist es wichtig, die wichtigsten Fragen am Anfang zu stellen, da Formulare nicht immer vollständig ausgefüllt werden
Ebenso ist es wichtig, die relevantesten Fragen am Anfang zu stellen, da Formulare nicht immer vollständig ausgefüllt werden
\cite{bib:kleine-re-fibel}. Somit sind auch bei einem nur teilweise ausgefüllten Fragebogen die wichtigsten
Fragen beantwortet.
Sämtliche Fragen an die Stakeholdergruppe \enquote{Mitarbeiter \ac{WM}} wurden bereits im Interview mit dem \ac{PO}
beantwortet und als Anforderungen festgehalten. Der \ac{PO} repräsentiert in diesem Falle
die Stakeholdergruppe \enquote{Mitarbeiter \ac{WM}} und steht seit geraumer Zeit mit \ac{WM} im
persönlichen, engen Austausch. Daher gibt es keine offenen Fragen, die diese Stakeholdergruppe
die Stakeholdergruppe \enquote{Mitarbeiter \ac{WM}} und steht seit geraumer Zeit mit \ac{WM} in
persönlichem, engen Austausch. Daher gibt es keine offenen Fragen, die diese Stakeholdergruppe
beantworten könnte. Somit fällt ein Onlinefragebogen für die Stakeholdergruppe \enquote{Mitarbeiter \ac{WM}} weg.
Der Fragebogen der Stakeholdergruppe \enquote{teilnehmende Weingüter} liegt im Anhang unter
\fullref{chap:anhang-fragebogen-extern} bei.
Um den Aufwand und somit die Hemmschwelle des Ausfüllens
eines solchen Online-Fragebogens zu minimieren, gibt es lediglich sechs quantitative Fragen
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
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
projektbezogene, wöchentliche Statusmeeting dar: Jeden Donnerstag soll um 9:30 Uhr der aktuelle Stand
des Projektes vorgestellt, diskutiert und Rücksprache gehalten werden.
Die wichtigsten Erkenntnisse des Interviews sind:
Weitere wichtigste Erkenntnisse des Interviews sind:
\begin{description}
\item[Endgerät für Scanning und Scanneranwendung]\hfill\\
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
und in der Einzelansicht der Jahresauswahlproben sollen alle Weine aufgelistet sein, die dieser Jahresauswahlprobe angehören.
Diese Weine sind ebenso anklickbar und führen zu einer Einzelansicht der Weine.
\item[Genaue Nutzerführung für Teilnehmer]\hfill\\
Die exakten Schritte, die ein Teilnehmer tätigen muss, um verschiedene Prozesse zu durchlaufen.
Diese Prozesse sind in \fullref{chap:umsetzung} detailliert beschrieben.
\item[Nutzerführung für \ac{WM}-Angestellte]\hfill\\
Gescanne QR-Codes von Weinen sollen den Wein als eingegangen markieren und anschließend dem
Mitarbeiter zeigen, welcher Wein eingechecked wurde. Somit dient das Scannen eines Codes ebenso zur
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.
\item[Verschiedene Web-Ansichten]\hfill
\begin{itemize}
\item Jahreauswahlproben-Listenansicht
\item Jahreauswahlproben-Detailansicht
\item Jahresauswahlproben-Listenansicht
\item Jahresauswahlproben-Detailansicht
\item Wein-Registrierungsformular
\item PDF-Url für Versandbriefe
\item Registrierungsseite mit mehreren Schritten
\item Mitarbeiter-Seite für gescannte QR-Codes
\item Mitarbeiterseite für gescannte QR-Codes
\item Listenansicht der Jahresauswahlproben im CSV-Exporter im Backend
\item Detailansicht der Jahresauswahlprobe im CSV-Exporter im Backend
\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.
\\
\\
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.
Hierbei ist es wichtig, die Schnittstelle zwischen den gleichbleibenden Arbeitsschritten und den zu digitalisierenden
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
dysgraphisch verfassten Formulare nur schwer, mehrdeutig, oder gar nicht dechiffriert werden können.
In diesem Prozess wird der Teilnahme des Weines eine inkrementell aufsteigende \ac{ELN} zugewiesen,
die anschließend in Form eines Aufklebers an der Flasche befestigt wird. Anschließend wird die Flasche im Lager verstaut.
die anschließend in Form eines Aufklebers an der Flasche befestigt wird. Darauffolgend wird die Flasche im Lager verstaut.
\begin{nicepic}
\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}:\\
\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
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
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
@ -53,7 +53,7 @@ kompatibel sind.
%Vermeidbarer Aufwand in der Entwicklung ohne ausreichende Vorteile (Kosten-Nutzen-Rechnung) fällt zulasten der Effizienz.
\section{Diskussion}
\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.
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.
@ -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.
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?}
Im Zuge der praktischen Umsetzung der in dieser Forschungsfrage beschriebenen TYPO3-Extension zeigte sich das Problem
\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-Erweiterung zeigte sich das Problem
der Integration der digitalisierten Weinanmeldung und -zustellung in den restlichen, von dieser Ausarbeitung unberührten
Geschäftsprozess der Jahresauswahlprobe.
Diese Umsetzung zeigt auf, dass es für eine nahtlose Integration in den existierenden Geschäftsprozess

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?}
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
TYPO3-Extension angestrengt.
TYPO3-Erweiterung angestrengt.
\\
\\
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.
Ziel ist es, dass das Weinanmeldeformular fehlerhafte
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
Kategorie, die nur vegane Barriqueweine der Rebsorte Merlot zulässt, die einen Mindest- und Maximalrestzuckeranteil, einen Maximalalkoholanteil,
einen Maximalpreis erfüllen.

View File

@ -2,31 +2,31 @@
\label{chap:umsetzung}
Infolge der Anforderungsanalyse befasst sich das Kapitel \enquote{Konzeption und Umsetzung}
mit der Implementation der Anforderungen in dem
Brown-Field Projekt \cite{bib:schwarzer-vorlesung-swa} in Form einer TYPO3-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
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}
TYPO3-Extensions werden via Composer installiert \break\cite{bib:typo3-docs-managing-extensions}.
Um eine TYPO3-Extension zu erstellen, muss also ein Composer-Paket erstellt werden.
\section{Setup einer TYPO3-Erweiterung}
TYPO3-Erweiterungs werden via Composer installiert \break\cite{bib:typo3-docs-managing-extensions}.
Um eine TYPO3-Erweiterung zu erstellen, muss also ein Composer-Paket erstellt werden.
Um vermeidbare Komplexität zu verhindern, wird das Composer-Paket, welches die hier betrachtete
TYPO3-Extension darstellt, lokal in den versionierten Ordner \enquote{packages} gelegt.
TYPO3-Erweiterung darstellt, lokal in den versionierten Ordner \enquote{packages} gelegt.
Dieses Verzeichnis wird als Quelle für Composer-Pakete in der
Haupt-composer.json-Datei hinterlegt.
Somit wird ein Composer-Paket nur für dieses Projekt bereitgestellt,
ohne den Aufwand zu betreiben, der üblicherweise mit dem Bereitstellen eines Paketes einhergeht.
\\
\\
Um das grundlegende Setup einer Extension effizient durchzuführen, wurde eine
existierende Extension mit vergleichbarem Funktionsumfang kopiert, umbenannt und eingefügt.
Spezifisch ist der \enquote{vergleichbare Funktionsumfang}, dass es Datenmodelle und hochpersonalisierte
Um das grundlegende Setup einer TYPO3-Erweiterung effizient durchzuführen, wurde eine
existierende Erweiterung mit vergleichbarem Funktionsumfang kopiert, umbenannt und eingefügt.
Spezifisch ist dieser \enquote{vergleichbare Funktionsumfang}, dass es ebenfalls Datenmodelle und hochpersonalisierte
Frontendlogik in Bezug auf die zuvor genannten Datenmodelle gibt.
\section{Digitization}
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}.
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.
Ein Datenobjekt besteht nach firmeninternen Konventionen aus zumindest
vier Komponenten:
@ -51,7 +51,7 @@ angefertigt und in Rücksprache mit dem \ac{PO} finalisiert.
\begin{nicepic}
\includegraphics[width=1\textwidth]{images/objektrelationen-weinlandmosel-einlieferungswerkzeug.png}
\captionof{figure}{Objektrelationen}
\caption*{Quelle: Eigene Darstellung}
\caption*{Quelle: Eigene Darstellung: Weinland Mosel Einlieferungswerkzeug}
\label{fig:objektrelationen}
\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
formalen Klassendiagramm festgehalten und in Rücksprache mit dem \ac{PO}
weiter bis zu festen Datentypen und Auswahlmöglichkeiten konkretisiert.
Beispielsweise, dass Wettbewerbskategorien durch TYPO3-Categories repräsentiert werden sollen.
Beispielsweise, dass Wettbewerbskategorien durch TYPO3-Categories repräsentiert werden.
Das hat den Vorteil, dass TYPO3-Categories bereits native Bestandteile eines TYPO3-Redaktionssystemes sind
und alle relevanten Attribute anbieten. Diese sind ein Titel,
eine Parentkategorie und eine Beschreibung.
und alle relevanten Attribute anbieten. Diese sind Titel,
Parentkategorie und Beschreibung.
Das Parent-Attribut ist benötigt, da $n$ dieser Attribute einen Attributbaum bilden
\cite{bib:typo3-docs-sys-category}.
Somit ist es möglich, Unterkategorien zu erstellen. Beispiele hierfür sind die
Unterkategorien \enquote{Trockener Riesling} und \enquote{Halbtrockener Riesling} für die Überkategorie
\enquote{Riesling}.
Rebsorten, Geschmack, Weineigenschaften und Qualität sollen eigene Datentypen
Rebsorten, Geschmack, Weineigenschaften und Qualität sollen eigene Datentypen,
anstatt einfacher Zeichenfolgen sein.
Ziel dessen ist, dass sich Nutzer für einen vorgefertigten, nominalen Eintrag in einem Dropdown-Menü
entscheiden müssen und diese Auswahlmöglichkeiten immer noch im TYPO3-Backend pflegbar sind.
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
eingebunden werden.
wiederverwendet werden.
Je Wein sollen beliebig viele Weineigenschaften auswählbar sein. Wettbewerbskategorien,
Geschmacksrichtung, etc, sind jeweils nur ein Element.
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
Schnittstellen werden über die Basisklasse \enquote{Repository} geerbt
\cite{bib:typo3-docs-extdev-tut-tea-repositories}.
Mit Abschluss der Phase der Digitization können alle Datenstrukturen im TYPO3-Backend händisch angelegt,
eingesehen, gelöscht und bearbeitet werden.
\subsection{Teilnehmerregistrierung}
Ein essenzieller Teil des Jahresauswahlprobenwerkzeuges ist die Registrierung von Teilnehmern.
Dieses Modul repräsentiert den ersten Berührungspunkt der Winzer mit dem System.
Hiervon profitiert \ac{WM}, weil registrierte Benutzer der Webseite eine Grundvorausetzung
für die Onlineregistrierung von Weinen zu Jahresauswahlproben sind.
Dem Pflichtenheft ist zu entnehmen, dass es zwei Kategorien von Teilnehmerregistrierungen gibt:
\begin{enumerate}
\item Nutzer ist \ac{WM}-Mitglied
@ -109,29 +105,29 @@ Dem Pflichtenheft ist zu entnehmen, dass es zwei Kategorien von Teilnehmerregist
\end{enumerate}
Der primäre Unterschied zwischen Mitgliedern und Nicht-Mitgliedern ist, dass Mitglieder bereits einen
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
ihre Stammdaten angeben, während sich Mitglieder lediglich einloggen müssen und eine Schaltfläche
\enquote{Teilnehmer werden} betätigen.
Der mit dem \ac{PO} ausgearbeitete UX-Flow der Registrierung sieht vor, dass der Nutzer zunächst gefragt wird,
ob er Mitglied sei oder nicht. Hierzu gibt es je einen Button. Ist der Nutzer ein Mitglied,
wird er auf ein Loginform, mit der Option zur Registrierung weitergeleitet.
wird er auf ein Loginformular, mit der Option zur Registrierung weitergeleitet.
Nach erfolgreichem Login, wird ein Teilnehmerobjekt erstellt.
Wählt der Nutzer \enquote{Nein, ich bin kein Mitglied} aus, wird er auf ein Registrierungsformular
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
Stammdaten zum Weingut angefragt.
Dieser Schritt übersetzt unter anderem den \enquote{Einreicher}-Teil des ursprünglichen Anmeldeformulares,
anbei in \fullref{chap:anhang-anmeldeformular}.
\begin{nicepic}
\includegraphics[width=0.9\textwidth]{images/ux-flow-registrierung.png}
\includegraphics[width=0.6\textwidth]{images/ux-flow-registrierung.png}
\captionof{figure}{UX-Flow: Registrierung}
\caption*{Quelle: Eigene Darstellung}
\label{fig:uxflow-registrierung}
\end{nicepic}
Da das Brown-Field-Projekt bereits Accountlogins und -registrierungen implementiert und nutzt,
werden auf diese Lösungen zurückgegriffen, um einen einheitlichen Workflow beizubehalten.
wird auf diese Lösungen zurückgegriffen, um einen einheitlichen Workflow beizubehalten.
Accountregistrierungen werden über den
\enquote{femanager} \cite{bib:typo3-docs-femanager} realisiert, während Logins via TYPO3s nativem
Frontend-Nutzer-Login gelöst werden. Das ist explizit von \enquote{femanager} 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.
Anfangs wählt dieser Nutzer \enquote{Ich bin kein Mitglied} auf der Registrierungsseite aus.
Daraufhin navigiert der Browser zu einem Registrierungs-Formular.
Hierfür muss eine Email-Adresse und ein Passwort vergeben und den Nutzungsbestimmungen zugestimmt werden.
Hierfür muss eine Email-Adresse, ein Passwort vergeben und den Nutzungsbestimmungen zugestimmt werden.
Im Anschluss erhält der Nutzer eine Bestätigungsemail mit einem Aktivierungslink.
Wird dieser Link geöffnet, wird der Account freigeschalten und ein Login-Feld erscheint.
Nach erfolgreichem Login wird der Nutzer mit einem
@ -160,6 +156,7 @@ Stammdatenformular konfrontiert. Dabei handelt es sich um Angaben zum teilnehmen
Wird dieses Formular abgeschickt, ist die Teilnehmerregistrierung abgeschlossen.
\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
\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
@ -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.
Auf diesem Login-Formular existiert ein Button \enquote{Jetzt registrieren}, sowie ein Hinsweistext dazu.
Da der Nutzer noch keinen Account hat, muss dieser auf \enquote{Jetzt registrieren} klicken.
Daraufhin navigiert der Browser zu einem Registrierungsformular, das eine Email-Adresse, ein Passwort
Daraufhin navigiert der Browser zu einem Registrierungsformular, das eine Email-Adresse, eine Mitgliedsnummer, ein Passwort
und die Zustimmung zur Datenverarbeitung benötigt. Ist dieses Formular abgeschickt, erhält das Mitglied
eine Email mit einem Bestätigungslink. Wird dieser Bestätigungslink angeklickt, wird das Mitgliedskonto
freigegeben und es öffnet sich ein Login-Formular, beschrieben in \enpointy{Mitglied, mit Konto}.
eine Email mit einem Bestätigungslink. Wird dieser Bestätigungslink angeklickt,
öffnet sich ein Login-Formular, beschrieben in \enpointy{\textit{\nameref{chap:umsetzung-mitglied-mit-konto}}}.
Da es sich hierbei um einen Mitgliederzugang handelt, muss dieser zunächst von einem
\ac{WM}-Mitarbeiter freigegeben werden, bevor ein Login möglich ist.
\subsubsection*{Umsetzung}
Zunächst wurde ein simples Weichen-Content-Element erstellt.
@ -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
von zwei Seiten weiterzuleiten. Anschließend wurden Registrierungen über Femanager-Plugin-Content-Elemente
realisiert.
Anpassungen der versendeten Emails erfolgen durch Überschreiben der Email-Templates von Femanager.
Anpassungen der versendeten Emails erfolgen durch Überschreiben der Email-Templates von \enquote{femanager}.
Weiterleitungen zu bestimmten Seiten, nachdem ein Nutzer spezielle Events ausgelöst hat, können über TypoScript
konfiguriert werden \cite{bib:typo3-docs-femanager}. Logins werden über das TYPO3-Native Loginformular
konfiguriert werden \cite{bib:typo3-docs-femanager}. Logins werden über das TYPO3-native Loginformular
gelöst. Im TYPO3-Loginformular können Weiterleitungen zu spezialisierten Seiten im Backend-UI festgelegt werden
\break\cite{bib:typo3-docs-felogin}.
Für alle funktionalen Belange wird ein TYPO3-Plugin registriert. Dieses Plugin verfügt über einen
ActionController, der Nutzeranfragen an PHP-Funktionen (\enquote{Actions})
bindet.
In diesen Actions werden Fehlerbehandlungen durchgeführt, Datenmodelle der Domäne erstellt und in der
Datenbank persistiert, sowie Daten für die Anzeige im Frontend aufbereitet \cite{bib:typo3-docs-extbase}.
Datenbank persistiert sowie Daten für die Anzeige im Frontend aufbereitet \cite{bib:typo3-docs-extbase}.
Neue Datenobjekte werden in Repository-Objekten registriert
\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
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
ü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.
Als Foreign Keys werden hierfür die jeweiligen \acp{UID} herangezogen, da diese Werte durch
\enquote{AUTO\_INCREMENT} auf der Datenbankebene erzeugt werden und garantiert einzigartig je Datenbanktabelle sind
\cite{bib:w3schools-auto-increment}.
Es gilt also, dass ein MasterRecord $a$ die Teilnehmer\ac{UID} von einem Teilnehmer $b$ hält und dass
$b$ die MasterRecord\ac{UID} von $a$ hält.
Es gilt also, dass ein Masterrecord $a$ die Teilnehmer\ac{UID} von einem Teilnehmer $b$ hält und dass
$b$ die Masterrecord\ac{UID} von $a$ hält.
Die Problematik hierbei ist, dass diese \acp{UID} erst nach dem Persistieren in der Datenbank bekannt sind,
da diese Werte erst im Zuge der Persistierung erstellt werden \cite{bib:w3schools-auto-increment}.
Die Lösung hierfür ist, beide Elemente zu erstellen und zu persistieren und erst danach ihre \acp{UID} gegenseitig
@ -214,14 +214,14 @@ bekannt zu machen um sie anschließend erneut zu persistieren.
\subsection{Weinregistrierung}
Ein Basismerkmal des Jahresauswahlprobenwerkzeuges ist die Möglichkeit, Weine zu Jahresauswahlproben
anzumelden. Dieser Schritt übersetzt unter anderem die verbleibenden Formfelder des
ursprünglichen Anmeldeformulares, anbei in \fullref{chap:anhang-anmeldeformular} in den digitalen Workflow.
ursprünglichen Anmeldeformulares, anbei in \fullref{chap:anhang-anmeldeformular}, in den digitalen Workflow.
Für die Weinanmeldung spielt die Mitgliedsschaft eines Teilnehmers keine Rolle. Es wird lediglich ein
Frontend-Nutzer der Nutzergruppe \enquote{Teilnehmer} benötigt. Dieser Nutzer hat, wenn angemeldet,
Zugriff auf eine Auflistung aller zeitlich freigegebenen Jahresauswahlproben.
Soweit der Registrierungszeitraum dieser Jahresauswahlprobe den aktuellen Zeitpunkt miteinschließt,
wird eine \enquote{Jetzt Wein anmelden}-Schaltfläche angeboten.
Dadurch, dass Anmeldeformulare elektronisch und automatisiert verarbeitet werden, sinkt der Aufwand,
der seitens \ac{WM} für Anmeldungen 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.
\begin{nicepic}
@ -238,8 +238,8 @@ auf der betroffenen Webseite (in diesem Beispiel der Weinanmeldungsseite) durchg
Das Verstecken der zugehörigen
Schaltfläche im Frontend dient lediglich der User-Experience und stellt keine Sicherheitsvorkehrung dar.
Das ist essenziell, da eine URL, auch wenn für sie keine Schaltfläche existiert, dennoch aufgerufen werden kann.
Da Jahresauswahlprobennummern (\acp{UID}) fortlaufend sind, ist es trivial URLs für Weinanmeldungen
beliebiger Jahresauswahlproben herzuleiten. Insofern ist es von großer Wichtigkeit sicherzustellen,
Da Jahresauswahlprobennummern, also \acp{UID}, fortlaufend sind, ist es trivial URLs für Weinanmeldungen
beliebiger Jahresauswahlproben herzuleiten. Insofern ist es von großer Wichtigkeit, sicherzustellen,
dass der Server solche Anfragen grundsätzlich selbst prüft und gegebenenfalls verneint.
\subsubsection*{Das Formular}
@ -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.
Beispiele für Inputfelder sind: Weinbeschreibung, Jahrgang und Alkoholgehalt.
Inputfelder wurden mit simplen Input-Tags umgesetzt und erhielten nach Bedarf \textit{required} und
Inputfelder werden mit simplen Input-Tags umgesetzt und erhalten nach Bedarf \textit{required} und
\textit{pattern}-Attribute. Diese Attribute beschreiben jeweils, ob ein Formfeld ein Pflichtfeld ist und
mit welcher Regular Expression der Formfeldinhalt abzugleichen ist \cite{bib:w3schools-input}.
Die Formfeldwerte können unverändert in der Datenbank persistiert werden.
@ -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
für diese.
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,
deren Anzeigewert nicht der Suche entspricht, das Stilattribut \enquote{display: none;} auferlegt.
Aufgrund dessen, dass das Weinlagen-Dropdown-Menü über 170 Einträge führt, wird eine Suchmöglichkeit implementiert.
Diese ist lediglich ein Textfeld, das bei jeder Eingabe allen Option-Tags der Weinlage,
deren Anzeigewert nicht dem Suchwert entspricht, das Stilattribut \enquote{display: none;} auferlegt.
Somit sind diese nicht mehr sichtbar.
\\
\\
Eine komplexe Ausnahme stellt das SelectSingle-Formfeld \enquote{Category} dar, da TYPO3-Kategorien
als Baumstrukturen abgebildet werden
\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
Fluid-Partial aufgerufen,
das alle Kategorien $b$ darstellt, für die gilt: $b.pid = a.uid$. Diese Darstellung erfolgt durch einen erneuten rekursiven Aufruf dieses Partials.
In jeder Darstellung wird der Kategoriename, geprefixt mit
$n$ Leerzeichen, dargestellt, mit $n = Rekursionstiefe$. Somit entsteht ein Drop-Down-Menü, das
alle Kategorien in einer eindimensionalen Liste darstellt. Diese Liste ist nach einer Preorder-Traversierung
$n$ Leerzeichen, dargestellt, mit $n = Rekursionstiefe$. Somit entsteht ein Dropdown-Menü, das
alle Kategorien in einer eindimensionalen Liste darstellt. Diese Liste ist nach einer preorder-Traversierung
des Kategoriebaumes sortiert und desto tiefer ein Element im Baum ist, desto weiter ist es eingerückt.
Damit sieht das Drop-Down-Menü aus wie eine Baumstruktur.
Damit sieht das Dropdown-Menü aus wie eine Baumstruktur.
\\
\\
Diese Herangehensweise erzeugt schlüssigen und lesbaren Programmcode und lässt sich unkompliziert umsetzen.
Das senkt Entwicklungskosten und erhöht den Profit des Endkunden, da hierdurch weniger Zeit aufgewandt wird.
Diese Herangehensweise erzeugt schlüssigen, lesbaren Programmcode und lässt sich unkompliziert umsetzen.
Das senkt Entwicklungskosten, wovon \ac{WM} profitiert.
Rekursiv aufgerufene For-Schleifen, die sich selbst erneut für alle Elemente aufrufen,
können zu einem Performanzproblem führen \cite{bib:schwarzer-vorlesung-alg}.
können zu Performanzproblemen führen \cite{bib:schwarzer-vorlesung-alg}.
Daher wird im Folgenden die Zeitkomplexität dieser Rekursionsfunktion betrachtet.
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,
sondern gleich groß bleibt.
Das verletzt die Bedingung $b>1$ des Master-Theorems, definiert als $T(n) = a*T(\frac{n}{b})+f(n)$
\cite{bib:schwarzer-vorlesung-alg}.
Der 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.
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}
\label{fig:timecomplexity-category}
\end{nicepic}
\clearpage
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},
die die Unterkategorien \enquote{Trockener Riesling} und \enquote{Halbtrockener Riesling} beinhalten könnte,
auch direkt auswählbar sein sollte. Zudem besitzen Kategorie-Elemente kein Attribut das auf die Präsenz
von Unterkategorien hindeutet \cite{bib:typo3-docs-sys-category}, womit eine Unterscheidung zwischen
Baumblättern und -Zweigen nicht ohne weiteres möglich wäre. Diese Entscheidung wäre jedoch
Baumblättern und -zweigen nicht ohne weiteres möglich wäre. Diese Entscheidung wäre jedoch
benötigt, um zwischen einem Optgroup-Tag und einem Option-Tag abzuwägen.
\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.
TYPO3-Fluid implementiert hierfür keinen ViewHelper
\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
Wert \enquote{<formfeldname>-true}.
Ist also eine dieser Checkboxen angehakt, hat sie den zuvor genannten Wert. Falls nicht, trägt sie keinen Wert.
Weil alle angehakten Checkboxen dieses Formfeldes den selben Wert tragen, ist es PHP-Seitig trivial
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.
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.
@ -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.
Somit wird redundanz vermieden.
Es ist Aufgabe der QR-Code-App, die den Code einscannt, aus der Wein-\ac{UID} eine vollständige URL herzuleiten.
Um Resourcen zu sparen und somit den 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
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,
die sonst in das anderweitige Einbetten eines Bildes in einem PDF mit \enquote{mpdf} fließen müsste.
Die QR-Codegenerierung funktioniert konkret, indem ein neues QRCode-Objekt der QRCode-Klasse erstellt wird.
Diese Klasse nimmt ein QROptions-Objekt im Konstruktor, das in diesem Falle einige Stilattribute mit sich trägt.
Das QRCode-Objekt bietet nun eine Methode \enquote{render} an, die sofern nicht anders konfiguriert, den QR-Code als
Base64-kodiertes Bild zurückgibt \cite{bib:chillerlan-php-qrcode}.
base64-kodiertes Bild zurückgibt \cite{bib:chillerlan-php-qrcode}.
\subsubsection{PDF-Generierung}
Firmenintern ist es Standard, das Aussehen sowie die Inhalte der PDF-Dokumente, die 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
kontinuierlich mit dem restlichen Projekt zu halten und um eine gute Wartbarkeit zu gewährleisten,
wird diese HTML-Zeichenfolge mit TYPO3-Fluid getemplated. Das heißt, dass eine HTML-Templatedatei bereitgestellt wird,
diese mit TYPO3-Fluid befüllt wird und in PHP gerendert wird, um eine HTML-Zeichenkette als Ergebnis zu erhalten.
diese mit TYPO3-Fluid befüllt und in PHP gerendert wird, um eine HTML-Zeichenkette als Ergebnis zu erhalten.
Hierfür wird ein TYPO3-StandaloneView instanziiert, mit einem Pfad zur Template-Datei konfiguriert, Variablen angegeben,
die in Fluid verfügbar sein sollen und anschließend über die \enquote{render}-Methode zu einer Zeichenkette gerendert
\cite{bib:typo3-ref-standalone-view}.
Anschließend wird ein \enquote{mpdf}-Objekt erstellt und mit einer rudimentären Konfiguration in Form eines Arrays im Konstruktor
konfiguriert. Diese Konfiguration definiert in diesem Falle Seitenabstände, Papierformat, Zeichenkodierung und Schriftarten.
Abschließend wird dem \enquote{mpdf}-Objekt das zuvor generierte HTML übergeben und über die Methode \enquote{OutputBinaryData}
als Bytes zurückgegeben und in einer Variable gespeichert \cite{bib:mpdf-ref}.
Abschließend wird dem \enquote{mpdf}-Objekt das zuvor generierte HTML übergeben, über die Methode \enquote{OutputBinaryData}
in Form von Bytes zurückgegeben und in einer Variable gespeichert \cite{bib:mpdf-ref}.
Um dieses PDF-Dokument über die Verbindung an den Nutzer zu übertragen, wird ein TYPO3-Response-Objekt erstellt.
Über dieses Response-Objekt werden einige Header gesetzt und direkt übertragen. 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
@ -388,13 +389,13 @@ PDF zum Nutzer übertragen.
\subsection{Jahresauswahlproben- und Wein-Detailansichten}
Weine und Jahresauswahlproben sollen unter bestimmten Gegebenheiten einsehbar sein.
Hierzu gibt es eine Auflistung aller Jahresauswahlproben. Diese sind anklickbar, um eine Detailansicht der ausgewählten
Jahresauswahlprobe zu öffnen. Hier wird neben Metadaten der Jahresauswahlprobe auch eine Liste aller zur Einsicht 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.
Die Detailansichten für Jahresauswahlproben und Weine benötigen spezielle Autorisierung.
Diese sind: Jahresauswahlproben sind nur einsichtig, wenn sich das aktuelle Datum innerhalb des
Sichtbarkeitszeitraumes der Jahresauswahlprobe befindet.
Detailansichten für Weine sind immer für den zugehörigen Teilnehmer einsichtig.
Nach Abschluss einer Jahresauswahlprobe sind alle ihr angehörigen Weine öffentlich einsichtig.
Nach Abschluss ihrer Jahresauswahlprobe sind alle ihr angehörigen Weine öffentlich einsichtig.
Das hat den Hintergrund, dass Jahresauswahlproben Blindverkostungen sind
und niemand die Möglichkeit haben sollte, im Voraus Informationen über die teilnehmenden Weine in Erfahrung zu bringen.
Die Ergebnisse der Jahresauswahlproben sind öffentlich, also sind es die Weine nach Abschluss einer Jahresauswahlprobe auch.
@ -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,
wie beispielsweise seiner Teilnehmernummer oder seiner Nutzergruppenzugehörigkeit, zu erlangen, wird sich
der Extbase-nativen Domain-Model-FrontendUser-Klasse bedient \cite{bib:typo3-ref-extbase-model-feuser}.
\\
\\
Mit Abschluss der Phase der Digitization können alle Datenstrukturen im TYPO3-Backend händisch angelegt,
eingesehen, gelöscht und bearbeitet werden.
\section{Digitalization}
@ -417,7 +422,7 @@ implementierten Datenmodellen zu arbeiten. Im Folgenden werden die Umsetzungen d
erforderlichen Geschäftsprozesse beschrieben.
\subsection{Schnittstelle QR-Code-Scanner}
Es ist angedacht, dass Mitarbeiter über die App \enquote{QRBot} den QR-Code auf dem Einlieferungsschein einscannen.
Es ist angedacht, dass Mitarbeiter über die App \enquote{QRBot} den QR-Code auf dem Datenblatt einscannen.
Diese App ermöglicht es Nutzern für jeden eingescannten Code eine URL zu öffnen und den Wert des QR-Codes anstelle eines Platzhalters
in der URL einzufügen.
Hierfür bietet das Jahresauswahlprobenwerkzeug eine Schnittstelle bzw. eine Seite an, die eine Wein-\ac{UID} als
@ -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.
Wird ein Wein als \enquote{eingegangen} markiert, wird der betroffene Teilnehmer per Email informiert.
Hierzu wird die FluidEmail-Klasse des TYPO3-Cores herangezogen.
Sollte ein Wein bereits als \enquote{eingegangen} markiert sein, wird keine Email verschickt und dem Mitarbeiter wird kommuniziert,
Sollte ein Wein bereits als \enquote{eingegangen} markiert sein, wird keine Email verschickt und dem Mitarbeiter kommuniziert,
dass keine Änderungen vorgenommen wurden.
Abschließend werden im Frontend allgemeine Daten über den Wein angezeigt, damit Mitarbeiter sich sicher sein können,
Abschließend werden im Frontend allgemeine Daten über den Wein angezeigt, damit sich Mitarbeiter sicher sein können,
den richtigen Wein eingescanned zu haben.
\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.
Um \ac{WM} weitere Arbeitszeit zu ersparen wird eine Download-Funktion für CSV-Dateien
angeboten. Das erspart das manuelle Kopieren und Abspeichern von CSV-Zeichenketten durch IT-Fachfremde, reduziert damit die Anzahl
an benötigten Ü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,
wurde diese Downloadfunktion JavaScript-seitig umgesetzt.
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}
\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.}
\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.
\\
\\
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.
@ -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.
\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
Zielzustand zu erreichen. Anschließend sollten die konkreten Schritte identifiziert werden, die erforderlich sind, um diese
Lücke zu schließen. Wenn zum Beispiel ein Treiber \enquote{interne Effizienz} ist, könnten die Schritte darin bestehen, neue digitale
Werkzeuge zu integrieren. Schließlich werden diese Schritte analysiert und priorisiert. Prädestiniert dafür sind
Kosten-Nutzen-Analysen, Analysen der Umsetzbarkeit, des Wartungsaufwands und der Mitarbeiterschulung.
\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,
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
@ -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,
sodass diese digital, in Form von Nullen und Einsen, gespeichert und elektronisch\break weiterverarbeitet werden können
\cite{bib:dougherty}\break\cite{bib:loebbecke}.
\quotecite{Examples concern the use of digital forms in ordering processes, the use of digital surveys, or the use digital applications for internal financial declarations.} \cite{bib:verhoef}.
\textit{Digitalization} beschreibt den Prozess der Veränderung bestehender Geschäftsprozesse, um mit digitalen Werkzeugen
und Datenmodellen zu arbeiten \cite{bib:fengli}.
und Datenmodellen zu arbeiten \cite{bib:fengli}. Beispielsweise der Verwendung von Robotern in der Produktion \cite{bib:verhoef}.
Die letzte Phase, die \textit{Digitale Transformation}, beschreibt eine firmenweite Veränderung, die beispielsweise
Ergründungen neuer Geschäftsmodelle mit sich bringen könnte \cite{bib:pagani}.
\section{Abwägung in Bezug auf die Problemstellung}
In Bezug auf die hier betrachteten Methoden ist es wichtig zu erwähnen, dass der betrachtete Kontext
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.
Diese Ausarbeitung befasst sich nicht
mit firmenweiten Veränderungen, wie sie von den nahegelegten Modellen abgedeckt ist.
Daher sind geringfügige Anpassungen der Methoden unabdinglich.
Daher sind geringfügige Anpassungen der Methodiken unabdinglich.
Des Weiteren ist Resourcenintensivität ein relevanter Gesichtspunkt dieser Abwägung, da eine solche Digitalisierung
effizient und profitabel sein soll.
@ -96,13 +98,13 @@ Digitalisierung bestimmter
Geschäftsprozesse befassen. Phase drei befasst sich mit firmenweiten Veränderungen,
die über Geschäftsprozesse hinausgehen \cite{bib:verhoef}.
Firmenweite Veränderungen befinden sich außerhalb des Rahmens dieser Ausarbeitung.
Der Autor empfindet das Modell nach Verhoef et al. als agiler und unrestriktiver.
Der Autor empfindet das Modell nach Verhoef et al. als agiler, unrestriktiver, weniger overheadlastig und somit als effizienter.
\subsection{Fazit}
Aufgrund des kleinen Projektumfanges und der großen Wahrscheinlichkeit, dass sich Anforderungen ändern werden,
fällt die Entscheidung auf das
minimalistischere Modell nach Verhoef et al.. Grundlage dieser Entscheidung sind Forschungsarbeiten von M. Ayman Al Ahmar,
die nahelegen, dass Projekte dieser Art idealerweise nach 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}.
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}
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}.
TYPO3 ist ein Redaktionssystem und PHP-Rahmen\-werk, das Daten- und Inhaltspflege in einem geschützten Bereich
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
\enquote{Extbase} wird eine mächtige Entwicklerschnittstelle bereitstellt,
um hochindividualisierte Funktionalitäten zu ermöglichen.
@ -23,102 +23,103 @@ auf bereits vom System verwendete Programmiersprachen begrenzt.
\subsection{Javascript-Implementationen}
\subsubsection*{Jquery-qrcode}
\textit{Jquery-qrcode} ist ein Plugin für JQuery um dynamisch QR-Codes auf Browserseite zu generieren.
\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
\cite{bib:larsjung-jquery-qrcode}. Somit scheidet jquery-qrcode für nähere Evaluationen aus, da die Software nicht mehr
gepflegt wird. \textit{Jquery-qrcode} wurde bis Januar 2023 853 mal von Nutzern mit einem Stern
\cite{bib:larsjung-jquery-qrcode}. Somit scheidet \enquote{jquery-qrcode} für nähere Evaluationen aus, da die Software nicht mehr
gepflegt wird. \enquote{Jquery-qrcode} wurde bis Januar 2023 853 mal von Nutzern mit einem Stern
markiert \cite{bib:larsjung-jquery-qrcode}.
Wenn ein Nutzer ein Github-Repository mit einem Stern markiert, zeigt sich der Nutzer interessiert genug,
um über Neuigkeiten auf dem Laufenden gehalten werden zu wollen \cite{bib:github-stars}. Jquery-qrcode ist MIT-lizensiert
um über Neuigkeiten auf dem Laufenden gehalten werden zu wollen \cite{bib:github-stars}. \enquote{Jquery-qrcode} ist MIT-lizensiert
\cite{bib:larsjung-jquery-qrcode}.
\subsubsection*{Kjua}
\textit{Kjua} ist eine Javascript-Bibliothek, um dynamisch QR-Codes auf der Browserebene zu generieren.
Im Gegensatz zu \textit{jquery-qrcode} funktioniert Kjua auch ohne JQuery. Es werden diverse Stilattribute für gestaltete
QR-Codes unterstützt \cite{bib:larsjung-kjua}. Kjua kann QR-Codes über HTML-Canvas, Bilder und Vektorgrafiken umsetzen. Das ist bei näherer Betrachtung der Kjua Tech Demo \enpointy{https://larsjung.de/kjua/latest/demo} ersichtlich, jedoch
nicht explizit erwähnt. Nach dem aktuellen Stand (Januar 2023) wurde Kjua von 243 Nutzern mit einem Stern markiert.
Kjuas letzte Codeänderung liegt circa zwei Jahre zurück. Es gibt eine unbeantwortete, sieben Jahre alte Pull-Request und
Issues scheinen ignoriert zu werden. Kjua ist MIT-lizensiert \cite{bib:larsjung-kjua}.
\enquote{Kjua} ist eine Javascript-Bibliothek, die dynamisch QR-Codes auf Browserebene generiert.
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}. \enquote{Kjua} kann QR-Codes über HTML-Canvas, Bilder und Vektorgrafiken umsetzen.
Das ist bei näherer Betrachtung der Kjua Tech Demo \enpointy{https://larsjung.de/kjua/latest/demo} ersichtlich, jedoch
nicht explizit erwähnt. Nach dem aktuellen Stand (Januar 2023) wurde \enquote{kjua} von 243 Nutzern mit einem Stern markiert.
\enquote{Kjuas} letzte Codeänderung liegt circa zwei Jahre zurück. Es gibt eine unbeantwortete, sieben Jahre alte Pull-Request und
Issues scheinen ignoriert zu werden. \enquote{Kjua} ist MIT-lizensiert \cite{bib:larsjung-kjua}.
\subsubsection*{Soldair/node-qrcode}
\textit{Soldair/node-qrcode} ist eine node.js-basierte Implementation eines QR-Code-Generators und bietet somit Funktionialität
serverseitig, als Kommandozeilenwerkzeug, sowohl auch Browserseitig an. Die Readme-Datei ist umfangreich, reich an Beispielen
\enquote{Soldair/node-qrcode} ist eine Node.js-basierte Implementation eines QR-Code-Generators und bietet somit Funktionialität
serverseitig, als Kommandozeilenwerkzeug, sowohl auch browserseitig an. Die Readme-Datei ist umfangreich, reich an Beispielen
und detailreichen Erklärungen. Der letzte Commit ist zu diesem Zeitpunkt knapp älter als ein halbes Jahr. Somit macht das
Projekt einen moderat gepflegten Eindruck. Die Readme-Datei verweist auf Unit Tests bei Travis, jedoch lief die letzte Pipeline
vor circa zwei Jahren, Februar 2021, durch und schlug fehl. Einige Pull-Requests und Issues werden seit Jahren ignoriert
Projekt einen moderat gepflegten Eindruck. Die Readme-Datei verweist auf Unit-Tests bei Travis, jedoch lief die letzte Pipeline
vor etwa zwei Jahren, Februar 2021, durch und schlug fehl. Einige Pull-Requests und Issues werden seit Jahren ignoriert
\cite{bib:soldair-node-qrcode}.
Die Bibliothek wurde 74 millionen mal heruntergeladen und mit 6308 Sternen markiert.
Soldair/node-qrcode ist MIT-lizensiert \cite{bib:npmjs-soldair-node-qrcode}.
Die Bibliothek wurde 74 Millionen mal heruntergeladen und mit 6.308 Sternen markiert.
\enquote{Soldair/node-qrcode} ist MIT-lizensiert \cite{bib:npmjs-soldair-node-qrcode}.
\subsection{PHP-Implementationen}
\subsubsection*{Chillerlan/php-qrcode}
Eine arrivierte Lösung für QR-Code-Generierung in PHP ist \textit{chillerlan/php-qrcode}, umgesetzt durch
Eugen Rochko et al.. \textit{Chillerlan/php-qrcode}s Etabliertheit zeigt sich durch den zu diesem
Zeitpunkt (Jahnuar 2023) auf 5 Millionen stehenden Downloadzähler,
mehreren Entwickler und den letzten Commit, der zu diesem Zeitpunk nicht älter als einen Monat ist.
Eine arrivierte Lösung für QR-Code-Generierung in PHP ist \enquote{chillerlan/php-qrcode}, umgesetzt durch
Eugen Rochko et al.. \enquote{Chillerlan/php-qrcode}s Etabliertheit zeigt sich durch den zu diesem
Zeitpunkt (Januar 2023) auf 5 Millionen stehenden Downloadzähler,
mehreren Entwicklern und dem letzten Commit, der zu diesem Zeitpunk nicht älter als einen Monat ist.
Insgesamt erfolgten bis dato 808 Commits von 6 Entwicklern. Das Projekt verfügt über Unit-Tests,
die 90\% der Zeilen der Codebase abdecken. Rochko übernahm Teile der Codebase aus
dem Java-Projekt \enquote{ZXing} und übersetzte diese zu PHP.
Es gibt zu diesem Zeitpunkt keine unbeantworteten Issues oder Pull-Requests.
\textit{Chillerlan/php-qrcode} basiert auf einer angepassten Version von \textit{kazuhikoarase/qrcode-generator}.
Einzig auffällig sind die Commitnachrichten, die zuteils nur aus einem (1) Emoji bestehen.
\textit{Chillerlan/php-qrcode} wurde von 1212 Github-Nutzern mit einem Stern markiert.
\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 Emoji bestehen.
\enquote{Chillerlan/php-qrcode} wurde von 1.212 Github-Nutzern mit einem Stern markiert.
Die Bibliothek ist MIT-\break{}lizensiert
\cite{bib:chillerlan-php-qrcode}.
\subsubsection*{Kreativekorp/barcode}
\textit{kreativekorp/barcode} ist eine PHP-Bibliothek zur Generierung von QR-Codes, bereitgestellt von
\textit{Kreative Software}, R.G. Bettencourt.
Diese Implementation umfasst etablierte Barcode-Formaten und unterstützt eine Vielzahl an Anpassungsmöglichkeiten.
Das Projekt wurde bis zum heutigen Tage 189 mal mit einem Stern markiert \cite{bib:kreativkorp-barcode}.
\enquote{kreativekorp/barcode} ist eine PHP-Bibliothek zur Generierung von QR-Codes, bereitgestellt von
\enquote{Kreative Software}, R.G. Bettencourt.
Diese Implementation umfasst etablierte Barcode-Formate und unterstützt eine Vielzahl an Anpassungsmöglichkeiten.
Das Projekt wurde bis zum heutigen Tag 189 mal mit Sternen markiert \cite{bib:kreativkorp-barcode}.
Vier von den sechs vorhandenen Commits erfolgten innerhalb von zwei Tagen in 2016. Ein weiterer
Commit erfolte wenige Tage später. Der aktuellste Commit wurde knapp zwei Jahre später, 2018, veröffentlicht.
Das liegt zu diesem Zeitpunkt vier Jahre in der Vergangenheit.
Damit ist diese Bibliothek de-facto sechseinhalb Jahre alt und wurde seitdem einmal um Featuers erweitert.
Damit ist diese Bibliothek de facto sechseinhalb Jahre alt und wurde seitdem einmal um Featuers erweitert.
Issues und Pull-Requests werden weitestgehend ignoriert.
Die Bibliothek verwendet die MIT-Lizenz
\cite{bib:kreativkorp-barcode}.
Die Bibliothek verwendet die MIT-Lizenz.
\\\cite{bib:kreativkorp-barcode}.
\subsubsection*{Bacon/BaconQrCode}
\textit{Bacon/BaconQrCode} ist eine PHP-Bibliothek zur Generierung von QR-Codes, bereitgestellt von Ben Scholzen, hinter
\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,
die zu einer Nginx-\enquote{Hello World}-Seite führt. Begleitet wird \textit{BaconQrCode} von etlichen weiteren \enquote{Bacon-Projekten}
wie Beispielsweise \textit{BaconPdf}, \textit{BaconStringUtils} und \textit{BaconUser} um nur einige zu nennen.
die zu einer Nginx-\enquote{Hello World}-Seite führt. Begleitet wird \enquote{BaconQrCode} von etlichen weiteren \enquote{Bacon-Projekten}
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
von vor zehn Jahren. BaconQrCode stellt das beliebteste und gepflegteste Projekt von Scholzen mit 1508 Sterne-Markierungen und
einem aktuellsten Commit von vor zwei Monaten dar. BaconQrCode fällt mit siebzehn Entwicklern auf, die jeweils zumindest
von vor zehn Jahren. \enquote{BaconQrCode} stellt das beliebteste und gepflegteste Projekt von Scholzen mit 1.508 Sterne-Markierungen und
einem aktuellsten Commit von vor zwei Monaten dar. \enquote{BaconQrCode} fällt mit siebzehn Entwicklern auf, die jeweils zumindest
einen Commit beigetragen haben. Zu diesem Zeitpunkt fanden 177 Commits statt. Githubs DependencyGraph verzeichnet
nahezu 80.000 Projekte, die BaconQrCode verwenden \cite{bib:bacon-baconqrcode} und Packagist meldet 50 Millionen Downloads
\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
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.
BaconQrCode unterliegt einer BSD-2-Clause-Lizenz
\enquote{BaconQrCode} unterliegt einer BSD-2-Clause-Lizenz
\cite{bib:bacon-baconqrcode}.
\subsection{Subjektiver Vergleich im Bezug auf die Problemstellung}
Im Folgenden werden subjektive Einschätzungen und Meinungen des Autors über die Eignung der beleuchteten
Bibliotheken vorgestellt.
Um eine Bibliothek als \enquote{am geeignetsten} für einen Anwendungsfall zu kurieren,
müssen die konkreten Anforderungen und Constraints für diesen Anwendungsfall beachtet werden.
Um eine Bibliothek als \enquote{am geeignetsten} für einen Anwendungsfall unter den betrachtenen Bibliotheken zu kurieren,
müssen die konkreten Anforderungen für diesen Anwendungsfall beachtet werden.
Das ist so, da verschiedene Eigenschaften der Bibliotheken verschiedene Auswirkung in Gewichtung und Richtung
je nach Anwendungsfall aufweisen.
Hierfür werden die zuvor vorgestellten Bibliotheken zur Erstellung von QR-Codes in den folgenden Attributen gegenübergestellt:
\begin{description}
\item [Funktionialität] \hfill \\
Der Umfang, der für diese Problemstellung relevanten Funktionen in Annahme dessen, dass die Bibliothek
Der Umfang, der unterstützten Funktionen, in Annahme dessen, dass die Bibliothek
syntaktisch und pragmatisch korrekt \cite{bib:heinemann-vorlesung-re} ist.
\item [Gepflegtheit] \hfill \\
Das Ausmaß, in dem das Projekt aktiv gepflegt wird und ordnungsgemäß entwickelt zu sein scheint.
Hierzu zählen beispielsweise: Bearbeitung von Issues, Bearbeitung von Pull-Requests, Präsenz von Tests,
Präsenz einer angemessenen Dokumentation, häufige Commits, mehrere Entwickler, Anzahl der
Sterne auf Github (Ausmaß an tieferem, öffentlichem Interesse \cite{bib:github-stars}), sowie der Anzahl der
Sterne auf Github, sowie der Anzahl der
Downloads bzw. Installationen, falls verfügbar.
\item [Workflow-Eignung] \hfill \\
Die Eignung einer Bibliothek in existierende Workflows und Constraints übernommen zu werden. Maßgeblich,
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.
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.
@ -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
Kategorien vergeben. Nicht ermittelte Werte werden in ihrer Kategorie durch \enquote{$-$} repräsentiert, wodurch
eine weitere Verwendung ausgeschlossen wird.
Die Kumulativpunktzahl ($[0,30]$) einer Bibltiothek beschreibt deren Gesamteignung, nach subjektivem
Die Kumulativpunktzahl $[0,30]$ einer Bibltiothek beschreibt deren Gesamteignung, nach subjektivem
Empfinden des Autors.
\subsubsection*{Kjua}
Kjua ist funktional für dieses Projekt gut aufgestellt, da es optisch ansprechende QR-Codes mit Logo unterstützt. Das wird
\enquote{Kjua} ist funktional für dieses Projekt gut aufgestellt, da es optisch ansprechende QR-Codes mit Logo unterstützt. Das wird
mit acht Punkten in \enquote{Funktionalität} bemessen.
Kjua macht andererseits einen eher desolaten Eindruck und lässt somit begründete Zweifel an dessen Zukunftssicherheit zu.
\enquote{Kjua} macht andererseits einen eher desolaten Eindruck und lässt somit begründete Zweifel an dessen Zukunftssicherheit zu.
Eine knappe Dokumentation ist verfügbar. Für die Dokumentation werden zwei Punkte in \enquote{Gepflegtheit} angerechnet.
Kjua ist als Javascript-Bibliothek nur schwer mit den Anforderungen vereinbar,
\enquote{Kjua} ist als JavaScript-Bibliothek nur schwer mit den Anforderungen vereinbar,
da der QR-Code in einem PDF eingebunden werden soll. Hierfür ist ein serverseitiger PDF-Generator vorgesehen.
Kjuas Lizenz erlaubt Verwendung in kommerziellen, Closed-Source-Projekten \cite{bib:opensource-license-mit}.
\enquote{Kjuas} Lizenz erlaubt Verwendung in kommerziellen, Closed-Source-Projekten \cite{bib:opensource-license-mit}.
Die Exklusivität für Nutzung in Webbrowsern schließt eine Einbindung in den Workflow aus.
\begin{table}[htbp]
\centering
@ -153,13 +154,13 @@ Die Exklusivität für Nutzung in Webbrowsern schließt eine Einbindung in den W
\subsubsection*{Soldair/node-qrcode}
Soldairs Lösung sieht dokumentativ und funktional vielversprechend aus.
Hieraus bilden sich acht Punkte in \enquote{Funktionalität}.
Hierdurch bilden sich acht Punkte in \enquote{Funktionalität} ab.
Da diese Bibliothek eine Node.js-Bibliothek ist und Node.js ohne Browser, als Kommandozeilenapplikation, ausgeführt werden
kann \cite{bib:nodejs-api-cli}, bietet sich
Soldair/node-qrcode als serverseitige Anwendung an. Die Lizenz spricht nicht gegen eine Verwendung. Dennoch wäre es
ein vermeidbarer Mehraufwand generierte QR-Codes aus einer Node.JS-Applikation in eine PHP-Umgebung zu
kann \break\cite{bib:nodejs-api-cli}, bietet sich
\enquote{Soldair/node-qrcode} als serverseitige Anwendung an. Die Lizenz spricht nicht gegen eine Verwendung. Dennoch wäre es
ein vermeidbarer Mehraufwand generierte QR-Codes aus einer Node.js-Applikation in eine PHP-Umgebung zu
übertragen. Das bildet sich mit vier Punkten in \enquote{Workflow-Eignung} ab.
Darüberhinaus macht Soldair/node-qrcode einen verbesserungswürdigen Eindruck der Projektpflege, wofür es lediglich
Darüberhinaus macht \enquote{Soldair/node-qrcode} einen verbesserungswürdigen Eindruck der Projektpflege, wofür es lediglich
drei Punkte gibt.
\begin{table}[htbp]
\centering
@ -177,14 +178,14 @@ drei Punkte gibt.
Rochkos Lösung macht einen aktiv gepflegten Eindruck und wird von großen Downloadzahlen gestützt.
Rochko stellt eine ausführliche Dokumentation und Codebeispiele bereit.
Hierfür wird die volle Punktzahl in \enquote{Gepflegtheit} vergeben.
Der Funktionsumfang übersteigt weit die Anforderungen und gestattet so ausführlich gestaltete QR-Codes
Der Funktionsumfang übersteigt weit die Anforderungen und gestattet so ausführlich gestaltete QR-Codes zu generieren
\cite{bib:chillerlan-php-qrcode-demo},
die somit die hedonische Qualität fördern \cite{bib:koenig-vorlesung-ux}.
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}.
Die von Rochko verwendete Lizenz gestattet eine unkomplizierte Verwendung. Chillerlan/php-qrcode funktioniert sowohl mit
PHP $7.x$ als auch $8.x$. Die Bibliothek benötigt zwei weitere Abhängigkeiten. Eine dieser Abhängigkeiten ist ebenfalls von Rochko
Die von Rochko verwendete Lizenz gestattet eine unkomplizierte Verwendung. \enquote{Chillerlan/php-qrcode} funktioniert sowohl mit
PHP- $7.x$ als auch $8.x$. Die Bibliothek benötigt zwei weitere Abhängigkeiten. Eine dieser Abhängigkeiten ist ebenfalls von Rochko
bereitgestellt \cite{bib:chillerlan-php-qrcode-composerjson} und weist eine ähnlich gute Projektpflege auf
\cite{bib:chillerlan-php-settings-container}. Das wird mit der Maximalwertung in \enquote{Workflow-Eignung} berechnet.
\begin{table}[htbp]
@ -200,13 +201,13 @@ bereitgestellt \cite{bib:chillerlan-php-qrcode-composerjson} und weist eine ähn
\end{table}
\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.
In Anbetracht dessen, dass die Bibliothek de-facto sechseinhalb Jahre alt ist und seit vier Jahren nicht mehr
angepasst wurde, wird eine geringe Wertung von drei Punkten in \enquote{Gepflegtheit} vergeben.
Null Punkte in \enquote{Workflow-Eignung} rechtfertigen sich durch die Abwesenheit jeglicher
Unterstützung für Paketmanager, wodurch eine saubere Verwendung in dem Brown-Field-Projekt
Änderungen an der Bibliothek selbst erfordern würde.
Änderungen an der Bibliothek an sich erfordern würde.
Die Funktionalität wurde aufgrund der desaströsen Gepflegtheit und Eignung nicht näher untersucht,
da eine Verwendung selbst mit guter Funktionalität nicht infrage käme.
\begin{table}[htbp]
@ -222,16 +223,16 @@ da eine Verwendung selbst mit guter Funktionalität nicht infrage käme.
\end{table}
\subsubsection*{Bacon/BaconQrCode}
BaconQrCode nennt keine speziellen Optionen, um näheren Einfluss auf den generierten QR-Code auszuüben.
\enquote{BaconQrCode} nennt keine speziellen Optionen, um näheren Einfluss auf den generierten QR-Code auszuüben.
Es werden Rasterbilder und verschiedene Vektorformate als Renderziel unterstützt. Aufgrund der fehlenden Optionen,
die andere Bibliotheken bereitstellen, werden lediglich fünf von zehn Punkten für \enquote{Funktionalität} vergeben.
die andere Bibliotheken bereitstellen, werden lediglich fünf von zehn Punkten in \enquote{Funktionalität} vergeben.
Die Projektgepflegtheit ist inkonsistent. Manche Stellen, beispielsweise die Mitwirkenden, Alter des neuesten Commits, Tests
und Nutzerzahlen machen einen guten Eindruck, während Punkte wie die Dokumentation, die Organisationswebseite und andere
Projekte Sorgen begründen. Weil der Programmcode an sich gut gepflegt aussieht und große Downloadzahlen von
häufiger Verwendung sprechen, werden für die \enquote{Gepflegtheit} acht Punkte vergeben.
Da es sich hierbei um eine PHP-Bibliothek handelt, die über Composer in PHP- $7.x$ und $8.x$ Projekte geladen werden kann
und eine das Projekt API bereitstellt, ist die technische Workflow-Eignung gut. Die BSD-2-Clause-Lizenz verkompliziert eine Integration,
da somit eine Copyright-Notiz an Nutzer gezeigt werden muss \cite{bib:opensource-license-bsd-2}.
und das Projekt eine API bereitstellt, ist die technische Workflow-Eignung gut. Die BSD-2-Clause-Lizenz verkompliziert eine Integration,
da somit eine Copyright-Notiz an Nutzer gezeigt werden müsste \cite{bib:opensource-license-bsd-2}.
Dadurch werden drei Punkte einer vollkommenen Workflow-Eignung abgezogen, wodurch sieben Punkte vergeben werden.
\begin{table}[htbp]
\centering
@ -247,8 +248,8 @@ Dadurch werden drei Punkte einer vollkommenen Workflow-Eignung abgezogen, wodurc
\subsection{Fazit}
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.
Somit wird \textit{chillerlan/php-qrcode} als QR-Code Technologie in der Lösung dieser Problemstellung verwendet.
\break\enquote{chillerlan/php-qrcode} mit 30 Gesamtpunkten als die am besten geeignetste Bibliothek.
Somit wird \enquote{chillerlan/php-qrcode} als QR-Code Technologie in der Lösung dieser Problemstellung verwendet.
\begin{table}[htbp]
\centering
@ -269,12 +270,12 @@ Somit wird \textit{chillerlan/php-qrcode} als QR-Code Technologie in der Lösung
\end{table}
\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.
Um die projektübergreifende Kontinuität der Technik zu wahren und um somit die
Wartbarkeit und Nachhaltigkeit des hier behandelten Softwareproduktes
zu fördern, wird sich für den PDF-Generator entschieden, der bereits firmeninterner Standard ist.
Unabhängig dessen ist \textit{mpdf} ein gut gepflegtes Projekt mit einem Alter von mehr als acht Jahren,
Unabhängig dessen ist \enquote{mpdf} ein gut gepflegtes Projekt mit einem Alter von mehr als acht Jahren,
Sponsoren, 72 Entwicklern, über 31 Millionen Downloads, über 3.900 Sterne-Markierungen, über 800 Commits
und regelmäßigen Updates \cite{bib:mpdf-github}. Dadurch, dass \textit{mpdf} ein Composer-Paket für verschiede PHP-Versionen ist,
ist eine herausragende Workflow-Eignung gegeben \cite{bib:mpdf}.
und regelmäßigen Updates \cite{bib:mpdf-github}. \enquote{Mpdf} ein Composer-Paket und für verschiede PHP-Versionen verfügbar.
Mpdf verwendet eine GPL-2.0 Lizenz \cite{bib:mpdf}.

View File

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

View File

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

View File

@ -416,6 +416,14 @@
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,
author = {{TYPO3 Contributors}},
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">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</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.