{-# LANGUAGE ConstraintKinds, DeriveDataTypeable, FlexibleContexts, OverloadedStrings, PatternGuards #-} -- | refunds on payins and transfers module Web.MangoPay.Refunds where import Web.MangoPay.Monad import Web.MangoPay.Payins import Web.MangoPay.Types import Web.MangoPay.Users import Web.MangoPay.Wallets import Data.Text import Data.Typeable (Typeable) import Data.Aeson import Data.Time.Clock.POSIX (POSIXTime) import Control.Applicative -- | refund a transfer refundTransfer :: (MPUsableMonad m) => TransferId -> AnyUserId -> AccessToken -> MangoPayT m Refund refundTransfer tid authId at= do url<-getClientURLMultiple ["/transfers/",tid,"/refunds"] postExchange url (Just at) (RefundRequest authId Nothing Nothing) -- | refund a pay-in refundPayin :: (MPUsableMonad m) => AnyPayinId -> RefundRequest -> AccessToken -> MangoPayT m Refund refundPayin pid rr at= do url<-getClientURLMultiple ["/payins/",pid,"/refunds"] postExchange url (Just at) rr -- | fetch a refund from its Id fetchRefund :: (MPUsableMonad m) => RefundId -> AccessToken -> MangoPayT m Refund fetchRefund = fetchGeneric "/refunds/" -- | refund request data RefundRequest=RefundRequest{ rrAuthorId :: AnyUserId -- ^ The user Id of the author ,rrDebitedFunds :: Maybe Amount -- ^ Strictly positive amount. In cents. ,rrFees :: Maybe Amount -- ^ In cents }deriving (Show,Eq,Ord,Typeable) -- | to json as per MangoPay format instance ToJSON RefundRequest where toJSON rr=objectSN ["AuthorId" .= rrAuthorId rr,"DebitedFunds" .= rrDebitedFunds rr, "Fees" .= rrFees rr] -- | id of a refund type RefundId = Text -- | refund of a transfer data Refund=Refund{ rId :: RefundId -- ^ Id of the refund ,rCreationDate :: POSIXTime ,rTag :: Maybe Text -- ^ Custom data ,rAuthorId :: AnyUserId -- ^ The user Id of the author ,rDebitedFunds :: Amount -- ^ Strictly positive amount. In cents. ,rFees :: Amount -- ^ In cents ,rCreditedFunds :: Amount -- ^ In cents ,rStatus :: TransferStatus ,rResultCode :: Text -- ^ The transaction result code ,rResultMessage :: Maybe Text -- ^ The transaction result Message ,rExecutionDate :: Maybe POSIXTime ,rType :: TransactionType ,rNature :: TransactionNature ,rCreditedUserId :: Maybe AnyUserId -- ^ Id of the user owner of the credited wallet ,rInitialTransactionId :: TransactionId -- ^ Id of the transaction being refunded ,rInitialTransactionType :: TransactionType -- ^ The type of the transaction before being refunded (PayIn, Refund) ,rDebitedWalletId :: WalletId -- ^ The Id of the debited Wallet ,rCreditedWalletId :: Maybe WalletId -- ^ The Id of the credited Wallet ,rReason :: RefundReason -- ^ The reason from the refund, since } deriving (Show,Eq,Ord,Typeable) -- | from json as per MangoPay format instance FromJSON Refund where parseJSON (Object v) =Refund <$> v .: "Id" <*> v .: "CreationDate" <*> v .:? "Tag" <*> v .: "AuthorId" <*> v .: "DebitedFunds" <*> v .: "Fees" <*> v .: "CreditedFunds" <*> v .: "Status" <*> v .: "ResultCode" <*> v .:? "ResultMessage" <*> v .:? "ExecutionDate" <*> v .: "Type" <*> v .: "Nature" <*> v .:? "CreditedUserId" <*> v .: "InitialTransactionId" <*> v .: "InitialTransactionType" <*> v .: "DebitedWalletId" <*> v .:? "CreditedWalletID" <*> v .: "RefundReason" parseJSON _=fail "Refund" -- | Type for redund reason, since . data RefundReasonType = BANKACCOUNT_HAS_BEEN_CLOSED | INITIALIZED_BY_CLIENT | OTHER deriving (Show,Read,Eq,Ord,Bounded,Enum,Typeable) -- | to json as per MangoPay format instance ToJSON RefundReasonType where toJSON =toJSON . show -- | from json as per MangoPay format instance FromJSON RefundReasonType where parseJSON = jsonRead "RefundReasonType" -- | Reason for a refund, since . data RefundReason = RefundReason { rrMessage :: Maybe Text , rrType :: RefundReasonType } deriving (Show,Eq,Ord,Typeable) -- | from json as per MangoPay format instance FromJSON RefundReason where parseJSON (Object v) =RefundReason <$> v .:? "RefundReasonMessage" <*> v .: "RefundReasonType" parseJSON _=fail "RefundReason"