Correct order upserting
This commit is contained in:
parent
bd32d6c149
commit
0c77163f31
1 changed files with 43 additions and 50 deletions
93
src/Order.hs
93
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")
|
||||
|
|
Loading…
Reference in a new issue