2018-09-11 22:33:19 +02:00
|
|
|
#+title: Normfallstudie
|
|
|
|
:preamble:
|
|
|
|
#+setupfile: ~/nextcloud/03_documents/org/settings/html_theme/setup/theme-readtheorg.setup
|
|
|
|
#+author: Andreas Zweili
|
|
|
|
#+latex_header: \input{/home/andreas/git_repos/notes/settings/latex/style}
|
|
|
|
#+latex_class: article
|
|
|
|
#+latex_class_options: [a4paper,11pt]
|
|
|
|
#+latex_header: \input{general/style}
|
|
|
|
#+otions: H:5 todo:f
|
|
|
|
#+language: de
|
|
|
|
#+startup: align
|
|
|
|
#+bibliography: general/bibliography.bib
|
|
|
|
:end:
|
2018-09-12 20:27:26 +02:00
|
|
|
|
|
|
|
* Einführung
|
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
Aufgabe war es ein System aufzubauen, welches Hotelbetreibern und
|
|
|
|
Fluggesellschaften auf einfach Weise Last Minute Angebote zu erstellen und auf
|
|
|
|
den Markt zu bringen.
|
|
|
|
|
|
|
|
Das System sollte dann bei angeschlossenen Fluggesellschaften über einen WCF
|
|
|
|
Service nach passenden Flügen suchen und diese Verbindung dann als ein
|
|
|
|
Kombiangebot in der Datenbank speichern. Diese Kombiangebot sollte dann von
|
|
|
|
einem Kunden mithilfe einer WinForm/WPF Applikation gebucht werden können.
|
2018-09-12 20:27:26 +02:00
|
|
|
|
|
|
|
* Ziele
|
|
|
|
|
|
|
|
Aus der Aufgabenstellung lassen sich folgende Ziele an die Systeme ableiten.
|
|
|
|
|
2018-09-12 21:56:55 +02:00
|
|
|
|
2018-09-12 20:27:26 +02:00
|
|
|
- Die Datenbank wird in SQL Server umgesetzt.
|
|
|
|
- Als Programmiersprache wird C# mit .NET Framework eingesetzt.
|
|
|
|
- Hotels können ihre Zimmer inklusive Zusatzinformationen wie Ausstattung etc.
|
|
|
|
erfassen.
|
|
|
|
- Flüge werden in der Datenbank gespeichert.
|
|
|
|
- Die Kombiangebote werden auf der Plattform in der Datenbank gespeichert.
|
|
|
|
- Ein WinForm/WPF Client greift auf die Plattform zu und ruft die Kombiangebote
|
|
|
|
ab.
|
|
|
|
- Der Client kann Kombiangebote buchen.
|
|
|
|
- Der Client kann Kombiangebote für 10 Tage reservieren.
|
|
|
|
- Die Plattform bucht bezahlte Reservationen fix.
|
|
|
|
- Es müssen mehrere Fluggesellschaften angebunden werden.
|
|
|
|
- Der Service wird innerhalb von 2s aufgebaut, läuft mindestens 30 Tage durch,
|
|
|
|
bietet eine Verfügbarkeit von 0.995 und ist innerhalb von 0.5s ansprechbar.
|
|
|
|
- Es dürfen nur freie Flüge in Kombiangeboten vorkommen.
|
|
|
|
- Start- und Zielort des Fluges im Kombiangebot müssen passend zum Hotelzimmer
|
|
|
|
sein.
|
|
|
|
- Die Daten des Fluges müssen korrekt sein.
|
|
|
|
|
|
|
|
* Analyse
|
|
|
|
|
|
|
|
Aufgrund der Ziele wurden anschliessend folgende Diagramme ausgearbeitet.
|
|
|
|
|
|
|
|
** Verteilungsdiagramm
|
|
|
|
|
2018-09-12 21:56:55 +02:00
|
|
|
Das Verteilungsdiagramm, Abbildung:([[fig:verteilungsdiagramm]]), wurde im
|
2018-09-13 20:41:04 +02:00
|
|
|
Unterricht ausgearbeitet. Der Klasse erschien es am sinnvollsten, wenn die
|
2018-09-12 21:56:55 +02:00
|
|
|
Plattform als ASP.NET Applikation erstellt wird und somit auf dem IIS Web
|
|
|
|
Server läuft. Da die Plattform das zentrale System ist, ist es für die
|
2018-09-13 20:41:04 +02:00
|
|
|
Normfallstudie auch sinnvoll, wenn der Datenbank Server auf dem gleichen System
|
2018-09-12 21:56:55 +02:00
|
|
|
läuft wie die Plattform. In einer realen Umgebung müsste hier allenfalls eine
|
|
|
|
separater Server aufgesetzt werden. Der Airline Service und der WPF Client
|
2018-09-13 20:41:04 +02:00
|
|
|
wurden entsprechend der Vorgaben als externe Applikationen geplant.
|
2018-09-12 20:27:26 +02:00
|
|
|
|
|
|
|
#+LATEX:\newpage
|
|
|
|
#+LATEX:\begin{landscape}
|
|
|
|
#+CAPTION: Verteilungsdiagramm
|
|
|
|
#+ATTR_LATEX: :height.9\textwidth
|
|
|
|
#+NAME: fig:verteilungsdiagramm
|
|
|
|
[[file:pictures/verteilungsdiagramm.pdf]]
|
|
|
|
#+LATEX:\end{landscape}
|
|
|
|
#+LATEX:\newpage
|
|
|
|
|
2018-09-12 23:10:30 +02:00
|
|
|
** Relationales Modell
|
2018-09-12 21:56:55 +02:00
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
Das relationale Modell, Abbildung:([[fig:rm]]), wurde durch den Studenten vor gängig
|
|
|
|
zur Umsetzung erstellt. In der Abbildung:([[fig:rmentity]]) ist die das relationale
|
|
|
|
Modell zu sehen welches, dann durch das Entity Framework effektiv in der
|
|
|
|
Datenbank erstellt wurde. Wie man sieht, sind sich die beiden Diagramme sehr
|
|
|
|
ähnlich. Entity Framework erstellt beim Code First Ansatz die Datenbank
|
|
|
|
ziemlich genau so, wie man sie auch von Hand erstellen würde. Zumindest im Bezug
|
|
|
|
auf die Tabellen.
|
2018-09-12 20:27:26 +02:00
|
|
|
|
|
|
|
#+LATEX:\newpage
|
|
|
|
#+LATEX:\begin{landscape}
|
|
|
|
#+CAPTION: Relationen Modell
|
2018-09-12 21:56:55 +02:00
|
|
|
#+ATTR_LATEX: :height.8\textwidth
|
2018-09-12 20:27:26 +02:00
|
|
|
#+NAME: fig:rm
|
|
|
|
[[file:pictures/rm.pdf]]
|
|
|
|
#+LATEX:\end{landscape}
|
|
|
|
#+LATEX:\newpage
|
|
|
|
|
2018-09-12 21:56:55 +02:00
|
|
|
#+LATEX:\newpage
|
|
|
|
#+LATEX:\begin{landscape}
|
|
|
|
#+CAPTION: Relationen Modell
|
|
|
|
#+NAME: fig:rmentity
|
|
|
|
[[file:pictures/rmentity.png]]
|
|
|
|
#+LATEX:\end{landscape}
|
|
|
|
#+LATEX:\newpage
|
2018-09-12 20:27:26 +02:00
|
|
|
|
|
|
|
* Zugewiesene Ziele
|
|
|
|
|
2018-09-12 21:56:55 +02:00
|
|
|
Im Anschluss zu der Analyse hat der Student die Ziele den einzelnen
|
|
|
|
Applikationen zugewiesen. Dies sollte dazu dienen die Zuständigkeiten zu regeln.
|
|
|
|
|
|
|
|
** Airline Service
|
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
Da die Airlines alle Flugdaten zur Verfügung haben erschien es sinnvoll das
|
|
|
|
diese einen Service bereitstellen, welcher die Parameter Anzahl Passagiere,
|
2018-09-12 21:56:55 +02:00
|
|
|
Start- und Enddatum sowie die Destination aufnimmt. Der Service sollte dann im
|
2018-09-13 20:41:04 +02:00
|
|
|
Hintergrund automatisch die bereits besetzten Flüge und Flüge, welche nicht auf
|
|
|
|
die restlichen Parameter passen ausfiltern und nur passende Flüge ausgeben.
|
2018-09-12 21:56:55 +02:00
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
Des Weiteren sollte der Airline Service eine Möglichkeit bieten Flüge zu buchen
|
|
|
|
sowie zu stornieren. Im Code Ausschnitt:(\ref{airline}) sieht man die Signatur
|
2018-09-12 21:56:55 +02:00
|
|
|
des Airline Services. Respektive des Interfaces davon.
|
|
|
|
|
|
|
|
#+BEGIN_EXPORT latex
|
|
|
|
\label{airline}
|
|
|
|
\begin{sexylisting}{Airline Service}
|
|
|
|
[OperationContract]
|
|
|
|
Dictionary<string, List<Flight>> GetFlights(
|
|
|
|
DateTime startTime,
|
|
|
|
DateTime endTime,
|
|
|
|
string destination,
|
|
|
|
int numberOfSeats);
|
|
|
|
[OperationContract]
|
|
|
|
Flight BookFlight(Flight flight, int numberOfSeats);
|
|
|
|
[OperationContract]
|
|
|
|
Flight CancelFlight(Flight flight, int numberOfSeats);
|
|
|
|
\end{sexylisting}
|
|
|
|
#+END_EXPORT
|
2018-09-13 20:41:04 +02:00
|
|
|
#+latex: \newpage
|
2018-09-12 21:56:55 +02:00
|
|
|
Somit wurden dem Airline Service folgende Ziele zugewiesen:
|
|
|
|
- Es dürfen nur freie Flüge in Kombiangeboten vorkommen.
|
|
|
|
- Start- und Zielort des Fluges im Kombiangebot müssen passend zum Hotelzimmer
|
|
|
|
sein.
|
|
|
|
- Die Daten des Fluges müssen korrekt sein.
|
|
|
|
|
|
|
|
** Plattform
|
|
|
|
|
|
|
|
Die Plattform stellt den Grossteil der Logik und Funktionen bereit. Sie sollte
|
2018-09-13 20:41:04 +02:00
|
|
|
einerseits eine Möglichkeit bieten damit die Hotelbetreiber Zimmer und ihre
|
2018-09-12 21:56:55 +02:00
|
|
|
Hotels erfassen könne sowie das Matching zwischen Hotelzimmer und Flügen
|
|
|
|
erledigen.
|
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
Zusätzlich sollte sie die erstellten Kombiangebote und den WPF Client
|
|
|
|
weiterleiten können. Auch das Entgegennehmen der Bestellungen sowie
|
2018-09-12 21:56:55 +02:00
|
|
|
Reservationen des WPF Clients entgegennehmen und an den Airline Service
|
|
|
|
weiterleiten. Auch die Überprüfung der Reservationszeit sowie die entsprechende
|
2018-09-13 20:41:04 +02:00
|
|
|
Reaktion war für die Plattform geplant.
|
2018-09-12 21:56:55 +02:00
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
Zu guter Letzt sollten dann die reservierten respektive gebuchten Flüge an
|
2018-09-12 21:56:55 +02:00
|
|
|
die passende Airline zur Buchung weitergeleitet werden. Im Falle einer
|
|
|
|
Stornierung des Angebots müsste dann natürlich auch noch der Flug storniert
|
|
|
|
werden.
|
|
|
|
|
|
|
|
Der Plattform wurden somit folgende Ziele zugewiesen:
|
|
|
|
- Die Datenbank wird in SQL Server umgesetzt.
|
|
|
|
- Hotels können ihre Zimmer inklusive Zusatzinformationen wie Ausstattung etc.
|
|
|
|
erfassen.
|
|
|
|
- Flüge werden in der Datenbank gespeichert.
|
|
|
|
- Die Kombiangebote werden auf der Plattform in der Datenbank gespeichert.
|
|
|
|
- Ein WinForm/WPF Client greift auf die Plattform zu und ruft die Kombiangebote
|
|
|
|
ab.
|
|
|
|
- Der Client kann Kombiangebote buchen.
|
|
|
|
- Der Client kann Kombiangebote für 10 Tage reservieren.
|
|
|
|
- Die Plattform bucht bezahlte Reservationen fix.
|
|
|
|
- Es müssen mehrere Fluggesellschaften angebunden werden.
|
|
|
|
- Der Service wird innerhalb von 2s aufgebaut, läuft mindestens 30 Tage durch,
|
|
|
|
bietet eine Verfügbarkeit von 0.995 und ist innerhalb von 0.5s ansprechbar.
|
|
|
|
- Start- und Zielort des Fluges im Kombiangebot müssen passend zum Hotelzimmer
|
|
|
|
sein.
|
|
|
|
|
|
|
|
Die Signatur des Plattform Services ist im Codebeispiel:(\ref{plattform}) zu
|
|
|
|
sehen.
|
|
|
|
|
|
|
|
#+BEGIN_EXPORT latex
|
|
|
|
\label{plattform}
|
2018-09-13 20:41:04 +02:00
|
|
|
\begin{sexylisting}{Plattform Service}
|
2018-09-12 21:56:55 +02:00
|
|
|
[OperationContract]
|
|
|
|
List<SpecialOffer> GetSpecialOffers();
|
|
|
|
[OperationContract]
|
|
|
|
bool ReserveSpecialOffer(SpecialOffer offer);
|
|
|
|
[OperationContract]
|
|
|
|
bool BookSpecialOffer(SpecialOffer offer);
|
|
|
|
[OperationContract]
|
|
|
|
bool CancelSpecialOffer(SpecialOffer offer);
|
|
|
|
[OperationContract]
|
|
|
|
List<Gender> GetGenders();
|
|
|
|
[OperationContract]
|
|
|
|
List<Salutation> GetSalutations();
|
|
|
|
[OperationContract]
|
|
|
|
List<City> GetCities();
|
|
|
|
\end{sexylisting}
|
|
|
|
#+END_EXPORT
|
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
** WPF Client
|
2018-09-12 21:56:55 +02:00
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
Der WPF Client sollte nur aus einem simplen graphischen Interface bestehen,
|
2018-09-12 21:56:55 +02:00
|
|
|
welches einem User erlaubt hätte nach Städten und Daten zu filtern und ihm dann
|
|
|
|
die entsprechenden Kombiangebote angezeigt hätte. Das gewünschte Angebot hätte
|
|
|
|
er dann über den WCF Service auf der Plattform reservieren oder direkt buchen
|
2018-09-13 20:41:04 +02:00
|
|
|
können. Die folgenden zwei Screenshots, Abbildung:([[fig:wpf1]]) und ([[fig:wpf2]]),
|
|
|
|
zeigen einen frühen Stand des Clients.
|
2018-09-12 21:56:55 +02:00
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
#+CAPTION: Screenshot des Client Hauptfensters
|
2018-09-12 23:10:30 +02:00
|
|
|
#+ATTR_LATEX: :width .8\textwidth
|
2018-09-13 20:41:04 +02:00
|
|
|
#+NAME: fig:wpf1
|
2018-09-12 23:10:30 +02:00
|
|
|
[[file:pictures/wpf1.png]]
|
2018-09-12 21:56:55 +02:00
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
#+CAPTION: Screenshot der Kundendateneingabeform
|
|
|
|
#+ATTR_LATEX: :width 6cm
|
|
|
|
#+NAME: fig:wpf2
|
2018-09-12 23:10:30 +02:00
|
|
|
[[file:pictures/wpf2.png]]
|
2018-09-12 21:56:55 +02:00
|
|
|
|
2018-09-12 23:10:30 +02:00
|
|
|
* Offene Punkte
|
2018-09-12 21:56:55 +02:00
|
|
|
|
|
|
|
Aufgrund enormen Zeitmangels war es leider nicht möglich das Projekt zu
|
2018-09-13 20:41:04 +02:00
|
|
|
realisieren. In dieser Sektion soll ein kurzer Überblick darüber gegeben
|
|
|
|
werden, welche Punkte in welchem Teil des Projektes noch offen sind, nicht
|
|
|
|
fertigstellt sind oder überhaupt angegangen werden konnten.
|
2018-09-12 21:56:55 +02:00
|
|
|
|
|
|
|
** Airline Service
|
|
|
|
|
|
|
|
Soweit der Student dies zum jetzigen Zeitpunkt beurteilen kann ist der Airline
|
|
|
|
Service soweit abgeschlossen. In ersten nicht dokumentierter Tests wurden
|
|
|
|
zumindest die erwarteten Daten zurück geliefert.
|
|
|
|
|
2018-09-12 23:10:30 +02:00
|
|
|
** Plattform
|
2018-09-12 21:56:55 +02:00
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
Aufgrund eines Bugs, welcher auch mit Hilfe des Dozenten nicht behoben werden
|
|
|
|
konnte, ist es zurzeit nicht möglich die Plattform überhaupt zu starten. Das
|
2018-09-12 23:10:30 +02:00
|
|
|
Provisionieren der Datenbank schlägt mit dem folgenden Fehler fehl.
|
|
|
|
|
|
|
|
#+CAPTION: Plattform Error
|
|
|
|
#+BEGIN_EXAMPLE
|
|
|
|
MappingException: (6,10) : error 3004: Problem in mapping fragments
|
|
|
|
starting at line 6:No mapping specified for properties
|
|
|
|
Airline.ExtensionData in Set Airlines. An Entity with Key (PK) will
|
|
|
|
not round-trip when: Entity is type [Plattform.DB.Airline]
|
|
|
|
#+END_EXAMPLE
|
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
Für die Abgabe wurde ein früherer Stand des Codes ausgecheckt, welcher jedoch
|
|
|
|
insgesamt auch nicht so performt wie er sollte. Der Airline Service und die
|
|
|
|
Plattform lassen sich jedoch starten.
|
|
|
|
|
|
|
|
Die Zimmererfassung, Abbildung:([[fig:room]]), für die Hotels konnte zuvor
|
|
|
|
jedoch soweit fertigstellt werden. Der Hotelbetreiber kann den Raumtypen und
|
|
|
|
das Hotel auswählen, sowie die Daten angeben von wann bis wann der Raum frei
|
|
|
|
ist. Sollte der Raumtyp nicht existieren kann er in einer separaten Form,
|
|
|
|
Abbildung:([[fig:roomtype]]), erfasst werden. Gleiches gilt auch für das Hotel,
|
|
|
|
Abbildung:([[fig:hotel]]).
|
2018-09-12 21:56:55 +02:00
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
#+CAPTION: Screenshot der Raumeingabeform
|
|
|
|
#+ATTR_LATEX: :width 5cm
|
|
|
|
#+NAME: fig:room
|
|
|
|
[[file:pictures/selection.png]]
|
|
|
|
|
|
|
|
#+CAPTION: Screenshot der Raumtyp Erstellungsform
|
|
|
|
#+ATTR_LATEX: :width 5cm
|
|
|
|
#+NAME: fig:roomtype
|
|
|
|
[[file:pictures/roomtype.png]]
|
|
|
|
|
|
|
|
#+CAPTION: Screenshot der Hotel Erstellungsform
|
|
|
|
#+ATTR_LATEX: :width 5cm
|
|
|
|
#+NAME: fig:hotel
|
|
|
|
[[file:pictures/hotel.png]]
|
|
|
|
|
|
|
|
|
|
|
|
Bei der Plattform noch offene Punkte sind:
|
2018-09-12 21:56:55 +02:00
|
|
|
- Der Plattform Service ist mangels eines passenden Clients komplett
|
2018-09-13 20:41:04 +02:00
|
|
|
ungetestet. Somit ist unklar, ob die Buchung oder Reservationen der
|
2018-09-12 21:56:55 +02:00
|
|
|
Kombiangebote funktionieren.
|
2018-09-13 20:41:04 +02:00
|
|
|
- Flüge und ihre Randdaten werden in der Datenbank gespeichert.
|
2018-09-12 21:56:55 +02:00
|
|
|
- Kombiangebote werden in der Datenbank gespeichert.
|
2018-09-13 20:41:04 +02:00
|
|
|
- Zu buchende/stornierende Flüge werden an die Fluggesellschaften gemeldet.
|
2018-09-12 21:56:55 +02:00
|
|
|
- Der Service wird innerhalb von 2s aufgebaut, läuft mindestens 30 Tage durch,
|
|
|
|
bietet eine Verfügbarkeit von 0.995 und ist innerhalb von 0.5s ansprechbar.
|
|
|
|
- Bezahlte Reservationen werden fix gebucht.
|
|
|
|
|
|
|
|
** WPF Client
|
|
|
|
|
2018-09-13 20:41:04 +02:00
|
|
|
Vom WPF Client existiert zurzeit nur das Grundgerüst. Da die Plattform nicht
|
|
|
|
funktionsfähig war, hat der Student am WPF Client gearbeitet soweit es möglich
|
2018-09-12 21:56:55 +02:00
|
|
|
war. Allerdings war dies ohne den WCF Service der Plattform nur sehr beschränkt
|
2018-09-13 20:41:04 +02:00
|
|
|
möglich. Viel mehr als die grafische Oberfläche existiert zurzeit nicht.
|
2018-09-12 20:27:26 +02:00
|
|
|
|
|
|
|
* Fazit
|
|
|
|
|
|
|
|
Ein Booking System welches Kombiangebote wie in der Aufgabenstellung verlangt
|
2018-09-13 20:41:04 +02:00
|
|
|
bereitstellt ist eine unglaublich komplexes System. Das Matching der Flüge zu
|
|
|
|
passenden Hotelzimmer hat enorm viele Variablen welche berücksichtigt werden
|
|
|
|
müssen. Auch das Zusammenspiel des Clients zur Plattform bietet durchaus einige
|
|
|
|
Knackpunkte.
|
2018-09-12 20:27:26 +02:00
|
|
|
|
|
|
|
Dadurch lässt sich das Projekt in keiner Weise innerhalb von ca. 20 Stunden
|
2018-09-13 20:41:04 +02:00
|
|
|
erstellen. Der Student hat bereits weit über 40 Stunden in das Projekt in
|
|
|
|
Heimarbeit investiert und kein brauchbares Ergebnis erzielen können. Für den
|
|
|
|
Studenten ist dies eine enorm unbefriedigende Situation.
|
2018-09-12 20:27:26 +02:00
|
|
|
|
|
|
|
Das .NET und Entity Framework bieten einige interessante Features. Allerdings
|
2018-09-13 20:41:04 +02:00
|
|
|
wirkt der Code-First Ansatz von Entity Framework so, als ob die ganzen
|
2018-09-12 20:27:26 +02:00
|
|
|
Überprüfungen in der Applikation gemacht werden sollten anstatt in der
|
2018-09-13 20:41:04 +02:00
|
|
|
Datenbank. Allenfalls ist das noch eine Altlast von früher. Heutzutage gibt es
|
|
|
|
Frameworks die dies wesentlich eleganter lösen. Der Student findet dass, das
|
|
|
|
Framework die Datenbank so sauber wie möglich erstellen sollte und es dem
|
|
|
|
Entwickler möglichst einfach machen sollte erweiterte Features der Datenbank zu
|
|
|
|
nutzen.
|
2018-09-12 20:27:26 +02:00
|
|
|
|
|
|
|
Auch empfindet der Student C# eher als ungeeignet um innerhalb von so kurzer
|
2018-09-13 20:41:04 +02:00
|
|
|
Zeit ein Projekt zu realisieren Die Sprache fühlt sich dafür einfach zu sperrig
|
|
|
|
an. Die zusätzliche Komplexität durch Visual Studio ist leider nicht immer nur
|
2018-09-12 20:27:26 +02:00
|
|
|
eine Hilfe.
|
|
|
|
|
|
|
|
WCF Services sind in der Grundidee eine sehr interessante Technologie und der
|
2018-09-13 20:41:04 +02:00
|
|
|
Student wird WCF Services oder ähnliche Technologien in der Zukunft sicher
|
|
|
|
in Betracht ziehen. Insbesondere das Teilen der Klassen bietet interessante
|
2018-09-12 20:27:26 +02:00
|
|
|
Möglichkeiten.
|