diff --git a/lib/freeagent.rb b/lib/freeagent.rb index 55963e7..f477117 100644 --- a/lib/freeagent.rb +++ b/lib/freeagent.rb @@ -2,12 +2,13 @@ module FreeAgent require_relative 'freeagent/client' require_relative 'freeagent/errors' + require_relative 'freeagent/collection' require_relative 'freeagent/resource' require_relative 'freeagent/user' require_relative 'freeagent/company' require_relative 'freeagent/timeline_item' require_relative 'freeagent/attachment' - + require_relative 'freeagent/category' require_relative 'freeagent/contact' require_relative 'freeagent/project' require_relative 'freeagent/task' @@ -19,6 +20,8 @@ module FreeAgent require_relative 'freeagent/estimate' require_relative 'freeagent/expense' require_relative 'freeagent/bank_transaction' + require_relative 'freeagent/bank_transaction_explanation' + class << self attr_accessor :environment attr_accessor :debug diff --git a/lib/freeagent/bank_transaction_explanation.rb b/lib/freeagent/bank_transaction_explanation.rb new file mode 100644 index 0000000..0ee0864 --- /dev/null +++ b/lib/freeagent/bank_transaction_explanation.rb @@ -0,0 +1,17 @@ +module FreeAgent + class BankTransactionExplanation < Resource + resource :bank_transaction_explanation + + resource_methods :default + attr_accessor :bank_account, :bank_transaction, :manual_sales_tax_amount, :sales_tax_rate, :description, + :gross_value, :foreign_currency_value, :rebill_type, :rebill_factor, :category, :paid_invoice, + :paid_bill, :paid_user, :transfer_bank_account, :asset_life_years, :attachment + + date_accessor :dated_on + + def self.find_all_by_bank_account(bank_account, options = {}) + options.merge!(:bank_account => bank_account) + BankTransactionExplanation.filter(options) + end + end +end diff --git a/lib/freeagent/category.rb b/lib/freeagent/category.rb new file mode 100644 index 0000000..19689be --- /dev/null +++ b/lib/freeagent/category.rb @@ -0,0 +1,23 @@ +module FreeAgent + class Category < Resource + resource :category + endpoint[:plural] = :categories + + resource_methods :find + + attr_accessor :url, :description, :nominal_code, :allowable_for_tax, :tax_reporting_name, :auto_sales_tax_rate + + def self.all + response = FreeAgent.client.get("#{endpoint[:plural]}") + response.values.flatten.collect { |r| self.new(r) } + end + + def self.find(id) + response = FreeAgent.client.get("#{endpoint[:plural]}/#{id}") + self.new(response.values.first) + rescue FreeAgent::ApiError => error + raise error if FreeAgent.debug + nil + end + end +end diff --git a/lib/freeagent/client.rb b/lib/freeagent/client.rb index 05e2291..d074db6 100644 --- a/lib/freeagent/client.rb +++ b/lib/freeagent/client.rb @@ -59,21 +59,31 @@ def access_token=(token) end def get(path, params={}) - request(:get, "#{Client.site}#{path}", :params => params).parsed + parse(request(:get, "#{Client.site}#{path}", :params => params)) end def post(path, data={}) - request(:post, "#{Client.site}#{path}", :data => data).parsed + parse(request(:post, "#{Client.site}#{path}", :data => data)) end def put(path, data={}) - request(:put, "#{Client.site}#{path}", :data => data).parsed + parse(request(:put, "#{Client.site}#{path}", :data => data)) end def delete(path, data={}) - request(:delete, "#{Client.site}#{path}", :data => data).parsed + parse(request(:delete, "#{Client.site}#{path}", :data => data)) end + def parse(request) + request.parsed.tap do |hash| + if link_header = request.headers['Link'] + link_header.scan(/<(https:.*?)>; rel='(prev|next|first|last)'/).each do |(url, rel)| + hash[rel] = url + end + end + end + end + private def request(method, path, options = {}) diff --git a/lib/freeagent/collection.rb b/lib/freeagent/collection.rb new file mode 100644 index 0000000..1f8eed6 --- /dev/null +++ b/lib/freeagent/collection.rb @@ -0,0 +1,49 @@ +module FreeAgent + class Collection < Array + def initialize(response, resource) + super(response[resource.endpoint[:plural]].collect { |r| resource.new(r) }) + @resource = resource + @next_page_url = response['next'] + @prev_page_url = response['prev'] + @first_page_url = response['first'] + @last_page_url = response['last'] + end + + def next_page? + @next_page_url + end + + def prev_page? + @prev_page_url + end + + def first_page? + @first_page_url + end + + def last_page? + @last_page_url + end + + def next_page + fetch_page(@next_page_url) + end + + def prev_page + fetch_page(@prev_page_url) + end + + def first_page + fetch_page(@first_page_url) + end + + def last_page + fetch_page(@last_page_url) + end + + def fetch_page(url) + uri = URI.parse(url).request_uri.gsub(/^\/v2/, '') + Collection.new(FreeAgent.client.get(uri), @resource) + end + end +end diff --git a/lib/freeagent/resource.rb b/lib/freeagent/resource.rb index 1e33c8b..c49dad2 100644 --- a/lib/freeagent/resource.rb +++ b/lib/freeagent/resource.rb @@ -112,8 +112,7 @@ def self.define_all def self.define_filter self.define_singleton_method(:filter) do |params| - response = FreeAgent.client.get("#{endpoint[:plural]}/", params) - response[endpoint[:plural]].collect{ |r| self.new(r) } + Collection.new(FreeAgent.client.get("#{endpoint[:plural]}/", params), self) end end