Harlan Iverson 5 年 前
コミット
1f1706c7a9
5 ファイル変更221 行追加281 行削除
  1. 45 54
      src/pos_demo/authorize.clj
  2. 12 12
      src/pos_demo/core.clj
  3. 102 132
      src/pos_demo/core.cljs
  4. 44 57
      src/pos_demo/menu.cljc
  5. 18 26
      src/pos_demo/order.cljs

+ 45 - 54
src/pos_demo/authorize.clj

@@ -1,91 +1,82 @@
 (ns pos-demo.authorize
-  
+
   (:import [java.math BigDecimal RoundingMode])
 
   (:import [net.authorize Environment])
   (:import [net.authorize.api.contract.v1
-              MerchantAuthenticationType
-              PaymentType CreditCardType
-              TransactionRequestType
-              TransactionTypeEnum
-              CreateTransactionRequest
-              CreateTransactionResponse
-              MessageTypeEnum 
-              ARBCreateSubscriptionRequest
-              ARBCreateSubscriptionResponse
-              CreateCustomerProfileRequest
-              CreateCustomerProfileResponse
-              CustomerPaymentProfileType
-              CustomerTypeEnum
-              CustomerProfileType
-              CreateCustomerProfileRequest
-              ValidationModeEnum
-              CreateCustomerProfileResponse
-              MessageTypeEnum
-              ANetApiResponse
-            ])
+            MerchantAuthenticationType
+            PaymentType CreditCardType
+            TransactionRequestType
+            TransactionTypeEnum
+            CreateTransactionRequest
+            CreateTransactionResponse
+            MessageTypeEnum
+            ARBCreateSubscriptionRequest
+            ARBCreateSubscriptionResponse
+            CreateCustomerProfileRequest
+            CreateCustomerProfileResponse
+            CustomerPaymentProfileType
+            CustomerTypeEnum
+            CustomerProfileType
+            CreateCustomerProfileRequest
+            ValidationModeEnum
+            CreateCustomerProfileResponse
+            MessageTypeEnum
+            ANetApiResponse])
   (:import [net.authorize.api.controller.base
-             ApiOperationBase])
-  (:import [net.authorize.api.controller 
-             CreateTransactionController
-             CreateCustomerProfileController
-             ARBCreateSubscriptionController])
-             
-             
-(:import [net.authorize.api.contract.v1
+            ApiOperationBase])
+  (:import [net.authorize.api.controller
+            CreateTransactionController
+            CreateCustomerProfileController
+            ARBCreateSubscriptionController])
+
+  (:import [net.authorize.api.contract.v1
             PaymentScheduleType
             PaymentScheduleType$Interval
             ARBSubscriptionUnitEnum
             ARBSubscriptionType
             CustomerProfileIdType
-            CustomerAddressType
-  ])
-  
+            CustomerAddressType])
+
   ;; 
-  (:import [javax.xml.datatype DatatypeFactory XMLGregorianCalendar])  
-  )
 
 
+  (:import [javax.xml.datatype DatatypeFactory XMLGregorianCalendar]))
+
 (defn init [api-login-id transaction-key]
 ; Common code to set for all requests
   (ApiOperationBase/setEnvironment Environment/SANDBOX)
-  
+
   (let [merchant-authentication-type (MerchantAuthenticationType.)]
     (.setName merchant-authentication-type api-login-id)
     (.setTransactionKey merchant-authentication-type transaction-key)
-    
+
     (ApiOperationBase/setMerchantAuthentication merchant-authentication-type)
-    
-     (println "Authorize initialized.")))
 
+    (println "Authorize initialized.")))
 
 (defn create-test-payment-request [card-number card-exp amount]
   (let [payment-type (PaymentType.)
         credit-card (CreditCardType.)]
-        (.setCardNumber credit-card card-number)
-        (.setExpirationDate credit-card card-exp)
-        (.setCreditCard payment-type credit-card)
-        
-        (let [txn-request (TransactionRequestType.)]
-          (.setTransactionType txn-request (.value TransactionTypeEnum/AUTH_CAPTURE_TRANSACTION))
-          (.setPayment txn-request payment-type)
-          (.setAmount txn-request (BigDecimal. amount))
-          
-          txn-request)
-        
-
-))
+    (.setCardNumber credit-card card-number)
+    (.setExpirationDate credit-card card-exp)
+    (.setCreditCard payment-type credit-card)
 
+    (let [txn-request (TransactionRequestType.)]
+      (.setTransactionType txn-request (.value TransactionTypeEnum/AUTH_CAPTURE_TRANSACTION))
+      (.setPayment txn-request payment-type)
+      (.setAmount txn-request (BigDecimal. amount))
 
+      txn-request)))
 
 (defn send-payment-request [txn-request]
   (let [api-request (CreateTransactionRequest.)]
     (.setTransactionRequest api-request txn-request)
     (let [controller (CreateTransactionController. api-request)
           exec-result (.executeWithApiResponse controller)]
-      
+
       (println "Exec result: " exec-result)
-      
+
       ; is execute sync?
       (let [response (.getApiResponse controller)]
         (if response
@@ -95,5 +86,5 @@
                 (println "SUCCESS. == " (.getResponseCode result) " // " (.getAuthCode result) " // " (.getTransId result))
                 (println "Failed transaction a: " (.getResponseCode result))))
             (println "Failed response. Code=" (.getCode (.get (.getMessage (.getMessages response)) 0))
-              "Text=" (.getText (.get (.getMessage (.getMessages response)) 0))))
+                     "Text=" (.getText (.get (.getMessage (.getMessages response)) 0))))
           (println "No API response."))))))

+ 12 - 12
src/pos_demo/core.clj

@@ -2,8 +2,8 @@
   (:require [ring.middleware.resource :refer [wrap-resource]]
             [ring.middleware.keyword-params :refer [wrap-keyword-params]]
             [pos-demo.authorize :as authorize]
-            [clojure.data.json :as json]))  
-  
+            [clojure.data.json :as json]))
+
 (defn current-date
   []
   (java.util.Date.))
@@ -16,20 +16,18 @@
 
 (def credentials #{{:username "hi" :password "mypass"}
                    {:username "mgr" :password "mgrpass"}})
-                   
+
 (def roles {"hi" #{"cashier"}
             "mgr" #{"manager" "cashier"}})
 
-
-
 (defn api-handler
   [request]
-  (println "request query-params keys=" (keys (:query-params request))) 
+  (println "request query-params keys=" (keys (:query-params request)))
   (cond (= "/api" (:uri request))
         {:status 200
          :content-type "application/json"
          :body (str "{\"msg\": \"Works. " (current-date) "\"}")}
-         
+
         (= "/auth" (:uri request))
         (let [credential (select-keys (:params request) [:username :password])]
           (if (contains? credentials credential)
@@ -39,7 +37,7 @@
             {:status 401
              :content-type "text/plain"
              :body "unauthorized."}))
-         
+
         (= "/pay" (:uri request))
         (let [{:keys [amount card-number card-exp]} (:params  request)]
           (println "Authorizing payment for amount=" amount "on card=" card-number "; expires=" card-exp)
@@ -47,13 +45,15 @@
           {:status 200
            :body "paid."
            :content-type "text/plain"})))
-        
-   
+
+
 ; environmental vars and startup config options are the best way to do these.
 ; these is at least one library that goes through the techniques for a given
 ; variable name. We'll use yogthos/config. It is based on environ, and adds some options.
-(authorize/init "API-LOGIN-ID" "TRANSACTION-KEY") 
- 
+
+
+(authorize/init "API-LOGIN-ID" "TRANSACTION-KEY")
+
 (def web-handler
   (-> api-handler
       (wrap-keyword-params)

+ 102 - 132
src/pos_demo/core.cljs

@@ -1,12 +1,12 @@
 (ns pos-demo.core
-    (:require-macros [cljs.core.async.macros :refer [go]])
-    (:require [reagent.core :as reagent :refer [atom]]
-              [cljs.reader :refer [read-string]]
-              [cljs-http.client :as http]
-              [cljs.core.async :as async]
-              [decimal.core :as decimal]
-              [pos-demo.menu :as menu]
-              [pos-demo.order :as order]))
+  (:require-macros [cljs.core.async.macros :refer [go]])
+  (:require [reagent.core :as reagent :refer [atom]]
+            [cljs.reader :refer [read-string]]
+            [cljs-http.client :as http]
+            [cljs.core.async :as async]
+            [decimal.core :as decimal]
+            [pos-demo.menu :as menu]
+            [pos-demo.order :as order]))
 
 (cljs.reader/register-tag-parser! 'pos-demo.order.Order order/map->Order)
 (cljs.reader/register-tag-parser! 'pos-demo.order.OrderItem order/map->OrderItem)
@@ -35,6 +35,7 @@
 ;      and we have the menu item,
 ;      add the item to the order
 
+
 (defn current-date
   []
   (js/Date.))
@@ -50,13 +51,10 @@
   (swap! app-state assoc :payment-amount "0.00")
   (reset! order/order-store []))
 
-
 (defn save-order
   []
   (js/prompt "Save the text; it can be loaded, later." (pr-str @pos-demo.order/order-store)))
 
-
-
 (defn load-order
   []
   (let [order-edn (js/prompt "Paste the saved text.")]
@@ -64,8 +62,7 @@
       (when order-store
         (reset! order/order-store order-store)
         (swap! app-state assoc :active-order 1)
-        (swap! app-state assoc :payment-amount (str (order/order-total 1	)))))
-    ))
+        (swap! app-state assoc :payment-amount (str (order/order-total 1)))))))
 
 (defn ping-api
   []
@@ -86,20 +83,19 @@
         (js/alert (str "Message: " (:body api-response)))
         (js/alert (str "No good :( " (:status api-response)))))))
 
-
 (defn auth-api
   [username password]
   (go
     (let [params {:username username
                   :password password}
           api-response (async/<! (http/get "/auth" {:query-params params}))]
-      (cond 
+      (cond
         (= (:status api-response) 200)
         (js/alert (str "Message: " (:body api-response)))
-        
+
         (= (:status api-response) 401)
         (js/alert (str "Invalid login: " (:body api-response)))
-        
+
         :else
         (js/alert (str "No good :( " (:status api-response)))))))
 
@@ -108,7 +104,7 @@
 (defn new-order-clicked
   []
   (new-order))
-  
+
 (defn abandon-order-clicked
   []
   (abandon-order))
@@ -116,16 +112,15 @@
 (defn save-order-clicked
   []
   (save-order))
-  
+
 (defn load-order-clicked
   []
   (load-order))
-  
+
 (defn ping-api-clicked
   []
   (ping-api))
 
-
 (defn pay-clicked
   [amount]
   (pay-api amount))
@@ -136,59 +131,49 @@
   [label on-click & [{:keys [color height width]}]]
   [:button {:on-click on-click
             :style {:border "1px solid black"
-                   :background-color (or color "silver")
-                   :height (or height "100px")
-                   :width (or width "100px")
-                   :text-align "center"
-                   :vertical-aign "middle" 
-                   :margin "3px"
-                 }}
-        label])
-
-
+                    :background-color (or color "silver")
+                    :height (or height "100px")
+                    :width (or width "100px")
+                    :text-align "center"
+                    :vertical-aign "middle"
+                    :margin "3px"}}
+   label])
 
 (defn menu-section-ui
-  [section]
-  )
+  [section])
 
 (defn add-menu-item-to-order
   [menu-item-id]
   ;(swap! app-state update-in [:active-order :items] conj (select-keys menu-item [:title :price]))
-  (let [ingredient-mods (if (= 102 menu-item-id) 
-                            {"Bread" {:operation :skip}
-                             "Lettuce" {:operation :add}}
-                             {})
+  (let [ingredient-mods (if (= 102 menu-item-id)
+                          {"Bread" {:operation :skip}
+                           "Lettuce" {:operation :add}}
+                          {})
         request (order/request-menu-item (:active-order @app-state) menu-item-id ingredient-mods)]
     (order/add-item request))
-  (swap! app-state assoc :payment-amount (str (order/order-total (:active-order @app-state))))
-  )
+  (swap! app-state assoc :payment-amount (str (order/order-total (:active-order @app-state)))))
 
 (defn menu-item-clicked
   [menu item]
 
   ; show modal to customize based on ingredients.  
-  (swap! app-state assoc :customize-menu-item item)
-  )
+  (swap! app-state assoc :customize-menu-item item))
 
 (defn add-item-clicked
   [menu item]
   (swap! app-state dissoc :customize-menu-item)
   (add-menu-item-to-order (:id item))
-  (.scrollTo js/window 0 0)
-  )
-
+  (.scrollTo js/window 0 0))
 
 (defn login-clicked
   []
   ; open a modal to ask for credentials.
-  (auth-api "mgr" "mgrpass")  )
-
+  (auth-api "mgr" "mgrpass"))
 
 (defn cancel-customize-menu-item-clicked []
   (swap! app-state dissoc :customize-menu-item)
   (.scrollTo js/window 0 0))
 
-
 (defn menu-ui
   [menu]
   ; tabs with section titles
@@ -197,108 +182,93 @@
   ; there can be types of ingredients like sauces and patties.
   (for [section (menu/find-menu-sections (:id menu))]
     [:div (:title section)
-      (for [item (menu/find-menu-items (:id section))]  
-        [button (:title item) #(menu-item-clicked menu item)]
-          )]))
-
-
+     (for [item (menu/find-menu-items (:id section))]
+       [button (:title item) #(menu-item-clicked menu item)])]))
 
 (defn order-ui
   [order]
-  
-  [:div 
-  [:ul 
+
+  [:div
+   [:ul
     (for [item (order/order-items order)]
       [:li (:title item) [:span.price (:price item)]
-        [:ul
-          (let [item-ingredients (order/item-ingredients (:id item))
-                item-ingredients (filter #(not= :normal (:operation %)) item-ingredients)
-                                     
-                                     ]
+       [:ul
+        (let [item-ingredients (order/item-ingredients (:id item))
+              item-ingredients (filter #(not= :normal (:operation %)) item-ingredients)]
+
           (for [ingredient item-ingredients]
-            [:li (:operation ingredient) (:ingredient ingredient)]))]      
-      ]
-      )]
-  
-    [:div
-      [:strong "Total Price"]
-      [:span (str (order/order-total order))]]])
+            [:li (:operation ingredient) (:ingredient ingredient)]))]])]
+
+   [:div
+    [:strong "Total Price"]
+    [:span (str (order/order-total order))]]])
 
 (defn customize-menu-item [menu-item]
   [:div#product-customization-dialog
-    [:h4 (:title menu-item)]
-    [:h5 (-> menu-item
-             :menu-section
-             menu/find-menu-section
-             :title)]
-             
-    [:p "Ingredients"]
-    [:ul
-      (for [k (menu/find-menu-item-ingredients (:id menu-item))]
-        [:li [:h5 (:ingredient k)]
-             [:p (:description k)]
-             [:div (button "On Side" #(js/alert "Not implemented yet.") {:height "30px"})
-                   (button "Extra" #(js/alert "Not implemented yet.") {:height "30px"})
-                   (button "Skip" #(js/alert "Not implemented yet.") {:height "30px"})]])
-      [:li
-        [:h5 "Something else?"]
-        [:p "Add any ingredient from any item on the menu."] 
-        [:div 
-          
-          (when-let [customize-ingredient (not (:customize-ingredient @app-state))]          
-            (button "Add..." #(swap! app-state assoc :customize-ingredient true) {:height "30px"}))
-            (when-let [customize-ingredient (:customize-ingredient @app-state)]
-              [:div#customize-ingredient
-                [:ul
-                  (for [ingredient (menu/find-all-ingredients 1)]
-                    [:li (button (str(:ingredient ingredient)) #(js/alert "Not implemented yet.") {:height "30px" :color "lime"})])
-                  [:li (button "Cancel." #(swap! app-state dissoc :customize-ingredient) {:height "30px" :color "red"})]]])  
-          ]]]
-    
-    [:div.custom-price [:strong "Price:"] (:price menu-item)]    
-    (button "Add to order." #(add-item-clicked nil menu-item) {:color "aqua"})
-    (button "Cancel." #(cancel-customize-menu-item-clicked) {:color "red"})
-    ])
+   [:h4 (:title menu-item)]
+   [:h5 (-> menu-item
+            :menu-section
+            menu/find-menu-section
+            :title)]
+
+   [:p "Ingredients"]
+   [:ul
+    (for [k (menu/find-menu-item-ingredients (:id menu-item))]
+      [:li [:h5 (:ingredient k)]
+       [:p (:description k)]
+       [:div (button "On Side" #(js/alert "Not implemented yet.") {:height "30px"})
+        (button "Extra" #(js/alert "Not implemented yet.") {:height "30px"})
+        (button "Skip" #(js/alert "Not implemented yet.") {:height "30px"})]])
+    [:li
+     [:h5 "Something else?"]
+     [:p "Add any ingredient from any item on the menu."]
+     [:div
+
+      (when-let [customize-ingredient (not (:customize-ingredient @app-state))]
+        (button "Add..." #(swap! app-state assoc :customize-ingredient true) {:height "30px"}))
+      (when-let [customize-ingredient (:customize-ingredient @app-state)]
+        [:div#customize-ingredient
+         [:ul
+          (for [ingredient (menu/find-all-ingredients 1)]
+            [:li (button (str (:ingredient ingredient)) #(js/alert "Not implemented yet.") {:height "30px" :color "lime"})])
+          [:li (button "Cancel." #(swap! app-state dissoc :customize-ingredient) {:height "30px" :color "red"})]]])]]]
+
+   [:div.custom-price [:strong "Price:"] (:price menu-item)]
+   (button "Add to order." #(add-item-clicked nil menu-item) {:color "aqua"})
+   (button "Cancel." #(cancel-customize-menu-item-clicked) {:color "red"})])
 
 (defn main-screen []
   [:div
    [:h1 (:shop-name @app-state)]
-   
+
    (when (nil? (:active-order @app-state))
-     [:span 
-       (button "New Order" new-order-clicked {:color "aqua"})
-       (button "Resume Order" load-order-clicked)])
+     [:span
+      (button "New Order" new-order-clicked {:color "aqua"})
+      (button "Resume Order" load-order-clicked)])
    (when-not (nil? (:active-order @app-state))
      [:div
-       (menu-ui (menu/find-menu 1))
-       (when-let [menu-item (:customize-menu-item @app-state)]
-         [:div
-           [:hr]
-           (customize-menu-item menu-item)])
-       [:hr]
-       (order-ui (:active-order @app-state))
-       [:hr]
-       [:span
-         (button "Save Order" save-order-clicked)
-         (button "Abandon Order" abandon-order-clicked {:color "red"})]
-                
-         ])
-    (button "Ping API" ping-api-clicked)
-   
-    [:div
-      [:input#payment-amount {:type "text"
-                              :value (:payment-amount @app-state)
-                              :on-change #(swap! app-state assoc :payment-amount (-> % .-target .-value))}]
-                              
-      (button "Pay" #(pay-clicked (:payment-amount @app-state)) {:color "lime"})
-      ]
-      
-     (button "Login." login-clicked {:color "green"})
-     
-     
-   ])
+      (menu-ui (menu/find-menu 1))
+      (when-let [menu-item (:customize-menu-item @app-state)]
+        [:div
+         [:hr]
+         (customize-menu-item menu-item)])
+      [:hr]
+      (order-ui (:active-order @app-state))
+      [:hr]
+      [:span
+       (button "Save Order" save-order-clicked)
+       (button "Abandon Order" abandon-order-clicked {:color "red"})]])
+
+   (button "Ping API" ping-api-clicked)
+
+   [:div
+    [:input#payment-amount {:type "text"
+                            :value (:payment-amount @app-state)
+                            :on-change #(swap! app-state assoc :payment-amount (-> % .-target .-value))}]
 
+    (button "Pay" #(pay-clicked (:payment-amount @app-state)) {:color "lime"})]
 
+   (button "Login." login-clicked {:color "green"})])
 
 (reagent/render-component [main-screen]
                           (. js/document (getElementById "app")))
@@ -307,4 +277,4 @@
   ;; optionally touch your app-state to force rerendering depending on
   ;; your application
   ;; (swap! app-state update-in [:__figwheel_counter] inc)
-)
+  )

+ 44 - 57
src/pos_demo/menu.cljc

@@ -1,90 +1,80 @@
 (ns pos-demo.menu)
 
-
 (defrecord Ingredient
-  [title price calories])
-
+           [title price calories])
 
 (defrecord Menu
-  [sections])
+           [sections])
 
 (defrecord MenuSection
-  [menu title items])
+           [menu title items])
 
 (defrecord MenuItem
-  [menu-section title price description calories ingredients])
+           [menu-section title price description calories ingredients])
 
 (defrecord MenuItemIngredient
-  [menu-item ingredient amount description])
+           [menu-item ingredient amount description])
+
+#_(defrecord Sale [description conditions price-adjustment])
 
+#_(when [?cart :cart/item ?item1]
+    [?cart :cart/item ?item2]
 
+    [?item1 :product/category ?cat1]
+    [?item2 :product/category ?cat2]
 
-#_ (defrecord Sale [description conditions price-adjustment])
+    [?item1 :product/price ?p1]
+    [?item2 :product/price ?p2]
 
-#_ (when [?cart :cart/item ?item1]
-         [?cart :cart/item ?item2]
-         
-         [?item1 :product/category ?cat1]
-         [?item2 :product/category ?cat2]
-         
-         [?item1 :product/price ?p1]
-         [?item2 :product/price ?p2]
-         
-         (= "Sandos" ?cat1 ?cat2)
-         
-         (then
-           (insert! (->Sale "50% off Summer" "Buy 3 or more." (* -1 0.50 (+ ?p1 ?p2 ?p3))))))
+    (= "Sandos" ?cat1 ?cat2)
 
+    (then
+     (insert! (->Sale "50% off Summer" "Buy 3 or more." (* -1 0.50 (+ ?p1 ?p2 ?p3))))))
 
 (def menu (atom (let [m (map->Menu {:id 1})
-                       salads  (map->MenuSection {:id 10 :menu (:id m) :title "Salads"})
-                       caesar (map->MenuItem {:id 100 :menu-section (:id salads) :title "Caesar" :description "" :price "11.95"})
-                       sandos (map->MenuSection {:id 11 :menu (:id m) :title "Sandos"})
-                       grilled-cheese (map->MenuItem {:id 101 :menu-section (:id sandos) :title "Grilled Cheese" :description "" :price "8.95"})
-                       pb-and-j (map->MenuItem {:id 102 :menu-section (:id sandos) :title "PB & J" :description "" :price "6.95"})
-                       ]
-             [m salads caesar 
-    
-      (map->MenuItemIngredient {:id 1000 :menu-item (:id caesar) :ingredient "Kale" :amount 1.2 :description "The leafy green ingredient."})
-      (map->MenuItemIngredient {:id 1001 :menu-item (:id caesar) :ingredient "Caesar Dressing" :amount 1 :description "Creamy dressing."})
-      (map->MenuItemIngredient {:id 1002 :menu-item (:id caesar) :ingredient "Bacon" :amount 0.4 :description "Adds crunch and salty flavor."})
-      
-    
-  sandos
-    grilled-cheese
-    
-    	(map->MenuItemIngredient {:id 1003 :menu-item (:id grilled-cheese) :ingredient "Bread" :amount 2 :description "White Bread for the sando."})
-    	(map->MenuItemIngredient {:id 1004 :menu-item (:id grilled-cheese) :ingredient "Cheese" :amount 1 :description "American Singles, baby."})
-    	(map->MenuItemIngredient {:id 1005 :menu-item (:id grilled-cheese) :ingredient "Butter" :amount 0.25 :description "Bread is buttered before grilling."})
-    	
-    pb-and-j
-    
-    	(map->MenuItemIngredient {:id 1006 :menu-item (:id pb-and-j) :ingredient "Bread" :amount 2 :description "White Bread for the sando."})
-    	(map->MenuItemIngredient {:id 1007 :menu-item (:id pb-and-j) :ingredient "Peanut Butter" :amount 0.25 :description "Crunchy roasted peanut butter."})
-    	(map->MenuItemIngredient {:id 1008 :menu-item (:id pb-and-j) :ingredient "Grape Preserves" :amount 0.25 :description "Concord grape preserves."})
-    	
-  ])))
+                      salads  (map->MenuSection {:id 10 :menu (:id m) :title "Salads"})
+                      caesar (map->MenuItem {:id 100 :menu-section (:id salads) :title "Caesar" :description "" :price "11.95"})
+                      sandos (map->MenuSection {:id 11 :menu (:id m) :title "Sandos"})
+                      grilled-cheese (map->MenuItem {:id 101 :menu-section (:id sandos) :title "Grilled Cheese" :description "" :price "8.95"})
+                      pb-and-j (map->MenuItem {:id 102 :menu-section (:id sandos) :title "PB & J" :description "" :price "6.95"})]
+                  [m salads caesar
+
+                   (map->MenuItemIngredient {:id 1000 :menu-item (:id caesar) :ingredient "Kale" :amount 1.2 :description "The leafy green ingredient."})
+                   (map->MenuItemIngredient {:id 1001 :menu-item (:id caesar) :ingredient "Caesar Dressing" :amount 1 :description "Creamy dressing."})
+                   (map->MenuItemIngredient {:id 1002 :menu-item (:id caesar) :ingredient "Bacon" :amount 0.4 :description "Adds crunch and salty flavor."})
+
+                   sandos
+                   grilled-cheese
+
+                   (map->MenuItemIngredient {:id 1003 :menu-item (:id grilled-cheese) :ingredient "Bread" :amount 2 :description "White Bread for the sando."})
+                   (map->MenuItemIngredient {:id 1004 :menu-item (:id grilled-cheese) :ingredient "Cheese" :amount 1 :description "American Singles, baby."})
+                   (map->MenuItemIngredient {:id 1005 :menu-item (:id grilled-cheese) :ingredient "Butter" :amount 0.25 :description "Bread is buttered before grilling."})
+
+                   pb-and-j
+
+                   (map->MenuItemIngredient {:id 1006 :menu-item (:id pb-and-j) :ingredient "Bread" :amount 2 :description "White Bread for the sando."})
+                   (map->MenuItemIngredient {:id 1007 :menu-item (:id pb-and-j) :ingredient "Peanut Butter" :amount 0.25 :description "Crunchy roasted peanut butter."})
+                   (map->MenuItemIngredient {:id 1008 :menu-item (:id pb-and-j) :ingredient "Grape Preserves" :amount 0.25 :description "Concord grape preserves."})])))
 
 (defn find-menu
   [id]
   (first (filter #(and (instance? Menu %)
-                (= (:id %) id)) @menu)))
-
+                       (= (:id %) id)) @menu)))
 
 (defn find-menu-section
   [id]
   (first (filter #(and (instance? MenuSection %)
-                (= (:id %) id)) @menu)))
+                       (= (:id %) id)) @menu)))
 
 (defn find-menu-item
   [id]
   (first (filter #(and (instance? MenuItem %)
-                (= (:id %) id)) @menu)))
+                       (= (:id %) id)) @menu)))
 
 (defn find-menu-item-ingredient
   [id]
   (first (filter #(and (instance? MenuItemIngredient %)
-                (= (:id %) id)) @menu)))
+                       (= (:id %) id)) @menu)))
 
 (defn find-menu-sections
   [menu-id]
@@ -101,13 +91,10 @@
   (filter #(and (instance? MenuItemIngredient %)
                 (= (:menu-item %) menu-item-id)) @menu))
 
-
-
 (defn find-all-ingredients
   [menu-id]
   (filter #(and (instance? MenuItemIngredient %)
                 (let [menu-item (find-menu-item (:menu-item %))
                       section (find-menu-section (:menu-section menu-item))
                       menu (find-menu (:menu section))]
-                      (= (:id menu) menu-id))
-                ) @menu))
+                  (= (:id menu) menu-id))) @menu))

+ 18 - 26
src/pos_demo/order.cljs

@@ -6,19 +6,18 @@
 
 ; Scenario -- one taco left, two guests on two terminals want it. who gets it?
 
+
 (defrecord Order
-  [id])  
+           [id])
 
 (defrecord OrderItem
-  [id order menu-item title price])
-
+           [id order menu-item title price])
 
 (defrecord OrderItemIngredient
-  [id order-item ingredient operation quantity price])
+           [id order-item ingredient operation quantity price])
 
 (defrecord OrderRequest
-  [order description])
-
+           [order description])
 
 (def order-store (atom []))
 
@@ -40,43 +39,36 @@
                                     :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}))
-                         )
-                         
+                                (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)
-    ))
+                                  ingredient-mods)]
 
+    (concat [order-item] normal-ingredients modified-ingredients)))
 
 (defn add-item
   [requests]
-  (swap! order-store concat requests)
-  )
+  (swap! order-store concat requests))
 
 (defn order-items
   [order-id]
   (filter #(and (instance? OrderItem %)
                 (= (:order %) order-id))
-          @order-store)) 
-          
-          
+          @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))
@@ -84,4 +76,4 @@
                             "0.00"
                             item-prices)]
     total-price))
-          
+