# Bestellen Das Bestellen ist der Hauptteil dieser Software und ein wenig kompliziert. Hier starte ich den Versuch die Programmlogik in Text umzusetzen und verweise auf die enstprechenden Controller bzw. Modelle. Der relevante Controller ist `OrdersController`. ## Bestellung "in Netz stellen" Darunter verstehen wir die Auswahl von Artikeln eines bestimmten Lieferanten fuer eine zeitlich begrenzte Bestellung im Internet. Die relevanten Methoden sind `OrdersController#newOrder` und folgende. Jede Bestellung wird durch die Klasse Order abgebildet. Die zugehoerigen Artikel werden duch die Klasse `OrderArticle` mit den Artikeln verknuepft. Dabei werden auch die Attribute `quantity`, `tolerance` und `quantity_to_order` gespeichert. Diese Mengen repraesentieren die Gesamtbestellung, also alle Bestellgruppen. ## Eine Bestellgruppe bestellt... Die Methode `OrdersController#order` schickt uns die Bestellenseite. Mit dieser Oberflaeche koennen die Bestellgruppen die vorher ausgewaehlten Artikel bestellen. Mittels den Buttons werden dabei live, also clientseitig, die Preise ermittelt und der Gesamtpreis berechnet. Ist der Gesamtpreis groeßer als der aktuelle Gruppenkontostand, so wird die Preisspalte rot unterlegt und die Bestellung kann nicht gespeichert werden. ## (gruppen)-Bestellung wird gespeichert Die Gruppenbestellung wird durch die Tabelle `group_oders` (`GroupOrder`) abgebildet, bzw. die Bestellung und Bestellgruppe wird dort verknuepft. Die bestellten Artikel der Bestellgruppe werden durch die Tabelle `group_order_articles` (`GroupOrderArticle`) registriert. Dort werden nun die Modelle GroupOrder und OrderArticle miteinander verbunden. Bei jeder Bestellung wird außerdem die Summe der Menge, Toleranz in `GroupOrderArticle` abgelegt. Allerdings muss jede Aenderung dieser Mengen mit protokolliert werden. Dies ist wichtig, weil spaeter die Zuteilung der Einheiten pro bestellten Artikel nach der chronologischen Reihenfolge erfolgt. (s.u.) Das passiert dann in der Tabelle `group_order_article_quantities` (`GroupOrderArticleQuantity`). ## Aenderunug einer Bestellung Knifflig ist die Aenderung einer gruppenbestellung, weil die zeitliche Reihenfolge dabei nicht durcheinander geraten darf. Wir unterscheiden dehalb zwei Faelle: ### Erhoehe die Menge des Arikels. Jetzt wird eine Zeile in `group_order_article_quantities` angelegt. und zwar mit genau den Mengen, die zusatzlich bestellt wurden. Quantity und Tolerance funktionieren analog. Beispiel: * Urspruenglich bestellt: 2(2) um 17uhr. * Erhoehe Bestellung auf 4(2) um 18hur. => neue Zeile mit quantity = 2, tolerance = 0, und created_on = 18uhr * Jetzt gibt es zwei zeilen die insgesamt 4(2) ergeben. (die summen in `GroupOrderArticle` werden aktualisiert) ### Verringere die Mengen des Artikels. Jetzt muss chronologisch zurueckgegangen werden und um die urspruenglich bestellten Mengen zu verringern. Beispiel von oben: * Verringe Bestellung auf 2(1) um 19uhr. => Zeile mit created_on = 18uhr wird gelöscht und in der Zeile mit created_on = 17uhr wird der Wert tolerance auf 1 gaendert. ## Wer bekommt wieviel? Diese Frage wird wie schon erwaehnt mittels der `group_order_article_quantites`-Tabelle geloest. Beispiel. * articel x mit unit_quantity = 5. * 17uhr: gruppe a bestellt 2(3), weil sie auf jeden fall was von x bekommen will * 18uhr: gruppe b bestellt 2(0) * 19uhr: gruppe a faellt ein dass sie doch noch mehr braucht von x und aendert auf 4(1). * jetzt gibt es drei zeilen in der tabelle, die so aussehen: * (gruppe a), 2(1), 17uhr (wurde um 19uhr von 2(3) auf 2(1) geaendert) * (gruppe b), 2(0), 18uhr * (gruppe a), 2(0), 19uhr. * die zuteilung wird dann wie folgt ermittelt: * zeile 1: gruppe a bekommt 2 * zeile 2: gruppe b bekommt 2 * zeile 3: gruppe a bekommt 1, weil jetzt das gebinde schon voll ist. * Endstand: insg. Bestellt wurden 6(1) * Gruppe a bekommt 3 einheiten. * gruppe b bekommt 2 einheiten. * eine Einheit verfaellt.