123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- (ns pos-demo.order
- (:require [pos-demo.menu :as menu]
- [decimal.core :as decimal]))
- ; Scenario -- one taco left, two guests on two terminals want it. who gets it?
- (defrecord Order
- [id])
- (defrecord OrderItem
- [id order menu-item title price])
- (defrecord OrderItemIngredient
- [id order-item ingredient operation quantity price])
- (defrecord OrderRequest
- [order description])
- (def order-store (atom [(map->Order {:id 1})]))
- ; The order is made up of a collection of facts.
- ; They are all committed in the same Transaction.
- ; They have relative temporary IDs that are updated upon commit.
- ; We could omit OrderItemIngredients and refer back to the menu data at a point in time.
- ; We should do this in view rendering, if we don't explicitly include it. Assume menu won't change between order and cooking.
- (def next-id (atom 1))
- (defn request-menu-item
- [order-id menu-item-id ingredient-mods] ; mods are a map of ingredient {:operation}
- (let [menu-item (menu/find-menu-item menu-item-id)
- order-item (map->OrderItem {:id (swap! next-id inc)
- :order order-id
- :price (:price menu-item)
- :title (:title menu-item)
- :menu-item (:id menu-item)})
-
- normal-ingredients (->> (menu/find-menu-item-ingredients menu-item-id)
- (filter #(not (and (contains? ingredient-mods (:ingredient %))
- (not= (:operation %) :normal))))
- (map #(map->OrderItemIngredient {:order-item (:id order-item)
- :ingredient (:ingredient %)
- :operation :normal}))
- )
-
- modified-ingredients (map #(map->OrderItemIngredient {:order-item (:id order-item)
- :ingredient (key %)
- :operation (:operation (val %))})
- ingredient-mods)
-
- ]
- (concat [order-item] normal-ingredients modified-ingredients)
- ))
- (defn add-item
- [requests]
- (swap! order-store concat requests)
- )
- (defn order-items
- [order-id]
- (filter #(and (instance? OrderItem %)
- (= (:order %) order-id))
- @order-store))
-
-
- (defn item-ingredients
- [order-item-id]
- (filter #(and (instance? OrderItemIngredient %)
- (= (:order-item %) order-item-id))
- @order-store))
-
- (defn order-total [order-id]
- (let [item-prices (map :price (order-items order-id))
- total-price (reduce decimal/+
- "0.00"
- item-prices)]
- total-price))
-
|