README.md

# Quickbooks
IN PROGRESS(Not for production yet)

Integration with Quickbooks Online via the Intuit Data Services v3 REST API

This library communicates with the Quickbooks Data Services `v3` API, documented at:

[Data Services v3](https://developer.intuit.com/docs/api/accounting)

## Installation
  1. Add `quickbooks` to your list of dependencies in `mix.exs`:

    ```elixir
    def deps do
      [{:quickbooks, "~> 0.1.0"}]
    end
    ```

  2. Ensure `quickbooks` is started before your application:

    ```elixir
    def application do
      [applications: [:quickbooks]]
    end
    ```

## Getting Started & Initiating Authentication Flow with Intuit

What follows is an example using Phoenix but the principles can be adapted to any other framework / pure Elixir.

Adds in your env.esx

```elixir
# Configure quickbooks
config :quickbooks,
  oauth_consumer_key: "qyprdzfo4URox8GsQiOi0CfTLZaibs",
  oauth_consumer_secret: "5ayBG2IVwozKVdzwW4dDLRFAu8cUoOQqQRjM2fAX",
  oauth_callback_url: "http://localhost:4000/oauth/quickbooks/callback",
  sandbox_mode: true,
  log: true
```

To start the authentication flow with Intuit you include the Intuit Javascript and on a page of your choosing you present the "Connect to Quickbooks" button by including this XHTML:

```HTML
<!-- somewhere in your document include the Javascript -->
<script type="text/javascript" src="https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere.js"></script>

<!-- configure the Intuit object: 'grantUrl' is a URL in your application which kicks off the flow, see below -->
<script>
intuit.ipp.anywhere.setup({menuProxy: '/path/to/blue-dot', grantUrl: '/path/to/your-flow-start'});
</script>

<!-- this will display a button that the user clicks to start the flow -->
<ipp:connectToIntuit></ipp:connectToIntuit>
```

Your Controller action (the `grantUrl` above) should look like this:

```elixir
  def authenticate(conn, _params) do
    {:ok, response, redirect_url} = Quickbooks.OAuthQBO.get_request_token

    conn
      |> put_session(:token, response["oauth_token"])
      |> put_session(:secret, response["oauth_token_secret"])
      |> redirect external: redirect_url
  end
```

The `callback_url` is set on config section, is the absolute URL of your application that Intuit should send the user when authentication succeeds. That action should look like:

```elixir
def oauth_callback(conn, params) do  
  # Persist token, token_secret and realm_id
end
```

Example to retrieve Customers:
```elixir
alias Quickbooks.AccountingAPI.{CustomerQBO}   


def index(conn, _params) do
  # This credentials we can store in a JSONB column on companies column
  credentials = %{token: user_info.token, token_secret: user_info.secret, realm_id: user_info.realm_id}
  case CustomerQBO.query(credentials) do
    {:ok, response} ->
      {startPosition: start_position, maxResults: max_results, Customer: customers} = response

      ...
    {:error, error} ->
      IO.inspect error
  end
end
```

README based from: [quickbooks-ruby](https://github.com/ruckus/quickbooks-ruby) (Thanks!)