# Modellierung Verleih



## AndiE (23. Okt 2020)

Hallo

ich knabbere seiit längerem über ein  Problem. Es ist ein privates projekt hat also mit Studium oder Firma nichts zu tun.

Es geht um eine Firma, die Dinge verleiht. Dabei können verschiedenen Dinge zu unterschiedlichen Zeiträumen verliehen werden. aber eben nicht zwei mal zur selben Zeit. 

Wie modelliert man das am besten?

Ich habe mich für eine Idee entschieden, halte sie aber nicht für den günstigsten Wer sich erinnert, es gab früher große tafeln, bei denen oben das Datum und links die Maschinen aufgelistet waren. In den Kästchen die sich im Schnittpunkt befanden hat man dann mit verschiedenen Magnetplättchen angegeben, ob das gerät vorbestellt oder ausgeliehen wurde. 

Wenn ich das modelliere dann habe ich eine Liste von Date die eine Liste von RentItems enthalten. Die Objekte RentItem enthalten dann die OrderID, die ItemID und einen String state der "reserved, out, back, avaible, payed, defect" für AnforderungsID, ID des Gerätes und den Status "reserviert, geliefert zuückgebracht, Verleih möglich, bezahlt, defekt".

Die Schwierigkeit ist aber momentan noch, dass es für einen längeren Zeitraum so umständlich ist. Wenn ich eine Maschine für z.B. 5 Tage vermiete, dann muss das System in fünf Dateobjekten die Maschine suchen und dort ändern. 

Es gibt natürlich noch die OrderList und die ItemList die die Ids bereitstellen. 

Ist es überhaupt sinnvoll, ein Date-Objekt so zu nutzen.

S


----------



## mrBrown (23. Okt 2020)

Modellier so, dass deine (je nach eigenem Alter) Großeltern oder Enkelkinder es verstehen  Hilfreich ist dabei, das ganz in Muttersprache zu formulieren und keinerlei Java-Datentypen zu nutzen (und ja, das meint auch kein String).




AndiE hat gesagt.:


> Wenn ich das modelliere dann habe ich eine Liste von Date die eine Liste von RentItems enthalten.



Wenn du jetzt irgendwem das erkläre solltest, würdest du dann wirklich sagen, du hast eine Liste von Tagen?

Oder vielleicht eher du hast mehrere "verleihbare Dinge"?


----------



## AndiE (23. Okt 2020)

Von der UseStory her würde ich etwas so denken:

Die Firma AMV (Arbeitsmaschinenverleih) verleiht Maschinen an Kunden. Dazu besitzt die Firma einen Maschinenpark. natürlich kann eine Maschine nur einmal am Tag ausgeliehen werden. Der verlieh kostet einen Leihbetrag.

Der Kunde ordert die gewünschten Maschinentypen für einen Zeitraum. Ist dies Möglich erhält der Kunde eine Zusage und die maschinen werden als für den Kunden reserviert in diesem Zeitraum im System gespeichert. Damit kann der Dispatcher diese Maschinen kein zweites Mal vermieten. Die Maschinen werden abgeholt und auch ihr Status verändert sich entsprechend in "verliehen". Auch der Status des Auftrages ändert sich in "ausgeführt". Nach der festgelegten Zeit sollten die Maschinen wieder in der Firma landen also den Status haben "verfügbar". Der Auftrag hat dann den Status "abgeschlossen". Wenn Maschinen zu spät zurückgegeben werden haben sie den Status "überfällig".  ist der Vorgang "abgeschlosse", sind also alle Maschinen wieder abgegeben worden erfolgt die Rechnungslegung.  Nach erfolgter Bezahlung wird der Auftrag den Status bekommen "erledigt". 

Unterm Strich ist nun eine bestimmte Maschine an einem bestimmten Tag aufgrund eines Auftrages einem bestimmten Kunden zugeordnet oder aber noch verfügbar sein. Die Zuordnung kann "reserviert" oder "ausgeliefert" sein. 

Über die Zeit kann der Kunde eine Maschine natürlich mehrmals leihen, wenn auch mit unterschiedlichen Aufträgen.

Es gibt also Auftrag, Maschine und Datum als "Kardialitäten".

An einem Datum können mehrere Aufträge anfallen.
Eine Maschine kann zu unterschiedlichen Daten ausgeliehen werden.
Ein Auftrag kann mehrere Maschinen enthalten.
Ein Auftrag kann über mehrere Tage gehen.
Verschiedene Aufträge können die gleichen Maschinen enthalten.
Eine Maschine kann über mehrere Tage verliehen werden.

Das sind also 3 mal m:n-Beziehungen die es aufzulösen gilt. Und da ist Oma und Enkel raus.


----------



## LimDul (23. Okt 2020)

Du denkst viel zu komplex. 

Was sind überhaupt deine Objekte bzw. Entitäten? Ich sehe da aktuell nur zwei - Aufträge und Maschine.


----------



## mihe7 (23. Okt 2020)

AndiE hat gesagt.:


> Dazu besitzt die Firma einen Maschinenpark. natürlich kann eine Maschine nur einmal am Tag ausgeliehen werden.


Warum natürlich?



AndiE hat gesagt.:


> Das sind also 3 mal m:n-Beziehungen die es aufzulösen gilt. Und da ist Oma und Enkel raus.


Naja, im einfachsten Fall hast Du einen "Verleih" mit Zeitraum, Status und Kunde sowie einer Liste von Maschinen, die "Teil des Verleihs" sind.


----------



## AndiE (24. Okt 2020)

Wenn ich LimDul folge dann habe ich tatsächlich nur Aufträge und Maschinen die in diesem Zusammenhang mit einer einmaligen Id ausgestattet sein müssen. Später evtl noch der Kunde aber das spielt ja hier erstmal keine Rolle.

Wenn ich das jetzt weiterspinne, dann habe ich im DDD-Sinne eine Klasse Auftrag, eine AuftragRepositiry und eine AuftragService Klasse. Analog bei der Entity Maschine. 

Dann würde eine Methode "Auftragsservice.zeige Auslastung(Date  von, Date bis) eine Tabelle liefern in der der Status aller Maschinen in diesem Zeitraum enthalten sind. 

Im einfachsten Fall würde also die Klasse Auftrag  enthalten:
die einmalige AuftragsId
den Zeitraum von bis
Verweis auf eine Sammlung von Ids der Maschinen
Statusinformation

Um dies auslastung darstellen zu können, müsste ich noch en Value( Objekt ohne Id) anlegen, das die Daten der Tabelle so speichert dass ich sie anzeigen kann. Das wäre doch im Prinzip ein Array (Anzahl der zu zeigenden Tage x Anzahl der Maschinen).

So ein View-Modell ist mir bei Tutorials zu Spring und DDD noch nicht untergekommen. 

Wäre das so machbar? oder bin ich wieder auf dem Holzweg?


----------



## LimDul (24. Okt 2020)

Das halte ich aber für ein normales Vorgehen, dass man für die Darstellung an der Oberfläche Objekte gegebenfalls transformiert.


----------



## mihe7 (24. Okt 2020)

AndiE hat gesagt.:


> Um dies auslastung darstellen zu können, müsste ich noch en Value( Objekt ohne Id) anlegen, das die Daten der Tabelle so speichert dass ich sie anzeigen kann. Das wäre doch im Prinzip ein Array (Anzahl der zu zeigenden Tage x Anzahl der Maschinen).


Das ist aber ein reines Darstellungsproblem. Schau Dir mal https://www.primefaces.org/showcase/ui/data/timeline/custom.xhtml an, da sind TimelineModel und TimelineEvent Teil des Frameworks. Die Aufgabe besteht im UI dann eben darin, aus den Daten ein solches TimelineModel zu generieren bzw. zu befüllen. Ist im konkreten Fall zwar JSF, aber das ändert ja am Prinzip nichts.


----------



## AndiE (27. Okt 2020)

[CODE lang="java" title="Entwurf"]public void ausführen() {
        int[][] gitter= new int[5][5];
        int[][] punkte= {{0,0},{1,2},{2,4}};
        int i;
        int j;
        int k;
        String s= new String();
        for (i=0;i<5;i++) {
            for (j=0;j<5;j++) {
                gitter _[j]=0;
            }
        }
        for (k=0;k<3;k++) {
            gitter[punkte[k][0]][punkte[k][1]]=1;
        }

        for (i=0;i<5;i++) {
        s="";
        s+=i;   
            for (j=0;j<5;j++) {
                s+=gitter[j];
                s+=" - ";
            }
            System.out.println(s);
        }
    }[/CODE]

Ich habe als einen funktionierenden Entwurf dieses Programm erstellt, dass mir die Inhalte des Arrays punkte in einem Array Gitter darstellt. 

Nun würde ich das aber gerne objektorientiert schreiben, und die eckigen Klammern weitgehend weglassen. Ich wollte das mit ArrayList machen, was zwar nicht funktioniert hat aber da muss ich noch mal zur Umwandlung in Arrays recherchieren.

Ich glaube aber auch, dass dieses Vorgehen nicht der Weisheit letzter Schluss ist. Ich mag es nicht, wenn ich Platzhalter in den Kollektionen habe. Und ich finde auch, dass eckige Klammern schon etwas "alt" sind. In C hätte ich Speicherplatz allokiert, und mit Speicherarithmetrik die Speicherplätze angegeben. Das wäre aber eben alles mit Funktionsaufrufen (runde Klammer) geschehen. 
Die Frage ist eben auch, wie sinnvoll es ist, einen Speicherbereich von 9000 Plätzen festzulegen( um im Beispiel zu bleiben 300 Maschinen und 30 Tage), wovon ich aber nicht alles brauche. Ich brauche das Array ja nur zur Anzeige. 

Ich habe die Frage hier gelassen, und nicht ins anfängerforum gestellt, weil man es ja auch invers machen könnte. 

So wie im beispiel, benötige ich ja auch für eine Darstellung auf einer Webseite keine vorgefertigte Matrix. Ich könnte also auch so vorgehen:

//Pseudocode

setzeAnzeige( int index_maschine, int index_tag){
Bin ich in einem der gespeicherten Zeiträume der Aufträge?
Nein- Trage an dieser Stelle "leer" ein
Ja- Trage an dieser Stelle den Zustand des Auftrages ein
//

Dann habe ich die Hauptlast auf der Verarbeitung, aber nimm mir nur den Speicher, den ich brauche.

Was wäre sinnvoller?_


----------



## mihe7 (28. Okt 2020)

Weder noch. Wenn Du weißt, dass Maschine 1 vom 5. bis 12. des Monats verliehen ist, dann renderst Du das halt entsprechend.


----------

