packages feed

yesod-mangopay-1.10: app/Handler/Transaction.hs

-- | transactions: pay-in, transfer, pay-out
module Handler.Transaction where

import Import

import Yesod.MangoPay
import Web.MangoPay
import Data.Maybe (fromJust)
import Control.Arrow ((&&&))
import Data.Text (pack)
import Data.Default

-- | transaction list
getTransactionsR :: AnyUserId -> Handler Html
getTransactionsR uid= do
    pg<-getPagination
    txsL<-runYesodMPTToken $ listTransactionsForUser uid def (TxByCreationDate ASC) pg
    -- pagination links
    let (previous,next)=getPaginationNav pg txsL
    let txs=plData txsL
    defaultLayout $ do
        setTitleI MsgTitleTransactions
        $(widgetFile "transactions")


-- | get payin form
getPayinR :: AnyUserId -> Handler Html
getPayinR uid=do
    cards<-runYesodMPTToken $ getAll $ listCards uid def
    wallets<-runYesodMPTToken $ getAll $ listWallets uid def
    (widget, enctype) <- generateFormPost $ payinInForm cards wallets
    defaultLayout $ do
        setTitleI MsgTitlePayIn
        $(widgetFile "payin")

-- | payin
postPayinR :: AnyUserId -> Handler Html
postPayinR uid=do
  cards<-runYesodMPTToken $ getAll $ listCards uid def
  wallets<-runYesodMPTToken $ getAll $ listWallets uid def

  ((result, widget), enctype) <- runFormPost $ payinInForm cards wallets
  case result of
    FormSuccess (PayIn cid wid am cur)->do
            let cpi=mkCardPayin uid uid wid (Amount cur am) (Amount cur 0) "http://dummy" cid
            catchMP (do
              _<-runYesodMPTToken $ createCardPayin cpi
              setMessageI MsgPayInDone
              redirect $ TransactionsR uid
              )
              (\e->do
                setMessage $ toHtml $ show e
                defaultLayout $ do
                  setTitleI MsgTitlePayIn
                  $(widgetFile "payin")
              )
    _ -> do
            setMessageI MsgErrorData
            defaultLayout $ do
                  setTitleI MsgTitlePayIn
                  $(widgetFile "payin")

-- | get first transfer page: choose the target user
getTransfer1R :: AnyUserId -> Handler Html
getTransfer1R uid=do
  users<-runYesodMPTToken $ getAll $ listUsers def
  defaultLayout $ do
        setTitleI MsgTitleTransfer
        $(widgetFile "transfer1")

-- | get second transfer page: choose between wallets
getTransfer2R :: AnyUserId -> AnyUserId -> Handler Html
getTransfer2R uid touid=do
    fromWallets<-runYesodMPTToken $ getAll $ listWallets uid def
    toWallets<-runYesodMPTToken $ getAll $ listWallets touid def
    (widget, enctype) <- generateFormPost $ transferForm fromWallets toWallets
    defaultLayout $ do
        setTitleI MsgTitleTransfer
        $(widgetFile "transfer2")

-- | perfrm transfer
postTransfer2R :: AnyUserId -> AnyUserId -> Handler Html
postTransfer2R uid touid=do
  fromWallets<-runYesodMPTToken $ getAll $ listWallets uid def
  toWallets<-runYesodMPTToken $ getAll $ listWallets touid def

  ((result, widget), enctype) <- runFormPost $ transferForm fromWallets toWallets
  case result of
    FormSuccess (MPTransfer from to am cur)->do
            let t1=Web.MangoPay.Transfer Nothing Nothing Nothing uid (Just touid) (Amount cur am) (Amount cur 0)
                        from to Nothing Nothing Nothing Nothing Nothing
            catchMP (do
              _<-runYesodMPTToken $ createTransfer t1
              setMessageI MsgTransferDone
              redirect $ TransactionsR uid
              )
              (\e->do
                setMessage $ toHtml $ show e
                defaultLayout $ do
                  setTitleI MsgTitleTransfer
                  $(widgetFile "transfer2")
              )
    _ -> do
            setMessageI MsgErrorData
            defaultLayout $ do
                  setTitleI MsgTitleTransfer
                  $(widgetFile "transfer2")

-- | get payout form
getPayoutR :: AnyUserId -> Handler Html
getPayoutR uid=do
    wallets<-runYesodMPTToken $ getAll $ listWallets uid def
    accounts<-runYesodMPTToken $ getAll $ listAccounts uid def

    (widget, enctype) <- generateFormPost $ payoutForm wallets accounts
    defaultLayout $ do
        setTitleI MsgTitlePayOut
        $(widgetFile "payout")

-- | payout
postPayoutR :: AnyUserId -> Handler Html
postPayoutR uid=do
  wallets<-runYesodMPTToken $ getAll $ listWallets uid def
  accounts<-runYesodMPTToken $ getAll $ listAccounts uid def

  ((result, widget), enctype) <- runFormPost $ payoutForm wallets accounts
  case result of
    FormSuccess (PayOut wid aid am cur)->do
            let po=mkPayout uid wid (Amount cur am) (Amount cur 0) aid
            catchMP (do
              _<-runYesodMPTToken $ createPayout po
              setMessageI MsgPayOutDone
              redirect $ TransactionsR uid
              )
              (\e->do
                setMessage $ toHtml $ show e
                defaultLayout $ do
                  setTitleI MsgTitlePayOut
                  $(widgetFile "payout")
              )
    _ -> do
            setMessageI MsgErrorData
            defaultLayout $ do
                  setTitleI MsgTitlePayOut
                  $(widgetFile "payout")



-- | data necessary for payin
data PayIn = PayIn CardId WalletId Integer Currency

-- | payin form
payinInForm :: [Card] -> [Wallet] -> Html -> MForm Handler (FormResult PayIn, Widget)
payinInForm cards wallets= renderDivs $ PayIn
  <$> areq (selectFieldList (map (cardTitle &&& cId) cards)) (localizedFS MsgPayInCard) Nothing
  <*> areq (selectFieldList (map (wDescription &&& (fromJust . wId)) wallets)) (localizedFS MsgPayInWallet) Nothing
  <*> areq intField (localizedFS MsgPayInAmount) Nothing
  <*> areq (selectFieldList (map (id &&& id) supportedCurrencies)) (localizedFS MsgPayInCurrency) Nothing
  where cardTitle c = cAlias c <> " (" <> cCurrency c <> ")"

-- | data necessary for transfer
data MPTransfer= MPTransfer WalletId WalletId Integer Currency

-- | transfer form
transferForm :: [Wallet] -> [Wallet] -> Html -> MForm Handler (FormResult MPTransfer, Widget)
transferForm fromWallets toWallets=renderDivs $ MPTransfer
  <$> areq (selectFieldList (map (wDescription &&& (fromJust . wId)) fromWallets)) (localizedFS MsgTransferFromWallet) Nothing
  <*> areq (selectFieldList (map (wDescription &&& (fromJust . wId)) toWallets)) (localizedFS MsgTransferToWallet) Nothing
  <*> areq intField (localizedFS MsgTransferAmount) Nothing
  <*> areq (selectFieldList (map (id &&& id) supportedCurrencies)) (localizedFS MsgTransferCurrency) Nothing

-- | data necessary for payout
data PayOut = PayOut WalletId BankAccountId Integer Currency

-- | payin form
payoutForm :: [Wallet] -> [BankAccount] -> Html -> MForm Handler (FormResult PayOut, Widget)
payoutForm wallets accounts= renderDivs $ PayOut
  <$> areq (selectFieldList (map (wDescription &&& (fromJust . wId)) wallets)) (localizedFS MsgPayOutWallet) Nothing
  <*> areq (selectFieldList (map ((pack . show . baDetails) &&& (fromJust . baId)) accounts)) (localizedFS MsgPayOutAccount) Nothing
  <*> areq intField (localizedFS MsgPayOutAmount) Nothing
  <*> areq (selectFieldList (map (id &&& id) supportedCurrencies)) (localizedFS MsgPayOutCurrency) Nothing