stripe-haskell-0.1.0.0: src/Web/Stripe/Invoice.hs
{-# LANGUAGE OverloadedStrings #-}
-------------------------------------------
-- |
-- Module : Web.Stripe.Invoice
-- Copyright : (c) David Johnson, 2014
-- Maintainer : djohnson.m@gmail.com
-- Stability : experimental
-- Portability : POSIX
--
-- < https:/\/\stripe.com/docs/api#invoices >
--
-- @
-- import Web.Stripe
-- import Web.Stripe.Customer
-- import Web.Stripe.Invoice
-- import Web.Stripe.InvoiceItem
-- import Web.Stripe.Plan
--
-- main :: IO ()
-- main = do
-- let config = SecretKey "secret_key"
-- result <- stripe config $ do
-- Customer { customerId = cid } <- createEmptyCustomer
-- Plan { } <- createPlan (PlanId "planid") 20 USD Day "testplan" []
-- InvoiceItem { } <- createInvoiceItem cid 100 USD Nothing Nothing Nothing []
-- createInvoice cid []
-- case result of
-- Right invoice -> print invoice
-- Left stripeError -> print stripeError
-- @
module Web.Stripe.Invoice
( -- * API
createInvoice
, getInvoice
, getInvoiceExpandable
, getInvoices
, getInvoicesExpandable
, getInvoiceLineItems
, getUpcomingInvoice
, getUpcomingInvoices
, updateInvoice
, payInvoice
-- * Types
, Invoice (..)
, InvoiceId (..)
, InvoiceLineItem (..)
, InvoiceLineItemId (..)
, InvoiceLineItemType (..)
, Discount (..)
, Period (..)
) where
import Web.Stripe.Client.Internal
import Web.Stripe.Types
import Web.Stripe.Types.Util
------------------------------------------------------------------------------
-- | The `Invoice` to be created for a `Customer`
createInvoice
:: CustomerId -- ^ `CustomerId` of `Customer` to `Invoice`
-> MetaData -- ^ `MetaData` of `Customer` to `Invoice`
-> Stripe Invoice
createInvoice
customerid
metadata = callAPI request
where request = StripeRequest POST url params
url = "invoices"
params = toMetaData metadata ++ getParams [
("customer", Just $ getCustomerId customerid)
]
------------------------------------------------------------------------------
-- | Retrieve an `Invoice` by `InvoiceId`
getInvoice
:: InvoiceId -- ^ Get an `Invoice` by `InvoiceId`
-> Stripe Invoice
getInvoice
invoiceid = getInvoiceExpandable invoiceid []
------------------------------------------------------------------------------
-- | Retrieve an `Invoice` by `InvoiceId` with `ExpandParams`
getInvoiceExpandable
:: InvoiceId -- ^ Get an `Invoice` by `InvoiceId`
-> ExpandParams -- ^ `ExpandParams` of the objects for expansion
-> Stripe Invoice
getInvoiceExpandable
invoiceid
expandParams = callAPI request
where request = StripeRequest GET url params
url = "invoices" </> getInvoiceId invoiceid
params = toExpandable expandParams
------------------------------------------------------------------------------
-- | Retrieve a `StripeList` of `Invoice`s
getInvoices
:: Maybe Limit -- ^ Defaults to 10 if `Nothing` specified
-> StartingAfter InvoiceItemId -- ^ Paginate starting after the following `Customer`
-> EndingBefore InvoiceItemId -- ^ Paginate ending before the following `CustomerID`
-> Stripe (StripeList Invoice)
getInvoices
limit
startingAfter
endingBefore =
getInvoicesExpandable limit startingAfter endingBefore []
------------------------------------------------------------------------------
-- | Retrieve a `StripeList` of `Invoice`s with `ExpandParams`
getInvoicesExpandable
:: Maybe Limit -- ^ Defaults to 10 if `Nothing` specified
-> StartingAfter InvoiceItemId -- ^ Paginate starting after the following `Customer`
-> EndingBefore InvoiceItemId -- ^ Paginate ending before the following `CustomerID`
-> ExpandParams -- ^ `ExpandParams` of the objects for expansion
-> Stripe (StripeList Invoice)
getInvoicesExpandable
limit
startingAfter
endingBefore
expandParams = callAPI request
where request = StripeRequest GET url params
url = "invoices"
params = getParams [
("limit", toText `fmap` limit )
, ("starting_after", (\(InvoiceItemId x) -> x) `fmap` startingAfter)
, ("ending_before", (\(InvoiceItemId x) -> x) `fmap` endingBefore)
] ++ toExpandable expandParams
------------------------------------------------------------------------------
-- | Retrieve an `Invoice` by `InvoiceId`
getInvoiceLineItems
:: InvoiceId -- ^ Get an `Invoice` by `InvoiceId`
-> Limit -- ^ Defaults to 10 if `Nothing` specified
-> StartingAfter InvoiceLineItemId -- ^ Paginate starting after the following `InvoiceLineItemId`
-> EndingBefore InvoiceLineItemId -- ^ Paginate ending before the following `InvoiceLineItemId`
-> Stripe (StripeList InvoiceLineItem)
getInvoiceLineItems
invoiceid
limit
startingAfter
endingBefore = callAPI request
where request = StripeRequest GET url params
url = "invoices" </> getInvoiceId invoiceid </> "lines"
params = getParams [
("limit", toText `fmap` limit )
, ("starting_after", (\(InvoiceLineItemId x) -> x) `fmap` startingAfter)
, ("ending_before", (\(InvoiceLineItemId x) -> x) `fmap` endingBefore)
]
------------------------------------------------------------------------------
-- | Pay `Invoice` by `InvoiceId`
payInvoice
:: InvoiceId -- ^ The `InvoiceId` of the `Invoice` to pay
-> Stripe Invoice
payInvoice
invoiceid = callAPI request
where request = StripeRequest POST url params
url = "invoices" </> getInvoiceId invoiceid </> "pay"
params = []
------------------------------------------------------------------------------
-- | Update `Invoice` by `InvoiceId`
updateInvoice
:: InvoiceId -- ^ The `InvoiceId` of the `Invoice` to update
-> MetaData -- ^ `MetaData` of `Customer` to `Invoice`
-> Stripe Invoice
updateInvoice
invoiceid
metadata = callAPI request
where request = StripeRequest POST url params
url = "invoices" </> getInvoiceId invoiceid
params = toMetaData metadata
------------------------------------------------------------------------------
-- | Retrieve an upcoming `Invoice` for a `Customer` by `CustomerId`
getUpcomingInvoice
:: CustomerId -- ^ The `InvoiceId` of the `Invoice` to retrieve
-> Stripe Invoice
getUpcomingInvoice
customerid = callAPI request
where request = StripeRequest GET url params
url = "invoices" </> "upcoming"
params = getParams [
("customer", Just $ getCustomerId customerid)
]
------------------------------------------------------------------------------
-- | Retrieve a `StripeList` of `Invoice`s
getUpcomingInvoices
:: CustomerId -- ^ The `InvoiceId` of the `Invoice` to retrieve
-> Stripe (StripeList Invoice)
getUpcomingInvoices
customerid = callAPI request
where request = StripeRequest GET url params
url = "invoices"
params = getParams [
("customer", Just $ getCustomerId customerid)
]