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.