module Web.MangoPay.Documents where
import Web.MangoPay.Monad
import Web.MangoPay.Types
import Web.MangoPay.Users
import Data.ByteString (ByteString)
import Data.Default
import Data.Text hiding (any)
import Data.Typeable (Typeable)
import Data.Aeson
import Control.Applicative
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base64 as B64
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
createDocument :: (MPUsableMonad m) => AnyUserId -> Document -> AccessToken -> MangoPayT m Document
createDocument uid d = createGeneric path d
where path = BS.concat ["/users/",TE.encodeUtf8 uid,"/KYC/documents/"]
modifyDocument :: (MPUsableMonad m) => AnyUserId -> Document -> AccessToken -> MangoPayT m Document
modifyDocument uid d = modifyGeneric path d dId
where path = T.concat ["/users/", uid, "/KYC/documents/"]
fetchDocument :: (MPUsableMonad m) => AnyUserId -> DocumentId -> AccessToken -> MangoPayT m Document
fetchDocument uid = fetchGeneric path
where path = T.concat ["/users/",uid,"/KYC/documents/"]
createPage :: (MPUsableMonad m) => AnyUserId -> DocumentId -> BS.ByteString -> AccessToken -> MangoPayT m ()
createPage uid did contents at=do
let val=object ["File" .= TE.decodeUtf8 (B64.encode contents)]
url<-getClientURLMultiple ["/users/",uid,"/KYC/documents/",did,"/pages"]
postNoReply url (Just at) val
listDocuments :: (MPUsableMonad m) => AnyUserId -> DocumentFilter -> GenericSort -> Maybe Pagination -> AccessToken -> MangoPayT m (PagedList Document)
listDocuments uid df gs= genericListExtra (documentFilterAttributes df ++ sortAttributes gs)
["/users/",uid,"/KYC/documents"]
listAllDocuments :: (MPUsableMonad m) => DocumentFilter -> GenericSort -> Maybe Pagination -> AccessToken -> MangoPayT m (PagedList Document)
listAllDocuments df gs = genericListExtra (documentFilterAttributes df ++ sortAttributes gs)
["/KYC/documents"]
type DocumentId = Text
data DocumentType= IDENTITY_PROOF
| REGISTRATION_PROOF
| ARTICLES_OF_ASSOCIATION
| SHAREHOLDER_DECLARATION
| ADDRESS_PROOF
deriving (Show,Read,Eq,Ord,Bounded,Enum,Typeable)
instance ToJSON DocumentType where
toJSON =toJSON . show
instance FromJSON DocumentType where
parseJSON = jsonRead "DocumentType"
data DocumentStatus=CREATED
| VALIDATION_ASKED
| VALIDATED
| REFUSED
deriving (Show,Read,Eq,Ord,Bounded,Enum,Typeable)
instance ToJSON DocumentStatus where
toJSON =toJSON . show
instance FromJSON DocumentStatus where
parseJSON = jsonRead "DocumentStatus"
data Document = Document {
dId :: Maybe DocumentId
,dCreationDate :: Maybe MpTime
,dTag :: Maybe Text
,dType :: DocumentType
,dStatus :: Maybe DocumentStatus
,dRefusedReasonType :: Maybe Text
,dRefusedReasonMessage :: Maybe Text
} deriving (Show,Ord,Eq,Typeable)
instance ToJSON Document where
toJSON d=objectSN ["Tag" .= dTag d,
"Type" .= dType d,"Status" .= dStatus d]
instance FromJSON Document where
parseJSON (Object v) =Document <$>
v .: "Id" <*>
v .: "CreationDate" <*>
v .:? "Tag" <*>
v .: "Type" <*>
v .: "Status" <*>
v .:? "RefusedReasonType" <*>
v .:? "RefusedReasonMessage"
parseJSON _=fail "Document"
hasValidatedDocument
:: DocumentType
-> [Document]
-> Bool
hasValidatedDocument dtype = any (\d -> dtype == dType d && Just VALIDATED == dStatus d)
getKindOfAuthentication
:: Either NaturalUser LegalUser
-> [Document]
-> KindOfAuthentication
getKindOfAuthentication _ [] = Light
getKindOfAuthentication (Left nu) docs =
case (uAddress nu,uOccupation nu,uIncomeRange nu,hasValidatedDocument IDENTITY_PROOF docs) of
(Just _,Just _, Just _,True) -> if hasValidatedDocument ADDRESS_PROOF docs
then Strong
else Regular
_ -> Light
getKindOfAuthentication (Right lu) docs=
case (lHeadquartersAddress lu,lLegalRepresentativeEmail lu,lLegalRepresentativeAddress lu,
hasValidatedDocument ARTICLES_OF_ASSOCIATION docs,
hasValidatedDocument REGISTRATION_PROOF docs,
hasValidatedDocument SHAREHOLDER_DECLARATION docs) of
(Just _, Just _, Just _, True, True, True) -> Regular
_ -> Light
getRequiredDocumentTypes
:: Either NaturalUser LegalUser
-> [DocumentType]
getRequiredDocumentTypes (Left _) = [IDENTITY_PROOF, ADDRESS_PROOF]
getRequiredDocumentTypes (Right _) = [ARTICLES_OF_ASSOCIATION, REGISTRATION_PROOF, SHAREHOLDER_DECLARATION]
data DocumentFilter = DocumentFilter
{
dfBefore :: Maybe MpTime
, dfAfter :: Maybe MpTime
, dfStatus :: Maybe DocumentStatus
, dfType :: Maybe DocumentType
} deriving (Show,Eq,Ord,Typeable)
instance Default DocumentFilter where
def = DocumentFilter Nothing Nothing Nothing Nothing
documentFilterAttributes :: DocumentFilter -> [(ByteString,Maybe ByteString)]
documentFilterAttributes f=[ "BeforeDate" ?+ dfBefore f
, "AfterDate" ?+ dfAfter f
, "Status" ?+ (show <$> (dfStatus f))
, "Type" ?+ (show <$> (dfType f))]