module QuickBooks
(
getAccessTokens
, getAccessTokens'
, getTempTokens
, getTempTokens'
, authorizationURLForToken
, cancelOAuthAuthorization
, cancelOAuthAuthorization'
, module QuickBooks.Types
, createInvoice
, createInvoice'
, readInvoice
, readInvoice'
, updateInvoice
, updateInvoice'
, deleteInvoice
, deleteInvoice'
, EmailAddress
, emailAddress
, sendInvoice
, sendInvoice'
, readAPIConfigFromFile
, readAppConfigFromFile
, queryCustomer
, queryCustomer'
, queryItem
, queryItem'
) where
import QuickBooks.Authentication
import QuickBooks.Types hiding (EmailAddress,emailAddress)
import Control.Applicative ((<$>),(<*>), (<|>))
import Control.Arrow (second)
import Data.ByteString.Char8 (pack)
import Data.Maybe (fromJust)
import Data.Text (Text)
import Network.HTTP.Client.TLS (tlsManagerSettings)
import Network.HTTP.Client (newManager)
import System.Environment (getEnvironment)
import Text.Email.Validate (EmailAddress, emailAddress)
import QuickBooks.Customer
import QuickBooks.Invoice ( createInvoiceRequest
, deleteInvoiceRequest
, readInvoiceRequest
, updateInvoiceRequest
, sendInvoiceRequest
)
import QuickBooks.Item
import QuickBooks.Logging (apiLogger, getLogger)
import Data.Yaml (ParseException, decodeFileEither)
queryCustomer
:: OAuthToken
-> Text
-> IO (Either String (QuickBooksResponse [Customer]))
queryCustomer tok =
queryQuickBooks tok . QueryCustomer
queryCustomer'
:: APIConfig
-> AppConfig
-> OAuthToken
-> Text
-> IO (Either String (QuickBooksResponse [Customer]))
queryCustomer' apiConfig appConfig tok =
queryQuickBooks' apiConfig appConfig tok . QueryCustomer
queryItem
:: OAuthToken
-> Text
-> IO (Either String (QuickBooksResponse [Item]))
queryItem tok =
queryQuickBooks tok . QueryItem
queryItem'
:: APIConfig
-> AppConfig
-> OAuthToken
-> Text
-> IO (Either String (QuickBooksResponse [Item]))
queryItem' apiConfig appConfig tok =
queryQuickBooks' apiConfig appConfig tok . QueryItem
createInvoice :: OAuthToken -> Invoice -> IO (Either String (QuickBooksResponse Invoice))
createInvoice tok = queryQuickBooks tok . CreateInvoice
createInvoice' :: APIConfig -> AppConfig -> OAuthToken -> Invoice -> IO (Either String (QuickBooksResponse Invoice))
createInvoice' apiConfig appConfig tok = queryQuickBooks' apiConfig appConfig tok . CreateInvoice
readInvoice :: OAuthToken -> InvoiceId -> IO (Either String (QuickBooksResponse Invoice))
readInvoice tok = queryQuickBooks tok . ReadInvoice
readInvoice' :: APIConfig -> AppConfig -> OAuthToken -> InvoiceId -> IO (Either String (QuickBooksResponse Invoice))
readInvoice' apiConfig appConfig tok = queryQuickBooks' apiConfig appConfig tok . ReadInvoice
updateInvoice :: OAuthToken -> Invoice -> IO (Either String (QuickBooksResponse Invoice))
updateInvoice tok = queryQuickBooks tok . UpdateInvoice
updateInvoice' :: APIConfig -> AppConfig -> OAuthToken -> Invoice -> IO (Either String (QuickBooksResponse Invoice))
updateInvoice' apiConfig appConfig tok = queryQuickBooks' apiConfig appConfig tok . UpdateInvoice
deleteInvoice :: OAuthToken -> InvoiceId -> SyncToken -> IO (Either String (QuickBooksResponse DeletedInvoice))
deleteInvoice tok iId = queryQuickBooks tok . DeleteInvoice iId
deleteInvoice' :: APIConfig -> AppConfig -> OAuthToken -> InvoiceId -> SyncToken -> IO (Either String (QuickBooksResponse DeletedInvoice))
deleteInvoice' apiConfig appConfig tok iId = queryQuickBooks' apiConfig appConfig tok . DeleteInvoice iId
sendInvoice :: OAuthToken -> InvoiceId -> EmailAddress -> IO (Either String (QuickBooksResponse Invoice))
sendInvoice tok invId = queryQuickBooks tok . SendInvoice invId
sendInvoice' :: APIConfig
-> AppConfig
-> OAuthToken
-> InvoiceId
-> EmailAddress
-> IO (Either String (QuickBooksResponse Invoice))
sendInvoice' apiConfig appConfig tok invId =
queryQuickBooks' apiConfig appConfig tok . SendInvoice invId
getTempTokens :: CallbackURL -> IO (Either String (QuickBooksResponse OAuthToken))
getTempTokens =
queryQuickBooksOAuth Nothing . GetTempOAuthCredentials
getTempTokens' :: AppConfig -> CallbackURL -> IO (Either String (QuickBooksResponse OAuthToken))
getTempTokens' appConfig =
queryQuickBooksOAuth' appConfig Nothing . GetTempOAuthCredentials
getAccessTokens :: OAuthToken -> OAuthVerifier -> IO (Either String (QuickBooksResponse OAuthToken))
getAccessTokens tempToken =
queryQuickBooksOAuth (Just tempToken) . GetAccessTokens
getAccessTokens' :: AppConfig
-> OAuthToken
-> OAuthVerifier
-> IO (Either String (QuickBooksResponse OAuthToken))
getAccessTokens' appConfig tempToken = do
queryQuickBooksOAuth' appConfig (Just tempToken) . GetAccessTokens
cancelOAuthAuthorization :: OAuthToken -> IO (Either String (QuickBooksResponse ()))
cancelOAuthAuthorization tok =
queryQuickBooksOAuth (Just tok) DisconnectQuickBooks
cancelOAuthAuthorization' :: AppConfig
-> OAuthToken
-> IO (Either String (QuickBooksResponse ()))
cancelOAuthAuthorization' appConfig tok =
queryQuickBooksOAuth' appConfig (Just tok) DisconnectQuickBooks
queryQuickBooks :: OAuthToken -> QuickBooksQuery a -> IO (Either String (QuickBooksResponse a))
queryQuickBooks tok query = do
apiConfig <- readAPIConfig
appConfig <- readAppConfig
queryQuickBooks' apiConfig appConfig tok query
queryQuickBooks' :: APIConfig -> AppConfig -> OAuthToken -> QuickBooksQuery a -> IO (Either String (QuickBooksResponse a))
queryQuickBooks' apiConfig appConfig tok query = do
manager <- newManager tlsManagerSettings
logger <- getLogger apiLogger
let ?appConfig = appConfig
let ?apiConfig = apiConfig
let ?manager = manager
let ?logger = logger
case query of
CreateInvoice invoice -> createInvoiceRequest tok invoice
ReadInvoice _invoiceId -> readInvoiceRequest tok _invoiceId
UpdateInvoice invoice -> updateInvoiceRequest tok invoice
DeleteInvoice _invoiceId syncToken -> deleteInvoiceRequest tok _invoiceId syncToken
SendInvoice _invoiceId emailAddr -> sendInvoiceRequest tok _invoiceId emailAddr
QueryCustomer queryCustomerName -> queryCustomerRequest tok queryCustomerName
QueryItem queryItemName -> queryItemRequest tok queryItemName
queryQuickBooksOAuth :: Maybe OAuthToken
-> QuickBooksOAuthQuery a
-> IO (Either String (QuickBooksResponse a))
queryQuickBooksOAuth maybeOAuthToken query = do
appConfig <- readAppConfig
queryQuickBooksOAuth' appConfig maybeOAuthToken query
queryQuickBooksOAuth' :: AppConfig
-> Maybe OAuthToken
-> QuickBooksOAuthQuery a
-> IO (Either String (QuickBooksResponse a))
queryQuickBooksOAuth' appConfig maybeOauthToken query = do
manager <- newManager tlsManagerSettings
logger <- getLogger apiLogger
let ?appConfig = appConfig
let ?manager = manager
let ?logger = logger
case query of
(GetTempOAuthCredentials callbackURL) -> getTempOAuthCredentialsRequest callbackURL
(GetAccessTokens oauthVerifier) -> getAccessTokensRequest (fromJust maybeOauthToken) oauthVerifier
DisconnectQuickBooks -> disconnectRequest (fromJust maybeOauthToken)
readAPIConfig :: IO APIConfig
readAPIConfig = do
env <- getEnvironment
case lookupAPIConfig env of
Just config -> return config
Nothing -> fail "The environment variables INTUIT_COMPANY_ID,INTUIT_TOKEN,INTUIT_SECRET, and INTUIT_HOSTNAME must be set"
readAppConfig :: IO AppConfig
readAppConfig = do
env <- getEnvironment
case lookupAppConfig env of
Just config -> return config
Nothing -> fail "The evironment variables INTUIT_CONSUMER_KEY and INTUIT_CONSUMER_SECRET must be set"
lookupAPIConfig :: [(String, String)] -> Maybe APIConfig
lookupAPIConfig environment = APIConfig <$> lookup "INTUIT_COMPANY_ID" env
<*> lookup "INTUIT_TOKEN" env
<*> lookup "INTUIT_SECRET" env
<*> lookup "INTUIT_HOSTNAME" env
<*> (lookup "INTUIT_API_LOGGING_ENABLED" env <|> Just "true")
where env = map (second pack) environment
readAPIConfigFromFile :: FilePath -> IO (Either ParseException APIConfig)
readAPIConfigFromFile = decodeFileEither
readAppConfigFromFile :: FilePath -> IO (Either ParseException AppConfig)
readAppConfigFromFile = decodeFileEither
lookupAppConfig :: [(String, String)] -> Maybe AppConfig
lookupAppConfig environment = AppConfig <$> lookup "INTUIT_CONSUMER_KEY" env
<*> lookup "INTUIT_CONSUMER_SECRET" env
where env = map (second pack) environment