diff --git a/src/Order.hs b/src/Order.hs index 1aeefdb..bb1bcf6 100644 --- a/src/Order.hs +++ b/src/Order.hs @@ -14,24 +14,22 @@ import GHC.Generics import Test.QuickCheck -- | Type to represent a ZGo order -data ZGoOrder = - ZGoOrder - { q_id :: Maybe ObjectId - , qaddress :: T.Text - , qsession :: T.Text - , qtimestamp :: UTCTime - , qclosed :: Bool - , qcurrency :: T.Text - , qprice :: Double - , qtotal :: Double - , qtotalZec :: Double - , qlines :: [LineItem] - , qpaid :: Bool - , qexternalInvoice :: T.Text - , qshortCode :: T.Text - , qtoken :: T.Text - } - deriving (Eq, Show, Generic) +data ZGoOrder = ZGoOrder + { q_id :: Maybe ObjectId + , qaddress :: T.Text + , qsession :: T.Text + , qtimestamp :: UTCTime + , qclosed :: Bool + , qcurrency :: T.Text + , qprice :: Double + , qtotal :: Double + , qtotalZec :: Double + , qlines :: [LineItem] + , qpaid :: Bool + , qexternalInvoice :: T.Text + , qshortCode :: T.Text + , qtoken :: T.Text + } deriving (Eq, Show, Generic) instance ToJSON ZGoOrder where toJSON (ZGoOrder i a s ts c cur p t tZ l paid eI sC tk) = @@ -74,7 +72,7 @@ instance ToJSON ZGoOrder where instance FromJSON ZGoOrder where parseJSON = withObject "Order" $ \obj -> do - i <- obj .: "_id" + i <- obj .:? "_id" a <- obj .: "address" s <- obj .: "session" ts <- obj .: "timestamp" @@ -88,24 +86,7 @@ instance FromJSON ZGoOrder where eI <- obj .: "externalInvoice" sC <- obj .: "shortCode" tk <- obj .: "token" - pure $ - ZGoOrder - (if not (null i) - then Just (read i) - else Nothing) - a - s - ts - c - cur - p - t - tZ - l - pd - eI - sC - tk + pure $ ZGoOrder (read =<< i) a s ts c cur p t tZ l pd eI sC tk instance Val ZGoOrder where val (ZGoOrder i a s ts c cur p t tZ l pd eI sC tk) = @@ -160,13 +141,11 @@ instance Val ZGoOrder where cast' _ = Nothing -- Type to represent an order line item -data LineItem = - LineItem - { lqty :: Double - , lname :: T.Text - , lcost :: Double - } - deriving (Eq, Show) +data LineItem = LineItem + { lqty :: Double + , lname :: T.Text + , lcost :: Double + } deriving (Eq, Show) instance ToJSON LineItem where toJSON (LineItem q n c) = object ["qty" .= q, "name" .= n, "cost" .= c] @@ -193,10 +172,10 @@ upsertOrder :: ZGoOrder -> Action IO () upsertOrder o = do let order = val $ updateOrderTotals o case order of - Doc d -> + Doc d -> if isJust (q_id o) - then upsert (select ["_id" =: q_id o] "orders") d - else insert_ "orders" d + then upsert (select ["_id" =: q_id o] "orders") d + else insert_ "orders" d _ -> return () insertWooOrder :: ZGoOrder -> Action IO Database.MongoDB.Value @@ -210,7 +189,14 @@ upsertXeroOrder :: ZGoOrder -> Action IO () upsertXeroOrder o = do let order = val $ updateOrderTotals o case order of - Doc d -> upsert (select ["externalInvoice" =: qexternalInvoice o, "shortCode" =: qshortCode o] "orders") d + Doc d -> + upsert + (select + [ "externalInvoice" =: qexternalInvoice o + , "shortCode" =: qshortCode o + ] + "orders") + d _ -> return () -- | Function to update order totals from items @@ -247,13 +233,20 @@ findOrder :: T.Text -> Action IO (Maybe Document) findOrder s = findOne (select ["session" =: s, "closed" =: False] "orders") findXeroOrder :: T.Text -> T.Text -> T.Text -> Action IO (Maybe Document) -findXeroOrder a i s = findOne (select ["address" =: a, "externalInvoice" =: i, "shortCode" =: s] "orders") +findXeroOrder a i s = + findOne + (select ["address" =: a, "externalInvoice" =: i, "shortCode" =: s] "orders") findOrderById :: String -> Action IO (Maybe Document) +findOrderById "0" = return Nothing findOrderById i = findOne (select ["_id" =: (read i :: B.ObjectId)] "orders") findAllOrders :: T.Text -> Action IO [Document] -findAllOrders a = rest =<< find (select ["address" =: a] "orders") {sort = ["timestamp" =: (negate 1 :: Int)]} +findAllOrders a = + rest =<< + find + (select ["address" =: a] "orders") + {sort = ["timestamp" =: (negate 1 :: Int)]} deleteOrder :: String -> Action IO () deleteOrder i = deleteOne (select ["_id" =: (read i :: B.ObjectId)] "orders")