1
0

order.cljs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. (ns pos-demo.order
  2. (:require [pos-demo.menu :as menu]
  3. [decimal.core :as decimal]))
  4. ; Scenario -- one taco left, two guests on two terminals want it. who gets it?
  5. (defrecord Order
  6. [id])
  7. (defrecord OrderItem
  8. [id order menu-item title price])
  9. (defrecord OrderItemIngredient
  10. [id order-item ingredient operation quantity price])
  11. (defrecord OrderRequest
  12. [order description])
  13. (def order-store (atom [(map->Order {:id 1})]))
  14. ; The order is made up of a collection of facts.
  15. ; They are all committed in the same Transaction.
  16. ; They have relative temporary IDs that are updated upon commit.
  17. ; We could omit OrderItemIngredients and refer back to the menu data at a point in time.
  18. ; We should do this in view rendering, if we don't explicitly include it. Assume menu won't change between order and cooking.
  19. (def next-id (atom 1))
  20. (defn request-menu-item
  21. [order-id menu-item-id ingredient-mods] ; mods are a map of ingredient {:operation}
  22. (let [menu-item (menu/find-menu-item menu-item-id)
  23. order-item (map->OrderItem {:id (swap! next-id inc)
  24. :order order-id
  25. :price (:price menu-item)
  26. :title (:title menu-item)
  27. :menu-item (:id menu-item)})
  28. normal-ingredients (->> (menu/find-menu-item-ingredients menu-item-id)
  29. (filter #(not (and (contains? ingredient-mods (:ingredient %))
  30. (not= (:operation %) :normal))))
  31. (map #(map->OrderItemIngredient {:order-item (:id order-item)
  32. :ingredient (:ingredient %)
  33. :operation :normal}))
  34. )
  35. modified-ingredients (map #(map->OrderItemIngredient {:order-item (:id order-item)
  36. :ingredient (key %)
  37. :operation (:operation (val %))})
  38. ingredient-mods)
  39. ]
  40. (concat [order-item] normal-ingredients modified-ingredients)
  41. ))
  42. (defn add-item
  43. [requests]
  44. (swap! order-store concat requests)
  45. )
  46. (defn order-items
  47. [order-id]
  48. (filter #(and (instance? OrderItem %)
  49. (= (:order %) order-id))
  50. @order-store))
  51. (defn item-ingredients
  52. [order-item-id]
  53. (filter #(and (instance? OrderItemIngredient %)
  54. (= (:order-item %) order-item-id))
  55. @order-store))
  56. (defn order-total [order-id]
  57. (let [item-prices (map :price (order-items order-id))
  58. total-price (reduce decimal/+
  59. "0.00"
  60. item-prices)]
  61. total-price))