quickbooks-ruby 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/quickbooks/model/base_model_json.rb +16 -0
  3. data/lib/quickbooks/model/base_reference.rb +2 -1
  4. data/lib/quickbooks/model/change_model.rb +10 -0
  5. data/lib/quickbooks/model/credit_memo_change.rb +8 -0
  6. data/lib/quickbooks/model/customer_change.rb +2 -6
  7. data/lib/quickbooks/model/definition.rb +38 -34
  8. data/lib/quickbooks/model/entity.rb +1 -1
  9. data/lib/quickbooks/model/invoice_change.rb +1 -5
  10. data/lib/quickbooks/model/item_change.rb +2 -6
  11. data/lib/quickbooks/model/payment_change.rb +8 -0
  12. data/lib/quickbooks/model/reports.rb +2 -2
  13. data/lib/quickbooks/model/sales_receipt.rb +1 -1
  14. data/lib/quickbooks/model/tax_agency.rb +18 -0
  15. data/lib/quickbooks/model/tax_rate_detail_line.rb +23 -0
  16. data/lib/quickbooks/model/tax_service.rb +52 -0
  17. data/lib/quickbooks/model/vendor_change.rb +2 -6
  18. data/lib/quickbooks/service/base_service.rb +34 -9
  19. data/lib/quickbooks/service/base_service_json.rb +39 -0
  20. data/lib/quickbooks/service/change_service.rb +28 -0
  21. data/lib/quickbooks/service/credit_memo_change.rb +16 -0
  22. data/lib/quickbooks/service/customer_change.rb +6 -13
  23. data/lib/quickbooks/service/invoice_change.rb +5 -12
  24. data/lib/quickbooks/service/item_change.rb +6 -13
  25. data/lib/quickbooks/service/payment_change.rb +16 -0
  26. data/lib/quickbooks/service/reports.rb +18 -8
  27. data/lib/quickbooks/service/service_crud.rb +2 -1
  28. data/lib/quickbooks/service/service_crud_json.rb +31 -0
  29. data/lib/quickbooks/service/tax_agency.rb +12 -0
  30. data/lib/quickbooks/service/tax_service.rb +11 -0
  31. data/lib/quickbooks/service/vendor_change.rb +6 -13
  32. data/lib/quickbooks/version.rb +1 -1
  33. data/lib/quickbooks-ruby.rb +15 -1
  34. metadata +16 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 24d6dec4cc2648c1f89dbae32ce9420d39fe9349
4
- data.tar.gz: 8f26780aa09b6fafaf97cb828f004268f03403be
3
+ metadata.gz: 0dba56b54b2268020885411d264f5c4b6314d553
4
+ data.tar.gz: e80fd5e293a8815acba2a21ad382943207cb95c1
5
5
  SHA512:
6
- metadata.gz: 1d0f9f637b9feadba851884ebaeb5108a8a88ef8b7b1f78fbb72537b87156dd8095f251e8c3655381e8d64df6876f3f87491e34c3a32bc2a68337c2b506d66f6
7
- data.tar.gz: 20850df806e99bb8acb64f2a0590a1d9059f2ecc44c5bd9951eabe970a4124175329d867884c25ca3cbd8dac86ae92ef90c25854915898fcc259d3ac4148261d
6
+ metadata.gz: 388f2bb468bc4ee848b5b82c8e98648579612221bddcb5342f391b60d576b8288ccec064b1dfa97e1fc6212b404da77a25dde46cfdd49922a1481e371dcc626b
7
+ data.tar.gz: 1c8b6eaa47a883cbd2380ddfc8e71fd0b74743049cfd872f026440d906b579c9d089903bbbbc88a8337638a53a687a462a9b192f580bcc17863d4e966a3a0ea8
@@ -0,0 +1,16 @@
1
+ module Quickbooks
2
+ module Model
3
+ class BaseModelJSON < BaseModel
4
+
5
+ def to_json
6
+ params = {}
7
+ attributes.each_pair do |k, v|
8
+ next if v.blank?
9
+ params[k.camelize] = v.is_a?(Array) ? v.inject([]){|mem, item| mem << item.to_json; mem} : v
10
+ end
11
+ params.to_json
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -6,8 +6,9 @@ module Quickbooks
6
6
  xml_accessor :value, :from => :content
7
7
  xml_accessor :type, :from => '@type' # Attribute with name 'type'
8
8
 
9
- def initialize(value = nil)
9
+ def initialize(value=nil, attributes={})
10
10
  self.value = value
11
+ attributes.each {|key, value| public_send("#{key}=", value) }
11
12
  end
12
13
 
13
14
  def to_i
@@ -0,0 +1,10 @@
1
+ module Quickbooks
2
+ module Model
3
+ # Refer to: https://developer.intuit.com/docs/0100_accounting/0300_developer_guides/change_data_capture
4
+ class ChangeModel < BaseModel
5
+ xml_accessor :id, :from => 'Id'
6
+ xml_accessor :status, :from => '@status'
7
+ xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ module Quickbooks
2
+ module Model
3
+ # Refer to: https://developer.intuit.com/docs/0100_accounting/0300_developer_guides/change_data_capture
4
+ class CreditMemoChange < ChangeModel
5
+ XML_NODE = "CreditMemo"
6
+ end
7
+ end
8
+ end
@@ -1,12 +1,8 @@
1
1
  module Quickbooks
2
2
  module Model
3
3
  # Refer to: https://developer.intuit.com/docs/0100_accounting/0300_developer_guides/change_data_capture
4
- class CustomerChange < BaseModel
4
+ class CustomerChange < ChangeModel
5
5
  XML_NODE = "Customer"
6
-
7
- xml_accessor :id, :from => 'Id'
8
- xml_accessor :status, :from => '@status'
9
- xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
10
6
  end
11
7
  end
12
- end
8
+ end
@@ -1,42 +1,46 @@
1
- module Definition
1
+ module Quickbooks
2
+ module Model
3
+ module Definition
2
4
 
3
- def self.included(base)
4
- base.extend(ClassMethods)
5
- end
5
+ def self.included(base)
6
+ base.extend(ClassMethods)
7
+ end
6
8
 
7
- module ClassMethods
8
- # https://developer.intuit.com/docs/0025_quickbooksapi/0050_data_services
9
- TRANSACTION_ENTITIES = %w{
10
- Bill
11
- BillPayment
12
- CreditMemo
13
- Estimate
14
- Invoice
15
- JournalEntry
16
- Payment
17
- Purchase
18
- PurchaseOrder
19
- RefundReceipt
20
- SalesReceipt
21
- TimeActivity
22
- VendorCredit
23
- }
9
+ module ClassMethods
10
+ # https://developer.intuit.com/docs/0025_quickbooksapi/0050_data_services
11
+ TRANSACTION_ENTITIES = %w{
12
+ Bill
13
+ BillPayment
14
+ CreditMemo
15
+ Estimate
16
+ Invoice
17
+ JournalEntry
18
+ Payment
19
+ Purchase
20
+ PurchaseOrder
21
+ RefundReceipt
22
+ SalesReceipt
23
+ TimeActivity
24
+ VendorCredit
25
+ }
24
26
 
25
- def is_transaction_entity?
26
- TRANSACTION_ENTITIES.include?(self.name.demodulize)
27
- end
27
+ def is_transaction_entity?
28
+ TRANSACTION_ENTITIES.include?(self.name.demodulize)
29
+ end
28
30
 
29
- def is_name_list_entity?
30
- !self.is_transaction_entity?
31
- end
32
- end
31
+ def is_name_list_entity?
32
+ !self.is_transaction_entity?
33
+ end
34
+ end
33
35
 
34
- def is_transaction_entity?
35
- self.class.is_transaction_entity?
36
- end
36
+ def is_transaction_entity?
37
+ self.class.is_transaction_entity?
38
+ end
37
39
 
38
- def is_name_list_entity?
39
- self.class.is_name_list_entity?
40
- end
40
+ def is_name_list_entity?
41
+ self.class.is_name_list_entity?
42
+ end
41
43
 
44
+ end
45
+ end
42
46
  end
@@ -4,7 +4,7 @@ module Quickbooks
4
4
  include NameEntity::Quality
5
5
 
6
6
  xml_accessor :type, :from => 'Type'
7
- xml_accessor :entity_ref, :from => 'EntityRef'
7
+ xml_accessor :entity_ref, :as => BaseReference
8
8
 
9
9
  reference_setters :entity_ref
10
10
 
@@ -1,12 +1,8 @@
1
1
  module Quickbooks
2
2
  module Model
3
3
  # Refer to: https://developer.intuit.com/docs/0100_accounting/0300_developer_guides/change_data_capture
4
- class InvoiceChange < BaseModel
4
+ class InvoiceChange < ChangeModel
5
5
  XML_NODE = "Invoice"
6
-
7
- xml_accessor :id, :from => 'Id'
8
- xml_accessor :status, :from => '@status'
9
- xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
10
6
  end
11
7
  end
12
8
  end
@@ -1,12 +1,8 @@
1
1
  module Quickbooks
2
2
  module Model
3
3
  # Refer to: https://developer.intuit.com/docs/0100_accounting/0300_developer_guides/change_data_capture
4
- class ItemChange < BaseModel
4
+ class ItemChange < ChangeModel
5
5
  XML_NODE = "Item"
6
-
7
- xml_accessor :id, :from => 'Id'
8
- xml_accessor :status, :from => '@status'
9
- xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
10
6
  end
11
7
  end
12
- end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Quickbooks
2
+ module Model
3
+ # Refer to: https://developer.intuit.com/docs/0100_accounting/0300_developer_guides/change_data_capture
4
+ class PaymentChange < ChangeModel
5
+ XML_NODE = "Payment"
6
+ end
7
+ end
8
+ end
@@ -5,7 +5,7 @@ module Quickbooks
5
5
  XML_NODE = "Reports"
6
6
  REST_RESOURCE = 'reports'
7
7
 
8
- REPORTS = ['BalanceSheet', 'ProfitandLoss', 'ProfitandLossDetail', 'CashFlow']
8
+ REPORT_TYPES = ['BalanceSheet', 'ProfitandLoss', 'ProfitAndLossDetail', 'TrialBalance', 'CashFlow', 'InventoryValuationSummary', 'CustomerSales', 'ItemSales', 'DepartmentSales', 'ClassSales', 'CustomerIncome', 'CustomerBalance', 'CustomerBalanceDetail', 'AgedReceivables', 'AgedReceivableDetail', 'VendorBalance', 'VendorBalanceDetail', 'AgedPayables', 'AgedPayableDetail', 'VendorExpenses', 'GeneralLedgerDetail']
9
9
 
10
10
  xml_name XML_NODE
11
11
 
@@ -14,4 +14,4 @@ module Quickbooks
14
14
 
15
15
  end
16
16
  end
17
- end
17
+ end
@@ -22,7 +22,7 @@ module Quickbooks
22
22
  xml_accessor :bill_address, :from => 'BillAddr', :as => PhysicalAddress
23
23
  xml_accessor :ship_address, :from => 'ShipAddr', :as => PhysicalAddress
24
24
  xml_accessor :po_number, :from => 'PONumber'
25
- xml_accessor :ship_method_ref, :from => 'ShipMethodRef'
25
+ xml_accessor :ship_method_ref, :from => 'ShipMethodRef', :as => BaseReference
26
26
  xml_accessor :ship_date, :from => 'ShipDate', :as => Time
27
27
  xml_accessor :tracking_num, :from => 'TrackingNum'
28
28
  xml_accessor :payment_method_ref, :from => 'PaymentMethodRef', :as => BaseReference
@@ -0,0 +1,18 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TaxAgency < BaseModel
4
+ XML_COLLECTION_NODE = "TaxAgency"
5
+ XML_NODE = "TaxAgency"
6
+ REST_RESOURCE = "taxagency"
7
+
8
+ xml_accessor :id, :from => "Id"
9
+ xml_accessor :sync_token, :from => "SyncToken", :as => Integer
10
+ xml_accessor :meta_data, :from => "MetaData", :as => MetaData
11
+ xml_accessor :tax_tracked_on_purchases?, :from => "TaxTrackedOnPurchases"
12
+ xml_accessor :tax_tracked_on_sales?, :from => "TaxTrackedOnSales"
13
+ xml_accessor :display_name, :from => "DisplayName"
14
+
15
+ validates_presence_of :display_name
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TaxRateDetailLine < BaseModel
4
+
5
+ xml_accessor :tax_rate_id, :from => "TaxRateId"
6
+ xml_accessor :tax_rate_name, :from => "TaxRateName"
7
+ xml_accessor :rate_value, :from => "RateValue"
8
+ xml_accessor :tax_agency_id, :from => "TaxAgencyId"
9
+ xml_accessor :tax_applicable_on, :from => 'TaxApplicableOn', :as => :text
10
+
11
+ validates :tax_rate_name, presence: true, length: { maximum: 100 }, if: Proc.new {|line| line.tax_rate_id.blank?}
12
+ validates :tax_agency_id, presence: true, numericality: {greater_than: 0}, if: Proc.new {|line| line.tax_rate_id.blank?}
13
+ validates :rate_value, presence: true, numericality: {less_than_or_equal_to: 100}, if: Proc.new {|line| line.tax_rate_id.blank?}
14
+ validates :tax_rate_id, numericality: true, if: Proc.new {|line| line.tax_rate_name.blank? && tax_agency_id.blank? && rate_value.blank? }
15
+
16
+ validates :tax_applicable_on, inclusion: {in: %w(Sales Purchase)}
17
+
18
+ def to_json
19
+ attributes.inject({}){|mem, item| mem[item.first.camelize] = item.last if item.last.present?; mem}
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,52 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TaxService < BaseModelJSON
4
+ REST_RESOURCE = "taxservice/taxcode"
5
+
6
+ xml_accessor :tax_code_id, :from => "TaxCodeId"
7
+ xml_accessor :tax_code, :from => "TaxCode"
8
+ xml_accessor :tax_rate_details, :from => 'TaxRateDetails', :as => [TaxRateDetailLine]
9
+
10
+ validates :tax_code, presence: true, length: { maximum: 100 }
11
+
12
+ validate :check_details_item
13
+
14
+ def initialize(options = {})
15
+ self.tax_rate_details = options['tax_rate_details'] || []
16
+ super
17
+ end
18
+
19
+ def self.from_json(response)
20
+ result = JSON.parse(response)
21
+ if result.present?
22
+ ts = Quickbooks::Model::TaxService.new
23
+ ts.tax_code = result['TaxCode']
24
+ ts.tax_code_id = result['TaxCodeId']
25
+ result['TaxRateDetails'].each do |item|
26
+ attrs = item.keys.inject({}){|mem, k| mem[k.underscore] = item[k]; mem}
27
+ ts.tax_rate_details << Quickbooks::Model::TaxRateDetailLine.new(attrs)
28
+ end
29
+ return ts
30
+ else
31
+ return nil
32
+ end
33
+ end
34
+
35
+ def check_details_item
36
+ if tax_rate_details.blank?
37
+ errors.add(:tax_rate_details, "must have at least one item")
38
+ else
39
+ tax_rate_details.each do |line|
40
+ unless line.valid?
41
+ errors.add(:base, line.errors.full_messages.join(', '))
42
+ end
43
+ end
44
+ names = tax_rate_details.map(&:tax_rate_name).uniq
45
+ if names.size < tax_rate_details.size
46
+ errors.add(:tax_rate_name, "Duplicate Tax Rate Name")
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,12 +1,8 @@
1
1
  module Quickbooks
2
2
  module Model
3
3
  # Refer to: https://developer.intuit.com/docs/0100_accounting/0300_developer_guides/change_data_capture
4
- class VendorChange < BaseModel
4
+ class VendorChange < ChangeModel
5
5
  XML_NODE = "Vendor"
6
-
7
- xml_accessor :id, :from => 'Id'
8
- xml_accessor :status, :from => '@status'
9
- xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
10
6
  end
11
7
  end
12
- end
8
+ end
@@ -45,6 +45,10 @@ module Quickbooks
45
45
  "#{@base_uri}/#{@company_id}"
46
46
  end
47
47
 
48
+ def is_json?
49
+ self.class::HTTP_CONTENT_TYPE == "application/json"
50
+ end
51
+
48
52
  def default_model_query
49
53
  "SELECT * FROM #{self.class.name.split("::").last}"
50
54
  end
@@ -196,10 +200,10 @@ module Quickbooks
196
200
  raise "OAuth client has not been initialized. Initialize with setter access_token="
197
201
  end
198
202
  unless headers.has_key?('Content-Type')
199
- headers['Content-Type'] = HTTP_CONTENT_TYPE
203
+ headers['Content-Type'] = self.class::HTTP_CONTENT_TYPE
200
204
  end
201
205
  unless headers.has_key?('Accept')
202
- headers['Accept'] = HTTP_ACCEPT
206
+ headers['Accept'] = self.class::HTTP_ACCEPT
203
207
  end
204
208
  unless headers.has_key?('Accept-Encoding')
205
209
  headers['Accept-Encoding'] = HTTP_ACCEPT_ENCODING
@@ -208,8 +212,7 @@ module Quickbooks
208
212
  log "------ QUICKBOOKS-RUBY REQUEST ------"
209
213
  log "METHOD = #{method}"
210
214
  log "RESOURCE = #{url}"
211
- log "REQUEST BODY:"
212
- log(log_xml(body))
215
+ log_request_body(body)
213
216
  log "REQUEST HEADERS = #{headers.inspect}"
214
217
 
215
218
  response = case method
@@ -222,7 +225,7 @@ module Quickbooks
222
225
  else
223
226
  raise "Do not know how to perform that HTTP operation"
224
227
  end
225
- check_response(response, :request_xml => body)
228
+ check_response(response, :request => body)
226
229
  end
227
230
 
228
231
  def add_query_string_to_url(url, params)
@@ -236,9 +239,7 @@ module Quickbooks
236
239
  def check_response(response, options = {})
237
240
  log "------ QUICKBOOKS-RUBY RESPONSE ------"
238
241
  log "RESPONSE CODE = #{response.code}"
239
- log "RESPONSE BODY:"
240
- log(log_xml(response.plain_body))
241
- parse_xml(response.plain_body)
242
+ log_response_body(response)
242
243
  status = response.code.to_i
243
244
  case status
244
245
  when 200
@@ -263,13 +264,37 @@ module Quickbooks
263
264
  end
264
265
  end
265
266
 
267
+ def log_response_body(response)
268
+ log "RESPONSE BODY:"
269
+ if is_json?
270
+ log ">>>>#{response.plain_body.inspect}"
271
+ parse_json(response.plain_body)
272
+ else
273
+ log(log_xml(response.plain_body))
274
+ parse_xml(response.plain_body)
275
+ end
276
+ end
277
+
278
+ def log_request_body(body)
279
+ log "REQUEST BODY:"
280
+ if is_json?
281
+ log(body.inspect)
282
+ else
283
+ log(log_xml(body))
284
+ end
285
+ end
286
+
266
287
  def parse_and_raise_exception(options = {})
267
288
  err = parse_intuit_error
268
289
  ex = Quickbooks::IntuitRequestException.new("#{err[:message]}:\n\t#{err[:detail]}")
269
290
  ex.code = err[:code]
270
291
  ex.detail = err[:detail]
271
292
  ex.type = err[:type]
272
- ex.request_xml = options[:request_xml]
293
+ if is_json?
294
+ ex.request_json = options[:request]
295
+ else
296
+ ex.request_xml = options[:request]
297
+ end
273
298
  raise ex
274
299
  end
275
300
 
@@ -0,0 +1,39 @@
1
+ module Quickbooks
2
+ module Service
3
+ class BaseServiceJSON < BaseService
4
+ include ServiceCrudJSON
5
+ HTTP_CONTENT_TYPE = 'application/json'
6
+ HTTP_ACCEPT = 'application/json'
7
+ attr_reader :last_response_json
8
+
9
+ private
10
+
11
+ def parse_json(json)
12
+ @last_response_json = json
13
+ end
14
+
15
+ def response_is_error?
16
+ @last_response_json['Fault'].present?
17
+ end
18
+
19
+ def parse_intuit_error
20
+ error = {:message => "", :detail => "", :type => nil, :code => 0}
21
+ resp = JSON.parse(@last_response_json)
22
+ fault = resp['Fault']
23
+ if fault.present?
24
+ error[:type] = fault['type'] if fault.has_key?('type')
25
+ if fault_error = fault['Error'].first
26
+ error[:message] = fault_error['Message']
27
+ error[:detail] = fault_error['Detail']
28
+ error[:code] = fault_error['code']
29
+ end
30
+ end
31
+ error
32
+ rescue Exception => exception
33
+ error[:detail] = @last_response_json.to_s
34
+ error
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,28 @@
1
+ module Quickbooks
2
+ module Service
3
+ class ChangeService < BaseService
4
+
5
+ def url_for_query(query = nil, start_position = 1, max_results = 20)
6
+ q = entity
7
+ q = "#{q}&#{query}" if query.present?
8
+
9
+ "#{url_for_base}/cdc?entities=#{q}"
10
+ end
11
+
12
+ def since(timestamp)
13
+ query("changedSince=#{URI.encode_www_form_component(timestamp.iso8601)}")
14
+ end
15
+
16
+ private
17
+
18
+ def entity
19
+ raise NotImplementedError
20
+ end
21
+
22
+ def model
23
+ raise NotImplementedError
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,16 @@
1
+ module Quickbooks
2
+ module Service
3
+ class CreditMemoChange < ChangeService
4
+
5
+ private
6
+
7
+ def entity
8
+ "CreditMemo"
9
+ end
10
+
11
+ def model
12
+ Quickbooks::Model::CreditMemoChange
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,23 +1,16 @@
1
1
  module Quickbooks
2
2
  module Service
3
- class CustomerChange < BaseService
4
-
5
- def url_for_query(query = nil, start_position = 1, max_results = 20)
6
- q = "Customer"
7
- q = "#{q}&#{query}" if query.present?
3
+ class CustomerChange < ChangeService
8
4
 
9
- "#{url_for_base}/cdc?entities=#{q}"
10
- end
5
+ private
11
6
 
12
- def since(timestamp)
13
- query("changedSince=#{URI.encode_www_form_component(timestamp.iso8601)}")
7
+ def entity
8
+ "Customer"
14
9
  end
15
-
16
- private
17
-
10
+
18
11
  def model
19
12
  Quickbooks::Model::CustomerChange
20
13
  end
21
14
  end
22
15
  end
23
- end
16
+ end
@@ -1,20 +1,13 @@
1
1
  module Quickbooks
2
2
  module Service
3
- class InvoiceChange < BaseService
4
-
5
- def url_for_query(query = nil, start_position = 1, max_results = 20)
6
- q = "Invoice"
7
- q = "#{q}&#{query}" if query.present?
3
+ class InvoiceChange < ChangeService
8
4
 
9
- "#{url_for_base}/cdc?entities=#{q}"
10
- end
5
+ private
11
6
 
12
- def since(timestamp)
13
- query("changedSince=#{URI.encode_www_form_component(timestamp.iso8601)}")
7
+ def entity
8
+ "Invoice"
14
9
  end
15
-
16
- private
17
-
10
+
18
11
  def model
19
12
  Quickbooks::Model::InvoiceChange
20
13
  end
@@ -1,23 +1,16 @@
1
1
  module Quickbooks
2
2
  module Service
3
- class ItemChange < BaseService
4
-
5
- def url_for_query(query = nil, start_position = 1, max_results = 20)
6
- q = "Item"
7
- q = "#{q}&#{query}" if query.present?
3
+ class ItemChange < ChangeService
8
4
 
9
- "#{url_for_base}/cdc?entities=#{q}"
10
- end
5
+ private
11
6
 
12
- def since(timestamp)
13
- query("changedSince=#{URI.encode_www_form_component(timestamp.iso8601)}")
7
+ def entity
8
+ "Item"
14
9
  end
15
-
16
- private
17
-
10
+
18
11
  def model
19
12
  Quickbooks::Model::ItemChange
20
13
  end
21
14
  end
22
15
  end
23
- end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Quickbooks
2
+ module Service
3
+ class PaymentChange < ChangeService
4
+
5
+ private
6
+
7
+ def entity
8
+ "Payment"
9
+ end
10
+
11
+ def model
12
+ Quickbooks::Model::PaymentChange
13
+ end
14
+ end
15
+ end
16
+ end
@@ -2,27 +2,37 @@ module Quickbooks
2
2
  module Service
3
3
  class Reports < BaseService
4
4
 
5
- def url_for_query(which_report = 'BalanceSheet', date_macro = 'This Fiscal Year-to-date')
6
- "#{url_for_base}/reports/#{which_report}?date_macro=#{URI.encode_www_form_component(date_macro)}"
5
+ def url_for_query(which_report = 'BalanceSheet', date_macro = 'This Fiscal Year-to-date', options = {})
6
+ if(options == {})
7
+ return "#{url_for_base}/reports/#{which_report}?date_macro=#{URI.encode_www_form_component(date_macro)}"
8
+ else
9
+ options_string = ""
10
+ options.each do |key, value|
11
+ options_string += "#{key}=#{value}&"
12
+ end
13
+ options_string = options_string[0..-2]
14
+ options_string.gsub!(/\s/,"%20")
15
+ return "#{url_for_base}/reports/#{which_report}?#{options_string}"
16
+ end
7
17
  end
8
18
 
9
- def fetch_collection(model, date_macro, object_query)
10
- response = do_http_get(url_for_query(object_query, date_macro))
19
+ def fetch_collection(model, date_macro, object_query, options = {})
20
+ response = do_http_get(url_for_query(object_query, date_macro, options))
11
21
 
12
22
  parse_collection(response, model)
13
23
 
14
24
  end
15
25
 
16
- def query(object_query = 'BalanceSheet', date_macro = 'This Fiscal Year-to-date')
17
- fetch_collection(model, date_macro , object_query)
26
+ def query(object_query = 'BalanceSheet', date_macro = 'This Fiscal Year-to-date', options = {})
27
+ fetch_collection(model, date_macro , object_query, options)
18
28
  end
19
29
 
20
30
  private
21
-
31
+
22
32
  def model
23
33
  Quickbooks::Model::Reports
24
34
  end
25
35
 
26
36
  end
27
37
  end
28
- end
38
+ end
@@ -24,7 +24,8 @@ module Quickbooks
24
24
  def create(entity, options = {})
25
25
  raise Quickbooks::InvalidModelException.new(entity.errors.full_messages.join(',')) unless entity.valid?
26
26
  xml = entity.to_xml_ns(options)
27
- response = do_http_post(url_for_resource(model.resource_for_singular), valid_xml_document(xml))
27
+
28
+ response = do_http_post(url_for_resource(model.resource_for_singular), valid_xml_document(xml), options[:query])
28
29
  if response.code.to_i == 200
29
30
  model.from_xml(parse_singular_entity_response(model, response.plain_body))
30
31
  else
@@ -0,0 +1,31 @@
1
+ module Quickbooks
2
+ module Service
3
+ module ServiceCrudJSON
4
+
5
+ def fetch_by_id(id, params = {})
6
+ raise NotImplementedError
7
+ end
8
+
9
+ def create(entity, options = {})
10
+ raise Quickbooks::InvalidModelException.new(entity.errors.full_messages.join(',')) unless entity.valid?
11
+ response = do_http(:post, url_for_resource(model.resource_for_singular), entity.to_json, options)
12
+ if response.code.to_i == 200
13
+ JSON.parse(response.plain_body)
14
+ else
15
+ nil
16
+ end
17
+ end
18
+ alias :update :create
19
+
20
+ def delete
21
+ raise NotImplementedError
22
+ end
23
+
24
+ def delete_by_query_string
25
+ raise NotImplementedError
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,12 @@
1
+ module Quickbooks
2
+ module Service
3
+ class TaxAgency < BaseService
4
+
5
+ private
6
+
7
+ def model
8
+ Quickbooks::Model::TaxAgency
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module Quickbooks
2
+ module Service
3
+ class TaxService < BaseServiceJSON
4
+ private
5
+
6
+ def model
7
+ Quickbooks::Model::TaxService
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,23 +1,16 @@
1
1
  module Quickbooks
2
2
  module Service
3
- class VendorChange < BaseService
4
-
5
- def url_for_query(query = nil, start_position = 1, max_results = 20)
6
- q = "Vendor"
7
- q = "#{q}&#{query}" if query.present?
3
+ class VendorChange < ChangeService
8
4
 
9
- "#{url_for_base}/cdc?entities=#{q}"
10
- end
5
+ private
11
6
 
12
- def since(timestamp)
13
- query("changedSince=#{URI.encode_www_form_component(timestamp.iso8601)}")
7
+ def entity
8
+ "Vendor"
14
9
  end
15
-
16
- private
17
-
10
+
18
11
  def model
19
12
  Quickbooks::Model::VendorChange
20
13
  end
21
14
  end
22
15
  end
23
- end
16
+ end
@@ -1,5 +1,5 @@
1
1
  module Quickbooks
2
2
 
3
- VERSION = "0.2.3"
3
+ VERSION = "0.3.0"
4
4
 
5
5
  end
@@ -18,6 +18,7 @@ require 'quickbooks/util/query_builder'
18
18
  require 'quickbooks/model/definition'
19
19
  require 'quickbooks/model/validator'
20
20
  require 'quickbooks/model/base_model'
21
+ require 'quickbooks/model/base_model_json'
21
22
  require 'quickbooks/model/base_reference'
22
23
  require 'quickbooks/model/document_numbering'
23
24
  require 'quickbooks/model/global_tax_calculation'
@@ -89,24 +90,32 @@ require 'quickbooks/model/delivery_info'
89
90
  require 'quickbooks/model/invoice'
90
91
  require 'quickbooks/model/tax_rate'
91
92
  require 'quickbooks/model/tax_rate_detail'
93
+ require 'quickbooks/model/tax_rate_detail_line'
92
94
  require 'quickbooks/model/sales_tax_rate_list'
93
95
  require 'quickbooks/model/purchase_tax_rate_list'
96
+ require 'quickbooks/model/tax_agency'
97
+ require 'quickbooks/model/tax_service'
94
98
  require 'quickbooks/model/tax_code'
95
99
  require 'quickbooks/model/fault'
96
100
  require 'quickbooks/model/batch_request'
97
101
  require 'quickbooks/model/batch_response'
98
102
  require 'quickbooks/model/preferences'
99
103
  require 'quickbooks/model/refund_receipt'
104
+ require 'quickbooks/model/change_model'
100
105
  require 'quickbooks/model/invoice_change'
101
106
  require 'quickbooks/model/customer_change'
102
107
  require 'quickbooks/model/vendor_change'
103
108
  require 'quickbooks/model/item_change'
104
109
  require 'quickbooks/model/reports'
110
+ require 'quickbooks/model/credit_memo_change'
111
+ require 'quickbooks/model/payment_change'
105
112
 
106
113
 
107
114
  #== Services
108
115
  require 'quickbooks/service/service_crud'
116
+ require 'quickbooks/service/service_crud_json'
109
117
  require 'quickbooks/service/base_service'
118
+ require 'quickbooks/service/base_service_json'
110
119
  require 'quickbooks/service/access_token'
111
120
  require 'quickbooks/service/class'
112
121
  require 'quickbooks/service/attachable'
@@ -135,9 +144,12 @@ require 'quickbooks/service/vendor_credit'
135
144
  require 'quickbooks/service/estimate'
136
145
  require 'quickbooks/service/tax_rate'
137
146
  require 'quickbooks/service/tax_code'
147
+ require 'quickbooks/service/tax_agency'
148
+ require 'quickbooks/service/tax_service'
138
149
  require 'quickbooks/service/batch'
139
150
  require 'quickbooks/service/preferences'
140
151
  require 'quickbooks/service/refund_receipt'
152
+ require 'quickbooks/service/change_service'
141
153
  require 'quickbooks/service/invoice_change'
142
154
  require 'quickbooks/service/customer_change'
143
155
  require 'quickbooks/service/upload'
@@ -145,6 +157,8 @@ require 'quickbooks/util/multipart'
145
157
  require 'quickbooks/service/vendor_change'
146
158
  require 'quickbooks/service/item_change'
147
159
  require 'quickbooks/service/reports'
160
+ require 'quickbooks/service/credit_memo_change'
161
+ require 'quickbooks/service/payment_change'
148
162
 
149
163
  module Quickbooks
150
164
  @@sandbox_mode = false
@@ -198,7 +212,7 @@ module Quickbooks
198
212
  class MissingRealmError < StandardError; end
199
213
 
200
214
  class IntuitRequestException < StandardError
201
- attr_accessor :message, :code, :detail, :type, :request_xml
215
+ attr_accessor :message, :code, :detail, :type, :request_xml, :request_json
202
216
  def initialize(msg)
203
217
  self.message = msg
204
218
  super(msg)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quickbooks-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cody Caughlan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-29 00:00:00.000000000 Z
11
+ date: 2015-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oauth
@@ -190,6 +190,7 @@ files:
190
190
  - lib/quickbooks/model/attachable.rb
191
191
  - lib/quickbooks/model/attachable_ref.rb
192
192
  - lib/quickbooks/model/base_model.rb
193
+ - lib/quickbooks/model/base_model_json.rb
193
194
  - lib/quickbooks/model/base_reference.rb
194
195
  - lib/quickbooks/model/batch_request.rb
195
196
  - lib/quickbooks/model/batch_response.rb
@@ -201,11 +202,13 @@ files:
201
202
  - lib/quickbooks/model/bill_payment_line_item.rb
202
203
  - lib/quickbooks/model/budget.rb
203
204
  - lib/quickbooks/model/budget_line_item.rb
205
+ - lib/quickbooks/model/change_model.rb
204
206
  - lib/quickbooks/model/check_payment.rb
205
207
  - lib/quickbooks/model/class.rb
206
208
  - lib/quickbooks/model/company_info.rb
207
209
  - lib/quickbooks/model/credit_card_payment.rb
208
210
  - lib/quickbooks/model/credit_memo.rb
211
+ - lib/quickbooks/model/credit_memo_change.rb
209
212
  - lib/quickbooks/model/custom_field.rb
210
213
  - lib/quickbooks/model/customer.rb
211
214
  - lib/quickbooks/model/customer_change.rb
@@ -242,6 +245,7 @@ files:
242
245
  - lib/quickbooks/model/name_value.rb
243
246
  - lib/quickbooks/model/other_contact_info.rb
244
247
  - lib/quickbooks/model/payment.rb
248
+ - lib/quickbooks/model/payment_change.rb
245
249
  - lib/quickbooks/model/payment_line_detail.rb
246
250
  - lib/quickbooks/model/payment_method.rb
247
251
  - lib/quickbooks/model/physical_address.rb
@@ -256,11 +260,14 @@ files:
256
260
  - lib/quickbooks/model/sales_receipt.rb
257
261
  - lib/quickbooks/model/sales_tax_rate_list.rb
258
262
  - lib/quickbooks/model/sub_total_line_detail.rb
263
+ - lib/quickbooks/model/tax_agency.rb
259
264
  - lib/quickbooks/model/tax_code.rb
260
265
  - lib/quickbooks/model/tax_line.rb
261
266
  - lib/quickbooks/model/tax_line_detail.rb
262
267
  - lib/quickbooks/model/tax_rate.rb
263
268
  - lib/quickbooks/model/tax_rate_detail.rb
269
+ - lib/quickbooks/model/tax_rate_detail_line.rb
270
+ - lib/quickbooks/model/tax_service.rb
264
271
  - lib/quickbooks/model/telephone_number.rb
265
272
  - lib/quickbooks/model/term.rb
266
273
  - lib/quickbooks/model/time_activity.rb
@@ -275,13 +282,16 @@ files:
275
282
  - lib/quickbooks/service/account.rb
276
283
  - lib/quickbooks/service/attachable.rb
277
284
  - lib/quickbooks/service/base_service.rb
285
+ - lib/quickbooks/service/base_service_json.rb
278
286
  - lib/quickbooks/service/batch.rb
279
287
  - lib/quickbooks/service/bill.rb
280
288
  - lib/quickbooks/service/bill_payment.rb
281
289
  - lib/quickbooks/service/budget.rb
290
+ - lib/quickbooks/service/change_service.rb
282
291
  - lib/quickbooks/service/class.rb
283
292
  - lib/quickbooks/service/company_info.rb
284
293
  - lib/quickbooks/service/credit_memo.rb
294
+ - lib/quickbooks/service/credit_memo_change.rb
285
295
  - lib/quickbooks/service/customer.rb
286
296
  - lib/quickbooks/service/customer_change.rb
287
297
  - lib/quickbooks/service/department.rb
@@ -294,6 +304,7 @@ files:
294
304
  - lib/quickbooks/service/item_change.rb
295
305
  - lib/quickbooks/service/journal_entry.rb
296
306
  - lib/quickbooks/service/payment.rb
307
+ - lib/quickbooks/service/payment_change.rb
297
308
  - lib/quickbooks/service/payment_method.rb
298
309
  - lib/quickbooks/service/preferences.rb
299
310
  - lib/quickbooks/service/purchase.rb
@@ -302,8 +313,11 @@ files:
302
313
  - lib/quickbooks/service/reports.rb
303
314
  - lib/quickbooks/service/sales_receipt.rb
304
315
  - lib/quickbooks/service/service_crud.rb
316
+ - lib/quickbooks/service/service_crud_json.rb
317
+ - lib/quickbooks/service/tax_agency.rb
305
318
  - lib/quickbooks/service/tax_code.rb
306
319
  - lib/quickbooks/service/tax_rate.rb
320
+ - lib/quickbooks/service/tax_service.rb
307
321
  - lib/quickbooks/service/term.rb
308
322
  - lib/quickbooks/service/time_activity.rb
309
323
  - lib/quickbooks/service/upload.rb