diff --git a/src/ZGoBackend.hs b/src/ZGoBackend.hs index ee724cd..906de71 100644 --- a/src/ZGoBackend.hs +++ b/src/ZGoBackend.hs @@ -668,146 +668,169 @@ routes pipe config = do , "shop" .= (Nothing :: Maybe String) ]) Just o' -> do - res <- + existingOrder <- liftAndCatchIO $ - requestXeroToken pipe (c_dbName config) c "none" $ oaddress o' - if res - then do - resInv <- + run $ + findXeroOrder + (oaddress o') + (xr_invNo invReq) + (xr_shortCode invReq) + case cast' . Doc =<< existingOrder of + Nothing -> do + res <- liftAndCatchIO $ - getXeroInvoice pipe (c_dbName config) (xr_invNo invReq) $ - oaddress o' - case resInv of - Nothing -> do - status ok200 - Web.Scotty.json - (object - [ "reportType" .= (2 :: Integer) - , "order" .= (Nothing :: Maybe ZGoOrder) - , "shop" .= (Nothing :: Maybe String) - ]) - Just xI -> do - if xi_type xI == "ACCREC" - then if xi_status xI == "AUTHORISED" - then if xi_currency xI == T.toUpper (ocurrency o') - then if xi_total xI == xr_amount invReq - then do - now <- liftIO getCurrentTime - tk <- liftIO generateToken - pr <- - liftAndCatchIO $ - run - (findPrice $ - T.unpack . ocurrency $ o') - case parseZGoPrice =<< pr of - Nothing -> do + requestXeroToken pipe (c_dbName config) c "none" $ oaddress o' + if res + then do + resInv <- + liftAndCatchIO $ + getXeroInvoice pipe (c_dbName config) (xr_invNo invReq) $ + oaddress o' + case resInv of + Nothing -> do + status ok200 + Web.Scotty.json + (object + [ "reportType" .= (2 :: Integer) + , "order" .= (Nothing :: Maybe ZGoOrder) + , "shop" .= (Nothing :: Maybe String) + ]) + Just xI -> do + if xi_type xI == "ACCREC" + then if xi_status xI == "AUTHORISED" + then if xi_currency xI == + T.toUpper (ocurrency o') + then if xi_total xI == xr_amount invReq + then do + now <- liftIO getCurrentTime + tk <- liftIO generateToken + pr <- + liftAndCatchIO $ + run + (findPrice $ + T.unpack . ocurrency $ o') + case parseZGoPrice =<< pr of + Nothing -> do + status ok200 + Web.Scotty.json + (object + [ "reportType" .= + (7 :: Integer) + , "order" .= + (Nothing :: Maybe ZGoOrder) + , "shop" .= + (Nothing :: Maybe String) + ]) + Just cp -> do + let newOrder = + ZGoOrder + Nothing + (oaddress o') + ("Xero-" <> + T.pack + (show $ o_id o')) + now + True + (ocurrency o') + (price cp) + (xi_total xI) + (xi_total xI / + price cp) + [ LineItem + 1 + ("Invoice from " <> + oname o' <> + " [" <> + xi_number xI <> + "]") + (xi_total xI) + ] + False + (xi_number xI) + (xi_shortcode xI) + (T.pack tk) + _ <- + liftAndCatchIO $ + run $ + upsertOrder newOrder + finalOrder <- + liftAndCatchIO $ + run $ + findXeroOrder + (oaddress o') + (xi_number xI) + (xi_shortcode xI) + case cast' . Doc =<< + finalOrder of + Nothing -> do + status + internalServerError500 + text + "Unable to save order to DB" + Just fO -> do + status created201 + Web.Scotty.json + (object + [ "reportType" .= + (0 :: Integer) + , "order" .= + toJSON + (fO :: ZGoOrder) + , "shop" .= + oname o' + ]) + else do status ok200 Web.Scotty.json (object [ "reportType" .= - (7 :: Integer) + (8 :: Integer) , "order" .= (Nothing :: Maybe ZGoOrder) , "shop" .= (Nothing :: Maybe String) ]) - Just cp -> do - let newOrder = - ZGoOrder - Nothing - (oaddress o') - ("Xero-" <> - T.pack - (show $ o_id o')) - now - True - (ocurrency o') - (price cp) - (xi_total xI) - (xi_total xI / price cp) - [ LineItem - 1 - ("Invoice from " <> - oname o' <> - " [" <> - xi_number xI <> - "]") - (xi_total xI) - ] - False - (xi_number xI) - (xi_shortcode xI) - (T.pack tk) - _ <- - liftAndCatchIO $ - run $ upsertOrder newOrder - finalOrder <- - liftAndCatchIO $ - run $ - findXeroOrder - (oaddress o') - (xi_number xI) - (xi_shortcode xI) - case cast' . Doc =<< finalOrder of - Nothing -> do - status - internalServerError500 - text - "Unable to save order to DB" - Just fO -> do - status created201 - Web.Scotty.json - (object - [ "reportType" .= - (0 :: Integer) - , "order" .= - toJSON - (fO :: ZGoOrder) - , "shop" .= oname o' - ]) - else do - status ok200 - Web.Scotty.json - (object - [ "reportType" .= - (8 :: Integer) - , "order" .= - (Nothing :: Maybe ZGoOrder) - , "shop" .= - (Nothing :: Maybe String) - ]) - else do - status ok200 - Web.Scotty.json - (object - [ "reportType" .= (7 :: Integer) - , "order" .= - (Nothing :: Maybe ZGoOrder) - , "shop" .= (Nothing :: Maybe String) - ]) - else do - status ok200 - Web.Scotty.json - (object - [ "reportType" .= (6 :: Integer) - , "order" .= (Nothing :: Maybe ZGoOrder) - , "shop" .= (Nothing :: Maybe String) - ]) - else do - status ok200 - Web.Scotty.json - (object - [ "reportType" .= (5 :: Integer) - , "order" .= (Nothing :: Maybe ZGoOrder) - , "shop" .= (Nothing :: Maybe String) - ]) - else do - status ok200 + else do + status ok200 + Web.Scotty.json + (object + [ "reportType" .= (7 :: Integer) + , "order" .= + (Nothing :: Maybe ZGoOrder) + , "shop" .= + (Nothing :: Maybe String) + ]) + else do + status ok200 + Web.Scotty.json + (object + [ "reportType" .= (6 :: Integer) + , "order" .= (Nothing :: Maybe ZGoOrder) + , "shop" .= (Nothing :: Maybe String) + ]) + else do + status ok200 + Web.Scotty.json + (object + [ "reportType" .= (5 :: Integer) + , "order" .= (Nothing :: Maybe ZGoOrder) + , "shop" .= (Nothing :: Maybe String) + ]) + else do + status ok200 + Web.Scotty.json + (object + [ "reportType" .= (1 :: Integer) + , "order" .= (Nothing :: Maybe ZGoOrder) + , "shop" .= (Nothing :: Maybe String) + ]) + Just eO -> do + status created201 Web.Scotty.json (object - [ "reportType" .= (1 :: Integer) - , "order" .= (Nothing :: Maybe ZGoOrder) - , "shop" .= (Nothing :: Maybe String) + [ "reportType" .= (0 :: Integer) + , "order" .= toJSON (eO :: ZGoOrder) + , "shop" .= oname o' ]) -- Get the xeroaccount code get "/api/xeroaccount" $ do