diff --git a/app/controllers/group_orders_controller.rb b/app/controllers/group_orders_controller.rb index 31d1178a..5869d3ff 100644 --- a/app/controllers/group_orders_controller.rb +++ b/app/controllers/group_orders_controller.rb @@ -65,7 +65,7 @@ class GroupOrdersController < ApplicationController private # Returns true if @current_user is member of an Ordergroup. - # Used as a :before_filter by OrderingController. + # Used as a :before_filter by OrdersController. def ensure_ordergroup_member @ordergroup = @current_user.ordergroup if @ordergroup.nil? diff --git a/doc/BESTELLEN.md b/doc/BESTELLEN.md new file mode 100644 index 00000000..092827eb --- /dev/null +++ b/doc/BESTELLEN.md @@ -0,0 +1,93 @@ + +# 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 Bestellgruppena 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. diff --git a/doc/README_FOR_APP.md b/doc/README_FOR_APP.md deleted file mode 100644 index 0f25c510..00000000 --- a/doc/README_FOR_APP.md +++ /dev/null @@ -1,94 +0,0 @@ -Use this README file to introduce your application and point to useful places in the API for learning more. -Run "rake doc:app" to generate API documentation for your models and controllers. - -= The Foodsoft - -is a Web-based software to manage a non-profit food coop (product catalog, ordering, accounting, job scheduling). - - -== 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 OrderingController. - -=== 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 Bestellgruppena 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 Tablle 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. -Beipspiel. - 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.