:toc: macro
:company_name: Mampf
:glossar_ref: Siehe <<glossar, Glossar >>
= Pflichtenheft

[options="header"]
[cols="1, 1, 1, 1, 4"]
|===
|Version | Status      | Bearbeitungsdatum   | Autoren(en) |  Vermerk
|0.1     | In Arbeit   | 10.10.2021          | Autor       | Initiale Version
|===

== Inhaltsverzeichnis
toc::[]

== Zusammenfassung

Ziel des Projekts „Cateringservice“ ist es, eine web-basierte Java-Applikation für den Cateringservice „Mampf“ zu entwickeln. Dabei kann ein registrierter Kunde einen Auftrag gestalten, welcher dann von der Software geplant wird. Diese Automatisierung beinhaltet:

- Kundenverwaltung
- Hilfe bei der Personalverwaltung
- Personalzuteilung
- Termin- und Eventplanung inkl. Zubehör, Lebensmittelbedarf
- Vereinfachung der Kostenabrechnung und Arbeitszeitaufstellung

Zudem soll die Software diverse nicht-funktionale Kriterien, wie folgt, erfüllen:

- einfache Bedienbarkeit
- Absturzsicherheit
- einfache Erweiterbarkeit
- nachvollziehbare Strukturierung
- hohe Codequalität

Die Software gilt als fertig entwickelt und auslieferungsbereit, wenn die folgend in diesem Dokument aufgelisteten Akzeptanztest bestanden sind, auf welche sich mit dem Kunden geeinigt wurde.

== Aufgabenstellung

Da unser Auftraggeber Herr Wurst im Laufe der Zeit den großen Cateringservice Mampf aufgebaut hat,
benötigt er nun ein System, das ihm und seinen Kunden die Planung vereinfachen soll.
Mit dem Cateringservice soll er alle Abrechnungs-, Bestell- und Verwaltungsaufgaben einheitlich bearbeiten können.
Bisher nutze Herr Wurst dafür diverse
Programme und ärgerte sich immer wieder über deren Inkompatibilität zueinander und den Mehraufwand durch
getrennte Datenhaltung. Als Basis für die Systementwicklung gab er uns folgende Beschreibung seines kleinen
Unternehmens:

Das Unternehmen gliedert sich in vier Geschäftsfelder. Das Eventcatering übernimmt die Verpflegung bei großen Veranstaltungen,
egal ob in Form eines Buffetts oder als Galadinner. Auf Wunsch gestaltet Mampf auch das komplette Event, d.h. neben
den Speisen und Getränken wird auch Dekoration, Ausrüstung (also Geschirr, Tischtücher usw.) und Personal zur
Verfügung gestellt, wobei der Kunde dann natürlich zusätzlich zum eigentlichen Preis für Lebensmittel und Arbeitszeit
auch Leihgebühren und Personalkosten bezahlen muss. Der Partyservice beliefert private Feierlichkeiten mit kalten
Platten – von Hochzeiten und Beerdigungen über Gartenfeste bis zu Omas 75sten Geburtstag. Hierbei gibt es Festpreise
je nach Angebot und Personenanzahl (z.B. Schinkenplatte für 5 Personen zu 20,- EUR, Käseplatte für 3 Personen zu
12,50 EUR usw.) und Sonderaktionen (z.B. Sushi-Abend für 10 Personen). Eine Besonderheit von Mampf ist Mobile
Breakfast – ein mobiler Frühstücksservice für kleinere Firmen ohne eigene Kantine. Zu festgelegten Zeiten können die
Mitarbeiter sozusagen am Arbeitsplatz eine Auswahl an Frühstücksangeboten (belegte Brötchen, Müsli, Kaffee und Tee
usw.) kaufen. Die Firmen buchen das Angebot monatsweise. Problematisch ist allerdings die Planung dieses Angebotes
– hier wird derzeit noch nach einer kostensparenden Lösung (z.B. in Form einer Vorbestellung) gesucht. Immer beliebter
wird bei den Kunden auch das vierte Angebot von Mampf: Rent-a-Cook. Dabei wird Küchen- und Servicepersonal an
Privathaushalte verliehen, um z.B. den Chef des Gastgebers mit kulinarischen Köstlichkeiten zu beeindrucken. Um die
Lebensmittel müssen sich die Kunden dabei selbst kümmern.

Die wichtigsten Funktionen, die das System beinhalten soll, sind die Kundenverwaltung zu
unterstützen, die Personalverwaltung und -zuteilung übernehmen, die Termine planen, das Zubehör (Dekoration,
Ausrüstung) verwalten, den Lebensmittelbedarf bestimmen (Anzahl Gerichte/Platten/belegte Brötchen, Menge an
Getränken in Liter), die Rechnungsstellung an die Kunden vereinfachen und sämtliche Abrechnungen erleichtern. Die
Lebensmittelbeschaffung muss jedoch nicht betrachtet werden.
Am Ende soll der Cateringservice voll funktionstüchtig sein und alle bereits genannten Funktionen beinhalten. Ziel soll es sein,
durch eine zentralisierte Datenhaltung die Abläufe, insbesondere die Planung im Unternehemen effizienter zu gestalten.
Das System soll einfach erweiterbar sein, um neue Geschäftsfelder erschließen zu können.

Folgende Erklärungen hat der Auftraggeber auf Nachfrage mündlich bekannt gegeben:

Kunden müssen sich selbst registrieren können,
Aufträge buchen können,
und bei Bedarf ihr Konto löschen können.
Letzteres soll auch dem Administrator für beliebige Kunden möglich sein.
Dieser hat auch spezielle Übersichtsseiten zur Verwaltung des Betriebs zur Verfügung.
Aufträge können nur mit Bargeld bezahlt werden.
Die Zuteilung von Ressourcen zu einer Bestellung muss ohne manuelle Intervention geschehen.
Im Rahmen der oben genannten Sonderaktionen sollen bestimmte Angebote einen Aktionspreis besitzen
und besonders gekennzeichnet sein.
Die Buchung für Mobile Breakfast erfolgt monatsweise zu festen Zeitslots.
Dafür stehen mehrere Menüs zur Auswahl.
Unter Rechnung wird eine informelle Aufstellung der Bestellpositionen als PDF und Internetseite verstanden.
Mit Abrechnung ist eine informelle Aufstellung über die monatlich tatsächlich geleistete Arbeitszeit von Mitarbeitenden gemeint.
Technisch sollen Passwörter von Nutzerkonten nach aktuellem Standard gesichert gespeichert werden.

== Produktnutzung

Der Cateringservice soll als Website zu Verwaltungs- und Bestellzwecken genutzt werden.

Das System soll über einen Server laufen, damit die Kunden sowie das Personal jederzeit darauf zugreifen können.

Des Weiteren richtet sich das System an den Chef des Unternehmens sowie seine Kunden und soll deshalb von jeder Altersgruppen einfach zu bedienen sein. Außerdem sollte der Cateringservice alle wichtigen Funktionen eines Verwaltungs- und Planungsprogrammes enthalten und somit eine Übersicht bieten, die die Bearbeitung ohne viel Mehraufwand zulässig macht.


== Interessensgruppen (Stakeholders)

Eine Liste aller realen und juristischen Personen(-gruppen),
die Einfluss auf die Anforderungen im Projekt haben.

Die Prioritäten bringen die Interessensgruppen in eine Rangfolge,
wobei eine niedrigere Zahl eine höhere Priorität darstellt.

[options="header", cols="2, ^1, 4, 4"]
|===
|Name
|Priorität
|Beschreibung
|Ziele

|{company_name}
|1
|Der Kunde des Projektes.
a|
- Vereinfachung des Betriebsablaufes
- Steigerung der Effizienz
- Möglichkeit der Expansion

|Hannes Wurst
|3
|Geschäftsführer von {company_name}.
a|
- Zuverlässigkeit
- Vereinheitlichung der Verwaltungsaufgaben
- Überblick über aktuelle Tätigkeit der Firma

|Kunden von {company_name}
|2
|Personen(-gruppen), die mit der Software interagieren.
a|
- Einfache Bedienung
- Hohe Funktionalität
- Zuverlässigkeit

|Entwickler
|4
|Personen, welche die Software umsetzen.
a|
- Einfache Struktur
- Leichte Erweiterbarkeit
- Gute Dokumentation
|===


== Systemgrenze und Top-Level-Architektur

=== Kontextdiagramm

image::models/analysis/systemContextDiagram.svg[]

=== Top-Level-Architektur

image::models/analysis/topLevelArchitecture.svg[]

== Anwendungsfälle

=== Akteure

[cols="1h,2"]
|===
|Unregistrierter Nutzer
|{glossar_ref}

|Nutzer
|{glossar_ref}

|Kunde
|{glossar_ref}

|Administrator
|{glossar_ref}
|===

=== Anwendungsfalldiagramm / Use-Case Diagram

image::models/analysis/useCaseDiagram.svg[]

=== Anwendungsfallbeschreibung

===== Kundenverwaltung
[cols="1h,2"]
|===
|ID
|[UC0101]

|Name
|Kundendaten bearbeiten

|Beschreibung
|Der Nutzer verfügt über die Berechtigung die Daten eines Kunden (z.B. Rechnungsadresse) zu bearbeiten.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0102]

|Name
|Kundendaten einsehen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung die Daten eines Kunden einzusehen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0103]

|Name
|Kunden entfernen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung einen Kunden aus dem System zu entfernen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0104]

|Name
|Kunden hinzufügen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung einen neuen Kunden dem System hinzuzufügen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

===== Personalverwaltung
[cols="1h,2"]
|===
|ID
|[UC0201]

|Name
|Personal hinzufügen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung einen Angestelten dem System hinzuzufügen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0202]

|Name
|Personaldaten bearbeiten

|Beschreibung
|Der Nutzer verfügt über die Berechtigung die personbezogenen Daten eines Angestelten zu ändern (z.B. die Adresse).

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===
[cols="1h,2"]
|===
|ID
|[UC0203]

|Name
|Personaldaten einsehen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung die personbezogenen Daten eines Angestelten einzusehen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0204]

|Name
|Personal entfernen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung einen Angestelten aus dem System zu entfernen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0205]

|Name
|Personal einem Auftrag zuordnen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung einen Angestelten für einen Auftrag einzuteilen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

===== Rechnungswesen
[cols="1h,2"]
|===
|ID
|[UC0301]

|Name
|Rechnung hinzufügen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung eine Rechnung dem System hinzuzufügen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0302]

|Name
|Rechnungen bearbeiten

|Beschreibung
|Der Nutzer verfügt über die Berechtigung eine bereits vorhandene Rechnung zu bearbeiten.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0303]

|Name
|Rechnung bezahlen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung eine Rechnung als bezahlt einzustufen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0304]

|Name
|Rechnung einsehen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung den Inhalt einer Rechnung einzusehen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

===== Auftragverwaltung
[cols="1h,2"]
|===
|ID
|[U0401]

|Name
|Auftragsdaten bearbeiten

|Beschreibung
|Der Nutzer verfügt über die Berechtigung den Inhalt eines vorhandenen Auftrags zubearbeiten.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0402]

|Name
|Auftragsdaten einsehen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung den Inhalt eines vorhandenen Auftrags einzusehen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0403]

|Name
|Auftrag entfernen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung einen vorhandenen Auftrag aus dem System zu entfernen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0404]

|Name
|Auftrag hinzufügen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung einen Auftrag dem System hinzuzufügen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

===== Inventarverwaltung
[cols="1h,2"]
|===
|ID
|[UC0501]

|Name
|Inventar einsehen

|Beschreibung
|Der Nutzer verfügt über die Berechtigung das Inventar einzusehen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0502]

|Name
|Inventar bearbeiten

|Beschreibung
|Der Nutzer verfügt über die Berechtigung den Inhalt des Inventars zu bearbeiten.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

===== Administration
[cols="1h,2"]
|===
|ID
|[UC0601]

|Name
|Registrieten Nutzer hinzufügen

|Beschreibung
|Der Admin verfügt über die Berechtigung einen registrieten Nutzer anzulegen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

[cols="1h,2"]
|===
|ID
|[UC0602]

|Name
|Registrieten Nutzer entfernen

|Beschreibung
|Der Admin verfügt über die Berechtigung einen registrieten Nutzer aus dem System zu entfernen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

====== Oberfläche
[cols="1h,2"]
|===
|ID
|[UC0701]

|Name
|Login

|Beschreibung
|Der Nutzer verfügt über die Berechtigung die Login-Page aufzurufen.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===
[cols="1h,2"]

|===
|ID
|[UC0702]

|Name
|Logout

|Beschreibung
|Der Nutzer verfügt über die Berechtigung sich abzumelden.

|Akteure
|Registrieter Nutzer

|Trigger
|

|Bedingungen
|

|Essizielle Schritte
|

|Erweiterungen
|

|Funkionale Vorraussetzungen
|
|===

== Funktionale Anforderungen

Diese Tabelle gibt einen Überblick über die funktionalen Anforderungen des Systems.

Die Tabelle beinhaltet:

- den unique identifier der Anforderung (ID), der für Referenzierungen im Projekt genutzt wird
- die aktuelle Version der Anforderung, da sich die Anforderung im Verlauf des Projekts ändern kann
- Kurznamen der Anforderung
- Beschreibung der Anforderung

[options="header", cols="2h, 1, 3, 12"]
|===
|ID
|Version
|Kurzname
|Beschreibung


|[[F00010]]<<F00010>>
|v0.3
|Kunde registrieren
a|
Das System muss unregistrierten Nutzern und dem Administrator ermöglichen Kunden unter Angabe von

* Benutzername (einzigartig),
* Passwort,
* Rechnungsadresse

zu registrieren.
Nach der Registrierung muss das System muss den Nutzer nach der Registrierung authentifizieren können.


|[[F00011]]<<F00011>>
|v0.2
|Registrierung validieren
a|
Das System muss in der Lage sein die angegebenen Daten bei Kundenregistrierung validieren.
Die Einzigartigkeit des Nutzernamens muss garantiert werden.
Der Nutzer muss bei Verletzung jeglicher Beschränkungen informiert werden.


|[[F00012]]<<F00012>>
|v0.2
|Kunde authentifizieren
a|
Das System muss in einen öffentlich und einen privat Zugängliche Bereich pro registrierten Nutzer getrennt sein.
Das System muss registrierten Nutzern erlauben auf ihren privaten Bereich zuzugreifen, falls dieser Benutzername und Passwort angibt.


|[[F00013]]<<F00013>>
|v0.2
|Kunden auflisten
a|
Der Administrator muss alle Nutzer in Ansicht dargestellt bekommen.



|[[F00020]]<<F00020>>
|v0.2
|Auftrag erstellen
a|
Das System muss:

* registrierten Nutzern ermöglichen einen Auftrag zu erstellen
* jeden Auftrag validieren
* erstellenden Nutzer über jede Beschränkungsverletzungen in Kenntnis setzen
* einen Eintrag für den gewählten Zeitraum für alle Leistungen mit einem Zeitplan erstellen
* Auftragsdaten persistent speichern können


|[[F00021]]<<F00021>>
|v0.2
|Auftrag validieren
a|
Das System muss die Verfügbarkeit von Personal und Inventar für gewählten Auftrag bzw. Zeitraum prüfen können.


|[[F00022]]<<F00022>>
|v0.2
|Auftrag auflisten
a|
Administrator muss erstellte Aufträge in Ansicht dargestellt bekommen.


|[[F00023]]<<F00023>>
|v0.2
|Auftragsdetails einsehen
a|
Muss
* erstellenden Kunde und Administrator Kostenaufstellung einsehbar machen
* dem Administrator Lebensmittel-/Verbrauchsartikelbedarfbestimmung anbieten


|[[F000024]]<<F000024>>
|v0.2
|Auftrag filtern
a|
Administrator muss erstellte Aufträge nach Status (GEPLANT,BEENDET,ABGESAGT;BEZAHLT,UNBEZAHLT) filtern können


|[[F00025]]<<F00025>>
|v0.2
|Auftrag archivieren
a|
Das System muss in der Lage sein einen Auftrag zu archivieren.
Ein Auftrag ist archiviert, wenn sein Status *BEENDET* ist



|[[F00030]]<<F00030>>
|v0.2
|Personal auflisten
a|
Administrator muss angestelltes Personal in Ansicht dargestellt bekommen.


|[[F00031]]<<F00031>>
|v0.2
|Personal einstellen
a|
Administrator muss Personal jeder Gruppe hinzufügen können.


|[[F00032]]<<F00032>>
|v0.2
|Personal entlassen
a|
Administrator muss Personal jeder Gruppe entfernen können.

|[[F00033]]<<F00033>>
|v0.2
|Personal auf Verfügbarkeit für Auftrag prüfen
a|
Das System muss Personal für jeden Zeitpunkt auf Anzahl pro Gruppe prüfen können.


|[[F00040]]<<F00040>>
|v0.2
|Inventar auflisten
a|
Administrator muss Inventar in Ansicht dargestellt bekommen.


|[[F00041]]<<F00041>>
|v0.2
|Inventarstückzahl ändern
a|
Das System muss dem Administrator ermöglichen, die Stückzahl von Materialien im Inventar zu erhöhen und zu verringern.


|[[F00050]]<<F00050>>
|v0.2
|Kostenabrechnung erstellen
a|
Das System muss aus den Leistungen eines Auftrags die Kosten für den Auftrag berechnen können.


|[[F00051]]<<F00051>>
|v0.2
|Kostenabrechnung bezahlen
a|
Das System muss dem Administrator ermöglichen den Status einer Rechnung beliebig zwischen BEZAHLT und UNBEZAHLT zu ändern.


|[[F00060]]<<F00060>>
|v0.1
|Lebensmittel-/Verbrauchsartikelbedarf bestimmen
a|
Das System muss

* vollautomatisch die Menge an Lebensmitteln/Verbrauchsmaterialien für einen Auftrag bestimmen können,
* dem Administrator in der Detailansicht diese Menge an Lebensmitteln/Verbrauchsmaterialien für einen erstellten Auftrag <<F00020>> anzeigen.

|===

== Nicht-Funktionale Anforderungen

=== Qualitätsziele


[options="header"]
[cols="4,1"]
|===
| Qualitätsziel | Priorität (hoch - mittel - gering)
| einfache Bedienbarkeit (für Nicht-Informatiker) | hoch
| Absturzsicherheit | hoch
| einfache Erweiterbarkeit | mittel
| nachvollziehbare Strukturierung | mittel
| hohe Codequalität | mittel
|===

=== Konkrete Nicht-Funktionale Anforderungen

==== Einfache Bedienbarkeit
- Interaktion vollständig über Knöpfe und Textfelder
- fehlerhafte Nutzereingaben werden dem Nutzer direkt mitgeteilt
- intuitives Design z. B. des Menüs

==== Absturzsicherheit
- fehlerhafte Eingaben der Nutzer dürfen nicht zu Abstürzen führen

==== Einfache Erweiterbarkeit
- Software muss so entworfen sein, dass einfach neue Produkte oder Dienstleistungen ergänzt werden können

==== Nachvollziehbare Strukturierung
- das Design der Software muss sich an bekannten und geeigneten Entwurfsmustern orientieren

==== Hohe Codequalität
- verständliche Dokumentation von Objekten und dessen Methoden

== GUI Prototyp

Die folgenden Bilder sollen darstellen, wie die grafische Oberfläche aussehen soll, wobei das Design zweitranging, die Funktionalität priorisiert ist.

[[home_image]]
image::./models/mockups/startseite.svg[Startseite, 100%, 100%, pdfwidth=100%, title="Startseite", align=center]
[small]_Buttons in der Navigationsleiste dienen dem Scrollen auf die unterhalb liegenden Bereiche. Von anderen Unterseiten aus wird die Startseite geöffnet_

[[login_image]]
image::./models/mockups/login.svg[Loginseite, 100%, 100%, pdfwidth=100%, title="Loginseite", align=center]

[[register_image]]
image::./models/mockups/registrierung.svg[Registrierungsseite, 100%, 100%, pdfwidth=100%, title="Registrierungsseite", align=center]

[[produktseite_image]]
image::./models/mockups/produktseite.svg[Produktseite, 100%, 100%, pdfwidth=100%, title="Produktseite", align=center]

[[warenkorb_image]]
image::./models/mockups/warenkorb.svg[Warenkorb, 100%, 100%, pdfwidth=100%, title="Warenkorb", align=center]
[small]_Der Warenkorb ist über das Profil erreichbar._

[[administration_image]]
image::./models/mockups/administration.svg[Administration, 100%, 100%, pdfwidth=100%, title="Administration", align=center]

[[lagerverwaltung_image]]
image::./models/mockups/lagerverwaltung.svg[Lagerverwaltung, 100%, 100%, pdfwidth=100%, title="Lagerverwaltung", align=center]

[[personalverwaltung_image]]
image::./models/mockups/personalverwaltung.svg[Personalverwaltung, 100%, 100%, pdfwidth=100%, title="Personalverwaltung", align=center]

[[kundenverwaltung_image]]
image::./models/mockups/kundenverwaltung.svg[Kundenverwaltung, 100%, 100%, pdfwidth=100%, title="Kundenverwaltung", align=center]

[[terminkalender_image]]
image::./models/mockups/terminkalender.svg[Terminkalender, 100%, 100%, pdfwidth=100%, title="Terminkalender", align=center]

== Datenmodell

=== Überblick: Klassendiagramm

image::models/analysis/domain.svg[]

=== Klassen und Enumerationen
Dieser Abschnitt stellt eine Vereinigung von Glossar und der Beschreibung von Klassen/Enumerationen dar. Jede Klasse und Enumeration wird in Form eines Glossars textuell beschrieben. Zusätzlich werden eventuellen Konsistenz- und Formatierungsregeln aufgeführt.

[options="header", cols="1h,5"]
[[classes_enumerations]]
|===
| Klasse/Enumeration     | Beschreibung
| Catering               | Hauptklasse, die den Cateringservice darstellt.
| Personal               | Sammlung von Beschäftigen von Mampf (ohne Zugriff auf das System), Küchen- und Servicepersonal.
| Mitarbeiter            | Person, die bei {company_name} angestellt ist.
| Arbeitszeitaufstellung | Informelle Aufstellung über die monatlich geleistete Arbeitszeit eines Mitarbeiters.
| Inventar               | Sammlung von Leih- und Verbrauchsmaterial (inkl. Stückzahl).
| Verbrauchsmaterial     | Gegenstände, welche einem Event zugeordnet werden und anschließend verbraucht sind.
| Leihmaterial           | Gegenstände, welche über einen festen Zeitraum vermietet werden können.
| Aufträge               | Sammlung aller Aufträge.
| Auftrag                | Sammlung von Leistungen eines Geschäftsfeldes über einen konkreten Zeitraum inklusive Personal, Leih- und Verbrauchsmaterial (z. B. Buchung von Rent-a-Cook).
| Kostenabrechnung       | Informelle Kostenaufstellung mit Endsumme für einen konkreten Auftrag.
| AuftragsStatus         | Der Status des Auftrages. +
_GEPLANT_: Auftrag wurde gebucht. Dies beinhaltet die komplette Zeit von Buchung bis zum Abschluss des Auftrages. +
_BEENDET_: Auftrag wurde erfolgreich abgeschlossen. +
_ABGESAGT_: Auftrag wurde widerrufen oder gekündigt.
| Eventcatering          | Auftrag über die Übernahme von Verpflegung bei einer großen Veranstaltung.
| VollEventcatering      | Erweiterung von Eventcatering um Dekoration, Ausrüstung und Personal.
| PartyService           | Auftrag über die Belieferung von privaten Feierlichkeiten mit kalten Platten.
| MobileBreakfast        | Auftrag über Beliferung von kleineren Firmen mit Frühstück für die Angestellten.
| RentACook              | Auftrag über Verleihung von Küchen- und Servicepersonal an Privathaushalte.
| NutzerDatenbank        | Sammlung aller (registrierten) Nutzer des Systems.
| Nutzer                 | Abstraktion über Administrator und Kunde
| Kunde                  | Als Kunde angemeldeter Nutzer (ein Kunde von Mampf).
| Administrator          | Als Administrator angemeldeter Nutzer (i. d. R. Hannes Wurst).
|===

== Akzeptanztestfälle

[cols="1h, 4"]
[[AT0101]]
|===
|ID            |<<AT0101>>
|Anwendungsfall|<<UC0101>>
|Voraussetzung |Ein registrierter Nutzer ist im System angemeldet und betrachtet Kundendaten.
|Ereignis      |Der Nutzer wählt einen Kunden aus und aktualisiert die Rechnungsadresse.
|Ergebnis      |Die Kundendaten werden erfolgreich aktualisiert und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0102]]
|===
|ID            |<<AT0102>>
|Anwendungsfall|<<UC0102>>
|Voraussetzung |Ein registrierter Nutzer ist im System angemeldet.
|Ereignis      |Der Nutzer navigiert, um Kundendaten anzusehen.
|Ergebnis      |Die Kundendaten werden dem Nutzer angezeigt.
|===

[cols="1h, 4"]
[[AT0103]]
|===
|ID            |<<AT0103>>
|Anwendungsfall|<<UC0103>>
|Voraussetzung |Ein registrierter Nutzer ist im System angemeldet und betrachtet Kundendaten.
|Ereignis      |Der Nutzer wählt einen Kunden aus und entscheidet, den Kunden zu entfernen.
|Ergebnis      |Der Kunde wird aus dem System entfernt und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0104]]
|===
|ID            |<<AT0104>>
|Anwendungsfall|<<UC0104>>
|Vor           |Ein registrierter Nutzer ist im Cateringservice/System angemeldet.
|Ereignis      |Der Nutzer versucht, sich aus dem System auszuloggen.
|Ergebnis      |Der Nutzer wird erfolgreich ausgeloggt und wird zur Startseite umgeleitet.
|===

[cols="1h, 4"]
[[AT0201]]
|===
|ID            |<<AT0201>>
|Anwendungsfall|<<UC0201>>
|Vor           |Ein Nutzer besucht die Webseite des Cateringservice.
|Ereignis      |Der Nutzer füllt das Registrierungsformular aus und sendet es ab.
|Ergebnis      |Der Nutzer wird erfolgreich registriert und erhält eine Bestätigung per E-Mail.
|===

[cols="1h, 4"]
[[AT0202]]
|===
|ID            |<<AT0202>>
|Anwendungsfall|<<UC0202>>
|Vor           |Ein registrierter Nutzer hat sein Passwort vergessen und besucht die "Passwort vergessen"-Seite.
|Ereignis      |Der Nutzer gibt seine E-Mail-Adresse ein und fordert ein neues Passwort an.
|Ergebnis      |Ein Link zum Zurücksetzen des Passworts wird an die E-Mail-Adresse des Nutzers gesendet.
|===

[cols="1h, 4"]
[[AT0203]]
|===
|ID            |<<AT0203>>
|Anwendungsfall|<<UC0203>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet.
|Ereignis      |Der Nutzer navigiert, um Mitarbeiterdaten anzusehen.
|Ergebnis      |Die Mitarbeiterdaten werden dem Nutzer angezeigt.
|===

[cols="1h, 4"]
[[AT0204]]
|===
|ID            |<<AT0204>>
|Anwendungsfall|<<UC0204>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet und betrachtet Mitarbeiterdaten.
|Ereignis      |Der Nutzer wählt einen Mitarbeiter aus und entscheidet, diesen zu entfernen.
|Ergebnis      |Der Mitarbeiter wird aus dem System entfernt und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0205]]
|===
|ID            |<<AT0205>>
|Anwendungsfall|<<UC0205>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet und betrachtet Zuordnungsoptionen.
|Ereignis      |Der Nutzer wählt einen Mitarbeiter aus und weist ihm eine spezifische Aufgabe zu.
|Ergebnis      |Der Mitarbeiter wird erfolgreich der Aufgabe zugewiesen, und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0301]]
|===
|ID            |<<AT0301>>
|Anwendungsfall|<<UC0301>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet.
|Ereignis      |Der Nutzer entscheidet, eine neue Rechnung hinzuzufügen und gibt die erforderlichen Details an.
|Ergebnis      |Die neue Rechnung wird erfolgreich hinzugefügt, und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0302]]
|===
|ID            |<<AT0302>>
|Anwendungsfall|<<UC0302>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet und betrachtet Rechnungsdaten.
|Ereignis      |Der Nutzer wählt eine Rechnung aus und aktualisiert deren Details.
|Ergebnis      |Die Rechnungsdaten werden erfolgreich aktualisiert und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0303]]
|===
|ID            |<<AT0303>>
|Anwendungsfall|<<UC0303>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet und betrachtet unbezahlte Rechnungen.
|Ereignis      |Der Nutzer wählt eine Rechnung aus und markiert sie als bezahlt.
|Ergebnis      |Der Rechnungsstatus ändert sich auf 'Bezahlt' und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0304]]
|===
|ID            |<<AT0304>>
|Anwendungsfall|<<UC0304>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet.
|Ereignis      |Der Nutzer navigiert, um den Inhalt einer Rechnung anzusehen.
|Ergebnis      |Der Inhalt der Rechnung wird dem Nutzer angezeigt.
|===

[cols="1h, 4"]
[[AT0401]]
|===
|ID            |<<AT0401>>
|Anwendungsfall|<<U0401>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet und betrachtet Bestelldaten.
|Ereignis      |Der Nutzer wählt eine Bestellung aus und aktualisiert deren Details.
|Ergebnis      |Die Bestelldaten werden erfolgreich aktualisiert und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0402]]
|===
|ID            |<<AT0402>>
|Anwendungsfall|<<UC0402>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet.
|Ereignis      |Der Nutzer navigiert, um Bestelldaten anzusehen.
|Ergebnis      |Die Bestelldaten werden dem Nutzer angezeigt.
|===

[cols="1h, 4"]
[[AT0403]]
|===
|ID            |<<AT0403>>
|Anwendungsfall|<<UC0403>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet und betrachtet Bestelldaten.
|Ereignis      |Der Nutzer wählt eine Bestellung aus und entscheidet, sie zu entfernen.
|Ergebnis      |Die Bestellung wird aus dem System entfernt und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0404]]
|===
|ID            |<<AT0404>>
|Anwendungsfall|<<UC0404>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet.
|Ereignis      |Der Nutzer entscheidet, eine neue Bestellung hinzuzufügen und gibt die notwendigen Details an.
|Ergebnis      |Die neue Bestellung wird erfolgreich hinzugefügt und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0501]]
|===
|ID            |<<AT0501>>
|Anwendungsfall|<<UC0501>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet.
|Ereignis      |Der Nutzer navigiert zum Inventarbereich, um Artikel anzusehen.
|Ergebnis      |Der Inhalt des Inventars wird dem Nutzer angezeigt.
|===

[cols="1h, 4"]
[[AT0502]]
|===
|ID            |<<AT0502>>
|Anwendungsfall|<<UC0502>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet und betrachtet den Inventarbereich.
|Ereignis      |Der Nutzer wählt einen Artikel aus und aktualisiert dessen Details.
|Ergebnis      |Die Artikelinformationen werden erfolgreich aktualisiert und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0601]]
|===
|ID            |<<AT0601>>
|Anwendungsfall|<<UC0601>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet und betrachtet Kundeninformationen.
|Ereignis      |Der Nutzer wählt einen Kunden aus und entscheidet, ihn zu entfernen.
|Ergebnis      |Der Kunde wird aus dem System entfernt und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0602]]
|===
|ID            |<<AT0602>>
|Anwendungsfall|<<UC0602>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet.
|Ereignis      |Der Nutzer entscheidet, einen neuen Kunden zum System hinzuzufügen und gibt die notwendigen Details an.
|Ergebnis      |Der neue Kunde wird erfolgreich zum System hinzugefügt und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0701]]
|===
|ID            |<<AT0701>>
|Anwendungsfall|<<UC0701>>
|Vor           |Ein registrierter Nutzer ist im System angemeldet und betrachtet Lieferantendaten.
|Ereignis      |Der Nutzer wählt einen Lieferanten aus und aktualisiert dessen Daten.
|Ergebnis      |Die Daten des Lieferanten werden erfolgreich aktualisiert und eine Bestätigungsnachricht wird angezeigt.
|===

[cols="1h, 4"]
[[AT0702]]
|===
|ID            |<<AT0702>>
|Anwendungsfall|<<UC0702>>
|Voraussetzung   |Ein registrierter Nutzer ist im System angemeldet.
|Ereignis      |Der Nutzer wählt die Option "Abmelden".
|Ergebnis      |Der Nutzer wird erfolgreich abgemeldet und eine Bestätigungsnachricht oder die Anmeldeseite wird angezeigt.
|===

[cols="1h, 4"]
[[ATE0101]]
|===
|ID            |<<ATE0101>>
|Anwendungsfall|<<UC0101>>
|Vor           |Ein registrierter Nutzer ist im System eingeloggt.
|Ereignis      |Der Nutzer versucht, Kundendaten zu bearbeiten, die im System nicht existieren (z. B. eine ungültige Kunden-ID).
|Ergebnis      |Das System gibt eine Fehlermeldung zurück, die besagt, dass die Kundendaten nicht existieren.
|===

[cols="1h, 4"]
[[ATE0201]]
|===
|ID            |<<ATE0201>>
|Anwendungsfall|<<UC0204>>
|Vor           |Ein registrierter Nutzer ist im System eingeloggt und ein Mitarbeiter ist einer aktiven Aufgabe zugewiesen.
|Ereignis      |Der Nutzer versucht, einen Mitarbeiter zu entfernen, der derzeit einer laufenden Aufgabe oder Bestellung zugewiesen ist.
|Ergebnis      |Das System gibt eine Fehler- oder Warnmeldung zurück, die besagt, dass der Mitarbeiter derzeit zugewiesen ist und nicht entfernt werden kann, bis er neu zugewiesen ist oder die Aufgabe abgeschlossen ist.
|===

[cols="1h, 4"]
[[ATE0301]]
|===
|ID            |<<ATE0301>>
|Anwendungsfall|<<UC0303>>
|Vor           |Ein registrierter Nutzer ist im System eingeloggt.
|Ereignis      |Der Nutzer versucht, eine Rechnung als bezahlt zu markieren, die bereits als bezahlt markiert wurde.
|Ergebnis      |Das System gibt eine Fehlermeldung zurück, die besagt, dass die Rechnung bereits bezahlt wurde.
|===

[cols="1h, 4"]
[[ATE0401]]
|===
|ID            |<<ATE0401>>
|Anwendungsfall|<<UC0404>>
|Vor           |Ein registrierter Nutzer ist im System eingeloggt.
|Ereignis      |Der Nutzer versucht, eine neue Bestellung hinzuzufügen, gibt jedoch unvollständige oder ungültige Daten an.
|Ergebnis      |Das System gibt eine Fehlermeldung zurück, die angibt, welcher Teil der Daten fehlt oder ungültig ist.
|===

[cols="1h, 4"]
[[ATE0701]]
|===
|ID            |<<ATE0701>>
|Anwendungsfall|<<UC0701>>
|Vor           |Ein Nutzer greift auf die Website des Systems zu, sein Konto wurde jedoch aufgrund mehrerer fehlgeschlagener Anmeldeversuche gesperrt.
|Ereignis      |Der Nutzer versucht sich mit den gesperrten Anmeldeinformationen anzumelden.
|Ergebnis      |Das System gibt eine Fehlermeldung zurück die besagt, dass das Konto gesperrt ist und möglicherweise Anweisungen gibt, wie das Konto entsperrt oder zurückgesetzt werden kann.
|===

== Glossar

:domain_ref: Siehe <<classes_enumerations, Datenmodell>>

[options="header"]
[cols="1h,4"]
[[glossar]]
|===
| Begriff | Beschreibung
| Nutzer | {domain_ref}
| Kunde | {domain_ref}
| unregistrierter Nutzer | Nutzer vor der Registrierung
| Administrator | {domain_ref}
| Cateringservice/System | zu entwickelnde Software für Herrn Wurst
| Zubehör/Leihmaterial | Gegenstände, welche über einen festen Zeitraum vermietet werden können
| Lebensmittel/Verbrauchsmaterial | {domain_ref}
| Auftrag | {domain_ref}
| Personal | {domain_ref}
| Inventar | {domain_ref}
| Kostenabrechnung | {domain_ref}
| Geschäftsfelder | Rent-a-Cook, Eventcatering, Partyservice, Mobile Breakfast
| UVP | Preis eines Produkts für den Kunden
| Einkaufspreis | Preis eines Produkts vor Steuern
| monatlich/Geschäftsmonat | Zeitraum vom 1. bis letzten Tag des Monats
|===

== Offene Punkte
Offene Punkte werden entweder direkt in der Spezifikation notiert. Wenn das Pflichtenheft zum finalen Review vorgelegt wird, sollte es keine offenen Punkte mehr geben.
