Visma eAccounting Ruby API Wrapper
VismaEaccounting is an API wrapper for the Visma eAccounting API.
Important Notes
VismaEaccounting returns a VismaEaccounting::Response
instead of the response body directly. VismaEaccounting::Response
exposes the parsed response body
and headers
.
Installation
$ gem install visma_eaccounting
Authentication
The Visma eAccounting API authenticates using a token which you can retrieve when authorizating using OAuth with your Visma eAccounting account.
To retrieve an access token you can use omniauth-visma. Do note that this token expires in one hour so you need to fetch a new access token using the refresh token when required.
Usage
First, create a one-time use instance of VismaEaccounting::Request
:
visma_eaccounting = VismaEaccounting::Request.new(token: "your_token")
Note Only reuse instances of VismaEaccounting after terminating a call with a verb, which makes a request. Requests are light weight objects that update an internal path based on your call chain. When you terminate a call chain with a verb, a request instance makes a request and resets the path.
You can set an individual request's timeout
and open_timeout
like this:
visma_eaccounting.timeout = 30
visma_eaccounting.open_timeout = 30
You can read about timeout
and open_timeout
in the Net::HTTP doc.
Now you can make requests using the resources defined in the Visma eAccounting's docs. Resource IDs
are specified inline and a CRUD
(create
, retrieve
, update
, or delete
) verb initiates the request.
You can specify headers
, params
, and body
when calling a CRUD
method. For example:
visma_eaccounting.customers.retrieve(headers: {"SomeHeader": "SomeHeaderValue"}, params: {"query_param": "query_param_value"})
Of course, body
is only supported on create
and update
calls. Those map to HTTP POST
and PUT
verbs respectively.
You can set token
, api_endpoint
, timeout
, open_timeout
, faraday_adapter
, proxy
, symbolize_keys
, logger
, and debug
globally:
VismaEaccounting::Request.token = "your_token"
VismaEaccounting::Request.timeout = 15
VismaEaccounting::Request.open_timeout = 15
VismaEaccounting::Request.symbolize_keys = true
VismaEaccounting::Request.debug = false
For example, you could set the values above in an initializer
file in your Rails
app (e.g. your_app/config/initializers/visma_eaccounting.rb).
Assuming you've set an token
on VismaEaccounting, you can conveniently make API calls on the class itself:
VismaEaccounting::Request.customers.retrieve
Note Substitute an underscore if a resource name contains a hyphen.
Pass symbolize_keys: true
to use symbols (instead of strings) as hash keys in API responses.
visma_eaccounting = VismaEaccounting::Request.new(token: "your_token", symbolize_keys: true)
Visma's API documentation is a list of available endpoints.
Debug Logging
Pass debug: true
to enable debug logging to STDOUT.
visma_eaccounting = VismaEaccounting::Request.new(token: "your_token", debug: true)
Custom logger
Ruby Logger.new
is used by default, but it can be overrided using:
visma_eaccounting = VismaEaccounting::Request.new(token: "your_token", debug: true, logger: MyLogger.new)
Logger can be also set by globally:
VismaEaccounting::Request.logger = MyLogger.new
Examples
Customers
Fetch all customers:
visma_eaccounting.customers.retrieve
By default the Visma API returns 50 results. To set the count to 50:
visma_eaccounting.customers.retrieve(params: {"pagesize": "100"})
And to retrieve the next 50 customers:
visma_eaccounting.customers.retrieve(params: {"pagesize": "100", "page": "2"})
Query using filters:
visma_eaccounting.customers.retrieve(params: {"filter": "contains(Name, ‘MakePlans’)"})
Retrieving a specific customer looks like:
visma_eaccounting.customers(customer_id).retrieve
Add a new customer:
visma_eaccounting.customers.create(body: {"Name": "MakePlans AS"})
Fields
Only retrieve ids and names for fetched customers:
visma_eaccounting.customers.retrieve(params: {"select": "Id, Name"})
Error handling
VismaEaccounting raises an error when the API returns an error.
VismaEaccounting::VismaEaccountingError
has the following attributes: title
, detail
, body
, raw_body
, status_code
. Some or all of these may not be
available depending on the nature of the error. For example:
begin
visma_eaccounting.customers.create(body: body)
rescue VismaEaccounting::VismaEaccountingError => e
puts "Houston, we have a problem: #{e.message} - #{e.raw_body}"
end
Other
You can set an optional proxy url like this (or with an environment variable VISMA_PROXY):
visma_eaccounting.proxy = 'http://your_proxy.com:80'
You can set a different Faraday adapter during initialization:
visma_eaccounting = VismaEaccounting::Request.new(token: "your_token", faraday_adapter: :net_http)
Initialization
visma_eaccounting = VismaEaccounting::Request.new(token: "your_token")
Thanks
Thanks to everyone who has contributed to VismaEaccounting's development.
Credits
Based on Gibbon by Amro Mousa.
Copyright
- Copyright (c) 2010-2017 Espen Antonsen and Amro Mousa. See LICENSE.txt for details.